From 5d2b172ae64789fc371afa8eb14a3ef2c0ba90ab Mon Sep 17 00:00:00 2001
From: wangpengfei <274878379@qq.com>
Date: 星期三, 12 七月 2023 16:49:25 +0800
Subject: [PATCH] add

---
 api/v1/index.go            |    2 
 api/v1/plan.go             |  155 +++++++++
 model/plan.go              |   82 +++++
 pkg/ecode/code.go          |    7 
 docs/swagger.yaml          |  142 ++++++++
 docs/docs.go               |  225 ++++++++++++++
 docs/swagger.json          |  225 ++++++++++++++
 model/response/response.go |    4 
 model/request/plan.go      |   22 +
 service/index.go           |    1 
 service/plan.go            |   54 +++
 model/index.go             |    1 
 router/index.go            |    2 
 router/plan.go             |   19 +
 14 files changed, 941 insertions(+), 0 deletions(-)

diff --git a/api/v1/index.go b/api/v1/index.go
index e183aea..e3b75f6 100644
--- a/api/v1/index.go
+++ b/api/v1/index.go
@@ -38,6 +38,7 @@
 	SalesReturnApi
 	SalesRefundApi
 	ContractApi
+	PlanApi
 }
 
 var ApiGroup = new(Group)
@@ -75,4 +76,5 @@
 	salesReturnService       = service.ServiceGroup.SalesReturnService
 	salesRefundService       = service.ServiceGroup.SalesRefundService
 	contractService          = service.ServiceGroup.ContractService
+	planService              = service.ServiceGroup.PlanService
 )
diff --git a/api/v1/plan.go b/api/v1/plan.go
new file mode 100644
index 0000000..7fe3265
--- /dev/null
+++ b/api/v1/plan.go
@@ -0,0 +1,155 @@
+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 PlanApi struct{}
+
+// Add
+//
+//	@Tags		Plan
+//	@Summary	娣诲姞璁″垝
+//	@Produce	application/json
+//	@Param		object	body		request.AddPlan	true	"鏌ヨ鍙傛暟"
+//	@Success	200		{object}	contextx.Response{}
+//	@Router		/api/plan/add [post]
+func (s *PlanApi) Add(c *gin.Context) {
+	var params request.AddPlan
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode, plan := checkPlanParams(params.Plan)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	errCode = planService.AddPlan(&plan)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Delete
+//
+//	@Tags		Plan
+//	@Summary	鍒犻櫎璁″垝
+//	@Produce	application/json
+//	@Param		id	path		int	true	"鏌ヨ鍙傛暟"
+//	@Success	200	{object}	contextx.Response{}
+//	@Router		/api/plan/delete/{id} [delete]
+func (s *PlanApi) Delete(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	id, _ := strconv.Atoi(c.Param("id"))
+	errCode := planService.DeletePlan(id)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Update
+//
+//	@Tags		Plan
+//	@Summary	鏇存柊璁″垝
+//	@Produce	application/json
+//	@Param		object	body		request.UpdatePlan	true	"鏌ヨ鍙傛暟"
+//	@Success	200		{object}	contextx.Response{}
+//	@Router		/api/plan/update [put]
+func (s *PlanApi) Update(c *gin.Context) {
+	var params request.UpdatePlan
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode, plan := checkPlanParams(params.Plan)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	errCode = planService.UpdatePlan(&plan)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// List
+//
+//	@Tags		Plan
+//	@Summary	鑾峰彇璁″垝鍒楄〃
+//	@Produce	application/json
+//	@Success	200	{object}	contextx.Response{data=response.PlanResponse}
+//	@Router		/api/plan/list [get]
+func (s *PlanApi) List(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	list, errCode := planService.GetPlanList()
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.OkWithDetailed(response.PlanResponse{
+		List: list,
+	})
+}
+
+func checkPlanParams(plan request.Plan) (errCode int, p model.Plan) {
+	if plan.Number == "" {
+		return ecode.InvalidParams, p
+	}
+
+	if plan.MemberId == 0 {
+		return ecode.InvalidParams, p
+	}
+
+	t, err := checkTimeFormat(plan.StartTime)
+	if err != nil {
+		return ecode.InvalidParams, p
+	}
+
+	p.StartTime = t
+
+	t, err = checkTimeFormat(plan.EndTime)
+	if err != nil {
+		return ecode.InvalidParams, p
+	}
+
+	p.EndTime = t
+
+	p.ClientId = plan.ClientId
+	p.Number = plan.Number
+	p.MemberId = plan.MemberId
+	p.SubOrderId = plan.SubOrderId
+	p.SalesDetailsId = plan.SalesDetailsId
+	p.Content = plan.Content
+	p.File = plan.File
+
+	return ecode.OK, p
+}
diff --git a/docs/docs.go b/docs/docs.go
index e61468e..6c4e9ba 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -1818,6 +1818,125 @@
                 }
             }
         },
+        "/api/plan/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Plan"
+                ],
+                "summary": "娣诲姞璁″垝",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddPlan"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/plan/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Plan"
+                ],
+                "summary": "鍒犻櫎璁″垝",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/plan/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Plan"
+                ],
+                "summary": "鑾峰彇璁″垝鍒楄〃",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/contextx.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/response.PlanResponse"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/plan/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Plan"
+                ],
+                "summary": "鏇存柊璁″垝",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdatePlan"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/possibility/add": {
             "post": {
                 "produces": [
@@ -4409,6 +4528,9 @@
                 "number": {
                     "type": "string"
                 },
+                "quotation": {
+                    "$ref": "#/definitions/model.Quotation"
+                },
                 "quotationId": {
                     "type": "integer"
                 },
@@ -4540,6 +4662,47 @@
                 },
                 "start_time": {
                     "type": "string"
+                }
+            }
+        },
+        "model.Plan": {
+            "type": "object",
+            "properties": {
+                "clientId": {
+                    "type": "integer"
+                },
+                "content": {
+                    "type": "string"
+                },
+                "endTime": {
+                    "type": "string"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "salesDetails": {
+                    "$ref": "#/definitions/model.SalesDetails"
+                },
+                "salesDetailsId": {
+                    "type": "integer"
+                },
+                "startTime": {
+                    "type": "string"
+                },
+                "subOrder": {
+                    "$ref": "#/definitions/model.SubOrder"
+                },
+                "subOrderId": {
+                    "type": "integer"
                 }
             }
         },
@@ -5382,6 +5545,14 @@
                 }
             }
         },
+        "request.AddPlan": {
+            "type": "object",
+            "properties": {
+                "plan": {
+                    "$ref": "#/definitions/request.Plan"
+                }
+            }
+        },
         "request.AddPossibility": {
             "type": "object",
             "required": [
@@ -5896,6 +6067,38 @@
                 "username": {
                     "description": "鐢ㄦ埛鍚�",
                     "type": "string"
+                }
+            }
+        },
+        "request.Plan": {
+            "type": "object",
+            "properties": {
+                "clientId": {
+                    "type": "integer"
+                },
+                "content": {
+                    "type": "string"
+                },
+                "endTime": {
+                    "type": "string"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "salesDetailsId": {
+                    "type": "integer"
+                },
+                "startTime": {
+                    "type": "string"
+                },
+                "subOrderId": {
+                    "type": "integer"
                 }
             }
         },
@@ -6579,6 +6782,17 @@
                 },
                 "start_time": {
                     "type": "string"
+                }
+            }
+        },
+        "request.UpdatePlan": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "plan": {
+                    "$ref": "#/definitions/request.Plan"
                 }
             }
         },
@@ -7286,6 +7500,17 @@
                 }
             }
         },
+        "response.PlanResponse": {
+            "type": "object",
+            "properties": {
+                "list": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Plan"
+                    }
+                }
+            }
+        },
         "response.PossibilityResponse": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.json b/docs/swagger.json
index 3b8054d..36036ed 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -1806,6 +1806,125 @@
                 }
             }
         },
+        "/api/plan/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Plan"
+                ],
+                "summary": "娣诲姞璁″垝",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddPlan"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/plan/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Plan"
+                ],
+                "summary": "鍒犻櫎璁″垝",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/plan/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Plan"
+                ],
+                "summary": "鑾峰彇璁″垝鍒楄〃",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/contextx.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/response.PlanResponse"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/plan/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Plan"
+                ],
+                "summary": "鏇存柊璁″垝",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdatePlan"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/possibility/add": {
             "post": {
                 "produces": [
@@ -4397,6 +4516,9 @@
                 "number": {
                     "type": "string"
                 },
+                "quotation": {
+                    "$ref": "#/definitions/model.Quotation"
+                },
                 "quotationId": {
                     "type": "integer"
                 },
@@ -4528,6 +4650,47 @@
                 },
                 "start_time": {
                     "type": "string"
+                }
+            }
+        },
+        "model.Plan": {
+            "type": "object",
+            "properties": {
+                "clientId": {
+                    "type": "integer"
+                },
+                "content": {
+                    "type": "string"
+                },
+                "endTime": {
+                    "type": "string"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "salesDetails": {
+                    "$ref": "#/definitions/model.SalesDetails"
+                },
+                "salesDetailsId": {
+                    "type": "integer"
+                },
+                "startTime": {
+                    "type": "string"
+                },
+                "subOrder": {
+                    "$ref": "#/definitions/model.SubOrder"
+                },
+                "subOrderId": {
+                    "type": "integer"
                 }
             }
         },
@@ -5370,6 +5533,14 @@
                 }
             }
         },
+        "request.AddPlan": {
+            "type": "object",
+            "properties": {
+                "plan": {
+                    "$ref": "#/definitions/request.Plan"
+                }
+            }
+        },
         "request.AddPossibility": {
             "type": "object",
             "required": [
@@ -5884,6 +6055,38 @@
                 "username": {
                     "description": "鐢ㄦ埛鍚�",
                     "type": "string"
+                }
+            }
+        },
+        "request.Plan": {
+            "type": "object",
+            "properties": {
+                "clientId": {
+                    "type": "integer"
+                },
+                "content": {
+                    "type": "string"
+                },
+                "endTime": {
+                    "type": "string"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "salesDetailsId": {
+                    "type": "integer"
+                },
+                "startTime": {
+                    "type": "string"
+                },
+                "subOrderId": {
+                    "type": "integer"
                 }
             }
         },
@@ -6567,6 +6770,17 @@
                 },
                 "start_time": {
                     "type": "string"
+                }
+            }
+        },
+        "request.UpdatePlan": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "plan": {
+                    "$ref": "#/definitions/request.Plan"
                 }
             }
         },
@@ -7274,6 +7488,17 @@
                 }
             }
         },
+        "response.PlanResponse": {
+            "type": "object",
+            "properties": {
+                "list": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Plan"
+                    }
+                }
+            }
+        },
         "response.PossibilityResponse": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index 83d99fd..2452796 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -278,6 +278,8 @@
         type: integer
       number:
         type: string
+      quotation:
+        $ref: '#/definitions/model.Quotation'
       quotationId:
         type: integer
       statusId:
@@ -364,6 +366,33 @@
         type: string
       start_time:
         type: string
+    type: object
+  model.Plan:
+    properties:
+      clientId:
+        type: integer
+      content:
+        type: string
+      endTime:
+        type: string
+      file:
+        type: string
+      id:
+        type: integer
+      memberId:
+        type: integer
+      number:
+        type: string
+      salesDetails:
+        $ref: '#/definitions/model.SalesDetails'
+      salesDetailsId:
+        type: integer
+      startTime:
+        type: string
+      subOrder:
+        $ref: '#/definitions/model.SubOrder'
+      subOrderId:
+        type: integer
     type: object
   model.Possibility:
     properties:
@@ -928,6 +957,11 @@
       start_time:
         type: string
     type: object
+  request.AddPlan:
+    properties:
+      plan:
+        $ref: '#/definitions/request.Plan'
+    type: object
   request.AddPossibility:
     properties:
       name:
@@ -1278,6 +1312,27 @@
       username:
         description: 鐢ㄦ埛鍚�
         type: string
+    type: object
+  request.Plan:
+    properties:
+      clientId:
+        type: integer
+      content:
+        type: string
+      endTime:
+        type: string
+      file:
+        type: string
+      memberId:
+        type: integer
+      number:
+        type: string
+      salesDetailsId:
+        type: integer
+      startTime:
+        type: string
+      subOrderId:
+        type: integer
     type: object
   request.Register:
     properties:
@@ -1744,6 +1799,13 @@
       start_time:
         type: string
     type: object
+  request.UpdatePlan:
+    properties:
+      id:
+        type: integer
+      plan:
+        $ref: '#/definitions/request.Plan'
+    type: object
   request.UpdatePossibilities:
     properties:
       possibilities:
@@ -2206,6 +2268,13 @@
         type: integer
       total:
         type: integer
+    type: object
+  response.PlanResponse:
+    properties:
+      list:
+        items:
+          $ref: '#/definitions/model.Plan'
+        type: array
     type: object
   response.PossibilityResponse:
     properties:
@@ -3406,6 +3475,79 @@
       summary: 鏇存柊涓昏鍗�
       tags:
       - MasterOrder
+  /api/plan/add:
+    post:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.AddPlan'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 娣诲姞璁″垝
+      tags:
+      - Plan
+  /api/plan/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:
+      - Plan
+  /api/plan/list:
+    get:
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            allOf:
+            - $ref: '#/definitions/contextx.Response'
+            - properties:
+                data:
+                  $ref: '#/definitions/response.PlanResponse'
+              type: object
+      summary: 鑾峰彇璁″垝鍒楄〃
+      tags:
+      - Plan
+  /api/plan/update:
+    put:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.UpdatePlan'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 鏇存柊璁″垝
+      tags:
+      - Plan
   /api/possibility/add:
     post:
       parameters:
diff --git a/model/index.go b/model/index.go
index 26b4bab..2002ea9 100644
--- a/model/index.go
+++ b/model/index.go
@@ -54,6 +54,7 @@
 		SalesReturn{},
 		SalesRefund{},
 		Contract{},
+		Plan{},
 	)
 	return err
 }
diff --git a/model/plan.go b/model/plan.go
new file mode 100644
index 0000000..3046ef9
--- /dev/null
+++ b/model/plan.go
@@ -0,0 +1,82 @@
+package model
+
+import (
+	"aps_crm/pkg/mysqlx"
+	"gorm.io/gorm"
+	"time"
+)
+
+type (
+	Plan 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:鍗曟嵁缂栧彿"`
+		MemberId       int          `json:"memberId" gorm:"column:member_id;type:int;comment:璐熻矗浜篿d"`
+		SubOrderId     int          `json:"subOrderId" gorm:"column:sub_order_id;type:int;comment:瀛愯鍗昳d"`
+		SubOrder       SubOrder     `json:"subOrder" gorm:"foreignKey:SubOrderId"`
+		SalesDetailsId int          `json:"salesDetailsId" gorm:"column:sales_details_id;type:int;comment:閿�鍞槑缁唅d"`
+		SalesDetails   SalesDetails `json:"salesDetails" gorm:"foreignKey:SalesDetailsId"`
+		StartTime      time.Time    `json:"startTime" gorm:"column:start_time;type:datetime;comment:寮�濮嬫椂闂�"`
+		EndTime        time.Time    `json:"endTime" gorm:"column:end_time;type:datetime;comment:缁撴潫鏃堕棿"`
+		Content        string       `json:"content" gorm:"column:content;type:varchar(255);comment:璁″垝鍐呭"`
+		File           string       `json:"file" gorm:"column:file;type:varchar(255);comment:闄勪欢"`
+	}
+
+	PlanSearch struct {
+		Plan
+		Orm *gorm.DB
+	}
+)
+
+func (Plan) TableName() string {
+	return "plan"
+}
+
+func NewPlanSearch() *PlanSearch {
+	return &PlanSearch{
+		Orm: mysqlx.GetDB(),
+	}
+}
+
+func (slf *PlanSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&Plan{})
+	if slf.Id != 0 {
+		db = db.Where("id = ?", slf.Id)
+	}
+
+	return db
+}
+
+func (slf *PlanSearch) Create(record *Plan) error {
+	var db = slf.build()
+	return db.Create(record).Error
+}
+
+func (slf *PlanSearch) Delete() error {
+	var db = slf.build()
+	return db.Delete(&Plan{}).Error
+}
+
+func (slf *PlanSearch) Update(record *Plan) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
+
+func (slf *PlanSearch) Find() (*Plan, error) {
+	var db = slf.build()
+	var record = &Plan{}
+	err := db.First(record).Error
+	return record, err
+}
+
+func (slf *PlanSearch) FindAll() ([]*Plan, error) {
+	var db = slf.build()
+	var record = make([]*Plan, 0)
+	err := db.Find(&record).Error
+	return record, err
+}
+
+func (slf *PlanSearch) SetId(id int) *PlanSearch {
+	slf.Id = id
+	return slf
+}
diff --git a/model/request/plan.go b/model/request/plan.go
new file mode 100644
index 0000000..f262cec
--- /dev/null
+++ b/model/request/plan.go
@@ -0,0 +1,22 @@
+package request
+
+type AddPlan struct {
+	Plan Plan `json:"plan"`
+}
+
+type Plan struct {
+	ClientId       int    `json:"clientId"`
+	Number         string `json:"number"`
+	MemberId       int    `json:"memberId"`
+	SubOrderId     int    `json:"subOrderId"`
+	SalesDetailsId int    `json:"salesDetailsId"`
+	StartTime      string `json:"startTime"`
+	EndTime        string `json:"endTime"`
+	Content        string `json:"content"`
+	File           string `json:"file"`
+}
+
+type UpdatePlan struct {
+	Id   int  `json:"id"`
+	Plan Plan `json:"plan"`
+}
diff --git a/model/response/response.go b/model/response/response.go
index 8ce4fc0..8a41e2d 100644
--- a/model/response/response.go
+++ b/model/response/response.go
@@ -149,4 +149,8 @@
 	ContractResponse struct {
 		List []*model.Contract `json:"list"`
 	}
+
+	PlanResponse struct {
+		List []*model.Plan `json:"list"`
+	}
 )
diff --git a/pkg/ecode/code.go b/pkg/ecode/code.go
index 9e9f0de..c895394 100644
--- a/pkg/ecode/code.go
+++ b/pkg/ecode/code.go
@@ -225,4 +225,11 @@
 	ContractSetErr    = 3100004 // 璁剧疆鍚堝悓澶辫触
 	ContractUpdateErr = 3100005 // 鏇存柊鍚堝悓澶辫触
 	ContractDeleteErr = 3100006 // 鍒犻櫎鍚堝悓澶辫触
+
+	PlanExist     = 3200001 // 璁″垝宸插瓨鍦�
+	PlanNotExist  = 3200002 // 璁″垝涓嶅瓨鍦�
+	PlanListErr   = 3200003 // 鑾峰彇璁″垝鍒楄〃澶辫触
+	PlanSetErr    = 3200004 // 璁剧疆璁″垝澶辫触
+	PlanUpdateErr = 3200005 // 鏇存柊璁″垝澶辫触
+	PlanDeleteErr = 3200006 // 鍒犻櫎璁″垝澶辫触
 )
diff --git a/router/index.go b/router/index.go
index 81035c8..7e4ef85 100644
--- a/router/index.go
+++ b/router/index.go
@@ -44,6 +44,7 @@
 	SalesReturnRouter
 	SalesRefundRouter
 	ContractRouter
+	PlanRouter
 }
 
 func InitRouter() *gin.Engine {
@@ -105,6 +106,7 @@
 		routerGroup.InitSalesReturnRouter(PrivateGroup)       // 娉ㄥ唽salesReturn璺敱
 		routerGroup.InitSalesRefundRouter(PrivateGroup)       // 娉ㄥ唽salesRefund璺敱
 		routerGroup.InitContractRouter(PrivateGroup)          // 娉ㄥ唽contract璺敱
+		routerGroup.InitPlanRouter(PrivateGroup)              // 娉ㄥ唽plan璺敱
 	}
 	return Router
 }
diff --git a/router/plan.go b/router/plan.go
new file mode 100644
index 0000000..e0b3923
--- /dev/null
+++ b/router/plan.go
@@ -0,0 +1,19 @@
+package router
+
+import (
+	v1 "aps_crm/api/v1"
+	"github.com/gin-gonic/gin"
+)
+
+type PlanRouter struct{}
+
+func (p *PlanRouter) InitPlanRouter(router *gin.RouterGroup) {
+	planRouter := router.Group("plan")
+	planApi := v1.ApiGroup.PlanApi
+	{
+		planRouter.POST("add", planApi.Add)             // 娣诲姞璁″垝
+		planRouter.DELETE("delete/:id", planApi.Delete) // 鍒犻櫎璁″垝
+		planRouter.PUT("update", planApi.Update)        // 鏇存柊璁″垝
+		planRouter.GET("list", planApi.List)            // 鑾峰彇璁″垝鍒楄〃
+	}
+}
diff --git a/service/index.go b/service/index.go
index e387979..4116a99 100644
--- a/service/index.go
+++ b/service/index.go
@@ -33,6 +33,7 @@
 	SalesReturnService
 	SalesRefundService
 	ContractService
+	PlanService
 }
 
 var ServiceGroup = new(Group)
diff --git a/service/plan.go b/service/plan.go
new file mode 100644
index 0000000..9e175fb
--- /dev/null
+++ b/service/plan.go
@@ -0,0 +1,54 @@
+package service
+
+import (
+	"aps_crm/model"
+	"aps_crm/pkg/ecode"
+)
+
+type PlanService struct{}
+
+func (PlanService) AddPlan(plan *model.Plan) int {
+	err := model.NewPlanSearch().Create(plan)
+	if err != nil {
+		return ecode.PlanExist
+	}
+
+	return ecode.OK
+}
+
+func (PlanService) DeletePlan(id int) int {
+	_, err := model.NewPlanSearch().SetId(id).Find()
+	if err != nil {
+		return ecode.PlanNotExist
+	}
+
+	err = model.NewPlanSearch().SetId(id).Delete()
+	if err != nil {
+		return ecode.PlanNotExist
+	}
+	return ecode.OK
+}
+
+func (PlanService) GetPlanList() ([]*model.Plan, int) {
+	list, err := model.NewPlanSearch().FindAll()
+	if err != nil {
+		return nil, ecode.PlanListErr
+	}
+
+	return list, ecode.OK
+}
+
+func (PlanService) UpdatePlan(plan *model.Plan) int {
+	// check plan exist
+	_, err := model.NewPlanSearch().SetId(plan.Id).Find()
+	if err != nil {
+		return ecode.PlanNotExist
+	}
+
+	err = model.NewPlanSearch().SetId(plan.Id).Update(plan)
+	if err != nil {
+		return ecode.PlanSetErr
+	}
+
+	return ecode.OK
+}

--
Gitblit v1.8.0