package statistics
import (
"encoding/json"
"fmt"
"strconv"
"time"
"gin_server_admin/api/statistics/quantification"
"gin_server_admin/commonus"
"gin_server_admin/global"
"gin_server_admin/model/assessmentmodel"
"gin_server_admin/model/common/response"
"gin_server_admin/model/hrsystem"
"github.com/gin-gonic/gin"
)
// 计算成绩表
func ( a * ApiGroup ) Queryresults ( c * gin . Context ) {
isTrue , userCont := commonus . ClientIdentity ( )
if isTrue != true {
response . Result ( 101 , isTrue , "您的身份令牌已经失效!请重新登录获取身份令牌!" , c )
return
}
var requestData TranscriptTable
c . ShouldBindJSON ( & requestData )
//获取当前访问人的公司组织架构
var orgList [ ] hrsystem . AdministrativeOrganization
gromDb := global . GVA_DB_HrDataBase . Model ( & hrsystem . AdministrativeOrganization { } ) . Where ( "ispower = 1 AND state = 1 AND organization_type > 2" )
if requestData . Group != "" {
gromDb = gromDb . Where ( "superior = ?" , requestData . Group )
} else {
gromDb = gromDb . Where ( "superior = ?" , userCont . Company )
}
if requestData . Department != "" {
gromDb = gromDb . Where ( "`id` = ?" , requestData . Department )
}
err := gromDb . Find ( & orgList ) . Error
if err != nil {
response . Result ( 102 , err , "没有查询到数据" , c )
return
}
if len ( orgList ) <= 0 {
response . Result ( 103 , err , "没有查询到数据" , c )
return
}
var orgAry [ ] hrsystem . AdministrativeOrganization
for _ , ov := range orgList {
sunOrgList , orgSunErr := getSunOrgList ( ov . Id )
if orgSunErr == nil && len ( sunOrgList ) > 0 {
for _ , sv := range sunOrgList {
orgAry = append ( orgAry , sv )
}
} else {
orgAry = append ( orgAry , ov )
}
}
//计算要查询的年份
currentYear := commonus . ComputingTime ( time . Now ( ) . Unix ( ) , 1 )
todayYear := currentYear
if requestData . Year != "" {
yearInt64 , _ := strconv . ParseInt ( requestData . Year , 10 , 64 )
currentYear = yearInt64
}
//计算月
var monthTody [ ] int64
if len ( requestData . Month ) < 1 {
if currentYear == todayYear {
monthTodyIng := commonus . ComputingTime ( time . Now ( ) . Unix ( ) , 3 )
var montInt64 int64
for montInt64 = 1 ; montInt64 <= monthTodyIng ; montInt64 ++ {
monthTody = append ( monthTody , montInt64 )
}
} else {
var montInt64All int64
for montInt64All = 1 ; montInt64All <= 12 ; montInt64All ++ {
monthTody = append ( monthTody , montInt64All )
}
}
} else {
for _ , mmv := range requestData . Month {
monthTody = append ( monthTody , int64 ( mmv ) )
}
}
//保证月份不为负数
if len ( monthTody ) < 1 {
monthTody = append ( monthTody , 1 )
}
fmt . Printf ( "orgAry---------------------->%v\n" , orgAry )
/ *
设定协程
遍历行政组织 , 并发计算
* /
var deaprtmenTranscript TranscriptTableData
for _ , v := range orgAry {
syncProcess . Add ( 1 )
go deaprtmenTranscript . StaticticsDepartmentResult ( userCont . Company , v , currentYear , monthTody )
}
syncProcess . Wait ( ) //等待所有协程完毕
readStatisticsData := deaprtmenTranscript . readTranscriptData ( ) //读取通道数据
// fmt.Printf("readStatisticsData----------->%v\n", readStatisticsData)
var AScore float64 = 0
var BScore float64 = 0
var CScore float64 = 0
var DScore float64 = 0
var EScore float64 = 0
var FScore float64 = 0
var GScore float64 = 0
var HScore float64 = 0
var IScore float64 = 0
var JScore float64 = 0
var KScore float64 = 0
var LScore float64 = 0
jiBuQi := 0
var echarsList TranscriptTableDateListChars
var echarsListOrg TranscriptTableDateListChars
if len ( requestData . Month ) > 0 {
var monthAry [ ] int
for i := 1 ; i <= 12 ; i ++ {
if commonus . IsInTrue [ int ] ( i , requestData . Month ) == true && commonus . IsInTrue [ string ] ( fmt . Sprintf ( "%v月" , i ) , echarsList . XLine ) == false {
echarsList . XLine = append ( echarsList . XLine , fmt . Sprintf ( "%v月" , i ) )
monthAry = append ( monthAry , i )
echarsListOrg . Cylindrical = append ( echarsListOrg . Cylindrical , fmt . Sprintf ( "%v月" , i ) )
}
}
} else {
echarsList . XLine = append ( echarsList . XLine , "1月" , "2月" , "3月" , "4月" , "5月" , "6月" , "7月" , "8月" , "9月" , "10月" , "11月" , "12月" )
}
var orgFen orgShierTongji
// var dfgfd []YlineData
for _ , readv := range readStatisticsData {
AScore = AScore + readv . A
BScore = BScore + readv . B
CScore = CScore + readv . C
DScore = DScore + readv . D
EScore = EScore + readv . E
FScore = FScore + readv . F
GScore = GScore + readv . G
HScore = HScore + readv . H
IScore = IScore + readv . I
JScore = JScore + readv . J
KScore = KScore + readv . K
LScore = LScore + readv . L
jiBuQi ++
echarsList . Cylindrical = append ( echarsList . Cylindrical , readv . Department )
echarsListOrg . XLine = append ( echarsListOrg . XLine , readv . Department )
var cyLineAry_1 YlineData
cyLineAry_1 . Name = readv . Department
// var yZhoue YlineData
if readv . A == - 10000 {
readv . A = 0
}
if readv . B == - 10000 {
readv . B = 0
}
if readv . C == - 10000 {
readv . C = 0
}
if readv . D == - 10000 {
readv . D = 0
}
if readv . E == - 10000 {
readv . E = 0
}
if readv . F == - 10000 {
readv . F = 0
}
if readv . G == - 10000 {
readv . G = 0
}
if readv . H == - 10000 {
readv . H = 0
}
if readv . I == - 10000 {
readv . I = 0
}
if readv . J == - 10000 {
readv . J = 0
}
if readv . K == - 10000 {
readv . K = 0
}
if readv . L == - 10000 {
readv . L = 0
}
if len ( requestData . Month ) > 0 {
if commonus . IsInTrue [ int ] ( 1 , requestData . Month ) == true {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 1))
cyLineAry_1 . Data = append ( cyLineAry_1 . Data , readv . A )
}
if commonus . IsInTrue [ int ] ( 2 , requestData . Month ) == true {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 2))
cyLineAry_1 . Data = append ( cyLineAry_1 . Data , readv . B )
}
if commonus . IsInTrue [ int ] ( 3 , requestData . Month ) == true {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 3))
cyLineAry_1 . Data = append ( cyLineAry_1 . Data , readv . C )
}
if commonus . IsInTrue [ int ] ( 4 , requestData . Month ) == true {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 4))
cyLineAry_1 . Data = append ( cyLineAry_1 . Data , readv . D )
}
if commonus . IsInTrue [ int ] ( 5 , requestData . Month ) == true {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 5))
cyLineAry_1 . Data = append ( cyLineAry_1 . Data , readv . E )
}
if commonus . IsInTrue [ int ] ( 6 , requestData . Month ) == true {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 6))
cyLineAry_1 . Data = append ( cyLineAry_1 . Data , readv . F )
}
if commonus . IsInTrue [ int ] ( 7 , requestData . Month ) == true {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 7))
cyLineAry_1 . Data = append ( cyLineAry_1 . Data , readv . G )
}
if commonus . IsInTrue [ int ] ( 8 , requestData . Month ) == true {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 8))
cyLineAry_1 . Data = append ( cyLineAry_1 . Data , readv . H )
}
if commonus . IsInTrue [ int ] ( 9 , requestData . Month ) == true {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 9))
cyLineAry_1 . Data = append ( cyLineAry_1 . Data , readv . I )
}
if commonus . IsInTrue [ int ] ( 10 , requestData . Month ) == true {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 10))
cyLineAry_1 . Data = append ( cyLineAry_1 . Data , readv . J )
}
if commonus . IsInTrue [ int ] ( 11 , requestData . Month ) == true {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 11))
cyLineAry_1 . Data = append ( cyLineAry_1 . Data , readv . K )
}
if commonus . IsInTrue [ int ] ( 12 , requestData . Month ) == true {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 12))
cyLineAry_1 . Data = append ( cyLineAry_1 . Data , readv . L )
}
} else {
cyLineAry_1 . Data = append ( cyLineAry_1 . Data , readv . A , readv . B , readv . C , readv . D , readv . E , readv . F , readv . G , readv . H , readv . I , readv . J , readv . K , readv . L )
// cyLineAry_2.Data = append(cyLineAry_1.Data, readv.A, readv.B, readv.C, readv.D, readv.E, readv.F, readv.G, readv.H, readv.I, readv.J, readv.K, readv.L)
}
orgFen . A = append ( orgFen . A , readv . A )
orgFen . B = append ( orgFen . B , readv . B )
orgFen . C = append ( orgFen . C , readv . C )
orgFen . D = append ( orgFen . D , readv . D )
orgFen . E = append ( orgFen . E , readv . E )
orgFen . F = append ( orgFen . F , readv . F )
orgFen . G = append ( orgFen . G , readv . G )
orgFen . H = append ( orgFen . H , readv . H )
orgFen . I = append ( orgFen . I , readv . I )
orgFen . J = append ( orgFen . J , readv . J )
orgFen . K = append ( orgFen . K , readv . K )
orgFen . L = append ( orgFen . L , readv . L )
// jsonStr, _ := json.Marshal(orgFen.A)
// fmt.Printf("orgFen------1---->%v\n", string(jsonStr))
echarsList . YLine = append ( echarsList . YLine , cyLineAry_1 )
// echarsListOrg.YLine = append(echarsListOrg.YLine, cyLineAry_2)
}
// jsonStrwww, _ := json.Marshal(orgFen)
// fmt.Printf("orgFen---------->%v\n", string(jsonStrwww))
if jiBuQi > 0 {
var pingJunFen TranscriptTableDateList
pingJunFen . DepartmentId = "0"
pingJunFen . Department = "平均分"
pingJunFen . A = commonus . Decimal ( AScore / float64 ( jiBuQi ) )
pingJunFen . B = commonus . Decimal ( BScore / float64 ( jiBuQi ) )
pingJunFen . C = commonus . Decimal ( CScore / float64 ( jiBuQi ) )
pingJunFen . D = commonus . Decimal ( DScore / float64 ( jiBuQi ) )
pingJunFen . E = commonus . Decimal ( EScore / float64 ( jiBuQi ) )
pingJunFen . F = commonus . Decimal ( FScore / float64 ( jiBuQi ) )
pingJunFen . G = commonus . Decimal ( GScore / float64 ( jiBuQi ) )
pingJunFen . H = commonus . Decimal ( HScore / float64 ( jiBuQi ) )
pingJunFen . I = commonus . Decimal ( IScore / float64 ( jiBuQi ) )
pingJunFen . J = commonus . Decimal ( JScore / float64 ( jiBuQi ) )
pingJunFen . K = commonus . Decimal ( KScore / float64 ( jiBuQi ) )
pingJunFen . L = commonus . Decimal ( LScore / float64 ( jiBuQi ) )
readStatisticsData = append ( readStatisticsData , pingJunFen )
}
var monthInt [ ] int
if len ( requestData . Month ) <= 0 {
for dkj := 1 ; dkj <= 12 ; dkj ++ {
monthInt = append ( monthInt , dkj )
}
} else {
monthInt = requestData . Month
}
// fmt.Printf("monthInt---------->%v\n", monthInt)
for _ , mvv := range monthInt {
switch mvv {
case 1 :
var cyLineAry_2 YlineData
cyLineAry_2 . Name = "1月"
cyLineAry_2 . Data = orgFen . A
echarsListOrg . YLine = append ( echarsListOrg . YLine , cyLineAry_2 )
case 2 :
var cyLineAry_2 YlineData
cyLineAry_2 . Name = "2月"
cyLineAry_2 . Data = orgFen . B
echarsListOrg . YLine = append ( echarsListOrg . YLine , cyLineAry_2 )
case 3 :
var cyLineAry_2 YlineData
cyLineAry_2 . Name = "3月"
cyLineAry_2 . Data = orgFen . C
echarsListOrg . YLine = append ( echarsListOrg . YLine , cyLineAry_2 )
case 4 :
var cyLineAry_2 YlineData
cyLineAry_2 . Name = "4月"
cyLineAry_2 . Data = orgFen . D
echarsListOrg . YLine = append ( echarsListOrg . YLine , cyLineAry_2 )
case 5 :
var cyLineAry_2 YlineData
cyLineAry_2 . Name = "5月"
cyLineAry_2 . Data = orgFen . E
echarsListOrg . YLine = append ( echarsListOrg . YLine , cyLineAry_2 )
case 6 :
var cyLineAry_2 YlineData
cyLineAry_2 . Name = "6月"
cyLineAry_2 . Data = orgFen . F
echarsListOrg . YLine = append ( echarsListOrg . YLine , cyLineAry_2 )
case 7 :
var cyLineAry_2 YlineData
cyLineAry_2 . Name = "7月"
cyLineAry_2 . Data = orgFen . G
echarsListOrg . YLine = append ( echarsListOrg . YLine , cyLineAry_2 )
case 8 :
var cyLineAry_2 YlineData
cyLineAry_2 . Name = "8月"
cyLineAry_2 . Data = orgFen . H
echarsListOrg . YLine = append ( echarsListOrg . YLine , cyLineAry_2 )
case 9 :
var cyLineAry_2 YlineData
cyLineAry_2 . Name = "9月"
cyLineAry_2 . Data = orgFen . I
echarsListOrg . YLine = append ( echarsListOrg . YLine , cyLineAry_2 )
case 10 :
var cyLineAry_2 YlineData
cyLineAry_2 . Name = "10月"
cyLineAry_2 . Data = orgFen . J
echarsListOrg . YLine = append ( echarsListOrg . YLine , cyLineAry_2 )
case 11 :
var cyLineAry_2 YlineData
cyLineAry_2 . Name = "11月"
cyLineAry_2 . Data = orgFen . K
echarsListOrg . YLine = append ( echarsListOrg . YLine , cyLineAry_2 )
case 12 :
var cyLineAry_2 YlineData
cyLineAry_2 . Name = "12月"
cyLineAry_2 . Data = orgFen . L
echarsListOrg . YLine = append ( echarsListOrg . YLine , cyLineAry_2 )
}
}
outData := commonus . MapOut ( )
outData [ "readStatisticsData" ] = readStatisticsData
outData [ "echarsList" ] = echarsList
outData [ "echarsListOrg" ] = echarsListOrg
response . Result ( 0 , outData , "查询完成" , c )
}
// 获取下级行政组织是否有主行政部门
func getSunOrgList ( orgId int64 ) ( orgList [ ] hrsystem . AdministrativeOrganization , ovErr error ) {
ovErr = global . GVA_DB_HrDataBase . Where ( "state = 1" ) . Where ( "ispower = 1 AND superior = ?" , orgId ) . Find ( & orgList ) . Error
return
}
/ *
统计部门月度成绩
@ group 集团
@ orgCont 行政组织相关信息
@ year 查询的年份
@ month 查询月份边界
* /
func ( t * TranscriptTableData ) StaticticsDepartmentResult ( group string , orgCont hrsystem . AdministrativeOrganization , year int64 , month [ ] int64 ) {
/ *
锁操作
* /
t . mutext . Lock ( )
defer t . mutext . Unlock ( )
//获取当前年
currentYear := commonus . ComputingTime ( time . Now ( ) . Unix ( ) , 1 )
groupId , _ := strconv . ParseInt ( group , 10 , 64 )
var err error
//获取要计算部门当前执行的考核方案表
var planVersionInfo assessmentmodel . PlanVersio
if currentYear == year {
err = global . GVA_DB_Performanceappraisal . Where ( "state = 1 AND department = ?" , orgCont . Id ) . First ( & planVersionInfo ) . Error
} else {
err = global . GVA_DB_Performanceappraisal . Where ( "state = 2 AND department = ? AND yeares = ?" , orgCont . Id , year ) . Order ( "addtime desc" ) . First ( & planVersionInfo ) . Error
if err != nil {
err = global . GVA_DB_Performanceappraisal . Where ( "state = 3 AND department = ? AND yeares = ?" , orgCont . Id , year ) . Order ( "addtime desc" ) . First ( & planVersionInfo ) . Error
}
}
if err == nil {
//将考核方案解析
var planVersioInfo [ ] AddDutyNewCont
jsonErr := json . Unmarshal ( [ ] byte ( planVersionInfo . Content ) , & planVersioInfo )
if jsonErr == nil {
var pingJunFen TranscriptTableDateList
pingJunFen . DepartmentId = strconv . FormatInt ( orgCont . Id , 10 )
pingJunFen . Department = orgCont . Name
// var i int64
var everyMonthScore countEveryDepartmentMonthScore
// for i = 1; i <= month; i++ {
// syncProcessDepartTarget.Add(1)
// //按月份计算
// go everyMonthScore.everyMonthCalculate(groupId, orgCont.Id, year, i, planVersioInfo)
// }
for _ , v := range month {
syncProcessDepartTarget . Add ( 1 )
//按月份计算
go everyMonthScore . everyMonthCalculate ( groupId , orgCont . Id , year , v , planVersioInfo )
}
syncProcessDepartTarget . Wait ( )
everyMonthScoreList := everyMonthScore . readMyDayData ( )
for _ , emslv := range everyMonthScoreList {
// fmt.Printf("emslv---->%v\n", emslv)
switch emslv . MonthVal {
case 1 :
pingJunFen . A = emslv . Score
case 2 :
pingJunFen . B = emslv . Score
case 3 :
pingJunFen . C = emslv . Score
case 4 :
pingJunFen . D = emslv . Score
case 5 :
pingJunFen . E = emslv . Score
case 6 :
pingJunFen . F = emslv . Score
case 7 :
pingJunFen . G = emslv . Score
case 8 :
pingJunFen . H = emslv . Score
case 9 :
pingJunFen . I = emslv . Score
case 10 :
pingJunFen . J = emslv . Score
case 11 :
pingJunFen . K = emslv . Score
case 12 :
pingJunFen . L = emslv . Score
default :
}
}
var monthIsFalse int64
for monthIsFalse = 1 ; monthIsFalse <= 12 ; monthIsFalse ++ {
if commonus . IsInTrue [ int64 ] ( monthIsFalse , month ) == false {
switch monthIsFalse {
case 1 :
pingJunFen . A = - 10000
case 2 :
pingJunFen . B = - 10000
case 3 :
pingJunFen . C = - 10000
case 4 :
pingJunFen . D = - 10000
case 5 :
pingJunFen . E = - 10000
case 6 :
pingJunFen . F = - 10000
case 7 :
pingJunFen . G = - 10000
case 8 :
pingJunFen . H = - 10000
case 9 :
pingJunFen . I = - 10000
case 10 :
pingJunFen . J = - 10000
case 11 :
pingJunFen . K = - 10000
case 12 :
pingJunFen . L = - 10000
default :
}
}
}
// if month < 12 {
// beginLostMonth := month + 1
// for ; beginLostMonth <= 12; beginLostMonth++ {
// switch beginLostMonth {
// case 1:
// pingJunFen.A = -10000
// case 2:
// pingJunFen.B = -10000
// case 3:
// pingJunFen.C = -10000
// case 4:
// pingJunFen.D = -10000
// case 5:
// pingJunFen.E = -10000
// case 6:
// pingJunFen.F = -10000
// case 7:
// pingJunFen.G = -10000
// case 8:
// pingJunFen.H = -10000
// case 9:
// pingJunFen.I = -10000
// case 10:
// pingJunFen.J = -10000
// case 11:
// pingJunFen.K = -10000
// case 12:
// pingJunFen.L = -10000
// default:
// }
// }
// }
// fmt.Printf("month---->%v\n", pingJunFen)
t . ScoreStatistics = append ( t . ScoreStatistics , pingJunFen )
}
}
syncProcess . Done ( ) //结束本协程
}
/ *
按月份统计部门总成绩
@ groupId 集团ID
@ orgId 行政组织ID
@ year 年
@ month 月
@ planVersion 部门当前执行的考核版本
* /
func ( c * countEveryDepartmentMonthScore ) everyMonthCalculate ( groupId , orgId , year , month int64 , planVersion [ ] AddDutyNewCont ) {
/ *
锁操作
* /
c . mutext . Lock ( )
defer c . mutext . Unlock ( )
var weiDuScore float64 = 0 //维度分值
var zhiBiaoScore float64 = 0 //指标标准分值
var sumScore float64 = 0 //计算得分
for _ , v := range planVersion { //维度
weiDuScore = weiDuScore + float64 ( v . ZhiFraction )
for _ , sv := range v . Child { //指标
zhiBiaoScore = zhiBiaoScore + float64 ( sv . ReferenceScore )
if sv . Status == 3 {
// fmt.Printf("sv.Id-------->%v------------》sv.Name----%v------------ReferenceScore---------->%v\n", sv.Id, sv.Name, sv.ReferenceScore)
sumScore = sumScore + float64 ( sv . ReferenceScore )
} else {
if sv . Status == 1 && sv . Status != 3 { //判断指标是否启用并且不是观察指标
var targetInfo assessmentmodel . EvaluationTarget
targetInfo . GetCont ( map [ string ] interface { } { "et_id" : sv . Id } , "et_type,et_cycle" )
if sv . Cycles == 0 { //判断统计方式
sv . Cycles = targetInfo . Cycles
}
if targetInfo . Type == 1 { //定性考核
countScore , _ := quantification . DingXingMonthSum ( groupId , orgId , sv . ReferenceScore , year , month , sv . Id , sv . Cycles , sv . Status )
sumScore = sumScore + countScore
// fmt.Printf("sv.Id-------->%v------------》sv.Name----%v--------------countScore-------->%v\n", sv.Id, sv.Name, countScore)
} else { //定量考核
countScores , _ := quantification . DingLiangMonthSum ( groupId , orgId , sv . ReferenceScore , year , month , sv . Id , sv . Cycles , sv . Status )
sumScore = sumScore + countScores
// fmt.Printf("sv.Id-------->%v------------》sv.Name----%v------------countScores---------->%v\n", sv.Id, sv.Name, countScores)
}
// switch sv.Cycles {
// case 5: //季度统计
// case 6: //年统计
// case 7: //半年统计
// default: //月度统计
// if targetInfo.Type == 1 { //定性考核
// countScore, _ := quantification.DingXingMonthSum(groupId, orgId, sv.ReferenceScore, year, month, sv.Id, sv.Cycles, sv.Status)
// sumScore = sumScore + countScore
// } else { //定量考核
// countScores, _ := quantification.DingLiangMonthSum(groupId, orgId, sv.ReferenceScore, year, month, sv.Id, sv.Cycles, sv.Status)
// sumScore = sumScore + countScores
// }
// }
}
}
}
}
var everyMonthScoreInfo everyDepartmentScore
everyMonthScoreInfo . MonthVal = month
everyMonthScoreInfo . Score = commonus . Decimal ( sumScore )
c . outData = append ( c . outData , everyMonthScoreInfo )
syncProcessDepartTarget . Done ( ) //结束本协程
}