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.UserName == "luoyi" { salary.AttendDay = float64(salary.ShouldDay - 3) } else if strings.ToLower(salary.UserName) == "wangyan" { salary.AttendDay = float64(salary.ShouldDay) - 3.6 } else if strings.ToLower(salary.UserName) == "zhouhong" { salary.AttendDay = float64(salary.ShouldDay) - 3.6 } salary.AttendSalary = cast.ToFloat64(userSlary.Base) * (salary.AttendDay / float64(salary.ShouldDay)) salary.TargetSalary = cast.ToFloat64(userSlary.Target) 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)) processOrders, err := dao.NewExternalCorpOrder().QueryProcessOrder(s.user.Username, startTime, endTime) if err != nil { log.Errorf("db error:%s", err.Error()) return } 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.AwardSalary = float64((orderNum - 40) * 80) } else if orderNum <= 80 { salary.AwardSalary = 1600 + float64((orderNum-60)*100) } else { salary.AwardSalary = 3600 + float64((orderNum-80)*120) } } else { salary.TargetSalary = float64(60 * orderNum) } salary.AwardSalary += float64(processOrderNum * 5) }