fox
zhangqian
2024-05-07 7d06c6472f1acea6b2e49e7b8837bf555e94e219
task/salary_statistics.go
@@ -1,6 +1,7 @@
package task
import (
   "errors"
   "github.com/shopspring/decimal"
   "silkserver/constvar"
   "silkserver/models"
@@ -11,6 +12,23 @@
)
func SalaryStatistics() {
   //加锁,只需要一个进程运行此任务
   var (
      lockName  = "SalaryStatistics"
      serviceID = "silkServer"
   )
   err := models.NewLockSearch().AcquireLock(lockName, serviceID)
   if err != nil {
      logx.Errorf("MonthStats AcquireLock err:%v", err)
      return
   }
   defer func() {
      err := models.NewLockSearch().ReleaseLock(lockName, serviceID)
      if err != nil {
         logx.Errorf("MonthStats ReleaseLock err:%v", err)
      }
   }()
   lastMonthStart, lastMonthEnd := GetLastMonthPeriod()
   month := lastMonthStart.Format("2006-01")
@@ -22,21 +40,29 @@
      logx.Error("SalaryStatistics 查询考勤统计 err: " + err.Error())
      return
   }
   if len(attendances) == 0 {
      logx.Warn("SalaryStatistics 查询考勤统计 empty result")
      return
   }
   var reportForms []*models.SalaryReportForm
   reportMap := make(map[string]*models.SalaryReportForm)
   workTypeIdMap := make(map[uint]uint)
   dataMap := make(map[string]utils.SalaryCalculateData)
   for _, attendance := range attendances {
      var rf models.SalaryReportForm
      if _, ok := reportMap[attendance.WorkerId]; !ok {
         var rf models.SalaryReportForm
         rf.WorkerId = attendance.WorkerId
         rf.WorkerName = attendance.WorkerName
         rf.WorkTypeId = attendance.WorkTypeId
         rf.Month = month
         rf.Phone = attendance.PhoneNum
         reportMap[attendance.WorkerId] = &rf
      }
      var data utils.SalaryCalculateData
      if _, ok := dataMap[attendance.WorkerId]; ok {
         data = dataMap[attendance.WorkerId]
      }
      rf.WorkerId = attendance.WorkerId
      rf.WorkerName = attendance.WorkerName
      rf.WorkTypeId = attendance.WorkTypeId
      rf.Month = month
      rf.Phone = attendance.PhoneNum
      if attendance.WorkTypeId > 0 {
         workTypeIdMap[attendance.WorkTypeId] = attendance.WorkTypeId
      }
@@ -47,7 +73,9 @@
         data.TotalAttendanceDays = data.TotalAttendanceDays + 1
      }
      dataMap[attendance.WorkerId] = data
      reportForms = append(reportForms, &rf)
   }
   for _, v := range reportMap {
      reportForms = append(reportForms, v)
   }
   workTypeIds := make([]uint, 0)
   for _, v := range workTypeIdMap {
@@ -60,8 +88,11 @@
      logx.Error("SalaryStatistics 查询工种的薪资方案和新增类型 err: " + err.Error())
      return
   }
   if len(workTypeManages) == 0 {
      return
   }
   for _, form := range reportForms {
      details := make([]models.SalaryDetails, 0)
      details := make([]*models.SalaryDetails, 0)
      issueSalary := decimal.NewFromInt(0)
      for _, manage := range workTypeManages {
         if form.WorkTypeId == manage.ID {
@@ -76,16 +107,15 @@
                  data, err = GetDailySilkProduction(startStr, endStr, form.WorkerId, data)
                  if err != nil {
                     logx.Error("SalaryStatistics 统计薪资出错 err: " + err.Error())
                  } else {
                     amount, err = utils.CalculateSalary(data, formula)
                     if err != nil {
                        logx.Error("SalaryStatistics 计算薪资出错 err: " + err.Error())
                     }
                  }
               }
               amount, err = utils.CalculateSalary(data, formula)
               if err != nil {
                  logx.Error("SalaryStatistics 计算薪资出错 err: " + err.Error())
               }
               detail.Amount = amount
               issueSalary = issueSalary.Add(amount)
               details = append(details, detail)
               details = append(details, &detail)
            }
         }
      }
@@ -105,8 +135,8 @@
   var cars []models.WorkerPosition
   err := models.NewWorkerPositionSearch().Orm.Table("silk_worker_position").Where("worker_id = ? and start_date >= ? and "+
      "end_date <= ?", workerId, start, end).Find(&cars).Error
   if err != nil {
      return data, err
   if err != nil || len(cars) == 0 {
      return data, errors.New("查询机台管理出错")
   }
   endCarMap := make(map[int]int)
   groupMap := make(map[int]int)
@@ -133,8 +163,8 @@
   var yield []models.YieldRegister
   err = models.NewYieldRegisterSearch().Orm.Table("silk_yield_register").Where("workshop_number in (?) and group_number "+
      "in (?) and create_time >= ? and create_time <= ?", workshops, groups, start, end).Find(&yield).Error
   if err != nil {
      return data, err
   if err != nil || len(yield) == 0 {
      return data, errors.New("查询产量登记表出错")
   }
   yieldRegisterIds := make([]uint, 0)
   for _, register := range yield {
@@ -142,8 +172,8 @@
   }
   yieldMap := make(map[string]decimal.Decimal)
   items, err := models.NewYieldRegisterItemSearch().SetYieldRegisterIds(yieldRegisterIds).SetCarNumbers(endCars).FindNotTotal()
   if err != nil {
      return data, err
   if err != nil || len(items) == 0 {
      return data, errors.New("查询产量登记详情表出错")
   }
   for _, register := range yield {
      for _, item := range items {
@@ -155,10 +185,10 @@
   //查询纤度登记表
   var fineness []models.FinenessRegister
   markets := make([]string, 0)
   err = models.NewFinenessRegisterSearch().Orm.Table("silk_fineness_register").Where("workshop in (?) and workshop_group "+
   err = models.NewFinenessRegisterSearch().Orm.Table("silk_fineness_register").Where("workshop_number in (?) and workshop_group "+
      "in (?) and finish_date >= ? and finish_date <= ?", workshops, groups, start, end).Find(&fineness).Error
   if err != nil {
      return data, err
   if err != nil || len(fineness) == 0 {
      return data, errors.New("查询纤度登记表出错")
   }
   finenessIds := make([]uint, 0)
   for _, register := range fineness {
@@ -168,8 +198,8 @@
   var checkItems []models.FinenessCheckItem
   err = models.NewFinenessCheckItemSearch().Orm.Table("silk_fineness_check_item").Where("fineness_register_id in (?) and "+
      "position in (?)", finenessIds, endCars).Find(&checkItems).Error
   if err != nil {
      return data, err
   if err != nil || len(checkItems) == 0 {
      return data, errors.New("查询纤度登记详情表出错")
   }
   checkMap := make(map[string]string)
   marketMap := make(map[string]string)