From 38c6f7308c1dd22a8ea286c3ea1de3a4e714f78f Mon Sep 17 00:00:00 2001
From: yinbentan <yinbentan@live.com>
Date: 星期五, 02 八月 2024 16:44:51 +0800
Subject: [PATCH] BUG修复,新的工资计算方式添加遗漏的“考勤及补贴数据”(工作日加班时长、休息日加班时长、带徒天数、满勤奖、请假天数、工龄)

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

diff --git a/controllers/salary_plan_controller.go b/controllers/salary_plan_controller.go
index 461b326..17fa659 100644
--- a/controllers/salary_plan_controller.go
+++ b/controllers/salary_plan_controller.go
@@ -1,7 +1,9 @@
 package controllers
 
 import (
+	"fmt"
 	"github.com/gin-gonic/gin"
+	"github.com/shopspring/decimal"
 	"gorm.io/gorm"
 	"silkserver/constvar"
 	"silkserver/controllers/request"
@@ -9,6 +11,7 @@
 	"silkserver/extend/util"
 	"silkserver/middleware"
 	"silkserver/models"
+	"silkserver/pkg/structx"
 	"silkserver/pkg/timex"
 	"strconv"
 	"time"
@@ -335,3 +338,162 @@
 
 	util.ResponseFormatList(c, code.Success, list, total)
 }
+
+// SavePayrollConstitute
+//
+//	@Tags		鍛樺伐钖祫/钖叕鏂规
+//	@Summary	钖叕鏁伴璋冩暣
+//	@Produce	application/json
+//	@Param		object	body	request.SavePayrollConstitute	true	"鍙傛暟"
+//	@Param     	Authorization	header string true "token"
+//	@Success	200		{object}	util.Response		"鎴愬姛"
+//	@Router		/api-jl/v1/salary/savePayrollConstitute [post]
+func (slf SalaryPlanController) SavePayrollConstitute(c *gin.Context) {
+	var params request.SavePayrollConstitute
+	var constitute models.PayrollConstitute
+	err := c.BindJSON(&params)
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�")
+		return
+	}
+	err = structx.AssignTo(params, &constitute)
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鏁版嵁杞崲澶辫触")
+		return
+	}
+	if len(constitute.Cycle) < 7 {
+		util.ResponseFormat(c, code.RequestParamError, "鍛ㄦ湡鍙傛暟涓虹┖鎴栨牸寮忛敊璇�")
+	}
+	if len(constitute.WorkerID) == 0 {
+		util.ResponseFormat(c, code.RequestParamError, "鍛樺伐ID鍙傛暟涓虹┖")
+	}
+	if constitute.SalaryPlanId == 0 {
+		util.ResponseFormat(c, code.RequestParamError, "钖祫鏂规ID鍙傛暟涓虹┖")
+	}
+
+	info := middleware.GetUserInfo(c)
+	if info == nil || info.NickName == "" {
+		util.ResponseFormat(c, code.RequestParamError, "鐢ㄦ埛鏈櫥褰�")
+	}
+	constitute.CreatedBy = info.NickName
+
+	if payrollConstitute, err := models.NewPayrollConstituteSearch().SetCycle(params.Cycle).SetWorkerID(params.WorkerID).SetSalaryPlanId(params.SalaryPlanId).First(); err != nil && payrollConstitute != nil {
+		constitute.ID = payrollConstitute.ID
+		constitute.CreatedAt = payrollConstitute.CreatedAt
+	}
+
+	if constitute.ID > 0 {
+		err = models.NewPayrollConstituteSearch().Save(&constitute)
+		if err != nil {
+			util.ResponseFormat(c, code.RequestParamError, "淇濆瓨澶辫触")
+			return
+		}
+	} else {
+		err = models.NewPayrollConstituteSearch().Create(&constitute)
+		if err != nil {
+			util.ResponseFormat(c, code.RequestParamError, "淇濆瓨澶辫触")
+			return
+		}
+	}
+
+	util.ResponseFormat(c, code.Success, "淇濆瓨鎴愬姛")
+}
+
+// GetPayrollConstituteList
+//
+//	@Tags		鍛樺伐钖祫/钖叕鏂规
+//	@Summary	鑾峰彇浜哄憳姣忔湀鐨勮柂璧勫垪琛�
+//	@Produce	application/json
+//	@Param     	Authorization	header string true "token"
+//	@Param     	object  query    request.PayrollConstitute true  "鏌ヨ鍙傛暟"
+//	@Success	200		{object}	util.ResponseList{data=map[string]interface{}}	"鎴愬姛"
+//	@Router		/api-jl/v1/salary/getPayrollConstituteList [get]
+func (slf SalaryPlanController) GetPayrollConstituteList(c *gin.Context) {
+
+	var params request.PayrollConstitute
+	if err := c.ShouldBindQuery(&params); err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�")
+		return
+	}
+	if len(params.Cycle) == 0 {
+		util.ResponseFormat(c, code.RequestParamError, "璇锋鏌ユ煡璇㈠懆鏈熴�傛牸寮忥細Cycle锛坹yyy-MM-dd锛�")
+		return
+	}
+
+	groupList, err := models.NewPayrollConstituteSearch().ConstituteGroup(&models.ConstituteGroup{Cycle: params.Cycle})
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘宸ヨ祫鍒嗙被澶辫触")
+		return
+	}
+	groupMap := make(map[string][]*models.ConstituteGroup, 0)
+	for _, group := range groupList {
+		if _, ok := groupMap[group.WorkerID]; ok {
+			groupMap[group.WorkerID] = append(groupMap[group.WorkerID], group)
+		} else {
+			groupMap[group.WorkerID] = []*models.ConstituteGroup{group}
+		}
+	}
+
+	// 鍛樺伐淇℃伅
+	workers, err := models.NewWorkerSearch().FindNotTotal()
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘鐢ㄦ埛澶辫触")
+	}
+	workerMap := make(map[string]*models.Worker)
+	for _, worker := range workers {
+		workerMap[worker.ID] = worker
+	}
+
+	// 宸ヨ祫鏂规
+	salaryPlans, err := models.NewSalaryPlanSearch().FindNotTotal()
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘钖祫鏂规澶辫触")
+	}
+	salaryPlanMap := make(map[uint]*models.SalaryPlan)
+	for _, plan := range salaryPlans {
+		salaryPlanMap[plan.ID] = plan
+	}
+
+	// 宸ヨ祫鍗曢」
+	constituteList, err := models.NewPayrollConstituteSearch().SetCycle(params.Cycle).SetWorkerID(params.WorkerID).SetWorkTypeID(uint(params.WorkTypeID)).SetWorkTypeCode(params.WorkTypeCode).FindNotTotal()
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘宸ヨ祫鍗曢」澶辫触")
+		return
+	}
+	constituteMap := make(map[string]*models.PayrollConstitute)
+	for _, v := range constituteList {
+		key := fmt.Sprintf("%v%v%v", v.Cycle, v.WorkerID, v.SalaryPlanId)
+		constituteMap[key] = v
+	}
+
+	var list []map[string]interface{}
+	for workerId, group := range groupMap {
+		result := make(map[string]interface{})
+		result["cycle"] = params.Cycle
+		if _, ok := workerMap[workerId]; ok { // 浜哄憳淇℃伅
+			result["worker"] = workerMap[workerId]
+		}
+		amount := decimal.NewFromInt(0)
+		constituteList := make([]map[string]interface{}, 0)
+		for _, v := range group {
+			temp := make(map[string]interface{})
+			if _, ok := salaryPlanMap[v.SalaryPlanId]; ok {
+				temp["salaryPlan"] = salaryPlanMap[v.SalaryPlanId]
+			}
+
+			key := fmt.Sprintf("%v%v%v", v.Cycle, v.WorkerID, v.SalaryPlanId)
+			if _, ok := constituteMap[key]; ok {
+				temp["amount"] = constituteMap[key].Amount
+				amount = amount.Add(constituteMap[key].Amount)
+			}
+			constituteList = append(constituteList, temp)
+		}
+		result["amount"] = amount       // 搴斿彂宸ヨ祫
+		result["list"] = constituteList // 宸ヨ祫璇︽儏
+
+		list = append(list, result)
+	}
+
+	util.ResponseFormat(c, code.Success, list)
+
+}

--
Gitblit v1.8.0