constvar/const.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
controllers/attendance_controller.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
controllers/request/attendance_request.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
models/attendance_manage.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
models/attendance_rule.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
models/db.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
models/worker.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
router/router.go | ●●●●● 补丁 | 查看 | 原始文档 | 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")