yinbentan
2024-08-02 8ea408598fa6d8e351f7f40232d206854d1bd8df
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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
}