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() groupId, _ := strconv.ParseInt(group, 10, 64) //获取要计算部门当前执行的考核方案表 var planVersionInfo assessmentmodel.PlanVersio err := global.GVA_DB_Performanceappraisal.Where("state = 1 AND department = ?", orgCont.Id).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() //结束本协程 }