package statistics import ( "encoding/json" "fmt" "key_performance_indicators/models/modelshr" "key_performance_indicators/overall" "key_performance_indicators/overall/publicmethod" "sort" "strconv" "time" "github.com/flipped-aurora/gin-vue-admin/server/model/common/response" "github.com/gin-gonic/gin" ) /* * @ 作者: 秦东 @ 时间: 2023-11-08 11:22:10 @ 功能: 行政组织年度成绩单 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) OrgTargetAnnualStatistics(c *gin.Context) { //获取登录人信息 context, _ := publicmethod.LoginMyCont(c) var requestData OrgAnnualStatistics c.ShouldBindJSON(&requestData) //获取行政组织 var orgList []modelshr.AdministrativeOrganization gromDb := overall.CONSTANT_DB_HR.Model(&modelshr.AdministrativeOrganization{}).Select("`id`,`name`,`sort`").Where("ispower = 1 AND state = 1 AND organization_type > 2") if requestData.OrgId != "" { gromDb = gromDb.Where("superior = ?", requestData.OrgId) } else { gromDb = gromDb.Where("superior = ?", context.Company) } err := gromDb.Find(&orgList).Error if err != nil && len(orgList) < 1 { response.Result(102, err, "没有查询到数据", c) return } var orgAry []modelshr.AdministrativeOrganization for _, ov := range orgList { if ov.Id != 163 && ov.Id != 281 { //获取下级行政组织是否有主行政部门 sunOrgList, orgSunErr := getSunOrgList(ov.Id, "`id`", "`name`", "`sort`") if orgSunErr == nil && len(sunOrgList) > 0 { orgAry = append(orgAry, sunOrgList...) } else { orgAry = append(orgAry, ov) } } } //计算要查询的年份 currentYear := publicmethod.ComputingTime(time.Now().Unix(), 1) //当前年 todayYear := currentYear //今年 if requestData.Years != "" { yearInt64, _ := strconv.ParseInt(requestData.Years, 10, 64) currentYear = yearInt64 } //计算月 var monthTody []int64 if currentYear == todayYear { monthTodyIng := publicmethod.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) } } //保证月份不为负数 if len(monthTody) < 1 { monthTody = append(monthTody, 1) } var sendList SendOrgAnnualStatistics var orgTranscriptList OrgTranscript for _, v := range monthTody { sendList.XAxis = append(sendList.XAxis, fmt.Sprintf("%v月", v)) } for _, v := range orgAry { sendList.Legend = append(sendList.Legend, v.Name) syncProcess.Add(1) go orgTranscriptList.CalculateGrades(v, currentYear, monthTody) } syncProcess.Wait() readStatisticsData := orgTranscriptList.readTranscriptData() //读取通道数据 if len(readStatisticsData) > 0 { sendList.MaxScore = readStatisticsData[0].MaxScore sendList.MinScore = readStatisticsData[0].MinScore } //根据维度序号排序 sort.Slice(readStatisticsData, func(i, j int) bool { return readStatisticsData[i].Scort < readStatisticsData[j].Scort }) for _, v := range readStatisticsData { if sendList.MaxScore <= v.MaxScore { sendList.MaxScore = v.MaxScore } if sendList.MinScore >= v.MinScore { sendList.MinScore = v.MinScore } } if sendList.MaxScore > 0 { if sendList.MaxScore > 1 { sendList.MaxScore = sendList.MaxScore + 1 } else { sendList.MaxScore = sendList.MaxScore + 0.1 } } else { if sendList.MaxScore < -1 { sendList.MaxScore = sendList.MaxScore + 1 } else { sendList.MaxScore = sendList.MaxScore + 0.1 } } if sendList.MinScore > 0 { if sendList.MinScore > 1 { sendList.MinScore = sendList.MinScore - 1 } else { sendList.MinScore = sendList.MinScore - 0.1 } } else { if sendList.MinScore < -1 { sendList.MinScore = sendList.MinScore - 1 } else { sendList.MinScore = sendList.MinScore - 0.1 } } sendList.Series = readStatisticsData publicmethod.Result(0, sendList, c) } func (o *OrgTranscript) CalculateGrades(orgInfo modelshr.AdministrativeOrganization, currentYear int64, months []int64) { //锁操作 o.mutext.Lock() defer o.mutext.Unlock() var orgSictesCont SeriesList orgSictesCont.Name = orgInfo.Name orgSictesCont.Scort = orgInfo.Sort // var monthOrgScore OrgTranscriptScore var everyMonthScore countEveryDepartmentMonthScore for _, v := range months { planCont, err := publicmethod.GetPlanVresion(orgInfo.Id, currentYear, v) // fmt.Printf("planCont:%v\n%v\n", planCont, err) if err == nil { var planVersioInfo []AddDutyNewCont jsonErr := json.Unmarshal([]byte(planCont.Content), &planVersioInfo) if jsonErr == nil { syncProcessDepartTarget.Add(1) //按月份计算 go everyMonthScore.everyMonthCalculateNew(orgInfo.Id, currentYear, v, planVersioInfo) } } } syncProcessDepartTarget.Wait() everyMonthScoreList := everyMonthScore.readMyDayData() if len(everyMonthScoreList) > 0 { orgSictesCont.MaxScore = everyMonthScoreList[0].Score orgSictesCont.MinScore = everyMonthScoreList[0].Score } sort.Slice(everyMonthScoreList, func(i, j int) bool { return everyMonthScoreList[i].MonthVal < everyMonthScoreList[j].MonthVal }) // fmt.Printf("层级:%v\n", everyMonthScoreList) for _, v := range everyMonthScoreList { if orgSictesCont.MaxScore <= v.Score { orgSictesCont.MaxScore = v.Score } if orgSictesCont.MinScore > v.Score { orgSictesCont.MinScore = v.Score } orgSictesCont.DataList = append(orgSictesCont.DataList, v.Score) } o.ScoreStatistics = append(o.ScoreStatistics, orgSictesCont) syncProcess.Done() } /* * @ 作者: 秦东 @ 时间: 2023-11-08 13:09:27 @ 功能: 计算行政组织每月成绩 @ 参数 # @ 返回值 # @ 方法原型 # */ // func (o *OrgTranscriptScore) CalculateGrades(orgId, years, months int64) { // o.mutext.Lock() // defer o.mutext.Unlock() // var scoreInfo MonthOrgScore // scoreInfo.Months = months // planCont, err := publicmethod.GetPlanVresion(orgId, years, months) // if err == nil { // var planVersioInfo []AddDutyNewCont // jsonErr := json.Unmarshal([]byte(planCont.Content), &planVersioInfo) // } // o.ScoreList = append(o.ScoreList, scoreInfo) // syncProcessDepartTarget.Done() // }