package postpc
import (
"encoding/json"
"fmt"
"key_performance_indicators/models/modelshr"
"key_performance_indicators/models/modelskpi"
"key_performance_indicators/overall"
"key_performance_indicators/overall/publicmethod"
"sort"
"strconv"
"github.com/gin-gonic/gin"
)
// 获取岗位相关指标
func ( a * ApiMethod ) GetPostAboutTarget ( c * gin . Context ) {
var receivedValue publicmethod . PublicId
err := c . ShouldBindJSON ( & receivedValue )
if err != nil {
publicmethod . Result ( 100 , err , c )
return
}
//获取岗位相关信息
var postCont modelshr . Position
postContErr := postCont . GetCont ( map [ string ] interface { } { "`id`" : receivedValue . Id } , "`id`" , "`duties`" , "`administrative_organization`" , "`superior`" , "`department`" )
if postContErr != nil {
publicmethod . Result ( 107 , postContErr , c )
return
}
//根据维度生成方案列表
//1、获取维度
var dimensionModels modelskpi . DutyClass
dimensionList , dimeErr := dimensionModels . ContMap ( map [ string ] interface { } { "`state`" : 1 } , "`id`" , "`title`" , "`sort`" )
fmt . Printf ( "dimensionList--->%v\n" , dimensionList )
if dimeErr != nil || len ( dimensionList ) <= 0 {
publicmethod . Result ( 107 , postContErr , c )
return
}
//2、根据维度获取岗位相关指标
var postPlanSync postDimeTarSync
for _ , v := range dimensionList {
syncSeting . Add ( 1 )
go postPlanSync . GetPostTargent ( postCont , v )
}
syncSeting . Wait ( )
planAry := postPlanSync . readDataLock ( ) //读取线程通道数据
if len ( planAry ) < 1 {
publicmethod . Result ( 1 , planAry , c , "该岗位没有设定专属指标!您可以从部门指标中引入!" )
return
}
//根据维度序号排序
sort . Slice ( planAry , func ( i , j int ) bool {
return planAry [ i ] . Sort < planAry [ j ] . Sort
} )
publicmethod . Result ( 0 , planAry , c )
}
// 获取岗位与维度相关的指标
/ *
@ position 岗位信息
@ dutyClass 维度信息
* /
func ( p * postDimeTarSync ) GetPostTargent ( position modelshr . Position , dutyClass modelskpi . DutyClass ) {
p . mutext . Lock ( )
defer p . mutext . Unlock ( )
//获取相关指标
var postTargetList [ ] modelskpi . PostTarget
postTarErr := overall . CONSTANT_DB_KPI . Model ( & modelskpi . PostTarget { } ) . Where ( "`state` = 1 AND `dimension` = ? AND `rele_depart` = ? AND FIND_IN_SET(?,`departments_post`)" , dutyClass . Id , position . AdministrativeOrganization , position . Id ) . Find ( & postTargetList ) . Error
fmt . Printf ( "postTargetList---->%v\n" , postTargetList )
if postTarErr == nil && len ( postTargetList ) > 0 {
var planCont postAboutDimeTar
planCont . Id = strconv . FormatInt ( dutyClass . Id , 10 )
planCont . Name = dutyClass . Title
planCont . Sort = dutyClass . Sort
for _ , v := range postTargetList {
var targetCont postAboutTarget
targetCont . Id = strconv . FormatInt ( v . Id , 10 )
targetCont . Name = v . Title
targetCont . Content = "" //指标描述
targetCont . StandardScore = getPostDimeTarWeight ( position . AdministrativeOrganization , position . Id , dutyClass . Id , v . Id , 1 , 1 ) //标准分
targetCont . Unit = v . Unit //单位
targetCont . IsTrue = 2 //是否允许修改 1:不允许;2:允许
targetCont . State = 1 //状态 1:启用;2:禁用;3:观察
planCont . Child = append ( planCont . Child , targetCont )
}
p . planList = append ( p . planList , planCont )
}
syncSeting . Done ( )
}
/ *
获取岗位考核指标或维度标准分
@ orgid 行政组织
@ postid 岗位
@ dimensionid 维度
@ targetid 指标
@ hierarchy 1 : 维度 ; 2 : 指标
@ isQuote 1 : 不是引用 ; 2 : 引用部门
getPostDimeTarWeight ( orgid , postid , dimensionid , targetid int64 , hierarchy , isQuote int )
* /
func getPostDimeTarWeight ( orgid , postid , dimensionid , targetid int64 , hierarchy , isQuote int ) int64 {
if hierarchy == 0 {
hierarchy = 2
}
where := publicmethod . MapOut [ string ] ( )
where [ "orgid" ] = orgid
where [ "postid" ] = postid
where [ "dimension" ] = dimensionid
var ddpwCont modelskpi . DepartDimePostWeight
if hierarchy == 1 {
where [ "hierarchy" ] = 1
// ddpwCont.GetCont(map[string]interface{}{"orgid": orgid, "postid": postid, "dimension": dimensionid, "hierarchy": 1}, "`weight`")
ddpwCont . GetCont ( where , "`weight`" )
} else {
where [ "target" ] = targetid
where [ "hierarchy" ] = 2
// ddpwCont.GetCont(map[string]interface{}{"orgid": orgid, "postid": postid, "dimension": dimensionid, "target": targetid, "hierarchy": 2}, "`weight`")
ddpwCont . GetCont ( where , "`weight`" )
}
return ddpwCont . Weight
}
// 引用指标部门指标
func ( a * ApiMethod ) QuoteDepartmentTarget ( c * gin . Context ) {
var receivedValue publicmethod . PublicId
err := c . ShouldBindJSON ( & receivedValue )
if err != nil {
publicmethod . Result ( 100 , err , c )
return
}
if receivedValue . Id == "" {
publicmethod . Result ( 101 , err , c )
return
}
//获取维度
var dimenId [ ] int64
err = overall . CONSTANT_DB_KPI . Model ( & modelskpi . TargetDepartment { } ) . Distinct ( "`dimension_id`" ) . Where ( "`state` = 1 AND `level` = 2 AND `post_id` = ?" , receivedValue . Id ) . Find ( & dimenId ) . Error
if err != nil || len ( dimenId ) < 1 {
publicmethod . Result ( 107 , err , c )
return
}
var targetlist postDimeTarSync
//获取指标列表
for _ , v := range dimenId {
syncSeting . Add ( 1 )
go targetlist . getPostQuoteDepartmentTarget ( v , receivedValue . Id )
}
syncSeting . Wait ( )
planAry := targetlist . readDataLock ( ) //读取线程通道数据
if len ( planAry ) < 1 {
publicmethod . Result ( 1 , planAry , c , "该岗位没有设定部门指标引入项!" )
return
}
//根据维度序号排序
sort . Slice ( planAry , func ( i , j int ) bool {
return planAry [ i ] . Sort < planAry [ j ] . Sort
} )
publicmethod . Result ( 0 , planAry , c )
}
/ *
获取岗位引入部门指标的列表
@ dimensionId 维度
@ postId 岗位
* /
func ( p * postDimeTarSync ) getPostQuoteDepartmentTarget ( dimensionId int64 , postId string ) {
p . mutext . Lock ( )
defer p . mutext . Unlock ( )
var listCont postAboutDimeTar
//获取维度信息
var dimenCont modelskpi . DutyClass
dimenCont . GetCont ( map [ string ] interface { } { "`id`" : dimensionId } , "`title`" , ` sort ` )
listCont . Id = strconv . FormatInt ( dimensionId , 10 )
listCont . Name = dimenCont . Title
listCont . Sort = dimenCont . Sort
//获取岗位信息
var postCont modelshr . Position
postCont . GetCont ( map [ string ] interface { } { "`id`" : postId } , "`id`" , "`administrative_organization`" )
var targetId [ ] int64
overall . CONSTANT_DB_KPI . Model ( & modelskpi . TargetDepartment { } ) . Distinct ( "`target_id`" ) . Where ( "`state` = 1 AND `level` = 2 AND `dimension_id` = ? AND `post_id` = ?" , dimensionId , postId ) . Find ( & targetId )
if len ( targetId ) > 0 {
//获取指标信息
var targetList [ ] modelskpi . EvaluationTarget
overall . CONSTANT_DB_KPI . Model ( & modelskpi . EvaluationTarget { } ) . Where ( "`et_state` = 1 AND `et_id` IN ?" , targetId ) . Find ( & targetList )
if len ( targetList ) > 0 {
for _ , v := range targetList {
var targetCont postAboutTarget
targetCont . Id = strconv . FormatInt ( v . Id , 10 )
targetCont . Name = v . Title
targetCont . Content = "" //指标描述
targetCont . StandardScore = getPostDimeTarWeight ( postCont . AdministrativeOrganization , postCont . Id , dimensionId , v . Id , 2 , 2 ) //标准分
targetCont . Unit = v . Uniteing //单位
targetCont . IsTrue = 2 //是否允许修改 1:不允许;2:允许
targetCont . State = 1 //状态 1:启用;2:禁用;3:观察
targetCont . Type = v . Type
if v . Type == 1 {
detaildList := getQuoteTargetDepartList ( dimensionId , v . Id , postCont . Id )
if len ( detaildList ) > 0 {
targetCont . Child = detaildList
listCont . Child = append ( listCont . Child , targetCont )
}
} else {
listCont . Child = append ( listCont . Child , targetCont )
}
}
}
}
if len ( listCont . Child ) > 0 {
p . planList = append ( p . planList , listCont )
}
jsonStr , _ := json . Marshal ( listCont )
fmt . Printf ( "jsonStr------->%v\n" , string ( jsonStr ) )
syncSeting . Done ( )
}
// 获取部门引用关联指标细则
func getQuoteTargetDepartList ( dimensionId , targetId , postId int64 ) ( listCont [ ] quoteDeatinDeparment ) {
var detaildId [ ] int64
overall . CONSTANT_DB_KPI . Model ( & modelskpi . TargetDepartment { } ) . Distinct ( "`target_bylaws`" ) . Where ( "`state` = 1 AND `level` = 2 AND `dimension_id` = ? AND `target_id` = ? AND `post_id` = ? AND `target_bylaws` <> 0" , dimensionId , targetId , postId ) . Find ( & detaildId )
if len ( detaildId ) < 1 {
return
}
var detaildList [ ] modelskpi . DetailedTarget
overall . CONSTANT_DB_KPI . Model ( & modelskpi . DetailedTarget { } ) . Select ( "`dt_id`,`dt_title`,`dt_content`,`dt_min_score`,`dt_max_score`" ) . Where ( "`dt_state` = 1 AND `dt_id` IN ?" , detaildId ) . Find ( & detaildList )
if len ( detaildList ) < 1 {
return
}
for _ , v := range detaildList {
var contList quoteDeatinDeparment
contList . Id = strconv . FormatInt ( v . Id , 10 )
contList . Name = v . Title
biaoZhun := ""
if v . MinScore != 0 {
biaoZhun = fmt . Sprintf ( "%v-%v" , v . MinScore , v . MaxScore )
} else {
biaoZhun = fmt . Sprintf ( "%v" , v . MaxScore )
}
contList . ReferenceScore = biaoZhun
listCont = append ( listCont , contList )
}
fmt . Println ( "----------------->" )
return
}
// 提交岗位考核方案
func ( a * ApiMethod ) SubmitPostScheme ( c * gin . Context ) {
var receivedValue postScheme
c . ShouldBindJSON ( & receivedValue )
if receivedValue . OrgId == "" {
publicmethod . Result ( 101 , receivedValue . OrgId , c , "请指定行政组织ID" )
return
}
if receivedValue . PostId == "" {
publicmethod . Result ( 101 , receivedValue . PostId , c , "请指定行政组织ID" )
return
}
if receivedValue . Year == "" {
publicmethod . Result ( 101 , receivedValue . Year , c , "请指定方案属于哪一年的?" )
return
}
if len ( receivedValue . PostChild ) < 1 && len ( receivedValue . DepartmentChild ) < 1 {
publicmethod . Result ( 1 , receivedValue , c , "考核项目不能为空!" )
return
}
jsonCont , _ := json . Marshal ( receivedValue )
publicmethod . Result ( 0 , string ( jsonCont ) , c )
}