package oa_logic import ( "context" "dubbo.apache.org/dubbo-go/v3/common/logger" "errors" "fmt" "github.com/fonchain_enterprise/fonchain-main/api/account" "github.com/fonchain_enterprise/fonchain-main/api/oa" "github.com/fonchain_enterprise/fonchain-main/api/rule" "github.com/fonchain_enterprise/fonchain-main/pkg/e" "github.com/fonchain_enterprise/fonchain-main/pkg/model/oa_model" "github.com/fonchain_enterprise/fonchain-main/pkg/service" "github.com/fonchain_enterprise/fonchain-main/pkg/utils/holiday" "github.com/jinzhu/copier" "strconv" "strings" ) // VerifyDepartmentAndPositionAndUserForSave 给 保存 考勤组规则使用 func VerifyDepartmentAndPositionAndUserForSave(relationReq *oa.WorkingTimeTemplateRelation) (duplicatePersonals []*oa_model.DuplicatePersonnel, err error) { // 查询 已有的考勤组规则 workingTimeListReq := new(oa.WorkingTimeListReq) workingTimeListReq.Page = 1 workingTimeListReq.PageSize = 99999999 workingTimeListReq.InUse = e.InUseAndEffectiveDateIsNextDate workingTimeListReq.EffectiveDate = holiday.NextDate() workingTimes, workingTimeListErr := service.GrpcOAImpl.WorkingTimeList(context.Background(), workingTimeListReq) if workingTimeListErr != nil { logger.Errorf("查询考勤组规则失败:%s", workingTimeListErr.Error()) return nil, errors.New(e.ErrQueryWorkingTimeList) } hadWorkingTimeUser := make(map[uint64]*account.AccountInfo) for i := 0; i < len(workingTimes.Data); i++ { oldRelationErr := queryWorkingTimeUser(workingTimes.Data[i], hadWorkingTimeUser) if oldRelationErr != nil { return nil, oldRelationErr } } // 查询 新增的考勤规则 for i := 0; i < len(relationReq.AddPositions); i++ { fmt.Println("============================================= relationReq.AddPositions ============================================== ") fmt.Printf("relationReq.AddPositions[%d] = %v\n", i, relationReq.AddPositions[i]) fmt.Println("============================================= relationReq.AddPositions ============================================== ") duplicatePersonnel, newRelationErr := queryNewWorkingTimeUser(relationReq.AddPositions[i], hadWorkingTimeUser) if newRelationErr != nil { return nil, newRelationErr } if duplicatePersonnel != nil { duplicatePersonals = append(duplicatePersonals, duplicatePersonnel...) } } return duplicatePersonals, nil } func VerifyDepartmentAndPositionAndUser(relationReq *oa.WorkingTimeTemplateRelation) (duplicatePersonals []*oa_model.DuplicatePersonnel, err error) { // 查询 已有的考勤组规则 workingTimeListReq := new(oa.WorkingTimeListReq) workingTimeListReq.Page = 1 workingTimeListReq.PageSize = 99999999 workingTimeListReq.InUse = e.InUseAndEffectiveDateIsNextDate workingTimeListReq.EffectiveDate = holiday.NextDate() workingTimes, workingTimeListErr := service.GrpcOAImpl.WorkingTimeList(context.Background(), workingTimeListReq) if workingTimeListErr != nil { logger.Errorf("查询考勤组规则失败:%s", workingTimeListErr.Error()) return nil, errors.New(e.ErrQueryWorkingTimeList) } hadWorkingTimeUser := make(map[uint64]*account.AccountInfo) for i := 0; i < len(workingTimes.Data); i++ { oldRelationErr := queryWorkingTimeUser(workingTimes.Data[i], hadWorkingTimeUser) if oldRelationErr != nil { return nil, oldRelationErr } } // 查询 新增的考勤规则 for i := 0; i < len(relationReq.AddPositions); i++ { fmt.Println("============================================= relationReq.AddPositions ============================================== ") fmt.Printf("relationReq.AddPositions[%d] = %v\n", i, relationReq.AddPositions[i]) fmt.Println("============================================= relationReq.AddPositions ============================================== ") duplicatePersonnel, newRelationErr := queryNewWorkingTimeUser(relationReq.AddPositions[i], hadWorkingTimeUser) if newRelationErr != nil { return nil, newRelationErr } if duplicatePersonnel != nil { duplicatePersonals = append(duplicatePersonals, duplicatePersonnel...) } } return duplicatePersonals, nil } func queryWorkingTimeUser(workingTime *oa.WorkingTime, hadWorkingTimeUser map[uint64]*account.AccountInfo) error { queryAccount := new(account.ListV2Request) departmentId, _ := strconv.Atoi(workingTime.DepartmentUID) queryAccount.DepartmentId = uint32(departmentId) queryAccount.DepartmentName = workingTime.DepartmentName positionId, _ := strconv.Atoi(workingTime.PositionUID) queryAccount.PositionId = uint32(positionId) queryAccount.PositionName = workingTime.PositionName listRes, err := service.AccountProvider.ListV2(context.Background(), queryAccount) if err != nil { logger.Errorf("查询账户失败:%s", err.Error()) return errors.New(e.ErrorWorkingTimeFindUser) } for j := 0; j < len(listRes.Data); j++ { user := new(account.AccountInfo) _ = copier.CopyWithOption(&user, listRes.Data[j], copier.Option{DeepCopy: true}) user.Positions = append(user.Positions, &account.PositionUser{ DepartmentId: uint64(departmentId), DepartmentName: workingTime.DepartmentName, PositionID: uint64(positionId), PositionName: workingTime.PositionName, }) hadWorkingTimeUser[listRes.Data[j].ID] = user fmt.Println("============================================= hadWorkingTimeUser ============================================== ") fmt.Printf("hadWorkingTimeUser[%d] = %v\n", listRes.Data[j].ID, hadWorkingTimeUser[listRes.Data[j].ID]) fmt.Println("============================================= hadWorkingTimeUser ============================================== ") } return nil } func queryNewWorkingTimeUser(positions *oa.WorkingTimeTemplateRelationPosition, hadWorkingTimeUser map[uint64]*account.AccountInfo) ([]*oa_model.DuplicatePersonnel, error) { queryAccount := new(account.ListV2Request) departmentId, _ := strconv.Atoi(positions.DepartmentUID) queryAccount.DepartmentId = uint32(departmentId) queryAccount.DepartmentName = positions.DepartmentName positionId, _ := strconv.Atoi(positions.PositionUID) queryAccount.PositionId = uint32(positionId) queryAccount.PositionName = positions.PositionName listRes, err := service.AccountProvider.ListV2(context.Background(), queryAccount) if err != nil { logger.Errorf("查询账户失败:%s", err.Error()) return nil, errors.New(e.ErrorWorkingTimeFindUser) } if len(listRes.Data) <= 0 { return nil, nil } var res []*oa_model.DuplicatePersonnel for i := 0; i < len(listRes.Data); i++ { fmt.Println("========================================= listRes.Data ================================================") fmt.Printf("listRes.Data[%d] = %v\n", i, listRes.Data[i]) fmt.Println("========================================= listRes.Data ================================================") if v, ok := hadWorkingTimeUser[listRes.Data[i].ID]; ok { fmt.Printf("hadWorkingTimeUser[%d] = %v\n", v.ID, v) fmt.Println("========================================= listRes.Data ================================================") if v != nil && len(v.Positions) == 1 { res = append(res, &oa_model.DuplicatePersonnel{ Name: v.NickName, DepartmentName: v.Positions[0].PositionName, PositionName: v.Positions[0].DepartmentName, AddPositionName: positions.PositionName, }) } } } return res, nil } // VerifyNewRelationDepartmentAndPositionAndUserForSave 给 保存 考勤组规则使用 func VerifyNewRelationDepartmentAndPositionAndUserForSave(relationReq *oa.WorkingTimeTemplateRelation) (multipleDepartments []*oa_model.MultipleDepartments, err error) { addWorkingTimeUser := make(map[string][]*oa_model.PositionInfo) addPosition := make([]*oa.WorkingTimeTemplateRelationPosition, 0) if relationReq.AddPositions != nil { addPosition = append(addPosition, relationReq.AddPositions...) } else if relationReq.AddPositionsNow != nil { addPosition = append(addPosition, relationReq.AddPositionsNow...) } for i := 0; i < len(addPosition); i++ { err = queryUserByDepartmentAndPosition(addPosition[i], addWorkingTimeUser) if err != nil { logger.Errorf("查询部门岗位信息失败:%s", err.Error()) return nil, errors.New(e.ErrQueryPositionInfo) } } if len(addWorkingTimeUser) > 0 { fmt.Println("====================================================== queryUserByDepartmentAndPosition addWorkingTimeUser =======================") fmt.Printf("addWorkingTimeUser : %+v\n", addWorkingTimeUser) fmt.Println("====================================================== queryUserByDepartmentAndPosition addWorkingTimeUser =======================") } multipleDepartments = make([]*oa_model.MultipleDepartments, 0) for k, position := range addWorkingTimeUser { if len(position) > 1 { multipleDepartment := new(oa_model.MultipleDepartments) multipleDepartment.StaffUID, _ = strconv.ParseUint(strings.Split(k, ",")[0], 10, 64) multipleDepartment.Name = strings.Split(k, ",")[1] for j := 0; j < len(position); j++ { multipleDepartment.Positions = append(multipleDepartment.Positions, oa_model.PositionInfo{ DepartmentName: position[j].DepartmentName, DepartmentUID: position[j].DepartmentUID, PositionName: position[j].PositionName, PositionUID: position[j].PositionUID, }) } multipleDepartments = append(multipleDepartments, multipleDepartment) } } if len(multipleDepartments) > 0 { fmt.Println("====================================================== queryUserByDepartmentAndPosition multipleDepartments =======================") fmt.Printf("multipleDepartments : %+v\n", multipleDepartments) fmt.Println("====================================================== queryUserByDepartmentAndPosition multipleDepartments =======================") } return multipleDepartments, nil } func VerifyNewRelationDepartmentAndPositionAndUser(relationReq *oa.WorkingTimeTemplateRelation) (multipleDepartments []*oa_model.MultipleDepartments, err error) { addWorkingTimeUser := make(map[string][]*oa_model.PositionInfo) addPosition := make([]*oa.WorkingTimeTemplateRelationPosition, 0) if relationReq.AddPositions != nil { addPosition = append(addPosition, relationReq.AddPositions...) } else if relationReq.AddPositionsNow != nil { addPosition = append(addPosition, relationReq.AddPositionsNow...) } for i := 0; i < len(addPosition); i++ { err = queryUserByDepartmentAndPosition(addPosition[i], addWorkingTimeUser) if err != nil { logger.Errorf("查询部门岗位信息失败:%s", err.Error()) return nil, errors.New(e.ErrQueryPositionInfo) } } if len(addWorkingTimeUser) > 0 { fmt.Println("====================================================== queryUserByDepartmentAndPosition addWorkingTimeUser =======================") fmt.Printf("addWorkingTimeUser : %+v\n", addWorkingTimeUser) fmt.Println("====================================================== queryUserByDepartmentAndPosition addWorkingTimeUser =======================") } multipleDepartments = make([]*oa_model.MultipleDepartments, 0) for k, position := range addWorkingTimeUser { if len(position) > 1 { multipleDepartment := new(oa_model.MultipleDepartments) multipleDepartment.StaffUID, _ = strconv.ParseUint(strings.Split(k, ",")[0], 10, 64) multipleDepartment.Name = strings.Split(k, ",")[1] for j := 0; j < len(position); j++ { multipleDepartment.Positions = append(multipleDepartment.Positions, oa_model.PositionInfo{ DepartmentName: position[j].DepartmentName, DepartmentUID: position[j].DepartmentUID, PositionName: position[j].PositionName, PositionUID: position[j].PositionUID, }) } multipleDepartments = append(multipleDepartments, multipleDepartment) } } if len(multipleDepartments) > 0 { fmt.Println("====================================================== queryUserByDepartmentAndPosition multipleDepartments =======================") fmt.Printf("multipleDepartments : %+v\n", multipleDepartments) fmt.Println("====================================================== queryUserByDepartmentAndPosition multipleDepartments =======================") } return multipleDepartments, nil } func queryUserByDepartmentAndPosition(position *oa.WorkingTimeTemplateRelationPosition, addWorkingTimeUser map[string][]*oa_model.PositionInfo) error { // key ID +","+name queryAccount := new(account.ListV2Request) departmentId, _ := strconv.Atoi(position.DepartmentUID) queryAccount.DepartmentId = uint32(departmentId) queryAccount.DepartmentName = position.DepartmentName positionId, _ := strconv.Atoi(position.PositionUID) queryAccount.PositionId = uint32(positionId) queryAccount.PositionName = position.PositionName listRes, err := service.AccountProvider.ListV2(context.Background(), queryAccount) if err != nil { logger.Errorf("查询账户失败:%s", err.Error()) return errors.New(e.ErrorWorkingTimeFindUser) } for j := 0; j < len(listRes.Data); j++ { accountInfo := listRes.Data[j] fmt.Println("====================================================== queryUserByDepartmentAndPosition ListV2 =======================") fmt.Printf("listRes.Data : %+v\n", accountInfo) fmt.Println("====================================================== queryUserByDepartmentAndPosition ListV2 =======================") key := strings.Join([]string{strconv.FormatUint(accountInfo.ID, 10), accountInfo.NickName}, ",") fmt.Println("====================================================== queryUserByDepartmentAndPosition PositionInfo key=======================") fmt.Printf("addWorkingTimeUser key : %+v\n", key) fmt.Println("====================================================== queryUserByDepartmentAndPosition PositionInfo key=======================") if addWorkingTimeUser[key] == nil { addWorkingTimeUser[key] = make([]*oa_model.PositionInfo, 0) } userInfo, userInfoErr := service.RuleProvider.UserInfo(context.Background(), &rule.RulesRequest{AccountID: accountInfo.ID}) if userInfoErr != nil { logger.Errorf("查询账户失败:%s", userInfoErr.Error()) return errors.New(e.ErrorWorkingTimeFindUser) } for k := 0; k < len(userInfo.PositionUsers); k++ { addWorkingTimeUser[key] = append(addWorkingTimeUser[key], &oa_model.PositionInfo{ DepartmentName: userInfo.PositionUsers[k].DepartmentName, DepartmentUID: strconv.FormatUint(userInfo.PositionUsers[k].DepartmentId, 10), PositionName: userInfo.PositionUsers[k].PositionName, PositionUID: strconv.FormatUint(userInfo.PositionUsers[k].PositionID, 10), }) } //addWorkingTimeUser[key] = append(addWorkingTimeUser[key], &oa_model.PositionInfo{ // DepartmentName: position.DepartmentName, // DepartmentUID: position.DepartmentUID, // PositionName: position.PositionName, // PositionUID: position.PositionUID, //}) fmt.Println("====================================================== queryUserByDepartmentAndPosition PositionInfo for=======================") fmt.Printf("addWorkingTimeUser : %+v\n", addWorkingTimeUser) fmt.Println("====================================================== queryUserByDepartmentAndPosition PositionInfo for=======================") } fmt.Println("====================================================== queryUserByDepartmentAndPosition PositionInfo =======================") fmt.Printf("addWorkingTimeUser : %+v\n", addWorkingTimeUser) fmt.Println("====================================================== queryUserByDepartmentAndPosition PositionInfo =======================") return nil }