作者 Your Name

更新

1 package domain 1 package domain
2 2
3 -import "time" 3 +import (
  4 + "strconv"
  5 + "time"
  6 +)
4 7
5 // RewardStandard 奖惩规则 8 // RewardStandard 奖惩规则
6 type RewardRule struct { 9 type RewardRule struct {
@@ -25,7 +28,7 @@ type RewardRuleRepository interface { @@ -25,7 +28,7 @@ type RewardRuleRepository interface {
25 } 28 }
26 29
27 func (m *RewardRule) ValidRewardTag() bool { 30 func (m *RewardRule) ValidRewardTag() bool {
28 - switch m.FaultTag { 31 + switch m.RewardTag {
29 case ">": 32 case ">":
30 default: 33 default:
31 return false 34 return false
@@ -41,3 +44,17 @@ func (m *RewardRule) ValidFaultTag() bool { @@ -41,3 +44,17 @@ func (m *RewardRule) ValidFaultTag() bool {
41 } 44 }
42 return true 45 return true
43 } 46 }
  47 +
  48 +// 计算奖惩 的金额
  49 +func (m *RewardRule) SumRewardAmount(rewardNum int, faultNum int) float64 {
  50 + result := float64(0)
  51 + rewardAmount, _ := strconv.ParseFloat(m.RewardAmount, 64)
  52 + faultAmount, _ := strconv.ParseFloat(m.FaultAmount, 64)
  53 + if rewardNum > m.RewardNum {
  54 + result += rewardAmount
  55 + }
  56 + if faultNum > m.FaultNum {
  57 + result -= faultAmount
  58 + }
  59 + return result
  60 +}
@@ -145,19 +145,109 @@ func (m *RewardStandard) ShowTargeFault() string { @@ -145,19 +145,109 @@ func (m *RewardStandard) ShowTargeFault() string {
145 show := "" 145 show := ""
146 switch m.TargetType { 146 switch m.TargetType {
147 case TargetType1: 147 case TargetType1:
148 - show = fmt.Sprintf("<%skg/小时", m.TargeVal1) 148 + show = fmt.Sprintf("<%skg/小时", m.TargeVal2)
149 case TargetType2: 149 case TargetType2:
150 - show = fmt.Sprintf("<%s%%", m.TargeVal1) 150 + show = fmt.Sprintf("<%s%%", m.TargeVal2)
151 case TargetType3: 151 case TargetType3:
152 - show = fmt.Sprintf(">%s次或损失>%s元", m.TargeVal1, m.TargeVal2) 152 + show = fmt.Sprintf(">%s次或损失>%s元", m.TargeVal3, m.TargeVal4)
153 case TargetType4: 153 case TargetType4:
154 - show = fmt.Sprintf("<=%s次或损失>%s元", m.TargeVal1, m.TargeVal2) 154 + show = fmt.Sprintf("<=%s次或损失>%s元", m.TargeVal3, m.TargeVal4)
155 case TargetType5: 155 case TargetType5:
156 - show = fmt.Sprintf("金属>%s次或非金属>%s", m.TargeVal1, m.TargeVal2) 156 + show = fmt.Sprintf("金属>%s次或非金属>%s", m.TargeVal3, m.TargeVal4)
157 } 157 }
158 return show 158 return show
159 } 159 }
160 160
161 -func (m *RewardStandard) VerdictTarget(val1 int, val float64) int { 161 +// 判定功过, 指标类别 1:产效
  162 +func (m *RewardStandard) VerdictTargetType1(val1 int, val float64) int {
162 return 0 163 return 0
163 } 164 }
  165 +
  166 +// 判定功过, 指标类别 2:合格率
  167 +func (m *RewardStandard) VerdictTargetType2(val1 int, val float64) int {
  168 + return 0
  169 +}
  170 +
  171 +// 判定功过, 指标类别 3:安全事故;
  172 +// param1 安全事故次数;
  173 +// param1 损失金额;
  174 +// 功过结果 0 无,1 功 ,-1 过;
  175 +func (m *RewardStandard) VerdictTargetType3(param1 int, param2 float64) int {
  176 + val1, _ := strconv.Atoi(m.TargeVal1)
  177 + val2, _ := strconv.ParseFloat(m.TargeVal2, 64)
  178 + result := 0
  179 + //判定功
  180 + if param1 <= val1 {
  181 + result = 1
  182 + }
  183 + if param2 <= val2 {
  184 + result = 1
  185 + }
  186 + //判定过
  187 + val3, _ := strconv.Atoi(m.TargeVal3)
  188 + val4, _ := strconv.ParseFloat(m.TargeVal4, 64)
  189 +
  190 + if param1 > val3 {
  191 + result = -1
  192 + }
  193 + if param2 > val4 {
  194 + result = -1
  195 + }
  196 + return result
  197 +}
  198 +
  199 +// 判定功过, 指标类别 4:质量事故;
  200 +// param1 质量事故 次数;
  201 +// param1 损失金额;
  202 +// 功过结果 0 无,1 功 ,-1 过;
  203 +func (m *RewardStandard) VerdictTargetType4(param1 int, param2 float64) int {
  204 + val1, _ := strconv.Atoi(m.TargeVal1)
  205 + val2, _ := strconv.ParseFloat(m.TargeVal2, 64)
  206 + result := 0
  207 + //判定功
  208 + if param1 <= val1 {
  209 + result = 1
  210 + }
  211 + if param2 <= val2 {
  212 + result = 1
  213 + }
  214 + //判定过
  215 + val3, _ := strconv.Atoi(m.TargeVal3)
  216 + val4, _ := strconv.ParseFloat(m.TargeVal4, 64)
  217 +
  218 + if param1 > val3 {
  219 + result = -1
  220 + }
  221 + if param2 > val4 {
  222 + result = -1
  223 + }
  224 + return result
  225 +}
  226 +
  227 +// 判定功过, 指标类别 5:异物次数;
  228 +// param1 金属异物 次数;
  229 +// param2 非金属 次数;
  230 +// 功过结果 0 无,1 功 ,-1 过;
  231 +func (m *RewardStandard) VerdictTargetType5(param1 int, param2 int) int {
  232 + val1, _ := strconv.Atoi(m.TargeVal1)
  233 + val2, _ := strconv.Atoi(m.TargeVal2)
  234 + result := 0
  235 + //判定功
  236 + if param1 <= val1 {
  237 + result = 1
  238 + }
  239 + if param2 <= val2 {
  240 + result = 1
  241 + }
  242 + //判定过
  243 + val3, _ := strconv.Atoi(m.TargeVal3)
  244 + val4, _ := strconv.Atoi(m.TargeVal4)
  245 +
  246 + if param1 > val3 {
  247 + result = -1
  248 + }
  249 + if param2 > val4 {
  250 + result = -1
  251 + }
  252 + return result
  253 +}
@@ -14,19 +14,19 @@ type RewardSummary struct { @@ -14,19 +14,19 @@ type RewardSummary struct {
14 WorkStation WorkStation `json:"workStation"` //工作位置 14 WorkStation WorkStation `json:"workStation"` //工作位置
15 Worker User `json:"user"` //员工 15 Worker User `json:"user"` //员工
16 UpToStandard float64 `json:"upToStandard"` //合格率 16 UpToStandard float64 `json:"upToStandard"` //合格率
17 - UpToStandardResult float64 `json:"upToStandardResult"` //合格率 功过评定结果 `功` `过` `不奖不惩` 17 + UpToStandardResult int `json:"upToStandardResult"` //合格率 功过评定结果 1`功` -1 `过` 0 `不奖不惩`
18 Yield float64 `json:"yield"` //产能 18 Yield float64 `json:"yield"` //产能
19 - YieldResult float64 `json:"yieldResult"` //产能 功过评定结果 19 + YieldResult int `json:"yieldResult"` //产能 功过评定结果 1`功` -1 `过` 0 `不奖不惩`
20 AccidentNum1 int `json:"accidentNum1"` //质量事故 次数 20 AccidentNum1 int `json:"accidentNum1"` //质量事故 次数
21 AccidentAmount1 float64 `json:"accidentAmount1"` //质量事故 损失金额 21 AccidentAmount1 float64 `json:"accidentAmount1"` //质量事故 损失金额
22 - AccidentResult1 string `json:"accidentResult1"` //质量事故 功过评定结果 22 + AccidentResult1 int `json:"accidentResult1"` //质量事故 功过评定结果 1`功` -1 `过` 0 `不奖不惩`
23 AccidentNum2 int `json:"accidentNum2"` //安全事故 次数 23 AccidentNum2 int `json:"accidentNum2"` //安全事故 次数
24 AccidentAmount2 float64 `json:"accidentAmount2"` //安全事故 损失金额 24 AccidentAmount2 float64 `json:"accidentAmount2"` //安全事故 损失金额
25 - AccidentResult2 string `json:"accidentResult2"` //安全事故 功过评定结果 25 + AccidentResult2 int `json:"accidentResult2"` //安全事故 功过评定结果 1`功` -1 `过` 0 `不奖不惩`
26 AccidentNum3 int `json:"accidentNum3"` //异物金属事故 次数 26 AccidentNum3 int `json:"accidentNum3"` //异物金属事故 次数
27 - AccidentResult3 string `json:"accidentResult3"` //异物金属事故 功过评定结果 27 + AccidentResult3 int `json:"accidentResult3"` //异物金属事故 功过评定结果 1`功` -1 `过` 0 `不奖不惩`
28 AccidentNum4 int `json:"accidentNum4"` //异物非金属事故 次数 28 AccidentNum4 int `json:"accidentNum4"` //异物非金属事故 次数
29 - AccidentResult4 string `json:"accidentResult4"` //异物非金属事故 功过评定结果 29 + AccidentResult4 int `json:"accidentResult4"` //异物非金属事故 功过评定结果 1`功` -1 `过` 0 `不奖不惩`
30 SummaryResult float64 `json:"summaryResult"` //奖惩金额计算结果(元) 30 SummaryResult float64 `json:"summaryResult"` //奖惩金额计算结果(元)
31 CreatedAt time.Time `json:"createdAt"` // 31 CreatedAt time.Time `json:"createdAt"` //
32 UpdatedAt time.Time `json:"UpdatedAt"` // 32 UpdatedAt time.Time `json:"UpdatedAt"` //
@@ -39,17 +39,82 @@ type RewardSummaryRepository interface { @@ -39,17 +39,82 @@ type RewardSummaryRepository interface {
39 } 39 }
40 40
41 // SummaryAccident 汇总事故数据 41 // SummaryAccident 汇总事故数据
42 -func (c *RewardSummary) SummaryAccident(trouble *ProductTrouble) { 42 +func (c *RewardSummary) SummaryAccident(trouble *ProductTrouble, rewardStandard *RewardStandard) {
43 switch trouble.Types { 43 switch trouble.Types {
44 case TroubleType1: 44 case TroubleType1:
45 c.AccidentNum2 = +1 45 c.AccidentNum2 = +1
46 c.AccidentAmount2 = +trouble.AmountLoss 46 c.AccidentAmount2 = +trouble.AmountLoss
  47 + if rewardStandard == nil {
  48 + c.AccidentResult2 = 0
  49 + } else {
  50 + r := rewardStandard.VerdictTargetType3(c.AccidentNum2, c.AccidentAmount2)
  51 + c.AccidentResult2 = r
  52 + }
  53 +
47 case TroubleType2: 54 case TroubleType2:
48 c.AccidentNum1 = +1 55 c.AccidentNum1 = +1
49 c.AccidentAmount1 = +trouble.AmountLoss 56 c.AccidentAmount1 = +trouble.AmountLoss
  57 + if rewardStandard == nil {
  58 + c.AccidentResult1 = 0
  59 + } else {
  60 + r := rewardStandard.VerdictTargetType4(c.AccidentNum1, c.AccidentAmount1)
  61 + c.AccidentResult2 = r
  62 + }
  63 +
50 case TroubleType3: 64 case TroubleType3:
51 c.AccidentNum3 = +1 65 c.AccidentNum3 = +1
  66 + if rewardStandard == nil {
  67 + c.AccidentResult3 = 0
  68 + } else {
  69 + r := rewardStandard.VerdictTargetType5(c.AccidentNum3, 0)
  70 + c.AccidentResult2 = r
  71 + }
  72 +
52 case TroubleType4: 73 case TroubleType4:
53 c.AccidentNum4 = +1 74 c.AccidentNum4 = +1
  75 + if rewardStandard == nil {
  76 + c.AccidentResult4 = 0
  77 + } else {
  78 + r := rewardStandard.VerdictTargetType5(0, c.AccidentNum4)
  79 + c.AccidentResult2 = r
  80 + }
  81 + }
  82 +}
  83 +
  84 +func (c *RewardSummary) ApplySummaryResult(rule *RewardRule) {
  85 + rewardNum := 0
  86 + faultNum := 0
  87 + if c.AccidentResult1 < 0 {
  88 + faultNum = +1
  89 + } else if c.AccidentResult1 > 0 {
  90 + rewardNum = +1
  91 + }
  92 + if c.AccidentResult2 < 0 {
  93 + faultNum = +1
  94 + } else if c.AccidentResult2 > 0 {
  95 + rewardNum = +1
54 } 96 }
  97 + if c.AccidentResult3 < 0 {
  98 + faultNum = +1
  99 + } else if c.AccidentResult3 > 0 {
  100 + rewardNum = +1
  101 + }
  102 + if c.AccidentResult4 < 0 {
  103 + faultNum = +1
  104 + } else if c.AccidentResult4 > 0 {
  105 + rewardNum = +1
  106 + }
  107 + if c.YieldResult < 0 {
  108 + faultNum = +1
  109 + } else if c.YieldResult > 0 {
  110 + rewardNum = +1
  111 + }
  112 + if c.UpToStandardResult < 0 {
  113 + faultNum = +1
  114 + } else if c.UpToStandardResult > 0 {
  115 + rewardNum = +1
  116 + }
  117 +
  118 + c.SummaryResult = rule.SumRewardAmount(rewardNum, faultNum)
  119 +
55 } 120 }
@@ -26,7 +26,7 @@ func NewPGRewardSummaryStaticService(transactionContext *pgTransaction.Transacti @@ -26,7 +26,7 @@ func NewPGRewardSummaryStaticService(transactionContext *pgTransaction.Transacti
26 } 26 }
27 } 27 }
28 28
29 -// 根据 29 +// 根据事故数据
30 func (c *PGRewardSummaryStaticService) CreateRewardSummaryByProductTrouble(param *domain.ProductTrouble) error { 30 func (c *PGRewardSummaryStaticService) CreateRewardSummaryByProductTrouble(param *domain.ProductTrouble) error {
31 rewardSummaryRepo, _ := repository.NewRewardSummaryRepository(c.transactionContext) 31 rewardSummaryRepo, _ := repository.NewRewardSummaryRepository(c.transactionContext)
32 //查询是否已经有汇总数据 32 //查询是否已经有汇总数据
@@ -71,17 +71,51 @@ func (c *PGRewardSummaryStaticService) CreateRewardSummaryByProductTrouble(param @@ -71,17 +71,51 @@ func (c *PGRewardSummaryStaticService) CreateRewardSummaryByProductTrouble(param
71 UpdatedAt: nowTime, 71 UpdatedAt: nowTime,
72 } 72 }
73 } 73 }
74 - // 将审核过的事故放入汇总数据计算  
75 - summaryData.SummaryAccident(param)  
76 74
77 - //获取奖惩标准 按 75 + var targetType int
  76 + switch param.Types {
  77 + case domain.TroubleType1:
  78 + targetType = domain.TargetType3
  79 + case domain.TroubleType2:
  80 + targetType = domain.TargetType4
  81 + case domain.TroubleType3:
  82 + targetType = domain.TargetType5
  83 + case domain.TroubleType4:
  84 + targetType = domain.TargetType5
  85 + }
  86 + //获取奖惩标准 按 车间 线别 工段 类型
78 rewardStandardRepo, _ := repository.NewRewardStandardRepository(c.transactionContext) 87 rewardStandardRepo, _ := repository.NewRewardStandardRepository(c.transactionContext)
  88 + _, rewardStandardList, err := rewardStandardRepo.Find(map[string]interface{}{
  89 + "companyId": param.CompanyId,
  90 + "orgId": param.OrgId,
  91 + "workshopId": param.WorkStation.WorkshopId,
  92 + "lineId": param.WorkStation.LineId,
  93 + "sectionId": param.WorkStation.SectionId,
  94 + "targetType": targetType,
  95 + "limit": 1,
  96 + })
  97 + if err != nil {
  98 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  99 + }
  100 + if len(rewardStandardList) > 0 {
  101 + summaryData.SummaryAccident(param, rewardStandardList[0])
  102 + } else {
  103 + summaryData.SummaryAccident(param, nil)
  104 + }
79 105
80 - rewardStandardRepo.Find(map[string]interface{}{ 106 + //获取奖惩规则
  107 + rewardRuleRepo, _ := repository.NewRewardRuleRepository(c.transactionContext)
  108 + _, rewardRuleList, err := rewardRuleRepo.Find(map[string]interface{}{
81 "companyId": param.CompanyId, 109 "companyId": param.CompanyId,
82 "orgId": param.OrgId, 110 "orgId": param.OrgId,
83 }) 111 })
84 - 112 + if err != nil {
  113 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取奖惩规则"+err.Error())
  114 + }
  115 + if len(rewardRuleList) == 0 {
  116 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, "未设置奖惩规则")
  117 + }
  118 + summaryData.ApplySummaryResult(rewardRuleList[0])
85 summaryData.UpdatedAt = nowTime 119 summaryData.UpdatedAt = nowTime
86 _, err = rewardSummaryRepo.Save(summaryData) 120 _, err = rewardSummaryRepo.Save(summaryData)
87 if err != nil { 121 if err != nil {
@@ -115,6 +115,9 @@ func (repo *RewardRuleRepository) Find(queryOptions map[string]interface{}) (int @@ -115,6 +115,9 @@ func (repo *RewardRuleRepository) Find(queryOptions map[string]interface{}) (int
115 if v, ok := queryOptions["companyId"]; ok { 115 if v, ok := queryOptions["companyId"]; ok {
116 query.Where("company_id=?", v) 116 query.Where("company_id=?", v)
117 } 117 }
  118 + if v, ok := queryOptions["orgId"]; ok {
  119 + query.Where("org_id=?", v)
  120 + }
118 cnt, err := query.SelectAndCount() 121 cnt, err := query.SelectAndCount()
119 if err != nil { 122 if err != nil {
120 return 0, nil, err 123 return 0, nil, err