From cc7c2094568ea8f9d1697da5ed0a2c759ca81abd Mon Sep 17 00:00:00 2001
From: yinbentan <yinbentan@live.com>
Date: 星期五, 30 八月 2024 17:18:30 +0800
Subject: [PATCH] 方法修改,修改薪资列表,添加分页查询

---
 service/salary_plan.go |  249 ++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 203 insertions(+), 46 deletions(-)

diff --git a/service/salary_plan.go b/service/salary_plan.go
index c7f7aca..5c6c3b1 100644
--- a/service/salary_plan.go
+++ b/service/salary_plan.go
@@ -9,13 +9,19 @@
 	"silkserver/constvar"
 	"silkserver/models"
 	"silkserver/pkg/logx"
+	"silkserver/utils"
 	"silkserver/utils/calculator"
 	"strconv"
 	"strings"
+	"time"
 )
 
 // WorkingHours 瀛樿〃锛氬伐鏃惰绠楋紙鏃ユ湡锛堝勾鏈堟棩锛夈�佸伐绉嶃�佸憳宸ュ鍚嶃�佸皬缁勩�佽溅鍙般�佷骇閲忓伐璧勩�佷笂鐝秴鏃讹紙灏忔椂锛夈�佷笂鐝秴鏃讹紙澶╋級銆佸姞鐝紙鍗曠嫭锛夈�佸姞鐝紙鍏ㄨ溅闂达級銆佸嚭鍕わ紙澶╋級銆佸甫寰掞紙澶╋級銆佷骇閲忥紙KG锛夈�佸叾瀹冿級
 func WorkingHours(date string) error {
+	dateTime, err := time.Parse("2006-01-02", date)
+	if err != nil {
+		return err
+	}
 	// 浜哄憳淇℃伅
 	workers, err := models.NewWorkerSearch().FindNotTotal()
 	if err != nil {
@@ -25,9 +31,18 @@
 	// 鎺掔彮淇℃伅(鍔熻兘缂哄け)
 	// 鎵撳崱淇℃伅锛堥�氳繃浜哄憳鍏宠仈锛�
 	attendances, err := models.NewAttendanceManageSearch().SetDate(date).FindNotTotal()
+	if err != nil {
+		return err
+	}
+	if len(attendances) == 0 {
+		return errors.New(date + ":鎵撳崱淇℃伅涓虹┖")
+	}
 
 	// 杞﹀彴淇℃伅锛堥�氳繃浜哄憳鍏宠仈锛�
 	workerPositions, err := models.NewWorkerPositionSearch().SetOverlappingDate(date, date).FindAll()
+	if err != nil {
+		return err
+	}
 
 	list := make([]*models.PayrollWorkingHours, 0)
 	for _, worker := range workers {
@@ -50,8 +65,13 @@
 				}
 				workingHours.ShiftClockInTime = attendance.StartWorkTime
 				workingHours.ShiftClockOutTime = attendance.EndWorkTime
-				workingHours.OvertimeType = constvar.ShiftOvertimeTypeTimeout
-				workingHours.OvertimeDuration = attendance.OverTimeDuration
+				if dateTime.Weekday() == 0 {
+					workingHours.OvertimeType = constvar.ShiftOvertimeTypeOvertime
+					workingHours.OvertimeDuration = decimal.NewFromInt32(1)
+				} else {
+					workingHours.OvertimeType = constvar.ShiftOvertimeTypeTimeout
+					workingHours.OvertimeDuration = attendance.OverTimeDuration
+				}
 			}
 		}
 		for _, position := range workerPositions {
@@ -70,6 +90,9 @@
 	}
 
 	err = models.WithTransaction(func(db *gorm.DB) error {
+		if len(list) == 0 {
+			return nil
+		}
 		if err := models.NewPayrollWorkingHoursSearch().SetOrm(db).SetCycle(date).Delete(); err != nil {
 			return err
 		}
@@ -88,10 +111,18 @@
 	if err != nil {
 		return err
 	}
+	if len(yieldRegisters) == 0 {
+		return errors.New(date + ":浜ч噺鐧昏涓虹┖")
+	}
+
 	finenesss, err := models.NewFinenessRegisterSearch().SetFinishDate(date).FindAll() // 绾ゅ害鐧昏
 	if err != nil {
 		return err
 	}
+	if len(finenesss) == 0 {
+		return errors.New(date + ":绾ゅ害鐧昏涓虹┖")
+	}
+
 	finenessIds := make([]uint, len(finenesss))
 	for i, fineness := range finenesss {
 		finenessIds[i] = fineness.ID
@@ -101,8 +132,15 @@
 		return err
 	}
 
-	priceStandards, _ := models.NewRawSilkPriceStandardSearch().FindNotTotal() // 鐢熶笣瀹氫环
-	priceStandardMap := make(map[string]decimal.Decimal)                       // map[搴勫彛\鏍囧彿]瀹氫环
+	priceStandards, err := models.NewRawSilkPriceStandardSearch().FindNotTotal() // 鐢熶笣瀹氫环
+	if err != nil {
+		return err
+	}
+	if len(priceStandards) == 0 {
+		return errors.New(date + ":鐢熶笣瀹氫环涓虹┖")
+	}
+
+	priceStandardMap := make(map[string]decimal.Decimal) // map[搴勫彛\鏍囧彿]瀹氫环
 	for _, price := range priceStandards {
 		key := fmt.Sprintf("%d%s", price.MarketNumber, price.RawSilkGrade)
 		priceStandardMap[key] = price.PayStandard
@@ -111,6 +149,9 @@
 	workingHours, err := models.NewPayrollWorkingHoursSearch().SetWorkTypeCode(constvar.JobTypeWeavers).SetCycle(date).FindNotTotal() // 鍛樺伐鐨勫伐鏃剁粺璁�
 	if err != nil {
 		return err
+	}
+	if len(workingHours) == 0 {
+		return errors.New(date + ":鎸¤溅宸ユ墦鍗′俊鎭负绌�")
 	}
 
 	// 杞﹀彴鎸¤溅宸ラ噸澶嶄汉鍛樻爣璁�
@@ -133,7 +174,13 @@
 	}
 	for _, workingHour := range workingHourArr {
 		key := fmt.Sprintf("%v%v%v", workingHour.WorkshopNumber, workingHour.GroupNumber, workingHour.StartCarNumber)
-		carEmployeeMap[key][workingHour.WorkerID] = true
+		if temp, ok := carEmployeeMap[key]; ok {
+			temp[workingHour.WorkerID] = true
+			carEmployeeMap[key] = temp
+		} else {
+			carEmployeeMap[key] = map[string]bool{workingHour.WorkerID: true}
+		}
+
 	}
 
 	// 鏂规2 鏍规嵁绾ゅ害鐧昏鏉ユ煡浜烘暟
@@ -241,6 +288,9 @@
 
 	}
 	err = models.WithTransaction(func(db *gorm.DB) error {
+		if len(productionCar) == 0 {
+			return nil
+		}
 		if err := models.NewPayrollProductionCarSearch().SetOrm(db).SetCycle(date).Delete(); err != nil {
 			return err
 		}
@@ -263,16 +313,27 @@
 	if err != nil {
 		return err
 	}
+	if len(productionCars) == 0 {
+		errors.New(date + ":杞﹀彴姣忓ぉ鐨勪骇閲忕粺璁′负绌�")
+	}
 
 	workingHours, err := models.NewPayrollWorkingHoursSearch().SetWorkTypeCode(constvar.JobTypeWeavers).SetCycle(date).FindNotTotal() // 鍛樺伐鐨勫伐鏃剁粺璁�
 	if err != nil {
 		return err
 	}
+	if len(workingHours) == 0 {
+		return errors.New(date + ":鎸¤溅宸ユ墦鍗′俊鎭负绌�")
+	}
 
 	groupWorkingHourMap := make(map[string]map[string]bool)
 	for _, workingHour := range workingHours {
 		key := fmt.Sprintf("%v%v", workingHour.WorkshopNumber, workingHour.GroupNumber)
-		groupWorkingHourMap[key][workingHour.WorkerID] = true
+		if temp, ok := groupWorkingHourMap[key]; ok {
+			temp[workingHour.WorkerID] = true
+			groupWorkingHourMap[key] = temp
+		} else {
+			groupWorkingHourMap[key] = map[string]bool{workingHour.WorkerID: true}
+		}
 	}
 
 	productionGroupList := make([]*models.PayrollProductionGroup, 0)
@@ -316,12 +377,13 @@
 	}
 
 	err = models.WithTransaction(func(db *gorm.DB) error {
-		err := models.NewPayrollProductionGroupSearch().SetOrm(db).SetCycle(date).Delete()
-		if err != nil {
+		if len(productionGroupList) == 0 {
+			return nil
+		}
+		if err := models.NewPayrollProductionGroupSearch().SetOrm(db).SetCycle(date).Delete(); err != nil {
 			return err
 		}
-		err = models.NewPayrollProductionGroupSearch().SetOrm(db).CreateBatch(productionGroupList)
-		if err != nil {
+		if err = models.NewPayrollProductionGroupSearch().SetOrm(db).CreateBatch(productionGroupList); err != nil {
 			return err
 		}
 		return nil
@@ -339,10 +401,16 @@
 	if err != nil {
 		return err
 	}
+	if len(workingHours) == 0 {
+		return errors.New(date + ":鎸¤溅宸ユ墦鍗′俊鎭负绌�")
+	}
 
 	productionCars, err := models.NewPayrollProductionCarSearch().SetCycle(date).FindNotTotal()
 	if err != nil {
 		return err
+	}
+	if len(productionCars) == 0 {
+		return errors.New(date + ":杞﹀彴姣忓ぉ浜ч噺缁熻涓虹┖")
 	}
 
 	productionEmployee := make([]*models.PayrollProductionWeavers, 0)
@@ -366,10 +434,16 @@
 				info.FinishTotalAmount = info.FinishTotalAmount.Add(car.FinishTotalAvgAmount)
 			}
 		}
+		if info.SilkQuantity.IsZero() {
+			continue
+		}
 		productionEmployee = append(productionEmployee, &info)
 	}
 
 	err = models.WithTransaction(func(db *gorm.DB) error {
+		if len(productionEmployee) == 0 {
+			return nil
+		}
 		if err := models.NewPayrollProductionWeaversSearch().SetOrm(db).SetCycle(date).Delete(); err != nil {
 			return err
 		}
@@ -393,7 +467,15 @@
 
 	GroupCarHeadAvgAmount decimal.Decimal // 鍚岀粍杞﹀ご宸ュ伐璧�
 	GroupWeaversAvgAmount decimal.Decimal // 鍚岀粍鎸¤溅宸ユ湀骞冲潎宸ヨ祫
-	JobDays               decimal.Decimal // 鍑哄嫟澶╂暟
+	WorkingDay            decimal.Decimal // 涓�涓湀宸ヤ綔澶╂暟
+	JobDays               decimal.Decimal // 涓�涓湀鍑哄嫟澶╂暟
+
+	ShiftTimeout        decimal.Decimal // 宸ヤ綔鏃ュ姞鐝椂闀匡紙灏忔椂锛�
+	ShiftOvertime       decimal.Decimal // 浼戞伅鏃ュ姞鐝椂闀匡紙澶╋級
+	MentorDays          decimal.Decimal // 甯﹀緬澶╂暟
+	FullAttendanceAward decimal.Decimal // 婊″嫟濂�
+	LeaveDays           decimal.Decimal // 璇峰亣澶╂暟
+	Seniority           decimal.Decimal // 宸ラ緞
 }
 
 // SalaryPlan 鐢熶骇宸ヨ祫璁$畻
@@ -403,24 +485,49 @@
 	} else {
 		date = date[:7]
 	}
+	dateTime, err := time.Parse("2006-01", date)
+	if err != nil {
+		return err
+	}
 
 	hours, err := models.NewPayrollWorkingHoursSearch().SetOrder("worker_id").SetMonthly(date).FindNotTotal() // 鍛樺伐鐨勫伐鏃剁粺璁�
 	if err != nil {
 		return err
 	}
-	jobQuantityMap := make(map[string]int) // 鍛樺伐鍑哄嫟缁熻
-	for _, hour := range hours {
-		jobQuantityMap[hour.WorkerID] += 1
+	if len(hours) == 0 {
+		return errors.New(date + ":鍛樺伐鎵撳崱淇℃伅涓虹┖")
 	}
 
-	workers, err := models.NewWorkerSearch().FindNotTotal()
+	jobQuantityMap := make(map[string]int)
+	shiftTimeoutMap := make(map[string]decimal.Decimal)
+	shiftOvertimeMap := make(map[string]decimal.Decimal)
+	for _, hour := range hours {
+		jobQuantityMap[hour.WorkerID] += 1
+		if hour.OvertimeType == constvar.ShiftOvertimeTypeOvertime {
+			shiftOvertimeMap[hour.WorkerID] = hour.OvertimeDuration.Add(shiftOvertimeMap[hour.WorkerID])
+		} else if hour.OvertimeType == constvar.ShiftOvertimeTypeTimeout {
+			shiftTimeoutMap[hour.WorkerID] = hour.OvertimeDuration.Add(shiftTimeoutMap[hour.WorkerID])
+		}
+	}
+
+	workers, _ := models.NewWorkerSearch().FindNotTotal()
 	workerMap := make(map[string]*models.Worker)
 	for _, worker := range workers {
 		workerMap[worker.ID] = worker
 	}
 
+	mentors, _ := models.NewMentorSearch().SetMonth(date).FindNotTotal()
+	mentorMap := make(map[string]int)
+	for _, mentor := range mentors {
+		mentorMap[mentor.WorkerId] = mentor.Days
+	}
+
 	// 鎸¤溅宸ュ伐璧�
-	weaversAmountArr, _ := models.NewPayrollProductionWeaversSearch().SetMonthly(date).FindNotTotal()
+	weaversAmountArr, err := models.NewPayrollProductionWeaversSearch().SetMonthly(date).FindNotTotal()
+	if err != nil {
+		return err
+	}
+
 	weaversAmountMap := make(map[string]*models.PayrollProductionWeavers, len(weaversAmountArr))
 	for _, weaver := range weaversAmountArr {
 		key := fmt.Sprintf("%v%v", weaver.Cycle, weaver.WorkerID)
@@ -429,12 +536,23 @@
 
 	// 宸ョ宸ヨ祫鏂规 map[宸ョ]鏂规
 	salaryPlans, _ := models.NewWorkTypeManageSearch().FindNotTotal()
+	if len(salaryPlans) == 0 {
+		return errors.New(date + ":宸ヨ祫鏂规涓虹┖")
+	}
+
 	salaryPlansMap := make(map[uint]*models.WorkTypeManage, len(salaryPlans))
 	for _, salaryPlan := range salaryPlans {
 		salaryPlansMap[salaryPlan.ID] = salaryPlan
 	}
 
 	groups, err := models.NewPayrollProductionGroupSearch().SetMonthly(date).FindNotTotal()
+	if err != nil {
+		return err
+	}
+	if len(groups) == 0 {
+		return errors.New(date + ":灏忕粍姣忓ぉ鐨勪骇閲忎负绌�")
+	}
+
 	groupMap := make(map[string]*models.PayrollProductionGroup, len(groups))
 	groupByMonthMap := make(map[string]*models.PayrollProductionGroup, len(groups))
 	for _, group := range groups {
@@ -475,36 +593,46 @@
 
 		// 鎸夊ぉ绠楋細鏃ヤ骇涓濋噺銆佺敓涓濆崟浠枫�佹《鏁般�侀噹绾ゆ暟閲忋�侀噹绾ゅ崟浠�
 		groupKey := fmt.Sprintf("%v%v%v", hour.Cycle, hour.WorkshopNumber, hour.GroupNumber)
-		group := groupMap[groupKey]
-		weaversKey := fmt.Sprintf("%v%v", hour.Cycle, hour.WorkerID)
-		weavers := weaversAmountMap[weaversKey]
-		parameter := SalaryParameter{
-			SilkQuantity:       group.SilkQuantity,
-			SilkUnitAmount:     decimal.NewFromInt32(1),
-			SilkTotalAmount:    weavers.FinishTotalAmount,
-			FallingSilkBucket:  group.FallingSilkBucket,
-			BadSilkQuantity:    group.BadSilkQuantity,
-			BadSilkUnitAmount:  decimal.NewFromInt32(1),
-			BadSilkTotalAmount: weavers.BadSilkTotalAmount,
-		}
-		if workType, ok := salaryPlansMap[hour.WorkTypeID]; ok {
-			for _, salaryPlan := range workType.SalaryPlans {
-				if matched, _ := regexp.MatchString("(鏃ヤ骇涓濋噺)|(鐢熶笣鍗曚环)|(妗舵暟)|(閲庣氦鏁伴噺)|(閲庣氦鍗曚环)", salaryPlan.SalaryFormula); matched {
-					temp := production
-					formula, s := salaryCalculate(&parameter, salaryPlan)
+		if group, ok := groupMap[groupKey]; ok {
+			weaversKey := fmt.Sprintf("%v%v", hour.Cycle, hour.WorkerID)
+			finishTotalAmount := decimal.NewFromInt32(0)
+			badSilkTotalAmount := decimal.NewFromInt32(0)
+			if weavers, ok := weaversAmountMap[weaversKey]; ok {
+				finishTotalAmount = weavers.FinishTotalAmount
+				badSilkTotalAmount = weavers.BadSilkTotalAmount
+			}
 
-					temp.SalaryFormula = formula
-					temp.SalaryPlanId = salaryPlan.ID
-					temp.Amount = temp.Amount.Add(s)
-					productionByDay = append(productionByDay, &temp) // 姣忎釜浜虹殑鎵�鏈夋柟妗�
+			parameter := SalaryParameter{
+				SilkQuantity:       group.SilkQuantity,
+				SilkUnitAmount:     decimal.NewFromInt32(1),
+				SilkTotalAmount:    finishTotalAmount,
+				FallingSilkBucket:  group.FallingSilkBucket,
+				BadSilkQuantity:    group.BadSilkQuantity,
+				BadSilkUnitAmount:  decimal.NewFromInt32(1),
+				BadSilkTotalAmount: badSilkTotalAmount,
+			}
+			if workType, ok := salaryPlansMap[hour.WorkTypeID]; ok {
+				for _, salaryPlan := range workType.SalaryPlans {
+					if matched, _ := regexp.MatchString("(鏃ヤ骇涓濋噺)|(鐢熶笣鍗曚环)|(妗舵暟)|(閲庣氦鏁伴噺)|(閲庣氦鍗曚环)", salaryPlan.SalaryFormula); matched {
+						temp := production
+						formula, s := salaryCalculate(&parameter, salaryPlan)
+
+						temp.SalaryFormula = formula
+						temp.SalaryPlanId = salaryPlan.ID
+						temp.Amount = temp.Amount.Add(s)
+						productionByDay = append(productionByDay, &temp) // 姣忎釜浜虹殑鎵�鏈夋柟妗�
+					}
+
 				}
-
 			}
 		}
 
 	}
 
 	err = models.WithTransaction(func(db *gorm.DB) error {
+		if len(productionByDay) == 0 {
+			return nil
+		}
 		if err := models.NewPayrollOtherSubsidiesSearch().SetOrm(db).SetMonthly(date).Delete(); err != nil {
 			return err
 		}
@@ -556,19 +684,35 @@
 			CreatedBy: "auto",
 		}
 
-		monthKey := fmt.Sprintf("%v%v", worker.ShopNumber, worker.GroupNumber)
-		group := groupByMonthMap[monthKey]
+		firstDay, lastDay := utils.GetLastMonthPeriod(dateTime)
+		_, days := utils.CalcWorkHour(firstDay, lastDay, []time.Weekday{time.Sunday}, 12.0)
 		parameter := SalaryParameter{
-			FallingSilkBucket:     group.FallingSilkBucket,
-			GroupWeaversAvgAmount: group.FinishTotalAvgAmount,
-			GroupCarHeadAvgAmount: group.FinishTotalAvgAmount.Div(ready70),
-			JobDays:               decimal.NewFromInt32(int32(dayCount)),
+			WorkingDay:          decimal.NewFromInt32(int32(days)),
+			JobDays:             decimal.NewFromInt32(int32(dayCount)),
+			FullAttendanceAward: decimal.NewFromInt32(0), // 婊″嫟濂�
+			LeaveDays:           decimal.NewFromInt32(0), // 璇峰亣澶╂暟
+			Seniority:           decimal.NewFromInt32(0), // 宸ラ緞
+		}
+		monthKey := fmt.Sprintf("%v%v", worker.ShopNumber, worker.GroupNumber)
+		if group, ok := groupByMonthMap[monthKey]; ok {
+			parameter.FallingSilkBucket = group.FallingSilkBucket
+			parameter.GroupWeaversAvgAmount = group.FinishTotalAvgAmount
+			parameter.GroupCarHeadAvgAmount = group.FinishTotalAvgAmount.Div(ready70)
+		}
+		if timeout, ok := shiftTimeoutMap[hourId]; ok {
+			parameter.ShiftTimeout = timeout
+		}
+		if overtime, ok := shiftOvertimeMap[hourId]; ok {
+			parameter.ShiftOvertime = overtime
+		}
+		if mentorDays, ok := mentorMap[hourId]; ok {
+			parameter.MentorDays = decimal.NewFromInt32(int32(mentorDays))
 		}
 
 		// 鎸夋湀绠楋細鍚岀粍鎸¤溅宸ユ湀骞冲潎宸ヨ祫銆佸悓缁勮溅澶村伐宸ヨ祫銆佸嚭鍕ゅぉ鏁�
 		if workType, ok := salaryPlansMap[worker.WorkTypeId]; ok {
 			for _, salaryPlan := range workType.SalaryPlans {
-				if matched, _ := regexp.MatchString("(鍚岀粍鎸¤溅宸ユ湀骞冲潎宸ヨ祫)|(鍚岀粍杞﹀ご宸ュ伐璧�)|(鍑哄嫟澶╂暟)", salaryPlan.SalaryFormula); matched {
+				if matched, _ := regexp.MatchString("(鍚岀粍鎸¤溅宸ユ湀骞冲潎宸ヨ祫)|(鍚岀粍杞﹀ご宸ュ伐璧�)|(鍑哄嫟澶╂暟)|(宸ヤ綔鏃ュ姞鐝椂闀�)|(浼戞伅鏃ュ姞鐝椂闀�)|(甯﹀緬澶╂暟)|(婊″嫟濂�)|(璇峰亣澶╂暟)|(宸ラ緞)", salaryPlan.SalaryFormula); matched {
 					temp := constitute
 					formula, s := salaryCalculate(&parameter, salaryPlan)
 					temp.SalaryFormula = formula
@@ -582,6 +726,9 @@
 	}
 
 	err = models.WithTransaction(func(db *gorm.DB) error {
+		if len(constituteByMonth) == 0 {
+			return nil
+		}
 		if err := models.NewPayrollConstituteSearch().SetOrm(db).SetCycle(date).SetCreatedBy("auto").Delete(); err != nil {
 			return err
 		}
@@ -596,7 +743,8 @@
 
 // 鏍规嵁鏂规璁$畻鍚勫伐绉嶈柂璧�
 func salaryCalculate(parameter *SalaryParameter, salaryPlan *models.SalaryPlan) (string, decimal.Decimal) {
-	formula := strings.ReplaceAll(salaryPlan.SalaryFormula, " ", "")
+	formula := strings.ReplaceAll(salaryPlan.SalaryFormula, ",", "")
+	formula = strings.ReplaceAll(salaryPlan.SalaryFormula, " ", "")
 	//var SplitFixedField = []string{"鏃ヤ骇涓濋噺", "鐢熶笣鍗曚环", "妗舵暟", "閲庣氦鏁伴噺", "閲庣氦鍗曚环", "鍚岀粍鎸¤溅宸ユ湀骞冲潎宸ヨ祫", "鍚岀粍杞﹀ご宸ュ伐璧�", "鍑哄嫟澶╂暟"}
 	formula = strings.Replace(formula, "鏃ヤ骇涓濋噺*鐢熶笣鍗曚环", parameter.SilkTotalAmount.String(), -1)
 	formula = strings.Replace(formula, "閲庣氦鏁伴噺*閲庣氦鍗曚环", parameter.BadSilkTotalAmount.String(), -1)
@@ -609,6 +757,15 @@
 	formula = strings.Replace(formula, "鍚岀粍杞﹀ご宸ュ伐璧�", parameter.GroupCarHeadAvgAmount.String(), -1)
 	formula = strings.Replace(formula, "鍑哄嫟澶╂暟", parameter.JobDays.String(), -1)
 
+	formula = strings.Replace(formula, "宸ヤ綔鏃ュ姞鐝椂闀�", parameter.ShiftTimeout.String(), -1)
+	formula = strings.Replace(formula, "浼戞伅鏃ュ姞鐝椂闀�", parameter.ShiftOvertime.String(), -1)
+	formula = strings.Replace(formula, "甯﹀緬澶╂暟", parameter.MentorDays.String(), -1)
+	formula = strings.Replace(formula, "婊″嫟濂�", parameter.FullAttendanceAward.String(), -1)
+	formula = strings.Replace(formula, "璇峰亣澶╂暟", parameter.LeaveDays.String(), -1)
+	formula = strings.Replace(formula, "宸ラ緞", parameter.Seniority.String(), -1)
+
+	logx.Debugf("salary formula: %v", formula)
+
 	result, err := calculator.ParseAndExec(formula)
 	if err != nil {
 		logx.Errorf("%s : %v", formula, err)

--
Gitblit v1.8.0