package salary_calculator import ( "enterprise/common/dao" "enterprise/common/model" "enterprise/common/registry" log "github.com/sirupsen/logrus" "github.com/spf13/cast" "strings" "time" ) type SalaryCalculator1002 struct { corp *model.Corp user *model.StaffUser } func NewSalaryCalculator1002(corp *model.Corp, user *model.StaffUser) registry.SalaryCalculator { return &SalaryCalculator1002{ corp: corp, user: user, } } func (s *SalaryCalculator1002) Calculate(salary *model.StaffSalary) { userSlary := s.user.GetSalary() if s.user.Status == model.StaffUserStatusAttach { //挂靠直接算工资 salary.AttendSalary = cast.ToFloat64(userSlary.Base) salary.TargetSalary = cast.ToFloat64(userSlary.Target) return } if salary.Month == "202502" { salary.ShouldDay = 21 if salary.UserName == "luoyi" { salary.AttendDay = float64(salary.ShouldDay - 5) } else if strings.ToLower(salary.UserName) == "wangyan" { salary.AttendDay = float64(salary.ShouldDay) - 5.6 } else if strings.ToLower(salary.UserName) == "zhouhong" { salary.AttendDay = float64(salary.ShouldDay) - 5.6 } else if strings.ToLower(salary.UserName) == "chenmin" { salary.AttendDay = 19 } else if strings.ToLower(salary.UserName) == "xushiyu" { salary.AttendDay = 7 } } salary.AttendSalary = cast.ToFloat64(userSlary.Base) * (salary.AttendDay / float64(salary.ShouldDay)) salary.TargetSalary = cast.ToFloat64(userSlary.Target) // 1.订单 monthTime, _ := time.ParseInLocation("200601", salary.Month, time.Local) startTime := monthTime.Unix() endTime := monthTime.AddDate(0, 1, 0).Unix() - 1 orders, err := dao.NewExternalCorpOrder().QueryOwnerOrder(s.user.Username, startTime, endTime) if err != nil { log.Errorf("db error:%s", err.Error()) return } orderNum := len(orders) salary.SetExtra("corp_order_num", cast.ToString(orderNum)) //2.处理的订单 processOrders, err := dao.NewExternalCorpOrder().QueryProcessOrder(s.user.Username, startTime, endTime) if err != nil { log.Errorf("db error:%s", err.Error()) return } //3.下属订单 corpUser, err := dao.NewExternalCorpUser().Get(s.user.Username) if err != nil { log.Errorf("db error:%s", err.Error()) return } childOrderNum := 0 if corpUser != nil { childOrders, err := dao.NewExternalCorpOrder().QueryChildOrder(corpUser.Id, startTime, endTime) if err != nil { log.Errorf("db error:%s", err.Error()) return } childOrderNum = len(childOrders) } processOrderNum := len(processOrders) salary.SetExtra("corp_process_order_num", cast.ToString(processOrderNum)) salary.AwardSalary = 0 if orderNum >= 40 { salary.TargetSalary = cast.ToFloat64(userSlary.Target) if orderNum <= 60 { salary.TargetSalary += float64((orderNum - 40) * 80) } else if orderNum <= 80 { salary.TargetSalary += 1600 + float64((orderNum-60)*100) } else { salary.TargetSalary += 3600 + float64((orderNum-80)*120) } } else { salary.TargetSalary = float64(60 * orderNum) } salary.AwardSalary += float64(processOrderNum * 5) salary.AwardSalary += float64(childOrderNum * 5) }