zoie 2 жил өмнө
parent
commit
3113d31985

+ 11 - 0
Nats/NatsServer/NatsERP_user.go

@@ -21,6 +21,17 @@ func Verification(GetCookie string, GetString string) (user userlibs.User, err e
 
 }
 
+func Read_User_List_All() (user []userlibs.User, err error) {
+	nats := natslibs.NewNats(Nats.Nats)
+	user, err = nats.Read_User_List_All()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return user, err
+	}
+	return user, nil
+
+}
+
 // 添加系统日志
 func AddSysLogs(T_class, T_title string, T_txt interface{}) {
 	nats := natslibs.NewNats(Nats.Nats)

+ 348 - 0
controllers/Overtime.go

@@ -0,0 +1,348 @@
+package controllers
+
+import (
+	"ERP_ams/Nats/NatsServer"
+	"ERP_ams/conf"
+	"ERP_ams/models/Account"
+	"ERP_ams/models/Attendance"
+	userlibs "git.baozhida.cn/ERP_libs/User"
+	"git.baozhida.cn/ERP_libs/lib"
+	beego "github.com/beego/beego/v2/server/web"
+	"math"
+	"strconv"
+	"time"
+)
+
+type OvertimeController struct {
+	beego.Controller
+	User userlibs.User
+}
+
+func (c *OvertimeController) Prepare() {
+	c.User = *Account.User_r
+}
+
+// 管理员加班审批列表 只显示待审核
+func (c *OvertimeController) Overtime_List() {
+	var r_jsons lib.R_JSONS
+
+	page, _ := c.GetInt("page")
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+	// 年月 2023-01
+	T_month := c.GetString("T_month")
+
+	if len(T_month) > 0 {
+		_, err := time.Parse("2006-01", T_month)
+		if err != nil {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "日期格式错误!"}
+			c.ServeJSON()
+			return
+		}
+	}
+
+	userList, _ := NatsServer.Read_User_List_All()
+	Account.Read_User_All_Map(userList)
+	r_jsons.Data, r_jsons.Num = Attendance.Read_Attendance_List("", c.User.T_uuid, T_month, 1, Attendance.AttendanceWaitAudit, page, page_z)
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+
+func (c *OvertimeController) Overtime_User_List() {
+	var r_jsons lib.R_JSONS
+
+	page, _ := c.GetInt("page")
+
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+
+	T_uuid := c.GetString("T_uuid")
+	if len(T_uuid) == 0 {
+		T_uuid = c.User.T_uuid
+	}
+	// 年月 2023-01
+	T_month := c.GetString("T_month")
+	if len(T_month) > 0 {
+		_, err := time.Parse("2006-01", T_month)
+		if err != nil {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "日期格式错误!"}
+			c.ServeJSON()
+			return
+		}
+	}
+	r_jsons.Data, r_jsons.Num = Attendance.Read_Attendance_List(T_uuid, "", T_month, 1, 0, page, page_z)
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+
+func (c *OvertimeController) Overtime_Add() {
+	T_start_time := c.GetString("T_start_time")
+	T_start_prove := c.GetString("T_start_prove")
+	T_end_time := c.GetString("T_end_time")
+	T_end_prove := c.GetString("T_end_prove")
+	T_duration, _ := c.GetInt("T_duration")
+	T_text := c.GetString("T_text")
+	T_approver := c.GetString("T_approver")
+	startTime, is := lib.TimeStrToTime(T_start_time)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式不正确"}
+		c.ServeJSON()
+		return
+	}
+	endTime, is := lib.TimeStrToTime(T_end_time)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式不正确"}
+		c.ServeJSON()
+		return
+	}
+	var_ := Attendance.Attendance{
+		T_uid:         c.User.T_uuid,
+		T_type:        Attendance.AttendanceOvertime,
+		T_start_time:  startTime,
+		T_start_prove: T_start_prove,
+		T_end_time:    endTime,
+		T_end_prove:   T_end_prove,
+		T_duration:    T_duration,
+		T_text:        T_text,
+		T_approver:    T_approver,
+		T_State:       Attendance.AttendanceWaitAudit,
+	}
+
+	_, err := Attendance.Add_Attendance(var_)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "我的加班", "添加", var_)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: var_.Id}
+	c.ServeJSON()
+	return
+}
+
+func (c *OvertimeController) Overtime_Update() {
+	T_id, _ := c.GetInt("T_id")
+	T_type, _ := c.GetInt("T_type")
+	T_start_time := c.GetString("T_start_time")
+	T_start_prove := c.GetString("T_start_prove")
+	T_end_time := c.GetString("T_end_time")
+	T_end_prove := c.GetString("T_end_prove")
+	T_duration, _ := c.GetInt("T_duration")
+	T_text := c.GetString("T_text")
+	T_approver := c.GetString("T_approver")
+
+	leave, err := Attendance.Read_Attendance_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	if leave.T_State == Attendance.AttendancePass {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "无权修改!"}
+		c.ServeJSON()
+		return
+	}
+
+	if T_type > 0 {
+		leave.T_type = T_type
+	}
+
+	if len(T_start_time) > 0 {
+		startTime, is := lib.TimeStrToTime(T_start_time)
+		if !is {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式不正确"}
+			c.ServeJSON()
+			return
+		}
+		leave.T_start_time = startTime
+
+	}
+	if len(T_start_prove) > 0 {
+		leave.T_start_prove = T_start_prove
+	}
+
+	if len(T_end_time) > 0 {
+		endTime, is := lib.TimeStrToTime(T_end_time)
+		if !is {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式不正确"}
+			c.ServeJSON()
+			return
+		}
+		leave.T_end_time = endTime
+	}
+	if len(T_end_prove) > 0 {
+		leave.T_end_prove = T_end_prove
+	}
+
+	if T_duration > 0 {
+		leave.T_duration = T_duration
+	}
+
+	if len(T_text) > 0 {
+		leave.T_text = T_text
+	}
+	if len(T_approver) > 0 {
+		leave.T_approver = T_approver
+	}
+	leave.T_State = Attendance.AttendanceWaitAudit
+
+	_, err = Attendance.Update_Attendance(leave, "T_type", "T_start_time", "T_start_prove", "T_end_time", "T_end_prove", "T_duration", "T_text", "T_approver", "T_State")
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "我的加班", "修改", leave)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_id}
+	c.ServeJSON()
+	return
+}
+
+// 审批
+func (c *OvertimeController) Overtime_Approval() {
+	T_id, _ := c.GetInt("T_id")
+	T_State, _ := c.GetInt("T_State")
+	leave, err := Attendance.Read_Attendance_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	if leave.T_approver != c.User.T_uuid {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "无权操作!"}
+		c.ServeJSON()
+		return
+	}
+
+	if T_State == 1 {
+		leave.T_State = Attendance.AttendancePass
+	}
+
+	if T_State == 0 {
+		leave.T_State = Attendance.AttendanceNotPass
+	}
+
+	id, err := Attendance.Update_Attendance(leave, "T_State")
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "加班审批", "审批", leave)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: id}
+	c.ServeJSON()
+	return
+}
+
+// 删除加班
+func (c *OvertimeController) Overtime_Del() {
+	T_id, _ := c.GetInt("T_id")
+
+	leave, err := Attendance.Read_Attendance_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	if leave.T_State == Attendance.AttendancePass {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "无权删除!"}
+		c.ServeJSON()
+		return
+	}
+
+	id, err := Attendance.Delete_Attendance(leave)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "我的加班", "删除", strconv.Itoa(T_id))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: id}
+	c.ServeJSON()
+	return
+}
+
+// 加班统计
+func (c *OvertimeController) Overtime_Stat() {
+	page, _ := c.GetInt("page")
+
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+	// 年月 2023-01
+	T_month := c.GetString("T_month")
+	if len(T_month) > 0 {
+		_, err := time.Parse("2006-01", T_month)
+		if err != nil {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "日期格式错误!"}
+			c.ServeJSON()
+			return
+		}
+	}
+
+	attendance, cnt := Attendance.Read_Attendance_List_For_Stat(c.User.T_uuid, T_month, page, page_z)
+
+	var duration int
+	for i := 0; i < len(attendance); i++ {
+		if attendance[i].T_type == Attendance.AttendanceDaysOff || attendance[i].T_type == Attendance.AttendanceShiftPerf {
+			duration -= attendance[i].T_duration
+		} else {
+			duration += attendance[i].T_duration
+		}
+
+		attendance[i].RemainingTime = duration
+	}
+
+	type R_JSONS struct {
+		//必须的大写开头
+		Data          interface{}
+		RemainingTime int
+		Num           int64
+		Page          int
+		Page_size     int
+	}
+
+	var r_jsons R_JSONS
+	r_jsons.Num = cnt
+	r_jsons.RemainingTime = duration
+	r_jsons.Data = attendance
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}

+ 315 - 0
controllers/leave.go

@@ -0,0 +1,315 @@
+package controllers
+
+import (
+	"ERP_ams/Nats/NatsServer"
+	"ERP_ams/conf"
+	"ERP_ams/models/Account"
+	"ERP_ams/models/Attendance"
+	userlibs "git.baozhida.cn/ERP_libs/User"
+	"git.baozhida.cn/ERP_libs/lib"
+	beego "github.com/beego/beego/v2/server/web"
+	"math"
+	"strconv"
+	"time"
+)
+
+type LeaveController struct {
+	beego.Controller
+	User userlibs.User
+}
+
+func (c *LeaveController) Prepare() {
+	c.User = *Account.User_r
+}
+
+// 管理员请假审批列表 只显示待审核
+func (c *LeaveController) Leave_List() {
+	var r_jsons lib.R_JSONS
+
+	page, _ := c.GetInt("page")
+
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+	// 年月 2023-01
+	T_month := c.GetString("T_month")
+	if len(T_month) > 0 {
+		_, err := time.Parse("2006-01", T_month)
+		if err != nil {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "日期格式错误!"}
+			c.ServeJSON()
+			return
+		}
+	}
+
+	userList, _ := NatsServer.Read_User_List_All()
+	Account.Read_User_All_Map(userList)
+	r_jsons.Data, r_jsons.Num = Attendance.Read_Attendance_List("", c.User.T_uuid, T_month, 0, Attendance.AttendanceWaitAudit, page, page_z)
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+
+func (c *LeaveController) Leave_User_List() {
+	var r_jsons lib.R_JSONS
+
+	page, _ := c.GetInt("page")
+
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+	T_uuid := c.GetString("T_uuid")
+	if len(T_uuid) == 0 {
+		T_uuid = c.User.T_uuid
+	}
+	// 年月 2023-01
+	T_month := c.GetString("T_month")
+
+	if len(T_month) > 0 {
+		_, err := time.Parse("2006-01", T_month)
+		if err != nil {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "日期格式错误!"}
+			c.ServeJSON()
+			return
+		}
+	}
+
+	r_jsons.Data, r_jsons.Num = Attendance.Read_Attendance_List(T_uuid, "", T_month, 0, 0, page, page_z)
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+
+func (c *LeaveController) Leave_Type_List() {
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Attendance.Read_AttendanceType_All()}
+	c.ServeJSON()
+	return
+}
+
+func (c *LeaveController) Leave_Add() {
+	T_type, _ := c.GetInt("T_type")
+	T_start_time := c.GetString("T_start_time")
+	T_end_time := c.GetString("T_end_time")
+	T_duration, _ := c.GetInt("T_duration")
+	T_text := c.GetString("T_text")
+	T_approver := c.GetString("T_approver")
+	startTime, is := lib.TimeStrToTime(T_start_time)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式不正确"}
+		c.ServeJSON()
+		return
+	}
+	endTime, is := lib.TimeStrToTime(T_end_time)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式不正确"}
+		c.ServeJSON()
+		return
+	}
+	var_ := Attendance.Attendance{
+		T_uid:        c.User.T_uuid,
+		T_type:       T_type,
+		T_start_time: startTime,
+		T_end_time:   endTime,
+		T_duration:   T_duration,
+		T_text:       T_text,
+		T_approver:   T_approver,
+		T_State:      Attendance.AttendanceWaitAudit,
+	}
+
+	Id, err := Attendance.Add_Attendance(var_)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "我的请假", "添加", var_)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Id}
+	c.ServeJSON()
+	return
+}
+
+// 扣除
+func (c *LeaveController) Leave_Deduct() {
+	T_type, _ := c.GetInt("T_type")
+	T_duration, _ := c.GetInt("T_duration")
+	T_text := c.GetString("T_text")
+	T_uuid := c.GetString("T_uuid")
+
+	var_ := Attendance.Attendance{
+		T_uid:      T_uuid,
+		T_type:     T_type,
+		T_duration: T_duration,
+		T_text:     T_text,
+		T_approver: c.User.T_uuid,
+		T_State:    Attendance.AttendancePass,
+	}
+
+	Id, err := Attendance.Add_Attendance(var_)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "我的请假", "扣除", var_)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Id}
+	c.ServeJSON()
+	return
+}
+
+func (c *LeaveController) Leave_Update() {
+	T_id, _ := c.GetInt("T_id")
+	T_type, _ := c.GetInt("T_type")
+	T_start_time := c.GetString("T_start_time")
+	T_end_time := c.GetString("T_end_time")
+	T_duration, _ := c.GetInt("T_duration")
+	T_text := c.GetString("T_text")
+	T_approver := c.GetString("T_approver")
+
+	leave, err := Attendance.Read_Attendance_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	if leave.T_State == Attendance.AttendancePass {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "无权修改!"}
+		c.ServeJSON()
+		return
+	}
+
+	if T_type > 0 {
+		leave.T_type = T_type
+	}
+
+	if len(T_start_time) > 0 {
+		startTime, is := lib.TimeStrToTime(T_start_time)
+		if !is {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式不正确"}
+			c.ServeJSON()
+			return
+		}
+		leave.T_start_time = startTime
+
+	}
+	if len(T_end_time) > 0 {
+		endTime, is := lib.TimeStrToTime(T_end_time)
+		if !is {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式不正确"}
+			c.ServeJSON()
+			return
+		}
+		leave.T_end_time = endTime
+	}
+
+	if T_duration > 0 {
+		leave.T_duration = T_duration
+	}
+
+	if len(T_text) > 0 {
+		leave.T_text = T_text
+	}
+	if len(T_approver) > 0 {
+		leave.T_approver = T_approver
+	}
+	leave.T_State = Attendance.AttendanceWaitAudit
+
+	_, err = Attendance.Update_Attendance(leave, "T_type", "T_start_time", "T_end_time", "T_duration", "T_text", "T_approver", "T_State")
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "我的请假", "修改", leave)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_id}
+	c.ServeJSON()
+	return
+}
+
+func (c *LeaveController) Leave_Approval() {
+	T_id, _ := c.GetInt("T_id")
+	T_State, _ := c.GetInt("T_State")
+	leave, err := Attendance.Read_Attendance_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	if leave.T_approver != c.User.T_uuid {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "无权操作!"}
+		c.ServeJSON()
+		return
+	}
+
+	if T_State == 1 {
+		leave.T_State = Attendance.AttendancePass
+	}
+
+	if T_State == 0 {
+		leave.T_State = Attendance.AttendanceNotPass
+	}
+
+	id, err := Attendance.Update_Attendance(leave, "T_State")
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "我的请假", "审批", leave)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: id}
+	c.ServeJSON()
+	return
+}
+
+func (c *LeaveController) Leave_Del() {
+	T_id, _ := c.GetInt("T_id")
+
+	leave, err := Attendance.Read_Attendance_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	if leave.T_State == Attendance.AttendancePass {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "无权删除!"}
+		c.ServeJSON()
+		return
+	}
+
+	id, err := Attendance.Delete_Attendance(leave)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "我的请假", "删除", strconv.Itoa(T_id))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: id}
+	c.ServeJSON()
+	return
+}

+ 41 - 0
main.go

@@ -3,11 +3,14 @@ package main
 import (
 	_ "ERP_ams/Nats"
 	"ERP_ams/conf"
+	"ERP_ams/logs"
 	_ "ERP_ams/models/Account"
+	"ERP_ams/models/Attendance"
 	_ "ERP_ams/routers"
 	"fmt"
 	"github.com/beego/beego/v2/adapter/orm"
 	beego "github.com/beego/beego/v2/server/web"
+	"github.com/beego/beego/v2/server/web/context"
 	"github.com/beego/beego/v2/server/web/filter/cors"
 	_ "github.com/go-sql-driver/mysql"
 	"runtime"
@@ -48,7 +51,45 @@ func main() {
 	beego.BConfig.ServerName = appname           //server  名称
 	beego.BConfig.RunMode = "dev"                //  应用的运行模式
 	beego.BConfig.Listen.HTTPPort = HTTPPort_int //监听端口  本地:8518  线上:8528
+	beego.BConfig.WebConfig.AutoRender = false
+	beego.BConfig.RecoverPanic = true
+	beego.BConfig.RecoverFunc = RecoverPanic
+
+	go Attendance.Read_AttendanceType_All() // 初始化请假类型
 
 	beego.Run()
 
 }
+
+func RecoverPanic(ctx *context.Context, config *beego.Config) {
+	if err := recover(); err != nil {
+		ctx.ResponseWriter.Header().Set("Access-Control-Allow-Origin", ctx.Request.Header.Get("Origin"))
+		var stack []string
+		for i := 1; ; i++ {
+			_, file, line, ok := runtime.Caller(i)
+			if !ok {
+				break
+			}
+			logs.Error(fmt.Sprintf("%s:%d", file, line))
+			stack = append(stack, fmt.Sprintln(fmt.Sprintf("%s:%d", file, line)))
+		}
+		//显示错误
+		data := map[string]interface{}{
+			"ret":           4000,
+			"AppError":      fmt.Sprintf("%v", err),
+			"RequestMethod": ctx.Input.Method(),
+			"RequestURL":    ctx.Input.URI(),
+			"RemoteAddr":    ctx.Input.IP(),
+			"Stack":         stack,
+			"GoVersion":     runtime.Version(),
+			"Code":          500,
+			"Msg":           "请稍后重试!",
+		}
+		_ = ctx.Output.JSON(data, true, true)
+		//if ctx.Output.Status != 0 {
+		//	ctx.ResponseWriter.WriteHeader(ctx.Output.Status)
+		//} else {
+		//	ctx.ResponseWriter.WriteHeader(500)
+		//}
+	}
+}

+ 25 - 1
models/Account/User.go

@@ -1,5 +1,29 @@
 package Account
 
-import userlibs "git.baozhida.cn/ERP_libs/User"
+import (
+	userlibs "git.baozhida.cn/ERP_libs/User"
+	"sync"
+)
 
 var User_r *userlibs.User
+
+var AdminMap *sync.Map // 泛型
+
+func init() {
+	AdminMap = new(sync.Map)
+}
+
+func Read_User_All_Map(A []userlibs.User) {
+	for _, v := range A {
+		AdminMap.Store(v.T_uuid, v)
+	}
+}
+
+func Read_User_T_name_Get(T_uuid string) string {
+	v, ok := AdminMap.Load(T_uuid)
+	if ok {
+		return v.(userlibs.User).T_name
+	} else {
+		return ""
+	}
+}

+ 263 - 0
models/Attendance/Attendance.go

@@ -0,0 +1,263 @@
+package Attendance
+
+import (
+	"ERP_ams/logs"
+	"ERP_ams/models/Account"
+	"fmt"
+	"git.baozhida.cn/ERP_libs/lib"
+	"github.com/beego/beego/v2/adapter/orm"
+	orm2 "github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+const (
+	AttendanceDelete = iota
+	AttendancePass
+	AttendanceNotPass
+	AttendanceWaitAudit
+)
+
+// 考勤
+type Attendance struct {
+	Id            int       `orm:"column(ID);size(11);auto;pk"`
+	T_uid         string    `orm:"index;size(32);null"`   // 用户uuid
+	T_type        int       `orm:"size(200);default(0)"`  // 加班类型  加班
+	T_start_time  time.Time `orm:"type(timestamp);null;"` // 开始时间
+	T_start_prove string    `orm:"size(200);null;"`       // 开始证明
+	T_end_time    time.Time `orm:"type(timestamp);null;"` // 结束时间
+	T_end_prove   string    `orm:"size(200);null;"`       // 开始证明
+	T_duration    int       `orm:"size(8);null"`          // 加班时长
+	T_text        string    `orm:"type(text);null"`       // 请假内容
+	T_approver    string    `orm:"size(32);null"`         // 审批人
+
+	T_State    int       `orm:"size(2);default(2)"`                                    // 0 删除  1 通过  2 未通过  3 待审核
+	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
+	UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
+}
+
+func (t *Attendance) TableName() string {
+	return "attendance"
+}
+
+func init() {
+	//注册模型
+	orm2.Debug = true
+	orm.RegisterModel(new(Attendance))
+}
+
+type Attendance_R struct {
+	Id              int
+	T_uid           string
+	T_user_name     string
+	T_type          int
+	T_type_name     string
+	T_start_time    string
+	T_start_prove   string
+	T_end_time      string
+	T_end_prove     string
+	T_duration      int
+	T_text          string
+	T_approver      string // 审批人uuid
+	T_approver_name string // 审批人名称
+	T_State         int
+	UpdateTime      string
+}
+
+type Attendance_S struct {
+	Id              int
+	T_type          int
+	T_type_name     string
+	T_duration      int
+	T_text          string
+	T_approver      string // 审批人uuid
+	T_approver_name string // 审批人名称
+	T_State         int
+	RemainingTime   int // 剩余时长
+	UpdateTime      string
+}
+
+// ---------------- 特殊方法 -------------------
+func AttendanceToAttendance_R(t Attendance) (r Attendance_R) {
+	r.Id = t.Id
+	r.T_uid = t.T_uid
+	r.T_type = t.T_type
+	r.T_type_name = Read_AttendanceType_Get(t.T_type)
+	r.T_user_name = Account.Read_User_T_name_Get(t.T_uid)
+	r.T_start_time = t.T_start_time.Format("2006-01-02 15:04:05")
+	r.T_start_prove = t.T_start_prove
+	r.T_end_time = t.T_end_time.Format("2006-01-02 15:04:05")
+	r.T_end_prove = t.T_end_prove
+	r.T_duration = t.T_duration
+	r.T_text = t.T_text
+	r.T_approver = t.T_approver
+	r.T_approver_name = Account.Read_User_T_name_Get(t.T_approver)
+	r.T_State = t.T_State
+	r.UpdateTime = t.UpdateTime.Format("2006-01-02 15:04:05")
+	return r
+}
+
+func AttendanceToAttendance_S(t Attendance) (r Attendance_S) {
+	r.Id = t.Id
+	r.T_type = t.T_type
+	r.T_type_name = Read_AttendanceType_Get(t.T_type)
+	r.T_duration = t.T_duration
+	r.T_text = t.T_text
+	r.T_approver = t.T_approver
+	r.T_approver_name = Account.Read_User_T_name_Get(t.T_approver)
+	r.T_State = t.T_State
+	r.UpdateTime = t.UpdateTime.Format("2006-01-02 15:04:05")
+	return r
+}
+
+// 获取 ById
+func Read_Attendance_ById(id int) (r Attendance, err error) {
+	o := orm.NewOrm()
+	r = Attendance{Id: id}
+	err = o.Read(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return r, err
+	}
+	return r, err
+}
+
+// 添加
+func Add_Attendance(m Attendance) (id int64, err error) {
+	o := orm.NewOrm()
+	id, err = o.Insert(&m)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+	return
+}
+
+// 修改
+func Update_Attendance(m Attendance, cols ...string) (id int64, err error) {
+	o := orm.NewOrm()
+	id, err = o.Update(&m, cols...)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+	fmt.Println("Number of records updated in database:", id)
+	return id, nil
+}
+
+// 删除
+func Delete_Attendance(m Attendance) (id int64, err error) {
+
+	o := orm.NewOrm()
+	m.T_State = 0
+	id, err = o.Update(&m, "T_State")
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+	fmt.Println("Number of records updated in database:", id)
+	return id, nil
+}
+
+// 获取列表
+func Read_Attendance_List(T_uid, T_approver, T_month string, T_overtime, T_state, page, page_z int) (r []Attendance_R, cnt int64) {
+
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+	var map_r []Attendance
+	qs := o.QueryTable(new(Attendance))
+	var offset int64
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+
+	cond := orm.NewCondition()
+	cond = cond.And("T_State__gt", AttendanceDelete)
+	if len(T_uid) > 0 {
+		cond = cond.And("T_uid", T_uid)
+	}
+	if len(T_approver) > 0 {
+		cond = cond.And("T_approver", T_approver)
+	}
+	if T_state > 0 {
+		cond = cond.And("T_State", T_state)
+	}
+
+	if len(T_month) == 0 {
+		T_month = time.Now().Format("2006-01")
+	}
+	if T_overtime == 1 {
+		cond = cond.And("T_type", AttendanceOvertime)
+
+	}
+	cond = cond.And("T_end_time__startswith", T_month)
+	var err error
+	if page_z == 9999 {
+		_, err = qs.SetCond((*orm2.Condition)(cond)).OrderBy("-Id").All(&map_r)
+	} else {
+		_, err = qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond)).OrderBy("-Id").All(&map_r)
+	}
+
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+	cnt, err = qs.SetCond((*orm2.Condition)(cond)).Count()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	for _, v := range map_r {
+		r = append(r, AttendanceToAttendance_R(v))
+	}
+
+	return r, cnt
+
+}
+
+// 获取列表
+func Read_Attendance_List_For_Stat(T_uid, T_month string, page, page_z int) (r []Attendance_S, cnt int64) {
+
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+	var map_r []Attendance
+	qs := o.QueryTable(new(Attendance))
+
+	var offset int64
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+
+	var T_type_list = []int{AttendanceOvertime, AttendanceDaysOff, AttendanceShiftPerf}
+
+	cond := orm.NewCondition()
+	cond = cond.And("T_State__gt", AttendanceDelete).And("T_uid", T_uid).And("T_State", AttendancePass).And("T_type__in", T_type_list)
+
+	if len(T_month) == 0 {
+		T_month = time.Now().Format("2006-01")
+	}
+	cond = cond.And("T_end_time__startswith", T_month)
+
+	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond)).OrderBy("Id").All(&map_r)
+
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+	cnt, err = qs.SetCond((*orm2.Condition)(cond)).Count()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	for _, v := range map_r {
+		r = append(r, AttendanceToAttendance_S(v))
+	}
+
+	return r, cnt
+
+}

+ 50 - 0
models/Attendance/AttendanceType.go

@@ -0,0 +1,50 @@
+package Attendance
+
+const (
+	AttendanceOvertime  = iota // 0 加班
+	AttendanceSick             // 1 病假
+	AttendancePersonal         // 2 事假
+	AttendanceDaysOff          // 3 调休
+	AttendanceAnnual           // 4 年假
+	AttendanceShiftPerf        // 5 转绩效
+)
+
+// 请假类型
+type AttendanceType struct {
+	Id     int
+	T_name string
+}
+
+var AttendanceType_list = map[int]string{
+	AttendanceOvertime:  "加班",
+	AttendanceSick:      "病假",
+	AttendancePersonal:  "事假",
+	AttendanceDaysOff:   "调休",
+	AttendanceAnnual:    "年假",
+	AttendanceShiftPerf: "转绩效",
+}
+
+// 获取全部
+func Read_AttendanceType_Get(id int) string {
+	v, ok := AttendanceType_list[id]
+	if ok {
+		return v
+	} else {
+		return "未知类型"
+	}
+}
+
+// 获取全部
+func Read_AttendanceType_All() (r []AttendanceType) {
+
+	for k, v := range AttendanceType_list {
+		if k == AttendanceOvertime {
+			continue
+		}
+		r = append(r, AttendanceType{
+			Id:     k,
+			T_name: v,
+		})
+	}
+	return r
+}

+ 25 - 0
routers/Leave.go

@@ -0,0 +1,25 @@
+package routers
+
+import (
+	"ERP_ams/controllers"
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func init() {
+	ns := beego.NewNamespace("/Leave",
+		beego.NSRouter("/List", &controllers.LeaveController{}, "*:Leave_List"),           // 请假列表
+		beego.NSRouter("/User_list", &controllers.LeaveController{}, "*:Leave_User_List"), // 获取请假
+		beego.NSRouter("/Add", &controllers.LeaveController{}, "*:Leave_Add"),             // 添加请假
+		beego.NSRouter("/Deduct", &controllers.LeaveController{}, "*:Leave_Deduct"),       // 扣除
+		beego.NSRouter("/Edit", &controllers.LeaveController{}, "*:Leave_Update"),         // 修改请假
+		beego.NSRouter("/Approval", &controllers.LeaveController{}, "*:Leave_Approval"),   // 请假审批
+		beego.NSRouter("/Del", &controllers.LeaveController{}, "*:Leave_Del"),             // 删除请假
+
+	)
+	// 请假类型
+	ns_tp := beego.NewNamespace("/LeaveType",
+		beego.NSRouter("/List", &controllers.LeaveController{}, "*:Leave_Type_List"), // 添加权限-请假类型列表
+	)
+
+	beego.AddNamespace(ns, ns_tp)
+}

+ 20 - 0
routers/Overtime.go

@@ -0,0 +1,20 @@
+package routers
+
+import (
+	"ERP_ams/controllers"
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func init() {
+	ns := beego.NewNamespace("/Overtime",
+		beego.NSRouter("/List", &controllers.OvertimeController{}, "*:Overtime_List"),           // 加班列表
+		beego.NSRouter("/User_list", &controllers.OvertimeController{}, "*:Overtime_User_List"), // 获取加班
+		beego.NSRouter("/Add", &controllers.OvertimeController{}, "*:Overtime_Add"),             // 添加加班
+		beego.NSRouter("/Edit", &controllers.OvertimeController{}, "*:Overtime_Update"),         // 修改加班
+		beego.NSRouter("/Approval", &controllers.OvertimeController{}, "*:Overtime_Approval"),   // 加班审批
+		beego.NSRouter("/Del", &controllers.OvertimeController{}, "*:Overtime_Del"),             // 删除加班
+		beego.NSRouter("/Stat", &controllers.OvertimeController{}, "*:Overtime_Stat"),           // 加班统计
+	)
+
+	beego.AddNamespace(ns)
+}