2025-03-05 10:11:07 +08:00
|
|
|
package salary_calculator
|
|
|
|
|
|
|
|
import (
|
2025-03-05 16:44:20 +08:00
|
|
|
"enterprise/common/dao"
|
2025-03-05 10:11:07 +08:00
|
|
|
"enterprise/common/model"
|
|
|
|
"enterprise/common/registry"
|
2025-03-05 16:44:20 +08:00
|
|
|
log "github.com/sirupsen/logrus"
|
2025-03-05 10:11:07 +08:00
|
|
|
"github.com/spf13/cast"
|
2025-03-05 23:41:21 +08:00
|
|
|
"strings"
|
2025-03-05 16:44:20 +08:00
|
|
|
"time"
|
2025-03-05 10:11:07 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2025-03-06 00:41:45 +08:00
|
|
|
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
|
2025-03-06 01:16:35 +08:00
|
|
|
} else if strings.ToLower(salary.UserName) == "chenmin" {
|
|
|
|
salary.AttendDay = 19
|
|
|
|
} else if strings.ToLower(salary.UserName) == "xushiyu" {
|
|
|
|
salary.AttendDay = 7
|
2025-03-06 00:41:45 +08:00
|
|
|
}
|
2025-03-05 23:41:21 +08:00
|
|
|
}
|
|
|
|
|
2025-03-05 10:11:07 +08:00
|
|
|
salary.AttendSalary = cast.ToFloat64(userSlary.Base) * (salary.AttendDay / float64(salary.ShouldDay))
|
|
|
|
salary.TargetSalary = cast.ToFloat64(userSlary.Target)
|
2025-03-05 16:44:20 +08:00
|
|
|
|
2025-03-06 00:41:45 +08:00
|
|
|
// 1.订单
|
2025-03-05 16:44:20 +08:00
|
|
|
monthTime, _ := time.ParseInLocation("200601", salary.Month, time.Local)
|
|
|
|
startTime := monthTime.Unix()
|
|
|
|
endTime := monthTime.AddDate(0, 1, 0).Unix() - 1
|
2025-03-05 23:38:56 +08:00
|
|
|
orders, err := dao.NewExternalCorpOrder().QueryOwnerOrder(s.user.Username, startTime, endTime)
|
2025-03-05 16:44:20 +08:00
|
|
|
if err != nil {
|
|
|
|
log.Errorf("db error:%s", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
orderNum := len(orders)
|
2025-03-05 23:38:56 +08:00
|
|
|
salary.SetExtra("corp_order_num", cast.ToString(orderNum))
|
|
|
|
|
2025-03-06 00:41:45 +08:00
|
|
|
//2.处理的订单
|
2025-03-05 23:38:56 +08:00
|
|
|
processOrders, err := dao.NewExternalCorpOrder().QueryProcessOrder(s.user.Username, startTime, endTime)
|
|
|
|
if err != nil {
|
|
|
|
log.Errorf("db error:%s", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2025-03-06 00:41:45 +08:00
|
|
|
//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 {
|
2025-03-06 01:08:22 +08:00
|
|
|
childOrders, err := dao.NewExternalCorpOrder().QueryChildOrder(corpUser.Id, startTime, endTime)
|
2025-03-06 00:41:45 +08:00
|
|
|
if err != nil {
|
|
|
|
log.Errorf("db error:%s", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
childOrderNum = len(childOrders)
|
|
|
|
}
|
2025-03-06 01:18:53 +08:00
|
|
|
salary.SetExtra("corp_child_order_num", cast.ToString(childOrderNum))
|
2025-03-06 00:41:45 +08:00
|
|
|
|
2025-03-05 23:38:56 +08:00
|
|
|
processOrderNum := len(processOrders)
|
|
|
|
salary.SetExtra("corp_process_order_num", cast.ToString(processOrderNum))
|
2025-03-06 00:05:00 +08:00
|
|
|
salary.AwardSalary = 0
|
2025-03-05 16:44:20 +08:00
|
|
|
if orderNum >= 40 {
|
|
|
|
salary.TargetSalary = cast.ToFloat64(userSlary.Target)
|
|
|
|
if orderNum <= 60 {
|
2025-03-06 01:08:22 +08:00
|
|
|
salary.TargetSalary += float64((orderNum - 40) * 80)
|
2025-03-05 16:44:20 +08:00
|
|
|
} else if orderNum <= 80 {
|
2025-03-06 01:08:22 +08:00
|
|
|
salary.TargetSalary += 1600 + float64((orderNum-60)*100)
|
2025-03-05 16:44:20 +08:00
|
|
|
} else {
|
2025-03-06 01:08:22 +08:00
|
|
|
salary.TargetSalary += 3600 + float64((orderNum-80)*120)
|
2025-03-05 16:44:20 +08:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
salary.TargetSalary = float64(60 * orderNum)
|
|
|
|
}
|
2025-03-05 23:38:56 +08:00
|
|
|
salary.AwardSalary += float64(processOrderNum * 5)
|
2025-03-06 00:41:45 +08:00
|
|
|
salary.AwardSalary += float64(childOrderNum * 5)
|
2025-03-05 10:11:07 +08:00
|
|
|
}
|