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

---
 api/v1/index.go                  |    2 
 pkg/ecode/code.go                |    6 
 docs/swagger.yaml                |  171 +++++++++
 service/serviceFollowup.go       |   54 +++
 docs/docs.go                     |  268 ++++++++++++++
 docs/swagger.json                |  268 ++++++++++++++
 model/response/response.go       |    4 
 model/serviceFollowup.go         |   83 ++++
 router/serviceFollowup.go        |   19 +
 service/index.go                 |    1 
 model/request/serviceFollowup.go |   26 +
 model/index.go                   |    1 
 logs/aps-admin.err.log           |    1 
 router/index.go                  |    2 
 api/v1/serviceFollowup.go        |  150 ++++++++
 15 files changed, 1,056 insertions(+), 0 deletions(-)

diff --git a/api/v1/index.go b/api/v1/index.go
index bdc1117..213ccca 100644
--- a/api/v1/index.go
+++ b/api/v1/index.go
@@ -41,6 +41,7 @@
 	PlanApi
 	ServiceContractApi
 	OrderManageApi
+	ServiceFollowupApi
 }
 
 var ApiGroup = new(Group)
@@ -81,4 +82,5 @@
 	planService              = service.ServiceGroup.PlanService
 	serviceContractService   = service.ServiceGroup.SContractService
 	orderManageService       = service.ServiceGroup.OrderManageService
+	serviceFollowupService   = service.ServiceGroup.FollowupService
 )
diff --git a/api/v1/serviceFollowup.go b/api/v1/serviceFollowup.go
new file mode 100644
index 0000000..65f8f53
--- /dev/null
+++ b/api/v1/serviceFollowup.go
@@ -0,0 +1,150 @@
+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 ServiceFollowupApi struct{}
+
+// Add
+//
+//	@Tags		ServiceFollowup
+//	@Summary	娣诲姞鏈嶅姟璺熻繘
+//	@Produce	application/json
+//	@Param		object	body		request.AddServiceFollowup	true	"鏌ヨ鍙傛暟"
+//	@Success	200		{object}	contextx.Response{}
+//	@Router		/api/serviceFollowup/add [post]
+func (s *ServiceFollowupApi) Add(c *gin.Context) {
+	var params request.AddServiceFollowup
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode, serviceFollowup := checkServiceFollowupParams(params.ServiceFollowup)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	errCode = serviceFollowupService.AddServiceFollowup(&serviceFollowup)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Delete
+//
+//	@Tags		ServiceFollowup
+//	@Summary	鍒犻櫎鏈嶅姟璺熻繘
+//	@Produce	application/json
+//	@Param		id	path		int	true	"鏌ヨ鍙傛暟"
+//	@Success	200	{object}	contextx.Response{}
+//	@Router		/api/serviceFollowup/delete/{id} [delete]
+func (s *ServiceFollowupApi) Delete(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	id, _ := strconv.Atoi(c.Param("id"))
+	errCode := serviceFollowupService.DeleteServiceFollowup(id)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Update
+//
+//	@Tags		ServiceFollowup
+//	@Summary	鏇存柊鏈嶅姟璺熻繘
+//	@Produce	application/json
+//	@Param		object	body		request.UpdateServiceFollowup true	"鏌ヨ鍙傛暟"
+//	@Success	200	{object}	contextx.Response{}
+//	@Router		/api/serviceFollowup/update [put]
+func (s *ServiceFollowupApi) Update(c *gin.Context) {
+	var params request.UpdateServiceFollowup
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode, serviceFollowup := checkServiceFollowupParams(params.ServiceFollowup)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	errCode = serviceFollowupService.UpdateServiceFollowup(&serviceFollowup)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// List
+//
+//	@Tags		ServiceFollowup
+//	@Summary	鏈嶅姟璺熻繘鍒楄〃
+//	@Produce	application/json
+//	@Success	200	{object}	contextx.Response{data=response.ServiceFollowupResponse}
+//	@Router		/api/serviceFollowup/list [get]
+func (s *ServiceFollowupApi) List(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	list, errCode := serviceFollowupService.GetServiceFollowupList()
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.OkWithDetailed(response.ServiceFollowupResponse{
+		List: list,
+	})
+}
+
+// checkServiceFollowupParams
+func checkServiceFollowupParams(serviceFollowup request.ServiceFollowup) (errCode int, serviceFollowupModel model.ServiceFollowup) {
+	if serviceFollowup.Number == "" {
+		return ecode.InvalidParams, serviceFollowupModel
+	}
+
+	if serviceFollowup.MemberId == 0 {
+		return ecode.InvalidParams, serviceFollowupModel
+	}
+
+	serviceFollowupModel = model.ServiceFollowup{
+		ClientId:     serviceFollowup.ClientId,
+		Number:       serviceFollowup.Number,
+		ContactId:    serviceFollowup.ContactId,
+		ServiceId:    serviceFollowup.ServiceId,
+		MemberId:     serviceFollowup.MemberId,
+		PlanId:       serviceFollowup.PlanId,
+		Satisfaction: serviceFollowup.Satisfaction,
+		TimelyRate:   serviceFollowup.TimelyRate,
+		SolveRate:    serviceFollowup.SolveRate,
+		IsVisit:      serviceFollowup.IsVisit,
+		OldMemberId:  serviceFollowup.OldMemberId,
+		Remark:       serviceFollowup.Remark,
+		File:         serviceFollowup.File,
+	}
+
+	return ecode.OK, serviceFollowupModel
+}
diff --git a/docs/docs.go b/docs/docs.go
index dea128f..3a20450 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -3865,6 +3865,125 @@
                 }
             }
         },
+        "/api/serviceFollowup/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "ServiceFollowup"
+                ],
+                "summary": "娣诲姞鏈嶅姟璺熻繘",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddServiceFollowup"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/serviceFollowup/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "ServiceFollowup"
+                ],
+                "summary": "鍒犻櫎鏈嶅姟璺熻繘",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/serviceFollowup/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "ServiceFollowup"
+                ],
+                "summary": "鏈嶅姟璺熻繘鍒楄〃",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/contextx.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/response.ServiceFollowupResponse"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/serviceFollowup/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "ServiceFollowup"
+                ],
+                "summary": "鏇存柊鏈嶅姟璺熻繘",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateServiceFollowup"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/status/add": {
             "post": {
                 "produces": [
@@ -5433,6 +5552,53 @@
                 }
             }
         },
+        "model.ServiceFollowup": {
+            "type": "object",
+            "properties": {
+                "clientId": {
+                    "type": "integer"
+                },
+                "contactId": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "isVisit": {
+                    "type": "integer"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "oldMemberId": {
+                    "type": "integer"
+                },
+                "planId": {
+                    "type": "integer"
+                },
+                "remark": {
+                    "type": "string"
+                },
+                "satisfaction": {
+                    "type": "integer"
+                },
+                "serviceId": {
+                    "type": "integer"
+                },
+                "solveRate": {
+                    "type": "integer"
+                },
+                "timelyRate": {
+                    "type": "integer"
+                }
+            }
+        },
         "model.SubOrder": {
             "type": "object",
             "properties": {
@@ -6209,6 +6375,50 @@
                     "type": "string"
                 },
                 "typeId": {
+                    "type": "integer"
+                }
+            }
+        },
+        "request.AddServiceFollowup": {
+            "type": "object",
+            "properties": {
+                "clientId": {
+                    "type": "integer"
+                },
+                "contactId": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "isVisit": {
+                    "type": "integer"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "oldMemberId": {
+                    "type": "integer"
+                },
+                "planId": {
+                    "type": "integer"
+                },
+                "remark": {
+                    "type": "string"
+                },
+                "satisfaction": {
+                    "type": "integer"
+                },
+                "serviceId": {
+                    "type": "integer"
+                },
+                "solveRate": {
+                    "type": "integer"
+                },
+                "timelyRate": {
                     "type": "integer"
                 }
             }
@@ -7729,6 +7939,53 @@
                 }
             }
         },
+        "request.UpdateServiceFollowup": {
+            "type": "object",
+            "properties": {
+                "clientId": {
+                    "type": "integer"
+                },
+                "contactId": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "isVisit": {
+                    "type": "integer"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "oldMemberId": {
+                    "type": "integer"
+                },
+                "planId": {
+                    "type": "integer"
+                },
+                "remark": {
+                    "type": "string"
+                },
+                "satisfaction": {
+                    "type": "integer"
+                },
+                "serviceId": {
+                    "type": "integer"
+                },
+                "solveRate": {
+                    "type": "integer"
+                },
+                "timelyRate": {
+                    "type": "integer"
+                }
+            }
+        },
         "request.UpdateStatus": {
             "type": "object",
             "required": [
@@ -8121,6 +8378,17 @@
                 }
             }
         },
+        "response.ServiceFollowupResponse": {
+            "type": "object",
+            "properties": {
+                "list": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.ServiceFollowup"
+                    }
+                }
+            }
+        },
         "response.SubOrderResponse": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.json b/docs/swagger.json
index fe36c36..2f66cb6 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -3853,6 +3853,125 @@
                 }
             }
         },
+        "/api/serviceFollowup/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "ServiceFollowup"
+                ],
+                "summary": "娣诲姞鏈嶅姟璺熻繘",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddServiceFollowup"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/serviceFollowup/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "ServiceFollowup"
+                ],
+                "summary": "鍒犻櫎鏈嶅姟璺熻繘",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/serviceFollowup/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "ServiceFollowup"
+                ],
+                "summary": "鏈嶅姟璺熻繘鍒楄〃",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/contextx.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/response.ServiceFollowupResponse"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/serviceFollowup/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "ServiceFollowup"
+                ],
+                "summary": "鏇存柊鏈嶅姟璺熻繘",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateServiceFollowup"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/status/add": {
             "post": {
                 "produces": [
@@ -5421,6 +5540,53 @@
                 }
             }
         },
+        "model.ServiceFollowup": {
+            "type": "object",
+            "properties": {
+                "clientId": {
+                    "type": "integer"
+                },
+                "contactId": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "isVisit": {
+                    "type": "integer"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "oldMemberId": {
+                    "type": "integer"
+                },
+                "planId": {
+                    "type": "integer"
+                },
+                "remark": {
+                    "type": "string"
+                },
+                "satisfaction": {
+                    "type": "integer"
+                },
+                "serviceId": {
+                    "type": "integer"
+                },
+                "solveRate": {
+                    "type": "integer"
+                },
+                "timelyRate": {
+                    "type": "integer"
+                }
+            }
+        },
         "model.SubOrder": {
             "type": "object",
             "properties": {
@@ -6197,6 +6363,50 @@
                     "type": "string"
                 },
                 "typeId": {
+                    "type": "integer"
+                }
+            }
+        },
+        "request.AddServiceFollowup": {
+            "type": "object",
+            "properties": {
+                "clientId": {
+                    "type": "integer"
+                },
+                "contactId": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "isVisit": {
+                    "type": "integer"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "oldMemberId": {
+                    "type": "integer"
+                },
+                "planId": {
+                    "type": "integer"
+                },
+                "remark": {
+                    "type": "string"
+                },
+                "satisfaction": {
+                    "type": "integer"
+                },
+                "serviceId": {
+                    "type": "integer"
+                },
+                "solveRate": {
+                    "type": "integer"
+                },
+                "timelyRate": {
                     "type": "integer"
                 }
             }
@@ -7717,6 +7927,53 @@
                 }
             }
         },
+        "request.UpdateServiceFollowup": {
+            "type": "object",
+            "properties": {
+                "clientId": {
+                    "type": "integer"
+                },
+                "contactId": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "isVisit": {
+                    "type": "integer"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "oldMemberId": {
+                    "type": "integer"
+                },
+                "planId": {
+                    "type": "integer"
+                },
+                "remark": {
+                    "type": "string"
+                },
+                "satisfaction": {
+                    "type": "integer"
+                },
+                "serviceId": {
+                    "type": "integer"
+                },
+                "solveRate": {
+                    "type": "integer"
+                },
+                "timelyRate": {
+                    "type": "integer"
+                }
+            }
+        },
         "request.UpdateStatus": {
             "type": "object",
             "required": [
@@ -8109,6 +8366,17 @@
                 }
             }
         },
+        "response.ServiceFollowupResponse": {
+            "type": "object",
+            "properties": {
+                "list": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.ServiceFollowup"
+                    }
+                }
+            }
+        },
         "response.SubOrderResponse": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index 490ca68..4a14862 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -723,6 +723,37 @@
       typeId:
         type: integer
     type: object
+  model.ServiceFollowup:
+    properties:
+      clientId:
+        type: integer
+      contactId:
+        type: integer
+      file:
+        type: string
+      id:
+        type: integer
+      isVisit:
+        type: integer
+      memberId:
+        type: integer
+      number:
+        type: string
+      oldMemberId:
+        type: integer
+      planId:
+        type: integer
+      remark:
+        type: string
+      satisfaction:
+        type: integer
+      serviceId:
+        type: integer
+      solveRate:
+        type: integer
+      timelyRate:
+        type: integer
+    type: object
   model.SubOrder:
     properties:
       clientId:
@@ -1247,6 +1278,35 @@
       terms:
         type: string
       typeId:
+        type: integer
+    type: object
+  request.AddServiceFollowup:
+    properties:
+      clientId:
+        type: integer
+      contactId:
+        type: integer
+      file:
+        type: string
+      isVisit:
+        type: integer
+      memberId:
+        type: integer
+      number:
+        type: string
+      oldMemberId:
+        type: integer
+      planId:
+        type: integer
+      remark:
+        type: string
+      satisfaction:
+        type: integer
+      serviceId:
+        type: integer
+      solveRate:
+        type: integer
+      timelyRate:
         type: integer
     type: object
   request.AddStatus:
@@ -2275,6 +2335,37 @@
       typeId:
         type: integer
     type: object
+  request.UpdateServiceFollowup:
+    properties:
+      clientId:
+        type: integer
+      contactId:
+        type: integer
+      file:
+        type: string
+      id:
+        type: integer
+      isVisit:
+        type: integer
+      memberId:
+        type: integer
+      number:
+        type: string
+      oldMemberId:
+        type: integer
+      planId:
+        type: integer
+      remark:
+        type: string
+      satisfaction:
+        type: integer
+      serviceId:
+        type: integer
+      solveRate:
+        type: integer
+      timelyRate:
+        type: integer
+    type: object
   request.UpdateStatus:
     properties:
       id:
@@ -2524,6 +2615,13 @@
       list:
         items:
           $ref: '#/definitions/model.ServiceContract'
+        type: array
+    type: object
+  response.ServiceFollowupResponse:
+    properties:
+      list:
+        items:
+          $ref: '#/definitions/model.ServiceFollowup'
         type: array
     type: object
   response.SubOrderResponse:
@@ -4905,6 +5003,79 @@
       summary: 鏇存柊鏈嶅姟鍚堝悓
       tags:
       - ServiceContract
+  /api/serviceFollowup/add:
+    post:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.AddServiceFollowup'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 娣诲姞鏈嶅姟璺熻繘
+      tags:
+      - ServiceFollowup
+  /api/serviceFollowup/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:
+      - ServiceFollowup
+  /api/serviceFollowup/list:
+    get:
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            allOf:
+            - $ref: '#/definitions/contextx.Response'
+            - properties:
+                data:
+                  $ref: '#/definitions/response.ServiceFollowupResponse'
+              type: object
+      summary: 鏈嶅姟璺熻繘鍒楄〃
+      tags:
+      - ServiceFollowup
+  /api/serviceFollowup/update:
+    put:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.UpdateServiceFollowup'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 鏇存柊鏈嶅姟璺熻繘
+      tags:
+      - ServiceFollowup
   /api/status/add:
     post:
       parameters:
diff --git a/logs/aps-admin.err.log b/logs/aps-admin.err.log
index c3683ac..f595613 100644
--- a/logs/aps-admin.err.log
+++ b/logs/aps-admin.err.log
@@ -348,3 +348,4 @@
 [2023-07-12 15:23:10]	[error]	[aps_crm/model.(*ContractSearch).Create:46]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.contract' doesn't exist", "elapsed": 0.003547, "rows": 0, "sql": "INSERT INTO `contract` (`client_id`,`member_id`,`number`,`quotation_id`,`status_id`,`file`) VALUES (11,11,'ZDYB02-2',0,0,'string')"}
 [2023-07-13 10:55:49]	[error]	[aps_crm/model.(*ServiceContractSearch).FindAll:80]	trace	{"error": ": unsupported relations for schema ServiceContract", "elapsed": 0.001442, "rows": 2, "sql": "SELECT * FROM `service_contract`"}
 [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')"}
diff --git a/model/index.go b/model/index.go
index fec053b..15c1827 100644
--- a/model/index.go
+++ b/model/index.go
@@ -57,6 +57,7 @@
 		Plan{},
 		ServiceContract{},
 		OrderManage{},
+		ServiceFollowup{},
 	)
 	return err
 }
diff --git a/model/request/serviceFollowup.go b/model/request/serviceFollowup.go
new file mode 100644
index 0000000..9ae6706
--- /dev/null
+++ b/model/request/serviceFollowup.go
@@ -0,0 +1,26 @@
+package request
+
+type AddServiceFollowup struct {
+	ServiceFollowup
+}
+
+type ServiceFollowup struct {
+	ClientId     int    `json:"clientId"`
+	Number       string `json:"number"`
+	ContactId    int    `json:"contactId"`
+	ServiceId    int    `json:"serviceId"`
+	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"`
+}
+
+type UpdateServiceFollowup struct {
+	Id int `json:"id"`
+	ServiceFollowup
+}
diff --git a/model/response/response.go b/model/response/response.go
index 9bc5c0b..9f09dab 100644
--- a/model/response/response.go
+++ b/model/response/response.go
@@ -161,4 +161,8 @@
 	OrderManageResponse struct {
 		List []*model.OrderManage `json:"list"`
 	}
+
+	ServiceFollowupResponse struct {
+		List []*model.ServiceFollowup `json:"list"`
+	}
 )
diff --git a/model/serviceFollowup.go b/model/serviceFollowup.go
new file mode 100644
index 0000000..f4bc52c
--- /dev/null
+++ b/model/serviceFollowup.go
@@ -0,0 +1,83 @@
+package model
+
+import (
+	"aps_crm/pkg/mysqlx"
+	"gorm.io/gorm"
+)
+
+type (
+	ServiceFollowup struct {
+		Id           int    `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
+		ClientId     int    `json:"clientId" gorm:"column:client_id;type:int;comment:瀹㈡埛id"`
+		Number       string `json:"number" gorm:"column:number;type:varchar(255);comment:鍚堝悓缂栧彿"`
+		ContactId    int    `json:"contactId" gorm:"column:contact_id;type:int;comment:鑱旂郴浜篿d"`
+		ServiceId    int    `json:"serviceId" gorm:"column:service_id;type:int;comment:瀹㈡埛鏈嶅姟鍗昳d"`
+		MemberId     int    `json:"memberId" gorm:"column:member_id;type:int;comment:鏈嶅姟浜哄憳id"`
+		PlanId       int    `json:"planId" gorm:"column:plan_id;type:int;comment:鏈嶅姟璁″垝id"`
+		Satisfaction int    `json:"satisfaction" gorm:"column:satisfaction;type:int;comment:婊℃剰搴�"`
+		TimelyRate   int    `json:"timelyRate" gorm:"column:timely_rate;type:int;comment:鍙婃椂鐜�"`
+		SolveRate    int    `json:"solveRate" gorm:"column:solve_rate;type:int;comment:瑙e喅鐜�"`
+		IsVisit      int    `json:"isVisit" gorm:"column:is_visit;type:int;comment:鏈嶅姟浜哄憳鏄惁鏉ヨ繃"`
+		OldMemberId  int    `json:"oldMemberId" gorm:"column:old_member_id;type:int;comment:鍘熸湇鍔′汉鍛�"`
+		Remark       string `json:"remark" gorm:"column:remark;type:text;comment:澶囨敞"`
+		File         string `json:"file" gorm:"column:file;type:varchar(255);comment:闄勪欢"`
+	}
+
+	ServiceFollowupSearch struct {
+		ServiceFollowup
+		Orm *gorm.DB
+	}
+)
+
+func (ServiceFollowup) TableName() string {
+	return "service_followup"
+}
+
+func NewServiceFollowupSearch() *ServiceFollowupSearch {
+	return &ServiceFollowupSearch{
+		Orm: mysqlx.GetDB(),
+	}
+}
+
+func (slf *ServiceFollowupSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&ServiceFollowup{})
+	if slf.Id != 0 {
+		db = db.Where("id = ?", slf.Id)
+	}
+
+	return db
+}
+
+func (slf *ServiceFollowupSearch) Create(record *ServiceFollowup) error {
+	var db = slf.build()
+	return db.Create(record).Error
+}
+
+func (slf *ServiceFollowupSearch) Update(record *ServiceFollowup) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
+
+func (slf *ServiceFollowupSearch) Delete() error {
+	var db = slf.build()
+	return db.Delete(&ServiceFollowup{}).Error
+}
+
+func (slf *ServiceFollowupSearch) Find() (*ServiceFollowup, error) {
+	var db = slf.build()
+	var record = &ServiceFollowup{}
+	err := db.First(record).Error
+	return record, err
+}
+
+func (slf *ServiceFollowupSearch) FindAll() ([]*ServiceFollowup, error) {
+	var db = slf.build()
+	var records = make([]*ServiceFollowup, 0)
+	err := db.Find(&records).Error
+	return records, err
+}
+
+func (slf *ServiceFollowupSearch) SetId(id int) *ServiceFollowupSearch {
+	slf.Id = id
+	return slf
+}
diff --git a/pkg/ecode/code.go b/pkg/ecode/code.go
index 623a843..bb7640a 100644
--- a/pkg/ecode/code.go
+++ b/pkg/ecode/code.go
@@ -247,4 +247,10 @@
 	OrderManageUpdateErr = 3400005 // 鏇存柊璁㈠崟绠$悊澶辫触
 	OrderManageDeleteErr = 3400006 // 鍒犻櫎璁㈠崟绠$悊澶辫触
 
+	ServiceFollowupExist     = 3500001 // 鏈嶅姟璺熻繘宸插瓨鍦�
+	ServiceFollowupNotExist  = 3500002 // 鏈嶅姟璺熻繘涓嶅瓨鍦�
+	ServiceFollowupListErr   = 3500003 // 鑾峰彇鏈嶅姟璺熻繘鍒楄〃澶辫触
+	ServiceFollowupSetErr    = 3500004 // 璁剧疆鏈嶅姟璺熻繘澶辫触
+	ServiceFollowupUpdateErr = 3500005 // 鏇存柊鏈嶅姟璺熻繘澶辫触
+	ServiceFollowupDeleteErr = 3500006 // 鍒犻櫎鏈嶅姟璺熻繘澶辫触
 )
diff --git a/router/index.go b/router/index.go
index ce4efd2..3fba11a 100644
--- a/router/index.go
+++ b/router/index.go
@@ -47,6 +47,7 @@
 	PlanRouter
 	ServiceContractRouter
 	OrderManageRouter
+	ServiceFollowupRouter
 }
 
 func InitRouter() *gin.Engine {
@@ -111,6 +112,7 @@
 		routerGroup.InitPlanRouter(PrivateGroup)              // 娉ㄥ唽plan璺敱
 		routerGroup.InitServiceContractRouter(PrivateGroup)   // 娉ㄥ唽serviceContract璺敱
 		routerGroup.InitOrderManageRouter(PrivateGroup)       // 娉ㄥ唽orderManage璺敱
+		routerGroup.InitServiceFollowupRouter(PrivateGroup)   // 娉ㄥ唽serviceFollowup璺敱
 	}
 	return Router
 }
diff --git a/router/serviceFollowup.go b/router/serviceFollowup.go
new file mode 100644
index 0000000..18c728b
--- /dev/null
+++ b/router/serviceFollowup.go
@@ -0,0 +1,19 @@
+package router
+
+import (
+	v1 "aps_crm/api/v1"
+	"github.com/gin-gonic/gin"
+)
+
+type ServiceFollowupRouter struct{}
+
+func (s *ServiceFollowupRouter) InitServiceFollowupRouter(router *gin.RouterGroup) {
+	serviceFollowupRouter := router.Group("serviceFollowup")
+	serviceFollowupApi := v1.ApiGroup.ServiceFollowupApi
+	{
+		serviceFollowupRouter.POST("add", serviceFollowupApi.Add)             // 娣诲姞鏈嶅姟璺熻繘
+		serviceFollowupRouter.DELETE("delete/:id", serviceFollowupApi.Delete) // 鍒犻櫎鏈嶅姟璺熻繘
+		serviceFollowupRouter.PUT("update", serviceFollowupApi.Update)        // 鏇存柊鏈嶅姟璺熻繘
+		serviceFollowupRouter.GET("list", serviceFollowupApi.List)            // 鑾峰彇鏈嶅姟璺熻繘鍒楄〃
+	}
+}
diff --git a/service/index.go b/service/index.go
index 40b102e..ccfcca8 100644
--- a/service/index.go
+++ b/service/index.go
@@ -36,6 +36,7 @@
 	PlanService
 	SContractService
 	OrderManageService
+	FollowupService
 }
 
 var ServiceGroup = new(Group)
diff --git a/service/serviceFollowup.go b/service/serviceFollowup.go
new file mode 100644
index 0000000..83ea5f5
--- /dev/null
+++ b/service/serviceFollowup.go
@@ -0,0 +1,54 @@
+package service
+
+import (
+	"aps_crm/model"
+	"aps_crm/pkg/ecode"
+)
+
+type FollowupService struct{}
+
+func (FollowupService) AddServiceFollowup(serviceFollowup *model.ServiceFollowup) int {
+	err := model.NewServiceFollowupSearch().Create(serviceFollowup)
+	if err != nil {
+		return ecode.ServiceFollowupExist
+	}
+
+	return ecode.OK
+}
+
+func (FollowupService) DeleteServiceFollowup(id int) int {
+	_, err := model.NewServiceFollowupSearch().SetId(id).Find()
+	if err != nil {
+		return ecode.ServiceFollowupNotExist
+	}
+
+	err = model.NewServiceFollowupSearch().SetId(id).Delete()
+	if err != nil {
+		return ecode.ServiceFollowupNotExist
+	}
+	return ecode.OK
+}
+
+func (FollowupService) GetServiceFollowupList() ([]*model.ServiceFollowup, int) {
+	list, err := model.NewServiceFollowupSearch().FindAll()
+	if err != nil {
+		return nil, ecode.ServiceFollowupListErr
+	}
+
+	return list, ecode.OK
+}
+
+func (FollowupService) UpdateServiceFollowup(serviceFollowup *model.ServiceFollowup) int {
+	// check serviceFollowup exist
+	_, err := model.NewServiceFollowupSearch().SetId(serviceFollowup.Id).Find()
+	if err != nil {
+		return ecode.ServiceFollowupNotExist
+	}
+
+	err = model.NewServiceFollowupSearch().SetId(serviceFollowup.Id).Update(serviceFollowup)
+	if err != nil {
+		return ecode.ServiceFollowupSetErr
+	}
+
+	return ecode.OK
+}

--
Gitblit v1.8.0