From 03b791e466c5db94b196c465fc2e5ac91a2d9890 Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期四, 10 八月 2023 16:38:07 +0800
Subject: [PATCH] 销售明细增删改查完善

---
 model/wechatOrderStatus.go         |  140 +++++
 service/salesDetails.go            |    8 
 model/request/salesDetails.go      |   40 
 model/request/wechatOrderStatus.go |   22 
 constvar/wechatOrderStatus.go      |   12 
 service/wechatOrderStatus.go       |   55 ++
 router/wechatOrderStatus.go        |   17 
 docs/swagger.yaml                  |  233 ++++++++
 docs/docs.go                       |  351 +++++++++++++
 pkg/contextx/contextx.go           |    2 
 docs/swagger.json                  |  351 +++++++++++++
 model/serviceContract.go           |    6 
 api/v1/wechatOrderStatus.go        |  112 ++++
 constvar/salesDetails.go           |   11 
 model/salesDetails.go              |  103 ++-
 model/request/serviceContract.go   |    6 
 api/v1/salesDetails.go             |   39 -
 17 files changed, 1,401 insertions(+), 107 deletions(-)

diff --git a/api/v1/salesDetails.go b/api/v1/salesDetails.go
index 113673f..7a7ab52 100644
--- a/api/v1/salesDetails.go
+++ b/api/v1/salesDetails.go
@@ -97,42 +97,15 @@
 	ctx.Ok()
 }
 
-
 func checkSalesDetailsParams(salesDetails request.SalesDetails) (errCode int, salesDetailsModel model.SalesDetails) {
-	//if salesDetails.ClientId == 0 {
-	//	return ecode.InvalidParams, salesDetailsModel
-	//}
-	//
-	//if salesDetails.Number == "" {
-	//	return ecode.InvalidParams, salesDetailsModel
-	//}
-	//
-	//if salesDetails.MemberId == 0 {
-	//	return ecode.InvalidParams, salesDetailsModel
-	//}
-	//
-	//if salesDetails.SignTime == "" {
-	//	return ecode.InvalidParams, salesDetailsModel
-	//}
-
-	t, err := checkTimeFormat(salesDetails.SignTime)
-	if err != nil {
-		return ecode.InvalidParams, salesDetailsModel
-	}
-
-	t, err = checkTimeFormat(salesDetails.DeliveryDate)
-	if err != nil {
-		return ecode.InvalidParams, salesDetailsModel
-	}
-
 	salesDetailsModel.ClientId = salesDetails.ClientId
 	salesDetailsModel.Number = salesDetails.Number
 	salesDetailsModel.SaleChanceId = salesDetails.SaleChanceId
 	salesDetailsModel.SaleType = salesDetails.SaleType
-	salesDetailsModel.SignTime = t
+	salesDetailsModel.SignTime = salesDetails.SignTime
 	salesDetailsModel.MemberId = salesDetails.MemberId
-	salesDetailsModel.DeliveryDate = t
-	salesDetailsModel.WechatOrderStatus = salesDetails.WechatOrderStatus
+	salesDetailsModel.DeliveryDate = salesDetails.DeliveryDate
+	salesDetailsModel.WechatOrderStatusId = salesDetails.WechatOrderStatusId
 	salesDetailsModel.Address = salesDetails.Address
 	salesDetailsModel.Phone = salesDetails.Phone
 	salesDetailsModel.Remark = salesDetails.Remark
@@ -161,14 +134,14 @@
 		return
 	}
 
-	salesDetailss, total, errCode := salesDetailsService.GetSalesDetailsList(params.Page, params.PageSize, params.Keyword)
+	salesDetailss, total, errCode := salesDetailsService.GetSalesDetailsList(params.Page, params.PageSize, params.KeywordType, params.Keyword)
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
 	}
 
 	ctx.OkWithDetailed(response.SalesDetailsResponse{
-		List: salesDetailss,
+		List:  salesDetailss,
 		Count: int(total),
 	})
-}
\ No newline at end of file
+}
diff --git a/api/v1/wechatOrderStatus.go b/api/v1/wechatOrderStatus.go
new file mode 100644
index 0000000..151e662
--- /dev/null
+++ b/api/v1/wechatOrderStatus.go
@@ -0,0 +1,112 @@
+package v1
+
+import (
+	"aps_crm/model/request"
+	"aps_crm/model/response"
+	"aps_crm/pkg/contextx"
+	"aps_crm/pkg/ecode"
+	"aps_crm/service"
+	"github.com/gin-gonic/gin"
+	"strconv"
+)
+
+type WechatOrderStatusApi struct{}
+
+// Add
+// @Tags    寰俊璁㈠崟鐘舵��
+// @Summary	娣诲姞寰俊璁㈠崟鐘舵��
+// @Produce	application/json
+// @Param		object	body		request.AddWechatOrderStatus	true	"鏌ヨ鍙傛暟"
+// @Success	200		{object}	contextx.Response{}
+// @Router		/api/wechatOrderStatus/add [post]
+func (s *WechatOrderStatusApi) Add(c *gin.Context) {
+	var params request.AddWechatOrderStatus
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode := service.NewWechatOrderStatusService().AddWechatOrderStatus(&params.WechatOrderStatus)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Delete
+// @Tags		寰俊璁㈠崟鐘舵��
+// @Summary	鍒犻櫎寰俊璁㈠崟鐘舵��
+// @Produce	application/json
+// @Param		id	path		int	true	"鏌ヨ鍙傛暟"
+// @Success	200	{object}	contextx.Response{}
+// @Router		/api/wechatOrderStatus/delete/{id} [delete]
+func (s *WechatOrderStatusApi) Delete(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	id, _ := strconv.Atoi(c.Param("id"))
+	errCode := service.NewWechatOrderStatusService().DeleteWechatOrderStatus(id)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Update
+// @Tags		寰俊璁㈠崟鐘舵��
+// @Summary	鏇存柊寰俊璁㈠崟鐘舵��
+// @Produce	application/json
+// @Param		object	body		request.UpdateWechatOrderStatus	true	"鏌ヨ鍙傛暟"
+// @Success	200		{object}	contextx.Response{}
+// @Router		/api/wechatOrderStatus/update [put]
+func (s *WechatOrderStatusApi) Update(c *gin.Context) {
+	var params request.UpdateWechatOrderStatus
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+    if params.Id == 0 {
+        ctx.Fail(ecode.ParamsErr)
+    }
+    params.WechatOrderStatus.Id = params.Id
+
+	errCode := service.NewWechatOrderStatusService().UpdateWechatOrderStatus(&params.WechatOrderStatus)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// List
+// @Tags		寰俊璁㈠崟鐘舵��
+// @Summary	鑾峰彇寰俊璁㈠崟鐘舵�佸垪琛�
+// @Produce	application/json
+// @Param		object	query		request.GetWechatOrderStatusList	true	"鍙傛暟"
+// @Success	200	{object}	response.ListResponse{data=[]model.WechatOrderStatus}
+// @Router		/api/wechatOrderStatus/list [get]
+func (s *WechatOrderStatusApi) List(c *gin.Context) {
+	var params request.GetWechatOrderStatusList
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	wechatOrderStatus, total, errCode := service.NewWechatOrderStatusService().GetWechatOrderStatusList()
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.OkWithDetailed(response.ListResponse{
+		Data: wechatOrderStatus,
+		Count: total,
+	})
+}
diff --git a/constvar/salesDetails.go b/constvar/salesDetails.go
new file mode 100644
index 0000000..cd3321a
--- /dev/null
+++ b/constvar/salesDetails.go
@@ -0,0 +1,11 @@
+package constvar
+
+type SalesDetailsKeywordType string
+
+const (
+	SalesDetailsKeywordTypeCustomerName SalesDetailsKeywordType = "瀹㈡埛鍚嶇О"
+	SalesDetailsKeywordTypeOrderNumber  SalesDetailsKeywordType = "璁㈠崟缂栧彿"
+	SalesDetailsKeywordTypeSignTime     SalesDetailsKeywordType = "绛剧害鏃ユ湡"
+	SalesDetailsKeywordTypePrincipal    SalesDetailsKeywordType = "閿�鍞礋璐d汉"
+	SalesDetailsKeywordTypeProductName  SalesDetailsKeywordType = "浜у搧鍚嶇О"
+)
diff --git a/constvar/wechatOrderStatus.go b/constvar/wechatOrderStatus.go
new file mode 100644
index 0000000..dc15cab
--- /dev/null
+++ b/constvar/wechatOrderStatus.go
@@ -0,0 +1,12 @@
+package constvar
+type WechatOrderStatusQueryClass string
+
+const (
+	WechatOrderStatusQueryClassExpireLessThen60Days WechatOrderStatusQueryClass = ""
+)
+
+type WechatOrderStatusKeywordType string
+
+const (
+	WechatOrderStatusKeywordCustomerName   WechatOrderStatusKeywordType = ""
+)
diff --git a/docs/docs.go b/docs/docs.go
index e39c3f4..aa11e95 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -9483,6 +9483,169 @@
                     }
                 }
             }
+        },
+        "/api/wechatOrderStatus/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "寰俊璁㈠崟鐘舵��"
+                ],
+                "summary": "娣诲姞寰俊璁㈠崟鐘舵��",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddWechatOrderStatus"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/wechatOrderStatus/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "寰俊璁㈠崟鐘舵��"
+                ],
+                "summary": "鍒犻櫎寰俊璁㈠崟鐘舵��",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/wechatOrderStatus/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "寰俊璁㈠崟鐘舵��"
+                ],
+                "summary": "鑾峰彇寰俊璁㈠崟鐘舵�佸垪琛�",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "name": "keyword",
+                        "in": "query"
+                    },
+                    {
+                        "enum": [
+                            ""
+                        ],
+                        "type": "string",
+                        "x-enum-varnames": [
+                            "WechatOrderStatusKeywordCustomerName"
+                        ],
+                        "name": "keywordType",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "椤电爜",
+                        "name": "page",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "姣忛〉澶у皬",
+                        "name": "pageSize",
+                        "in": "query"
+                    },
+                    {
+                        "enum": [
+                            ""
+                        ],
+                        "type": "string",
+                        "x-enum-varnames": [
+                            "WechatOrderStatusQueryClassExpireLessThen60Days"
+                        ],
+                        "name": "queryClass",
+                        "in": "query"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.ListResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/model.WechatOrderStatus"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/wechatOrderStatus/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "寰俊璁㈠崟鐘舵��"
+                ],
+                "summary": "鏇存柊寰俊璁㈠崟鐘舵��",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateWechatOrderStatus"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
         }
     },
     "definitions": {
@@ -9656,6 +9819,23 @@
                 "ReceiptQueryClassExpireLessThen60Days"
             ]
         },
+        "constvar.SalesDetailsKeywordType": {
+            "type": "string",
+            "enum": [
+                "瀹㈡埛鍚嶇О",
+                "璁㈠崟缂栧彿",
+                "绛剧害鏃ユ湡",
+                "閿�鍞礋璐d汉",
+                "浜у搧鍚嶇О"
+            ],
+            "x-enum-varnames": [
+                "SalesDetailsKeywordTypeCustomerName",
+                "SalesDetailsKeywordTypeOrderNumber",
+                "SalesDetailsKeywordTypeSignTime",
+                "SalesDetailsKeywordTypePrincipal",
+                "SalesDetailsKeywordTypeProductName"
+            ]
+        },
         "constvar.SalesStatus": {
             "type": "integer",
             "enum": [
@@ -9801,6 +9981,24 @@
                 "UserTypeSuper",
                 "UserTypePrimary",
                 "UserTypeSub"
+            ]
+        },
+        "constvar.WechatOrderStatusKeywordType": {
+            "type": "string",
+            "enum": [
+                ""
+            ],
+            "x-enum-varnames": [
+                "WechatOrderStatusKeywordCustomerName"
+            ]
+        },
+        "constvar.WechatOrderStatusQueryClass": {
+            "type": "string",
+            "enum": [
+                ""
+            ],
+            "x-enum-varnames": [
+                "WechatOrderStatusQueryClassExpireLessThen60Days"
             ]
         },
         "contextx.Response": {
@@ -10457,6 +10655,12 @@
                     "description": "閿�鍞礋璐d汉id",
                     "type": "integer"
                 },
+                "products": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
+                    }
+                },
                 "sourceId": {
                     "description": "婧愬崟id",
                     "type": "integer"
@@ -10706,7 +10910,7 @@
             "type": "object",
             "properties": {
                 "amount": {
-                    "type": "integer"
+                    "type": "number"
                 },
                 "desc": {
                     "type": "string"
@@ -11073,6 +11277,22 @@
                 "addressee": {
                     "type": "string"
                 },
+                "amountInvoiced": {
+                    "description": "宸插紑绁ㄩ噾棰�",
+                    "type": "number"
+                },
+                "amountReceivable": {
+                    "description": "搴旀敹閲戦",
+                    "type": "number"
+                },
+                "amountReceived": {
+                    "description": "宸叉敹閲戦",
+                    "type": "number"
+                },
+                "amountUnInvoiced": {
+                    "description": "鏈紑绁ㄩ噾棰�",
+                    "type": "number"
+                },
                 "client": {
                     "$ref": "#/definitions/model.Client"
                 },
@@ -11115,6 +11335,9 @@
                 "remark": {
                     "type": "string"
                 },
+                "saleChance": {
+                    "$ref": "#/definitions/model.SaleChance"
+                },
                 "saleChanceId": {
                     "type": "integer"
                 },
@@ -11125,6 +11348,9 @@
                     "type": "string"
                 },
                 "wechatOrderStatus": {
+                    "$ref": "#/definitions/model.WechatOrderStatus"
+                },
+                "wechatOrderStatusId": {
                     "type": "integer"
                 }
             }
@@ -11380,6 +11606,13 @@
                 "amountReceived": {
                     "description": "宸叉敹閲戦",
                     "type": "number"
+                },
+                "amountUnInvoiced": {
+                    "description": "鏈紑绁ㄩ噾棰�",
+                    "type": "number"
+                },
+                "client": {
+                    "$ref": "#/definitions/model.Client"
                 },
                 "clientId": {
                     "type": "integer"
@@ -11837,6 +12070,17 @@
                     "type": "string"
                 },
                 "uuid": {
+                    "type": "string"
+                }
+            }
+        },
+        "model.WechatOrderStatus": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
                     "type": "string"
                 }
             }
@@ -12312,6 +12556,13 @@
                     "description": "閿�鍞礋璐d汉id",
                     "type": "integer"
                 },
+                "products": {
+                    "description": "鍙戠エ瀵瑰簲浜у搧锛屼粠鐩稿簲婧愬崟閲岃幏鍙�",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
+                    }
+                },
                 "sourceId": {
                     "description": "婧愬崟id",
                     "type": "integer"
@@ -12778,8 +13029,59 @@
         "request.AddSalesDetails": {
             "type": "object",
             "properties": {
-                "salesDetails": {
-                    "$ref": "#/definitions/request.SalesDetails"
+                "address": {
+                    "type": "string"
+                },
+                "addressee": {
+                    "type": "string"
+                },
+                "clientId": {
+                    "type": "integer"
+                },
+                "conditions": {
+                    "type": "string"
+                },
+                "deliveryDate": {
+                    "type": "string"
+                },
+                "logisticCompany": {
+                    "type": "string"
+                },
+                "logisticCost": {
+                    "type": "number"
+                },
+                "logisticNumber": {
+                    "type": "string"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "phone": {
+                    "type": "string"
+                },
+                "products": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
+                    }
+                },
+                "remark": {
+                    "type": "string"
+                },
+                "saleChanceId": {
+                    "type": "integer"
+                },
+                "saleType": {
+                    "type": "integer"
+                },
+                "signTime": {
+                    "type": "string"
+                },
+                "wechatOrderStatusId": {
+                    "type": "integer"
                 }
             }
         },
@@ -12897,6 +13199,9 @@
         },
         "request.AddServiceContract": {
             "type": "object",
+            "required": [
+                "memberId"
+            ],
             "properties": {
                 "clientId": {
                     "type": "integer"
@@ -13345,6 +13650,17 @@
                 },
                 "vettingType": {
                     "type": "integer"
+                }
+            }
+        },
+        "request.AddWechatOrderStatus": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
                 }
             }
         },
@@ -13845,6 +14161,9 @@
                 "keyword": {
                     "type": "string"
                 },
+                "keywordType": {
+                    "$ref": "#/definitions/constvar.SalesDetailsKeywordType"
+                },
                 "page": {
                     "description": "椤电爜",
                     "type": "integer"
@@ -14173,7 +14492,7 @@
                 "signTime": {
                     "type": "string"
                 },
-                "wechatOrderStatus": {
+                "wechatOrderStatusId": {
                     "type": "integer"
                 }
             }
@@ -14907,6 +15226,9 @@
         },
         "request.UpdateInvoice": {
             "type": "object",
+            "required": [
+                "id"
+            ],
             "properties": {
                 "clientId": {
                     "description": "瀹㈡埛id",
@@ -14942,6 +15264,13 @@
                 "principalId": {
                     "description": "閿�鍞礋璐d汉id",
                     "type": "integer"
+                },
+                "products": {
+                    "description": "鍙戠エ瀵瑰簲浜у搧锛屼粠鐩稿簲婧愬崟閲岃幏鍙�",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
+                    }
                 },
                 "sourceId": {
                     "description": "婧愬崟id",
@@ -15896,6 +16225,9 @@
         },
         "request.UpdateServiceContract": {
             "type": "object",
+            "required": [
+                "memberId"
+            ],
             "properties": {
                 "clientId": {
                     "type": "integer"
@@ -16438,6 +16770,17 @@
                 }
             }
         },
+        "request.UpdateWechatOrderStatus": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "response.AccountIdResponse": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.json b/docs/swagger.json
index 97e2fca..0fe48cc 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -9471,6 +9471,169 @@
                     }
                 }
             }
+        },
+        "/api/wechatOrderStatus/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "寰俊璁㈠崟鐘舵��"
+                ],
+                "summary": "娣诲姞寰俊璁㈠崟鐘舵��",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddWechatOrderStatus"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/wechatOrderStatus/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "寰俊璁㈠崟鐘舵��"
+                ],
+                "summary": "鍒犻櫎寰俊璁㈠崟鐘舵��",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/wechatOrderStatus/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "寰俊璁㈠崟鐘舵��"
+                ],
+                "summary": "鑾峰彇寰俊璁㈠崟鐘舵�佸垪琛�",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "name": "keyword",
+                        "in": "query"
+                    },
+                    {
+                        "enum": [
+                            ""
+                        ],
+                        "type": "string",
+                        "x-enum-varnames": [
+                            "WechatOrderStatusKeywordCustomerName"
+                        ],
+                        "name": "keywordType",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "椤电爜",
+                        "name": "page",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "姣忛〉澶у皬",
+                        "name": "pageSize",
+                        "in": "query"
+                    },
+                    {
+                        "enum": [
+                            ""
+                        ],
+                        "type": "string",
+                        "x-enum-varnames": [
+                            "WechatOrderStatusQueryClassExpireLessThen60Days"
+                        ],
+                        "name": "queryClass",
+                        "in": "query"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.ListResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/model.WechatOrderStatus"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/wechatOrderStatus/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "寰俊璁㈠崟鐘舵��"
+                ],
+                "summary": "鏇存柊寰俊璁㈠崟鐘舵��",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateWechatOrderStatus"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
         }
     },
     "definitions": {
@@ -9644,6 +9807,23 @@
                 "ReceiptQueryClassExpireLessThen60Days"
             ]
         },
+        "constvar.SalesDetailsKeywordType": {
+            "type": "string",
+            "enum": [
+                "瀹㈡埛鍚嶇О",
+                "璁㈠崟缂栧彿",
+                "绛剧害鏃ユ湡",
+                "閿�鍞礋璐d汉",
+                "浜у搧鍚嶇О"
+            ],
+            "x-enum-varnames": [
+                "SalesDetailsKeywordTypeCustomerName",
+                "SalesDetailsKeywordTypeOrderNumber",
+                "SalesDetailsKeywordTypeSignTime",
+                "SalesDetailsKeywordTypePrincipal",
+                "SalesDetailsKeywordTypeProductName"
+            ]
+        },
         "constvar.SalesStatus": {
             "type": "integer",
             "enum": [
@@ -9789,6 +9969,24 @@
                 "UserTypeSuper",
                 "UserTypePrimary",
                 "UserTypeSub"
+            ]
+        },
+        "constvar.WechatOrderStatusKeywordType": {
+            "type": "string",
+            "enum": [
+                ""
+            ],
+            "x-enum-varnames": [
+                "WechatOrderStatusKeywordCustomerName"
+            ]
+        },
+        "constvar.WechatOrderStatusQueryClass": {
+            "type": "string",
+            "enum": [
+                ""
+            ],
+            "x-enum-varnames": [
+                "WechatOrderStatusQueryClassExpireLessThen60Days"
             ]
         },
         "contextx.Response": {
@@ -10445,6 +10643,12 @@
                     "description": "閿�鍞礋璐d汉id",
                     "type": "integer"
                 },
+                "products": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
+                    }
+                },
                 "sourceId": {
                     "description": "婧愬崟id",
                     "type": "integer"
@@ -10694,7 +10898,7 @@
             "type": "object",
             "properties": {
                 "amount": {
-                    "type": "integer"
+                    "type": "number"
                 },
                 "desc": {
                     "type": "string"
@@ -11061,6 +11265,22 @@
                 "addressee": {
                     "type": "string"
                 },
+                "amountInvoiced": {
+                    "description": "宸插紑绁ㄩ噾棰�",
+                    "type": "number"
+                },
+                "amountReceivable": {
+                    "description": "搴旀敹閲戦",
+                    "type": "number"
+                },
+                "amountReceived": {
+                    "description": "宸叉敹閲戦",
+                    "type": "number"
+                },
+                "amountUnInvoiced": {
+                    "description": "鏈紑绁ㄩ噾棰�",
+                    "type": "number"
+                },
                 "client": {
                     "$ref": "#/definitions/model.Client"
                 },
@@ -11103,6 +11323,9 @@
                 "remark": {
                     "type": "string"
                 },
+                "saleChance": {
+                    "$ref": "#/definitions/model.SaleChance"
+                },
                 "saleChanceId": {
                     "type": "integer"
                 },
@@ -11113,6 +11336,9 @@
                     "type": "string"
                 },
                 "wechatOrderStatus": {
+                    "$ref": "#/definitions/model.WechatOrderStatus"
+                },
+                "wechatOrderStatusId": {
                     "type": "integer"
                 }
             }
@@ -11368,6 +11594,13 @@
                 "amountReceived": {
                     "description": "宸叉敹閲戦",
                     "type": "number"
+                },
+                "amountUnInvoiced": {
+                    "description": "鏈紑绁ㄩ噾棰�",
+                    "type": "number"
+                },
+                "client": {
+                    "$ref": "#/definitions/model.Client"
                 },
                 "clientId": {
                     "type": "integer"
@@ -11825,6 +12058,17 @@
                     "type": "string"
                 },
                 "uuid": {
+                    "type": "string"
+                }
+            }
+        },
+        "model.WechatOrderStatus": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
                     "type": "string"
                 }
             }
@@ -12300,6 +12544,13 @@
                     "description": "閿�鍞礋璐d汉id",
                     "type": "integer"
                 },
+                "products": {
+                    "description": "鍙戠エ瀵瑰簲浜у搧锛屼粠鐩稿簲婧愬崟閲岃幏鍙�",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
+                    }
+                },
                 "sourceId": {
                     "description": "婧愬崟id",
                     "type": "integer"
@@ -12766,8 +13017,59 @@
         "request.AddSalesDetails": {
             "type": "object",
             "properties": {
-                "salesDetails": {
-                    "$ref": "#/definitions/request.SalesDetails"
+                "address": {
+                    "type": "string"
+                },
+                "addressee": {
+                    "type": "string"
+                },
+                "clientId": {
+                    "type": "integer"
+                },
+                "conditions": {
+                    "type": "string"
+                },
+                "deliveryDate": {
+                    "type": "string"
+                },
+                "logisticCompany": {
+                    "type": "string"
+                },
+                "logisticCost": {
+                    "type": "number"
+                },
+                "logisticNumber": {
+                    "type": "string"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "phone": {
+                    "type": "string"
+                },
+                "products": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
+                    }
+                },
+                "remark": {
+                    "type": "string"
+                },
+                "saleChanceId": {
+                    "type": "integer"
+                },
+                "saleType": {
+                    "type": "integer"
+                },
+                "signTime": {
+                    "type": "string"
+                },
+                "wechatOrderStatusId": {
+                    "type": "integer"
                 }
             }
         },
@@ -12885,6 +13187,9 @@
         },
         "request.AddServiceContract": {
             "type": "object",
+            "required": [
+                "memberId"
+            ],
             "properties": {
                 "clientId": {
                     "type": "integer"
@@ -13333,6 +13638,17 @@
                 },
                 "vettingType": {
                     "type": "integer"
+                }
+            }
+        },
+        "request.AddWechatOrderStatus": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
                 }
             }
         },
@@ -13833,6 +14149,9 @@
                 "keyword": {
                     "type": "string"
                 },
+                "keywordType": {
+                    "$ref": "#/definitions/constvar.SalesDetailsKeywordType"
+                },
                 "page": {
                     "description": "椤电爜",
                     "type": "integer"
@@ -14161,7 +14480,7 @@
                 "signTime": {
                     "type": "string"
                 },
-                "wechatOrderStatus": {
+                "wechatOrderStatusId": {
                     "type": "integer"
                 }
             }
@@ -14895,6 +15214,9 @@
         },
         "request.UpdateInvoice": {
             "type": "object",
+            "required": [
+                "id"
+            ],
             "properties": {
                 "clientId": {
                     "description": "瀹㈡埛id",
@@ -14930,6 +15252,13 @@
                 "principalId": {
                     "description": "閿�鍞礋璐d汉id",
                     "type": "integer"
+                },
+                "products": {
+                    "description": "鍙戠エ瀵瑰簲浜у搧锛屼粠鐩稿簲婧愬崟閲岃幏鍙�",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
+                    }
                 },
                 "sourceId": {
                     "description": "婧愬崟id",
@@ -15884,6 +16213,9 @@
         },
         "request.UpdateServiceContract": {
             "type": "object",
+            "required": [
+                "memberId"
+            ],
             "properties": {
                 "clientId": {
                     "type": "integer"
@@ -16426,6 +16758,17 @@
                 }
             }
         },
+        "request.UpdateWechatOrderStatus": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "response.AccountIdResponse": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index 058fde4..f47fa36 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -114,6 +114,20 @@
     type: string
     x-enum-varnames:
     - ReceiptQueryClassExpireLessThen60Days
+  constvar.SalesDetailsKeywordType:
+    enum:
+    - 瀹㈡埛鍚嶇О
+    - 璁㈠崟缂栧彿
+    - 绛剧害鏃ユ湡
+    - 閿�鍞礋璐d汉
+    - 浜у搧鍚嶇О
+    type: string
+    x-enum-varnames:
+    - SalesDetailsKeywordTypeCustomerName
+    - SalesDetailsKeywordTypeOrderNumber
+    - SalesDetailsKeywordTypeSignTime
+    - SalesDetailsKeywordTypePrincipal
+    - SalesDetailsKeywordTypeProductName
   constvar.SalesStatus:
     enum:
     - 0
@@ -238,6 +252,18 @@
     - UserTypeSuper
     - UserTypePrimary
     - UserTypeSub
+  constvar.WechatOrderStatusKeywordType:
+    enum:
+    - ""
+    type: string
+    x-enum-varnames:
+    - WechatOrderStatusKeywordCustomerName
+  constvar.WechatOrderStatusQueryClass:
+    enum:
+    - ""
+    type: string
+    x-enum-varnames:
+    - WechatOrderStatusQueryClassExpireLessThen60Days
   contextx.Response:
     properties:
       code:
@@ -670,6 +696,10 @@
       principalId:
         description: 閿�鍞礋璐d汉id
         type: integer
+      products:
+        items:
+          $ref: '#/definitions/model.Product'
+        type: array
       sourceId:
         description: 婧愬崟id
         type: integer
@@ -832,7 +862,7 @@
   model.Product:
     properties:
       amount:
-        type: integer
+        type: number
       desc:
         type: string
       id:
@@ -1075,6 +1105,18 @@
         type: string
       addressee:
         type: string
+      amountInvoiced:
+        description: 宸插紑绁ㄩ噾棰�
+        type: number
+      amountReceivable:
+        description: 搴旀敹閲戦
+        type: number
+      amountReceived:
+        description: 宸叉敹閲戦
+        type: number
+      amountUnInvoiced:
+        description: 鏈紑绁ㄩ噾棰�
+        type: number
       client:
         $ref: '#/definitions/model.Client'
       clientId:
@@ -1103,6 +1145,8 @@
         type: array
       remark:
         type: string
+      saleChance:
+        $ref: '#/definitions/model.SaleChance'
       saleChanceId:
         type: integer
       saleType:
@@ -1110,6 +1154,8 @@
       signTime:
         type: string
       wechatOrderStatus:
+        $ref: '#/definitions/model.WechatOrderStatus'
+      wechatOrderStatusId:
         type: integer
     type: object
   model.SalesLeads:
@@ -1281,6 +1327,11 @@
       amountReceived:
         description: 宸叉敹閲戦
         type: number
+      amountUnInvoiced:
+        description: 鏈紑绁ㄩ噾棰�
+        type: number
+      client:
+        $ref: '#/definitions/model.Client'
       clientId:
         type: integer
       contactId:
@@ -1590,6 +1641,13 @@
       username:
         type: string
       uuid:
+        type: string
+    type: object
+  model.WechatOrderStatus:
+    properties:
+      id:
+        type: integer
+      name:
         type: string
     type: object
   product.Product:
@@ -1916,6 +1974,11 @@
       principalId:
         description: 閿�鍞礋璐d汉id
         type: integer
+      products:
+        description: 鍙戠エ瀵瑰簲浜у搧锛屼粠鐩稿簲婧愬崟閲岃幏鍙�
+        items:
+          $ref: '#/definitions/model.Product'
+        type: array
       sourceId:
         description: 婧愬崟id
         type: integer
@@ -2222,8 +2285,42 @@
     type: object
   request.AddSalesDetails:
     properties:
-      salesDetails:
-        $ref: '#/definitions/request.SalesDetails'
+      address:
+        type: string
+      addressee:
+        type: string
+      clientId:
+        type: integer
+      conditions:
+        type: string
+      deliveryDate:
+        type: string
+      logisticCompany:
+        type: string
+      logisticCost:
+        type: number
+      logisticNumber:
+        type: string
+      memberId:
+        type: integer
+      number:
+        type: string
+      phone:
+        type: string
+      products:
+        items:
+          $ref: '#/definitions/model.Product'
+        type: array
+      remark:
+        type: string
+      saleChanceId:
+        type: integer
+      saleType:
+        type: integer
+      signTime:
+        type: string
+      wechatOrderStatusId:
+        type: integer
     type: object
   request.AddSalesLeads:
     properties:
@@ -2336,6 +2433,8 @@
         type: string
       typeId:
         type: integer
+    required:
+    - memberId
     type: object
   request.AddServiceContractStatus:
     properties:
@@ -2613,6 +2712,13 @@
     - userId
     - vettingId
     - vettingType
+    type: object
+  request.AddWechatOrderStatus:
+    properties:
+      id:
+        type: integer
+      name:
+        type: string
     type: object
   request.Assign:
     properties:
@@ -2965,6 +3071,8 @@
     properties:
       keyword:
         type: string
+      keywordType:
+        $ref: '#/definitions/constvar.SalesDetailsKeywordType'
       page:
         description: 椤电爜
         type: integer
@@ -3189,7 +3297,7 @@
         type: integer
       signTime:
         type: string
-      wechatOrderStatus:
+      wechatOrderStatusId:
         type: integer
     type: object
   request.SalesRefund:
@@ -3711,6 +3819,11 @@
       principalId:
         description: 閿�鍞礋璐d汉id
         type: integer
+      products:
+        description: 鍙戠エ瀵瑰簲浜у搧锛屼粠鐩稿簲婧愬崟閲岃幏鍙�
+        items:
+          $ref: '#/definitions/model.Product'
+        type: array
       sourceId:
         description: 婧愬崟id
         type: integer
@@ -3723,6 +3836,8 @@
       taxpayerIdNumber:
         description: 绾崇◣璇嗗埆鍙�
         type: string
+    required:
+    - id
     type: object
   request.UpdateInvoiceStatus:
     properties:
@@ -4383,6 +4498,8 @@
         type: string
       typeId:
         type: integer
+    required:
+    - memberId
     type: object
   request.UpdateServiceContractStatus:
     properties:
@@ -4717,6 +4834,13 @@
     required:
     - id
     - status
+    type: object
+  request.UpdateWechatOrderStatus:
+    properties:
+      id:
+        type: integer
+      name:
+        type: string
     type: object
   response.AccountIdResponse:
     properties:
@@ -11139,4 +11263,105 @@
       summary: 鏇存柊瀹℃壒
       tags:
       - Vetting
+  /api/wechatOrderStatus/add:
+    post:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.AddWechatOrderStatus'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 娣诲姞寰俊璁㈠崟鐘舵��
+      tags:
+      - 寰俊璁㈠崟鐘舵��
+  /api/wechatOrderStatus/delete/{id}:
+    delete:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: path
+        name: id
+        required: true
+        type: integer
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 鍒犻櫎寰俊璁㈠崟鐘舵��
+      tags:
+      - 寰俊璁㈠崟鐘舵��
+  /api/wechatOrderStatus/list:
+    get:
+      parameters:
+      - in: query
+        name: keyword
+        type: string
+      - enum:
+        - ""
+        in: query
+        name: keywordType
+        type: string
+        x-enum-varnames:
+        - WechatOrderStatusKeywordCustomerName
+      - description: 椤电爜
+        in: query
+        name: page
+        type: integer
+      - description: 姣忛〉澶у皬
+        in: query
+        name: pageSize
+        type: integer
+      - enum:
+        - ""
+        in: query
+        name: queryClass
+        type: string
+        x-enum-varnames:
+        - WechatOrderStatusQueryClassExpireLessThen60Days
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.ListResponse'
+            - properties:
+                data:
+                  items:
+                    $ref: '#/definitions/model.WechatOrderStatus'
+                  type: array
+              type: object
+      summary: 鑾峰彇寰俊璁㈠崟鐘舵�佸垪琛�
+      tags:
+      - 寰俊璁㈠崟鐘舵��
+  /api/wechatOrderStatus/update:
+    put:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.UpdateWechatOrderStatus'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 鏇存柊寰俊璁㈠崟鐘舵��
+      tags:
+      - 寰俊璁㈠崟鐘舵��
 swagger: "2.0"
diff --git a/model/request/salesDetails.go b/model/request/salesDetails.go
index f5b1975..1d12f61 100644
--- a/model/request/salesDetails.go
+++ b/model/request/salesDetails.go
@@ -1,31 +1,32 @@
 package request
 
 import (
+	"aps_crm/constvar"
 	"aps_crm/model"
 )
 
 type AddSalesDetails struct {
-	SalesDetails SalesDetails `json:"salesDetails"`
+	SalesDetails
 }
 
 type SalesDetails struct {
-	ClientId          int             `json:"clientId" gorm:"column:client_id;type:int;comment:瀹㈡埛id"`
-	Number            string          `json:"number" gorm:"column:number;type:varchar(255);comment:閿�鍞瓙鍗曞彿"`
-	SaleChanceId      int             `json:"saleChanceId" gorm:"column:sale_chance_id;type:int;comment:閿�鍞満浼歩d"`
-	SaleType          int             `json:"saleType" gorm:"column:sale_type;type:int;comment:閿�鍞被鍨�"`
-	SignTime          string          `json:"signTime" gorm:"column:sign_time;type:datetime;comment:绛惧崟鏃堕棿"`
-	MemberId          int             `json:"memberId" gorm:"column:member_id;type:int;comment:璐熻矗浜篿d"`
-	DeliveryDate      string          `json:"deliveryDate" gorm:"column:delivery_date;type:datetime;comment:浜よ揣鏃ユ湡"`
-	WechatOrderStatus int             `json:"wechatOrderStatus" gorm:"column:wechat_order_status;type:int;comment:寰俊璁㈠崟鐘舵��"`
-	Address           string          `json:"address" gorm:"column:address;type:varchar(255);comment:鍦板潃"`
-	Phone             string          `json:"phone" gorm:"column:phone;type:varchar(255);comment:鐢佃瘽"`
-	Addressee         string          `json:"addressee" gorm:"column:addressee;type:varchar(255);comment:鏀朵欢浜�"`
-	Conditions        string          `json:"conditions" gorm:"column:conditions;type:text;comment:鏉′欢"`
-	Remark            string          `json:"remark" gorm:"column:remark;type:text;comment:澶囨敞"`
-	Products          []model.Product `json:"products" gorm:"many2many:salesDetails_product;"`
-	LogisticCompany   string          `json:"logisticCompany" gorm:"column:logistic_company;type:varchar(255);comment:鐗╂祦鍏徃"`
-	LogisticNumber    string          `json:"logisticNumber" gorm:"column:logistic_number;type:varchar(255);comment:鐗╂祦鍗曞彿"`
-	LogisticCost      float64         `json:"logisticCost" gorm:"column:logistic_cost;type:decimal(10,2);comment:鐗╂祦璐圭敤"`
+	ClientId            int             `json:"clientId" gorm:"column:client_id;type:int;comment:瀹㈡埛id"`
+	Number              string          `json:"number" gorm:"column:number;type:varchar(255);comment:閿�鍞瓙鍗曞彿"`
+	SaleChanceId        int             `json:"saleChanceId" gorm:"column:sale_chance_id;type:int;comment:閿�鍞満浼歩d"`
+	SaleType            int             `json:"saleType" gorm:"column:sale_type;type:int;comment:閿�鍞被鍨�"`
+	SignTime            string          `json:"signTime" gorm:"column:sign_time;type:datetime;comment:绛惧崟鏃堕棿"`
+	MemberId            int             `json:"memberId" gorm:"column:member_id;type:int;comment:璐熻矗浜篿d"`
+	DeliveryDate        string          `json:"deliveryDate" gorm:"column:delivery_date;type:datetime;comment:浜よ揣鏃ユ湡"`
+	WechatOrderStatusId int             `json:"wechatOrderStatusId" gorm:"column:wechat_order_status_id;type:int;comment:寰俊璁㈠崟鐘舵�乮d"`
+	Address             string          `json:"address" gorm:"column:address;type:varchar(255);comment:鍦板潃"`
+	Phone               string          `json:"phone" gorm:"column:phone;type:varchar(255);comment:鐢佃瘽"`
+	Addressee           string          `json:"addressee" gorm:"column:addressee;type:varchar(255);comment:鏀朵欢浜�"`
+	Conditions          string          `json:"conditions" gorm:"column:conditions;type:text;comment:鏉′欢"`
+	Remark              string          `json:"remark" gorm:"column:remark;type:text;comment:澶囨敞"`
+	Products            []model.Product `json:"products" gorm:"many2many:sales_details_product;"`
+	LogisticCompany     string          `json:"logisticCompany" gorm:"column:logistic_company;type:varchar(255);comment:鐗╂祦鍏徃"`
+	LogisticNumber      string          `json:"logisticNumber" gorm:"column:logistic_number;type:varchar(255);comment:鐗╂祦鍗曞彿"`
+	LogisticCost        float64         `json:"logisticCost" gorm:"column:logistic_cost;type:decimal(10,2);comment:鐗╂祦璐圭敤"`
 }
 
 type UpdateSalesDetails struct {
@@ -35,5 +36,6 @@
 
 type GetSalesDetailsList struct {
 	PageInfo
-	Keyword string `json:"keyword"`
+	KeywordType constvar.SalesDetailsKeywordType `json:"keywordType"`
+	Keyword     string                           `json:"keyword"`
 }
diff --git a/model/request/serviceContract.go b/model/request/serviceContract.go
index 65068e4..5e179a5 100644
--- a/model/request/serviceContract.go
+++ b/model/request/serviceContract.go
@@ -12,15 +12,15 @@
 type ServiceContract struct {
 	ClientId       int              `json:"clientId"`
 	Number         string           `json:"number"`
-	MemberId       int              `json:"memberId"`
+	MemberId       int              `json:"memberId" binding:"required"`
 	ContactId      int              `json:"contactId"`
 	SaleChanceId   int              `json:"saleChanceId"`
 	SalesDetailsId int              `json:"salesDetailsId"`
 	QuotationId    int              `json:"quotationId"`
 	TypeId         int              `json:"typeId"`
 	SignTime       string           `json:"signTime" binding:"datetime=2006-01-02"`
-	StartTime      string           `json:"startTime" binding:"datetime=2006-01-02"`
-	EndTime        string           `json:"endTime" binding:"datetime=2006-01-02"`
+	StartTime      string           `json:"startTime"`
+	EndTime        string           `json:"endTime"`
 	StatusId       int              `json:"statusId"`
 	ServiceTimes   int              `json:"serviceTimes"`
 	Terms          string           `json:"terms"`
diff --git a/model/request/wechatOrderStatus.go b/model/request/wechatOrderStatus.go
new file mode 100644
index 0000000..499824a
--- /dev/null
+++ b/model/request/wechatOrderStatus.go
@@ -0,0 +1,22 @@
+package request
+
+import (
+    "aps_crm/constvar"
+    "aps_crm/model"
+)
+
+type AddWechatOrderStatus struct {
+	model.WechatOrderStatus
+}
+
+type UpdateWechatOrderStatus struct {
+	Id int `json:"id"`
+	model.WechatOrderStatus
+}
+
+type GetWechatOrderStatusList struct {
+	PageInfo
+	QueryClass  constvar.WechatOrderStatusQueryClass  `json:"queryClass" form:"queryClass"`
+	KeywordType constvar.WechatOrderStatusKeywordType `json:"keywordType"  form:"keywordType"`
+	Keyword     string                       `json:"keyword" form:"keyword"`
+}
diff --git a/model/salesDetails.go b/model/salesDetails.go
index dbcaa26..8deea7f 100644
--- a/model/salesDetails.go
+++ b/model/salesDetails.go
@@ -1,44 +1,53 @@
 package model
 
 import (
+	"aps_crm/constvar"
 	"aps_crm/pkg/mysqlx"
+	"fmt"
+	"github.com/shopspring/decimal"
 	"gorm.io/gorm"
-	"time"
+	"gorm.io/gorm/clause"
 )
 
 type (
 	SalesDetails struct {
-		Id                int       `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
-		ClientId          int       `json:"clientId" gorm:"column:client_id;type:int;comment:瀹㈡埛id"`
-		Client            Client    `json:"client" gorm:"foreignKey:ClientId"`
-		Number            string    `json:"number" gorm:"column:number;type:varchar(255);comment:閿�鍞瓙鍗曞彿"`
-		SaleChanceId      int       `json:"saleChanceId" gorm:"column:sale_chance_id;type:int;comment:閿�鍞満浼歩d"`
-		SaleType          int       `json:"saleType" gorm:"column:sale_type;type:int;comment:閿�鍞被鍨�"`
-		SignTime          time.Time `json:"signTime" gorm:"column:sign_time;type:datetime;comment:绛惧崟鏃堕棿"`
-		MemberId          int       `json:"memberId" gorm:"column:member_id;type:int;comment:璐熻矗浜篿d"`
-		DeliveryDate      time.Time `json:"deliveryDate" gorm:"column:delivery_date;type:datetime;comment:浜よ揣鏃ユ湡"`
-		WechatOrderStatus int       `json:"wechatOrderStatus" gorm:"column:wechat_order_status;type:int;comment:寰俊璁㈠崟鐘舵��"`
-		Address           string    `json:"address" gorm:"column:address;type:varchar(255);comment:鍦板潃"`
-		Phone             string    `json:"phone" gorm:"column:phone;type:varchar(255);comment:鐢佃瘽"`
-		Addressee         string    `json:"addressee" gorm:"column:addressee;type:varchar(255);comment:鏀朵欢浜�"`
-		Conditions        string    `json:"conditions" gorm:"column:conditions;type:text;comment:鏉′欢"`
-		Remark            string    `json:"remark" gorm:"column:remark;type:text;comment:澶囨敞"`
-		Products          []Product `json:"products" gorm:"many2many:salesDetails_product;"`
-		LogisticCompany   string    `json:"logisticCompany" gorm:"column:logistic_company;type:varchar(255);comment:鐗╂祦鍏徃"`
-		LogisticNumber    string    `json:"logisticNumber" gorm:"column:logistic_number;type:varchar(255);comment:鐗╂祦鍗曞彿"`
-		LogisticCost      float64   `json:"logisticCost" gorm:"column:logistic_cost;type:decimal(10,2);comment:鐗╂祦璐圭敤"`
-		gorm.Model        `json:"-"`
+		Id                  int               `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
+		ClientId            int               `json:"clientId" gorm:"column:client_id;type:int;comment:瀹㈡埛id"`
+		Client              Client            `json:"client" gorm:"foreignKey:ClientId"`
+		Number              string            `json:"number" gorm:"column:number;type:varchar(255);comment:閿�鍞瓙鍗曞彿"`
+		SaleChanceId        int               `json:"saleChanceId" gorm:"column:sale_chance_id;type:int;comment:閿�鍞満浼歩d"`
+		SaleChance          SaleChance        `json:"saleChance" gorm:"foreignKey:SaleChanceId"`
+		SaleType            int               `json:"saleType" gorm:"column:sale_type;type:int;comment:閿�鍞被鍨�"`
+		SignTime            string            `json:"signTime" gorm:"column:sign_time;type:varchar(255);comment:绛惧崟鏃堕棿"`
+		MemberId            int               `json:"memberId" gorm:"column:member_id;type:int;comment:璐熻矗浜篿d"`
+		DeliveryDate        string            `json:"deliveryDate" gorm:"column:delivery_date;type:varchar(255);comment:浜よ揣鏃ユ湡"`
+		WechatOrderStatusId int               `json:"wechatOrderStatusId" gorm:"column:wechat_order_status;type:int;comment:寰俊璁㈠崟鐘舵��"`
+		WechatOrderStatus   WechatOrderStatus `json:"wechatOrderStatus" gorm:"foreignKey:WechatOrderStatusId"`
+		Address             string            `json:"address" gorm:"column:address;type:varchar(255);comment:鍦板潃"`
+		Phone               string            `json:"phone" gorm:"column:phone;type:varchar(255);comment:鐢佃瘽"`
+		Addressee           string            `json:"addressee" gorm:"column:addressee;type:varchar(255);comment:鏀朵欢浜�"`
+		Conditions          string            `json:"conditions" gorm:"column:conditions;type:text;comment:鏉′欢"`
+		Remark              string            `json:"remark" gorm:"column:remark;type:text;comment:澶囨敞"`
+		Products            []Product         `json:"products" gorm:"many2many:sales_details_product;"`
+		LogisticCompany     string            `json:"logisticCompany" gorm:"column:logistic_company;type:varchar(255);comment:鐗╂祦鍏徃"`
+		LogisticNumber      string            `json:"logisticNumber" gorm:"column:logistic_number;type:varchar(255);comment:鐗╂祦鍗曞彿"`
+		LogisticCost        float64           `json:"logisticCost" gorm:"column:logistic_cost;type:decimal(10,2);comment:鐗╂祦璐圭敤"`
+		AmountReceivable    decimal.Decimal   `gorm:"amount_receivable" json:"amountReceivable"` // 搴旀敹閲戦
+		AmountReceived      decimal.Decimal   `gorm:"amount_received" json:"amountReceived"`     // 宸叉敹閲戦
+		AmountInvoiced      decimal.Decimal   `gorm:"amount_invoiced" json:"amountInvoiced"`     // 宸插紑绁ㄩ噾棰�
+		AmountUnInvoiced    decimal.Decimal   `gorm:"-" json:"amountUnInvoiced"`                 // 鏈紑绁ㄩ噾棰�
+		gorm.Model          `json:"-"`
 	}
 
 	SalesDetailsSearch struct {
 		SalesDetails
-
-				Orm      *gorm.DB
-		Keyword  string
-		OrderBy  string
-		PageNum  int
-		PageSize int
-
+		KeywordType constvar.SalesDetailsKeywordType
+		Orm         *gorm.DB
+		Keyword     string
+		OrderBy     string
+		PageNum     int
+		PageSize    int
+		Preload     bool
 	}
 )
 
@@ -54,11 +63,29 @@
 
 func (slf *SalesDetailsSearch) build() *gorm.DB {
 	var db = slf.Orm.Model(&SalesDetails{})
-	if slf.Keyword != "" {
-		db = db.Where("name LIKE ?", "%"+slf.Keyword+"%")
-	}
 	if slf.Id != 0 {
 		db = db.Where("id = ?", slf.Id)
+	}
+
+	switch slf.KeywordType {
+	case constvar.SalesDetailsKeywordTypeCustomerName:
+		db = db.Joins("Client", clause.LeftJoin).Where("Client.name like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
+	case constvar.SalesDetailsKeywordTypeOrderNumber:
+		db = db.Where("number like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
+	case constvar.SalesDetailsKeywordTypeSignTime:
+		db = db.Where("sign_time like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
+	case constvar.SalesDetailsKeywordTypePrincipal:
+		db = db.Joins("left join user on user.id = sales_details.member_id").Where("user.username like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
+	case constvar.SalesDetailsKeywordTypeProductName:
+		//db = db.Joins("left join sales_details_product sdp on sdp.sales_details_id = sales_details.id left join product").Where("user.username like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
+
+	}
+	if slf.Preload {
+		db = db.Preload("Products").
+			Preload("Client").
+			Preload("SaleChance").
+			Preload("WechatOrderStatus").
+			Preload("Client")
 	}
 
 	return db
@@ -106,12 +133,22 @@
 		db = db.Limit(slf.PageSize).Offset((slf.PageNum - 1) * slf.PageSize)
 	}
 
-	err := db.Preload("Products").Preload("Client").Find(&records).Error
+	err := db.Find(&records).Error
 	return records, total, err
 }
 
 func (slf *SalesDetailsSearch) SetKeyword(keyword string) *SalesDetailsSearch {
 	slf.Keyword = keyword
+	return slf
+}
+
+func (slf *SalesDetailsSearch) SetKeywordType(keywordType constvar.SalesDetailsKeywordType) *SalesDetailsSearch {
+	slf.KeywordType = keywordType
+	return slf
+}
+
+func (slf *SalesDetailsSearch) SetPreload(preload bool) *SalesDetailsSearch {
+	slf.Preload = preload
 	return slf
 }
 
@@ -123,4 +160,4 @@
 func (slf *SalesDetailsSearch) SetOrder(order string) *SalesDetailsSearch {
 	slf.OrderBy = order
 	return slf
-}
\ No newline at end of file
+}
diff --git a/model/serviceContract.go b/model/serviceContract.go
index 1b6b901..14a5e7a 100644
--- a/model/serviceContract.go
+++ b/model/serviceContract.go
@@ -44,7 +44,6 @@
 
 	ServiceContractSearch struct {
 		ServiceContract
-
 		Orm         *gorm.DB
 		QueryClass  constvar.ServiceContractQueryClass
 		KeywordType constvar.ServiceContractKeywordType
@@ -95,10 +94,9 @@
 		db = db.Joins("left join service_contract_status on service_contract_status.id = service_contract.service_contract_status_id")
 		db = db.Where("service_contract_status.name like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
 	case constvar.ServiceContractKeywordPrincipal:
-		db = db.Joins("left join user on user.id = service_contract.member_id")
-		db = db.Where("user.username like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
+		db = db.Joins("left join user on user.id = service_contract.member_id").Where("user.username like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
 	case constvar.ServiceContractKeywordProductName:
-		//db = db.Joins("ServiceContractProduct", clause.LeftJoin).Joins("Product", clause.LeftJoin).Where("Product.name like ?", fmt.Sprintf("%%%s%%", slf.Keyword)) todo
+		db = db.Joins("Products", clause.LeftJoin).Where("Products.name like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
 	case constvar.ServiceContractKeywordServiceBeginDate:
 		db = db.Where("start_time = ?", slf.Keyword)
 	case constvar.ServiceContractKeywordServiceEndDate:
diff --git a/model/wechatOrderStatus.go b/model/wechatOrderStatus.go
new file mode 100644
index 0000000..e458a99
--- /dev/null
+++ b/model/wechatOrderStatus.go
@@ -0,0 +1,140 @@
+package model
+
+import (
+	"aps_crm/constvar"
+	"aps_crm/pkg/mysqlx"
+	"errors"
+	"fmt"
+	"gorm.io/gorm"
+)
+
+type (
+	// WechatOrderStatus 寰俊璁㈠崟鐘舵��
+	WechatOrderStatus struct {
+		Id   int    `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
+		Name   string    `json:"name" gorm:"column:name"`
+	}
+
+	// WechatOrderStatusSearch 寰俊璁㈠崟鐘舵�佹悳绱㈡潯浠�
+	WechatOrderStatusSearch struct {
+		WechatOrderStatus
+		Orm *gorm.DB
+        QueryClass  constvar.WechatOrderStatusQueryClass
+        KeywordType constvar.WechatOrderStatusKeywordType
+        Keyword     string
+        PageNum  int
+        PageSize int
+	}
+)
+
+func (WechatOrderStatus) TableName() string {
+	return "wechat_order_status"
+}
+
+func NewWechatOrderStatusSearch() *WechatOrderStatusSearch {
+	return &WechatOrderStatusSearch{
+		Orm: mysqlx.GetDB(),
+	}
+}
+
+func (slf *WechatOrderStatusSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&WechatOrderStatus{})
+	if slf.Id != 0 {
+		db = db.Where("id = ?", slf.Id)
+	}
+
+	return db
+}
+
+func (slf *WechatOrderStatusSearch) Create(record *WechatOrderStatus) error {
+	var db = slf.build()
+	return db.Create(record).Error
+}
+
+func (slf *WechatOrderStatusSearch) CreateBatch(records []*WechatOrderStatus) error {
+	var db = slf.build()
+	return db.Create(records).Error
+}
+
+func (slf *WechatOrderStatusSearch) Delete() error {
+	var db = slf.build()
+	return db.Delete(&WechatOrderStatus{}).Error
+}
+
+func (slf *WechatOrderStatusSearch) Update(record *WechatOrderStatus) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
+
+func (slf *WechatOrderStatusSearch) FindAll() ([]*WechatOrderStatus, error) {
+	var db = slf.build()
+	var record = make([]*WechatOrderStatus, 0)
+	err := db.Find(&record).Error
+	return record, err
+}
+
+func (slf *WechatOrderStatusSearch) SetId(id int) *WechatOrderStatusSearch {
+	slf.Id = id
+	return slf
+}
+
+func (slf *WechatOrderStatusSearch) SetOrm(tx *gorm.DB) *WechatOrderStatusSearch {
+	slf.Orm = tx
+	return slf
+}
+
+func (slf *WechatOrderStatusSearch) First() (*WechatOrderStatus, error) {
+	var db = slf.build()
+	var record = new(WechatOrderStatus)
+	err := db.First(record).Error
+	return record, err
+}
+
+func (slf *WechatOrderStatusSearch) Updates(values interface{}) error {
+	var db = slf.build()
+	return db.Updates(values).Error
+}
+
+func (slf *WechatOrderStatusSearch) Save(record *WechatOrderStatus) error {
+	if record.Id == 0 {
+		return errors.New("id涓虹┖")
+	}
+	var db = slf.build()
+
+	if err := db.Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+func (slf *WechatOrderStatusSearch) Find() ([]*WechatOrderStatus, int64, error) {
+	var db = slf.build()
+	var records = make([]*WechatOrderStatus, 0)
+	var total int64
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, err
+	}
+	if slf.PageNum > 0 && slf.PageSize > 0 {
+		db = db.Limit(slf.PageSize).Offset((slf.PageNum - 1) * slf.PageSize)
+	}
+
+	err := db.Find(&records).Error
+	return records, total, err
+}
+
+// InitDefaultData 鍒濆鍖栨暟鎹�
+func (slf *WechatOrderStatusSearch) InitDefaultData() error {
+	var (
+		db          = slf.Orm.Table(slf.TableName())
+		total int64 = 0
+	)
+	if err := db.Count(&total).Error; err != nil {
+		return err
+	}
+	if total != 0 {
+		return nil
+	}
+	records := []*WechatOrderStatus{}
+	return slf.CreateBatch(records)
+}
diff --git a/pkg/contextx/contextx.go b/pkg/contextx/contextx.go
index 77a9b64..94fce95 100644
--- a/pkg/contextx/contextx.go
+++ b/pkg/contextx/contextx.go
@@ -42,7 +42,7 @@
 	if params != nil {
 		if err := r.ctx.ShouldBind(params); err != nil {
 			logx.Errorf("bind param error: %v", err.Error())
-			r.Fail(ecode.ParamsErr)
+			r.FailWithMsg(ecode.ParamsErr, err.Error())
 			return
 		}
 	}
diff --git a/router/wechatOrderStatus.go b/router/wechatOrderStatus.go
new file mode 100644
index 0000000..732179c
--- /dev/null
+++ b/router/wechatOrderStatus.go
@@ -0,0 +1,17 @@
+package router
+
+import (
+	v1 "aps_crm/api/v1"
+	"github.com/gin-gonic/gin"
+)
+
+func InitWechatOrderStatusRouter(router *gin.RouterGroup) {
+	WechatOrderStatusRouter := router.Group("wechatOrderStatus")
+	WechatOrderStatusApi := v1.WechatOrderStatusApi{}
+	{
+		WechatOrderStatusRouter.POST("add", WechatOrderStatusApi.Add)             // 娣诲姞寰俊璁㈠崟鐘舵��
+		WechatOrderStatusRouter.DELETE("delete/:id", WechatOrderStatusApi.Delete) // 鍒犻櫎寰俊璁㈠崟鐘舵��
+		WechatOrderStatusRouter.PUT("update", WechatOrderStatusApi.Update)        // 鏇存柊寰俊璁㈠崟鐘舵��
+		WechatOrderStatusRouter.GET("list", WechatOrderStatusApi.List)            // 鑾峰彇寰俊璁㈠崟鐘舵�佸垪琛�
+	}
+}
diff --git a/service/salesDetails.go b/service/salesDetails.go
index 8c0b0a2..d504748 100644
--- a/service/salesDetails.go
+++ b/service/salesDetails.go
@@ -1,6 +1,7 @@
 package service
 
 import (
+	"aps_crm/constvar"
 	"aps_crm/model"
 	"aps_crm/pkg/ecode"
 )
@@ -44,9 +45,12 @@
 	return ecode.OK
 }
 
-func (SalesDetailsService) GetSalesDetailsList(page, pageSize int, keyword string) ([]*model.SalesDetails, int64, int) {
+func (SalesDetailsService) GetSalesDetailsList(page, pageSize int, keywordType constvar.SalesDetailsKeywordType, keyword string) ([]*model.SalesDetails, int64, int) {
 	// get contact list
-	contacts, total, err := model.NewSalesDetailsSearch().SetKeyword(keyword).SetPage(page, pageSize).FindAll()
+	contacts, total, err := model.NewSalesDetailsSearch().
+		SetPreload(true).
+		SetKeywordType(keywordType).
+		SetKeyword(keyword).SetPage(page, pageSize).FindAll()
 	if err != nil {
 		return nil, 0, ecode.SalesDetailsListErr
 	}
diff --git a/service/wechatOrderStatus.go b/service/wechatOrderStatus.go
new file mode 100644
index 0000000..bc7b442
--- /dev/null
+++ b/service/wechatOrderStatus.go
@@ -0,0 +1,55 @@
+package service
+
+import (
+	"aps_crm/model"
+	"aps_crm/pkg/ecode"
+)
+
+type WechatOrderStatusService struct{}
+
+func NewWechatOrderStatusService() WechatOrderStatusService {
+	return WechatOrderStatusService{}
+}
+
+func (WechatOrderStatusService) AddWechatOrderStatus(wechatOrderStatus *model.WechatOrderStatus) int {
+	err := model.NewWechatOrderStatusSearch().Create(wechatOrderStatus)
+	if err != nil {
+		return ecode.DBErr
+	}
+
+	return ecode.OK
+}
+
+func (WechatOrderStatusService) GetWechatOrderStatus(id int) (*model.WechatOrderStatus, int) {
+	wechatOrderStatus, err := model.NewWechatOrderStatusSearch().SetId(id).First()
+	if err != nil {
+		return nil, ecode.DBErr
+	}
+
+	return wechatOrderStatus, ecode.OK
+}
+
+func (WechatOrderStatusService) DeleteWechatOrderStatus(id int) int {
+	err := model.NewWechatOrderStatusSearch().SetId(id).Delete()
+	if err != nil {
+		return ecode.DBErr
+	}
+	return ecode.OK
+}
+
+func (WechatOrderStatusService) GetWechatOrderStatusList() ([]*model.WechatOrderStatus, int64, int) {
+	list, total, err := model.NewWechatOrderStatusSearch().Find()
+	if err != nil {
+		return nil, 0, ecode.DBErr
+	}
+
+	return list, total, ecode.OK
+}
+
+func (WechatOrderStatusService) UpdateWechatOrderStatus(wechatOrderStatus *model.WechatOrderStatus) int {
+	err := model.NewWechatOrderStatusSearch().SetId(wechatOrderStatus.Id).Save(wechatOrderStatus)
+	if err != nil {
+		return ecode.DBErr
+	}
+	return ecode.OK
+}

--
Gitblit v1.8.0