From 4bf3fdd053fc5c124834bdedd0e45669b1eb68e7 Mon Sep 17 00:00:00 2001 From: jiangyong27 Date: Wed, 31 Jan 2024 22:54:06 +0800 Subject: [PATCH] new sallary3 --- cmd/enterprise.go | 10 ---- common/dao/approval_checkin.go | 20 ++++++- common/dao/checkin.go | 11 ++-- common/model/user_config.go | 1 + worker/checkin.go | 1 + worker/staff.go | 97 ++++++++++++++++++++-------------- 6 files changed, 84 insertions(+), 56 deletions(-) diff --git a/cmd/enterprise.go b/cmd/enterprise.go index e27973c..06fcd1f 100644 --- a/cmd/enterprise.go +++ b/cmd/enterprise.go @@ -19,13 +19,3 @@ func main() { panic(err) } } - -func main22() { - config.LoadServerConfig() - global.InitGlobal() - //cfg := config.GetConfig() - - //new(worker.Checkin).SyncCheckinDay("2024-01-17") - //new(worker.Approval).Sync("202401", model.ApprovalTypeRefund) - new(worker.Staff).SyncStaffSalary("202401") -} diff --git a/common/dao/approval_checkin.go b/common/dao/approval_checkin.go index 9bcf809..a81f939 100644 --- a/common/dao/approval_checkin.go +++ b/common/dao/approval_checkin.go @@ -65,7 +65,7 @@ func (d *ApprovalCheckinDao) GetBySpNo(spNo string) (*model.ApprovalCheckin, err return &u, nil } -func (d *ApprovalCheckinDao) GetByUsername(username, month string) ([]*model.ApprovalCheckin, error) { +func (d *ApprovalCheckinDao) GetByUsernameMonth(username, month string) ([]*model.ApprovalCheckin, error) { var u []*model.ApprovalCheckin tx := GetDB().Table(d.TableName()) tx = tx.Where("month = ?", month) @@ -76,3 +76,21 @@ func (d *ApprovalCheckinDao) GetByUsername(username, month string) ([]*model.App } return u, nil } + +func (d *ApprovalCheckinDao) GetByUsernameDay(username, day string) (*model.ApprovalCheckin, error) { + var u model.ApprovalCheckin + tx := GetDB().Table(d.TableName()) + tx = tx.Where("checkin_date = ?", day) + tx = tx.Where("username = ?", username) + + res := tx.First(&u) + if res.Error == gorm.ErrRecordNotFound { + return nil, nil + } + + if res.Error != nil { + return nil, res.Error + } + + return &u, nil +} diff --git a/common/dao/checkin.go b/common/dao/checkin.go index 71adbc7..98b1131 100644 --- a/common/dao/checkin.go +++ b/common/dao/checkin.go @@ -80,7 +80,7 @@ func (d *CheckinDao) CountUsername(month string) ([]*model.UsernameCount, error) return userCount, nil } -func (d *CheckinDao) GetUsernameCount(username, month string, filterException bool) (int64, error) { +func (d *CheckinDao) Query(username, month string, filterException bool) ([]*model.Checkin, error) { tx := GetDB().Table(d.TableName()) tx = tx.Where("month = ?", month) tx = tx.Where("username = ?", username) @@ -88,11 +88,10 @@ func (d *CheckinDao) GetUsernameCount(username, month string, filterException bo tx = tx.Where("exception = ''") } - var count int64 - tx.Select("COUNT(1) AS count").Pluck("count", &count) - + var u []*model.Checkin + tx = tx.Find(&u) if tx.Error != nil { - return 0, tx.Error + return nil, tx.Error } - return count, nil + return u, nil } diff --git a/common/model/user_config.go b/common/model/user_config.go index 715c3e5..eb65d93 100644 --- a/common/model/user_config.go +++ b/common/model/user_config.go @@ -9,6 +9,7 @@ var ( CheckinOffdutyMoney = "checkin.offduty.money" //下班打卡金额 StaffSalaryExpDiscount = "staff.salary.exp.discount" //试用期薪资折扣 StaffSalarySocialInsurence = "staff.salary.social.insurence" //社保扣除金额 + StaffSalaryPerDay = "staff.salary.per.day" //按天计算的工资 ) var ( UserConfigStatusNormal = 1 diff --git a/worker/checkin.go b/worker/checkin.go index b034127..0153b33 100644 --- a/worker/checkin.go +++ b/worker/checkin.go @@ -90,6 +90,7 @@ func (c *Checkin) saveToDB(user *qyweixin.UserCheckIn) error { checkin.StartTime = user.StartTime checkin.EndTime = user.EndTime checkin.Month = user.Month + checkin.Rawdata = user.Rawdata if isNew { _, err = dao.NewCheckinDao().Create(checkin) diff --git a/worker/staff.go b/worker/staff.go index 121ac32..646067b 100644 --- a/worker/staff.go +++ b/worker/staff.go @@ -100,47 +100,34 @@ func (s *Staff) SyncStaffSalary(month string) { month = time.Now().AddDate(0, -1, 0).Format("2006-01") } month = strings.ReplaceAll(month, "-", "") + totalDays := s.getTotalWordDay(month) + monthTime, _ := time.ParseInLocation("200601", month, time.Local) + startDate := cast.ToInt(monthTime.Format("20060102")) + endDate := cast.ToInt(monthTime.AddDate(0, 1, -1).Format("20060102")) + salaryDao := dao.NewStaffSalaryDao() staffs, err := dao.NewStaffInfoDao().Query(model.StaffInfoStatusNormal) if err != nil { log.Errorf("query staff db error :%s", err.Error()) return } - - monthTime, _ := time.ParseInLocation("200601", month, time.Local) - startDate := cast.ToInt(monthTime.Format("20060102")) - endDate := cast.ToInt(monthTime.AddDate(0, 1, -1).Format("20060102")) - salaryDao := dao.NewStaffSalaryDao() - - // 计算应出勤天数,选择最大的一个作为应出勤天数 - userCounts, err := dao.NewCheckinDao().CountUsername(month) - if err != nil { - log.Errorf("db error :%s", err.Error()) - return - } - totalDays := int64(0) - for _, uc := range userCounts { - if uc.Count > totalDays { - totalDays = uc.Count - } - } - for _, staff := range staffs { salary, err := salaryDao.GetBy(staff.Username, month) if err != nil { log.Errorf("db error :%s", err.Error()) continue } - - entryTime, _ := time.ParseInLocation("2006-01-02", staff.EntryDate, time.Local) - officalTime, _ := time.ParseInLocation("2006-01-02", staff.OfficialDate, time.Local) - isEntryMonth := goutil.If(cast.ToInt(entryTime.Format("200601")) == cast.ToInt(month), true, false) - isOfficialMonth := goutil.If(cast.ToInt(officalTime.Format("200601")) == cast.ToInt(month), true, false) if salary == nil { salary = new(model.StaffSalary) salary.Month = month salary.Username = staff.Username } + + entryTime, _ := time.ParseInLocation("2006-01-02", staff.EntryDate, time.Local) + officalTime, _ := time.ParseInLocation("2006-01-02", staff.OfficialDate, time.Local) + isEntryMonth := goutil.If(cast.ToInt(entryTime.Format("200601")) == cast.ToInt(month), true, false) + isOfficialMonth := goutil.If(cast.ToInt(officalTime.Format("200601")) == cast.ToInt(month), true, false) + config, err := dao.NewUserConfigDao().GetByUsername(staff.Username) if err != nil { log.Errorf("db error :%s", err.Error()) @@ -162,18 +149,7 @@ func (s *Staff) SyncStaffSalary(month string) { socialInsurence = 0 } - approveCheckins, err := dao.NewApprovalCheckinDao().GetByUsername(staff.Username, month) - if err != nil { - log.Errorf("db error :%s", err.Error()) - continue - } - - checkinCount, err := dao.NewCheckinDao().GetUsernameCount(staff.Username, month, true) - if err != nil { - log.Errorf("db error :%s", err.Error()) - continue - } - + // 休假申请 approveVacations, err := dao.NewApprovalVacationDao().GetByUsername(staff.Username, month) if err != nil { log.Errorf("db error :%s", err.Error()) @@ -186,11 +162,27 @@ func (s *Staff) SyncStaffSalary(month string) { surplusHoliday += goutil.If(vac.VacationDuration <= 1, 1-vac.VacationDuration, 0) } - extra := make(map[string]interface{}) + // 打卡正常天数+补卡天数 为正常出勤天数 + realWorkdays := 0 + userCheckins, err := dao.NewCheckinDao().Query(staff.Username, month, false) + if err != nil { + log.Errorf("db error :%s", err.Error()) + continue + } + for _, checkin := range userCheckins { + if checkin.Exception == "" { + realWorkdays += 1 + continue + } + approvalCheckin, _ := dao.NewApprovalCheckinDao().GetByUsernameDay(staff.Username, checkin.Day) + if approvalCheckin != nil { + realWorkdays += 1 + } + } + extra := make(map[string]interface{}) salary.BaseSalary = cast.ToFloat64(staff.Salary) salary.Holiday = holiday - entryDate := cast.ToInt(strings.ReplaceAll(staff.EntryDate, "-", "")) officialDate := cast.ToInt(strings.ReplaceAll(staff.OfficialDate, "-", "")) @@ -199,8 +191,12 @@ func (s *Staff) SyncStaffSalary(month string) { discount = discount*float64(officialDate-startDate)/totalMonthDay + 1*float64(endDate-officialDate+1)/totalMonthDay } - realWorkDays := float64(checkinCount+int64(len(approveCheckins))) + surplusHoliday + realWorkDays := float64(realWorkdays) + surplusHoliday realSalary := salary.BaseSalary * (realWorkDays / float64(totalDays)) * discount + staffSalaryPerDay := cast.ToFloat64(config.Get(model.StaffSalaryPerDay)) + if staffSalaryPerDay > 0 { + realSalary = staffSalaryPerDay * realWorkDays + } extra["discount"] = discount extra["socialInsurence"] = socialInsurence @@ -234,3 +230,26 @@ func (s *Staff) SyncStaffSalary(month string) { } } + +func (s *Staff) getTotalWordDay(month string) int64 { + // 最多人数的应出勤天数 为真正的出勤天数 + userCounts, err := dao.NewCheckinDao().CountUsername(month) + if err != nil { + log.Errorf("db error :%s", err.Error()) + return 0 + } + mp := make(map[int64]int) + totalDays := int64(0) + for _, uc := range userCounts { + mp[uc.Count] += 1 + } + minCount := 0 + for k, v := range mp { + if v > minCount { + minCount = v + totalDays = k + } + } + return totalDays + +}