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.

1792 lines
54 KiB

package departmentweb
import (
"encoding/json"
"fmt"
"key_performance_indicators/models/modelshr"
"key_performance_indicators/models/modelskpi"
"key_performance_indicators/overall"
"key_performance_indicators/overall/publicmethod"
"math"
"sort"
"time"
"strconv"
"github.com/gin-gonic/gin"
)
/*
*
@ 作者: 秦东
@ 时间: 2023-03-11 08:40:44
@ 功能: 指标列表
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) TargetListForDepartment(c *gin.Context) {
var receivedValue GetDepartTargetCont
err := c.ShouldBindJSON(&receivedValue)
if err != nil {
publicmethod.Result(100, err, c)
return
}
if receivedValue.Id == "" {
publicmethod.Result(1, err, c, "未知行政组织结构!")
return
}
var targetCont modelskpi.EvaluationTarget
gormDb := overall.CONSTANT_DB_KPI.Table(fmt.Sprintf("%s et", targetCont.TableName())).Where("et.`et_state` = 1 ")
if receivedValue.Attribute != 0 {
gormDb = gormDb.Where("et.`et_type` = ?", receivedValue.Attribute)
}
gormDb = gormDb.Joins("JOIN target_department td ON et.et_id = td.target_id AND td.target_sun_id = 0 AND td.target_bylaws = 0 AND td.`type` = 1 AND td.`post_id` = 0 AND td.state = 1 AND td.level = 1 AND td.`department_id` = ?", receivedValue.Id)
var targetIdAry []int64
err = gormDb.Distinct("et.et_id").Find(&targetIdAry).Error
if err != nil || len(targetIdAry) < 1 {
publicmethod.Result(105, err, c)
return
}
var departmentTargetList []modelskpi.EvaluationTarget
err = overall.CONSTANT_DB_KPI.Model(&modelskpi.EvaluationTarget{}).Select("et_id,et_title").Where("et_id IN ?", targetIdAry).Order("`et_id` ASC").Find(&departmentTargetList).Error
if err != nil || len(departmentTargetList) < 1 {
publicmethod.Result(105, err, c)
return
}
var outputContent []SendTargetCont
for _, v := range departmentTargetList {
var outCont SendTargetCont
outCont.Id = strconv.FormatInt(v.Id, 10)
outCont.Name = v.Title
outputContent = append(outputContent, outCont)
}
publicmethod.Result(0, outputContent, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-11 11:14:41
@ 功能: 根据部门、指标、年份统计每月的目标值、实际值、达成率
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) BasisDepartTargetTimeStatistics(c *gin.Context) {
var receivedValue BaseDepartTargetTime
err := c.ShouldBindJSON(&receivedValue)
if err != nil {
publicmethod.Result(100, err, c)
return
}
if receivedValue.OrgId == "" {
publicmethod.Result(1, err, c, "未知行政组织!无法统计!")
return
}
if receivedValue.TargetId == "" {
publicmethod.Result(1, err, c, "未知指标!无法统计!")
return
}
tarWhere := publicmethod.MapOut[string]()
tarWhere["et_id"] = receivedValue.TargetId
//获取指标信息
var targetCont modelskpi.EvaluationTarget
err = targetCont.GetCont(tarWhere)
if err != nil {
publicmethod.Result(1, err, c, "未知指标!无法统计!")
return
}
tadyTime := time.Now().Unix()
dateYear := publicmethod.UnixTimeToDay(tadyTime, 16)
dateMonthMAx := 12
if receivedValue.DateTime == "" {
receivedValue.DateTime = dateYear
dateMonthVal := publicmethod.UnixTimeToDay(tadyTime, 17)
dateMonthMAx, _ = strconv.Atoi(dateMonthVal)
} else {
if receivedValue.DateTime == dateYear {
dateMonthVal := publicmethod.UnixTimeToDay(tadyTime, 17)
dateMonthMAx, _ = strconv.Atoi(dateMonthVal)
}
}
mubiaozhiTitle := fmt.Sprintf("目标值(%v)", targetCont.Uniteing)
shijizhiTitle := fmt.Sprintf("实际值(%v)", targetCont.Uniteing)
dachenglvTitle := fmt.Sprintf("达成率(%v)", "%")
var sendCont DrawEcharStatisticsCont
sendCont.Legend = []string{mubiaozhiTitle, shijizhiTitle, dachenglvTitle}
var dttsbSync GetDttsb
for i := 1; i <= dateMonthMAx; i++ {
sendCont.XAxisVal = append(sendCont.XAxisVal, fmt.Sprintf("%v月", i))
SyncSeting.Add(1)
go dttsbSync.PerformCalculation(receivedValue.OrgId, receivedValue.TargetId, receivedValue.DateTime, i)
}
SyncSeting.Wait()
Target, Actuality, CompletionRate, axisLeftMax, axisLeftMin, axisRightMax, axisRightMin := dttsbSync.readPlanTaskData() //读取协程数据
//根据维度序号排序
sort.Slice(Target, func(i, j int) bool {
return Target[i].Sort < Target[j].Sort
})
sort.Slice(Actuality, func(i, j int) bool {
return Actuality[i].Sort < Actuality[j].Sort
})
sort.Slice(CompletionRate, func(i, j int) bool {
return CompletionRate[i].Sort < CompletionRate[j].Sort
})
var muBiaoVal Seriescont
muBiaoVal.Name = mubiaozhiTitle //名称
muBiaoVal.Type = "bar" //图像类型
muBiaoVal.Tooltip = targetCont.Uniteing //单位
for _, tv := range Target {
muBiaoVal.Data = append(muBiaoVal.Data, tv.Val)
}
sendCont.Series = append(sendCont.Series, muBiaoVal)
var siJiVal Seriescont
siJiVal.Name = shijizhiTitle //名称
siJiVal.Type = "bar" //图像类型
siJiVal.Tooltip = targetCont.Uniteing //单位
for _, av := range Actuality {
siJiVal.Data = append(siJiVal.Data, av.Val)
}
sendCont.Series = append(sendCont.Series, siJiVal)
var daChengLvVal Seriescont
daChengLvVal.Name = dachenglvTitle //名称
daChengLvVal.Type = "line" //图像类型
daChengLvVal.Tooltip = "%" //单位
for _, cv := range CompletionRate {
daChengLvVal.Data = append(daChengLvVal.Data, cv.Val)
}
sendCont.Series = append(sendCont.Series, daChengLvVal)
var yMaxValLeft float64
var yMinValLeft float64
var yMaxValRight float64
var yMinValRight float64
yMinValLeft = axisLeftMin
if axisLeftMin < 0 {
yMinValLeft = 0
}
if axisLeftMax == 0 && axisLeftMin == 0 {
yMaxValLeft = 10
} else {
yMaxValLeft = axisLeftMax
}
fmt.Printf("yMinValLeft:%v----------->yMinValLeft:%v----------->axisLeftMax:%v\n", yMinValLeft, yMinValLeft, axisLeftMax)
maxYZhiStr := strconv.FormatFloat(yMaxValLeft, 'f', 0, 64)
maxYZhiInt, _ := strconv.ParseInt(maxYZhiStr, 10, 64)
quyuzhi := maxYZhiInt % 10
if yMaxValLeft > 1000 {
yMaxValLeft = yMaxValLeft - float64(quyuzhi) + 100
} else {
if yMaxValLeft < 10 {
yMaxValLeft = yMaxValLeft + 1
} else {
yMaxValLeft = yMaxValLeft - float64(quyuzhi) + 10
}
}
fmt.Printf("maxYZhiStr:%v----------->maxYZhiInt:%v----------->quyuzhi:%v----------->yMaxValLeft:%v\n", maxYZhiStr, maxYZhiInt, quyuzhi, yMaxValLeft)
yMinValRight = axisRightMin
if axisRightMin < 0 {
yMinValRight = 0
}
if axisRightMax == 0 && axisRightMin == 0 {
yMaxValRight = 10
} else {
yMaxValRight = axisRightMax
}
fmt.Printf("yMaxValRight:%v----------->yMinValRight:%v----------->axisRightMax:%v\n", yMaxValRight, yMinValRight, axisRightMax)
maxYZhiStrRight := strconv.FormatFloat(yMaxValRight, 'f', 0, 64)
maxYZhiIntRight, _ := strconv.ParseInt(maxYZhiStrRight, 10, 64)
quyuzhiRight := maxYZhiIntRight % 10
if yMaxValRight < 10 {
yMaxValRight = yMaxValRight + 1
} else {
yMaxValRight = yMaxValRight - float64(quyuzhiRight) + 10
}
// if yMaxValRight > 100 {
// yMaxValRight = 100
// }
fmt.Printf("maxYZhiStrRight:%v----------->maxYZhiIntRight:%v----------->quyuzhiRight:%v\n", maxYZhiStrRight, maxYZhiIntRight, quyuzhiRight)
var yAxisOne YaxisStruct
yAxisOne.Name = "目标值 / 实际值 / 单位"
// yAxisOne.Name = fmt.Sprintf("目标值(%v)/实际值(%v)/单位(%v)", targetCont.Uniteing, targetCont.Uniteing, "%")
yAxisOne.Type = "value" //图像类型
yAxisOne.Min = publicmethod.DecimalEs(yMinValLeft, 3) //最小值
yAxisOne.Max = publicmethod.DecimalEs(yMaxValLeft, 3) //最大值
yAxisOne.FormAtter = targetCont.Uniteing
sendCont.YAxis = append(sendCont.YAxis, yAxisOne)
var yAxisTwo YaxisStruct
yAxisTwo.Name = "达成率"
yAxisTwo.Type = "value" //图像类型
yAxisTwo.Min = publicmethod.DecimalEs(yMinValRight, 3) //最小值
yAxisTwo.Max = publicmethod.DecimalEs(yMaxValRight, 3) //最大值
yAxisTwo.FormAtter = "%"
sendCont.YAxis = append(sendCont.YAxis, yAxisTwo)
fmt.Printf("%v---------->%v------------->%v------------->%v------------->%v------------->%v------------->%v\n", axisLeftMax, axisLeftMin, axisRightMax, axisRightMin, yAxisOne, yAxisTwo, yMaxValLeft)
publicmethod.Result(0, sendCont, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-11 14:42:20
@ 功能: 计算目标值,实际值,达成率
@ 参数
#orgId 行政组织
#targetId 指标
#years 年
#month 月
@ 返回值
#
@ 方法原型
#
*/
func (g *GetDttsb) PerformCalculation(orgId, targetId, years string, month int) {
g.mutext.Lock()
defer g.mutext.Unlock()
var listCont []modelskpi.FlowDataLogType
err := overall.CONSTANT_DB_KPI.Where("`department` = ? AND `targetid` = ? AND `year` = ? AND `month` = ?", orgId, targetId, years, month).Find(&listCont).Error
var maxAllPrize float64
var minZeroPrize float64
var maxCappingPrize float64
var sumScore float64
if err == nil && len(listCont) > 0 {
for _, v := range listCont { //遍历数据
minZeroPrize, maxAllPrize, maxCappingPrize = GetTargetSetUp(v.Baseline, orgId, targetId, years, month, 3)
if v.ScoringMethod == 1 {
sumScore = sumScore + float64(v.Score)
} else {
sumScore = sumScore + float64(v.ScoringScore)
}
}
}
maxAllPrizeChuLi := publicmethod.DecimalEs(maxAllPrize/100, 2)
sumScoreChuLi := publicmethod.DecimalEs(sumScore/100, 2)
if g.AxisLeftMax < maxAllPrizeChuLi {
g.AxisLeftMax = maxAllPrizeChuLi
}
if g.AxisLeftMax < sumScoreChuLi {
g.AxisLeftMax = sumScoreChuLi
}
if g.AxisLeftMin > maxAllPrizeChuLi {
g.AxisLeftMin = maxAllPrizeChuLi
}
if g.AxisLeftMin > sumScoreChuLi {
g.AxisLeftMin = sumScoreChuLi
}
//目标值
var targetConfig GetDttsbCont
targetConfig.Val = publicmethod.DecimalEs(maxAllPrize/100, 2)
targetConfig.Sort = month
g.Target = append(g.Target, targetConfig)
//实际值
var actualityConfig GetDttsbCont
actualityConfig.Val = publicmethod.DecimalEs(sumScore/100, 2)
actualityConfig.Sort = month
g.Actuality = append(g.Actuality, actualityConfig)
//达成率
dachenglv := DepartTargetCompletionRate(sumScore, minZeroPrize, maxAllPrize, maxCappingPrize)
var completionRateConfig GetDttsbCont
completionRateConfig.Val = dachenglv
completionRateConfig.Sort = month
g.CompletionRate = append(g.CompletionRate, completionRateConfig)
if g.AxisRightMax < dachenglv {
g.AxisRightMax = dachenglv
}
if g.AxisRightMin > dachenglv {
g.AxisRightMin = dachenglv
}
SyncSeting.Done()
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-11 15:56:21
@ 功能: 计算达成率
@ 参数
#actualValue 实际值
#zeroPrize 零奖值
#allPrize 全奖值
#cappingPrize 封顶值
@ 返回值
#
@ 方法原型
#
*/
func DepartTargetCompletionRate(actualValue, zeroPrize, allPrize, cappingPrize float64) (percentageComplete float64) {
// fmt.Printf("计算达成率------->%v------->%v------->%v------->%v\n", actualValue, zeroPrize, allPrize, cappingPrize)
if allPrize == 0 && zeroPrize == 0 { //全奖值与零奖值都为0 那么达成率 100
percentageComplete = 10000
} else {
if allPrize > zeroPrize { //如果全奖值大于零奖值 执行一下操作
if actualValue <= zeroPrize { //实际结算值小于零奖值 那么达成率0
percentageComplete = 0
} else { //实际结算值大于零奖值
chushu := actualValue - zeroPrize
beiChuShu := allPrize - zeroPrize
// fmt.Printf("计算达成率-----2-->%v------->%v\n", chushu, beiChuShu)
if beiChuShu != 0 {
// percentageComplete = publicmethod.DecimalEs(chushu/beiChuShu, 4)
percentageComplete = chushu / beiChuShu
// fmt.Printf("计算达成率-----3-->%v------->%v------->%v\n", chushu, beiChuShu, percentageComplete)
if percentageComplete > 0 {
percentageComplete = percentageComplete * 10000
// fmt.Printf("计算达成率-----4-->%v------->%v------->%v\n", chushu, beiChuShu, percentageComplete)
if percentageComplete > cappingPrize {
if cappingPrize != 0 {
percentageComplete = cappingPrize
} else {
percentageComplete = 10000
}
}
// fmt.Printf("计算达成率-----6-->%v------->%v------->%v------->%v\n", chushu, beiChuShu, percentageComplete, cappingPrize)
}
} else { //被除数为0时 那么达成率0
percentageComplete = 0
}
// fmt.Printf("计算达成率-----5-->%v------->%v------->%v\n", chushu, beiChuShu, percentageComplete)
}
} else { //如果全奖值小于零奖值 执行一下操作
if actualValue >= zeroPrize { //实际结算值大于零奖值 那么达成率0
percentageComplete = 0
} else { //实际值小于零奖值
chushu := actualValue - zeroPrize
beiChuShu := allPrize - zeroPrize
if beiChuShu != 0 {
percentageComplete = publicmethod.DecimalEs(chushu/beiChuShu, 4)
if percentageComplete > 0 {
percentageComplete = percentageComplete * 10000
if percentageComplete > cappingPrize {
percentageComplete = cappingPrize
}
}
} else { //被除数为0时 那么达成率0
percentageComplete = 0
}
}
}
}
fmt.Printf("计算达成率-----1-->%v------->%v------->%v------->%v------->%v\n", actualValue, zeroPrize, allPrize, cappingPrize, percentageComplete)
percentageComplete = publicmethod.DecimalEs(percentageComplete/100, 2)
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-11 15:55:35
@ 功能: 获取目标设置
@ 参数
#targetConfigStr 当前数据记录的全奖值、零奖值、封顶值
#orgId 行政组织
#targetId 指标
#years 年
#month 月
@ 返回值
#zeroPrize 零奖值
#allPrize 全奖值
#cappingPrize 封顶值
@ 方法原型
#func GetTargetSetUp(targetConfigStr, orgId, targetId, years string, month, class int) (zeroPrize, allPrize, cappingPrize float64)
*/
func GetTargetSetUp(targetConfigStr, orgId, targetId, years string, month, class int) (zeroPrize, allPrize, cappingPrize float64) {
var targetConfig []FlowLogAllZreo
jsonErr := json.Unmarshal([]byte(targetConfigStr), &targetConfig)
if jsonErr != nil || len(targetConfig) < 1 {
var qualConfig modelskpi.QuantitativeConfig
where := publicmethod.MapOut[string]()
where["departmentid"] = orgId
where["target"] = orgId
where["type"] = class
where["year"] = years
where["timecopy"] = month
where["`state`"] = 1
qualConfig.GetCont(where, "`zeroprize`", "`allprize`", "`capping_val`")
zeroPrize = qualConfig.Zeroprize
allPrize = qualConfig.Allprize
cappingPrize = qualConfig.CappingVal
}
for _, v := range targetConfig {
if v.TargetId == targetId {
zeroPrize = v.Zeroprize
allPrize = v.Allprize
cappingPrize = v.Capping
// return
}
}
// fmt.Printf("这是获取目标值数据------------>targetConfigStr:%v----------->orgId:%v----------->targetId:%v----------->years:%v----------->month:%v----------->class:%v----------->jsonErr:%v----------->targetConfig:%v----------->zeroPrize:%v----------->allPrize:%v----------->cappingPrize:%v\n", targetConfigStr, orgId, targetId, years, month, class, jsonErr, targetConfig, zeroPrize, allPrize, cappingPrize)
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-13 13:42:07
@ 功能: 历史同比根据部门、指标、年份统计每月的目标值、实际值、达成率
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) BasisDepartTargetTimeStatisticsYOY(c *gin.Context) {
var receivedValue BaseDepartTargetTimeYOY
err := c.ShouldBindJSON(&receivedValue)
if err != nil {
publicmethod.Result(100, err, c)
return
}
if receivedValue.OrgId == "" {
publicmethod.Result(1, err, c, "未知行政组织!无法统计!")
return
}
if receivedValue.TargetId == "" {
publicmethod.Result(1, err, c, "未知指标!无法统计!")
return
}
tarWhere := publicmethod.MapOut[string]()
tarWhere["et_id"] = receivedValue.TargetId
//获取指标信息
var targetCont modelskpi.EvaluationTarget
err = targetCont.GetCont(tarWhere)
if err != nil {
publicmethod.Result(1, err, c, "未知指标!无法统计!")
return
}
tadyTime := time.Now().Unix()
dateYear, _ := strconv.Atoi(publicmethod.UnixTimeToDay(tadyTime, 16))
dateMonthMAx := 12
if len(receivedValue.DateTime) > 0 {
if len(receivedValue.DateTime) == 1 {
if receivedValue.DateTime[0] == dateYear {
dateMonthVal := publicmethod.UnixTimeToDay(tadyTime, 17)
dateMonthMAx, _ = strconv.Atoi(dateMonthVal)
}
} else {
sort.Slice(receivedValue.DateTime, func(i, j int) bool {
return receivedValue.DateTime[i] < receivedValue.DateTime[j]
})
}
} else {
dateMonthVal := publicmethod.UnixTimeToDay(tadyTime, 17)
dateMonthMAx, _ = strconv.Atoi(dateMonthVal)
receivedValue.DateTime = append(receivedValue.DateTime, dateYear)
}
var sendData SendYOYData
sendData.YAxis.Type = "value"
sendData.YAxis.Name = "实际值"
sendData.YAxis.FormAtter = targetCont.Uniteing
var goSyncData GeteveryYearDttsb
//获取X轴数据
for i := 1; i <= dateMonthMAx; i++ {
sendData.XAxisVal = append(sendData.XAxisVal, fmt.Sprintf("%v月", i))
}
//获取Y轴数据
for _, v := range receivedValue.DateTime {
SyncSeting.Add(1)
go goSyncData.getOrgBylawsTime(receivedValue.OrgId, receivedValue.TargetId, v, dateMonthMAx)
}
SyncSeting.Wait()
targetData, maxVal, minVal := goSyncData.readPlanTaskData()
if maxVal == 0 && minVal == 0 {
sendData.YAxis.Max = 10
sendData.YAxis.Min = 0
} else {
chaYiZhi := math.Ceil((maxVal - minVal) / 5)
if maxVal < 0 {
sendData.YAxis.Max = maxVal - chaYiZhi
} else {
sendData.YAxis.Max = maxVal + chaYiZhi
}
}
maxYZhiStr := strconv.FormatFloat(sendData.YAxis.Max, 'f', 0, 64)
maxYZhiInt, _ := strconv.ParseInt(maxYZhiStr, 10, 64)
quyuzhi := maxYZhiInt % 10
sendData.YAxis.Max = sendData.YAxis.Max - float64(quyuzhi) + 10
fmt.Printf("maxYZhiStr:%v------------------>maxYZhiInt:%v---------------->quyuzhi:%v\n", maxYZhiStr, maxYZhiInt, quyuzhi)
//根据维度月份排序
sort.Slice(targetData, func(i, j int) bool {
return targetData[i].Months < targetData[j].Months
})
for _, v := range targetData {
var serInfo Seriescont
serInfo.Name = v.MonthStr
serInfo.Type = "bar"
serInfo.Tooltip = targetCont.Uniteing
serInfo.Data = v.MonthDataList
sendData.Series = append(sendData.Series, serInfo)
}
fmt.Printf("targetData:%v------------------>maxVal:%v---------------->minVal:%v---------------->Max:%v\n", targetData, maxVal, minVal, sendData.YAxis.Max)
publicmethod.Result(0, sendData, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-13 14:33:07
@ 功能: 协程计算月份历史值
@ 参数
#orgId 行政组织
#targetId 指标
#years 时间(年)
#months 时间(月)
@ 返回值
#
@ 方法原型
#(g *GeteveryYearDttsb) getOrgBylawsTime(orgId, targetId string, dateTime []int, months int)
*/
func (g *GeteveryYearDttsb) getOrgBylawsTime(orgId, targetId string, years, months int) {
g.mutext.Lock()
defer g.mutext.Unlock()
var dataCont HistorMonthData
dataCont.Months = years
dataCont.MonthStr = fmt.Sprintf("%v年", years)
for i := 1; i <= months; i++ {
// SyncSetinges.Add(1)
// go g.CalculateYearMonthData(orgId, targetId, v, months)
var listCont []modelskpi.FlowDataLogType
err := overall.CONSTANT_DB_KPI.Model(&modelskpi.FlowDataLogType{}).Select("`score`,`method`,`scoring_score`").Where("`department` = ? AND `targetid` = ? AND `year` = ? AND `month` = ?", orgId, targetId, years, i).Find(&listCont).Error
if err != nil {
dataCont.MonthDataList = append(dataCont.MonthDataList, 0)
} else {
var fenScore float64
for _, v := range listCont {
if v.ScoringMethod == 1 {
fenScore = fenScore + float64(v.Score)
} else {
fenScore = fenScore + float64(v.ScoringScore)
}
}
fenScore = publicmethod.DecimalEs(fenScore/100, 2)
dataCont.MonthDataList = append(dataCont.MonthDataList, fenScore)
if g.AxisMax < fenScore {
g.AxisMax = fenScore
}
if g.AxisMin > fenScore {
g.AxisMin = fenScore
}
}
}
g.Target = append(g.Target, dataCont)
// SyncSetinges.Wait()
SyncSeting.Done()
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-14 16:11:04
@ 功能: 通过时间获取组织总分
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) TotalScoreOFOrgComesFromTimeSearch(c *gin.Context) {
var receivedValue OrgSecrcFormTime
err := c.ShouldBindJSON(&receivedValue)
if err != nil {
publicmethod.Result(100, err, c)
return
}
if receivedValue.OrgId == "" {
myCont, myErr := publicmethod.LoginMyCont(c)
if myErr != nil {
receivedValue.OrgId = "309"
} else {
if myCont.Company != 0 {
receivedValue.OrgId = strconv.FormatInt(myCont.Company, 10)
} else {
receivedValue.OrgId = "309"
}
}
}
tayTime := time.Now().Unix()
currentYears := publicmethod.UnixTimeToDay(tayTime, 16)
currentMonths := publicmethod.UnixTimeToDay(tayTime, 17)
if receivedValue.DateTimes != "" {
var dayTime publicmethod.DateTimeTotimes
dayTime.BaisStrToTime(receivedValue.DateTimes)
if dayTime.Years != "" {
currentYears = dayTime.Years
}
if dayTime.Months != "" {
currentMonths = dayTime.Months
}
}
//获取行政组织列表
var orgListCont []modelshr.AdministrativeOrganization
err = overall.CONSTANT_DB_HR.Model(&modelshr.AdministrativeOrganization{}).Select("`id`,`number`,`name`,`ispower`,`sort`").Where("ispower = 1 AND state = 1 AND organization_type > 2 AND superior = ? AND `id` NOT IN ?", receivedValue.OrgId, []int{281, 163}).Find(&orgListCont).Error
if err != nil || len(orgListCont) < 1 {
publicmethod.Result(107, err, c)
return
}
//获取一级主部门下是否由二级主部门
var allOrgListCont []modelshr.AdministrativeOrganization
for _, ov := range orgListCont {
sunOrgListCont, sunOrgErr := publicmethod.GetSunOrgList(ov.Id)
if sunOrgErr == nil && len(sunOrgListCont) > 0 {
for _, sv := range sunOrgListCont {
allOrgListCont = append(allOrgListCont, sv)
}
} else {
allOrgListCont = append(allOrgListCont, ov)
}
}
//根据维度序号排序
sort.Slice(allOrgListCont, func(i, j int) bool {
return allOrgListCont[i].Sort < allOrgListCont[j].Sort
})
var sendData SendTimeOfOrgSumScore
//开启协程,分别获取行政组织时间总分
var syncOrgTimeScore SyncOrgTimeAllScore
for _, v := range allOrgListCont {
// if v.Id == 354 {
sendData.XAxisVal = append(sendData.XAxisVal, v.Name)
SyncSeting.Add(1)
// go syncOrgTimeScore.OrgCalculateScore(v, currentYears, currentMonths)
go syncOrgTimeScore.TallyUpOrgCalculateScore(v, currentYears, currentMonths)
// }
}
SyncSeting.Wait()
scoreList, maxScore, minSchor := syncOrgTimeScore.readPlanTaskData()
// sendDataMap := publicmethod.MapOut[string]()
var suo []Seriescont
for _, ov := range allOrgListCont {
var seriesInfo Seriescont
seriesInfo.Name = ov.Name
seriesInfo.Type = "bar"
orgScore := GetAryValue(ov.Id, scoreList)
seriesInfo.Data = append(seriesInfo.Data, orgScore)
sendData.Series = append(sendData.Series, orgScore)
suo = append(suo, seriesInfo)
}
if maxScore > 0 && minSchor < 0 {
if maxScore < 10 {
maxScore = maxScore + 1
} else {
maxScore = maxScore + maxScore/5
}
if minSchor > -10 {
minSchor = minSchor - 1
} else {
minSchor = minSchor + minSchor/5
}
} else if maxScore > 0 && minSchor > 0 {
maxScore = maxScore + (maxScore-minSchor)/5
minSchor = float64(int64(minSchor/10)) * 10
}
sendData.YAxis.Min = math.Ceil(minSchor)
sendData.YAxis.Max = math.Ceil(maxScore)
// sendDataMap["sendData"] = sendData
// sendDataMap["receivedValue"] = receivedValue
// sendDataMap["currentYears"] = currentYears
// sendDataMap["currentMonths"] = currentMonths
// sendDataMap["allOrgListCont"] = allOrgListCont
// sendDataMap["syncOrgTimeScore"] = syncOrgTimeScore
// sendDataMap["suo"] = suo
// sendDataMap["maxScore"] = maxScore
// sendDataMap["minSchor"] = minSchor
publicmethod.Result(0, sendData, c)
}
// 获取数值值
func GetAryValue(orgId int64, orgScoreList []SyncOTASVal) float64 {
for _, v := range orgScoreList {
if orgId == v.OrgId {
return v.Score
}
}
return 0
}
// 获取数值值
func GetAryValueMonth(months int, orgScoreList []SyncOTASVal) float64 {
for _, v := range orgScoreList {
if months == v.Months {
return v.Score
}
}
return 0
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-15 11:14:37
@ 功能: 计算行政组织成绩
@ 参数
#orgCont 行政组织薪资
#years 年
#months 月
@ 返回值
#
@ 方法原型
#
*/
func (s *SyncOrgTimeAllScore) OrgCalculateScore(orgCont modelshr.AdministrativeOrganization, years, months string) {
//锁操作
s.mutext.Lock()
defer s.mutext.Unlock()
tayTime := time.Now().Unix()
currentYears := publicmethod.UnixTimeToDay(tayTime, 16)
currentMonth := publicmethod.UnixTimeToDay(tayTime, 17)
//获取执行的考核方案
var schemeCont modelskpi.PlanVersio
var err error
if currentYears == years {
where := publicmethod.MapOut[string]()
where["`state`"] = 1
where["`department`"] = orgCont.Id
err = schemeCont.GetCont(where)
} else {
err = overall.CONSTANT_DB_KPI.Where("state = 2 AND department = ? AND yeares = ?", orgCont.Id, years).Order("addtime desc").First(&schemeCont).Error
if err != nil {
err = overall.CONSTANT_DB_KPI.Where("state = 3 AND department = ? AND yeares = ?", orgCont.Id, years).Order("addtime desc").First(&schemeCont).Error
}
}
var getPoints float64
if err == nil {
//将考核方案解析
var schemeInfoCont []SchemeInfo
jsonErr := json.Unmarshal([]byte(schemeCont.Content), &schemeInfoCont)
if jsonErr == nil {
for _, v := range schemeInfoCont { //维度层面
for _, sv := range v.Child { //指标
//判断是不是观察指标
if sv.Status == 3 {
getPoints = getPoints + float64(sv.ReferenceScore)
// fmt.Printf("sv-1-->%v--->%v--->%v\n", sv.Id, sv.Name, sv.ReferenceScore)
} else {
if sv.Status == 1 && sv.Status != 3 { //判断指标是否启用并且不是观察指标
//获取指标内容
var targetInfo modelskpi.EvaluationTarget
targetInfo.GetCont(map[string]interface{}{"`et_id`": sv.Id}, "et_id", "et_type", "et_cycle")
if sv.Cycles == 0 { //判断统计方式
sv.Cycles = targetInfo.Cycles
}
//判断指标类型
if targetInfo.Type == 1 {
//定性考核
dingXingScore := OrgSchemeDingXing(orgCont.Id, sv.ReferenceScore, targetInfo.Id, sv.Cycles, sv.Status, years, months)
getPoints = getPoints + dingXingScore
// fmt.Printf("sv-2-->%v--->%v--->%v\n", sv.Id, sv.Name, dingXingScore)
} else {
//定量考核
dingLiangScore := OrgSchemeDingLiang(orgCont.Id, sv.ReferenceScore, targetInfo.Id, sv.Cycles, sv.Status, years, months)
getPoints = getPoints + dingLiangScore
// fmt.Printf("sv-3-->%v--->%v--->%v\n", sv.Id, sv.Name, dingLiangScore)
}
}
}
// fmt.Printf("sv--->%v--->%v--->%v\n", sv.Id, sv.Name, getPoints)
}
}
}
}
currentYearsInt, _ := strconv.Atoi(currentYears)
yearsInt, _ := strconv.Atoi(years)
monthsInt, _ := strconv.Atoi(months)
currentMonthInt, _ := strconv.Atoi(currentMonth)
if currentYearsInt == yearsInt && monthsInt > currentMonthInt {
getPoints = 0
// fmt.Printf("currentYears:%v---->years:%v---->months:%v---->currentMonth:%v---->getPoints:%v\n", currentYearsInt, yearsInt, monthsInt, currentMonthInt, getPoints)
}
if s.AxisMax < getPoints {
s.AxisMax = getPoints
}
if s.AxisMin == 0 {
s.AxisMin = getPoints
} else {
if s.AxisMin > getPoints {
s.AxisMin = getPoints
}
}
var orgScore SyncOTASVal
orgScore.OrgId = orgCont.Id
orgScore.Score = publicmethod.DecimalEs(getPoints, 2)
orgScore.Months, _ = strconv.Atoi(months)
s.OrgScore = append(s.OrgScore, orgScore)
SyncSeting.Done()
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-15 14:35:59
@ 功能: 计算行政组织考核方案指定时间内定量指标得分
@ 参数
#orgId 行政组织
#targetWeight 指标权重
#targetId 指标Id
#cycles 周期(1:班;2:天;3:周;4:月;5:季度;6:年)
#attribute 属性(1:启用;2:禁用;3:观察)
#years 年
#months 月
@ 返回值
#score 最终得分
@ 方法原型
#func OrgSchemeDingLiang(orgId, targetWeight, targetId int64, cycles, attribute int, years, months string) (score float64)
*/
func OrgSchemeDingLiang(orgId, targetWeight, targetId int64, cycles, attribute int, years, months string) (score float64) {
//获取定量考核记录
var examineListCont []modelskpi.FlowDataLogType
err := overall.CONSTANT_DB_KPI.Where("`department` = ? AND `year` = ? AND `month` = ? AND `targetid` = ?", orgId, years, months, targetId).Find(&examineListCont).Error
if err != nil || len(examineListCont) < 1 {
score = float64(targetWeight)
return
}
var actualValue float64 //实际值
var resultValue float64 //得分
for _, v := range examineListCont {
actualValue = actualValue + float64(v.Score)
//判断自动还是手动
if v.ScoringMethod == 1 {
classVal := 3
switch cycles {
case 5:
classVal = 1
case 6:
classVal = 2
default:
classVal = 3
}
monthsInt, _ := strconv.Atoi(months)
//自动计算
zeroPrize, allPrize, cappingPrize := GetTargetSetUp(v.Baseline, strconv.FormatInt(orgId, 10), strconv.FormatInt(targetId, 10), years, monthsInt, classVal)
//达成率
dachenglv := DepartTargetCompletionRate(float64(v.Score), zeroPrize, allPrize, cappingPrize)
score = float64(targetWeight) * (dachenglv / 100)
resultValue = resultValue + score
fmt.Printf("自动得分------->%v------->%v------->%v------->%v------->%v------->%v------->%v------->%v\n", orgId, resultValue, dachenglv, score, zeroPrize, allPrize, cappingPrize, v.Score)
} else {
resultValue = resultValue + publicmethod.DecimalEs(v.ScoringScore/100, 2)
}
}
// score = publicmethod.DecimalEs(resultValue, 2)
score = resultValue
if attribute == 3 {
score = float64(targetWeight)
} else {
switch cycles {
case 5:
if publicmethod.IsInTrue[string](months, []string{"3", "6", "9", "12"}) == false {
score = float64(targetWeight)
}
case 6:
if months != "12" {
score = float64(targetWeight)
}
case 7:
if publicmethod.IsInTrue[string](months, []string{"6", "12"}) == false {
score = float64(targetWeight)
}
default:
}
}
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-15 13:09:16
@ 功能: 计算行政组织考核方案指定时间内定性指标得分
@ 参数
#orgId 行政组织
#targetWeight 指标权重
#targetId 指标Id
#cycles 周期(1:班;2:天;3:周;4:月;5:季度;6:年)
#attribute 属性(1:启用;2:禁用;3:观察)
#years 年
#months 月
@ 返回值
#score 最终得分
@ 方法原型
#func OrgSchemeDingXing(orgId, targetWeight, targetId int64, cycles, attribute int, years, months string) (score float64)
*/
func OrgSchemeDingXing(orgId, targetWeight, targetId int64, cycles, attribute int, years, months string) (score float64) {
//获取指定指标的所有满足条件的定性考核记录
var examineListCont []modelskpi.ScoreFlow
err := overall.CONSTANT_DB_KPI.Model(&modelskpi.ScoreFlow{}).Select("sf_score,sf_plus_reduce_score,sf_count").Where("sf_reply IN ? AND sf_duty_department = ? AND sf_year = ? AND sf_month = ? AND sf_target_id = ?", []int{2, 3}, orgId, years, months, targetId).Find(&examineListCont).Error
if err == nil && len(examineListCont) > 0 {
var minusPoints float64 //减分
var bonusPoint float64 //加分
for _, v := range examineListCont {
if v.PlusReduceScore == 1 {
//加分操作
bonusPoint = bonusPoint + (float64(v.Score) * float64(v.Count)) //分值=原分值+(评分乘以发生次数)
} else {
//减分操作
minusPoints = minusPoints + (float64(v.Score) * float64(v.Count)) //分值=原分值+(评分乘以发生次数)
}
}
resultVal := (float64(targetWeight) + bonusPoint/100) - minusPoints/100
// score = publicmethod.DecimalEs(resultVal, 3)
score = resultVal
if attribute == 3 {
score = float64(targetWeight)
} else {
switch cycles {
case 5:
if publicmethod.IsInTrue[string](months, []string{"3", "6", "9", "12"}) == false {
score = float64(targetWeight)
}
case 6:
if months != "12" {
score = float64(targetWeight)
}
case 7:
if publicmethod.IsInTrue[string](months, []string{"6", "12"}) == false {
score = float64(targetWeight)
}
default:
}
}
} else {
score = float64(targetWeight)
}
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-16 08:40:24
@ 功能: 获取关键指标
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) GetHingeTarget(c *gin.Context) {
var receivedValue HingeTarget
err := c.ShouldBindJSON(&receivedValue)
if err != nil {
publicmethod.Result(100, err, c)
return
}
if len(receivedValue.Id) < 1 {
publicmethod.Result(107, err, c)
return
}
tayTime := time.Now().Unix()
currentYears := publicmethod.UnixTimeToDay(tayTime, 16)
currentMonths := publicmethod.UnixTimeToDay(tayTime, 17)
if receivedValue.DateTime != "" {
var dayTime publicmethod.DateTimeTotimes
dayTime.BaisStrToTime(receivedValue.DateTime)
if dayTime.Years != "" {
currentYears = dayTime.Years
}
if dayTime.Months != "" {
currentMonths = dayTime.Months
}
}
var targetListCont []modelskpi.EvaluationTarget
err = overall.CONSTANT_DB_KPI.Model(&modelskpi.EvaluationTarget{}).Select("`et_id`,`et_title`,`et_type`,`et_key`").Where("`et_id` IN ?", receivedValue.Id).Find(&targetListCont).Error
if err != nil && len(targetListCont) < 1 {
publicmethod.Result(107, err, c)
return
}
var sendListCont []OutPutHingeTarget
for _, v := range targetListCont {
var sendCont OutPutHingeTarget
sendCont.Id = strconv.FormatInt(v.Id, 10)
sendCont.Title = fmt.Sprintf("%v年%v月份 %v", currentYears, currentMonths, v.Title)
sendCont.CharKey = fmt.Sprintf("chars_%v", v.Key)
if len(receivedValue.OrgId) > 1 {
sendCont.DataList, sendCont.XAxisVal, sendCont.YAxis.Max, sendCont.YAxis.Min = GetOrgHingeTarget(v.Id, v.Type, currentYears, currentMonths, receivedValue.OrgId)
}
fmt.Printf("最小值:%v\n", sendCont.YAxis.Min)
sendCont.YAxis.Max, sendCont.YAxis.Min = publicmethod.NewJudjeMaxOfMinVal(sendCont.YAxis.Max, sendCont.YAxis.Min)
// sendCont.DataList []float64 `json:"datalist"`
// sendCont.XAxisVal []string `json:"xaxis"` //X轴坐标值
sendListCont = append(sendListCont, sendCont)
}
publicmethod.Result(0, sendListCont, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-16 09:21:11
@ 功能: 获取行政组织指标指定时间内的得分·
@ 参数
#targetId 指标Id
#attribute 属性(1:定性考核;2:定量考核)
#ysers 年
#months 月
#orgId 行政组织
@ 返回值
#
@ 方法原型
#
*/
func GetOrgHingeTarget(targetId int64, attribute int, ysers, months string, orgId []string) (dataList []float64, titleList []string, maxVal, minVal float64) {
if len(orgId) < 0 {
return
}
var orgCont []modelshr.AdministrativeOrganization
err := overall.CONSTANT_DB_HR.Model(&modelshr.AdministrativeOrganization{}).Select("`id`,`name`,`sort`").Where("`id` IN ?", orgId).Order("`sort`").Find(&orgCont).Error
if err != nil || len(orgCont) < 1 {
return
}
var syncListCont SyncOrgTimeAllScore
for _, v := range orgCont {
titleList = append(titleList, v.Name)
SyncSeting.Add(1)
go syncListCont.GetOrgTargetVal(v.Id, targetId, attribute, ysers, months)
}
SyncSeting.Wait()
orgScore, maxVal, minVal := syncListCont.readPlanTaskData()
for _, ov := range orgCont {
orgScore := GetAryValue(ov.Id, orgScore)
dataList = append(dataList, orgScore)
}
maxVal = publicmethod.DecimalEs(maxVal, 2)
minVal = publicmethod.DecimalEs(minVal, 2)
// fmt.Printf("orgScore------->%v------->%v------->%v\n", orgScore, maxVal, minVal)
return
}
func (s *SyncOrgTimeAllScore) GetOrgTargetVal(orgId, targetId int64, attribute int, ysers, months string) {
//锁操作
s.mutext.Lock()
defer s.mutext.Unlock()
var tirgetScore SyncOTASVal
if attribute == 1 {
tirgetScore.Score = AuxiliaryCalculationSumNature(orgId, targetId, ysers, months)
tirgetScore.OrgId = orgId
s.OrgScore = append(s.OrgScore, tirgetScore)
} else {
tirgetScore.Score = AuxiliaryCalculationSum(orgId, targetId, attribute, ysers, months)
tirgetScore.OrgId = orgId
s.OrgScore = append(s.OrgScore, tirgetScore)
}
// fmt.Printf("tirgetScore.Score---->%v\n", tirgetScore.Score)
if tirgetScore.Score >= 0 {
if s.AxisMin == 0 {
s.AxisMin = tirgetScore.Score
} else {
if s.AxisMin > tirgetScore.Score {
s.AxisMin = tirgetScore.Score
}
}
} else {
// fmt.Printf("tirgetScore.Score--1-->%v\n-->%v\n", tirgetScore.Score, s.AxisMin)
if s.AxisMin > tirgetScore.Score {
s.AxisMin = tirgetScore.Score
}
}
if s.AxisMax == 0 {
s.AxisMax = tirgetScore.Score
} else {
if s.AxisMax < tirgetScore.Score {
s.AxisMax = tirgetScore.Score
}
}
// fmt.Printf("计算最大====》%v=====>最小值=========>%v\n", s.AxisMax, s.AxisMin)
SyncSeting.Done()
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-16 10:00:53
@ 功能: 获取定量指标总值
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func AuxiliaryCalculationSum(orgId, targetId int64, attribute int, years, months string) (sumScore float64) {
//获取定量考核记录
var examineListCont []modelskpi.FlowDataLogType
err := overall.CONSTANT_DB_KPI.Where("`department` = ? AND `year` = ? AND `month` = ? AND `targetid` = ?", orgId, years, months, targetId).Find(&examineListCont).Error
if err != nil || len(examineListCont) < 1 {
sumScore = 0
return
}
for _, v := range examineListCont {
sumScore = sumScore + float64(v.Score)
}
sumScore = publicmethod.DecimalEs(sumScore/100, 2)
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-16 09:44:31
@ 功能: 获取定性指标总值
@ 参数
#orgId 行政组织
#targetId 指标ID
#years 年
#months 月
@ 返回值
#sumScore 加减分
@ 方法原型
#func AuxiliaryCalculationSumNature(orgId, targetId int64, years, months string) (sumScore float64)
*/
func AuxiliaryCalculationSumNature(orgId, targetId int64, years, months string) (sumScore float64) {
var examineListCont []modelskpi.ScoreFlow
err := overall.CONSTANT_DB_KPI.Model(&modelskpi.ScoreFlow{}).Select("sf_score,sf_plus_reduce_score,sf_count").Where("sf_reply IN ? AND sf_duty_department = ? AND sf_year = ? AND sf_month = ? AND sf_target_id = ?", []int{2, 3}, orgId, years, months, targetId).Find(&examineListCont).Error
if err == nil && len(examineListCont) > 0 {
var minusPoints float64 //减分
var bonusPoint float64 //加分
for _, v := range examineListCont {
if v.PlusReduceScore == 1 {
//加分操作
bonusPoint = bonusPoint + (float64(v.Score) * float64(v.Count)) //分值=原分值+(评分乘以发生次数)
} else {
//减分操作
minusPoints = minusPoints + (float64(v.Score) * float64(v.Count)) //分值=原分值+(评分乘以发生次数)
}
}
sumScore = (bonusPoint - minusPoints) / 100
}
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-16 15:50:20
@ 功能: 获取单一行政组织指定年度各月份成绩
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) GetEveryOneOrgToMonthResult(c *gin.Context) {
var receivedValue OrgMonthResult
c.ShouldBindJSON(&receivedValue)
if receivedValue.OrgId == "" {
publicmethod.Result(107, receivedValue, c)
return
}
tayTime := time.Now().Unix()
tadyYear := publicmethod.UnixTimeToDay(tayTime, 16)
currentYears := tadyYear
currentMonths := 12
if receivedValue.DateTime != "" {
var dayTime publicmethod.DateTimeTotimes
dayTime.BaisStrToTime(receivedValue.DateTime)
if dayTime.Years != "" {
currentYears = dayTime.Years
}
}
if currentYears == tadyYear {
currentMonths, _ = strconv.Atoi(publicmethod.UnixTimeToDay(tayTime, 17))
}
var orgCont modelshr.AdministrativeOrganization
err := orgCont.GetCont(map[string]interface{}{"`id`": receivedValue.OrgId})
if err != nil {
publicmethod.Result(107, receivedValue, c)
return
}
fmt.Printf("年月---->%v---->%v\n", currentYears, currentMonths)
var sendData SendTimeOfOrgSumScore
//开启协程,分别获取行政组织时间总分
var syncOrgTimeScore SyncOrgTimeAllScore
for i := 1; i <= currentMonths; i++ {
iStr := strconv.Itoa(i)
iAxis := fmt.Sprintf("%v月", iStr)
sendData.XAxisVal = append(sendData.XAxisVal, iAxis)
SyncSeting.Add(1)
go syncOrgTimeScore.OrgCalculateScore(orgCont, currentYears, iStr)
}
SyncSeting.Wait()
scoreList, maxScore, minSchor := syncOrgTimeScore.readPlanTaskData()
//根据维度序号排序
sort.Slice(scoreList, func(i, j int) bool {
return scoreList[i].Months < scoreList[j].Months
})
var suo []Seriescont
for i := 1; i <= currentMonths; i++ {
var seriesInfo Seriescont
seriesInfo.Name = fmt.Sprintf("%v月", i)
seriesInfo.Type = "bar"
orgScore := GetAryValueMonth(i, scoreList)
seriesInfo.Data = append(seriesInfo.Data, orgScore)
sendData.Series = append(sendData.Series, orgScore)
suo = append(suo, seriesInfo)
}
sendData.YAxis.Max, sendData.YAxis.Min = publicmethod.JudjeMaxOfMinVal(maxScore, minSchor)
// outData := publicmethod.MapOut[string]()
// outData["scoreList"] = scoreList
// outData["maxScore"] = maxScore
// outData["minSchor"] = minSchor
// outData["sendData"] = sendData
// outData["suo"] = suo
publicmethod.Result(0, sendData, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-17 09:04:49
@ 功能: 定性指标同比环比分析
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) BasisDepartAttrTargetTimeStatistics(c *gin.Context) {
var receivedValue BaseDepartTargetTimeYOY
err := c.ShouldBindJSON(&receivedValue)
if err != nil {
publicmethod.Result(100, err, c)
return
}
if receivedValue.OrgId == "" {
publicmethod.Result(1, err, c, "未知行政组织!无法统计!")
return
}
if receivedValue.TargetId == "" {
publicmethod.Result(1, err, c, "未知指标!无法统计!")
return
}
tarWhere := publicmethod.MapOut[string]()
tarWhere["et_id"] = receivedValue.TargetId
//获取指标信息
var targetCont modelskpi.EvaluationTarget
err = targetCont.GetCont(tarWhere)
if err != nil {
publicmethod.Result(1, err, c, "未知指标!无法统计!")
return
}
tadyTime := time.Now().Unix()
dateYear, _ := strconv.Atoi(publicmethod.UnixTimeToDay(tadyTime, 16))
dateMonthMAx := 12
if len(receivedValue.DateTime) > 0 {
if len(receivedValue.DateTime) == 1 {
if receivedValue.DateTime[0] == dateYear {
dateMonthVal := publicmethod.UnixTimeToDay(tadyTime, 17)
dateMonthMAx, _ = strconv.Atoi(dateMonthVal)
}
} else {
sort.Slice(receivedValue.DateTime, func(i, j int) bool {
return receivedValue.DateTime[i] < receivedValue.DateTime[j]
})
}
} else {
dateMonthVal := publicmethod.UnixTimeToDay(tadyTime, 17)
dateMonthMAx, _ = strconv.Atoi(dateMonthVal)
receivedValue.DateTime = append(receivedValue.DateTime, dateYear)
}
var sendData SendYOYData
sendData.YAxis.Type = "value"
sendData.YAxis.Name = "实际值"
sendData.YAxis.FormAtter = targetCont.Uniteing
var goSyncData GeteveryYearDttsb
//获取X轴数据
for i := 1; i <= dateMonthMAx; i++ {
sendData.XAxisVal = append(sendData.XAxisVal, fmt.Sprintf("%v月", i))
}
//获取Y轴数据
for _, v := range receivedValue.DateTime {
SyncSeting.Add(1)
go goSyncData.GetOrgAttrtargetTime(receivedValue.OrgId, receivedValue.TargetId, v, dateMonthMAx)
}
SyncSeting.Wait()
targetData, maxVal, minVal := goSyncData.readPlanTaskData()
sendData.YAxis.Max, sendData.YAxis.Min = publicmethod.JudjeMaxOfMinVal(maxVal, minVal)
//根据维度月份排序
sort.Slice(targetData, func(i, j int) bool {
return targetData[i].Months < targetData[j].Months
})
for _, v := range targetData {
var serInfo Seriescont
serInfo.Name = v.MonthStr
serInfo.Type = "bar"
serInfo.Tooltip = targetCont.Uniteing
serInfo.Data = v.MonthDataList
sendData.Series = append(sendData.Series, serInfo)
}
// fmt.Printf("targetData:%v------------------>maxVal:%v---------------->minVal:%v---------------->Max:%v\n", targetData, maxVal, minVal, sendData.YAxis.Max)
publicmethod.Result(0, sendData, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-13 14:33:07
@ 功能: 协程定性指标计算月份历史值
@ 参数
#orgId 行政组织
#targetId 指标
#years 时间(年)
#months 时间(月)
@ 返回值
#
@ 方法原型
#(g *GeteveryYearDttsb) getOrgBylawsTime(orgId, targetId string, dateTime []int, months int)
*/
func (g *GeteveryYearDttsb) GetOrgAttrtargetTime(orgId, targetId string, years, months int) {
g.mutext.Lock()
defer g.mutext.Unlock()
var dataCont HistorMonthData
dataCont.Months = years
dataCont.MonthStr = fmt.Sprintf("%v年", years)
for i := 1; i <= months; i++ {
orgIdInt, _ := strconv.ParseInt(orgId, 10, 64)
targetIdInt, _ := strconv.ParseInt(targetId, 10, 64)
yearsStr := strconv.Itoa(years)
monthsStr := strconv.Itoa(i)
scoreVal := AuxiliaryCalculationSumNature(orgIdInt, targetIdInt, yearsStr, monthsStr)
// scoreVal := 100 + AuxiliaryCalculationSumNature(orgIdInt, targetIdInt, yearsStr, monthsStr)
dataCont.MonthDataList = append(dataCont.MonthDataList, scoreVal)
if g.AxisMax < scoreVal {
g.AxisMax = scoreVal
}
if g.AxisMin > scoreVal {
g.AxisMin = scoreVal
}
}
g.Target = append(g.Target, dataCont)
// SyncSetinges.Wait()
SyncSeting.Done()
}
/*
*
@ 作者: 秦东
@ 时间: 2023-03-17 09:50:12
@ 功能: 获取单一行政组织多年度各月份成绩
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) GetEveryOneOrgToMonthsResult(c *gin.Context) {
var receivedValue BaseDepartTimeYOY
err := c.ShouldBindJSON(&receivedValue)
if err != nil {
publicmethod.Result(100, err, c)
return
}
if receivedValue.OrgId == "" {
publicmethod.Result(1, err, c, "未知行政组织!无法统计!")
return
}
tarWhere := publicmethod.MapOut[string]()
tarWhere["`id`"] = receivedValue.OrgId
//获取指标信息
var orgCont modelshr.AdministrativeOrganization
err = orgCont.GetCont(tarWhere)
if err != nil {
publicmethod.Result(1, err, c, "未知指标!无法统计!")
return
}
tadyTime := time.Now().Unix()
dateYear, _ := strconv.Atoi(publicmethod.UnixTimeToDay(tadyTime, 16))
dateMonthMAx := 12
if len(receivedValue.DateTime) > 0 {
if len(receivedValue.DateTime) == 1 {
if receivedValue.DateTime[0] == dateYear {
dateMonthVal := publicmethod.UnixTimeToDay(tadyTime, 17)
dateMonthMAx, _ = strconv.Atoi(dateMonthVal)
}
} else {
sort.Slice(receivedValue.DateTime, func(i, j int) bool {
return receivedValue.DateTime[i] < receivedValue.DateTime[j]
})
}
} else {
dateMonthVal := publicmethod.UnixTimeToDay(tadyTime, 17)
dateMonthMAx, _ = strconv.Atoi(dateMonthVal)
receivedValue.DateTime = append(receivedValue.DateTime, dateYear)
}
var sendData SendYOYData
sendData.YAxis.Type = "value"
sendData.YAxis.Name = "成绩"
sendData.YAxis.FormAtter = "分"
//获取X轴数据
for i := 1; i <= dateMonthMAx; i++ {
sendData.XAxisVal = append(sendData.XAxisVal, fmt.Sprintf("%v月", i))
}
var goSyncData GeteveryYearDttsb
//获取Y轴数据
for _, v := range receivedValue.DateTime {
SyncSetinges.Add(1)
go goSyncData.GetOrgMoreTimeScore(orgCont, v, dateMonthMAx)
}
SyncSetinges.Wait()
targetData, maxVal, minVal := goSyncData.readPlanTaskData()
sendData.YAxis.Max, sendData.YAxis.Min = publicmethod.JudjeMaxOfMinVal(maxVal, minVal)
//根据维度月份排序
sort.Slice(targetData, func(i, j int) bool {
return targetData[i].Months < targetData[j].Months
})
for _, v := range targetData {
var serInfo Seriescont
serInfo.Name = v.MonthStr
serInfo.Type = "bar"
serInfo.Tooltip = "分"
serInfo.Data = v.MonthDataList
sendData.Series = append(sendData.Series, serInfo)
}
// fmt.Printf("targetData:%v------------------>maxVal:%v---------------->minVal:%v---------------->Max:%v\n", targetData, maxVal, minVal, sendData.YAxis.Max)
publicmethod.Result(0, sendData, c)
}
// 获取
func (g *GeteveryYearDttsb) GetOrgMoreTimeScore(orgCont modelshr.AdministrativeOrganization, years, months int) {
//锁操作
g.mutext.Lock()
defer g.mutext.Unlock()
yearsStr := strconv.Itoa(years)
var syncOrgTimeScore SyncOrgTimeAllScore
for i := 1; i <= months; i++ {
monthStr := strconv.Itoa(i)
SyncSeting.Add(1)
// go syncOrgTimeScore.OrgCalculateScore(orgCont, yearsStr, monthStr)
go syncOrgTimeScore.TallyUpOrgCalculateScore(orgCont, yearsStr, monthStr)
}
SyncSeting.Wait()
scoreList, maxScore, minSchor := syncOrgTimeScore.readPlanTaskData()
//根据维度序号排序
sort.Slice(scoreList, func(i, j int) bool {
return scoreList[i].Months < scoreList[j].Months
})
if g.AxisMax == 0 {
g.AxisMax = maxScore
} else {
if g.AxisMax < maxScore {
g.AxisMax = maxScore
}
}
if g.AxisMin == 0 {
g.AxisMin = minSchor
} else {
if g.AxisMin > minSchor {
g.AxisMin = minSchor
}
}
var dataCont HistorMonthData
dataCont.Months = years
dataCont.MonthStr = fmt.Sprintf("%v年", years)
for _, v := range scoreList {
dataCont.MonthDataList = append(dataCont.MonthDataList, v.Score)
}
g.Target = append(g.Target, dataCont)
// fmt.Printf("获取:%v------------------>%v------------------>%v------------------>scoreList:%v------------------>maxScore:%v---------------->minSchor:%v\n", orgCont.Name, years, months, scoreList, maxScore, minSchor)
SyncSetinges.Done()
}
/*
*
@ 作者: 秦东
@ 时间: 2023-04-21 16:30:26
@ 功能: 相关提报人定性考核细则列表(web使用)
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) GetQualityBylawsTasks(c *gin.Context) {
var receivedValue BylawsAboutPeopleDime
c.ShouldBindJSON(&receivedValue)
if receivedValue.OrgId == "" || receivedValue.TargetId == "" {
publicmethod.Result(101, receivedValue, c)
return
}
//获取登录人信息
myLoginCont, _ := publicmethod.LoginMyCont(c)
var qualEvaCont modelskpi.QualitativeEvaluationView
gormDb := overall.CONSTANT_DB_KPI.Table(fmt.Sprintf("%s qe", qualEvaCont.TableName())).Select("qe.qe_id,qe.qe_target_sun,qe.qe_detailed_target,qe.qe_content,qe.qe_censor_cont,qe.qe_min_score,qe.qe_max_score,qe.qe_unit,qe.qe_target_sun").Where("qe.`qe_type` = 1 AND qe.`qe_state` = 1 AND qe.`qe_accept_evaluation` = ? AND qe.`qe_target` = ?", receivedValue.OrgId, receivedValue.TargetId)
gormDb = gormDb.Joins("JOIN target_report td ON qe.qe_target = td.target_id AND qe.qe_accept_evaluation = td.`department_id` AND td.target_bylaws = qe.`qe_detailed_target` AND td.`type` = 1 AND td.`post_id` = 0 AND td.state = 1 AND td.type_level = 3 AND td.`man_key` = ?", myLoginCont.Key)
// if receivedValue.OrgId != "" {
// gormDb = gormDb.Where("`qe_accept_evaluation` = ?", receivedValue.OrgId)
// }
var qualEvaList []modelskpi.QualitativeEvaluationView
err := gormDb.Order("qe_accept_evaluation ASC,qe_target ASC").Find(&qualEvaList).Error
if err != nil {
publicmethod.Result(105, err, c)
return
}
var tableId []int64
var sendContList []OutDimList
for _, v := range qualEvaList {
if !publicmethod.IsInTrue[int64](v.TargetSun, tableId) {
tableId = append(tableId, v.TargetSun)
var sendCont OutDimList
sendCont.Id = strconv.FormatInt(v.TargetSun, 10)
var tableCont modelskpi.QualitativeTarget
tableCont.GetCont(map[string]interface{}{"q_id": v.TargetSun}, "q_title")
sendCont.Name = tableCont.Title
sendCont.OrgId = receivedValue.OrgId
sendCont.TargetId = receivedValue.TargetId
sendContList = append(sendContList, sendCont)
}
}
publicmethod.Result(0, sendContList, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-04-22 08:22:01
@ 功能: 根据栏目获取获取相关指标
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) BasePostTableHaveTarget(c *gin.Context) {
var receivedValue BaseTableGetTargetWeb
c.ShouldBindJSON(&receivedValue)
if receivedValue.OrgId == "" || receivedValue.TargetId == "" {
publicmethod.Result(101, receivedValue, c)
return
}
if receivedValue.Page == 0 {
receivedValue.Page = 1
}
if receivedValue.PageSize == 0 {
receivedValue.PageSize = 15
}
//获取登录人信息
myLoginCont, _ := publicmethod.LoginMyCont(c)
var qualEvaCont modelskpi.QualitativeEvaluationView
gormDb := overall.CONSTANT_DB_KPI.Table(fmt.Sprintf("%s qe", qualEvaCont.TableName())).Select("qe.qe_id,qe.qe_target_sun,qe.qe_detailed_target,qe.qe_content,qe.qe_censor_cont,qe.qe_min_score,qe.qe_max_score,qe.qe_unit").Where("qe.`qe_type` = 1 AND qe.`qe_state` = 1 AND qe.`qe_accept_evaluation` = ? AND qe.`qe_target` = ? AND qe.`qe_target_sun` = ?", receivedValue.OrgId, receivedValue.TargetId, receivedValue.TableId)
gormDb = gormDb.Joins("JOIN target_report td ON qe.qe_target = td.target_id AND qe.qe_accept_evaluation = td.`department_id` AND td.target_bylaws = qe.`qe_detailed_target` AND td.`type` = 1 AND td.`post_id` = 0 AND td.state = 1 AND td.type_level = 3 AND td.`man_key` = ?", myLoginCont.Key)
var total int
var qualEvaListCount []modelskpi.QualitativeEvaluationView
totalErr := gormDb.Find(&qualEvaListCount).Error
if totalErr != nil {
total = 0
} else {
total = len(qualEvaListCount)
}
var qualEvaList []modelskpi.QualitativeEvaluationView
gormDb = publicmethod.PageTurningSettings(gormDb, receivedValue.Page, receivedValue.PageSize)
err := gormDb.Order("qe_accept_evaluation ASC,qe_target ASC").Find(&qualEvaList).Error
if err != nil {
publicmethod.Result(105, err, c)
return
}
var sendContList []OutPutBylawsCont
for _, v := range qualEvaList {
var sendCont OutPutBylawsCont
sendCont.Id = strconv.FormatInt(v.Id, 10)
var bylawsCont modelskpi.DetailedTarget
bylawsCont.GetCont(map[string]interface{}{"`dt_id`": v.DetailedTarget}, "`dt_title`", "`dt_content`", `dt_add_reduce`)
var columnCont modelskpi.QualitativeTarget
columnCont.GetCont(map[string]interface{}{"`q_id`": v.TargetSun}, "`q_title`")
sendCont.ColumnTitle = columnCont.Title
sendCont.Title = bylawsCont.Title //考核项目
sendCont.Content = bylawsCont.Content //考核内容
if v.Content != "" {
sendCont.Content = v.Content
}
if v.CensorCont != "" {
sendCont.Content = v.CensorCont
}
sendCont.MaxScore = publicmethod.DecimalEs(float64(v.MaxScore)/100, 2)
sendCont.MinScore = publicmethod.DecimalEs(float64(v.MinScore)/100, 2)
if sendCont.MinScore > 0 && sendCont.MaxScore > 0 {
sendCont.Standard = fmt.Sprintf("%v-%v", sendCont.MinScore, sendCont.MaxScore) //标准
sendCont.ScoreType = 2
} else if sendCont.MinScore > 0 && sendCont.MaxScore <= 0 {
sendCont.Standard = fmt.Sprintf("%v", sendCont.MinScore)
sendCont.ScoreType = 1
} else if sendCont.MinScore <= 0 && sendCont.MaxScore > 0 {
sendCont.Standard = fmt.Sprintf("%v", sendCont.MaxScore)
sendCont.ScoreType = 1
} else {
sendCont.Standard = "0"
sendCont.ScoreType = 3
}
sendCont.Unit = v.Unit //单位
sendCont.PlusMinusScore = bylawsCont.AddReduce //加减分
sendContList = append(sendContList, sendCont)
}
publicmethod.ResultList(0, receivedValue.Page, receivedValue.PageSize, int64(total), int64(len(sendContList)), sendContList, c)
}