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(¶meter, 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(¶meter, 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(¶meter, 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