package utils import ( "github.com/Knetic/govaluate" "github.com/shopspring/decimal" "strconv" "strings" ) // 薪资计算数据 type SalaryCalculateData struct { DailySilkProduction decimal.Decimal `json:"dailySilkProduction"` // 日产丝量 WasteSilkQuantity decimal.Decimal `json:"wasteSilkQuantity"` // 野纤数量 //todo RawSilkUnitPrice decimal.Decimal `json:"rawSilkUnitPrice"` // 生丝单价 //todo WasteSilkUnitPrice decimal.Decimal `json:"wasteSilkUnitPrice"` // 野纤单价 //todo BucketCount decimal.Decimal `json:"bucketCount"` //桶数(日) //todo AttendanceDays int `json:"attendanceDays"` // 出勤天数 //todo GroupAverageMonthlyWage decimal.Decimal `json:"groupAverageMonthlyWage"` //同组挡车工月平均工资 //todo GroupCarHeadWage decimal.Decimal `json:"groupCarHeadWage"` //同组车头工工资 //todo WeekdayOvertimeHours decimal.Decimal `json:"weekdayOvertimeHours"` // 工作日加班时长 FullAttendanceAward int `json:"FullAttendanceAward"` // 满勤奖 //todo WeekendOvertimeHours decimal.Decimal `json:"weekendOvertimeHours"` // 休息日加班时长 //todo LeaveDays decimal.Decimal `json:"LeaveDays"` //请假天数 //todo ApprenticeDays decimal.Decimal `json:"apprenticeDays"` // 带徒天数 //todo TotalAttendanceDays int `json:"totalAttendanceDays"` // 出勤天数 Seniority decimal.Decimal `json:"seniority"` // 工龄 //todo } // CalculateSalary 计算工资的函数 func CalculateSalary(date SalaryCalculateData, formula string) (decimal.Decimal, error) { // 替换公式中的变量 formula = strings.ReplaceAll(formula, "日产丝量", date.DailySilkProduction.String()) formula = strings.ReplaceAll(formula, "野纤数量", date.WasteSilkQuantity.String()) formula = strings.ReplaceAll(formula, "生丝单价", date.RawSilkUnitPrice.String()) formula = strings.ReplaceAll(formula, "野纤单价", date.WasteSilkUnitPrice.String()) formula = strings.ReplaceAll(formula, "桶数(日)", date.BucketCount.String()) formula = strings.ReplaceAll(formula, "出勤天数", strconv.Itoa(date.AttendanceDays)) formula = strings.ReplaceAll(formula, "同组挡车工月平均工资", date.GroupAverageMonthlyWage.String()) formula = strings.ReplaceAll(formula, "同组车头工工资", date.GroupCarHeadWage.String()) formula = strings.ReplaceAll(formula, "工作日加班时长", date.WeekdayOvertimeHours.String()) formula = strings.ReplaceAll(formula, "满勤奖", strconv.Itoa(date.FullAttendanceAward)) formula = strings.ReplaceAll(formula, "休息日加班时长", date.WeekendOvertimeHours.String()) formula = strings.ReplaceAll(formula, "请假天数", date.LeaveDays.String()) formula = strings.ReplaceAll(formula, "带徒天数", date.ApprenticeDays.String()) formula = strings.ReplaceAll(formula, "出勤天数", strconv.Itoa(date.TotalAttendanceDays)) formula = strings.ReplaceAll(formula, "工龄", date.Seniority.String()) // 使用 govaluate 库计算表达式 wage := decimal.NewFromInt(0) expression, err := govaluate.NewEvaluableExpression(formula) if err != nil { return wage, err } parameters := make(map[string]interface{}) result, err := expression.Evaluate(parameters) if err != nil { return wage, err } wage = decimal.NewFromFloat(result.(float64)) return wage, nil }