KPI绩效考核系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1591 lines
52 KiB

package statistics
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"
"strings"
"time"
"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
"github.com/gin-gonic/gin"
)
/*
*
@ 作者: 秦东
@ 时间: 2023-07-27 10:44:25
@ 功能:行政组织成绩单
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) OrgTranscript(c *gin.Context) {
//获取登录人信息
context, err := publicmethod.LoginMyCont(c)
if err != nil {
publicmethod.Result(1, err, c, "您无权进行此操作!")
return
}
var requestData TranscriptTable
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.Group != "" {
gromDb = gromDb.Where("superior = ?", requestData.Group)
} else {
gromDb = gromDb.Where("superior = ?", context.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 []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)
}
}
}
// fmt.Printf("orgAry---------------------->%v\n", orgAry)
//计算要查询的年份
currentYear := publicmethod.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 := 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)
}
}
} else {
for _, mmv := range requestData.Month {
monthTody = append(monthTody, int64(mmv))
}
}
//保证月份不为负数
if len(monthTody) < 1 {
monthTody = append(monthTody, 1)
}
/*
设定协程
遍历行政组织,并发计算
*/
var orgTranscript TranscriptTableData
for _, v := range orgAry {
// if v.Id == 362 {
syncProcess.Add(1)
go orgTranscript.StaticticsOrgTimeResult(v, currentYear, monthTody)
// }
}
syncProcess.Wait()
readStatisticsData := orgTranscript.readTranscriptData() //读取通道数据
// response.Result(0, readStatisticsData, "查询完成", c)
// return
//根据维度序号排序
sort.Slice(readStatisticsData, func(i, j int) bool {
return readStatisticsData[i].Sort < readStatisticsData[j].Sort
})
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 publicmethod.IsInTrue[int](i, requestData.Month) && !publicmethod.IsInTrue[string](fmt.Sprintf("%v月", i), echarsList.XLine) {
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 publicmethod.IsInTrue[int](1, requestData.Month) {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 1))
cyLineAry_1.Data = append(cyLineAry_1.Data, readv.A)
}
if publicmethod.IsInTrue[int](2, requestData.Month) {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 2))
cyLineAry_1.Data = append(cyLineAry_1.Data, readv.B)
}
if publicmethod.IsInTrue[int](3, requestData.Month) {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 3))
cyLineAry_1.Data = append(cyLineAry_1.Data, readv.C)
}
if publicmethod.IsInTrue[int](4, requestData.Month) {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 4))
cyLineAry_1.Data = append(cyLineAry_1.Data, readv.D)
}
if publicmethod.IsInTrue[int](5, requestData.Month) {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 5))
cyLineAry_1.Data = append(cyLineAry_1.Data, readv.E)
}
if publicmethod.IsInTrue[int](6, requestData.Month) {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 6))
cyLineAry_1.Data = append(cyLineAry_1.Data, readv.F)
}
if publicmethod.IsInTrue[int](7, requestData.Month) {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 7))
cyLineAry_1.Data = append(cyLineAry_1.Data, readv.G)
}
if publicmethod.IsInTrue[int](8, requestData.Month) {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 8))
cyLineAry_1.Data = append(cyLineAry_1.Data, readv.H)
}
if publicmethod.IsInTrue[int](9, requestData.Month) {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 9))
cyLineAry_1.Data = append(cyLineAry_1.Data, readv.I)
}
if publicmethod.IsInTrue[int](10, requestData.Month) {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 10))
cyLineAry_1.Data = append(cyLineAry_1.Data, readv.J)
}
if publicmethod.IsInTrue[int](11, requestData.Month) {
// echarsList.XLine = append(echarsList.XLine, fmt.Sprintf("%v月", 11))
cyLineAry_1.Data = append(cyLineAry_1.Data, readv.K)
}
if publicmethod.IsInTrue[int](12, requestData.Month) {
// 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 = publicmethod.DecimalEs(AScore/float64(jiBuQi), 2)
pingJunFen.B = publicmethod.DecimalEs(BScore/float64(jiBuQi), 2)
pingJunFen.C = publicmethod.DecimalEs(CScore/float64(jiBuQi), 2)
pingJunFen.D = publicmethod.DecimalEs(DScore/float64(jiBuQi), 2)
pingJunFen.E = publicmethod.DecimalEs(EScore/float64(jiBuQi), 2)
pingJunFen.F = publicmethod.DecimalEs(FScore/float64(jiBuQi), 2)
pingJunFen.G = publicmethod.DecimalEs(GScore/float64(jiBuQi), 2)
pingJunFen.H = publicmethod.DecimalEs(HScore/float64(jiBuQi), 2)
pingJunFen.I = publicmethod.DecimalEs(IScore/float64(jiBuQi), 2)
pingJunFen.J = publicmethod.DecimalEs(JScore/float64(jiBuQi), 2)
pingJunFen.K = publicmethod.DecimalEs(KScore/float64(jiBuQi), 2)
pingJunFen.L = publicmethod.DecimalEs(LScore/float64(jiBuQi), 2)
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 := publicmethod.MapOut[string]()
outData["readStatisticsData"] = readStatisticsData
outData["echarsList"] = echarsList
outData["echarsListOrg"] = echarsListOrg
response.Result(0, outData, "查询完成", c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-07-27 11:14:37
@ 功能: 时间维度统计个行政组织成绩
@ 参数
#orgCont 行政组织相关信息
#year 查询的年份
#month 查询月份边界
@ 返回值
#
@ 方法原型
#
*/
func (t *TranscriptTableData) StaticticsOrgTimeResult(orgCont modelshr.AdministrativeOrganization, year int64, month []int64) {
//锁操作
t.mutext.Lock()
defer t.mutext.Unlock()
var pingJunFen TranscriptTableDateList
pingJunFen.DepartmentId = strconv.FormatInt(orgCont.Id, 10)
pingJunFen.Department = orgCont.Name
pingJunFen.Sort = orgCont.Sort
var everyMonthScore countEveryDepartmentMonthScore
for _, v := range month {
// if v == 1 {
planCont, err := publicmethod.GetPlanVresion(orgCont.Id, year, 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(orgCont.Id, year, v, planVersioInfo)
}
}
// }
}
syncProcessDepartTarget.Wait()
everyMonthScoreList := everyMonthScore.readMyDayData()
// fmt.Printf("everyMonthScoreList-->%v\n", everyMonthScoreList)
for _, emslv := range everyMonthScoreList {
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 !publicmethod.IsInTrue[int64](monthIsFalse, month) {
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:
}
}
}
t.ScoreStatistics = append(t.ScoreStatistics, pingJunFen)
// fmt.Printf("everyMonthScoreList-->%v\n", pingJunFen)
syncProcess.Done() //结束本协程
}
/*
*
@ 作者: 秦东
@ 时间: 2023-07-27 14:20:46
@ 功能: 按月份统计行政组织总成绩
@ 参数
#orgId 行政组织ID
#year 年
#month 月
#planVersion 部门当前执行的考核版本
@ 返回值
#
@ 方法原型
#
*/
func (c *countEveryDepartmentMonthScore) everyMonthCalculateNew(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 { //为观察指标
sumScore = sumScore + float64(sv.ReferenceScore)
fmt.Printf("为观察指标--->%v--->%v--->%v\n", sv.Name, sv.Id, sv.ReferenceScore)
} else {
var targetInfo modelskpi.EvaluationTarget
targetInfo.GetCont(map[string]interface{}{"et_id": sv.Id}, "et_type,et_cycle")
if targetInfo.Type == 1 {
//定性考核
dingXingScore, _ := DingXingScoreCalculation(orgId, year, sv.ReferenceScore, []int64{month}, sv.Id)
sumScore = sumScore + dingXingScore
fmt.Printf("定性考核得分--->%v--->%v--->%v--->%v\n", sv.Name, sv.Id, dingXingScore, sumScore)
} else {
var dingLiangScore float64
switch sv.Cycles {
case 5: //季度
quarterList := []int64{3, 6, 9, 12}
if !publicmethod.IsInTrue[int64](month, quarterList) {
dingLiangScore = float64(sv.ReferenceScore)
fmt.Printf("季度指标--->%v--->%v--->%v\n", sv.Name, sv.Id, dingLiangScore)
} else {
switch month {
case 3:
var sendList []dingLiangKaoHe
isTrue := true
var dingLiangScoreGd float64 = 0
var fengDingZhi float64 = 0
for i := 1; i <= 3; i++ {
sendListIng, _ := GetDingLiangLog(orgId, year, int64(i), sv.Id, "")
sendList = append(sendList, sendListIng...)
if i == 3 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
if v.MtOrAt == 2 {
dingLiangScoreGd = v.Score
isTrue = false
}
}
}
}
if !isTrue {
dingLiangScore = dingLiangScoreGd
} else {
var daChengLv float64 = 0
var pingJunXiShu float64 = 0
for _, j := range sendList {
daChengLv = daChengLv + j.CompletionRateAll
pingJunXiShu++
}
if pingJunXiShu > 0 {
pingJunZhi := daChengLv / pingJunXiShu
dingLiangScore = publicmethod.DecimalEs(GetQuantifyScore(float64(sv.ReferenceScore), pingJunZhi, fengDingZhi), 2)
} else {
dingLiangScore = float64(sv.ReferenceScore)
}
}
case 6:
var sendList []dingLiangKaoHe
isTrue := true
var dingLiangScoreGd float64 = 0
var fengDingZhi float64 = 0
for i := 4; i <= 6; i++ {
sendListIng, _ := GetDingLiangLog(orgId, year, int64(i), sv.Id, "")
sendList = append(sendList, sendListIng...)
if i == 6 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
if v.MtOrAt == 2 {
dingLiangScoreGd = v.Score
isTrue = false
}
}
}
}
if !isTrue {
dingLiangScore = dingLiangScoreGd
} else {
var daChengLv float64 = 0
var pingJunXiShu float64 = 0
for _, j := range sendList {
daChengLv = daChengLv + j.CompletionRateAll
pingJunXiShu++
}
if pingJunXiShu > 0 {
pingJunZhi := daChengLv / pingJunXiShu
dingLiangScore = publicmethod.DecimalEs(GetQuantifyScore(float64(sv.ReferenceScore), pingJunZhi, fengDingZhi), 2)
} else {
dingLiangScore = float64(sv.ReferenceScore)
}
}
case 9:
var sendList []dingLiangKaoHe
isTrue := true
var dingLiangScoreGd float64 = 0
var fengDingZhi float64 = 0
for i := 7; i <= 9; i++ {
sendListIng, _ := GetDingLiangLog(orgId, year, int64(i), sv.Id, "")
sendList = append(sendList, sendListIng...)
if i == 9 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
if v.MtOrAt == 2 {
dingLiangScoreGd = v.Score
isTrue = false
}
}
}
}
if !isTrue {
dingLiangScore = dingLiangScoreGd
} else {
var daChengLv float64 = 0
var pingJunXiShu float64 = 0
for _, j := range sendList {
daChengLv = daChengLv + j.CompletionRateAll
pingJunXiShu++
}
if pingJunXiShu > 0 {
pingJunZhi := daChengLv / pingJunXiShu
dingLiangScore = publicmethod.DecimalEs(GetQuantifyScore(float64(sv.ReferenceScore), pingJunZhi, fengDingZhi), 2)
} else {
dingLiangScore = float64(sv.ReferenceScore)
}
}
case 12:
var sendList []dingLiangKaoHe
isTrue := true
var dingLiangScoreGd float64 = 0
var fengDingZhi float64 = 0
for i := 10; i <= 12; i++ {
sendListIng, _ := GetDingLiangLog(orgId, year, int64(i), sv.Id, "")
sendList = append(sendList, sendListIng...)
if i == 12 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
if v.MtOrAt == 2 {
dingLiangScoreGd = v.Score
isTrue = false
}
}
}
}
if !isTrue {
dingLiangScore = dingLiangScoreGd
} else {
var daChengLv float64 = 0
var pingJunXiShu float64 = 0
for _, j := range sendList {
daChengLv = daChengLv + j.CompletionRateAll
pingJunXiShu++
}
if pingJunXiShu > 0 {
pingJunZhi := daChengLv / pingJunXiShu
dingLiangScore = publicmethod.DecimalEs(GetQuantifyScore(float64(sv.ReferenceScore), pingJunZhi, fengDingZhi), 2)
} else {
dingLiangScore = float64(sv.ReferenceScore)
}
}
default:
}
}
case 6: //年度
if month == 12 {
var sendList []dingLiangKaoHe
isTrue := true
var dingLiangScoreGd float64 = 0
var fengDingZhi float64 = 0
for i := 1; i <= 12; i++ {
sendListIng, _ := GetDingLiangLog(orgId, year, int64(i), sv.Id, "")
sendList = append(sendList, sendListIng...)
if i == 12 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
if v.MtOrAt == 2 {
dingLiangScoreGd = v.Score
isTrue = false
}
}
}
}
if !isTrue {
dingLiangScore = dingLiangScoreGd
} else {
var daChengLv float64 = 0
var pingJunXiShu float64 = 0
for _, j := range sendList {
daChengLv = daChengLv + j.CompletionRateAll
pingJunXiShu++
}
if pingJunXiShu > 0 {
pingJunZhi := daChengLv / pingJunXiShu
dingLiangScore = publicmethod.DecimalEs(GetQuantifyScore(float64(sv.ReferenceScore), pingJunZhi, fengDingZhi), 2)
} else {
dingLiangScore = float64(sv.ReferenceScore)
}
}
} else {
dingLiangScore = float64(sv.ReferenceScore)
// fmt.Printf("年度指标--->%v--->%v--->%v\n", sv.Name, sv.Id, dingLiangScore)
}
case 7: //半年指标
switch month {
case 6: //上半年
var sendList []dingLiangKaoHe
isTrue := true
var dingLiangScoreGd float64 = 0
var fengDingZhi float64 = 0
for i := 1; i <= 6; i++ {
sendListIng, _ := GetDingLiangLog(orgId, year, int64(i), sv.Id, "")
sendList = append(sendList, sendListIng...)
if i == 6 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
if v.MtOrAt == 2 {
dingLiangScoreGd = v.Score
isTrue = false
}
}
}
}
if !isTrue {
dingLiangScore = dingLiangScoreGd
} else {
var daChengLv float64 = 0
var pingJunXiShu float64 = 0
for _, j := range sendList {
daChengLv = daChengLv + j.CompletionRateAll
pingJunXiShu++
}
if pingJunXiShu > 0 {
pingJunZhi := daChengLv / pingJunXiShu
dingLiangScore = publicmethod.DecimalEs(GetQuantifyScore(float64(sv.ReferenceScore), pingJunZhi, fengDingZhi), 2)
} else {
dingLiangScore = float64(sv.ReferenceScore)
}
}
case 12:
var sendList []dingLiangKaoHe
isTrue := true
var dingLiangScoreGd float64 = 0
var fengDingZhi float64 = 0
for i := 7; i <= 12; i++ {
sendListIng, _ := GetDingLiangLog(orgId, year, int64(i), sv.Id, "")
sendList = append(sendList, sendListIng...)
if i == 12 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
if v.MtOrAt == 2 {
dingLiangScoreGd = v.Score
isTrue = false
}
}
}
}
if !isTrue {
dingLiangScore = dingLiangScoreGd
} else {
var daChengLv float64 = 0
var pingJunXiShu float64 = 0
for _, j := range sendList {
daChengLv = daChengLv + j.CompletionRateAll
pingJunXiShu++
}
if pingJunXiShu > 0 {
pingJunZhi := daChengLv / pingJunXiShu
dingLiangScore = publicmethod.DecimalEs(GetQuantifyScore(float64(sv.ReferenceScore), pingJunZhi, fengDingZhi), 2)
} else {
dingLiangScore = float64(sv.ReferenceScore)
}
}
default:
dingLiangScore = float64(sv.ReferenceScore)
// fmt.Printf("半年指标--->%v--->%v--->%v\n", sv.Name, sv.Id, dingLiangScore)
}
default: //月度指标
sendList, _ := GetDingLiangLog(orgId, year, month, sv.Id, "")
if len(sendList) < 1 {
dingLiangScore = float64(sv.ReferenceScore)
} else {
for _, v := range sendList {
// if v.MtOrAt == 1 {
// }
dingLiangScore = dingLiangScore + v.Score
}
// sumScore = sumScore + dingLiangScore
}
}
dingLiangScoreGd, _ := publicmethod.DecimalNew(dingLiangScore, 2)
sumScore = sumScore + dingLiangScoreGd
fmt.Printf("定量月度考核得分--->%v--->%v--->%v--->%v\n", sv.Name, sv.Id, dingLiangScore, sumScore)
}
}
}
}
var everyMonthScoreInfo everyDepartmentScore
everyMonthScoreInfo.MonthVal = month
everyMonthScoreInfo.Score, _ = publicmethod.DecimalNew(sumScore, 2)
c.outData = append(c.outData, everyMonthScoreInfo)
syncProcessDepartTarget.Done() //结束本协程
}
func (c *countEveryDepartmentMonthScore) everyMonthCalculate(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 { //指标
// if sv.Id == "13" {
zhiBiaoScore = zhiBiaoScore + float64(sv.ReferenceScore)
if sv.Status == 3 { //为观察指标
sumScore = sumScore + float64(sv.ReferenceScore)
// fmt.Printf("为观察指标--->%v--->%v--->%v\n", sv.Name, sv.Id, sv.ReferenceScore)
} else {
var targetInfo modelskpi.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 {
//定性考核
dingXingScore, _ := DingXingScoreCalculation(orgId, year, sv.ReferenceScore, []int64{month}, sv.Id)
sumScore = sumScore + dingXingScore
// fmt.Printf("定性考核得分--->%v--->%v--->%v\n", sv.Name, sv.Id, dingXingScore)
} else {
var dingLiangScore float64
//定量考核
switch sv.Cycles {
case 5: //季度指标
quarterList := []int64{3, 6, 9, 12}
if !publicmethod.IsInTrue[int64](month, quarterList) {
dingLiangScore = float64(sv.ReferenceScore)
// fmt.Printf("季度指标--->%v--->%v--->%v\n", sv.Name, sv.Id, dingLiangScore)
} else {
switch month {
case 3:
dingLiangScore, _ = DingLiangScoreCalculation(orgId, year, sv.ReferenceScore, []int64{1, 2, 3}, sv.Id, sv.Cycles)
case 6:
dingLiangScore, _ = DingLiangScoreCalculation(orgId, year, sv.ReferenceScore, []int64{4, 5, 6}, sv.Id, sv.Cycles)
case 9:
dingLiangScore, _ = DingLiangScoreCalculation(orgId, year, sv.ReferenceScore, []int64{7, 8, 9}, sv.Id, sv.Cycles)
case 12:
dingLiangScore, _ = DingLiangScoreCalculation(orgId, year, sv.ReferenceScore, []int64{10, 11, 12}, sv.Id, sv.Cycles)
default:
}
}
case 6: //年度指标
if month == 12 {
dingLiangScore, _ = DingLiangScoreCalculation(orgId, year, sv.ReferenceScore, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, sv.Id, sv.Cycles)
} else {
dingLiangScore = float64(sv.ReferenceScore)
// fmt.Printf("年度指标--->%v--->%v--->%v\n", sv.Name, sv.Id, dingLiangScore)
}
case 7: //半年指标
switch month {
case 6:
dingLiangScore, _ = DingLiangScoreCalculation(orgId, year, sv.ReferenceScore, []int64{1, 2, 3, 4, 5, 6}, sv.Id, sv.Cycles)
case 12:
dingLiangScore, _ = DingLiangScoreCalculation(orgId, year, sv.ReferenceScore, []int64{7, 8, 9, 10, 11, 12}, sv.Id, sv.Cycles)
default:
dingLiangScore = float64(sv.ReferenceScore)
// fmt.Printf("半年指标--->%v--->%v--->%v\n", sv.Name, sv.Id, dingLiangScore)
}
default: //月度指标
dingLiangScore, _ = DingLiangScoreCalculation(orgId, year, sv.ReferenceScore, []int64{month}, sv.Id, sv.Cycles)
}
dingLiangScoreGd, _ := publicmethod.DecimalNew(dingLiangScore, 2)
sumScore = sumScore + dingLiangScoreGd
// fmt.Printf("定量考核得分--->%v--->%v--->%v--->%v\n", sv.Name, sv.Id, dingLiangScoreGd, sv.Cycles)
}
}
// }
}
}
var everyMonthScoreInfo everyDepartmentScore
everyMonthScoreInfo.MonthVal = month
everyMonthScoreInfo.Score, _ = publicmethod.DecimalNew(sumScore, 2)
c.outData = append(c.outData, everyMonthScoreInfo)
syncProcessDepartTarget.Done() //结束本协程
}
/*
*
@ 作者: 秦东
@ 时间: 2023-07-27 10:58:16
@ 功能: 获取下级行政组织是否有主行政部门
@ 参数
#orgId 行政组织上级ID
@ 返回值
#orgList 行政组织子集列表
@ 方法原型
#
*/
func getSunOrgList(orgId int64, field ...string) (orgList []modelshr.AdministrativeOrganization, ovErr error) {
gormDb := overall.CONSTANT_DB_HR.Where("state = 1")
if len(field) > 0 {
fieldStr := strings.Join(field, ",")
gormDb = gormDb.Select(fieldStr)
}
ovErr = gormDb.Where("ispower = 1 AND superior = ?", orgId).Find(&orgList).Error
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-07-27 14:46:27
@ 功能: 指定时间段定性考核计算
@ 参数
#orgId 行政组织
#years 年
#targetScore 指标分值
#months 月份
#targetId 指标
@ 返回值
#
@ 方法原型
#
*/
func DingXingScoreCalculation(orgId, years, targetScore int64, months []int64, targetId string) (score float64, EvalDepartment []string) {
var scoreFlowList []modelskpi.ScoreFlow
err := overall.CONSTANT_DB_KPI.Model(&modelskpi.ScoreFlow{}).Select("`sf_plus_reduce_score`,`sf_score`,`sf_count`").Where("sf_reply IN ? AND sf_duty_department = ? AND sf_target_id = ? AND sf_year = ? AND sf_month IN ?", []int{2, 3}, orgId, targetId, years, months).Find(&scoreFlowList).Error
if err != nil || len(scoreFlowList) < 1 {
return float64(targetScore), []string{}
}
var minusPoints float64 = 0 //获取减分
var extraPoints float64 = 0 //获取加分
for _, v := range scoreFlowList {
quzhi := v.Score * int64(v.Count)
if v.PlusReduceScore == 1 {
extraPoints = extraPoints + float64(quzhi)
} else {
minusPoints = minusPoints + float64(quzhi)
}
var minusDepartment modelshr.AdministrativeOrganization
minErr := minusDepartment.GetCont(map[string]interface{}{"id": v.EvaluationDepartment}, "name")
if minErr == nil {
if !publicmethod.IsInTrue[string](minusDepartment.Name, EvalDepartment) {
EvalDepartment = append(EvalDepartment, minusDepartment.Name)
}
}
}
score = publicmethod.DecimalEs(((float64(targetScore) + extraPoints/100) - minusPoints/100), 2)
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-07-27 15:39:59
@ 功能: 指定时间段定量考核计算
@ 参数
#orgId 行政组织
#years 年
#targetScore 指标分数
#months 月份
#targetId 指标Id
#cycles 1:班;2:天;3:周;4:月;5:季度;6:年;7:半年
@ 返回值
#score 得分
@ 方法原型
#func DingLiangScoreCalculation(orgId, years, targetScore int64, months []int64, targetId string, cycles int) (score float64)
*/
func DingLiangScoreCalculation(orgId, years, targetScore int64, months []int64, targetId string, cycles int) (score float64, EvalDepartment []string) {
var calculateScore float64 = 0
var passRate float64 = 0 //达成率
var cappingPrize float64 = 1 //达成率
for _, vs := range months {
var flowLogList []modelskpi.FlowDataLogType
err := overall.CONSTANT_DB_KPI.Where("`department` = ? AND `year` = ? AND `targetid` = ? AND `month` = ? AND fl_reply IN ?", orgId, years, targetId, vs, []int{2, 3}).Find(&flowLogList).Error
if err != nil || len(flowLogList) < 1 {
calculateScore = calculateScore + float64(targetScore)
fmt.Printf("指标分--abc->%v--->%v\n", vs, targetScore)
passRate = passRate + 1
} else {
var sumScore float64 = 0
//循环计算相关指标得分
for _, v := range flowLogList {
if v.ScoringMethod == 1 {
//自动计算
sumScoreing, passRateVal, _, _, cappingPrizeval := AnalysisReward(targetId, v.Baseline, v.Edition, float64(targetScore), float64(v.Score), orgId, v.Year, v.Quarter, v.Month, cycles)
fmt.Printf("自动计算--->%v--->%v--->%v--->%v\n", vs, sumScoreing, passRateVal, cappingPrizeval)
sumScore = sumScore + sumScoreing
passRate = passRate + passRateVal
cappingPrize = cappingPrizeval
} else {
//手动分
sumScore = sumScore + (float64(v.ScoringScore) / 100)
passRate = passRate + 1
// fmt.Printf("手动分值--->%v\n", (float64(v.ScoringScore) / 100))
}
var minusDepartment modelshr.AdministrativeOrganization
minErr := minusDepartment.GetCont(map[string]interface{}{"id": v.EvaluationDepartment}, "name")
if minErr == nil {
if !publicmethod.IsInTrue[string](minusDepartment.Name, EvalDepartment) {
EvalDepartment = append(EvalDepartment, minusDepartment.Name)
}
}
}
calculateScore = calculateScore + sumScore
}
}
chushu := len(months)
if chushu != 0 {
calculateScore = publicmethod.DecimalEs(calculateScore/float64(chushu), 2)
daChengLv := passRate / float64(chushu)
if daChengLv >= cappingPrize && cappingPrize != 0 {
calculateScore = publicmethod.DecimalEs(cappingPrize*float64(targetScore), 2)
} else {
calculateScore = publicmethod.DecimalEs(daChengLv*float64(targetScore), 2)
}
fmt.Printf("passRate:%v\nchushu:%v\ndaChengLv:%v\ncappingPrize:%v\ncalculateScore:%v\n", passRate, chushu, daChengLv, cappingPrize, calculateScore)
}
score = calculateScore
return
}
func DingLiangScoreCalculationOld(orgId, years, targetScore int64, months []int64, targetId string, cycles int) (score float64) {
var flowLogList []modelskpi.FlowDataLogType
err := overall.CONSTANT_DB_KPI.Where("`department` = ? AND `year` = ? AND `targetid` = ? AND `month` IN ? AND fl_reply IN ?", orgId, years, targetId, months, []int{2, 3}).Find(&flowLogList).Error
// fmt.Printf("targetId====>%v====>%v====>%v====>%v\n", targetId, err, flowLogList, len(flowLogList))
if err != nil || len(flowLogList) < 1 {
score = float64(targetScore)
return
}
var sumScore float64 = 0
//循环计算相关指标得分
for _, v := range flowLogList {
if v.ScoringMethod == 1 {
//自动计算
sumScoreing, _, _, _, _ := AnalysisReward(targetId, v.Baseline, v.Edition, float64(targetScore), float64(v.Score), orgId, v.Year, v.Quarter, v.Month, cycles)
sumScore = sumScore + sumScoreing
} else {
//手动分
sumScore = sumScore + (float64(v.ScoringScore) / 100)
// fmt.Printf("手动分值--->%v\n", (float64(v.ScoringScore) / 100))
}
}
if years > 2023 {
chushu := len(months)
if chushu != 0 {
sumScore = publicmethod.DecimalEs(sumScore/float64(chushu), 2)
}
} else {
pingjun := false
for _, v := range months {
if v > 6 && years == 2023 {
pingjun = true
}
}
if pingjun {
chushu := len(months)
if chushu != 0 {
sumScore = publicmethod.DecimalEs(sumScore/float64(chushu), 2)
}
}
}
score = sumScore
// fmt.Printf("手动分值--2->%v\n", score)
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-07-27 15:59:23
@ 功能: 计算单一定量指标得分
@ 参数
#targetId 指标
#rewardCont 上报时的全奖值,零奖值,封顶值设置
#targetScore 指标得分
#settlementScore 上报数值
#planKey 指标方案
#orgId 行政组织
#years 发生年
#quarter 发生季
#month 发生月
#cycles 1:班;2:天;3:周;4:月;5:季度;6:年;7:半年
@ 返回值
#score 得分
#completionRate 达成率
@ 方法原型
#score 指标得分
#completionRate 达成率
#zeroPrize 零奖值
#allPrize 全奖值
#cappingPrize 封顶值
*/
func AnalysisReward(targetId, rewardCont, planKey string, targetScore, settlementScore float64, orgId, years, quarter, month int64, cycles int) (score, completionRate, zeroPrize, allPrize, cappingPrize float64) {
var currentTargetSeting FlowLogAllZreo
setIsTrue := true
var rewardAry []FlowLogAllZreo
jsonErr := json.Unmarshal([]byte(rewardCont), &rewardAry)
if jsonErr == nil {
//获取当前指标的全奖零奖值
for _, v := range rewardAry {
if v.TargetId == targetId {
currentTargetSeting.Id = v.Id
currentTargetSeting.TargetId = v.TargetId //指标ID`
currentTargetSeting.Zeroprize = v.Zeroprize //零奖值"`
currentTargetSeting.Allprize = v.Allprize //全奖值"`
currentTargetSeting.Capping = v.Capping //封顶值"`
zeroPrize = v.Zeroprize //零奖值"`
allPrize = v.Allprize //全奖值"`
cappingPrize = v.Capping //封顶值"`
setIsTrue = false
}
}
}
isAll := false
if setIsTrue {
var setCont modelskpi.QuantitativeConfig
gormdb := overall.CONSTANT_DB_KPI.Where("`departmentid` = ? AND `target` = ? AND `year` = ?", orgId, targetId, years)
switch cycles {
case 5: //季度
gormdb = gormdb.Where("`timecopy` = ?", quarter)
case 6: //年
case 7: //半年
banNian := 1
if !publicmethod.IsInTrue[int64](month, []int64{1, 2, 3, 4, 5, 6}) {
banNian = 2
}
gormdb = gormdb.Where("`timecopy` = ?", banNian)
default:
gormdb = gormdb.Where("`timecopy` = ?", month)
}
err := gormdb.Find(setCont).Error
if err == nil {
currentTargetSeting.Id = strconv.FormatInt(setCont.Id, 10)
currentTargetSeting.TargetId = strconv.FormatInt(setCont.Target, 10) //指标ID`
currentTargetSeting.Zeroprize = setCont.Zeroprize //零奖值"`
currentTargetSeting.Allprize = setCont.Allprize //全奖值"`
currentTargetSeting.Capping = setCont.CappingVal //封顶值"`
zeroPrize = setCont.Zeroprize //零奖值"`
allPrize = setCont.Allprize //全奖值"`
cappingPrize = setCont.CappingVal //封顶值"`
isAll = true
} else {
isAll = false
}
} else {
isAll = true
}
if isAll {
score, completionRate = TallyUpScore(targetScore, settlementScore, currentTargetSeting.Zeroprize, currentTargetSeting.Allprize, currentTargetSeting.Capping)
fmt.Printf("计算单一定量指标得分--->%v\n--->%v\n--->%v\n", settlementScore, score, completionRate)
} else {
completionRate = 1
score = targetScore
}
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-07-28 10:23:33
@ 功能: 计算定量指标得分
@ 参数
#targetScore 指标分值
#actualValue 指标实际值
#zeroPrize 零奖值
#allPrize 全奖值
#cappingVal 封顶值
@ 返回值
#callBackScore 得分
#completionRate 达成率
@ 方法原型
#func TallyUpScore(targetScore, actualValue, zeroPrize, allPrize, cappingVal float64) (callBackScore, completionRate float64)
*/
func TallyUpScore(targetScore, actualValue, zeroPrize, allPrize, cappingVal float64) (callBackScore, completionRate float64) {
// fmt.Printf("计算定量指标得分--->actualValue:%v\nzeroPrize:%v\nallPrize:%v\n", actualValue, zeroPrize, allPrize)
if zeroPrize == 0 && allPrize == 0 { //全奖值与零奖值都为0 那么达成率 100 和实际得分是 指标分
completionRate = 1
callBackScore = targetScore
} else {
if allPrize >= zeroPrize { //如果全奖值大于零奖值 执行正向操作
//stpe 1:判断提交实际数值是否小于等于零奖值
if actualValue <= zeroPrize { //满足此条件,那么达成率和实际得分都是0
completionRate = 0
callBackScore = 0
} else { //stpe 2:判断提交实际结算值大于零奖值
chuShu := actualValue - float64(zeroPrize) //除数 = 实际值 - 零奖值
beiChuShu := float64(allPrize) - float64(zeroPrize) // 被除数 = 全奖值 - 零奖值
if beiChuShu != 0 { //stpe 3:判断被除数非零
completionRate = chuShu / beiChuShu //达成率
if completionRate <= 0 { //stpe 4:判断达成率小于等于零时。那么达成率和实际得分都是0
completionRate = 0
callBackScore = 0
} else {
//stpe 5:判断达成率是否等于大于封顶值
// fmt.Printf("判断达成率----->%v----->%v\n", completionRate*100, cappingVal)
if completionRate*100 >= cappingVal/100 {
if cappingVal > 0 { //stpe 6:判断封顶值是否大于0
callBackScore = (cappingVal / 10000) * targetScore
// fmt.Printf("判断达成率---1-->%v----->%v\n", callBackScore, targetScore)
} else {
callBackScore = targetScore
// fmt.Printf("判断达成率-2--->%v----->%v\n", callBackScore, targetScore)
}
} else { //stpe 6:当达成率小于封顶值
callBackScore = completionRate * targetScore
// fmt.Printf("判断达成率--3--->%v----->%v\n", completionRate, targetScore)
}
}
} else { //被除数为零时,等式不成立。所以达成率和实际得分都是0
completionRate = 0
callBackScore = 0
}
}
} else { //如果全奖值小于于零奖值 执行反向操作
// fmt.Printf("全奖值小于零奖值--->zeroPrize:%v,allPrize:%v\n", zeroPrize, allPrize)
if (actualValue >= zeroPrize) || (actualValue == 0 && (zeroPrize != 0 || actualValue != 0)) { //如果实际数值大于等于零奖值,那么达成率和实际得分都是0
chuShu := actualValue - float64(zeroPrize) //除数 = 实际值 - 零奖值
beiChuShu := float64(allPrize) - float64(zeroPrize) // 被除数 = 全奖值 - 零奖值
if beiChuShu != 0 {
completionRate = chuShu / beiChuShu //达成率
} else {
completionRate = 0
}
callBackScore = 0
} else { //实际值小于零奖值
chuShu := actualValue - float64(zeroPrize) //除数 = 实际值 - 零奖值
beiChuShu := float64(allPrize) - float64(zeroPrize) // 被除数 = 全奖值 - 零奖值
// fmt.Printf("全奖值被除数--->%v\n", beiChuShu)
if beiChuShu != 0 { //判断被除数非零
completionRate = chuShu / beiChuShu //达成率
if completionRate <= 0 { //判断达成率小于等于零时。那么达成率和实际得分都是0
completionRate = 0
callBackScore = 0
} else {
//stpe 5:判断达成率是否等于大于封顶值
if completionRate*100 >= cappingVal/100 {
if cappingVal > 0 { //stpe 6:判断封顶值是否大于0
callBackScore = (cappingVal / 10000) * targetScore
} else {
callBackScore = targetScore
}
} else { //stpe 6:当达成率小于封顶值
callBackScore = completionRate * targetScore
}
// fmt.Printf("全奖值小于零奖值--->completionRate:%v,cappingVal:%v,completionRate:%v,targetScore:%v,callBackScore:%v\n", completionRate*100, cappingVal/100, completionRate, targetScore, callBackScore)
}
} else { //被除数为零时,等式不成立。所以达成率和实际得分都是0
completionRate = 0
callBackScore = 0
}
}
}
}
// callBackScore = publicmethod.DecimalEs(callBackScore, 2)
// completionRate = publicmethod.DecimalEs(completionRate, 4)
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-07-29 09:43:05
@ 功能:汇总详情定量历史记录
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) SummaryDetailsLiangLog(c *gin.Context) {
var requestData detailedResultsLog
err := c.ShouldBindJSON(&requestData)
if err != nil {
response.Result(101, err, "数据获取失败!", c)
return
}
if requestData.TargetId == "" {
response.Result(102, err, "参数错误!请属入指标", c)
return
}
if requestData.Department == "" {
response.Result(103, err, "参数错误!请属入部门", c)
return
}
if requestData.Year == 0 {
requestData.Year = publicmethod.ComputingTime(time.Now().Unix(), 1)
}
if requestData.Months < 1 {
requestData.Months = 1
}
if requestData.Months > 12 {
requestData.Months = 12
}
orgId, _ := strconv.ParseInt(requestData.Department, 10, 64)
monthInt := int64(requestData.Months)
var targetInfo modelskpi.EvaluationTarget
targetInfo.GetCont(map[string]interface{}{"et_id": requestData.TargetId}, "et_type,et_cycle")
var sendList []dingLiangKaoHe
switch targetInfo.Cycles {
case 5: //季度指标
if publicmethod.IsInTrue[int64](monthInt, []int64{3, 6, 9, 12}) {
if publicmethod.IsInTrue[int64](monthInt, []int64{1, 2, 3}) {
for i := 1; i <= 3; i++ {
sendListIng, _ := GetDingLiangLog(orgId, requestData.Year, int64(i), requestData.TargetId, fmt.Sprintf("%v月份实际分值", i))
sendList = append(sendList, sendListIng...)
}
} else if publicmethod.IsInTrue[int64](monthInt, []int64{4, 5, 6}) {
for i := 4; i <= 6; i++ {
sendListIng, _ := GetDingLiangLog(orgId, requestData.Year, int64(i), requestData.TargetId, fmt.Sprintf("%v月份实际分值", i))
sendList = append(sendList, sendListIng...)
}
} else if publicmethod.IsInTrue[int64](monthInt, []int64{7, 8, 9}) {
for i := 7; i <= 9; i++ {
sendListIng, _ := GetDingLiangLog(orgId, requestData.Year, int64(i), requestData.TargetId, fmt.Sprintf("%v月份实际分值", i))
sendList = append(sendList, sendListIng...)
}
} else {
for i := 10; i <= 12; i++ {
sendListIng, _ := GetDingLiangLog(orgId, requestData.Year, int64(i), requestData.TargetId, fmt.Sprintf("%v月份实际分值", i))
sendList = append(sendList, sendListIng...)
}
}
chushu := len(sendList)
if chushu > 0 {
var sumScore float64 = 0
for _, j := range sendList {
sumScore = sumScore + j.Score
}
var secondCont dingLiangKaoHe
secondCont.Score = publicmethod.DecimalEs(sumScore/float64(chushu), 2) //得分
secondCont.MtOrAt = 1 //手动还是自动
secondCont.Cont = "平均分" //说明
sendList = append(sendList, secondCont)
}
} else {
sendList, _ = GetDingLiangLog(orgId, requestData.Year, monthInt, requestData.TargetId, "")
}
case 6: //年度指标
for i := 1; i <= 12; i++ {
sendListIng, _ := GetDingLiangLog(orgId, requestData.Year, int64(i), requestData.TargetId, fmt.Sprintf("%v月份实际分值", i))
sendList = append(sendList, sendListIng...)
}
var sumScore float64 = 0
for _, j := range sendList {
sumScore = sumScore + j.Score
}
var secondCont dingLiangKaoHe
secondCont.Score = publicmethod.DecimalEs(sumScore/12, 2) //得分
secondCont.MtOrAt = 1 //手动还是自动
secondCont.Cont = "平均分" //说明
sendList = append(sendList, secondCont)
case 7: //半年指标
if publicmethod.IsInTrue[int64](monthInt, []int64{1, 2, 3, 4, 5, 6}) {
for i := 1; i <= 6; i++ {
sendListIng, _ := GetDingLiangLog(orgId, requestData.Year, int64(i), requestData.TargetId, fmt.Sprintf("%v月份实际分值", i))
sendList = append(sendList, sendListIng...)
}
} else {
for i := 7; i <= 12; i++ {
sendListIng, _ := GetDingLiangLog(orgId, requestData.Year, int64(i), requestData.TargetId, fmt.Sprintf("%v月份实际分值", i))
sendList = append(sendList, sendListIng...)
}
}
var sumScore float64 = 0
for _, j := range sendList {
sumScore = sumScore + j.Score
}
var secondCont dingLiangKaoHe
secondCont.Score = publicmethod.DecimalEs(sumScore/6, 2) //得分
secondCont.MtOrAt = 1 //手动还是自动
secondCont.Cont = "平均分" //说明
secondCont.Nature = 1
sendList = append(sendList, secondCont)
default:
sendList, _ = GetDingLiangLog(orgId, requestData.Year, monthInt, requestData.TargetId, "")
}
response.Result(0, sendList, "查询完成!", c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-07-29 10:44:18
@ 功能: 获取定量考核记录
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func GetDingLiangLog(orgId, years, monthes int64, targetId, cont string) (sendList []dingLiangKaoHe, EvalDepartment []string) {
var flowLogList []modelskpi.FlowDataLogType
err := overall.CONSTANT_DB_KPI.Where("`department` = ? AND `year` = ? AND `targetid` = ? AND `month` = ? AND fl_reply IN ?", orgId, years, targetId, monthes, []int{2, 3}).Find(&flowLogList).Error
if err != nil && len(flowLogList) < 1 {
return
} else {
for _, v := range flowLogList {
var secondCont dingLiangKaoHe
targetScore, attribute, _ := GetTargetPlanScore(v.Edition, targetId, orgId, years, monthes)
secondCont.Score, secondCont.CompletionRate, secondCont.Zeroprize, secondCont.Allprize, secondCont.Capping = AnalysisReward(targetId, v.Baseline, v.Edition, targetScore, float64(v.Score), orgId, v.Year, v.Quarter, v.Month, attribute)
secondCont.Actual = publicmethod.DecimalEs(float64(v.Score)/100, 2)
fmt.Printf("获取定量考核记录--->targetScore:%v\n--->attribute:%v\n--->Score:%v\n--->ScoringMethod:%v\n", targetScore, attribute, secondCont.Score, v.ScoringMethod)
if v.ScoringMethod != 1 {
secondCont.Score = publicmethod.DecimalEs(float64(v.ScoringScore)/100, 2)
}
secondCont.MtOrAt = v.ScoringMethod
secondCont.Cont = fmt.Sprintf("%v%v", v.Content, cont)
secondCont.Nature = attribute
if attribute == 3 {
secondCont.Score = targetScore
}
// fmt.Printf("获取定量考核记录--1->targetScore:%v\n--->attribute:%v\n--->Score:%v\n--->ScoringMethod:%v\n", targetScore, attribute, secondCont.Score, v.ScoringMethod)
secondCont.Score = publicmethod.DecimalEs(secondCont.Score, 2)
secondCont.Allprize = publicmethod.DecimalEs(secondCont.Allprize/100, 2)
secondCont.Zeroprize = publicmethod.DecimalEs(secondCont.Zeroprize/100, 2)
secondCont.Capping = publicmethod.DecimalEs(secondCont.Capping/100, 2)
secondCont.CompletionRate = publicmethod.DecimalEs(secondCont.CompletionRate*100, 2)
secondCont.CompletionRateAll = secondCont.CompletionRate
sendList = append(sendList, secondCont)
var minusDepartment modelshr.AdministrativeOrganization
minErr := minusDepartment.GetCont(map[string]interface{}{"id": v.EvaluationDepartment}, "name")
if minErr == nil {
if !publicmethod.IsInTrue[string](minusDepartment.Name, EvalDepartment) {
EvalDepartment = append(EvalDepartment, minusDepartment.Name)
}
}
}
}
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-07-29 10:16:59
@ 功能: 获取指标分数
@ 参数
#key 方案版本
#targetId 指标Id
#orgId 行政组织
#years 年
#months 月
@ 返回值
#targetScore 指标分
#attribute 1、使用;2:禁用;3:观察
@ 方法原型
#func GetTargetPlanScore(key, targetId string, orgId, years, months int64) (targetScore float64, attribute int)
*/
func GetTargetPlanScore(key, targetId string, orgId, years, months int64) (targetScore float64, attribute, cycles int) {
var planVersionInfo modelskpi.PlanVersio
planVersionInfo, err := publicmethod.GetPlanVresion(orgId, years, months)
// err := planVersionInfo.GetCont(map[string]interface{}{"`key`": key})
if err != nil {
planVersionInfo.GetCont(map[string]interface{}{"`key`": key})
}
var planVersioInfo []AddDutyNewCont
json.Unmarshal([]byte(planVersionInfo.Content), &planVersioInfo)
if len(planVersioInfo) < 1 {
return
}
for _, v := range planVersioInfo {
for _, tv := range v.Child {
if targetId == tv.Id {
targetScore = float64(tv.ReferenceScore)
attribute = tv.Status
fmt.Printf("指标分数!-->%v-->%v\n", targetScore, tv.Status)
cycles = tv.Cycles
}
}
}
return
}