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
|
}
|