package administrativeorganization import ( "encoding/json" "fmt" "hr_server/grocerystore" "hr_server/models" "hr_server/overall" "hr_server/overall/overallhandle" "sort" "strconv" "github.com/gin-gonic/gin" ) /* * @ 作者: 秦东 @ 时间: 2023-02-24 09:36:28 @ 功能: 获取行政组织与岗位树 @ 参数 # @ 返回值 # @ 方法原型 # */ func (o *OrganizationApi) GetOrgAndPostThree(c *gin.Context) { var requestData OrgAndMAnThreeType c.ShouldBindJSON(&requestData) redisFileKey := fmt.Sprintf("OrgPost:OrgPostContList:%v_%v", overall.CONSTANT_CONFIG.RedisPrefixStr.Alias, "orgpostcont") redisClient := grocerystore.RunRedis(overall.CONSTANT_REDIS4) orgList, orgErr := redisClient.SMEMBERS(redisFileKey) if orgErr != nil || len(orgList) < 1 { //获取行政组织 var orgList []models.OrgContType gormDb := overall.CONSTANT_DB_HR.Where("`state` = ? ", 1) if requestData.All == 0 { // requestData.Id = "309" gormDb = gormDb.Where("`id` NOT IN ?", []int{312, 293, 305, 306, 307}) } if requestData.Level != 0 { gormDb = gormDb.Where("`level` <= ?", requestData.Level) } // departmentId := overallhandle.RecursionOrgLeveEs(282, 282, 3) // overallhandle.Result(2555646, departmentId, c) // return err := gormDb.Find(&orgList).Error if err != nil { overallhandle.Result(107, err, c) return } var total int64 totalErr := gormDb.Count(&total).Error if totalErr != nil { total = 0 } pageSize := 1 //计算分协程数据基数 switch { case total > 10 && total <= 10000: pageSize = 100 case total > 10000: pageSize = 1000 default: pageSize = 1 } var contList []OutPutOrgAndPost var syncOrgToPost OrgAndPostSync for i, v := range orgList { var sendCont OutPutOrgAndPost sendCont.Id = strconv.FormatInt(v.Id, 10) sendCont.Number = v.Number sendCont.Name = v.Name sendCont.Superior = v.Superior sendCont.Attribute = 1 sendCont.Sort = 1 sendCont.OrgId = strconv.FormatInt(v.Id, 10) if (i+1)%pageSize == 0 { contList = append(contList, sendCont) synProes.Add(1) go syncOrgToPost.GetPostInfoList(contList) contList = []OutPutOrgAndPost{} } else { contList = append(contList, sendCont) } } if len(contList) > 0 { //判断盈余分组数据 synProes.Add(1) go syncOrgToPost.GetPostInfoList(contList) } synProes.Wait() allOrgAndPostContList := syncOrgToPost.readDataLock() sort.Slice(allOrgAndPostContList, func(i, j int) bool { return allOrgAndPostContList[i].Sort < allOrgAndPostContList[j].Sort }) sort.Slice(allOrgAndPostContList, func(i, j int) bool { return allOrgAndPostContList[i].Superior < allOrgAndPostContList[j].Superior }) var allNumber []string redisClient.SetRedisTime(86400) for _, v := range allOrgAndPostContList { allNumber = append(allNumber, v.Number) vJsonStr, jsonErr := json.Marshal(v) if jsonErr == nil { redisClient.Sadd(redisFileKey, string(vJsonStr)) } } var sendList []OutPutOrgAndPostLoop sendList = OrgAndPostThreeList(requestData.Id, allOrgAndPostContList) outputDataAry := overallhandle.MapOut() outputDataAry["count"] = len(allOrgAndPostContList) outputDataAry["list"] = sendList outputDataAry["allnumber"] = allNumber overallhandle.Result(0, outputDataAry, c) } else { var sendListCont []OutPutOrgAndPost var allNumber []string for _, v := range orgList { var redisCont OutPutOrgAndPost jsonErr := json.Unmarshal([]byte(v), &redisCont) // fmt.Printf("jsonErr=========>%v\n", jsonErr) if jsonErr == nil { sendListCont = append(sendListCont, redisCont) allNumber = append(allNumber, redisCont.Number) } } sendList := OrgAndPostThreeList(requestData.Id, sendListCont) outputDataAry := overallhandle.MapOut() outputDataAry["count"] = len(sendListCont) outputDataAry["list"] = sendList outputDataAry["allnumber"] = allNumber overallhandle.Result(0, outputDataAry, c) } } // 合成树形结构 func OrgAndPostThreeList(superiorId string, contList []OutPutOrgAndPost) []OutPutOrgAndPostLoop { three := []OutPutOrgAndPostLoop{} for _, v := range contList { supIdStr := strconv.FormatInt(v.Superior, 10) if superiorId == supIdStr { child := OrgAndPostThreeList(v.OrgId, contList) var node OutPutOrgAndPostLoop node.Id = v.Id node.Number = v.Number node.Name = v.Name node.Superior = v.Superior node.Attribute = v.Attribute node.Sort = v.Sort node.OrgId = v.OrgId node.OrgName = v.OrgName node.DepartId = v.DepartId node.DepartName = v.DepartName node.AdminOrg = v.AdminOrg if len(child) > 0 { node.Child = child } three = append(three, node) } } return three } // 获取岗位列表 func (o *OrgAndPostSync) GetPostInfoList(contList []OutPutOrgAndPost) { o.mutext.Lock() defer o.mutext.Unlock() var orgId []string for _, v := range contList { if overallhandle.IsInTrue[string](v.Id, orgId) == false { orgId = append(orgId, v.Id) o.orgAndPostList = append(o.orgAndPostList, v) } } if len(orgId) > 0 { var postContList []models.Position err := overall.CONSTANT_DB_HR.Model(&models.Position{}).Select("`id`,`number`,`name`,`administrative_organization`,`superior`").Where("`state` = 1 AND `administrative_organization` IN ?", orgId).Find(&postContList).Error if err == nil { for _, v := range postContList { // _, _, departmentId, _, _ := overallhandle.GetOrgStructure(v.AdministrativeOrganization) departmentId := overallhandle.RecursionOrgLeveEs(v.AdministrativeOrganization, v.AdministrativeOrganization, 3) var departCont models.AdministrativeOrganization departCont.GetCont(map[string]interface{}{"`id`": departmentId}, "`name`") var sendCont OutPutOrgAndPost sendCont.Id = strconv.FormatInt(v.Id, 10) sendCont.Number = v.Number sendCont.Name = v.Name sendCont.Superior = v.AdministrativeOrganization sendCont.Attribute = 2 sendCont.Sort = 2 sendCont.OrgId = "-1" sendCont.DepartId = strconv.FormatInt(departmentId, 10) sendCont.DepartName = departCont.Name sendCont.AdminOrg = strconv.FormatInt(v.AdministrativeOrganization, 10) if departmentId == v.AdministrativeOrganization { sendCont.OrgName = departCont.Name } else { var orgCont models.AdministrativeOrganization orgCont.GetCont(map[string]interface{}{"`id`": v.AdministrativeOrganization}, "`name`") sendCont.OrgName = orgCont.Name } o.orgAndPostList = append(o.orgAndPostList, sendCont) } } } synProes.Done() }