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 0 9 : 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 ( )
}