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

---
 controllers/request/salary_plan.go    |   32 ++
 controllers/response/salary_plan.go   |    6 
 controllers/salary_plan_controller.go |  162 +++++++++++
 docs/swagger.yaml                     |  124 ++++++++
 docs/docs.go                          |  197 +++++++++++++
 docs/swagger.json                     |  197 +++++++++++++
 models/payroll_constitute.go          |  103 ++++++
 router/router.go                      |    2 
 service/salary_plan.go                |    5 
 9 files changed, 789 insertions(+), 39 deletions(-)

diff --git a/controllers/request/salary_plan.go b/controllers/request/salary_plan.go
index 20c927e..52929ae 100644
--- a/controllers/request/salary_plan.go
+++ b/controllers/request/salary_plan.go
@@ -1,5 +1,10 @@
 package request
 
+import (
+	"github.com/shopspring/decimal"
+	"silkserver/constvar"
+)
+
 type PayrollProductionCar struct {
 	PageInfo
 	Cycle          string `json:"cycle" form:"cycle"`                   // 缁熻鍛ㄦ湡锛堝勾-鏈�-鏃ワ級
@@ -28,3 +33,30 @@
 	WorkTypeCode string `json:"workTypeCode"  form:"workTypeCode"` // 宸ョ缂栫爜
 	Keyword      string `json:"keyword"  form:"keyword"`           // 鍏抽敭瀛�
 }
+
+type UpdatePayrollConstitute struct {
+	Cycle        string           `json:"cycle" `        //鏈堜唤
+	WorkerID     string           `json:"workerID"  `    //鍛樺伐ID
+	WorkTypeID   uint             `json:"workTypeID" `   //宸ョID
+	WorkTypeCode constvar.JobType `json:"workTypeCode" ` //宸ョ浠g爜
+	Amount       decimal.Decimal  `json:"amount" `       //閲戦
+}
+
+type PayrollConstitute struct {
+	PageInfo
+	Cycle        string `json:"cycle"  form:"cycle"`               // 缁熻鍛ㄦ湡鎸夋湀鏌ヨ锛堝勾-鏈堬級
+	WorkerID     string `json:"workerID"  form:"workerID"`         // 鍛樺伐ID
+	WorkTypeID   int    `json:"workTypeID"  form:"workTypeID"`     // 宸ョID
+	WorkTypeCode string `json:"workTypeCode"  form:"workTypeCode"` // 宸ョ缂栫爜
+	Keyword      string `json:"keyword"  form:"keyword"`           // 鍏抽敭瀛�
+}
+
+type SavePayrollConstitute struct {
+	Cycle        string           `json:"cycle" from:"cycle"`               //鍛ㄦ湡锛堟湀浠斤級
+	WorkerID     string           `json:"workerId" from:"workerId"`         //鍛樺伐ID
+	WorkTypeID   uint             `json:"workTypeID" from:"workTypeID"`     //宸ョID
+	WorkTypeCode constvar.JobType `json:"workTypeCode" from:"workTypeCode"` //宸ョ浠g爜
+	WorkTypeName string           `json:"workTypeName" from:"workTypeName"` //宸ョ鍚嶇О
+	SalaryPlanId uint             `json:"salaryPlanId" from:"salaryPlanId"` //钖祫鏂规ID
+	Amount       decimal.Decimal  `json:"amount" from:"amount"`             // 閲戦
+}
diff --git a/controllers/response/salary_plan.go b/controllers/response/salary_plan.go
new file mode 100644
index 0000000..cc4f11d
--- /dev/null
+++ b/controllers/response/salary_plan.go
@@ -0,0 +1,6 @@
+package response
+
+type PayrollSalaryPlan struct {
+	// 浜哄憳淇℃伅
+	//
+}
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)
+
+}
diff --git a/docs/docs.go b/docs/docs.go
index 14b0afe..3f8e9e3 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -1136,6 +1136,89 @@
                 }
             }
         },
+        "/api-jl/v1/salary/getPayrollConstituteList": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鍛樺伐钖祫/钖叕鏂规"
+                ],
+                "summary": "鑾峰彇浜哄憳姣忔湀鐨勮柂璧勫垪琛�",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "token",
+                        "name": "Authorization",
+                        "in": "header",
+                        "required": true
+                    },
+                    {
+                        "type": "string",
+                        "description": "缁熻鍛ㄦ湡鎸夋湀鏌ヨ锛堝勾-鏈堬級",
+                        "name": "cycle",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "鍏抽敭瀛�",
+                        "name": "keyword",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "椤电爜",
+                        "name": "page",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "姣忛〉澶у皬",
+                        "name": "pageSize",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "宸ョ缂栫爜",
+                        "name": "workTypeCode",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "宸ョID",
+                        "name": "workTypeID",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "鍛樺伐ID",
+                        "name": "workerID",
+                        "in": "query"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鎴愬姛",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/util.ResponseList"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "object",
+                                            "additionalProperties": true
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
         "/api-jl/v1/salary/getPayrollProductionCarList": {
             "get": {
                 "produces": [
@@ -1505,6 +1588,43 @@
                 }
             }
         },
+        "/api-jl/v1/salary/savePayrollConstitute": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鍛樺伐钖祫/钖叕鏂规"
+                ],
+                "summary": "钖叕鏁伴璋冩暣",
+                "parameters": [
+                    {
+                        "description": "鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.SavePayrollConstitute"
+                        }
+                    },
+                    {
+                        "type": "string",
+                        "description": "token",
+                        "name": "Authorization",
+                        "in": "header",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鎴愬姛",
+                        "schema": {
+                            "$ref": "#/definitions/util.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api-jl/v1/salary/saveSalaryPlan": {
             "post": {
                 "produces": [
@@ -1650,23 +1770,20 @@
                             1,
                             2,
                             3,
-                            4,
-                            5
+                            4
                         ],
                         "type": "integer",
                         "x-enum-comments": {
                             "DictTypeColor": "棰滆壊",
                             "DictTypeMarket": "搴勫彛",
                             "DictTypeSpec": "瑙勬牸",
-                            "DictTypeSubsidy": "琛ヨ创",
                             "DictTypeWorkshop": "杞﹂棿"
                         },
                         "x-enum-varnames": [
                             "DictTypeMarket",
                             "DictTypeWorkshop",
                             "DictTypeColor",
-                            "DictTypeSpec",
-                            "DictTypeSubsidy"
+                            "DictTypeSpec"
                         ],
                         "description": "瀛楀吀绫诲瀷",
                         "name": "dictType",
@@ -2790,22 +2907,19 @@
                 1,
                 2,
                 3,
-                4,
-                5
+                4
             ],
             "x-enum-comments": {
                 "DictTypeColor": "棰滆壊",
                 "DictTypeMarket": "搴勫彛",
                 "DictTypeSpec": "瑙勬牸",
-                "DictTypeSubsidy": "琛ヨ创",
                 "DictTypeWorkshop": "杞﹂棿"
             },
             "x-enum-varnames": [
                 "DictTypeMarket",
                 "DictTypeWorkshop",
                 "DictTypeColor",
-                "DictTypeSpec",
-                "DictTypeSubsidy"
+                "DictTypeSpec"
             ]
         },
         "constvar.FileTemplateCategory": {
@@ -2835,7 +2949,9 @@
                 "cleaner",
                 "machine_cleaner",
                 "all-powerful",
-                "monitor"
+                "monitor",
+                "test",
+                "other"
             ],
             "x-enum-comments": {
                 "JobTypeAllPowerful": "鍏ㄨ兘鏈哄姩",
@@ -2845,7 +2961,9 @@
                 "JobTypeMachineCleaner": "鎰熺煡鍣ㄦ竻娲楀伐",
                 "JobTypeMaintenance": "淇濆叏宸�",
                 "JobTypeMonitor": "鐝暱",
+                "JobTypeOther": "鍏跺畠",
                 "JobTypeScoop": "鑸�鑼у伐",
+                "JobTypeTest": "娴嬭瘯",
                 "JobTypeTransport": "閫佽導宸�",
                 "JobTypeWeavers": "鎸¤溅宸�"
             },
@@ -2859,7 +2977,9 @@
                 "JobTypeCleaner",
                 "JobTypeMachineCleaner",
                 "JobTypeAllPowerful",
-                "JobTypeMonitor"
+                "JobTypeMonitor",
+                "JobTypeTest",
+                "JobTypeOther"
             ]
         },
         "constvar.MiniDictType": {
@@ -3404,6 +3524,10 @@
         "models.PayrollProductionCar": {
             "type": "object",
             "properties": {
+                "badSilkAvgQuantity": {
+                    "description": "閲庣氦骞冲潎鏁伴噺",
+                    "type": "number"
+                },
                 "badSilkQuantity": {
                     "description": "閲庣氦鏁伴噺",
                     "type": "number"
@@ -3503,6 +3627,9 @@
                     "description": "瑙勬牸",
                     "type": "string"
                 },
+                "workshopId": {
+                    "type": "integer"
+                },
                 "workshopNumber": {
                     "description": "杞﹂棿缂栧彿",
                     "type": "string"
@@ -3561,6 +3688,9 @@
                 "silkTotalAvgAmount": {
                     "description": "涓濋噺浜哄钩鍧囨�讳环",
                     "type": "number"
+                },
+                "workshopId": {
+                    "type": "integer"
                 },
                 "workshopName": {
                     "description": "杞﹂棿鍚嶇О",
@@ -3836,6 +3966,9 @@
                 "shopName": {
                     "type": "string"
                 },
+                "shopNumber": {
+                    "type": "string"
+                },
                 "status": {
                     "$ref": "#/definitions/constvar.WorkerStatus"
                 },
@@ -4080,6 +4213,9 @@
                 },
                 "vehicleSpeed": {
                     "type": "number"
+                },
+                "workshopId": {
+                    "type": "integer"
                 },
                 "workshopName": {
                     "description": "杞﹂棿鍚�",
@@ -4711,6 +4847,43 @@
                 }
             }
         },
+        "request.SavePayrollConstitute": {
+            "type": "object",
+            "properties": {
+                "amount": {
+                    "description": "閲戦",
+                    "type": "number"
+                },
+                "cycle": {
+                    "description": "鍛ㄦ湡锛堟湀浠斤級",
+                    "type": "string"
+                },
+                "salaryPlanId": {
+                    "description": "钖祫鏂规ID",
+                    "type": "integer"
+                },
+                "workTypeCode": {
+                    "description": "宸ョ浠g爜",
+                    "allOf": [
+                        {
+                            "$ref": "#/definitions/constvar.JobType"
+                        }
+                    ]
+                },
+                "workTypeID": {
+                    "description": "宸ョID",
+                    "type": "integer"
+                },
+                "workTypeName": {
+                    "description": "宸ョ鍚嶇О",
+                    "type": "string"
+                },
+                "workerId": {
+                    "description": "鍛樺伐ID",
+                    "type": "string"
+                }
+            }
+        },
         "request.SaveRankStandard": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.json b/docs/swagger.json
index 71bc2ef..401d42b 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -1125,6 +1125,89 @@
                 }
             }
         },
+        "/api-jl/v1/salary/getPayrollConstituteList": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鍛樺伐钖祫/钖叕鏂规"
+                ],
+                "summary": "鑾峰彇浜哄憳姣忔湀鐨勮柂璧勫垪琛�",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "token",
+                        "name": "Authorization",
+                        "in": "header",
+                        "required": true
+                    },
+                    {
+                        "type": "string",
+                        "description": "缁熻鍛ㄦ湡鎸夋湀鏌ヨ锛堝勾-鏈堬級",
+                        "name": "cycle",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "鍏抽敭瀛�",
+                        "name": "keyword",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "椤电爜",
+                        "name": "page",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "姣忛〉澶у皬",
+                        "name": "pageSize",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "宸ョ缂栫爜",
+                        "name": "workTypeCode",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "宸ョID",
+                        "name": "workTypeID",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "鍛樺伐ID",
+                        "name": "workerID",
+                        "in": "query"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鎴愬姛",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/util.ResponseList"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "object",
+                                            "additionalProperties": true
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
         "/api-jl/v1/salary/getPayrollProductionCarList": {
             "get": {
                 "produces": [
@@ -1494,6 +1577,43 @@
                 }
             }
         },
+        "/api-jl/v1/salary/savePayrollConstitute": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鍛樺伐钖祫/钖叕鏂规"
+                ],
+                "summary": "钖叕鏁伴璋冩暣",
+                "parameters": [
+                    {
+                        "description": "鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.SavePayrollConstitute"
+                        }
+                    },
+                    {
+                        "type": "string",
+                        "description": "token",
+                        "name": "Authorization",
+                        "in": "header",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鎴愬姛",
+                        "schema": {
+                            "$ref": "#/definitions/util.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api-jl/v1/salary/saveSalaryPlan": {
             "post": {
                 "produces": [
@@ -1639,23 +1759,20 @@
                             1,
                             2,
                             3,
-                            4,
-                            5
+                            4
                         ],
                         "type": "integer",
                         "x-enum-comments": {
                             "DictTypeColor": "棰滆壊",
                             "DictTypeMarket": "搴勫彛",
                             "DictTypeSpec": "瑙勬牸",
-                            "DictTypeSubsidy": "琛ヨ创",
                             "DictTypeWorkshop": "杞﹂棿"
                         },
                         "x-enum-varnames": [
                             "DictTypeMarket",
                             "DictTypeWorkshop",
                             "DictTypeColor",
-                            "DictTypeSpec",
-                            "DictTypeSubsidy"
+                            "DictTypeSpec"
                         ],
                         "description": "瀛楀吀绫诲瀷",
                         "name": "dictType",
@@ -2779,22 +2896,19 @@
                 1,
                 2,
                 3,
-                4,
-                5
+                4
             ],
             "x-enum-comments": {
                 "DictTypeColor": "棰滆壊",
                 "DictTypeMarket": "搴勫彛",
                 "DictTypeSpec": "瑙勬牸",
-                "DictTypeSubsidy": "琛ヨ创",
                 "DictTypeWorkshop": "杞﹂棿"
             },
             "x-enum-varnames": [
                 "DictTypeMarket",
                 "DictTypeWorkshop",
                 "DictTypeColor",
-                "DictTypeSpec",
-                "DictTypeSubsidy"
+                "DictTypeSpec"
             ]
         },
         "constvar.FileTemplateCategory": {
@@ -2824,7 +2938,9 @@
                 "cleaner",
                 "machine_cleaner",
                 "all-powerful",
-                "monitor"
+                "monitor",
+                "test",
+                "other"
             ],
             "x-enum-comments": {
                 "JobTypeAllPowerful": "鍏ㄨ兘鏈哄姩",
@@ -2834,7 +2950,9 @@
                 "JobTypeMachineCleaner": "鎰熺煡鍣ㄦ竻娲楀伐",
                 "JobTypeMaintenance": "淇濆叏宸�",
                 "JobTypeMonitor": "鐝暱",
+                "JobTypeOther": "鍏跺畠",
                 "JobTypeScoop": "鑸�鑼у伐",
+                "JobTypeTest": "娴嬭瘯",
                 "JobTypeTransport": "閫佽導宸�",
                 "JobTypeWeavers": "鎸¤溅宸�"
             },
@@ -2848,7 +2966,9 @@
                 "JobTypeCleaner",
                 "JobTypeMachineCleaner",
                 "JobTypeAllPowerful",
-                "JobTypeMonitor"
+                "JobTypeMonitor",
+                "JobTypeTest",
+                "JobTypeOther"
             ]
         },
         "constvar.MiniDictType": {
@@ -3393,6 +3513,10 @@
         "models.PayrollProductionCar": {
             "type": "object",
             "properties": {
+                "badSilkAvgQuantity": {
+                    "description": "閲庣氦骞冲潎鏁伴噺",
+                    "type": "number"
+                },
                 "badSilkQuantity": {
                     "description": "閲庣氦鏁伴噺",
                     "type": "number"
@@ -3492,6 +3616,9 @@
                     "description": "瑙勬牸",
                     "type": "string"
                 },
+                "workshopId": {
+                    "type": "integer"
+                },
                 "workshopNumber": {
                     "description": "杞﹂棿缂栧彿",
                     "type": "string"
@@ -3550,6 +3677,9 @@
                 "silkTotalAvgAmount": {
                     "description": "涓濋噺浜哄钩鍧囨�讳环",
                     "type": "number"
+                },
+                "workshopId": {
+                    "type": "integer"
                 },
                 "workshopName": {
                     "description": "杞﹂棿鍚嶇О",
@@ -3825,6 +3955,9 @@
                 "shopName": {
                     "type": "string"
                 },
+                "shopNumber": {
+                    "type": "string"
+                },
                 "status": {
                     "$ref": "#/definitions/constvar.WorkerStatus"
                 },
@@ -4069,6 +4202,9 @@
                 },
                 "vehicleSpeed": {
                     "type": "number"
+                },
+                "workshopId": {
+                    "type": "integer"
                 },
                 "workshopName": {
                     "description": "杞﹂棿鍚�",
@@ -4700,6 +4836,43 @@
                 }
             }
         },
+        "request.SavePayrollConstitute": {
+            "type": "object",
+            "properties": {
+                "amount": {
+                    "description": "閲戦",
+                    "type": "number"
+                },
+                "cycle": {
+                    "description": "鍛ㄦ湡锛堟湀浠斤級",
+                    "type": "string"
+                },
+                "salaryPlanId": {
+                    "description": "钖祫鏂规ID",
+                    "type": "integer"
+                },
+                "workTypeCode": {
+                    "description": "宸ョ浠g爜",
+                    "allOf": [
+                        {
+                            "$ref": "#/definitions/constvar.JobType"
+                        }
+                    ]
+                },
+                "workTypeID": {
+                    "description": "宸ョID",
+                    "type": "integer"
+                },
+                "workTypeName": {
+                    "description": "宸ョ鍚嶇О",
+                    "type": "string"
+                },
+                "workerId": {
+                    "description": "鍛樺伐ID",
+                    "type": "string"
+                }
+            }
+        },
         "request.SaveRankStandard": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index 5c36380..a3cc964 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -53,20 +53,17 @@
     - 2
     - 3
     - 4
-    - 5
     type: integer
     x-enum-comments:
       DictTypeColor: 棰滆壊
       DictTypeMarket: 搴勫彛
       DictTypeSpec: 瑙勬牸
-      DictTypeSubsidy: 琛ヨ创
       DictTypeWorkshop: 杞﹂棿
     x-enum-varnames:
     - DictTypeMarket
     - DictTypeWorkshop
     - DictTypeColor
     - DictTypeSpec
-    - DictTypeSubsidy
   constvar.FileTemplateCategory:
     enum:
     - 1
@@ -90,6 +87,8 @@
     - machine_cleaner
     - all-powerful
     - monitor
+    - test
+    - other
     type: string
     x-enum-comments:
       JobTypeAllPowerful: 鍏ㄨ兘鏈哄姩
@@ -99,7 +98,9 @@
       JobTypeMachineCleaner: 鎰熺煡鍣ㄦ竻娲楀伐
       JobTypeMaintenance: 淇濆叏宸�
       JobTypeMonitor: 鐝暱
+      JobTypeOther: 鍏跺畠
       JobTypeScoop: 鑸�鑼у伐
+      JobTypeTest: 娴嬭瘯
       JobTypeTransport: 閫佽導宸�
       JobTypeWeavers: 鎸¤溅宸�
     x-enum-varnames:
@@ -113,6 +114,8 @@
     - JobTypeMachineCleaner
     - JobTypeAllPowerful
     - JobTypeMonitor
+    - JobTypeTest
+    - JobTypeOther
   constvar.MiniDictType:
     enum:
     - 1
@@ -496,6 +499,9 @@
     type: object
   models.PayrollProductionCar:
     properties:
+      badSilkAvgQuantity:
+        description: 閲庣氦骞冲潎鏁伴噺
+        type: number
       badSilkQuantity:
         description: 閲庣氦鏁伴噺
         type: number
@@ -570,6 +576,8 @@
       spec:
         description: 瑙勬牸
         type: string
+      workshopId:
+        type: integer
       workshopNumber:
         description: 杞﹂棿缂栧彿
         type: string
@@ -613,6 +621,8 @@
       silkTotalAvgAmount:
         description: 涓濋噺浜哄钩鍧囨�讳环
         type: number
+      workshopId:
+        type: integer
       workshopName:
         description: 杞﹂棿鍚嶇О
         type: string
@@ -801,6 +811,8 @@
         type: string
       shopName:
         type: string
+      shopNumber:
+        type: string
       status:
         $ref: '#/definitions/constvar.WorkerStatus'
       workType:
@@ -964,6 +976,8 @@
         type: string
       vehicleSpeed:
         type: number
+      workshopId:
+        type: integer
       workshopName:
         description: 杞﹂棿鍚�
         type: string
@@ -1394,6 +1408,31 @@
         type: boolean
       name:
         description: 鍚嶇О
+        type: string
+    type: object
+  request.SavePayrollConstitute:
+    properties:
+      amount:
+        description: 閲戦
+        type: number
+      cycle:
+        description: 鍛ㄦ湡锛堟湀浠斤級
+        type: string
+      salaryPlanId:
+        description: 钖祫鏂规ID
+        type: integer
+      workTypeCode:
+        allOf:
+        - $ref: '#/definitions/constvar.JobType'
+        description: 宸ョ浠g爜
+      workTypeID:
+        description: 宸ョID
+        type: integer
+      workTypeName:
+        description: 宸ョ鍚嶇О
+        type: string
+      workerId:
+        description: 鍛樺伐ID
         type: string
     type: object
   request.SaveRankStandard:
@@ -2593,6 +2632,58 @@
       summary: 鍒犻櫎钖叕鏂规
       tags:
       - 鍛樺伐钖祫/钖叕鏂规
+  /api-jl/v1/salary/getPayrollConstituteList:
+    get:
+      parameters:
+      - description: token
+        in: header
+        name: Authorization
+        required: true
+        type: string
+      - description: 缁熻鍛ㄦ湡鎸夋湀鏌ヨ锛堝勾-鏈堬級
+        in: query
+        name: cycle
+        type: string
+      - description: 鍏抽敭瀛�
+        in: query
+        name: keyword
+        type: string
+      - description: 椤电爜
+        in: query
+        name: page
+        type: integer
+      - description: 姣忛〉澶у皬
+        in: query
+        name: pageSize
+        type: integer
+      - description: 宸ョ缂栫爜
+        in: query
+        name: workTypeCode
+        type: string
+      - description: 宸ョID
+        in: query
+        name: workTypeID
+        type: integer
+      - description: 鍛樺伐ID
+        in: query
+        name: workerID
+        type: string
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 鎴愬姛
+          schema:
+            allOf:
+            - $ref: '#/definitions/util.ResponseList'
+            - properties:
+                data:
+                  additionalProperties: true
+                  type: object
+              type: object
+      summary: 鑾峰彇浜哄憳姣忔湀鐨勮柂璧勫垪琛�
+      tags:
+      - 鍛樺伐钖祫/钖叕鏂规
   /api-jl/v1/salary/getPayrollProductionCarList:
     get:
       parameters:
@@ -2821,6 +2912,30 @@
       summary: 鑾峰彇钖祫绫诲瀷鍒楄〃
       tags:
       - 鍛樺伐钖祫/钖叕鏂规
+  /api-jl/v1/salary/savePayrollConstitute:
+    post:
+      parameters:
+      - description: 鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.SavePayrollConstitute'
+      - description: token
+        in: header
+        name: Authorization
+        required: true
+        type: string
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 鎴愬姛
+          schema:
+            $ref: '#/definitions/util.Response'
+      summary: 钖叕鏁伴璋冩暣
+      tags:
+      - 鍛樺伐钖祫/钖叕鏂规
   /api-jl/v1/salary/saveSalaryPlan:
     post:
       parameters:
@@ -2914,7 +3029,6 @@
         - 2
         - 3
         - 4
-        - 5
         in: query
         name: dictType
         type: integer
@@ -2922,14 +3036,12 @@
           DictTypeColor: 棰滆壊
           DictTypeMarket: 搴勫彛
           DictTypeSpec: 瑙勬牸
-          DictTypeSubsidy: 琛ヨ创
           DictTypeWorkshop: 杞﹂棿
         x-enum-varnames:
         - DictTypeMarket
         - DictTypeWorkshop
         - DictTypeColor
         - DictTypeSpec
-        - DictTypeSubsidy
       - description: 鎼滅储鍏抽敭瀛�
         in: query
         name: keyword
diff --git a/models/payroll_constitute.go b/models/payroll_constitute.go
index b920aec..4c1d179 100644
--- a/models/payroll_constitute.go
+++ b/models/payroll_constitute.go
@@ -4,12 +4,13 @@
 	"fmt"
 	"github.com/shopspring/decimal"
 	"gorm.io/gorm"
+	"math/rand"
 	"silkserver/constvar"
 	"silkserver/pkg/mysqlx"
 )
 
 type (
-	// PayrollConstitute 鍏跺畠琛ヨ创銆佸鎯�
+	// PayrollConstitute 钖祫鍒嗙被椤�
 	PayrollConstitute struct {
 		BaseModelInt
 		Cycle         string           `json:"cycle" gorm:"index;size:20;not null;comment:缁熻鍛ㄦ湡(yyyy-MM)"` //鏈堜唤
@@ -18,17 +19,19 @@
 		WorkTypeID    uint             `json:"workTypeID" gorm:"type:bigint(20);not null;comment:宸ョID"`      //宸ョID
 		WorkType      WorkTypeManage   `json:"workType" gorm:"foreignKey:WorkTypeID;references:ID"`          //宸ョID
 		WorkTypeCode  constvar.JobType `json:"workTypeCode" gorm:"size:255;not null;comment:宸ョ浠g爜"`           //宸ョ浠g爜
-		WorkTypeName  string           `json:"workTypeName" gorm:"size:255;not null;comment:宸ョ鍚嶇О"`           //宸ョ鍚嶇О
+		WorkTypeName  string           `json:"workTypeName" gorm:"size:255;comment:宸ョ鍚嶇О"`                    //宸ョ鍚嶇О
 		SalaryPlanId  uint             `json:"salaryPlanId" gorm:"type:bigint(20);not null;comment:钖祫鏂规ID"`  //钖祫鏂规ID
 		SalaryPlan    SalaryPlan       `json:"subsidyTypeName" gorm:"foreignKey:SalaryPlanId;references:ID"` //钖祫鏂规
-		SalaryFormula string           `json:"salaryFormula" gorm:"size:255;not null;comment:钖祫鏂规(缈昏瘧)"`      //钖祫鏂规
+		SalaryFormula string           `json:"salaryFormula" gorm:"size:255;comment:钖祫鏂规(缈昏瘧)"`               //钖祫鏂规
 		Amount        decimal.Decimal  `json:"amount" gorm:"type:decimal(12,4);comment:閲戦"`                  // 閲戦
 		CreatedBy     string           `json:"createdBy" gorm:"size:255;not null;comment:娣诲姞鑰�"`               // 娣诲姞鑰�(auto,鐢ㄦ埛id)
 	}
 
 	PayrollConstituteSearch struct {
 		PayrollConstitute
-		Monthly  string
+		Monthly string
+		Keyword string
+
 		Order    string
 		PageNum  int
 		PageSize int
@@ -41,7 +44,7 @@
 	return "silk_payroll_constitute"
 }
 
-// NewPayrollConstituteSearch 鍏跺畠琛ヨ创
+// NewPayrollConstituteSearch 钖祫鍒嗙被椤�
 func NewPayrollConstituteSearch() *PayrollConstituteSearch {
 	return &PayrollConstituteSearch{Orm: mysqlx.GetDB()}
 }
@@ -81,6 +84,16 @@
 	return slf
 }
 
+func (slf *PayrollConstituteSearch) SetWorkTypeCode(workTypeCode string) *PayrollConstituteSearch {
+	slf.WorkTypeCode = constvar.JobType(workTypeCode)
+	return slf
+}
+
+func (slf *PayrollConstituteSearch) SetSalaryPlanId(salaryPlanId uint) *PayrollConstituteSearch {
+	slf.SalaryPlanId = salaryPlanId
+	return slf
+}
+
 func (slf *PayrollConstituteSearch) SetWorkerID(workerID string) *PayrollConstituteSearch {
 	slf.WorkerID = workerID
 	return slf
@@ -114,16 +127,25 @@
 		db = db.Where("work_type_id = ?", slf.WorkTypeID)
 	}
 
-	if slf.WorkerID != "" {
-		db = db.Where("worker_id = ?", slf.WorkerID)
+	if slf.WorkTypeCode != "" {
+		db = db.Where("work_type_code = ?", slf.WorkTypeCode)
 	}
 
 	if slf.WorkerID != "" {
 		db = db.Where("worker_id = ?", slf.WorkerID)
+	}
+
+	if slf.SalaryPlanId > 0 {
+		db = db.Where("salary_plan_id = ?", slf.SalaryPlanId)
 	}
 
 	if slf.CreatedBy != "" {
-		db = db.Where("created_by = ?", slf.SalaryPlanId)
+		db = db.Where("created_by = ?", slf.CreatedBy)
+	}
+
+	if slf.Keyword != "" {
+		key := "%" + slf.Keyword + "%"
+		db = db.Where("work_type_name like ?", key)
 	}
 
 	db.Where("1 = 1")
@@ -304,3 +326,68 @@
 
 	return records, nil
 }
+
+type ConstituteGroup struct {
+	Cycle        string           `json:"cycle"`        //鏈堜唤
+	WorkerID     string           `json:"workerId"`     //鍛樺伐ID
+	WorkTypeCode constvar.JobType `json:"workTypeCode"` //宸ョ浠g爜
+	SalaryPlanId uint             `json:"salaryPlanId"` //钖祫鏂规ID
+}
+
+// ConstituteGroup 鏈湀缁熻浜嗗伐璧勭殑浜哄憳
+func (slf *PayrollConstituteSearch) ConstituteGroup(cg *ConstituteGroup) ([]*ConstituteGroup, error) {
+	var (
+		records = make([]*ConstituteGroup, 0)
+		db      = slf.Orm.Table(slf.TableName())
+	)
+	db.Select("cycle,worker_id,work_type_code,salary_plan_id")
+	db.Where("cycle = ?", cg.Cycle)
+	if cg.WorkerID != "" {
+		db.Where("worker_id = ?", cg.WorkerID)
+	}
+	if cg.WorkTypeCode != "" {
+		db.Where("work_type_code = ?", cg.WorkTypeCode)
+	}
+	if cg.SalaryPlanId > 0 {
+		db.Where("salary_plan_id = ?", cg.SalaryPlanId)
+	}
+	db.Group("cycle,worker_id,work_type_code,salary_plan_id")
+
+	return records, db.Find(&records).Error
+}
+
+// InitDefaultData 鍒濆鍖栨暟鎹�
+func (slf *PayrollConstituteSearch) InitDefaultData() error {
+	var (
+		db          = slf.Orm.Table(slf.TableName())
+		total int64 = 0
+	)
+	date := "2024-06"
+	if err := db.Where("cycle = ?", date).Count(&total).Error; err != nil {
+		return err
+	}
+	if total != 0 {
+		return nil
+	}
+	data := make([]*PayrollConstitute, 0)
+	workers, _ := NewWorkerSearch().FindNotTotal()
+	for _, record := range workers {
+		r := rand.Intn(10)
+		data = append(data, &PayrollConstitute{
+			Cycle:        date,
+			WorkerID:     record.ID,
+			WorkTypeID:   uint(r + 1),
+			WorkTypeCode: constvar.JobTypeArr[r],
+			WorkTypeName: constvar.JobTypeMap[constvar.JobTypeArr[r]],
+			SalaryPlanId: 7,
+			Amount:       decimal.NewFromInt32(int32(r * 100)),
+			CreatedBy:    "auto",
+		})
+	}
+	err := slf.CreateBatch(data)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
diff --git a/router/router.go b/router/router.go
index b4fa13b..16117c4 100644
--- a/router/router.go
+++ b/router/router.go
@@ -104,6 +104,8 @@
 		salaryApi.GET("getPayrollProductionCarList", salaryPlanController.GetPayrollProductionCarList)     //鑾峰彇杞﹀彴姣忓ぉ鐨勪骇閲忓垪琛�
 		salaryApi.GET("getPayrollProductionGroupList", salaryPlanController.GetPayrollProductionGroupList) //鑾峰彇灏忕粍姣忓ぉ鐨勪骇閲忓垪琛�
 		salaryApi.GET("getPayrollSalaryPlanList", salaryPlanController.GetPayrollSalaryPlanList)           //鑾峰彇浜哄憳姣忔湀鐨勮柂璧勫垪琛�
+		salaryApi.POST("savePayrollConstitute", salaryPlanController.SavePayrollConstitute)                //钖叕鏁伴璋冩暣
+		salaryApi.GET("getPayrollConstituteList", salaryPlanController.GetPayrollConstituteList)           //鑾峰彇浜哄憳姣忔湀鐨勮柂璧勫垪琛�
 	}
 
 	//鑰冨嫟绠$悊
diff --git a/service/salary_plan.go b/service/salary_plan.go
index 399be70..d93c850 100644
--- a/service/salary_plan.go
+++ b/service/salary_plan.go
@@ -696,7 +696,8 @@
 
 // 鏍规嵁鏂规璁$畻鍚勫伐绉嶈柂璧�
 func salaryCalculate(parameter *SalaryParameter, salaryPlan *models.SalaryPlan) (string, decimal.Decimal) {
-	formula := strings.ReplaceAll(salaryPlan.SalaryFormula, " ", "")
+	formula := strings.ReplaceAll(salaryPlan.SalaryFormula, ",", "")
+	formula = strings.ReplaceAll(salaryPlan.SalaryFormula, " ", "")
 	//var SplitFixedField = []string{"鏃ヤ骇涓濋噺", "鐢熶笣鍗曚环", "妗舵暟", "閲庣氦鏁伴噺", "閲庣氦鍗曚环", "鍚岀粍鎸¤溅宸ユ湀骞冲潎宸ヨ祫", "鍚岀粍杞﹀ご宸ュ伐璧�", "鍑哄嫟澶╂暟"}
 	formula = strings.Replace(formula, "鏃ヤ骇涓濋噺*鐢熶笣鍗曚环", parameter.SilkTotalAmount.String(), -1)
 	formula = strings.Replace(formula, "閲庣氦鏁伴噺*閲庣氦鍗曚环", parameter.BadSilkTotalAmount.String(), -1)
@@ -709,6 +710,8 @@
 	formula = strings.Replace(formula, "鍚岀粍杞﹀ご宸ュ伐璧�", parameter.GroupCarHeadAvgAmount.String(), -1)
 	formula = strings.Replace(formula, "鍑哄嫟澶╂暟", parameter.JobDays.String(), -1)
 
+	logx.Debugf("salary formula: %v", formula)
+
 	result, err := calculator.ParseAndExec(formula)
 	if err != nil {
 		logx.Errorf("%s : %v", formula, err)

--
Gitblit v1.8.0