From a35c7eb12dcce7c650025ba4d801d6ad6f1053c4 Mon Sep 17 00:00:00 2001
From: wangpengfei <274878379@qq.com>
Date: 星期四, 13 七月 2023 18:07:06 +0800
Subject: [PATCH] add

---
 api/v1/index.go                   |    2 
 api/v1/client.go                  |   17 
 service/client.go                 |   12 
 api/v1/serviceFeeManage.go        |  156 +++++++
 model/request/serviceFeeManage.go |   19 
 pkg/ecode/code.go                 |    8 
 docs/swagger.yaml                 |  216 +++++++++
 docs/docs.go                      |  327 ++++++++++++++
 docs/swagger.json                 |  327 ++++++++++++++
 model/response/response.go        |    4 
 service/serviceFeeManage.go       |   66 +++
 api/v1/customerServiceSheet.go    |    4 
 model/serviceFeeManage.go         |   85 +++
 service/index.go                  |    1 
 router/serviceFeeManage.go        |   19 
 model/client.go                   |   10 
 model/index.go                    |    1 
 logs/aps-admin.err.log            |   11 
 router/index.go                   |    2 
 19 files changed, 1,276 insertions(+), 11 deletions(-)

diff --git a/api/v1/client.go b/api/v1/client.go
index 8d47ac9..2e3d7ee 100644
--- a/api/v1/client.go
+++ b/api/v1/client.go
@@ -98,6 +98,13 @@
 
 	client.LatestServiceTime = t
 
+	t, err = checkTimeFormat(params.RegistrationTime)
+	if err != nil {
+		return ecode.InvalidParams, nil
+	}
+
+	client.RegistrationTime = t
+
 	client.ClientTypeId = params.ClientTypeId
 	client.ClientOriginId = params.ClientOriginId
 	client.ClientLevelId = params.ClientLevelId
@@ -105,6 +112,16 @@
 	client.Remark = params.Remark
 	client.Number = params.Number
 	client.ServiceMemberId = params.ServiceMemberId
+	client.ProvinceId = params.ProvinceId
+	client.CityId = params.CityId
+	client.RegionId = params.RegionId
+	client.CountryId = params.CountryId
+	client.Business.BusinessScope = params.BusinessScope
+	client.Business.Representative = params.Representative
+	client.Business.RegisteredCapitalId = params.RegisteredCapitalId
+	client.Business.IndustryId = params.IndustryId
+	client.Business.EnterpriseNatureId = params.EnterpriseNatureId
+	client.Business.EnterpriseScaleId = params.EnterpriseScaleId
 
 	if params.Contact.Name != "" {
 		// assign the client's member id to contact when adding
diff --git a/api/v1/customerServiceSheet.go b/api/v1/customerServiceSheet.go
index 730f157..cc79739 100644
--- a/api/v1/customerServiceSheet.go
+++ b/api/v1/customerServiceSheet.go
@@ -71,8 +71,8 @@
 //	@Tags		CustomerServiceSheet
 //	@Summary	鏇存柊瀹㈡湇鍗�
 //	@Produce	application/json
-//	@Param		object	body		request.UpdateCustomerServiceSheet true	"鏌ヨ鍙傛暟"
-//	@Success	200	{object}	contextx.Response{}
+//	@Param		object	body		request.UpdateCustomerServiceSheet	true	"鏌ヨ鍙傛暟"
+//	@Success	200		{object}	contextx.Response{}
 //	@Router		/api/customerServiceSheet/update/{id} [put]
 func (s *CustomerServiceSheetApi) Update(c *gin.Context) {
 	var params request.UpdateCustomerServiceSheet
diff --git a/api/v1/index.go b/api/v1/index.go
index a79e9fd..f8911cf 100644
--- a/api/v1/index.go
+++ b/api/v1/index.go
@@ -43,6 +43,7 @@
 	OrderManageApi
 	ServiceFollowupApi
 	CustomerServiceSheetApi
+	ServiceFeeManageApi
 }
 
 var ApiGroup = new(Group)
@@ -85,4 +86,5 @@
 	orderManageService          = service.ServiceGroup.OrderManageService
 	serviceFollowupService      = service.ServiceGroup.FollowupService
 	customerServiceSheetService = service.ServiceGroup.CustomerServiceSheetService
+	serviceFeeManageService     = service.ServiceGroup.FeeManageService
 )
diff --git a/api/v1/serviceFeeManage.go b/api/v1/serviceFeeManage.go
new file mode 100644
index 0000000..afa4313
--- /dev/null
+++ b/api/v1/serviceFeeManage.go
@@ -0,0 +1,156 @@
+package v1
+
+import (
+	"aps_crm/model"
+	"aps_crm/model/request"
+	"aps_crm/model/response"
+	"aps_crm/pkg/contextx"
+	"aps_crm/pkg/ecode"
+	"github.com/gin-gonic/gin"
+	"strconv"
+)
+
+type ServiceFeeManageApi struct{}
+
+// Add
+//
+//	@Tags		ServiceFeeManage
+//	@Summary	娣诲姞鏈嶅姟璐圭鐞�
+//	@Produce	application/json
+//	@Param		object	body		request.AddServiceFeeManage	true	"鏌ヨ鍙傛暟"
+//	@Success	200		{object}	contextx.Response{}
+//	@Router		/api/serviceFeeManage/add [post]
+func (s *ServiceFeeManageApi) Add(c *gin.Context) {
+	var params request.AddServiceFeeManage
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode, serviceFeeManage := checkServiceFeeManageParams(params.ServiceFeeManage)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	errCode = serviceFeeManageService.AddServiceFeeManage(&serviceFeeManage)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Delete
+//
+//	@Tags		ServiceFeeManage
+//	@Summary	鍒犻櫎鏈嶅姟璐圭鐞�
+//	@Produce	application/json
+//	@Param		id	path		int	true	"鏌ヨ鍙傛暟"
+//	@Success	200	{object}	contextx.Response{}
+//	@Router		/api/serviceFeeManage/delete/{id} [delete]
+func (s *ServiceFeeManageApi) Delete(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	id, _ := strconv.Atoi(c.Param("id"))
+	errCode := serviceFeeManageService.DeleteServiceFeeManage(id)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Update
+//
+//	@Tags		ServiceFeeManage
+//	@Summary	鏇存柊鏈嶅姟璐圭鐞�
+//	@Produce	application/json
+//	@Param		object	body		request.UpdateServiceFeeManage	true	"鏌ヨ鍙傛暟"
+//	@Success	200		{object}	contextx.Response{}
+//	@Router		/api/serviceFeeManage/update [put]
+func (s *ServiceFeeManageApi) Update(c *gin.Context) {
+	var params request.UpdateServiceFeeManage
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode, serviceFeeManage := checkServiceFeeManageParams(params.ServiceFeeManage)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	code, client := checkClientParams(params.Client)
+	if code != ecode.OK {
+		ctx.Fail(code)
+		return
+	}
+	client.Id = serviceFeeManage.ClientId
+	serviceFeeManage.Client = client
+	serviceFeeManage.Id = params.Id
+
+	errCode = serviceFeeManageService.UpdateServiceFeeManage(&serviceFeeManage)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// List
+//
+//	@Tags		ServiceFeeManage
+//	@Summary	鏈嶅姟璐圭鐞嗗垪琛�
+//	@Produce	application/json
+//	@Success	200	{object}	contextx.Response{data=response.ServiceFeeManageResponse}
+//	@Router		/api/serviceFeeManage/list [get]
+func (s *ServiceFeeManageApi) List(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	list, errCode := serviceFeeManageService.GetServiceFeeManageList()
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.OkWithDetailed(response.ServiceFeeManageResponse{
+		List: list,
+	})
+}
+
+// checkServiceFeeManageParams
+func checkServiceFeeManageParams(serviceFeeManage request.ServiceFeeManage) (errCode int, result model.ServiceFeeManage) {
+	if serviceFeeManage.ClientId == 0 {
+		return ecode.InvalidParams, result
+	}
+
+	if serviceFeeManage.MemberId == 0 {
+		return ecode.InvalidParams, result
+	}
+
+	t, err := checkTimeFormat(serviceFeeManage.LatestDate)
+	if err != nil {
+		return ecode.InvalidParams, result
+	}
+
+	result = model.ServiceFeeManage{
+		ClientId:   serviceFeeManage.ClientId,
+		MemberId:   serviceFeeManage.MemberId,
+		Remark:     serviceFeeManage.Remark,
+		LatestDate: t,
+		File:       serviceFeeManage.File,
+	}
+
+	return ecode.OK, result
+}
diff --git a/docs/docs.go b/docs/docs.go
index efd3896..9ead6a7 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -3972,6 +3972,125 @@
                 }
             }
         },
+        "/api/serviceFeeManage/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "ServiceFeeManage"
+                ],
+                "summary": "娣诲姞鏈嶅姟璐圭鐞�",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddServiceFeeManage"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/serviceFeeManage/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "ServiceFeeManage"
+                ],
+                "summary": "鍒犻櫎鏈嶅姟璐圭鐞�",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/serviceFeeManage/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "ServiceFeeManage"
+                ],
+                "summary": "鏈嶅姟璐圭鐞嗗垪琛�",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/contextx.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/response.ServiceFeeManageResponse"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/serviceFeeManage/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "ServiceFeeManage"
+                ],
+                "summary": "鏇存柊鏈嶅姟璐圭鐞�",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateServiceFeeManage"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/serviceFollowup/add": {
             "post": {
                 "produces": [
@@ -5008,6 +5127,32 @@
                 }
             }
         },
+        "model.CustomerServiceSheet": {
+            "type": "object",
+            "properties": {
+                "handleStatus": {
+                    "type": "integer"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "priority": {
+                    "type": "integer"
+                },
+                "serviceFollowupId": {
+                    "type": "integer"
+                },
+                "serviceMode": {
+                    "type": "integer"
+                }
+            }
+        },
         "model.EnterpriseNature": {
             "type": "object",
             "properties": {
@@ -5659,6 +5804,32 @@
                 }
             }
         },
+        "model.ServiceFeeManage": {
+            "type": "object",
+            "properties": {
+                "client": {
+                    "$ref": "#/definitions/model.Client"
+                },
+                "client_id": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "latest_date": {
+                    "type": "string"
+                },
+                "member_id": {
+                    "type": "integer"
+                },
+                "remark": {
+                    "type": "string"
+                }
+            }
+        },
         "model.ServiceFollowup": {
             "type": "object",
             "properties": {
@@ -5667,6 +5838,9 @@
                 },
                 "contactId": {
                     "type": "integer"
+                },
+                "customerServiceSheet": {
+                    "$ref": "#/definitions/model.CustomerServiceSheet"
                 },
                 "file": {
                     "type": "string"
@@ -6506,6 +6680,26 @@
                 }
             }
         },
+        "request.AddServiceFeeManage": {
+            "type": "object",
+            "properties": {
+                "client_id": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "latest_date": {
+                    "type": "string"
+                },
+                "member_id": {
+                    "type": "integer"
+                },
+                "remark": {
+                    "type": "string"
+                }
+            }
+        },
         "request.AddServiceFollowup": {
             "type": "object",
             "properties": {
@@ -6608,6 +6802,102 @@
                 "pos": {
                     "description": "鐢ㄦ埛宀椾綅",
                     "type": "string"
+                }
+            }
+        },
+        "request.Client": {
+            "type": "object",
+            "properties": {
+                "business_scope": {
+                    "description": "缁忚惀鑼冨洿",
+                    "type": "string"
+                },
+                "city_id": {
+                    "type": "integer"
+                },
+                "client_level_id": {
+                    "description": "瀹㈡埛绛夌骇ID",
+                    "type": "integer"
+                },
+                "client_origin_id": {
+                    "description": "瀹㈡埛鏉ユ簮ID",
+                    "type": "integer"
+                },
+                "client_status_id": {
+                    "description": "瀹㈡埛鐘舵�両D",
+                    "type": "integer"
+                },
+                "client_type_id": {
+                    "description": "瀹㈡埛绫诲瀷ID",
+                    "type": "integer"
+                },
+                "contact": {
+                    "$ref": "#/definitions/request.Contact"
+                },
+                "country_id": {
+                    "type": "integer"
+                },
+                "detail_address": {
+                    "description": "璇︾粏鍦板潃",
+                    "type": "string"
+                },
+                "enterprise_nature_id": {
+                    "description": "浼佷笟鎬ц川",
+                    "type": "integer"
+                },
+                "enterprise_scale_id": {
+                    "description": "浼佷笟瑙勬ā",
+                    "type": "integer"
+                },
+                "industry_id": {
+                    "description": "鎵�灞炶涓�",
+                    "type": "integer"
+                },
+                "latest_service_time": {
+                    "description": "鏈�鏅氭湇鍔℃椂闂�",
+                    "type": "string"
+                },
+                "member_id": {
+                    "description": "閿�鍞礋璐d汉ID",
+                    "type": "integer"
+                },
+                "name": {
+                    "description": "鍏徃鍚嶇О",
+                    "type": "string"
+                },
+                "next_visit_time": {
+                    "description": "涓嬫鍥炶鏃堕棿",
+                    "type": "string"
+                },
+                "number": {
+                    "description": "鍏徃缂栧彿",
+                    "type": "string"
+                },
+                "province_id": {
+                    "type": "integer"
+                },
+                "region_id": {
+                    "type": "integer"
+                },
+                "registered_capital_id": {
+                    "description": "娉ㄥ唽璧勯噾",
+                    "type": "integer"
+                },
+                "registration_time": {
+                    "description": "娉ㄥ唽鏃堕棿",
+                    "type": "string"
+                },
+                "remark": {
+                    "description": "澶囨敞",
+                    "type": "string"
+                },
+                "representative": {
+                    "description": "娉曚汉浠h〃",
+                    "type": "string"
+                },
+                "service_member_id": {
+                    "description": "鏈嶅姟璐熻矗浜篒D",
+                    "type": "integer"
                 }
             }
         },
@@ -8089,6 +8379,32 @@
                 }
             }
         },
+        "request.UpdateServiceFeeManage": {
+            "type": "object",
+            "properties": {
+                "client": {
+                    "$ref": "#/definitions/request.Client"
+                },
+                "client_id": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "latest_date": {
+                    "type": "string"
+                },
+                "member_id": {
+                    "type": "integer"
+                },
+                "remark": {
+                    "type": "string"
+                }
+            }
+        },
         "request.UpdateServiceFollowup": {
             "type": "object",
             "properties": {
@@ -8528,6 +8844,17 @@
                 }
             }
         },
+        "response.ServiceFeeManageResponse": {
+            "type": "object",
+            "properties": {
+                "list": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.ServiceFeeManage"
+                    }
+                }
+            }
+        },
         "response.ServiceFollowupResponse": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.json b/docs/swagger.json
index 9ec5ed2..7ced27c 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -3960,6 +3960,125 @@
                 }
             }
         },
+        "/api/serviceFeeManage/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "ServiceFeeManage"
+                ],
+                "summary": "娣诲姞鏈嶅姟璐圭鐞�",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddServiceFeeManage"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/serviceFeeManage/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "ServiceFeeManage"
+                ],
+                "summary": "鍒犻櫎鏈嶅姟璐圭鐞�",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/serviceFeeManage/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "ServiceFeeManage"
+                ],
+                "summary": "鏈嶅姟璐圭鐞嗗垪琛�",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/contextx.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/response.ServiceFeeManageResponse"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/serviceFeeManage/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "ServiceFeeManage"
+                ],
+                "summary": "鏇存柊鏈嶅姟璐圭鐞�",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateServiceFeeManage"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/serviceFollowup/add": {
             "post": {
                 "produces": [
@@ -4996,6 +5115,32 @@
                 }
             }
         },
+        "model.CustomerServiceSheet": {
+            "type": "object",
+            "properties": {
+                "handleStatus": {
+                    "type": "integer"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "priority": {
+                    "type": "integer"
+                },
+                "serviceFollowupId": {
+                    "type": "integer"
+                },
+                "serviceMode": {
+                    "type": "integer"
+                }
+            }
+        },
         "model.EnterpriseNature": {
             "type": "object",
             "properties": {
@@ -5647,6 +5792,32 @@
                 }
             }
         },
+        "model.ServiceFeeManage": {
+            "type": "object",
+            "properties": {
+                "client": {
+                    "$ref": "#/definitions/model.Client"
+                },
+                "client_id": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "latest_date": {
+                    "type": "string"
+                },
+                "member_id": {
+                    "type": "integer"
+                },
+                "remark": {
+                    "type": "string"
+                }
+            }
+        },
         "model.ServiceFollowup": {
             "type": "object",
             "properties": {
@@ -5655,6 +5826,9 @@
                 },
                 "contactId": {
                     "type": "integer"
+                },
+                "customerServiceSheet": {
+                    "$ref": "#/definitions/model.CustomerServiceSheet"
                 },
                 "file": {
                     "type": "string"
@@ -6494,6 +6668,26 @@
                 }
             }
         },
+        "request.AddServiceFeeManage": {
+            "type": "object",
+            "properties": {
+                "client_id": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "latest_date": {
+                    "type": "string"
+                },
+                "member_id": {
+                    "type": "integer"
+                },
+                "remark": {
+                    "type": "string"
+                }
+            }
+        },
         "request.AddServiceFollowup": {
             "type": "object",
             "properties": {
@@ -6596,6 +6790,102 @@
                 "pos": {
                     "description": "鐢ㄦ埛宀椾綅",
                     "type": "string"
+                }
+            }
+        },
+        "request.Client": {
+            "type": "object",
+            "properties": {
+                "business_scope": {
+                    "description": "缁忚惀鑼冨洿",
+                    "type": "string"
+                },
+                "city_id": {
+                    "type": "integer"
+                },
+                "client_level_id": {
+                    "description": "瀹㈡埛绛夌骇ID",
+                    "type": "integer"
+                },
+                "client_origin_id": {
+                    "description": "瀹㈡埛鏉ユ簮ID",
+                    "type": "integer"
+                },
+                "client_status_id": {
+                    "description": "瀹㈡埛鐘舵�両D",
+                    "type": "integer"
+                },
+                "client_type_id": {
+                    "description": "瀹㈡埛绫诲瀷ID",
+                    "type": "integer"
+                },
+                "contact": {
+                    "$ref": "#/definitions/request.Contact"
+                },
+                "country_id": {
+                    "type": "integer"
+                },
+                "detail_address": {
+                    "description": "璇︾粏鍦板潃",
+                    "type": "string"
+                },
+                "enterprise_nature_id": {
+                    "description": "浼佷笟鎬ц川",
+                    "type": "integer"
+                },
+                "enterprise_scale_id": {
+                    "description": "浼佷笟瑙勬ā",
+                    "type": "integer"
+                },
+                "industry_id": {
+                    "description": "鎵�灞炶涓�",
+                    "type": "integer"
+                },
+                "latest_service_time": {
+                    "description": "鏈�鏅氭湇鍔℃椂闂�",
+                    "type": "string"
+                },
+                "member_id": {
+                    "description": "閿�鍞礋璐d汉ID",
+                    "type": "integer"
+                },
+                "name": {
+                    "description": "鍏徃鍚嶇О",
+                    "type": "string"
+                },
+                "next_visit_time": {
+                    "description": "涓嬫鍥炶鏃堕棿",
+                    "type": "string"
+                },
+                "number": {
+                    "description": "鍏徃缂栧彿",
+                    "type": "string"
+                },
+                "province_id": {
+                    "type": "integer"
+                },
+                "region_id": {
+                    "type": "integer"
+                },
+                "registered_capital_id": {
+                    "description": "娉ㄥ唽璧勯噾",
+                    "type": "integer"
+                },
+                "registration_time": {
+                    "description": "娉ㄥ唽鏃堕棿",
+                    "type": "string"
+                },
+                "remark": {
+                    "description": "澶囨敞",
+                    "type": "string"
+                },
+                "representative": {
+                    "description": "娉曚汉浠h〃",
+                    "type": "string"
+                },
+                "service_member_id": {
+                    "description": "鏈嶅姟璐熻矗浜篒D",
+                    "type": "integer"
                 }
             }
         },
@@ -8077,6 +8367,32 @@
                 }
             }
         },
+        "request.UpdateServiceFeeManage": {
+            "type": "object",
+            "properties": {
+                "client": {
+                    "$ref": "#/definitions/request.Client"
+                },
+                "client_id": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "latest_date": {
+                    "type": "string"
+                },
+                "member_id": {
+                    "type": "integer"
+                },
+                "remark": {
+                    "type": "string"
+                }
+            }
+        },
         "request.UpdateServiceFollowup": {
             "type": "object",
             "properties": {
@@ -8516,6 +8832,17 @@
                 }
             }
         },
+        "response.ServiceFeeManageResponse": {
+            "type": "object",
+            "properties": {
+                "list": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.ServiceFeeManage"
+                    }
+                }
+            }
+        },
         "response.ServiceFollowupResponse": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index 3f09b42..1a9724c 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -296,6 +296,23 @@
           $ref: '#/definitions/model.Province'
         type: array
     type: object
+  model.CustomerServiceSheet:
+    properties:
+      handleStatus:
+        type: integer
+      id:
+        type: integer
+      memberId:
+        type: integer
+      number:
+        type: string
+      priority:
+        type: integer
+      serviceFollowupId:
+        type: integer
+      serviceMode:
+        type: integer
+    type: object
   model.EnterpriseNature:
     properties:
       id:
@@ -723,12 +740,31 @@
       typeId:
         type: integer
     type: object
+  model.ServiceFeeManage:
+    properties:
+      client:
+        $ref: '#/definitions/model.Client'
+      client_id:
+        type: integer
+      file:
+        type: string
+      id:
+        type: integer
+      latest_date:
+        type: string
+      member_id:
+        type: integer
+      remark:
+        type: string
+    type: object
   model.ServiceFollowup:
     properties:
       clientId:
         type: integer
       contactId:
         type: integer
+      customerServiceSheet:
+        $ref: '#/definitions/model.CustomerServiceSheet'
       file:
         type: string
       id:
@@ -1293,6 +1329,19 @@
       typeId:
         type: integer
     type: object
+  request.AddServiceFeeManage:
+    properties:
+      client_id:
+        type: integer
+      file:
+        type: string
+      latest_date:
+        type: string
+      member_id:
+        type: integer
+      remark:
+        type: string
+    type: object
   request.AddServiceFollowup:
     properties:
       clientId:
@@ -1363,6 +1412,76 @@
       pos:
         description: 鐢ㄦ埛宀椾綅
         type: string
+    type: object
+  request.Client:
+    properties:
+      business_scope:
+        description: 缁忚惀鑼冨洿
+        type: string
+      city_id:
+        type: integer
+      client_level_id:
+        description: 瀹㈡埛绛夌骇ID
+        type: integer
+      client_origin_id:
+        description: 瀹㈡埛鏉ユ簮ID
+        type: integer
+      client_status_id:
+        description: 瀹㈡埛鐘舵�両D
+        type: integer
+      client_type_id:
+        description: 瀹㈡埛绫诲瀷ID
+        type: integer
+      contact:
+        $ref: '#/definitions/request.Contact'
+      country_id:
+        type: integer
+      detail_address:
+        description: 璇︾粏鍦板潃
+        type: string
+      enterprise_nature_id:
+        description: 浼佷笟鎬ц川
+        type: integer
+      enterprise_scale_id:
+        description: 浼佷笟瑙勬ā
+        type: integer
+      industry_id:
+        description: 鎵�灞炶涓�
+        type: integer
+      latest_service_time:
+        description: 鏈�鏅氭湇鍔℃椂闂�
+        type: string
+      member_id:
+        description: 閿�鍞礋璐d汉ID
+        type: integer
+      name:
+        description: 鍏徃鍚嶇О
+        type: string
+      next_visit_time:
+        description: 涓嬫鍥炶鏃堕棿
+        type: string
+      number:
+        description: 鍏徃缂栧彿
+        type: string
+      province_id:
+        type: integer
+      region_id:
+        type: integer
+      registered_capital_id:
+        description: 娉ㄥ唽璧勯噾
+        type: integer
+      registration_time:
+        description: 娉ㄥ唽鏃堕棿
+        type: string
+      remark:
+        description: 澶囨敞
+        type: string
+      representative:
+        description: 娉曚汉浠h〃
+        type: string
+      service_member_id:
+        description: 鏈嶅姟璐熻矗浜篒D
+        type: integer
     type: object
   request.Contact:
     properties:
@@ -2363,6 +2482,23 @@
       typeId:
         type: integer
     type: object
+  request.UpdateServiceFeeManage:
+    properties:
+      client:
+        $ref: '#/definitions/request.Client'
+      client_id:
+        type: integer
+      file:
+        type: string
+      id:
+        type: integer
+      latest_date:
+        type: string
+      member_id:
+        type: integer
+      remark:
+        type: string
+    type: object
   request.UpdateServiceFollowup:
     properties:
       clientId:
@@ -2643,6 +2779,13 @@
       list:
         items:
           $ref: '#/definitions/model.ServiceContract'
+        type: array
+    type: object
+  response.ServiceFeeManageResponse:
+    properties:
+      list:
+        items:
+          $ref: '#/definitions/model.ServiceFeeManage'
         type: array
     type: object
   response.ServiceFollowupResponse:
@@ -5099,6 +5242,79 @@
       summary: 鏇存柊鏈嶅姟鍚堝悓
       tags:
       - ServiceContract
+  /api/serviceFeeManage/add:
+    post:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.AddServiceFeeManage'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 娣诲姞鏈嶅姟璐圭鐞�
+      tags:
+      - ServiceFeeManage
+  /api/serviceFeeManage/delete/{id}:
+    delete:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: path
+        name: id
+        required: true
+        type: integer
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 鍒犻櫎鏈嶅姟璐圭鐞�
+      tags:
+      - ServiceFeeManage
+  /api/serviceFeeManage/list:
+    get:
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            allOf:
+            - $ref: '#/definitions/contextx.Response'
+            - properties:
+                data:
+                  $ref: '#/definitions/response.ServiceFeeManageResponse'
+              type: object
+      summary: 鏈嶅姟璐圭鐞嗗垪琛�
+      tags:
+      - ServiceFeeManage
+  /api/serviceFeeManage/update:
+    put:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.UpdateServiceFeeManage'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 鏇存柊鏈嶅姟璐圭鐞�
+      tags:
+      - ServiceFeeManage
   /api/serviceFollowup/add:
     post:
       parameters:
diff --git a/logs/aps-admin.err.log b/logs/aps-admin.err.log
index aba294a..8baf3e6 100644
--- a/logs/aps-admin.err.log
+++ b/logs/aps-admin.err.log
@@ -350,3 +350,14 @@
 [2023-07-13 10:57:45]	[error]	[aps_crm/model.(*ServiceContractSearch).FindAll:80]	trace	{"error": ": unsupported relations for schema ServiceContract", "elapsed": 0.0011591, "rows": 2, "sql": "SELECT * FROM `service_contract`"}
 [2023-07-13 14:11:03]	[error]	[aps_crm/model.(*ServiceFollowupSearch).Create:53]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.service_followup' doesn't exist", "elapsed": 0.0024191, "rows": 0, "sql": "INSERT INTO `service_followup` (`client_id`,`number`,`contact_id`,`service_id`,`member_id`,`plan_id`,`satisfaction`,`timely_rate`,`solve_rate`,`is_visit`,`old_member_id`,`remark`,`file`) VALUES (0,'HF21',0,0,110,0,0,0,0,0,0,'string','string')"}
 [2023-07-13 15:00:16]	[error]	[aps_crm/model.(*CustomerServiceSheetSearch).Create:46]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.customer_service_sheet' doesn't exist", "elapsed": 0.0020622, "rows": 0, "sql": "INSERT INTO `customer_service_sheet` (`member_id`,`number`,`service_mode`,`priority`,`handle_status`,`created_at`,`updated_at`,`deleted_at`) VALUES (110,'HF30',0,0,0,'2023-07-13 15:00:16.507','2023-07-13 15:00:16.507',NULL)"}
+[2023-07-13 16:51:08]	[error]	[aps_crm/model.(*ServiceFeeManageSearch).Create:51]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.service_fee_manage' doesn't exist", "elapsed": 0.0153005, "rows": 0, "sql": "INSERT INTO `service_fee_manage` (`client_id`,`member_id`,`latest_date`,`remark`,`file`,`created_at`,`updated_at`,`deleted_at`) VALUES (11,11,'1970-01-01 08:00:00','string','string','2023-07-13 16:51:08.533','2023-07-13 16:51:08.533',NULL)"}
+[2023-07-13 17:00:44]	[error]	[aps_crm/model.(*ServiceFeeManageSearch).Update:56]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1", "elapsed": 0.0027936, "rows": 0, "sql": "UPDATE `service_fee_manage` SET `id`=1,`client_id`=11,`member_id`=11,`latest_date`='1970-01-01 08:00:00',`remark`='string',`file`='string',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 17:00:44.246',`deleted_at`=NULL WHERE id = 1 AND `service_fee_manage`.`deleted_at` IS NULL"}
+[2023-07-13 17:01:15]	[error]	[aps_crm/model.(*ServiceFeeManageSearch).Update:56]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1", "elapsed": 0.0022256, "rows": 0, "sql": "UPDATE `service_fee_manage` SET `id`=1,`client_id`=11,`member_id`=11,`latest_date`='1970-01-01 08:00:00',`remark`='string',`file`='string',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 17:01:15.183',`deleted_at`=NULL WHERE id = 1 AND `service_fee_manage`.`deleted_at` IS NULL"}
+[2023-07-13 17:08:23]	[error]	[aps_crm/model.(*ServiceFeeManageSearch).Update:56]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1", "elapsed": 0.0017581, "rows": 0, "sql": "UPDATE `service_fee_manage` SET `id`=1,`client_id`=11,`member_id`=11,`latest_date`='1970-01-01 08:00:00',`remark`='string',`file`='string',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 17:08:23.099',`deleted_at`=NULL WHERE id = 1 AND `service_fee_manage`.`deleted_at` IS NULL"}
+[2023-07-13 17:48:17]	[error]	[aps_crm/model.(*ClientSearch).Update:70]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'registration_time' at row 1", "elapsed": 0.0058166, "rows": 0, "sql": "UPDATE `clients` SET `id`=11,`name`='string',`number`='string',`client_status_id`=1,`client_type_id`=0,`client_origin_id`=0,`client_level_id`=0,`member_id`=11,`service_member_id`=0,`detail_address`='string',`remark`='string',`next_visit_time`='1970-01-01 08:00:00',`latest_service_time`='1970-01-01 08:00:00',`country_id`=0,`province_id`=0,`city_id`=0,`region_id`=0,`representative`='',`registration_time`='0000-00-00 00:00:00',`registered_capital_id`=0,`industry_id`=0,`enterprise_nature_id`=0,`enterprise_scale_id`=0,`business_scope`='',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 17:48:17.558',`deleted_at`=NULL WHERE id = 11 AND `clients`.`deleted_at` IS NULL"}
+[2023-07-13 17:51:09]	[error]	[aps_crm/model.(*ClientSearch).Update:70]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'registration_time' at row 1", "elapsed": 0.0012249, "rows": 0, "sql": "UPDATE `clients` SET `id`=11,`name`='string',`number`='string',`client_status_id`=1,`client_type_id`=0,`client_origin_id`=0,`client_level_id`=0,`member_id`=11,`service_member_id`=0,`detail_address`='string',`remark`='string',`next_visit_time`='1970-01-01 08:00:00',`latest_service_time`='1970-01-01 08:00:00',`country_id`=0,`province_id`=0,`city_id`=0,`region_id`=0,`representative`='',`registration_time`='0000-00-00 00:00:00',`registered_capital_id`=0,`industry_id`=0,`enterprise_nature_id`=0,`enterprise_scale_id`=0,`business_scope`='',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 17:51:09.321',`deleted_at`=NULL WHERE id = 11 AND `clients`.`deleted_at` IS NULL"}
+[2023-07-13 17:53:30]	[error]	[aps_crm/model.(*ClientSearch).Update:70]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'registration_time' at row 1", "elapsed": 0.0027763, "rows": 0, "sql": "UPDATE `clients` SET `id`=11,`name`='string',`number`='string',`client_status_id`=1,`client_type_id`=0,`client_origin_id`=0,`client_level_id`=0,`member_id`=11,`service_member_id`=0,`detail_address`='string',`remark`='string',`next_visit_time`='1970-01-01 08:00:00',`latest_service_time`='1970-01-01 08:00:00',`country_id`=0,`province_id`=0,`city_id`=0,`region_id`=0,`representative`='',`registration_time`='0000-00-00 00:00:00',`registered_capital_id`=0,`industry_id`=0,`enterprise_nature_id`=0,`enterprise_scale_id`=0,`business_scope`='',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 17:53:30.214',`deleted_at`=NULL WHERE id = 11 AND `clients`.`deleted_at` IS NULL"}
+[2023-07-13 17:58:57]	[error]	[aps_crm/model.(*ClientSearch).Update:70]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1", "elapsed": 0.0033448, "rows": 0, "sql": "UPDATE `clients` SET `id`=11,`name`='string',`number`='string',`client_status_id`=1,`client_type_id`=0,`client_origin_id`=0,`client_level_id`=0,`member_id`=11,`service_member_id`=0,`detail_address`='string',`remark`='string',`next_visit_time`='1970-01-01 08:00:00',`latest_service_time`='1970-01-01 08:00:00',`country_id`=0,`province_id`=0,`city_id`=1,`region_id`=0,`representative`='string',`registration_time`='1970-01-01 08:00:00',`registered_capital_id`=0,`industry_id`=0,`enterprise_nature_id`=0,`enterprise_scale_id`=0,`business_scope`='string',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 17:58:57.549',`deleted_at`=NULL WHERE id = 11 AND `clients`.`deleted_at` IS NULL"}
+[2023-07-13 17:59:36]	[error]	[aps_crm/model.(*ClientSearch).Update:70]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1", "elapsed": 0.0011543, "rows": 0, "sql": "UPDATE `clients` SET `id`=11,`name`='string',`number`='string',`client_status_id`=1,`client_type_id`=0,`client_origin_id`=0,`client_level_id`=0,`member_id`=11,`service_member_id`=0,`detail_address`='string',`remark`='string',`next_visit_time`='1970-01-01 08:00:00',`latest_service_time`='1970-01-01 08:00:00',`country_id`=0,`province_id`=0,`city_id`=1,`region_id`=0,`representative`='string',`registration_time`='1970-01-01 08:00:00',`registered_capital_id`=0,`industry_id`=0,`enterprise_nature_id`=0,`enterprise_scale_id`=0,`business_scope`='string',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 17:59:36.66',`deleted_at`=NULL WHERE id = 11 AND `clients`.`deleted_at` IS NULL"}
+[2023-07-13 18:01:19]	[error]	[aps_crm/model.(*ClientSearch).Update:70]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1", "elapsed": 0.0013602, "rows": 0, "sql": "UPDATE `clients` SET `id`=11,`name`='string',`number`='string',`client_status_id`=1,`client_type_id`=0,`client_origin_id`=0,`client_level_id`=0,`member_id`=11,`service_member_id`=0,`detail_address`='string',`remark`='string',`next_visit_time`='1970-01-01 08:00:00',`latest_service_time`='1970-01-01 08:00:00',`country_id`=0,`province_id`=0,`city_id`=1,`region_id`=0,`representative`='string',`registration_time`='1970-01-01 08:00:00',`registered_capital_id`=0,`industry_id`=0,`enterprise_nature_id`=0,`enterprise_scale_id`=0,`business_scope`='string',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 18:01:19.088',`deleted_at`=NULL WHERE id = 11 AND `clients`.`deleted_at` IS NULL"}
+[2023-07-13 18:01:58]	[error]	[aps_crm/model.(*ClientSearch).Update:70]	trace	{"error": "Error 1062 (23000): Duplicate entry 'string' for key 'name'", "elapsed": 0.0014261, "rows": 0, "sql": "UPDATE `clients` SET `id`=11,`name`='string',`number`='string',`client_status_id`=1,`member_id`=11,`detail_address`='string',`remark`='string',`next_visit_time`='1970-01-01 08:00:00',`latest_service_time`='1970-01-01 08:00:00',`city_id`=1,`representative`='string',`registration_time`='1970-01-01 08:00:00',`business_scope`='string',`updated_at`='2023-07-13 18:01:58.989' WHERE id = 11 AND `clients`.`deleted_at` IS NULL"}
diff --git a/model/client.go b/model/client.go
index 931337c..c9b994f 100644
--- a/model/client.go
+++ b/model/client.go
@@ -38,9 +38,13 @@
 	return "clients"
 }
 
-func NewClientSearch() *ClientSearch {
+func NewClientSearch(db *gorm.DB) *ClientSearch {
+	if db == nil {
+		db = mysqlx.GetDB()
+	}
+
 	return &ClientSearch{
-		Orm: mysqlx.GetDB(),
+		Orm: db,
 	}
 }
 
@@ -63,7 +67,7 @@
 
 func (slf *ClientSearch) Update(record *Client) error {
 	var db = slf.build()
-	return db.Save(record).Error
+	return db.Updates(record).Error
 }
 
 func (slf *ClientSearch) Delete() error {
diff --git a/model/index.go b/model/index.go
index bedc358..e1495ff 100644
--- a/model/index.go
+++ b/model/index.go
@@ -59,6 +59,7 @@
 		OrderManage{},
 		ServiceFollowup{},
 		CustomerServiceSheet{},
+		ServiceFeeManage{},
 	)
 	return err
 }
diff --git a/model/request/serviceFeeManage.go b/model/request/serviceFeeManage.go
new file mode 100644
index 0000000..2972640
--- /dev/null
+++ b/model/request/serviceFeeManage.go
@@ -0,0 +1,19 @@
+package request
+
+type AddServiceFeeManage struct {
+	ServiceFeeManage
+}
+
+type ServiceFeeManage struct {
+	ClientId   int    `json:"client_id"`
+	MemberId   int    `json:"member_id"`
+	LatestDate string `json:"latest_date"`
+	Remark     string `json:"remark"`
+	File       string `json:"file"`
+}
+
+type UpdateServiceFeeManage struct {
+	Id     int    `json:"id"`
+	Client Client `json:"client"`
+	ServiceFeeManage
+}
diff --git a/model/response/response.go b/model/response/response.go
index 0665063..b22ccdf 100644
--- a/model/response/response.go
+++ b/model/response/response.go
@@ -169,4 +169,8 @@
 	CustomerServiceSheetResponse struct {
 		List []*model.CustomerServiceSheet `json:"list"`
 	}
+
+	ServiceFeeManageResponse struct {
+		List []*model.ServiceFeeManage `json:"list"`
+	}
 )
diff --git a/model/serviceFeeManage.go b/model/serviceFeeManage.go
new file mode 100644
index 0000000..5905d04
--- /dev/null
+++ b/model/serviceFeeManage.go
@@ -0,0 +1,85 @@
+package model
+
+import (
+	"aps_crm/pkg/mysqlx"
+	"gorm.io/gorm"
+	"time"
+)
+
+type (
+	ServiceFeeManage struct {
+		Id         int       `json:"id" gorm:"column:id;primaryKey;autoIncrement;not null"`
+		ClientId   int       `json:"client_id" gorm:"column:client_id;type:int(11);comment:瀹㈡埛ID"`
+		Client     *Client   `json:"client" gorm:"foreignKey:ClientId"`
+		MemberId   int       `json:"member_id" gorm:"column:member_id;type:int(11);comment:鍛樺伐ID"`
+		LatestDate time.Time `json:"latest_date" gorm:"column:latest_date;type:datetime;comment:鏈�鏅氭湇鍔℃椂闂�"`
+		Remark     string    `json:"remark" gorm:"column:remark;type:varchar(255);comment:澶囨敞"`
+		File       string    `json:"file" gorm:"column:file;type:varchar(255);comment:鏂囦欢"`
+		gorm.Model `json:"-"`
+	}
+
+	ServiceFeeManageSearch struct {
+		ServiceFeeManage
+		Orm *gorm.DB
+	}
+)
+
+func (ServiceFeeManage) TableName() string {
+	return "service_fee_manage"
+}
+
+func NewServiceFeeManageSearch(db *gorm.DB) *ServiceFeeManageSearch {
+	if db == nil {
+		db = mysqlx.GetDB()
+	}
+
+	return &ServiceFeeManageSearch{
+		Orm: db,
+	}
+}
+
+func (slf *ServiceFeeManageSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&ServiceFeeManage{})
+	if slf.Id != 0 {
+		db.Where("id = ?", slf.Id)
+	}
+	if slf.ClientId != 0 {
+		db.Where("client_id = ?", slf.ClientId)
+	}
+
+	return db
+}
+
+func (slf *ServiceFeeManageSearch) Create(record *ServiceFeeManage) error {
+	var db = slf.build()
+	return db.Create(record).Error
+}
+
+func (slf *ServiceFeeManageSearch) Update(record *ServiceFeeManage) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
+
+func (slf *ServiceFeeManageSearch) Delete() error {
+	var db = slf.build()
+	return db.Delete(&ServiceFeeManage{}).Error
+}
+
+func (slf *ServiceFeeManageSearch) SetId(id int) *ServiceFeeManageSearch {
+	slf.Id = id
+	return slf
+}
+
+func (slf *ServiceFeeManageSearch) Find() (*ServiceFeeManage, error) {
+	var db = slf.build()
+	var record = new(ServiceFeeManage)
+	err := db.First(record).Error
+	return record, err
+}
+
+func (slf *ServiceFeeManageSearch) FindAll() ([]*ServiceFeeManage, error) {
+	var db = slf.build()
+	var records = make([]*ServiceFeeManage, 0)
+	err := db.Find(&records).Error
+	return records, err
+}
diff --git a/pkg/ecode/code.go b/pkg/ecode/code.go
index a62d3a9..f6ebb8a 100644
--- a/pkg/ecode/code.go
+++ b/pkg/ecode/code.go
@@ -260,4 +260,12 @@
 	CustomerServiceSheetSetErr    = 3600004 // 璁剧疆瀹㈡湇鍗曞け璐�
 	CustomerServiceSheetUpdateErr = 3600005 // 鏇存柊瀹㈡湇鍗曞け璐�
 	CustomerServiceSheetDeleteErr = 3600006 // 鍒犻櫎瀹㈡湇鍗曞け璐�
+
+	ServiceFeeManageExist     = 3700001 // 鏈嶅姟璐圭鐞嗗凡瀛樺湪
+	ServiceFeeManageNotExist  = 3700002 // 鏈嶅姟璐圭鐞嗕笉瀛樺湪
+	ServiceFeeManageListErr   = 3700003 // 鑾峰彇鏈嶅姟璐圭鐞嗗垪琛ㄥけ璐�
+	ServiceFeeManageSetErr    = 3700004 // 璁剧疆鏈嶅姟璐圭鐞嗗け璐�
+	ServiceFeeManageUpdateErr = 3700005 // 鏇存柊鏈嶅姟璐圭鐞嗗け璐�
+	ServiceFeeManageDeleteErr = 3700006 // 鍒犻櫎鏈嶅姟璐圭鐞嗗け璐�
+
 )
diff --git a/router/index.go b/router/index.go
index f0fe7b7..f4bf5a5 100644
--- a/router/index.go
+++ b/router/index.go
@@ -49,6 +49,7 @@
 	OrderManageRouter
 	ServiceFollowupRouter
 	CustomerServiceSheetRouter
+	ServiceFeeManageRouter
 }
 
 func InitRouter() *gin.Engine {
@@ -115,6 +116,7 @@
 		routerGroup.InitOrderManageRouter(PrivateGroup)          // 娉ㄥ唽orderManage璺敱
 		routerGroup.InitServiceFollowupRouter(PrivateGroup)      // 娉ㄥ唽serviceFollowup璺敱
 		routerGroup.InitCustomerServiceSheetRouter(PrivateGroup) // 娉ㄥ唽customerServiceSheet璺敱
+		routerGroup.InitServiceFeeManageRouter(PrivateGroup)     // 娉ㄥ唽serviceFeeManage璺敱
 	}
 	return Router
 }
diff --git a/router/serviceFeeManage.go b/router/serviceFeeManage.go
new file mode 100644
index 0000000..92fd410
--- /dev/null
+++ b/router/serviceFeeManage.go
@@ -0,0 +1,19 @@
+package router
+
+import (
+	v1 "aps_crm/api/v1"
+	"github.com/gin-gonic/gin"
+)
+
+type ServiceFeeManageRouter struct{}
+
+func (s *ServiceFeeManageRouter) InitServiceFeeManageRouter(router *gin.RouterGroup) {
+	serviceFeeManageRouter := router.Group("serviceFeeManage")
+	serviceFeeManageApi := v1.ApiGroup.ServiceFeeManageApi
+	{
+		serviceFeeManageRouter.POST("add", serviceFeeManageApi.Add)             // 娣诲姞鏈嶅姟璐圭鐞�
+		serviceFeeManageRouter.DELETE("delete/:id", serviceFeeManageApi.Delete) // 鍒犻櫎鏈嶅姟璐圭鐞�
+		serviceFeeManageRouter.PUT("update", serviceFeeManageApi.Update)        // 鏇存柊鏈嶅姟璐圭鐞�
+		serviceFeeManageRouter.GET("list", serviceFeeManageApi.List)            // 鑾峰彇鏈嶅姟璐圭鐞嗗垪琛�
+	}
+}
diff --git a/service/client.go b/service/client.go
index 8ec562a..260ef66 100644
--- a/service/client.go
+++ b/service/client.go
@@ -8,7 +8,7 @@
 type ClientService struct{}
 
 func (ClientService) AddClient(client *model.Client) int {
-	err := model.NewClientSearch().Create(client)
+	err := model.NewClientSearch(nil).Create(client)
 	if err != nil {
 		return ecode.ClientExist
 	}
@@ -17,13 +17,13 @@
 
 func (ClientService) DeleteClient(id int) int {
 	// check client exist
-	_, err := model.NewClientSearch().SetId(id).First()
+	_, err := model.NewClientSearch(nil).SetId(id).First()
 	if err != nil {
 		return ecode.ClientNotExist
 	}
 
 	// delete client
-	err = model.NewClientSearch().SetId(id).Delete()
+	err = model.NewClientSearch(nil).SetId(id).Delete()
 	if err != nil {
 		return ecode.ClientDeleteErr
 	}
@@ -32,7 +32,7 @@
 
 func (ClientService) GetClientList() (int, []*model.Client) {
 	// get client list
-	clients, err := model.NewClientSearch().Find()
+	clients, err := model.NewClientSearch(nil).Find()
 	if err != nil {
 		return ecode.ClientListErr, nil
 	}
@@ -42,7 +42,7 @@
 
 // CheckClientExist check client exist
 func CheckClientExist(id int) int {
-	_, err := model.NewClientSearch().SetId(id).First()
+	_, err := model.NewClientSearch(nil).SetId(id).First()
 	if err != nil {
 		return ecode.ClientNotExist
 	}
@@ -58,7 +58,7 @@
 	}
 
 	// update client
-	err := model.NewClientSearch().SetId(client.Id).Update(client)
+	err := model.NewClientSearch(nil).SetId(client.Id).Update(client)
 	if err != nil {
 		return ecode.ClientUpdateErr
 	}
diff --git a/service/index.go b/service/index.go
index 4c2e03e..bd133db 100644
--- a/service/index.go
+++ b/service/index.go
@@ -38,6 +38,7 @@
 	OrderManageService
 	FollowupService
 	CustomerServiceSheetService
+	FeeManageService
 }
 
 var ServiceGroup = new(Group)
diff --git a/service/serviceFeeManage.go b/service/serviceFeeManage.go
new file mode 100644
index 0000000..a52e8c6
--- /dev/null
+++ b/service/serviceFeeManage.go
@@ -0,0 +1,66 @@
+package service
+
+import (
+	"aps_crm/model"
+	"aps_crm/pkg/ecode"
+)
+
+type FeeManageService struct{}
+
+func (FeeManageService) AddServiceFeeManage(serviceFeeManage *model.ServiceFeeManage) int {
+	err := model.NewServiceFeeManageSearch(nil).Create(serviceFeeManage)
+	if err != nil {
+		return ecode.ServiceFeeManageExist
+	}
+
+	return ecode.OK
+}
+
+func (FeeManageService) DeleteServiceFeeManage(id int) int {
+	_, err := model.NewServiceFeeManageSearch(nil).SetId(id).Find()
+	if err != nil {
+		return ecode.ServiceFeeManageNotExist
+	}
+
+	err = model.NewServiceFeeManageSearch(nil).SetId(id).Delete()
+	if err != nil {
+		return ecode.ServiceFeeManageNotExist
+	}
+	return ecode.OK
+}
+
+func (FeeManageService) GetServiceFeeManageList() ([]*model.ServiceFeeManage, int) {
+	list, err := model.NewServiceFeeManageSearch(nil).FindAll()
+	if err != nil {
+		return nil, ecode.ServiceFeeManageListErr
+	}
+
+	return list, ecode.OK
+}
+
+func (FeeManageService) UpdateServiceFeeManage(serviceFeeManage *model.ServiceFeeManage) int {
+	// check serviceFeeManage exist
+	_, err := model.NewServiceFeeManageSearch(nil).SetId(serviceFeeManage.Id).Find()
+	if err != nil {
+		return ecode.ServiceFeeManageNotExist
+	}
+
+	tx := model.NewContactSearch().Orm.Begin()
+
+	err = model.NewServiceFeeManageSearch(tx).SetId(serviceFeeManage.Id).Update(serviceFeeManage)
+	if err != nil {
+		tx.Rollback()
+		return ecode.ServiceFeeManageSetErr
+	}
+
+	// update client
+	err = model.NewClientSearch(tx).SetId(serviceFeeManage.ClientId).Update(serviceFeeManage.Client)
+	if err != nil {
+		tx.Rollback()
+		return ecode.ClientUpdateErr
+	}
+
+	tx.Commit()
+
+	return ecode.OK
+}

--
Gitblit v1.8.0