From 1bd58eb901da8ca32d15c121effa7e22cc89e1bd Mon Sep 17 00:00:00 2001
From: yinbentan <yinbentan@live.com>
Date: 星期四, 25 七月 2024 11:47:12 +0800
Subject: [PATCH] 添加功能,工资计算(根据历史工资excel给定的规则进行编写)

---
 controllers/salary_plan_controller.go |  102 +
 models/payroll_production_car.go      |  409 +++++
 models/payroll_salary_plan.go         |  361 ++++
 docs/swagger.yaml                     |  466 ++++++
 docs/docs.go                          |  681 ++++++++
 docs/swagger.json                     |  681 ++++++++
 router/router.go                      |   13 
 controllers/request/salary_plan.go    |   30 
 models/payroll_working_hours.go       |  323 ++++
 models/payroll_production_group.go    |  290 +++
 models/payroll_production_weavers.go  |  322 ++++
 models/payroll_other_subsidies.go     |  299 +++
 models/db.go                          |    7 
 service/salary_plan.go                |  499 ++++++
 14 files changed, 4,461 insertions(+), 22 deletions(-)

diff --git a/controllers/request/salary_plan.go b/controllers/request/salary_plan.go
new file mode 100644
index 0000000..20c927e
--- /dev/null
+++ b/controllers/request/salary_plan.go
@@ -0,0 +1,30 @@
+package request
+
+type PayrollProductionCar struct {
+	PageInfo
+	Cycle          string `json:"cycle" form:"cycle"`                   // 缁熻鍛ㄦ湡锛堝勾-鏈�-鏃ワ級
+	Monthly        string `json:"monthly" form:"monthly"`               // 缁熻鍛ㄦ湡鎸夋湀鏌ヨ锛堝勾-鏈堬級
+	WorkshopNumber string `json:"workshopNumber" form:"workshopNumber"` // 杞﹂棿缂栧彿
+	GroupNumber    int    `json:"groupNumber"  form:"groupNumber"`      // 缁勫埆
+	CarNumber      int    `json:"carNumber"  form:"carNumber"`          // 杞﹀彴鍙�
+	MarketNumber   string `json:"marketNumber"  form:"marketNumber"`    // 搴勫彛缂栧彿
+	Spec           string `json:"spec"  form:"spec"`                    // 瑙勬牸
+	FinishLevel    string `json:"finishLevel"  form:"finishLevel"`      // 绛夌骇
+}
+
+type PayrollProductionGroup struct {
+	PageInfo
+	Cycle          string `json:"cycle"  form:"cycle"`                   // 缁熻鍛ㄦ湡锛堝勾-鏈�-鏃ワ級
+	Monthly        string `json:"monthly"  form:"monthly"`               // 缁熻鍛ㄦ湡鎸夋湀鏌ヨ锛堝勾-鏈堬級
+	WorkshopNumber string `json:"workshopNumber"  form:"workshopNumber"` // 杞﹂棿缂栧彿
+	GroupNumber    int    `json:"groupNumber"  form:"groupNumber"`       // 缁勫埆
+}
+
+type PayrollSalaryPlan 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"`           // 鍏抽敭瀛�
+}
diff --git a/controllers/salary_plan_controller.go b/controllers/salary_plan_controller.go
index 0212979..461b326 100644
--- a/controllers/salary_plan_controller.go
+++ b/controllers/salary_plan_controller.go
@@ -233,3 +233,105 @@
 	}
 	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)
+}
diff --git a/docs/docs.go b/docs/docs.go
index d5e5cd8..14b0afe 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -357,6 +357,12 @@
                 "summary": "绾ゅ害妫�楠屽垪琛�",
                 "parameters": [
                     {
+                        "type": "integer",
+                        "description": "绾ゅ害鐧昏琛↖D",
+                        "name": "finenessRegisterID",
+                        "in": "query"
+                    },
+                    {
                         "type": "string",
                         "name": "keyword",
                         "in": "query"
@@ -446,7 +452,7 @@
                 "parameters": [
                     {
                         "type": "string",
-                        "description": "瀛楀吀淇℃伅",
+                        "description": "绾ゅ害妫�楠孖D",
                         "name": "id",
                         "in": "path",
                         "required": true
@@ -495,6 +501,46 @@
                         "description": "鎴愬姛",
                         "schema": {
                             "$ref": "#/definitions/util.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api-jl/v1/fineness/checkFinenessID/{id}": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "绾ゅ害妫�楠�"
+                ],
+                "summary": "鏍规嵁绾ゅ害鐧昏ID鑾峰彇绾ゅ害妫�楠岃鎯�",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "绾ゅ害鐧昏ID",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鎴愬姛",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/util.ResponseList"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/response.FinenessCheckInfo"
+                                        }
+                                    }
+                                }
+                            ]
                         }
                     }
                 }
@@ -625,6 +671,12 @@
                 ],
                 "summary": "绾ゅ害鐧昏鍒楄〃",
                 "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "绾ゅ害鐧昏琛↖D",
+                        "name": "finenessRegisterID",
+                        "in": "query"
+                    },
                     {
                         "type": "string",
                         "name": "keyword",
@@ -1084,6 +1136,273 @@
                 }
             }
         },
+        "/api-jl/v1/salary/getPayrollProductionCarList": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鍛樺伐钖祫/钖叕鏂规"
+                ],
+                "summary": "鑾峰彇杞﹀彴姣忓ぉ鐨勪骇閲忓垪琛�",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "token",
+                        "name": "Authorization",
+                        "in": "header",
+                        "required": true
+                    },
+                    {
+                        "type": "integer",
+                        "description": "杞﹀彴鍙�",
+                        "name": "carNumber",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "缁熻鍛ㄦ湡锛堝勾-鏈�-鏃ワ級",
+                        "name": "cycle",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "绛夌骇",
+                        "name": "finishLevel",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "缁勫埆",
+                        "name": "groupNumber",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "搴勫彛缂栧彿",
+                        "name": "marketNumber",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "缁熻鍛ㄦ湡鎸夋湀鏌ヨ锛堝勾-鏈堬級",
+                        "name": "monthly",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "椤电爜",
+                        "name": "page",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "姣忛〉澶у皬",
+                        "name": "pageSize",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "瑙勬牸",
+                        "name": "spec",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "杞﹂棿缂栧彿",
+                        "name": "workshopNumber",
+                        "in": "query"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鎴愬姛",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/util.ResponseList"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/models.PayrollProductionCar"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api-jl/v1/salary/getPayrollProductionGroupList": {
+            "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": "integer",
+                        "description": "缁勫埆",
+                        "name": "groupNumber",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "缁熻鍛ㄦ湡鎸夋湀鏌ヨ锛堝勾-鏈堬級",
+                        "name": "monthly",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "椤电爜",
+                        "name": "page",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "姣忛〉澶у皬",
+                        "name": "pageSize",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "杞﹂棿缂栧彿",
+                        "name": "workshopNumber",
+                        "in": "query"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鎴愬姛",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/util.ResponseList"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/models.PayrollProductionGroup"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api-jl/v1/salary/getPayrollSalaryPlanList": {
+            "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": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/models.PayrollSalaryPlan"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
         "/api-jl/v1/salary/getSalaryPlanList": {
             "post": {
                 "produces": [
@@ -1328,23 +1647,26 @@
                 "parameters": [
                     {
                         "enum": [
-                            0,
                             1,
                             2,
-                            3
+                            3,
+                            4,
+                            5
                         ],
                         "type": "integer",
                         "x-enum-comments": {
                             "DictTypeColor": "棰滆壊",
                             "DictTypeMarket": "搴勫彛",
                             "DictTypeSpec": "瑙勬牸",
+                            "DictTypeSubsidy": "琛ヨ创",
                             "DictTypeWorkshop": "杞﹂棿"
                         },
                         "x-enum-varnames": [
                             "DictTypeMarket",
                             "DictTypeWorkshop",
                             "DictTypeColor",
-                            "DictTypeSpec"
+                            "DictTypeSpec",
+                            "DictTypeSubsidy"
                         ],
                         "description": "瀛楀吀绫诲瀷",
                         "name": "dictType",
@@ -2465,22 +2787,25 @@
         "constvar.DictType": {
             "type": "integer",
             "enum": [
-                0,
                 1,
                 2,
-                3
+                3,
+                4,
+                5
             ],
             "x-enum-comments": {
                 "DictTypeColor": "棰滆壊",
                 "DictTypeMarket": "搴勫彛",
                 "DictTypeSpec": "瑙勬牸",
+                "DictTypeSubsidy": "琛ヨ创",
                 "DictTypeWorkshop": "杞﹂棿"
             },
             "x-enum-varnames": [
                 "DictTypeMarket",
                 "DictTypeWorkshop",
                 "DictTypeColor",
-                "DictTypeSpec"
+                "DictTypeSpec",
+                "DictTypeSubsidy"
             ]
         },
         "constvar.FileTemplateCategory": {
@@ -2496,6 +2821,45 @@
             "x-enum-varnames": [
                 "FileTemplateCategory_Selfmade",
                 "FileTemplateCategory_Output"
+            ]
+        },
+        "constvar.JobType": {
+            "type": "string",
+            "enum": [
+                "weavers",
+                "car_head",
+                "maintenance",
+                "boiled",
+                "scoop",
+                "transport",
+                "cleaner",
+                "machine_cleaner",
+                "all-powerful",
+                "monitor"
+            ],
+            "x-enum-comments": {
+                "JobTypeAllPowerful": "鍏ㄨ兘鏈哄姩",
+                "JobTypeBoiled": "鐓導宸�",
+                "JobTypeCarHead": "杞﹀ご宸�",
+                "JobTypeCleaner": "娓呮磥宸�",
+                "JobTypeMachineCleaner": "鎰熺煡鍣ㄦ竻娲楀伐",
+                "JobTypeMaintenance": "淇濆叏宸�",
+                "JobTypeMonitor": "鐝暱",
+                "JobTypeScoop": "鑸�鑼у伐",
+                "JobTypeTransport": "閫佽導宸�",
+                "JobTypeWeavers": "鎸¤溅宸�"
+            },
+            "x-enum-varnames": [
+                "JobTypeWeavers",
+                "JobTypeCarHead",
+                "JobTypeMaintenance",
+                "JobTypeBoiled",
+                "JobTypeScoop",
+                "JobTypeTransport",
+                "JobTypeCleaner",
+                "JobTypeMachineCleaner",
+                "JobTypeAllPowerful",
+                "JobTypeMonitor"
             ]
         },
         "constvar.MiniDictType": {
@@ -2860,6 +3224,7 @@
                     "type": "number"
                 },
                 "finenessRegisterID": {
+                    "description": "绾ゅ害鐧昏ID",
                     "type": "integer"
                 },
                 "id": {
@@ -2915,6 +3280,10 @@
                 "market": {
                     "description": "搴勫彛鍚嶇О",
                     "type": "string"
+                },
+                "marketId": {
+                    "description": "搴勫彛ID",
+                    "type": "integer"
                 },
                 "marketNumber": {
                     "description": "搴勫彛缂栧彿",
@@ -3032,6 +3401,287 @@
                 }
             }
         },
+        "models.PayrollProductionCar": {
+            "type": "object",
+            "properties": {
+                "badSilkQuantity": {
+                    "description": "閲庣氦鏁伴噺",
+                    "type": "number"
+                },
+                "badSilkTotalAmount": {
+                    "description": "閲庣氦鎬讳环",
+                    "type": "number"
+                },
+                "badSilkTotalAvgAmount": {
+                    "description": "閲庣氦浜哄钩鍧囨�讳环",
+                    "type": "number"
+                },
+                "badSilkType": {
+                    "description": "閲庣氦绫诲瀷",
+                    "type": "string"
+                },
+                "badSilkUnitAmount": {
+                    "description": "閲庣氦鍗曚环",
+                    "type": "number"
+                },
+                "carNumber": {
+                    "description": "杞﹀彴鍙�",
+                    "type": "integer"
+                },
+                "carWorkIds": {
+                    "description": "杞﹀彴鍏宠仈鎸¤溅宸D",
+                    "type": "string"
+                },
+                "carWorkQuantity": {
+                    "description": "杞﹀彴鍏宠仈浜哄憳鏁伴噺",
+                    "type": "integer"
+                },
+                "cycle": {
+                    "description": "缁熻鍛ㄦ湡锛堝勾鏈堟棩锛�",
+                    "type": "string"
+                },
+                "desiredLevel": {
+                    "description": "鏈熸湜绛夌骇",
+                    "type": "string"
+                },
+                "fallingSilkBucket": {
+                    "description": "钀戒笣妗舵暟",
+                    "type": "number"
+                },
+                "finishLevel": {
+                    "description": "鎴愬搧绛夌骇",
+                    "type": "string"
+                },
+                "finishTotalAmount": {
+                    "description": "鎴愬搧閲戦",
+                    "type": "number"
+                },
+                "finishTotalAvgAmount": {
+                    "description": "鎴愬搧浜哄钩鍧囬噾棰�",
+                    "type": "number"
+                },
+                "groupNumber": {
+                    "description": "缁勫埆",
+                    "type": "integer"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "marketId": {
+                    "description": "搴勫彛缂栧彿",
+                    "type": "integer"
+                },
+                "marketName": {
+                    "description": "搴勫彛鍚嶇О",
+                    "type": "string"
+                },
+                "marketNumber": {
+                    "description": "搴勫彛缂栧彿",
+                    "type": "string"
+                },
+                "silkAvgQuantity": {
+                    "description": "浜哄钩鍧囦笣閲�",
+                    "type": "number"
+                },
+                "silkQuantity": {
+                    "description": "涓濋噺",
+                    "type": "number"
+                },
+                "silkTotalAmount": {
+                    "description": "涓濋噺鎬讳环",
+                    "type": "number"
+                },
+                "silkTotalAvgAmount": {
+                    "description": "涓濋噺浜哄钩鍧囨�讳环",
+                    "type": "number"
+                },
+                "silkUnitAmount": {
+                    "description": "涓濆崟浠�",
+                    "type": "number"
+                },
+                "spec": {
+                    "description": "瑙勬牸",
+                    "type": "string"
+                },
+                "workshopNumber": {
+                    "description": "杞﹂棿缂栧彿",
+                    "type": "string"
+                }
+            }
+        },
+        "models.PayrollProductionGroup": {
+            "type": "object",
+            "properties": {
+                "badSilkQuantity": {
+                    "description": "閲庣氦鏁伴噺",
+                    "type": "number"
+                },
+                "badSilkTotalAmount": {
+                    "description": "閲庣氦鎬讳环",
+                    "type": "number"
+                },
+                "badSilkTotalAvgAmount": {
+                    "description": "閲庣氦浜哄钩鍧囨�讳环",
+                    "type": "number"
+                },
+                "cycle": {
+                    "description": "缁熻鍛ㄦ湡锛堝勾鏈堟棩锛�",
+                    "type": "string"
+                },
+                "fallingSilkBucket": {
+                    "type": "number"
+                },
+                "finishTotalAmount": {
+                    "description": "鎴愬搧閲戦",
+                    "type": "number"
+                },
+                "finishTotalAvgAmount": {
+                    "description": "鎴愬搧浜哄钩鍧囬噾棰�",
+                    "type": "number"
+                },
+                "groupNumber": {
+                    "description": "缁勫埆",
+                    "type": "integer"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "silkAvgQuantity": {
+                    "description": "浜哄钩鍧囦笣閲�",
+                    "type": "number"
+                },
+                "silkQuantity": {
+                    "description": "涓濋噺",
+                    "type": "number"
+                },
+                "silkTotalAmount": {
+                    "description": "涓濋噺鎬讳环",
+                    "type": "number"
+                },
+                "silkTotalAvgAmount": {
+                    "description": "涓濋噺浜哄钩鍧囨�讳环",
+                    "type": "number"
+                },
+                "workshopName": {
+                    "description": "杞﹂棿鍚嶇О",
+                    "type": "string"
+                },
+                "workshopNumber": {
+                    "description": "杞﹂棿缂栧彿",
+                    "type": "string"
+                }
+            }
+        },
+        "models.PayrollSalaryPlan": {
+            "type": "object",
+            "properties": {
+                "amount": {
+                    "description": "搴斿彂宸ヨ祫",
+                    "type": "number"
+                },
+                "baseSalaryAmount": {
+                    "description": "涓嶈揪淇濆簳",
+                    "type": "number"
+                },
+                "cycle": {
+                    "description": "鏈堜唤",
+                    "type": "string"
+                },
+                "dailyInspectionAmount": {
+                    "description": "鏃ュ父妫�鏌�/濂栫綒3",
+                    "type": "number"
+                },
+                "downtimeAmount": {
+                    "description": "鍋滄満琛ヨ创",
+                    "type": "number"
+                },
+                "heatAmount": {
+                    "description": "濂栫綒2/娓呭噳琛ヨ创",
+                    "type": "number"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "longTermAmount": {
+                    "description": "婊″嫟",
+                    "type": "number"
+                },
+                "masterApprenticeAmount": {
+                    "description": "甯﹀緬琛ヨ创",
+                    "type": "number"
+                },
+                "overtimeAmount": {
+                    "description": "鍔犵彮宸ヨ祫",
+                    "type": "number"
+                },
+                "positionAmount": {
+                    "description": "宀椾綅琛ヨ创",
+                    "type": "number"
+                },
+                "productionAmount": {
+                    "description": "鐢熶骇宸ヨ祫",
+                    "type": "number"
+                },
+                "qualityStandardsAmount": {
+                    "description": "璐ㄩ噺濂�",
+                    "type": "number"
+                },
+                "quantity": {
+                    "description": "浜ч噺",
+                    "type": "number"
+                },
+                "remark": {
+                    "description": "澶囨敞",
+                    "type": "string"
+                },
+                "seniorityAmount": {
+                    "description": "宸ラ緞琛ヨ创",
+                    "type": "number"
+                },
+                "socialSecurityAmount": {
+                    "description": "绀句繚琛ヨ创",
+                    "type": "number"
+                },
+                "substandardQualityAmount": {
+                    "description": "濂栫綒1",
+                    "type": "number"
+                },
+                "timeoutAmount": {
+                    "description": "瓒呮椂宸ヨ祫",
+                    "type": "number"
+                },
+                "trafficAmount": {
+                    "description": "浜ら�氳ˉ璐�",
+                    "type": "number"
+                },
+                "workTypeCode": {
+                    "description": "宸ョ浠g爜",
+                    "allOf": [
+                        {
+                            "$ref": "#/definitions/constvar.JobType"
+                        }
+                    ]
+                },
+                "workTypeID": {
+                    "description": "宸ョID",
+                    "type": "integer"
+                },
+                "workTypeName": {
+                    "description": "宸ョ鍚嶇О",
+                    "type": "string"
+                },
+                "worker": {
+                    "$ref": "#/definitions/models.Worker"
+                },
+                "workerId": {
+                    "description": "鍛樺伐ID",
+                    "type": "string"
+                },
+                "workerName": {
+                    "type": "string"
+                }
+            }
+        },
         "models.RawSilkPriceStandard": {
             "type": "object",
             "properties": {
@@ -3048,6 +3698,9 @@
                     "type": "integer"
                 },
                 "marketName": {
+                    "type": "string"
+                },
+                "marketNumber": {
                     "type": "string"
                 },
                 "notes": {
@@ -3118,6 +3771,9 @@
                 "addPeople": {
                     "type": "string"
                 },
+                "code": {
+                    "$ref": "#/definitions/constvar.JobType"
+                },
                 "createTime": {
                     "type": "string"
                 },
@@ -3185,6 +3841,9 @@
                 },
                 "workType": {
                     "type": "string"
+                },
+                "workTypeCode": {
+                    "$ref": "#/definitions/constvar.JobType"
                 },
                 "workTypeId": {
                     "type": "integer"
@@ -3371,6 +4030,10 @@
                 },
                 "marketName": {
                     "description": "搴勫彛鍚�",
+                    "type": "string"
+                },
+                "marketNumber": {
+                    "description": "搴勫彛缂栧彿",
                     "type": "string"
                 },
                 "number": {
@@ -4341,6 +5004,10 @@
                     "description": "搴勫彛id",
                     "type": "integer"
                 },
+                "marketNumber": {
+                    "description": "搴勫彛缂栧彿",
+                    "type": "string"
+                },
                 "number": {
                     "description": "缂栧彿",
                     "type": "string"
diff --git a/docs/swagger.json b/docs/swagger.json
index 6237fc6..71bc2ef 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -346,6 +346,12 @@
                 "summary": "绾ゅ害妫�楠屽垪琛�",
                 "parameters": [
                     {
+                        "type": "integer",
+                        "description": "绾ゅ害鐧昏琛↖D",
+                        "name": "finenessRegisterID",
+                        "in": "query"
+                    },
+                    {
                         "type": "string",
                         "name": "keyword",
                         "in": "query"
@@ -435,7 +441,7 @@
                 "parameters": [
                     {
                         "type": "string",
-                        "description": "瀛楀吀淇℃伅",
+                        "description": "绾ゅ害妫�楠孖D",
                         "name": "id",
                         "in": "path",
                         "required": true
@@ -484,6 +490,46 @@
                         "description": "鎴愬姛",
                         "schema": {
                             "$ref": "#/definitions/util.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api-jl/v1/fineness/checkFinenessID/{id}": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "绾ゅ害妫�楠�"
+                ],
+                "summary": "鏍规嵁绾ゅ害鐧昏ID鑾峰彇绾ゅ害妫�楠岃鎯�",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "绾ゅ害鐧昏ID",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鎴愬姛",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/util.ResponseList"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/response.FinenessCheckInfo"
+                                        }
+                                    }
+                                }
+                            ]
                         }
                     }
                 }
@@ -614,6 +660,12 @@
                 ],
                 "summary": "绾ゅ害鐧昏鍒楄〃",
                 "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "绾ゅ害鐧昏琛↖D",
+                        "name": "finenessRegisterID",
+                        "in": "query"
+                    },
                     {
                         "type": "string",
                         "name": "keyword",
@@ -1073,6 +1125,273 @@
                 }
             }
         },
+        "/api-jl/v1/salary/getPayrollProductionCarList": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鍛樺伐钖祫/钖叕鏂规"
+                ],
+                "summary": "鑾峰彇杞﹀彴姣忓ぉ鐨勪骇閲忓垪琛�",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "token",
+                        "name": "Authorization",
+                        "in": "header",
+                        "required": true
+                    },
+                    {
+                        "type": "integer",
+                        "description": "杞﹀彴鍙�",
+                        "name": "carNumber",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "缁熻鍛ㄦ湡锛堝勾-鏈�-鏃ワ級",
+                        "name": "cycle",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "绛夌骇",
+                        "name": "finishLevel",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "缁勫埆",
+                        "name": "groupNumber",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "搴勫彛缂栧彿",
+                        "name": "marketNumber",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "缁熻鍛ㄦ湡鎸夋湀鏌ヨ锛堝勾-鏈堬級",
+                        "name": "monthly",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "椤电爜",
+                        "name": "page",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "姣忛〉澶у皬",
+                        "name": "pageSize",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "瑙勬牸",
+                        "name": "spec",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "杞﹂棿缂栧彿",
+                        "name": "workshopNumber",
+                        "in": "query"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鎴愬姛",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/util.ResponseList"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/models.PayrollProductionCar"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api-jl/v1/salary/getPayrollProductionGroupList": {
+            "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": "integer",
+                        "description": "缁勫埆",
+                        "name": "groupNumber",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "缁熻鍛ㄦ湡鎸夋湀鏌ヨ锛堝勾-鏈堬級",
+                        "name": "monthly",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "椤电爜",
+                        "name": "page",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "姣忛〉澶у皬",
+                        "name": "pageSize",
+                        "in": "query"
+                    },
+                    {
+                        "type": "string",
+                        "description": "杞﹂棿缂栧彿",
+                        "name": "workshopNumber",
+                        "in": "query"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鎴愬姛",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/util.ResponseList"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/models.PayrollProductionGroup"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api-jl/v1/salary/getPayrollSalaryPlanList": {
+            "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": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/models.PayrollSalaryPlan"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
         "/api-jl/v1/salary/getSalaryPlanList": {
             "post": {
                 "produces": [
@@ -1317,23 +1636,26 @@
                 "parameters": [
                     {
                         "enum": [
-                            0,
                             1,
                             2,
-                            3
+                            3,
+                            4,
+                            5
                         ],
                         "type": "integer",
                         "x-enum-comments": {
                             "DictTypeColor": "棰滆壊",
                             "DictTypeMarket": "搴勫彛",
                             "DictTypeSpec": "瑙勬牸",
+                            "DictTypeSubsidy": "琛ヨ创",
                             "DictTypeWorkshop": "杞﹂棿"
                         },
                         "x-enum-varnames": [
                             "DictTypeMarket",
                             "DictTypeWorkshop",
                             "DictTypeColor",
-                            "DictTypeSpec"
+                            "DictTypeSpec",
+                            "DictTypeSubsidy"
                         ],
                         "description": "瀛楀吀绫诲瀷",
                         "name": "dictType",
@@ -2454,22 +2776,25 @@
         "constvar.DictType": {
             "type": "integer",
             "enum": [
-                0,
                 1,
                 2,
-                3
+                3,
+                4,
+                5
             ],
             "x-enum-comments": {
                 "DictTypeColor": "棰滆壊",
                 "DictTypeMarket": "搴勫彛",
                 "DictTypeSpec": "瑙勬牸",
+                "DictTypeSubsidy": "琛ヨ创",
                 "DictTypeWorkshop": "杞﹂棿"
             },
             "x-enum-varnames": [
                 "DictTypeMarket",
                 "DictTypeWorkshop",
                 "DictTypeColor",
-                "DictTypeSpec"
+                "DictTypeSpec",
+                "DictTypeSubsidy"
             ]
         },
         "constvar.FileTemplateCategory": {
@@ -2485,6 +2810,45 @@
             "x-enum-varnames": [
                 "FileTemplateCategory_Selfmade",
                 "FileTemplateCategory_Output"
+            ]
+        },
+        "constvar.JobType": {
+            "type": "string",
+            "enum": [
+                "weavers",
+                "car_head",
+                "maintenance",
+                "boiled",
+                "scoop",
+                "transport",
+                "cleaner",
+                "machine_cleaner",
+                "all-powerful",
+                "monitor"
+            ],
+            "x-enum-comments": {
+                "JobTypeAllPowerful": "鍏ㄨ兘鏈哄姩",
+                "JobTypeBoiled": "鐓導宸�",
+                "JobTypeCarHead": "杞﹀ご宸�",
+                "JobTypeCleaner": "娓呮磥宸�",
+                "JobTypeMachineCleaner": "鎰熺煡鍣ㄦ竻娲楀伐",
+                "JobTypeMaintenance": "淇濆叏宸�",
+                "JobTypeMonitor": "鐝暱",
+                "JobTypeScoop": "鑸�鑼у伐",
+                "JobTypeTransport": "閫佽導宸�",
+                "JobTypeWeavers": "鎸¤溅宸�"
+            },
+            "x-enum-varnames": [
+                "JobTypeWeavers",
+                "JobTypeCarHead",
+                "JobTypeMaintenance",
+                "JobTypeBoiled",
+                "JobTypeScoop",
+                "JobTypeTransport",
+                "JobTypeCleaner",
+                "JobTypeMachineCleaner",
+                "JobTypeAllPowerful",
+                "JobTypeMonitor"
             ]
         },
         "constvar.MiniDictType": {
@@ -2849,6 +3213,7 @@
                     "type": "number"
                 },
                 "finenessRegisterID": {
+                    "description": "绾ゅ害鐧昏ID",
                     "type": "integer"
                 },
                 "id": {
@@ -2904,6 +3269,10 @@
                 "market": {
                     "description": "搴勫彛鍚嶇О",
                     "type": "string"
+                },
+                "marketId": {
+                    "description": "搴勫彛ID",
+                    "type": "integer"
                 },
                 "marketNumber": {
                     "description": "搴勫彛缂栧彿",
@@ -3021,6 +3390,287 @@
                 }
             }
         },
+        "models.PayrollProductionCar": {
+            "type": "object",
+            "properties": {
+                "badSilkQuantity": {
+                    "description": "閲庣氦鏁伴噺",
+                    "type": "number"
+                },
+                "badSilkTotalAmount": {
+                    "description": "閲庣氦鎬讳环",
+                    "type": "number"
+                },
+                "badSilkTotalAvgAmount": {
+                    "description": "閲庣氦浜哄钩鍧囨�讳环",
+                    "type": "number"
+                },
+                "badSilkType": {
+                    "description": "閲庣氦绫诲瀷",
+                    "type": "string"
+                },
+                "badSilkUnitAmount": {
+                    "description": "閲庣氦鍗曚环",
+                    "type": "number"
+                },
+                "carNumber": {
+                    "description": "杞﹀彴鍙�",
+                    "type": "integer"
+                },
+                "carWorkIds": {
+                    "description": "杞﹀彴鍏宠仈鎸¤溅宸D",
+                    "type": "string"
+                },
+                "carWorkQuantity": {
+                    "description": "杞﹀彴鍏宠仈浜哄憳鏁伴噺",
+                    "type": "integer"
+                },
+                "cycle": {
+                    "description": "缁熻鍛ㄦ湡锛堝勾鏈堟棩锛�",
+                    "type": "string"
+                },
+                "desiredLevel": {
+                    "description": "鏈熸湜绛夌骇",
+                    "type": "string"
+                },
+                "fallingSilkBucket": {
+                    "description": "钀戒笣妗舵暟",
+                    "type": "number"
+                },
+                "finishLevel": {
+                    "description": "鎴愬搧绛夌骇",
+                    "type": "string"
+                },
+                "finishTotalAmount": {
+                    "description": "鎴愬搧閲戦",
+                    "type": "number"
+                },
+                "finishTotalAvgAmount": {
+                    "description": "鎴愬搧浜哄钩鍧囬噾棰�",
+                    "type": "number"
+                },
+                "groupNumber": {
+                    "description": "缁勫埆",
+                    "type": "integer"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "marketId": {
+                    "description": "搴勫彛缂栧彿",
+                    "type": "integer"
+                },
+                "marketName": {
+                    "description": "搴勫彛鍚嶇О",
+                    "type": "string"
+                },
+                "marketNumber": {
+                    "description": "搴勫彛缂栧彿",
+                    "type": "string"
+                },
+                "silkAvgQuantity": {
+                    "description": "浜哄钩鍧囦笣閲�",
+                    "type": "number"
+                },
+                "silkQuantity": {
+                    "description": "涓濋噺",
+                    "type": "number"
+                },
+                "silkTotalAmount": {
+                    "description": "涓濋噺鎬讳环",
+                    "type": "number"
+                },
+                "silkTotalAvgAmount": {
+                    "description": "涓濋噺浜哄钩鍧囨�讳环",
+                    "type": "number"
+                },
+                "silkUnitAmount": {
+                    "description": "涓濆崟浠�",
+                    "type": "number"
+                },
+                "spec": {
+                    "description": "瑙勬牸",
+                    "type": "string"
+                },
+                "workshopNumber": {
+                    "description": "杞﹂棿缂栧彿",
+                    "type": "string"
+                }
+            }
+        },
+        "models.PayrollProductionGroup": {
+            "type": "object",
+            "properties": {
+                "badSilkQuantity": {
+                    "description": "閲庣氦鏁伴噺",
+                    "type": "number"
+                },
+                "badSilkTotalAmount": {
+                    "description": "閲庣氦鎬讳环",
+                    "type": "number"
+                },
+                "badSilkTotalAvgAmount": {
+                    "description": "閲庣氦浜哄钩鍧囨�讳环",
+                    "type": "number"
+                },
+                "cycle": {
+                    "description": "缁熻鍛ㄦ湡锛堝勾鏈堟棩锛�",
+                    "type": "string"
+                },
+                "fallingSilkBucket": {
+                    "type": "number"
+                },
+                "finishTotalAmount": {
+                    "description": "鎴愬搧閲戦",
+                    "type": "number"
+                },
+                "finishTotalAvgAmount": {
+                    "description": "鎴愬搧浜哄钩鍧囬噾棰�",
+                    "type": "number"
+                },
+                "groupNumber": {
+                    "description": "缁勫埆",
+                    "type": "integer"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "silkAvgQuantity": {
+                    "description": "浜哄钩鍧囦笣閲�",
+                    "type": "number"
+                },
+                "silkQuantity": {
+                    "description": "涓濋噺",
+                    "type": "number"
+                },
+                "silkTotalAmount": {
+                    "description": "涓濋噺鎬讳环",
+                    "type": "number"
+                },
+                "silkTotalAvgAmount": {
+                    "description": "涓濋噺浜哄钩鍧囨�讳环",
+                    "type": "number"
+                },
+                "workshopName": {
+                    "description": "杞﹂棿鍚嶇О",
+                    "type": "string"
+                },
+                "workshopNumber": {
+                    "description": "杞﹂棿缂栧彿",
+                    "type": "string"
+                }
+            }
+        },
+        "models.PayrollSalaryPlan": {
+            "type": "object",
+            "properties": {
+                "amount": {
+                    "description": "搴斿彂宸ヨ祫",
+                    "type": "number"
+                },
+                "baseSalaryAmount": {
+                    "description": "涓嶈揪淇濆簳",
+                    "type": "number"
+                },
+                "cycle": {
+                    "description": "鏈堜唤",
+                    "type": "string"
+                },
+                "dailyInspectionAmount": {
+                    "description": "鏃ュ父妫�鏌�/濂栫綒3",
+                    "type": "number"
+                },
+                "downtimeAmount": {
+                    "description": "鍋滄満琛ヨ创",
+                    "type": "number"
+                },
+                "heatAmount": {
+                    "description": "濂栫綒2/娓呭噳琛ヨ创",
+                    "type": "number"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "longTermAmount": {
+                    "description": "婊″嫟",
+                    "type": "number"
+                },
+                "masterApprenticeAmount": {
+                    "description": "甯﹀緬琛ヨ创",
+                    "type": "number"
+                },
+                "overtimeAmount": {
+                    "description": "鍔犵彮宸ヨ祫",
+                    "type": "number"
+                },
+                "positionAmount": {
+                    "description": "宀椾綅琛ヨ创",
+                    "type": "number"
+                },
+                "productionAmount": {
+                    "description": "鐢熶骇宸ヨ祫",
+                    "type": "number"
+                },
+                "qualityStandardsAmount": {
+                    "description": "璐ㄩ噺濂�",
+                    "type": "number"
+                },
+                "quantity": {
+                    "description": "浜ч噺",
+                    "type": "number"
+                },
+                "remark": {
+                    "description": "澶囨敞",
+                    "type": "string"
+                },
+                "seniorityAmount": {
+                    "description": "宸ラ緞琛ヨ创",
+                    "type": "number"
+                },
+                "socialSecurityAmount": {
+                    "description": "绀句繚琛ヨ创",
+                    "type": "number"
+                },
+                "substandardQualityAmount": {
+                    "description": "濂栫綒1",
+                    "type": "number"
+                },
+                "timeoutAmount": {
+                    "description": "瓒呮椂宸ヨ祫",
+                    "type": "number"
+                },
+                "trafficAmount": {
+                    "description": "浜ら�氳ˉ璐�",
+                    "type": "number"
+                },
+                "workTypeCode": {
+                    "description": "宸ョ浠g爜",
+                    "allOf": [
+                        {
+                            "$ref": "#/definitions/constvar.JobType"
+                        }
+                    ]
+                },
+                "workTypeID": {
+                    "description": "宸ョID",
+                    "type": "integer"
+                },
+                "workTypeName": {
+                    "description": "宸ョ鍚嶇О",
+                    "type": "string"
+                },
+                "worker": {
+                    "$ref": "#/definitions/models.Worker"
+                },
+                "workerId": {
+                    "description": "鍛樺伐ID",
+                    "type": "string"
+                },
+                "workerName": {
+                    "type": "string"
+                }
+            }
+        },
         "models.RawSilkPriceStandard": {
             "type": "object",
             "properties": {
@@ -3037,6 +3687,9 @@
                     "type": "integer"
                 },
                 "marketName": {
+                    "type": "string"
+                },
+                "marketNumber": {
                     "type": "string"
                 },
                 "notes": {
@@ -3107,6 +3760,9 @@
                 "addPeople": {
                     "type": "string"
                 },
+                "code": {
+                    "$ref": "#/definitions/constvar.JobType"
+                },
                 "createTime": {
                     "type": "string"
                 },
@@ -3174,6 +3830,9 @@
                 },
                 "workType": {
                     "type": "string"
+                },
+                "workTypeCode": {
+                    "$ref": "#/definitions/constvar.JobType"
                 },
                 "workTypeId": {
                     "type": "integer"
@@ -3360,6 +4019,10 @@
                 },
                 "marketName": {
                     "description": "搴勫彛鍚�",
+                    "type": "string"
+                },
+                "marketNumber": {
+                    "description": "搴勫彛缂栧彿",
                     "type": "string"
                 },
                 "number": {
@@ -4330,6 +4993,10 @@
                     "description": "搴勫彛id",
                     "type": "integer"
                 },
+                "marketNumber": {
+                    "description": "搴勫彛缂栧彿",
+                    "type": "string"
+                },
                 "number": {
                     "description": "缂栧彿",
                     "type": "string"
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index d383d84..5c36380 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -49,21 +49,24 @@
     - CheckItemMaxDeviation
   constvar.DictType:
     enum:
-    - 0
     - 1
     - 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
@@ -75,6 +78,41 @@
     x-enum-varnames:
     - FileTemplateCategory_Selfmade
     - FileTemplateCategory_Output
+  constvar.JobType:
+    enum:
+    - weavers
+    - car_head
+    - maintenance
+    - boiled
+    - scoop
+    - transport
+    - cleaner
+    - machine_cleaner
+    - all-powerful
+    - monitor
+    type: string
+    x-enum-comments:
+      JobTypeAllPowerful: 鍏ㄨ兘鏈哄姩
+      JobTypeBoiled: 鐓導宸�
+      JobTypeCarHead: 杞﹀ご宸�
+      JobTypeCleaner: 娓呮磥宸�
+      JobTypeMachineCleaner: 鎰熺煡鍣ㄦ竻娲楀伐
+      JobTypeMaintenance: 淇濆叏宸�
+      JobTypeMonitor: 鐝暱
+      JobTypeScoop: 鑸�鑼у伐
+      JobTypeTransport: 閫佽導宸�
+      JobTypeWeavers: 鎸¤溅宸�
+    x-enum-varnames:
+    - JobTypeWeavers
+    - JobTypeCarHead
+    - JobTypeMaintenance
+    - JobTypeBoiled
+    - JobTypeScoop
+    - JobTypeTransport
+    - JobTypeCleaner
+    - JobTypeMachineCleaner
+    - JobTypeAllPowerful
+    - JobTypeMonitor
   constvar.MiniDictType:
     enum:
     - 1
@@ -334,6 +372,7 @@
         description: 绾ゅ害
         type: number
       finenessRegisterID:
+        description: 绾ゅ害鐧昏ID
         type: integer
       id:
         type: integer
@@ -373,6 +412,9 @@
       market:
         description: 搴勫彛鍚嶇О
         type: string
+      marketId:
+        description: 搴勫彛ID
+        type: integer
       marketNumber:
         description: 搴勫彛缂栧彿
         type: string
@@ -452,6 +494,211 @@
       value:
         type: string
     type: object
+  models.PayrollProductionCar:
+    properties:
+      badSilkQuantity:
+        description: 閲庣氦鏁伴噺
+        type: number
+      badSilkTotalAmount:
+        description: 閲庣氦鎬讳环
+        type: number
+      badSilkTotalAvgAmount:
+        description: 閲庣氦浜哄钩鍧囨�讳环
+        type: number
+      badSilkType:
+        description: 閲庣氦绫诲瀷
+        type: string
+      badSilkUnitAmount:
+        description: 閲庣氦鍗曚环
+        type: number
+      carNumber:
+        description: 杞﹀彴鍙�
+        type: integer
+      carWorkIds:
+        description: 杞﹀彴鍏宠仈鎸¤溅宸D
+        type: string
+      carWorkQuantity:
+        description: 杞﹀彴鍏宠仈浜哄憳鏁伴噺
+        type: integer
+      cycle:
+        description: 缁熻鍛ㄦ湡锛堝勾鏈堟棩锛�
+        type: string
+      desiredLevel:
+        description: 鏈熸湜绛夌骇
+        type: string
+      fallingSilkBucket:
+        description: 钀戒笣妗舵暟
+        type: number
+      finishLevel:
+        description: 鎴愬搧绛夌骇
+        type: string
+      finishTotalAmount:
+        description: 鎴愬搧閲戦
+        type: number
+      finishTotalAvgAmount:
+        description: 鎴愬搧浜哄钩鍧囬噾棰�
+        type: number
+      groupNumber:
+        description: 缁勫埆
+        type: integer
+      id:
+        type: integer
+      marketId:
+        description: 搴勫彛缂栧彿
+        type: integer
+      marketName:
+        description: 搴勫彛鍚嶇О
+        type: string
+      marketNumber:
+        description: 搴勫彛缂栧彿
+        type: string
+      silkAvgQuantity:
+        description: 浜哄钩鍧囦笣閲�
+        type: number
+      silkQuantity:
+        description: 涓濋噺
+        type: number
+      silkTotalAmount:
+        description: 涓濋噺鎬讳环
+        type: number
+      silkTotalAvgAmount:
+        description: 涓濋噺浜哄钩鍧囨�讳环
+        type: number
+      silkUnitAmount:
+        description: 涓濆崟浠�
+        type: number
+      spec:
+        description: 瑙勬牸
+        type: string
+      workshopNumber:
+        description: 杞﹂棿缂栧彿
+        type: string
+    type: object
+  models.PayrollProductionGroup:
+    properties:
+      badSilkQuantity:
+        description: 閲庣氦鏁伴噺
+        type: number
+      badSilkTotalAmount:
+        description: 閲庣氦鎬讳环
+        type: number
+      badSilkTotalAvgAmount:
+        description: 閲庣氦浜哄钩鍧囨�讳环
+        type: number
+      cycle:
+        description: 缁熻鍛ㄦ湡锛堝勾鏈堟棩锛�
+        type: string
+      fallingSilkBucket:
+        type: number
+      finishTotalAmount:
+        description: 鎴愬搧閲戦
+        type: number
+      finishTotalAvgAmount:
+        description: 鎴愬搧浜哄钩鍧囬噾棰�
+        type: number
+      groupNumber:
+        description: 缁勫埆
+        type: integer
+      id:
+        type: integer
+      silkAvgQuantity:
+        description: 浜哄钩鍧囦笣閲�
+        type: number
+      silkQuantity:
+        description: 涓濋噺
+        type: number
+      silkTotalAmount:
+        description: 涓濋噺鎬讳环
+        type: number
+      silkTotalAvgAmount:
+        description: 涓濋噺浜哄钩鍧囨�讳环
+        type: number
+      workshopName:
+        description: 杞﹂棿鍚嶇О
+        type: string
+      workshopNumber:
+        description: 杞﹂棿缂栧彿
+        type: string
+    type: object
+  models.PayrollSalaryPlan:
+    properties:
+      amount:
+        description: 搴斿彂宸ヨ祫
+        type: number
+      baseSalaryAmount:
+        description: 涓嶈揪淇濆簳
+        type: number
+      cycle:
+        description: 鏈堜唤
+        type: string
+      dailyInspectionAmount:
+        description: 鏃ュ父妫�鏌�/濂栫綒3
+        type: number
+      downtimeAmount:
+        description: 鍋滄満琛ヨ创
+        type: number
+      heatAmount:
+        description: 濂栫綒2/娓呭噳琛ヨ创
+        type: number
+      id:
+        type: integer
+      longTermAmount:
+        description: 婊″嫟
+        type: number
+      masterApprenticeAmount:
+        description: 甯﹀緬琛ヨ创
+        type: number
+      overtimeAmount:
+        description: 鍔犵彮宸ヨ祫
+        type: number
+      positionAmount:
+        description: 宀椾綅琛ヨ创
+        type: number
+      productionAmount:
+        description: 鐢熶骇宸ヨ祫
+        type: number
+      qualityStandardsAmount:
+        description: 璐ㄩ噺濂�
+        type: number
+      quantity:
+        description: 浜ч噺
+        type: number
+      remark:
+        description: 澶囨敞
+        type: string
+      seniorityAmount:
+        description: 宸ラ緞琛ヨ创
+        type: number
+      socialSecurityAmount:
+        description: 绀句繚琛ヨ创
+        type: number
+      substandardQualityAmount:
+        description: 濂栫綒1
+        type: number
+      timeoutAmount:
+        description: 瓒呮椂宸ヨ祫
+        type: number
+      trafficAmount:
+        description: 浜ら�氳ˉ璐�
+        type: number
+      workTypeCode:
+        allOf:
+        - $ref: '#/definitions/constvar.JobType'
+        description: 宸ョ浠g爜
+      workTypeID:
+        description: 宸ョID
+        type: integer
+      workTypeName:
+        description: 宸ョ鍚嶇О
+        type: string
+      worker:
+        $ref: '#/definitions/models.Worker'
+      workerId:
+        description: 鍛樺伐ID
+        type: string
+      workerName:
+        type: string
+    type: object
   models.RawSilkPriceStandard:
     properties:
       createdAt:
@@ -463,6 +710,8 @@
       marketId:
         type: integer
       marketName:
+        type: string
+      marketNumber:
         type: string
       notes:
         type: string
@@ -509,6 +758,8 @@
     properties:
       addPeople:
         type: string
+      code:
+        $ref: '#/definitions/constvar.JobType'
       createTime:
         type: string
       createdAt:
@@ -554,6 +805,8 @@
         $ref: '#/definitions/constvar.WorkerStatus'
       workType:
         type: string
+      workTypeCode:
+        $ref: '#/definitions/constvar.JobType'
       workTypeId:
         type: integer
     type: object
@@ -677,6 +930,9 @@
         type: integer
       marketName:
         description: 搴勫彛鍚�
+        type: string
+      marketNumber:
+        description: 搴勫彛缂栧彿
         type: string
       number:
         type: string
@@ -1347,6 +1603,9 @@
       marketId:
         description: 搴勫彛id
         type: integer
+      marketNumber:
+        description: 搴勫彛缂栧彿
+        type: string
       number:
         description: 缂栧彿
         type: string
@@ -1851,6 +2110,10 @@
   /api-jl/v1/fineness/check:
     get:
       parameters:
+      - description: 绾ゅ害鐧昏琛↖D
+        in: query
+        name: finenessRegisterID
+        type: integer
       - in: query
         name: keyword
         type: string
@@ -1922,7 +2185,7 @@
       - 绾ゅ害妫�楠�
     get:
       parameters:
-      - description: 瀛楀吀淇℃伅
+      - description: 绾ゅ害妫�楠孖D
         in: path
         name: id
         required: true
@@ -1940,6 +2203,29 @@
                   $ref: '#/definitions/response.FinenessCheckInfo'
               type: object
       summary: 绾ゅ害妫�楠岃鎯�
+      tags:
+      - 绾ゅ害妫�楠�
+  /api-jl/v1/fineness/checkFinenessID/{id}:
+    get:
+      parameters:
+      - description: 绾ゅ害鐧昏ID
+        in: path
+        name: id
+        required: true
+        type: string
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 鎴愬姛
+          schema:
+            allOf:
+            - $ref: '#/definitions/util.ResponseList'
+            - properties:
+                data:
+                  $ref: '#/definitions/response.FinenessCheckInfo'
+              type: object
+      summary: 鏍规嵁绾ゅ害鐧昏ID鑾峰彇绾ゅ害妫�楠岃鎯�
       tags:
       - 绾ゅ害妫�楠�
   /api-jl/v1/fineness/deleteYieldRegister/{number}:
@@ -2013,6 +2299,10 @@
   /api-jl/v1/fineness/register:
     get:
       parameters:
+      - description: 绾ゅ害鐧昏琛↖D
+        in: query
+        name: finenessRegisterID
+        type: integer
       - in: query
         name: keyword
         type: string
@@ -2303,6 +2593,173 @@
       summary: 鍒犻櫎钖叕鏂规
       tags:
       - 鍛樺伐钖祫/钖叕鏂规
+  /api-jl/v1/salary/getPayrollProductionCarList:
+    get:
+      parameters:
+      - description: token
+        in: header
+        name: Authorization
+        required: true
+        type: string
+      - description: 杞﹀彴鍙�
+        in: query
+        name: carNumber
+        type: integer
+      - description: 缁熻鍛ㄦ湡锛堝勾-鏈�-鏃ワ級
+        in: query
+        name: cycle
+        type: string
+      - description: 绛夌骇
+        in: query
+        name: finishLevel
+        type: string
+      - description: 缁勫埆
+        in: query
+        name: groupNumber
+        type: integer
+      - description: 搴勫彛缂栧彿
+        in: query
+        name: marketNumber
+        type: string
+      - description: 缁熻鍛ㄦ湡鎸夋湀鏌ヨ锛堝勾-鏈堬級
+        in: query
+        name: monthly
+        type: string
+      - description: 椤电爜
+        in: query
+        name: page
+        type: integer
+      - description: 姣忛〉澶у皬
+        in: query
+        name: pageSize
+        type: integer
+      - description: 瑙勬牸
+        in: query
+        name: spec
+        type: string
+      - description: 杞﹂棿缂栧彿
+        in: query
+        name: workshopNumber
+        type: string
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 鎴愬姛
+          schema:
+            allOf:
+            - $ref: '#/definitions/util.ResponseList'
+            - properties:
+                data:
+                  items:
+                    $ref: '#/definitions/models.PayrollProductionCar'
+                  type: array
+              type: object
+      summary: 鑾峰彇杞﹀彴姣忓ぉ鐨勪骇閲忓垪琛�
+      tags:
+      - 鍛樺伐钖祫/钖叕鏂规
+  /api-jl/v1/salary/getPayrollProductionGroupList:
+    get:
+      parameters:
+      - description: token
+        in: header
+        name: Authorization
+        required: true
+        type: string
+      - description: 缁熻鍛ㄦ湡锛堝勾-鏈�-鏃ワ級
+        in: query
+        name: cycle
+        type: string
+      - description: 缁勫埆
+        in: query
+        name: groupNumber
+        type: integer
+      - description: 缁熻鍛ㄦ湡鎸夋湀鏌ヨ锛堝勾-鏈堬級
+        in: query
+        name: monthly
+        type: string
+      - description: 椤电爜
+        in: query
+        name: page
+        type: integer
+      - description: 姣忛〉澶у皬
+        in: query
+        name: pageSize
+        type: integer
+      - description: 杞﹂棿缂栧彿
+        in: query
+        name: workshopNumber
+        type: string
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 鎴愬姛
+          schema:
+            allOf:
+            - $ref: '#/definitions/util.ResponseList'
+            - properties:
+                data:
+                  items:
+                    $ref: '#/definitions/models.PayrollProductionGroup'
+                  type: array
+              type: object
+      summary: 鑾峰彇灏忕粍姣忓ぉ鐨勪骇閲忓垪琛�
+      tags:
+      - 鍛樺伐钖祫/钖叕鏂规
+  /api-jl/v1/salary/getPayrollSalaryPlanList:
+    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:
+                  items:
+                    $ref: '#/definitions/models.PayrollSalaryPlan'
+                  type: array
+              type: object
+      summary: 鑾峰彇浜哄憳姣忔湀鐨勮柂璧勫垪琛�
+      tags:
+      - 鍛樺伐钖祫/钖叕鏂规
   /api-jl/v1/salary/getSalaryPlanList:
     post:
       parameters:
@@ -2453,10 +2910,11 @@
       parameters:
       - description: 瀛楀吀绫诲瀷
         enum:
-        - 0
         - 1
         - 2
         - 3
+        - 4
+        - 5
         in: query
         name: dictType
         type: integer
@@ -2464,12 +2922,14 @@
           DictTypeColor: 棰滆壊
           DictTypeMarket: 搴勫彛
           DictTypeSpec: 瑙勬牸
+          DictTypeSubsidy: 琛ヨ创
           DictTypeWorkshop: 杞﹂棿
         x-enum-varnames:
         - DictTypeMarket
         - DictTypeWorkshop
         - DictTypeColor
         - DictTypeSpec
+        - DictTypeSubsidy
       - description: 鎼滅储鍏抽敭瀛�
         in: query
         name: keyword
diff --git a/models/db.go b/models/db.go
index 4226418..bc0b521 100644
--- a/models/db.go
+++ b/models/db.go
@@ -94,6 +94,12 @@
 		SalaryReportForm{},
 		SalaryDetails{},
 		Lock{},
+		PayrollWorkingHours{},
+		PayrollProductionCar{},
+		PayrollProductionWeavers{},
+		PayrollProductionGroup{},
+		PayrollOtherSubsidies{},
+		PayrollSalaryPlan{},
 	)
 	return err
 }
@@ -105,6 +111,7 @@
 func InsertDefaultData() {
 	models := []interface{}{
 		NewAttendanceRuleSearch(),
+		//NewPayrollSalaryPlanSearch(),
 	}
 	for _, model := range models {
 		if id, ok := model.(InitDefaultData); ok {
diff --git a/models/payroll_other_subsidies.go b/models/payroll_other_subsidies.go
new file mode 100644
index 0000000..f90429c
--- /dev/null
+++ b/models/payroll_other_subsidies.go
@@ -0,0 +1,299 @@
+package models
+
+import (
+	"fmt"
+	"github.com/shopspring/decimal"
+	"gorm.io/gorm"
+	"silkserver/constvar"
+	"silkserver/pkg/mysqlx"
+)
+
+type (
+	// PayrollOtherSubsidies 鍏跺畠琛ヨ创銆佸鎯�
+	PayrollOtherSubsidies struct {
+		BaseModelInt
+		Cycle           string                      `json:"cycle" gorm:"index;size:20;not null;comment:缁熻鍛ㄦ湡"` //鏈堜唤
+		WorkerID        string                      `json:"workerId" gorm:"size:200;not null;comment:鍛樺伐ID"`   //鍛樺伐ID
+		Worker          Worker                      `json:"worker" gorm:"foreignKey:WorkerID;references:ID"`
+		WorkTypeID      uint                        `json:"workTypeID" gorm:"type:bigint(20);not null;comment:宸ョ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:宸ョ鍚嶇О"`      //宸ョ鍚嶇О
+		SubsidyType     constvar.PayrollSubsidyType `json:"subsidyType" gorm:"size:50;not null;comment:琛ヨ创绫诲瀷"`        // 琛ヨ创绫诲瀷
+		SubsidyTypeName string                      `json:"subsidyTypeName" gorm:"size:255;comment:琛ヨ创绫诲瀷鍚嶇О"`          // 琛ヨ创绫诲瀷鍚嶇О
+		Amount          decimal.Decimal             `json:"amount" gorm:"type:decimal(12,4);comment:閲戦"`             // 閲戦
+	}
+
+	PayrollOtherSubsidiesSearch struct {
+		PayrollOtherSubsidies
+		Monthly  string
+		Order    string
+		PageNum  int
+		PageSize int
+		Preload  bool
+		Orm      *gorm.DB
+	}
+)
+
+func (slf PayrollOtherSubsidies) TableName() string {
+	return "silk_payroll_other_subsidies"
+}
+
+// NewPayrollOtherSubsidiesSearch 鍏跺畠琛ヨ创
+func NewPayrollOtherSubsidiesSearch() *PayrollOtherSubsidiesSearch {
+	return &PayrollOtherSubsidiesSearch{Orm: mysqlx.GetDB()}
+}
+
+func (slf *PayrollOtherSubsidiesSearch) SetOrm(tx *gorm.DB) *PayrollOtherSubsidiesSearch {
+	slf.Orm = tx
+	return slf
+}
+
+func (slf *PayrollOtherSubsidiesSearch) SetPage(page, size int) *PayrollOtherSubsidiesSearch {
+	slf.PageNum, slf.PageSize = page, size
+	return slf
+}
+
+func (slf *PayrollOtherSubsidiesSearch) SetOrder(order string) *PayrollOtherSubsidiesSearch {
+	slf.Order = order
+	return slf
+}
+
+func (slf *PayrollOtherSubsidiesSearch) SetID(id uint) *PayrollOtherSubsidiesSearch {
+	slf.ID = id
+	return slf
+}
+
+func (slf *PayrollOtherSubsidiesSearch) SetCycle(cycle string) *PayrollOtherSubsidiesSearch {
+	slf.Cycle = cycle
+	return slf
+}
+
+func (slf *PayrollOtherSubsidiesSearch) SetMonthly(monthly string) *PayrollOtherSubsidiesSearch {
+	slf.Monthly = monthly
+	return slf
+}
+
+func (slf *PayrollOtherSubsidiesSearch) SetWorkTypeID(workTypeID uint) *PayrollOtherSubsidiesSearch {
+	slf.WorkTypeID = workTypeID
+	return slf
+}
+
+func (slf *PayrollOtherSubsidiesSearch) SetWorkerID(workerID string) *PayrollOtherSubsidiesSearch {
+	slf.WorkerID = workerID
+	return slf
+}
+
+func (slf *PayrollOtherSubsidiesSearch) SetSubsidyType(subsidyType constvar.PayrollSubsidyType) *PayrollOtherSubsidiesSearch {
+	slf.SubsidyType = subsidyType
+	return slf
+}
+
+func (slf *PayrollOtherSubsidiesSearch) build() *gorm.DB {
+	var db = slf.Orm.Table(slf.TableName())
+
+	if slf.Preload {
+		db = db.Model(&PayrollOtherSubsidies{}).Preload("Worker")
+	}
+
+	if slf.ID > 0 {
+		db = db.Where("id = ?", slf.ID)
+	}
+
+	if slf.Cycle != "" {
+		db = db.Where("cycle = ?", slf.Cycle)
+	}
+
+	if slf.Monthly != "" {
+		db = db.Where("cycle like ?", slf.Monthly+"%")
+	}
+
+	if slf.WorkTypeID > 0 {
+		db = db.Where("work_type_id = ?", slf.WorkTypeID)
+	}
+
+	if slf.WorkerID != "" {
+		db = db.Where("worker_id = ?", slf.WorkerID)
+	}
+
+	if slf.SubsidyType != "" {
+		db = db.Where("subsidy_type = ?", slf.SubsidyType)
+	}
+
+	db.Where("1 = 1")
+	if slf.Order != "" {
+		db = db.Order(slf.Order)
+	}
+
+	return db
+}
+
+// Create 鍗曟潯鎻掑叆
+func (slf *PayrollOtherSubsidiesSearch) Create(record *PayrollOtherSubsidies) error {
+	var db = slf.build()
+
+	if err := db.Create(record).Error; err != nil {
+		return fmt.Errorf("create err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// CreateBatch 鎵归噺鎻掑叆
+func (slf *PayrollOtherSubsidiesSearch) CreateBatch(records []*PayrollOtherSubsidies) error {
+	var db = slf.build()
+
+	if err := db.Create(&records).Error; err != nil {
+		return fmt.Errorf("create batch err: %v, records: %+v", err, records)
+	}
+
+	return nil
+}
+
+// Save 鍗曟潯鏇存柊
+func (slf *PayrollOtherSubsidiesSearch) Save(record *PayrollOtherSubsidies) error {
+	var db = slf.build()
+
+	if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// SaveBatch 鎵归噺鏇存柊
+func (slf *PayrollOtherSubsidiesSearch) SaveBatch(record []*PayrollOtherSubsidies) error {
+	var db = slf.build()
+
+	if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// UpdateByMap 鍗曟潯鏇存柊
+func (slf *PayrollOtherSubsidiesSearch) UpdateByMap(upMap map[string]interface{}) error {
+	var (
+		db = slf.build()
+	)
+
+	if err := db.Updates(upMap).Error; err != nil {
+		return fmt.Errorf("update by map err: %v, upMap: %+v", err, upMap)
+	}
+
+	return nil
+}
+
+// UpdateByQuery 鎵归噺鏇存柊
+func (slf *PayrollOtherSubsidiesSearch) UpdateByQuery(query string, args []interface{}, upMap map[string]interface{}) error {
+	var (
+		db = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if err := db.Updates(upMap).Error; err != nil {
+		return fmt.Errorf("update by query err: %v, query: %s, args: %+v, upMap: %+v", err, query, args, upMap)
+	}
+
+	return nil
+}
+
+// Delete 鍒犻櫎
+func (slf *PayrollOtherSubsidiesSearch) Delete() error {
+	var db = slf.build()
+
+	if err := db.Unscoped().Delete(&PayrollOtherSubsidies{}).Error; err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// First 鏍规嵁鏉′欢鏌ヨ涓�鏉¤褰�
+func (slf *PayrollOtherSubsidiesSearch) First() (*PayrollOtherSubsidies, error) {
+	var (
+		record = new(PayrollOtherSubsidies)
+		db     = slf.build()
+	)
+
+	if err := db.First(record).Error; err != nil {
+		return record, err
+	}
+
+	return record, nil
+}
+
+// Find 鎸囧畾鏉′欢鏌ヨ锛堝寘鍚�绘潯鏁帮級
+func (slf *PayrollOtherSubsidiesSearch) Find() ([]*PayrollOtherSubsidies, int64, error) {
+	var (
+		records = make([]*PayrollOtherSubsidies, 0)
+		total   int64
+		db      = slf.build()
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find count err: %v", err)
+	}
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, total, nil
+}
+
+// FindNotTotal 鎸囧畾鏉′欢鏌ヨ
+func (slf *PayrollOtherSubsidiesSearch) FindNotTotal() ([]*PayrollOtherSubsidies, error) {
+	var (
+		records = make([]*PayrollOtherSubsidies, 0)
+		db      = slf.build()
+	)
+
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, nil
+}
+
+// FindByQuery 鎸囧畾鏉′欢鏌ヨ锛堝寘鍚�绘潯鏁帮級
+func (slf *PayrollOtherSubsidiesSearch) FindByQuery(query string, args []interface{}) ([]*PayrollOtherSubsidies, int64, error) {
+	var (
+		records = make([]*PayrollOtherSubsidies, 0)
+		total   int64
+		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find by query count err: %v", err)
+	}
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+	}
+
+	return records, total, nil
+}
+
+// FindByQueryNotTotal 鎸囧畾鏉′欢鏌ヨ&涓嶆煡璇㈡�绘潯鏁�.
+func (slf *PayrollOtherSubsidiesSearch) FindByQueryNotTotal(query string, args []interface{}) ([]*PayrollOtherSubsidies, error) {
+	var (
+		records = make([]*PayrollOtherSubsidies, 0)
+		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+	}
+
+	return records, nil
+}
diff --git a/models/payroll_production_car.go b/models/payroll_production_car.go
new file mode 100644
index 0000000..51f6e17
--- /dev/null
+++ b/models/payroll_production_car.go
@@ -0,0 +1,409 @@
+package models
+
+import (
+	"fmt"
+	"github.com/shopspring/decimal"
+	"gorm.io/gorm"
+	"silkserver/pkg/mysqlx"
+)
+
+type ProductionItemsType int
+
+const (
+	ProductionItemsTypeSilk    ProductionItemsType = iota + 1 // 姝e父绾�
+	ProductionItemsTypeBadSilk                                // 閲庣氦
+)
+
+type (
+	// PayrollProductionCar 宸ヨ祫璁$畻-杞﹀彴姣忓ぉ鐨勪骇閲忕粺璁�
+	PayrollProductionCar struct {
+		BaseModelInt
+		Cycle          string `json:"cycle" gorm:"index;size:20;not null;comment:缁熻鍛ㄦ湡锛堝勾鏈堟棩锛�"` //缁熻鍛ㄦ湡锛堝勾鏈堟棩锛�
+		WorkshopNumber string `json:"workshopNumber" gorm:"size:255;not null;comment:杞﹂棿缂栧彿"`  // 杞﹂棿缂栧彿
+		GroupNumber    int    `json:"groupNumber" gorm:"size:11;not null;comment:缁勫埆"`        // 缁勫埆
+		CarNumber      int    `json:"carNumber"  gorm:"size:11;not null;comment:杞﹀彴鍙�"`        // 杞﹀彴鍙�
+
+		CarWorkQuantity int    `json:"carWorkQuantity"  gorm:"size:11;default:1;comment:杞﹀彴鍏宠仈浜哄憳鏁伴噺"` // 杞﹀彴鍏宠仈浜哄憳鏁伴噺
+		CarWorkIds      string `json:"carWorkIds"  gorm:"size:255;comment:杞﹀彴鍏宠仈鎸¤溅宸D"`              // 杞﹀彴鍏宠仈鎸¤溅宸D
+
+		MarketId          uint            `json:"marketId" gorm:"type:int(11);not null;comment:搴勫彛ID" `      //搴勫彛缂栧彿
+		MarketNumber      string          `json:"marketNumber" gorm:"size:50;not null;comment:搴勫彛缂栧彿" `       //搴勫彛缂栧彿
+		MarketName        string          `json:"marketName" gorm:"size:255;comment:搴勫彛鍚嶇О" `                 //搴勫彛鍚嶇О
+		FallingSilkBucket decimal.Decimal `json:"fallingSilkBucket" gorm:"type:decimal(12,2);comment:钀戒笣妗舵暟"` // 钀戒笣妗舵暟
+		Spec              string          `json:"spec" gorm:"size:50;not null;comment:瑙勬牸" `                 //瑙勬牸
+
+		DesiredLevel       string          `json:"desiredLevel" gorm:"size:50;comment:鏈熸湜绛夌骇"`                     // 鏈熸湜绛夌骇
+		FinishLevel        string          `json:"finishLevel" gorm:"size:50;not null;comment:鎴愬搧绛夌骇"`             // 鎴愬搧绛夌骇
+		SilkQuantity       decimal.Decimal `json:"silkQuantity" gorm:"type:decimal(12,4);comment:涓濋噺"`            // 涓濋噺
+		SilkAvgQuantity    decimal.Decimal `json:"silkAvgQuantity" gorm:"type:decimal(12,4);comment:浜哄钩鍧囦笣閲�"`      // 浜哄钩鍧囦笣閲�
+		SilkUnitAmount     decimal.Decimal `json:"silkUnitAmount" gorm:"type:decimal(12,2);comment:涓濆崟浠�"`         // 涓濆崟浠�
+		SilkTotalAmount    decimal.Decimal `json:"silkTotalAmount" gorm:"type:decimal(12,4);comment:涓濋噺鎬讳环"`       // 涓濋噺鎬讳环
+		SilkTotalAvgAmount decimal.Decimal `json:"silkTotalAvgAmount" gorm:"type:decimal(12,4);comment:涓濋噺浜哄钩鍧囨�讳环"` // 涓濋噺浜哄钩鍧囨�讳环
+
+		BadSilkType           string          `json:"badSilkType" gorm:"size:50;comment:閲庣氦绫诲瀷"`                         // 閲庣氦绫诲瀷
+		BadSilkQuantity       decimal.Decimal `json:"badSilkQuantity" gorm:"type:decimal(12,4);comment:閲庣氦鏁伴噺"`          // 閲庣氦鏁伴噺
+		BadSilkAvgQuantity    decimal.Decimal `json:"badSilkAvgQuantity" gorm:"type:decimal(12,4);comment:閲庣氦骞冲潎鏁伴噺"`     // 閲庣氦骞冲潎鏁伴噺
+		BadSilkUnitAmount     decimal.Decimal `json:"badSilkUnitAmount" gorm:"type:decimal(12,2);comment:閲庣氦鍗曚环"`        // 閲庣氦鍗曚环
+		BadSilkTotalAmount    decimal.Decimal `json:"badSilkTotalAmount" gorm:"type:decimal(12,4);comment:閲庣氦鎬讳环"`       // 閲庣氦鎬讳环
+		BadSilkTotalAvgAmount decimal.Decimal `json:"badSilkTotalAvgAmount" gorm:"type:decimal(12,4);comment:閲庣氦浜哄钩鍧囨�讳环"` // 閲庣氦浜哄钩鍧囨�讳环
+		FinishTotalAvgAmount  decimal.Decimal `json:"finishTotalAvgAmount" gorm:"type:decimal(12,4);comment:鎴愬搧浜哄钩鍧囬噾棰�"`  // 鎴愬搧浜哄钩鍧囬噾棰�
+
+		FinishTotalAmount decimal.Decimal `json:"finishTotalAmount" gorm:"type:decimal(12,4);comment:鎴愬搧閲戦"` // 鎴愬搧閲戦
+	}
+
+	SilkItem struct {
+		Type       string          `json:"badSilkType" gorm:"size:50;not null;comment:绫诲瀷"`           // 绫诲瀷
+		Quantity   decimal.Decimal `json:"badSilkQuantity" gorm:"type:decimal(12,4);comment:閲庣氦鏁伴噺"`   // 鏁伴噺
+		UnitAmount decimal.Decimal `json:"badSilkUnitAmount" gorm:"type:decimal(12,2);comment:閲庣氦鍗曚环"` // 鍗曚环
+	}
+
+	PayrollProductionCarSearch struct {
+		PayrollProductionCar
+		Monthly  string
+		Order    string
+		PageNum  int
+		PageSize int
+		Orm      *gorm.DB
+	}
+)
+
+func (slf PayrollProductionCar) TableName() string {
+	return "silk_payroll_production_car"
+}
+
+// NewPayrollProductionCarSearch 杞﹀彴姣忓ぉ鐨勪骇閲忕粺璁�
+func NewPayrollProductionCarSearch() *PayrollProductionCarSearch {
+	return &PayrollProductionCarSearch{Orm: mysqlx.GetDB()}
+}
+
+func (slf *PayrollProductionCarSearch) SetOrm(tx *gorm.DB) *PayrollProductionCarSearch {
+	slf.Orm = tx
+	return slf
+}
+
+func (slf *PayrollProductionCarSearch) SetPage(page, size int) *PayrollProductionCarSearch {
+	slf.PageNum, slf.PageSize = page, size
+	return slf
+}
+
+func (slf *PayrollProductionCarSearch) SetOrder(order string) *PayrollProductionCarSearch {
+	slf.Order = order
+	return slf
+}
+
+func (slf *PayrollProductionCarSearch) SetID(id uint) *PayrollProductionCarSearch {
+	slf.ID = id
+	return slf
+}
+
+func (slf *PayrollProductionCarSearch) SetCycle(cycle string) *PayrollProductionCarSearch {
+	slf.Cycle = cycle
+	return slf
+}
+
+func (slf *PayrollProductionCarSearch) SetMonthly(monthly string) *PayrollProductionCarSearch {
+	slf.Monthly = monthly
+	return slf
+}
+
+func (slf *PayrollProductionCarSearch) SetWorkshopNumber(workshopNumber string) *PayrollProductionCarSearch {
+	slf.WorkshopNumber = workshopNumber
+	return slf
+}
+
+func (slf *PayrollProductionCarSearch) SetGroupNumber(groupNumber int) *PayrollProductionCarSearch {
+	slf.GroupNumber = groupNumber
+	return slf
+}
+
+func (slf *PayrollProductionCarSearch) SetMarketNumber(marketNumber string) *PayrollProductionCarSearch {
+	slf.MarketNumber = marketNumber
+	return slf
+}
+
+func (slf *PayrollProductionCarSearch) SetMarketName(marketName string) *PayrollProductionCarSearch {
+	slf.MarketName = marketName
+	return slf
+}
+
+func (slf *PayrollProductionCarSearch) SetCarNumber(carNumber int) *PayrollProductionCarSearch {
+	slf.CarNumber = carNumber
+	return slf
+}
+
+func (slf *PayrollProductionCarSearch) SetSpec(spec string) *PayrollProductionCarSearch {
+	slf.Spec = spec
+	return slf
+}
+
+func (slf *PayrollProductionCarSearch) SetDesiredLevel(desiredLevel string) *PayrollProductionCarSearch {
+	slf.DesiredLevel = desiredLevel
+	return slf
+}
+
+func (slf *PayrollProductionCarSearch) SetFinishLevel(finishLevel string) *PayrollProductionCarSearch {
+	slf.FinishLevel = finishLevel
+	return slf
+}
+
+func (slf *PayrollProductionCarSearch) SetBadSilkType(badSilkType string) *PayrollProductionCarSearch {
+	slf.BadSilkType = badSilkType
+	return slf
+}
+
+func (slf *PayrollProductionCarSearch) build() *gorm.DB {
+	var db = slf.Orm.Table(slf.TableName())
+
+	if slf.ID > 0 {
+		db = db.Where("id = ?", slf.ID)
+	}
+
+	if slf.Cycle != "" {
+		db = db.Where("cycle = ?", slf.Cycle)
+	}
+
+	if slf.Monthly != "" {
+		db = db.Where("cycle like ?", slf.Monthly+"%")
+	}
+
+	if slf.WorkshopNumber != "" {
+		db = db.Where("workshop_number = ?", slf.WorkshopNumber)
+	}
+
+	if slf.GroupNumber > 0 {
+		db = db.Where("group_number = ?", slf.GroupNumber)
+	}
+
+	if slf.CarNumber > 0 {
+		db = db.Where("car_number = ?", slf.CarNumber)
+	}
+
+	if slf.MarketNumber != "" {
+		db = db.Where("market_number = ?", slf.MarketNumber)
+	}
+
+	if slf.MarketName != "" {
+		db = db.Where("market_name like ?", "%"+slf.MarketName+"%")
+	}
+
+	if slf.Spec != "" {
+		db = db.Where("spec = ?", slf.Spec)
+	}
+
+	if slf.DesiredLevel != "" {
+		db = db.Where("desired_level = ?", slf.DesiredLevel)
+	}
+
+	if slf.FinishLevel != "" {
+		db = db.Where("finish_level = ?", slf.FinishLevel)
+	}
+
+	if slf.BadSilkType != "" {
+		db = db.Where("bad_silk_type = ?", slf.BadSilkType)
+	}
+
+	db.Where("1 = 1")
+	if slf.Order != "" {
+		db = db.Order(slf.Order)
+	}
+
+	return db
+}
+
+// Create 鍗曟潯鎻掑叆
+func (slf *PayrollProductionCarSearch) Create(record *PayrollProductionCar) error {
+	var db = slf.build()
+
+	if err := db.Create(record).Error; err != nil {
+		return fmt.Errorf("create err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// CreateBatch 鎵归噺鎻掑叆
+func (slf *PayrollProductionCarSearch) CreateBatch(records []*PayrollProductionCar) error {
+	var db = slf.build()
+
+	if err := db.Create(&records).Error; err != nil {
+		return fmt.Errorf("create batch err: %v, records: %+v", err, records)
+	}
+
+	return nil
+}
+
+// Save 鍗曟潯鏇存柊
+func (slf *PayrollProductionCarSearch) Save(record *PayrollProductionCar) error {
+	var db = slf.build()
+
+	if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// SaveBatch 鎵归噺鏇存柊
+func (slf *PayrollProductionCarSearch) SaveBatch(record []*PayrollProductionCar) error {
+	var db = slf.build()
+
+	if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// UpdateByMap 鍗曟潯鏇存柊
+func (slf *PayrollProductionCarSearch) UpdateByMap(upMap map[string]interface{}) error {
+	var (
+		db = slf.build()
+	)
+
+	if err := db.Updates(upMap).Error; err != nil {
+		return fmt.Errorf("update by map err: %v, upMap: %+v", err, upMap)
+	}
+
+	return nil
+}
+
+// UpdateByQuery 鎵归噺鏇存柊
+func (slf *PayrollProductionCarSearch) UpdateByQuery(query string, args []interface{}, upMap map[string]interface{}) error {
+	var (
+		db = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if err := db.Updates(upMap).Error; err != nil {
+		return fmt.Errorf("update by query err: %v, query: %s, args: %+v, upMap: %+v", err, query, args, upMap)
+	}
+
+	return nil
+}
+
+// Delete 鍒犻櫎
+func (slf *PayrollProductionCarSearch) Delete() error {
+	var db = slf.build()
+
+	if err := db.Unscoped().Delete(&PayrollProductionCar{}).Error; err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// First 鏍规嵁鏉′欢鏌ヨ涓�鏉¤褰�
+func (slf *PayrollProductionCarSearch) First() (*PayrollProductionCar, error) {
+	var (
+		record = new(PayrollProductionCar)
+		db     = slf.build()
+	)
+
+	if err := db.First(record).Error; err != nil {
+		return record, err
+	}
+
+	return record, nil
+}
+
+// Find 鎸囧畾鏉′欢鏌ヨ锛堝寘鍚�绘潯鏁帮級
+func (slf *PayrollProductionCarSearch) Find() ([]*PayrollProductionCar, int64, error) {
+	var (
+		records = make([]*PayrollProductionCar, 0)
+		total   int64
+		db      = slf.build()
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find count err: %v", err)
+	}
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, total, nil
+}
+
+// FindNotTotal 鎸囧畾鏉′欢鏌ヨ
+func (slf *PayrollProductionCarSearch) FindNotTotal() ([]*PayrollProductionCar, error) {
+	var (
+		records = make([]*PayrollProductionCar, 0)
+		db      = slf.build()
+	)
+
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, nil
+}
+
+// FindByQuery 鎸囧畾鏉′欢鏌ヨ锛堝寘鍚�绘潯鏁帮級
+func (slf *PayrollProductionCarSearch) FindByQuery(query string, args []interface{}) ([]*PayrollProductionCar, int64, error) {
+	var (
+		records = make([]*PayrollProductionCar, 0)
+		total   int64
+		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find by query count err: %v", err)
+	}
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+	}
+
+	return records, total, nil
+}
+
+// FindByQueryNotTotal 鎸囧畾鏉′欢鏌ヨ&涓嶆煡璇㈡�绘潯鏁�.
+func (slf *PayrollProductionCarSearch) FindByQueryNotTotal(query string, args []interface{}) ([]*PayrollProductionCar, error) {
+	var (
+		records = make([]*PayrollProductionCar, 0)
+		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+	}
+
+	return records, nil
+}
+
+// InitDefaultData 鍒濆鍖栨暟鎹�
+func (slf *PayrollProductionCarSearch) 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([]*PayrollProductionCar, 0)
+
+	//workers, _ := NewWorkerSearch().FindNotTotal()
+	//
+	//for _, record := range workers {
+	//	data = append(data, &PayrollProductionCar{
+	//		Cycle: date,
+	//	})
+	//}
+
+	err := slf.CreateBatch(data)
+	return err
+}
diff --git a/models/payroll_production_group.go b/models/payroll_production_group.go
new file mode 100644
index 0000000..03a5da8
--- /dev/null
+++ b/models/payroll_production_group.go
@@ -0,0 +1,290 @@
+package models
+
+import (
+	"fmt"
+	"github.com/shopspring/decimal"
+	"gorm.io/gorm"
+	"silkserver/pkg/mysqlx"
+)
+
+type (
+	// PayrollProductionGroup 宸ヨ祫璁$畻-灏忕粍姣忓ぉ鐨勪骇閲忕粺璁�
+	PayrollProductionGroup struct {
+		BaseModelInt
+		Cycle          string `json:"cycle" gorm:"index;size:20;not null;comment:缁熻鍛ㄦ湡"`    //缁熻鍛ㄦ湡锛堝勾鏈堟棩锛�
+		WorkshopNumber string `json:"workshopNumber" gorm:"size:50;not null;comment:杞﹂棿缂栧彿"` // 杞﹂棿缂栧彿
+		WorkshopName   string `json:"workshopName" gorm:"size:50;comment:杞﹂棿鍚嶇О"`            // 杞﹂棿鍚嶇О
+		GroupNumber    int    `json:"groupNumber" gorm:"size:11;not null;comment:缁勫埆"`      // 缁勫埆
+
+		FallingSilkBucket     decimal.Decimal `json:"fallingSilkBucket" gorm:"type:decimal(12,2);comment:钀戒笣妗舵暟"`
+		SilkQuantity          decimal.Decimal `json:"silkQuantity" gorm:"type:decimal(12,4);comment:涓濋噺"`               // 涓濋噺
+		SilkAvgQuantity       decimal.Decimal `json:"silkAvgQuantity" gorm:"type:decimal(12,4);comment:浜哄钩鍧囦笣閲�"`         // 浜哄钩鍧囦笣閲�
+		SilkTotalAmount       decimal.Decimal `json:"silkTotalAmount" gorm:"type:decimal(12,4);comment:涓濋噺鎬讳环"`          // 涓濋噺鎬讳环
+		SilkTotalAvgAmount    decimal.Decimal `json:"silkTotalAvgAmount" gorm:"type:decimal(12,4);comment:涓濋噺浜哄钩鍧囨�讳环"`    // 涓濋噺浜哄钩鍧囨�讳环
+		BadSilkQuantity       decimal.Decimal `json:"badSilkQuantity" gorm:"type:decimal(12,4);comment:閲庣氦鏁伴噺"`          // 閲庣氦鏁伴噺
+		BadSilkTotalAmount    decimal.Decimal `json:"badSilkTotalAmount" gorm:"type:decimal(12,4);comment:閲庣氦鎬讳环"`       // 閲庣氦鎬讳环
+		BadSilkTotalAvgAmount decimal.Decimal `json:"badSilkTotalAvgAmount" gorm:"type:decimal(12,4);comment:閲庣氦浜哄钩鍧囨�讳环"` // 閲庣氦浜哄钩鍧囨�讳环
+		FinishTotalAmount     decimal.Decimal `json:"finishTotalAmount" gorm:"type:decimal(12,4);comment:鎴愬搧閲戦"`        // 鎴愬搧閲戦
+		FinishTotalAvgAmount  decimal.Decimal `json:"finishTotalAvgAmount" gorm:"type:decimal(12,4);comment:鎴愬搧浜哄钩鍧囬噾棰�"`  // 鎴愬搧浜哄钩鍧囬噾棰�
+	}
+
+	PayrollProductionGroupSearch struct {
+		PayrollProductionGroup
+		Monthly  string
+		Order    string
+		PageNum  int
+		PageSize int
+		Orm      *gorm.DB
+	}
+)
+
+func (slf PayrollProductionGroup) TableName() string {
+	return "silk_payroll_production_group"
+}
+
+// NewPayrollProductionGroupSearch 灏忕粍姣忓ぉ鐨勪骇閲忕粺璁�
+func NewPayrollProductionGroupSearch() *PayrollProductionGroupSearch {
+	return &PayrollProductionGroupSearch{Orm: mysqlx.GetDB()}
+}
+
+func (slf *PayrollProductionGroupSearch) SetOrm(tx *gorm.DB) *PayrollProductionGroupSearch {
+	slf.Orm = tx
+	return slf
+}
+
+func (slf *PayrollProductionGroupSearch) SetPage(page, size int) *PayrollProductionGroupSearch {
+	slf.PageNum, slf.PageSize = page, size
+	return slf
+}
+
+func (slf *PayrollProductionGroupSearch) SetOrder(order string) *PayrollProductionGroupSearch {
+	slf.Order = order
+	return slf
+}
+
+func (slf *PayrollProductionGroupSearch) SetID(id uint) *PayrollProductionGroupSearch {
+	slf.ID = id
+	return slf
+}
+
+func (slf *PayrollProductionGroupSearch) SetCycle(cycle string) *PayrollProductionGroupSearch {
+	slf.Cycle = cycle
+	return slf
+}
+
+func (slf *PayrollProductionGroupSearch) SetMonthly(monthly string) *PayrollProductionGroupSearch {
+	slf.Monthly = monthly
+	return slf
+}
+
+func (slf *PayrollProductionGroupSearch) SetWorkshopNumber(workshopNumber string) *PayrollProductionGroupSearch {
+	slf.WorkshopNumber = workshopNumber
+	return slf
+}
+
+func (slf *PayrollProductionGroupSearch) SetGroupNumber(groupNumber int) *PayrollProductionGroupSearch {
+	slf.GroupNumber = groupNumber
+	return slf
+}
+
+func (slf *PayrollProductionGroupSearch) build() *gorm.DB {
+	var db = slf.Orm.Table(slf.TableName())
+
+	if slf.ID > 0 {
+		db = db.Where("id = ?", slf.ID)
+	}
+
+	if slf.Cycle != "" {
+		db = db.Where("cycle = ?", slf.Cycle)
+	}
+
+	if slf.Monthly != "" {
+		db = db.Where("cycle like ?", slf.Monthly+"%")
+	}
+
+	if slf.WorkshopNumber != "" {
+		db = db.Where("workshop_number = ?", slf.WorkshopNumber)
+	}
+
+	if slf.GroupNumber > 0 {
+		db = db.Where("group_number = ?", slf.GroupNumber)
+	}
+
+	db.Where("1 = 1")
+	if slf.Order != "" {
+		db = db.Order(slf.Order)
+	}
+
+	return db
+}
+
+// Create 鍗曟潯鎻掑叆
+func (slf *PayrollProductionGroupSearch) Create(record *PayrollProductionGroup) error {
+	var db = slf.build()
+
+	if err := db.Create(record).Error; err != nil {
+		return fmt.Errorf("create err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// CreateBatch 鎵归噺鎻掑叆
+func (slf *PayrollProductionGroupSearch) CreateBatch(records []*PayrollProductionGroup) error {
+	var db = slf.build()
+
+	if err := db.Create(&records).Error; err != nil {
+		return fmt.Errorf("create batch err: %v, records: %+v", err, records)
+	}
+
+	return nil
+}
+
+// Save 鍗曟潯鏇存柊
+func (slf *PayrollProductionGroupSearch) Save(record *PayrollProductionGroup) error {
+	var db = slf.build()
+
+	if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// SaveBatch 鎵归噺鏇存柊
+func (slf *PayrollProductionGroupSearch) SaveBatch(record []*PayrollProductionGroup) error {
+	var db = slf.build()
+
+	if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// UpdateByMap 鍗曟潯鏇存柊
+func (slf *PayrollProductionGroupSearch) UpdateByMap(upMap map[string]interface{}) error {
+	var (
+		db = slf.build()
+	)
+
+	if err := db.Updates(upMap).Error; err != nil {
+		return fmt.Errorf("update by map err: %v, upMap: %+v", err, upMap)
+	}
+
+	return nil
+}
+
+// UpdateByQuery 鎵归噺鏇存柊
+func (slf *PayrollProductionGroupSearch) UpdateByQuery(query string, args []interface{}, upMap map[string]interface{}) error {
+	var (
+		db = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if err := db.Updates(upMap).Error; err != nil {
+		return fmt.Errorf("update by query err: %v, query: %s, args: %+v, upMap: %+v", err, query, args, upMap)
+	}
+
+	return nil
+}
+
+// Delete 鍒犻櫎
+func (slf *PayrollProductionGroupSearch) Delete() error {
+	var db = slf.build()
+
+	if err := db.Unscoped().Delete(&PayrollProductionGroup{}).Error; err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// First 鏍规嵁鏉′欢鏌ヨ涓�鏉¤褰�
+func (slf *PayrollProductionGroupSearch) First() (*PayrollProductionGroup, error) {
+	var (
+		record = new(PayrollProductionGroup)
+		db     = slf.build()
+	)
+
+	if err := db.First(record).Error; err != nil {
+		return record, err
+	}
+
+	return record, nil
+}
+
+// Find 鎸囧畾鏉′欢鏌ヨ锛堝寘鍚�绘潯鏁帮級
+func (slf *PayrollProductionGroupSearch) Find() ([]*PayrollProductionGroup, int64, error) {
+	var (
+		records = make([]*PayrollProductionGroup, 0)
+		total   int64
+		db      = slf.build()
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find count err: %v", err)
+	}
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, total, nil
+}
+
+// FindNotTotal 鎸囧畾鏉′欢鏌ヨ
+func (slf *PayrollProductionGroupSearch) FindNotTotal() ([]*PayrollProductionGroup, error) {
+	var (
+		records = make([]*PayrollProductionGroup, 0)
+		db      = slf.build()
+	)
+
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, nil
+}
+
+// FindByQuery 鎸囧畾鏉′欢鏌ヨ锛堝寘鍚�绘潯鏁帮級
+func (slf *PayrollProductionGroupSearch) FindByQuery(query string, args []interface{}) ([]*PayrollProductionGroup, int64, error) {
+	var (
+		records = make([]*PayrollProductionGroup, 0)
+		total   int64
+		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find by query count err: %v", err)
+	}
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+	}
+
+	return records, total, nil
+}
+
+// FindByQueryNotTotal 鎸囧畾鏉′欢鏌ヨ&涓嶆煡璇㈡�绘潯鏁�.
+func (slf *PayrollProductionGroupSearch) FindByQueryNotTotal(query string, args []interface{}) ([]*PayrollProductionGroup, error) {
+	var (
+		records = make([]*PayrollProductionGroup, 0)
+		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+	}
+
+	return records, nil
+}
diff --git a/models/payroll_production_weavers.go b/models/payroll_production_weavers.go
new file mode 100644
index 0000000..9698f75
--- /dev/null
+++ b/models/payroll_production_weavers.go
@@ -0,0 +1,322 @@
+package models
+
+import (
+	"fmt"
+	"github.com/shopspring/decimal"
+	"gorm.io/gorm"
+	"silkserver/pkg/mysqlx"
+)
+
+type (
+	// PayrollProductionWeavers 宸ヨ祫璁$畻-鎸¤溅宸ユ瘡澶╃殑浜ч噺銆侀噾棰濈粺璁�
+	PayrollProductionWeavers struct {
+		BaseModelInt
+		Cycle          string         `json:"index;cycle" gorm:"size:20;not null;comment:缁熻鍛ㄦ湡锛堝勾鏈堟棩锛�"`   //缁熻鍛ㄦ湡
+		WorkTypeID     uint           `json:"workTypeID" gorm:"type:bigint(20);not null;comment:宸ョID"` //宸ョID
+		WorkType       WorkTypeManage `json:"workType" gorm:"foreignKey:WorkTypeID;references:ID"`
+		WorkerID       string         `json:"workerId" gorm:"size:200;not null;comment:鍛樺伐ID"` //鍛樺伐ID
+		Worker         Worker         `json:"worker" gorm:"foreignKey:WorkerID;references:ID"`
+		WorkshopNumber string         `json:"workshopNumber" gorm:"size:255;not null;comment:杞﹂棿缂栧彿"` // 杞﹂棿缂栧彿
+		GroupNumber    int            `json:"groupNumber" gorm:"size:11;not null;comment:缁勫埆"`       // 缁勫埆
+		CarNumbers     string         `json:"carNumbers"  gorm:"size:255;not null;comment:杞﹀彴鍙�"`     // 杞﹀彴鍙�
+
+		SilkQuantity       decimal.Decimal `json:"silkQuantity" gorm:"type:decimal(12,4);comment:涓濋噺"`         // 涓濋噺
+		SilkTotalAmount    decimal.Decimal `json:"silkTotalAmount" gorm:"type:decimal(12,4);comment:涓濋噺鎬讳环"`    // 涓濋噺鎬讳环
+		BadSilkQuantity    decimal.Decimal `json:"badSilkQuantity" gorm:"type:decimal(12,4);comment:閲庣氦鏁伴噺"`    // 閲庣氦鏁伴噺
+		BadSilkTotalAmount decimal.Decimal `json:"badSilkTotalAmount" gorm:"type:decimal(12,4);comment:閲庣氦鎬讳环"` // 閲庣氦鎬讳环
+		FinishTotalAmount  decimal.Decimal `json:"finishTotalAmount" gorm:"type:decimal(12,4);comment:鎴愬搧閲戦"`  // 鎴愬搧閲戦
+	}
+
+	PayrollProductionWeaversSearch struct {
+		PayrollProductionWeavers
+		Monthly string
+
+		Order    string
+		PageNum  int
+		PageSize int
+		Preload  bool
+		Orm      *gorm.DB
+	}
+)
+
+func (slf PayrollProductionWeavers) TableName() string {
+	return "silk_payroll_production_employee"
+}
+
+// NewPayrollProductionWeaversSearch 鍛樺伐姣忓ぉ鐨勪骇閲忕粺璁�
+func NewPayrollProductionWeaversSearch() *PayrollProductionWeaversSearch {
+	return &PayrollProductionWeaversSearch{Orm: mysqlx.GetDB()}
+}
+
+func (slf *PayrollProductionWeaversSearch) SetOrm(tx *gorm.DB) *PayrollProductionWeaversSearch {
+	slf.Orm = tx
+	return slf
+}
+
+func (slf *PayrollProductionWeaversSearch) SetPage(page, size int) *PayrollProductionWeaversSearch {
+	slf.PageNum, slf.PageSize = page, size
+	return slf
+}
+
+func (slf *PayrollProductionWeaversSearch) SetOrder(order string) *PayrollProductionWeaversSearch {
+	slf.Order = order
+	return slf
+}
+
+func (slf *PayrollProductionWeaversSearch) SetID(id uint) *PayrollProductionWeaversSearch {
+	slf.ID = id
+	return slf
+}
+
+func (slf *PayrollProductionWeaversSearch) SetCycle(cycle string) *PayrollProductionWeaversSearch {
+	slf.Cycle = cycle
+	return slf
+}
+
+func (slf *PayrollProductionWeaversSearch) SetMonthly(monthly string) *PayrollProductionWeaversSearch {
+	slf.Monthly = monthly
+	return slf
+}
+
+func (slf *PayrollProductionWeaversSearch) SetWorkTypeID(workTypeID uint) *PayrollProductionWeaversSearch {
+	slf.WorkTypeID = workTypeID
+	return slf
+}
+
+func (slf *PayrollProductionWeaversSearch) SetWorkerID(workerID string) *PayrollProductionWeaversSearch {
+	slf.WorkerID = workerID
+	return slf
+}
+
+func (slf *PayrollProductionWeaversSearch) SetWorkshopNumber(workshopNumber string) *PayrollProductionWeaversSearch {
+	slf.WorkshopNumber = workshopNumber
+	return slf
+}
+
+func (slf *PayrollProductionWeaversSearch) SetGroupNumber(groupNumber int) *PayrollProductionWeaversSearch {
+	slf.GroupNumber = groupNumber
+	return slf
+}
+
+func (slf *PayrollProductionWeaversSearch) SetCarNumbers(carNumbers string) *PayrollProductionWeaversSearch {
+	slf.CarNumbers = carNumbers
+	return slf
+}
+
+func (slf *PayrollProductionWeaversSearch) build() *gorm.DB {
+	var db = slf.Orm.Table(slf.TableName())
+
+	if slf.Preload {
+		db = db.Model(&PayrollProductionWeavers{}).Preload("Worker")
+	}
+
+	if slf.ID > 0 {
+		db = db.Where("id = ?", slf.ID)
+	}
+
+	if slf.Cycle != "" {
+		db = db.Where("cycle = ?", slf.Cycle)
+	}
+
+	if slf.Monthly != "" {
+		db = db.Where("cycle like ?", slf.Monthly+"%")
+	}
+
+	if slf.WorkTypeID > 0 {
+		db = db.Where("work_type_id = ?", slf.WorkTypeID)
+	}
+
+	if slf.WorkerID != "" {
+		db = db.Where("worker_id = ?", slf.WorkerID)
+	}
+
+	if slf.WorkshopNumber != "" {
+		db = db.Where("workshop_number = ?", slf.WorkshopNumber)
+	}
+
+	if slf.GroupNumber > 0 {
+		db = db.Where("group_number = ?", slf.GroupNumber)
+	}
+
+	if slf.CarNumbers != "" {
+		db = db.Where("car_numbers like ?", "%"+slf.CarNumbers+"%")
+	}
+
+	db.Where("1 = 1")
+	if slf.Order != "" {
+		db = db.Order(slf.Order)
+	}
+
+	return db
+}
+
+// Create 鍗曟潯鎻掑叆
+func (slf *PayrollProductionWeaversSearch) Create(record *PayrollProductionWeavers) error {
+	var db = slf.build()
+
+	if err := db.Create(record).Error; err != nil {
+		return fmt.Errorf("create err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// CreateBatch 鎵归噺鎻掑叆
+func (slf *PayrollProductionWeaversSearch) CreateBatch(records []*PayrollProductionWeavers) error {
+	var db = slf.build()
+
+	if err := db.Create(&records).Error; err != nil {
+		return fmt.Errorf("create batch err: %v, records: %+v", err, records)
+	}
+
+	return nil
+}
+
+// Save 鍗曟潯鏇存柊
+func (slf *PayrollProductionWeaversSearch) Save(record *PayrollProductionWeavers) error {
+	var db = slf.build()
+
+	if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// SaveBatch 鎵归噺鏇存柊
+func (slf *PayrollProductionWeaversSearch) SaveBatch(record []*PayrollProductionWeavers) error {
+	var db = slf.build()
+
+	if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// UpdateByMap 鍗曟潯鏇存柊
+func (slf *PayrollProductionWeaversSearch) UpdateByMap(upMap map[string]interface{}) error {
+	var (
+		db = slf.build()
+	)
+
+	if err := db.Updates(upMap).Error; err != nil {
+		return fmt.Errorf("update by map err: %v, upMap: %+v", err, upMap)
+	}
+
+	return nil
+}
+
+// UpdateByQuery 鎵归噺鏇存柊
+func (slf *PayrollProductionWeaversSearch) UpdateByQuery(query string, args []interface{}, upMap map[string]interface{}) error {
+	var (
+		db = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if err := db.Updates(upMap).Error; err != nil {
+		return fmt.Errorf("update by query err: %v, query: %s, args: %+v, upMap: %+v", err, query, args, upMap)
+	}
+
+	return nil
+}
+
+// Delete 鍒犻櫎
+func (slf *PayrollProductionWeaversSearch) Delete() error {
+	var db = slf.build()
+
+	if err := db.Unscoped().Delete(&PayrollProductionWeavers{}).Error; err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// First 鏍规嵁鏉′欢鏌ヨ涓�鏉¤褰�
+func (slf *PayrollProductionWeaversSearch) First() (*PayrollProductionWeavers, error) {
+	var (
+		record = new(PayrollProductionWeavers)
+		db     = slf.build()
+	)
+
+	if err := db.First(record).Error; err != nil {
+		return record, err
+	}
+
+	return record, nil
+}
+
+// Find 鎸囧畾鏉′欢鏌ヨ锛堝寘鍚�绘潯鏁帮級
+func (slf *PayrollProductionWeaversSearch) Find() ([]*PayrollProductionWeavers, int64, error) {
+	var (
+		records = make([]*PayrollProductionWeavers, 0)
+		total   int64
+		db      = slf.build()
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find count err: %v", err)
+	}
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, total, nil
+}
+
+// FindNotTotal 鎸囧畾鏉′欢鏌ヨ
+func (slf *PayrollProductionWeaversSearch) FindNotTotal() ([]*PayrollProductionWeavers, error) {
+	var (
+		records = make([]*PayrollProductionWeavers, 0)
+		db      = slf.build()
+	)
+
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, nil
+}
+
+// FindByQuery 鎸囧畾鏉′欢鏌ヨ锛堝寘鍚�绘潯鏁帮級
+func (slf *PayrollProductionWeaversSearch) FindByQuery(query string, args []interface{}) ([]*PayrollProductionWeavers, int64, error) {
+	var (
+		records = make([]*PayrollProductionWeavers, 0)
+		total   int64
+		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find by query count err: %v", err)
+	}
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+	}
+
+	return records, total, nil
+}
+
+// FindByQueryNotTotal 鎸囧畾鏉′欢鏌ヨ&涓嶆煡璇㈡�绘潯鏁�.
+func (slf *PayrollProductionWeaversSearch) FindByQueryNotTotal(query string, args []interface{}) ([]*PayrollProductionWeavers, error) {
+	var (
+		records = make([]*PayrollProductionWeavers, 0)
+		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+	}
+
+	return records, nil
+}
diff --git a/models/payroll_salary_plan.go b/models/payroll_salary_plan.go
new file mode 100644
index 0000000..990672d
--- /dev/null
+++ b/models/payroll_salary_plan.go
@@ -0,0 +1,361 @@
+package models
+
+// 姣忔湀宸ヨ祫缁撶畻
+
+import (
+	"fmt"
+	"github.com/shopspring/decimal"
+	"gorm.io/gorm"
+	"silkserver/constvar"
+	"silkserver/pkg/mysqlx"
+)
+
+type (
+	// PayrollSalaryPlan 姣忔湀宸ヨ祫缁撶畻
+	PayrollSalaryPlan struct {
+		BaseModelInt
+		Cycle        string           `json:"cycle" gorm:"index;size:20;not null;comment:缁熻鍛ㄦ湡锛堟湀浠斤級"`     //鏈堜唤
+		WorkerID     string           `json:"workerId" gorm:";type:varchar(191);not null;comment:鍛樺伐ID"` //鍛樺伐ID
+		Worker       Worker           `json:"worker" gorm:"foreignKey:WorkerID;references:ID"`
+		WorkerName   string           `json:"workerName" gorm:"index;type:varchar(191);comment:鍛樺伐濮撳悕"`
+		WorkTypeID   uint             `json:"workTypeID" gorm:"type:bigint(20);comment:宸ョID"` //宸ョID
+		WorkTypeCode constvar.JobType `json:"workTypeCode" gorm:"size:255;comment:宸ョ浠g爜"`      //宸ョ浠g爜
+		WorkTypeName string           `json:"workTypeName" gorm:"size:11;comment:宸ョ鍚嶇О"`       //宸ョ鍚嶇О
+
+		Quantity                 decimal.Decimal `json:"quantity" gorm:"type:decimal(12,4);comment:浜ч噺"`                 // 浜ч噺
+		ProductionAmount         decimal.Decimal `json:"productionAmount" gorm:"type:decimal(12,4);comment:鐢熶骇宸ヨ祫"`       // 鐢熶骇宸ヨ祫
+		LongTermAmount           decimal.Decimal `json:"longTermAmount" gorm:"type:decimal(12,4);comment:婊″嫟"`           // 婊″嫟
+		TimeoutAmount            decimal.Decimal `json:"timeoutAmount" gorm:"type:decimal(12,4);comment:瓒呮椂宸ヨ祫"`          // 瓒呮椂宸ヨ祫
+		OvertimeAmount           decimal.Decimal `json:"overtimeAmount" gorm:"type:decimal(12,4);comment:鍔犵彮宸ヨ祫"`         // 鍔犵彮宸ヨ祫
+		TrafficAmount            decimal.Decimal `json:"trafficAmount" gorm:"type:decimal(12,4);comment:浜ら�氳ˉ璐�"`          // 浜ら�氳ˉ璐�
+		MasterApprenticeAmount   decimal.Decimal `json:"masterApprenticeAmount" gorm:"type:decimal(12,4);comment:甯﹀緬琛ヨ创"` // 甯﹀緬琛ヨ创
+		PositionAmount           decimal.Decimal `json:"positionAmount" gorm:"type:decimal(12,4);comment:宀椾綅琛ヨ创"`         // 宀椾綅琛ヨ创
+		SocialSecurityAmount     decimal.Decimal `json:"socialSecurityAmount" gorm:"type:decimal(12,4);comment:绀句繚琛ヨ创"`   // 绀句繚琛ヨ创
+		SeniorityAmount          decimal.Decimal `json:"seniorityAmount" gorm:"type:decimal(12,4);comment:宸ラ緞琛ヨ创"`        // 宸ラ緞琛ヨ创
+		BaseSalaryAmount         decimal.Decimal `json:"baseSalaryAmount" gorm:"type:decimal(12,4);comment:涓嶈揪淇濆簳"`       // 涓嶈揪淇濆簳
+		QualityStandardsAmount   decimal.Decimal `json:"qualityStandardsAmount" gorm:"type:decimal(12,4);comment:璐ㄩ噺濂�"`  // 璐ㄩ噺濂�
+		SubstandardQualityAmount decimal.Decimal `json:"substandardQualityAmount" gorm:"type:decimal(12,4);comment:濂栫綒"` // 濂栫綒1
+		HeatAmount               decimal.Decimal `json:"heatAmount" gorm:"type:decimal(12,4);comment:娓呭噳琛ヨ创"`             // 濂栫綒2/娓呭噳琛ヨ创
+		DailyInspectionAmount    decimal.Decimal `json:"dailyInspectionAmount" gorm:"type:decimal(12,4);comment:鏃ュ父妫�鏌�"`  // 鏃ュ父妫�鏌�/濂栫綒3
+		DowntimeAmount           decimal.Decimal `json:"downtimeAmount" gorm:"type:decimal(12,4);comment:鍋滄満琛ヨ创"`         // 鍋滄満琛ヨ创
+		Amount                   decimal.Decimal `json:"amount" gorm:"type:decimal(12,4);comment:搴斿彂宸ヨ祫"`                 // 搴斿彂宸ヨ祫
+		Remark                   string          `json:"remark" gorm:"type:varchar(500);comment:澶囨敞"`                    // 澶囨敞
+	}
+
+	PayrollSalaryPlanSearch struct {
+		PayrollSalaryPlan
+		Monthly string
+		Keyword string
+
+		Order    string
+		PageNum  int
+		PageSize int
+		Preload  bool
+		Orm      *gorm.DB
+	}
+)
+
+func (slf PayrollSalaryPlan) TableName() string {
+	return "silk_payroll_salary_plan"
+}
+
+// NewPayrollSalaryPlanSearch 鍏跺畠琛ヨ创
+func NewPayrollSalaryPlanSearch() *PayrollSalaryPlanSearch {
+	return &PayrollSalaryPlanSearch{Orm: mysqlx.GetDB()}
+}
+
+func (slf *PayrollSalaryPlanSearch) SetOrm(tx *gorm.DB) *PayrollSalaryPlanSearch {
+	slf.Orm = tx
+	return slf
+}
+
+func (slf *PayrollSalaryPlanSearch) SetPage(page, size int) *PayrollSalaryPlanSearch {
+	slf.PageNum, slf.PageSize = page, size
+	return slf
+}
+
+func (slf *PayrollSalaryPlanSearch) SetOrder(order string) *PayrollSalaryPlanSearch {
+	slf.Order = order
+	return slf
+}
+
+func (slf *PayrollSalaryPlanSearch) SetID(id uint) *PayrollSalaryPlanSearch {
+	slf.ID = id
+	return slf
+}
+
+func (slf *PayrollSalaryPlanSearch) SetCycle(cycle string) *PayrollSalaryPlanSearch {
+	slf.Cycle = cycle
+	return slf
+}
+
+func (slf *PayrollSalaryPlanSearch) SetMonthly(monthly string) *PayrollSalaryPlanSearch {
+	slf.Monthly = monthly
+	return slf
+}
+
+func (slf *PayrollSalaryPlanSearch) SetWorkTypeID(workTypeID uint) *PayrollSalaryPlanSearch {
+	slf.WorkTypeID = workTypeID
+	return slf
+}
+
+func (slf *PayrollSalaryPlanSearch) SetWorkerID(workerID string) *PayrollSalaryPlanSearch {
+	slf.WorkerID = workerID
+	return slf
+}
+
+func (slf *PayrollSalaryPlanSearch) SetWorkTypeCode(workTypeCode constvar.JobType) *PayrollSalaryPlanSearch {
+	slf.WorkTypeCode = workTypeCode
+	return slf
+}
+
+func (slf *PayrollSalaryPlanSearch) SetKeyword(keyword string) *PayrollSalaryPlanSearch {
+	slf.Keyword = keyword
+	return slf
+}
+
+func (slf *PayrollSalaryPlanSearch) build() *gorm.DB {
+	var db = slf.Orm.Table(slf.TableName())
+
+	if slf.Preload {
+		db = db.Model(&PayrollSalaryPlan{}).Preload("Worker")
+	}
+
+	if slf.ID > 0 {
+		db = db.Where("id = ?", slf.ID)
+	}
+
+	if slf.Cycle != "" {
+		db = db.Where("cycle = ?", slf.Cycle)
+	}
+
+	if slf.Monthly != "" {
+		db = db.Where("cycle like ?", slf.Monthly+"%")
+	}
+
+	if slf.WorkTypeID > 0 {
+		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.Keyword != "" {
+		str := "%" + slf.Keyword + "%"
+		db = db.Where("worker_name like ? or work_type_name like ? or remark like ?", str, str, str)
+	}
+
+	db.Where("1 = 1")
+	if slf.Order != "" {
+		db = db.Order(slf.Order)
+	}
+
+	return db
+}
+
+// Create 鍗曟潯鎻掑叆
+func (slf *PayrollSalaryPlanSearch) Create(record *PayrollSalaryPlan) error {
+	var db = slf.build()
+
+	if err := db.Create(record).Error; err != nil {
+		return fmt.Errorf("create err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// CreateBatch 鎵归噺鎻掑叆
+func (slf *PayrollSalaryPlanSearch) CreateBatch(records []*PayrollSalaryPlan) error {
+	var db = slf.build()
+
+	if err := db.Create(&records).Error; err != nil {
+		return fmt.Errorf("create batch err: %v, records: %+v", err, records)
+	}
+
+	return nil
+}
+
+// Save 鍗曟潯鏇存柊
+func (slf *PayrollSalaryPlanSearch) Save(record *PayrollSalaryPlan) error {
+	var db = slf.build()
+
+	if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// SaveBatch 鎵归噺鏇存柊
+func (slf *PayrollSalaryPlanSearch) SaveBatch(record []*PayrollSalaryPlan) error {
+	var db = slf.build()
+
+	if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// UpdateByMap 鍗曟潯鏇存柊
+func (slf *PayrollSalaryPlanSearch) UpdateByMap(upMap map[string]interface{}) error {
+	var (
+		db = slf.build()
+	)
+
+	if err := db.Updates(upMap).Error; err != nil {
+		return fmt.Errorf("update by map err: %v, upMap: %+v", err, upMap)
+	}
+
+	return nil
+}
+
+// UpdateByQuery 鎵归噺鏇存柊
+func (slf *PayrollSalaryPlanSearch) UpdateByQuery(query string, args []interface{}, upMap map[string]interface{}) error {
+	var (
+		db = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if err := db.Updates(upMap).Error; err != nil {
+		return fmt.Errorf("update by query err: %v, query: %s, args: %+v, upMap: %+v", err, query, args, upMap)
+	}
+
+	return nil
+}
+
+// Delete 鍒犻櫎
+func (slf *PayrollSalaryPlanSearch) Delete() error {
+	var db = slf.build()
+
+	if err := db.Unscoped().Delete(&PayrollSalaryPlan{}).Error; err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// First 鏍规嵁鏉′欢鏌ヨ涓�鏉¤褰�
+func (slf *PayrollSalaryPlanSearch) First() (*PayrollSalaryPlan, error) {
+	var (
+		record = new(PayrollSalaryPlan)
+		db     = slf.build()
+	)
+
+	if err := db.First(record).Error; err != nil {
+		return record, err
+	}
+
+	return record, nil
+}
+
+// Find 鎸囧畾鏉′欢鏌ヨ锛堝寘鍚�绘潯鏁帮級
+func (slf *PayrollSalaryPlanSearch) Find() ([]*PayrollSalaryPlan, int64, error) {
+	var (
+		records = make([]*PayrollSalaryPlan, 0)
+		total   int64
+		db      = slf.build()
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find count err: %v", err)
+	}
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, total, nil
+}
+
+// FindNotTotal 鎸囧畾鏉′欢鏌ヨ
+func (slf *PayrollSalaryPlanSearch) FindNotTotal() ([]*PayrollSalaryPlan, error) {
+	var (
+		records = make([]*PayrollSalaryPlan, 0)
+		db      = slf.build()
+	)
+
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, nil
+}
+
+// FindByQuery 鎸囧畾鏉′欢鏌ヨ锛堝寘鍚�绘潯鏁帮級
+func (slf *PayrollSalaryPlanSearch) FindByQuery(query string, args []interface{}) ([]*PayrollSalaryPlan, int64, error) {
+	var (
+		records = make([]*PayrollSalaryPlan, 0)
+		total   int64
+		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find by query count err: %v", err)
+	}
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+	}
+
+	return records, total, nil
+}
+
+// FindByQueryNotTotal 鎸囧畾鏉′欢鏌ヨ&涓嶆煡璇㈡�绘潯鏁�.
+func (slf *PayrollSalaryPlanSearch) FindByQueryNotTotal(query string, args []interface{}) ([]*PayrollSalaryPlan, error) {
+	var (
+		records = make([]*PayrollSalaryPlan, 0)
+		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+	}
+
+	return records, nil
+}
+
+// InitDefaultData 鍒濆鍖栨暟鎹�
+func (slf *PayrollSalaryPlanSearch) 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([]*PayrollSalaryPlan, 0)
+	workers, _ := NewWorkerSearch().FindNotTotal()
+	for _, record := range workers {
+		r := rand.Intn(10)
+		data = append(data, &PayrollSalaryPlan{
+			Cycle:        date,
+			WorkerID:     record.ID,
+			WorkerName:   record.Name,
+			WorkTypeID:   uint(r + 1),
+			WorkTypeCode: constvar.JobTypeArr[r],
+			WorkTypeName: constvar.JobTypeMap[constvar.JobTypeArr[r]],
+			Remark:       "娴嬭瘯鏁版嵁",
+		})
+	}
+	err := slf.CreateBatch(data)
+	if err != nil {return err}*/
+
+	return nil
+}
diff --git a/models/payroll_working_hours.go b/models/payroll_working_hours.go
new file mode 100644
index 0000000..d9f04da
--- /dev/null
+++ b/models/payroll_working_hours.go
@@ -0,0 +1,323 @@
+package models
+
+import (
+	"fmt"
+	"github.com/shopspring/decimal"
+	"gorm.io/gorm"
+	"silkserver/constvar"
+	"silkserver/pkg/mysqlx"
+)
+
+// 宸ユ椂缁熻
+type (
+	// PayrollWorkingHours 宸ヨ祫璁$畻-鍛樺伐鐨勫伐鏃剁粺璁�
+	PayrollWorkingHours struct {
+		BaseModelInt
+		Cycle             string                     `json:"cycle" gorm:"index;size:20;not null;comment:缁熻鍛ㄦ湡锛堝勾鏈堟棩锛�"`   //缁熻鍛ㄦ湡锛堝勾鏈堟棩锛�
+		WorkTypeID        uint                       `json:"workTypeID" gorm:"type:bigint(20);not null;comment:宸ョID"` //宸ョID
+		WorkTypeCode      constvar.JobType           `json:"workTypeCode" gorm:"size:255;not null;comment:宸ョ缂栫爜"`      //宸ョ缂栫爜
+		WorkType          WorkTypeManage             `json:"workType" gorm:"foreignKey:WorkTypeID;references:ID"`
+		WorkerID          string                     `json:"workerId" gorm:"size:200;not null;comment:鍛樺伐ID"` //鍛樺伐ID
+		Worker            Worker                     `json:"worker" gorm:"foreignKey:WorkerID;references:ID"`
+		WorkshopId        uint                       `json:"workshopId" gorm:"size:11;comment:杞﹂棿ID"`                   // 杞﹂棿ID
+		WorkshopNumber    string                     `json:"workshopNumber" gorm:"size:255;not null;comment:杞﹂棿缂栧彿"`     // 杞﹂棿缂栧彿
+		GroupNumber       int                        `json:"groupNumber" gorm:"size:11;not null;comment:缁勫埆"`           // 缁勫埆
+		StartCarNumber    int                        `json:"startCarNumbers"  gorm:"size:11;comment:杞﹀彴鍙峰紑濮�"`            // 杞﹀彴鍙峰垪琛�
+		EndCarNumber      int                        `json:"endCarNumbers"  gorm:"size:11;comment:杞﹀彴鍙风粨鏉�"`              // 杞﹀彴鍙峰垪琛�
+		ShiftTime         string                     `json:"shiftStartTime" gorm:"size:100;comment:鐝鏃堕棿娈�" `            // 鐝鏃堕棿娈�
+		ShiftCrossDay     bool                       `json:"shiftCrossDay" gorm:"size:1;comment:鏄惁涓鸿法澶╃彮娆�" `             // 鏄惁涓鸿法澶╃彮娆�
+		ShiftClockInTime  string                     `json:"shiftClockInTime" gorm:"size:50;comment:涓婄彮鎵撳崱鏃堕棿" `          // 涓婄彮鎵撳崱鏃堕棿
+		ShiftClockOutTime string                     `json:"shiftClockOutTime" gorm:"size:50;comment:涓嬬彮鎵撳崱鏃堕棿" `         // 涓嬬彮鎵撳崱鏃堕棿
+		OvertimeType      constvar.ShiftOvertimeType `json:"overtimeType" gorm:"size:50;comment:鍔犵彮绫诲瀷" `                // 鍔犵彮绫诲瀷
+		OvertimeDuration  decimal.Decimal            `json:"overtimeDuration" gorm:"type:decimal(12,4);comment:鍔犵彮鏃堕暱" ` // 鍔犵彮鏃堕暱
+		OvertimePay       decimal.Decimal            `json:"overtimePay" gorm:"type:decimal(12,4);comment:鍔犵彮宸ヨ祫"`       // 鍔犵彮宸ヨ祫
+	}
+
+	PayrollWorkingHoursSearch struct {
+		PayrollWorkingHours
+		Monthly  string
+		Order    string
+		PageNum  int
+		PageSize int
+		Preload  bool
+		Orm      *gorm.DB
+	}
+)
+
+func (slf PayrollWorkingHours) TableName() string {
+	return "silk_payroll_working_hours"
+}
+
+// NewPayrollWorkingHoursSearch 鍛樺伐鐨勫伐鏃剁粺璁�
+func NewPayrollWorkingHoursSearch() *PayrollWorkingHoursSearch {
+	return &PayrollWorkingHoursSearch{Orm: mysqlx.GetDB()}
+}
+
+func (slf *PayrollWorkingHoursSearch) SetOrm(tx *gorm.DB) *PayrollWorkingHoursSearch {
+	slf.Orm = tx
+	return slf
+}
+
+func (slf *PayrollWorkingHoursSearch) SetPage(page, size int) *PayrollWorkingHoursSearch {
+	slf.PageNum, slf.PageSize = page, size
+	return slf
+}
+
+func (slf *PayrollWorkingHoursSearch) SetOrder(order string) *PayrollWorkingHoursSearch {
+	slf.Order = order
+	return slf
+}
+
+func (slf *PayrollWorkingHoursSearch) SetID(id uint) *PayrollWorkingHoursSearch {
+	slf.ID = id
+	return slf
+}
+
+func (slf *PayrollWorkingHoursSearch) SetCycle(cycle string) *PayrollWorkingHoursSearch {
+	slf.Cycle = cycle
+	return slf
+}
+
+func (slf *PayrollWorkingHoursSearch) SetMonthly(monthly string) *PayrollWorkingHoursSearch {
+	slf.Monthly = monthly
+	return slf
+}
+
+func (slf *PayrollWorkingHoursSearch) SetWorkTypeID(workTypeID uint) *PayrollWorkingHoursSearch {
+	slf.WorkTypeID = workTypeID
+	return slf
+}
+
+func (slf *PayrollWorkingHoursSearch) SetWorkTypeCode(workTypeCode constvar.JobType) *PayrollWorkingHoursSearch {
+	slf.WorkTypeCode = workTypeCode
+	return slf
+}
+
+func (slf *PayrollWorkingHoursSearch) SetWorkerID(workerID string) *PayrollWorkingHoursSearch {
+	slf.WorkerID = workerID
+	return slf
+}
+
+func (slf *PayrollWorkingHoursSearch) SetWorkshopNumber(workshopNumber string) *PayrollWorkingHoursSearch {
+	slf.WorkshopNumber = workshopNumber
+	return slf
+}
+
+func (slf *PayrollWorkingHoursSearch) SetGroupNumber(groupNumber int) *PayrollWorkingHoursSearch {
+	slf.GroupNumber = groupNumber
+	return slf
+}
+
+func (slf *PayrollWorkingHoursSearch) build() *gorm.DB {
+	var db = slf.Orm.Table(slf.TableName())
+
+	if slf.Preload {
+		db = db.Model(&PayrollWorkingHours{}).Preload("Worker").Preload("WorkTypeManage")
+	}
+
+	if slf.ID > 0 {
+		db = db.Where("id = ?", slf.ID)
+	}
+
+	if slf.Cycle != "" {
+		db = db.Where("cycle = ?", slf.Cycle)
+	}
+
+	if slf.Monthly != "" {
+		db = db.Where("cycle like ?", slf.Monthly+"%")
+	}
+
+	if slf.WorkTypeID > 0 {
+		db = db.Where("work_type_id = ?", slf.WorkTypeID)
+	}
+
+	if slf.WorkerID != "" {
+		db = db.Where("worker_id = ?", slf.WorkerID)
+	}
+
+	if slf.WorkshopNumber != "" {
+		db = db.Where("workshop_number = ?", slf.WorkshopNumber)
+	}
+
+	if slf.GroupNumber > 0 {
+		db = db.Where("group_number = ?", slf.GroupNumber)
+	}
+
+	db.Where("1 = 1")
+	if slf.Order != "" {
+		db = db.Order(slf.Order)
+	}
+
+	return db
+}
+
+// Create 鍗曟潯鎻掑叆
+func (slf *PayrollWorkingHoursSearch) Create(record *PayrollWorkingHours) error {
+	var db = slf.build()
+
+	if err := db.Create(record).Error; err != nil {
+		return fmt.Errorf("create err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// CreateBatch 鎵归噺鎻掑叆
+func (slf *PayrollWorkingHoursSearch) CreateBatch(records []*PayrollWorkingHours) error {
+	var db = slf.build()
+
+	if err := db.Create(&records).Error; err != nil {
+		return fmt.Errorf("create batch err: %v, records: %+v", err, records)
+	}
+
+	return nil
+}
+
+// Save 鍗曟潯鏇存柊
+func (slf *PayrollWorkingHoursSearch) Save(record *PayrollWorkingHours) error {
+	var db = slf.build()
+
+	if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// SaveBatch 鎵归噺鏇存柊
+func (slf *PayrollWorkingHoursSearch) SaveBatch(record []*PayrollWorkingHours) error {
+	var db = slf.build()
+
+	if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// UpdateByMap 鍗曟潯鏇存柊
+func (slf *PayrollWorkingHoursSearch) UpdateByMap(upMap map[string]interface{}) error {
+	var (
+		db = slf.build()
+	)
+
+	if err := db.Updates(upMap).Error; err != nil {
+		return fmt.Errorf("update by map err: %v, upMap: %+v", err, upMap)
+	}
+
+	return nil
+}
+
+// UpdateByQuery 鎵归噺鏇存柊
+func (slf *PayrollWorkingHoursSearch) UpdateByQuery(query string, args []interface{}, upMap map[string]interface{}) error {
+	var (
+		db = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if err := db.Updates(upMap).Error; err != nil {
+		return fmt.Errorf("update by query err: %v, query: %s, args: %+v, upMap: %+v", err, query, args, upMap)
+	}
+
+	return nil
+}
+
+// Delete 鍒犻櫎
+func (slf *PayrollWorkingHoursSearch) Delete() error {
+	var db = slf.build()
+
+	if err := db.Unscoped().Delete(&PayrollWorkingHours{}).Error; err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// First 鏍规嵁鏉′欢鏌ヨ涓�鏉¤褰�
+func (slf *PayrollWorkingHoursSearch) First() (*PayrollWorkingHours, error) {
+	var (
+		record = new(PayrollWorkingHours)
+		db     = slf.build()
+	)
+
+	if err := db.First(record).Error; err != nil {
+		return record, err
+	}
+
+	return record, nil
+}
+
+// Find 鎸囧畾鏉′欢鏌ヨ锛堝寘鍚�绘潯鏁帮級
+func (slf *PayrollWorkingHoursSearch) Find() ([]*PayrollWorkingHours, int64, error) {
+	var (
+		records = make([]*PayrollWorkingHours, 0)
+		total   int64
+		db      = slf.build()
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find count err: %v", err)
+	}
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, total, nil
+}
+
+// FindNotTotal 鎸囧畾鏉′欢鏌ヨ
+func (slf *PayrollWorkingHoursSearch) FindNotTotal() ([]*PayrollWorkingHours, error) {
+	var (
+		records = make([]*PayrollWorkingHours, 0)
+		db      = slf.build()
+	)
+
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, nil
+}
+
+// FindByQuery 鎸囧畾鏉′欢鏌ヨ锛堝寘鍚�绘潯鏁帮級
+func (slf *PayrollWorkingHoursSearch) FindByQuery(query string, args []interface{}) ([]*PayrollWorkingHours, int64, error) {
+	var (
+		records = make([]*PayrollWorkingHours, 0)
+		total   int64
+		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find by query count err: %v", err)
+	}
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+	}
+
+	return records, total, nil
+}
+
+// FindByQueryNotTotal 鎸囧畾鏉′欢鏌ヨ&涓嶆煡璇㈡�绘潯鏁�.
+func (slf *PayrollWorkingHoursSearch) FindByQueryNotTotal(query string, args []interface{}) ([]*PayrollWorkingHours, error) {
+	var (
+		records = make([]*PayrollWorkingHours, 0)
+		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+	}
+
+	return records, nil
+}
diff --git a/router/router.go b/router/router.go
index 7789777..b4fa13b 100644
--- a/router/router.go
+++ b/router/router.go
@@ -96,11 +96,14 @@
 	salaryApi := r.Group(urlPrefix + "/salary")
 	salaryPlanController := new(controllers.SalaryPlanController)
 	{
-		salaryApi.POST("saveSalaryPlan", salaryPlanController.SaveSalaryPlan)                   //淇濆瓨钖叕鏂规
-		salaryApi.POST("getSalaryPlanList", salaryPlanController.GetSalaryPlanList)             //鑾峰彇钖叕鏂规鍒楄〃
-		salaryApi.DELETE("deleteSalaryPlanInfo/:id", salaryPlanController.DeleteSalaryPlanInfo) //鍒犻櫎钖叕鏂规
-		salaryApi.GET("getSalaryTypeList/:type", salaryPlanController.GetSalaryTypeList)        //鑾峰彇钖祫绫诲瀷鍒楄〃
-		salaryApi.POST("saveSalaryType", salaryPlanController.SaveSalaryType)                   //淇濆瓨钖祫绫诲瀷
+		salaryApi.POST("saveSalaryPlan", salaryPlanController.SaveSalaryPlan)                              //淇濆瓨钖叕鏂规
+		salaryApi.POST("getSalaryPlanList", salaryPlanController.GetSalaryPlanList)                        //鑾峰彇钖叕鏂规鍒楄〃
+		salaryApi.DELETE("deleteSalaryPlanInfo/:id", salaryPlanController.DeleteSalaryPlanInfo)            //鍒犻櫎钖叕鏂规
+		salaryApi.GET("getSalaryTypeList/:type", salaryPlanController.GetSalaryTypeList)                   //鑾峰彇钖祫绫诲瀷鍒楄〃
+		salaryApi.POST("saveSalaryType", salaryPlanController.SaveSalaryType)                              //淇濆瓨钖祫绫诲瀷
+		salaryApi.GET("getPayrollProductionCarList", salaryPlanController.GetPayrollProductionCarList)     //鑾峰彇杞﹀彴姣忓ぉ鐨勪骇閲忓垪琛�
+		salaryApi.GET("getPayrollProductionGroupList", salaryPlanController.GetPayrollProductionGroupList) //鑾峰彇灏忕粍姣忓ぉ鐨勪骇閲忓垪琛�
+		salaryApi.GET("getPayrollSalaryPlanList", salaryPlanController.GetPayrollSalaryPlanList)           //鑾峰彇浜哄憳姣忔湀鐨勮柂璧勫垪琛�
 	}
 
 	//鑰冨嫟绠$悊
diff --git a/service/salary_plan.go b/service/salary_plan.go
new file mode 100644
index 0000000..df0f491
--- /dev/null
+++ b/service/salary_plan.go
@@ -0,0 +1,499 @@
+package service
+
+import (
+	"errors"
+	"fmt"
+	"github.com/shopspring/decimal"
+	"gorm.io/gorm"
+	"silkserver/constvar"
+	"silkserver/models"
+	"strconv"
+	"strings"
+)
+
+type WeaversAmount struct {
+	WorkerID string          `json:"workerID"`
+	Amount   decimal.Decimal `json:"amount"`
+}
+
+// 钖祫璁$畻
+// 绾ゅ害鐧昏锛歴ilk_fineness_register	silk_fineness_register_item
+// 绾ゅ害妫�楠岋細silk_fineness_check	silk_fineness_check_item
+// 浜ч噺鐧昏鐧昏锛歴ilk_yield_register_circle
+
+// WorkingHours 瀛樿〃锛氬伐鏃惰绠楋紙鏃ユ湡锛堝勾鏈堟棩锛夈�佸伐绉嶃�佸憳宸ュ鍚嶃�佸皬缁勩�佽溅鍙般�佷骇閲忓伐璧勩�佷笂鐝秴鏃讹紙灏忔椂锛夈�佷笂鐝秴鏃讹紙澶╋級銆佸姞鐝紙鍗曠嫭锛夈�佸姞鐝紙鍏ㄨ溅闂达級銆佸嚭鍕わ紙澶╋級銆佸甫寰掞紙澶╋級銆佷骇閲忥紙KG锛夈�佸叾瀹冿級
+func WorkingHours(date string) error {
+	// 浜哄憳淇℃伅
+	workers, err := models.NewWorkerSearch().FindNotTotal()
+	if err != nil {
+		return err
+	}
+
+	// 鎺掔彮淇℃伅(鍔熻兘缂哄け)
+	// 鎵撳崱淇℃伅锛堥�氳繃浜哄憳鍏宠仈锛�
+	attendances, err := models.NewAttendanceManageSearch().SetDate(date).FindNotTotal()
+
+	// 杞﹀彴淇℃伅锛堥�氳繃浜哄憳鍏宠仈锛�
+	workerPositions, err := models.NewWorkerPositionSearch().SetOverlappingDate(date, date).FindAll()
+
+	list := make([]*models.PayrollWorkingHours, 0)
+	for _, worker := range workers {
+		workingHours := models.PayrollWorkingHours{
+			Cycle:        date,
+			WorkTypeID:   worker.WorkTypeId,
+			WorkTypeCode: worker.WorkTypeCode,
+			WorkerID:     worker.ID,
+		}
+
+		for _, attendance := range attendances {
+			if worker.ID == attendance.WorkerId {
+				workingHours.ShiftTime = fmt.Sprintf("%v-%v", attendance.ClassesStartTime, attendance.ClassesEndTime)
+				if attendance.ClassesStartTime != "" && attendance.ClassesEndTime != "" {
+					startH, _ := strconv.Atoi(strings.Split(attendance.ClassesStartTime, ":")[0])
+					endH, _ := strconv.Atoi(strings.Split(attendance.ClassesEndTime, ":")[0])
+					if startH > endH {
+						workingHours.ShiftCrossDay = true
+					}
+				}
+				workingHours.ShiftClockInTime = attendance.StartWorkTime
+				workingHours.ShiftClockOutTime = attendance.EndWorkTime
+				workingHours.OvertimeType = constvar.ShiftOvertimeTypeTimeout
+				workingHours.OvertimeDuration = attendance.OverTimeDuration
+			}
+		}
+		for _, position := range workerPositions {
+			if worker.ID == position.WorkerId {
+				//workingHours.WorkshopId = position.Workshop
+				workingHours.WorkshopNumber = position.Workshop
+				workingHours.GroupNumber = position.WorkshopGroup
+				//workingHours.CarNumbers = fmt.Sprintf("%v-%v", position.StartWorkerPosition, position.EndWorkerPosition)
+				workingHours.StartCarNumber = position.StartWorkerPosition
+				workingHours.EndCarNumber = position.EndWorkerPosition
+				continue
+			}
+		}
+
+		list = append(list, &workingHours)
+	}
+
+	err = models.WithTransaction(func(db *gorm.DB) error {
+
+		models.NewPayrollWorkingHoursSearch().SetOrm(db).SetCycle(date).Delete()
+
+		models.NewPayrollWorkingHoursSearch().SetOrm(db).CreateBatch(list)
+		return nil
+	})
+
+	return nil
+}
+
+// ProductionCar 瀛樿〃锛氳溅鍙版瘡鏃ヤ骇閲忕粺璁� 锛堟棩鏈燂紙骞存湀鏃ワ級銆佽溅闂淬�佽溅鍙般�佸簞鍙c�佹湡鏈涚瓑绾с�佹垚鍝佺瓑绾с�佷笣閲忋�佷笣鍗曚环锛坖son锛夈�侀噹绾ゃ�侀噹绾ゅ崟浠凤紙json锛夈�佷笣閲忛噾棰濄�侀噹绾ら噾棰濄�佹垚鍝侀噾棰�(涓濋噺閲戦-閲庣氦閲戦)锛�
+func ProductionCar(date string) error {
+	yieldRegisters, err := models.NewYieldRegisterSearch().SetCreateTime(date).FindNotTotal() // 浜ч噺鐧昏
+	if err != nil {
+		return err
+	}
+	finenesss, err := models.NewFinenessRegisterSearch().SetFinishDate(date).FindAll() // 绾ゅ害鐧昏
+	if err != nil {
+		return err
+	}
+	finenessIds := make([]uint, len(finenesss))
+	for i, fineness := range finenesss {
+		finenessIds[i] = fineness.ID
+	}
+	finenessChecks, err := models.NewFinenessCheckSearch().SetFinenessRegisterIDs(finenessIds).FindAll() // 绾ゅ害妫�楠�
+	if err != nil {
+		return err
+	}
+
+	priceStandards, _ := models.NewRawSilkPriceStandardSearch().FindNotTotal() // 鐢熶笣瀹氫环
+	priceStandardMap := make(map[string]decimal.Decimal)                       // map[搴勫彛\鏍囧彿]瀹氫环
+	for _, price := range priceStandards {
+		key := fmt.Sprintf("%d%s", price.MarketNumber, price.RawSilkGrade)
+		priceStandardMap[key] = price.PayStandard
+	}
+
+	workingHours, err := models.NewPayrollWorkingHoursSearch().SetWorkTypeCode(constvar.JobTypeWeavers).SetCycle(date).FindNotTotal() // 鍛樺伐鐨勫伐鏃剁粺璁�
+	if err != nil {
+		return err
+	}
+
+	// 杞﹀彴鎸¤溅宸ラ噸澶嶄汉鍛樻爣璁�
+	carEmployeeMap := make(map[string]map[string]bool) // map[杞﹂棿\缁勫埆\杞﹀彿]map[浜哄憳]true
+	for _, yield := range yieldRegisters {
+		for _, workingHour := range workingHours {
+			if yield.WorkshopNumber == workingHour.WorkshopNumber && yield.GroupNumber == workingHour.GroupNumber {
+				for _, circle := range yield.Circles {
+					if circle.CarNumber >= workingHour.StartCarNumber && circle.CarNumber <= workingHour.EndCarNumber {
+						key := fmt.Sprintf("%v%v%v", workingHour.WorkshopNumber, workingHour.GroupNumber, circle.CarNumber)
+						tempMap := carEmployeeMap[key]
+						tempMap[workingHour.WorkerID] = true
+						carEmployeeMap[key] = tempMap
+					}
+				}
+			}
+		}
+	}
+
+	productionCar := make([]*models.PayrollProductionCar, 0)
+	for _, yield := range yieldRegisters {
+		info := models.PayrollProductionCar{
+			Cycle:             date,
+			WorkshopNumber:    yield.WorkshopNumber,
+			GroupNumber:       yield.GroupNumber,
+			MarketId:          yield.MarketId,
+			MarketNumber:      yield.MarketNumber,
+			MarketName:        yield.MarketName,
+			FallingSilkBucket: yield.FallingSilkBucketOne.Add(yield.FallingSilkBucketTwo).Add(yield.FallingSilkBucketThree),
+			Spec:              yield.Spec,
+			CarWorkQuantity:   1,
+		}
+
+		for _, check := range finenessChecks {
+			// 搴勫彛銆佽溅闂淬�佺粍鍒�
+			if yield.MarketId == check.FinenessRegister.MarketId &&
+				yield.WorkshopNumber == check.FinenessRegister.WorkshopNumber &&
+				yield.GroupNumber == check.FinenessRegister.WorkshopGroup {
+
+				info.FinishLevel = check.FinenessGrade
+
+				key := fmt.Sprintf("%v%v", info.MarketNumber, info.FinishLevel)
+				if payStandard, ok := priceStandardMap[key]; ok {
+					info.SilkUnitAmount = payStandard
+				}
+				continue
+			}
+		}
+
+		silkQuantityMap := make(map[int]decimal.Decimal) // map[杞﹀彿]鏁伴噺  涓濋噺
+		for _, circle := range yield.Circles {
+			if yield.ID == circle.YieldRegisterId {
+				silkQuantityMap[circle.CarNumber] = silkQuantityMap[circle.CarNumber].Add(circle.Value)
+			}
+		}
+
+		// 閲庣氦缁熻
+		badSilkQuantityMap := make(map[int]map[string]int) // map[杞﹀彿]map[绾ゅ害绛夌骇]鏁伴噺
+		for _, check := range finenessChecks {
+			if yield.MarketId == check.FinenessRegister.MarketId &&
+				yield.WorkshopNumber == check.FinenessRegister.WorkshopNumber &&
+				yield.GroupNumber == check.FinenessRegister.WorkshopGroup {
+
+				if strings.Contains(check.FinenessGrade, "閲�") {
+					temp := badSilkQuantityMap[check.FinenessRegister.Position]
+					temp[check.FinenessGrade] = temp[check.FinenessGrade] + 1
+					badSilkQuantityMap[check.FinenessRegister.Position] = temp
+				}
+			}
+		}
+
+		for carNumber := range silkQuantityMap {
+			result := info
+			result.CarNumber = carNumber
+			// 涓�杞﹀浜猴紝绠楀钩鍧�
+			key := fmt.Sprintf("%v%v%v", yield.WorkshopNumber, yield.GroupNumber, carNumber)
+			if workIdMap, ok := carEmployeeMap[key]; ok {
+				result.CarWorkQuantity = len(workIdMap)
+				for workId := range workIdMap {
+					result.CarWorkIds += workId + ","
+				}
+			}
+			// 閲庣氦
+			if bad, ok := badSilkQuantityMap[carNumber]; ok {
+				quantityTmp := 0
+				totalAmount := decimal.NewFromInt32(0)
+				for s := range bad {
+					quantityTmp = quantityTmp + bad[s]
+					for _, price := range priceStandards {
+						if price.MarketId == result.MarketId && price.RawSilkGrade == s {
+							result.BadSilkUnitAmount = price.PayStandard
+							totalAmount = totalAmount.Add(result.BadSilkUnitAmount.Mul(decimal.NewFromInt32(int32(bad[s]))))
+							continue
+						}
+					}
+					result.BadSilkType += s + ","
+				}
+
+				result.BadSilkQuantity = decimal.NewFromInt32(int32(quantityTmp))
+				result.BadSilkAvgQuantity = result.BadSilkQuantity.Div(decimal.NewFromInt32(int32(result.CarWorkQuantity)))
+				result.BadSilkTotalAmount = totalAmount
+				result.BadSilkTotalAvgAmount = totalAmount.Div(decimal.NewFromInt32(int32(result.CarWorkQuantity)))
+			}
+			result.SilkQuantity = silkQuantityMap[carNumber]
+			result.SilkAvgQuantity = result.SilkQuantity.Div(decimal.NewFromInt32(int32(result.CarWorkQuantity)))
+			result.SilkTotalAmount = result.SilkQuantity.Mul(result.SilkUnitAmount)
+			result.SilkTotalAvgAmount = result.SilkQuantity.Mul(result.SilkUnitAmount).Div(decimal.NewFromInt32(int32(result.CarWorkQuantity)))
+			result.FinishTotalAmount = result.SilkTotalAmount.Sub(result.BadSilkTotalAmount)
+
+			productionCar = append(productionCar, &result)
+		}
+
+	}
+	err = models.WithTransaction(func(db *gorm.DB) error {
+		err := models.NewPayrollProductionCarSearch().SetOrm(db).SetCycle(date).Delete()
+		if err != nil {
+			return err
+		}
+		err = models.NewPayrollProductionCarSearch().SetOrm(db).CreateBatch(productionCar)
+		if err != nil {
+			return err
+		}
+		return nil
+	})
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ProductionGroup 瀛樿〃锛氬皬缁勬瘡澶╃殑浜ч噺鐧昏
+func ProductionGroup(date string) error {
+	productionCars, err := models.NewPayrollProductionCarSearch().SetOrder("workshop_number, group_number").
+		SetCycle(date).FindNotTotal() // 杞﹀彴姣忓ぉ鐨勪骇閲忕粺璁�
+	if err != nil {
+		return err
+	}
+
+	productionGroupList := make([]*models.PayrollProductionGroup, 0)
+	var counter int
+	for i := 0; i < len(productionCars); i++ {
+		counter = 0
+		silkQuantity := decimal.NewFromInt32(0)
+		silkAvgQuantity := decimal.NewFromInt32(0)
+		silkTotalAmount := decimal.NewFromInt32(0)
+		silkTotalAvgAmount := decimal.NewFromInt32(0)
+		badSilkQuantity := decimal.NewFromInt32(0)
+		badSilkTotalAmount := decimal.NewFromInt32(0)
+		badSilkTotalAvgAmount := decimal.NewFromInt32(0)
+		finishTotalAmount := decimal.NewFromInt32(0)
+		finishTotalAvgAmount := decimal.NewFromInt32(0)
+		fallingSilkBucket := decimal.NewFromInt32(0)
+
+		for j := i; j < len(productionCars); j++ {
+			if productionCars[i].WorkshopNumber == productionCars[j].WorkshopNumber &&
+				productionCars[i].GroupNumber == productionGroupList[j].GroupNumber {
+				// 涓�杞﹀浜猴紝绠楀钩鍧�
+				//population := decimal.NewFromInt32(int32(productionCars[j].CarWorkQuantity))
+				silkQuantity = silkQuantity.Add(productionCars[j].SilkQuantity)
+				silkAvgQuantity = silkAvgQuantity.Add(productionCars[j].SilkAvgQuantity)
+				silkTotalAmount = silkTotalAmount.Add(productionCars[j].SilkTotalAmount)
+				silkTotalAvgAmount = silkTotalAvgAmount.Add(productionCars[j].SilkTotalAvgAmount)
+				badSilkQuantity = badSilkQuantity.Add(productionCars[j].BadSilkQuantity)
+				badSilkTotalAmount = badSilkTotalAmount.Add(productionCars[j].BadSilkTotalAmount)
+				badSilkTotalAvgAmount = badSilkTotalAvgAmount.Add(productionCars[j].BadSilkTotalAvgAmount)
+				finishTotalAmount = finishTotalAmount.Add(productionCars[j].FinishTotalAmount)
+				finishTotalAvgAmount = finishTotalAvgAmount.Add(productionCars[j].FinishTotalAvgAmount)
+				fallingSilkBucket = fallingSilkBucket.Add(productionCars[j].FallingSilkBucket)
+
+				counter += 1
+				// 璺宠繃閲嶅椤�
+				if i != j {
+					i += 1
+				}
+			}
+
+		}
+		counterD := decimal.NewFromInt32(int32(counter))
+		productionGroupList = append(productionGroupList, &models.PayrollProductionGroup{
+			Cycle:                 date,
+			WorkshopNumber:        productionCars[i].WorkshopNumber,
+			GroupNumber:           productionCars[i].GroupNumber,
+			FallingSilkBucket:     fallingSilkBucket,
+			SilkQuantity:          silkQuantity,
+			SilkAvgQuantity:       silkAvgQuantity.Div(counterD),
+			SilkTotalAmount:       silkTotalAmount,
+			SilkTotalAvgAmount:    silkTotalAmount.Div(counterD),
+			BadSilkQuantity:       badSilkQuantity,
+			BadSilkTotalAmount:    badSilkTotalAmount,
+			BadSilkTotalAvgAmount: badSilkTotalAmount.Div(counterD),
+			FinishTotalAmount:     finishTotalAmount,
+			FinishTotalAvgAmount:  finishTotalAmount.Div(counterD),
+		})
+	}
+
+	err = models.WithTransaction(func(db *gorm.DB) error {
+		err := models.NewPayrollProductionGroupSearch().SetOrm(db).SetCycle(date).Delete()
+		if err != nil {
+			return err
+		}
+		err = models.NewPayrollProductionGroupSearch().SetOrm(db).CreateBatch(productionGroupList)
+		if err != nil {
+			return err
+		}
+		return nil
+	})
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// 鏍规嵁涓婃姤璁$畻锛�
+//	1銆佽溅鍙板綋鏈堝叏绛夌骇涓濇�婚噺锛�
+//	2銆佽溅鍙板綋鏈堝悇绛夌骇涓濇�婚噺锛�
+//	3銆佽溅鍙版瘡鏈堢瓑绾у崰姣�=杞﹀彴褰撴湀鍚勭瓑绾т笣鎬婚噺/杞﹀彴褰撴湀鍏ㄧ瓑绾т笣鎬婚噺锛�
+//	4銆佽溅鍙版瘡鏈堟瘡浜哄钩鍧囦笣閲�=杞﹀彴褰撴湀鍏ㄧ瓑绾т笣鎬婚噺/杞﹀彴鎸¤溅宸ヤ汉鏁帮紱
+//	5銆佽溅鍙板綋鏈堝叏閲庣氦鎵i櫎閲戦锛�
+//	6銆佽溅鍙版瘡鏈堟瘡浜哄钩鍧囬噹绾ゆ墸闄ら噾棰�=褰撴湀鍏ㄩ噹绾ゆ墸闄ら噾棰�/杞﹀彴鎸¤溅宸ヤ汉鏁帮紱
+//	7銆佽溅鍙版瘡鏈堜笣閲忔�婚噾棰�
+//	8銆佽溅鍙版瘡鏈堜笣閲忔垚鍝侀噾棰�
+//	9銆佽溅鍙版瘡鏈堟瘡浜哄钩鍧囦笣閲忛噾棰�=杞﹀彴姣忔湀涓濋噺鎴愬搧閲戦/杞﹀彴鎸¤溅宸ヤ汉鏁�
+
+// ProductionEmployee 瀛樿〃锛� 姣忎汉姣忓ぉ鐨勪骇閲忕粺璁$櫥璁�
+func ProductionWeavers(date string) error {
+	workingHours, err := models.NewPayrollWorkingHoursSearch().SetWorkTypeCode(constvar.JobTypeWeavers).SetCycle(date).FindNotTotal() // 鍛樺伐鐨勫伐鏃剁粺璁�
+	if err != nil {
+		return err
+	}
+
+	productionCars, err := models.NewPayrollProductionCarSearch().SetCycle(date).FindNotTotal()
+	if err != nil {
+		return err
+	}
+
+	productionEmployee := make([]*models.PayrollProductionWeavers, 0)
+	for _, worker := range workingHours {
+		info := models.PayrollProductionWeavers{
+			Cycle:          date,
+			WorkTypeID:     worker.WorkTypeID,
+			WorkerID:       worker.WorkerID,
+			WorkshopNumber: worker.WorkshopNumber,
+			GroupNumber:    worker.GroupNumber,
+		}
+		for _, car := range productionCars {
+			if car.WorkshopNumber == worker.WorkshopNumber && car.GroupNumber == worker.GroupNumber &&
+				car.CarNumber >= worker.StartCarNumber && car.CarNumber <= worker.EndCarNumber {
+				info.CarNumbers += fmt.Sprintf("%d,", car.CarNumber)
+				info.SilkQuantity = info.SilkQuantity.Add(car.SilkAvgQuantity)
+				info.SilkTotalAmount = info.SilkTotalAmount.Add(car.SilkTotalAvgAmount)
+				info.BadSilkQuantity = info.BadSilkQuantity.Add(car.BadSilkAvgQuantity)
+				info.BadSilkTotalAmount = info.BadSilkTotalAmount.Add(car.BadSilkTotalAvgAmount)
+				info.FinishTotalAmount = info.FinishTotalAmount.Add(car.FinishTotalAvgAmount)
+			}
+		}
+		productionEmployee = append(productionEmployee, &info)
+	}
+
+	err = models.WithTransaction(func(db *gorm.DB) error {
+		err := models.NewPayrollProductionWeaversSearch().SetOrm(db).SetCycle(date).Delete()
+		if err != nil {
+			return err
+		}
+		err = models.NewPayrollProductionWeaversSearch().SetOrm(db).CreateBatch(productionEmployee)
+		if err != nil {
+			return err
+		}
+		return nil
+	})
+
+	return nil
+}
+
+// 瀛樿〃锛氬伐璧勮绠楋紙鏃ユ湡锛堝勾鏈堬級銆佸伐绉嶃�佸憳宸ュ鍚嶃�佸皬缁勩�佽溅鍙般�佺敓浜у伐璧勩�佹弧鍕ゅ锛�=閰嶇疆锛夈�佽秴鏃跺伐璧勶紙=涓婄彮瓒呮椂灏忔椂*5+涓婄彮瓒呮椂澶�*6锛夈�佸姞鐝伐璧勶紙=鍗曠嫭鍔犵彮*80+鍏ㄨ溅闂村姞鐝�*75锛夈�佷氦閫氳ˉ璐达紙=1*鍑哄嫟澶╂暟锛夈�佸甫寰掕ˉ璐达紙=5*甯﹀緬澶╂暟锛夈��
+//				宀椾綅琛ヨ创锛�=閰嶇疆锛夈�佺ぞ淇濊ˉ璐达紙=閰嶇疆锛夈�佸伐榫勮ˉ璐达紙=閰嶇疆锛夈�佷笉杈句繚搴曪紙=閰嶇疆淇濆簳锛夈�佽川閲忓銆佸缃�1銆佸缃�2/娓呭噳琛ヨ创銆佸缃�3/鏃ュ父妫�鏌ャ�佸仠鏈鸿ˉ璐淬�佸簲鍙戝伐璧勩�佸娉級
+
+// OtherSubsidies 瀛樿〃锛� 鍏跺畠琛ヨ创
+func OtherSubsidies(date string) error {
+
+	models.NewPayrollOtherSubsidiesSearch() // 鍏跺畠琛ヨ创
+
+	return nil
+}
+
+// 瀛樿〃锛氳嚜鍔ㄧ极杞﹂棿鍚勬尅杞︺�佽溅澶淬�佷繚鍏ㄧ敓浜у伐璧勮绠� 锛堟棩鏈燂紙骞存湀锛夈�佽溅闂淬�佺粍鍒�佽溅鍙般�佷釜浜轰骇閲忥紙杞﹀彴姣忔湀姣忎汉骞冲潎涓濋噺锛夈�佹尅杞﹀伐宸ヨ祫锛堣溅鍙版瘡鏈堟瘡浜哄钩鍧囦笣閲忛噾棰濓級锛�
+// 鏍规嵁涓婃姤璁$畻锛�
+// 	1銆佹尅杞﹀伐骞冲潎宸ヨ祫锛堜互缁勪负鍗曚綅锛�= 姣忔湀灏忕粍姣忚溅澶村伐璧勪箣鍜�/6锛�70缁級
+//	2銆佽溅澶村伐宸ヨ祫锛堜互缁勪负鍗曚綅锛�= 鎸¤溅宸ュ钩鍧囧伐璧�*1.09锛�1.09涓烘寚瀹氱郴鏁帮級
+//	3銆佷繚鍏ㄥ伐宸ヨ祫锛堜互缁勪负鍗曚綅锛�= 锛堟尅杞﹀伐骞冲潎宸ヨ祫+杞﹀ご宸ュ伐璧勶級/2*1.2锛�1.2涓烘寚瀹氱郴鏁帮級
+//	4銆佹姌100缁尅杞﹀钩鍧囧伐璧勶紙浠ョ粍涓哄崟浣嶏級= 姣忔湀灏忕粍姣忚溅澶村伐璧勪箣鍜�/4锛�100缁級
+
+// SalaryPlan 鐢熶骇宸ヨ祫璁$畻
+func SalaryPlan(date string) error {
+	if len(date) < 7 {
+		return errors.New("璇蜂紶鍏ユ纭殑鏌ヨ鏃堕棿锛�")
+	} else {
+		date = date[:7]
+	}
+
+	hours, err := models.NewPayrollWorkingHoursSearch().SetMonthly(date).FindNotTotal() // 鍛樺伐鐨勫伐鏃剁粺璁�
+	if err != nil {
+		return err
+	}
+	groups, err := models.NewPayrollProductionGroupSearch().SetOrder("workshop_number,groupnumber").
+		SetMonthly(date).FindNotTotal() // 灏忕粍姣忓ぉ鐨勪骇閲忕粺璁�
+	if err != nil {
+		return err
+	}
+	// 姣忎釜灏忕粍鐨勫钩鍧囬噾棰�
+	groupAvgAmountMap := make(map[string]decimal.Decimal)    // map[杞﹂棿灏忕粍]骞冲潎閲戦
+	fallingSilkBucketMap := make(map[string]decimal.Decimal) // map[杞﹂棿灏忕粍] FallingSilkBucket
+	var counter int
+	for i := 0; i < len(groups); i++ {
+		counter = 0
+		groupAvgAmount := decimal.NewFromInt32(0)
+		fallingSilkBucket := decimal.NewFromInt32(0)
+		for j := i; j < len(groups); j++ {
+			if groups[i].WorkshopNumber == groups[j].WorkshopNumber && groups[i].GroupNumber == groups[j].GroupNumber {
+				groupAvgAmount = groupAvgAmount.Add(groups[j].FinishTotalAvgAmount)
+				fallingSilkBucket = fallingSilkBucket.Add(groups[j].FallingSilkBucket)
+				counter += 1
+				if i != j {
+					i += 1
+				}
+			}
+		}
+		key := fmt.Sprintf("%v%v", groups[i].WorkshopNumber, groups[i].GroupNumber)
+		groupAvgAmountMap[key] = groupAvgAmount.Div(decimal.NewFromInt32(int32(counter)))
+		fallingSilkBucketMap[key] = fallingSilkBucket
+	}
+
+	// 鎸¤溅宸ュ伐璧�
+	models.NewPayrollProductionWeaversSearch().Orm.Model(&models.PayrollProductionWeavers{}).
+		Select("worker_id,sum()").Where("cycle like ?", date+"%")
+
+	// 鏌ヨ鍗曚环
+	for _, hour := range hours {
+		key := fmt.Sprintf("%v%v", hour.WorkshopNumber, hour.GroupNumber)
+
+		ready70 := decimal.NewFromInt32(6)
+		ready100 := decimal.NewFromInt32(4)
+		coefficient := decimal.NewFromInt32(1)
+		switch hour.WorkTypeCode {
+		case constvar.JobTypeWeavers: // 鏃ヤ骇閲忓伐璧�=锛堢敓涓濆崟浠�*鏃ヤ骇涓濋噺锛�-锛堥噹绾ゆ暟閲�*閲庣氦鍗曚环锛�   鏈堜骇閲忓伐璧�=鏃ヤ骇閲忓伐璧勪箣鍜�
+			coefficient.Mul(coefficient).Sub(coefficient.Mul(coefficient))
+
+		case constvar.JobTypeCarHead: // 鏈堝伐璧�=70缁尅杞﹀伐鏈堝钩鍧囧伐璧�*绯绘暟
+			groupAvgAmountMap[key].Div(ready70).Mul(coefficient)
+
+		case constvar.JobTypeMaintenance: // 鏈堝伐璧�=锛�70缁尅杞﹀伐鏈堝钩鍧囧伐璧勶級+杞﹀ご宸ュ伐璧勶級/2*绯绘暟 锛燂紵锛燂紵 excel涓婄殑鏄�愭尅杞﹀伐鏈堝钩鍧囧伐璧�*绯绘暟銆�
+			groupAvgAmountMap[key].Div(ready70).Mul(coefficient)
+
+		case constvar.JobTypeBoiled: // 鏃ュ伐璧�=妗舵暟*鐓導鍗曚环  鏈堝伐璧�=鏃ュ伐璧勪箣鍜�
+			fallingSilkBucketMap[key].Mul(coefficient)
+
+		case constvar.JobTypeScoop: // 鏃ュ伐璧�=妗舵暟*鑸�鑼у崟浠� 鏈堝伐璧�=鏃ュ伐璧勪箣鍜�
+			fallingSilkBucketMap[key].Mul(coefficient)
+
+		case constvar.JobTypeTransport: // 鏃ュ伐璧�=妗舵暟*閫佽導鍗曚环   鏈堝伐璧�=鏃ュ伐璧勪箣鍜�
+			fallingSilkBucketMap[key].Mul(coefficient)
+
+		case constvar.JobTypeCleaner: // 鏈堝伐璧�=鍥哄畾宸ヨ祫*鍑哄嫟澶╂暟
+			coefficient.Mul(coefficient)
+
+		case constvar.JobTypeMachineCleaner: // 鏈堝伐璧�=鍥哄畾宸ヨ祫*鍑哄嫟澶╂暟
+			coefficient.Mul(coefficient)
+
+		case constvar.JobTypeAllPowerful: // 鏈堝伐璧�=鍥哄畾宸ヨ祫*鍑哄嫟澶╂暟
+			coefficient.Mul(coefficient)
+
+		case constvar.JobTypeMonitor: // 100缁尅杞﹀伐骞冲潎宸ヨ祫*绯绘暟
+			groupAvgAmountMap[key].Div(ready100).Mul(coefficient)
+
+		}
+
+	}
+
+	return nil
+}

--
Gitblit v1.8.0