package salary_calculator import ( "enterprise/common/dao" "enterprise/common/model" "enterprise/common/registry" log "github.com/sirupsen/logrus" "github.com/spf13/cast" "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 } fullAttendSalary := float64(0) //特殊情况 if salary.Month == "202502" { salary.ShouldDay = 21 } if salary.AttendDay == float64(salary.ShouldDay) { fullAttendSalary = 500 } //特殊情况 if salary.Month == "202502" && (salary.Username == "luoyi" || salary.Username == "zhouhong" || salary.Username == "wangyan") { fullAttendSalary = 500 } salary.AttendSalary = (cast.ToFloat64(userSlary.Base)-500)*(salary.AttendDay/float64(salary.ShouldDay)) + fullAttendSalary 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) } salary.SetExtra("corp_child_order_num", cast.ToString(childOrderNum)) 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) }