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.
326 lines
11 KiB
326 lines
11 KiB
package departmentpc
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"key_performance_indicators/api/version1/postseting/postweb"
|
|
"key_performance_indicators/models/modelshr"
|
|
"key_performance_indicators/models/modelskpi"
|
|
"key_performance_indicators/overall"
|
|
"key_performance_indicators/overall/publicmethod"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2023-01-15 09:42:53
|
|
@ 功能: 获取定量考核任务列表
|
|
@ 参数
|
|
|
|
#
|
|
|
|
@ 返回值
|
|
|
|
#
|
|
|
|
@ 方法原型
|
|
|
|
#
|
|
*/
|
|
func (a *ApiMethod) GetQuantitativeTasks(c *gin.Context) {
|
|
//获取登录人信息
|
|
myLoginCont, _ := publicmethod.LoginMyCont(c)
|
|
//获取参数
|
|
var receivedValue GetQuanTasks
|
|
c.ShouldBindJSON(&receivedValue)
|
|
var listCont []modelskpi.QualitativeEvaluation
|
|
gormDb := overall.CONSTANT_DB_KPI.Where("`qe_type` = 2 AND `qe_state` = 1 AND FIND_IN_SET(?,`qe_operator`)", myLoginCont.Key)
|
|
if receivedValue.OrgId != "" {
|
|
gormDb = gormDb.Where("qe_accept_evaluation = ?", receivedValue.OrgId)
|
|
}
|
|
if receivedValue.Title != "" {
|
|
gormDb = gormDb.Where("et_title LIKE ?", "%"+receivedValue.Title+"%")
|
|
}
|
|
err := gormDb.Order("qe_type ASC,qe_group ASC,qe_accept_evaluation ASC,qe_dimension ASC,qe_target ASC,qe_target_sun ASC,qe_detailed_target ASC").Find(&listCont).Error
|
|
if err != nil || len(listCont) < 1 {
|
|
publicmethod.Result(1, err, c, "您没有要参加的考核项目!")
|
|
return
|
|
}
|
|
var sendListCont []TargetContOutCont
|
|
for _, v := range listCont {
|
|
var sendCont TargetContOutCont
|
|
sendCont.Id = strconv.FormatInt(v.Id, 10)
|
|
sendCont.Type = v.Type
|
|
sendCont.Group = strconv.FormatInt(v.Group, 10)
|
|
//公司
|
|
var groupCont modelshr.AdministrativeOrganization
|
|
groupCont.GetCont(map[string]interface{}{"`id`": v.Group}, "`name`")
|
|
sendCont.GroupNAme = groupCont.Name
|
|
//部门
|
|
var departCont modelshr.AdministrativeOrganization
|
|
departCont.GetCont(map[string]interface{}{"`id`": v.AcceptEvaluation}, "`name`")
|
|
sendCont.DepartmentName = departCont.Name
|
|
sendCont.DepartmentId = strconv.FormatInt(v.AcceptEvaluation, 10)
|
|
sendCont.PlanVersionNumber = v.QualEvalId //执行方案版本号
|
|
//维度相关信息
|
|
sendCont.Dimension = strconv.FormatInt(v.Dimension, 10)
|
|
var dimeCont modelskpi.DutyClass
|
|
dimeCont.GetCont(map[string]interface{}{"`id`": v.Dimension}, "`title`")
|
|
sendCont.DimensionName = dimeCont.Title
|
|
//指标信息
|
|
sendCont.Target = strconv.FormatInt(v.Target, 10)
|
|
var targetCont modelskpi.EvaluationTarget
|
|
targetCont.GetCont(map[string]interface{}{"`et_id`": v.Target}, "`et_title`", "`et_scoring_method`")
|
|
sendCont.TargetName = targetCont.Title
|
|
//子栏目
|
|
sendCont.ScoringMethod = int64(targetCont.ScoringMethod)
|
|
if v.TargetSun != 0 {
|
|
sendCont.TargetSun = strconv.FormatInt(v.TargetSun, 10)
|
|
var sunTargetCont modelskpi.QualitativeTarget
|
|
sunTargetCont.GetCont(map[string]interface{}{"`q_id`": v.Target}, "`q_title`")
|
|
sendCont.TargetSunName = sunTargetCont.Title
|
|
}
|
|
//指标细则
|
|
if v.DetailedTarget != 0 {
|
|
sendCont.DetailedTarget = strconv.FormatInt(v.DetailedTarget, 10)
|
|
var detailedTargetCont modelskpi.DetailedTarget
|
|
detailedTargetCont.GetCont(map[string]interface{}{"`dt_id`": v.Target}, "`dt_title`", "`dt_content`")
|
|
sendCont.DetailedTargetName = detailedTargetCont.Title
|
|
sendCont.Content = detailedTargetCont.Content
|
|
}
|
|
sendCont.Unit = v.Unit
|
|
sendCont.ReferenceScore = v.ReferenceScore
|
|
sendCont.Cycles = v.Cycles
|
|
sendCont.CycleAttres = v.CycleAttres
|
|
sendCont.State = v.State
|
|
userAry := strings.Split(v.Operator, ",")
|
|
sendCont.UserList = userAry
|
|
for _, u_v := range userAry {
|
|
var repoCont modelshr.PersonArchives
|
|
repoErr := repoCont.GetCont(map[string]interface{}{"`key`": u_v}, "`number`", "`name`")
|
|
if repoErr == nil {
|
|
var userCont QualEvalArrt
|
|
userCont.Id = u_v
|
|
userCont.Name = repoCont.Name
|
|
sendCont.UserListAry = append(sendCont.UserListAry, userCont)
|
|
}
|
|
}
|
|
sendCont.DimensionWeight, sendCont.TargetWeight = getPlanVersionWeghit(v.QualEvalId, strconv.FormatInt(v.Dimension, 10), strconv.FormatInt(v.Target, 10))
|
|
//获取目标设定
|
|
quanTitWhere := publicmethod.MapOut[string]()
|
|
quanTitWhere["company_id"] = v.Group
|
|
quanTitWhere["department_id"] = v.AcceptEvaluation
|
|
quanTitWhere["dimension"] = v.Dimension
|
|
quanTitWhere["target"] = v.Target
|
|
if v.DetailedTarget != 0 {
|
|
quanTitWhere["detailed"] = v.DetailedTarget
|
|
}
|
|
quanTitWhere["year"] = publicmethod.UnixTimeToDay(time.Now().Unix(), 16)
|
|
quanTitWhere["timecopy"] = AllZreoConfig(v.Cycles)
|
|
//目标值设定
|
|
var quanTitCont modelskpi.QuanPeopleConfig
|
|
quanTitCont.GetCont(quanTitWhere)
|
|
//全奖值、零奖值、封顶值
|
|
sendCont.ZeroPrize = strconv.FormatFloat(float64(quanTitCont.Zeroprize)/100, 'f', -1, 64)
|
|
sendCont.AllPrize = strconv.FormatFloat(float64(quanTitCont.Allprize)/100, 'f', -1, 64)
|
|
sendCont.CappingVal = quanTitCont.CappingVal / 100
|
|
//获取实际值
|
|
shiJiZhi := publicmethod.MapOut[string]()
|
|
shiJiZhi["fl_evaluation_user"] = myLoginCont.Key
|
|
shiJiZhi["fl_evaluation_department"] = myLoginCont.MainDeparment
|
|
shiJiZhi["fl_evaluation_group"] = myLoginCont.Company
|
|
|
|
operationTime := time.Now().Unix()
|
|
if receivedValue.Time != "" {
|
|
strTime := fmt.Sprintf("%v-01 00:00:00", receivedValue.Time)
|
|
stringToTime, strToTimeErr := publicmethod.DateToTimeStamp(strTime)
|
|
if strToTimeErr == true {
|
|
operationTime = stringToTime
|
|
} else {
|
|
strTime = fmt.Sprintf("%v 00:00:00", receivedValue.Time)
|
|
stringToTime, strToTimeErr = publicmethod.DateToTimeStamp(strTime)
|
|
if strToTimeErr == true {
|
|
operationTime = stringToTime
|
|
}
|
|
}
|
|
}
|
|
switch v.Cycles {
|
|
case 1:
|
|
shiJiZhi["fl_year"] = publicmethod.ComputingTime(operationTime, 1)
|
|
shiJiZhi["fl_quarter"] = publicmethod.ComputingTime(operationTime, 2)
|
|
shiJiZhi["fl_month"] = publicmethod.ComputingTime(operationTime, 3)
|
|
shiJiZhi["fl_week"] = publicmethod.ComputingTime(operationTime, 4)
|
|
shiJiZhi["fl_day"] = publicmethod.ComputingTime(operationTime, 5)
|
|
case 2:
|
|
shiJiZhi["fl_year"] = publicmethod.ComputingTime(operationTime, 1)
|
|
shiJiZhi["fl_quarter"] = publicmethod.ComputingTime(operationTime, 2)
|
|
shiJiZhi["fl_month"] = publicmethod.ComputingTime(operationTime, 3)
|
|
shiJiZhi["fl_week"] = publicmethod.ComputingTime(operationTime, 4)
|
|
shiJiZhi["fl_day"] = publicmethod.ComputingTime(operationTime, 5)
|
|
case 3:
|
|
shiJiZhi["fl_year"] = publicmethod.ComputingTime(operationTime, 1)
|
|
shiJiZhi["fl_quarter"] = publicmethod.ComputingTime(operationTime, 2)
|
|
shiJiZhi["fl_month"] = publicmethod.ComputingTime(operationTime, 3)
|
|
shiJiZhi["fl_week"] = publicmethod.ComputingTime(operationTime, 4)
|
|
case 4:
|
|
shiJiZhi["fl_year"] = publicmethod.ComputingTime(operationTime, 1)
|
|
shiJiZhi["fl_quarter"] = publicmethod.ComputingTime(operationTime, 2)
|
|
shiJiZhi["fl_month"] = publicmethod.ComputingTime(operationTime, 3)
|
|
case 5:
|
|
shiJiZhi["fl_year"] = publicmethod.ComputingTime(operationTime, 1)
|
|
shiJiZhi["fl_quarter"] = publicmethod.ComputingTime(operationTime, 2)
|
|
case 6:
|
|
shiJiZhi["fl_year"] = publicmethod.ComputingTime(operationTime, 1)
|
|
default:
|
|
shiJiZhi["fl_year"] = publicmethod.ComputingTime(operationTime, 1)
|
|
shiJiZhi["fl_quarter"] = publicmethod.ComputingTime(operationTime, 2)
|
|
shiJiZhi["fl_month"] = publicmethod.ComputingTime(operationTime, 3)
|
|
shiJiZhi["fl_week"] = publicmethod.ComputingTime(operationTime, 4)
|
|
shiJiZhi["fl_day"] = publicmethod.ComputingTime(operationTime, 5)
|
|
}
|
|
actualValue := GetTimeIntervalDuty(shiJiZhi, v.Id) //实际值
|
|
sendCont.Actual = strconv.FormatFloat(actualValue/100, 'f', -1, 64)
|
|
// chuShuVal := actualValue - quanTitCont.Zeroprize
|
|
// beiChuShuVal := quanTitCont.Allprize - quanTitCont.Zeroprize
|
|
// if beiChuShuVal > 0 {
|
|
// sendCont.ReachScore = chuShuVal / beiChuShuVal
|
|
// } else {
|
|
// sendCont.ReachScore = 0
|
|
// }
|
|
_, sendCont.ReachScore = postweb.GetAchieAndActual(actualValue, float64(sendCont.TargetWeight), quanTitCont.Zeroprize, quanTitCont.Allprize, quanTitCont.CappingVal)
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2022-10-28 15:09:33
|
|
@ 功能: 计算达成率及得分
|
|
@ 参数
|
|
|
|
#score 实际分
|
|
#weight 指标权重
|
|
#zeroprize 零奖值
|
|
#allprize 全奖值
|
|
#cappingval 封顶值
|
|
|
|
@ 返回值
|
|
|
|
#achievement 达成率
|
|
#actual 得分
|
|
|
|
@ 函数原型
|
|
|
|
#GetAchieAndActual(score, weight, zeroprize, allprize, cappingval float64) (achievement, actual float64)
|
|
*/
|
|
|
|
if quanTitCont.Zeroprize == 0 && quanTitCont.Allprize == 0 {
|
|
sendCont.Reach = "未设置目标值"
|
|
} else {
|
|
dividend := quanTitCont.Allprize - quanTitCont.Zeroprize //被除数
|
|
if dividend == 0 {
|
|
sendCont.Reach = "未设置目标值"
|
|
} else {
|
|
sendCont.Reach = fmt.Sprintf("(实际值-零奖值)/(全奖值-零奖值)")
|
|
}
|
|
}
|
|
sendCont.Reason = ""
|
|
sendCont.DetailedTarget = strconv.FormatInt(v.DetailedTarget, 10)
|
|
sendListCont = append(sendListCont, sendCont)
|
|
}
|
|
publicmethod.Result(0, sendListCont, c)
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2023-01-15 10:23:22
|
|
@ 功能: 获取维度与指标权重
|
|
@ 参数
|
|
|
|
#planKey 方案编号
|
|
#dimensionId 维度
|
|
#targetId 指标
|
|
|
|
@ 返回值
|
|
|
|
#dimensionIdWeghit 维度权重
|
|
#targetIdWeghit 指标权重
|
|
|
|
@ 方法原型
|
|
|
|
#getPlanVersionWeghit(planKey, dimensionId, targetId string) (dimensionIdWeghit, targetIdWeghit int64)
|
|
*/
|
|
func getPlanVersionWeghit(planKey, dimensionId, targetId string) (dimensionIdWeghit, targetIdWeghit int64) {
|
|
var planVersionCont modelskpi.PlanVersio
|
|
err := overall.CONSTANT_DB_KPI.Model(&modelskpi.PlanVersio{}).Select("`content`").Where("`key` = ?", planKey).First(&planVersionCont).Error
|
|
if err != nil {
|
|
return
|
|
}
|
|
var planVersioInfo []AddDutyNewCont
|
|
jsonErr := json.Unmarshal([]byte(planVersionCont.Content), &planVersioInfo)
|
|
if jsonErr != nil {
|
|
return
|
|
}
|
|
for _, v := range planVersioInfo {
|
|
if v.Id == dimensionId {
|
|
dimensionIdWeghit = int64(v.ZhiFraction)
|
|
for _, cv := range v.Child {
|
|
if cv.Id == targetId {
|
|
targetIdWeghit = cv.ReferenceScore
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
/**
|
|
@ 作者: 秦东
|
|
@ 时间: 2023-01-15 10:49:07
|
|
@ 功能: 判断全奖与零奖参数
|
|
@ 参数
|
|
#
|
|
@ 返回值
|
|
#
|
|
@ 方法原型
|
|
#
|
|
*/
|
|
// 判断全奖与零奖参数
|
|
func AllZreoConfig(cycles int) (monthInt int64) {
|
|
switch cycles {
|
|
case 4:
|
|
monthInt = publicmethod.ComputingTime(time.Now().Unix(), 3)
|
|
case 5:
|
|
monthInt = publicmethod.ComputingTime(time.Now().Unix(), 2)
|
|
default:
|
|
|
|
}
|
|
return
|
|
}
|
|
|
|
// 获取定量考核时间内审批通过的考核数据
|
|
func GetTimeIntervalDuty(whereData interface{}, schemeID int64) (actual float64) {
|
|
// jsonStr, _ := json.Marshal(whereData)
|
|
// fmt.Printf("jsonStr------1------>%v\n", string(jsonStr))
|
|
actual = 0
|
|
//相关审批流
|
|
var flowLogList []modelskpi.FlowLog
|
|
err := overall.CONSTANT_DB_KPI.Where("`fl_reply` IN (2,3) AND FIND_IN_SET(?,`fl_evaluation_id`)", schemeID).Where(whereData).Find(&flowLogList).Error
|
|
if err != nil {
|
|
return
|
|
}
|
|
for _, v := range flowLogList {
|
|
actual = actual + GetSchemeFlowData(v.Key, schemeID)
|
|
}
|
|
return
|
|
}
|
|
|
|
// 获取指定审批流方案数据
|
|
func GetSchemeFlowData(flowKwy, schemeID int64) (weightSum float64) {
|
|
weightSum = 0
|
|
overall.CONSTANT_DB_KPI.Model(&modelskpi.FlowLogData{}).Where("`fld_evaluation_id` = ? AND `fld_flow_log` = ?", schemeID, flowKwy).Pluck("COALESCE(SUM(fld_score), 0) as qe_reference_score", &weightSum)
|
|
return
|
|
}
|
|
|