From 85faccc42c06891840a322e748a413a07a018f8f Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期二, 07 五月 2024 11:53:41 +0800 Subject: [PATCH] 工人,工种软删除 --- controllers/attendance_controller.go | 255 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 254 insertions(+), 1 deletions(-) diff --git a/controllers/attendance_controller.go b/controllers/attendance_controller.go index 117131c..984b09a 100644 --- a/controllers/attendance_controller.go +++ b/controllers/attendance_controller.go @@ -2,19 +2,45 @@ import ( "github.com/gin-gonic/gin" + "github.com/shopspring/decimal" "github.com/xuri/excelize/v2" "silkserver/constvar" "silkserver/controllers/request" + "silkserver/controllers/response" "silkserver/extend/code" "silkserver/extend/util" "silkserver/middleware" "silkserver/models" "silkserver/pkg/logx" + "silkserver/pkg/structx" "silkserver/pkg/timex" "time" ) type AttendanceController struct { +} + +// GetTemplate +// @Tags 鑰冨嫟绠$悊 +// @Summary 鑾峰彇妯$増鍒楄〃 +// @Produce application/json +// @Param object body request.TemplateCategoryRequest true "鍙傛暟" +// @Success 200 {object} util.Response "鎴愬姛" +// @Router /api-jl/v1/attendance/getTemplate [post] +func (slf AttendanceController) GetTemplate(c *gin.Context) { + var params request.TemplateCategoryRequest + if err := c.ShouldBind(¶ms); err != nil { + util.ResponseFormat(c, code.RequestParamError, err.Error()) + return + } + + list, err := models.NewFileTemplateAttachmentSearch().SetCategory(params.Category).Find() + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘澶辫触") + return + } + + util.ResponseFormat(c, code.Success, list) } // AttendanceInput @@ -71,12 +97,32 @@ } 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 + attendance.PhoneNum = worker.PhoneNum + break + } + } + } + + //鏌ヨ鍔犵彮瑙勫垯 + rule, _ := models.NewAttendanceRuleSearch().First() + //鏌ヨ鐝淇℃伅 schedules, err := models.NewShiftScheduleSearch().SetResourceIDs(workerIds).SetResourceType(constvar.ResourceTypeWorker).FindNotTotal() if err != nil { @@ -95,6 +141,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 +155,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 @@ -135,12 +203,156 @@ util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�") return } - manages, total, err := models.NewAttendanceManageSearch().SetPage(params.Page, params.PageSize).Find() + manages, total, err := models.NewAttendanceManageSearch().SetPage(params.Page, params.PageSize).SetOrder("created_at desc").Find() if err != nil { util.ResponseFormat(c, code.RequestParamError, err) return } util.ResponseFormatList(c, code.Success, manages, total) +} + +// UpdateAttendance +// +// @Tags 鑰冨嫟绠$悊 +// @Summary 鏇存柊鑰冨嫟 +// @Produce application/json +// @Param object body request.UpdateAttendance true "鍙傛暟" +// @Param Authorization header string true "token" +// @Success 200 {object} util.Response "鎴愬姛" +// @Router /api-jl/v1/attendance/updateAttendance [post] +func (slf AttendanceController) UpdateAttendance(c *gin.Context) { + var params request.UpdateAttendance + err := c.BindJSON(¶ms) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�") + return + } + if params.Date == "" || params.WorkerId == "" { + util.ResponseFormat(c, code.RequestParamError, "浜哄憳id鍜岃�冨嫟鏃ユ湡涓嶈兘涓虹┖") + return + } + count, err := models.NewAttendanceManageSearch().SetDate(params.Date).SetWorkerId(params.WorkerId).Count() + if err != nil { + util.ResponseFormat(c, code.RequestParamError, err) + return + } + if count > 0 { + m := make(map[string]interface{}) + m["status"] = params.Status + m["over_time_duration"] = params.OverTimeDuration + err = models.NewAttendanceManageSearch().SetDate(params.Date).SetWorkerId(params.WorkerId).UpdateByMap(m) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鏇存柊澶辫触") + return + } + } else { + var manage models.AttendanceManage + err = structx.AssignTo(params, &manage) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鏁版嵁杞崲澶辫触") + return + } + info := middleware.GetUserInfo(c) + manage.AddPeople = info.NickName + manage.CreateTime = timex.TimeToString2(time.Now()) + err = models.NewAttendanceManageSearch().Create(&manage) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鏇存柊澶辫触") + return + } + } + + util.ResponseFormat(c, code.Success, "鏇存柊鎴愬姛") +} + +// GetAttendanceStatistic +// +// @Tags 鑰冨嫟绠$悊 +// @Summary 鑾峰彇鑰冨嫟缁熻 +// @Produce application/json +// @Param object body request.GetAttendanceStatistic true "鍙傛暟" +// @Param Authorization header string true "token" +// @Success 200 {object} util.Response{data=response.AttendanceList} "鎴愬姛" +// @Router /api-jl/v1/attendance/getAttendanceStatistic [post] +func (slf AttendanceController) GetAttendanceStatistic(c *gin.Context) { + var params request.GetAttendanceStatistic + err := c.BindJSON(¶ms) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�") + return + } + if params.Month == "" { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟涓嶈兘涓虹┖") + return + } + //鑾峰彇鏈堜唤澶╂暟 + location, err := time.ParseInLocation("2006-01", params.Month, time.Local) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鏈堜唤鏍煎紡閿欒") + return + } + year, month, _ := location.Date() + weeks := timex.GetWeeksOfMonth(year, month) + + manages, err := models.NewAttendanceManageSearch().SetMonth(params.Month).SetKeyword(params.Keyword).SetPreload(true).FindNotTotal() + if err != nil { + util.ResponseFormat(c, code.RequestParamError, err) + return + } + weekMap := map[string]string{ + "Sunday": "鍛ㄦ棩", + "Monday": "鍛ㄤ竴", + "Tuesday": "鍛ㄤ簩", + "Wednesday": "鍛ㄤ笁", + "Thursday": "鍛ㄥ洓", + "Friday": "鍛ㄤ簲", + "Saturday": "鍛ㄥ叚", + } + + m := make(map[string]response.AttendanceStatistic) + for _, manage := range manages { + var as response.AttendanceStatistic + if _, ok := m[manage.WorkerId]; ok { + as = m[manage.WorkerId] + } else { + as.WorkerId = manage.WorkerId + as.WorkerName = manage.WorkerName + as.WorkType = manage.WorkType.WorkName + as.Month = params.Month + as.WorkTypeId = manage.WorkTypeId + var details []response.AttendanceDetail + for _, week := range weeks { + for _, day := range week { + var ad response.AttendanceDetail + ad.Date = day.Day() + ad.WeekDay = weekMap[day.Weekday().String()] + ad.Status = constvar.Vacation + details = append(details, ad) + } + } + as.Details = details + } + as.WeekdayOverTime = as.WeekdayOverTime.Add(manage.OverTimeDuration) + as.ActualAttendanceDays = as.ActualAttendanceDays + 1 + time2, _ := timex.StringToTime2(manage.Date) + day := time2.Day() + detail := as.Details[day-1] + detail.Status = manage.Status + detail.StartWorkTime = manage.StartWorkTime + detail.EndWorkTime = manage.EndWorkTime + detail.ClassesStartTime = manage.ClassesStartTime + detail.ClassesEndTime = manage.ClassesEndTime + detail.Classes = manage.Classes + as.Details[day-1] = detail + + m[manage.WorkerId] = as + } + var list response.AttendanceList + for _, statistic := range m { + list.List = append(list.List, statistic) + } + + util.ResponseFormat(c, code.Success, list) } // DeleteAttendanceInfo @@ -166,3 +378,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, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�") + return + } + err = models.NewAttendanceRuleSearch().Save(&rule) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, err) + return + } + util.ResponseFormat(c, code.Success, "淇濆瓨鎴愬姛") +} -- Gitblit v1.8.0