package account import ( "context" "dubbo.apache.org/dubbo-go/v3/common/constant" "dubbo.apache.org/dubbo-go/v3/common/logger" "encoding/json" "errors" "fmt" "github.com/fonchain_enterprise/fonchain-main/api/account" "github.com/fonchain_enterprise/fonchain-main/api/department" "github.com/fonchain_enterprise/fonchain-main/api/position" "github.com/fonchain_enterprise/fonchain-main/api/rule" "github.com/fonchain_enterprise/fonchain-main/pkg/config" "github.com/fonchain_enterprise/fonchain-main/pkg/e" "github.com/fonchain_enterprise/fonchain-main/pkg/logic/auth" "github.com/fonchain_enterprise/fonchain-main/pkg/model/login" "github.com/fonchain_enterprise/fonchain-main/pkg/model/query" "github.com/fonchain_enterprise/fonchain-main/pkg/model/union" "github.com/fonchain_enterprise/fonchain-main/pkg/model/vo" "github.com/fonchain_enterprise/fonchain-main/pkg/model/vo/turnstile" "github.com/fonchain_enterprise/fonchain-main/pkg/model/vo/v2/user" "github.com/fonchain_enterprise/fonchain-main/pkg/serializer" "github.com/fonchain_enterprise/fonchain-main/pkg/service" "github.com/fonchain_enterprise/fonchain-main/pkg/utils/secret" "github.com/fonchain_enterprise/utils/utils" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "unicode/utf8" ) // UserRegisterV2 用户注册操作 func UserRegisterV2(c *gin.Context) { var req query.User var res *account.RequestStatus if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } if req.Password == "" { req.Password = e.DEFAULT_PWD } err, res := UserRegistersV2(c, req) //注册 if err != nil { if err.Error() == "账号已存在" { service.Error(c, e.InvalidParams, errors.New("该手机号已存在,请检查此人是否在其他部门")) return } service.Error(c, e.Error, err) return } service.Success(c, res) return } //UserLoginSqueezeOther 检测相同帐号的状态 // UserLoginSqueezeOther 用户登录操作 func UserLoginSqueezeOther(c *gin.Context) { var jumpToWhere = "setting" var isDriverAuth = false var isDriverSupervisorAuth = false var req account.LoginRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } req.Ip = c.ClientIP() req.From = "" isAuth, err := isOnlySiteAuth(c, req.TelNum) if err != nil { service.Error(c, e.InvalidParams, err) return } var res *account.TokenInfo if isAuth == true { //没有唯一登录的权限 req.From = e.LoginFromPC res, err = service.AccountProvider.LoginAndSqueezeOther(c, &req) } else { //老登陆 res, err = service.AccountProvider.Login(c, &req) } if err != nil { service.Error(c, e.Error, err) return } //获取用户的岗位信息 uReq := rule.RulesRequest{ AccountID: res.AccountInfo.ID, } qres, err1 := service.RuleProvider.UserInfo(c, &uReq) if err1 != nil { service.Error(c, e.Error, err1) return } if len(qres.PositionUsers) >= 1 { isDriverAuth = isHaveDriverAuth(c, res.AccountInfo.ID, qres.PositionUsers[0].DepartmentId) isDriverSupervisorAuth = isHaveDriverSupervisorAuth(c, res.AccountInfo.ID, qres.PositionUsers[0].DepartmentId) } accountInfo := &union.AccountInfo{ ID: res.AccountInfo.ID, Account: res.AccountInfo.Account, NickName: res.AccountInfo.NickName, Domain: res.AccountInfo.Domain, TelNum: res.AccountInfo.TelNum, Status: res.AccountInfo.Status, Avatar: res.AccountInfo.Avatar, CreatedAt: res.AccountInfo.CreateAt, IsNeedChange: res.AccountInfo.IsNeedChange, EnterDate: res.AccountInfo.EnterDate, WorkYear: res.AccountInfo.WorkYear, IsAdmin: qres.IsAdmin, PositionUsers: qres.PositionUsers, JumpTo: res.AccountInfo.Extend.JumpTo, DepartmentName: "", JobNum: res.AccountInfo.JobNum, BirthDate: res.AccountInfo.BirthDate, Age: res.AccountInfo.Age, Sex: res.AccountInfo.Sex, Title: res.AccountInfo.Title, IDNum: res.AccountInfo.IDNum, DriverAuth: isDriverAuth, DriverSupervisorAuth: isDriverSupervisorAuth, MailAccount: res.AccountInfo.MailAccount, Train: res.AccountInfo.Train, Certificate: res.AccountInfo.Certificate, TrainVideos: res.AccountInfo.TrainVideos, } code := "xxx" if len(qres.PositionUsers) >= 1 { accountInfo.DepartmentName = qres.PositionUsers[0].DepartmentName code = secret.GetPositionCode(qres.PositionUsers[0].PositionName) } token, err := secret.CombineSecret(code, accountInfo.DepartmentName, res.Token) if err != nil { service.Error(c, e.Error, err) return } ruleUrlReq := rule.FindRuleByUrlRequest{ AccountID: accountInfo.ID, Type: "menu", Domain: accountInfo.Domain, Url: "/home", Method: "*", } ruleInfo, ruleErr := service.RuleProvider.FindUserRule(c, &ruleUrlReq) if ruleInfo.IsPass == true { jumpToWhere = "home" } if ruleErr != nil { service.Error(c, e.Error, ruleErr) return } resInfo := &union.Login{ Token: token, RefreshToken: res.RefreshToken, AccountInfo: accountInfo, JumpToWhere: jumpToWhere, } fmt.Println("是否相同:", res.IsSampleAddress, res.AccountInfo.NowLogId) if res.IsSampleAddress == false && res.AccountInfo.NowLogId != 0 { //登陆地址异常 url := fmt.Sprintf("https://erpapi.fontree.cn/off7524164487E?id=%d", res.AccountInfo.NowLogId) shortUrl, err := utils.CreateShortUrl(url) if err == nil { url = shortUrl } msgReq := account.SendCustomMsgRequest{ ID: res.AccountInfo.ID, TelNum: res.AccountInfo.TelNum, MId: 134802, SigNo: uint32(config.DefaultSignNo), } msgReq.Url = res.NowAddress + "|" + url fmt.Println("发送短信", msgReq) service.AccountProvider.SendCustomMsg(c, &msgReq) } service.Success(c, resInfo) return } // isOnlySiteAuth 检测相同帐号的状态 func isOnlySiteAuth(c *gin.Context, tel string) (bool, error) { //创建一个UserLoginService对象 var req account.SampleAccountRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { return false, err } userByTelRes, err := service.AccountProvider.UserByTel(c, &account.UserByTelRequest{Tel: tel}) if err != nil { return false, err } if userByTelRes == nil || userByTelRes.IsExist == false { return false, errors.New(e.ErrAccountNotExist) } if isHaveAuth(c, userByTelRes.Info.ID, e.AUthOnlySiteLogin, "button") == false { return false, nil } return true, nil } // SampleAccount 检测相同帐号的状态 func SampleAccount(c *gin.Context) { //创建一个UserLoginService对象 var req account.SampleAccountRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } if req.TelNum == "" { service.Error(c, e.InvalidParams, errors.New("no tel exist!")) return } req.From = e.LoginFromPC sampleAccountRes := &account.SampleAccountResponse{IsNowAlreadyLogin: false, Num: 0} isAuth, err := isOnlySiteAuth(c, req.TelNum) if err != nil { service.Error(c, e.InvalidParams, err) return } if isAuth == true { //没有唯一登录的权限 sampleAccountRes, err = service.AccountProvider.SampleAccount(context.Background(), &req) if err != nil { service.Error(c, e.Error, err) return } } service.Success(c, sampleAccountRes) return } // ListV2 列表 func ListV2(c *gin.Context) { //创建一个UserLoginService对象 var req account.ListV2Request var userIds []uint32 if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } if req.EndEnterDate != "" { req.EndEnterDate += " 23:59:59" } response := vo.PageResponseV2{ Count: 0, } res, err := service.AccountProvider.ListV2(context.Background(), &req) if err != nil { service.Error(c, e.Error, err) return } if res.Count <= 0 { service.Success(c, response) return } response.Count = res.Count for _, v := range res.Data { userIds = append(userIds, uint32(v.ID)) } //查询部门 puRequest := &position.UserInfosV2Request{IDs: userIds} puRes, err := service.PositionProvider.UserInfosV2(c, puRequest) if err != nil { service.Error(c, e.Error, err) return } if req.FatherDepartmentId != 0 { //父级节点 treeRes, err := auth.GetAllCompanyAuthTree() if err != nil { service.Error(c, e.Error, err) return } nodes := getNowList(treeRes.Nodes, req.FatherDepartmentId) fmt.Println("1---------------", nodes, err) idsMap := make(map[uint32]struct{}, len(nodes)) for _, v := range nodes { idsMap[v.ID] = struct{}{} } fmt.Println("1-------------------", idsMap) response.Data, err = serializer.UserV3(res, puRes, req.FatherDepartmentId, idsMap) if err != nil { service.Error(c, e.Error, err) return } } else { response.Data = serializer.UserV2(res, puRes, req.DepartmentId) } service.Success(c, response) return } // CheckBeforeRegister 插入前检测 func Face(c *gin.Context) { //创建一个UserLoginService对象 var req account.IsSamePersonRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } res, err := service.AccountProvider.IsSamePerson(c, &req) if err != nil { service.Error(c, e.Error, err) return } service.Success(c, res) return } // CheckBeforeRegister 插入前检测 func CheckBeforeRegister(c *gin.Context) { //创建一个UserLoginService对象 var req account.CheckBeforeRegisterRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } lang := c.Request.Header.Get("Accept-Language") tempContext := context.WithValue(c, constant.DubboCtxKey("attachment"), map[string]interface{}{"lang": lang}) res, err := service.AccountProvider.CheckBeforeRegister(tempContext, &req) if err != nil { service.Error(c, e.Error, err) return } service.Success(c, res) return } // BatchRemoveV2 用户删除 func BatchRemoveV2(c *gin.Context) { //创建一个UserLoginService对象 var req query.BatchRemoves if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } for _, v := range req.IDs { _, err := service.AccountProvider.Remove(context.Background(), &account.RemoveRequest{ID: uint64(v)}) if err != nil { service.Error(c, e.Error, err) return } //岗位删除 positionReq := &position.RemoveUserRequest{ ID: uint64(v), } _, err1 := service.PositionProvider.RemoveUser(c, positionReq) if err1 != nil { service.Error(c, e.Error, err1) return } } service.Success(c, struct{}{}) return } // RemoveV2 用户删除 func RemoveV2(c *gin.Context) { //创建一个UserLoginService对象 var req account.RemoveRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } _, err := service.AccountProvider.Remove(context.Background(), &req) if err != nil { service.Error(c, e.Error, err) return } //岗位删除 positionReq := &position.RemoveUserRequest{ ID: req.ID, } _, err1 := service.PositionProvider.RemoveUser(c, positionReq) if err1 != nil { service.Error(c, e.Error, err1) return } service.Success(c, struct{}{}) return } func InfoV2(c *gin.Context) { //创建一个UserLoginService对象 var req account.InfoRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } user, err := GetUserInfoById(c, req.ID, req.Domain) if err != nil { service.Error(c, e.InvalidParams, err) return } service.Success(c, user) return } // ResetPwd 用户更新信息 func ResetPwd(c *gin.Context) { //创建一个UserLoginService对象 var req query.BatchRemoves if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } userInfo, err := login.GetUserInfoFromCV2(c) if err != nil { service.NotLoginRes(c, err.Error()) return } for _, k := range req.IDs { var updateReq = account.UpdateRequest{ ID: uint64(k), Password: e.DEFAULT_PWD, Operator: &account.Operator{ ID: uint32(userInfo.ID), Name: "重置密码:" + userInfo.NickName, }, } _, err := service.AccountProvider.Update(context.Background(), &updateReq) if err != nil { service.Error(c, e.Error, err) return } } //账号服务 service.Success(c, struct{}{}) return } // UpdateV2 用户更新信息 func UpdateV2(c *gin.Context) { //创建一个UserLoginService对象 var req query.User if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } if req.NickName == "" || utf8.RuneCountInString(req.NickName) >= 20 { service.Error(c, e.InvalidParams, errors.New(e.GetMsg(e.ErrNickName))) return } userInfo := login.GetUserInfoFromC(c) //账号服务 var updateReq = account.UpdateRequest{ ID: req.ID, NickName: req.NickName, Password: req.Password, TelNum: req.TelNum, Avatar: req.Avatar, Status: req.Status, EnterDate: req.EnterDate, JobNum: req.JobNum, BirthDate: req.BirthDate, Sex: req.Sex, Title: req.Title, LeftDate: req.LeftDate, RecentImg: req.RecentImg, ICNum: req.ICNum, Operator: &account.Operator{ ID: uint32(userInfo.ID), Name: "人员管理:" + userInfo.NickName, }, } updateReq.Extend = &account.Extend{ JumpTo: req.Extend.JumpTo, Lang: req.Extend.Lang, CanScan: req.Extend.CanScan, ResolutionRatio: req.Extend.ResolutionRatio, } userObj, err := GetUserInfoById(c, req.ID, config.Domain) if err != nil { service.Error(c, e.InvalidParams, err) return } _, err = service.AccountProvider.Update(context.Background(), &updateReq) if err != nil { service.Error(c, e.Error, err) return } positionReq := getFormPositionReq(req, uint32(req.ID)) _, err = service.PositionProvider.BindUserV2(c, positionReq) if req.RecentImg != "" && len(userObj.Clocks) > 0 && (req.RecentImg != userObj.RecentImg || req.NickName != userObj.NickName || req.TelNum != userObj.TelNum || req.ICNum != userObj.ICNum) { var dataSet []turnstile.DeviceUserData var userId account.ClockUserDeviceBatch deviceNums := make(map[string]string) for _, i := range userObj.Clocks { data := turnstile.DeviceUserData{ JobNum: userObj.ID, RecentImg: req.RecentImg, DeviceNum: i.Device.DeviceNum, NickName: req.NickName, Phone: req.TelNum, DeviceName: i.Device.DeviceName, IcNum: req.ICNum, } dataSet = append(dataSet, data) } for _, i := range userObj.Clocks { deviceNums[i.Device.DeviceNum] = i.Device.DeviceName } //判断设备是否离线 oline := CheckDeviceIsOnline(deviceNums) if oline != "" { service.Error(c, e.Error, errors.New(oline)) return } //并发下发数据 err = ConcurrentUpdateDeviceUser(c, dataSet, 10) if err != nil { service.Error(c, e.Error, err) return } //更新绑定关系 userId.UserId = userObj.ID _, err = service.AccountProvider.UpdateDeviceRelevance(c, &userId) if err != nil { service.Error(c, e.Error, err) return } } service.Success(c, struct{}{}) } func UserRegistersV2(c *gin.Context, req query.User) (err error, res *account.RequestStatus) { if req.Avatar == "" { req.Avatar = "https://dci-file-new.bj.bcebos.com/fonchain-main/test/runtime/image/avatar/40/b8ed6fea-6662-416d-8bb3-1fd8a8197061.jpg" } userInfo := login.GetUserInfoFromC(c) //账号服务 registRequest := account.RegistRequest{ Domain: config.Domain, NickName: req.NickName, TelNum: req.TelNum, Password: req.Password, JobNum: req.JobNum, Status: req.Status, Avatar: req.Avatar, EnterDate: req.EnterDate, LeftDate: req.LeftDate, Extend: &account.Extend{JumpTo: "setting"}, RecentImg: req.RecentImg, Source: "", Operator: &account.Operator{ ID: uint32(userInfo.ID), Name: userInfo.NickName, }, } res, err = service.AccountProvider.Register(c, ®istRequest) if err != nil { return err, res } if len(req.DepPositions) <= 0 { return nil, res } //if len(req.DepPositions) > 0 && req.PositionUsers[0].DepartmentName != "" && req.PositionUsers[0].PositionName != "" { positionReq := getFormPositionReq(req, uint32(res.ID)) fmt.Println("推送数据positionReq", positionReq) s, err := json.Marshal(positionReq) fmt.Println("user_list", string(s)) _, err = service.PositionProvider.BindUserV2(c, positionReq) if err != nil { return err, nil } return err, res } func getFormPositionDepartmentReqV2(req query.User, userId uint32, controllerDepIds []uint) (*position.BindUserV2Request, error) { departmentIdMap := make(map[uint32]struct{}, len(controllerDepIds)) for _, v := range controllerDepIds { departmentIdMap[uint32(v)] = struct{}{} } // 获取老的全部岗位 oldAllPositionRes, err := service.PositionProvider.UserInfoV2(context.Background(), &position.CreateResponse{ID: uint64(userId)}) if err != nil { return nil, err } //岗位服务 绑定岗位 positionReq := &position.BindUserV2Request{ Domain: config.Domain, UserInfo: &position.UserInfo{ UserName: req.NickName, Avatar: req.Avatar, UserID: userId, }, } if len(req.DepPositions) > 0 { var deps []*position.DepPosition for _, v := range req.DepPositions { temp := &position.DepPosition{ ID: uint32(v.ID), Name: v.Name, IsLeader: v.IsLeader, } for _, v1 := range v.Positions { temp.Positions = append(temp.Positions, &position.PositionV2{ID: uint32(v1.ID), Name: v1.Name}) } deps = append(deps, temp) } positionReq.DepPositions = deps } for k, v := range oldAllPositionRes.DepPositions { //如果不在则增加 if _, exist := departmentIdMap[v.ID]; exist == false { positionReq.DepPositions = append(positionReq.DepPositions, oldAllPositionRes.DepPositions[k]) } } return positionReq, err } func getFormPositionReq(req query.User, userId uint32) *position.BindUserV2Request { //岗位服务 绑定岗位 positionReq := &position.BindUserV2Request{ Domain: config.Domain, UserInfo: &position.UserInfo{ UserName: req.NickName, Avatar: req.Avatar, UserID: userId, }, } if len(req.DepPositions) > 0 { var deps []*position.DepPosition for _, v := range req.DepPositions { temp := &position.DepPosition{ ID: uint32(v.ID), Name: v.Name, IsLeader: v.IsLeader, } for _, v1 := range v.Positions { temp.Positions = append(temp.Positions, &position.PositionV2{ID: uint32(v1.ID), Name: v1.Name}) } deps = append(deps, temp) } positionReq.DepPositions = deps } return positionReq } // MyInfo 当前用户详情 func MyInfo(c *gin.Context) { //创建一个UserLoginService对象 userInfo := login.GetUserInfoFromC(c) res, err := GetUserInfoByIdV2(c, userInfo.ID) if err != nil { service.Error(c, e.InvalidParams, err) return } service.Success(c, res) return } func DetailV2(c *gin.Context) { //创建一个UserLoginService对象 var req account.InfoRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } res, err := GetBaseUserInfoByIdV2(c, req.ID) if err != nil { service.Error(c, e.InvalidParams, err) return } service.Success(c, res) return } // BossDetailUpdate 展示当前用户的可以看到的部门列表下 当前人员的部门 func BossDetailUpdate(c *gin.Context) { //创建一个UserLoginService对象 var req query.User var departmentIds []uint userInfo := login.GetUserInfoFromC(c) if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } if req.NickName == "" || utf8.RuneCountInString(req.NickName) >= 20 { service.Error(c, e.InvalidParams, errors.New(e.GetMsg(e.ErrNickName))) return } departmentRes, err := service.DepartmentProvider.BaseList(c, &department.BaseAllRequest{UserID: uint32(userInfo.ID)}) if err != nil { service.Error(c, e.InvalidParams, err) return } for _, v := range departmentRes.Data { departmentIds = append(departmentIds, uint(v.ID)) } //账号服务 var updateReq = account.UpdateRequest{ ID: req.ID, NickName: req.NickName, Password: req.Password, TelNum: req.TelNum, Avatar: req.Avatar, Status: req.Status, EnterDate: req.EnterDate, JobNum: req.JobNum, BirthDate: req.BirthDate, Sex: req.Sex, Title: req.Title, LeftDate: req.LeftDate, RecentImg: req.RecentImg, ICNum: req.ICNum, Operator: &account.Operator{ ID: uint32(userInfo.ID), Name: "人员管理:" + userInfo.NickName, }, } updateReq.Extend = &account.Extend{ JumpTo: req.Extend.JumpTo, Lang: req.Extend.Lang, CanScan: req.Extend.CanScan, ResolutionRatio: req.Extend.ResolutionRatio, } userObj, err := GetUserInfoById(c, req.ID, config.Domain) if err != nil { service.Error(c, e.InvalidParams, err) return } //获取默认所有的部门岗位以及ID positionReq, err := getFormPositionDepartmentReqV2(req, uint32(req.ID), departmentIds) if err != nil { service.Error(c, e.Error, err) return } _, err = service.AccountProvider.Update(context.Background(), &updateReq) if err != nil { service.Error(c, e.Error, err) return } _, err = service.PositionProvider.BindUserV2(c, positionReq) //// 生成电子名片信息 //addChainRequest, err := GetECardInfo(req.ID, "系统设置-人员管理") //fmt.Println("系统设置-人员管理", addChainRequest) //if err != nil { // service.Error(c, e.InvalidParams, err) // return //} // //_, err = service.ECardProvider.AddChain(c, addChainRequest) //if err != nil { // service.Error(c, e.InvalidParams, err) // return //} if req.RecentImg != "" && len(userObj.Clocks) > 0 && (req.RecentImg != userObj.RecentImg || req.NickName != userObj.NickName || req.TelNum != userObj.TelNum || req.ICNum != userObj.ICNum) { var dataSet []turnstile.DeviceUserData var userId account.ClockUserDeviceBatch deviceNums := make(map[string]string) for _, i := range userObj.Clocks { data := turnstile.DeviceUserData{ JobNum: userObj.ID, RecentImg: req.RecentImg, DeviceNum: i.Device.DeviceNum, NickName: req.NickName, Phone: req.TelNum, DeviceName: i.Device.DeviceName, IcNum: req.ICNum, } dataSet = append(dataSet, data) } for _, i := range userObj.Clocks { deviceNums[i.Device.DeviceNum] = i.Device.DeviceName } //判断设备是否离线 oline := CheckDeviceIsOnline(deviceNums) if oline != "" { service.Error(c, e.Error, errors.New(oline)) return } //并发下发数据 err = ConcurrentUpdateDeviceUser(c, dataSet, 10) if err != nil { service.Error(c, e.Error, err) return } //更新绑定关系 userId.UserId = userObj.ID _, err = service.AccountProvider.UpdateDeviceRelevance(c, &userId) if err != nil { service.Error(c, e.Error, err) return } } service.Success(c, struct{}{}) } // DetailNowDepartmentV2 展示当前用户的可以看到的部门列表下 当前人员的部门 func DetailNowDepartmentV2(c *gin.Context) { //创建一个UserLoginService对象 var req account.InfoRequest var departmentIds []uint logger.Error("领导查看用户开始") if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } logger.Error("领导查看用户,请求", req) userInfo := login.GetUserInfoFromC(c) logger.Error("领导查看用户,信息", userInfo) fmt.Println("1-----------", userInfo) res, err := service.DepartmentProvider.BaseList(c, &department.BaseAllRequest{UserID: uint32(userInfo.ID)}) logger.Error("领导查看用户,返回", res, err) if err != nil { service.Error(c, e.InvalidParams, err) return } for _, v := range res.Data { departmentIds = append(departmentIds, uint(v.ID)) } logger.Error("领导查看用户,部门id", departmentIds) fmt.Println("1------------", departmentIds) userRes, err := GetBaseUserInfoByIdAndDepIDV2(c, req.ID, departmentIds) logger.Error("领导查看用户,返回", userRes, err) if err != nil { service.Error(c, e.InvalidParams, err) return } service.Success(c, userRes) return } // GetBaseUserInfoByIdAndDepIDV2 数据展示 仅仅展示可以看见的部门 func GetBaseUserInfoByIdAndDepIDV2(c *gin.Context, ID uint64, departmentIds []uint) (*user.BaseUserResponse, error) { info := &user.BaseUserResponse{} departmentIdMap := make(map[uint32]struct{}, len(departmentIds)) for _, v := range departmentIds { departmentIdMap[uint32(v)] = struct{}{} } req := account.InfoRequest{ ID: ID, } logger.Error("领导查看用户,数据展示", req) res, err := service.AccountProvider.Info(c, &req) if err != nil { return info, err } logger.Error("领导查看用户,数据展示请求", ID) puRes, err := service.PositionProvider.UserInfoV2(c, &position.CreateResponse{ID: ID}) logger.Error("领导查看用户,数据展示请求", puRes, err) if err != nil { return info, err } temp := &user.BaseUserResponse{ ID: res.Info.ID, JobNum: res.Info.JobNum, NickName: res.Info.NickName, TelNum: res.Info.TelNum, MailAccount: res.Info.MailAccount, Avatar: res.Info.Avatar, RecentImg: res.Info.RecentImg, Status: res.Info.Status, EnterDate: res.Info.EnterDate, UpdatedAt: res.Info.UpdatedAt, } if res.Info.Status == serializer.USERLEFT { //离职 手机号优化下 temp.TelNum = serializer.GetLeftToNormalStaffRealTel(temp.TelNum) } if res.Info.Operator != nil { temp.OperatorName = res.Info.Operator.Name } var canSeeDepPositions []*position.DepPosition if departmentIdMap != nil { for k, v := range puRes.DepPositions { if _, exist := departmentIdMap[v.ID]; exist { canSeeDepPositions = append(canSeeDepPositions, puRes.DepPositions[k]) } } } temp.DepPositions = canSeeDepPositions return temp, nil } func GetBaseUserInfoByIdV2(c *gin.Context, ID uint64) (*user.BaseUserResponse, error) { info := &user.BaseUserResponse{} req := account.InfoRequest{ ID: ID, } res, err := service.AccountProvider.Info(c, &req) if err != nil { return info, err } puRes, err := service.PositionProvider.UserInfoV2(c, &position.CreateResponse{ID: ID}) if err != nil { return info, err } temp := &user.BaseUserResponse{ ID: res.Info.ID, JobNum: res.Info.JobNum, NickName: res.Info.NickName, TelNum: res.Info.TelNum, MailAccount: res.Info.MailAccount, Avatar: res.Info.Avatar, RecentImg: res.Info.RecentImg, Status: res.Info.Status, EnterDate: res.Info.EnterDate, UpdatedAt: res.Info.UpdatedAt, } if res.Info.Operator != nil { temp.OperatorName = res.Info.Operator.Name } if res.Info.Status == serializer.USERLEFT { //离职 手机号优化下 temp.TelNum = serializer.GetLeftToNormalStaffRealTel(temp.TelNum) } temp.DepPositions = puRes.DepPositions return temp, nil } func GetUserInfoByIdV2(c *gin.Context, ID uint64) (user.UserResponse, error) { info := user.UserResponse{} req := account.InfoRequest{ ID: ID, } res, err := service.AccountProvider.Info(c, &req) if err != nil { return info, err } //获取用户的岗位信息 uReq := rule.RulesRequest{ AccountID: req.ID, } qres, err1 := service.RuleProvider.UserInfo(c, &uReq) if err1 != nil { return info, err1 } pUserInfo, err := service.PositionProvider.UserInfoV2(c, &position.CreateResponse{ID: req.ID}) if err != nil { return info, err1 } fReq := position.FindRuleByUserIdRequest{ UserId: ID, Urls: []string{e.AuthFinanceKey, e.AuthTrainingKey, e.AuthPublicizeKey, e.AuthWarehouseKey}, } fRes, err := service.PositionProvider.FindRuleByUserId(c, &fReq) if err != nil { return info, err1 } info = user.UserResponse{ ID: res.Info.ID, NickName: res.Info.NickName, TelNum: res.Info.TelNum, Avatar: res.Info.Avatar, Status: res.Info.Status, CreateAt: res.Info.CreateAt, IsAdmin: qres.IsAdmin, RealNameID: res.Info.RealNameID, RealName: res.Info.RealName, PositionUsers: qres.PositionUsers, DepartmentLeaders: qres.DepartmentLeaders, IsNeedChange: res.Info.IsNeedChange, WorkYear: res.Info.WorkYear, EnterDate: res.Info.EnterDate, DepartmentName: "", JumpTo: "", JobNum: res.Info.JobNum, BirthDate: res.Info.BirthDate, Sex: res.Info.Sex, Title: res.Info.Title, Age: res.Info.Age, IDNum: res.Info.IDNum, LeftDate: res.Info.LeftDate, RecentImg: res.Info.RecentImg, Clocks: res.Info.Clocks, MailAccount: res.Info.MailAccount, ICNum: res.Info.ICNum, Train: res.Info.Train, Certificate: res.Info.Certificate, TrainVideos: res.Info.TrainVideos, DepPositions: pUserInfo.DepPositions, } if len(qres.PositionUsers) >= 1 { positionsMap := make(map[uint64]struct{}, len(qres.PositionUsers)) info.DriverAuth = isHaveDriverAuth(c, ID, qres.PositionUsers[0].DepartmentId) info.DriverSupervisorAuth = isHaveDriverSupervisorAuth(c, ID, qres.PositionUsers[0].DepartmentId) for _, v := range qres.PositionUsers { if _, ok := positionsMap[v.PositionID]; !ok { info.UniquePositionName = append(info.UniquePositionName, v.PositionName) positionsMap[v.PositionID] = struct{}{} } } } if res.Info.Extend != nil { info.JumpTo = res.Info.Extend.JumpTo info.Extend = &user.Extend{ JumpTo: res.Info.Extend.JumpTo, Lang: res.Info.Extend.Lang, CanScan: res.Info.Extend.CanScan, ResolutionRatio: res.Info.Extend.ResolutionRatio, } } if len(qres.PositionUsers) >= 1 { info.DepartmentName = qres.PositionUsers[0].DepartmentName } if len(fRes.Rules) >= 1 { info.IdentityKey = fRes.Rules[0].Url } return info, nil } func getNowList(list []*department.Node, departmentId uint32) []*department.Node { tempNode := getSonNodes(list, departmentId) fmt.Println(tempNode) tempList := getList([]*department.Node{tempNode}) return tempList } func getSonNodes(list []*department.Node, departmentId uint32) *department.Node { for k, v := range list { if v.ID == departmentId { return list[k] } if len(v.Sons) > 0 { // 有儿子的话 tempNode := getSonNodes(list[k].Sons, departmentId) if tempNode != nil { //儿子匹配的话 return tempNode } } } return nil } func getList(list []*department.Node) []*department.Node { var temp []*department.Node for _, v := range list { temp = append(temp, &department.Node{ ID: v.ID, Name: v.Name, }) if len(v.Sons) > 0 { //没有儿子 tempNode := getList(v.Sons) if tempNode != nil { temp = append(temp, tempNode...) } } } return temp }