fonchain-fiee/pkg/service/account/account_v2.go
2025-02-19 14:24:15 +08:00

1232 lines
31 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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, &registRequest)
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
}