소스 검색

Merge branch 'master' of http://code.dashoo.cn/dashoo/labsop_base

# Conflicts:
#	src/dashoo.cn/backend/api/conf/app.conf
#	src/dashoo.cn/backend/api/conf/auth_model.conf
#	src/dashoo.cn/backend/api/controllers/casbin/role.go
#	src/dashoo.cn/backend/api/controllers/casbin/user.go
#	src/dashoo.cn/backend/api/routers/router.go
#	src/dashoo.cn/frontend_web/src/pages/biobank/partner/index.vue
#	src/dashoo.cn/frontend_web/src/pages/biobank/partner/organize.vue
#	src/dashoo.cn/frontend_web/src/pages/system/organize.vue
#	src/dashoo.cn/frontend_web/src/pages/system/userchangepwd.vue
#	src/dashoo.cn/frontend_web/src/pages/system/userrole.vue
#	src/dashoo.cn/frontend_web/src/pages/system/users.vue
#	src/dashoo.cn/frontend_web/src/pages/system/usersetting.vue
shihang 6 년 전
부모
커밋
39dd1ea5c5

+ 25 - 0
src/dashoo.cn/backend/api/business/auditsetting/oilauditsetting.go

@@ -0,0 +1,25 @@
+package auditsetting
+
+import (
+	"time"
+)
+
+type BaseOilAuditSetting struct {
+	Id             int       `xorm:"not null pk autoincr INT(10)"`
+	OrganizeId     int       `xorm:"not null default 0 comment('单位ID') INT(10)"`
+	OrganizeName   string    `xorm:"comment('单位名称') VARCHAR(100)"`
+	AuditStepCode  string    `xorm:"not null default '0' comment('审批步骤编码') VARCHAR(20)"`
+	AuditStepName  string    `xorm:"comment('审批步骤名称') VARCHAR(50)"`
+	RoleId         int       `xorm:"not null default 0 comment('角色ID') INT(10)"`
+	RoleName       string    `xorm:"comment('角色名称') VARCHAR(50)"`
+	WorkFlowCord   string    `xorm:"comment('工作流编码') VARCHAR(50)"`
+	WorkFlowName   string    `xorm:"comment('工作流名称') VARCHAR(50)"`
+	Remark         string    `xorm:"comment('备注') VARCHAR(500)"`
+	IsDelete       int       `xorm:"default 0 comment('删除状态,0正常,1已删除') INT(10)"`
+	CreateOn       time.Time `xorm:"DATETIME"`
+	CreateUserId   int       `xorm:"INT(10)"`
+	CreateBy       string    `xorm:"VARCHAR(50)"`
+	ModifiedOn     time.Time `xorm:"DATETIME"`
+	ModifiedUserId int       `xorm:"INT(10)"`
+	ModifiedBy     string    `xorm:"VARCHAR(50)"`
+}

+ 23 - 0
src/dashoo.cn/backend/api/business/auditsetting/oilauditsettingService.go

@@ -0,0 +1,23 @@
+package auditsetting
+
+import (
+	. "dashoo.cn/backend/api/mydb"
+	"github.com/go-xorm/xorm"
+)
+
+type OilAuditSettingService struct {
+	MyServiceBase
+}
+
+func GetOilAuditSettingService(xormEngine *xorm.Engine) *OilAuditSettingService {
+	s := new(OilAuditSettingService)
+	s.DBE = xormEngine
+	return s
+}
+
+func (s *OilAuditSettingService) GetAuditStepRoleEntity(tablename string, organizeId string, auditStepCode string, entityPtr interface{}) {
+	var where string
+	where = " 1=1 and OrganizeId = '" + organizeId + "' and AuditStepCode = '" + auditStepCode + "' "
+	s.GetEntityByWhere(tablename, where, entityPtr)
+	return
+}

+ 55 - 0
src/dashoo.cn/backend/api/business/company/basecompany.go

@@ -0,0 +1,55 @@
+package company
+
+import (
+	"time"
+)
+
+type Base_Company struct {
+	Id             int       `xorm:"not null pk autoincr INT(10)"`
+	Fullname       string    `xorm:"VARCHAR(50)"`
+	ShortName      string    `xorm:"VARCHAR(50)"`
+	AccCode        string    `xorm:"VARCHAR(10)"`
+	TableCode      string    `xorm:"VARCHAR(50)"`
+	Enabled        int       `xorm:"INT(11)"`
+	SortCode       int       `xorm:"INT(11)"`
+	CreateUserId   int       `xorm:"INT(11)"`
+	Address        string    `xorm:"VARCHAR(50)"`
+	CreateBy       string    `xorm:"VARCHAR(255)"`
+	CreateOn       time.Time `xorm:"DATETIME created"`
+	ModifiedUserId int       `xorm:"INT(11)"`
+	ModifiedBy     string    `xorm:"VARCHAR(255)"`
+	ModifiedOn     time.Time `xorm:"DATETIME updated"`
+}
+type Base_Companytree struct {
+	Id       string `json:"id"`
+	ParentId string `json:"pId"`
+	Fullname string `json:"name"`
+	IsParent string `json:"isParent"`
+	Nocheck  string `json:"nocheck"`
+}
+
+type Base_Indextree struct {
+	Id          string `json:"id"`
+	ParentId    string `json:"pId"`
+	Fullname    string `json:"name"`
+	IsParent    string `json:"isParent"`
+	Nocheck     string `json:"nocheck"`
+	Longitude   string `json:"lng"`
+	Latitude    string `json:"lat"`
+	DeviceState string `json:"devicestate"`
+}
+
+type Base_Indextree1 struct {
+	Id       string `json:"id"`
+	ParentId string `json:"pId"`
+	Fullname string `json:"name"`
+}
+
+type UserCompany struct {
+	Companyname string
+	Username    string
+	Realname    string
+	Mobile      string
+	Telephone   string
+	Email       string
+}

+ 245 - 0
src/dashoo.cn/backend/api/business/company/basecompanyService.go

@@ -0,0 +1,245 @@
+package company
+
+import (
+	"fmt"
+	"strconv"
+
+	"dashoo.cn/utils"
+	. "dashoo.cn/utils/db"
+	"github.com/go-xorm/xorm"
+)
+
+type BaseCompanyService struct {
+	ServiceBase
+}
+
+func GetCompanyService(xormEngine *xorm.Engine) *BaseCompanyService {
+	s := new(BaseCompanyService)
+	s.DBE = xormEngine
+	return s
+}
+
+//提交   //传入f,s 两个参数 返回 comid
+func (s *BaseCompanyService) AddCompany(fullname, shortname string) (err error, comacccode string) {
+	model := Base_Company{Fullname: fullname, ShortName: shortname}
+	//model := Base_User{Username: user.Username}
+
+	has, _ := s.DBE.Get(&model)
+	if has {
+		err = utils.NewError("ErrorUserNameExist")
+		return
+	}
+
+	for i := 0; i < 10000; i++ {
+		acccode := "s" + utils.GetRandomString(4)
+		model1 := Base_Company{AccCode: acccode}
+		has1, _ := s.DBE.Get(&model1)
+		if has1 {
+			continue
+		} else {
+			model.AccCode = acccode
+			_, err = s.DBE.Insert(&model)
+			break
+		}
+	}
+
+	comacccode = model.AccCode
+	return
+}
+
+//根据Domain,ID查企业ID
+func (s *BaseCompanyService) GetCompanyid(where string) (ids []string) {
+	var idList []Id_Str
+	s.DBE.Sql(` select Id from Base_Company ` + where).Find(&idList)
+	ids = s.GetIdsFromId_StrList(idList)
+	if len(ids) == 0 {
+		ids = append(ids, "-1")
+	}
+	return
+}
+
+//判断是否存在短域名
+func (s *BaseCompanyService) IsexistComcode(code string) bool {
+	company := new(Base_Company)
+	has, _ := s.DBE.Where("ShortName=?", code).Get(company)
+	return has
+}
+
+//获取acccode
+func (s *BaseCompanyService) GetAcccodeByComcode(code string) int {
+	company := new(Base_Company)
+	s.DBE.Where("ShortName=?", code).Get(company)
+	return company.Id
+}
+func (s *BaseCompanyService) GetFullnameByAccode(Accode string) string {
+	var BaseCompany Base_Company
+	s.DBE.Where("Id=?", Accode).Get(&BaseCompany) //都得到的是整条语句
+	return BaseCompany.Fullname                   //取其中一个字段
+}
+
+//获取公司列表
+func (s *BaseCompanyService) GetCompanyTree(companytitle string) []Base_Companytree {
+	var tree []Base_Companytree
+	s.DBE.Sql(`select
+		0 Id,-1 ParentId,'` + companytitle + `' Fullname union all
+		select Id,0 ParentId,Fullname from Base_Company order by Id`).Find(&tree)
+	return tree
+}
+
+func (s *BaseCompanyService) GetPagingEntitiesWithOrderSearch(pageIndex, itemsPerPage int64, order string, where string) (int64, []UserCompany) {
+	var err error
+	var total int64
+	//获取总记录数
+	sqlCount := `select count(*)
+		from Base_User a left join
+		Base_Company b on a.AccCode=b.Id where` + where + ""
+	var sql string
+
+	sql = `select a.Realname Realname,a.UserName Username,b.Fullname Companyname,a.Mobile,a.Telephone,a.Email
+		from Base_User a left join
+		Base_Company b on a.AccCode=b.Id where ` + where + ` order by ` + order + ` limit ` + utils.ToStr((pageIndex-1)*itemsPerPage) + "," + utils.ToStr(itemsPerPage)
+
+	List := make([]UserCompany, 0)
+	utils.DBE.Sql(sql).Find(&List)
+	resultsSlice, err := s.DBE.Query(sqlCount)
+	LogError(err)
+
+	if len(resultsSlice) > 0 {
+		results := resultsSlice[0]
+		for _, value := range results {
+			total, err = strconv.ParseInt(string(value), 10, 64)
+			LogError(err)
+			break
+		}
+	}
+	return total, List
+}
+
+func (s *BaseCompanyService) GetBindingTree(whereorg, wherecompany string) (tree []Base_Companytree) {
+	s.DBE.Sql(`select concat('o',Id) Id,concat('o',ParentId) ParentId,Fullname, 'true' IsParent,'false' Nocheck from Base_Organize
+		where ` + whereorg + `
+		union all
+		select Id,concat('o',OrganizeId) ParentId,Fullname, 'false' IsParent ,'false' Nocheck
+		from Base_Company where
+		` + wherecompany).Find(&tree)
+	return
+
+}
+
+//撤销用户控制企业权限
+func (s *BaseCompanyService) GetEntityByUserid(userId string) (Base_Company, bool) {
+	var model Base_Company
+	sql := `select b.* from Base_User a
+		inner join Base_Company b on a.AccCode=b.Id
+		where a.Id=` + userId
+	has, _ := s.DBE.Sql(sql).Get(&model)
+	return model, has
+}
+
+func (s *BaseCompanyService) GetDevicesNumByOrg(whereorg, wherecompany string) int {
+	var num Id_Int
+	s.DBE.Sql(`select count(*) Id from Channels a
+		inner join Base_User b on a.CreateUserId=b.Id
+		inner join Base_Company c on b.AccCode=c.Id and ` + wherecompany + `
+		inner join Base_Organize d on c.OrganizeId=d.Id and
+		` + whereorg).Get(&num)
+	return num.Id
+
+}
+
+func (s *BaseCompanyService) GetDevicesNumByCompany(wherecompany string) int {
+	var num Id_Int
+	s.DBE.Sql(`select count(*) Id from Channels a
+		inner join Base_User b on a.CreateUserId=b.Id
+		inner join Base_Company c on b.AccCode=c.Id and ` + wherecompany).Get(&num)
+	return num.Id
+
+}
+
+func (s *BaseCompanyService) GetIndexTree(whereorg, wherecompany string) (tree []Base_Indextree) {
+	s.DBE.Sql(`select concat('o',Id) Id,concat('o',ParentId) ParentId,Fullname, 'true' IsParent,'true' Nocheck,0 Longitude,0 Latitude,0 DeviceState from Base_Organize
+		where ` + whereorg + `
+		union all
+		select Id,concat('o',OrganizeId) ParentId,Fullname, 'false' IsParent ,'false' Nocheck,Longitude,Latitude,DeviceState
+		from Base_Company where
+		` + wherecompany).Find(&tree)
+	return
+
+}
+
+func (s *BaseCompanyService) GetIndexTree1(whereorg, wherecompany string) (tree []Base_Indextree1) {
+	s.DBE.Sql(`select concat('o',Id) Id,concat('o',ParentId) ParentId,Fullname from Base_Organize
+		where ` + whereorg + `
+		union all
+		select Id,concat('o',OrganizeId) ParentId,Fullname
+		from Base_Company where
+		` + wherecompany).Find(&tree)
+	return
+
+}
+
+func (s *BaseCompanyService) GetUidByCompanyid(companyid string) int {
+	var uid Id_Int
+	s.DBE.Sql("select Id from Base_User where CreateUserId='0' and AccCode=" + companyid + " limit 1").Get(&uid)
+	return uid.Id
+
+}
+
+// 表
+var (
+	biobank = []string{"DonorsInfo", "DonorsLog", "SamplesMain", "SamplesDetail",
+		"SamplesBusiness", "SamplesFileDetail", "SamplesLog", "SamplesAttachment",
+		"SampleSearchTemplate", "MaterialInfo", "MaterialBatchKC",
+		"MaterialStoreHouse", "MaterialCKDetail", "MaterialCKHead", "MaterialPDDetail",
+		"MaterialPDHead", "MaterialRKDetail", "MaterialRKHead", "DonorsInfoAttachment",
+		"DocumentInfo", "DocumentHistory"}
+	cellbank = []string{"DonorsInfo", "DonorsLog", "SamplesMain", "SamplesDetail",
+		"SamplesBusiness", "SamplesFileDetail", "SamplesLog", "SamplesAttachment",
+		"SampleSearchTemplate", "MaterialInfo", "MaterialBatchKC",
+		"MaterialStoreHouse", "MaterialCKDetail", "MaterialCKHead", "MaterialPDDetail",
+		"MaterialPDHead", "MaterialRKDetail", "MaterialRKHead", "Instrument",
+		"InstrumenMaintainLog", "InstrumenRunRecord", "Customer", "CellsContract", "CellsContractDetail",
+		"CellsCollection", "CellsCollectionDetail", "CellsCollectionSensors", "CellsPrepareTemplate",
+		"CellsPrepareTemplateStep", "CellsPrepareTemplateStepDetail",
+		"CellsPreparation", "CellsPreparationInfo", "CellsPreparationInfoDetail",
+		"DonorsInfoAttachment", "InstrumenMaintainLogAttachment", "CellsContractAttachment", "TestTemplate",
+		"CellsProductDelivery", "CellsProductDeliveryAttachment", "CellsProductDeliverySample", "CellsPreparationInfoDetailAttachment",
+		"CellsPreparationTrace", "DocumentInfo", "DocumentHistory"}
+	lims = []string{"TestSample", "TestSampleDetail", "TestSampleInfo",
+		"TestSampleRelation", "TestTransferOrders", "TestInfo", "TestInfoDetail",
+		"TestItemsList", "TestList", "TestListDetail", "TestLaboratory",
+		"TestQualityControl", "TestControlParameters", "TestControlParametersDetail", "TestApplication",
+		"TestPackageCategory", "TestPrintTemplate", "TestPackage", "TestPackageItems",
+		"Instrument", "InstrumenMaintainLog", "Instrumenstate", "DocumentInfo", "DocumentHistory"}
+)
+
+func (s *BaseCompanyService) CreateSampleDonorTable(acccode, source string) error {
+	var err error
+	switch source {
+	case "biobank":
+		for _, v := range biobank {
+			if v != "" {
+				table := acccode + v
+				sql := fmt.Sprintf("CREATE TABLE %v LIKE AAtemplate%v", table, v)
+				_, err = s.DBE.Exec(sql)
+			}
+		}
+	case "cellbank":
+		for _, v := range cellbank {
+			if v != "" {
+				table := acccode + v
+				sql := fmt.Sprintf("CREATE TABLE %v LIKE AAtemplate%v", table, v)
+				_, err = s.DBE.Exec(sql)
+			}
+		}
+	case "lims":
+		for _, v := range lims {
+			if v != "" {
+				table := acccode + v
+				sql := fmt.Sprintf("CREATE TABLE %v LIKE AAtemplate%v", table, v)
+				_, err = s.DBE.Exec(sql)
+			}
+		}
+	}
+	return err
+}

+ 12 - 0
src/dashoo.cn/backend/api/business/role/roleService.go

@@ -114,3 +114,15 @@ func (s *RoleService) GetUidsByRoleId(accCode, roleId string) (userInfo []userRo
 	LogError(err)
 	return
 }
+
+func (s *RoleService) GetMyRoleList(order, userid string, entitiesPtr *[]userRole.Base_Role, where ...string) {
+	var search string = "1=1"
+	rids := s.GetRoleids(userid)
+
+	search = search + " and Id in (" + strings.Join(rids, ",") + ")"
+
+	if len(where) > 0 {
+		search = search + " and " + where[0]
+	}
+	s.DBE.Where(search).OrderBy(order).Find(entitiesPtr)
+}

+ 69 - 4
src/dashoo.cn/backend/api/business/workflow/ActivitiService.go

@@ -20,10 +20,11 @@ import (
 )
 
 type ActivitiService struct {
-	BaseUrl  string
-	AposeUrl string
-	Username string
-	Password string
+	BaseUrl		string
+	AposeUrl	string
+	OriginUrl	string
+	Username 	string
+	Password 	string
 	ServiceBase
 }
 
@@ -35,6 +36,8 @@ func GetActivitiService(xormEngine *xorm.Engine) *ActivitiService {
 	s.BaseUrl = "http://47.92.212.59:8080/acti-api/api/acti"
 	//s.BaseUrl = "http://192.168.0.171:8081/api/acti"
 	s.AposeUrl = "http://47.92.212.59:8080/acti-api/api/apose"
+	//s.OriginUrl = "http://localhost:8081/api"
+	s.OriginUrl = "http://47.92.212.59:8080/acti-api/api"
 	//s.AposeUrl = "http://localhost:8081/api/apose"
 	//s.AposeUrl = "http://192.168.0.171:8081/api/apose"
 	s.Username = "leader"
@@ -67,6 +70,18 @@ func (this *ActivitiService) Post2(url string, params string, token string) *htt
 	log.Println("resp= ", resp)
 	return resp
 }
+func (this *ActivitiService) PostOrigin(url string, params string, token string) *http.Response {
+	client := &http.Client{}
+	req, err := http.NewRequest("POST", this.OriginUrl+url, strings.NewReader(params))
+	req.Header.Add("Content-Type", "application/json")
+	req.Header.Add("Authorization", "Bearer "+token)
+	resp, err := client.Do(req)
+	if err != nil {
+		log.Println("err= ", err)
+	}
+	log.Println("resp= ", resp)
+	return resp
+}
 
 func (this *ActivitiService) Get(url string, params string, token string) *http.Response {
 	client := &http.Client{}
@@ -237,3 +252,53 @@ func (this *ActivitiService) ExcelToPdf(addressUrl string) string {
 	fmt.Println("==retDocUrl==", retDocUrl)
 	return retDocUrl
 }
+
+
+func (this *ActivitiService) FillWordTemplate(datas map[string]interface{}, templateUrl string, fileName string) string {
+	var wordTempVM WordTemplateVM
+	wordTempVM.Datas = datas
+	wordTempVM.TemplateUrl = templateUrl
+	wordTempVM.FileName = fileName
+	fmt.Println("==templateUrl===", templateUrl)
+	jsonParam, err := json.Marshal(wordTempVM)
+	if err != nil {
+		fmt.Println(err, "生成json字符串错误")
+	}
+	params := string(jsonParam)
+	//token = Authorization(this.Username, this.Password)
+	retVal := this.PostOrigin("/word/fill-word", params, "")
+	if retVal.StatusCode != 200 {
+		return ""
+	}
+	//pdfByte, err := ioutil.ReadAll(retVal.Body)
+	//ioutil.WriteFile("E:\aa.pdf", pdfByte, 777)
+	//模板下载到服务器
+	_dir := utils.Cfg.MustValue("file", "tmplateDir") + "word"
+	utils.CreatePath(_dir)
+	_dir += "/tmp_" + strconv.Itoa(int(time.Now().Unix())) + ".docx"
+	raw := retVal.Body
+	defer raw.Close()
+
+	file, err := os.Create(_dir)
+	defer file.Close()
+	writer := bufio.NewWriter(file)
+	defer writer.Flush()
+	body, err := ioutil.ReadAll(raw)
+	writer.Write(body)
+
+	if err != nil {
+		return ""
+	}
+	var sw *Seaweed
+	var filer []string
+	if _filer := os.Getenv("GOSWFS_FILER_URL"); _filer != "" {
+		filer = []string{_filer}
+	}
+	sw = NewSeaweed("http", utils.Cfg.MustValue("file", "upFileHost"), filer, 2*1024*1024, 5*time.Minute)
+	//_, fID, err := sw.Upload(retVal.Body, "tmp.pdf", int64(len(pdfByte)), "", "")
+	_, _, fID, err := sw.UploadFile(_dir, "", "")
+	retDocUrl := utils.Cfg.MustValue("file", "downFileHost") + "/" + fID
+	os.Remove(_dir)
+	fmt.Println("==retDocUrl==", retDocUrl)
+	return retDocUrl
+}

+ 7 - 1
src/dashoo.cn/backend/api/business/workflow/workflow.go

@@ -27,7 +27,7 @@ type ActiHistoricTask struct {
 	BusinessKey       string `json:"businessKey"`
 	TaskName          string `json:"taskName"`
 	Assignee          string `json:"assignee"`
-	Users          	  string `json:"users"`
+	Users             string `json:"users"`
 	Result            string `json:"result"`
 	Remarks           string `json:"remarks"`
 	StartTime         int64  `json:"startTime"`
@@ -40,6 +40,12 @@ type AposeVM struct {
 	AddressUrl string `json:"addressUrl"`
 }
 
+type WordTemplateVM struct {
+	Datas       map[string]interface{} `json:"datas"`
+	TemplateUrl string                 `json:"templateUrl"`
+	FileName    string                 `json:"fileName"`
+}
+
 const (
 	//特检站数据录入
 	TJZ_DATA_KEY string = "tjz_data_apply"

+ 1 - 0
src/dashoo.cn/backend/api/controllers/base.go

@@ -223,6 +223,7 @@ var (
 	BaseUserName                             string = "Base_User"           //用户表
 	UserQualificationName                    string = "UserQualification"   //用户资质表
 	LimsInstrumentGroup                      string = "LimsInstrumentGroup" // 检测仪器关联
+	OilAuditSettingName                          string = "Base_OilAuditSetting" // 单位审批步骤自定义配置
 )
 
 //分页信息及数据

+ 168 - 0
src/dashoo.cn/backend/api/controllers/casbin/user.go

@@ -1,6 +1,9 @@
 package casbin
 
 import (
+	"dashoo.cn/backend/api/business/accountinfo"
+	"dashoo.cn/backend/api/business/company"
+	"dashoo.cn/backend/api/business/printscheme"
 	"encoding/json"
 	"strings"
 
@@ -45,6 +48,16 @@ type UserModel struct {
 type UserModuleModel struct {
 	A1list string `json:"a1"` // 第一级菜单
 	A2list string `json:"a2"` // 第二级菜单
+type ChangePwdModel struct {
+	Pwd    string `json:"pass"`
+	NwePwd string `json:"newpass"`
+}
+
+type RegisteModel struct {
+	Companyname string `json:"companyname"`
+	Username    string `json:"username"`
+	Password    string `json:"password"`
+	Source      string `json:"source"`
 }
 
 // @Title get
@@ -228,6 +241,9 @@ func (this *UserController) AddUser() {
 	userentity.Departmentid = model.DepartmentId
 	userentity.Departmentname = model.DepartmentName
 
+	//salt := utils.GetRandomString(5)
+	//userentity.Userpassword = fmt.Sprintf("%s$%s", salt, utils.EncodePassword("123456", salt))
+	//更改密码算法2014-11-21
 	pwd, key, errrk := utils.TripleDesEncrypt("123456")
 	if errrk != nil {
 		errinfo.Message = "添加失败!" + utils.AlertProcess(errrk.Error())
@@ -422,6 +438,45 @@ type AccountTjModel struct {
 	RKlist      []samplesapply.SamplesApply
 	CKTotal     int64
 	CKlist      []samplesapply.SamplesApply
+// @Title 修改密码
+// @Description 修改密码
+// @Param	body	body	business.device.DeviceChannels	"传感器信息"
+// @Success	200	{object} controllers.Request
+// @router /userchangepwd [put]
+func (this *UserController) UserChangePWD() {
+	var model ChangePwdModel
+	var jsonblob = this.Ctx.Input.RequestBody
+	json.Unmarshal(jsonblob, &model)
+	var errinfo ErrorInfo
+
+	svcauth := auth.GetAuthServic(utils.DBE)
+	var user userRole.Base_User
+
+	if svcauth.VerifyUser3DES(this.User.Username, model.Pwd, &user) {
+		var entitypaw1, entitypaw2 logsinfo.Userpassword
+		idint, _ := utils.StrTo(this.User.Id).Int()
+		var umodel userRole.Base_User = userRole.Base_User{Id: idint}
+		svcauth.UpdateLog(this.User.Id, &entitypaw1, &entitypaw2, this.User.Id, this.User.Realname)
+		err := svcauth.SetNewPassword3DES(&umodel, model.NwePwd)
+		if err != nil {
+			errinfo.Message = "修改失败!" + err.Error()
+			errinfo.Code = -2
+			this.Data["json"] = &errinfo
+			this.ServeJSON()
+		} else {
+			errinfo.Message = "密码修改成功"
+			errinfo.Code = 0
+			this.Data["json"] = &errinfo
+			this.ServeJSON()
+		}
+	} else {
+		errinfo.Message = "修改失败!当前密码输入错误"
+		errinfo.Code = -1
+		this.Data["json"] = &errinfo
+		this.ServeJSON()
+		return
+	}
+
 }
 
 // @Title 获取账户统计信息
@@ -502,4 +557,117 @@ func (this *UserController) GetTotalByGroupbydevice() {
 
 	this.Data["json"] = svc.GetTJBydevice(this.User.AccCode, where)
 	this.ServeJSON()
+// @Title 注册管理账号
+// @Description 注册管理账号
+// @Param	body	body	business.device.DeviceChannels	"传感器信息"
+// @Success	200	{object} controllers.Request
+// @router /registemanage [put]
+func (this *UserController) Registerput() {
+
+	var model RegisteModel
+	var jsonblob = this.Ctx.Input.RequestBody
+	json.Unmarshal(jsonblob, &model)
+	var errinfo ErrorInfo
+
+	var user userRole.Base_User
+	user.Username = model.Username
+	user.Realname = model.Companyname
+	//	this.ParseForm(&user) //去页面数值
+	svc := company.GetCompanyService(utils.DBE)
+	err, comacccode := svc.AddCompany(user.Realname, user.Username) //这两个参数传到company库,返回id
+	if err == nil {
+		svcuser := userRole.GetUserService(utils.DBE)
+		user.AccCode = comacccode //id传到 user库的acccode
+		pass := model.Password    //取到前台密码
+		//更改密码算法2014-11-21
+		pwd, key, errrk := utils.TripleDesEncrypt(pass)
+		if errrk != nil {
+			errinfo.Message = "添加失败!" + utils.AlertProcess(errrk.Error())
+			errinfo.Code = -2
+			this.Data["json"] = &errinfo
+			this.ServeJSON()
+			return
+		}
+		user.Roleid = 10000120 //企业用户
+		user.Auditstatus = 1
+		user.Userpassword = pwd
+		user.Publickey = key
+		user.Email = user.Username
+		err = svcuser.AddUser(&user)
+
+		//svcSampleOrgan := sampleorgan.GetSampleOrganService(utils.DBE)
+		//var entityOrgan sampleorgan.SampleOrgan
+		//entityOrgan.AccCode = comacccode
+		//entityOrgan.TNode = "SystemInner"
+		//entityOrgan.TNodeParent = "0"
+		//entityOrgan.Item = 1
+		//entityOrgan.Code = "ALL"
+		//entityOrgan.Name = "全部"
+		//entityOrgan.CreateBy = user.Username
+		//entityOrgan.CreateUserId = user.Id
+		//_, err = svcSampleOrgan.InsertEntity(&entityOrgan)
+		svcPrintScheme := printscheme.GetPrintSchemeService(utils.DBE)
+		var listPrintScheme []printscheme.PrintScheme
+		var listPrintScheme_new []printscheme.PrintScheme
+		listPrintScheme = svcPrintScheme.GetPrintSchemeList("IsSystem=2")
+		for i := 0; i < len(listPrintScheme); i++ {
+			listPrintScheme[i].IsSystem = 1
+			listPrintScheme[i].CreateBy = user.Username
+			listPrintScheme[i].CreateUserId = user.Id
+			listPrintScheme[i].AccCode = user.AccCode
+			listPrintScheme_new = append(listPrintScheme_new, listPrintScheme[i])
+		}
+		svc.InsertEntity(&listPrintScheme_new)
+		if err == nil {
+			//创建表结构
+			err := svc.CreateSampleDonorTable(user.AccCode, model.Source)
+			if err != nil {
+				fmt.Println(err.Error())
+			}
+			//写入账户信息,赠送短信
+			var accountinfo accountinfo.AccountInfo
+			accountinfo.ProjectSourse = "biobank"
+			accountinfo.ProjectAccount = user.AccCode
+			accountinfo.ProjectAccountName = user.Realname
+			accountinfo.SurplusCount = 50
+			accountinfo.ActionType = "sms"
+			u, p := this.GetuAndp()
+			strUrl := utils.Cfg.MustValue("server", "apiurl") + "/accountinfos/?u=" + u + "&p=" + p
+			Apipost(strUrl, "POST", accountinfo)
+
+			//添加一条组织根节点
+			var entityorg organize.Base_Organize
+			// 编辑后添加一条数据
+			entityorg.Fullname = model.Companyname
+			entityorg.Parentid = 0
+			entityorg.Createuserid = user.Id
+			entityorg.Createby = user.Realname
+			entityorg.AccCode = user.AccCode
+			svcuser.InsertEntity(&entityorg)
+
+			//修改用户的组织id
+			user.Departmentid = utils.ToStr(entityorg.Id)
+			user.Departmentname = entityorg.Fullname
+			var usercols []string = []string{"Departmentid", "Departmentname"}
+			svcuser.UpdateEntityByIdCols(user.Id, &user, usercols)
+
+			errinfo.Message = "注册用户成功!"
+			errinfo.Code = 0
+			this.Data["json"] = &errinfo
+			this.ServeJSON()
+		} else {
+			errinfo.Message = "注册失败!" + utils.AlertProcess(err.Error())
+			errinfo.Code = -2
+			this.Data["json"] = &errinfo
+			this.ServeJSON()
+			return
+		}
+	} else {
+		errinfo.Message = "注册失败!" + utils.AlertProcess(err.Error())
+		errinfo.Code = -3
+		this.Data["json"] = &errinfo
+		this.ServeJSON()
+		return
+	}
+
 }

+ 289 - 0
src/dashoo.cn/backend/api/controllers/system/auditsetting.go

@@ -0,0 +1,289 @@
+package system
+
+import (
+	"dashoo.cn/backend/api/business/baseUser"
+	"dashoo.cn/backend/api/business/items"
+	"dashoo.cn/backend/api/business/organize"
+	"dashoo.cn/backend/api/business/role"
+	. "dashoo.cn/backend/api/controllers"
+	"dashoo.cn/business2/userRole"
+	"dashoo.cn/utils"
+	"encoding/json"
+	"strings"
+	"dashoo.cn/backend/api/business/auditsetting"
+	"time"
+)
+
+type OilAuditSettingController struct {
+	BaseController
+}
+
+// @Title 获取列表
+// @Description get user by token
+// @Success 200 {object} []auditsetting.BaseOilAuditSetting
+// @router /list [get]
+func (this *OilAuditSettingController) GetEntityList() {
+
+	//获取分页信息
+	page := this.GetPageInfoForm()
+	where := " 1=1 "
+	orderby := "Id"
+	asc := false
+	Order := this.GetString("Order")
+	Prop := this.GetString("Prop")
+	if Order != "" && Prop != "" {
+		orderby = Prop
+		if Order == "asc" {
+			asc = true
+		}
+	}
+	OrganizeId := this.GetString("OrganizeId")
+	OrganizeName := this.GetString("OrganizeName")
+	AuditStepCode := this.GetString("AuditStepCode")
+	AuditStepName := this.GetString("AuditStepName")
+	RoleId := this.GetString("RoleId")
+	RoleName := this.GetString("RoleName")
+	WorkFlowCord := this.GetString("WorkFlowCord")
+	WorkFlowName := this.GetString("WorkFlowName")
+	Remark := this.GetString("Remark")
+	CreateOn := this.GetString("CreateOn")
+
+	OrganizeId = this.User.DepartmentId //无权限看所有时,只看当前部门的数据
+	if OrganizeId != "" {
+		where = where + " and OrganizeId = '" + OrganizeId + "'"
+	}
+
+
+
+	if OrganizeName != "" {
+		where = where + " and OrganizeName like '%" + OrganizeName + "%'"
+	}
+
+
+	if AuditStepCode != "" {
+		where = where + " and AuditStepCode like '%" + AuditStepCode + "%'"
+	}
+
+
+	if AuditStepName != "" {
+		where = where + " and AuditStepName like '%" + AuditStepName + "%'"
+	}
+
+
+	if RoleId != "" {
+		where = where + " and RoleId like '%" + RoleId + "%'"
+	}
+
+
+	if RoleName != "" {
+		where = where + " and RoleName like '%" + RoleName + "%'"
+	}
+
+	if WorkFlowCord != "" {
+		where = where + " and WorkFlowCord like '%" + WorkFlowCord + "%'"
+	}
+
+	if WorkFlowName != "" {
+		where = where + " and WorkFlowName like '%" + WorkFlowName + "%'"
+	}
+
+	if Remark != "" {
+		where = where + " and Remark like '%" + Remark + "%'"
+	}
+
+
+	if CreateOn != "" {
+		dates := strings.Split(CreateOn, ",")
+		if len(dates) == 2 {
+			minDate := dates[0]
+			maxDate := dates[1]
+			where = where + " and CreateOn>='" + minDate + "' and CreateOn<='" + maxDate + "'"
+		}
+	}
+
+	svc := auditsetting.GetOilAuditSettingService(utils.DBE)
+	var list []auditsetting.BaseOilAuditSetting
+	total := svc.GetPagingEntitiesWithOrderBytbl("", page.CurrentPage, page.Size, orderby, asc, &list, where)
+	var datainfo DataInfo
+	datainfo.Items = list
+	datainfo.CurrentItemCount = total
+	datainfo.PageIndex = page.CurrentPage
+	datainfo.ItemsPerPage = page.Size
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}
+
+// @Title 获取字典列表
+// @Description get user by token
+// @Success 200 {object} map[string]interface{}
+// @router /dictlist [get]
+func (this *OilAuditSettingController) GetDictList() {
+	dictList := make(map[string]interface{})
+	dictSvc := items.GetItemsService(utils.DBE)
+	userSvc := baseUser.GetBaseUserService(utils.DBE)
+	dictList["AuditStep"] = dictSvc.GetKeyValueItems("AuditStep", this.User.AccCode)
+	dictList["WorkFlow"] = dictSvc.GetKeyValueItems("WorkFlow", this.User.AccCode)
+	var userEntity userRole.Base_User
+	userSvc.GetEntityById(this.User.Id, &userEntity)
+	dictList["Supervisers"] = userSvc.GetUserListByDepartmentId(this.User.AccCode, userEntity.Departmentid)
+
+	svcRole := role.GetRoleService(utils.DBE)
+	var roles []userRole.Base_Role
+	where := "IsVisible=1"
+	svcRole.GetMyRoleList("CreateOn", utils.ToStr(this.User.Id), &roles, where)
+	dictList["RoleList"] = roles
+
+	svcOrgan := organize.GetOrganizeService(utils.DBE)
+	dictList["OrganizeId"] = this.User.DepartmentId
+	dictList["OrganizeName"] = svcOrgan.GetNameById(this.User.DepartmentId)
+
+	//var dictCustomer []svccustomer.Customer
+	//customerSvc.GetEntitysByWhere(this.User.AccCode + CustomerName, "", &dictCustomer)
+	//dictList["EntrustCorp"] = &dictCustomer
+
+	var datainfo DataInfo
+	datainfo.Items = dictList
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}
+
+// @Title 获取实体
+// @Description 获取实体
+// @Success 200 {object} auditsetting.BaseOilAuditSetting
+// @router /get/:id [get]
+func (this *OilAuditSettingController) GetEntity() {
+	Id := this.Ctx.Input.Param(":id")
+
+	var model auditsetting.BaseOilAuditSetting
+	svc := auditsetting.GetOilAuditSettingService(utils.DBE)
+	svc.GetEntityByIdBytbl(OilAuditSettingName, Id, &model)
+
+	this.Data["json"] = &model
+	this.ServeJSON()
+}
+
+// @Title 添加
+// @Description 新增
+// @Param 	body body auditsetting.OilAuditSetting
+// @Success	200	{object} controllers.Request
+// @router /add [post]
+func (this *OilAuditSettingController) AddEntity() {
+	var model auditsetting.BaseOilAuditSetting
+	var jsonBlob = this.Ctx.Input.RequestBody
+	svc := auditsetting.GetOilAuditSettingService(utils.DBE)
+
+	json.Unmarshal(jsonBlob, &model)
+	model.CreateOn = time.Now()
+	model.CreateBy = this.User.Realname
+	model.CreateUserId, _ = utils.StrTo(this.User.Id).Int()
+	model.OrganizeId, _ = utils.StrTo(this.User.DepartmentId).Int()
+
+	_, err := svc.InsertEntityBytbl(OilAuditSettingName, &model)
+
+	var errinfo ErrorDataInfo
+	if err == nil {
+		//新增
+		errinfo.Message = "添加成功!"
+		errinfo.Code = 0
+		errinfo.Item = model.Id
+		this.Data["json"] = &errinfo
+		this.ServeJSON()
+	} else {
+		errinfo.Message = "添加失败!" + utils.AlertProcess(err.Error())
+		errinfo.Code = -1
+		this.Data["json"] = &errinfo
+		this.ServeJSON()
+	}
+}
+
+// @Title 修改实体
+// @Description 修改实体
+// @Param 	body body auditsetting.OilAuditSetting
+// @Success	200	{object} controllers.Request
+// @router /update/:id [post]
+func (this *OilAuditSettingController) UpdateEntity() {
+	id := this.Ctx.Input.Param(":id")
+	var errinfo ErrorInfo
+	if id == "" {
+		errinfo.Message = "操作失败!请求信息不完整"
+		errinfo.Code = -2
+		this.Data["json"] = &errinfo
+		this.ServeJSON()
+		return
+	}
+
+	var model auditsetting.BaseOilAuditSetting
+	svc := auditsetting.GetOilAuditSettingService(utils.DBE)
+
+	var jsonBlob = this.Ctx.Input.RequestBody
+	json.Unmarshal(jsonBlob, &model)
+	model.ModifiedOn = time.Now()
+	model.ModifiedBy = this.User.Realname
+	model.ModifiedUserId, _ = utils.StrTo(this.User.Id).Int()
+
+	cols := []string{
+
+		"Id",
+		"OrganizeId",
+		"OrganizeName",
+		"AuditStepCode",
+		"AuditStepName",
+		"RoleId",
+		"RoleName",
+		"WorkFlowCord",
+		"WorkFlowName",
+		"Remark",
+		"IsDelete",
+		"CreateOn",
+		"CreateUserId",
+		"CreateBy",
+		"ModifiedOn",
+		"ModifiedUserId",
+		"ModifiedBy",
+	}
+	err := svc.UpdateEntityBytbl(OilAuditSettingName, id, &model, cols)
+	if err == nil {
+		errinfo.Message = "修改成功!"
+		errinfo.Code = 0
+		this.Data["json"] = &errinfo
+		this.ServeJSON()
+	} else {
+		errinfo.Message = "修改失败!" + utils.AlertProcess(err.Error())
+		errinfo.Code = -1
+		this.Data["json"] = &errinfo
+		this.ServeJSON()
+	}
+}
+
+// @Title 删除单条信息
+// @Description
+// @Success 200 {object} ErrorInfo
+// @Failure 403 :id 为空
+// @router /delete/:Id [delete]
+func (this *OilAuditSettingController) DeleteEntity() {
+	Id := this.Ctx.Input.Param(":Id")
+	var errinfo ErrorInfo
+	if Id == "" {
+		errinfo.Message = "操作失败!请求信息不完整"
+		errinfo.Code = -2
+		this.Data["json"] = &errinfo
+		this.ServeJSON()
+		return
+	}
+	var model auditsetting.BaseOilAuditSetting
+	var entityempty auditsetting.BaseOilAuditSetting
+	svc := auditsetting.GetOilAuditSettingService(utils.DBE)
+	opdesc := "删除-" + Id
+	err := svc.DeleteOperationAndWriteLogBytbl(OilAuditSettingName, BaseOperationLogName, Id, &model, &entityempty, utils.ToStr(this.User.Id), this.User.Username, opdesc, this.User.AccCode, "钻井日报")
+	if err == nil {
+		errinfo.Message = "删除成功"
+		errinfo.Code = 0
+		this.Data["json"] = &errinfo
+		this.ServeJSON()
+	} else {
+		errinfo.Message = "删除失败!" + utils.AlertProcess(err.Error())
+		errinfo.Code = -1
+		this.Data["json"] = &errinfo
+		this.ServeJSON()
+	}
+}

+ 57 - 0
src/dashoo.cn/backend/api/controllers/workflow/workflow.go

@@ -0,0 +1,57 @@
+package workflow
+
+import (
+	"dashoo.cn/backend/api/business/workflow"
+	. "dashoo.cn/backend/api/controllers"
+	"dashoo.cn/business2/permission"
+	"dashoo.cn/business2/userRole"
+	"dashoo.cn/utils"
+)
+
+// 动作接口说明
+type WorkflowController struct {
+	BaseController
+}
+
+
+// @Title get
+// @Description get workflow by token
+// @Success 200 {object} historicTasks
+// @router /historytask [get]
+func (this *WorkflowController) GetHistoricTask() {
+	businessKey := this.GetString("business")
+	processKey := this.GetString("process")
+	processInstanceId := this.GetString("instance")
+
+	var historicTasks []workflow.ActiHistoricTask
+	svcActiviti := workflow.GetActivitiService(utils.DBE)
+	historicTasks = svcActiviti.GetHistoricTasks(processKey, businessKey, processInstanceId)
+
+	var datainfo DataInfo
+	datainfo.Items = historicTasks
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}
+
+// @Title 获取所有用户
+// @Description get user by token
+// @Success 200 {object} models.User
+// @router /userlist [get]
+func (this *WorkflowController) UserList() {
+	keyword := this.GetString("keyword")
+	svc := permission.GetPermissionService(utils.DBE)
+	var users []userRole.Base_User
+
+	where := "IsVisible=1 and AccCode='" + this.User.AccCode + "' "
+	if keyword != "" {
+		where = where + " and Realname like '%" + keyword + "%'"
+	}
+	total := svc.GetPagingEntitiesWithOrder(1, 1000, "Id", false, &users, where)
+
+	var datainfo DataInfo
+	datainfo.Items = users
+	datainfo.CurrentItemCount = total
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}
+

+ 634 - 0
src/dashoo.cn/backend/api/mydb/mySessionBase.go

@@ -0,0 +1,634 @@
+// 业务逻辑服务基类,提供基本的添删改查功能
+//
+// 修改纪录
+// 2016.06.06 版本:1.0 yy 新建账户分表结构的处理
+
+package mydb
+
+import (
+	"encoding/json"
+	"fmt"
+	"reflect"
+	"strconv"
+
+	. "dashoo.cn/utils/db"
+	//	"github.com/go-xorm/xorm"
+)
+
+type MySessionBase struct {
+	SessionBase
+}
+
+//
+func (s *MySessionBase) GetPagingEntitiesWithOrderBytbl(AccCode string, pageIndex, itemsPerPage int64, order string, asc bool, entitiesPtr interface{}, where ...string) (total int64) {
+	var err error
+	var resultsSlice []map[string][]byte
+	//获取表名
+	tableName := AccCode + GetTableName(entitiesPtr)
+	if len(where) == 0 {
+		if asc {
+			err = s.Session.Table(tableName).Limit(int(itemsPerPage), (int(pageIndex)-1)*int(itemsPerPage)).Asc(order).Find(entitiesPtr)
+		} else {
+			err = s.Session.Table(tableName).Limit(int(itemsPerPage), (int(pageIndex)-1)*int(itemsPerPage)).Desc(order).Find(entitiesPtr)
+		}
+		//获取总记录数
+		sql := "SELECT COUNT(*) AS total FROM " + tableName
+		resultsSlice, err = s.Session.Query(sql)
+		LogError(err)
+
+	} else {
+		if asc {
+			err = s.Session.Table(tableName).Where(where[0]).Limit(int(itemsPerPage), (int(pageIndex)-1)*int(itemsPerPage)).Asc(order).Find(entitiesPtr)
+		} else {
+			err = s.Session.Table(tableName).Where(where[0]).Limit(int(itemsPerPage), (int(pageIndex)-1)*int(itemsPerPage)).Desc(order).Find(entitiesPtr)
+		}
+		sql := "SELECT COUNT(*) AS total FROM " + tableName + " where " + where[0]
+		resultsSlice, err = s.Session.Query(sql)
+	}
+	LogError(err)
+	if len(resultsSlice) > 0 {
+		results := resultsSlice[0]
+		for _, value := range results {
+			total, err = strconv.ParseInt(string(value), 10, 64)
+			LogError(err)
+			break
+		}
+	}
+	return total
+}
+
+//样本库分表
+func (s *MySessionBase) InsertEntityBytbl(tablename string, entity interface{}) (affected int64, err error) {
+	affected, err = s.Session.Table(tablename).Insert(entity)
+	LogError(err)
+	return
+}
+
+func (s *MySessionBase) GetEntityByIdBytbl(tablename string, id interface{}, entityPtr interface{}) (has bool) {
+	has, err := s.Session.Table(tablename).Id(id).Get(entityPtr)
+	LogError(err)
+	return
+}
+
+func (s *MySessionBase) GetEntityByWhere(tablename string, where string, entityPtr interface{}) (has bool) {
+	has, err := s.Session.Table(tablename).Where(where).Get(entityPtr)
+	LogError(err)
+	return
+}
+
+func (s *MySessionBase) GetEntitysByWhere(tablename string, where string, entityPtr interface{}) {
+	err := s.Session.Table(tablename).Where(where).Find(entityPtr)
+	LogError(err)
+	return
+}
+
+func (s *MySessionBase) GetEntitysByOrderbyWhere(tablename, where, orderby string, entityPtr interface{}) {
+	err := s.Session.Table(tablename).Where(where).OrderBy(orderby).Find(entityPtr)
+	LogError(err)
+	return
+}
+
+//更新实体写入日志,会自动备份数据
+func (s *MySessionBase) UpdateEntityBytbl(tablename string, id interface{}, entity interface{}, cols []string) (err error) {
+	//session := s.DBE.NewSession()
+	//defer session.Close()
+	//err = session.Begin()
+	LogError(err)
+	if err != nil {
+		//s.Session.Rollback()
+		return err
+	}
+	_, err = s.Session.Table(tablename).Id(id).Cols(cols...).Update(entity) //执行更新
+	LogError(err)
+	if err != nil {
+		//s.Session.Rollback()
+		return err
+	}
+	//err = s.Session.Commit()
+	if err != nil {
+		return err
+	}
+	return
+}
+
+//根据条件修改数据,不记录日志
+func (s *MySessionBase) UpdateEntityBywheretbl(tablename string, entity interface{}, cols []string, where string) (err error) {
+	_, err = s.Session.Table(tablename).Where(where).Cols(cols...).Update(entity) //执行更新
+	return err
+}
+
+//更新实体写入日志,会自动备份数据
+func (s *MySessionBase) UpdateDonorAndWriteLogBytbl(tablename string, tablelogname string, id interface{}, entity interface{}, entityEmpty interface{}, cols []string, userid, username, opdesc, acccode, sourcename string) (err error) {
+	s.GetEntityByIdBytbl(tablename, id, entityEmpty)
+	//session := s.Session.NewSession()
+	//defer session.Close()
+	//err = session.Begin()
+	json, err := json.Marshal(entityEmpty)
+	LogError(err)
+	updatem := new(DonorsLog)
+	//获取表名
+	objT := reflect.TypeOf(entity)
+	objT = objT.Elem()
+	tableName := objT.Name()
+	updatem.TableName = tableName
+	updatem.AccCode = acccode
+	updatem.OpDesc = opdesc
+	updatem.OpType = 1
+	updatem.SourceName = sourcename
+	updatem.RecordId = fmt.Sprintf("%v", id)
+	updatem.RecordData = string(json)
+	updatem.CreateUserId = userid
+	updatem.CreateBy = username
+	_, err = s.Session.Table(tablelogname).Insert(updatem) //保存到更新历史表
+
+	LogError(err)
+	if err != nil {
+		//s.Session.Rollback()
+		return err
+	}
+	_, err = s.Session.Table(tablename).Id(id).Cols(cols...).Update(entity) //执行更新
+	LogError(err)
+	if err != nil {
+		//s.Session.Rollback()
+		return err
+	}
+	err = s.Session.Commit()
+	if err != nil {
+		return err
+	}
+	return
+}
+
+//删除实体并写入日志,会自动备份数据,entity为空的表结构
+func (s *MySessionBase) DeleteDonorAndWriteLogBytbl(tablename string, tablelogname string, id interface{}, entity interface{}, entityEmpty interface{}, userid, username, opdesc, acccode, sourcename string) (err error) {
+	has := s.GetEntityByIdBytbl(tablename, id, entity)
+	if has {
+		//session := s.Session.NewSession()
+		//defer session.Close()
+		//err := session.Begin()
+		json, err := json.Marshal(entity)
+		LogError(err)
+		deleted := new(DonorsLog)
+		//获取表名
+		objT := reflect.TypeOf(entity)
+		objT = objT.Elem()
+		tableName := objT.Name()
+
+		deleted.TableName = tableName
+		deleted.AccCode = acccode
+		deleted.OpDesc = opdesc
+		deleted.OpType = 2
+		deleted.SourceName = sourcename
+		deleted.RecordId = fmt.Sprintf("%v", id)
+		deleted.RecordData = string(json)
+		deleted.CreateUserId = userid
+		deleted.CreateBy = username
+
+		_, err = s.Session.Table(tablelogname).Insert(deleted) //保存到更新历史表
+
+		LogError(err)
+		if err != nil {
+			//session.Rollback()
+			return err
+		}
+		_, err = s.Session.Table(tablename).Id(id).Delete(entityEmpty) //执行删除
+		LogError(err)
+		if err != nil {
+			//session.Rollback()
+			return err
+		}
+		//err = session.Commit()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+//主信息不存在,首次添加样本
+func (s *MySessionBase) InsertSampleAndBuss(tblmain, tbldetail, tblbuss string, entitymain, entitydetail, entitybuss interface{}) (affected int64, err error) {
+	//session := s.Session.NewSession()
+	//defer session.Close()
+	//err = session.Begin()
+	affected, err = s.Session.Table(tblmain).Insert(entitymain)
+	LogError(err)
+	if err != nil {
+		//session.Rollback()
+		return 0, err
+	}
+	affected, err = s.Session.Table(tbldetail).Insert(entitydetail)
+	if err != nil {
+		//session.Rollback()
+		return 0, err
+	}
+	affected, err = s.Session.Table(tblbuss).Insert(entitybuss)
+	if err != nil {
+		//session.Rollback()
+		return 0, err
+	}
+	//err = session.Commit()
+	if err != nil {
+		return 0, err
+	}
+	return
+}
+
+//主信息已存在,添加分管信息
+func (s *MySessionBase) InsertOtherSampleAndBuss(tblmain, tbldetail, tblbuss string, entitymain, entitydetail, entitybuss interface{},
+	cols []string, id interface{}, mainentityEmpty interface{}, tablelogname, acccode, userid, username, samplecode string, sampletype int) (affected int64, err error) {
+	s.GetEntityByIdBytbl(tblmain, id, mainentityEmpty)
+	//session := s.Session.NewSession()
+	//defer session.Close()
+	//err = session.Begin()
+
+	json, err := json.Marshal(mainentityEmpty)
+	LogError(err)
+	updatem := new(SamplesLog)
+	//获取表名
+	objT := reflect.TypeOf(entitymain)
+	objT = objT.Elem()
+	tableName := objT.Name()
+	updatem.TableName = tableName
+	updatem.AccCode = acccode
+	updatem.OpType = 3
+	updatem.SampleCode = samplecode
+	updatem.SampleType = sampletype
+	updatem.MId = fmt.Sprintf("%v", id)
+	updatem.RecordData = string(json)
+	updatem.CreateUserId = userid
+	updatem.CreateBy = username
+	_, err = s.Session.Table(tablelogname).Insert(updatem) //保存到更新历史表
+
+	LogError(err)
+	if err != nil {
+		//session.Rollback()
+		return 0, err
+	}
+
+	_, err = s.Session.Table(tblmain).Id(id).Cols(cols...).Update(entitymain) //执行更新
+	LogError(err)
+	if err != nil {
+		//session.Rollback()
+		return 0, err
+	}
+	affected, err = s.Session.Table(tbldetail).Insert(entitydetail)
+	if err != nil {
+		//session.Rollback()
+		return 0, err
+	}
+	affected, err = s.Session.Table(tblbuss).Insert(entitybuss)
+	if err != nil {
+		//session.Rollback()
+		return 0, err
+	}
+	//err = session.Commit()
+	if err != nil {
+		return 0, err
+	}
+	return
+}
+
+//主信息不存在,首次添加样本 预录入新增,不写入buss
+func (s *MySessionBase) InsertSamplePre(tblmain, tbldetail string, entitymain, entitydetail interface{}) (affected int64, err error) {
+	//session := s.Session.NewSession()
+	//defer session.Close()
+	//err = session.Begin()
+	affected, err = s.Session.Table(tblmain).Insert(entitymain)
+	LogError(err)
+	if err != nil {
+		//session.Rollback()
+		return 0, err
+	}
+	affected, err = s.Session.Table(tbldetail).Insert(entitydetail)
+	if err != nil {
+		//session.Rollback()
+		return 0, err
+	}
+	//err = session.Commit()
+	if err != nil {
+		return 0, err
+	}
+	return
+}
+
+//主信息已存在,添加分管信息 预录入新增,不写入buss
+func (s *MySessionBase) InsertOtherSamplePre(tblmain, tbldetail string, entitymain, entitydetail interface{},
+	cols []string, id interface{}, mainentityEmpty interface{}, tablelogname, acccode, userid, username, samplecode string, sampletype int) (affected int64, err error) {
+	s.GetEntityByIdBytbl(tblmain, id, mainentityEmpty)
+	//session := s.Session.NewSession()
+	//defer session.Close()
+	//err = session.Begin()
+
+	json, err := json.Marshal(mainentityEmpty)
+	LogError(err)
+	updatem := new(SamplesLog)
+	//获取表名
+	objT := reflect.TypeOf(entitymain)
+	objT = objT.Elem()
+	tableName := objT.Name()
+	updatem.TableName = tableName
+	updatem.AccCode = acccode
+	updatem.OpType = 3
+	updatem.SampleCode = samplecode
+	updatem.SampleType = sampletype
+	updatem.MId = fmt.Sprintf("%v", id)
+	updatem.RecordData = string(json)
+	updatem.CreateUserId = userid
+	updatem.CreateBy = username
+	_, err = s.Session.Table(tablelogname).Insert(updatem) //保存到更新历史表
+
+	LogError(err)
+	if err != nil {
+		//session.Rollback()
+		return 0, err
+	}
+
+	_, err = s.Session.Table(tblmain).Id(id).Cols(cols...).Update(entitymain) //执行更新
+	LogError(err)
+	if err != nil {
+		//session.Rollback()
+		return 0, err
+	}
+	affected, err = s.Session.Table(tbldetail).Insert(entitydetail)
+	if err != nil {
+		//session.Rollback()
+		return 0, err
+	}
+	//err = session.Commit()
+	if err != nil {
+		return 0, err
+	}
+	return
+}
+
+//出入库信息。修改主表和从表,添加buss表
+func (s *MySessionBase) UpdateOtherSampleAndBuss(tblmain, tbldetail, tblbuss string, entitymain, entitydetail, entitybuss interface{},
+	cols, colsdetail []string, id interface{}, mainentityEmpty, detailentityEmpty interface{}, tablelogname, acccode, userid, username, samplecode string) (affected int64, err error) {
+	s.GetEntityByIdBytbl(tblmain, id, mainentityEmpty)
+	//session := s.Session.NewSession()
+	//defer session.Close()
+	//err = session.Begin()
+
+	json, err := json.Marshal(mainentityEmpty)
+	LogError(err)
+	updatem := new(SamplesLog)
+	//获取表名
+	objT := reflect.TypeOf(entitymain)
+	objT = objT.Elem()
+	tableName := objT.Name()
+	updatem.TableName = tableName
+	updatem.AccCode = acccode
+	updatem.OpType = 1
+	updatem.SampleCode = samplecode
+	updatem.BarCode = samplecode
+	updatem.RecordId = fmt.Sprintf("%v", id)
+	updatem.RecordData = string(json)
+	updatem.CreateUserId = userid
+	updatem.CreateBy = username
+	_, err = s.Session.Table(tablelogname).Insert(updatem) //保存到更新历史表
+
+	LogError(err)
+	if err != nil {
+		//session.Rollback()
+		return 0, err
+	}
+
+	_, err = s.Session.Table(tblmain).Id(id).Cols(cols...).Update(entitymain) //执行更新
+	LogError(err)
+	if err != nil {
+		//session.Rollback()
+		return 0, err
+	}
+
+	s.GetEntityByIdBytbl(tbldetail, id, detailentityEmpty)
+
+	affected, err = s.Session.Table(tbldetail).Insert(entitydetail)
+	if err != nil {
+		//session.Rollback()
+		return 0, err
+	}
+	affected, err = s.Session.Table(tblbuss).Insert(entitybuss)
+	if err != nil {
+		//session.Rollback()
+		return 0, err
+	}
+	//err = session.Commit()
+	if err != nil {
+		return 0, err
+	}
+	return
+}
+
+//更改样本表
+func (s *MySessionBase) UpdateSample(tablename string, id interface{}, entity interface{}, cols []string) (err error) {
+	//	fmt.Println("=====")
+	//session := s.Session.NewSession()
+	//defer session.Close()
+	//err = session.Begin()
+	_, err = s.Session.Table(tablename).Id(id).Cols(cols...).Update(entity) //执行更新
+	LogError(err)
+	if err != nil {
+		//session.Rollback()
+		return err
+	}
+	//err = session.Commit()
+	if err != nil {
+		return err
+	}
+	return
+}
+
+//复苏分装提取信息。修改从表,添加buss表
+func (s *MySessionBase) UpdateDetailAndBuss(tbldetail, tblbuss string, id interface{}, entitydetail, entitybuss interface{}, colsdetail []string) (err error) {
+	//session := s.Session.NewSession()
+	//defer session.Close()
+	//err = session.Begin()
+	_, err = s.Session.Table(tbldetail).Id(id).Cols(colsdetail...).Update(entitydetail) //执行更新
+	LogError(err)
+	if err != nil {
+		//session.Rollback()
+		return err
+	}
+	_, err = s.Session.Table(tblbuss).Insert(entitybuss)
+	if err != nil {
+		//session.Rollback()
+		return err
+	}
+	//err = session.Commit()
+	if err != nil {
+		return err
+	}
+	return
+}
+
+//更改样本表并写入日志
+func (s *MySessionBase) WriteSampleLog(tablelogname string, id interface{}, mid interface{}, entity interface{}, userid, username, acccode, samplecode, barcode string, sampletype int) (err error) {
+	//session := s.Session.NewSession()
+	//defer session.Close()
+	//err = session.Begin()
+	json, err := json.Marshal(entity)
+	LogError(err)
+	updatem := new(SamplesLog)
+	//获取表名
+	updatem.TableName = "SamplesInfoShow"
+	updatem.AccCode = acccode
+	updatem.OpType = 1
+	updatem.SampleCode = samplecode
+	updatem.BarCode = barcode
+	updatem.RecordId = fmt.Sprintf("%v", id)
+	updatem.MId = fmt.Sprintf("%v", mid)
+	updatem.RecordData = string(json)
+	updatem.CreateUserId = userid
+	updatem.CreateBy = username
+	updatem.SampleType = sampletype
+	_, err = s.Session.Table(tablelogname).Insert(updatem) //保存到更新历史表
+
+	LogError(err)
+	if err != nil {
+		//session.Rollback()
+		return err
+	}
+	//err = session.Commit()
+	if err != nil {
+		return err
+	}
+	return
+}
+
+//写入样本删除日志
+func (s *MySessionBase) WriteDeleteSampleLog(tablelogname string, id interface{}, mid interface{}, entity interface{}, userid, username, acccode, samplecode, barcode string, sampletype int) (err error) {
+	//session := s.Session.NewSession()
+	//defer session.Close()
+	//err = session.Begin()
+	json, err := json.Marshal(entity)
+	LogError(err)
+	updatem := new(SamplesLog)
+	//获取表名
+	updatem.TableName = "SamplesInfoShow"
+	updatem.AccCode = acccode
+	updatem.OpType = 2
+	updatem.SampleCode = samplecode
+	updatem.BarCode = barcode
+	updatem.RecordId = fmt.Sprintf("%v", id)
+	updatem.MId = fmt.Sprintf("%v", mid)
+	updatem.RecordData = string(json)
+	updatem.CreateUserId = userid
+	updatem.CreateBy = username
+	updatem.SampleType = sampletype
+	_, err = s.Session.Table(tablelogname).Insert(updatem) //保存到更新历史表
+
+	LogError(err)
+	if err != nil {
+		//session.Rollback()
+		return err
+	}
+	//err = session.Commit()
+	if err != nil {
+		return err
+	}
+	return
+}
+
+//更新实体写入日志,会自动备份数据
+func (s *MySessionBase) UpdateOperationAndWriteLogBytbl(tablename string, tablelogname string, id interface{}, entity interface{}, entityEmpty interface{}, cols []string, userid, username, opdesc, acccode, tabledesc string) (err error) {
+	s.GetEntityByIdBytbl(tablename, id, entityEmpty)
+	//session := s.Session.NewSession()
+	//defer session.Close()
+	//err = session.Begin()
+	json, err := json.Marshal(entityEmpty)
+	LogError(err)
+	updatem := new(Base_OperationLog)
+	//获取表名
+	objT := reflect.TypeOf(entity)
+	objT = objT.Elem()
+	tableName := objT.Name()
+	updatem.TableName = tableName
+	updatem.AccCode = acccode
+	updatem.OpDesc = opdesc
+	updatem.OpTage = 1
+	updatem.TableDesc = tabledesc
+	updatem.RecordId = fmt.Sprintf("%v", id)
+	updatem.RecordData = string(json)
+	updatem.Createuserid = userid
+	updatem.Createby = username
+	_, err = s.Session.Table(tablelogname).Insert(updatem) //保存到更新历史表
+
+	LogError(err)
+	if err != nil {
+		//session.Rollback()
+		return err
+	}
+	_, err = s.Session.Table(tablename).Id(id).Cols(cols...).Update(entity) //执行更新
+	LogError(err)
+	if err != nil {
+		//session.Rollback()
+		return err
+	}
+	//err = session.Commit()
+	if err != nil {
+		return err
+	}
+	return
+}
+
+//删除实体并写入日志,会自动备份数据,entity为空的表结构
+func (s *MySessionBase) DeleteOperationAndWriteLogBytbl(tablename string, tablelogname string, id interface{}, entity interface{}, entityEmpty interface{}, userid, username, opdesc, acccode, tabledesc string) (err error) {
+	has := s.GetEntityByIdBytbl(tablename, id, entity)
+	if has {
+		//session := s.Session.NewSession()
+		//defer session.Close()
+		//err := session.Begin()
+		json, err := json.Marshal(entity)
+		LogError(err)
+		deleted := new(Base_OperationLog)
+		//获取表名
+		objT := reflect.TypeOf(entity)
+		objT = objT.Elem()
+		tableName := objT.Name()
+
+		deleted.TableName = tableName
+		deleted.AccCode = acccode
+		deleted.OpDesc = opdesc
+		deleted.OpTage = 2
+		deleted.TableDesc = tabledesc
+		deleted.RecordId = fmt.Sprintf("%v", id)
+		deleted.RecordData = string(json)
+		deleted.Createuserid = userid
+		deleted.Createby = username
+
+		_, err = s.Session.Table(tablelogname).Insert(deleted) //保存到更新历史表
+
+		LogError(err)
+		if err != nil {
+			//session.Rollback()
+			return err
+		}
+		_, err = s.Session.Table(tablename).Id(id).Delete(entityEmpty) //执行删除
+		LogError(err)
+		if err != nil {
+			//session.Rollback()
+			return err
+		}
+		//err = session.Commit()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+//根据条件删除数据,不记录日志
+func (s *MySessionBase) DeleteEntityBytbl(tablename string, where string) (err error) {
+	if where == "" {
+		where = "1=2"
+	}
+	sql := `delete from ` + tablename + ` where ` + where
+	_, err = s.Session.Exec(sql)
+	return
+}
+
+func (s *MySessionBase) GetTopNEntities(tablename string, topN int, where string, entitiesPtr interface{}) {
+	err := s.Session.Table(tablename).Where(where).Limit(topN, 0).Find(entitiesPtr)
+	LogError(err)
+	return
+}

+ 10 - 0
src/dashoo.cn/backend/api/routers/router.go

@@ -19,6 +19,7 @@ import (
 	"dashoo.cn/backend/api/controllers/setting"
 	"dashoo.cn/backend/api/controllers/system"
 	"dashoo.cn/backend/api/controllers/trigger"
+	"dashoo.cn/backend/api/controllers/workflow"
 	"github.com/astaxie/beego"
 	"github.com/astaxie/beego/plugins/cors"
 )
@@ -69,6 +70,11 @@ func init() {
 				&casbin.OrganizesController{},
 			),
 		),
+		beego.NSNamespace("/auditsetting",
+			beego.NSInclude(
+				&system.OilAuditSettingController{},
+			),
+		),
 		beego.NSNamespace("/module",
 			beego.NSInclude(
 				&casbin.ModuleController{},
@@ -388,6 +394,10 @@ func init() {
 				&controllers.UploadController{},
 			),
 		),
+			beego.NSInclude(
+				&workflow.WorkflowController{},
+			),
+		),
 	)
 	beego.AddNamespace(ns)
 }

+ 41 - 0
src/dashoo.cn/frontend_web/src/api/system/auditsetting.js

@@ -0,0 +1,41 @@
+export default {
+  getList (CreateOn, params, myAxios) {
+    return myAxios({
+      url: '/auditsetting/list?CreateOn=' + CreateOn,
+      method: 'GET',
+      params: params
+    })
+  },
+  getDictList (myAxios) {
+    return myAxios({
+      url: '/auditsetting/dictlist/',
+      method: 'GET'
+    })
+  },
+  getEntity (entityId, myAxios) {
+    return myAxios({
+      url: '/auditsetting/get/' + entityId,
+      method: 'GET'
+    })
+  },
+  addEntity (formData, myAxios) {
+    return myAxios({
+      url: '/auditsetting/add',
+      method: 'post',
+      data: formData
+    })
+  },
+  updateEntity (entityId, formData, myAxios) {
+    return myAxios({
+      url: '/auditsetting/update/' + entityId,
+      method: 'post',
+      data: formData
+    })
+  },
+  deleteEntity (entityId, myAxios) {
+    return myAxios({
+      url: '/auditsetting/delete/' + entityId,
+      method: 'delete'
+    })
+  }
+}

+ 167 - 0
src/dashoo.cn/frontend_web/src/components/workflow/wfhistory.vue

@@ -0,0 +1,167 @@
+<template>
+  <div>
+    <el-table :data="historyTask" border>
+      <el-table-column prop="taskName" sortable min-width="130" label="当前状态" align="center" show-overflow-tooltip></el-table-column>
+      <el-table-column prop="remarks" sortable min-width="130" label="审批意见" align="center" show-overflow-tooltip></el-table-column>
+      <el-table-column prop="assignee" sortable min-width="100" label="审核人" align="center" show-overflow-tooltip>
+        <template slot-scope="scope">
+          <span style="font-weight: bold" v-if="scope.row.assignee">
+            {{ assigneeToAssignee(scope.row.assignee) }}
+          </span>
+          <el-tooltip class="item" v-if="!scope.row.assignee" content="当前步骤有审批权限的人员" placement="top-start">
+            <span style="font-style: italic; color:#00F">
+              {{ assigneeToUsers(scope.row.users) }}
+            </span>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+      <el-table-column prop="startTime" sortable min-width="150" label="开始时间" align="center" show-overflow-tooltip>
+        <template slot-scope="scope">
+          {{ timestampToTime(scope.row.startTime) }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="endTime" sortable min-width="150" label="结束时间" align="center" show-overflow-tooltip>
+        <template slot-scope="scope">
+          {{ jstimehandle(timestampToTime(scope.row.endTime)) }}
+        </template>
+      </el-table-column>
+    </el-table>
+    <div style="margin-top:10px;">
+      <img :src="baseurl + 'limsdataentry/historyimg/' + entryinfo.instance " v-if="entryinfo.instance">
+    </div>
+  </div>
+</template>
+
+<script>
+  import {
+    mapGetters
+  } from 'vuex'
+
+  export default {
+    name: 'wfhistory',
+    props: {
+      visible: {
+        type: Boolean,
+        default: false
+      },
+      entryinfo: {}
+    },
+    created() {
+      this.getuserlist()
+    },
+    computed: {
+      ...mapGetters({
+        session: 'session'
+      })
+    },
+
+    data() {
+      return {
+        baseurl: process.env.baseURL,
+        process: '',
+        business: '',
+        instance: '',
+        selfVisible: this.visible, // 避免vue双向绑定警告
+        historyTask: [],
+        userlist: [],
+      }
+    },
+    methods: {
+      getHistoryTask() {
+        let _this = this
+        const params = {
+          process: _this.entryinfo.process,
+          business: _this.entryinfo.business,
+          instance: _this.entryinfo.instance,
+        }
+        this.$axios.get('workflow/historytask', {
+          params
+        })
+          .then(res => {
+            _this.historyTask = res.data.items
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+          })
+      },
+      assigneeToAssignee(val) {
+        for (let i = 0; i < this.userlist.length; i++) {
+          if (val == this.userlist[i].Id) {
+            return this.userlist[i].Realname
+          }
+        }
+      },
+      assigneeToUsers(users) {
+        let userNames = ""
+        let userArr = users.split(',')
+        for(let idx=0; idx<userArr.length; idx++) {
+          let val = userArr[idx]
+          for (let i = 0; i < this.userlist.length; i++) {
+            if (parseInt(val) == parseInt(this.userlist[i].Id)) {
+              userNames += this.userlist[i].Realname + ", "
+            }
+          }
+        }
+        if(userNames.length > 0) {
+          userNames = userNames.substring(0, userNames.length-2)
+        }
+        return userNames;
+      },
+      getuserlist() {
+        let _this = this
+        _this.$axios.get('workflow/userlist', {})
+          .then(res => {
+            // response
+            _this.userlist = res.data.items
+
+            this.getHistoryTask()
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+          })
+      },
+      timestampToTime(val) {
+        var date = new Date(val) //时间戳为10位需*1000,时间戳为13位的话不需乘1000
+        var Y = date.getFullYear() + '-'
+        var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
+        var D = date.getDate() + ' '
+        var h = date.getHours() + ':'
+        var m = date.getMinutes() + ':'
+        var s = date.getSeconds()
+        return Y + M + D + h + m + s
+      },
+      jstimehandle(val) {
+        if (val === '') {
+          return '----'
+        } else if (val === '0001-01-01T08:00:00+08:00') {
+          return '----'
+        } else if (val === '5000-01-01T23:59:59+08:00') {
+          return '永久'
+        } else if (val === '1970-01-01 8:0:0') {
+          return '----'
+        } else if (val === '1970-01-1 8:0:0') {
+          return '----'
+        } else {
+          val = val.replace('T', ' ')
+          return val.substring(0, 19)
+        }
+      },
+    }
+  }
+
+</script>
+
+<style>
+  .samplerecoveope .el-radio {
+    padding: 8px 15px 0 0;
+    margin-left: -2px;
+  }
+  .dialog-footer img{
+    position: relative;
+    width: 100%;
+    height: 100%;
+  }
+
+</style>

+ 223 - 0
src/dashoo.cn/frontend_web/src/pages/login3.vue

@@ -0,0 +1,223 @@
+<template>
+
+  <div style="height: calc(100vh); width: 100%; background-color:#FFFFFF" >
+    <img src="../assets/img/title_gongfang.png" style="height:60px; margin-top: 20px;margin-left: 100px;"  >
+    <div class="back-width">
+      <div class="login-body">
+        <section class="login">
+          <!--<header class="login-header">
+            <h1 style="text-align:center;margin-top:70px;margin-bottom:40px;"><router-link to="/"><img src="../assets/img/logo.png" style="height:80px;"></router-link></h1>
+            <el-alert v-if="error" :title="error.title" type="warning" :description="error.message" show-icon/>
+          </header>-->
+          <el-form class="login-form" auto-complete="off" :model="model" :rules="rules" ref="user" label-position="top">
+            <h2 class="heading">登录</h2>
+            <el-form-item label="用户名" prop="username">
+              <el-input type="text" v-model="model.username" placeholder="请输入用户名">
+                <el-select v-model="loginMode" slot="append" placeholder="登录类型" style="width: 110px;">
+                  <el-option label="普通账户" :value="1"></el-option>
+                  <el-option label="PTR认证" :value="2"></el-option>
+                </el-select>
+              </el-input>
+            </el-form-item>
+            <el-form-item label="密码" prop="password">
+              <el-input type="password" v-model="model.password" placeholder="请输入密码" @keyup.enter.native="login()" />
+            </el-form-item>
+            <el-button type="primary" :loading="loading" @click="login()">{{ loading ? '登录中...' : '登录' }}</el-button>
+          </el-form>
+
+        </section>
+      </div>
+    </div>
+    <div >
+      <footer class="login-footer" style="color:#A9A9A9">
+        ©大港油田信息中心 版权所有
+      </footer>
+    </div>
+  </div>
+</template>
+
+<script>
+  import Vue from 'vue'
+  import Component from 'class-component'
+  @Component({
+    data() {
+      // form model
+      // TODO: remove default values
+      const model = {
+        username: '',
+        password: ''
+      }
+
+      // form validate rules
+      const rules = {
+        username: [{
+          required: true,
+          message: '请输入用户名'
+        }],
+        password: [{
+          required: true,
+          message: '请输入密码'
+        }]
+      }
+
+      return {
+        loginMode: 1,
+        model: model,
+        rules: rules,
+        error: null,
+        loading: false
+      }
+    }
+  })
+  export default class Login extends Vue {
+    layout() {
+      return 'empty'
+    }
+    login() {
+      this.logging = true
+      this.$refs.user.validate(async (valid) => {
+        try {
+          if (valid) {
+            await this.$store.dispatch('auth/login', {
+              fields: {
+                username: this.model.username.replace(/(^\s*)|(\s*$)/g, ""),
+                password: this.model.password.replace(/(^\s*)|(\s*$)/g, "")
+              }
+            })
+            if (process.env.appclient == 'lims') {
+              this.$router.push(this.$route.query.page || '/')
+            } else if (process.env.appclient == 'cellbank') {
+              this.$router.push(this.$route.query.page || '/indexdqm')
+            } else {
+              this.$router.push(this.$route.query.page || '/')
+            }
+          }
+        } catch (e) {
+          // this.$message.warning(e.message)
+          this.$message.warning('账号或密码错误')
+        } finally {
+          this.logging = false
+        }
+      })
+    }
+    logout() {
+      this.$store.dispatch('logout')
+    }
+  }
+
+</script>
+
+<style lang="scss">
+  @import '../assets/styles/base/variables';
+
+  .back-width {
+    background-color: #2F79F6;
+    position: fixed;
+    margin: auto;
+    left: 0;
+    right: 0;
+    top: 88px;
+    width: 100%;
+    height: 550px;
+  }
+
+  .login-body {
+
+    background: url("../assets/img/tian.png") no-repeat left 50%;
+    font-family: 'Open Sans', sans-serif;
+    background-color: #2469E8;
+    background-size: cover;
+
+    /*background-size: cover;
+    -webkit-background-size: cover;
+    -moz-background-size: cover;
+    -o-background-size: cover;*/
+    /*min-height: 1050px;*/
+
+    position: absolute;
+
+    margin: auto;
+    left: -400px;
+    right: 0;
+    bottom: 0;
+    width: 899px;
+    height: 550px;
+    /*
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;*/
+  }
+
+  .login-footer {
+    font-size: 10px;
+    clear: both;
+    display: block;
+    text-align: center;
+    margin: 0px auto;
+    position: absolute;
+    bottom: 10px;
+    width: 100%;
+
+    a {
+      color: $brand-color;
+    }
+  }
+
+  .login {
+    /*flex: 1;
+    width: 100%;*/
+    position: relative;
+    max-width: 22rem;
+    top: 60px;
+    left: 850px;
+    font-size: 0.875rem;
+    opacity: 0.9;
+
+    &-header {
+      margin-bottom: 1rem;
+
+      .brand {
+        margin: 4.5rem 0 3.5rem;
+        text-align: center;
+        letter-spacing: 0.125rem;
+
+        a {
+          margin: 0;
+          color: $brand-color;
+          font: 300 3rem sans-serif;
+
+          &:hover {
+            color: $brand-hover-color;
+            text-shadow: 0 0 1rem $brand-hover-color;
+          }
+        }
+      }
+    }
+
+    &-form {
+      margin-bottom: 2.5rem;
+      padding: 1.875rem 1.25rem;
+      background: $login-form-background;
+      color: $login-form-color;
+
+      .heading {
+        margin: 0 0 1rem;
+        font-weight: 400;
+        font-size: 1.5rem;
+      }
+
+      .el-button {
+        margin-top: 0.5rem;
+        width: 100%;
+      }
+    }
+
+
+  }
+
+  .nuxt-progress {
+    display: none;
+  }
+
+</style>

+ 274 - 0
src/dashoo.cn/frontend_web/src/pages/system/auditsetting/_opera/operation.vue

@@ -0,0 +1,274 @@
+
+
+<template>
+  <div>
+    <el-breadcrumb class="heading">
+      <el-breadcrumb-item :to="{ path: '/' }">平台首页</el-breadcrumb-item>
+      <el-breadcrumb-item :to="{ path: '/system/auditsetting' }">单位审批步骤自定义配置</el-breadcrumb-item>
+      <el-breadcrumb-item>编辑</el-breadcrumb-item>
+    </el-breadcrumb>
+    <el-card class="box-card" style="height: calc(100vh - 113px);">
+      <div slot="header">
+        <span>
+          <i class="icon icon-table2"></i> 编辑
+        </span>
+        <span style="float: right;">
+          <el-button type="primary" size="mini" @click="saveEntity">保存</el-button>
+          <router-link :to="'/system/auditsetting'">
+            <el-button type="primary" size="mini" style="margin-left: 8px">返回</el-button>
+          </router-link>
+        </span>
+      </div>
+      <el-form label-width="110px" ref="EntityForm" :model="formData">
+        <el-row>
+          <el-col :span="6">
+            <el-form-item label="单位名称" required>
+              <el-input v-model="formData.OrganizeName" placeholder="请输入" Readonly style="width: 100%"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="6">
+            <el-form-item label="审批步骤" required>
+              <el-select ref="selectAuditStep" v-model="formData.AuditStepCode" filterable placeholder="请选择" style="width: 100%">
+                <el-option
+                  v-for="item in auditStepOptions"
+                  :key="item.Id"
+                  :label="item.Key"
+                  :value="item.Value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="6">
+            <el-form-item label="角色" required>
+              <el-select ref="selectRole" v-model="formData.RoleId" filterable placeholder="请选择" style="width: 100%">
+                <el-option
+                  v-for="item in roleList"
+                  :key="item.Id"
+                  :label="item.Realname"
+                  :value="item.Id">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="工作流" required>
+              <el-select ref="selectWorkFlow" v-model="formData.WorkFlowCord" filterable placeholder="请选择" style="width: 100%">
+                <el-option
+                  v-for="item in WorkFlowOptions"
+                  :key="item.Id"
+                  :label="item.Key"
+                  :value="item.Value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="24">
+            <el-form-item label="备注">
+              <el-input v-model="formData.Remark" type="textarea" placeholder="请输入"  style="width: 100%"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+  </div>
+</template>
+
+<script>
+  import {
+    mapGetters
+  } from 'vuex'
+  import api from '@/api/system/auditsetting'
+  export default {
+    computed: {
+      ...mapGetters({
+        authUser: 'authUser'
+      })
+    },
+    name: 'oilauditsettingEdit',
+
+    data () {
+      return {
+        serviceId: '',
+        auditStepOptions: [],
+        roleList: [],
+        WorkFlowOptions: [],
+        formData: {
+          Id: '',
+          OrganizeId: '',
+          OrganizeName: '',
+          AuditStepCode: '',
+          AuditStepName: '',
+          RoleId: '',
+          RoleName: '',
+          WorkFlowCord: '',
+          WorkFlowName: '',
+          Remark: '',
+          IsDelete: '',
+          CreateOn: '',
+          CreateUserId: '',
+          CreateBy: '',
+          ModifiedOn: '',
+          ModifiedUserId: '',
+          ModifiedBy: ''
+
+        }
+        // 下拉选择项
+        // wellNoOptions: [],
+        // supervisersOptions: [],
+
+      }
+    },
+    created () {
+      this.serviceId = this.$route.params.opera
+      this.getDictOptions()
+      if (this.serviceId !== 'add' && this.serviceId > 0) {
+        this.formData.Id = this.serviceId
+        this.initDatas()
+      } else {
+        this.formData.Id = 0
+      }
+    },
+    methods: {
+      initDatas () {
+        if (this.formData.Id) {
+          api.getEntity(this.formData.Id, this.$axios).then(res => {
+            this.formData = res.data
+          }).catch(err => {
+            console.error(err)
+          })
+        }
+      },
+
+      getDictOptions () {
+        api.getDictList(this.$axios).then(res => {
+          this.auditStepOptions = res.data.items['AuditStep']
+          this.roleList = res.data.items['RoleList']
+          this.formData.OrganizeId = res.data.items['OrganizeId']
+          this.formData.OrganizeName = res.data.items['OrganizeName']
+          this.WorkFlowOptions = res.data.items['WorkFlow']
+          // this.supervisersOptions = res.data.items['Supervisers']
+        }).catch(err => {
+          console.error(err)
+        })
+      },
+
+      // 保存信息
+      saveEntity () {
+        this.$refs['EntityForm'].validate((valid) => {
+          if (valid) {
+            // this.formData.WellNo = this.$refs.selectWellNo.selectedLabel + '';
+            this.formData.AuditStepName = this.$refs.selectAuditStep.selectedLabel + ''
+            this.formData.RoleName = this.$refs.selectRole.selectedLabel + ''
+            this.formData.WorkFlowName = this.$refs.selectWorkFlow.selectedLabel + ''
+            this.formData.OrganizeId = parseInt(this.formData.OrganizeId)
+            if (!this.formData.Id) {
+              this.addEntity()
+            } else {
+              this.updateEntity()
+            }
+          } else {
+            return false
+          }
+        })
+      },
+
+      addEntity () {
+        if (!this.formData.OrganizeId) {
+          this.$message({
+            type: 'error',
+            message: '部门信息缺失,不允许保存!'
+          })
+          return false
+        }
+
+        if (!this.formData.AuditStepCode) {
+          this.$message({
+            type: 'error',
+            message: '步骤信息缺失,不允许保存!'
+          })
+          return false
+        }
+
+        if (!this.formData.RoleId) {
+          this.$message({
+            type: 'error',
+            message: '角色信息缺失,不允许保存!'
+          })
+          return false
+        }
+
+        api.addEntity(this.formData, this.$axios).then(res => {
+          if (res.data.code === 0) {
+            // 保存成功后,初始化数据,变成修改
+            this.formData.Id = res.data.item
+            this.initDatas()
+            this.$message({
+              type: 'success',
+              message: res.data.message
+            })
+          } else {
+            this.$message({
+              type: 'warning',
+              message: res.data.message
+            })
+          }
+        }).catch(err => {
+          console.error(err)
+        })
+      },
+
+      updateEntity () {
+        api.updateEntity(this.formData.Id, this.formData, this.$axios).then(res => {
+          if (res.data.code === 0) {
+            // 保存成功后,初始化数据,变成修改
+            this.initDatas()
+            this.$message({
+              type: 'success',
+              message: res.data.message
+            })
+          } else {
+            this.$message({
+              type: 'warning',
+              message: res.data.message
+            })
+          }
+        }).catch(err => {
+          console.error(err)
+        })
+      },
+
+      jstimehandle (val) {
+        if (val === '') {
+          return '----'
+        } else if (val === '0001-01-01T08:00:00+08:00') {
+          return '----'
+        } else if (val === '5000-01-01T23:59:59+08:00') {
+          return '永久'
+        } else {
+          val = val.replace('T', ' ')
+          return val.substring(0, 10)
+        }
+      },
+
+      formatDateTime (date) {
+        var y = date.getFullYear()
+        var m = date.getMonth() + 1
+        m = m < 10 ? ('0' + m) : m
+        var d = date.getDate()
+        d = d < 10 ? ('0' + d) : d
+        var h = date.getHours()
+        var minute = date.getMinutes()
+        minute = minute < 10 ? ('0' + minute) : minute
+        return y + '-' + m + '-' + d + ' ' + h + ':' + minute
+      }
+    }
+  }
+</script>
+
+<style lang="scss">
+
+</style>
+

+ 370 - 0
src/dashoo.cn/frontend_web/src/pages/system/auditsetting/index.vue

@@ -0,0 +1,370 @@
+<template>
+  <div>
+    <el-breadcrumb class="heading">
+      <el-breadcrumb-item :to="{ path: '/' }">平台首页</el-breadcrumb-item>
+      <el-breadcrumb-item :to="{ path: '/system/auditsetting' }">单位审批步骤自定义配置</el-breadcrumb-item>
+    </el-breadcrumb>
+    <el-card class="box-card" style="height: calc(100vh - 115px);">
+      <div slot="header">
+        <span>
+          <i class="icon icon-table2"></i> 自定义配置
+        </span>
+        <span style="float: right;">
+          <router-link :to="'/system/auditsetting/add/operation'">
+            <el-button type="primary" size="mini" style="margin-left:10px; margin-top: -4px;">添加</el-button>
+          </router-link>
+        </span>
+        <el-form ref="form" :inline="true" style="float: right; margin-top: -10px">
+          <!--<el-form-item label="上报时间">
+            <el-date-picker size="mini" style="width: 220px" v-model="CreateOn" type="daterange" range-separator="至"
+                            start-placeholder="生成日期" end-placeholder="结束日期"></el-date-picker>
+          </el-form-item>-->
+          <el-form-item label="上级组织" label-width="120px" v-if="false">
+            <el-cascader :options="orgtreelist" :props="orgtreeprops" change-on-select :show-all-levels="false" v-model="selectedorg"
+                         placeholder="请选择组织"></el-cascader>
+          </el-form-item>
+
+          <el-form-item>
+            <el-dropdown split-button type="primary" size="mini" @click="handleSearch" @command="searchCommand">
+              查询
+              <el-dropdown-menu slot="dropdown">
+                <el-dropdown-item command="search">高级查询</el-dropdown-item>
+                <el-dropdown-item command="clear">查询重置</el-dropdown-item>
+              </el-dropdown-menu>
+            </el-dropdown>
+          </el-form-item>
+        </el-form>
+      </div>
+      <el-table :data="entityList" border height="calc(100vh - 243px)" style="width: 100%" @sort-change="orderby">
+        <el-table-column label="操作" width="160" align="center" fixed>
+          <template slot-scope="scope">
+            <router-link :to="'/system/auditsetting/' + scope.row.Id + '/operation'">
+              <el-button type="primary" title="编辑" size="mini">编辑</el-button>
+            </router-link>
+
+            <el-popover placement="top" title="提示">
+              <el-alert
+                title=""
+                description="确认要删除吗?"
+                trigger="click"
+                type="warning"
+                :closable="false">
+              </el-alert>
+              <br/>
+              <div style="text-align: right; margin: 0">
+                <el-button type="primary" size="mini" @click="deleteEntity(scope.row)">删除</el-button>
+              </div>
+              <el-button slot="reference" type="plain" title="删除" style="margin-left:3px" size="mini">删除</el-button>
+            </el-popover>
+          </template>
+        </el-table-column>
+
+        <el-table-column v-for="column in tableColumns" :key="column.Id"
+                         v-if="column.prop != 'CreateOn'" :prop="column.prop" sortable min-width="100" :label="column.label" align="center" show-overflow-tooltip></el-table-column>
+
+        <!--<el-table-column prop="CreateOn" sortable min-width="150" label="生成时间" align="center" show-overflow-tooltip>
+          <template slot-scope="scope">
+            {{ jstimehandle(scope.row.CreateOn+'') }}
+          </template>
+        </el-table-column>-->
+      </el-table>
+      <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage"
+                     :page-sizes="[10, 15, 20, 25]" :page-size="size" layout="total, sizes, prev, pager, next, jumper" :total="currentItemCount">
+      </el-pagination>
+    </el-card>
+
+    <el-dialog title="高级查询" :visible.sync="dialogVisible" width="720px">
+      <el-form ref="advancedsearchForm" label-width="110px">
+        <el-row>
+
+          <el-col :span="12">
+            <el-form-item label="生成时间">
+              <el-date-picker size="mini" v-model="CreateOn" type="daterange" style="width:100%" range-separator="至"
+                              start-placeholder="生成日期" end-placeholder="结束日期"></el-date-picker>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="单位ID">
+              <el-input size="mini" v-model="searchForm.OrganizeId" style="width:100%" placeholder="请输入"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="单位名称">
+              <el-input size="mini" v-model="searchForm.OrganizeName" style="width:100%" placeholder="请输入"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="审批步骤编码">
+              <el-input size="mini" v-model="searchForm.AuditStepCode" style="width:100%" placeholder="请输入"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="审批步骤名称">
+              <el-input size="mini" v-model="searchForm.AuditStepName" style="width:100%" placeholder="请输入"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="角色ID">
+              <el-input size="mini" v-model="searchForm.RoleId" style="width:100%" placeholder="请输入"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="角色名称">
+              <el-input size="mini" v-model="searchForm.RoleName" style="width:100%" placeholder="请输入"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="备注">
+              <el-input size="mini" v-model="searchForm.Remark" style="width:100%" placeholder="请输入"></el-input>
+            </el-form-item>
+          </el-col>
+
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="mini" @click="dialogVisible = false">取 消</el-button>
+        <el-button size="mini" type="primary" @click="handleSearch">查 询</el-button>
+      </span>
+    </el-dialog>
+
+  </div>
+</template>
+<script>
+  import { mapGetters } from 'vuex'
+  import api from '@/api/system/auditsetting'
+
+  export default {
+    computed: {
+      ...mapGetters({
+        authUser: 'authUser'
+      })
+    },
+    name: 'oilauditsetting',
+
+    data () {
+      return {
+        dialogVisible: false,
+        // 列表数据
+        entityList: [],
+        // 分页参数
+        size: 10,
+        currentPage: 1,
+        currentItemCount: 0,
+        // 列表排序
+        Column: {
+          Order: '',
+          Prop: ''
+        },
+        // 查询时间
+        CreateOn: [new Date(new Date().getTime() - 30 * 24 * 60 * 60 * 1000), new Date()],
+        // 查询项
+        searchFormReset: {},
+        searchForm: {
+          Id: '',
+          OrganizeId: '',
+          OrganizeName: '',
+          AuditStepCode: '',
+          AuditStepName: '',
+          RoleId: '',
+          RoleName: '',
+          Remark: '',
+          IsDelete: '',
+          CreateOn: '',
+          CreateUserId: '',
+          CreateBy: '',
+          ModifiedOn: '',
+          ModifiedUserId: '',
+          ModifiedBy: ''
+        },
+        tableColumns: [
+          {
+            prop: 'OrganizeName',
+            label: '单位名称',
+            width: 100,
+            sort: true
+          },
+
+          {
+            prop: 'AuditStepCode',
+            label: '审批步骤编码',
+            width: 100,
+            sort: true
+          },
+
+          {
+            prop: 'AuditStepName',
+            label: '审批步骤名称',
+            width: 100,
+            sort: true
+          },
+          {
+            prop: 'RoleName',
+            label: '角色名称',
+            width: 100,
+            sort: true
+          },
+          {
+            prop: 'WorkFlowName',
+            label: '工作流名称',
+            width: 100,
+            sort: true
+          },
+          {
+            prop: 'Remark',
+            label: '备注',
+            width: 100,
+            sort: true
+          },
+
+          {
+            prop: 'CreateOn',
+            label: '创建时间',
+            width: 100,
+            sort: true
+          }
+        ]
+      }
+    },
+    created () {
+      // 查询条件初始值备份
+      Object.assign(this.searchFormReset, this.searchForm)
+      // 查询列表
+      this.initDatas()
+      // his.getDictOptions()
+    },
+    methods: {
+      initDatas () {
+        // 分页及列表条件
+        let params = {
+          _currentPage: this.currentPage,
+          _size: this.size,
+          Order: this.Column.Order,
+          Prop: this.Column.Prop
+        }
+        let myCreateOn = []
+        // 解析时间
+        if (this.CreateOn.length === 2) {
+          this.CreateOn[1].setHours(23)
+          this.CreateOn[1].setMinutes(59)
+          this.CreateOn[1].setSeconds(59)
+          myCreateOn.push(this.formatDateTime(this.CreateOn[0]))
+          myCreateOn.push(this.formatDateTime(this.CreateOn[1]))
+        }
+        // 查询条件
+        Object.assign(params, this.searchForm)
+        // 访问接口
+        api.getList(myCreateOn.join(','), params, this.$axios).then(res => {
+          this.entityList = res.data.items
+          this.currentItemCount = res.data.currentItemCount
+        }).catch(err => {
+          console.error(err)
+        })
+      },
+
+      /* getDictOptions () {
+        api.getDictList(this.$axios).then(res => {
+          this.searchForm.OrganizeId = res.data.items['OrganizeId']
+        }).catch(err => {
+          console.error(err)
+        })
+      }, */
+
+      searchCommand (command) {
+        if (command === 'search') {
+          this.dialogVisible = true
+        } else if (command === 'clear') {
+          this.clearSearch()
+        }
+      },
+      // 列表排序功能
+      orderby (column) {
+        if (column.order === 'ascending') {
+          this.Column.Order = 'asc'
+        } else if (column.order === 'descending') {
+          this.Column.Order = 'desc'
+        }
+        this.Column.Prop = column.prop
+        this.initDatas()
+      },
+      clearSearch () {
+        Object.assign(this.searchForm, this.searchFormReset)
+        // this.searchForm = this.searchFormReset;
+        this.CreateOn = ''
+        this.initDatas()
+      },
+      handleSearch () {
+        this.currentPage = 1
+        this.dialogVisible = false
+        this.initDatas()
+      },
+      handleCurrentChange (value) {
+        this.currentPage = value
+        this.initDatas()
+      },
+      handleSizeChange (value) {
+        this.size = value
+        this.currentPage = 1
+        this.initDatas()
+      },
+      deleteEntity (row) {
+        row.deleteConfirmFlag = false
+        api.deleteEntity(row.Id, this.$axios).then(res => {
+          if (res.data.code === 0) {
+            this.initDatas()
+            this.$message({
+              type: 'success',
+              message: res.data.message
+            })
+          } else {
+            this.$message({
+              type: 'warning',
+              message: res.data.message
+            })
+          }
+        }).catch(err => {
+          console.error(err)
+        })
+      },
+
+      jstimehandle (val) {
+        if (val === '') {
+          return '----'
+        } else if (val === '0001-01-01T08:00:00+08:00') {
+          return '----'
+        } else if (val === '5000-01-01T23:59:59+08:00') {
+          return '永久'
+        } else {
+          val = val.replace('T', ' ')
+          return val.substring(0, 10)
+        }
+      },
+
+      formatDateTime (date) {
+        var y = date.getFullYear()
+        var m = date.getMonth() + 1
+        m = m < 10 ? ('0' + m) : m
+        var d = date.getDate()
+        d = d < 10 ? ('0' + d) : d
+        var h = date.getHours()
+        var minute = date.getMinutes()
+        minute = minute < 10 ? ('0' + minute) : minute
+        return y + '-' + m + '-' + d + ' ' + h + ':' + minute
+      }
+    }
+  }
+</script>
+
+<style lang="scss">
+  .el-pagination {
+    margin: 1rem 0 2rem;
+    text-align: right;
+  }
+</style>
+

+ 1 - 1
src/dashoo.cn/frontend_web/src/pages/system/organize.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <el-card class="box-card" style="height: calc(100vh - 92px);">
+    <el-card class="box-card">
       <div slot="header" style="height: 20px;">
         <span style="float: left;">
           <i class="icon icon-table2"></i>