Procházet zdrojové kódy

添加RTX部门及用户同步

yuedefeng před 6 roky
rodič
revize
9d5d9be57e
23 změnil soubory, kde provedl 1810 přidání a 241 odebrání
  1. 22 0
      src/dashoo.cn/backend/api/business/auditsetting/oilauditsetting.go
  2. 33 1
      src/dashoo.cn/backend/api/business/auditsetting/oilauditsettingService.go
  3. 243 0
      src/dashoo.cn/backend/api/business/oilrtx/RtxService.go
  4. 77 0
      src/dashoo.cn/backend/api/business/oilrtx/rtx.go
  5. 6 0
      src/dashoo.cn/backend/api/business/organize/organize.go
  6. 54 0
      src/dashoo.cn/backend/api/business/organize/organizeService.go
  7. 2 2
      src/dashoo.cn/backend/api/controllers/base.go
  8. 4 4
      src/dashoo.cn/backend/api/controllers/casbin/module.go
  9. 121 5
      src/dashoo.cn/backend/api/controllers/casbin/organize.go
  10. 191 27
      src/dashoo.cn/backend/api/controllers/casbin/role.go
  11. 170 14
      src/dashoo.cn/backend/api/controllers/casbin/user.go
  12. 142 0
      src/dashoo.cn/backend/api/controllers/rtx/rtx.go
  13. 11 8
      src/dashoo.cn/backend/api/models/token.go
  14. 19 16
      src/dashoo.cn/backend/api/models/user.go
  15. 7 0
      src/dashoo.cn/backend/api/routers/router.go
  16. 28 0
      src/dashoo.cn/frontend_web/src/api/rtxservice/rtx.js
  17. 4 4
      src/dashoo.cn/frontend_web/src/pages/lims/checkequipmentlist/index.vue
  18. 2 2
      src/dashoo.cn/frontend_web/src/pages/lims/principal/subdata/customerposition.vue
  19. 72 27
      src/dashoo.cn/frontend_web/src/pages/login.vue
  20. 47 3
      src/dashoo.cn/frontend_web/src/pages/system/organize.vue
  21. 412 44
      src/dashoo.cn/frontend_web/src/pages/system/userrole.vue
  22. 135 79
      src/dashoo.cn/frontend_web/src/pages/system/users.vue
  23. 8 5
      src/dashoo.cn/frontend_web/src/pages/system/usersetting.vue

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

@@ -12,6 +12,8 @@ type Base_OilAuditSetting struct {
 	AuditStepName  string    `xorm:"comment('审批步骤名称') VARCHAR(50)"`
 	RoleId         int       `xorm:"not null default 0 comment('角色ID') INT(10)"`
 	RoleName       string    `xorm:"comment('角色名称') VARCHAR(50)"`
+	UserId         string    `xorm:"comment('审批人ID') VARCHAR(50)"`
+	UserName       string    `xorm:"comment('审批人') VARCHAR(50)"`
 	WorkFlowCord   string    `xorm:"comment('工作流编码') VARCHAR(50)"`
 	WorkFlowName   string    `xorm:"comment('工作流名称') VARCHAR(50)"`
 	Remark         string    `xorm:"comment('备注') VARCHAR(500)"`
@@ -23,3 +25,23 @@ type Base_OilAuditSetting struct {
 	ModifiedUserId int       `xorm:"INT(10)"`
 	ModifiedBy     string    `xorm:"VARCHAR(50)"`
 }
+
+type OilAuditUser struct {
+	Id             int       `xorm:"not null pk autoincr INT(11)"`
+	SettingId      int       `xorm:"INT(11)"`
+	UserId         int       `xorm:"INT(11)"`
+	UserName       string    `xorm:"VARCHAR(20)"`
+	CompanyId      int       `xorm:"INT(11)"`
+	DepartmentId   int       `xorm:"INT(11)"`
+	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)"`
+}
+
+type UnitDepart struct {
+	UnitId int
+	Unit   string
+}

+ 33 - 1
src/dashoo.cn/backend/api/business/auditsetting/oilauditsettingService.go

@@ -1,7 +1,11 @@
 package auditsetting
 
 import (
+	"strings"
+
 	. "dashoo.cn/backend/api/mydb"
+	"dashoo.cn/business2/userRole"
+	"dashoo.cn/utils"
 	"github.com/go-xorm/xorm"
 )
 
@@ -20,4 +24,32 @@ func (s *OilAuditSettingService) GetAuditStepRoleEntity(tablename string, organi
 	where = " 1=1 and OrganizeId = '" + organizeId + "' and AuditStepCode = '" + auditStepCode + "' "
 	s.GetEntityByWhere(tablename, where, entityPtr)
 	return
-}
+}
+
+func (s *OilAuditSettingService) GetDepartmentList(userids string) (deplist []UnitDepart) {
+	sql := "Select UnitId, Unit from Base_User where Id in (" + userids + ")"
+	s.DBE.SQL(sql).Find(&deplist)
+	return deplist
+}
+
+//根据用户角色获取用户列表
+func (s *OilAuditSettingService) GetUserByRole(roleid string, acccode string) (utree []userRole.Base_RoleList) {
+	users := make([]userRole.Base_RoleList, 0)
+	userlist := utils.RBAC.GetUsersForRoleInDomain("rid_"+roleid, utils.DOMAIN)
+	for _, userid := range userlist {
+		userid = strings.Trim(userid, "uid_")
+		s.DBE.SQL("SELECT Id,Realname FROM Base_User WHERE id = " + userid).Find(&users)
+	}
+	//s.DBE.Sql(` select a.UserId Id, b.Realname RealName FROM Base_UserRole a ` +
+	//	" left join Base_User b on a.UserId=b.Id " +
+	//	`where a.RoleId =` + roleid + ` and b.Realname is not null and b.AccCode = '` + acccode + `' `).Find(&users)
+	return users
+}
+
+// 获取审核人列表
+func (s *OilAuditSettingService) GetAuditUserList(Id string, entityPtr interface{}) {
+	where := "SettingId=" + Id
+	sql := "SELECT UserId Id, UserName RealName FROM OilAuditUser where " + where
+	s.DBE.SQL(sql).Find(entityPtr)
+	return
+}

+ 243 - 0
src/dashoo.cn/backend/api/business/oilrtx/RtxService.go

@@ -0,0 +1,243 @@
+package oilrtx
+
+import (
+	"encoding/json"
+	"io/ioutil"
+	"log"
+	"net/http"
+	"strconv"
+	"strings"
+	"time"
+
+	. "dashoo.cn/backend/api/mydb"
+	"dashoo.cn/utils"
+
+	"dashoo.cn/backend/api/business/organize"
+	"dashoo.cn/business2/userRole"
+	"github.com/go-xorm/xorm"
+)
+
+type RtxService struct {
+	MyServiceBase
+}
+
+func GetRtxService(xormEngine *xorm.Engine) *RtxService {
+	s := new(RtxService)
+	s.DBE = xormEngine
+	return s
+}
+
+//func (s *RtxService) RtxLogin(userName, password, userDomain string) *http.Response {
+func (s *RtxService) RtxLogin() *http.Response {
+	client := &http.Client{}
+	var rtx RtxLogin
+	rtx.Username = "ORG_YJS"
+	rtx.Password = "ORG_YJS!@#"
+	rtx.UserDomain = "LOCAL_IDENT"
+	json, err := json.Marshal(rtx)
+	params := string(json)
+	req, err := http.NewRequest("post", "http://api.uidp.dgyt.petrochina/ORG_Cloud_API/login/login", strings.NewReader(params))
+	req.Header.Add("Content-Type", "application/json")
+	resp, err := client.Do(req)
+	if err != nil {
+		log.Println("err= ", err)
+	}
+	log.Println("resp= ", resp)
+
+	return resp
+}
+
+func (s *RtxService) SendRtxMsg() *http.Response {
+	client := &http.Client{}
+	var rtx RtxMsg
+	rtx.Msg = "大港油田市场管理系统"
+	rtx.Receiver = "yuedefeng"
+	json, err := json.Marshal(rtx)
+	params := string(json)
+	req, err := http.NewRequest("post", "http://api.uidp.dgyt.petrochina/RTX/API/SendRTX", strings.NewReader(params))
+	req.Header.Add("Content-Type", "application/json")
+	req.Header.Add("X-Token", "BfdENJsoTGRW4g6nqvQlXOOB8bpQ3NIU7WA345bH2hoEMR9DL0Fcv59fj9KSjde99TFR+92plU4=")
+	resp, err := client.Do(req)
+	if err != nil {
+		log.Println("err= ", err)
+	}
+	log.Println("resp= ", resp)
+
+	return resp
+}
+
+func (s *RtxService) GetOrgListByToken(token string) *http.Response {
+	client := &http.Client{}
+	req, err := http.NewRequest("get", "http://api.uidp.dgyt.petrochina/ORG_Cloud_API/org/fetchorglist", strings.NewReader(""))
+	req.Header.Add("Content-Type", "application/json")
+	req.Header.Add("X-Token", token)
+	resp, err := client.Do(req)
+	if err != nil {
+		log.Println("err= ", err)
+	}
+	log.Println("resp= ", resp)
+
+	return resp
+}
+
+func (s *RtxService) GetOrgList() RtxOrganizeItems {
+	var item RtxOrganizeItems
+
+	respToken := s.RtxLogin()
+	jsonBlob, _ := ioutil.ReadAll(respToken.Body)
+	var rtxRespToken RtxRespToken
+	json.Unmarshal(jsonBlob, &rtxRespToken)
+	if len(rtxRespToken.Token) > 0 {
+		respOrgList := s.GetOrgListByToken(rtxRespToken.Token)
+		jsonBlob2, _ := ioutil.ReadAll(respOrgList.Body)
+		json.Unmarshal(jsonBlob2, &item)
+	}
+	return item
+}
+
+func (s *RtxService) AutoSyncOrgList() bool {
+	organizeItem := s.GetOrgList()
+	return s.RecursionOrganize(organizeItem.Items)
+}
+
+//递归调用
+func (s *RtxService) RecursionOrganize(rtxOrganizes []RtxOrganize) bool {
+	orgSvc := organize.GetOrganizeService(s.DBE)
+	for _, rtxOrg := range rtxOrganizes {
+		var baseOrganize organize.Base_Organize
+		where := "1=1 and InnerPhone='" + rtxOrg.Id + "'"
+		orgSvc.GetEntity(&baseOrganize, where)
+		/*if baseOrganize == nil {
+			baseOrganize = new(organize.Base_Organize)
+		}*/
+
+		parentId := 0
+		if len(rtxOrg.ParentId) > 0 {
+			var baseParentOrganize organize.Base_Organize
+			where := "1=1 and InnerPhone='" + rtxOrg.ParentId + "'"
+			orgSvc.GetEntity(&baseParentOrganize, where)
+			parentId = baseParentOrganize.Id
+		}
+
+		baseOrganize.Parentid = parentId
+		baseOrganize.Code = rtxOrg.OrgCode
+		baseOrganize.Fullname = rtxOrg.OrgShortName
+		baseOrganize.Description = rtxOrg.OrgName
+		baseOrganize.Innerphone = rtxOrg.Id
+		baseOrganize.Outerphone = rtxOrg.ParentId
+
+		if baseOrganize.Id <= 0 {
+			baseOrganize.Layer = 0
+			baseOrganize.Isinnerorganize = 1
+			baseOrganize.Sortcode = 0
+			baseOrganize.Deletionstatecode = 0
+			baseOrganize.Enabled = 1
+			baseOrganize.Createon = time.Now()
+			baseOrganize.Createby = "演示用户"
+			baseOrganize.Createuserid = 284
+			baseOrganize.Modifiedon = time.Now()
+			baseOrganize.Modifiedby = "演示用户"
+			baseOrganize.Modifieduserid = 284
+			orgSvc.InsertEntity(baseOrganize)
+		} else {
+			baseOrganize.Modifiedon = time.Now()
+			baseOrganize.Modifiedby = "演示用户"
+			baseOrganize.Modifieduserid = 284
+			orgSvc.UpdateEntityById(baseOrganize.Id, baseOrganize)
+		}
+		if rtxOrg.Children != nil && len(rtxOrg.Children) > 0 {
+			s.RecursionOrganize(rtxOrg.Children)
+		}
+	}
+	return true
+}
+
+func (s *RtxService) HandleSendMsg(username string, tomobile string, message string) *http.Response {
+	client := &http.Client{}
+	var msg Msg
+
+	msg.UserName = username
+	msg.ToMobile = tomobile
+	msg.Msg = message
+
+	json, err := json.Marshal(msg)
+	params := string(json)
+
+	req, err := http.NewRequest("post", "http://api.uidp.dgyt.petrochina/SMS/API/sendSMS", strings.NewReader(params))
+	req.Header.Add("Content-Type", "application/json")
+	req.Header.Add("X-Token", "rzkTZhCbQKLFUOJI5L7VEqjsUWF+PoaewKQbvJHYo2Nimtn+fEWBne7G7JbWF3fpdJnAUN3e1pQ=")
+
+	resp, err := client.Do(req)
+	if err != nil {
+		log.Println("err= ", err)
+	}
+	log.Println("resp= ", resp)
+
+	return resp
+}
+
+func (s *RtxService) HandlePtrLogin(username string, password string, BaseUser string) int {
+
+	client := &http.Client{}
+	var ptrUser PtrUser
+
+	ptrUser.UserName = username
+	ptrUser.PassWord = password
+
+	reqJson, err := json.Marshal(ptrUser)
+	params := string(reqJson)
+
+	req, err := http.NewRequest("post", "http://api.uidp.dgyt.petrochina/PTR/API/validatePTR", strings.NewReader(params))
+	req.Header.Add("Content-Type", "application/json")
+	req.Header.Add("X-Token", "HJpczmIJr9z26t9KcV0i1OsBE9RXFeuyhuN9MdV+Ts/FlUjCgDOxaaubo9DkF91t+X2MCxBqX6s=")
+
+	resp, err := client.Do(req)
+	if err != nil {
+		log.Println("err= ", err)
+	}
+	log.Println("resp= ", resp)
+
+	jsonBlob, _ := ioutil.ReadAll(resp.Body)
+	var rtxRespToken RtxRespToken
+	json.Unmarshal(jsonBlob, &rtxRespToken)
+
+	flag := 0
+	if rtxRespToken.Code == 2000 {
+		sql := " UserName='" + username + "'"
+		var baseUser1 userRole.Base_User
+		s.GetEntity(&baseUser1, sql)
+
+		if baseUser1.Username != "" {
+			flag = 1
+			res := utils.RBAC.GetRolesForUserInDomain("uid_"+strconv.Itoa(baseUser1.Id), utils.DOMAIN)
+			if len(res) <= 0 {
+				flag = 3
+			}
+		} else {
+			flag = 2
+			var baseuser userRole.Base_User
+			pwd, key, _ := utils.TripleDesEncrypt(password)
+
+			baseuser.Id = 0
+			baseuser.Username = username
+			baseuser.Realname = username
+			baseuser.Userpassword = pwd
+			baseuser.Publickey = key
+
+			_, err := s.InsertEntity(&baseuser)
+			if err != nil {
+				log.Println(err)
+			}
+			//查询角色表里有没有权限登录此系统
+			res := utils.RBAC.GetRolesForUserInDomain("uid_"+strconv.Itoa(baseuser.Id), utils.DOMAIN)
+			if len(res) <= 0 {
+				flag = 3
+			}
+		}
+
+	} else {
+		log.Println("Code:" + string(rtxRespToken.Code) + ",Message:" + rtxRespToken.Message + ",Token:" + rtxRespToken.Token)
+	}
+
+	return flag
+}

+ 77 - 0
src/dashoo.cn/backend/api/business/oilrtx/rtx.go

@@ -0,0 +1,77 @@
+package oilrtx
+
+//"time"
+
+type RtxMsg struct {
+	Msg      string `json:"msg"`
+	Receiver string `json:"receiver"`
+}
+
+type PtrUser struct {
+	UserName string `json:"username"`
+	PassWord string `json:"password"`
+}
+
+type Msg struct {
+	UserName string `json:"UserName"`
+	ToMobile string `json:"ToMobile"`
+	Msg      string `json:"MSG"`
+}
+
+type RtxLogin struct {
+	Username   string `json:"username"`
+	Password   string `json:"password"`
+	UserDomain string `json:"userDomain"`
+}
+
+type RtxRespToken struct {
+	Code    int    `json:"code"`
+	Message string `json:"message"`
+	Token   string `json:"token"`
+}
+
+type RtxOrganize struct {
+	Id           string        `json:"id"`
+	OrgCode      string        `json:"message"`
+	OrgName      string        `json:"orgName"`
+	OrgShortName string        `json:"orgShortName"`
+	ParentId     string        `json:"parentId"`
+	IsInValid    string        `json:"ISINVALID"`
+	Remark       string        `json:"remark"`
+	Children     []RtxOrganize `json:"children"`
+}
+
+type RtxOrganizeItems struct {
+	Items []RtxOrganize `json:"items"`
+}
+
+type Tmp_User struct {
+	Department string `xorm:"VARCHAR(500)"`
+	Fullname   string `xorm:"VARCHAR(500)"`
+	Username   string `xorm:"VARCHAR(500)"`
+	Code       string `xorm:"VARCHAR(500)"`
+	Email      string `xorm:"VARCHAR(500)"`
+	Telphone   string `xorm:"VARCHAR(500)"`
+	Deptid     string `xorm:"VARCHAR(500)"`
+}
+
+
+type Base_Msg struct {
+	Id           int    `xorm:"not null pk autoincr INT(11)"`
+	Type         string `xorm:"not null comment('类别(1注册(1-1注册成功1-2注册失败) 2密码重置(2-1验证码2-2重置密码))') VARCHAR(10)"`
+	UserName     string `xorm:"not null comment('企业用户名(即登录账号)') VARCHAR(50)"`
+	UserRealName string `xorm:"not null comment('企业名称') VARCHAR(100)"`
+	UserId       string `xorm:"not null comment('用户名Id(BaseUser表Id)') VARCHAR(11)"`
+	ToMobile     string `xorm:"not null comment('目标手机号') VARCHAR(20)"`
+	Msg          string `xorm:"not null comment('短信内容') VARCHAR(500)"`
+	ToTime       string `xorm:"not null comment('发送时间') VARCHAR(20)"`
+	Status       string `xorm:"not null comment('发送状态') VARCHAR(20)"`
+}
+
+
+type Base_VCode struct {
+	Id           int    `xorm:"not null pk autoincr INT(11)"`
+	UserName     string `xorm:"not null comment('企业用户名(即登录账号)') VARCHAR(50)"`
+	UserId       string `xorm:"not null comment('用户名Id(BaseUser表Id)') VARCHAR(11)"`
+	Code         string `xorm:"not null comment('验证码') VARCHAR(500)"`
+}

+ 6 - 0
src/dashoo.cn/backend/api/business/organize/organize.go

@@ -44,6 +44,12 @@ type Base_Organizetree struct {
 	Fu       string `json:"fu"`
 }
 
+type Base_Orgatree struct {
+	Id       int64  `json:"id"`
+	ParentId int64  `json:"pId"`
+	FullName string `json:"name"`
+}
+
 type Base_Organizebandparentname struct {
 	Id          int
 	Parentid    int

+ 54 - 0
src/dashoo.cn/backend/api/business/organize/organizeService.go

@@ -1,7 +1,11 @@
 package organize
 
 import (
+	"fmt"
 	"strconv"
+	"strings"
+
+	"dashoo.cn/business2/userRole"
 
 	"dashoo.cn/utils"
 	. "dashoo.cn/utils/db"
@@ -110,3 +114,53 @@ func (s *OrganizeService) QueryEntity(where string) (entity Base_Organize) {
 	s.DBE.Sql(sql).Get(&entity)
 	return
 }
+
+//根据
+func (s *OrganizeService) GetAllChildById(topid string) string {
+	mod := new(Id_Str)
+	s.DBE.Sql(`select fun_getOrganizechildlist ('` + topid + `') as Id`).Get(mod)
+	fmt.Println(mod)
+	return mod.Id
+}
+
+//根据
+func (s *OrganizeService) GetAllChildUnitById(topid string) string {
+	mod := new(Id_Str)
+	s.DBE.Sql(`select fun_getOrganizechildlist_unit ('` + topid + `') as Id`).Get(mod)
+	return mod.Id
+}
+
+//根据 物质类
+func (s *OrganizeService) GetAllGoodsChildById(topid string) string {
+	mod := new(Id_Str)
+	s.DBE.Sql(`select fun_getOilGoodsAptitudeClasschildlist ('` + topid + `') as Id`).Get(mod)
+	return mod.Id
+}
+
+//判断用户是否具有某角色
+func (s *OrganizeService) UserInRoleById(userId, RoleId string) bool {
+	var roleList []userRole.UserRoleModel
+	sqlcommand := fmt.Sprintf(`select * from Base_Role b where b.Id=%v `, RoleId)
+	s.DBE.SQL(sqlcommand).Find(&roleList)
+	if len(roleList) < 1 {
+		return false
+	} else {
+		roleidlist := utils.RBAC.GetRolesForUserInDomain("uid_"+userId, utils.DOMAIN)
+		return strings.Contains(strings.Join(roleidlist, ","), "rid_"+strconv.Itoa(roleList[0].Id))
+	}
+}
+
+//获得category为unit的父节点
+func (s *OrganizeService) GetMyUnitDepartmentId(topid string) string {
+	var entity Base_Organize
+	ids := s.GetAllParentByTopAccCode(topid, "")
+	if len(ids) <= 0 { //没有父节点
+		return topid
+	}
+	sql := "select * from Base_Organize  where id in (" + ids + ") and Category='unit'"
+	s.DBE.Sql(sql).Get(&entity)
+	if &entity == nil || entity.Id <= 0 { //没有category为unit的父节点
+		return topid
+	}
+	return strconv.Itoa(entity.Id)
+}

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

@@ -258,7 +258,7 @@ var (
 	LimsCertificateName                      string = "LimsCertificate"                //  关联证书表
 	LimsReportOilPipeUltrasonicName          string = "LimsReportOilPipeUltrasonic"    // 石油专用管材油(套)管超声波检测记录
 	LimsCheckEquipmentListName               string = "LimsCheckEquipmentList"         // 二级单位检测设备
-	LimsEntrustEquipmentName               	 string = "LimsEntrustEquipment"           // 检测计划设备列表
+	LimsEntrustEquipmentName                 string = "LimsEntrustEquipment"           // 检测计划设备列表
 )
 
 //分页信息及数据
@@ -286,7 +286,7 @@ func (this *BaseController) Prepare() {
 		"/api/webinterface/preparelist", "/api/webinterface/prepareinfo",
 		"/api/sampletest_v/sampletest", "/api/sampletest_v/getpass", "/api/sampletest_v/editpass/",
 		"/api/sampletest_v/donorsdetail", "/api/sampletest_v/testdetail", "/api/uploads/samplesinput", "/api/doctemplate_onlyoffice/callback", "/api/doctemplate_onlyoffice/viewcallback", "/api/limsupload/usersignimg",
-		"/api/uploads/samplestypeimg", "/api/limsdataentry/historyimg/"}
+		"/api/uploads/samplestypeimg", "/api/limsdataentry/historyimg/", "/api/rtx/syncUserDept", "/api/rtx/syncUser"}
 	for _, v := range urls {
 		fmt.Println("**this.Ctx.Input.URL()**", this.Ctx.Input.URL())
 		if this.Ctx.Input.URL() == v {

+ 4 - 4
src/dashoo.cn/backend/api/controllers/casbin/module.go

@@ -29,7 +29,7 @@ type ModuleModel struct {
 // @Success 200 {object} business.device.DeviceChannels
 // @router /list [get]
 func (this *ModuleController) List() {
-	page := this.GetPageInfoForm()
+	//page := this.GetPageInfoForm()
 	svc := module.GetModuleService(utils.DBE)
 	//permissionsvc := permission.GetPermissionService(utils.DBE)
 	//ztreecurrentusernodesmodu := permissionsvc.GetModuleAll(this.User.Id, "30")
@@ -43,11 +43,11 @@ func (this *ModuleController) List() {
 		ids := svc.GetChildByTopId(parentid)
 		where = where + " and Id in ( " + ids + " )"
 	}
-	list := make([]module.Base_Module, 0)
-	total := svc.GetPagingEntitiesWithSortCode(page.CurrentPage, page.Size, "ParentId, CreateOn desc", &list, where)
+	var list []module.Base_Module
+	svc.GetEntities(&list, where)
 	var datainfo DataInfo
 	datainfo.Items = list
-	datainfo.CurrentItemCount = total
+	//datainfo.CurrentItemCount = total
 	this.Data["json"] = &datainfo
 	this.ServeJSON()
 }

+ 121 - 5
src/dashoo.cn/backend/api/controllers/casbin/organize.go

@@ -2,14 +2,17 @@ package casbin
 
 import (
 	"encoding/json"
-	//	"fmt"
+
+	"dashoo.cn/business2/parameter"
+
+	"dashoo.cn/business2/userRole"
 
 	"strings"
 
-	"dashoo.cn/business2/permission"
 	"dashoo.cn/backend/api/business/organize"
-	"dashoo.cn/utils"
 	. "dashoo.cn/backend/api/controllers"
+	"dashoo.cn/business2/permission"
+	"dashoo.cn/utils"
 )
 
 // Operations about Users
@@ -32,7 +35,19 @@ type OrganizeModel struct {
 func (this *OrganizesController) List() {
 	page := this.GetPageInfoForm()
 	svc := organize.GetOrganizeService(utils.DBE)
-	where := " ( Createuserid=" + this.User.Id + " or id = " + this.User.DepartmentId + ")"
+
+	svcPerm := permission.GetPermissionService(utils.DBE)
+	isauth := svcPerm.IsAuthorized(this.User.Id, "Administrator")
+	topid := ""
+	if isauth {
+		// paramSvc := baseparameter.GetBaseparameterService(utils.DBE)
+		topid = "0" //paramSvc.GetBaseparameterMessage("", "paramset", "HeadquartersID") // 总公司Id
+	} else {
+		topid = svc.GetMyUnitDepartmentId(this.User.DepartmentId)
+	}
+
+	depids := svc.GetAllChildById(topid)
+	where := "( Createuserid=" + this.User.Id + " or id in (" + depids + "))"
 	keyword := this.GetString("keyword")
 	parentid := this.GetString("parentid")
 	IsInnerOrganize := this.GetString("IsInnerOrganize")
@@ -90,7 +105,18 @@ func (this *OrganizesController) Detailed() {
 func (this *OrganizesController) Listbandparentname() {
 	page := this.GetPageInfoForm()
 	svc := organize.GetOrganizeService(utils.DBE)
-	where := "( a.Createuserid=" + this.User.Id + " or a.id = " + this.User.DepartmentId + ")"
+	svcPerm := permission.GetPermissionService(utils.DBE)
+	isauth := svcPerm.IsAuthorized(this.User.Id, "Administrator")
+	topid := ""
+	if isauth {
+		// paramSvc := baseparameter.GetBaseparameterService(utils.DBE)
+		topid = "0" //paramSvc.GetBaseparameterMessage("", "paramset", "HeadquartersID") // 总公司Id
+	} else {
+		topid = svc.GetMyUnitDepartmentId(this.User.DepartmentId)
+	}
+
+	depids := svc.GetAllChildById(topid)
+	where := "( a.Createuserid=" + this.User.Id + " or a.id in (" + depids + "))"
 	keyword := this.GetString("keyword")
 	parentid := this.GetString("parentid")
 	IsInnerOrganize := this.GetString("IsInnerOrganize")
@@ -292,6 +318,21 @@ func (this *OrganizesController) ParentList() {
 	this.ServeJSON()
 }
 
+// @Title get 业务列表
+// @Description get SampleType by token
+// @Success 200 {object} sampletype.SampleType
+// @router /getorganizetreelist [get]
+func (this *OrganizesController) GetOrganizeTreeList() {
+	svc := organize.GetOrganizeService(utils.DBE)
+	where := " 1 = 1 "
+	var list []organize.Base_Orgatree
+	svc.GetEntitysByWhere("Base_Organize", where, &list)
+	var datainfo DataInfo
+	datainfo.Items = list
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}
+
 // @Title 获取医院组织结构
 // @Description 获取医院
 // @Success 200 {object} business.device.DeviceChannels
@@ -346,3 +387,78 @@ func (this *OrganizesController) OrganizeParentList() {
 	this.ServeJSON()
 
 }
+
+// @Title 报警器列表
+// @Description 设备列表
+// @Success 200 {object} business.device.DeviceChannels
+// @router /listbydeptid [get]
+func (this *OrganizesController) ListByDeptId() {
+	svc := organize.GetOrganizeService(utils.DBE)
+
+	svcPerm := permission.GetPermissionService(utils.DBE)
+	isauth := svcPerm.IsAuthorized(this.User.Id, "oil_admin")
+	unitId := ""
+	if isauth {
+		paramSvc := baseparameter.GetBaseparameterService(utils.DBE)
+		unitId = paramSvc.GetBaseparameterMessage("", "paramset", "HeadquartersID") // 总公司Id
+	} else {
+		unitId = svc.GetMyUnitDepartmentId(this.User.DepartmentId)
+	}
+
+	ids := svc.GetAllChildById(unitId)
+
+	where := " Id in ( " + ids + " ) "
+
+	list := make([]organize.Base_Organize, 0)
+	svc.GetEntities(&list, where)
+	var datainfo DataInfo
+	datainfo.Items = list
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}
+
+// @Title 报警器列表
+// @Description 设备列表
+// @Success 200 {object} business.device.DeviceChannels
+// @router /orgalllist [get]
+func (this *OrganizesController) OrgAllList() {
+	svc := organize.GetOrganizeService(utils.DBE)
+
+	var user userRole.Base_User
+	svc.GetEntityById(this.User.Id, &user)
+	ids := ""
+	if this.User.DepartmentId == "" {
+		ids = svc.GetAllChildById("100000000")
+	} else {
+		unitId := svc.GetMyUnitDepartmentId(this.User.DepartmentId)
+		ids = svc.GetAllChildById(unitId)
+	}
+	where := " Id in ( " + ids + " )"
+
+	list := make([]organize.Base_Organize, 0)
+	svc.GetEntities(&list, where)
+	var datainfo DataInfo
+	datainfo.Items = list
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}
+
+// @Title 组织列表信息(不需要验证登录)
+// @Description 组织列表信息(不需要验证登录)
+// @Success 200 {object} organize.Base_Organize
+// @router /getorglist [get]
+func (this *OrganizesController) GetOrgList() {
+	svc := organize.GetOrganizeService(utils.DBE)
+
+	var user userRole.Base_User
+	svc.GetEntityById(this.User.Id, &user)
+	ids := svc.GetAllChildById("0")
+	where := " Id in ( " + ids + " )"
+
+	list := make([]organize.Base_Organize, 0)
+	svc.GetEntities(&list, where)
+	var datainfo DataInfo
+	datainfo.Items = list
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}

+ 191 - 27
src/dashoo.cn/backend/api/controllers/casbin/role.go

@@ -1,16 +1,18 @@
 package casbin
 
 import (
+	"dashoo.cn/backend/api/business/auditsetting"
 	"encoding/json"
 	"strconv"
 	"strings"
 
+	"dashoo.cn/backend/api/business/organize"
 	"dashoo.cn/backend/api/business/role"
 
 	. "dashoo.cn/backend/api/controllers"
 	"dashoo.cn/business2/district"
 	"dashoo.cn/business2/module"
-	"dashoo.cn/business2/organize"
+	commonorgnize "dashoo.cn/business2/organize"
 	"dashoo.cn/business2/permission"
 	"dashoo.cn/business2/userRole"
 	"dashoo.cn/utils"
@@ -31,8 +33,8 @@ type RolePerAjaxModel struct {
 	Selecteoperation []permission.Base_Permissionstrtree
 }
 type OrganizeAjaxModel struct {
-	Organize         []organize.Base_Organizetree
-	SelectedOrganize []organize.Base_Organizetree
+	Organize         []commonorgnize.Base_Organizetree
+	SelectedOrganize []commonorgnize.Base_Organizetree
 }
 type DistrictAjaxModel struct {
 	District         []district.Base_Districttree
@@ -52,7 +54,18 @@ func (this *RoleController) RoleList() {
 	if searchkey != "" {
 		where = where + " and Realname like '%" + searchkey + "%'"
 	}
-	total := svc.GetRoleList(page.CurrentPage, page.Size, "CreateOn", utils.ToStr(this.User.Id), &roles, where)
+	svrUser := userRole.GetUserService(utils.DBE)
+	rids := svrUser.GetUserRoleIds(this.User.Id)
+	permisvc := permission.GetPermissionService(utils.DBE)
+	if permisvc.IsAdmin(this.User.Id) == false {
+		var roleofrole string
+		for i := 0; i < len(rids); i++ {
+			roleofrole += permisvc.GetManRoleForRole(rids[i]) + ","
+		}
+		roleofrole = strings.Trim(roleofrole, ",")
+		where = where + " and Id in (" + roleofrole + ")"
+	}
+	total := svc.GetRoleList(page.CurrentPage, page.Size, "SortCode asc", utils.ToStr(this.User.Id), &roles, where)
 	var datainfo DataInfo
 	datainfo.Items = roles
 	datainfo.CurrentItemCount = total
@@ -60,6 +73,121 @@ func (this *RoleController) RoleList() {
 	this.ServeJSON()
 }
 
+// @Title 角色列表
+// @Description 获取角色列表
+// @Success 200 {object} controllers.Request
+// @router /getAdminPermi [get]
+func (this *RoleController) GetAdminPermision() {
+	var datainfo ErrorDataInfo
+	//判断超级管理员和有查看所有数据权限的用户
+	svcPerm := permission.GetPermissionService(utils.DBE)
+	isauth := svcPerm.IsAuthorized(this.User.Id, "oil_supplier.marketAccess.AllRecord")
+	if svcPerm.IsAdmin(this.User.Id) || isauth {
+		datainfo.Code = 1
+		this.Data["json"] = &datainfo
+		this.ServeJSON()
+		return
+	} else {
+		datainfo.Code = 0
+		this.Data["json"] = &datainfo
+		this.ServeJSON()
+		return
+	}
+}
+
+// @Title 部门表
+// @Description
+// @Success 200 {object} business.device.DeviceChannels
+// @router /orgalllist [get]
+func (this *RoleController) OrgAllList() {
+	svc := organize.GetOrganizeService(utils.DBE)
+
+	var user userRole.Base_User
+	svc.GetEntityById(this.User.Id, &user)
+	ids := ""
+	//判断超级管理员和有查看所有数据权限的用户
+	svcPerm := permission.GetPermissionService(utils.DBE)
+	isauth := svcPerm.IsAuthorized(this.User.Id, "oil_supplier.marketAccess.AllRecord")
+	if svcPerm.IsAdmin(this.User.Id) || isauth {
+		ids = svc.GetAllChildById("100000000")
+	} else {
+		unitId := svc.GetMyUnitDepartmentId(this.User.DepartmentId)
+		ids = svc.GetAllChildById(unitId)
+	}
+	where := " Id in ( " + ids + " )"
+
+	list := make([]commonorgnize.Base_Organize, 0)
+	svc.GetEntities(&list, where)
+	var datainfo DataInfo
+	datainfo.Items = list
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}
+
+// @Title 根据部门获取人员
+// @Description 根据部门获取人员
+// @router /getauditerbydept/:deptId [get]
+func (this *RoleController) GetAuditerByDept() {
+	Id := this.Ctx.Input.Param(":deptId")
+	page := this.GetPageInfoForm()
+	var users []userRole.Base_User
+	rsvc := auditsetting.GetOilAuditSettingService(utils.DBE)
+	organsvc := organize.GetOrganizeService(utils.DBE)
+	where := "1=1"
+	//svcPerm := permission.GetPermissionService(utils.DBE)
+	//isauth := svcPerm.IsAuthorized(this.User.Id, "oil_supplier.marketAccess.AllRecord")
+	//if !svcPerm.IsAdmin(this.User.Id) && !isauth {
+		depids := organsvc.GetAllChildById(Id)
+		where += " and DepartmentId in (" + depids + ")"
+	//} else {
+	//	depids := organsvc.GetAllChildById("100000000")
+	//	where += " and DepartmentId in (" + depids + ")"
+	//}
+	where += " and IsCompanyUser = 0"
+
+	total := rsvc.GetPagingEntitiesWithSortCode(page.CurrentPage, page.Size, "Id asc", &users, where)
+	//rsvc.GetEntitysByWhere(BaseUserName, where, &users)
+	var datainfo DataInfo
+	datainfo.Items = users
+	datainfo.CurrentItemCount = total
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}
+
+// @Title 角色列表
+// @Description 获取角色列表
+// @Success 200 {object} controllers.Request
+// @router /alllist [get]
+func (this *RoleController) RoleAllList() {
+	svc := role.GetRoleService(utils.DBE)
+	var roles []userRole.Base_Role
+	page := this.GetPageInfoForm()
+	searchkey := this.GetString("keyword")
+	where := "IsVisible=1"
+	if searchkey != "" {
+		where = where + " and Realname like '%" + searchkey + "%'"
+	}
+	total := svc.GetRoleList(page.CurrentPage, page.Size, "SortCode asc", utils.ToStr(this.User.Id), &roles, where)
+	var datainfo DataInfo
+	datainfo.Items = roles
+	datainfo.CurrentItemCount = total
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}
+
+// @Title 获得用户角色id
+// @Description 获得用户角色id
+// @Success	200	{object} controllers.Request
+// @router /getmanagerole/:id [get]
+func (this *RoleController) GetManRole() {
+	userid := this.Ctx.Input.Param(":id")
+	svc := permission.GetPermissionService(utils.DBE)
+	roleofrole := svc.GetManRoleForRole("rid_" + userid)
+	roleid := strings.Split(roleofrole, ",")
+	this.Data["json"] = &roleid
+	this.ServeJSON()
+}
+
 // @Title 权限
 // @Description 获取菜单操作权限
 // @Success 200 {object} controllers.Request
@@ -154,6 +282,52 @@ func (this *RoleController) RoleOperationPowerPost() {
 	this.ServeJSON()
 }
 
+// @Title 用户角色设置
+// @Description 用户角色设置
+// @Success	200	{object} controllers.Request
+// @router /setmanrole/:id [put]
+func (this *RoleController) SetManRole() {
+	inputstr := this.Ctx.Input.Param(":id")
+	serial := strings.Split(inputstr, "_")
+	roleid := serial[0]
+	var errinfo ErrorInfo
+	if roleid == "" || roleid == "0" {
+		errinfo.Message = "操作失败!请求信息不完整"
+		errinfo.Code = -2
+		this.Data["json"] = &errinfo
+		this.ServeJSON()
+		return
+	}
+	roleids := strings.Split(serial[1], ",")
+	utils.RBAC.RemoveFilteredNamedGroupingPolicy("g5", 0, "rid_"+roleid, utils.DOMAIN)
+	if len(roleids) > 0 {
+		for i := 0; i < len(roleids); i++ {
+			roids := utils.ToStr(roleids[i])
+			utils.RBAC.AddNamedGroupingPolicy("g5", "rid_"+roleid, utils.DOMAIN, "rid_"+roids)
+		}
+	}
+	var err error = nil
+	//utils.RBAC.DeleteRolesForUser("uid_" + userid)
+	//var err error = nil
+	//for i := 0; i < len(roleids); i++ {
+	//	if roleids[i] != "0" && roleids[i] != "" {
+	//		//err = svc.AddUserToRole(userid, roleids[i], entity[0])
+	//		utils.RBAC.AddRoleForUserInDomain("uid_"+userid, "rid_"+roleids[i], utils.DOMAIN)
+	//	}
+	//}
+	if err == nil {
+		errinfo.Message = utils.AlertProcess("管理角色调整成功!")
+		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} controllers.Request
@@ -365,6 +539,12 @@ func (this *RoleController) GetUsersForRole() {
 	if keyword != "" {
 		where = where + " and Realname like '%" + keyword + "%'"
 	}
+	//判断超级管理员和有查看所有数据权限的用户
+	svcPerm := permission.GetPermissionService(utils.DBE)
+	isauth := svcPerm.IsAuthorized(this.User.Id, "oil_supplier.marketAccess.AllRecord")
+	if !svcPerm.IsAdmin(this.User.Id) && !isauth {
+		where += " and Unit = '" + this.User.Uint + "'"
+	}
 	total, users := svc.GetUserListForRole(page.CurrentPage, page.Size, roleid, "Id", where)
 
 	var datainfo DataInfo
@@ -388,6 +568,7 @@ func (this *RoleController) UserRoleAddUser() {
 	for i := 0; i < len(userids); i++ {
 		if userids[i] != "0" && userids[i] != "" {
 			//err = svc.AddUserToRole(userid, roleids[i], entity[0])
+			//utils.RBAC.GetUsersForRoleInDomain("rid_"+roleid, utils.DOMAIN)
 			utils.RBAC.DeleteRoleForUserInDomain("uid_"+userids[i], "rid_"+roleid, utils.DOMAIN)
 			utils.RBAC.AddRoleForUserInDomain("uid_"+userids[i], "rid_"+roleid, utils.DOMAIN)
 		}
@@ -411,9 +592,13 @@ func (this *RoleController) UserRoleAddUser() {
 func (this *RoleController) UserDelete() {
 	inputstr := this.Ctx.Input.Param(":id")
 	serial := strings.Split(inputstr, "_")
-	id := serial[0]
+	userids := strings.Split(serial[0], ",")
 	roleid := serial[1]
-	utils.RBAC.DeleteRoleForUserInDomain("uid_"+id, "rid_"+roleid, utils.DOMAIN)
+	for i := 0; i < len(userids); i++ {
+		if userids[i] != "0" && userids[i] != "" {
+			utils.RBAC.DeleteRoleForUserInDomain("uid_"+userids[i], "rid_"+roleid, utils.DOMAIN)
+		}
+	}
 	var errinfo ErrorInfo
 	var err error = nil
 	if err == nil {
@@ -530,24 +715,3 @@ func (this *RoleController) RoleEditPost() {
 		this.ServeJSON()
 	}
 }
-
-// @Title 权限
-// @Description 通过角色权限获取用户列表
-// @Success 200 {object} controllers.Request
-// @router /getUsersWithRolePermission [get]
-func (this *RoleController) GetUsersWithRolePermissionAjax() {
-	perCode := this.GetString("perCode")
-	svc := permission.GetPermissionService(utils.DBE)
-	perId := svc.GetPermissionId(perCode)
-	var errinfo ErrorInfo
-	if perId == "" {
-		errinfo.Message = utils.AlertProcess("权限代码错误")
-		errinfo.Code = -1
-		this.Data["json"] = &errinfo
-		this.ServeJSON()
-		return
-	}
-	//users := svc.GetRolePermissionUserids(this.User.Id, perId, this.User.AccCode)
-	//this.Data["json"] = users
-	this.ServeJSON()
-}

+ 170 - 14
src/dashoo.cn/backend/api/controllers/casbin/user.go

@@ -1,12 +1,17 @@
 package casbin
 
 import (
-	"dashoo.cn/backend/api/business/accountinfo"
-	"dashoo.cn/backend/api/business/company"
-	"dashoo.cn/backend/api/business/printscheme"
 	"encoding/json"
 	"fmt"
+	"strconv"
 	"strings"
+	"time"
+
+	"dashoo.cn/backend/api/business/accountinfo"
+	"dashoo.cn/backend/api/business/company"
+	"dashoo.cn/backend/api/business/printscheme"
+	. "dashoo.cn/backend/api/controllers"
+	"dashoo.cn/business2/parameter"
 
 	"dashoo.cn/backend/api/business/logsinfo"
 	"dashoo.cn/business2/auth"
@@ -16,7 +21,6 @@ import (
 	"dashoo.cn/business2/permission"
 	"dashoo.cn/business2/userRole"
 
-	. "dashoo.cn/backend/api/controllers"
 	"dashoo.cn/utils"
 )
 
@@ -33,12 +37,15 @@ type UserModel struct {
 	Description    string `json:"description"`
 	Photo          string `json:"photo"`
 	Role           string `json:"role"`
+	RoleId         int    `json:"roleid"`
 	Id             int    `json:"id"`
 	ChannelIds     string `json:"channelids"`
 	Password       string `json:"password"`
 	DepartmentId   string `json:"departmentid"`
 	DepartmentName string `json:"departmentname"`
 	Sign           string `json:"sign"`
+	IsCompanyUser  int    `json:"Iscompanyuser"`
+	Superior       string `json:"superior"`
 }
 
 type ChangePwdModel struct {
@@ -78,6 +85,8 @@ func (this *UserController) Get() {
 	user.Profile.Host = this.Ctx.Request.Host
 	user.Profile.AccCode = usermodel.AccCode
 	user.Profile.DepartmentId = usermodel.Departmentid
+	user.Profile.IsCompanyUser = usermodel.IsCompanyUser
+	user.Profile.Superior = usermodel.Superior
 	user.Profile.Id = usermodel.Id
 	// todo 从this.User获取用户名,再查询出具体用户
 	//	user := models.User{"user01", "张三", models.Profile{Gender: "male", Age: 20, Address: "china", Email: "123zs@gmail.com", Realname: "ppppppp"}}
@@ -86,6 +95,7 @@ func (this *UserController) Get() {
 }
 
 // @Title 获取用户菜单权限
+
 // @Description 获取用户菜单权限
 // @Success	200	{object} controllers.Request
 // @router /getusermodule [get]
@@ -130,12 +140,85 @@ func (this *UserController) UserPowerCheckRole() {
 func (this *UserController) List() {
 	page := this.GetPageInfoForm()
 	keyword := this.GetString("keyword")
+	username := this.GetString("UserName")
+	departmentname := this.GetString("DepartmentName")
+	unit := this.GetString("Unit")
+	orgnodeId := this.GetString("orgnodeId")
+	IsCompanyUser := this.GetString("IsCompanyUser")
 	svc := permission.GetPermissionService(utils.DBE)
+	organsvc := organize.GetOrganizeService(utils.DBE)
 	var users []userRole.Base_User
 
-	where := "IsVisible=1 and CreateUserId='" + utils.ToStr(this.User.Id) + "' or Id = '" + utils.ToStr(this.User.Id) + "' "
+	svcPerm := permission.GetPermissionService(utils.DBE)
+	isauth := svcPerm.IsAuthorized(this.User.Id, "Administrator")
+	topid := ""
+	if isauth {
+		// paramSvc := baseparameter.GetBaseparameterService(utils.DBE)
+		topid = "0" // paramSvc.GetBaseparameterMessage("", "paramset", "HeadquartersID") // 总公司Id
+	} else {
+		topid = organsvc.GetMyUnitDepartmentId(this.User.DepartmentId)
+	}
+	if orgnodeId != "" {
+		topid = orgnodeId
+	}
+
+	depids := organsvc.GetAllChildById(topid)
+	where := "(IsVisible=1 and IsCompanyUser = 0 and DepartmentId in (" + depids + ") )" //or Id = '" + utils.ToStr(this.User.Id) + "')
+	//外部用户 IsCompanyUser == 1
+	if IsCompanyUser == "1" {
+		where = "(IsVisible=1 and IsCompanyUser = 1)"
+	}
 	if keyword != "" {
-		where = where + " and Realname like '%" + keyword + "%'"
+		where = where + " and UserName like '%" + keyword + "%'"
+	}
+	if username != "" {
+		where = where + " and  Realname like '%" + username + "%'"
+	}
+	if departmentname != "" {
+		where = where + " and DepartmentName like '%" + departmentname + "%'"
+	}
+	if unit != "" {
+		where = where + " and Unit like '%" + unit + "%'"
+	}
+	total := svc.GetPagingEntitiesWithOrder(page.CurrentPage, page.Size, "Id", false, &users, where)
+
+	var datainfo DataInfo
+	datainfo.Items = users
+	datainfo.CurrentItemCount = total
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}
+
+// @Title get
+// @Description get user by token
+// @Success 200 {object} models.User
+// @router /parlist [get]
+func (this *UserController) ParList() {
+	page := this.GetPageInfoForm()
+	unit := this.User.Uint
+	IsCompanyUser := this.User.IsCompanyUser
+	svc := permission.GetPermissionService(utils.DBE)
+	organsvc := organize.GetOrganizeService(utils.DBE)
+	var users []userRole.Base_User
+
+	svcPerm := permission.GetPermissionService(utils.DBE)
+	isauth := svcPerm.IsAuthorized(this.User.Id, "Administrator")
+	topid := ""
+	if isauth {
+		// paramSvc := baseparameter.GetBaseparameterService(utils.DBE)
+		topid = "0" // paramSvc.GetBaseparameterMessage("", "paramset", "HeadquartersID") // 总公司Id
+	} else {
+		topid = organsvc.GetMyUnitDepartmentId(this.User.DepartmentId)
+	}
+	depids := organsvc.GetAllChildById(topid)
+	where := "(IsVisible=1 and IsCompanyUser = 0 and DepartmentId in (" + depids + ") or Id = '" + utils.ToStr(this.User.Id) + "') "
+	//外部用户 IsCompanyUser == 1
+	if IsCompanyUser == 1 {
+		where = "(IsVisible=1 and IsCompanyUser = 1 and CreateUserId='" + utils.ToStr(this.User.Id) + "' or Id = '" + utils.ToStr(this.User.Id) + "')"
+	}
+
+	if unit != "" {
+		where = where + " and Unit like '%" + unit + "%'"
 	}
 	total := svc.GetPagingEntitiesWithOrder(page.CurrentPage, page.Size, "Id", false, &users, where)
 
@@ -202,15 +285,33 @@ func (this *UserController) AddUser() {
 		this.ServeJSON()
 		return
 	}
-	//获取组织名称
+
+	//	获取组织名称
 	svcorg := organize.GetOrganizeService(utils.DBE)
 	model.DepartmentName = svcorg.GetNameById(model.DepartmentId)
+	//获取组织上级组织
+	//var orginizeentity organize.Base_Organize
+	//svcorg.GetEntityById(model.DepartmentId, &orginizeentity)
+	unitId := svcorg.GetMyUnitDepartmentId(model.DepartmentId)
+	var org organize.Base_Organize
+	svcorg.GetEntityById(unitId, &org)
 
 	var userentity userRole.Base_User
+	userentity.Companyid = "0"
+	userentity.Superior = model.Superior
 	userentity.Roleid, _ = utils.StrTo(model.Role).Int()
+	userentity.UnitId = org.Id
+	userentity.Unit = org.Fullname
 	if userentity.Roleid == 0 {
 		//userentity.Roleid = 10000123 //普通用户
 	}
+	if model.IsCompanyUser == 1 {
+		parameterSvc := baseparameter.GetBaseparameterService(utils.DBE) //取出外部门ID
+		extOrganizeId := parameterSvc.GetBaseparameterMessage("GFGL", "paramset", "ExtRoleId")
+		model.RoleId, _ = strconv.Atoi(extOrganizeId)
+		userentity.Roleid = model.RoleId
+		userentity.IsCompanyUser = model.IsCompanyUser
+	}
 	userentity.Username = model.Username
 	userentity.Realname = model.Realname
 	userentity.Telephone = model.Telephone
@@ -221,7 +322,6 @@ func (this *UserController) AddUser() {
 		userentity.Description = model.Sign
 	}
 	userentity.Photo = model.Photo
-
 	currentuser := this.User
 	userentity.Createuserid, _ = utils.StrTo(currentuser.Id).Int()
 	userentity.Createby = currentuser.Realname
@@ -246,6 +346,7 @@ func (this *UserController) AddUser() {
 	userentity.Publickey = key
 	userentity.Auditstatus = 1
 	userentity.Email = userentity.Username
+
 	svc := userRole.GetUserService(utils.DBE)
 	err := svc.AddUser(&userentity)
 
@@ -293,11 +394,10 @@ func (this *UserController) EditUser() {
 		//获取组织名称
 		svcorg := organize.GetOrganizeService(utils.DBE)
 		model.DepartmentName = svcorg.GetNameById(model.DepartmentId)
-		//		roleid, _ := utils.StrTo(model.Role).Int()
-		//		if userentity.Roleid != roleid {
-		//			svc.ClearUserRole(id)
-		//			svc.AddUserToRole(id, model.Role, userentity)
-		//		}
+		//获取组织上级组织
+		//var orginizeentity organize.Base_Organize
+		//svcorg.GetEntityById(model.DepartmentId, &orginizeentity)
+		userentity.Superior = model.Superior
 		userentity.Realname = model.Realname
 		userentity.Telephone = model.Telephone
 		userentity.Mobile = model.Mobile
@@ -313,7 +413,7 @@ func (this *UserController) EditUser() {
 		userentity.Departmentid = model.DepartmentId
 		userentity.Departmentname = model.DepartmentName
 
-		var cols []string = []string{"Realname", "DepartmentId", "DepartmentName", "Telephone", "Mobile", "Description", "Photo", "Modifieduserid", "Modifiedby"}
+		var cols []string = []string{"Realname", "CompanyId", "DepartmentId", "DepartmentName", "Telephone", "Mobile", "Description", "Photo", "Modifieduserid", "Modifiedby", "Superior"}
 
 		err := svc.UpdateEntityAndBackupByCols(id, &userentity, &userentityempty, cols, utils.ToStr(this.User.Id), this.User.Realname)
 
@@ -413,6 +513,30 @@ func (this *UserController) UserChangePWD() {
 
 }
 
+// @Title 修改全部默认密码
+// @Description 修改密码
+// @Success	200	{object}
+// @router /changeallpwd [get]
+func (this *UserController) ChangeAllpwd() {
+
+	svcauth := auth.GetAuthServic(utils.DBE)
+	pwd, key, _ := utils.TripleDesEncrypt("Dgyt@scgl")
+	//pwd, key, _ := utils.TripleDesEncrypt("123456")
+	_, err := svcauth.DBE.Exec("Update Base_User set UserPassword='" + pwd + "',PublicKey='" + key + "' where UserName!='yanshi' and IsCompanyUser='0'")
+	var errinfo ErrorInfo
+	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()
+	}
+}
+
 // @Title 注册管理账号
 // @Description 注册管理账号
 // @Param	body	body	business.device.DeviceChannels	"传感器信息"
@@ -527,3 +651,35 @@ func (this *UserController) Registerput() {
 	}
 
 }
+
+// @Title 跟新用户二级单位
+// @Description 跟新用户二级单位
+// @Success 200 {object} organize.Base_Organize
+// @router /updatauser2Org [get]
+func (this *UserController) UpdataUser2Org() {
+	t := time.Now()
+	var userlist []userRole.Base_User
+	var user1 userRole.Base_User
+	svc := userRole.GetUserService(utils.DBE)
+	svc.GetEntities(&userlist, "DepartmentId != ''")
+	unitIdcopy := ""
+	fullname := ""
+	unitsvc := organize.GetOrganizeService(utils.DBE)
+	for i, user := range userlist {
+		unitId := unitsvc.GetMyUnitDepartmentId(user.Departmentid)
+		var org organize.Base_Organize
+		if unitIdcopy != unitId {
+			unitsvc.GetEntityById(unitId, &org)
+			fullname = org.Fullname
+		}
+		user1.UnitId, _ = strconv.Atoi(unitId)
+		user1.Unit = fullname
+		cols := []string{"UnitId", "Unit"}
+		unitsvc.UpdateEntityByIdCols(user.Id, &user1, cols)
+		unitIdcopy = unitId
+		fmt.Println(i)
+	}
+
+	elapsed := time.Since(t)
+	fmt.Println(elapsed)
+}

+ 142 - 0
src/dashoo.cn/backend/api/controllers/rtx/rtx.go

@@ -0,0 +1,142 @@
+package rtx
+
+import (
+	"fmt"
+	"log"
+
+	"strconv"
+	"strings"
+
+	"dashoo.cn/backend/api/business/oilrtx"
+	"dashoo.cn/backend/api/business/organize"
+	. "dashoo.cn/backend/api/controllers"
+	"dashoo.cn/business2/userRole"
+	"dashoo.cn/utils"
+)
+
+type RtxController struct {
+	BaseController
+}
+
+// @Title get
+// @Description get workflow by token
+// @Success 200 {object} historicTasks
+// @router /call [get]
+func (this *RtxController) GetRtx() {
+
+	rtxSvc := oilrtx.GetRtxService(utils.DBE)
+	resp := rtxSvc.SendRtxMsg()
+
+	var datainfo DataInfo
+	datainfo.Items = resp
+
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}
+
+// @Title get
+// @Description get workflow by token
+// @Success 200 {object} historicTasks
+// @router /syncOrganize [get]
+func (this *RtxController) SyncOrganizeList() {
+	rtxSvc := oilrtx.GetRtxService(utils.DBE)
+	resp := rtxSvc.AutoSyncOrgList()
+	var datainfo DataInfo
+	datainfo.Items = resp
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}
+
+// @Title send message
+// @Description send message in dagangnetwork
+// @Success 200 {object} historicTasks
+// @router /sendmsg [post]
+func (this *RtxController) SendMsg() {
+	rtxSvc := oilrtx.GetRtxService(utils.DBE)
+	userName := "yuedefeng"   //说明:用户名称(RTX,AD的登录号)备注:短信接收者账号(主要是日志用到)
+	toMobile := "15563862958" //目的手机号,多个目的手机号用英文逗号分割
+	msg := "你好"               //短信内容,注意长度不要超过70个汉字(字符集GBK,url编码)
+	resp := rtxSvc.HandleSendMsg(userName, toMobile, msg)
+
+	var datainfo DataInfo
+	datainfo.Items = resp
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}
+
+// @Title send message
+// @Description send message in dagangnetwork
+// @Success 200 {object} historicTasks
+// @router /ptrlogin [post]
+func (this *RtxController) PtrLogin() {
+	rtxSvc := oilrtx.GetRtxService(utils.DBE)
+	userName := this.GetString("username") //用户名
+	passWord := this.GetString("password")
+
+	resp := rtxSvc.HandlePtrLogin(userName, passWord, BaseUserName)
+	log.Println("userName= ", userName)
+	var datainfo DataInfo
+	datainfo.Items = resp
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}
+
+// @Title get
+// @Description get workflow by token
+// @Success 200 {object} historicTasks
+// @router /syncUser [get]
+func (this *RtxController) SyncUserList() {
+	var tmpuserlist []oilrtx.Tmp_User
+	var baseuser userRole.Base_User
+	rtxSvc := oilrtx.GetRtxService(utils.DBE)
+	rtxSvc.GetEntitysByWhere("tmp_user", "fullname<>'null'", &tmpuserlist)
+	pwd, key, _ := utils.TripleDesEncrypt("123456")
+	var counts int64 = 0
+	var fails int64 = 0
+	for _, tmpuser := range tmpuserlist {
+		baseuser.Id = 0
+		baseuser.Departmentid = tmpuser.Deptid
+		baseuser.Realname = tmpuser.Fullname
+		baseuser.Username = tmpuser.Username
+		baseuser.Userpassword = pwd
+		baseuser.Publickey = key
+		_, err := rtxSvc.InsertEntity(&baseuser)
+		if err == nil {
+			counts++
+		} else {
+			fails++
+		}
+		fmt.Println(counts, "==", fails)
+	}
+	var datainfo DataInfo
+	datainfo.StartIndex = counts
+	datainfo.PageIndex = fails
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}
+
+// @Title get
+// @Description get workflow by token
+// @Success 200 {object} historicTasks
+// @router /syncUserDept [get]
+func (this *RtxController) SyncUserDept() {
+	var tmp_user1 oilrtx.Tmp_User
+	var tmp_userlist []oilrtx.Tmp_User
+	var orglist []organize.Base_Organize
+	svc := oilrtx.GetRtxService(utils.DBE)
+	svc.GetEntitysByWhere("tmp_user", "fullname<>'null'", &tmp_userlist)
+	svc.GetEntitysByWhere("Base_Organize", "1=1", &orglist)
+	for _, tmp_user := range tmp_userlist {
+		for _, org := range orglist {
+			var dept = strings.Replace(org.Description, "/", "\\", -1)
+			if tmp_user.Department == dept {
+				where := "username='" + tmp_user.Username + "'"
+				tmp_user1.Deptid = strconv.Itoa(org.Id)
+				col := []string{"deptid"}
+				svc.UpdateEntityBywheretbl("tmp_user", tmp_user1, col, where)
+				break
+			}
+		}
+		fmt.Println(tmp_user)
+	}
+}

+ 11 - 8
src/dashoo.cn/backend/api/models/token.go

@@ -35,14 +35,17 @@ type UserToken struct {
 
 // 从token中获取的用户信息
 type UserInfo struct {
-	Id           string
-	Username     string
-	Realname     string
-	AccCode      string
-	Roles        string
-	Power        string
-	DepartmentId string
-	Description  string
+	Id            string
+	Username      string
+	Realname      string
+	AccCode       string
+	Roles         string
+	Power         string
+	DepartmentId  string
+	Description   string
+	IsCompanyUser int
+	Superior      string
+	Uint          string
 }
 
 // 建立JWT Token

+ 19 - 16
src/dashoo.cn/backend/api/models/user.go

@@ -25,22 +25,25 @@ type User struct {
 }
 
 type Profile struct {
-	Gender       string
-	Age          int
-	Address      string
-	Email        string
-	Realname     string
-	Roleid       int
-	Mobile       string
-	Telephone    string
-	CompanyCode  string
-	Photo        string
-	Manager      string //联系人
-	Description  string //备注
-	Host         string //域名
-	AccCode      string //客户企业编号
-	DepartmentId string
-	Id           int
+	Gender        string
+	Age           int
+	Address       string
+	Email         string
+	Realname      string
+	Roleid        int
+	Mobile        string
+	Telephone     string
+	CompanyCode   string
+	Photo         string
+	Manager       string //联系人
+	Description   string //备注
+	Host          string //域名
+	AccCode       string //客户企业编号
+	DepartmentId  string
+	Id            int
+	IsCompanyUser int
+	Superior      string
+	Uint          string
 }
 
 //func AddUser(u User) string {

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

@@ -15,6 +15,7 @@ import (
 	"dashoo.cn/backend/api/controllers/limswzjys"
 	"dashoo.cn/backend/api/controllers/logs"
 	"dashoo.cn/backend/api/controllers/material"
+	"dashoo.cn/backend/api/controllers/rtx"
 	"dashoo.cn/backend/api/controllers/setting"
 	"dashoo.cn/backend/api/controllers/system"
 	"dashoo.cn/backend/api/controllers/trigger"
@@ -582,6 +583,12 @@ func init() {
 				&leader.LeaderController{},
 			),
 		),
+		//RTX
+		beego.NSNamespace("/rtx",
+			beego.NSInclude(
+				&rtx.RtxController{},
+			),
+		),
 	)
 	beego.AddNamespace(ns)
 }

+ 28 - 0
src/dashoo.cn/frontend_web/src/api/rtxservice/rtx.js

@@ -0,0 +1,28 @@
+export default {
+  syncOrganize (myAxios) {
+    return myAxios({
+      url: '/rtx/syncOrganize',
+      method: 'GET'
+    })
+  },
+  syncUser (myAxios) {
+    return myAxios({
+      url: '/rtx/syncUser',
+      method: 'GET'
+    })
+  },
+  syncUserDept (myAxios) {
+    return myAxios({
+      url: '/rtx/syncUserDept',
+      method: 'GET'
+    })
+  },
+  rtxLogin (params, myAxios) {
+    return myAxios({
+      url: '/rtx/ptrlogin',
+      method: 'post',
+      params: params
+    })
+  }
+
+}

+ 4 - 4
src/dashoo.cn/frontend_web/src/pages/lims/checkequipmentlist/index.vue

@@ -119,7 +119,7 @@
         <el-form-item label="设备名称" :label-width="formLabelWidth">
           <el-input v-model="formData.DeviceName" autocomplete="off"></el-input>
         </el-form-item>
-        <el-form-item label="检测报告" :label-width="formLabelWidth" prop="TemplateTypeId" required>
+        <el-form-item label="设备类型" :label-width="formLabelWidth" prop="TemplateTypeId" required>
           <el-select ref="refProjectTypeId" v-model="formData.TemplateTypeId" style="width:100%" filterable placeholder="请选择">
             <el-option v-for="item in projectTypeList" :key="item.id" :label="item.FullName" :value="item.Id"></el-option>
           </el-select>
@@ -207,7 +207,7 @@
         tableColumns: [
           {
             prop: 'TemplateTypeName',
-            label: '检测报告',
+            label: '设备类型',
             width: 200,
             sort: true
           },
@@ -411,7 +411,7 @@
         })
     },
 
-      // 检测报告
+      // 设备类型
       getProjectType () {
         let _this = this
         _this.$axios.get('/testtype/testypetreeall', {})
@@ -534,7 +534,7 @@
         if (this.$refs.refProjectTypeId.selectedLabel <= 0) {
           this.$message({
             type: 'warning',
-            message: '请选择检测报告'
+            message: '请选择设备类型'
           })
           return
         }

+ 2 - 2
src/dashoo.cn/frontend_web/src/pages/lims/principal/subdata/customerposition.vue

@@ -75,7 +75,7 @@
           </el-select>
         </el-form-item>
 
-        <el-form-item label="检测报告" prop="ProjectTypeId" required>
+        <el-form-item label="设备类型" prop="ProjectTypeId" required>
           <el-select ref="refProjectTypeId" v-model="formData.ProjectTypeId" style="width:100%" filterable placeholder="请选择">
             <el-option v-for="item in projectTypeList" :key="item.id" :label="item.FullName" :value="item.Id"></el-option>
           </el-select>
@@ -633,7 +633,7 @@
         return y + '-' + m + '-' + d + ' ' + h + ':' + minute;
       },
 
-      //检测报告
+      //设备类型
       getProjectType() {
         let _this = this
         _this.$axios.get('/testtype/testypetreeall', {})

+ 72 - 27
src/dashoo.cn/frontend_web/src/pages/login.vue

@@ -22,7 +22,7 @@
             <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-button type="primary" :loading="loading" @click="loginall()">{{ loading ? '登录中...' : '登录' }}</el-button>
           </el-form>
 
 
@@ -40,10 +40,11 @@
 <script>
   import Vue from 'vue'
   import Component from 'class-component'
+  import api from '@/api/rtxservice/rtx'
+
   @Component({
-    data() {
+    data () {
       // form model
-      // TODO: remove default values
       const model = {
         username: '',
         password: ''
@@ -70,34 +71,78 @@
       }
     },
 
-	methods: {
-		isChrome() {
-		  //取得浏览器的userAgent字符串
-		  let userAgent = navigator.userAgent;
+    methods: {
+      isChrome () {
+        // 取得浏览器的userAgent字符串
+        let userAgent = navigator.userAgent;
+
+        // 判断是否Chrome浏览器
+        if (userAgent.indexOf('Chrome') > -1) {
+          return true
+        } else {
+          return false
+        }
+      },
 
-		  //判断是否Chrome浏览器
-		  if (userAgent.indexOf("Chrome") > -1) {
-			return true;
-		  } else {
-			return false;
-		  }
-		}
-	}
+      loginall () {
+        if (process.client) {
+          window.localStorage.setItem('loginMode', this.loginMode)
+        }
+        if (this.loginMode === 1) {
+          this.login()
+        } else {
+          this.$refs.user.validate((valid) => {
+            if (valid) {
+              this.loginptr()
+            }
+          })
+        }
+      },
+      loginptr () {
+        let params = {
+          username: this.model.username,
+          password: this.model.password
+        }
+
+        api.rtxLogin(params, this.$axios)
+          .then(res => {
+            if (res.data.items === 1) {
+              this.flag = 1
+              this.login()
+            } else if (res.data.items === 2) {
+              this.flag = 2
+              this.login()
+            } else if (res.data.items === 3) {
+              this.$message.warning('您无权限登陆本系统')
+            } else {
+              this.$message.warning('账号或密码错误')
+            }
+            this.identifyCode = ''
+            this.makeCode(this.identifyCodes, 4)
+          })
+          .catch(err => {
+            this.$message.warning('账号或密码错误')
+            console.error(err)
+            this.identifyCode = ''
+            this.makeCode(this.identifyCodes, 4)
+          })
+      }
+    }
 
   })
   export default class Login extends Vue {
-    layout() {
+    layout () {
       return 'empty'
     }
-    login() {
-	  if (!this.isChrome()) {
-		  this.$alert(
-			"请用谷歌浏览器、360浏览器(极速模式)等,Chrome内核浏览器打开本系统",
-			"不支持的浏览器",
-			{}
-		  );
-		  return false;
-	 }
+    login () {
+      if (!this.isChrome()) {
+        this.$alert(
+          '请用谷歌浏览器、360浏览器(极速模式)等,Chrome内核浏览器打开本系统',
+          '不支持的浏览器',
+          {}
+        )
+        return false
+      }
 
       this.logging = true
       this.$refs.user.validate(async (valid) => {
@@ -105,8 +150,8 @@
           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, "")
+                username: this.model.username.replace(/(^\s*)|(\s*$)/g, ''),
+                password: this.model.password.replace(/(^\s*)|(\s*$)/g, '')
               }
             })
             if (process.env.appclient == 'lims') {

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

@@ -11,6 +11,9 @@
         </el-breadcrumb>
         <span style="float: right;">
           <el-button size="mini" type="primary" style="margin-left:10px; margin-top: -4px;" @click="opendatadialog(1,null,-1);resetForm('organizeform')">新增组织</el-button>
+          <el-button size="mini" type="primary" style="margin-right:5px; margin-top: -4px;" @click="syncOrganize" :loading="syncOrgLoading">同步RTX部门</el-button>
+          <!--<el-button size="mini" type="primary" style="margin-right:5px; margin-top: -4px;"  :loading="loading" @click="syncUser">同步用户</el-button>-->
+          <!--<el-button size="mini" type="primary" style="margin-right:5px; margin-top: -4px;"  :loading="loadingTmp" @click="syncTmpUserDept">同步tmp用户部门</el-button>-->
         </span>
         <el-form ref="form" :inline="true" style="float: right; margin-top: -10px">
           <el-form-item label="组织名称">
@@ -34,8 +37,8 @@
           </el-tree>
         </el-col>
         <el-col :span="18">
-          <el-table :data="tablelist" border>
-            <el-table-column label="操作" width="70" align="center">
+          <el-table :data="tablelist"  size="mini" border>
+            <el-table-column label="操作" width="70" align="center" fixed="right">
               <template slot-scope="scope">
                 <template v-if="scope.row.Parentid !== 0">
                   <el-button size="small" type="text" @click="opendatadialog(2,scope.row,scope.$index);resetForm('organizeform')" icon="el-icon-edit"
@@ -105,11 +108,16 @@
   import {
     mapGetters
   } from 'vuex'
+  import rtxApi from '@/api/rtxservice/rtx'
+
   export default {
     name: 'organize',
 
     data() {
       return {
+        loading: false,
+        loadingTmp: false,
+        syncOrgLoading: false,
         downloading: true,
         selectedNode: 0,
         currentItemCount: 0,
@@ -285,7 +293,43 @@
         this.currentPage = value
         this.initData()
       },
-      jstimehandle(val) {
+      syncUser () {
+        this.loading = true
+        rtxApi.syncUser(this.$axios).then(res => {
+          this.loading = false
+          alert('同步成功' + res.data.StartIndex + '失败' + res.data.PageIndex)
+        })
+      },
+      syncTmpUserDept () {
+        this.loadingTmp = true
+        rtxApi.syncUserDept(this.$axios).then(res => {
+          this.loadingTmp = false
+        })
+      },
+      syncOrganize () {
+        let _this = this
+        _this.syncOrgLoading = true
+        rtxApi.syncOrganize(this.$axios).then(res => {
+          _this.syncOrgLoading = false
+          //response
+          if (res.data.items) {
+            this.$message({
+              type: 'success',
+              message: '同步成功!'
+            })
+          } else {
+            this.$message({
+              type: 'error',
+              message: '同步失败!'
+            })
+          }
+        }).catch(err => {
+          // handle error
+          console.error(err)
+        })
+      },
+
+      jstimehandle (val) {
         val = val.replace('T', ' ')
         return val.substring(0, 19)
       },

+ 412 - 44
src/dashoo.cn/frontend_web/src/pages/system/userrole.vue

@@ -10,7 +10,9 @@
           <el-breadcrumb-item :to="{ path: '/system/userrole' }">角色管理</el-breadcrumb-item>
         </el-breadcrumb>
         <span style="float: right;">
-          <el-button size="mini" type="primary" style="margin-left:10px; margin-top: -4px;" @click="opendialog(null)">添加</el-button>
+          <el-button size="mini" type="primary" v-if="adminpermission == 1" style="margin-left:10px; margin-top: -4px;"
+            @click="opendialog(null)">添加
+          </el-button>
         </span>
         <el-form ref="form" :inline="true" style="float: right; margin-top: -10px">
           <el-form-item label="角色名">
@@ -27,23 +29,30 @@
           </el-form-item>
         </el-form>
       </div>
-      <el-table :data="list" tooltip-effect="dark" border>
-        <el-table-column label="操作" width="140px" align="center">
+      <el-table :data="list" size="mini" tooltip-effect="dark" border>
+        <el-table-column label="操作" min-width="150px" align="center" fixed="right">
           <template slot-scope="scope">
-            <el-button size="small" @click="opendialog(scope.row)" type="text" icon="el-icon-edit" title="编辑"></el-button>
-            <el-button size="small" type="text" style="margin-left:3px" icon="el-icon-delete" title="删除" @click="deleteroledata(scope.row)"></el-button>
-            <el-button size="small" type="text" style="margin-left:3px" title="用户列表" @click="showUserList(scope.row)"><i
+            <el-button size="small" @click="opendialog(scope.row)" v-if="adminpermission == 1" type="text"
+              icon="el-icon-edit" title="编辑">
+            </el-button>
+            <el-button size="small" type="text" v-if="adminpermission == 1" style="margin-left:6px"
+              icon="el-icon-delete" title="删除" @click="deleteroledata(scope.row)"></el-button>
+            <el-button size="small" type="text" style="margin-left:6px" title="用户列表" @click="showUserList(scope.row)"><i
                 class="icon icon-user"></i></el-button>
-            <el-button size="small" type="text" style="margin-left:3px" title="菜单权限" @click="setpower(scope.row)"><i
-                class="icon icon-file-text"></i></el-button>
-            <el-button size="small" type="text" style="margin-left:3px" title="操作权限" @click="getItemPower(scope.row)"><i
-                class="icon icon-lock"></i></el-button>
-            <el-button size="small" type="text" style="margin-left:3px" title="容器权限" @click="setequipmentpower(scope.row)"
-              v-if="appclient != 'lims'"><i class="icon icon-cog"></i></el-button>
-            <el-button size="small" type="text" style="margin-left:3px" title="资源权限-部门" @click="departmentMessageViewSet(scope.row)"
-              v-if="appclient == 'lims'"><i class="icon icon-cog"></i></el-button>
-            <el-button size="small" type="text" style="margin-left:3px" title="资源权限-区域" @click="districtMessageViewSet(scope.row)"
-              v-if="appclient == 'lims'"><i class="icon icon-file-text"></i></el-button>
+            <el-button size="small" type="text" v-if="adminpermission == 1" style="margin-left:6px" title="菜单权限"
+              @click="setpower(scope.row)"><i class="icon icon-file-text"></i></el-button>
+            <el-button size="small" type="text" v-if="adminpermission == 1" style="margin-left:6px" title="操作权限"
+              @click="getItemPower(scope.row)"><i class="icon icon-lock"></i></el-button>
+            <el-button size="small" type="text" style="margin-left:6px" title="角色" @click="setRoleManage(scope.row.Id)"
+              v-if="appclient == 'gfgl'&&adminpermission == 1"><i class="icon icon-cog"></i></el-button>
+            <!-- <el-button size="small" type="text" style="margin-left:3px" title="容器权限" @click="setequipmentpower(scope.row)"
+              v-if="appclient != 'lims'"><i class="icon icon-cog"></i></el-button> -->
+            <el-button size="small" type="text" style="margin-left:6px" title="资源权限-部门"
+              @click="departmentMessageViewSet(scope.row)" v-if="appclient == 'lims'"><i class="icon icon-cog"></i>
+            </el-button>
+            <el-button size="small" type="text" style="margin-left:6px" title="资源权限-区域"
+              @click="districtMessageViewSet(scope.row)" v-if="appclient == 'lims'"><i class="icon icon-file-text"></i>
+            </el-button>
           </template>
         </el-table-column>
         <el-table-column prop="Realname" align="center" label="角色名" show-overflow-tooltip></el-table-column>
@@ -55,7 +64,8 @@
         </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">
+        :page-sizes="[10, 15, 20, 25]" :page-size="size" layout="total, sizes, prev, pager, next, jumper"
+        :total="currentItemCount">
       </el-pagination>
     </el-card>
     <!-- 添加角色 -->
@@ -75,17 +85,22 @@
     </el-dialog>
     <!-- 用户列表 -->
     <el-dialog title="包含用户列表" :visible.sync="userDialogVisible">
-      <el-button type="primary" size="mini" style="float: right; margin-top: -10px;margin-left :5px" @click="deleteuserdataall()">删除所有关联用户</el-button>
-      <el-button type="primary" size="mini" style="float: right; margin-top: -10px" @click="roleadduser()">添加</el-button>
+      <el-button type="primary" size="mini" style="float: right; margin-top: -10px;margin-left :5px"
+        @click="deleteuserdata()">删除</el-button>
+      <el-button type="primary" size="mini" style="float: right; margin-top: -10px" @click="roleadduseradmin()">添加
+      </el-button>
       <br />
-      <el-table :data="userList" border>
-        <el-table-column label="操作" align="center">
+      <el-table :data="userList" @selection-change="handleUserSelecChange" border>
+        <!-- <el-table-column label="操作" align="center">
           <template slot-scope="scope">
-            <el-button size="small" type="text" style="margin-left:3px" icon="el-icon-delete" title="删除" @click="deleteuserdata(scope.row)"></el-button>
+            <el-button size="small" type="text" style="margin-left:3px" icon="el-icon-delete" title="删除"
+              @click="deleteuserdata(scope.row)"></el-button>
           </template>
-        </el-table-column>
+        </el-table-column> -->
+        <el-table-column type="selection" width="55"></el-table-column>
         <el-table-column prop="Username" align="center" label="账号" show-overflow-tooltip></el-table-column>
         <el-table-column prop="Realname" align="center" label="用户名"></el-table-column>
+        <el-table-column prop="Unit" align="center" label="单位名称"></el-table-column>
         <el-table-column prop="Departmentname" align="center" label="所属组织"></el-table-column>
         <el-table-column prop="Telephone" align="center" label="手机" show-overflow-tooltip></el-table-column>
         <el-table-column label="座机" align="center" prop="Mobile" show-overflow-tooltip></el-table-column>
@@ -93,22 +108,64 @@
                          show-overflow-tooltip></el-table-column> -->
       </el-table>
 
-      <el-pagination @size-change="handleUserSizeChange" @current-change="handleUserCurrentChange" :current-page="currentUserPage"
-        :page-sizes="[10, 15, 20, 25]" :page-size="size" layout="total, sizes, prev, pager, next, jumper" :total="currentUserItemCount">
+      <el-pagination @size-change="handleUserSizeChange" @current-change="handleUserCurrentChange"
+        :current-page="currentUserPage" :page-sizes="[10, 15, 20, 25]" :page-size="size"
+        layout="total, sizes, prev, pager, next, jumper" :total="currentUserItemCount">
       </el-pagination>
 
       <div slot="footer" class="dialog-footer">
         <el-button @click="userDialogVisible = false">取 消</el-button>
       </div>
     </el-dialog>
+    <!-- 超级添加用户 -->
+    <el-dialog title="添加用户" :visible.sync="adminadduser" top="5vh" width="900px">
+      <el-form label-width="110px" style="text-align:right">
+        <el-row :gutter="10">
+          <el-col :span="10">
+            <el-card style="width: 100%;height: calc(100vh - 283px);margin-top:0px">
+              <div slot="header" class="clearfix">
+                <span>请选择部门</span>
+              </div>
+              <el-tree :data="orgtreelist" :props="orgtreeprops" @node-click="handleNodeClick"></el-tree>
+            </el-card>
+          </el-col>
+
+          <el-col :span="14">
+            <el-card style="width: 100%;height: calc(100vh - 283px);margin-top:0px">
+              <el-table :data="userOptions" style="width: 100%;" height="calc(100vh - 353px)" ref="multipleTable"
+                @selection-change="handleSelectionChange">
+                <el-table-column type="selection" width="55"></el-table-column>
+                <el-table-column prop="Realname" label="可选用户">
+                  <!-- <template slot="header">
+                    <el-button type="primary" style="float: right;" size="small" @click="toggleSelection">
+                      选择用户 <el-icon class="el-icon-d-arrow-right"></el-icon>
+                    </el-button>
+                  </template> -->
+                </el-table-column>
+              </el-table>
+              <el-pagination small @size-change="handleSetRoleChange" @current-change="handleSetRoleCurrentChange"
+                :current-page="currentSetRolePage" :page-sizes="[10, 15, 20, 25]" :page-size="setrolesize"
+                layout="total, sizes, prev, pager, next" :total="currentSetRoleItemCount">
+               </el-pagination>
+            </el-card>
+          </el-col>
+        </el-row>
+        <el-row :gutter="10">
+          <span style="margin-top:10px;">
+        <el-button size="small" @click="adminadduser = false">取 消</el-button>
+        <el-button type="primary" size="small" @click="toggleSelection()">确 定</el-button>
+      </span>
+        </el-row>
+      </el-form>
+    </el-dialog>
     <!-- 添加用户 -->
     <el-dialog title="添加用户" :visible.sync="addUserShow" width="360px">
       <el-form label-width="90px">
         <el-row>
           <el-col :span="24">
             <el-form-item label="用户">
-              <el-select ref="selectOfficer" multiple filterable default-first-option v-model="OfficerList" placeholder="请选择"
-                style="width: 100%">
+              <el-select ref="selectOfficer" multiple filterable default-first-option v-model="OfficerList"
+                placeholder="请选择" style="width: 100%">
                 <el-option v-for="item in selectuserlist" :key="item.Id" :label="item.Realname" :value="item.Id">
                 </el-option>
               </el-select>
@@ -124,7 +181,8 @@
     </el-dialog>
     <!-- 菜单权限 -->
     <el-dialog :title="powerdialogtitle" :visible.sync="powerdialogVisible">
-      <el-tree style="border: 0" show-checkbox node-key="id" :data="modulepowerdata" :props="modulepowerProps" ref="modulepowertree">
+      <el-tree style="border: 0" show-checkbox node-key="id" :data="modulepowerdata" :props="modulepowerProps"
+        ref="modulepowertree">
       </el-tree>
       <div slot="footer" class="dialog-footer">
         <el-button @click="powerdialogVisible = false">取 消</el-button>
@@ -132,8 +190,9 @@
       </div>
     </el-dialog>
     <!-- 容器权限 -->
-    <el-dialog title="容器权限" :visible.sync="powerequipmentdialogVisible">
-      <el-checkbox :indeterminate="isequpicheckall" v-model="equipCheckAll" @change="handleCheckAllChange">全选</el-checkbox>
+    <!-- <el-dialog title="容器权限" :visible.sync="powerequipmentdialogVisible">
+      <el-checkbox :indeterminate="isequpicheckall" v-model="equipCheckAll" @change="handleCheckAllChange">全选
+      </el-checkbox>
       <div style="margin-top:10px;" class="rowequippower">
         <el-checkbox-group v-model="selectedequip">
           <el-checkbox v-for="item in equipalllist" :key="item.Id" @change="handlecheckedequpichange" :label="item.Id"
@@ -144,10 +203,11 @@
         <el-button @click="powerequipmentdialogVisible = false">取 消</el-button>
         <el-button type="primary" @click="saveequiptmentpower()">确 定</el-button>
       </div>
-    </el-dialog>
+    </el-dialog> -->
     <!-- 操作权限 -->
     <el-dialog title="操作权限" :visible.sync="operationPowerDialogVisible">
-      <el-tree style="border: 0" show-checkbox node-key="id" :data="operationPowerData" :props="modulepowerProps" ref="operationPowerTree">
+      <el-tree style="border: 0" show-checkbox node-key="id" :data="operationPowerData" :props="modulepowerProps"
+        ref="operationPowerTree">
       </el-tree>
       <div slot="footer" class="dialog-footer">
         <el-button @click="operationPowerDialogVisible = false">取 消</el-button>
@@ -156,7 +216,8 @@
     </el-dialog>
     <!-- 资源权限 -->
     <el-dialog title="资源权限(部门信息)" :visible.sync="messageviewVisible">
-      <el-tree style="border: 0" show-checkbox node-key="id" :data="operationOrganizeData" :props="organizeProps" ref="operationOriganizeTree">
+      <el-tree style="border: 0" show-checkbox node-key="id" :data="operationOrganizeData" :props="organizeProps"
+        ref="operationOriganizeTree">
       </el-tree>
       <div slot="footer">
         <el-button @click="messageviewVisible = false">取消</el-button>
@@ -165,13 +226,29 @@
     </el-dialog>
     <!-- 资源权限 -->
     <el-dialog title="资源权限(区域信息)" :visible.sync="districtVisible">
-      <el-tree style="border: 0" show-checkbox node-key="id" :data="operationdistrictData" :props="districtProps" ref="operationdistrictTree">
+      <el-tree style="border: 0" show-checkbox node-key="id" :data="operationdistrictData" :props="districtProps"
+        ref="operationdistrictTree">
       </el-tree>
       <div slot="footer">
         <el-button @click="districtVisible = false">取消</el-button>
         <el-button type="primary" @click="savedistrictPower()">确定</el-button>
       </div>
     </el-dialog>
+    <!-- 设置角色管理角色 -->
+    <el-dialog title="管理角色" :visible.sync="rolesetVisible">
+      <el-checkbox :indeterminate="isrolecheckall" v-model="roleCheckAll" @change="handleCheckAllRole">全选
+      </el-checkbox>
+      <div style="margin-top:20px;">
+        <el-checkbox-group v-model="selectedrole">
+          <el-checkbox v-for="role in setrolelist" @change="handlecheckedrolechange" :label="role.Id" :value="role.Id"
+            :key="role.Id">{{role.Realname}}</el-checkbox>
+        </el-checkbox-group>
+      </div>
+      <div slot="footer">
+        <el-button @click="rolesetVisible = false">取消</el-button>
+        <el-button type="primary" @click="managerolesave()">确定</el-button>
+      </div>
+    </el-dialog>
 
     <!-- 给操作权限添加角色 -->
     <!-- <el-dialog title="给操作权限选择角色" :visible.sync="addRoleOpsDialogVisible">
@@ -199,7 +276,31 @@
     }),
     data() {
       return {
+        //超级管理员添加用户
+        adminadduser: false,
+        orgtreelist: [],
+        orgtreeprops: {
+          value: 'id',
+          label: 'Fullname',
+          children: 'children'
+        },
+        userOptions: [],
+        userselectOptions: [],
+        selectedOptions: {},
+        AuditorForm: {
+          UserId: ''
+        },
+        //是否有超级管理员权限
+        adminpermission: 0,
+        //角色管理角色
+        rolesetVisible: false,
+        roleCheckAll: false,
+        isrolecheckall: false,
+        selectedrole: [],
+        rolelistcheckall: [],
+        mustrolelist: [],
         //添加用户
+        selectuser: [],
         addUserShow: false,
         partuserlist: [],
         OfficerList: [],
@@ -212,13 +313,17 @@
         currentPage: 1,
         size: 10,
         list: [],
-
+        setrolelist:[],
+        rolelist: [],
+        currentSetRoleItemCount: 0,
+        currentSetRolePage: 1,
+        setrolesize: 10,
+        setroledepid:'',
         currentUserItemCount: 0,
         currentUserPage: 1,
         userSize: 10,
         userList: [],
         selectRoleId: '',
-
         formLabelWidth: '120px',
         dialogtitle: '', // 添加编辑对话框
         dialogVisible: false,
@@ -269,7 +374,10 @@
       this.appclient = process.env.appclient
       // initial data
       this.initData()
-      this.getallequipmentlist()
+      //this.getallequipmentlist()
+      this.getallrolelist()
+      this.getadminpermission()
+      this.getroleData()
     },
     methods: {
       initData() {
@@ -296,13 +404,53 @@
             _this.exportloading = false
           })
       },
+      getroleData() {
+        let _this = this
+        // request
+        this.$axios.get('role/list', {})
+          .then(res => {
+            // response
+            _this.setrolelist = res.data.items
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+          })
+      },
+      getadminpermission() {
+        this.$axios.get('role/getAdminPermi', {})
+          .then(res => {
+            // response
+            this.adminpermission = res.data.code
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+          })
+      },
+      getallrolelist() {
+        this.$axios.get('role/alllist', {})
+          .then(res => {
+            // response
+            this.rolelist = res.data.items
+            let roleItemCount = res.data.currentItemCount
+            for (var i = 0; i < roleItemCount; i++) {
+              this.rolelistcheckall.push(this.rolelist[i].Id)
+            }
+            this.exportloading = false
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+            this.exportloading = false
+          })
+      },
       getpartuserlist() {
         let _this = this
-        this.$axios.get('users/list', {})
+        this.$axios.get('users/parlist', {})
           .then(res => {
             // response
             _this.partuserlist = res.data.items
-            console.log(this.partuserlist, '====')
             this.userlistfilter()
           })
           .catch(err => {
@@ -310,6 +458,106 @@
             console.error(err)
           })
       },
+      managerolesave() {
+        let _this = this
+        // for (let mdx in this.mustrolelist) {
+        //   console.log(this.mustrolelist)
+        //   if (this.selectedrole.indexOf(this.mustrolelist[mdx]) == -1) {
+        //     this.selectedrole.push(parseInt(this.mustrolelist[mdx]))
+        //   }
+        // }
+        let rolestring = this.selectedrole.join(',')
+        let roleidsstring = rolestring.toString()
+
+        // request
+        this.$axios.put('role/setmanrole/' + this.selectedroleid + '_' + roleidsstring, {})
+          .then(res => {
+            // response
+            if (res.data.code === 0) {
+              _this.$message({
+                type: 'success',
+                message: res.data.message
+              })
+              // 更新界面
+              this.getRoleManage(this.selectedroleid)
+              this.rolesetVisible = false
+
+            } else {
+              _this.$message({
+                type: 'warning',
+                message: res.data.message
+              })
+            }
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+          })
+      },
+      getorgtreelist() {
+        let _this = this
+        let params = {
+          IsInnerOrganize: 1,
+        }
+        _this.$axios.get('role/orgalllist', {
+            params
+          })
+          .then(res => {
+            _this.orgtreelist = window.toolfun_gettreejson(res.data.items, 'Id', 'Parentid', 'Id,Fullname')
+          })
+          .catch(err => {
+            console.error(err)
+          })
+      },
+      handleNodeClick(data) {
+        this.setroledepid = data.id
+        this.currentSetRolePage = 1
+        this.getauditerbydept(data.id)
+      },
+      getauditerbydept (deptid) {
+        this.userOptions = []
+        const params = {
+          _currentPage: this.currentSetRolePage,
+          _size: this.setrolesize
+        }
+        this.$axios.get('role/getauditerbydept/' + deptid, {params}).then(res => {
+          console.log(res, 'res')
+          this.userOptions = res.data.items
+          this.currentSetRoleItemCount = res.data.currentItemCount
+            //this.adminuserlistfilter()
+        }).catch(err => {
+          console.error(err)
+        })
+      },
+      adminuserlistfilter() {
+        try {
+          let entityArray = this.userOptions
+          let arr = this.partuserlist
+          let seluserOptions = []
+          if (entityArray == null) {
+            seluserOptions = arr
+            return false
+          }
+          for (var i = 0; i < entityArray.length; i++) {
+            for (var j = 0; j < arr.length; j++) {
+              if (entityArray[i].Id === arr[j].Id) {
+                seluserOptions.push(arr[j])
+                arr.splice(j, 1)
+                j--
+              }
+            }
+          }
+          this.seluserOptions = arr
+          this.userOptions = this.seluserOptions
+        } catch (e) {
+          console.log(e)
+        }
+      },
+      roleadduseradmin() {
+        this.getorgtreelist()
+        this.selectedOptions = []
+        this.adminadduser = true
+      },
       roleadduser() {
         this.addUserShow = true
         this.getpartuserlist()
@@ -338,6 +586,46 @@
           console.log(e)
         }
       },
+      handleUserSelecChange(val) {
+        this.selectuser = val
+      },
+      handleSelectionChange(val) {
+        this.selectedOptions = val
+      },
+      toggleSelection() {
+        let _this = this
+        _this.userselectOptions = []
+
+        for (let i = 0; i < this.selectedOptions.length; i++) {
+          this.userselectOptions.push(this.selectedOptions[i].Id)
+        }
+        let useridlist = this.userselectOptions.join(',');
+        let useridliststring = useridlist.toString()
+
+        // request
+        this.$axios.put('role/setuserrole/' + useridliststring + '_' + this.selectRoleId, {})
+          .then(res => {
+            // response
+            if (res.data.code === 0) {
+              _this.$message({
+                type: 'success',
+                message: res.data.message
+              })
+              // 更新界面
+              this.initUserList(this.selectRoleId)
+              this.adminadduser = false
+            } else {
+              _this.$message({
+                type: 'warning',
+                message: res.data.message
+              })
+            }
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+          })
+      },
       adduerinrole() {
         let _this = this
         //用户姓名
@@ -458,7 +746,6 @@
       },
 
       getItemPower(val) {
-        console.log(val)
         let _this = this
         _this.operationid = val.Id
         _this.$axios.get('role/getItemPower?id=' + _this.operationid, null)
@@ -502,13 +789,28 @@
 
       deleteuserdata(val) {
         let _this = this
-        console.log("---this.selectRoleId----", this.selectRoleId)
+        let userselect = []
+
+        if (_this.selectuser) {
+          for (let i = 0; i < _this.selectuser.length; i++) {
+            userselect.push(_this.selectuser[i].Id)
+          }
+
+        } else {
+          _this.$message({
+            type: 'warning',
+            message: "请先选择用户!再点击删除"
+          })
+          return
+        }
+        let useridlist = userselect.join(',');
+        let useridliststring = useridlist.toString()
         _this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
           confirmButtonText: '确定',
           cancelButtonText: '取消',
           type: 'warning'
         }).then(() => {
-          _this.$axios.delete('role/deleteuser/' + val.Id + '_' + this.selectRoleId, null)
+          _this.$axios.delete('role/deleteuser/' + useridliststring + '_' + this.selectRoleId, null)
             .then(res => {
               // response
               if (res.data.code === 0) {
@@ -531,7 +833,7 @@
 
       deleteuserdataall() {
         let _this = this
-        _this.$confirm('此操作将永久删除所有数据, 是否继续?', '提示', {
+        _this.$confirm('此操作将永久删除数据, 是否继续?', '提示', {
           confirmButtonText: '确定',
           cancelButtonText: '取消',
           type: 'warning'
@@ -735,7 +1037,7 @@
             // response
             _this.operationdistrictData = window.toolfun_gettreejson(res.data.District, 'id', 'pId',
               'id,name,scope')
-              let selectmodels = []
+            let selectmodels = []
             if (res.data.SelectedDistrict) {
               for (var i = 0; i < res.data.SelectedDistrict.length; i++) {
                 let isParent = false
@@ -837,6 +1139,54 @@
             console.error(err)
           })
       },
+      setRoleManage(val) {
+        this.getRoleManage(val)
+        this.rolesetVisible = true
+      },
+      getRoleManage(val) {
+        this.selectedroleid = val
+        this.selectedrole = []
+        let _this = this
+        // request
+        this.$axios.get('role/getmanagerole/' + this.selectedroleid, {})
+          .then(res => {
+            _this.mustrolelist = []
+            // response
+            for (let i = 0; i < res.data.length; i++) {
+              if (_this.roleisexist(parseInt(res.data[i]))) {
+                _this.selectedrole.push(parseInt(res.data[i]))
+              }
+              let flag = false
+              let rdx = 0
+              for (rdx = 0; rdx < _this.rolelist.length; rdx++) {
+                if (parseInt(_this.rolelist[rdx].Id) == parseInt(res.data[i])) {
+                  flag = true;
+                  break;
+                }
+              }
+              if (!flag) {
+                _this.mustrolelist.push(parseInt(res.data[i]))
+              }
+
+            }
+
+            let checkedCount = this.selectedrole.length
+            this.roleCheckAll = checkedCount === this.rolelist.length
+            this.isrolecheckall = checkedCount > 0 && checkedCount < this.rolelist.length
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+          })
+      },
+      roleisexist(val) {
+        for (let i = 0; i < this.rolelist.length; i++) {
+          if (this.rolelist[i].Id === val) {
+            return true
+          }
+        }
+        return false
+      },
       setequipmentpower(val) {
         let _this = this
         _this.operationid = val.Id
@@ -963,6 +1313,15 @@
       //   this.addRoleOpsDialogVisible = true
       // },
 
+      handlecheckedrolechange() {
+        let checkedCount = this.selectedrole.length
+        this.roleCheckAll = checkedCount === this.rolelist.length
+        this.isrolecheckall = checkedCount > 0 && checkedCount < this.rolelist.length
+      },
+      handleCheckAllRole(val) {
+        this.selectedrole = val ? this.rolelistcheckall : []
+        this.isrolecheckall = false
+      },
 
       // 全选框控制
       handleCheckAllChange(val) {
@@ -988,6 +1347,15 @@
         this.currentPage = value
         this.initData()
       },
+      handleSetRoleChange(value) {
+        this.setrolesize = value
+        this.currentSetRolePage = 1
+        this.getauditerbydept(this.setroledepid)
+      },
+      handleSetRoleCurrentChange(value) {
+        this.currentSetRolePage = value
+        this.getauditerbydept(this.setroledepid)
+      },
 
       handleUserSizeChange(value) {
         this.userSize = value

+ 135 - 79
src/dashoo.cn/frontend_web/src/pages/system/users.vue

@@ -2,19 +2,29 @@
   <div>
      <el-card class="box-card">
       <div slot="header" style="height: 20px;">
-        <span style="float: left;">
+        <!--<span style="float: left;">
           <i class="icon icon-table2"></i>
-        </span>
-        <el-breadcrumb class="heading" style="float: left; margin-left: 5px">
+        </span>-->
+        <!--<el-breadcrumb class="heading" style="float: left; margin-left: 5px">
           <el-breadcrumb-item :to="{ path: '/' }">平台首页</el-breadcrumb-item>
           <el-breadcrumb-item :to="{ path: '/system/users' }">用户管理</el-breadcrumb-item>
-        </el-breadcrumb>
-        <span style="float: right;">
-          <el-button size="mini" type="primary" style="margin-left:10px; margin-top: -4px;" @click="opendatadialog(1,null,-1);resetForm('organizeform')">新增用户</el-button>
-        </span>
+        </el-breadcrumb>-->
+        <!--<span style="float: right;">
+
+          &lt;!&ndash;<el-button size="mini" type="primary" style="margin-left:10px; margin-top: -4px;" @click="setorg2">添加二级单位</el-button>&ndash;&gt;
+        </span>-->
         <el-form ref="form" :inline="true" style="float: right; margin-top: -10px">
+          <el-form-item label="单位">
+            <el-input size="mini" style="width: 150px;" v-model="searchForm.Unit" placeholder="请输入单位"></el-input>
+          </el-form-item>
+          <el-form-item label="所属部门">
+            <el-input size="mini" style="width: 150px;" v-model="searchForm.DepartmentName" placeholder="请输入所属部门"></el-input>
+          </el-form-item>
+          <el-form-item label="用户名">
+            <el-input size="mini" style="width: 150px;" v-model="searchForm.UserName" placeholder="请输入用户名"></el-input>
+          </el-form-item>
           <el-form-item label="账号">
-            <el-input size="mini" style="width: 165px;" v-model="keyword" placeholder="请输入账号"></el-input>
+            <el-input size="mini" style="width: 150px;" v-model="searchForm.keyword" placeholder="请输入账号"></el-input>
           </el-form-item>
           <el-form-item>
             <el-dropdown split-button type="primary" size="mini" @click="seachdata" @command="searchCommand">
@@ -25,36 +35,54 @@
               </el-dropdown-menu>
             </el-dropdown>
           </el-form-item>
+          <el-form-item>
+            <el-button size="mini" type="primary" v-if="this.authUser.Profile.Id == 1" @click="opendatadialog(1,null,-1);resetForm('organizeform')">新增用户</el-button>
+          </el-form-item>
         </el-form>
       </div>
-        <el-table :data="list" border>
-          <el-table-column label="操作" align="center">
-            <template slot-scope="scope">
-              <el-button size="small" @click="opendatadialog(2,scope.row,scope.$index);" type="text" icon="el-icon-edit"
-                title="编辑"></el-button>
-              <el-button size="small" type="text" style="margin-left:3px" icon="el-icon-delete" title="删除" @click="deletedata(scope.row)"></el-button>
-              <!-- <el-button size="small" type="text" style="margin-left:1px" title="权限" @click="permission(scope.row)"><i class="icon icon-lock"></i></el-button> -->
-              <el-button size="small" type="text" style="margin-left:3px" title="密码重置" @click="resetpwd(scope.row)">
-                <i class="icon icon-spinner11"></i>
-              </el-button>
-              <el-button size="small" type="text" style="margin-left:3px" title="设置角色" @click="roleset(scope.row)">
-                <i class="icon icon-users"></i>
-              </el-button>
-            </template>
-          </el-table-column>
-          <el-table-column prop="Username" align="center" label="账号" show-overflow-tooltip></el-table-column>
-          <el-table-column prop="Realname" align="center" label="用户名"></el-table-column>
-          <el-table-column prop="Departmentname" align="center" label="所属组织"></el-table-column>
-          <!-- <el-table-column prop="RealnameRole" align="center" label="角色"></el-table-column> -->
-          <el-table-column prop="Telephone" align="center" label="手机" show-overflow-tooltip></el-table-column>
-          <el-table-column label="座机" align="center" prop="Mobile" show-overflow-tooltip></el-table-column>
-          <el-table-column v-if="this.appclient != 'lims'" prop="Description" align="center" label="备注"
-            show-overflow-tooltip></el-table-column>
-        </el-table>
+
+       <el-row :gutter="20">
+         <el-col :span="6">
+           <el-card class="box-card">
+             <el-tree highlight-current :expand-on-click-node="true" node-key="id" :data="orgtreelist" :props="orgtreeprops" :default-expanded-keys="userdepartment"
+                      @node-click="orgtreeNodeClick" ref="orgmanagetree">
+             </el-tree>
+           </el-card>
+         </el-col>
+         <el-col :span="18">
+           <el-card class="box-card">
+             <el-table :data="list"  size="mini" border>
+               <el-table-column label="操作" align="center" fixed="right">
+                 <template slot-scope="scope">
+                   <el-button size="small" @click="opendatadialog(2,scope.row,scope.$index);" type="text" icon="el-icon-edit"
+                              title="编辑"></el-button>
+                   <el-button size="small" type="text" style="margin-left:3px" icon="el-icon-delete" title="删除" @click="deletedata(scope.row)"></el-button>
+                   <!-- <el-button size="small" type="text" style="margin-left:1px" title="权限" @click="permission(scope.row)"><i class="icon icon-lock"></i></el-button> -->
+                   <!-- <el-button size="small" type="text" style="margin-left:3px" title="密码重置" @click="resetpwd(scope.row)">
+                     <i class="icon icon-spinner11"></i>
+                   </el-button> -->
+                   <el-button size="small" type="text" style="margin-left:3px" title="设置角色" @click="roleset(scope.row)">
+                     <i class="icon icon-users"></i>
+                   </el-button>
+                 </template>
+               </el-table-column>
+               <el-table-column prop="Unit" align="center" label="单位"></el-table-column>
+               <el-table-column prop="Departmentname" align="center" label="部门"></el-table-column>
+               <el-table-column prop="Realname" align="center" label="用户名"></el-table-column>
+               <el-table-column prop="Username" align="center" label="账号" show-overflow-tooltip></el-table-column>
+               <!-- <el-table-column prop="RealnameRole" align="center" label="角色"></el-table-column> -->
+               <el-table-column prop="Telephone" align="center" label="手机" show-overflow-tooltip></el-table-column>
+               <el-table-column label="座机" align="center" prop="Mobile" show-overflow-tooltip></el-table-column>
+               <el-table-column v-if="this.appclient != 'lims'" prop="Description" align="center" label="备注"
+                                show-overflow-tooltip></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-col>
+       </el-row>
     </el-card>
-    <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-dialog :title="dialogtitle" :visible.sync="datadialogVisible" width="720px">
       <el-form :model="userform" :rules="rulesuser" ref="userform" label-width="100px">
@@ -110,7 +138,7 @@
 
 
     <el-dialog :title="rolesettitle" :visible.sync="rolesetVisible">
-      <el-checkbox :indeterminate="isrolecheckall" v-model="roleCheckAll" @change="handleCheckAllChange">全选</el-checkbox>
+      <!-- <el-checkbox :indeterminate="isrolecheckall" v-model="roleCheckAll" @change="handleCheckAllChange">全选</el-checkbox> -->
       <div style="margin-top:20px;">
         <el-checkbox-group v-model="selectedrole">
           <el-checkbox v-for="role in rolelist" @change="handlecheckedrolechange" :label="role.Id" :value="role.Id" :key="role.Id">{{role.Realname}}</el-checkbox>
@@ -156,25 +184,27 @@
   export default {
     name: 'users',
 
-    data() {
+    data () {
       var checkusername = (rule, value, callback) => {
         if (!value) {
           callback(new Error('请输入账号'))
         } else {
-          if (this.appclient == 'lims') { //大港油田lims系统不用邮箱
+          if (this.appclient === 'lims') { // 大港油田lims系统不用邮箱
             callback()
           }
-          let re = /^([a-zA-Z0-9]+[_|-|.|-]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|-|.|-]?)*[a-zA-Z0-9]+.[a-zA-Z]{2,3}$/
+          /* let re = /^([a-zA-Z0-9]+[_|-|.|-]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|-|.|-]?)*[a-zA-Z0-9]+.[a-zA-Z]{2,3}$/
           if (!re.test(value)) {
             callback(new Error('请输入正确的邮箱地址'))
           } else {
             callback()
-          }
+          } */
+          callback()
         }
       }
       return {
+        orgnodeId: '',
         downloading: '',
-        imghost: "",
+        imghost: '',
         organdialogVisible: false,
         currentItemCount: 0,
         currentItemCount2: 0,
@@ -190,7 +220,6 @@
         list: [],
         rolelist: [],
         mustrolelist: [],
-        keyword: '',
         datadialogVisible: false,
         dialogtitle: '',
         disabledserial: false,
@@ -209,6 +238,7 @@
           RealnameRole: '',
           GroupId: '',
           GroupName: '',
+          superior: ''
         },
         rulesuser: {
           username: [{
@@ -241,6 +271,12 @@
         selectedorg: [],
         userdepartment: [],
         ischeckbj: false, // 过滤字段勾选时触发的选中事件
+        searchForm: {
+          keyword: '',
+          UserName: '',
+          DepartmentName: '',
+          Unit: ''
+        }
       }
     },
     computed: mapGetters({
@@ -256,14 +292,24 @@
       this.selectedorg = [parseInt(this.authUser.Profile.DepartmentId)]
     },
     methods: {
+      setorg2 () {
+        this.$axios.get('users/updatauser2Org')
+          .then(res => {
+          })
+      },
       initData() {
         let _this = this
         // paginate
         const params = {
           _currentPage: this.currentPage,
           _size: this.size,
-          keyword: this.keyword
+          // keyword: this.searchForm.keyword,
+          // username: this.searchForm.UserName,
+          // departmentname: this.searchForm.DepartmentName,
+          orgnodeId: this.orgnodeId
         }
+        Object.assign(params, this.searchForm)
+
         // request
         this.$axios.get('users/list', {
             params
@@ -272,6 +318,7 @@
             // response
             _this.list = res.data.items
             _this.currentItemCount = res.data.currentItemCount
+            this.orgnodeId = ''
           })
           .catch(err => {
             // handle error
@@ -296,7 +343,6 @@
         this.imageUrl = URL.createObjectURL(file.raw);
       },
       beforeAvatarUpload(file) {
-        console.log(file);
         const isimg = file.type.indexOf("image/") === 0;
         const isLt50k = file.size / 1024 / 50 < 1;
         if (!isimg) {
@@ -318,7 +364,6 @@
         // request
         this.$axios.get('users/getuserrole/' + this.selecteduserid, {})
           .then(res => {
-            console.log("-------res----",res.data)
             _this.mustrolelist = []
             // response
             for (let i = 0; i < res.data.length; i++) {
@@ -330,14 +375,13 @@
               let rdx = 0
               for (rdx = 0; rdx < _this.rolelist.length; rdx++) {
                 if (parseInt(_this.rolelist[rdx].Id) == parseInt(res.data[i])) {
-                  flag = true;
-                  break;
+                  flag = true
+                  break
                 }
               }
               if (!flag) {
                 _this.mustrolelist.push(parseInt(res.data[i]))
               }
-
             }
 
             let checkedCount = this.selectedrole.length
@@ -349,7 +393,7 @@
             console.error(err)
           })
       },
-      rolesave() {
+      rolesave () {
         let _this = this
         for (let mdx in this.mustrolelist) {
           if (this.selectedrole.indexOf(this.mustrolelist[mdx]) == -1) {
@@ -382,16 +426,16 @@
             console.error(err)
           })
       },
-      handlecheckedrolechange() {
+      handlecheckedrolechange () {
         let checkedCount = this.selectedrole.length
         this.roleCheckAll = checkedCount === this.rolelist.length
         this.isrolecheckall = checkedCount > 0 && checkedCount < this.rolelist.length
       },
-      handleCheckAllChange(val) {
+      handleCheckAllChange (val) {
         this.selectedrole = val ? this.rolelistcheckall : []
         this.isrolecheckall = false
       },
-      roleisexist(val) {
+      roleisexist (val) {
         for (let i = 0; i < this.rolelist.length; i++) {
           if (this.rolelist[i].Id === val) {
             return true
@@ -415,32 +459,32 @@
       //       this.loading = false
       //     })
       // },
-      seachdata() {
+      seachdata () {
         this.list = []
         this.currentPage = 1
         this.initData()
       },
-      searchCommand(command) {
-        if (command == 'clear') {
+      searchCommand (command) {
+        if (command === 'clear') {
           this.clearSearch()
         }
       },
-      handleSizeChange(value) {
+      handleSizeChange (value) {
         this.list = []
         this.size = value
         this.currentPage = 1
         this.initData()
       },
-      handleCurrentChange(value) {
+      handleCurrentChange (value) {
         this.currentPage = value
         this.list = []
         this.initData()
       },
-      jstimehandle(val) {
+      jstimehandle (val) {
         val = val.replace('T', ' ')
         return val.substring(0, 19)
       },
-      opendatadialog(item, v, index) {
+      opendatadialog (item, v, index) {
         let _this = this
         this.operatingitem = item
         this.datadialogVisible = true
@@ -483,7 +527,7 @@
             })
         }
       },
-      savedata(formName) {
+      savedata (formName) {
         let _this = this
         if (this.selectedorg.length === 0) {
           _this.$message({
@@ -495,8 +539,15 @@
         this.$refs[formName].validate((valid) => {
           if (valid) {
             this.userform.departmentid = this.selectedorg[this.selectedorg.length - 1] + ''
+            let companyId = this.selectedorg.join(',')
+            let idx = companyId.lastIndexOf(',')
+            let companyIds = '0'
+            if (idx > 0) {
+              companyIds = companyId.substring(0, idx)
+            }
+            this.userform.superior = companyIds
             if (_this.operatingitem === 1) {
-              _this.$axios.post('users/', _this.userform)
+              _this.$axios.post('users', _this.userform)
                 .then(res => {
                   // response
                   if (res.data.code === 0) {
@@ -545,7 +596,7 @@
           }
         })
       },
-      deletedata(val) {
+      deletedata (val) {
         let _this = this
         _this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
           confirmButtonText: '确定',
@@ -573,7 +624,7 @@
             .catch(() => {})
         }).catch(() => {})
       },
-      resetForm(formName) {
+      resetForm (formName) {
         // this.$refs[formName].resetFields()
       },
       clearuserForm() {
@@ -585,7 +636,7 @@
           description: ''
         }
       },
-      permission(v) {
+      permission (v) {
         let _this = this
         _this.ischeckbj = true // 过滤字段勾选时触发的选中事件
         this.userpermissdevicesselects = []
@@ -605,11 +656,11 @@
             console.error(err)
           })
       },
-      getorgbyeid(v) {
+      getorgbyeid (v) {
         let _this = this
         this.$axios.put('equipment/getorgidsbyeqids', {
-            EquipmentIds: v
-          })
+          EquipmentIds: v
+        })
           .then(res => {
             // response
             setTimeout(function () {
@@ -625,11 +676,11 @@
             console.error(err)
           })
       },
-      savepermission() {
+      savepermission () {
         let _this = this
         _this.$axios.put('users/permission/' + this.userform.id, {
-            channelids: this.userpermissdevicesselects + ''
-          })
+          channelids: this.userpermissdevicesselects + ''
+        })
           .then(res => {
             // response
             if (res.data.code === 0) {
@@ -647,7 +698,7 @@
           })
           .catch(() => {})
       },
-      resetpwd(val) {
+      resetpwd (val) {
         let _this = this
         _this.$confirm(`此操作将重置用户(${val.Realname})的密码为123456, 是否继续?`, '提示', {
           confirmButtonText: '确定',
@@ -673,7 +724,7 @@
         }).catch(() => {})
       },
       // 选择组织树时触发
-      userpermissorgcheckedchange(data, checked, indeterminate) {
+      userpermissorgcheckedchange (data, checked, indeterminate) {
         let _this = this
         if (!_this.ischeckbj) {
           if (!_this.isfristchecked) {
@@ -685,7 +736,7 @@
           }
         }
       },
-      checkorgusermanage() {
+      checkorgusermanage () {
         let orgids = []
         let selectnodes = this.$refs.userpermisstree.getCheckedNodes()
         selectnodes.forEach(row => {
@@ -696,8 +747,8 @@
         }
         let _this = this
         this.$axios.get('equipment/getidsbyoid', {
-            params
-          })
+          params
+        })
           .then(res => {
             // response
             _this.userpermissdevicesselects = []
@@ -716,6 +767,10 @@
             this.loading = false
           })
       },
+      orgtreeNodeClick (data) {
+        this.orgnodeId = data.id
+        this.initData()
+      },
       getorgtreelist() {
         let _this = this
         // request
@@ -723,8 +778,8 @@
           IsInnerOrganize: 1
         }
         _this.$axios.get('organizes/list', {
-            params
-          })
+          params
+        })
           .then(res => {
             _this.orgtreelist = window.toolfun_gettreejson(res.data.items, 'Id', 'Parentid', 'Id,Fullname')
           })
@@ -733,8 +788,9 @@
             console.error(err)
           })
       },
-      clearSearch() {
-        this.keyword = ''
+      clearSearch () {
+        this.searchForm.keyword = ''
+        this.searchForm.UserName = ''
         this.list = []
         this.initData()
       }

+ 8 - 5
src/dashoo.cn/frontend_web/src/pages/system/usersetting.vue

@@ -28,16 +28,16 @@
       <el-col :span="16">
         <el-form ref="form" :model="form" :rules="rulesform" label-width="80px">
           <el-row>
-            <el-col :span="12">
+            <el-col :span="24">
               <el-form-item label="账号">
                 <el-input v-model="authUser.name" disabled></el-input>
               </el-form-item>
             </el-col>
-            <el-col :span="12">
+            <!--<el-col :span="12">
               <el-form-item label="编码">
                 <el-input v-model="form.CompanyCode"></el-input>
               </el-form-item>
-            </el-col>
+            </el-col>-->
           </el-row>
           <el-row>
             <el-form-item required prop="Realname" label="名称">
@@ -79,14 +79,14 @@
         </el-form>
       </el-col>
       <el-col :span="2">&nbsp;</el-col>
-      <el-col :span="5">
+      <!--<el-col :span="5">
         <el-upload class="avatar-uploader" :action="'http://'+host+'/api/users/uploadphoto'" :show-file-list="false"
           :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
           <img v-if="imageUrl" :src="imageUrl" class="usersettingavatar">
           <img v-else class="usersettingavatar" src="../../assets/img/avatar-default.jpg">
         </el-upload>
         <div style="font-size:14px;color:#5D6A76;margin-left:55px;margin-bottom:20px;margin-top:10px;">上传头像</div>
-      </el-col>
+      </el-col>-->
     </el-row>
   </el-card>
 </template>
@@ -135,6 +135,9 @@
       this.form.Email = this.authUser.Profile.Email
       this.form.Description = this.authUser.Profile.Description
       this.form.Photo = this.authUser.Profile.Photo
+      if (process.client) {
+        this.authUser.Profile.Host = window.location.host
+      }
       this.host = this.authUser.Profile.Host
       if (this.form.Photo !== '') {
         this.imageUrl = `http://${this.host}${this.form.Photo}`