From 05582688724c78bc70a7bc860193c67677f6c8cf Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期六, 28 十月 2023 10:46:37 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.5.5:10010/r/aps/crm

---
 model/request/masterOrder.go     |   17 
 model/severity.go                |    2 
 model/request/salesDetails.go    |   42 
 docs/swagger.yaml                |  140 ++-
 model/SalesReturnProduct.go      |   21 
 api/v1/salesReturn.go            |   18 
 model/request/serviceOrder.go    |   58 
 model/request/contract.go        |   20 
 api/v1/salesRefund.go            |   20 
 api/v1/invoice.go                |    9 
 api/v1/salesLeads.go             |   16 
 model/util.go                    |    2 
 model/request/salesReturn.go     |    2 
 model/invoice.go                 |   34 
 model/subOrder.go                |   34 
 model/salesReturn.go             |   32 
 model/salesLeads.go              |   33 
 service/saleChance.go            |   45 +
 api/v1/masterOrder.go            |   18 
 model/request/saleChance.go      |   66 
 api/v1/code.go                   |   65 +
 docs/docs.go                     |  207 +++--
 service/invoice.go               |    2 
 model/followRecord.go            |   39 
 model/request/invoice.go         |   56 
 constvar/const.go                |   32 
 model/serviceOrder.go            |   34 
 service/salesRefund.go           |   14 
 model/request/salesRefund.go     |    2 
 api/v1/serviceFollowup.go        |   17 
 model/request/quotation.go       |   26 
 service/salesDetails.go          |    3 
 api/v1/client.go                 |   23 
 model/contract.go                |   35 
 model/request/subOrder.go        |   14 
 api/v1/contract.go               |   19 
 api/v1/quotation.go              |   18 
 model/masterOrder.go             |   33 
 model/serviceFollowup.go         |   32 
 conf/aps-crm.json                |    4 
 model/request/serviceFollowup.go |   30 
 api/v1/salesDetails.go           |   20 
 model/client.go                  |   28 
 model/request/followRecord.go    |   33 
 service/salesReturn.go           |    1 
 model/request/salesLeads.go      |   22 
 api/v1/subOrder.go               |   17 
 model/salesDetailsProduct.go     |    9 
 model/saleChance.go              |   25 
 model/request/client.go          |   35 
 model/quotation.go               |   33 
 api/v1/serviceOrder.go           |   17 
 docs/swagger.json                |  207 +++--
 model/serviceContract.go         |   34 
 api/v1/saleChance.go             |   28 
 model/salesDetails.go            |   32 
 model/saleChanceProduct.go       |  114 +++
 api/v1/serviceContract.go        |   42 
 model/request/serviceContract.go |   40 
 model/salesRefund.go             |   46 +
 router/index.go                  |    3 
 api/v1/followRecord.go           |   17 
 62 files changed, 1,461 insertions(+), 676 deletions(-)

diff --git a/api/v1/client.go b/api/v1/client.go
index 37016eb..d7dc42e 100644
--- a/api/v1/client.go
+++ b/api/v1/client.go
@@ -41,25 +41,20 @@
 		return
 	}
 
-	//CreatorId, b := c.Get("claims")
-	//if !b {
-	//	ctx.Fail(ecode.JWTParseErr)
-	//	return
-	//}
-	//
-	//client.CreatorId = CreatorId.(int)
+	count, err := model.NewClientSearch(nil).SetNumber(client.Number).Count()
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜楠岃瘉澶辫触")
+		return
+	}
+	if count > 0 {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜宸插瓨鍦�")
+		return
+	}
 
 	errCode = clientService.AddClient(client, params.SalesLeadsId)
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
-	}
-	if params.CodeRule.Method == 1 {
-		autoCode := model.GetAutoCode(client.Id, &params.CodeRule)
-		m := map[string]interface{}{
-			"number": autoCode,
-		}
-		_ = model.NewClientSearch(nil).SetId(client.Id).UpdateByMap(m)
 	}
 
 	ctx.Ok()
diff --git a/api/v1/code.go b/api/v1/code.go
index bb8ae8b..a94cb5a 100644
--- a/api/v1/code.go
+++ b/api/v1/code.go
@@ -2,6 +2,8 @@
 
 import (
 	"aps_crm/conf"
+	"aps_crm/constvar"
+	"aps_crm/model"
 	"aps_crm/model/request"
 	"aps_crm/model/response"
 	"aps_crm/pkg/contextx"
@@ -71,3 +73,66 @@
 		Count: list.Total,
 	})
 }
+
+// GetAutoCode
+//
+// @Tags		缂栫爜
+// @Summary	鑾峰彇鑷姩缂栫爜
+// @Produce	application/json
+// @Param		object	body		code.CodeStandard	true	"鍙傛暟"
+// @Success	200	{object}	response.ListResponse
+//
+//	@Router		/api/code/getAutoCode [post]
+func (ca *CodeApi) GetAutoCode(c *gin.Context) {
+	var params code.CodeStandard
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+	var (
+		id  = 0
+		err error
+	)
+	switch constvar.CodeStandardType(params.Type) {
+	case constvar.CodeStandardTypeSaleKey:
+		id, err = model.NewSaleChanceSearch().MaxAutoIncr()
+	case constvar.CodeStandardTypeSaleLead:
+		id, err = model.NewSalesLeadsSearch(nil).MaxAutoIncr()
+	case constvar.CodeStandardTypeCustom:
+		id, err = model.NewClientSearch(nil).MaxAutoIncr()
+	case constvar.CodeStandardTypeFollowRecord:
+		id, err = model.NewFollowRecordSearch().MaxAutoIncr()
+	case constvar.CodeStandardTypeQuotation:
+		id, err = model.NewQuotationSearch(nil).MaxAutoIncr()
+	case constvar.CodeStandardTypeSaleTotalOrder:
+		id, err = model.NewMasterOrderSearch().MaxAutoIncr()
+	case constvar.CodeStandardTypeSaleSuborder:
+		id, err = model.NewSubOrderSearch(nil).MaxAutoIncr()
+	case constvar.CodeStandardTypeSaleDetail:
+		id, err = model.NewSalesDetailsSearch().MaxAutoIncr()
+	case constvar.CodeStandardTypeSaleReturnGoods:
+		id, err = model.NewSalesReturnSearch().MaxAutoIncr()
+	case constvar.CodeStandardTypeSaleRefund:
+		id, err = model.NewSalesRefundSearch().MaxAutoIncr()
+	case constvar.CodeStandardTypeContract:
+		id, err = model.NewContractSearch().MaxAutoIncr()
+	case constvar.CodeStandardTypeServerContract:
+		id, err = model.NewServiceContractSearch().MaxAutoIncr()
+	case constvar.CodeStandardTypeCustomServer:
+		id, err = model.NewServiceOrderSearch().MaxAutoIncr()
+	case constvar.CodeStandardTypeServerFollow:
+		id, err = model.NewServiceFollowupSearch().MaxAutoIncr()
+	case constvar.CodeStandardTypeSaleInvoice:
+		id, err = model.NewInvoiceSearch().MaxAutoIncr()
+	default:
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜瑙勫垯涓嶅瓨鍦�")
+		return
+	}
+	if err != nil {
+		logx.Errorf("GetAutoCode err: %v", err.Error())
+		ctx.FailWithMsg(ecode.UnknownErr, "鑾峰彇鏈�澶у�煎け璐�")
+		return
+	}
+	autoCode := model.GetAutoCode(id, &params)
+	ctx.OkWithDetailed(autoCode)
+}
diff --git a/api/v1/contract.go b/api/v1/contract.go
index 8041742..5a0dcdd 100644
--- a/api/v1/contract.go
+++ b/api/v1/contract.go
@@ -35,6 +35,16 @@
 		return
 	}
 
+	count, err := model.NewContractSearch().SetNumber(params.Number).Count()
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜楠岃瘉澶辫触")
+		return
+	}
+	if count > 0 {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜宸插瓨鍦�")
+		return
+	}
+
 	if contract.MemberId == 0 {
 		userInfo := utils.GetUserInfo(c)
 		if userInfo.UserType == constvar.UserTypeSub {
@@ -46,14 +56,6 @@
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
-	}
-
-	if params.CodeRule.Method == 1 {
-		autoCode := model.GetAutoCode(contract.Id, &params.CodeRule)
-		m := map[string]interface{}{
-			"number": autoCode,
-		}
-		_ = model.NewContractSearch().SetId(contract.Id).UpdateByMap(m)
 	}
 
 	ctx.Ok()
@@ -138,6 +140,7 @@
 		File:         contract.File,
 		CodeStandID:  contract.CodeStandID,
 		ContractName: contract.ContractName,
+		SendTime:     contract.SendTime,
 	}
 
 	return ecode.OK, contractModel
diff --git a/api/v1/followRecord.go b/api/v1/followRecord.go
index d64b85a..1fe90dd 100644
--- a/api/v1/followRecord.go
+++ b/api/v1/followRecord.go
@@ -36,6 +36,16 @@
 		return
 	}
 
+	count, err := model.NewFollowRecordSearch().SetNumber(followRecord.Number).Count()
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜楠岃瘉澶辫触")
+		return
+	}
+	if count > 0 {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜宸插瓨鍦�")
+		return
+	}
+
 	if followRecord.MemberId == 0 {
 		userInfo := utils.GetUserInfo(c)
 		if userInfo.UserType == constvar.UserTypeSub {
@@ -47,13 +57,6 @@
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
-	}
-	if params.FollowRecord.CodeRule.Method == 1 {
-		autoCode := model.GetAutoCode(followRecord.Id, &params.FollowRecord.CodeRule)
-		m := map[string]interface{}{
-			"number": autoCode,
-		}
-		_ = model.NewFollowRecordSearch().SetId(followRecord.Id).UpdateMap(m)
 	}
 
 	ctx.Ok()
diff --git a/api/v1/invoice.go b/api/v1/invoice.go
index c451f3c..3c51eb3 100644
--- a/api/v1/invoice.go
+++ b/api/v1/invoice.go
@@ -34,6 +34,15 @@
 		ctx.Fail(ecode.ParamsErr)
 		return
 	}
+	count, err := model.NewInvoiceSearch().SetNumber(invoice.Number).Count()
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜楠岃瘉澶辫触")
+		return
+	}
+	if count > 0 {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜宸插瓨鍦�")
+		return
+	}
 
 	errCode := service.NewInvoiceService().AddInvoice(&invoice)
 	if errCode != ecode.OK {
diff --git a/api/v1/masterOrder.go b/api/v1/masterOrder.go
index 373078f..af2fb9d 100644
--- a/api/v1/masterOrder.go
+++ b/api/v1/masterOrder.go
@@ -34,6 +34,16 @@
 		return
 	}
 
+	count, err := model.NewMasterOrderSearch().SetNumber(params.Number).Count()
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜楠岃瘉澶辫触")
+		return
+	}
+	if count > 0 {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜宸插瓨鍦�")
+		return
+	}
+
 	if masterOrder.MemberId == 0 {
 		userInfo := utils.GetUserInfo(c)
 		if userInfo.UserType == constvar.UserTypeSub {
@@ -45,14 +55,6 @@
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
-	}
-
-	if params.CodeRule.Method == 1 {
-		autoCode := model.GetAutoCode(masterOrder.Id, &params.CodeRule)
-		m := map[string]interface{}{
-			"number": autoCode,
-		}
-		_ = model.NewMasterOrderSearch().SetId(masterOrder.Id).UpdateByMap(m)
 	}
 
 	ctx.Ok()
diff --git a/api/v1/quotation.go b/api/v1/quotation.go
index 7beeb3b..3fd3552 100644
--- a/api/v1/quotation.go
+++ b/api/v1/quotation.go
@@ -34,6 +34,16 @@
 		return
 	}
 
+	count, err := model.NewQuotationSearch(nil).SetNumber(params.Number).Count()
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜楠岃瘉澶辫触")
+		return
+	}
+	if count > 0 {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜宸插瓨鍦�")
+		return
+	}
+
 	if quotation.MemberId == 0 {
 		userInfo := utils.GetUserInfo(c)
 		if userInfo.UserType == constvar.UserTypeSub {
@@ -45,14 +55,6 @@
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
-	}
-
-	if params.CodeRule.Method == 1 {
-		autoCode := model.GetAutoCode(quotation.Id, &params.CodeRule)
-		m := map[string]interface{}{
-			"number": autoCode,
-		}
-		_ = model.NewQuotationSearch(nil).SetId(quotation.Id).Updates(m)
 	}
 
 	ctx.Ok()
diff --git a/api/v1/saleChance.go b/api/v1/saleChance.go
index 791ce98..73bcdb0 100644
--- a/api/v1/saleChance.go
+++ b/api/v1/saleChance.go
@@ -33,16 +33,15 @@
 		ctx.Fail(errCode)
 		return
 	}
-	if params.CodeRule.Method != 1 {
-		count, err := model.NewSaleChanceSearch().SetNumber(saleChance.Number).Count()
-		if err != nil {
-			ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜楠岃瘉澶辫触")
-			return
-		}
-		if count > 0 {
-			ctx.FailWithMsg(ecode.UnknownErr, "閿�鍞満浼氱紪鐮佸凡瀛樺湪")
-			return
-		}
+
+	count, err := model.NewSaleChanceSearch().SetNumber(saleChance.Number).Count()
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜楠岃瘉澶辫触")
+		return
+	}
+	if count > 0 {
+		ctx.FailWithMsg(ecode.UnknownErr, "閿�鍞満浼氱紪鐮佸凡瀛樺湪")
+		return
 	}
 
 	if saleChance.MemberId == 0 {
@@ -56,14 +55,6 @@
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
-	}
-
-	if params.CodeRule.Method == 1 {
-		autoCode := model.GetAutoCode(saleChance.Id, &params.CodeRule)
-		m := map[string]interface{}{
-			"number": autoCode,
-		}
-		_ = model.NewSaleChanceSearch().SetId(saleChance.Id).UpdateByMap(m)
 	}
 
 	ctx.Ok()
@@ -208,6 +199,7 @@
 	sc.Address.CountryId = saleChance.Address.CountryId
 	sc.Address.ProvinceId = saleChance.Address.ProvinceId
 	sc.CodeStandID = saleChance.CodeStandID
+	sc.Products = saleChance.Products
 
 	return ecode.OK, sc
 }
diff --git a/api/v1/salesDetails.go b/api/v1/salesDetails.go
index 350e9c2..1a1e37d 100644
--- a/api/v1/salesDetails.go
+++ b/api/v1/salesDetails.go
@@ -35,6 +35,16 @@
 		return
 	}
 
+	count, err := model.NewSalesDetailsSearch().SetNumber(params.Number).Count()
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜楠岃瘉澶辫触")
+		return
+	}
+	if count > 0 {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜宸插瓨鍦�")
+		return
+	}
+
 	if salesDetails.MemberId == 0 {
 		userInfo := utils.GetUserInfo(c)
 		if userInfo.UserType == constvar.UserTypeSub {
@@ -46,14 +56,6 @@
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
-	}
-
-	if params.CodeRule.Method == 1 {
-		autoCode := model.GetAutoCode(salesDetails.Id, &params.CodeRule)
-		m := map[string]interface{}{
-			"number": autoCode,
-		}
-		_ = model.NewSalesDetailsSearch().SetId(salesDetails.Id).UpdateByMap(m)
 	}
 
 	ctx.OkWithDetailed(salesDetails)
@@ -156,6 +158,8 @@
 	salesDetailsModel.LogisticNumber = salesDetails.LogisticNumber
 	salesDetailsModel.LogisticCost = salesDetails.LogisticCost
 	salesDetailsModel.CodeStandID = salesDetails.CodeStandID
+	salesDetailsModel.DeliverType = salesDetails.DeliverType
+	salesDetailsModel.QuotationId = salesDetails.QuotationId
 
 	return ecode.OK, salesDetailsModel
 }
diff --git a/api/v1/salesLeads.go b/api/v1/salesLeads.go
index e35a85d..25e1692 100644
--- a/api/v1/salesLeads.go
+++ b/api/v1/salesLeads.go
@@ -40,18 +40,20 @@
 		ctx.Fail(errCode)
 		return
 	}
+	count, err := model.NewSalesLeadsSearch(nil).SetNumber(params.Number).Count()
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜楠岃瘉澶辫触")
+		return
+	}
+	if count > 0 {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜宸插瓨鍦�")
+		return
+	}
 
 	errCode = salesLeadsService.AddSalesLeads(&salesLeads)
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
-	}
-	if params.CodeRule.Method == 1 {
-		autoCode := model.GetAutoCode(salesLeads.Id, &params.CodeRule)
-		m := map[string]interface{}{
-			"number": autoCode,
-		}
-		_ = model.NewSalesLeadsSearch(nil).SetId(salesLeads.Id).UpdateMap(m)
 	}
 
 	ctx.Ok()
diff --git a/api/v1/salesRefund.go b/api/v1/salesRefund.go
index cbce386..00ce774 100644
--- a/api/v1/salesRefund.go
+++ b/api/v1/salesRefund.go
@@ -36,6 +36,16 @@
 		return
 	}
 
+	count, err := model.NewSalesRefundSearch().SetNumber(salesRefund.Number).Count()
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜楠岃瘉澶辫触")
+		return
+	}
+	if count > 0 {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜宸插瓨鍦�")
+		return
+	}
+
 	if salesRefund.MemberId == 0 {
 		userInfo := utils.GetUserInfo(c)
 		if userInfo.UserType == constvar.UserTypeSub {
@@ -47,14 +57,6 @@
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
-	}
-
-	if params.SalesRefund.CodeRule.Method == 1 {
-		autoCode := model.GetAutoCode(salesRefund.Id, &params.SalesRefund.CodeRule)
-		m := map[string]interface{}{
-			"number": autoCode,
-		}
-		_ = model.NewSalesRefundSearch().SetId(salesRefund.Id).UpdateByMap(m)
 	}
 
 	ctx.Ok()
@@ -158,7 +160,7 @@
 	salesRefundRes.Reason = salesRefund.Reason
 	salesRefundRes.Products = salesRefund.Products
 	salesRefundRes.SourceType = salesRefund.SourceType
-	salesRefundRes.SourceId = salesRefund.SourceId
+	salesRefundRes.SalesReturnId = salesRefund.SourceId
 	salesRefundRes.CodeStandID = salesRefund.CodeStandID
 
 	return ecode.OK, salesRefundRes
diff --git a/api/v1/salesReturn.go b/api/v1/salesReturn.go
index bf1fdbd..4e21782 100644
--- a/api/v1/salesReturn.go
+++ b/api/v1/salesReturn.go
@@ -37,6 +37,16 @@
 		return
 	}
 
+	count, err := model.NewSalesReturnSearch().SetNumber(salesReturn.Number).Count()
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜楠岃瘉澶辫触")
+		return
+	}
+	if count > 0 {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜宸插瓨鍦�")
+		return
+	}
+
 	if salesReturn.MemberId == 0 {
 		userInfo := utils.GetUserInfo(c)
 		if userInfo.UserType == constvar.UserTypeSub {
@@ -48,14 +58,6 @@
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
-	}
-
-	if params.SalesReturn.CodeRule.Method == 1 {
-		autoCode := model.GetAutoCode(salesReturn.Id, &params.SalesReturn.CodeRule)
-		m := map[string]interface{}{
-			"number": autoCode,
-		}
-		_ = model.NewSalesReturnSearch().SetId(salesReturn.Id).UpdateByMap(m)
 	}
 
 	ctx.Ok()
diff --git a/api/v1/serviceContract.go b/api/v1/serviceContract.go
index d6b13c1..1edad01 100644
--- a/api/v1/serviceContract.go
+++ b/api/v1/serviceContract.go
@@ -35,6 +35,16 @@
 		return
 	}
 
+	count, err := model.NewServiceContractSearch().SetNumber(params.Number).Count()
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜楠岃瘉澶辫触")
+		return
+	}
+	if count > 0 {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜宸插瓨鍦�")
+		return
+	}
+
 	if params.MemberId == 0 {
 		userInfo := utils.GetUserInfo(c)
 		if userInfo.UserType == constvar.UserTypeSub {
@@ -48,40 +58,8 @@
 		return
 	}
 
-	if params.CodeRule.Method == 1 {
-		autoCode := model.GetAutoCode(serviceContract.Id, &params.CodeRule)
-		m := map[string]interface{}{
-			"number": autoCode,
-		}
-		_ = model.NewServiceContractSearch().SetId(serviceContract.Id).UpdateByMap(m)
-	}
-
 	ctx.Ok()
 }
-
-//// Delete
-////
-////	@Tags		ServiceContract
-////	@Summary	鍒犻櫎鏈嶅姟鍚堝悓
-////	@Produce	application/json
-////	@Param		object	body		request.DeleteServiceContract true	"鏌ヨ鍙傛暟"
-////	@Success	200	{object}	contextx.Response{}
-////	@Router		/api/serviceContract/delete [delete]
-//func (s *ServiceContractApi) Delete(c *gin.Context) {
-//	var params request.DeleteServiceContract
-//	ctx, ok := contextx.NewContext(c, &params)
-//	if !ok {
-//		return
-//	}
-//
-//	errCode := serviceContractService.DeleteServiceContract(params.Ids)
-//	if errCode != ecode.OK {
-//		ctx.Fail(errCode)
-//		return
-//	}
-//
-//	ctx.Ok()
-//}
 
 // BatchDelete
 // @Tags	ServiceContract
diff --git a/api/v1/serviceFollowup.go b/api/v1/serviceFollowup.go
index 39af767..d457ead 100644
--- a/api/v1/serviceFollowup.go
+++ b/api/v1/serviceFollowup.go
@@ -40,17 +40,20 @@
 		return
 	}
 
+	count, err := model.NewServiceFollowupSearch().SetNumber(serviceFollowup.Number).Count()
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜楠岃瘉澶辫触")
+		return
+	}
+	if count > 0 {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜宸插瓨鍦�")
+		return
+	}
+
 	errCode = serviceFollowupService.AddServiceFollowup(&serviceFollowup)
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
-	}
-	if params.CodeRule.Method == 1 {
-		autoCode := model.GetAutoCode(serviceFollowup.Id, &params.CodeRule)
-		m := map[string]interface{}{
-			"number": autoCode,
-		}
-		_ = model.NewServiceFollowupSearch().SetId(serviceFollowup.Id).UpdateByMap(m)
 	}
 
 	ctx.Ok()
diff --git a/api/v1/serviceOrder.go b/api/v1/serviceOrder.go
index faef2d6..e557bd7 100644
--- a/api/v1/serviceOrder.go
+++ b/api/v1/serviceOrder.go
@@ -42,17 +42,20 @@
 		return
 	}
 
+	count, err := model.NewServiceOrderSearch().SetNumber(serviceOrder.ServiceNumber).Count()
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜楠岃瘉澶辫触")
+		return
+	}
+	if count > 0 {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜宸插瓨鍦�")
+		return
+	}
+
 	errCode := service.NewServiceOrderService().AddServiceOrder(serviceOrder)
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
-	}
-	if params.CodeRule.Method == 1 {
-		autoCode := model.GetAutoCode(serviceOrder.Id, &params.CodeRule)
-		m := map[string]interface{}{
-			"service_number": autoCode,
-		}
-		_ = model.NewServiceOrderSearch().SetId(serviceOrder.Id).UpdateByMap(m)
 	}
 
 	ctx.Ok()
diff --git a/api/v1/subOrder.go b/api/v1/subOrder.go
index b4595ee..188e036 100644
--- a/api/v1/subOrder.go
+++ b/api/v1/subOrder.go
@@ -34,6 +34,16 @@
 		return
 	}
 
+	count, err := model.NewSubOrderSearch(nil).SetNumber(params.Number).Count()
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜楠岃瘉澶辫触")
+		return
+	}
+	if count > 0 {
+		ctx.FailWithMsg(ecode.UnknownErr, "缂栫爜宸插瓨鍦�")
+		return
+	}
+
 	if subOrder.MemberId == 0 {
 		userInfo := utils.GetUserInfo(c)
 		if userInfo.UserType == constvar.UserTypeSub {
@@ -47,13 +57,6 @@
 		return
 	}
 
-	if params.CodeRule.Method == 1 {
-		autoCode := model.GetAutoCode(subOrder.Id, &params.CodeRule)
-		m := map[string]interface{}{
-			"number": autoCode,
-		}
-		_ = model.NewSubOrderSearch(nil).SetId(subOrder.Id).UpdateByMap(m)
-	}
 	ctx.Ok()
 }
 
diff --git a/conf/aps-crm.json b/conf/aps-crm.json
index 9774105..eeb4146 100644
--- a/conf/aps-crm.json
+++ b/conf/aps-crm.json
@@ -48,8 +48,8 @@
     "Issuer": "qmPlus"
   },
   "GrpcServiceAddr": {
-    "Aps": "192.168.20.120:9091",
-    "Admin": "192.168.20.120:50051"
+    "Aps": "192.168.20.119:9091",
+    "Admin": "192.168.20.119:50051"
   }
 }
 
diff --git a/constvar/const.go b/constvar/const.go
index 98cfd24..cd33794 100644
--- a/constvar/const.go
+++ b/constvar/const.go
@@ -137,24 +137,26 @@
 type CodeStandardType string
 
 const (
-	CodeStandardTypeSaleLead       CodeStandardType = "閿�鍞嚎绱㈢紪鐮�"
-	CodeStandardTypeCustom         CodeStandardType = "瀹㈡埛缂栫爜"
-	CodeStandardTypeContact        CodeStandardType = "鑱旂郴浜虹紪鐮�"
-	CodeStandardTypeFollowRecord   CodeStandardType = "璺熻繘璁板綍缂栫爜"
-	CodeStandardTypeSaleKey        CodeStandardType = "閿�鍞満浼氱紪鐮�"
-	CodeStandardTypeQuotation      CodeStandardType = "鎶ヤ环缂栫爜"
-	CodeStandardTypeSaleTotalOrder CodeStandardType = "閿�鍞�诲崟缂栫爜"
-	CodeStandardTypeSaleSuborder   CodeStandardType = "閿�鍞瓙鍗曠紪鐮�"
-	CodeStandardTypeSaleRefund     CodeStandardType = "閿�鍞��娆剧紪鐮�"
-	CodeStandardTypeContract       CodeStandardType = "鍚堝悓缂栫爜"
-	CodeStandardTypeServerContract CodeStandardType = "鏈嶅姟鍚堝悓缂栫爜"
-	CodeStandardTypeServerFollow   CodeStandardType = "鏈嶅姟鍥炶缂栫爜"
+	CodeStandardTypeSaleLead        CodeStandardType = "閿�鍞嚎绱㈢紪鐮�"
+	CodeStandardTypeCustom          CodeStandardType = "瀹㈡埛缂栫爜"
+	CodeStandardTypeFollowRecord    CodeStandardType = "璺熻繘璁板綍缂栫爜"
+	CodeStandardTypeSaleKey         CodeStandardType = "閿�鍞満浼氱紪鐮�"
+	CodeStandardTypeQuotation       CodeStandardType = "鎶ヤ环缂栫爜"
+	CodeStandardTypeSaleTotalOrder  CodeStandardType = "閿�鍞�诲崟缂栫爜"
+	CodeStandardTypeSaleSuborder    CodeStandardType = "閿�鍞瓙鍗曠紪鐮�"
+	CodeStandardTypeSaleRefund      CodeStandardType = "閿�鍞��娆剧紪鐮�"
+	CodeStandardTypeContract        CodeStandardType = "鍚堝悓缂栫爜"
+	CodeStandardTypeServerContract  CodeStandardType = "鏈嶅姟鍚堝悓缂栫爜"
+	CodeStandardTypeServerFollow    CodeStandardType = "鏈嶅姟鍥炶缂栫爜"
+	CodeStandardTypeCustomServer    CodeStandardType = "瀹㈡埛鏈嶅姟缂栫爜"
+	CodeStandardTypeSaleInvoice     CodeStandardType = "閿�鍞彂绁ㄧ紪鐮�"
+	CodeStandardTypeSaleDetail      CodeStandardType = "閿�鍞槑缁嗙紪鐮�"
+	CodeStandardTypeSaleReturnGoods CodeStandardType = "閿�鍞��璐х紪鐮�"
 )
 
 func (t CodeStandardType) Valid() bool {
 	if t != CodeStandardTypeSaleLead &&
 		t != CodeStandardTypeCustom &&
-		t != CodeStandardTypeContact &&
 		t != CodeStandardTypeFollowRecord &&
 		t != CodeStandardTypeSaleKey &&
 		t != CodeStandardTypeQuotation &&
@@ -163,6 +165,10 @@
 		t != CodeStandardTypeSaleRefund &&
 		t != CodeStandardTypeContract &&
 		t != CodeStandardTypeServerContract &&
+		t != CodeStandardTypeCustomServer &&
+		t != CodeStandardTypeSaleInvoice &&
+		t != CodeStandardTypeSaleDetail &&
+		t != CodeStandardTypeSaleReturnGoods &&
 		t != CodeStandardTypeServerFollow {
 		return false
 	}
diff --git a/docs/docs.go b/docs/docs.go
index bbd6e7c..8452e69 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -1199,6 +1199,36 @@
                 }
             }
         },
+        "/api/code/getAutoCode": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "缂栫爜"
+                ],
+                "summary": "鑾峰彇鑷姩缂栫爜",
+                "parameters": [
+                    {
+                        "description": "鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/code.CodeStandard"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/response.ListResponse"
+                        }
+                    }
+                }
+            }
+        },
         "/api/code/getCodeList": {
             "get": {
                 "produces": [
@@ -11120,6 +11150,9 @@
                 "quotationId": {
                     "type": "integer"
                 },
+                "sendTime": {
+                    "type": "string"
+                },
                 "serviceContractStatus": {
                     "$ref": "#/definitions/model.ServiceContractStatus"
                 },
@@ -11321,6 +11354,9 @@
                     "description": "瀹㈡埛id",
                     "type": "integer"
                 },
+                "codeStandID": {
+                    "type": "string"
+                },
                 "courierCompany": {
                     "$ref": "#/definitions/model.CourierCompany"
                 },
@@ -11356,6 +11392,9 @@
                 "invoiceTypeId": {
                     "description": "鍙戠エ绫诲瀷id",
                     "type": "integer"
+                },
+                "number": {
+                    "type": "string"
                 },
                 "principalId": {
                     "description": "閿�鍞礋璐d汉id",
@@ -11997,6 +12036,12 @@
                 "process": {
                     "type": "string"
                 },
+                "products": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
+                    }
+                },
                 "projected_amount": {
                     "type": "number"
                 },
@@ -12042,8 +12087,16 @@
                 "solutions": {
                     "type": "string"
                 },
+                "status": {
+                    "description": "鐘舵��",
+                    "allOf": [
+                        {
+                            "$ref": "#/definitions/model.Status"
+                        }
+                    ]
+                },
                 "status_id": {
-                    "$ref": "#/definitions/model.Status"
+                    "type": "integer"
                 },
                 "threats": {
                     "type": "string"
@@ -12128,6 +12181,9 @@
                 "creatorName": {
                     "type": "string"
                 },
+                "deliverType": {
+                    "type": "integer"
+                },
                 "deliveryDate": {
                     "type": "string"
                 },
@@ -12157,6 +12213,12 @@
                     "items": {
                         "$ref": "#/definitions/model.Product"
                     }
+                },
+                "quotation": {
+                    "$ref": "#/definitions/model.Quotation"
+                },
+                "quotationId": {
+                    "type": "integer"
                 },
                 "remark": {
                     "type": "string"
@@ -12275,9 +12337,6 @@
                         }
                     ]
                 },
-                "Source": {
-                    "$ref": "#/definitions/model.SalesReturn"
-                },
                 "amountTotal": {
                     "description": "浠风◣鍚堣",
                     "type": "number"
@@ -12341,6 +12400,9 @@
                 "refundTypeId": {
                     "description": "閫�娆炬柟寮廔D",
                     "type": "integer"
+                },
+                "salesReturn": {
+                    "$ref": "#/definitions/model.SalesReturn"
                 },
                 "sourceId": {
                     "description": "婧愬崟id",
@@ -12960,6 +13022,10 @@
                 "severity": {
                     "$ref": "#/definitions/model.Severity"
                 },
+                "severityId": {
+                    "description": "涓ラ噸绋嬪害id",
+                    "type": "integer"
+                },
                 "solution": {
                     "description": "瑙e喅鏂规硶",
                     "type": "string"
@@ -13290,9 +13356,6 @@
                     "description": "瀹㈡埛绫诲瀷ID",
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -13497,9 +13560,6 @@
                 "client_id": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -13519,6 +13579,10 @@
                 },
                 "quotation_id": {
                     "type": "integer"
+                },
+                "sendTime": {
+                    "description": "鍙戣揣鏃堕棿",
+                    "type": "string"
                 },
                 "status_id": {
                     "type": "integer"
@@ -13660,6 +13724,9 @@
                     "description": "瀹㈡埛id",
                     "type": "integer"
                 },
+                "codeStandID": {
+                    "type": "string"
+                },
                 "courierCompanyId": {
                     "description": "鐗╂祦鍏徃",
                     "type": "integer"
@@ -13683,6 +13750,10 @@
                 "invoiceTypeId": {
                     "description": "鍙戠エ绫诲瀷id",
                     "type": "integer"
+                },
+                "number": {
+                    "description": "鍙戠エ缂栧彿",
+                    "type": "string"
                 },
                 "principalId": {
                     "description": "閿�鍞礋璐d汉id",
@@ -13766,9 +13837,6 @@
             "properties": {
                 "client_id": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -13889,9 +13957,6 @@
             "properties": {
                 "client_id": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -14127,9 +14192,6 @@
                 "client_id": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -14181,6 +14243,12 @@
                 },
                 "process": {
                     "type": "string"
+                },
+                "products": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
+                    }
                 },
                 "projected_amount": {
                     "type": "number"
@@ -14254,15 +14322,16 @@
                 "clientId": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
                 },
                 "conditions": {
                     "type": "string"
+                },
+                "deliverType": {
+                    "description": "浜や粯绫诲瀷:1.涓�娆″彂璐�,2.澶氭鍙戣揣",
+                    "type": "integer"
                 },
                 "deliveryDate": {
                     "type": "string"
@@ -14291,6 +14360,9 @@
                         "$ref": "#/definitions/model.Product"
                     }
                 },
+                "quotationId": {
+                    "type": "integer"
+                },
                 "remark": {
                     "type": "string"
                 },
@@ -14313,9 +14385,6 @@
             "properties": {
                 "city_id": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -14440,9 +14509,6 @@
                 "clientId": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -14551,9 +14617,6 @@
                     "description": "瀹㈡埛绫诲瀷ID",
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -14648,9 +14711,6 @@
                 "clientId": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -14715,9 +14775,6 @@
                 "clientId": {
                     "description": "瀹㈡埛id",
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -14791,7 +14848,7 @@
                     "description": "鏈嶅姟鏂瑰紡id",
                     "type": "integer"
                 },
-                "severity": {
+                "severityId": {
                     "description": "涓ラ噸绋嬪害id",
                     "type": "integer"
                 },
@@ -14873,9 +14930,6 @@
             "properties": {
                 "clientId": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -15253,9 +15307,6 @@
                 },
                 "client_status_id": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "type": "string"
@@ -15834,15 +15885,16 @@
                 "clientId": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
                 },
                 "conditions": {
                     "type": "string"
+                },
+                "deliverType": {
+                    "description": "浜や粯绫诲瀷:1.涓�娆″彂璐�,2.澶氭鍙戣揣",
+                    "type": "integer"
                 },
                 "deliveryDate": {
                     "type": "string"
@@ -15870,6 +15922,9 @@
                     "items": {
                         "$ref": "#/definitions/model.Product"
                     }
+                },
+                "quotationId": {
+                    "type": "integer"
                 },
                 "remark": {
                     "type": "string"
@@ -15901,9 +15956,6 @@
                 },
                 "clientId": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -15953,9 +16005,6 @@
             "properties": {
                 "clientId": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -16155,9 +16204,6 @@
                 "client_type_id": {
                     "description": "瀹㈡埛绫诲瀷ID",
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -16448,9 +16494,6 @@
                 "client_id": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -16473,6 +16516,10 @@
                 },
                 "quotation_id": {
                     "type": "integer"
+                },
+                "sendTime": {
+                    "description": "鍙戣揣鏃堕棿",
+                    "type": "string"
                 },
                 "status_id": {
                     "type": "integer"
@@ -16711,6 +16758,9 @@
                     "description": "瀹㈡埛id",
                     "type": "integer"
                 },
+                "codeStandID": {
+                    "type": "string"
+                },
                 "courierCompanyId": {
                     "description": "鐗╂祦鍏徃",
                     "type": "integer"
@@ -16737,6 +16787,10 @@
                 "invoiceTypeId": {
                     "description": "鍙戠エ绫诲瀷id",
                     "type": "integer"
+                },
+                "number": {
+                    "description": "鍙戠エ缂栧彿",
+                    "type": "string"
                 },
                 "principalId": {
                     "description": "閿�鍞礋璐d汉id",
@@ -16852,9 +16906,6 @@
             "properties": {
                 "client_id": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -17036,9 +17087,6 @@
             "properties": {
                 "client_id": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -17401,9 +17449,6 @@
                 "client_id": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -17458,6 +17503,12 @@
                 },
                 "process": {
                     "type": "string"
+                },
+                "products": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
+                    }
                 },
                 "projected_amount": {
                     "type": "number"
@@ -17571,9 +17622,6 @@
             "properties": {
                 "city_id": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -17828,9 +17876,6 @@
                 "clientId": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -17960,9 +18005,6 @@
                     "description": "瀹㈡埛绫诲瀷ID",
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -18058,9 +18100,6 @@
                 "clientId": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -18128,9 +18167,6 @@
                 "clientId": {
                     "description": "瀹㈡埛id",
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -18207,7 +18243,7 @@
                     "description": "鏈嶅姟鏂瑰紡id",
                     "type": "integer"
                 },
-                "severity": {
+                "severityId": {
                     "description": "涓ラ噸绋嬪害id",
                     "type": "integer"
                 },
@@ -18325,9 +18361,6 @@
             "properties": {
                 "clientId": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
diff --git a/docs/swagger.json b/docs/swagger.json
index c326f5f..64bc3af 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -1187,6 +1187,36 @@
                 }
             }
         },
+        "/api/code/getAutoCode": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "缂栫爜"
+                ],
+                "summary": "鑾峰彇鑷姩缂栫爜",
+                "parameters": [
+                    {
+                        "description": "鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/code.CodeStandard"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/response.ListResponse"
+                        }
+                    }
+                }
+            }
+        },
         "/api/code/getCodeList": {
             "get": {
                 "produces": [
@@ -11108,6 +11138,9 @@
                 "quotationId": {
                     "type": "integer"
                 },
+                "sendTime": {
+                    "type": "string"
+                },
                 "serviceContractStatus": {
                     "$ref": "#/definitions/model.ServiceContractStatus"
                 },
@@ -11309,6 +11342,9 @@
                     "description": "瀹㈡埛id",
                     "type": "integer"
                 },
+                "codeStandID": {
+                    "type": "string"
+                },
                 "courierCompany": {
                     "$ref": "#/definitions/model.CourierCompany"
                 },
@@ -11344,6 +11380,9 @@
                 "invoiceTypeId": {
                     "description": "鍙戠エ绫诲瀷id",
                     "type": "integer"
+                },
+                "number": {
+                    "type": "string"
                 },
                 "principalId": {
                     "description": "閿�鍞礋璐d汉id",
@@ -11985,6 +12024,12 @@
                 "process": {
                     "type": "string"
                 },
+                "products": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
+                    }
+                },
                 "projected_amount": {
                     "type": "number"
                 },
@@ -12030,8 +12075,16 @@
                 "solutions": {
                     "type": "string"
                 },
+                "status": {
+                    "description": "鐘舵��",
+                    "allOf": [
+                        {
+                            "$ref": "#/definitions/model.Status"
+                        }
+                    ]
+                },
                 "status_id": {
-                    "$ref": "#/definitions/model.Status"
+                    "type": "integer"
                 },
                 "threats": {
                     "type": "string"
@@ -12116,6 +12169,9 @@
                 "creatorName": {
                     "type": "string"
                 },
+                "deliverType": {
+                    "type": "integer"
+                },
                 "deliveryDate": {
                     "type": "string"
                 },
@@ -12145,6 +12201,12 @@
                     "items": {
                         "$ref": "#/definitions/model.Product"
                     }
+                },
+                "quotation": {
+                    "$ref": "#/definitions/model.Quotation"
+                },
+                "quotationId": {
+                    "type": "integer"
                 },
                 "remark": {
                     "type": "string"
@@ -12263,9 +12325,6 @@
                         }
                     ]
                 },
-                "Source": {
-                    "$ref": "#/definitions/model.SalesReturn"
-                },
                 "amountTotal": {
                     "description": "浠风◣鍚堣",
                     "type": "number"
@@ -12329,6 +12388,9 @@
                 "refundTypeId": {
                     "description": "閫�娆炬柟寮廔D",
                     "type": "integer"
+                },
+                "salesReturn": {
+                    "$ref": "#/definitions/model.SalesReturn"
                 },
                 "sourceId": {
                     "description": "婧愬崟id",
@@ -12948,6 +13010,10 @@
                 "severity": {
                     "$ref": "#/definitions/model.Severity"
                 },
+                "severityId": {
+                    "description": "涓ラ噸绋嬪害id",
+                    "type": "integer"
+                },
                 "solution": {
                     "description": "瑙e喅鏂规硶",
                     "type": "string"
@@ -13278,9 +13344,6 @@
                     "description": "瀹㈡埛绫诲瀷ID",
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -13485,9 +13548,6 @@
                 "client_id": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -13507,6 +13567,10 @@
                 },
                 "quotation_id": {
                     "type": "integer"
+                },
+                "sendTime": {
+                    "description": "鍙戣揣鏃堕棿",
+                    "type": "string"
                 },
                 "status_id": {
                     "type": "integer"
@@ -13648,6 +13712,9 @@
                     "description": "瀹㈡埛id",
                     "type": "integer"
                 },
+                "codeStandID": {
+                    "type": "string"
+                },
                 "courierCompanyId": {
                     "description": "鐗╂祦鍏徃",
                     "type": "integer"
@@ -13671,6 +13738,10 @@
                 "invoiceTypeId": {
                     "description": "鍙戠エ绫诲瀷id",
                     "type": "integer"
+                },
+                "number": {
+                    "description": "鍙戠エ缂栧彿",
+                    "type": "string"
                 },
                 "principalId": {
                     "description": "閿�鍞礋璐d汉id",
@@ -13754,9 +13825,6 @@
             "properties": {
                 "client_id": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -13877,9 +13945,6 @@
             "properties": {
                 "client_id": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -14115,9 +14180,6 @@
                 "client_id": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -14169,6 +14231,12 @@
                 },
                 "process": {
                     "type": "string"
+                },
+                "products": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
+                    }
                 },
                 "projected_amount": {
                     "type": "number"
@@ -14242,15 +14310,16 @@
                 "clientId": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
                 },
                 "conditions": {
                     "type": "string"
+                },
+                "deliverType": {
+                    "description": "浜や粯绫诲瀷:1.涓�娆″彂璐�,2.澶氭鍙戣揣",
+                    "type": "integer"
                 },
                 "deliveryDate": {
                     "type": "string"
@@ -14279,6 +14348,9 @@
                         "$ref": "#/definitions/model.Product"
                     }
                 },
+                "quotationId": {
+                    "type": "integer"
+                },
                 "remark": {
                     "type": "string"
                 },
@@ -14301,9 +14373,6 @@
             "properties": {
                 "city_id": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -14428,9 +14497,6 @@
                 "clientId": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -14539,9 +14605,6 @@
                     "description": "瀹㈡埛绫诲瀷ID",
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -14636,9 +14699,6 @@
                 "clientId": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -14703,9 +14763,6 @@
                 "clientId": {
                     "description": "瀹㈡埛id",
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -14779,7 +14836,7 @@
                     "description": "鏈嶅姟鏂瑰紡id",
                     "type": "integer"
                 },
-                "severity": {
+                "severityId": {
                     "description": "涓ラ噸绋嬪害id",
                     "type": "integer"
                 },
@@ -14861,9 +14918,6 @@
             "properties": {
                 "clientId": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -15241,9 +15295,6 @@
                 },
                 "client_status_id": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "type": "string"
@@ -15822,15 +15873,16 @@
                 "clientId": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
                 },
                 "conditions": {
                     "type": "string"
+                },
+                "deliverType": {
+                    "description": "浜や粯绫诲瀷:1.涓�娆″彂璐�,2.澶氭鍙戣揣",
+                    "type": "integer"
                 },
                 "deliveryDate": {
                     "type": "string"
@@ -15858,6 +15910,9 @@
                     "items": {
                         "$ref": "#/definitions/model.Product"
                     }
+                },
+                "quotationId": {
+                    "type": "integer"
                 },
                 "remark": {
                     "type": "string"
@@ -15889,9 +15944,6 @@
                 },
                 "clientId": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -15941,9 +15993,6 @@
             "properties": {
                 "clientId": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -16143,9 +16192,6 @@
                 "client_type_id": {
                     "description": "瀹㈡埛绫诲瀷ID",
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -16436,9 +16482,6 @@
                 "client_id": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -16461,6 +16504,10 @@
                 },
                 "quotation_id": {
                     "type": "integer"
+                },
+                "sendTime": {
+                    "description": "鍙戣揣鏃堕棿",
+                    "type": "string"
                 },
                 "status_id": {
                     "type": "integer"
@@ -16699,6 +16746,9 @@
                     "description": "瀹㈡埛id",
                     "type": "integer"
                 },
+                "codeStandID": {
+                    "type": "string"
+                },
                 "courierCompanyId": {
                     "description": "鐗╂祦鍏徃",
                     "type": "integer"
@@ -16725,6 +16775,10 @@
                 "invoiceTypeId": {
                     "description": "鍙戠エ绫诲瀷id",
                     "type": "integer"
+                },
+                "number": {
+                    "description": "鍙戠エ缂栧彿",
+                    "type": "string"
                 },
                 "principalId": {
                     "description": "閿�鍞礋璐d汉id",
@@ -16840,9 +16894,6 @@
             "properties": {
                 "client_id": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -17024,9 +17075,6 @@
             "properties": {
                 "client_id": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -17389,9 +17437,6 @@
                 "client_id": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -17446,6 +17491,12 @@
                 },
                 "process": {
                     "type": "string"
+                },
+                "products": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
+                    }
                 },
                 "projected_amount": {
                     "type": "number"
@@ -17559,9 +17610,6 @@
             "properties": {
                 "city_id": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -17816,9 +17864,6 @@
                 "clientId": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -17948,9 +17993,6 @@
                     "description": "瀹㈡埛绫诲瀷ID",
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -18046,9 +18088,6 @@
                 "clientId": {
                     "type": "integer"
                 },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
-                },
                 "codeStandID": {
                     "description": "缂栫爜id",
                     "type": "string"
@@ -18116,9 +18155,6 @@
                 "clientId": {
                     "description": "瀹㈡埛id",
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
@@ -18195,7 +18231,7 @@
                     "description": "鏈嶅姟鏂瑰紡id",
                     "type": "integer"
                 },
-                "severity": {
+                "severityId": {
                     "description": "涓ラ噸绋嬪害id",
                     "type": "integer"
                 },
@@ -18313,9 +18349,6 @@
             "properties": {
                 "clientId": {
                     "type": "integer"
-                },
-                "codeRule": {
-                    "$ref": "#/definitions/code.CodeStandard"
                 },
                 "codeStandID": {
                     "description": "缂栫爜id",
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index c473c3e..a27c9b3 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -762,6 +762,8 @@
         $ref: '#/definitions/model.Quotation'
       quotationId:
         type: integer
+      sendTime:
+        type: string
       serviceContractStatus:
         $ref: '#/definitions/model.ServiceContractStatus'
       statusId:
@@ -895,6 +897,8 @@
       clientId:
         description: 瀹㈡埛id
         type: integer
+      codeStandID:
+        type: string
       courierCompany:
         $ref: '#/definitions/model.CourierCompany'
       courierCompanyId:
@@ -921,6 +925,8 @@
       invoiceTypeId:
         description: 鍙戠エ绫诲瀷id
         type: integer
+      number:
+        type: string
       principalId:
         description: 閿�鍞礋璐d汉id
         type: integer
@@ -1339,6 +1345,10 @@
         $ref: '#/definitions/model.Possibility'
       process:
         type: string
+      products:
+        items:
+          $ref: '#/definitions/model.Product'
+        type: array
       projected_amount:
         type: number
       province:
@@ -1369,8 +1379,12 @@
         type: integer
       solutions:
         type: string
+      status:
+        allOf:
+        - $ref: '#/definitions/model.Status'
+        description: 鐘舵��
       status_id:
-        $ref: '#/definitions/model.Status'
+        type: integer
       threats:
         type: string
       whether_established:
@@ -1427,6 +1441,8 @@
         type: integer
       creatorName:
         type: string
+      deliverType:
+        type: integer
       deliveryDate:
         type: string
       id:
@@ -1447,6 +1463,10 @@
         items:
           $ref: '#/definitions/model.Product'
         type: array
+      quotation:
+        $ref: '#/definitions/model.Quotation'
+      quotationId:
+        type: integer
       remark:
         type: string
       saleChance:
@@ -1523,8 +1543,6 @@
         allOf:
         - $ref: '#/definitions/model.RefundType'
         description: 閫�娆炬柟寮�
-      Source:
-        $ref: '#/definitions/model.SalesReturn'
       amountTotal:
         description: 浠风◣鍚堣
         type: number
@@ -1569,6 +1587,8 @@
       refundTypeId:
         description: 閫�娆炬柟寮廔D
         type: integer
+      salesReturn:
+        $ref: '#/definitions/model.SalesReturn'
       sourceId:
         description: 婧愬崟id
         type: integer
@@ -1986,6 +2006,9 @@
         type: integer
       severity:
         $ref: '#/definitions/model.Severity'
+      severityId:
+        description: 涓ラ噸绋嬪害id
+        type: integer
       solution:
         description: 瑙e喅鏂规硶
         type: string
@@ -2208,8 +2231,6 @@
       client_type_id:
         description: 瀹㈡埛绫诲瀷ID
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -2356,8 +2377,6 @@
     properties:
       client_id:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -2372,6 +2391,9 @@
         type: string
       quotation_id:
         type: integer
+      sendTime:
+        description: 鍙戣揣鏃堕棿
+        type: string
       status_id:
         type: integer
     type: object
@@ -2462,6 +2484,8 @@
       clientId:
         description: 瀹㈡埛id
         type: integer
+      codeStandID:
+        type: string
       courierCompanyId:
         description: 鐗╂祦鍏徃
         type: integer
@@ -2480,6 +2504,9 @@
       invoiceTypeId:
         description: 鍙戠エ绫诲瀷id
         type: integer
+      number:
+        description: 鍙戠エ缂栧彿
+        type: string
       principalId:
         description: 閿�鍞礋璐d汉id
         type: integer
@@ -2534,8 +2561,6 @@
     properties:
       client_id:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -2614,8 +2639,6 @@
     properties:
       client_id:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -2769,8 +2792,6 @@
         type: integer
       client_id:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -2806,6 +2827,10 @@
         type: integer
       process:
         type: string
+      products:
+        items:
+          $ref: '#/definitions/model.Product'
+        type: array
       projected_amount:
         type: number
       province_id:
@@ -2853,13 +2878,14 @@
         type: string
       clientId:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
       conditions:
         type: string
+      deliverType:
+        description: 浜や粯绫诲瀷:1.涓�娆″彂璐�,2.澶氭鍙戣揣
+        type: integer
       deliveryDate:
         type: string
       logisticCompany:
@@ -2878,6 +2904,8 @@
         items:
           $ref: '#/definitions/model.Product'
         type: array
+      quotationId:
+        type: integer
       remark:
         type: string
       saleChanceId:
@@ -2893,8 +2921,6 @@
     properties:
       city_id:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -2976,8 +3002,6 @@
     properties:
       clientId:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -3053,8 +3077,6 @@
       client_type_id:
         description: 瀹㈡埛绫诲瀷ID
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -3123,8 +3145,6 @@
     properties:
       clientId:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -3170,8 +3190,6 @@
       clientId:
         description: 瀹㈡埛id
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -3226,7 +3244,7 @@
       serviceTypeId:
         description: 鏈嶅姟鏂瑰紡id
         type: integer
-      severity:
+      severityId:
         description: 涓ラ噸绋嬪害id
         type: integer
       solution:
@@ -3281,8 +3299,6 @@
     properties:
       clientId:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -3538,8 +3554,6 @@
         type: integer
       client_status_id:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         type: string
       contact_id:
@@ -3958,13 +3972,14 @@
         type: string
       clientId:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
       conditions:
         type: string
+      deliverType:
+        description: 浜や粯绫诲瀷:1.涓�娆″彂璐�,2.澶氭鍙戣揣
+        type: integer
       deliveryDate:
         type: string
       logisticCompany:
@@ -3983,6 +3998,8 @@
         items:
           $ref: '#/definitions/model.Product'
         type: array
+      quotationId:
+        type: integer
       remark:
         type: string
       saleChanceId:
@@ -4001,8 +4018,6 @@
         type: integer
       clientId:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -4038,8 +4053,6 @@
     properties:
       clientId:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -4175,8 +4188,6 @@
       client_type_id:
         description: 瀹㈡埛绫诲瀷ID
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -4379,8 +4390,6 @@
     properties:
       client_id:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -4397,6 +4406,9 @@
         type: string
       quotation_id:
         type: integer
+      sendTime:
+        description: 鍙戣揣鏃堕棿
+        type: string
       status_id:
         type: integer
     type: object
@@ -4550,6 +4562,8 @@
       clientId:
         description: 瀹㈡埛id
         type: integer
+      codeStandID:
+        type: string
       courierCompanyId:
         description: 鐗╂祦鍏徃
         type: integer
@@ -4570,6 +4584,9 @@
       invoiceTypeId:
         description: 鍙戠エ绫诲瀷id
         type: integer
+      number:
+        description: 鍙戠エ缂栧彿
+        type: string
       principalId:
         description: 閿�鍞礋璐d汉id
         type: integer
@@ -4649,8 +4666,6 @@
     properties:
       client_id:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -4770,8 +4785,6 @@
     properties:
       client_id:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -5008,8 +5021,6 @@
         type: integer
       client_id:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -5047,6 +5058,10 @@
         type: integer
       process:
         type: string
+      products:
+        items:
+          $ref: '#/definitions/model.Product'
+        type: array
       projected_amount:
         type: number
       province_id:
@@ -5123,8 +5138,6 @@
     properties:
       city_id:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -5293,8 +5306,6 @@
     properties:
       clientId:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -5384,8 +5395,6 @@
       client_type_id:
         description: 瀹㈡埛绫诲瀷ID
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -5454,8 +5463,6 @@
     properties:
       clientId:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -5503,8 +5510,6 @@
       clientId:
         description: 瀹㈡埛id
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -5561,7 +5566,7 @@
       serviceTypeId:
         description: 鏈嶅姟鏂瑰紡id
         type: integer
-      severity:
+      severityId:
         description: 涓ラ噸绋嬪害id
         type: integer
       solution:
@@ -5640,8 +5645,6 @@
     properties:
       clientId:
         type: integer
-      codeRule:
-        $ref: '#/definitions/code.CodeStandard'
       codeStandID:
         description: 缂栫爜id
         type: string
@@ -7013,6 +7016,25 @@
       summary: 鏇存柊瀹㈡埛绫诲瀷
       tags:
       - ClientType
+  /api/code/getAutoCode:
+    post:
+      parameters:
+      - description: 鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/code.CodeStandard'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/response.ListResponse'
+      summary: 鑾峰彇鑷姩缂栫爜
+      tags:
+      - 缂栫爜
   /api/code/getCodeList:
     get:
       parameters:
diff --git a/model/SalesReturnProduct.go b/model/SalesReturnProduct.go
index 35bb297..07374d0 100644
--- a/model/SalesReturnProduct.go
+++ b/model/SalesReturnProduct.go
@@ -9,22 +9,23 @@
 type (
 	// SalesReturnProduct 鏈嶅姟鍚堝悓鍜屼骇鍝佸叧鑱�
 	SalesReturnProduct struct {
-		SalesReturnId int  `json:"id" gorm:"column:service_contract_id;type:int;primary_key;not null;default:0"`
+		SalesReturnId int  `json:"id" gorm:"column:sales_return_id;type:int;primary_key;not null;default:0"`
 		ProductId     uint `json:"name" gorm:"primary_key;column:product_id;type:int;not null;default:0;comment:浜у搧id"`
 	}
 
 	// SalesReturnProductSearch 閿�鍞槑缁嗗拰浜у搧鍏宠仈鎼滅储鏉′欢
 	SalesReturnProductSearch struct {
 		SalesReturnProduct
-		Orm      *gorm.DB
-		Keyword  string
-		PageNum  int
-		PageSize int
+		Orm        *gorm.DB
+		Keyword    string
+		PageNum    int
+		PageSize   int
+		ProductIds []uint
 	}
 )
 
 func (SalesReturnProduct) TableName() string {
-	return "service_contract_product"
+	return "sales_return_product"
 }
 
 func NewSalesReturnProductSearch() *SalesReturnProductSearch {
@@ -35,10 +36,18 @@
 
 func (slf *SalesReturnProductSearch) build() *gorm.DB {
 	var db = slf.Orm.Model(&SalesReturnProduct{})
+	if len(slf.ProductIds) > 0 {
+		db = db.Where("product_id in (?)", slf.ProductIds)
+	}
 
 	return db
 }
 
+func (slf *SalesReturnProductSearch) SetProductIds(ids []uint) *SalesReturnProductSearch {
+	slf.ProductIds = ids
+	return slf
+}
+
 func (slf *SalesReturnProductSearch) Create(record *SalesReturnProduct) error {
 	var db = slf.build()
 	return db.Create(record).Error
diff --git a/model/client.go b/model/client.go
index ca7509a..590c079 100644
--- a/model/client.go
+++ b/model/client.go
@@ -3,6 +3,7 @@
 import (
 	"aps_crm/constvar"
 	"aps_crm/pkg/mysqlx"
+	"fmt"
 	"gorm.io/gorm"
 	"time"
 )
@@ -69,6 +70,9 @@
 	}
 	if slf.Name != "" {
 		db.Where("name = ?", slf.Name)
+	}
+	if slf.Number != "" {
+		db.Where("number = ?", slf.Number)
 	}
 
 	if len(slf.SearchMap) > 0 {
@@ -196,6 +200,30 @@
 	return db.Updates(data).Error
 }
 
+func (slf *ClientSearch) Count() (int64, error) {
+	var db = slf.build()
+	var total int64
+	err := db.Count(&total).Error
+	return total, err
+}
+
+func (slf *ClientSearch) MaxAutoIncr() (int, error) {
+	type Result struct {
+		Max int
+	}
+
+	var (
+		result Result
+		db     = slf.build()
+	)
+
+	err := db.Select("MAX(id) as max").Scan(&result).Error
+	if err != nil {
+		return result.Max, fmt.Errorf("max err: %v", err)
+	}
+	return result.Max, nil
+}
+
 func (slf *ClientSearch) SetPage(page, size int) *ClientSearch {
 	slf.PageNum, slf.PageSize = page, size
 	return slf
diff --git a/model/contract.go b/model/contract.go
index 93519c3..91e50e8 100644
--- a/model/contract.go
+++ b/model/contract.go
@@ -2,6 +2,7 @@
 
 import (
 	"aps_crm/pkg/mysqlx"
+	"fmt"
 	"gorm.io/gorm"
 )
 
@@ -21,6 +22,7 @@
 		File                  string                `json:"file" gorm:"column:file;type:varchar(255);comment:鍚堝悓鏂囦欢"`
 		CreatedAt             *CustomTime           `json:"created_at" gorm:"column:created_at;type:datetime;comment:鍒涘缓鏃堕棿"`
 		CodeStandID           string                `json:"codeStandID" gorm:"column:code_stand_id;type:varchar(255);comment:缂栫爜id"`
+		SendTime              string                `json:"sendTime" gorm:"column:send_time;type:varchar(255);comment:鍙戣揣鏃堕棿"`
 		gormModel
 	}
 
@@ -50,6 +52,9 @@
 
 	if slf.Id != 0 {
 		db = db.Where("id = ?", slf.Id)
+	}
+	if slf.Number != "" {
+		db = db.Where("number = ?", slf.Number)
 	}
 
 	if len(slf.SearchMap) > 0 {
@@ -123,6 +128,30 @@
 	return records, total, err
 }
 
+func (slf *ContractSearch) Count() (int64, error) {
+	var db = slf.build()
+	var total int64
+	err := db.Count(&total).Error
+	return total, err
+}
+
+func (slf *ContractSearch) MaxAutoIncr() (int, error) {
+	type Result struct {
+		Max int
+	}
+
+	var (
+		result Result
+		db     = slf.build()
+	)
+
+	err := db.Select("MAX(id) as max").Scan(&result).Error
+	if err != nil {
+		return result.Max, fmt.Errorf("max err: %v", err)
+	}
+	return result.Max, nil
+}
+
 func (slf *ContractSearch) SetId(id int) *ContractSearch {
 	slf.Id = id
 	return slf
@@ -146,6 +175,12 @@
 	slf.Orm = slf.Orm.Where("id in (?)", ids)
 	return slf
 }
+
+func (slf *ContractSearch) SetNumber(number string) *ContractSearch {
+	slf.Number = number
+	return slf
+}
+
 func (slf *ContractSearch) UpdateByMap(data map[string]interface{}) error {
 	var db = slf.build()
 	return db.Updates(data).Error
diff --git a/model/followRecord.go b/model/followRecord.go
index 58bbb30..afc27cb 100644
--- a/model/followRecord.go
+++ b/model/followRecord.go
@@ -2,6 +2,7 @@
 
 import (
 	"aps_crm/pkg/mysqlx"
+	"fmt"
 	"gorm.io/gorm"
 )
 
@@ -61,6 +62,9 @@
 	}
 	if slf.ClientId != 0 {
 		db = db.Where("client_id = ?", slf.ClientId)
+	}
+	if slf.Number != "" {
+		db = db.Where("number = ?", slf.Number)
 	}
 
 	if len(slf.SearchMap) > 0 {
@@ -130,12 +134,6 @@
 	return records, total, err
 }
 
-func (slf *FollowRecordSearch) Count() (int64, error) {
-	var count int64
-	err := slf.build().Count(&count).Error
-	return count, err
-}
-
 func (slf *FollowRecordSearch) Page(page, pageSize int) ([]*FollowRecord, int64, error) {
 	var records = make([]*FollowRecord, 0)
 	var count int64
@@ -160,6 +158,30 @@
 func (slf *FollowRecordSearch) Delete() error {
 	var db = slf.build()
 	return db.Delete(&slf.FollowRecord).Error
+}
+
+func (slf *FollowRecordSearch) Count() (int64, error) {
+	var db = slf.build()
+	var total int64
+	err := db.Count(&total).Error
+	return total, err
+}
+
+func (slf *FollowRecordSearch) MaxAutoIncr() (int, error) {
+	type Result struct {
+		Max int
+	}
+
+	var (
+		result Result
+		db     = slf.build()
+	)
+
+	err := db.Select("MAX(id) as max").Scan(&result).Error
+	if err != nil {
+		return result.Max, fmt.Errorf("max err: %v", err)
+	}
+	return result.Max, nil
 }
 
 func (slf *FollowRecordSearch) SetId(id int) *FollowRecordSearch {
@@ -199,3 +221,8 @@
 	slf.Orm = tx
 	return slf
 }
+
+func (slf *FollowRecordSearch) SetNumber(number string) *FollowRecordSearch {
+	slf.Number = number
+	return slf
+}
diff --git a/model/invoice.go b/model/invoice.go
index 48ddcd2..0db64fa 100644
--- a/model/invoice.go
+++ b/model/invoice.go
@@ -12,6 +12,7 @@
 	// Invoice 閿�鍞彂绁�
 	Invoice struct {
 		Id               int                        `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
+		Number           string                     `json:"number" gorm:"column:number;type:varchar(255);comment:鍙戠エ缂栧彿"`
 		ClientId         int                        `gorm:"client_id" json:"clientId"` // 瀹㈡埛id
 		Client           Client                     `gorm:"foreignKey:ClientId"`
 		InvoiceTypeId    int                        `gorm:"invoice_type_id" json:"invoiceTypeId"` // 鍙戠エ绫诲瀷id
@@ -29,6 +30,7 @@
 		CourierCompanyId int                        `gorm:"courier_company_id" json:"courierCompanyId"` // 鐗╂祦鍏徃
 		CourierCompany   CourierCompany             `gorm:"foreignKey:CourierCompanyId"`
 		Products         []*Product                 `json:"products" gorm:"many2many:invoice_product;"`
+		CodeStandID      string                     `json:"codeStandID" gorm:"column:code_stand_id;type:varchar(255);comment:缂栫爜id"`
 	}
 
 	// InvoiceSearch 閿�鍞彂绁ㄦ悳绱㈡潯浠�
@@ -76,6 +78,9 @@
 	if slf.SourceId > 0 {
 		db = db.Where("source_id = ?", slf.SourceId)
 	}
+	if slf.Number != "" {
+		db.Where("number = ?", slf.Number)
+	}
 
 	return db
 }
@@ -107,6 +112,35 @@
 	return record, err
 }
 
+func (slf *InvoiceSearch) Count() (int64, error) {
+	var db = slf.build()
+	var total int64
+	err := db.Count(&total).Error
+	return total, err
+}
+
+func (slf *InvoiceSearch) MaxAutoIncr() (int, error) {
+	type Result struct {
+		Max int
+	}
+
+	var (
+		result Result
+		db     = slf.build()
+	)
+
+	err := db.Select("MAX(id) as max").Scan(&result).Error
+	if err != nil {
+		return result.Max, fmt.Errorf("max err: %v", err)
+	}
+	return result.Max, nil
+}
+
+func (slf *InvoiceSearch) SetNumber(number string) *InvoiceSearch {
+	slf.Number = number
+	return slf
+}
+
 func (slf *InvoiceSearch) SetId(id int) *InvoiceSearch {
 	slf.Id = id
 	return slf
diff --git a/model/masterOrder.go b/model/masterOrder.go
index ac02f01..112d16f 100644
--- a/model/masterOrder.go
+++ b/model/masterOrder.go
@@ -2,6 +2,7 @@
 
 import (
 	"aps_crm/pkg/mysqlx"
+	"fmt"
 	"gorm.io/gorm"
 )
 
@@ -47,6 +48,9 @@
 	var db = slf.Orm.Model(&MasterOrder{})
 	if slf.Id != 0 {
 		db = db.Where("id = ?", slf.Id)
+	}
+	if slf.Number != "" {
+		db = db.Where("number = ?", slf.Number)
 	}
 
 	if len(slf.SearchMap) > 0 {
@@ -112,6 +116,30 @@
 	return records, total, err
 }
 
+func (slf *MasterOrderSearch) Count() (int64, error) {
+	var db = slf.build()
+	var total int64
+	err := db.Count(&total).Error
+	return total, err
+}
+
+func (slf *MasterOrderSearch) MaxAutoIncr() (int, error) {
+	type Result struct {
+		Max int
+	}
+
+	var (
+		result Result
+		db     = slf.build()
+	)
+
+	err := db.Select("MAX(id) as max").Scan(&result).Error
+	if err != nil {
+		return result.Max, fmt.Errorf("max err: %v", err)
+	}
+	return result.Max, nil
+}
+
 func (slf *MasterOrderSearch) SetId(id int) *MasterOrderSearch {
 	slf.Id = id
 	return slf
@@ -136,6 +164,11 @@
 	return slf
 }
 
+func (slf *MasterOrderSearch) SetNumber(number string) *MasterOrderSearch {
+	slf.Number = number
+	return slf
+}
+
 func (slf *MasterOrderSearch) UpdateByMap(data map[string]interface{}) error {
 	var db = slf.build()
 	return db.Updates(data).Error
diff --git a/model/quotation.go b/model/quotation.go
index 4aff38e..969d34f 100644
--- a/model/quotation.go
+++ b/model/quotation.go
@@ -2,6 +2,7 @@
 
 import (
 	"aps_crm/pkg/mysqlx"
+	"fmt"
 	"gorm.io/gorm"
 )
 
@@ -58,6 +59,9 @@
 	var db = slf.Orm.Model(&Quotation{})
 	if slf.Id != 0 {
 		db = db.Where("id = ?", slf.Id)
+	}
+	if slf.Number != "" {
+		db = db.Where("number = ?", slf.Number)
 	}
 
 	if len(slf.SearchMap) > 0 {
@@ -128,6 +132,30 @@
 	return records, total, err
 }
 
+func (slf *QuotationSearch) Count() (int64, error) {
+	var db = slf.build()
+	var total int64
+	err := db.Count(&total).Error
+	return total, err
+}
+
+func (slf *QuotationSearch) MaxAutoIncr() (int, error) {
+	type Result struct {
+		Max int
+	}
+
+	var (
+		result Result
+		db     = slf.build()
+	)
+
+	err := db.Select("MAX(id) as max").Scan(&result).Error
+	if err != nil {
+		return result.Max, fmt.Errorf("max err: %v", err)
+	}
+	return result.Max, nil
+}
+
 func (slf *QuotationSearch) SetId(id int) *QuotationSearch {
 	slf.Id = id
 	return slf
@@ -152,6 +180,11 @@
 	slf.SearchMap = searchMap
 	return slf
 }
+
+func (slf *QuotationSearch) SetNumber(number string) *QuotationSearch {
+	slf.Number = number
+	return slf
+}
 func (slf *QuotationSearch) SetIds(ids []int) *QuotationSearch {
 	slf.Orm = slf.Orm.Where("id in (?)", ids)
 	return slf
diff --git a/model/request/client.go b/model/request/client.go
index 08b32ea..089f98e 100644
--- a/model/request/client.go
+++ b/model/request/client.go
@@ -1,29 +1,26 @@
 package request
 
-import "aps_crm/proto/code"
-
 type AddClient struct {
 	Client
 }
 
 type Client struct {
-	Name              string            `json:"name"`                // 鍏徃鍚嶇О
-	Number            string            `json:"number"`              // 鍏徃缂栧彿
-	ClientStatusId    int               `json:"client_status_id"`    // 瀹㈡埛鐘舵�両D
-	ClientTypeId      int               `json:"client_type_id"`      // 瀹㈡埛绫诲瀷ID
-	ClientOriginId    int               `json:"client_origin_id"`    // 瀹㈡埛鏉ユ簮ID
-	ClientLevelId     int               `json:"client_level_id"`     // 瀹㈡埛绛夌骇ID
-	MemberId          int               `json:"member_id"`           // 閿�鍞礋璐d汉ID
-	ServiceMemberId   int               `json:"service_member_id"`   // 鏈嶅姟璐熻矗浜篒D
-	DetailAddress     string            `json:"detail_address"`      // 璇︾粏鍦板潃
-	Remark            string            `json:"remark"`              // 澶囨敞
-	NextVisitTime     string            `json:"next_visit_time"`     // 涓嬫鍥炶鏃堕棿
-	LatestServiceTime string            `json:"latest_service_time"` // 鏈�鏅氭湇鍔℃椂闂�
-	Contact           Contact           `json:"contact"`
-	SalesLeadsId      int               `json:"sales_leads_id"` // 閿�鍞嚎绱D
-	ContactId         int               `json:"contact_id"`     // 鑱旂郴浜篒D
-	CodeStandID       string            `json:"codeStandID"`    //缂栫爜id
-	CodeRule          code.CodeStandard `json:"codeRule"`
+	Name              string  `json:"name"`                // 鍏徃鍚嶇О
+	Number            string  `json:"number"`              // 鍏徃缂栧彿
+	ClientStatusId    int     `json:"client_status_id"`    // 瀹㈡埛鐘舵�両D
+	ClientTypeId      int     `json:"client_type_id"`      // 瀹㈡埛绫诲瀷ID
+	ClientOriginId    int     `json:"client_origin_id"`    // 瀹㈡埛鏉ユ簮ID
+	ClientLevelId     int     `json:"client_level_id"`     // 瀹㈡埛绛夌骇ID
+	MemberId          int     `json:"member_id"`           // 閿�鍞礋璐d汉ID
+	ServiceMemberId   int     `json:"service_member_id"`   // 鏈嶅姟璐熻矗浜篒D
+	DetailAddress     string  `json:"detail_address"`      // 璇︾粏鍦板潃
+	Remark            string  `json:"remark"`              // 澶囨敞
+	NextVisitTime     string  `json:"next_visit_time"`     // 涓嬫鍥炶鏃堕棿
+	LatestServiceTime string  `json:"latest_service_time"` // 鏈�鏅氭湇鍔℃椂闂�
+	Contact           Contact `json:"contact"`
+	SalesLeadsId      int     `json:"sales_leads_id"` // 閿�鍞嚎绱D
+	ContactId         int     `json:"contact_id"`     // 鑱旂郴浜篒D
+	CodeStandID       string  `json:"codeStandID"`    //缂栫爜id
 	Address
 	Business
 }
diff --git a/model/request/contract.go b/model/request/contract.go
index 8285425..ef09ea2 100644
--- a/model/request/contract.go
+++ b/model/request/contract.go
@@ -1,21 +1,19 @@
 package request
 
-import "aps_crm/proto/code"
-
 type AddContract struct {
 	Contract
 }
 
 type Contract struct {
-	ContractName string            `json:"contractName"` //鍚堝悓鍚嶇О
-	ClientId     int               `json:"client_id"`
-	MemberId     int               `json:"member_id"`
-	Number       string            `json:"number"`
-	QuotationId  int               `json:"quotation_id"`
-	StatusId     int               `json:"status_id"`
-	File         string            `json:"file"`
-	CodeStandID  string            `json:"codeStandID"` //缂栫爜id
-	CodeRule     code.CodeStandard `json:"codeRule"`
+	ContractName string `json:"contractName"` //鍚堝悓鍚嶇О
+	ClientId     int    `json:"client_id"`
+	MemberId     int    `json:"member_id"`
+	Number       string `json:"number"`
+	QuotationId  int    `json:"quotation_id"`
+	StatusId     int    `json:"status_id"`
+	File         string `json:"file"`
+	CodeStandID  string `json:"codeStandID"` //缂栫爜id
+	SendTime     string `json:"sendTime"`    //鍙戣揣鏃堕棿
 }
 
 type UpdateContract struct {
diff --git a/model/request/followRecord.go b/model/request/followRecord.go
index e84169d..ddd82ae 100644
--- a/model/request/followRecord.go
+++ b/model/request/followRecord.go
@@ -1,28 +1,25 @@
 package request
 
-import "aps_crm/proto/code"
-
 type AddFollowRecord struct {
 	FollowRecord FollowRecord `json:"follow_record" binding:"required"`
 }
 
 type FollowRecord struct {
-	ClientId             int               `json:"client_id" gorm:"column:client_id;type:int(11);comment:瀹㈡埛id"`
-	ClientStatusId       int               `json:"client_status_id" gorm:"column:client_status_id;type:int(11);comment:瀹㈡埛鐘舵�乮d"`
-	MemberId             int               `json:"member_id" gorm:"column:member_id;type:int(11);comment:璺熻繘浜篿d"`
-	Number               string            `json:"number" gorm:"column:number;type:varchar(255);comment:璺熻繘缂栧彿"`
-	ContactId            int               `json:"contact_id" gorm:"column:contact_id;type:int(11);comment:鑱旂郴浜篿d"`
-	Topic                string            `json:"topic" gorm:"column:topic;type:varchar(255);comment:璺熻繘涓婚"`
-	Record               string            `json:"record" gorm:"column:record;type:MEDIUMTEXT;comment:璺熻繘璁板綍"`
-	SaleChanceId         int               `json:"sale_chance_id" gorm:"column:sale_chance_id;type:int(11);comment:閿�鍞満浼歩d"`
-	SalesLeadsId         int               `json:"sales_leads_id" gorm:"column:sales_leads_id;type:int(11);comment:閿�鍞嚎绱d"`
-	ContactInformationId int               `json:"contact_information_id" gorm:"column:contact_information_id;type:int(11);comment:鑱旂郴鏂瑰紡id"`
-	FollowTime           string            `json:"follow_time" gorm:"column:follow_time;type:datetime;comment:璺熻繘鏃堕棿"`
-	NextFollowTime       string            `json:"next_follow_time" gorm:"column:next_follow_time;type:datetime;comment:涓嬫璺熻繘鏃堕棿"`
-	Purpose              string            `json:"purpose" gorm:"column:purpose;type:varchar(255);comment:璺熻繘鐩殑"`
-	Content              string            `json:"content" gorm:"column:content;type:varchar(255);comment:璺熻繘鍐呭"`
-	CodeStandID          string            `json:"codeStandID" gorm:"column:code_stand_id;type:varchar(255);comment:缂栫爜id"`
-	CodeRule             code.CodeStandard `json:"codeRule"`
+	ClientId             int    `json:"client_id" gorm:"column:client_id;type:int(11);comment:瀹㈡埛id"`
+	ClientStatusId       int    `json:"client_status_id" gorm:"column:client_status_id;type:int(11);comment:瀹㈡埛鐘舵�乮d"`
+	MemberId             int    `json:"member_id" gorm:"column:member_id;type:int(11);comment:璺熻繘浜篿d"`
+	Number               string `json:"number" gorm:"column:number;type:varchar(255);comment:璺熻繘缂栧彿"`
+	ContactId            int    `json:"contact_id" gorm:"column:contact_id;type:int(11);comment:鑱旂郴浜篿d"`
+	Topic                string `json:"topic" gorm:"column:topic;type:varchar(255);comment:璺熻繘涓婚"`
+	Record               string `json:"record" gorm:"column:record;type:MEDIUMTEXT;comment:璺熻繘璁板綍"`
+	SaleChanceId         int    `json:"sale_chance_id" gorm:"column:sale_chance_id;type:int(11);comment:閿�鍞満浼歩d"`
+	SalesLeadsId         int    `json:"sales_leads_id" gorm:"column:sales_leads_id;type:int(11);comment:閿�鍞嚎绱d"`
+	ContactInformationId int    `json:"contact_information_id" gorm:"column:contact_information_id;type:int(11);comment:鑱旂郴鏂瑰紡id"`
+	FollowTime           string `json:"follow_time" gorm:"column:follow_time;type:datetime;comment:璺熻繘鏃堕棿"`
+	NextFollowTime       string `json:"next_follow_time" gorm:"column:next_follow_time;type:datetime;comment:涓嬫璺熻繘鏃堕棿"`
+	Purpose              string `json:"purpose" gorm:"column:purpose;type:varchar(255);comment:璺熻繘鐩殑"`
+	Content              string `json:"content" gorm:"column:content;type:varchar(255);comment:璺熻繘鍐呭"`
+	CodeStandID          string `json:"codeStandID" gorm:"column:code_stand_id;type:varchar(255);comment:缂栫爜id"`
 }
 
 type UpdateFollowRecord struct {
diff --git a/model/request/invoice.go b/model/request/invoice.go
index 4e7c7e6..fa08e2f 100644
--- a/model/request/invoice.go
+++ b/model/request/invoice.go
@@ -6,36 +6,40 @@
 )
 
 type AddInvoice struct {
-	ClientId         int                        `gorm:"client_id" json:"clientId"`                  // 瀹㈡埛id
-	InvoiceTypeId    int                        `gorm:"invoice_type_id" json:"invoiceTypeId"`       // 鍙戠エ绫诲瀷id
-	PrincipalId      int                        `gorm:"principal_id" json:"principalId"`            // 閿�鍞礋璐d汉id
-	Subject          string                     `gorm:"subject" json:"subject"`                     // 涓婚
-	InvoiceStatusId  int                        `gorm:"invoice_status_id" json:"invoiceStatusId"`   // 鍙戠エ鐘舵�乮d
-	SourceType       constvar.InvoiceSourceType `gorm:"source_type" json:"sourceType"`              // 婧愬崟绫诲瀷(1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓)
-	SourceId         int                        `gorm:"source_id" json:"sourceId"`                  // 婧愬崟id
-	TaxpayerIdNumber string                     `gorm:"taxpayer_id_number" json:"taxpayerIdNumber"` // 绾崇◣璇嗗埆鍙�
-	InvoiceNumber    string                     `gorm:"invoice_number" json:"invoiceNumber"`        // 鍙戠エ鍙风爜
-	InvoiceDate      string                     `gorm:"invoice_date" json:"invoiceDate"`            // 寮�绁ㄦ棩鏈�
-	CourierNumber    string                     `gorm:"courier_number" json:"courierNumber"`        // 鐗╂祦鍗曞彿
-	CourierCompanyId int                        `gorm:"courier_company_id" json:"courierCompanyId"` // 鐗╂祦鍏徃
-	Products         []model.Product            `json:"products"`                                   //鍙戠エ瀵瑰簲浜у搧锛屼粠鐩稿簲婧愬崟閲岃幏鍙�
+	Number           string                     `json:"number" gorm:"column:number;type:varchar(255);comment:鍙戠エ缂栧彿"` //鍙戠エ缂栧彿
+	ClientId         int                        `gorm:"client_id" json:"clientId"`                                  // 瀹㈡埛id
+	InvoiceTypeId    int                        `gorm:"invoice_type_id" json:"invoiceTypeId"`                       // 鍙戠エ绫诲瀷id
+	PrincipalId      int                        `gorm:"principal_id" json:"principalId"`                            // 閿�鍞礋璐d汉id
+	Subject          string                     `gorm:"subject" json:"subject"`                                     // 涓婚
+	InvoiceStatusId  int                        `gorm:"invoice_status_id" json:"invoiceStatusId"`                   // 鍙戠エ鐘舵�乮d
+	SourceType       constvar.InvoiceSourceType `gorm:"source_type" json:"sourceType"`                              // 婧愬崟绫诲瀷(1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓)
+	SourceId         int                        `gorm:"source_id" json:"sourceId"`                                  // 婧愬崟id
+	TaxpayerIdNumber string                     `gorm:"taxpayer_id_number" json:"taxpayerIdNumber"`                 // 绾崇◣璇嗗埆鍙�
+	InvoiceNumber    string                     `gorm:"invoice_number" json:"invoiceNumber"`                        // 鍙戠エ鍙风爜
+	InvoiceDate      string                     `gorm:"invoice_date" json:"invoiceDate"`                            // 寮�绁ㄦ棩鏈�
+	CourierNumber    string                     `gorm:"courier_number" json:"courierNumber"`                        // 鐗╂祦鍗曞彿
+	CourierCompanyId int                        `gorm:"courier_company_id" json:"courierCompanyId"`                 // 鐗╂祦鍏徃
+	Products         []model.Product            `json:"products"`                                                   //鍙戠エ瀵瑰簲浜у搧锛屼粠鐩稿簲婧愬崟閲岃幏鍙�
+	CodeStandID      string                     `json:"codeStandID" gorm:"column:code_stand_id;type:varchar(255);comment:缂栫爜id"`
 }
 
 type UpdateInvoice struct {
 	Id               int             `json:"id" binding:"required"`
-	ClientId         int             `gorm:"client_id" json:"clientId"`                  // 瀹㈡埛id
-	InvoiceTypeId    int             `gorm:"invoice_type_id" json:"invoiceTypeId"`       // 鍙戠エ绫诲瀷id
-	PrincipalId      int             `gorm:"principal_id" json:"principalId"`            // 閿�鍞礋璐d汉id
-	Subject          string          `gorm:"subject" json:"subject"`                     // 涓婚
-	InvoiceStatusId  int             `gorm:"invoice_status_id" json:"invoiceStatusId"`   // 鍙戠エ鐘舵�乮d
-	SourceType       int             `gorm:"source_type" json:"sourceType"`              // 婧愬崟绫诲瀷(1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓)
-	SourceId         int             `gorm:"source_id" json:"sourceId"`                  // 婧愬崟id
-	TaxpayerIdNumber string          `gorm:"taxpayer_id_number" json:"taxpayerIdNumber"` // 绾崇◣璇嗗埆鍙�
-	InvoiceNumber    string          `gorm:"invoice_number" json:"invoiceNumber"`        // 鍙戠エ鍙风爜
-	InvoiceDate      int             `gorm:"invoice_date" json:"invoiceDate"`            // 寮�绁ㄦ棩鏈�
-	CourierNumber    string          `gorm:"courier_number" json:"courierNumber"`        // 鐗╂祦鍗曞彿
-	CourierCompanyId int             `gorm:"courier_company_id" json:"courierCompanyId"` // 鐗╂祦鍏徃
-	Products         []model.Product `json:"products"`                                   //鍙戠エ瀵瑰簲浜у搧锛屼粠鐩稿簲婧愬崟閲岃幏鍙�
+	Number           string          `json:"number" gorm:"column:number;type:varchar(255);comment:鍙戠エ缂栧彿"` //鍙戠エ缂栧彿
+	ClientId         int             `gorm:"client_id" json:"clientId"`                                  // 瀹㈡埛id
+	InvoiceTypeId    int             `gorm:"invoice_type_id" json:"invoiceTypeId"`                       // 鍙戠エ绫诲瀷id
+	PrincipalId      int             `gorm:"principal_id" json:"principalId"`                            // 閿�鍞礋璐d汉id
+	Subject          string          `gorm:"subject" json:"subject"`                                     // 涓婚
+	InvoiceStatusId  int             `gorm:"invoice_status_id" json:"invoiceStatusId"`                   // 鍙戠エ鐘舵�乮d
+	SourceType       int             `gorm:"source_type" json:"sourceType"`                              // 婧愬崟绫诲瀷(1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓)
+	SourceId         int             `gorm:"source_id" json:"sourceId"`                                  // 婧愬崟id
+	TaxpayerIdNumber string          `gorm:"taxpayer_id_number" json:"taxpayerIdNumber"`                 // 绾崇◣璇嗗埆鍙�
+	InvoiceNumber    string          `gorm:"invoice_number" json:"invoiceNumber"`                        // 鍙戠エ鍙风爜
+	InvoiceDate      int             `gorm:"invoice_date" json:"invoiceDate"`                            // 寮�绁ㄦ棩鏈�
+	CourierNumber    string          `gorm:"courier_number" json:"courierNumber"`                        // 鐗╂祦鍗曞彿
+	CourierCompanyId int             `gorm:"courier_company_id" json:"courierCompanyId"`                 // 鐗╂祦鍏徃
+	Products         []model.Product `json:"products"`                                                   //鍙戠エ瀵瑰簲浜у搧锛屼粠鐩稿簲婧愬崟閲岃幏鍙�
+	CodeStandID      string          `json:"codeStandID" gorm:"column:code_stand_id;type:varchar(255);comment:缂栫爜id"`
 }
 
 type GetInvoiceList struct {
diff --git a/model/request/masterOrder.go b/model/request/masterOrder.go
index 00317c8..22f8393 100644
--- a/model/request/masterOrder.go
+++ b/model/request/masterOrder.go
@@ -1,20 +1,17 @@
 package request
 
-import "aps_crm/proto/code"
-
 type AddMasterOrder struct {
 	MasterOrder
 }
 
 type MasterOrder struct {
-	Number      string            `json:"number"`
-	ClientId    int               `json:"client_id"`
-	MemberId    int               `json:"member_id"`
-	StartTime   string            `json:"start_time"`
-	EndTime     string            `json:"end_time"`
-	Money       float64           `json:"money"`
-	CodeStandID string            `json:"codeStandID"` //缂栫爜id
-	CodeRule    code.CodeStandard `json:"codeRule"`
+	Number      string  `json:"number"`
+	ClientId    int     `json:"client_id"`
+	MemberId    int     `json:"member_id"`
+	StartTime   string  `json:"start_time"`
+	EndTime     string  `json:"end_time"`
+	Money       float64 `json:"money"`
+	CodeStandID string  `json:"codeStandID"` //缂栫爜id
 }
 
 type UpdateMasterOrder struct {
diff --git a/model/request/quotation.go b/model/request/quotation.go
index a0d1425..87ea612 100644
--- a/model/request/quotation.go
+++ b/model/request/quotation.go
@@ -2,7 +2,6 @@
 
 import (
 	"aps_crm/model"
-	"aps_crm/proto/code"
 )
 
 type AddQuotation struct {
@@ -10,19 +9,18 @@
 }
 
 type Quotation struct {
-	QuotationName     string            `json:"quotationName"` //鎶ヤ环鍗曞悕绉�
-	ClientId          int               `json:"client_id"`
-	Number            string            `json:"number"`
-	QuotationStatusId int               `json:"quotation_status_id"`
-	ValidityDate      string            `json:"validity_date"`
-	ContactId         int               `json:"contact_id"`
-	MemberId          int               `json:"member_id"`
-	SaleChanceId      int               `json:"sale_chance_id"`
-	Conditions        string            `json:"conditions"`
-	File              string            `json:"file"`
-	CodeStandID       string            `json:"codeStandID"` //缂栫爜id
-	CodeRule          code.CodeStandard `json:"codeRule"`
-	Products          []model.Product   `json:"products"`
+	QuotationName     string          `json:"quotationName"` //鎶ヤ环鍗曞悕绉�
+	ClientId          int             `json:"client_id"`
+	Number            string          `json:"number"`
+	QuotationStatusId int             `json:"quotation_status_id"`
+	ValidityDate      string          `json:"validity_date"`
+	ContactId         int             `json:"contact_id"`
+	MemberId          int             `json:"member_id"`
+	SaleChanceId      int             `json:"sale_chance_id"`
+	Conditions        string          `json:"conditions"`
+	File              string          `json:"file"`
+	CodeStandID       string          `json:"codeStandID"` //缂栫爜id
+	Products          []model.Product `json:"products"`
 }
 
 type UpdateQuotation struct {
diff --git a/model/request/saleChance.go b/model/request/saleChance.go
index 20d4619..05c8aa6 100644
--- a/model/request/saleChance.go
+++ b/model/request/saleChance.go
@@ -1,43 +1,45 @@
 package request
 
-import "aps_crm/proto/code"
+import (
+	"aps_crm/model"
+)
 
 type AddSaleChance struct {
 	SaleChance
 }
 
 type SaleChance struct {
-	Name               string            `json:"name"`
-	ClientId           int               `json:"client_id"`
-	Number             string            `json:"number"`
-	ContactId          int               `json:"contact_id"`
-	SalesSourcesId     int               `json:"sales_sources_id"`
-	SaleTypeId         int               `json:"sale_type_id"`
-	SaleStageId        int               `json:"sale_stage_id"`
-	MemberId           int               `json:"member_id"`
-	RegularCustomersId int               `json:"regular_customers_id"`
-	Competitors        string            `json:"competitors"`
-	Possibilities      int               `json:"possibilities"`
-	Budget             float64           `json:"budget"`
-	ProjectedAmount    float64           `json:"projected_amount"`
-	Currency           int               `json:"currency"`
-	ExpectedTime       string            `json:"expected_time"`
-	StatusId           int               `json:"status_id"`
-	PainPoints         string            `json:"pain_points"`
-	WhetherEstablished string            `json:"whether_established"`
-	CapitalBudget      string            `json:"capital_budget"`
-	KeyMaker           string            `json:"key_maker"`
-	KeyFactors         string            `json:"key_factors"`
-	Process            string            `json:"process"`
-	Solutions          string            `json:"solutions"`
-	Advantages         string            `json:"advantages"`
-	Disadvantages      string            `json:"disadvantages"`
-	Opportunities      string            `json:"opportunities"`
-	Threats            string            `json:"threats"`
-	Remark             string            `json:"remark"`
-	DetailAddress      string            `json:"detail_address"`
-	CodeStandID        string            `json:"codeStandID"` //缂栫爜id
-	CodeRule           code.CodeStandard `json:"codeRule"`
+	Name               string           `json:"name"`
+	ClientId           int              `json:"client_id"`
+	Number             string           `json:"number"`
+	ContactId          int              `json:"contact_id"`
+	SalesSourcesId     int              `json:"sales_sources_id"`
+	SaleTypeId         int              `json:"sale_type_id"`
+	SaleStageId        int              `json:"sale_stage_id"`
+	MemberId           int              `json:"member_id"`
+	RegularCustomersId int              `json:"regular_customers_id"`
+	Competitors        string           `json:"competitors"`
+	Possibilities      int              `json:"possibilities"`
+	Budget             float64          `json:"budget"`
+	ProjectedAmount    float64          `json:"projected_amount"`
+	Currency           int              `json:"currency"`
+	ExpectedTime       string           `json:"expected_time"`
+	StatusId           int              `json:"status_id"`
+	PainPoints         string           `json:"pain_points"`
+	WhetherEstablished string           `json:"whether_established"`
+	CapitalBudget      string           `json:"capital_budget"`
+	KeyMaker           string           `json:"key_maker"`
+	KeyFactors         string           `json:"key_factors"`
+	Process            string           `json:"process"`
+	Solutions          string           `json:"solutions"`
+	Advantages         string           `json:"advantages"`
+	Disadvantages      string           `json:"disadvantages"`
+	Opportunities      string           `json:"opportunities"`
+	Threats            string           `json:"threats"`
+	Remark             string           `json:"remark"`
+	DetailAddress      string           `json:"detail_address"`
+	CodeStandID        string           `json:"codeStandID"` //缂栫爜id
+	Products           []*model.Product `json:"products" gorm:"many2many:SaleChance_Product;"`
 	Address
 }
 
diff --git a/model/request/salesDetails.go b/model/request/salesDetails.go
index 8acf6a8..71aa235 100644
--- a/model/request/salesDetails.go
+++ b/model/request/salesDetails.go
@@ -3,7 +3,6 @@
 import (
 	"aps_crm/constvar"
 	"aps_crm/model"
-	"aps_crm/proto/code"
 )
 
 type AddSalesDetails struct {
@@ -11,25 +10,26 @@
 }
 
 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:浜よ揣鏃ユ湡"`
-	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:鐗╂祦璐圭敤"`
-	CodeStandID         string            `json:"codeStandID"` //缂栫爜id
-	CodeRule            code.CodeStandard `json:"codeRule"`
+	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:鐗╂祦璐圭敤"`
+	CodeStandID         string           `json:"codeStandID"` //缂栫爜id
+	DeliverType         int              `json:"deliverType"` //浜や粯绫诲瀷:1.涓�娆″彂璐�,2.澶氭鍙戣揣
+	QuotationId         int              `json:"quotationId" gorm:"column:quotation_id;type:int;comment:鎶ヤ环鍗昳d"`
 }
 
 type UpdateSalesDetails struct {
@@ -43,5 +43,5 @@
 	Keyword      string                           `json:"keyword"`
 	SaleChanceId int                              `json:"saleChanceId"` //閿�鍞満浼歩d
 	ClientId     int                              `json:"clientId"`     //瀹㈡埛id
-	Number       string                           `json:"number"`       //閿�鍞瓙鍗曞彿
+	Number       string                           `json:"number"`       //閿�鍞槑缁嗗崟鍙�
 }
diff --git a/model/request/salesLeads.go b/model/request/salesLeads.go
index 821be06..3c4de2f 100644
--- a/model/request/salesLeads.go
+++ b/model/request/salesLeads.go
@@ -2,7 +2,6 @@
 
 import (
 	"aps_crm/constvar"
-	"aps_crm/proto/code"
 )
 
 type AddSalesLeads struct {
@@ -10,17 +9,16 @@
 }
 
 type SalesLeads struct {
-	Name            string            `json:"name"`             // 鍏徃鍚嶇О
-	Number          string            `json:"number"`           // 閿�鍞嚎绱㈢紪鍙�
-	ContactName     string            `json:"contact_name"`     // 鑱旂郴浜哄鍚�
-	ContactPhone    string            `json:"contact_phone"`    // 鑱旂郴浜虹數璇�
-	ContactPosition string            `json:"contact_position"` // 鑱旂郴浜鸿亴浣�
-	SalesSourcesId  int               `json:"sales_sources_id"` // 鍟嗘満鏉ユ簮ID
-	MemberId        int               `json:"member_id"`        // 閿�鍞礋璐d汉ID
-	Desc            string            `json:"desc"`             // 澶囨敞
-	DetailAddress   string            `json:"detail_address"`   // 璇︾粏鍦板潃
-	CodeStandID     string            `json:"codeStandID"`      //缂栫爜id
-	CodeRule        code.CodeStandard `json:"codeRule"`
+	Name            string `json:"name"`             // 鍏徃鍚嶇О
+	Number          string `json:"number"`           // 閿�鍞嚎绱㈢紪鍙�
+	ContactName     string `json:"contact_name"`     // 鑱旂郴浜哄鍚�
+	ContactPhone    string `json:"contact_phone"`    // 鑱旂郴浜虹數璇�
+	ContactPosition string `json:"contact_position"` // 鑱旂郴浜鸿亴浣�
+	SalesSourcesId  int    `json:"sales_sources_id"` // 鍟嗘満鏉ユ簮ID
+	MemberId        int    `json:"member_id"`        // 閿�鍞礋璐d汉ID
+	Desc            string `json:"desc"`             // 澶囨敞
+	DetailAddress   string `json:"detail_address"`   // 璇︾粏鍦板潃
+	CodeStandID     string `json:"codeStandID"`      //缂栫爜id
 	Address
 }
 
diff --git a/model/request/salesRefund.go b/model/request/salesRefund.go
index 4cfb4ee..ad162bb 100644
--- a/model/request/salesRefund.go
+++ b/model/request/salesRefund.go
@@ -3,7 +3,6 @@
 import (
 	"aps_crm/constvar"
 	"aps_crm/model"
-	"aps_crm/proto/code"
 )
 
 type AddSalesRefundRequest struct {
@@ -23,7 +22,6 @@
 	Reason        string                    `json:"reason"`
 	Products      []*model.Product          `json:"products"`
 	CodeStandID   string                    `json:"codeStandID"` //缂栫爜id
-	CodeRule      code.CodeStandard         `json:"codeRule"`
 }
 
 type UpdateSalesRefundRequest struct {
diff --git a/model/request/salesReturn.go b/model/request/salesReturn.go
index 3c85395..46d706d 100644
--- a/model/request/salesReturn.go
+++ b/model/request/salesReturn.go
@@ -3,7 +3,6 @@
 import (
 	"aps_crm/constvar"
 	"aps_crm/model"
-	"aps_crm/proto/code"
 )
 
 type AddSalesReturnRequest struct {
@@ -24,7 +23,6 @@
 	Reason              string                         `json:"reason" gorm:"column:reason;type:varchar(255);comment:閫�璐у師鍥�"`                     //閫�璐у師鍥�
 	Products            []*model.Product               `json:"products" gorm:"many2many:salesReturn_product;"`                                 //閫�璐т骇鍝�
 	CodeStandID         string                         `json:"codeStandID"`                                                                    //缂栫爜id
-	CodeRule            code.CodeStandard              `json:"codeRule"`
 }
 
 type UpdateSalesReturnRequest struct {
diff --git a/model/request/serviceContract.go b/model/request/serviceContract.go
index a8ea3b5..f3cb2fe 100644
--- a/model/request/serviceContract.go
+++ b/model/request/serviceContract.go
@@ -3,7 +3,6 @@
 import (
 	"aps_crm/constvar"
 	"aps_crm/model"
-	"aps_crm/proto/code"
 )
 
 type AddServiceContract struct {
@@ -11,26 +10,25 @@
 }
 
 type ServiceContract struct {
-	ClientId                int               `json:"clientId"`
-	Number                  string            `json:"number"`
-	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"`
-	EndTime                 string            `json:"endTime"`
-	StatusId                int               `json:"statusId"`
-	ServiceTimes            int               `json:"serviceTimes"`
-	Terms                   string            `json:"terms"`
-	Remark                  string            `json:"remark"`
-	Products                []*model.Product  `json:"products"`
-	ServiceContractTypeId   int               `json:"serviceContractTypeId"`
-	ServiceContractStatusId int               `json:"serviceContractStatusId"`
-	CodeStandID             string            `json:"codeStandID"` //缂栫爜id
-	CodeRule                code.CodeStandard `json:"codeRule"`
+	ClientId                int              `json:"clientId"`
+	Number                  string           `json:"number"`
+	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"`
+	EndTime                 string           `json:"endTime"`
+	StatusId                int              `json:"statusId"`
+	ServiceTimes            int              `json:"serviceTimes"`
+	Terms                   string           `json:"terms"`
+	Remark                  string           `json:"remark"`
+	Products                []*model.Product `json:"products"`
+	ServiceContractTypeId   int              `json:"serviceContractTypeId"`
+	ServiceContractStatusId int              `json:"serviceContractStatusId"`
+	CodeStandID             string           `json:"codeStandID"` //缂栫爜id
 }
 
 type UpdateServiceContract struct {
diff --git a/model/request/serviceFollowup.go b/model/request/serviceFollowup.go
index b5628e8..06b86e1 100644
--- a/model/request/serviceFollowup.go
+++ b/model/request/serviceFollowup.go
@@ -2,7 +2,6 @@
 
 import (
 	"aps_crm/constvar"
-	"aps_crm/proto/code"
 )
 
 type AddServiceFollowup struct {
@@ -10,21 +9,20 @@
 }
 
 type ServiceFollowup struct {
-	ClientId       int               `json:"clientId"`
-	Number         string            `json:"number"`
-	ContactId      int               `json:"contactId"`
-	ServiceOrderId int               `json:"serviceOrderId"`
-	MemberId       int               `json:"memberId"`
-	PlanId         int               `json:"planId"`
-	Satisfaction   int               `json:"satisfaction"`
-	TimelyRate     int               `json:"timelyRate"`
-	SolveRate      int               `json:"solveRate"`
-	IsVisit        int               `json:"isVisit"`
-	OldMemberId    int               `json:"oldMemberId"`
-	Remark         string            `json:"remark"`
-	File           string            `json:"file"`
-	CodeStandID    string            `json:"codeStandID"` //缂栫爜id
-	CodeRule       code.CodeStandard `json:"codeRule"`
+	ClientId       int    `json:"clientId"`
+	Number         string `json:"number"`
+	ContactId      int    `json:"contactId"`
+	ServiceOrderId int    `json:"serviceOrderId"`
+	MemberId       int    `json:"memberId"`
+	PlanId         int    `json:"planId"`
+	Satisfaction   int    `json:"satisfaction"`
+	TimelyRate     int    `json:"timelyRate"`
+	SolveRate      int    `json:"solveRate"`
+	IsVisit        int    `json:"isVisit"`
+	OldMemberId    int    `json:"oldMemberId"`
+	Remark         string `json:"remark"`
+	File           string `json:"file"`
+	CodeStandID    string `json:"codeStandID"` //缂栫爜id
 }
 
 type UpdateServiceFollowup struct {
diff --git a/model/request/serviceOrder.go b/model/request/serviceOrder.go
index 3b59202..4805c77 100644
--- a/model/request/serviceOrder.go
+++ b/model/request/serviceOrder.go
@@ -2,39 +2,37 @@
 
 import (
 	"aps_crm/constvar"
-	"aps_crm/proto/code"
 )
 
 type AddServiceOrder struct {
-	ServiceNumber        string            `gorm:"service_number" json:"serviceNumber"`                                                                    // 鏈嶅姟鍗曠紪鍙�
-	ClientId             int               `gorm:"client_id" json:"clientId"`                                                                              // 瀹㈡埛id
-	ServiceContractId    int               `gorm:"service_contract_id" json:"serviceContractId"`                                                           // 鍚堝悓id
-	SalesDetailsId       int               `gorm:"sales_details_id" json:"salesDetailsId"`                                                                 // 閿�鍞鍗昳d
-	Subject              string            `gorm:"subject" json:"subject"`                                                                                 // 涓婚
-	ProductTypeName      string            `json:"productTypeName"`                                                                                        // 浜у搧鍒嗙被鍚嶇О
-	ProductName          string            `json:"productName"`                                                                                            // 浜у搧鍚嶇О
-	ServiceTypeId        int               `gorm:"service_type_id" json:"serviceTypeId"`                                                                   // 鏈嶅姟鏂瑰紡id
-	ServiceManId         int               `gorm:"service_man_id" json:"serviceManId"`                                                                     // 鏈嶅姟浜哄憳
-	ContactId            int               `gorm:"linkman_id" json:"contactId"`                                                                            // 鑱旂郴浜篿d
-	Address              string            `gorm:"address" json:"address"`                                                                                 // 涓婇棬鍦板潃
-	PriorityLevelId      int               `gorm:"priority_level_id" json:"priorityLevelId"`                                                               // 浼樺厛绾у埆id
-	AppointmentTime      string            `gorm:"appointment_time" json:"appointmentTime"`                                                                // 棰勭害涓婇棬鏃堕棿
-	SaleChanceId         int               `gorm:"sale_leads" json:"saleChanceId"`                                                                         // 閿�鍞満浼歩d
-	FaultTypeId          int               `gorm:"severity_id" json:"faultTypeId"`                                                                         // 鏁呴殰绫诲埆id
-	SeverityId           int               `gorm:"severity_id" json:"severity"`                                                                            // 涓ラ噸绋嬪害id
-	ServiceOrderStatusId int               `gorm:"column:service_order_status_id;type:int;not null;default:0;comment:鏈嶅姟鍗曠姸鎬乮d" json:"serviceOrderStatusId"` // 澶勭悊鐘舵��
-	ExpectTime           string            `gorm:"expect_time" json:"expectTime"`                                                                          // 甯屾湜澶勭悊鏃堕棿
-	RealTime             string            `gorm:"real_time" json:"realTime"`                                                                              // 瀹為檯澶勭悊鏃堕棿
-	CarFare              float64           `gorm:"car_fare" json:"carFare"`                                                                                // 浜ら�氳垂
-	ChargeAmount         float64           `gorm:"charge_amount" json:"chargeAmount"`                                                                      // 鏀惰垂閲戦
-	TimeSpentId          int               `gorm:"time_spent_id" json:"timeSpentId"`                                                                       // 鑺辫垂鏃堕棿
-	FaqId                int               `gorm:"problem_id" json:"faqId"`                                                                                // 甯歌闂id
-	ProblemDesc          string            `gorm:"problem_desc" json:"problemDesc"`                                                                        // 闂鎻忚堪
-	Solution             string            `gorm:"solution" json:"solution"`                                                                               // 瑙e喅鏂规硶
-	SolutionRemark       string            `gorm:"solution_remark" json:"solutionRemark"`                                                                  // 鍐呴儴澶囨敞
-	Remark               string            `gorm:"remark" json:"remark"`                                                                                   // 澶囨敞
-	CodeStandID          string            `json:"codeStandID"`                                                                                            //缂栫爜id
-	CodeRule             code.CodeStandard `json:"codeRule"`
+	ServiceNumber        string  `gorm:"service_number" json:"serviceNumber"`                                                                    // 鏈嶅姟鍗曠紪鍙�
+	ClientId             int     `gorm:"client_id" json:"clientId"`                                                                              // 瀹㈡埛id
+	ServiceContractId    int     `gorm:"service_contract_id" json:"serviceContractId"`                                                           // 鍚堝悓id
+	SalesDetailsId       int     `gorm:"sales_details_id" json:"salesDetailsId"`                                                                 // 閿�鍞鍗昳d
+	Subject              string  `gorm:"subject" json:"subject"`                                                                                 // 涓婚
+	ProductTypeName      string  `json:"productTypeName"`                                                                                        // 浜у搧鍒嗙被鍚嶇О
+	ProductName          string  `json:"productName"`                                                                                            // 浜у搧鍚嶇О
+	ServiceTypeId        int     `gorm:"service_type_id" json:"serviceTypeId"`                                                                   // 鏈嶅姟鏂瑰紡id
+	ServiceManId         int     `gorm:"service_man_id" json:"serviceManId"`                                                                     // 鏈嶅姟浜哄憳
+	ContactId            int     `gorm:"linkman_id" json:"contactId"`                                                                            // 鑱旂郴浜篿d
+	Address              string  `gorm:"address" json:"address"`                                                                                 // 涓婇棬鍦板潃
+	PriorityLevelId      int     `gorm:"priority_level_id" json:"priorityLevelId"`                                                               // 浼樺厛绾у埆id
+	AppointmentTime      string  `gorm:"appointment_time" json:"appointmentTime"`                                                                // 棰勭害涓婇棬鏃堕棿
+	SaleChanceId         int     `gorm:"sale_leads" json:"saleChanceId"`                                                                         // 閿�鍞満浼歩d
+	FaultTypeId          int     `gorm:"severity_id" json:"faultTypeId"`                                                                         // 鏁呴殰绫诲埆id
+	SeverityId           int     `gorm:"severity_id" json:"severityId"`                                                                          // 涓ラ噸绋嬪害id
+	ServiceOrderStatusId int     `gorm:"column:service_order_status_id;type:int;not null;default:0;comment:鏈嶅姟鍗曠姸鎬乮d" json:"serviceOrderStatusId"` // 澶勭悊鐘舵��
+	ExpectTime           string  `gorm:"expect_time" json:"expectTime"`                                                                          // 甯屾湜澶勭悊鏃堕棿
+	RealTime             string  `gorm:"real_time" json:"realTime"`                                                                              // 瀹為檯澶勭悊鏃堕棿
+	CarFare              float64 `gorm:"car_fare" json:"carFare"`                                                                                // 浜ら�氳垂
+	ChargeAmount         float64 `gorm:"charge_amount" json:"chargeAmount"`                                                                      // 鏀惰垂閲戦
+	TimeSpentId          int     `gorm:"time_spent_id" json:"timeSpentId"`                                                                       // 鑺辫垂鏃堕棿
+	FaqId                int     `gorm:"problem_id" json:"faqId"`                                                                                // 甯歌闂id
+	ProblemDesc          string  `gorm:"problem_desc" json:"problemDesc"`                                                                        // 闂鎻忚堪
+	Solution             string  `gorm:"solution" json:"solution"`                                                                               // 瑙e喅鏂规硶
+	SolutionRemark       string  `gorm:"solution_remark" json:"solutionRemark"`                                                                  // 鍐呴儴澶囨敞
+	Remark               string  `gorm:"remark" json:"remark"`                                                                                   // 澶囨敞
+	CodeStandID          string  `json:"codeStandID"`                                                                                            //缂栫爜id
 }
 
 type UpdateServiceOrder struct {
diff --git a/model/request/subOrder.go b/model/request/subOrder.go
index 556f4e0..7db7ff3 100644
--- a/model/request/subOrder.go
+++ b/model/request/subOrder.go
@@ -2,7 +2,6 @@
 
 import (
 	"aps_crm/model"
-	"aps_crm/proto/code"
 )
 
 type AddSubOrder struct {
@@ -10,13 +9,12 @@
 }
 
 type SubOrder struct {
-	ClientId      int               `json:"clientId"`
-	MasterOrderId int               `json:"masterOrderId"`
-	Number        string            `json:"number"`
-	MemberId      int               `json:"memberId"`
-	Product       []model.Product   `json:"product"`
-	CodeStandID   string            `json:"codeStandID"` //缂栫爜id
-	CodeRule      code.CodeStandard `json:"codeRule"`
+	ClientId      int             `json:"clientId"`
+	MasterOrderId int             `json:"masterOrderId"`
+	Number        string          `json:"number"`
+	MemberId      int             `json:"memberId"`
+	Product       []model.Product `json:"product"`
+	CodeStandID   string          `json:"codeStandID"` //缂栫爜id
 }
 
 type UpdateSubOrder struct {
diff --git a/model/saleChance.go b/model/saleChance.go
index 9836705..5f0f37c 100644
--- a/model/saleChance.go
+++ b/model/saleChance.go
@@ -2,6 +2,7 @@
 
 import (
 	"aps_crm/pkg/mysqlx"
+	"fmt"
 	"gorm.io/gorm"
 )
 
@@ -48,6 +49,7 @@
 		CollectionProjections []CollectionProjection `json:"collection_projections" gorm:"foreignKey:SaleChanceId"`
 		SalesSources          SalesSources           `json:"sales_sources"`
 		CodeStandID           string                 `json:"codeStandID" gorm:"column:code_stand_id;type:varchar(255);comment:缂栫爜id"`
+		Products              []*Product             `json:"products" gorm:"many2many:SaleChanceProduct;"`
 		Address
 		gorm.Model `json:"-"`
 	}
@@ -134,7 +136,7 @@
 
 func (slf *SaleChanceSearch) Update(record *SaleChance) (err error) {
 	var db = slf.build()
-	err = db.Updates(record).Error
+	err = db.Preload("Products").Updates(record).Error
 	return
 }
 
@@ -146,7 +148,7 @@
 
 func (slf *SaleChanceSearch) Find() (record SaleChance, err error) {
 	var db = slf.build()
-	err = db.First(&record).Error
+	err = db.Preload("Products").First(&record).Error
 	return
 }
 
@@ -161,7 +163,7 @@
 		db = db.Limit(slf.PageSize).Offset((slf.PageNum - 1) * slf.PageSize)
 	}
 
-	err := db.Preload("SaleType").Preload("RegularCustomers").Preload("SalesSources").
+	err := db.Preload("SaleType").Preload("RegularCustomers").Preload("SalesSources").Preload("Products").
 		Preload("Member").Preload("SaleStage").Preload("Possibility").
 		Preload("CollectionProjections").Preload("Client").
 		Preload("Province").Preload("City").Preload("Contact").Preload("Status").Order("id desc").Find(&records).Error
@@ -212,3 +214,20 @@
 	var db = slf.build()
 	return db.Updates(data).Error
 }
+
+func (slf *SaleChanceSearch) MaxAutoIncr() (int, error) {
+	type Result struct {
+		Max int
+	}
+
+	var (
+		result Result
+		db     = slf.build()
+	)
+
+	err := db.Select("MAX(id) as max").Scan(&result).Error
+	if err != nil {
+		return result.Max, fmt.Errorf("max err: %v", err)
+	}
+	return result.Max, nil
+}
diff --git a/model/saleChanceProduct.go b/model/saleChanceProduct.go
new file mode 100644
index 0000000..0236b44
--- /dev/null
+++ b/model/saleChanceProduct.go
@@ -0,0 +1,114 @@
+package model
+
+import (
+	"aps_crm/pkg/mysqlx"
+	"fmt"
+	"gorm.io/gorm"
+)
+
+type (
+	// SaleChanceProduct 閿�鍞満浼氬拰浜у搧鍏宠仈
+	SaleChanceProduct struct {
+		SaleChanceId int  `json:"saleChanceId" gorm:"column:sale_chance_id;type:int;primary_key;not null;default:0"`
+		ProductId    uint `json:"productId" gorm:"primary_key;column:product_id;type:int;not null;default:0;comment:浜у搧id"`
+	}
+
+	// SaleChanceProductSearch 閿�鍞満浼氬拰浜у搧鍏宠仈鎼滅储鏉′欢
+	SaleChanceProductSearch struct {
+		SaleChanceProduct
+		Orm      *gorm.DB
+		Keyword  string
+		PageNum  int
+		PageSize int
+	}
+)
+
+func (SaleChanceProduct) TableName() string {
+	return "sale_chance_product"
+}
+
+func NewSaleChanceProductSearch() *SaleChanceProductSearch {
+	return &SaleChanceProductSearch{
+		Orm: mysqlx.GetDB(),
+	}
+}
+
+func (slf *SaleChanceProductSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&SaleChanceProduct{})
+
+	return db
+}
+
+func (slf *SaleChanceProductSearch) Create(record *SaleChanceProduct) error {
+	var db = slf.build()
+	return db.Create(record).Error
+}
+
+func (slf *SaleChanceProductSearch) CreateBatch(records []*SaleChanceProduct) error {
+	var db = slf.build()
+	return db.Create(records).Error
+}
+
+func (slf *SaleChanceProductSearch) Delete() error {
+	var db = slf.build()
+	return db.Delete(&SaleChanceProduct{}).Error
+}
+
+func (slf *SaleChanceProductSearch) Update(record *SaleChanceProduct) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
+
+func (slf *SaleChanceProductSearch) FindAll() ([]*SaleChanceProduct, error) {
+	var db = slf.build()
+	var record = make([]*SaleChanceProduct, 0)
+	err := db.Find(&record).Error
+	return record, err
+}
+
+func (slf *SaleChanceProductSearch) SetPage(page, size int) *SaleChanceProductSearch {
+	slf.PageNum, slf.PageSize = page, size
+	return slf
+}
+
+func (slf *SaleChanceProductSearch) SetOrm(tx *gorm.DB) *SaleChanceProductSearch {
+	slf.Orm = tx
+	return slf
+}
+
+func (slf *SaleChanceProductSearch) First() (*SaleChanceProduct, error) {
+	var db = slf.build()
+	var record = new(SaleChanceProduct)
+	err := db.First(record).Error
+	return record, err
+}
+
+func (slf *SaleChanceProductSearch) Updates(values interface{}) error {
+	var db = slf.build()
+	return db.Updates(values).Error
+}
+
+func (slf *SaleChanceProductSearch) Save(record *SaleChanceProduct) error {
+	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 *SaleChanceProductSearch) Find() ([]*SaleChanceProduct, int64, error) {
+	var db = slf.build()
+	var records = make([]*SaleChanceProduct, 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
+}
diff --git a/model/salesDetails.go b/model/salesDetails.go
index b82e761..10e89b5 100644
--- a/model/salesDetails.go
+++ b/model/salesDetails.go
@@ -14,7 +14,7 @@
 		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:閿�鍞瓙鍗曞彿"`
+		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:閿�鍞被鍨�"`
@@ -40,6 +40,9 @@
 		AmountUnInvoiced    decimal.Decimal   `gorm:"column:amount_not_invoiced;type:decimal(12,2);comment:鏈紑绁ㄩ噾棰�" json:"amountUnInvoiced"` // 鏈紑绁ㄩ噾棰�
 		AmountTotal         decimal.Decimal   `gorm:"column:amount_total;type:decimal(12,2);comment:浠风◣鍚堣" json:"amountTotal"`              // 浠风◣鍚堣
 		CodeStandID         string            `json:"codeStandID" gorm:"column:code_stand_id;type:varchar(255);comment:缂栫爜id"`
+		DeliverType         int               `json:"deliverType" gorm:"column:deliver_type;type:int;comment:浜や粯绫诲瀷(1.涓�娆″彂璐�,2.澶氭鍙戣揣)"`
+		QuotationId         int               `json:"quotationId" gorm:"column:quotation_id;type:int;comment:鎶ヤ环鍗昳d"`
+		Quotation           Quotation         `json:"quotation" gorm:"foreignKey:QuotationId"`
 		CrmModel
 	}
 
@@ -106,7 +109,8 @@
 			Preload("Member").
 			Preload("SaleChance").
 			Preload("WechatOrderStatus").
-			Preload("Client")
+			Preload("Client").
+			Preload("Quotation")
 	}
 
 	return db
@@ -133,6 +137,30 @@
 	return db.Updates(record).Error
 }
 
+func (slf *SalesDetailsSearch) Count() (int64, error) {
+	var db = slf.build()
+	var total int64
+	err := db.Count(&total).Error
+	return total, err
+}
+
+func (slf *SalesDetailsSearch) MaxAutoIncr() (int, error) {
+	type Result struct {
+		Max int
+	}
+
+	var (
+		result Result
+		db     = slf.build()
+	)
+
+	err := db.Select("MAX(id) as max").Scan(&result).Error
+	if err != nil {
+		return result.Max, fmt.Errorf("max err: %v", err)
+	}
+	return result.Max, nil
+}
+
 func (slf *SalesDetailsSearch) SetId(id int) *SalesDetailsSearch {
 	slf.Id = id
 	return slf
diff --git a/model/salesDetailsProduct.go b/model/salesDetailsProduct.go
index a803e83..abaed56 100644
--- a/model/salesDetailsProduct.go
+++ b/model/salesDetailsProduct.go
@@ -23,6 +23,7 @@
 		Keyword     string
 		PageNum     int
 		PageSize    int
+		ProductIds  []uint
 	}
 )
 
@@ -38,10 +39,18 @@
 
 func (slf *SalesDetailsProductSearch) build() *gorm.DB {
 	var db = slf.Orm.Model(&SalesDetailsProduct{})
+	if len(slf.ProductIds) > 0 {
+		db = db.Where("product_id in (?)", slf.ProductIds)
+	}
 
 	return db
 }
 
+func (slf *SalesDetailsProductSearch) SetProductIds(ids []uint) *SalesDetailsProductSearch {
+	slf.ProductIds = ids
+	return slf
+}
+
 func (slf *SalesDetailsProductSearch) Create(record *SalesDetailsProduct) error {
 	var db = slf.build()
 	return db.Create(record).Error
diff --git a/model/salesLeads.go b/model/salesLeads.go
index f215ce4..4439bdb 100644
--- a/model/salesLeads.go
+++ b/model/salesLeads.go
@@ -3,6 +3,7 @@
 import (
 	"aps_crm/constvar"
 	"aps_crm/pkg/mysqlx"
+	"fmt"
 	"gorm.io/gorm"
 )
 
@@ -61,6 +62,9 @@
 	}
 	if slf.Name != "" {
 		db = db.Where("name = ?", slf.Name)
+	}
+	if slf.Number != "" {
+		db = db.Where("number = ?", slf.Number)
 	}
 
 	if len(slf.SearchMap) > 0 {
@@ -141,6 +145,30 @@
 	return records, total, err
 }
 
+func (slf *SalesLeadsSearch) Count() (int64, error) {
+	var db = slf.build()
+	var total int64
+	err := db.Count(&total).Error
+	return total, err
+}
+
+func (slf *SalesLeadsSearch) MaxAutoIncr() (int, error) {
+	type Result struct {
+		Max int
+	}
+
+	var (
+		result Result
+		db     = slf.build()
+	)
+
+	err := db.Select("MAX(id) as max").Scan(&result).Error
+	if err != nil {
+		return result.Max, fmt.Errorf("max err: %v", err)
+	}
+	return result.Max, nil
+}
+
 func (slf *SalesLeadsSearch) SetId(id int) *SalesLeadsSearch {
 	slf.Id = id
 	return slf
@@ -176,6 +204,11 @@
 	return slf
 }
 
+func (slf *SalesLeadsSearch) SetNumber(number string) *SalesLeadsSearch {
+	slf.Number = number
+	return slf
+}
+
 func (slf *SalesLeadsSearch) SetSearchMap(data map[string]interface{}) *SalesLeadsSearch {
 	slf.SearchMap = data
 	return slf
diff --git a/model/salesRefund.go b/model/salesRefund.go
index d4aadd8..e593902 100644
--- a/model/salesRefund.go
+++ b/model/salesRefund.go
@@ -16,8 +16,8 @@
 		Client        Client                    `json:"client" gorm:"foreignKey:ClientId"`
 		Number        string                    `json:"number" gorm:"column:number;type:varchar(255);comment:閫�娆惧崟鍙�"`
 		SourceType    constvar.RefundSourceType `gorm:"column:source_type;type:int;not null;default 0;comment:鏉ユ簮绫诲瀷锛�1閿�鍞��璐э級" json:"sourceType"` // 鏉ユ簮绫诲瀷锛�1閿�鍞��璐э級
-		SourceId      int                       `gorm:"column:source_id;type:int;not null;default 0;comment:婧愬崟id " json:"sourceId"`           // 婧愬崟id
-		Source        SalesReturn               `gorm:"foreignKey:SourceId" json:"Source"`
+		SalesReturnId int                       `gorm:"column:source_id;type:int;not null;default 0;comment:婧愬崟id " json:"sourceId"`           // 婧愬崟id
+		SalesReturn   SalesReturn               `gorm:"foreignKey:SalesReturnId" json:"salesReturn"`
 		MemberId      int                       `json:"memberId" gorm:"column:member_id;type:int;comment:璐熻矗浜篿d"`
 		Member        User                      `json:"member" gorm:"foreignKey:MemberId"`
 		RefundDate    string                    `json:"refundDate" gorm:"column:refund_date;type:varchar(255);comment:閫�娆炬棩鏈�"`
@@ -78,16 +78,16 @@
 		db = db.Where("source_type = ?", slf.SourceType)
 	}
 
-	if slf.SourceId != 0 {
-		db = db.Where("source_id = ?", slf.SourceId)
+	if slf.SalesReturnId != 0 {
+		db = db.Where("source_id = ?", slf.SalesReturnId)
 	}
 
 	if slf.Preload {
 		db = db.Preload("Client").
 			Preload("PaymentType").
 			Preload("BankAccount").
-			Preload("Source").
-			Preload("Products")
+			Preload("Products").
+			Preload("SalesReturn")
 	}
 	if slf.KeywordType != "" {
 		switch slf.KeywordType {
@@ -115,6 +115,9 @@
 
 	if len(slf.MemberIds) > 0 {
 		db = db.Where("sales_refund.member_id in ?", slf.MemberIds)
+	}
+	if slf.Number != "" {
+		db = db.Where("number = ?", slf.Number)
 	}
 
 	return db
@@ -169,6 +172,30 @@
 	return records, total, err
 }
 
+func (slf *SalesRefundSearch) Count() (int64, error) {
+	var db = slf.build()
+	var total int64
+	err := db.Count(&total).Error
+	return total, err
+}
+
+func (slf *SalesRefundSearch) MaxAutoIncr() (int, error) {
+	type Result struct {
+		Max int
+	}
+
+	var (
+		result Result
+		db     = slf.build()
+	)
+
+	err := db.Select("MAX(id) as max").Scan(&result).Error
+	if err != nil {
+		return result.Max, fmt.Errorf("max err: %v", err)
+	}
+	return result.Max, nil
+}
+
 func (slf *SalesRefundSearch) SetId(id int) *SalesRefundSearch {
 	slf.Id = id
 	return slf
@@ -185,7 +212,7 @@
 }
 
 func (slf *SalesRefundSearch) SetSourceId(id int) *SalesRefundSearch {
-	slf.SourceId = id
+	slf.SalesReturnId = id
 	return slf
 }
 
@@ -214,6 +241,11 @@
 	return slf
 }
 
+func (slf *SalesRefundSearch) SetNumber(number string) *SalesRefundSearch {
+	slf.Number = number
+	return slf
+}
+
 func (slf *SalesRefundSearch) UpdateByMap(data map[string]interface{}) error {
 	var db = slf.build()
 	return db.Updates(data).Error
diff --git a/model/salesReturn.go b/model/salesReturn.go
index df99ba7..126b29a 100644
--- a/model/salesReturn.go
+++ b/model/salesReturn.go
@@ -114,6 +114,9 @@
 	if len(slf.MemberIds) > 0 {
 		db = db.Where("sales_return.member_id in ?", slf.MemberIds)
 	}
+	if slf.Number != "" {
+		db = db.Where("number = ?", slf.Number)
+	}
 
 	return db
 }
@@ -168,6 +171,30 @@
 	return records, err
 }
 
+func (slf *SalesReturnSearch) Count() (int64, error) {
+	var db = slf.build()
+	var total int64
+	err := db.Count(&total).Error
+	return total, err
+}
+
+func (slf *SalesReturnSearch) MaxAutoIncr() (int, error) {
+	type Result struct {
+		Max int
+	}
+
+	var (
+		result Result
+		db     = slf.build()
+	)
+
+	err := db.Select("MAX(id) as max").Scan(&result).Error
+	if err != nil {
+		return result.Max, fmt.Errorf("max err: %v", err)
+	}
+	return result.Max, nil
+}
+
 func (slf *SalesReturnSearch) SetId(id int) *SalesReturnSearch {
 	slf.Id = id
 	return slf
@@ -217,6 +244,11 @@
 	return slf
 }
 
+func (slf *SalesReturnSearch) SetNumber(number string) *SalesReturnSearch {
+	slf.Number = number
+	return slf
+}
+
 func (slf *SalesReturnSearch) UpdateByMap(data map[string]interface{}) error {
 	var db = slf.build()
 	return db.Updates(data).Error
diff --git a/model/serviceContract.go b/model/serviceContract.go
index 8c8db4e..61d8e5f 100644
--- a/model/serviceContract.go
+++ b/model/serviceContract.go
@@ -145,6 +145,9 @@
 	if slf.ContactId != 0 {
 		db = db.Where("contact_id = ?", slf.ContactId)
 	}
+	if slf.Number != "" {
+		db = db.Where("number = ?", slf.Number)
+	}
 	return db
 }
 
@@ -180,10 +183,39 @@
 		db = db.Limit(slf.PageSize).Offset((slf.PageNum - 1) * slf.PageSize)
 	}
 
-	err := db.Order("id desc").Order("id desc").Find(&records).Error
+	err := db.Order("id desc").Find(&records).Error
 	return records, total, err
 }
 
+func (slf *ServiceContractSearch) Count() (int64, error) {
+	var db = slf.build()
+	var total int64
+	err := db.Count(&total).Error
+	return total, err
+}
+
+func (slf *ServiceContractSearch) MaxAutoIncr() (int, error) {
+	type Result struct {
+		Max int
+	}
+
+	var (
+		result Result
+		db     = slf.build()
+	)
+
+	err := db.Select("MAX(id) as max").Scan(&result).Error
+	if err != nil {
+		return result.Max, fmt.Errorf("max err: %v", err)
+	}
+	return result.Max, nil
+}
+
+func (slf *ServiceContractSearch) SetNumber(number string) *ServiceContractSearch {
+	slf.Number = number
+	return slf
+}
+
 func (slf *ServiceContractSearch) SetId(id int) *ServiceContractSearch {
 	slf.Id = id
 	return slf
diff --git a/model/serviceFollowup.go b/model/serviceFollowup.go
index 0b62891..65ffa14 100644
--- a/model/serviceFollowup.go
+++ b/model/serviceFollowup.go
@@ -101,6 +101,9 @@
 	if len(slf.MemberIds) > 0 {
 		db = db.Where("service_followup.member_id in ?", slf.MemberIds)
 	}
+	if slf.Number != "" {
+		db = db.Where("number = ?", slf.Number)
+	}
 
 	return db
 }
@@ -142,6 +145,35 @@
 	return records, total, err
 }
 
+func (slf *ServiceFollowupSearch) Count() (int64, error) {
+	var db = slf.build()
+	var total int64
+	err := db.Count(&total).Error
+	return total, err
+}
+
+func (slf *ServiceFollowupSearch) MaxAutoIncr() (int, error) {
+	type Result struct {
+		Max int
+	}
+
+	var (
+		result Result
+		db     = slf.build()
+	)
+
+	err := db.Select("MAX(id) as max").Scan(&result).Error
+	if err != nil {
+		return result.Max, fmt.Errorf("max err: %v", err)
+	}
+	return result.Max, nil
+}
+
+func (slf *ServiceFollowupSearch) SetNumber(number string) *ServiceFollowupSearch {
+	slf.Number = number
+	return slf
+}
+
 func (slf *ServiceFollowupSearch) SetId(id int) *ServiceFollowupSearch {
 	slf.Id = id
 	return slf
diff --git a/model/serviceOrder.go b/model/serviceOrder.go
index f593b5c..c3d350b 100644
--- a/model/serviceOrder.go
+++ b/model/serviceOrder.go
@@ -38,7 +38,7 @@
 		SaleChance           SaleChance         `gorm:"foreignKey:SaleChanceId"`
 		FaultTypeId          int                `gorm:"column:severity_id;type:int;not null;default:0;comment:鏁呴殰绫诲埆id" json:"faultTypeId"` // 鏁呴殰绫诲埆id
 		FaultType            FaultType          `gorm:"foreignKey:FaultTypeId"`
-		SeverityId           int                `gorm:"column:severity_id;type:int;not null;default:0;comment:涓ラ噸绋嬪害id" json:"severity"` // 涓ラ噸绋嬪害id
+		SeverityId           int                `gorm:"column:severity_order_id;type:int;not null;default:0;comment:涓ラ噸绋嬪害id" json:"severityId"` // 涓ラ噸绋嬪害id
 		Severity             Severity           `gorm:"foreignKey:SeverityId"`
 		ServiceOrderStatusId int                `gorm:"column:service_order_status_id;type:int;not null;default:0;comment:鏈嶅姟鍗曠姸鎬乮d" json:"serviceOrderStatusId"` // 澶勭悊鐘舵��
 		ServiceOrderStatus   ServiceOrderStatus `gorm:"foreignKey:ServiceOrderStatusId"`
@@ -134,6 +134,9 @@
 	if len(slf.ServiceManIds) > 0 {
 		db = db.Where("service_man_id in ?", slf.ServiceManIds)
 	}
+	if slf.ServiceNumber != "" {
+		db = db.Where("service_number = ?", slf.ServiceNumber)
+	}
 
 	return db
 }
@@ -216,6 +219,11 @@
 	return slf
 }
 
+func (slf *ServiceOrderSearch) SetNumber(number string) *ServiceOrderSearch {
+	slf.ServiceNumber = number
+	return slf
+}
+
 func (slf *ServiceOrderSearch) First() (*ServiceOrder, error) {
 	var db = slf.build()
 	var record = new(ServiceOrder)
@@ -260,3 +268,27 @@
 	var db = slf.build()
 	return db.Updates(data).Error
 }
+
+func (slf *ServiceOrderSearch) Count() (int64, error) {
+	var db = slf.build()
+	var total int64
+	err := db.Count(&total).Error
+	return total, err
+}
+
+func (slf *ServiceOrderSearch) MaxAutoIncr() (int, error) {
+	type Result struct {
+		Max int
+	}
+
+	var (
+		result Result
+		db     = slf.build()
+	)
+
+	err := db.Select("MAX(id) as max").Scan(&result).Error
+	if err != nil {
+		return result.Max, fmt.Errorf("max err: %v", err)
+	}
+	return result.Max, nil
+}
diff --git a/model/severity.go b/model/severity.go
index bccf576..51284df 100644
--- a/model/severity.go
+++ b/model/severity.go
@@ -29,7 +29,7 @@
 )
 
 func (Severity) TableName() string {
-	return "severity"
+	return "severity_order"
 }
 
 func NewSeveritySearch() *SeveritySearch {
diff --git a/model/subOrder.go b/model/subOrder.go
index 0182500..930e672 100644
--- a/model/subOrder.go
+++ b/model/subOrder.go
@@ -2,6 +2,7 @@
 
 import (
 	"aps_crm/pkg/mysqlx"
+	"fmt"
 	"gorm.io/gorm"
 )
 
@@ -49,6 +50,9 @@
 
 	if slf.Id != 0 {
 		db = db.Where("id = ?", slf.Id)
+	}
+	if slf.Number != "" {
+		db = db.Where("number = ?", slf.Number)
 	}
 
 	if len(slf.SearchMap) > 0 {
@@ -120,6 +124,30 @@
 	return records, total, err
 }
 
+func (slf *SubOrderSearch) Count() (int64, error) {
+	var db = slf.build()
+	var total int64
+	err := db.Count(&total).Error
+	return total, err
+}
+
+func (slf *SubOrderSearch) MaxAutoIncr() (int, error) {
+	type Result struct {
+		Max int
+	}
+
+	var (
+		result Result
+		db     = slf.build()
+	)
+
+	err := db.Select("MAX(id) as max").Scan(&result).Error
+	if err != nil {
+		return result.Max, fmt.Errorf("max err: %v", err)
+	}
+	return result.Max, nil
+}
+
 func (slf *SubOrderSearch) SetId(id int) *SubOrderSearch {
 	slf.Id = id
 	return slf
@@ -143,6 +171,12 @@
 	slf.Orm = slf.Orm.Where("id in (?)", ids)
 	return slf
 }
+
+func (slf *SubOrderSearch) SetNumber(number string) *SubOrderSearch {
+	slf.Number = number
+	return slf
+}
+
 func (slf *SubOrderSearch) UpdateByMap(data map[string]interface{}) error {
 	var db = slf.build()
 	return db.Updates(data).Error
diff --git a/model/util.go b/model/util.go
index 8ac7156..6c914a8 100644
--- a/model/util.go
+++ b/model/util.go
@@ -38,7 +38,7 @@
 	} else { // 鍥哄畾鍊�
 		prefixValue = codeStandard.AutoRule.PrefixValue
 	}
-	strMaxAutoIncr := strconv.Itoa(id)
+	strMaxAutoIncr := strconv.Itoa(id + 1)
 	count := int(codeStandard.AutoRule.AutoLength) - len(strMaxAutoIncr)
 	for i := 0; i < count; i++ {
 		strMaxAutoIncr = "0" + strMaxAutoIncr
diff --git a/router/index.go b/router/index.go
index 47df283..94aae0a 100644
--- a/router/index.go
+++ b/router/index.go
@@ -197,7 +197,8 @@
 	codeGroup := PrivateGroup.Group("code")
 	codeApi := v1.CodeApi{}
 	{
-		codeGroup.GET("getCodeList", codeApi.GetCodeList) //鑾峰彇缂栫爜鍒楄〃
+		codeGroup.GET("getCodeList", codeApi.GetCodeList)  //鑾峰彇缂栫爜鍒楄〃
+		codeGroup.POST("getAutoCode", codeApi.GetAutoCode) //鑾峰彇缂栫爜鍒楄〃
 	}
 	return Router
 }
diff --git a/service/invoice.go b/service/invoice.go
index edb207e..9aaf90f 100644
--- a/service/invoice.go
+++ b/service/invoice.go
@@ -43,7 +43,7 @@
 		if err != nil {
 			return ecode.DBErr
 		}
-	} else if invoice.SourceType == constvar.InvoiceSourceTypeServiceContract { //鏇存柊閿�鍞槑缁嗗凡寮�绁ㄩ噾棰�
+	} else if invoice.SourceType == constvar.InvoiceSourceTypeSaleDetail { //鏇存柊閿�鍞槑缁嗗凡寮�绁ㄩ噾棰�
 		salesDetails, err := model.NewSalesDetailsSearch().SetId(invoice.SourceId).SetPreload(true).First()
 		if err != nil {
 			return ecode.DBErr
diff --git a/service/saleChance.go b/service/saleChance.go
index 1610c07..a8f419b 100644
--- a/service/saleChance.go
+++ b/service/saleChance.go
@@ -3,6 +3,7 @@
 import (
 	"aps_crm/model"
 	"aps_crm/pkg/ecode"
+	"gorm.io/gorm"
 )
 
 type SaleChanceService struct{}
@@ -17,7 +18,49 @@
 
 func (SaleChanceService) UpdateSaleChance(saleChange *model.SaleChance) int {
 	// update saleChange
-	err := model.NewSaleChanceSearch().SetId(saleChange.Id).Update(saleChange)
+	old, err := model.NewSaleChanceSearch().SetId(saleChange.Id).Find()
+	if err != nil {
+		return ecode.SaleChanceNotExist
+	}
+	newProducts, removedProducts := NewProductsService().PickDiffProducts(saleChange.Products, old.Products)
+	err = model.WithTransaction(func(db *gorm.DB) error {
+		err = model.NewSaleChanceSearch().SetId(saleChange.Id).Update(saleChange)
+		if err != nil {
+			return err
+		}
+		if len(removedProducts) > 0 {
+			removedProductIds := make([]uint, 0, len(removedProducts))
+			for _, product := range removedProducts {
+				removedProductIds = append(removedProductIds, product.Id)
+			}
+			err = model.NewProductSearch(db).SetIds(removedProductIds).Delete()
+			if err != nil {
+				return err
+			}
+		}
+		if len(newProducts) > 0 {
+			for _, p := range newProducts {
+				p.Id = 0
+			}
+			err = model.NewProductSearch(db).CreateBatch(newProducts)
+			if err != nil {
+				return err
+			}
+			var rel []*model.SaleChanceProduct
+			for _, p := range newProducts {
+				rel = append(rel, &model.SaleChanceProduct{
+					SaleChanceId: saleChange.Id,
+					ProductId:    p.Id,
+				})
+			}
+			err = model.NewSaleChanceProductSearch().CreateBatch(rel)
+			if err != nil {
+				return err
+			}
+		}
+		return nil
+	})
+
 	if err != nil {
 		return ecode.SaleChanceUpdateErr
 	}
diff --git a/service/salesDetails.go b/service/salesDetails.go
index 62653f1..dec2d36 100644
--- a/service/salesDetails.go
+++ b/service/salesDetails.go
@@ -22,6 +22,9 @@
 	salesDetails.AmountTotal = salesDetails.AmountTotal.Round(2)
 	salesDetails.AmountReceivable = salesDetails.AmountTotal
 	salesDetails.AmountUnInvoiced = salesDetails.AmountTotal
+	for _, product := range salesDetails.Products {
+		product.Id = 0
+	}
 	err := model.NewSalesDetailsSearch().Create(salesDetails)
 	if err != nil {
 		return ecode.SalesDetailsExist
diff --git a/service/salesRefund.go b/service/salesRefund.go
index c9897a1..52a4a88 100644
--- a/service/salesRefund.go
+++ b/service/salesRefund.go
@@ -12,7 +12,7 @@
 type SalesRefundService struct{}
 
 func (SalesRefundService) AddSalesRefund(salesRefund *model.SalesRefund) int {
-	salesReturnRecord, err := model.NewSalesReturnSearch().SetId(salesRefund.SourceId).SetPreload(true).First()
+	salesReturnRecord, err := model.NewSalesReturnSearch().SetId(salesRefund.SalesReturnId).SetPreload(true).First()
 	if err != nil {
 		return ecode.SalesReturnNotExist
 	}
@@ -37,7 +37,7 @@
 			return errors.New("閫�璐т骇鍝佸搴旀�讳环瓒呭嚭搴旈��鎬讳环")
 		}
 		salesReturnRecord.AmountShouldRefund = salesReturnRecord.AmountTotal.Sub(salesReturnRecord.AmountHasRefund).Round(2)
-		err = model.NewSalesReturnSearch().SetId(salesRefund.SourceId).Update(salesReturnRecord)
+		err = model.NewSalesReturnSearch().SetId(salesRefund.SalesReturnId).Update(salesReturnRecord)
 		if err != nil {
 			code = ecode.DBErr
 			return err
@@ -73,7 +73,7 @@
 	if err != nil {
 		return ecode.SalesRefundNotExist
 	}
-	salesReturnRecord, err := model.NewSalesReturnSearch().SetId(refund.SourceId).SetPreload(true).First()
+	salesReturnRecord, err := model.NewSalesReturnSearch().SetId(refund.SalesReturnId).SetPreload(true).First()
 	if err != nil {
 		return ecode.SalesReturnNotExist
 	}
@@ -90,7 +90,7 @@
 		}
 		salesReturnRecord.AmountHasRefund = salesReturnRecord.AmountHasRefund.Sub(amount).Round(2)
 		salesReturnRecord.AmountShouldRefund = salesReturnRecord.AmountTotal.Sub(salesReturnRecord.AmountHasRefund).Round(2)
-		err = model.NewSalesReturnSearch().SetId(refund.SourceId).Update(salesReturnRecord)
+		err = model.NewSalesReturnSearch().SetId(refund.SalesReturnId).Update(salesReturnRecord)
 		if err != nil {
 			return err
 		}
@@ -120,7 +120,7 @@
 		return ecode.SalesRefundNotExist
 	}
 
-	salesReturnRecord, err := model.NewSalesReturnSearch().SetId(salesRefund.SourceId).SetPreload(true).First()
+	salesReturnRecord, err := model.NewSalesReturnSearch().SetId(salesRefund.SalesReturnId).SetPreload(true).First()
 	if err != nil {
 		return ecode.SalesReturnNotExist
 	}
@@ -153,7 +153,7 @@
 			return errors.New("閫�璐т骇鍝佸搴旀�讳环瓒呭嚭搴旈��鎬讳环")
 		}
 
-		err = model.NewSalesReturnSearch().SetId(salesRefund.SourceId).Update(salesReturnRecord)
+		err = model.NewSalesReturnSearch().SetId(salesRefund.SalesReturnId).Update(salesReturnRecord)
 		if err != nil {
 			code = ecode.DBErr
 			return err
@@ -168,7 +168,7 @@
 	return ecode.OK
 }
 
-func (SalesRefundService) GetSalesRefundList(page, pageSize int, keywordType constvar.SalesRefundKeywordType, keyword string, sourceId int, memberIds []int)  ([]*model.SalesRefund, int64, int) {
+func (SalesRefundService) GetSalesRefundList(page, pageSize int, keywordType constvar.SalesRefundKeywordType, keyword string, sourceId int, memberIds []int) ([]*model.SalesRefund, int64, int) {
 	// get contact list
 	contacts, total, err := model.NewSalesRefundSearch().
 		SetKeywordType(keywordType).
diff --git a/service/salesReturn.go b/service/salesReturn.go
index b1177ea..ab8fef5 100644
--- a/service/salesReturn.go
+++ b/service/salesReturn.go
@@ -17,6 +17,7 @@
 	salesReturn.AmountTotal = decimal.Zero
 	for _, product := range salesReturn.Products {
 		salesReturn.AmountTotal = salesReturn.AmountTotal.Add(product.Amount.Mul(product.Price))
+		product.Id = 0
 	}
 	salesReturn.AmountShouldRefund = salesReturn.AmountTotal
 	err := model.NewSalesReturnSearch().Create(salesReturn)

--
Gitblit v1.8.0