hr assiant3

This commit is contained in:
jiangyong27 2023-09-01 20:01:30 +08:00
parent 57ca5f6865
commit b6e5112bb6
7 changed files with 225 additions and 5 deletions

View File

@ -1,6 +1,8 @@
package util
import (
"fmt"
"github.com/spf13/cast"
"math/rand"
"time"
)
@ -23,3 +25,7 @@ func CutTail(str string, length int) string {
return str[0:length]
}
func FloatCut(f float64) float64 {
return cast.ToFloat64(fmt.Sprintf("%.2f", f))
}

View File

@ -0,0 +1,85 @@
package dao
import (
"enterprise/common/model"
"gorm.io/gorm"
"time"
)
type StaffSalaryDao struct {
}
func NewStaffSalaryDao() *StaffSalaryDao {
return &StaffSalaryDao{}
}
func (d *StaffSalaryDao) TableName() string {
return "staff_salary"
}
func (d *StaffSalaryDao) Create(o *model.StaffSalary) (int64, error) {
o.CreateTime = time.Now().Unix()
res := GetDB().Table(d.TableName()).Create(o)
return o.Id, res.Error
}
func (d *StaffSalaryDao) Update(o *model.StaffSalary) error {
o.UpdateTime = time.Now().Unix()
tx := GetDB().Table(d.TableName())
res := tx.Save(o)
return res.Error
}
func (d *StaffSalaryDao) Delete(id int64) error {
res := GetDB().Table(d.TableName()).Delete(&model.StaffSalary{}, id)
return res.Error
}
func (d *StaffSalaryDao) Get(id int64) (*model.StaffSalary, error) {
var u model.StaffSalary
tx := GetDB().Table(d.TableName())
tx = tx.Where("id = ?", id)
res := tx.First(&u)
if res.Error == gorm.ErrRecordNotFound {
return nil, nil
}
if res.Error != nil {
return nil, res.Error
}
return &u, nil
}
func (d *StaffSalaryDao) GetBy(username, month string) (*model.StaffSalary, error) {
var u model.StaffSalary
tx := GetDB().Table(d.TableName())
tx = tx.Where("username = ?", username)
tx = tx.Where("month = ?", month)
res := tx.First(&u)
if res.Error == gorm.ErrRecordNotFound {
return nil, nil
}
if res.Error != nil {
return nil, res.Error
}
return &u, nil
}
func (d *StaffSalaryDao) Query(status int) ([]*model.StaffSalary, error) {
var u []*model.StaffSalary
tx := GetDB().Table(d.TableName())
if status != 0 {
tx = tx.Where("status = ?", status)
}
res := tx.Find(&u)
if res.Error == gorm.ErrRecordNotFound {
return nil, nil
}
if res.Error != nil {
return nil, res.Error
}
return u, nil
}

View File

@ -9,6 +9,7 @@ type StaffInfo struct {
Id int64
Username string
Realname string
StaffType string
Phone string
Idno string
Salary string

View File

@ -0,0 +1,14 @@
package model
type StaffSalary struct {
Id int64
Username string
Month string
BaseSalary float64
RealSalary float64
SocialInsurence float64
Holiday int
CreateTime int64
UpdateTime int64
Extra string
}

View File

@ -3,10 +3,12 @@ package model
import "encoding/json"
var (
CheckinOndutyMoneyEnable = "checkin.onduty.money.enable"
CheckinOffdutyMoneyEnable = "checkin.offduty.money.enable"
CheckinOndutyMoney = "checkin.onduty.money"
CheckinOffdutyMoney = "checkin.offduty.money"
CheckinOndutyMoneyEnable = "checkin.onduty.money.enable" //上班打卡红包
CheckinOffdutyMoneyEnable = "checkin.offduty.money.enable" //下班打卡红包
CheckinOndutyMoney = "checkin.onduty.money" //上班打卡金额
CheckinOffdutyMoney = "checkin.offduty.money" //下班打卡金额
StaffSalaryExpDiscount = "staff.salary.exp.discount" //试用期薪资折扣
StaffSalarySocialInsurence = "staff.salary.social.insurence" //社保扣除金额
)
var (
UserConfigStatusNormal = 1

View File

@ -22,6 +22,7 @@ type StaffInfo struct {
UserName string
RealName string
Phone string
StaffType string
Idno string
Salary float64
Stock float64
@ -73,6 +74,7 @@ func (h *QyWeixinHR) GetStaffInfo(userId string) (*StaffInfo, error) {
staff.Salary = cast.ToFloat64(h.getFieldValue(fieldMap["20001"]))
staff.Stock = cast.ToFloat64(h.getFieldValue(fieldMap["20002"]))
staff.Phone = cast.ToString(h.getFieldValue(fieldMap["17003"]))
staff.StaffType = cast.ToString(h.getFieldValue(fieldMap["12003"]))
staff.Idno = cast.ToString(h.getFieldValue(fieldMap["11015"]))
staff.BankName = cast.ToString(h.getFieldValue(fieldMap["13001"]))
staff.BankCard = cast.ToString(h.getFieldValue(fieldMap["13002"]))

View File

@ -1,12 +1,16 @@
package worker
import (
butil "enterprise/base/util"
"enterprise/common/config"
"enterprise/common/dao"
"enterprise/common/model"
"enterprise/common/weixin"
log "github.com/sirupsen/logrus"
"github.com/smbrave/goutil"
"github.com/spf13/cast"
"strings"
"time"
)
func SyncStaffInfo() {
@ -34,8 +38,8 @@ func SyncStaffInfo() {
}
staff.Username = staffInfo.UserName
staff.Realname = staffInfo.RealName
staff.Phone = staffInfo.Phone
staff.Idno = staffInfo.Idno
staff.StaffType = staffInfo.StaffType
staff.Salary = cast.ToString(staffInfo.Salary)
staff.EntryDate = staffInfo.EntryDate
staff.OfficialDate = staffInfo.OfficialDate
@ -54,3 +58,109 @@ func SyncStaffInfo() {
}
}
}
func CalcStaffSalary(month string) {
//cfg := config.GetConfig()
//hrAssiant := weixin.NewQyWeixinHR(cfg.QyWeixin.Corpid, cfg.QyWeixin.HrSecret, cfg.QyWeixin.HrSecret)
staffs, err := dao.NewStaffInfoDao().Query(model.StaffInfoStatusNormal)
if err != nil {
log.Errorf("query staff db error :%s", err.Error())
return
}
month = strings.ReplaceAll(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()
for _, staff := range staffs {
salary, err := salaryDao.GetBy(staff.Username, month)
if err != nil {
log.Errorf("db error :%s", err.Error())
continue
}
if salary == nil {
salary = new(model.StaffSalary)
salary.Month = month
salary.Username = staff.Username
}
config, err := dao.NewUserConfigDao().GetByUsername(staff.Username)
if err != nil {
log.Errorf("db error :%s", err.Error())
continue
}
discount := cast.ToFloat64(config.Get(model.StaffSalaryExpDiscount))
if discount == 0.0 {
discount = 0.8
}
socialInsurence := cast.ToFloat64(config.Get(model.StaffSalarySocialInsurence))
if endDate%100 > 15 { // 15号以后的员工不缴社保
socialInsurence = 0
}
extra := make(map[string]interface{})
salary.BaseSalary = cast.ToFloat64(staff.Salary)
salary.Holiday = 0
entryDate := cast.ToInt(strings.ReplaceAll(staff.EntryDate, "-", ""))
officialDate := cast.ToInt(strings.ReplaceAll(staff.OfficialDate, "-", ""))
isEntryMonth := false
isOfficialMonth := false
expDays := 0
officialDays := 0
if entryDate/100 == startDate/100 {
isEntryMonth = true
}
if officialDate/100 == startDate/100 {
isOfficialMonth = true
}
if isEntryMonth {
expDays = endDate - entryDate + 1
officialDays = 0
} else if isOfficialMonth {
expDays = officialDate - startDate + 1
officialDays = endDate - officialDate
} else if endDate < officialDate {
expDays = endDate - startDate + 1
officialDays = 0
} else {
officialDays = endDate - startDate + 1
expDays = 0
}
expSalary := cast.ToFloat64(staff.Salary) * discount / float64(endDate-startDate+1)
officalSalary := cast.ToFloat64(staff.Salary) / float64(endDate-startDate+1)
realSalary := expSalary*float64(expDays) + officalSalary*float64(officialDays) - socialInsurence
extra["discount"] = discount
extra["socialInsurence"] = socialInsurence
extra["expDays"] = expDays
extra["officialDays"] = officialDays
extra["expSalary"] = butil.FloatCut(expSalary)
extra["officalSalary"] = butil.FloatCut(officalSalary)
extra["days"] = endDate - startDate + 1
extra["realDays"] = expDays + officialDays
extra["startDate"] = startDate
extra["endDate"] = endDate
extra["officialDate"] = officialDate
extra["entryDate"] = entryDate
extra["isEntryMonth"] = isEntryMonth
extra["isOfficialMonth"] = isOfficialMonth
salary.RealSalary = butil.FloatCut(realSalary)
salary.SocialInsurence = socialInsurence
salary.Extra = goutil.EncodeJSONIndent(extra)
if salary.Id == 0 {
_, err = dao.NewStaffSalaryDao().Create(salary)
} else {
err = dao.NewStaffSalaryDao().Update(salary)
}
if err != nil {
log.Errorf("db error :%s", err.Error())
}
}
}