liujiandao
2024-04-22 0f8093693d0cd3b8da71abac95c617aa850f4819
考勤管理
1个文件已添加
7个文件已修改
252 ■■■■■ 已修改文件
constvar/const.go 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/attendance_controller.go 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/request/attendance_request.go 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/attendance_manage.go 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/attendance_rule.go 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/db.go 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/worker.go 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
router/router.go 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
constvar/const.go
@@ -86,3 +86,12 @@
    ResourceTypeDevice ResourceType = iota + 1 // 设备
    ResourceTypeWorker                         // 人员
)
type AttendanceStatus int
const (
    Normal   AttendanceStatus = iota + 1 //正常
    Overtime                             //加班
    Vacation                             //休假
    Abnormal                             //异常
)
controllers/attendance_controller.go
@@ -2,6 +2,7 @@
import (
    "github.com/gin-gonic/gin"
    "github.com/shopspring/decimal"
    "github.com/xuri/excelize/v2"
    "silkserver/constvar"
    "silkserver/controllers/request"
@@ -71,12 +72,31 @@
        }
        am.AddPeople = info.NickName
        am.CreateTime = timex.TimeToString2(time.Now())
        am.Status = constvar.Normal
        attendances = append(attendances, &am)
    }
    for K, _ := range idMap {
        workerIds = append(workerIds, K)
    }
    //查询人员工种
    workers, err := models.NewWorkerSearch().SetIds(workerIds).FindNotTotal()
    if err != nil {
        util.ResponseFormat(c, code.RequestParamError, err)
        return
    }
    for _, attendance := range attendances {
        for _, worker := range workers {
            if attendance.WorkerId == worker.ID {
                attendance.WorkTypeId = worker.WorkTypeId
                break
            }
        }
    }
    //查询加班规则
    rule, _ := models.NewAttendanceRuleSearch().First()
    //查询班次信息
    schedules, err := models.NewShiftScheduleSearch().SetResourceIDs(workerIds).SetResourceType(constvar.ResourceTypeWorker).FindNotTotal()
    if err != nil {
@@ -95,6 +115,11 @@
            }
        }
    }
    var overTime int64 = 0
    hour := decimal.NewFromInt(3600)
    if rule.WeekdayRule == 2 {
        overTime = rule.OverTimeStart.Mul(hour).IntPart()
    }
    for _, attendance := range attendances {
        for _, schedule := range schedules {
            if attendance.WorkerId == schedule.ResourceID {
@@ -104,6 +129,23 @@
                        t := schedule.Shift[0].ShiftTime[0]
                        attendance.ClassesStartTime = t.StartTime
                        attendance.ClassesEndTime = t.EndTime
                        //判断打卡时间
                        t1, _ := timex.StringToClock(attendance.EndWorkTime)
                        t2, _ := timex.StringToClock(t.EndTime)
                        endWork := t1.Unix()
                        endClasses := t2.Unix()
                        if endWork < endClasses {
                            attendance.Status = constvar.Abnormal
                        } else if endWork > endClasses {
                            //判断加班
                            if rule.WeekdayRule == 2 {
                                ot := endWork - endClasses
                                if ot > overTime {
                                    attendance.OverTimeDuration = decimal.NewFromInt(ot).DivRound(hour, 2)
                                    attendance.Status = constvar.Overtime
                                }
                            }
                        }
                    }
                }
                break
@@ -166,3 +208,44 @@
    }
    util.ResponseFormat(c, code.Success, "删除成功")
}
// GetAttendanceRule
//
//    @Tags        考勤管理
//    @Summary    获取加班规则
//    @Produce    application/json
//    @Param         Authorization    header string true "token"
//    @Success    200        {object}    util.Response        "成功"
//    @Router        /api-jl/v1/attendance/getAttendanceRule [get]
func (slf AttendanceController) GetAttendanceRule(c *gin.Context) {
    rule, err := models.NewAttendanceRuleSearch().First()
    if err != nil {
        util.ResponseFormat(c, code.RequestParamError, err)
        return
    }
    util.ResponseFormat(c, code.Success, rule)
}
// SaveAttendanceRule
//
//    @Tags        考勤管理
//    @Summary    保存加班规则
//    @Produce    application/json
//    @Param        object    body        models.AttendanceRule    true    "参数"
//    @Param         Authorization    header string true "token"
//    @Success    200        {object}    util.Response        "成功"
//    @Router        /api-jl/v1/attendance/saveAttendanceRule [post]
func (slf AttendanceController) SaveAttendanceRule(c *gin.Context) {
    var rule models.AttendanceRule
    err := c.BindJSON(&rule)
    if err != nil {
        util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误")
        return
    }
    err = models.NewAttendanceRuleSearch().Save(&rule)
    if err != nil {
        util.ResponseFormat(c, code.RequestParamError, err)
        return
    }
    util.ResponseFormat(c, code.Success, "保存成功")
}
controllers/request/attendance_request.go
@@ -6,5 +6,5 @@
}
type DeleteAttendanceInfo struct {
    Ids []uint `json:"ids"`
    Ids []uint `json:"ids"` //记录id
}
models/attendance_manage.go
@@ -2,7 +2,9 @@
import (
    "fmt"
    "github.com/shopspring/decimal"
    "gorm.io/gorm"
    "silkserver/constvar"
    "silkserver/pkg/mysqlx"
)
@@ -10,21 +12,26 @@
    //AttendanceManage 考勤管理表
    AttendanceManage struct {
        gorm.Model
        Date             string `json:"date" gorm:"type:varchar(255);comment:考勤时间"`
        WorkerId         string `json:"workerId" gorm:"type:varchar(255);comment:人员id"`
        WorkerName       string `json:"workerName" gorm:"type:varchar(255);comment:人员姓名"`
        StartWorkTime    string `json:"startWorkTime" gorm:"type:varchar(255);comment:上班打卡时间"`
        EndWorkTime      string `json:"endWorkTime" gorm:"type:varchar(255);comment:下班打卡时间"`
        Classes          string `json:"classes" gorm:"type:varchar(255);comment:班次"`
        ClassesStartTime string `json:"classesStartTime" gorm:"type:varchar(255);comment:班次开始时间"`
        ClassesEndTime   string `json:"classesEndTime" gorm:"type:varchar(255);comment:班次下班时间"`
        CreateTime       string `json:"createTime" gorm:"type:varchar(255);comment:添加时间"`
        AddPeople        string `json:"addPeople" gorm:"type:varchar(255);comment:添加人"`
        Date             string                    `json:"date" gorm:"type:varchar(255);comment:考勤时间"`
        WorkerId         string                    `json:"workerId" gorm:"type:varchar(255);comment:人员id"`
        WorkerName       string                    `json:"workerName" gorm:"type:varchar(255);comment:人员姓名"`
        StartWorkTime    string                    `json:"startWorkTime" gorm:"type:varchar(255);comment:上班打卡时间"`
        EndWorkTime      string                    `json:"endWorkTime" gorm:"type:varchar(255);comment:下班打卡时间"`
        Classes          string                    `json:"classes" gorm:"type:varchar(255);comment:班次"`
        ClassesStartTime string                    `json:"classesStartTime" gorm:"type:varchar(255);comment:班次开始时间"`
        ClassesEndTime   string                    `json:"classesEndTime" gorm:"type:varchar(255);comment:班次下班时间"`
        CreateTime       string                    `json:"createTime" gorm:"type:varchar(255);comment:添加时间"`
        AddPeople        string                    `json:"addPeople" gorm:"type:varchar(255);comment:添加人"`
        WorkTypeId       uint                      `json:"workTypeId" gorm:"type:int(11);comment:工种id"`
        WorkType         WorkTypeManage            `json:"workType" gorm:"foreignKey:WorkTypeId"`
        Status           constvar.AttendanceStatus `json:"status" gorm:"type:int(11);comment:状态"`
        OverTimeDuration decimal.Decimal           `json:"overTimeDuration" gorm:"type:decimal(20,2);comment:加班时长"`
    }
    AttendanceManageSearch struct {
        AttendanceManage
        PageNum  int
        PageSize int
        Preload  bool
        Ids      []uint
        Orm      *gorm.DB
    }
@@ -53,6 +60,11 @@
    return slf
}
func (slf *AttendanceManageSearch) SetPreload(preload bool) *AttendanceManageSearch {
    slf.Preload = preload
    return slf
}
func (slf *AttendanceManageSearch) build() *gorm.DB {
    var db = slf.Orm.Table(slf.TableName())
@@ -60,6 +72,10 @@
        db = db.Where("id in (?)", slf.Ids)
    }
    if slf.Preload {
        db = db.Model(&AttendanceManage{}).Preload("WorkType")
    }
    return db
}
models/attendance_rule.go
New file
@@ -0,0 +1,105 @@
package models
import (
    "fmt"
    "github.com/shopspring/decimal"
    "gorm.io/gorm"
    "silkserver/pkg/mysqlx"
)
type (
    AttendanceRule struct {
        gorm.Model
        WeekdayRule   int             `json:"weekdayRule" gorm:"type:int(1);default:1;comment:工作日加班规则,1不启用,2启用"`
        OverTimeStart decimal.Decimal `json:"overTimeStart" gorm:"type:decimal(20,3);comment:工作日加班起算时长"`
        RestDayRule   int             `json:"restDayRule" gorm:"type:int(1);default:1;comment:休息日加班规则,1不启用,2启用"`
        RestDayStart  decimal.Decimal `json:"restDayStart" gorm:"type:decimal(20,3);comment:休息日加班起算时长"`
    }
    AttendanceRuleSearch struct {
        AttendanceRule
        Orm *gorm.DB
    }
)
func (slf AttendanceRule) TableName() string {
    return "silk_attendance_rule"
}
func NewAttendanceRuleSearch() *AttendanceRuleSearch {
    return &AttendanceRuleSearch{Orm: mysqlx.GetDB()}
}
func (slf *AttendanceRuleSearch) SetOrm(tx *gorm.DB) *AttendanceRuleSearch {
    slf.Orm = tx
    return slf
}
func (slf *AttendanceRuleSearch) build() *gorm.DB {
    var db = slf.Orm.Table(slf.TableName())
    return db
}
// Create 单条插入
func (slf *AttendanceRuleSearch) Create(record *AttendanceRule) error {
    var db = slf.build()
    if err := db.Create(record).Error; err != nil {
        return fmt.Errorf("create err: %v, record: %+v", err, record)
    }
    return nil
}
func (slf *AttendanceRuleSearch) Save(record *AttendanceRule) error {
    var db = slf.build()
    if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
        return fmt.Errorf("save err: %v, record: %+v", err, record)
    }
    return nil
}
func (slf *AttendanceRuleSearch) Delete() error {
    var db = slf.build()
    if err := db.Unscoped().Delete(&AttendanceRule{}).Error; err != nil {
        return err
    }
    return nil
}
func (slf *AttendanceRuleSearch) First() (*AttendanceRule, error) {
    var (
        record = new(AttendanceRule)
        db     = slf.build()
    )
    if err := db.First(record).Error; err != nil {
        return record, err
    }
    return record, nil
}
// InitDefaultData 初始化数据
func (slf *AttendanceRuleSearch) InitDefaultData() error {
    var (
        rule  AttendanceRule
        total int64
    )
    db := slf.Orm.Table(slf.TableName())
    err := db.Count(&total).Error
    if err != nil {
        return err
    }
    if total > 0 {
        return nil
    }
    rule.WeekdayRule = 1
    rule.RestDayRule = 1
    err = db.Create(&rule).Error
    return err
}
models/db.go
@@ -89,6 +89,7 @@
        SalaryPlan{},
        Mentor{},
        AttendanceManage{},
        AttendanceRule{},
    )
    return err
}
@@ -98,7 +99,9 @@
}
func InsertDefaultData() {
    models := []interface{}{}
    models := []interface{}{
        NewAttendanceRuleSearch(),
    }
    for _, model := range models {
        if id, ok := model.(InitDefaultData); ok {
            if err := id.InitDefaultData(); err != nil {
models/worker.go
@@ -32,6 +32,7 @@
        PageSize int
        Orm      *gorm.DB
        Fields   string
        Ids      []string
    }
)
@@ -93,6 +94,11 @@
    return slf
}
func (slf *WorkerSearch) SetIds(ids []string) *WorkerSearch {
    slf.Ids = ids
    return slf
}
func (slf *WorkerSearch) build() *gorm.DB {
    var db = slf.Orm.Table(slf.TableName())
@@ -129,6 +135,10 @@
        db = db.Select(slf.Fields)
    }
    if len(slf.Ids) > 0 {
        db = db.Where("id in (?)", slf.Ids)
    }
    return db
}
router/router.go
@@ -108,6 +108,8 @@
        attendanceApi.POST("attendanceInput", attendanceController.AttendanceInput)             //考勤导入
        attendanceApi.POST("getAttendanceList", attendanceController.GetAttendanceList)         //获取考勤列表
        attendanceApi.DELETE("deleteAttendanceInfo", attendanceController.DeleteAttendanceInfo) //删除考勤信息
        attendanceApi.GET("getAttendanceRule", attendanceController.GetAttendanceRule)          //获取加班规则
        attendanceApi.POST("saveAttendanceRule", attendanceController.SaveAttendanceRule)       //保存加班规则
    }
    mentorApi := r.Group(urlPrefix + "/mentor")