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.

565 lines
17 KiB

2 years ago
package statistics
import (
"encoding/json"
"fmt"
"key_performance_indicators/models/modelshr"
"key_performance_indicators/models/modelskpi"
"key_performance_indicators/overall/publicmethod"
"strconv"
"time"
"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
"github.com/gin-gonic/gin"
)
/*
*
@ 作者: 秦东
@ 时间: 2023-08-04 09:18:31
@ 功能: 汇总方案定量指标详情历史记录(新版)
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) SummaryPlanRecord(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)
//获取当前时间考核方案
targetScore, attribute, cycles := GetTargetPlanScore("", requestData.TargetId, orgId, requestData.Year, monthInt)
// fmt.Printf("targetScore:%v\nattribute:%v\ncycles:%v\n", targetScore, attribute, cycles)
var sendList []dingLiangKaoHe
if err != nil {
response.Result(101, err, "数据获取失败!", c)
return
}
switch cycles {
case 5: //季度度指标
if publicmethod.IsInTrue[int64](monthInt, []int64{3, 6, 9, 12}) {
var fengDingZhi float64 = 0
var lingJiang float64 = 0
var quanJiang float64 = 0
isTrue := true
var dingLiangScore float64 = 0
switch monthInt {
case 3:
for i := 1; i <= 3; i++ {
sendListIng, _ := GetDingLiangLog(orgId, requestData.Year, int64(i), requestData.TargetId, fmt.Sprintf("%v月份实际分值", i))
sendList = append(sendList, sendListIng...)
if i == 3 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
lingJiang = v.Zeroprize
quanJiang = v.Allprize
if v.MtOrAt == 2 {
dingLiangScore = v.Score
isTrue = false
}
}
}
}
case 6:
for i := 4; i <= 6; i++ {
sendListIng, _ := GetDingLiangLog(orgId, requestData.Year, int64(i), requestData.TargetId, fmt.Sprintf("%v月份实际分值", i))
sendList = append(sendList, sendListIng...)
if i == 6 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
lingJiang = v.Zeroprize
quanJiang = v.Allprize
if v.MtOrAt == 2 {
dingLiangScore = v.Score
isTrue = false
}
}
}
}
case 9:
for i := 7; i <= 9; i++ {
sendListIng, _ := GetDingLiangLog(orgId, requestData.Year, int64(i), requestData.TargetId, fmt.Sprintf("%v月份实际分值", i))
sendList = append(sendList, sendListIng...)
if i == 9 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
lingJiang = v.Zeroprize
quanJiang = v.Allprize
if v.MtOrAt == 2 {
dingLiangScore = v.Score
isTrue = false
}
}
}
}
case 12:
for i := 10; i <= 12; i++ {
sendListIng, _ := GetDingLiangLog(orgId, requestData.Year, int64(i), requestData.TargetId, fmt.Sprintf("%v月份实际分值", i))
sendList = append(sendList, sendListIng...)
if i == 12 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
lingJiang = v.Zeroprize
quanJiang = v.Allprize
if v.MtOrAt == 2 {
dingLiangScore = v.Score
isTrue = false
}
}
}
}
default:
}
var secondCont dingLiangKaoHe
secondCont.MtOrAt = 1 //手动还是自动
secondCont.Cont = "平均分" //说明
secondCont.Nature = 1
secondCont.Zeroprize = lingJiang
secondCont.Allprize = quanJiang
secondCont.Capping = fengDingZhi
if attribute == 3 {
secondCont.Score = targetScore
} else {
var daChengLv float64 = 0
var pingJunXiShu float64 = 0
for _, j := range sendList {
daChengLv = daChengLv + j.CompletionRateAll
pingJunXiShu++
}
if pingJunXiShu > 0 {
pingJunZhi := daChengLv / pingJunXiShu
secondCont.Score = publicmethod.DecimalEs(GetQuantifyScore(targetScore, pingJunZhi, fengDingZhi), 2)
secondCont.CompletionRate = publicmethod.DecimalEs(pingJunZhi, 2)
} else {
secondCont.Score = targetScore
}
if !isTrue {
secondCont.Score = dingLiangScore
}
}
sendList = append(sendList, secondCont)
} else {
sendList, _ = GetDingLiangLog(orgId, requestData.Year, monthInt, requestData.TargetId, "")
}
case 6: //年度指标
isTrue := true
var dingLiangScore float64 = 0
var fengDingZhi float64 = 0
var lingJiang float64 = 0
var quanJiang float64 = 0
for i := 1; i <= 12; i++ {
sendListIng, _ := GetDingLiangLog(orgId, requestData.Year, int64(i), requestData.TargetId, fmt.Sprintf("%v月份实际分值", i))
sendList = append(sendList, sendListIng...)
if i == 12 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
lingJiang = v.Zeroprize
quanJiang = v.Allprize
if v.MtOrAt == 2 {
dingLiangScore = v.Score
isTrue = false
}
}
}
}
var secondCont dingLiangKaoHe
secondCont.MtOrAt = 1 //手动还是自动
secondCont.Cont = "平均分" //说明
secondCont.Nature = 1
secondCont.Zeroprize = lingJiang
secondCont.Allprize = quanJiang
secondCont.Capping = fengDingZhi
if attribute == 3 {
secondCont.Score = targetScore
} else {
var daChengLv float64 = 0
var pingJunXiShu float64 = 0
for _, j := range sendList {
daChengLv = daChengLv + j.CompletionRateAll
pingJunXiShu++
}
if pingJunXiShu > 0 {
pingJunZhi := daChengLv / pingJunXiShu
secondCont.Score = publicmethod.DecimalEs(GetQuantifyScore(targetScore, pingJunZhi, fengDingZhi), 2)
secondCont.CompletionRate = publicmethod.DecimalEs(pingJunZhi, 2)
} else {
secondCont.Score = targetScore
}
if !isTrue {
secondCont.Score = dingLiangScore
}
}
sendList = append(sendList, secondCont)
case 7: //半年指标
isTrue := true
var dingLiangScore float64 = 0
var fengDingZhi float64 = 0
var lingJiang float64 = 0
var quanJiang float64 = 0
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...)
if i == 6 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
lingJiang = v.Zeroprize
quanJiang = v.Allprize
if v.MtOrAt == 2 {
dingLiangScore = v.Score
isTrue = false
}
}
}
}
} else {
for i := 7; i <= 12; i++ {
sendListIng, _ := GetDingLiangLog(orgId, requestData.Year, int64(i), requestData.TargetId, fmt.Sprintf("%v月份实际分值", i))
sendList = append(sendList, sendListIng...)
if i == 12 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
lingJiang = v.Zeroprize
quanJiang = v.Allprize
if v.MtOrAt == 2 {
dingLiangScore = v.Score
isTrue = false
}
}
}
}
}
var secondCont dingLiangKaoHe
secondCont.MtOrAt = 1 //手动还是自动
secondCont.Cont = "平均分" //说明
secondCont.Nature = 1
secondCont.Zeroprize = lingJiang
secondCont.Allprize = quanJiang
secondCont.Capping = fengDingZhi
if attribute == 3 {
secondCont.Score = targetScore
} else {
var daChengLv float64 = 0
var pingJunXiShu float64 = 0
for _, j := range sendList {
daChengLv = daChengLv + j.CompletionRateAll
pingJunXiShu++
}
if pingJunXiShu > 0 {
pingJunZhi := daChengLv / pingJunXiShu
secondCont.Score = publicmethod.DecimalEs(GetQuantifyScore(targetScore, pingJunZhi, fengDingZhi), 2)
secondCont.CompletionRate = publicmethod.DecimalEs(pingJunZhi, 2)
} else {
secondCont.Score = targetScore
}
if !isTrue {
secondCont.Score = dingLiangScore
}
}
sendList = append(sendList, secondCont)
default:
sendList, _ = GetDingLiangLog(orgId, requestData.Year, monthInt, requestData.TargetId, "")
// chushu := len(sendList)
// var dingLiangScore float64 = 0
// if chushu > 0 {
// isTrue := true
// for _, v := range sendList {
// dingLiangScore = dingLiangScore + v.Score
// if v.MtOrAt == 2 {
// dingLiangScore = v.Score
// isTrue = false
// }
// }
// if isTrue {
// dingLiangScore, _ = publicmethod.DecimalNew(dingLiangScore/float64(chushu), 2)
// statisCont.Score = dingLiangScore
// } else {
// statisCont.Score = dingLiangScore
// }
// } else {
// targetScore, _, _ := GetTargetPlanScore("", cv.Id, orgId, requestData.Year, monthInt)
// statisCont.Score = targetScore
// }
}
response.Result(0, sendList, "查询完成!", c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-08-05 08:47:01
@ 功能: 计算定量指标分值
@ 参数
#targetScore 指标分
#completionRate 达成率
#capping 封顶值
@ 返回值
#
@ 方法原型
#
*/
func GetQuantifyScore(targetScore, completionRate, capping float64) (score float64) {
// fmt.Printf("targetScore:---》%v\ncompletionRate:---》%v\ncapping:---》%v\n", targetScore, completionRate, capping)
if capping != 0 {
if completionRate >= capping {
score = targetScore * (capping / 100)
} else {
score = targetScore * (completionRate / 100)
}
} else {
score = targetScore * (completionRate / 100)
}
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-08-07 10:42:04
@ 功能: 方案得分明细(new)
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) NewSummaryDetails(c *gin.Context) {
var requestData detailedResults
err := c.ShouldBindJSON(&requestData)
if err != nil {
response.Result(101, err, "数据获取失败!", c)
return
}
if requestData.Department == "" {
response.Result(102, 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)
planVersion, _ := publicmethod.GetPlanVresion(orgId, requestData.Year, int64(requestData.Months))
var planVersioInfo []AddDutyNewCont
json.Unmarshal([]byte(planVersion.Content), &planVersioInfo)
var lookStatistics []detailedResultsList
for _, v := range planVersioInfo { //维度
for _, cv := range v.Child { //指标
2 years ago
// if cv.Id == "120" {
var statisCont detailedResultsList
statisCont.DimensionId = v.Id //维度Id
statisCont.DimensionName = v.Name //维度名称
statisCont.DimensionWeight = int64(v.ZhiFraction) //维度权重
statisCont.TargetId = cv.Id //指标ID
statisCont.TargetName = cv.Name //指标名称
statisCont.TargetCont = cv.Content //指标名称
statisCont.Targetweight = cv.ReferenceScore //指标权重
statisCont.GroupId = strconv.FormatInt(planVersion.Group, 10) //集团Id
statisCont.Versio = planVersion.Key
var groupCont modelshr.AdministrativeOrganization
groupCont.GetCont(map[string]interface{}{"`id`": planVersion.Group}, "name")
statisCont.GroupName = groupCont.Name //集团名称
statisCont.DepartmentId = strconv.FormatInt(planVersion.Department, 10) //部门ID
var departCont modelshr.AdministrativeOrganization
departCont.GetCont(map[string]interface{}{"`id`": planVersion.Department}, "name")
statisCont.DepartmentName = departCont.Name //部门名称
var evalTargetCont modelskpi.EvaluationTarget //指标信息
if cv.Id != "" && cv.Id != "0" {
targetErr := evalTargetCont.GetCont(map[string]interface{}{"`et_id`": cv.Id}, "et_type")
if targetErr == nil {
monthInt := int64(requestData.Months)
if evalTargetCont.Type == 1 { //定性指标
statisCont.Score, statisCont.ExecutiveDepartment = DingXingScoreCalculation(orgId, requestData.Year, cv.ReferenceScore, []int64{monthInt}, cv.Id)
} else { //定量指标
var sendList []dingLiangKaoHe
var dingLiangScore float64 = 0
switch cv.Cycles {
case 5: //季度指标
var fengDingZhi float64 = 0
isTrue := true
switch monthInt {
case 3:
for i := 1; i <= 3; i++ {
sendListIng, orgNameList := GetDingLiangLog(orgId, requestData.Year, int64(i), cv.Id, fmt.Sprintf("%v月份实际分值", i))
sendList = append(sendList, sendListIng...)
statisCont.ExecutiveDepartment = append(statisCont.ExecutiveDepartment, orgNameList...)
if i == 3 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
if v.MtOrAt == 2 {
dingLiangScore = v.Score
isTrue = false
2 years ago
}
}
}
2 years ago
}
case 6:
for i := 4; i <= 6; i++ {
sendListIng, orgNameList := GetDingLiangLog(orgId, requestData.Year, int64(i), cv.Id, fmt.Sprintf("%v月份实际分值", i))
sendList = append(sendList, sendListIng...)
statisCont.ExecutiveDepartment = append(statisCont.ExecutiveDepartment, orgNameList...)
if i == 6 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
if v.MtOrAt == 2 {
dingLiangScore = v.Score
isTrue = false
2 years ago
}
}
}
2 years ago
}
case 9:
for i := 7; i <= 9; i++ {
sendListIng, orgNameList := GetDingLiangLog(orgId, requestData.Year, int64(i), cv.Id, fmt.Sprintf("%v月份实际分值", i))
sendList = append(sendList, sendListIng...)
statisCont.ExecutiveDepartment = append(statisCont.ExecutiveDepartment, orgNameList...)
if i == 9 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
if v.MtOrAt == 2 {
dingLiangScore = v.Score
isTrue = false
2 years ago
}
}
}
}
2 years ago
case 12:
for i := 10; i <= 12; i++ {
sendListIng, orgNameList := GetDingLiangLog(orgId, requestData.Year, int64(i), cv.Id, fmt.Sprintf("%v月份实际分值", i))
sendList = append(sendList, sendListIng...)
statisCont.ExecutiveDepartment = append(statisCont.ExecutiveDepartment, orgNameList...)
if i == 12 {
for _, v := range sendListIng {
fengDingZhi = v.Capping
if v.MtOrAt == 2 {
dingLiangScore = v.Score
isTrue = false
}
2 years ago
}
}
}
default:
2 years ago
isTrue = true
}
if isTrue {
targetScore, attribute, _ := GetTargetPlanScore("", cv.Id, orgId, requestData.Year, monthInt)
if attribute == 3 {
statisCont.Score = targetScore
} else {
var daChengLv float64 = 0
var pingJunXiShu float64 = 0
for _, j := range sendList {
daChengLv = daChengLv + j.CompletionRateAll
pingJunXiShu++
2 years ago
}
2 years ago
if pingJunXiShu > 0 {
pingJunZhi := daChengLv / pingJunXiShu
statisCont.Score = publicmethod.DecimalEs(GetQuantifyScore(targetScore, pingJunZhi, fengDingZhi), 2)
2 years ago
} else {
2 years ago
statisCont.Score = targetScore
2 years ago
}
2 years ago
}
} else {
statisCont.Score = dingLiangScore
}
2 years ago
2 years ago
default:
sendList, statisCont.ExecutiveDepartment = GetDingLiangLog(orgId, requestData.Year, monthInt, cv.Id, "")
chushu := len(sendList)
if chushu > 0 {
isTrue := true
for _, v := range sendList {
dingLiangScore = dingLiangScore + v.Score
if v.MtOrAt == 2 {
dingLiangScore = v.Score
isTrue = false
}
}
if isTrue {
dingLiangScore, _ = publicmethod.DecimalNew(dingLiangScore/float64(chushu), 2)
statisCont.Score = dingLiangScore
2 years ago
} else {
2 years ago
statisCont.Score = dingLiangScore
2 years ago
}
2 years ago
} else {
targetScore, _, _ := GetTargetPlanScore("", cv.Id, orgId, requestData.Year, monthInt)
statisCont.Score = targetScore
2 years ago
}
2 years ago
2 years ago
}
}
}
}
2 years ago
statisCont.Type = evalTargetCont.Type //1:定性;2:定量
statisCont.Unit = cv.Unit //单位
statisCont.Cycle = cv.Cycles //周期
statisCont.Cycleattr = cv.CycleAttres //辅助参数
lookStatistics = append(lookStatistics, statisCont)
// }
2 years ago
}
}
response.Result(0, lookStatistics, "查询完成", c)
}