From 0f8093693d0cd3b8da71abac95c617aa850f4819 Mon Sep 17 00:00:00 2001
From: liujiandao <274878379@qq.com>
Date: 星期一, 22 四月 2024 15:44:55 +0800
Subject: [PATCH] 考勤管理

---
 controllers/attendance_controller.go |   83 +++++++++++++++++++++++++++++++++++++++++
 1 files changed, 83 insertions(+), 0 deletions(-)

diff --git a/controllers/attendance_controller.go b/controllers/attendance_controller.go
index 117131c..6a88958 100644
--- a/controllers/attendance_controller.go
+++ b/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, "鍙傛暟瑙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