From 3032034d254fc15f06a1d4260f35c49f0ef1e12f Mon Sep 17 00:00:00 2001
From: yinbentan <yinbentan@live.com>
Date: 星期五, 02 八月 2024 11:57:33 +0800
Subject: [PATCH] 添加接口,添加新的薪资查询和修改接口

---
 controllers/salary_plan_controller.go |  399 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 396 insertions(+), 3 deletions(-)

diff --git a/controllers/salary_plan_controller.go b/controllers/salary_plan_controller.go
index 1aa74b4..17fa659 100644
--- a/controllers/salary_plan_controller.go
+++ b/controllers/salary_plan_controller.go
@@ -1,12 +1,17 @@
 package controllers
 
 import (
+	"fmt"
 	"github.com/gin-gonic/gin"
+	"github.com/shopspring/decimal"
+	"gorm.io/gorm"
+	"silkserver/constvar"
 	"silkserver/controllers/request"
 	"silkserver/extend/code"
 	"silkserver/extend/util"
 	"silkserver/middleware"
 	"silkserver/models"
+	"silkserver/pkg/structx"
 	"silkserver/pkg/timex"
 	"strconv"
 	"time"
@@ -20,7 +25,7 @@
 //	@Tags		鍛樺伐钖祫/钖叕鏂规
 //	@Summary	淇濆瓨钖叕鏂规
 //	@Produce	application/json
-//	@Param		object	body		models.SaveSalaryPlan	true	"鍙傛暟"
+//	@Param		object	body		models.SalaryPlan	true	"鍙傛暟"
 //	@Param     	Authorization	header string true "token"
 //	@Success	200		{object}	util.Response		"鎴愬姛"
 //	@Router		/api-jl/v1/salary/saveSalaryPlan [post]
@@ -69,7 +74,7 @@
 		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�")
 		return
 	}
-	find, total, err := models.NewSalaryPlanSearch().SetPage(params.Page, params.PageSize).Find()
+	find, total, err := models.NewSalaryPlanSearch().SetPage(params.Page, params.PageSize).SetPreload(true).Find()
 	if err != nil {
 		util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘澶辫触")
 		return
@@ -82,7 +87,7 @@
 //	@Tags		鍛樺伐钖祫/钖叕鏂规
 //	@Summary	鍒犻櫎钖叕鏂规
 //	@Produce	application/json
-//	@Param		number	path		string			true	"id"
+//	@Param		id	path		string			true	"id"
 //	@Param     	Authorization	header string true "token"
 //	@Success	200		{object}	util.Response		"鎴愬姛"
 //	@Router		/api-jl/v1/salary/deleteSalaryPlanInfo/{id} [delete]
@@ -104,3 +109,391 @@
 	}
 	util.ResponseFormat(c, code.Success, "鍒犻櫎鎴愬姛")
 }
+
+// SaveSalaryType
+//
+//	@Tags		鍛樺伐钖祫/钖叕鏂规
+//	@Summary	淇濆瓨钖祫绫诲瀷
+//	@Produce	application/json
+//	@Param		object	body		request.SalaryType	true	"鍙傛暟"
+//	@Param     	Authorization	header string true "token"
+//	@Success	200		{object}	util.Response		"鎴愬姛"
+//	@Router		/api-jl/v1/salary/saveSalaryType [post]
+func (slf SalaryPlanController) SaveSalaryType(c *gin.Context) {
+	var params request.SalaryType
+	err := c.BindJSON(&params)
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�")
+		return
+	}
+	if params.Type == 0 {
+		util.ResponseFormat(c, code.RequestParamError, "绫诲瀷涓嶈兘涓虹┖")
+		return
+	}
+	miniDicts, err := models.NewMiniDictSearch().SetType(params.Type).FindNotTotal()
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, err)
+		return
+	}
+	dicts := params.Values
+	add := make([]*models.MiniDict, 0)
+	del := make([]uint, 0)
+	update := make([]*models.MiniDict, 0)
+	for _, mini := range miniDicts {
+		flag := true
+		for i, value := range dicts {
+			var dict models.MiniDict
+			dict.Name = value.Name
+			dict.IsDefault = value.IsDefault
+			dict.Type = params.Type
+			if value.Id == 0 {
+				add = append(add, &dict)
+				flag = false
+				if i < len(dicts)-1 {
+					dicts = append(dicts[:i], dicts[i+1:]...)
+				} else {
+					dicts = dicts[:i]
+				}
+				break
+			} else if value.Id == mini.ID {
+				dict.ID = mini.ID
+				update = append(update, &dict)
+				flag = false
+				if i < len(dicts)-1 {
+					dicts = append(dicts[:i], dicts[i+1:]...)
+				} else {
+					dicts = dicts[:i]
+				}
+				break
+			}
+		}
+		if flag {
+			del = append(del, mini.ID)
+		}
+	}
+	//鏂板鐨�
+	for _, value := range dicts {
+		var dict models.MiniDict
+		dict.Name = value.Name
+		dict.IsDefault = value.IsDefault
+		dict.Type = params.Type
+		add = append(add, &dict)
+	}
+
+	err = models.WithTransaction(func(db *gorm.DB) error {
+		if len(del) > 0 {
+			err = models.NewMiniDictSearch().SetOrm(db).SetIds(del).Delete()
+			if err != nil {
+				return err
+			}
+		}
+		if len(update) > 0 {
+			err = models.NewMiniDictSearch().SetOrm(db).SaveBatch(update)
+			if err != nil {
+				return err
+			}
+		}
+		if len(add) > 0 {
+			err = models.NewMiniDictSearch().SetOrm(db).CreateBatch(add)
+			if err != nil {
+				return err
+			}
+		}
+
+		return nil
+	})
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "淇濆瓨澶辫触")
+		return
+	}
+	util.ResponseFormat(c, code.Success, "淇濆瓨鎴愬姛")
+}
+
+// GetSalaryTypeList
+//
+//	@Tags		鍛樺伐钖祫/钖叕鏂规
+//	@Summary	鑾峰彇钖祫绫诲瀷鍒楄〃
+//	@Produce	application/json
+//	@Param		number	path		string			true	"type"	"鍙傛暟"
+//	@Param     	Authorization	header string true "token"
+//	@Success	200		{object}	util.ResponseList{data=[]models.MiniDict}		"鎴愬姛"
+//	@Router		/api-jl/v1/salary/getSalaryTypeList/{type} [get]
+func (slf SalaryPlanController) GetSalaryTypeList(c *gin.Context) {
+	tp := c.Param("type")
+	if tp == "" {
+		util.ResponseFormat(c, code.RequestParamError, "鏃犳晥鐨勭被鍨�")
+		return
+	}
+	atoi, _ := strconv.Atoi(tp)
+	if atoi == 0 {
+		util.ResponseFormat(c, code.RequestParamError, "鏃犳晥鐨勭被鍨�")
+		return
+	}
+	dicts, err := models.NewMiniDictSearch().SetType(constvar.MiniDictType(atoi)).FindNotTotal()
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鏌ヨ澶辫触")
+		return
+	}
+	util.ResponseFormat(c, code.Success, dicts)
+}
+
+// GetPayrollProductionCarList
+//
+//	@Tags		鍛樺伐钖祫/钖叕鏂规
+//	@Summary	鑾峰彇杞﹀彴姣忓ぉ鐨勪骇閲忓垪琛�
+//	@Produce	application/json
+//	@Param     	Authorization	header string true "token"
+//	@Param     	object  query    request.PayrollProductionCar true  "鏌ヨ鍙傛暟"
+//	@Success	200		{object}	util.ResponseList{data=[]models.PayrollProductionCar}	"鎴愬姛"
+//	@Router		/api-jl/v1/salary/getPayrollProductionCarList [get]
+func (slf SalaryPlanController) GetPayrollProductionCarList(c *gin.Context) {
+	var params request.PayrollProductionCar
+	if err := c.ShouldBindQuery(&params); err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�")
+		return
+	}
+
+	carSearch := models.NewPayrollProductionCarSearch()
+	if len(params.Cycle) == 0 && len(params.Monthly) == 0 {
+		util.ResponseFormat(c, code.RequestParamError, "璇锋鏌ユ煡璇㈠懆鏈�,蹇呴』杈撳叆鎸夊ぉ鏌ヨ鎴栨寜鏈堟煡璇€�傛牸寮忥細Cycle锛坹yyy-MM-dd锛� 鎴� Monthly锛坹yyy-MM锛�")
+		return
+	}
+	carSearch.SetPage(params.Page, params.PageSize)
+	carSearch.SetWorkshopNumber(params.WorkshopNumber).SetGroupNumber(params.GroupNumber).SetCarNumber(params.CarNumber).SetMarketNumber(params.MarketNumber).SetSpec(params.Spec)
+	list, total, err := carSearch.Find()
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘澶辫触")
+		return
+	}
+
+	util.ResponseFormatList(c, code.Success, list, total)
+}
+
+// GetPayrollProductionGroupList
+//
+//	@Tags		鍛樺伐钖祫/钖叕鏂规
+//	@Summary	鑾峰彇灏忕粍姣忓ぉ鐨勪骇閲忓垪琛�
+//	@Produce	application/json
+//	@Param     	Authorization	header string true "token"
+//	@Param     	object  query    request.PayrollProductionGroup true  "鏌ヨ鍙傛暟"
+//	@Success	200		{object}	util.ResponseList{data=[]models.PayrollProductionGroup}	"鎴愬姛"
+//	@Router		/api-jl/v1/salary/getPayrollProductionGroupList [get]
+func (slf SalaryPlanController) GetPayrollProductionGroupList(c *gin.Context) {
+	var params request.PayrollProductionGroup
+	if err := c.ShouldBindQuery(&params); err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�")
+		return
+	}
+	//params = request.PayrollProductionGroup{
+	//	Cycle:          c.Query("cycle"),
+	//	Monthly:        c.Query("monthly"),
+	//	WorkshopNumber: c.Query("workshopNumber"),
+	//}
+	//params.GroupNumber, _ = strconv.Atoi(c.Query("groupNumber"))
+	//params.Page, _ = strconv.Atoi(c.Query("page"))
+	//params.PageSize, _ = strconv.Atoi(c.Query("pageSize"))
+
+	if len(params.Cycle) == 0 && len(params.Monthly) == 0 {
+		util.ResponseFormat(c, code.RequestParamError, "璇锋鏌ユ煡璇㈠懆鏈�,蹇呴』杈撳叆鎸夊ぉ鏌ヨ鎴栨寜鏈堟煡璇€�傛牸寮忥細Cycle锛坹yyy-MM-dd锛� 鎴� Monthly锛坹yyy-MM锛�")
+		return
+	}
+	list, total, err := models.NewPayrollProductionGroupSearch().SetPage(params.Page, params.PageSize).
+		SetCycle(params.Cycle).SetMonthly(params.Monthly).SetWorkshopNumber(params.WorkshopNumber).SetGroupNumber(params.GroupNumber).
+		Find()
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘澶辫触")
+		return
+	}
+
+	util.ResponseFormatList(c, code.Success, list, total)
+}
+
+// GetPayrollSalaryPlanList
+//
+//	@Tags		鍛樺伐钖祫/钖叕鏂规
+//	@Summary	鑾峰彇浜哄憳姣忔湀鐨勮柂璧勫垪琛�
+//	@Produce	application/json
+//	@Param     	Authorization	header string true "token"
+//	@Param     	object  query    request.PayrollSalaryPlan true  "鏌ヨ鍙傛暟"
+//	@Success	200		{object}	util.ResponseList{data=[]models.PayrollSalaryPlan}	"鎴愬姛"
+//	@Router		/api-jl/v1/salary/getPayrollSalaryPlanList [get]
+func (slf SalaryPlanController) GetPayrollSalaryPlanList(c *gin.Context) {
+	var params request.PayrollSalaryPlan
+	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
+	}
+	list, total, err := models.NewPayrollSalaryPlanSearch().SetPage(params.Page, params.PageSize).
+		SetCycle(params.Cycle).SetWorkerID(params.WorkerID).SetKeyword(params.Keyword).SetWorkTypeID(uint(params.WorkTypeID)).SetWorkTypeCode(constvar.JobType(params.WorkTypeCode)).
+		Find()
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘澶辫触")
+		return
+	}
+
+	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