package approval import ( "context" "dubbo.apache.org/dubbo-go/v3/common/logger" "errors" "fmt" "github.com/360EntSecGroup-Skylar/excelize" "github.com/fonchain_enterprise/fonchain-main/api/account" api "github.com/fonchain_enterprise/fonchain-main/api/approval" artShowApi "github.com/fonchain_enterprise/fonchain-main/api/artShow" "github.com/fonchain_enterprise/fonchain-main/api/artistinfoArtshow" "github.com/fonchain_enterprise/fonchain-main/api/department" oaApi "github.com/fonchain_enterprise/fonchain-main/api/oa" "github.com/fonchain_enterprise/fonchain-main/api/position" "github.com/fonchain_enterprise/fonchain-main/pkg/cache" "github.com/fonchain_enterprise/fonchain-main/pkg/config" "github.com/fonchain_enterprise/fonchain-main/pkg/e" "github.com/fonchain_enterprise/fonchain-main/pkg/model" "github.com/fonchain_enterprise/fonchain-main/pkg/model/login" "github.com/fonchain_enterprise/fonchain-main/pkg/model/oa_model" "github.com/fonchain_enterprise/fonchain-main/pkg/model/vo" "github.com/fonchain_enterprise/fonchain-main/pkg/serializer" "github.com/fonchain_enterprise/fonchain-main/pkg/service" m "github.com/fonchain_enterprise/fonchain-main/pkg/service/approval/model" "github.com/fonchain_enterprise/fonchain-main/pkg/service/es_service/approval/logic" "github.com/getsentry/sentry-go" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "github.com/jinzhu/copier" "go.uber.org/zap" "sort" "strconv" "strings" "time" ) func CreateV2(c *gin.Context) { var req api.CreateRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, errors.New("参数获取错误")) return } userInfo := login.GetUserInfoFromC(c) // 创建审批 防止重复提交 lockKey := fmt.Sprintf("create_approval_%v_%v", userInfo.ID, req.Type) reply := cache.RedisClient.SetNX(lockKey, 0, 10*time.Second) if !reply.Val() { service.Error(c, e.Error, nil, e.ErrorCreateApproval) return } //提交人 req.SubmitterName = userInfo.NickName req.SubmitterID = userInfo.ID fmt.Println("====================提交前处理逻辑=========================") // 提交之前的逻辑处理 err := createBefore(userInfo, &req) if err != nil { service.Error(c, e.Error, err) return } fmt.Println("====================获取审批人=========================") approvalAndCopy, err := makeApprovalAndUser(userInfo, &req) if err != nil { service.Error(c, e.Error, err) return } req.ApprovalUsers = make([]*api.ApprovalUser, 0) req.CopyUsers = make([]*api.CopyUser, 0) req.ApprovalUsers = approvalAndCopy.ApprovalUsers req.CopyUsers = approvalAndCopy.CopyUsers fmt.Println("____________________ 打印 请求参数 CreateV2 createRequest 1 ________________________") fmt.Printf("CreateV2 createRequest : %+v\n", req) fmt.Println("____________________ 打印 请求参数 CreateV2 createRequest 1 ________________________") res, err := service.ApprovalProvider.Create(c, &req) if err != nil { service.Error(c, e.Error, err) return } fmt.Println("====================创建后=========================") // 提交之后的逻辑处理 err = createAfter(c, userInfo, &req, res) if err != nil { service.Error(c, e.Error, err) return } createReq := api.DetailRequest{ID: res.ID, Domain: req.Domain} createDetail, detailErr := service.ApprovalProvider.Detail(c, &createReq) if detailErr != nil { service.Error(c, e.Error, err) } //创建时推送给第一个审批人 err = service.SendAppMessage("审批通知", "您有一条"+createDetail.TypeName+"审批待处理,点击查看详情 >", createDetail.NowUserId, createDetail.ID, "approval") if err != nil { fmt.Println("==============APP推送失败=====================") fmt.Println(err) } service.Success(c, res) } // 创建 审批之前 要处理的逻辑 func createBefore(userInfo login.Info, req *api.CreateRequest) (err error) { if strings.Contains(req.Type, "turnover") { reqList := &api.ListRequest{} reqList.Domain = req.Domain reqList.Type = "turnover" reqList.UserID = userInfo.ID reqList.Status = 2 submitRes2, err := service.ApprovalProvider.MySubmit(context.Background(), reqList) if err != nil { return errors.New("查询离职申请失败") } reqList.Status = 1 submitRes1, err := service.ApprovalProvider.MySubmit(context.Background(), reqList) if err != nil { return errors.New("查询离职申请失败") } reqList.Status = 6 submitRes3, err := service.ApprovalProvider.MySubmit(context.Background(), reqList) if err != nil { return errors.New("查询离职申请失败") } if len(submitRes1.Data) > 0 || len(submitRes2.Data) > 0 || len(submitRes3.Data) > 0 { return errors.New("用户已提交过离职申请") } } if strings.Contains(req.Type, "handover") { reqList := &api.ListRequest{} reqList.Domain = req.Domain reqList.Type = "handover" reqList.UserID = userInfo.ID reqList.Status = 2 submitRes2, err := service.ApprovalProvider.MySubmit(context.Background(), reqList) if err != nil { return errors.New("查询离职交接失败") } reqList.Status = 1 submitRes1, err := service.ApprovalProvider.MySubmit(context.Background(), reqList) if err != nil { return errors.New("查询离职交接失败") } reqList.Status = 6 submitRes3, err := service.ApprovalProvider.MySubmit(context.Background(), reqList) if err != nil { return errors.New("查询离职交接失败") } if len(submitRes1.Data) > 0 || len(submitRes2.Data) > 0 || len(submitRes3.Data) > 0 { return errors.New("用户已提交过离职交接") } } if req.Type == oa_model.TypeGoOut { if req.ApprovalOA.GoOut.Hours == 0 { return errors.New(e.ErrorTimeIsZero) } } if req.Type == oa_model.TypeBusinessTrip { if req.ApprovalOA.BusinessTrip.TotalDays == 0 { return errors.New(e.ErrorTimeIsZero) } } if req.Type == oa_model.TypeMakeUp { err = CheckMakeUpApplyApproval(req, userInfo) if err != nil { //service.Error(c, e.Error, err) return err } } if req.Type == oa_model.TypeOverTime { err = CheckOverTimeApplyApproval(req, userInfo) if err != nil { return } } if req.Type == oa_model.TypeOutWork { if req.ApprovalOA.OutWork.Hours == 0 { return errors.New(e.ErrorTimeIsZero) } err = CheckLeaveTime(req, userInfo) if err != nil { //service.Error(c, e.Error, err) return err } err = CheckOutWorkTime(req) if err != nil { //service.Error(c, e.Error, err) return err } } if oa_model.LeaveApplyMap[req.Type] != "" { if (req.ApprovalOA.Leave != nil && req.ApprovalOA.Leave.Hours == 0 && req.ApprovalOA.Leave.Days == 0) || (req.ApprovalOA.OverTime != nil && req.ApprovalOA.OverTime.Hours == 0) { return errors.New(e.ErrorTimeIsZero) } err = CheckLeaveTime(req, userInfo) if err != nil { //service.Error(c, e.Error, err) return err } if oa_model.LeaveApplyMap[req.Type] != "" && req.Type != oa_model.TypeOverTime && req.Type != oa_model.TypeLeave { err = CheckLeaveApproval(req, userInfo) if err != nil { //service.Error(c, e.Error, err) return err } } } if oa_model.LeaveBalanceApplyMap[req.Type] != "" { err = CheckLeaveApply(req, userInfo) if err != nil { //service.Error(c, e.Error, err) return err } } if strings.Contains(req.Type, "employ") { if req.Employ.ResumeID != "" { resumeID, _ := strconv.ParseInt(req.Employ.ResumeID, 10, 64) err = resumeHireJudge(userInfo, resumeID) if err != nil { //service.Error(c, e.Error, err) return err } } } if (req.Type == "exhibition" || req.Type == "artExhibitionReward") && req.Exhibition != nil { showMap := make(map[string]string) for _, exhibition := range req.Exhibition.ApprovalExhibitions { if _, ok := showMap[exhibition.PackageID]; !ok { showMap[exhibition.PackageID] = exhibition.PackageName } else { return errors.New("请勿提交重复的画展包") } } } if req.Type == oa_model.TypeBusinessTrip { err = CheckBusinessTripTime(req, userInfo) if err != nil { return err } } if req.Type == oa_model.TypeGoOut { err = CheckLeaveTime(req, userInfo) if err != nil { return err } } return nil } // 创建 审批之后 要处理的逻辑 func createAfter(c *gin.Context, userInfo login.Info, req *api.CreateRequest, res *api.ApprovalResponse) (err error) { // 同步至 es go func() { fmt.Println("同步至 es ") // 查询 审批状态已经 更新的 审批信息 createReq := api.DetailRequest{ID: res.ID, Domain: req.Domain} createDetail, detailErr := service.ApprovalProvider.Detail(c, &createReq) if detailErr != nil { zap.L().Error("同步至 es 查询审批信息失败", zap.Error(detailErr)) //return } fmt.Println("============================== 查询 审批 ========================") fmt.Printf("approval detail %+v\n", createDetail) fmt.Println("============================== 查询 审批 ========================") // 同步至 es createErr := logic.CreateIndexApprovalDoc(config.ApprovalIndex, createDetail) if createErr != nil { zap.L().Error("同步至 es 失败 插入 ", zap.Error(createErr)) //return } fmt.Println("同步至 es 查询审批信息成功 ") }() //此处同步到画展包的数据 if req.Type == "exhibition" { applyId, err := synToArtShow(c, req, res) if err != nil { //service.Error(c, e.Error, err) return err } upReq := &api.UpdateEhApplyIDRequest{ ApplyId: applyId, ApprovalID: res.ID, } _, upErr := service.ApprovalProvider.UpdateExhibitionApplyID(c, upReq) if upErr != nil { //service.Error(c, e.Error, err) return upErr } } fmt.Println("============================== es before 0 ========================") // 同步 oa 审批到 oa if e.TypeMap[req.Type] == "oa" { fmt.Println("同步 oa系统 ") // 查询 审批状态已经 更新的 审批信息 createReq := api.DetailRequest{ID: res.ID, Domain: req.Domain} createDetail, detailErr := service.ApprovalProvider.Detail(c, &createReq) if detailErr != nil { //service.Error(c, e.Error, err) return detailErr } oaRes, err := SyncApprovalToOA(createDetail) if err != nil { //service.Error(c, e.Error, err) return err } fmt.Println("更新 oa系统 UUID ") // 获取到 OA审批的 UUID 更新 approvalOA 中的 UUID updateUUID := &api.UpdateApprovalOAUUIDReq{ UUID: oaRes.ID, // OA 返回 ApplyType: req.Type, ApprovalID: res.ID, // approval 返回 } _, updateUUIDErr := service.ApprovalProvider.UpdateApprovalOAUUID(context.Background(), updateUUID) if updateUUIDErr != nil { fmt.Printf("updateUUIDErr %+v\n", updateUUIDErr) //service.Error(c, e.Error, err) return updateUUIDErr } fmt.Println("更新 oa系统 UUID 成功 ") //更新假期余额数据 if req.Type == oa_model.TypeAnnualLeave || req.Type == oa_model.TypeParentalLeave || req.Type == oa_model.TypeNursingLeave { if len(req.ApprovalOA.Leave.ApplyTimes) == 0 { return errors.New("获取开始日期失败") } date, _ := time.Parse("2006-01-02", req.ApprovalOA.Leave.ApplyTimes[0].Date) year := int32(date.Year()) _, err = service.GrpcOAImpl.ModifyTheLeaveBalance(context.Background(), &oaApi.ModifyTheLeaveBalanceReq{ StaffUid: req.SubmitterID, LeaveType: req.Type, Movement: 2, Year: year, Days: req.ApprovalOA.Leave.Days, }) if err != nil { fmt.Printf("更新假勤余额失败---%v", err) } //return err } } fmt.Println("============================== es before 1 ========================") // 人才招聘 if strings.Contains(req.Type, "staffSupply") { err = createPostApprove(c, userInfo, res, req.DepartmentID) if err != nil { //service.Error(c, e.Error, err) return err } } fmt.Println("============================== es before 2 ========================") if strings.Contains(req.Type, "employ") { if req.Employ.ResumeID != "" { err = createOfferApprove(c, userInfo, res, req.DepartmentID) if err != nil { //service.Error(c, e.Error, err) return err } } } //提交离职后扣除年假 if strings.Contains(req.Type, "turnover") { UpdateDeductAnnualLeave(req.ApprovalOA.Turnover, userInfo) } fmt.Println("============================== es before 3 ========================") return nil } func MakeApprovalAndUserV2(c *gin.Context) { var req api.CreateRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, err) return } res := new(api.ApprovalAndCopy) userInfo := login.GetUserInfoFromC(c) if len(userInfo.PositionUsers) > 1 && req.DepartmentID == 0 { service.Error(c, e.Error, errors.New(e.ErrorNotSelectDepartment)) return } res, err := makeApprovalAndUser(userInfo, &req) if err != nil { service.Error(c, e.Error, err) return } service.Success(c, res) } func makeApprovalAndUser(userInfo login.Info, req *api.CreateRequest) (res *api.ApprovalAndCopy, err error) { res = new(api.ApprovalAndCopy) // 提交人 req.SubmitterName = userInfo.NickName req.SubmitterID = userInfo.ID // 查看 审批类型 的 审批人 以及 抄送人 settingReq := new(api.DetailSettingRequest) settingReq.KeyWord = req.Type if req.Domain == "" { return nil, errors.New("domain为空(必传)") } else { settingReq.Domain = req.Domain } settingRes, err := service.ApprovalProvider.DetailSetting(context.Background(), settingReq) if err != nil { //service.Error(c, e.Error, errors.New(e.ErrorApprovalUser)) return nil, errors.New(e.ErrorApprovalUser) } fmt.Println("============================================= 获取 审批 审批人 ===============================================") fmt.Printf("settingRes %+v\n", settingRes) fmt.Println("=========================================================================================================================") // 判断是否是 特殊的 提交人 isSpecialSubmitter := false if result := cache.RedisClient.Get(fmt.Sprintf(cache.SpecialSubmitter+"_%v", userInfo.TelNum)); result.Err() == nil && result.Val() == "1" { isSpecialSubmitter = true } if m.GetOaType(req.Type) != "" { //OA审批 fmt.Println("============================================= 进入 OA审批 ===============================================") if !isSpecialSubmitter { //耿阳接口的doamin是环境,写死 departmentDomain := "fontree" approvaluser, isLeader := DepartmentBossesV3(new(gin.Context), departmentDomain, req.DepartmentID, req.SubmitterID) if len(approvaluser) > 0 { for index, user := range approvaluser { user.Level = uint64(index + 1) user.Tier = settingRes.ApprovalUsers[0].Tier user.IsDirect = settingRes.ApprovalUsers[0].IsDirect user.Signature = "AND" user.IsLive = settingRes.ApprovalUsers[0].IsLive user.BalanceFillIn = settingRes.ApprovalUsers[0].BalanceFillIn } } req.ApprovalUsers = approvaluser req.IsLeader = isLeader fmt.Printf("req approvalUsers %+v\n", req.ApprovalUsers) fmt.Printf("req leader %+v\n", req.IsLeader) } res.ApprovalUsers, res.CopyUsers = buildApprovalUsers(userInfo, req, settingRes.ApprovalUsers, settingRes.CopyUsers, settingRes) fmt.Println("============================================= OA审批 获取 审批 审批人 剔除 离职 审批人之前 ===============================================") fmt.Printf("res approvalUsers %+v\n", res.ApprovalUsers) fmt.Printf("res CopyUsers %+v\n", res.CopyUsers) fmt.Println("=============================================================================================================================") } else if strings.Contains(req.Type, "staffSupply") || strings.Contains(req.Type, "position") { if !isSpecialSubmitter { //耿阳接口的doamin是环境,写死 departmentDomain := "fontree" approvaluser, isLeader := DepartmentBossesV3(new(gin.Context), departmentDomain, req.DepartmentID, req.SubmitterID) if len(approvaluser) > 0 { for index, user := range approvaluser { user.Level = uint64(index + 1) user.Tier = settingRes.ApprovalUsers[0].Tier user.IsDirect = settingRes.ApprovalUsers[0].IsDirect user.Signature = "AND" user.IsLive = settingRes.ApprovalUsers[0].IsLive user.BalanceFillIn = settingRes.ApprovalUsers[0].BalanceFillIn } } req.ApprovalUsers = approvaluser req.IsLeader = isLeader fmt.Printf("req approvalUsers %+v\n", req.ApprovalUsers) fmt.Printf("req leader %+v\n", req.IsLeader) } res.ApprovalUsers, res.CopyUsers = buildApprovalUsers(userInfo, req, settingRes.ApprovalUsers, settingRes.CopyUsers, settingRes) fmt.Println("============================================= 进入 人员增补审批 ===============================================") //去重 //原逻辑:把直属领导追加到审批人后面,去掉前面的重复数据 //var result []*api.ApprovalUser //approvalUserMap := make(map[uint64]*api.ApprovalUser) // //for _, userReq := range req.ApprovalUsers { // approvalUserMap[userReq.ID] = userReq //} //for _, userRes := range res.ApprovalUsers { // if _, exists := approvalUserMap[userRes.ID]; !exists { // result = append(result, userRes) // } //} //res.ApprovalUsers = result //res.ApprovalUsers = append(res.ApprovalUsers, req.ApprovalUsers...) //for index, ret := range res.ApprovalUsers { // ret.Level = uint64(index + 1) // //} fmt.Printf("把审批人追加到直属领导后面 %+v\n", res.ApprovalUsers) } else { fmt.Println("============================================= 进入 其他审批 ===============================================") /*组装 从配置中获取的 审批人*/ // 获取任命审批的 审批人 req.ApprovalUsers = make([]*api.ApprovalUser, 0) //approvalUser, err := buildPromotionApprovalUser(req) //if err != nil { // return nil, err //} // //if approvalUser != nil { // req.ApprovalUsers = approvalUser //} // 直属 和 指定部门 需要去查询 account res.ApprovalUsers, res.CopyUsers = buildApprovalUsers(userInfo, req, settingRes.ApprovalUsers, settingRes.CopyUsers, settingRes) if len(res.ApprovalUsers) == 0 { return nil, errors.New(e.ErrorQueryDirectOrDepartmentApprovalUser) } } // 剔除 离职 的 审批人 res.ApprovalUsers, err = verifyApprovalUserIsActive(res.ApprovalUsers) if err != nil { //service.Error(c, e.Error, err) return nil, err } fmt.Println("============================================= OA审批 获取 审批 审批人 剔除 离职 审批人之后 ===============================================") fmt.Printf("res approvalUsers %+v\n", res.ApprovalUsers) fmt.Printf("res CopyUsers %+v\n", res.CopyUsers) fmt.Println("=============================================================================================================================") return res, nil } // buildApprovalUsers 组装 审批流程 func buildApprovalUsers(userInfo login.Info, req *api.CreateRequest, approvalUsers []*api.ApprovalUser, inCopyUsers []*api.CopyUser, setting *api.SettingRequest) (retApprovalUsers []*api.ApprovalUser, copyUsers []*api.CopyUser) { fmt.Println("============ 获取 审批 审批人 组装前 ==============") fmt.Printf("approvalUsers %+v\n", approvalUsers) fmt.Println("============ 获取 审批 审批人 组装前 ==============") fmt.Println() approvalUsers = MakeRetApprovalUser(req, approvalUsers) fmt.Println("============ 获取 审批 审批人 根据 OA 请假 天数 筛选 审判人 后 ==============") fmt.Printf("approvalUsers %+v\n", approvalUsers) fmt.Println("============ 获取 审批 审批人 根据 OA 请假 天数 筛选 审判人 后 ==============") fmt.Println() var currentLevel uint64 = 0 // 当前审批节点 //var approvalUserLevel uint64 = 0 // 审批人节点 retApprovalUsers = make([]*api.ApprovalUser, 0) //signalUsers := make([]*api.ApprovalUser, 0) //指定人员 retApprovalUsers = append(retApprovalUsers, req.ApprovalUsers...) if len(retApprovalUsers) > 0 { currentLevel = uint64(len(retApprovalUsers)) } copyUsers = make([]*api.CopyUser, 0) retApprovalUsersMap := make(map[uint64]*api.ApprovalUser) copyUsersMap := make(map[uint64]*api.CopyUser) for _, user := range req.ApprovalUsers { retApprovalUsersMap[user.ID] = user } for i := 0; i < len(approvalUsers); i++ { // 判断当前审批节点是否是指定人员 如果不是指定人员 则需要查询 department 获取审批人 if approvalUsers[i].ID == 0 { currentLevel++ if approvalUsers[i].DepartmentUID != "" && approvalUsers[i].PositionUID != "" { listReq := new(account.ListV2Request) departmentId, err := strconv.ParseUint(approvalUsers[i].DepartmentUID, 0, 64) positionId, err := strconv.ParseUint(approvalUsers[i].PositionUID, 0, 64) if err != nil { return nil, nil } listReq.DepartmentId = uint32(departmentId) listReq.PositionId = uint32(positionId) // 查询部门下的审批人 listRes, err := service.AccountProvider.ListV2(context.Background(), listReq) if err != nil { return nil, nil } fmt.Println("============ 获取 审批 指定部门 审批人 ==============") fmt.Printf("listRes %+v\n", listRes) fmt.Println("============ 获取 审批 指定部门 审批人 ==============") fmt.Println() for j := 0; j < len(listRes.Data); j++ { if listRes.Data[j].ID == userInfo.ID && req.Type != "nursingLeaveApply" && req.Type != "parentalLeaveApply" { if j == len(listRes.Data)-1 { currentLevel-- } continue } if retApprovalUsersMap[listRes.Data[j].ID] != nil { //if req.Type == "nursingLeaveApply" || req.Type == "parentalLeaveApply" { // if req.Domain != "8fa1d8936af32f97aae832a3224bc93d" { // for _, user := range retApprovalUsers { // if user.ID == listRes.Data[j].ID { // retApprovalUsers = DeleteApprovalUser(listRes.Data[j].ID, retApprovalUsers) // } // } // } else { // if j == len(listRes.Data)-1 { // currentLevel-- // } // continue // } // //} else { if j == len(listRes.Data)-1 { currentLevel-- } continue //} } approvalUser := new(api.ApprovalUser) approvalUser.ID = listRes.Data[j].ID approvalUser.Name = listRes.Data[j].NickName //指定部门有多个审批人,会签时等级++ if approvalUsers[i].Signature == "AND" && j > 0 { currentLevel++ } approvalUser.Level = currentLevel approvalUser.Signature = approvalUsers[i].Signature approvalUser.Type = approvalUsers[i].Type approvalUser.Tier = approvalUsers[i].Tier approvalUser.BalanceFillIn = approvalUsers[i].BalanceFillIn retApprovalUsers = append(retApprovalUsers, approvalUser) retApprovalUsersMap[listRes.Data[j].ID] = approvalUser } } else if approvalUsers[i].IsDirect == 1 { myBossReq := new(department.MyBossesReq) if strings.Contains(req.Type, "employ") { departmentId, _ := strconv.ParseUint(req.Employ.DepartmentId, 10, 32) myBossReq.DepartmentId = uint32(departmentId) } else { myBossReq.UserId = uint32(userInfo.ID) myBossReq.DepartmentId = uint32(req.DepartmentID) } myBossReq.Level = uint32(approvalUsers[i].Level) if approvalUsers[i].IsDesignate == 1 { myBossReq.IsDesignate = true } else { myBossReq.IsDesignate = false } fmt.Println("============ 获取 审批 直属领导 审批人 请求参数 ==============") fmt.Printf("myBossReq %+v\n", myBossReq) fmt.Println("============ 获取 审批 直属领导 审批人 请求参数 ==============") myBossRes, err := service.DepartmentProvider.MyBosses(context.Background(), myBossReq) if err != nil { return nil, nil } //if req.Type == "position" && len(myBossRes.List) > 1 { // myBossRes.List = myBossRes.List[:1] //} fmt.Println("============ 获取 审批 直属领导 审批人 ==============") fmt.Printf("myBossRes %+v\n", myBossRes) fmt.Println("============ 获取 审批 直属领导 审批人 ==============") fmt.Println() flag := 0 for j := 0; j < len(myBossRes.List); j++ { if j > 0 && approvalUsers[i].Signature == "OR" { currentLevel++ } for k := 0; k < len(myBossRes.List[j].Bosses); k++ { if myBossRes.List[j].Bosses[k].ID == uint32(userInfo.ID) { if j > 0 && approvalUsers[i].Signature == "OR" { currentLevel-- } else if j == 0 { currentLevel-- } if k > 0 { currentLevel++ } continue } if retApprovalUsersMap[uint64(myBossRes.List[j].Bosses[k].ID)] != nil { if j > 0 && approvalUsers[i].Signature == "OR" { currentLevel-- } else if j == 0 { currentLevel-- } if k > 0 { currentLevel++ } continue } approvalUser := new(api.ApprovalUser) approvalUser.ID = uint64(myBossRes.List[j].Bosses[k].ID) approvalUser.Name = myBossRes.List[j].Bosses[k].Name //直属有多个审批人,会签时等级++ if approvalUsers[i].Signature == "AND" && flag > 0 { currentLevel++ } approvalUser.Level = currentLevel fmt.Println("========================currentLevel=========================================") fmt.Println(approvalUser.Level) fmt.Println(currentLevel) approvalUser.IsDirect = approvalUsers[i].IsDirect approvalUser.Signature = approvalUsers[i].Signature approvalUser.Type = approvalUsers[i].Type approvalUser.BalanceFillIn = approvalUsers[i].BalanceFillIn approvalUser.IsDesignate = approvalUsers[i].IsDesignate approvalUser.Tier = approvalUsers[i].Tier retApprovalUsers = append(retApprovalUsers, approvalUser) retApprovalUsersMap[uint64(myBossRes.List[j].Bosses[k].ID)] = approvalUser flag++ } if myBossRes.List[j].Bosses == nil { currentLevel-- } } //currentLevel = currentLevel + uint64(len(myBossRes.List)-1) } } else { currentLevel++ if approvalUsers[i].ID == userInfo.ID { currentLevel-- continue } if retApprovalUsersMap[approvalUsers[i].ID] != nil { currentLevel-- continue } approvalUser := new(api.ApprovalUser) approvalUser.ID = approvalUsers[i].ID approvalUser.Name = approvalUsers[i].Name if len(retApprovalUsers) > 0 { if approvalUsers[i].Signature == "OR" && retApprovalUsers[len(retApprovalUsers)-1].Type == "designatedPersonnel" && retApprovalUsers[len(retApprovalUsers)-1].Signature == "OR" && approvalUsers[i].Tier == retApprovalUsers[len(retApprovalUsers)-1].Tier { approvalUser.Level = retApprovalUsers[len(retApprovalUsers)-1].Level currentLevel-- } else if approvalUsers[i].Signature == "OR" && retApprovalUsers[len(retApprovalUsers)-1].Type == "designatedPersonnel" && retApprovalUsers[len(retApprovalUsers)-1].Signature != "OR" { approvalUser.Level = retApprovalUsers[len(retApprovalUsers)-1].Level + 1 } else { approvalUser.Level = currentLevel } } else { approvalUser.Level = currentLevel } approvalUser.Signature = approvalUsers[i].Signature approvalUser.IsDesignate = approvalUsers[i].IsDesignate approvalUser.IsDirect = approvalUsers[i].IsDirect approvalUser.Tier = approvalUsers[i].Tier if approvalUsers[i].Type == "" { approvalUser.Type = e.AndSignType } else { approvalUser.Type = approvalUsers[i].Type } retApprovalUsers = append(retApprovalUsers, approvalUser) retApprovalUsersMap[approvalUsers[i].ID] = approvalUser } } //OA // 病假 事假 // 又要改,完犊子了 if m.GetOaType(req.Type) != "" { if req.Type == "nursingLeaveApply" || req.Type == "parentalLeaveApply" { //去重,究极特殊处理,我人晕了 //if req.IsLeader { // retApprovalUsers = GetCombineOaApproveUsers(setting, retApprovalUsers) //} else { var result []*api.ApprovalUser approvalUserMap := make(map[uint64]*api.ApprovalUser) for _, userReq := range setting.OaApprovalUsers { approvalUserMap[userReq.ID] = userReq } for _, userRes := range retApprovalUsers { if _, exists := approvalUserMap[userRes.ID]; !exists { result = append(result, userRes) } } retApprovalUsers = result retApprovalUsers = append(retApprovalUsers, setting.OaApprovalUsers...) //var tmpAppUser *api.ApprovalUser //tmpAppUser = retApprovalUsers[len(retApprovalUsers)-1] //retApprovalUsers[len(retApprovalUsers)-1] = retApprovalUsers[len(retApprovalUsers)-2] //retApprovalUsers[len(retApprovalUsers)-2] = tmpAppUser //} //retApprovalUsers = GetCombineOaApproveUsers(setting, retApprovalUsers) //retApprovalUsers[len(retApprovalUsers)-2].BalanceFillIn = 0 inCopyUsers = GetCombineOaCopyUsers(setting, inCopyUsers) //新逻辑:加班/外勤 丧假 陪产假 婚假 育儿假 独生子女护理假 哺乳假 孕检假 年假 调休 出差 外出=====》直属1级 } else if req.Type == "overTime" || req.Type == "makeUp" || req.Type == "breastFeedingLeave" || req.Type == "dayOff" { //if in.IsLeader { retApprovalUsers = GetCombineOaApproveUsers(setting, retApprovalUsers) if len(retApprovalUsers) > 1 && req.Domain != "8fa1d8936af32f97aae832a3224bc93d" { for _, user := range retApprovalUsers[1:] { delete(retApprovalUsersMap, user.ID) } retApprovalUsers = retApprovalUsers[:1] } } } // 抄送人,岗位与人员混合,老子真晕了 // 无特殊处理,与设置保持一致 for _, copyUser := range inCopyUsers { if copyUser.ID == 0 { //指定岗位 if copyUser.DepartmentUID != "" && copyUser.PositionUID != "" { listReq := new(account.ListV2Request) departmentId, err := strconv.ParseUint(copyUser.DepartmentUID, 0, 64) positionId, err := strconv.ParseUint(copyUser.PositionUID, 0, 64) if err != nil { return nil, nil } listReq.DepartmentId = uint32(departmentId) listReq.PositionId = uint32(positionId) // 查询部门下的审批人 listRes, err := service.AccountProvider.ListV2(context.Background(), listReq) if err != nil { return nil, nil } fmt.Println("============ 获取 审批 指定部门 抄送人 ==============") fmt.Printf("listRes %+v\n", listRes) fmt.Println("============ 获取 审批 指定部门 抄送人 ==============") for _, res := range listRes.Data { tmpCopyUser := &api.CopyUser{ ID: res.ID, Name: res.NickName, IsLive: copyUser.IsLive, Type: copyUser.Type, IsViewed: copyUser.IsViewed, } if _, exists := copyUsersMap[tmpCopyUser.ID]; !exists { if _, existsApproval := retApprovalUsersMap[tmpCopyUser.ID]; !existsApproval { if tmpCopyUser.ID != userInfo.ID { copyUsers = append(copyUsers, tmpCopyUser) copyUsersMap[tmpCopyUser.ID] = tmpCopyUser } } } } } } else { //指定人员 if _, exists := copyUsersMap[copyUser.ID]; !exists { if _, existsApproval := retApprovalUsersMap[copyUser.ID]; !existsApproval { if copyUser.ID != userInfo.ID { copyUsers = append(copyUsers, copyUser) copyUsersMap[copyUser.ID] = copyUser } } } } } //剔除掉离职的抄送人 filterCopyUsers := make([]*api.CopyUser, 0) for _, copyU := range copyUsers { req1 := new(account.ListByIDsRequest) req1.IDs = []uint64{copyU.ID} res1, err := service.AccountProvider.ListByIDs(context.Background(), req1) if err != nil { return nil, nil } if res1.Data[0].Status == "notactive" { filterCopyUsers = append(filterCopyUsers, copyU) } } copyUsers = filterCopyUsers for index, singleCopy := range copyUsers { singleCopy.Level = uint64(index + 1) } //for index2, user := range retApprovalUsers { // user.Level = uint64(index2 + 1) //} fmt.Println("============ 获取 审批 审批人 组装后 ==============") fmt.Printf("retApprovalUsers %+v\n", retApprovalUsers) fmt.Printf("copyUsers %+v\n", copyUsers) fmt.Println("============ 获取 审批 审批人 组装后 ==============") fmt.Println() return } // 备份 func buildApprovalUsersV2(userInfo login.Info, req *api.CreateRequest, approvalUsers []*api.ApprovalUser, inCopyUsers []*api.CopyUser, setting *api.SettingRequest) (retApprovalUsers []*api.ApprovalUser, copyUsers []*api.CopyUser) { fmt.Println("============ 获取 审批 审批人 组装前 ==============") fmt.Printf("approvalUsers %+v\n", approvalUsers) fmt.Println("============ 获取 审批 审批人 组装前 ==============") fmt.Println() var currentLevel uint64 = 0 // 当前审批节点 var approvalUserLevel uint64 = 0 // 审批人节点 retApprovalUsers = make([]*api.ApprovalUser, 0) copyUsers = make([]*api.CopyUser, 0) retApprovalUsersMap := make(map[uint64]*api.ApprovalUser) for i := 0; i < len(approvalUsers); i++ { // 判断当前审批节点是否是指定人员 如果不是指定人员 则需要查询 department 获取审批人 if approvalUsers[i].ID == 0 { currentLevel++ if approvalUsers[i].DepartmentUID != "" && approvalUsers[i].PositionUID != "" { listReq := new(account.ListV2Request) departmentId, err := strconv.ParseUint(approvalUsers[i].DepartmentUID, 0, 64) positionId, err := strconv.ParseUint(approvalUsers[i].PositionUID, 0, 64) if err != nil { return nil, nil } listReq.DepartmentId = uint32(departmentId) listReq.PositionId = uint32(positionId) // 查询部门下的审批人 listRes, err := service.AccountProvider.ListV2(context.Background(), listReq) if err != nil { return nil, nil } fmt.Println("============ 获取 审批 指定部门 审批人 ==============") fmt.Printf("listRes %+v\n", listRes) fmt.Println("============ 获取 审批 指定部门 审批人 ==============") fmt.Println() for j := 0; j < len(listRes.Data); j++ { if listRes.Data[j].ID == userInfo.ID && req.Type != "nursingLeaveApply" && req.Type != "parentalLeaveApply" { continue } if retApprovalUsersMap[listRes.Data[j].ID] != nil { continue } approvalUser := new(api.ApprovalUser) approvalUser.ID = listRes.Data[j].ID approvalUser.Name = listRes.Data[j].NickName approvalUser.Level = currentLevel approvalUser.Signature = approvalUsers[i].Signature approvalUser.Type = approvalUsers[i].Type approvalUser.BalanceFillIn = approvalUsers[i].BalanceFillIn retApprovalUsers = append(retApprovalUsers, approvalUser) retApprovalUsersMap[listRes.Data[j].ID] = approvalUser } } else if approvalUsers[i].IsDirect == 1 { myBossReq := new(department.MyBossesReq) if strings.Contains(req.Type, "employ") { departmentId, _ := strconv.ParseUint(req.Employ.DepartmentId, 10, 32) myBossReq.DepartmentId = uint32(departmentId) } else { myBossReq.UserId = uint32(userInfo.ID) myBossReq.DepartmentId = uint32(req.DepartmentID) } //这不怪我,我也不想这么写 if req.Type == "outWork" || req.Type == "funeralLeave" || req.Type == "paternityLeave" || req.Type == "maritalLeave" || req.Type == "parentalLeave" || req.Type == "nursingLeave" || req.Type == "matingCheckLeave" || req.Type == "annualLeave" || req.Type == "businessTrip" || req.Type == "sick" || req.Type == "leave" || req.Type == "maternityLeave" || req.Type == "abortLeave" || req.Type == "goOut" { var days float32 if req.ApprovalOA.Leave != nil { days = req.ApprovalOA.Leave.Days } if req.ApprovalOA.BusinessTrip != nil { days = req.ApprovalOA.BusinessTrip.TotalDays } if req.ApprovalOA.GoOut != nil { days = req.ApprovalOA.GoOut.Hours / 8 } if req.ApprovalOA.OutWork != nil { days = req.ApprovalOA.OutWork.Hours / 8 } //不同时长直属级数不同(晕) if days > 1 { myBossReq.Level = uint32(approvalUsers[i].Level) } else { myBossReq.Level = 1 } } else { myBossReq.Level = uint32(approvalUsers[i].Level) } fmt.Println("============ 获取 审批 直属领导 审批人 请求参数 ==============") fmt.Printf("myBossReq %+v\n", myBossReq) fmt.Println("============ 获取 审批 直属领导 审批人 请求参数 ==============") myBossRes, err := service.DepartmentProvider.MyBosses(context.Background(), myBossReq) if err != nil { return nil, nil } if strings.Contains(req.Type, "position") && len(myBossRes.List) > 1 { myBossRes.List = myBossRes.List[:1] } fmt.Println("============ 获取 审批 直属领导 审批人 ==============") fmt.Printf("myBossRes %+v\n", myBossRes) fmt.Println("============ 获取 审批 直属领导 审批人 ==============") fmt.Println() for j := 0; j < len(myBossRes.List); j++ { for k := 0; k < len(myBossRes.List[j].Bosses); k++ { if myBossRes.List[j].Bosses[k].ID == uint32(userInfo.ID) { continue } if retApprovalUsersMap[uint64(myBossRes.List[j].Bosses[k].ID)] != nil { continue } approvalUser := new(api.ApprovalUser) approvalUser.ID = uint64(myBossRes.List[j].Bosses[k].ID) approvalUser.Name = myBossRes.List[j].Bosses[k].Name approvalUser.Level = currentLevel + uint64(j) approvalUser.IsDirect = approvalUsers[i].IsDirect approvalUser.Signature = approvalUsers[i].Signature approvalUser.Type = approvalUsers[i].Type approvalUser.BalanceFillIn = approvalUsers[i].BalanceFillIn retApprovalUsers = append(retApprovalUsers, approvalUser) retApprovalUsersMap[uint64(myBossRes.List[j].Bosses[k].ID)] = approvalUser } } currentLevel = currentLevel + uint64(len(myBossRes.List)-1) } } else { if approvalUserLevel != approvalUsers[i].Level { currentLevel++ } approvalUserLevel = approvalUsers[i].Level if approvalUsers[i].ID == userInfo.ID { continue } if retApprovalUsersMap[approvalUsers[i].ID] != nil { continue } approvalUser := new(api.ApprovalUser) approvalUser.ID = approvalUsers[i].ID approvalUser.Name = approvalUsers[i].Name approvalUser.Level = currentLevel approvalUser.Signature = approvalUsers[i].Signature if approvalUsers[i].Type == "" { approvalUser.Type = e.AndSignType } else { approvalUser.Type = approvalUsers[i].Type } retApprovalUsers = append(retApprovalUsers, approvalUser) retApprovalUsersMap[approvalUsers[i].ID] = approvalUser } } //OA // 病假 事假 // 又要改,完犊子了 if m.GetOaType(req.Type) != "" { //又是新逻辑,事假/年假/出差/外出 if req.Type == "leave" || req.Type == "annualLeave" || req.Type == "businessTrip" || req.Type == "goOut" { var days float32 if req.ApprovalOA.Leave != nil { days = req.ApprovalOA.Leave.Days } if req.ApprovalOA.BusinessTrip != nil { days = req.ApprovalOA.BusinessTrip.TotalDays } if req.ApprovalOA.GoOut != nil { days = req.ApprovalOA.GoOut.Hours / 8 } retApprovalUsers = GetCombineOaApproveUsers(setting, retApprovalUsers) inCopyUsers = GetCombineOaCopyUsers(setting, inCopyUsers) if days <= 3 { retApprovalUsers = retApprovalUsers[:len(retApprovalUsers)-1] } //if req.ApprovalOA.Leave.Days >= 2 { // retApprovalUsers = GetCombineOaApproveUsers(setting, retApprovalUsers) // inCopyUsers = GetCombineOaCopyUsers(setting, inCopyUsers) //} else { // // retApprovalUsers = GetCombineOaApproveUsers(setting, retApprovalUsers) // if len(retApprovalUsers) > 1 { // for _, user := range retApprovalUsers[1:] { // delete(retApprovalUsersMap, user.ID) // } // retApprovalUsers = retApprovalUsers[:1] // } // inCopyUsers = GetCombineOaCopyUsers(setting, inCopyUsers) // if len(inCopyUsers) > 1 { // inCopyUsers = inCopyUsers[:len(inCopyUsers)-1] // } // //} // //} for index, ret := range retApprovalUsers { ret.Level = uint64(index + 1) } //新逻辑:独生子女护理假申请 育儿假申请====》直属3级+指定岗位 //TODO离职暂时放着(in.Type == "turnover") } else if req.Type == "nursingLeaveApply" || req.Type == "parentalLeaveApply" { //去重,究极特殊处理,我人晕了 //if req.IsLeader { // retApprovalUsers = GetCombineOaApproveUsers(setting, retApprovalUsers) //} else { var result []*api.ApprovalUser approvalUserMap := make(map[uint64]*api.ApprovalUser) for _, userReq := range setting.OaApprovalUsers { approvalUserMap[userReq.ID] = userReq } for _, userRes := range retApprovalUsers { if _, exists := approvalUserMap[userRes.ID]; !exists { result = append(result, userRes) } } retApprovalUsers = result retApprovalUsers = append(retApprovalUsers, setting.OaApprovalUsers...) //var tmpAppUser *api.ApprovalUser //tmpAppUser = retApprovalUsers[len(retApprovalUsers)-1] //retApprovalUsers[len(retApprovalUsers)-1] = retApprovalUsers[len(retApprovalUsers)-2] //retApprovalUsers[len(retApprovalUsers)-2] = tmpAppUser //} retApprovalUsers = GetCombineOaApproveUsers(setting, retApprovalUsers) retApprovalUsers[len(retApprovalUsers)-2].BalanceFillIn = 1 inCopyUsers = GetCombineOaCopyUsers(setting, inCopyUsers) //新逻辑:加班/外勤 丧假 陪产假 婚假 育儿假 独生子女护理假 哺乳假 孕检假 年假 调休 出差 外出=====》直属1级 } else if req.Type == "outWork" || req.Type == "funeralLeave" || req.Type == "paternityLeave" || req.Type == "maritalLeave" || req.Type == "parentalLeave" || req.Type == "nursingLeave" || req.Type == "matingCheckLeave" || req.Type == "maternityLeave" || req.Type == "abortLeave" || req.Type == "sick" { var days float32 if req.ApprovalOA.Leave != nil { days = req.ApprovalOA.Leave.Days } if req.ApprovalOA.OutWork != nil { days = req.ApprovalOA.OutWork.Hours / 8 } retApprovalUsers = GetCombineOaApproveUsers(setting, retApprovalUsers) inCopyUsers = GetCombineOaCopyUsers(setting, inCopyUsers) //if days > 1 && days <= 3 { // retApprovalUsers = retApprovalUsers[:len(retApprovalUsers)-1] //} else if days <= 1 { // retApprovalUsers = retApprovalUsers[:len(retApprovalUsers)-2] //} if days <= 3 { retApprovalUsers = retApprovalUsers[:len(retApprovalUsers)-1] } //加班外勤 不是主管截取掉最后一个 if req.Type == "outWork" { inCopyUsers = GetCombineOaCopyUsers(setting, inCopyUsers) if !req.IsLeader { if len(inCopyUsers) > 1 { inCopyUsers = inCopyUsers[:len(inCopyUsers)-1] } } } } else if req.Type == "overTime" || req.Type == "makeUp" || req.Type == "breastFeedingLeave" || req.Type == "dayOff" { //if in.IsLeader { retApprovalUsers = GetCombineOaApproveUsers(setting, retApprovalUsers) if len(retApprovalUsers) > 1 { for _, user := range retApprovalUsers[1:] { delete(retApprovalUsersMap, user.ID) } retApprovalUsers = retApprovalUsers[:1] } //加班外勤 不是主管截取掉最后一个 if req.Type == "overTime" { inCopyUsers = GetCombineOaCopyUsers(setting, inCopyUsers) if !req.IsLeader { if len(inCopyUsers) > 1 { inCopyUsers = inCopyUsers[:len(inCopyUsers)-1] } } } } //// 去重 审批人 剔除 提交人 抄送人 剔除 审批人 //approvalUsers, copyUsers = UniqueUsersV2(in.SubmitterID, approvalUsers, copyUsers) index := 0 for i := 0; i < len(retApprovalUsers); i++ { index++ retApprovalUsers[i].Level = uint64(index) } fmt.Println("------------t5---------- start ") fmt.Println("1-----", retApprovalUsers) fmt.Println("2-----", inCopyUsers) fmt.Println("------------t5---------- end ") } if len(inCopyUsers) > 0 { for i := 0; i < len(inCopyUsers); i++ { if inCopyUsers[i].ID == userInfo.ID { continue } else if _, ok := retApprovalUsersMap[inCopyUsers[i].ID]; ok { continue } else { copyUsers = append(copyUsers, inCopyUsers[i]) } } } for index2, user := range retApprovalUsers { user.Level = uint64(index2 + 1) } fmt.Println("============ 获取 审批 审批人 组装后 ==============") fmt.Printf("retApprovalUsers %+v\n", retApprovalUsers) fmt.Printf("copyUsers %+v\n", copyUsers) fmt.Println("============ 获取 审批 审批人 组装后 ==============") fmt.Println() return } // verifyApprovalUserIsActive 检查审批人是否在职 并 用于 审批流程 展示 以及 创建 func verifyApprovalUserIsActive(approvalUsers []*api.ApprovalUser) (retApprovalUsers []*api.ApprovalUser, err error) { userIDs := make([]uint64, 0) for i := 0; i < len(approvalUsers); i++ { userIDs = append(userIDs, approvalUsers[i].ID) } if len(userIDs) > 0 { req := new(account.ListByIDsRequest) res := new(account.ListResponse) retApprovalUsers = make([]*api.ApprovalUser, 0) req.IDs = userIDs res, err = service.AccountProvider.ListByIDs(context.Background(), req) if err != nil { return nil, errors.New(e.ErrorGetUserStatus) } usersMap := make(map[uint64]*account.AccountInfo) for i := 0; i < len(res.Data); i++ { fmt.Println("==================================== 校验审批人 状态 ============================================") fmt.Printf("审批人状态 %+v\n", res.Data[i]) fmt.Println("==================================== 校验审批人 状态 ============================================") //if res.Data[i].Status != "notactive" { usersMap[res.Data[i].ID] = res.Data[i] //} } if len(usersMap) > 0 { isLiveInvalidNum := 0 for i := 0; i < len(approvalUsers); i++ { if usersMap[approvalUsers[i].ID] != nil && usersMap[approvalUsers[i].ID].Status == "notactive" { approvalUsers[i].IsLive = e.IsLive retApprovalUsers = append(retApprovalUsers, approvalUsers[i]) } else { isLiveInvalidNum++ approvalUsers[i].IsLive = e.IsLiveInvalid retApprovalUsers = append(retApprovalUsers, approvalUsers[i]) } } if isLiveInvalidNum == len(approvalUsers) { return nil, errors.New(e.ErrorCurrentApprovalIsNotUsed) } } } return } // 获取 promotion 中的 员工信息 func buildPromotionApprovalUser(req *api.CreateRequest) (approvalUsers []*api.ApprovalUser, err error) { if req.Promotion == nil { return nil, nil } else if req.Promotion.StaffUID == 0 { return nil, errors.New(e.ErrorEmptyPromotionStaffUid) } else { fmt.Println("============ 获取 promotion 中的 员工信息 ==============") fmt.Printf("req.Promotion %+v\n", req.Promotion) fmt.Println("============ 获取 promotion 中的 员工信息 ==============") staffInfo, err := service.AccountProvider.Info(context.Background(), &account.InfoRequest{ID: req.Promotion.StaffUID}) fmt.Println("============ 获取 account 中的 员工信息 ==============") fmt.Printf("staffInfo %+v\n", staffInfo) fmt.Printf("err %+v\n", err) fmt.Println("============ 获取 account 中的 员工信息 ==============") if err != nil { return nil, errors.New(e.GetMsg(e.ErrorGetUserInfo)) } var departmentUid uint64 for i := 0; i < len(staffInfo.Info.Departments); i++ { if staffInfo.Info.Departments[i].ID != 0 { departmentUid = uint64(staffInfo.Info.Departments[i].ID) break } } myBossReq := new(department.MyBossesReq) myBossReq.UserId = uint32(staffInfo.Info.ID) myBossReq.DepartmentId = uint32(departmentUid) myBossReq.Level = 1 myBossRes, err := service.DepartmentProvider.MyBosses(context.Background(), myBossReq) if err != nil { return nil, nil } if myBossRes.List == nil || len(myBossRes.List) == 0 { return nil, errors.New(e.ErrorNotCatchUserDepartmentBoss) } approvalUsers = make([]*api.ApprovalUser, 0) for i := 0; i < len(myBossRes.List); i++ { for j := 0; j < len(myBossRes.List[i].Bosses); j++ { approvalUser := new(api.ApprovalUser) approvalUser.ID = uint64(myBossRes.List[i].Bosses[j].ID) approvalUser.Name = myBossRes.List[i].Bosses[j].Name approvalUser.Level = 1 approvalUsers = append(approvalUsers, approvalUser) } } if req.ApprovalUsers != nil { approvalUsers = append(approvalUsers, req.ApprovalUsers...) } return approvalUsers, nil } } func UniqueUsers(submitterID uint64, inApprovalUsers []*api.ApprovalUser, inCopyUsers []*api.CopyUser) (newApprovalUsers []*api.ApprovalUser, copyUsers []*api.CopyUser) { approvalUsers := make([]*api.ApprovalUser, 0) approvalUserMap := make(map[uint64]*api.ApprovalUser) copyUsers = make([]*api.CopyUser, 0) uniqueUsersMap := make(map[uint64]struct{}) // 剔除 提交人 在审批人中 for i := 0; i < len(inApprovalUsers); i++ { approvalUser := new(api.ApprovalUser) approvalUser = inApprovalUsers[i] approvalUserMap[approvalUser.ID] = approvalUser if approvalUser.ID == submitterID { continue } else if _, ok := uniqueUsersMap[approvalUser.ID]; ok { continue } else { uniqueUsersMap[approvalUser.ID] = struct{}{} approvalUsers = append(approvalUsers, approvalUser) } } var currentLevel uint64 = 0 var preLevel uint64 = 0 for i := 0; i < len(approvalUsers); i++ { if i == 0 { preLevel = approvalUsers[i].Level currentLevel = approvalUsers[i].Level } else { currentLevel = approvalUsers[i].Level if approvalUsers[i].Level == preLevel { approvalUsers[i].Level = currentLevel } else { approvalUsers[i].Level = currentLevel preLevel = currentLevel currentLevel++ } } } approvalUsersMap := make(map[uint64][]*api.ApprovalUser) levels := make([]int, 0) for i := 0; i < len(approvalUsers); i++ { approvalUser := new(api.ApprovalUser) approvalUser = approvalUsers[i] if approvalUsersMap[approvalUser.Level] == nil { levels = append(levels, int(approvalUser.Level)) } approvalUsersMap[approvalUser.Level] = append(approvalUsersMap[approvalUser.Level], approvalUser) } newApprovalUsers = make([]*api.ApprovalUser, 0) sort.Ints(levels) if len(levels) > 0 { for i := 0; i < len(levels); i++ { for j := 0; j < len(approvalUsersMap[uint64(levels[i])]); j++ { if approvalUsersMap[uint64(levels[i])][j].Level == 0 { approvalUsersMap[uint64(levels[i])][j].Level = 1 approvalUsersMap[uint64(levels[i])][j].Signature = e.AndSignType } else if approvalUsersMap[uint64(levels[i])][j].Level == 1 { approvalUsersMap[uint64(levels[i])][j].Level = approvalUsersMap[uint64(levels[0])][len(approvalUsersMap[uint64(levels[0])])-1].Level } else { approvalUsersMap[uint64(levels[i])][j].Level = approvalUsersMap[uint64(levels[i-1])][len(approvalUsersMap[uint64(levels[i])])-1].Level + 1 } } newApprovalUsers = append(newApprovalUsers, approvalUsersMap[uint64(levels[i])]...) } } approvalUsers = newApprovalUsers if len(inCopyUsers) > 0 { for i := 0; i < len(inCopyUsers); i++ { if inCopyUsers[i].ID == submitterID { continue } else if _, ok := approvalUsersMap[inCopyUsers[i].ID]; ok { continue } else { copyUsers = append(copyUsers, inCopyUsers[i]) } } } return } // buildWorkFlow 组装 workflow func buildWorkFlow(approvalUsers []*api.ApprovalUser) (retWorkFlows []*api.WorkFlow) { retWorkFlows = make([]*api.WorkFlow, 0) for i := 0; i < len(approvalUsers); i++ { workFlow := new(api.WorkFlow) workFlow.UserID = approvalUsers[i].ID workFlow.Name = approvalUsers[i].Name workFlow.Level = approvalUsers[i].Level workFlow.Signature = approvalUsers[i].Signature retWorkFlows = append(retWorkFlows, workFlow) } return } // verifyWorkflowIsActive 检查审批人是否在职 并 更新审批流程 用于审批流程的更新 func verifyWorkflowIsActive(workflows []*api.WorkFlow) (retWorkFlows []*api.WorkFlow, err error) { userIDs := make([]uint64, 0) for i := 0; i < len(workflows); i++ { userIDs = append(userIDs, workflows[i].UserID) } if len(userIDs) > 0 { req := new(account.ListByIDsRequest) res := new(account.ListResponse) retWorkFlows = make([]*api.WorkFlow, 0) req.IDs = userIDs res, err = service.AccountProvider.ListByIDs(context.Background(), req) if err != nil { return nil, errors.New(e.ErrorGetUserStatus) } usersMap := make(map[uint64]*account.AccountInfo) for i := 0; i < len(res.Data); i++ { if res.Data[i].Status != "notactive" { usersMap[res.Data[i].ID] = res.Data[i] } } if len(usersMap) > 0 { for i := 0; i < len(workflows); i++ { if usersMap[workflows[i].UserID] != nil { workflows[i].IsLive = e.IsLiveInvalid retWorkFlows = append(retWorkFlows, workflows[i]) } } updateWorkflowReq := new(api.UpdateWorkflowRequest) updateWorkflowReq.WorkFlows = retWorkFlows _, err = service.ApprovalProvider.UpdateWorkflow(context.Background(), updateWorkflowReq) if err != nil { return nil, err } } } return } func MyWorkV2(c *gin.Context) { var req api.ListRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, err) return } userInfo := login.GetUserInfoFromC(c) req.UserID = userInfo.ID req.Domain = "all" //if req.Status == 0 { // for i := 0; i < len(userInfo.PositionUsers); i++ { // if userInfo.PositionUsers[i].DepartmentName == "超级管理员" { // req.UserID = 0 // } // } //} if req.OrderBy == "" { req.OrderBy = "desc" } if req.StartTime != "" && req.EndTime != "" { req.StartTime = req.StartTime + " 00:00:00" req.EndTime = req.EndTime + " 23:59:59" req.OrderBy = "asc" } // 范围搜索 // //positionList, dataErr := service.GrpcApprovalDataImpl.DetailApprovalData(context.Background(), &approvalData.DetailApprovalDataReq{UserId: userInfo.ID}) //if dataErr != nil { // service.Error(c, e.Error, dataErr) // return //} // //if len(positionList.Data) > 0 { // userList := make([]uint64, 0) // for _, position := range positionList.Data { // positionId, _ := strconv.ParseUint(position.PositionUID, 10, 32) // userRes, userErr := service.AccountProvider.ListV2(context.Background(), &account.ListV2Request{Page: 1, PageSize: 99999, PositionId: uint32(positionId)}) // if userErr != nil { // service.Error(c, e.Error, userErr) // return // } // if len(userRes.Data) > 0 { // for _, user := range userRes.Data { // userList = append(userList, user.ID) // } // } // } // req.UserList = userList //} var authRes = new(position.DoIHavaAuthResponse) authRes.Hava = false if req.IsSpecial { var authReq position.DoIHavaAuthRequest var authErr error authReq.Url = "moceapp/mywork/category/" authReq.Type = "button" authRes, authErr = service.PositionProvider.DoIHavaAuth(c, &authReq) if authErr != nil { zap.L().Error("DoIHavaAuth", zap.Error(authErr)) } if authRes.Hava { req.PageSize = 9999 } } res, err := service.ApprovalProvider.MyWorkV2(c, &req) if err != nil { service.Error(c, e.Error, err) return } //全局搜索过滤 if len(res.Data) > 0 && req.AllQuery != "" { fmt.Println("========================全局搜索过滤==============================") filterData := make([]*api.CreateRequest, 0) for _, approvalItem := range res.Data { flag := 0 if strings.Contains(approvalItem.Content, req.AllQuery) || strings.Contains(approvalItem.Reply, req.AllQuery) || strings.Contains(approvalItem.SubmitterName, req.AllQuery) || strings.Contains(approvalItem.NowUserName, req.AllQuery) || strings.Contains(approvalItem.CreatedAt, req.AllQuery) || strings.Contains(approvalItem.TypeName, req.AllQuery) { flag = flag + 1 } if approvalItem.Work != nil { if len(approvalItem.Work.ApprovalWorks) > 0 { for _, work := range approvalItem.Work.ApprovalWorks { if strings.Contains(work.ArtworkName, req.AllQuery) || strings.Contains(work.ArtistShowCount, req.AllQuery) || strings.Contains(work.ArtworkCover, req.AllQuery) { flag = flag + 1 break } } } } if len(approvalItem.Show) > 0 { for _, show := range approvalItem.Show { if strings.Contains(show.Address, req.AllQuery) { flag = flag + 1 break } } } if approvalItem.Exhibition != nil { if strings.Contains(approvalItem.Exhibition.Address, req.AllQuery) { flag = flag + 1 } if len(approvalItem.Exhibition.ApprovalExhibitions) > 0 { for _, exhibition := range approvalItem.Exhibition.ApprovalExhibitions { if len(exhibition.Artworks) > 0 { for _, artwork := range exhibition.Artworks { if strings.Contains(artwork.ArtworkName, req.AllQuery) || strings.Contains(artwork.ArtistShowCount, req.AllQuery) || strings.Contains(artwork.SaleAddress, req.AllQuery) || strings.Contains(artwork.Reward, req.AllQuery) || strings.Contains(artwork.Tfnum, req.AllQuery) { flag = flag + 1 break } } } if exhibition.ArtExhibitionDetail != nil { if strings.Contains(exhibition.ArtExhibitionDetail.ArtistShowCount, req.AllQuery) || strings.Contains(exhibition.ArtExhibitionDetail.ShowTime, req.AllQuery) || strings.Contains(exhibition.ArtExhibitionDetail.ShowName, req.AllQuery) || strings.Contains(exhibition.ArtExhibitionDetail.Address, req.AllQuery) { flag = flag + 1 break } } } } } if len(approvalItem.WorkFlows) > 0 { for _, user := range approvalItem.WorkFlows { if strings.Contains(user.Name, req.AllQuery) { flag = flag + 1 break } } } if len(approvalItem.CopyUsers) > 0 { for _, copyUser := range approvalItem.CopyUsers { if strings.Contains(copyUser.Name, req.AllQuery) { flag = flag + 1 break } } } if len(approvalItem.CustomizeInfo) > 0 { for _, keyInfo := range approvalItem.CustomizeInfo { if strings.Contains(keyInfo.ApprovalValue, req.AllQuery) { flag = flag + 1 break } } } if approvalItem.BundlePayPrice != nil { if strings.Contains(approvalItem.BundlePayPrice.ShowName, req.AllQuery) || strings.Contains(approvalItem.BundlePayPrice.ArtistShowCount, req.AllQuery) || strings.Contains(approvalItem.BundlePayPrice.ShowLowPrice, req.AllQuery) || strings.Contains(approvalItem.BundlePayPrice.ArtworkSize, req.AllQuery) || strings.Contains(approvalItem.BundlePayPrice.ShowAddress, req.AllQuery) || strings.Contains(approvalItem.BundlePayPrice.ShowDate, req.AllQuery) { flag = flag + 1 } } if approvalItem.ApprovalOA != nil { if strings.Contains(approvalItem.ApprovalOA.RevokeReason, req.AllQuery) { flag = flag + 1 } if approvalItem.ApprovalOA.LeaveApply != nil { if strings.Contains(approvalItem.ApprovalOA.LeaveApply.StaffName, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.LeaveApply.Reason, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.LeaveApply.StaffNum, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.LeaveApply.ActionTime, req.AllQuery) { flag = flag + 1 } } if approvalItem.ApprovalOA.OutWork != nil { if strings.Contains(approvalItem.ApprovalOA.OutWork.StaffName, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.OutWork.Reason, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.OutWork.StaffNum, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.OutWork.OutWorkAddress, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.OutWork.Vehicle, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.OutWork.ActionTime, req.AllQuery) { flag = flag + 1 } for _, applyTime := range approvalItem.ApprovalOA.OutWork.ApplyTimes { if strings.Contains(applyTime.Date, req.AllQuery) { flag = flag + 1 break } } } if approvalItem.ApprovalOA.MakeUp != nil { if strings.Contains(approvalItem.ApprovalOA.MakeUp.StaffName, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.MakeUp.Reason, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.MakeUp.StaffNum, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.MakeUp.ActionTime, req.AllQuery) { flag = flag + 1 } for _, applyTime := range approvalItem.ApprovalOA.MakeUp.ApplyTimes { if strings.Contains(applyTime.Date, req.AllQuery) { flag = flag + 1 break } } } if approvalItem.ApprovalOA.Turnover != nil { fmt.Println("=====================turnover=====================") fmt.Println(approvalItem.ApprovalOA.Turnover) if strings.Contains(approvalItem.ApprovalOA.Turnover.StaffName, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.Turnover.Reason, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.Turnover.StaffNum, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.Turnover.HandoverName, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.Turnover.JoinTime, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.Turnover.LeftTime, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.Turnover.ContactInfo, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.Turnover.HandoverNum, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.Turnover.Address, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.Turnover.SuperviseName, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.Turnover.SuperviseNum, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.Turnover.WorkItems, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.Turnover.FinanceItems, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.Turnover.ActionTime, req.AllQuery) { flag = flag + 1 } for _, applyTime := range approvalItem.ApprovalOA.Turnover.ApplyTimes { if strings.Contains(applyTime.Date, req.AllQuery) { flag = flag + 1 break } } fmt.Println("=====================flag=====================") fmt.Println(flag) } if approvalItem.ApprovalOA.OverTime != nil { if strings.Contains(approvalItem.ApprovalOA.OverTime.StaffName, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.OverTime.Reason, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.OverTime.StaffNum, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.OverTime.ActionTime, req.AllQuery) { flag = flag + 1 } for _, applyTime := range approvalItem.ApprovalOA.OverTime.ApplyTimes { if strings.Contains(applyTime.Date, req.AllQuery) { flag = flag + 1 break } } } if approvalItem.ApprovalOA.Leave != nil { if strings.Contains(approvalItem.ApprovalOA.Leave.StaffName, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.Leave.Reason, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.Leave.StaffNum, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.Leave.DateOfBrith, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.Leave.ActionTime, req.AllQuery) { flag = flag + 1 } for _, applyTime := range approvalItem.ApprovalOA.Leave.ApplyTimes { if strings.Contains(applyTime.Date, req.AllQuery) { flag = flag + 1 break } } } if approvalItem.ApprovalOA.GoOut != nil { if strings.Contains(approvalItem.ApprovalOA.GoOut.StaffName, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.GoOut.Reason, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.GoOut.StaffNum, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.GoOut.DateOfBrith, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.GoOut.ActionTime, req.AllQuery) { flag = flag + 1 } for _, applyTime := range approvalItem.ApprovalOA.GoOut.ApplyTimes { if strings.Contains(applyTime.Date, req.AllQuery) { flag = flag + 1 break } } } if approvalItem.ApprovalOA.BusinessTrip != nil { if strings.Contains(approvalItem.ApprovalOA.BusinessTrip.StaffName, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.BusinessTrip.Reason, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.BusinessTrip.StaffNum, req.AllQuery) || strings.Contains(approvalItem.ApprovalOA.BusinessTrip.ActionTime, req.AllQuery) { flag = flag + 1 } for _, itinerary := range approvalItem.ApprovalOA.BusinessTrip.ItineraryList { if strings.Contains(itinerary.Vehicle, req.AllQuery) || strings.Contains(itinerary.EndAddress, req.AllQuery) || strings.Contains(itinerary.StartAddress, req.AllQuery) { flag = flag + 1 break } } } } if approvalItem.FinancialForm != nil { if strings.Contains(approvalItem.FinancialForm.PaymentCompany, req.AllQuery) || strings.Contains(approvalItem.FinancialForm.TransactionDepartment, req.AllQuery) || strings.Contains(approvalItem.FinancialForm.Payee, req.AllQuery) || strings.Contains(approvalItem.FinancialForm.BeneficiaryBank, req.AllQuery) || strings.Contains(approvalItem.FinancialForm.BankNo, req.AllQuery) || strings.Contains(approvalItem.FinancialForm.PaymentMethod, req.AllQuery) { flag = flag + 1 } for _, costInfo := range approvalItem.FinancialForm.CostInfo { if strings.Contains(costInfo.Description, req.AllQuery) || strings.Contains(costInfo.UnitPrice, req.AllQuery) || strings.Contains(costInfo.CostUnit, req.AllQuery) || strings.Contains(costInfo.UsedDepartment, req.AllQuery) || strings.Contains(costInfo.TotalPrice, req.AllQuery) { flag = flag + 1 break } } for _, invoiceInfo := range approvalItem.FinancialForm.InvoiceInfo { if strings.Contains(invoiceInfo.InvoiceDate, req.AllQuery) || strings.Contains(invoiceInfo.InvoiceNo, req.AllQuery) || strings.Contains(invoiceInfo.InvoiceProvider, req.AllQuery) || strings.Contains(invoiceInfo.Amount, req.AllQuery) || strings.Contains(invoiceInfo.Applicant, req.AllQuery) || strings.Contains(invoiceInfo.PaymentMethod, req.AllQuery) || strings.Contains(invoiceInfo.PaymentObj, req.AllQuery) || strings.Contains(invoiceInfo.InvoiceType, req.AllQuery) || strings.Contains(invoiceInfo.Notes, req.AllQuery) || strings.Contains(invoiceInfo.UseTo, req.AllQuery) { flag = flag + 1 break } } } if approvalItem.ExhibitionHis != nil { if strings.Contains(approvalItem.ExhibitionHis.Address, req.AllQuery) { flag = flag + 1 } if len(approvalItem.ExhibitionHis.ApprovalExhibitionHiss) > 0 { for _, exhibition := range approvalItem.ExhibitionHis.ApprovalExhibitionHiss { if len(exhibition.Artworks) > 0 { for _, artwork := range exhibition.Artworks { if strings.Contains(artwork.ArtworkName, req.AllQuery) || strings.Contains(artwork.ArtistShowCount, req.AllQuery) || strings.Contains(artwork.SaleAddress, req.AllQuery) || strings.Contains(artwork.Reward, req.AllQuery) || strings.Contains(artwork.Tfnum, req.AllQuery) { flag = flag + 1 break } } } if exhibition.ArtExhibitionDetail != nil { if strings.Contains(exhibition.ArtExhibitionDetail.ArtistShowCount, req.AllQuery) || strings.Contains(exhibition.ArtExhibitionDetail.ShowTime, req.AllQuery) || strings.Contains(exhibition.ArtExhibitionDetail.ShowName, req.AllQuery) || strings.Contains(exhibition.ArtExhibitionDetail.Address, req.AllQuery) { flag = flag + 1 break } } } } } if approvalItem.Promotion != nil { if strings.Contains(approvalItem.Promotion.StaffName, req.AllQuery) || strings.Contains(approvalItem.Promotion.StaffNum, req.AllQuery) || strings.Contains(approvalItem.Promotion.FileName, req.AllQuery) || strings.Contains(approvalItem.Promotion.NewJob, req.AllQuery) || strings.Contains(approvalItem.Promotion.EffectiveTime, req.AllQuery) || strings.Contains(approvalItem.Promotion.OldJob, req.AllQuery) { flag = flag + 1 } } if approvalItem.StaffSupply != nil { if strings.Contains(approvalItem.StaffSupply.PositionName, req.AllQuery) || strings.Contains(approvalItem.StaffSupply.JobAsk, req.AllQuery) || strings.Contains(approvalItem.StaffSupply.JoinInTime, req.AllQuery) || strings.Contains(approvalItem.StaffSupply.DepartmentName, req.AllQuery) { flag = flag + 1 } } if approvalItem.Employ != nil { if strings.Contains(approvalItem.Employ.Post, req.AllQuery) || strings.Contains(approvalItem.Employ.BelongDepartment, req.AllQuery) || strings.Contains(approvalItem.Employ.Name, req.AllQuery) || strings.Contains(approvalItem.Employ.EmployeeType, req.AllQuery) || strings.Contains(approvalItem.Employ.EmployeeNo, req.AllQuery) || strings.Contains(approvalItem.Employ.EntryTime, req.AllQuery) || strings.Contains(approvalItem.Employ.CloseReason, req.AllQuery) || strings.Contains(approvalItem.Employ.ConfirmDate, req.AllQuery) || strings.Contains(approvalItem.Employ.Remark, req.AllQuery) || strings.Contains(approvalItem.Employ.Mobile, req.AllQuery) { flag = flag + 1 } } if approvalItem.CheckIn != nil { if strings.Contains(approvalItem.CheckIn.SaleAddress, req.AllQuery) || strings.Contains(approvalItem.CheckIn.DetailAddress, req.AllQuery) { flag = flag + 1 } } if flag > 0 { filterData = append(filterData, approvalItem) } } fmt.Println("========================匹配所有字段结束,匹配结果==============================") fmt.Println(filterData) res.Data = filterData } //字段国际化 if len(res.Data) > 0 { lang := c.Request.Header.Get("Accept-Language") for _, one := range res.Data { one.TypeName = m.GetLanguageType(lang, one.TypeName) if one.ApprovalOA != nil { if one.ApprovalOA.Leave != nil { for _, applyTime := range one.ApprovalOA.Leave.ApplyTimes { applyTime.M = m.GetLanguageType(lang, applyTime.M) } } if one.ApprovalOA.Turnover != nil { for _, applyTime := range one.ApprovalOA.Turnover.ApplyTimes { applyTime.M = m.GetLanguageType(lang, applyTime.M) } } if one.ApprovalOA.BusinessTrip != nil { for _, itinerary := range one.ApprovalOA.BusinessTrip.ItineraryList { for _, applyTime := range itinerary.ApplyTimes { applyTime.M = m.GetLanguageType(lang, applyTime.M) } } } if one.ApprovalOA.GoOut != nil { for _, applyTime := range one.ApprovalOA.GoOut.ApplyTimes { applyTime.M = m.GetLanguageType(lang, applyTime.M) } } if one.ApprovalOA.OutWork != nil { for _, applyTime := range one.ApprovalOA.OutWork.ApplyTimes { applyTime.M = m.GetLanguageType(lang, applyTime.M) } } if one.ApprovalOA.OverTime != nil { for _, applyTime := range one.ApprovalOA.OverTime.ApplyTimes { applyTime.M = m.GetLanguageType(lang, applyTime.M) } } if one.ApprovalOA.MakeUp != nil { for _, applyTime := range one.ApprovalOA.MakeUp.ApplyTimes { applyTime.M = m.GetLanguageType(lang, applyTime.M) } } } } } if authRes.Hava && req.IsSpecial { retApproval := new(m.RetApproval) categoryApproval := new(m.CategoryApproval) categoryApproval.ClaimsApply = make([]*api.CreateRequest, 0) categoryApproval.PaymentsApply = make([]*api.CreateRequest, 0) categoryApproval.DeploymentApply = make([]*api.CreateRequest, 0) categoryApproval.ContractApply = make([]*api.CreateRequest, 0) categoryApproval.SealApply = make([]*api.CreateRequest, 0) categoryApproval.OaApply = make([]*api.CreateRequest, 0) categoryApproval.OtherApply = make([]*api.CreateRequest, 0) var ( claimsEnv map[string]string PaymentsEnv map[string]string DeploymentEnv map[string]string ContractEnv map[string]string SealEnv map[string]string OAEnv map[string]string ) if config.Env == "prod" { claimsEnv = m.ProdClaims PaymentsEnv = m.ProdPayments DeploymentEnv = m.ProdDeployment ContractEnv = m.ProdContract SealEnv = m.ProdSeal OAEnv = m.ProdOA } else { claimsEnv = m.DevClaims PaymentsEnv = m.DevPayments DeploymentEnv = m.DevDeployment ContractEnv = m.DevContract SealEnv = m.DevSeal OAEnv = m.DevOA } // 做分类 for i := 0; i < len(res.Data); i++ { if res.Data[i].Type == claimsEnv[res.Data[i].Type] { categoryApproval.ClaimsApply = append(categoryApproval.ClaimsApply, res.Data[i]) categoryApproval.Claims++ continue } else if res.Data[i].Type == PaymentsEnv[res.Data[i].Type] { categoryApproval.PaymentsApply = append(categoryApproval.PaymentsApply, res.Data[i]) categoryApproval.Payments++ continue } else if res.Data[i].Type == DeploymentEnv[res.Data[i].Type] { categoryApproval.DeploymentApply = append(categoryApproval.DeploymentApply, res.Data[i]) categoryApproval.Deployment++ continue } else if res.Data[i].Type == ContractEnv[res.Data[i].Type] { categoryApproval.ContractApply = append(categoryApproval.ContractApply, res.Data[i]) categoryApproval.Contract++ continue } else if res.Data[i].Type == SealEnv[res.Data[i].Type] { categoryApproval.SealApply = append(categoryApproval.SealApply, res.Data[i]) categoryApproval.Seal++ continue } else if res.Data[i].Type == OAEnv[res.Data[i].Type] { categoryApproval.OaApply = append(categoryApproval.OaApply, res.Data[i]) categoryApproval.Oa++ continue } else { categoryApproval.OtherApply = append(categoryApproval.OtherApply, res.Data[i]) categoryApproval.Other++ continue } } retApproval.Data = categoryApproval retApproval.Count = res.Count service.Success(c, retApproval) } else { service.Success(c, res) } } // SetStatusBatchV2 批量审批 func SetStatusBatchV2(c *gin.Context) { //var setStatusBatchReq vo.SetStatusBatchReq setStatusBatchReq := make([]vo.SetStatus, 0) if err := c.ShouldBindBodyWith(&setStatusBatchReq, binding.JSON); err != nil { service.Error(c, e.Error, err) return } fmt.Println("============ 获取 审批 批量 审批 ==============") fmt.Printf("batch %+v\n", setStatusBatchReq) logger.Errorf("batch %+v\n", setStatusBatchReq) fmt.Println("============ 获取 审批 批量 审批 ==============") if len(setStatusBatchReq) < 1 { service.Error(c, e.Error, errors.New("当前无审批")) return } userInfo := login.GetUserInfoFromC(c) for i := 0; i < len(setStatusBatchReq); i++ { req := api.StatusRequest{} req.Domain = setStatusBatchReq[i].Domain req.ID = setStatusBatchReq[i].ID req.Reply = setStatusBatchReq[i].Reply req.WorkFlowId = setStatusBatchReq[i].WorkFlowId req.Status = setStatusBatchReq[i].Status req.Level = setStatusBatchReq[i].Level req.Title = setStatusBatchReq[i].Title req.UserId = userInfo.ID req.LeaveBalance = setStatusBatchReq[i].LeaveBalance req.Tips = setStatusBatchReq[i].Tips levelReq := api.NowLevelByInfoRequestV2{ ApprovalID: req.ID, NowUserId: userInfo.ID, } fmt.Println("============== 开始查询审批流程 ==============") levelRes, err := service.ApprovalProvider.NowLevelByInfoV2(context.Background(), &levelReq) if err != nil { service.Error(c, e.Error, err) return } fmt.Printf("levelRes %+v\n", levelRes) fmt.Println("============== 开始查询审批流程 ==============") if req.UserId != levelRes.UserID { service.Error(c, e.Error, errors.New("本次审批人出现错误")) return } req.WorkFlowId = levelRes.ID // 查询 未审批前的审批 beforeApproval := QueryApprovalSetStatusBefore(req.ID) if beforeApproval == nil { service.Error(c, e.Error, errors.New(e.ErrorQueryApprovalContent)) return } if strings.Contains(beforeApproval.Type, "handover") { reqList := &api.ListRequest{} reqList.Domain = beforeApproval.Domain reqList.Type = "turnover" reqList.UserID = beforeApproval.SubmitterID reqList.Status = 2 submitRes2, err := service.ApprovalProvider.MySubmit(context.Background(), reqList) if err != nil { service.Error(c, e.Error, errors.New("查询已提交的离职审批失败")) return } if len(submitRes2.Data) < 1 { service.Error(c, e.Error, errors.New("离职申请未完成")) return } } fmt.Println("++++++++++++++++++++ QueryApprovalSetStatusBefore =============================") fmt.Printf("beforeApproval : %+v\n", beforeApproval) fmt.Println("++++++++++++++++++++ QueryApprovalSetStatusBefore =============================") _, err = service.ApprovalProvider.SetStatusV2(context.Background(), &req) if err != nil { service.Error(c, e.Error, err) return } detailReq := api.DetailRequest{ID: req.ID} detail, err := service.ApprovalProvider.Detail(context.Background(), &detailReq) if err != nil { service.Error(c, e.Error, err) return } fmt.Println("++++++++++++++++++++ QueryApprovalSetStatusAfter =============================") fmt.Printf("Detail : %+v\n", detail) fmt.Println("++++++++++++++++++++ QueryApprovalSetStatusAfter =============================") // 同步至 es go func() { updateErr := logic.UpdateIndexApprovalDoc(config.ApprovalIndex, detail) if updateErr != nil { zap.L().Error("同步至 es 失败 更新", zap.Error(updateErr)) //return } }() _, err = verifyWorkflowIsActive(detail.WorkFlows) if err != nil { service.Error(c, e.Error, err) return } //如果审批通过,推送给全部抄送人 if beforeApproval.Status == 1 && detail.Status == 2 && len(detail.CopyUsers) > 0 { for _, user := range detail.CopyUsers { //审批过后推送给下一个审批人 err = service.SendAppMessage("审批通知", "有一条<"+detail.TypeName+">已抄送给您,点击查看详情 >", user.ID, detail.ID, "copy") if err != nil { fmt.Println("==============APP推送失败=====================") fmt.Println(err) } } } else { //审批过后推送给下一个审批人 err = service.SendAppMessage("审批通知", "您有一条<"+detail.TypeName+">审批待处理,点击查看详情 >", detail.NowUserId, detail.ID, "approval") if err != nil { fmt.Println("==============APP推送失败=====================") fmt.Println(err) } } if detail.TypeName == "任命审批" { StoreBaiduChainApprovalFile(req.ID) } // 审批成功查询用户部门的信息,提交画作服修改画作仓库状态 if detail.TypeName == "画作申请审批" { var ids []int32 for _, tt := range detail.Work.ApprovalWorks { ids = append(ids, int32(tt.ArtworkID)) } fmt.Println("请求画作申请审批", ids) if len(ids) > 0 { err = submitArtwork(req.UserId, ids) if err != nil { service.Error(c, e.Error, err) return } } } if strings.Contains(beforeApproval.Type, "turnover") && beforeApproval.Status == e.ApprovalWorkStatusDoing && detail.Status == e.ApprovalWorkStatusOk { err = turnoverUpdateAccountEmployee(c, detail.ApprovalOA.Turnover) if err != nil { service.Error(c, e.Error, err) return } } if strings.Contains(beforeApproval.Type, "turnover") && (detail.Status == e.ApprovalWorkStatusRevokeOk || detail.Status == e.ApprovalWorkStatusFail) { updateDeductAnnualLeaveZeroClearing(detail.ApprovalOA.Turnover) } // approval 审批状态 同步到 oa 审批 if e.TypeMap[detail.Type] == "oa" { // 查询 审批状态已经 更新的 审批信息 updatedReq := api.DetailRequest{ID: req.ID} updatedDetail, detailErr := service.ApprovalProvider.Detail(context.Background(), &updatedReq) if detailErr != nil { service.Error(c, e.Error, detailErr) return } if req.LeaveBalance != 0 && updatedDetail.ApprovalOA.LeaveApply != nil { //leaveBalance, _ := strconv.ParseFloat(req.LeaveBalance, 10) updatedDetail.ApprovalOA.LeaveApply.LeaveBalance = req.LeaveBalance } // 育儿假申请 独生子女护理假申请 撤销成功 if updatedDetail.Status == 7 && (detail.Type == "parentalLeaveApply" || detail.Type == "nursingLeaveApply") { updatedDetail.ApprovalOA.LeaveApply.LeaveBalance = 0 } _, updateErr := UpdateApprovalStatusToOAStatus(updatedDetail) if updateErr != nil { service.Error(c, e.Error, updateErr) return } } // 画展包审批 logger.Errorf("================================================= %s 1 ======================================", "进入 画展包审批") logger.Errorf("batch %+v\n", setStatusBatchReq) if detail.Type == TypeExhibition { logger.Errorf("================================================= %s 2======================================", "进入 画展包审批") logger.Errorf("beforeApproval %+v\n", beforeApproval) logger.Errorf("detail %+v\n", detail) err = ExhibitionApproveEnter(beforeApproval, detail) if err != nil { service.Error(c, e.Error, err) return } } // 画展包润格审批 if detail.Type == TypeArtExhibitionReward { err = ExhibitionRewordApproveEnter(beforeApproval, detail) if err != nil { service.Error(c, e.Error, err) return } } // 画展包修改审批 if detail.Type == TypeShowUpdate { err = ShowUpdateApproveEnter(beforeApproval, detail) if err != nil { service.Error(c, e.Error, err) return } } if strings.Contains(detail.TypeName, "人员增补申请") { err = postApproveSetStatusEnter(userInfo, detail) if err != nil { service.Error(c, e.Error, err) return } } if strings.Contains(detail.Type, "employ") { err := offerApproveSetStatusEnter(c, userInfo, &req, detail) if err != nil { service.Error(c, e.Error, err) return } } if detail.Type == "checkIn" && detail.Status == e.ApprovalWorkStatusOk { err = passSendInfoToSiteSignIn(detail.CheckIn) if err != nil { service.Error(c, e.Error, err) return } } if detail.Status == e.ApprovalWorkStatusOk && strings.Contains(detail.Type, "position") { err = processPositionApprovals(detail) if err != nil { service.Error(c, e.Error, err) return } } //黑名单画展包生成审批,只有审批通过才生成画展包,其他情况不予处理 if detail.Type == "banShow" && beforeApproval.Status == e.ApprovalWorkStatusDoing && detail.Status == e.ApprovalWorkStatusOk { for _, artShow := range detail.Exhibition.ApprovalExhibitions { var saveShowReq artShowApi.SaveShowReq artworks := make([]*artShowApi.ArtworkDetail, 0) saveShowReq.ShowName = artShow.PackageName saveShowReq.ArtistUID = artShow.ArtExhibitionDetail.ArtistUID saveShowReq.ArtistName = artShow.ArtExhibitionDetail.ArtistName saveShowReq.ArtworkNum = int32(artShow.ArtExhibitionDetail.ArtworkNum) saveShowReq.CreateTime = artShow.ArtExhibitionDetail.CreateTime saveShowReq.ExhibitionType = artShow.ArtExhibitionDetail.ExhibitionType saveShowReq.IsInvite = artShow.ArtExhibitionDetail.IsInvite saveShowReq.Operator = artShow.ArtExhibitionDetail.Operator saveShowReq.PreTime = artShow.ArtExhibitionDetail.ShowTime saveShowReq.Ruler = int32(artShow.ArtExhibitionDetail.Ruler) saveShowReq.ShowSeq = artShow.ArtExhibitionDetail.ShowSeq for _, artworkOne := range artShow.Artworks { item := &artShowApi.ArtworkDetail{ ArtworkUID: artworkOne.ArtworkUID, ArtworkName: artworkOne.ArtworkName, ArtistName: artworkOne.ArtistName, Length: int32(artworkOne.Length), Width: int32(artworkOne.Width), Ruler: int32(artworkOne.Ruler), SmallPic: artworkOne.SmallPic, Tfnum: artworkOne.Tfnum, } artworks = append(artworks, item) } saveShowReq.Artwork = artworks saveShowRes, err := service.GrpcArtShowImpl.CreateShow(context.Background(), &saveShowReq) if err != nil { service.Error(c, e.Error, err) return } out := serializer.BuildSyncArtShowUID(&saveShowReq, saveShowRes.ShowUID, nil) if len(out.Data) > 0 { syncArtShowIDRes, err := service.GrpcArtworkQueryImpl.SyncArtShowId(context.Background(), &out) if err != nil { logger.Errorf("SyncArtShowId Response err", err) service.Error(c, e.Error, errors.New(syncArtShowIDRes.Msg)) return } } // 更新 推荐人信息 if saveShowRes.ShowUID != "" { bindAndGetArtPackageRequest := new(artistinfoArtshow.BindAndGetArtPackageRequest) bindAndGetArtPackageRequest.ArtPackageUid = saveShowRes.ShowUID bindAndGetArtPackageRequest.ArtistUid = saveShowReq.ArtistUID bindAndGetArtPackageResponse, err := service.GrpcArtistInfoArtshowImpl.BindAndGetArtPackageAndBrokerSupplement(context.Background(), bindAndGetArtPackageRequest) if err != nil { service.Success(c, nil) } if bindAndGetArtPackageResponse.Data.Name != "" { artShowAgent := new(artShowApi.ArtShowAgent) artShowAgent.Agent = bindAndGetArtPackageResponse.Data.Name artShowAgent.ShowUID = saveShowRes.ShowUID updateArtShowAgentReq := new(artShowApi.UpdateArtShowAgentReq) updateArtShowAgentReq.Data = make([]*artShowApi.ArtShowAgent, 0) updateArtShowAgentReq.Data = append(updateArtShowAgentReq.Data, artShowAgent) _, err := service.GrpcArtShowImpl.UpdateArtShowAgent(context.Background(), updateArtShowAgentReq) if err != nil { service.Success(c, nil) } } } } } } service.Success(c, nil) } // SetStatusBatchExV2 催办后的批量审批 func SetStatusBatchExV2(c *gin.Context) { var setStatusBatchReq vo.SetStatusBatchReq if err := c.ShouldBindBodyWith(&setStatusBatchReq, binding.JSON); err != nil { service.Error(c, e.Error, err) return } if len(setStatusBatchReq.Batch) < 1 { service.Error(c, e.Error, errors.New("当前无审批")) return } for i := 0; i < len(setStatusBatchReq.Batch); i++ { req := api.StatusRequest{} _ = copier.CopyWithOption(&req, setStatusBatchReq.Batch[i], copier.Option{DeepCopy: false}) infoReq := account.InfoRequest{ID: req.UserId} infoRes, err := service.AccountProvider.Info(context.Background(), &infoReq) if err != nil { service.Error(c, e.Error, errors.New(e.GetMsg(e.ErrorGetUserInfo))) return } if infoRes.Info.ID == 0 || infoRes.Info.NickName == "" || infoRes.Info.Domain == "" { service.Error(c, e.Error, errors.New(e.GetMsg(e.ErrorGetUserInfo))) return } userInfo := login.Info{ ID: req.UserId, NickName: infoRes.Info.NickName, } levelReq := api.NowLevelByInfoRequestV2{ ApprovalID: req.ID, NowUserId: userInfo.ID, } fmt.Println("============== 开始查询审批流程 ==============") levelRes, err := service.ApprovalProvider.NowLevelByInfoV2(context.Background(), &levelReq) if err != nil { service.Error(c, e.Error, err) return } fmt.Printf("levelRes %+v\n", levelRes) fmt.Println("============== 开始查询审批流程 ==============") if req.UserId != levelRes.UserID { service.Error(c, e.Error, errors.New("本次审批人出现错误")) return } req.WorkFlowId = levelRes.ID // 查询 未审批前的审批 beforeApproval := QueryApprovalSetStatusBefore(req.ID) if beforeApproval == nil { service.Error(c, e.Error, errors.New(e.ErrorQueryApprovalContent)) return } _, err = service.ApprovalProvider.SetStatusV2(context.Background(), &req) if err != nil { service.Error(c, e.Error, err) return } detailReq := api.DetailRequest{ID: req.ID} detail, err := service.ApprovalProvider.Detail(context.Background(), &detailReq) if err != nil { service.Error(c, e.Error, err) return } // 同步至 es go func() { updateErr := logic.UpdateIndexApprovalDoc(config.ApprovalIndex, detail) if updateErr != nil { zap.L().Error("同步至 es 失败 更新", zap.Error(updateErr)) //return } }() if detail.TypeName == "任命审批" { StoreBaiduChainApprovalFile(req.ID) } // 审批成功查询用户部门的信息,提交画作服修改画作仓库状态 if detail.TypeName == "画作申请审批" { var ids []int32 for _, tt := range detail.Work.ApprovalWorks { ids = append(ids, int32(tt.ArtworkID)) } fmt.Println("请求画作申请审批", ids) if len(ids) > 0 { err = submitArtwork(req.UserId, ids) if err != nil { service.Error(c, e.Error, err) return } } } if strings.Contains(beforeApproval.Type, "turnover") && beforeApproval.Status == e.ApprovalWorkStatusDoing && detail.Status == e.ApprovalWorkStatusOk { loginInfo := login.Info{ ID: userInfo.ID, NickName: "离职审批:" + userInfo.NickName, } if infoRes.Info.Extend != nil { loginInfo.JumpTo = infoRes.Info.Extend.JumpTo } c.Set("jwtInfo", loginInfo) err = turnoverUpdateAccountEmployee(c, detail.ApprovalOA.Turnover) if err != nil { service.Error(c, e.Error, err) return } } if strings.Contains(beforeApproval.Type, "turnover") && (detail.Status == e.ApprovalWorkStatusRevokeOk || detail.Status == e.ApprovalWorkStatusFail) { updateDeductAnnualLeaveZeroClearing(detail.ApprovalOA.Turnover) } // approval 审批状态 同步到 oa 审批 if e.TypeMap[detail.Type] == "oa" { // 查询 审批状态已经 更新的 审批信息 updatedReq := api.DetailRequest{ID: req.ID} updatedDetail, detailErr := service.ApprovalProvider.Detail(context.Background(), &updatedReq) if detailErr != nil { service.Error(c, e.Error, detailErr) return } if req.LeaveBalance != 0 && updatedDetail.ApprovalOA.LeaveApply != nil { //leaveBalance, _ := strconv.ParseFloat(req.LeaveBalance, 10) updatedDetail.ApprovalOA.LeaveApply.LeaveBalance = req.LeaveBalance } _, updateErr := UpdateApprovalStatusToOAStatus(updatedDetail) if updateErr != nil { service.Error(c, e.Error, updateErr) return } } // 画展包审批 if detail.Type == TypeExhibition { err = ExhibitionApproveEnter(beforeApproval, detail) if err != nil { service.Error(c, e.Error, err) return } } // 画展包润格审批 if detail.Type == TypeArtExhibitionReward { err = ExhibitionRewordApproveEnter(beforeApproval, detail) if err != nil { service.Error(c, e.Error, err) return } } // 画展包修改审批 if detail.Type == TypeShowUpdate { err = ShowUpdateApproveEnter(beforeApproval, detail) if err != nil { service.Error(c, e.Error, err) return } } if strings.Contains(detail.TypeName, "人员增补申请") { err = postApproveSetStatusEnter(userInfo, detail) if err != nil { service.Error(c, e.Error, err) return } } if strings.Contains(detail.Type, "employ") { err := offerApproveSetStatusEnter(c, userInfo, &req, detail) if err != nil { service.Error(c, e.Error, err) return } } if detail.Type == "checkIn" && detail.Status == e.ApprovalWorkStatusOk { err = passSendInfoToSiteSignIn(detail.CheckIn) if err != nil { service.Error(c, e.Error, err) return } } if detail.Status == e.ApprovalWorkStatusOk && strings.Contains(detail.Type, "position") { err = processPositionApprovals(detail) if err != nil { service.Error(c, e.Error, err) return } } } service.Success(c, nil) } func MakeApprovalAndCopy(in *api.CreateRequest, setting *api.SettingRequest) (*api.ApprovalAndCopy, error) { response := &api.ApprovalAndCopy{} approvalUsers, copyUsers, err := MakeApprovalAndCopyUsers(in, setting) if err != nil { return response, errors.New("组装审批人失败") } fmt.Println("------------t5---------- start ") fmt.Println("1-----", approvalUsers) fmt.Println("2-----", copyUsers) fmt.Println("------------t5---------- end ") index := 0 for i := 0; i < len(approvalUsers); i++ { index++ approvalUsers[i].Level = uint64(index) } response.ApprovalUsers = approvalUsers response.CopyUsers = copyUsers return response, nil } func MakeApprovalAndCopyUsers(in *api.CreateRequest, setting *api.SettingRequest) ([]*api.ApprovalUser, []*api.CopyUser, error) { approvalUsers := make([]*api.ApprovalUser, 0) copyUsers := make([]*api.CopyUser, 0) approvalUsers = in.ApprovalUsers copyUsers = in.CopyUsers // 病假 事假 if in.Type == "leave" || in.Type == "sick" { if in.ApprovalOA.Leave.Days >= 2 { approvalUsers = GetCombineOaApproveUsers(setting, approvalUsers) copyUsers = GetCombineOaCopyUsers(setting, copyUsers) } else { //if in.IsLeader { approvalUsers = GetCombineOaApproveUsers(setting, approvalUsers) if len(approvalUsers) > 1 { approvalUsers = approvalUsers[:1] } //} } //新逻辑:产假 流产 独生子女护理假申请 育儿假申请====》直属2级+指定岗位 //TODO离职暂时放着(in.Type == "turnover") } else if in.Type == "maternityLeave" || in.Type == "abortLeave" || in.Type == "nursingLeaveApply" || in.Type == "parentalLeaveApply" { approvalUsers = GetCombineOaApproveUsers(setting, approvalUsers) copyUsers = GetCombineOaCopyUsers(setting, copyUsers) //新逻辑:加班/外勤 丧假 陪产假 婚假 育儿假 独生子女护理假 哺乳假 孕检假 年假 调休=====》直属1级 } else if in.Type == "outWork" || in.Type == "overTime" || in.Type == "funeralLeave" || in.Type == "makeUp" || in.Type == "paternityLeave" || in.Type == "maritalLeave" || in.Type == "parentalLeaveApply" || in.Type == "parentalLeave" || in.Type == "nursingLeave" || in.Type == "breastFeedingLeave" || in.Type == "matingCheckLeave" || in.Type == "annualLeave" || in.Type == "dayOff" { //if in.IsLeader { approvalUsers = GetCombineOaApproveUsers(setting, approvalUsers) if len(approvalUsers) > 1 { approvalUsers = approvalUsers[:1] } } fmt.Println("------------t4---------- start ") fmt.Println("1-----", approvalUsers) fmt.Println("2-----", copyUsers) fmt.Println("------------t4---------- end ") if len(approvalUsers) < 1 { return nil, nil, errors.New("组装审批人失败") } //// 去重 审批人 剔除 提交人 抄送人 剔除 审批人 //approvalUsers, copyUsers = UniqueUsersV2(in.SubmitterID, approvalUsers, copyUsers) fmt.Println("------------t5---------- start ") fmt.Println("1-----", approvalUsers) fmt.Println("2-----", copyUsers) fmt.Println("------------t5---------- end ") return approvalUsers, copyUsers, nil } // GetCombineOaApproveUsers oa审批 混合获取 func GetCombineOaApproveUsers(setting *api.SettingRequest, approvalUser []*api.ApprovalUser) []*api.ApprovalUser { approvalUserMap := make(map[uint64]*api.ApprovalUser) fmt.Println("------------oa approvalUser t1----------") // copyer if len(approvalUser) > 0 { for _, tt := range approvalUser { if _, ok := approvalUserMap[tt.ID]; ok == false { approvalUserMap[tt.ID] = tt } } } fmt.Printf("oa approvalUser t1 %+v\n----------", approvalUser) fmt.Println("------------oa approvalUser t2----------") for _, tt := range setting.OaApprovalUsers { if _, ok := approvalUserMap[tt.ID]; ok == false { approvalUserMap[tt.ID] = tt approvalUser = append(approvalUser, tt) } } fmt.Printf("oa approvalUser t2 %+v\n----------", approvalUser) return approvalUser } // GetCombineOaCopyUsers oa审批 抄送人 混合获取 func GetCombineOaCopyUsers(setting *api.SettingRequest, copyUser []*api.CopyUser) []*api.CopyUser { copyUserMap := make(map[uint64]*api.CopyUser) fmt.Println("------------oa copyUser t1----------") // copyer if len(copyUser) > 0 { for _, tt := range copyUser { if _, ok := copyUserMap[tt.ID]; ok == false { copyUserMap[tt.ID] = tt } } } fmt.Printf("oa copyUser t1 %+v\n----------", copyUser) fmt.Println("------------oa copyUser t2----------") for _, tt := range setting.OaCopyUsers { if _, ok := copyUserMap[tt.ID]; ok == false { copyUserMap[tt.ID] = tt copyUser = append(copyUser, tt) } } fmt.Printf("oa copyUser t2 %+v\n----------", copyUser) return copyUser } func UniqueUsersV2(submitterID uint64, inApprovalUsers []*api.ApprovalUser, inCopyUsers []*api.CopyUser) (approvalUsers []*api.ApprovalUser, copyUsers []*api.CopyUser) { approvalUsers = make([]*api.ApprovalUser, 0) approvalUserMap := make(map[uint64]*api.ApprovalUser, 0) copyUsers = make([]*api.CopyUser, 0) //transitionCopyUsers := make([]CopyUser, 0) for i := 0; i < len(inApprovalUsers); i++ { approvalUserMap[inApprovalUsers[i].ID] = inApprovalUsers[i] if inApprovalUsers[i].ID == submitterID { continue } else { approvalUsers = append(approvalUsers, inApprovalUsers[i]) } } var currentLevel uint64 = 0 var preLevel uint64 = 0 for i := 0; i < len(approvalUsers); i++ { if i == 0 { preLevel = approvalUsers[i].Level currentLevel = approvalUsers[i].Level } else { currentLevel = approvalUsers[i].Level if approvalUsers[i].Level == preLevel { approvalUsers[i].Level = currentLevel } else { approvalUsers[i].Level = currentLevel preLevel = currentLevel currentLevel++ } } } approvalUsersMap := make(map[uint64][]*api.ApprovalUser) levels := make([]int, 0) for i := 0; i < len(approvalUsers); i++ { if approvalUsersMap[approvalUsers[i].Level] == nil { levels = append(levels, int(approvalUsers[i].Level)) } approvalUsersMap[approvalUsers[i].Level] = append(approvalUsersMap[approvalUsers[i].Level], approvalUsers[i]) } newApprovalUsers := make([]*api.ApprovalUser, 0) sort.Ints(levels) if len(levels) > 0 { for i := 0; i < len(levels); i++ { for j := 0; j < len(approvalUsersMap[uint64(levels[i])]); j++ { if approvalUsersMap[uint64(levels[i])][j].Level == 0 { //approvalUsersMap[uint64(levels[i])][j].Level = uint64(j + 1) approvalUsersMap[uint64(levels[i])][j].Level = 1 approvalUsersMap[uint64(levels[i])][j].Signature = m.AndSignType } else { approvalUsersMap[uint64(levels[i])][j].Level = approvalUsersMap[uint64(levels[i-1])][len(approvalUsersMap[uint64(levels[i])])-1].Level + 1 } } newApprovalUsers = append(newApprovalUsers, approvalUsersMap[uint64(levels[i])]...) } } approvalUsers = newApprovalUsers if len(inCopyUsers) > 0 { for i := 0; i < len(inCopyUsers); i++ { if inCopyUsers[i].ID == submitterID { continue } else if _, ok := approvalUsersMap[inCopyUsers[i].ID]; ok { continue } else { copyUsers = append(copyUsers, inCopyUsers[i]) } } } return } func FindEmploy(c *gin.Context) { var req api.Employ if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, errors.New("参数获取错误")) return } res, err := service.ApprovalProvider.FindEmployJobNum(c, &req) if err != nil { sentry.CaptureException(err) service.Error(c, e.Error, err) return } service.Success(c, res) } func UpdatesOldData(c *gin.Context) { var req api.CommonResponse //if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { // service.Error(c, e.Error, errors.New("参数获取错误")) // return //} res, err := service.ApprovalProvider.UpdatesOldData(c, &req) if err != nil { sentry.CaptureException(err) service.Error(c, e.Error, err) return } service.Success(c, res) } func ExportDetailSetting(c *gin.Context) { var req api.CreateRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, err) return } userInfo := login.GetUserInfoFromC(c) //resGroup, err1 := service.ApprovalProvider.OnlyGroupList(c, &api.ApprovalGroupListRequest{Page: 1, PageSize: 99, Domain: "0"}) //if err1 != nil { // sentry.CaptureException(err1) // service.Error(c, e.Error, err1) // return //} settingList := make([]*api.CreateApprovalTypeRequest, 0) //for _, request := range resGroup.GroupList { resSetting, err1 := service.ApprovalProvider.ApprovalTypeList(c, &api.ApprovalTypeListRequest{PageSize: 9999, Page: 1, Domain: req.Domain, GroupId: req.ID}) if err1 != nil { service.Error(c, e.Error, err1) return } if len(resSetting.TypeList) > 0 { settingList = append(settingList, resSetting.TypeList...) } //} var err error var xlsx *excelize.File var exportUrl string xlsx, err = excelize.OpenFile(model.TplPath + "审批流程导出.xlsx") if err != nil { service.Error(c, e.Error, err) return } for index, setting := range settingList { xlsx.SetCellValue("Sheet1", fmt.Sprintf("A%v", index+2), setting.GroupName) xlsx.SetCellValue("Sheet1", fmt.Sprintf("B%v", index+2), setting.Title) //authMap := make(map[string]*api.ApprovalAuth) //departmentName := "" //for _, auth := range setting.Auths { // departmentName = departmentName + "/" + auth.DepartmentName + "-" + auth.PositionName //} //xlsx.SetCellValue("Sheet1", fmt.Sprintf("C%v", index+2), departmentName) approvalUser := "" for _, user1 := range setting.ApprovalUsers { if user1.ID == 0 { //指定部门岗位 if user1.DepartmentUID != "" && user1.PositionUID != "" { listReq := new(account.ListV2Request) departmentId, _ := strconv.ParseUint(user1.DepartmentUID, 0, 64) positionId, _ := strconv.ParseUint(user1.PositionUID, 0, 64) listReq.DepartmentId = uint32(departmentId) listReq.PositionId = uint32(positionId) // 查询部门下的审批人 listRes, err3 := service.AccountProvider.ListV2(context.Background(), listReq) if err3 != nil { sentry.CaptureException(err3) service.Error(c, e.Error, err3) return } for _, datum := range listRes.Data { if approvalUser == "" { approvalUser = datum.NickName } else { approvalUser = approvalUser + "/" + datum.NickName } } } else if user1.IsDirect == 1 { myBossReq := new(department.MyBossesReq) if strings.Contains(setting.KeyWord, "employ") { myBossReq.DepartmentId = uint32(req.DepartmentID) } else { myBossReq.UserId = uint32(userInfo.ID) myBossReq.DepartmentId = uint32(req.DepartmentID) } myBossReq.Level = uint32(user1.Level) if user1.IsDesignate == 1 { myBossReq.IsDesignate = true } else { myBossReq.IsDesignate = false } fmt.Println("============ 获取 审批 直属领导 审批人 请求参数 ==============") fmt.Printf("myBossReq %+v\n", myBossReq) fmt.Println("============ 获取 审批 直属领导 审批人 请求参数 ==============") myBossRes, err := service.DepartmentProvider.MyBosses(context.Background(), myBossReq) if err != nil { sentry.CaptureException(err) service.Error(c, e.Error, err) return } for _, datum := range myBossRes.List { for _, boss := range datum.Bosses { if approvalUser == "" { approvalUser = boss.Name } else { approvalUser = approvalUser + "/" + boss.Name } } } } //指定人员 } else { if approvalUser == "" { approvalUser = user1.Name } else { approvalUser = approvalUser + "/" + user1.Name } } //if user.ID == 0 { // isDesignate := "" // if user.IsDesignate == 1 { // isDesignate = "第" // } // if user.DepartmentUID == "" || user.PositionUID == "" { // approvalUser = approvalUser + "/" + "直属" + isDesignate + strconv.FormatUint(user.Level, 10) + "级" // } else { // approvalUser = approvalUser + "/" + user.DepartmentName + "-" + user.PositionName // } // //} else { // // approvalUser = approvalUser + "/" + user.Name //} } xlsx.SetCellValue("Sheet1", fmt.Sprintf("D%v", index+2), approvalUser) copyUserName := "" for _, copyUser := range setting.CopyUsers { if copyUser.ID == 0 { listReq := new(account.ListV2Request) departmentId, _ := strconv.ParseUint(copyUser.DepartmentUID, 0, 64) positionId, _ := strconv.ParseUint(copyUser.PositionUID, 0, 64) listReq.DepartmentId = uint32(departmentId) listReq.PositionId = uint32(positionId) // 查询部门下的审批人 listRes, err3 := service.AccountProvider.ListV2(context.Background(), listReq) if err3 != nil { sentry.CaptureException(err3) service.Error(c, e.Error, err3) return } for _, datum := range listRes.Data { if copyUserName == "" { copyUserName = datum.NickName } else { copyUserName = copyUserName + "/" + datum.NickName } } } else { if copyUserName == "" { copyUserName = copyUser.Name } else { copyUserName = copyUserName + "/" + copyUser.Name } } } xlsx.SetCellValue("Sheet1", fmt.Sprintf("E%v", index+2), copyUserName) status := "启用" if setting.Status != 1 { status = "禁用" } xlsx.SetCellValue("Sheet1", fmt.Sprintf("F%v", index+2), status) } fileName := "审批流程导出" + ".xlsx" var httpType string if config.IsHttps { httpType = model.HttpsType } else { httpType = model.HttpType } if err = xlsx.SaveAs(model.MediaPath + fileName); err != nil { return } exportUrl = fmt.Sprintf("%s%s/static/%s", httpType, c.Request.Host, fileName) service.Success(c, map[string]string{ "ExportUrl": exportUrl, }) } func CreateAuthQuick(c *gin.Context) { var req api.QkCreAuthReq if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, errors.New("参数获取错误")) return } res, err := service.ApprovalProvider.CreateAuthQuick(c, &req) if err != nil { sentry.CaptureException(err) service.Error(c, e.Error, err) return } service.Success(c, res) } func FindTurnoverAndHandover(c *gin.Context) { var req api.ApprovalGroupListRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, errors.New("参数获取错误")) return } res, err := service.ApprovalProvider.FindTurnoverAndHandover(c, &req) if err != nil { sentry.CaptureException(err) service.Error(c, e.Error, err) return } service.Success(c, res) } /* // 查询部门 puRequest := &rule.PositionUserListRequest{} puRes, err := service.RuleProvider.PositionUserList(context.Background(), puRequest) if err != nil { service.Error(c, e.Error, err) return } // 关联职位和部门信息 for j := range puRes.Data { if userInfo.ID == puRes.Data[j].UserId { userInfo.PositionUsers = append(userInfo.PositionUsers, &rule.PositionUser{ PositionID: puRes.Data[j].PositionID, PositionName: puRes.Data[j].PositionName, DepartmentId: puRes.Data[j].DepartmentId, DepartmentCode: puRes.Data[j].DepartmentCode, DepartmentName: puRes.Data[j].DepartmentName, UserId: puRes.Data[j].UserId, UserName: puRes.Data[j].UserName, }) } } */ func ExportDetailSettingV2(c *gin.Context) { var req api.CreateRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, err) return } userInfo := login.GetUserInfoFromC(c) //resGroup, err1 := service.ApprovalProvider.OnlyGroupList(c, &api.ApprovalGroupListRequest{Page: 1, PageSize: 99, Domain: "0"}) //if err1 != nil { // sentry.CaptureException(err1) // service.Error(c, e.Error, err1) // return //} fileName := "审批流程导出" + ".xlsx" //var exportUrl string go func(userInfo login.Info, req *api.CreateRequest) { var err error var xlsx *excelize.File xlsx, err = excelize.OpenFile(model.TplPath + "审批流程导出.xlsx") if err != nil { service.Error(c, e.Error, err) return } // 查询部门 //puRequest := &rule.PositionUserListRequest{} //puRes, positionUserListErr := service.RuleProvider.PositionUserList(context.Background(), puRequest) //if positionUserListErr != nil { // service.Error(c, e.Error, positionUserListErr) // return //} // 关联职位和部门信息 //for j := range puRes.Data { // if userInfo.ID == puRes.Data[j].UserId { // userInfo.PositionUsers = append(userInfo.PositionUsers, &rule.PositionUser{ // PositionID: puRes.Data[j].PositionID, // PositionName: puRes.Data[j].PositionName, // DepartmentId: puRes.Data[j].DepartmentId, // DepartmentCode: puRes.Data[j].DepartmentCode, // DepartmentName: puRes.Data[j].DepartmentName, // UserId: puRes.Data[j].UserId, // UserName: puRes.Data[j].UserName, // }) // } //} typeList := &api.ApprovalTypeListRequest{PageSize: 9999, Page: 1, Domain: req.Domain, GroupId: req.ID} if userInfo.PositionUsers == nil || len(userInfo.PositionUsers) < 1 { typeList.Positions = make([]*api.ApprovalTypeListRequest_Position, 0) for i := 0; i < len(userInfo.PositionUsers); i++ { typeList.Positions = append(typeList.Positions, &api.ApprovalTypeListRequest_Position{ PositionUID: strconv.FormatUint(userInfo.PositionUsers[i].PositionID, 10), DepartmentUID: strconv.FormatUint(userInfo.PositionUsers[i].DepartmentId, 10), }) } } //for _, request := range resGroup.GroupList { resSetting, err1 := service.ApprovalProvider.ApprovalTypeList(c, typeList) if err1 != nil { service.Error(c, e.Error, err1) return } //创建 插入表格的 内容 rowIndex := 2 for i := 0; i < len(userInfo.PositionUsers); i++ { position := userInfo.PositionUsers[i] // 组装 审批人 和 抄送人 for j := 0; j < len(resSetting.TypeList); j++ { if m.GetOaType(resSetting.TypeList[j].KeyWord) != "" { continue } makeApprovalUserReq := new(api.CreateRequest) makeApprovalUserReq.Domain = resSetting.TypeList[j].Domain makeApprovalUserReq.Type = resSetting.TypeList[j].KeyWord makeApprovalUserReq.DepartmentID = int64(position.DepartmentId) if strings.Contains(makeApprovalUserReq.Type, "employ") { makeApprovalUserReq.Employ = new(api.Employ) makeApprovalUserReq.Employ.DepartmentId = strconv.FormatInt(makeApprovalUserReq.DepartmentID, 10) } fmt.Println("====================获取审批人=========================") approvalAndCopy, makeApprovalAndUserErr := makeApprovalAndUser(userInfo, makeApprovalUserReq) if err != nil { //service.Error(c, e.Error, err) //return fmt.Println("makeApprovalAndUserErr", makeApprovalAndUserErr) continue } if approvalAndCopy == nil { continue } if approvalAndCopy.ApprovalUsers == nil { continue } if approvalAndCopy.CopyUsers == nil { continue } approvalUsers := make([]string, 0) for k := 0; k < len(approvalAndCopy.ApprovalUsers); k++ { approvalUsers = append(approvalUsers, approvalAndCopy.ApprovalUsers[k].Name) } copyUsers := make([]string, 0) for k := 0; k < len(approvalAndCopy.CopyUsers); k++ { copyUsers = append(copyUsers, approvalAndCopy.CopyUsers[k].Name) } value := make([]interface{}, 0) value = append(value, userInfo.PositionUsers[i].DepartmentName) value = append(value, resSetting.TypeList[j].Title) value = append(value, "") if approvalUsers != nil && len(approvalUsers) > 0 { value = append(value, strings.Join(approvalUsers, "/")) } else { value = append(value, "") } if copyUsers != nil && len(copyUsers) > 0 { value = append(value, strings.Join(copyUsers, "/")) } else { value = append(value, "") } status := "启用" if resSetting.TypeList[j].Status != 1 { status = "禁用" } //value = append(value, "") value = append(value, status) xlsx.SetSheetRow("Sheet1", fmt.Sprintf("A%v", rowIndex), &value) rowIndex++ } } rowIndex = rowIndex + 2 now := time.Now().Format("2006-01-02 15:04:05") xlsx.SetSheetRow("Sheet1", fmt.Sprintf("A%v", rowIndex), &now) if err = xlsx.SaveAs(model.MediaPath + fileName); err != nil { return } //exportUrl = fmt.Sprintf("%s%s/static/%s", httpType, c.Request.Host, fileName) }(userInfo, &req) service.ResponseMsg(c, e.SUCCESS, serializer.Response{ Data: "执行完成", Status: e.Ok, }) } func FindSuperType(c *gin.Context) { var req api.ListRequest if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, errors.New("参数获取错误")) return } res, err := service.ApprovalProvider.FindSuperType(c, &req) if err != nil { sentry.CaptureException(err) service.Error(c, e.Error, err) return } service.Success(c, res) } func CreateAuthBatch(c *gin.Context) { var req api.CreAuthBatchReq if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.Error, errors.New("参数获取错误")) return } res, err := service.ApprovalProvider.CreateAuthBatch(c, &req) if err != nil { sentry.CaptureException(err) service.Error(c, e.Error, err) return } service.Success(c, res) }