From f1fbbbf99f7fa820f51cb47aee4df7e7cf3df6f0 Mon Sep 17 00:00:00 2001
From: wangpengfei <274878379@qq.com>
Date: 星期一, 10 七月 2023 19:43:57 +0800
Subject: [PATCH] add

---
 api/v1/index.go            |    2 
 service/qutation.go        |   54 +++
 pkg/ecode/code.go          |    6 
 model/quotation.go         |   90 +++++
 docs/swagger.yaml          |  147 ++++++++
 docs/docs.go               |  232 +++++++++++++
 docs/swagger.json          |  232 +++++++++++++
 model/response/response.go |    4 
 service/index.go           |    1 
 api/v1/qutation.go         |  168 +++++++++
 model/index.go             |    1 
 router/index.go            |    2 
 router/qutation.go         |   19 +
 model/request/quotation.go |   22 +
 14 files changed, 980 insertions(+), 0 deletions(-)

diff --git a/api/v1/index.go b/api/v1/index.go
index 54ebbba..ccc3d5e 100644
--- a/api/v1/index.go
+++ b/api/v1/index.go
@@ -31,6 +31,7 @@
 	RegularCustomersApi
 	PossibilityApi
 	StatusApi
+	QuotationApi
 }
 
 var ApiGroup = new(Group)
@@ -61,4 +62,5 @@
 	regularCustomersService  = service.ServiceGroup.RegularCustomersService
 	possibilityService       = service.ServiceGroup.PossibilityService
 	statusService            = service.ServiceGroup.StatusService
+	quotationService         = service.ServiceGroup.QuotationService
 )
diff --git a/api/v1/qutation.go b/api/v1/qutation.go
new file mode 100644
index 0000000..739681f
--- /dev/null
+++ b/api/v1/qutation.go
@@ -0,0 +1,168 @@
+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 QuotationApi struct{}
+
+// Add
+//
+//	@Tags		Quotation
+//	@Summary	娣诲姞鎶ヤ环鍗�
+//	@Produce	application/json
+//	@Param		object	body		request.AddQuotation	true	"鏌ヨ鍙傛暟"
+//	@Success	200		{object}	contextx.Response{}
+//	@Router		/api/quotation/add [post]
+func (s *QuotationApi) Add(c *gin.Context) {
+	var params request.AddQuotation
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode, quotation := checkQuotationParams(params.Quotation)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	errCode = quotationService.AddQuotation(&quotation)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Delete
+//
+//	@Tags		Quotation
+//	@Summary	鍒犻櫎鎶ヤ环鍗�
+//	@Produce	application/json
+//	@Param		id	path		int	true	"鏌ヨ鍙傛暟"
+//	@Success	200	{object}	contextx.Response{}
+//	@Router		/api/quotation/delete/{id} [delete]
+func (s *QuotationApi) Delete(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	id, _ := strconv.Atoi(c.Param("id"))
+	errCode := quotationService.DeleteQuotation(id)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Update
+//
+//	@Tags		Quotation
+//	@Summary	鏇存柊鎶ヤ环鍗�
+//	@Produce	application/json
+//	@Param		object	body		request.UpdateQuotation	true	"鏌ヨ鍙傛暟"
+//	@Success	200		{object}	contextx.Response{}
+//	@Router		/api/quotation/update [put]
+func (s *QuotationApi) Update(c *gin.Context) {
+	var params request.UpdateQuotation
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode, quotation := checkQuotationParams(params.Quotation)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	quotation.Id = params.Id
+
+	errCode = quotationService.UpdateQuotation(&quotation)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// List
+//
+//	@Tags		Quotation
+//	@Summary	鎶ヤ环鍗曞垪琛�
+//	@Produce	application/json
+//	@Success	200	{object}	contextx.Response{data=response.QuotationResponse}
+//	@Router		/api/quotation/list [get]
+func (s *QuotationApi) List(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	list, errCode := quotationService.GetQuotationList()
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.OkWithDetailed(response.QuotationResponse{
+		List: list,
+	})
+}
+
+// checkQuotationParams
+func checkQuotationParams(quotation request.Quotation) (int, model.Quotation) {
+	var errCode int
+	var quotationModel model.Quotation
+
+	if quotation.ClientId == 0 {
+		errCode = ecode.InvalidParams
+		return errCode, quotationModel
+	}
+
+	if quotation.QuotationStatusId == 0 {
+		errCode = ecode.InvalidParams
+		return errCode, quotationModel
+	}
+
+	if quotation.Number == "" {
+		errCode = ecode.InvalidParams
+		return errCode, quotationModel
+	}
+
+	if quotation.MemberId == 0 {
+		errCode = ecode.InvalidParams
+		return errCode, quotationModel
+	}
+
+	t, err := checkTimeFormat(quotation.ValidityDate)
+	if err != nil {
+		errCode = ecode.InvalidParams
+		return errCode, quotationModel
+	}
+
+	quotationModel.ValidityDate = t
+	quotationModel.ClientId = quotation.ClientId
+	quotationModel.QuotationStatusId = quotation.QuotationStatusId
+	quotationModel.Number = quotation.Number
+	quotationModel.MemberId = quotation.MemberId
+	quotationModel.SaleChanceId = quotation.SaleChanceId
+	quotationModel.ContactId = quotation.ContactId
+	quotationModel.Conditions = quotation.Conditions
+	quotationModel.File = quotation.File
+
+	return ecode.OK, quotationModel
+
+}
diff --git a/docs/docs.go b/docs/docs.go
index 6cbada4..9a8241c 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -1848,6 +1848,125 @@
                 }
             }
         },
+        "/api/quotation/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Quotation"
+                ],
+                "summary": "娣诲姞鎶ヤ环鍗�",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddQuotation"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/quotation/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Quotation"
+                ],
+                "summary": "鍒犻櫎鎶ヤ环鍗�",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/quotation/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Quotation"
+                ],
+                "summary": "鎶ヤ环鍗曞垪琛�",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/contextx.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/response.QuotationResponse"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/quotation/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Quotation"
+                ],
+                "summary": "鏇存柊鎶ヤ环鍗�",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateQuotation"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/region/add": {
             "post": {
                 "produces": [
@@ -3698,6 +3817,41 @@
                 }
             }
         },
+        "model.Quotation": {
+            "type": "object",
+            "properties": {
+                "client_id": {
+                    "type": "integer"
+                },
+                "conditions": {
+                    "type": "string"
+                },
+                "contact_id": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "member_id": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "quotation_status_id": {
+                    "type": "integer"
+                },
+                "sale_chance_id": {
+                    "type": "integer"
+                },
+                "validity_date": {
+                    "type": "string"
+                }
+            }
+        },
         "model.Region": {
             "type": "object",
             "properties": {
@@ -4292,6 +4446,38 @@
             "properties": {
                 "name": {
                     "description": "鐪佷唤鍚嶇О",
+                    "type": "string"
+                }
+            }
+        },
+        "request.AddQuotation": {
+            "type": "object",
+            "properties": {
+                "client_id": {
+                    "type": "integer"
+                },
+                "conditions": {
+                    "type": "string"
+                },
+                "contact_id": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "member_id": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "quotation_status_id": {
+                    "type": "integer"
+                },
+                "sale_chance_id": {
+                    "type": "integer"
+                },
+                "validity_date": {
                     "type": "string"
                 }
             }
@@ -5274,6 +5460,41 @@
                 }
             }
         },
+        "request.UpdateQuotation": {
+            "type": "object",
+            "properties": {
+                "client_id": {
+                    "type": "integer"
+                },
+                "conditions": {
+                    "type": "string"
+                },
+                "contact_id": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "member_id": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "quotation_status_id": {
+                    "type": "integer"
+                },
+                "sale_chance_id": {
+                    "type": "integer"
+                },
+                "validity_date": {
+                    "type": "string"
+                }
+            }
+        },
         "request.UpdateRegion": {
             "type": "object",
             "properties": {
@@ -5806,6 +6027,17 @@
                 }
             }
         },
+        "response.QuotationResponse": {
+            "type": "object",
+            "properties": {
+                "list": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Quotation"
+                    }
+                }
+            }
+        },
         "response.RegisteredCapitalResponse": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.json b/docs/swagger.json
index 9805666..f5a60ea 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -1836,6 +1836,125 @@
                 }
             }
         },
+        "/api/quotation/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Quotation"
+                ],
+                "summary": "娣诲姞鎶ヤ环鍗�",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddQuotation"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/quotation/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Quotation"
+                ],
+                "summary": "鍒犻櫎鎶ヤ环鍗�",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/quotation/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Quotation"
+                ],
+                "summary": "鎶ヤ环鍗曞垪琛�",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/contextx.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/response.QuotationResponse"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/quotation/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Quotation"
+                ],
+                "summary": "鏇存柊鎶ヤ环鍗�",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateQuotation"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/region/add": {
             "post": {
                 "produces": [
@@ -3686,6 +3805,41 @@
                 }
             }
         },
+        "model.Quotation": {
+            "type": "object",
+            "properties": {
+                "client_id": {
+                    "type": "integer"
+                },
+                "conditions": {
+                    "type": "string"
+                },
+                "contact_id": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "member_id": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "quotation_status_id": {
+                    "type": "integer"
+                },
+                "sale_chance_id": {
+                    "type": "integer"
+                },
+                "validity_date": {
+                    "type": "string"
+                }
+            }
+        },
         "model.Region": {
             "type": "object",
             "properties": {
@@ -4280,6 +4434,38 @@
             "properties": {
                 "name": {
                     "description": "鐪佷唤鍚嶇О",
+                    "type": "string"
+                }
+            }
+        },
+        "request.AddQuotation": {
+            "type": "object",
+            "properties": {
+                "client_id": {
+                    "type": "integer"
+                },
+                "conditions": {
+                    "type": "string"
+                },
+                "contact_id": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "member_id": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "quotation_status_id": {
+                    "type": "integer"
+                },
+                "sale_chance_id": {
+                    "type": "integer"
+                },
+                "validity_date": {
                     "type": "string"
                 }
             }
@@ -5262,6 +5448,41 @@
                 }
             }
         },
+        "request.UpdateQuotation": {
+            "type": "object",
+            "properties": {
+                "client_id": {
+                    "type": "integer"
+                },
+                "conditions": {
+                    "type": "string"
+                },
+                "contact_id": {
+                    "type": "integer"
+                },
+                "file": {
+                    "type": "string"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "member_id": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "quotation_status_id": {
+                    "type": "integer"
+                },
+                "sale_chance_id": {
+                    "type": "integer"
+                },
+                "validity_date": {
+                    "type": "string"
+                }
+            }
+        },
         "request.UpdateRegion": {
             "type": "object",
             "properties": {
@@ -5794,6 +6015,17 @@
                 }
             }
         },
+        "response.QuotationResponse": {
+            "type": "object",
+            "properties": {
+                "list": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Quotation"
+                    }
+                }
+            }
+        },
         "response.RegisteredCapitalResponse": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index 6c8e6f6..d6bb274 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -349,6 +349,29 @@
       name:
         type: string
     type: object
+  model.Quotation:
+    properties:
+      client_id:
+        type: integer
+      conditions:
+        type: string
+      contact_id:
+        type: integer
+      file:
+        type: string
+      id:
+        type: integer
+      member_id:
+        type: integer
+      number:
+        type: string
+      quotation_status_id:
+        type: integer
+      sale_chance_id:
+        type: integer
+      validity_date:
+        type: string
+    type: object
   model.Region:
     properties:
       id:
@@ -752,6 +775,27 @@
     properties:
       name:
         description: 鐪佷唤鍚嶇О
+        type: string
+    type: object
+  request.AddQuotation:
+    properties:
+      client_id:
+        type: integer
+      conditions:
+        type: string
+      contact_id:
+        type: integer
+      file:
+        type: string
+      member_id:
+        type: integer
+      number:
+        type: string
+      quotation_status_id:
+        type: integer
+      sale_chance_id:
+        type: integer
+      validity_date:
         type: string
     type: object
   request.AddRegion:
@@ -1426,6 +1470,29 @@
           $ref: '#/definitions/request.UpdateProvince'
         type: array
     type: object
+  request.UpdateQuotation:
+    properties:
+      client_id:
+        type: integer
+      conditions:
+        type: string
+      contact_id:
+        type: integer
+      file:
+        type: string
+      id:
+        type: integer
+      member_id:
+        type: integer
+      number:
+        type: string
+      quotation_status_id:
+        type: integer
+      sale_chance_id:
+        type: integer
+      validity_date:
+        type: string
+    type: object
   request.UpdateRegion:
     properties:
       id:
@@ -1774,6 +1841,13 @@
       list:
         items:
           $ref: '#/definitions/model.Province'
+        type: array
+    type: object
+  response.QuotationResponse:
+    properties:
+      list:
+        items:
+          $ref: '#/definitions/model.Quotation'
         type: array
     type: object
   response.RegisteredCapitalResponse:
@@ -2952,6 +3026,79 @@
       summary: 鏇存柊鐪佷唤
       tags:
       - Province
+  /api/quotation/add:
+    post:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.AddQuotation'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 娣诲姞鎶ヤ环鍗�
+      tags:
+      - Quotation
+  /api/quotation/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:
+      - Quotation
+  /api/quotation/list:
+    get:
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            allOf:
+            - $ref: '#/definitions/contextx.Response'
+            - properties:
+                data:
+                  $ref: '#/definitions/response.QuotationResponse'
+              type: object
+      summary: 鎶ヤ环鍗曞垪琛�
+      tags:
+      - Quotation
+  /api/quotation/update:
+    put:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.UpdateQuotation'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 鏇存柊鎶ヤ环鍗�
+      tags:
+      - Quotation
   /api/region/add:
     post:
       parameters:
diff --git a/model/index.go b/model/index.go
index 0601b4d..584e114 100644
--- a/model/index.go
+++ b/model/index.go
@@ -46,6 +46,7 @@
 		RegularCustomers{},
 		Possibility{},
 		Status{},
+		Quotation{},
 	)
 	return err
 }
diff --git a/model/quotation.go b/model/quotation.go
new file mode 100644
index 0000000..d5fdec8
--- /dev/null
+++ b/model/quotation.go
@@ -0,0 +1,90 @@
+package model
+
+import (
+	"aps_crm/pkg/mysqlx"
+	"gorm.io/gorm"
+	"time"
+)
+
+type (
+	// Quotation 鎶ヤ环鍗�
+	Quotation struct {
+		Id                int        `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
+		ClientId          int        `json:"client_id" gorm:"column:client_id;type:int;comment:瀹㈡埛id"`
+		Number            string     `json:"number" gorm:"column:number;type:varchar(255);comment:鎶ヤ环鍗曞彿"`
+		QuotationStatusId int        `json:"quotation_status_id" gorm:"column:quotation_status_id;type:int;comment:鎶ヤ环鍗曠姸鎬乮d"`
+		ValidityDate      time.Time  `json:"validity_date" gorm:"column:validity_date;type:datetime;comment:鏈夋晥鏈�"`
+		ContactId         int        `json:"contact_id" gorm:"column:contact_id;type:int;comment:鑱旂郴浜篿d"`
+		MemberId          int        `json:"member_id" gorm:"column:member_id;type:int;comment:璐熻矗浜篿d"`
+		SaleChanceId      int        `json:"sale_chance_id" gorm:"column:sale_chance_id;type:int;comment:鍟嗘満id"`
+		Conditions        string     `json:"conditions" gorm:"column:conditions;type:text;comment:鎶ヤ环鏉′欢"`
+		File              string     `json:"file" gorm:"column:file;type:varchar(255);comment:闄勪欢"`
+		Client            Client     `json:"client" gorm:"foreignKey:ClientId"`
+		Contact           Contact    `json:"contact" gorm:"foreignKey:ContactId"`
+		SaleChance        SaleChance `json:"sale_chance" gorm:"foreignKey:SaleChanceId"`
+	}
+
+	// QuotationSearch 鎶ヤ环鍗曟悳绱㈡潯浠�
+	QuotationSearch struct {
+		Quotation
+		Orm *gorm.DB
+	}
+)
+
+func (Quotation) TableName() string {
+	return "quotation"
+}
+
+func NewQuotationSearch() *QuotationSearch {
+	return &QuotationSearch{
+		Orm: mysqlx.GetDB(),
+	}
+}
+
+func (slf *QuotationSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&Quotation{})
+	if slf.Id != 0 {
+		db = db.Where("id = ?", slf.Id)
+	}
+
+	return db
+}
+
+func (slf *QuotationSearch) Create(record *Quotation) error {
+	var db = slf.build()
+	return db.Create(record).Error
+}
+
+func (slf *QuotationSearch) Delete() error {
+	var db = slf.build()
+	return db.Delete(&Quotation{}).Error
+}
+
+func (slf *QuotationSearch) Update(record *Quotation) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
+
+func (slf *QuotationSearch) Find() (*Quotation, error) {
+	var db = slf.build()
+	var record Quotation
+	err := db.Preload("Client").Preload("Contact").Preload("SaleChance").First(&record).Error
+	return &record, err
+}
+
+func (slf *QuotationSearch) FindAll() ([]*Quotation, error) {
+	var db = slf.build()
+	var records []*Quotation
+	err := db.Find(&records).Error
+	return records, err
+}
+
+func (slf *QuotationSearch) SetId(id int) *QuotationSearch {
+	slf.Id = id
+	return slf
+}
+
+func (slf *QuotationSearch) Updates(data map[string]interface{}) error {
+	var db = slf.build()
+	return db.Updates(data).Error
+}
diff --git a/model/request/quotation.go b/model/request/quotation.go
new file mode 100644
index 0000000..91654de
--- /dev/null
+++ b/model/request/quotation.go
@@ -0,0 +1,22 @@
+package request
+
+type AddQuotation struct {
+	Quotation
+}
+
+type Quotation struct {
+	ClientId          int    `json:"client_id"`
+	Number            string `json:"number"`
+	QuotationStatusId int    `json:"quotation_status_id"`
+	ValidityDate      string `json:"validity_date"`
+	ContactId         int    `json:"contact_id"`
+	MemberId          int    `json:"member_id"`
+	SaleChanceId      int    `json:"sale_chance_id"`
+	Conditions        string `json:"conditions"`
+	File              string `json:"file"`
+}
+
+type UpdateQuotation struct {
+	Id int `json:"id"`
+	Quotation
+}
diff --git a/model/response/response.go b/model/response/response.go
index 07ce959..51423c7 100644
--- a/model/response/response.go
+++ b/model/response/response.go
@@ -121,4 +121,8 @@
 	StatusResponse struct {
 		List []*model.Status `json:"list"`
 	}
+
+	QuotationResponse struct {
+		List []*model.Quotation `json:"list"`
+	}
 )
diff --git a/pkg/ecode/code.go b/pkg/ecode/code.go
index 73faad0..d0f5a81 100644
--- a/pkg/ecode/code.go
+++ b/pkg/ecode/code.go
@@ -177,4 +177,10 @@
 	StatusUpdateErr = 2400005 // 鏇存柊閿�鍞満浼氱姸鎬佸け璐�
 	StatusDeleteErr = 2400006 // 鍒犻櫎閿�鍞満浼氱姸鎬佸け璐�
 
+	QuotationExist     = 2500001 // 鎶ヤ环鍗曞凡瀛樺湪
+	QuotationNotExist  = 2500002 // 鎶ヤ环鍗曚笉瀛樺湪
+	QuotationListErr   = 2500003 // 鑾峰彇鎶ヤ环鍗曞垪琛ㄥけ璐�
+	QuotationSetErr    = 2500004 // 璁剧疆鎶ヤ环鍗曞け璐�
+	QuotationUpdateErr = 2500005 // 鏇存柊鎶ヤ环鍗曞け璐�
+	QuotationDeleteErr = 2500006 // 鍒犻櫎鎶ヤ环鍗曞け璐�
 )
diff --git a/router/index.go b/router/index.go
index d9f823d..be18007 100644
--- a/router/index.go
+++ b/router/index.go
@@ -37,6 +37,7 @@
 	RegularCustomersRouter
 	PossibilityRouter
 	StatusRouter
+	QuotationRouter
 }
 
 func InitRouter() *gin.Engine {
@@ -91,6 +92,7 @@
 		routerGroup.InitRegularCustomersRouter(PrivateGroup)  // 娉ㄥ唽regularCustomers璺敱
 		routerGroup.InitPossibilityRouter(PrivateGroup)       // 娉ㄥ唽possibility璺敱
 		routerGroup.InitStatusRouter(PrivateGroup)            // 娉ㄥ唽status璺敱
+		routerGroup.InitQuotationRouter(PrivateGroup)         // 娉ㄥ唽quotation璺敱
 	}
 	return Router
 }
diff --git a/router/qutation.go b/router/qutation.go
new file mode 100644
index 0000000..d5fc559
--- /dev/null
+++ b/router/qutation.go
@@ -0,0 +1,19 @@
+package router
+
+import (
+	v1 "aps_crm/api/v1"
+	"github.com/gin-gonic/gin"
+)
+
+type QuotationRouter struct{}
+
+func (s *QuotationRouter) InitQuotationRouter(router *gin.RouterGroup) {
+	quotationRouter := router.Group("quotation")
+	quotationApi := v1.ApiGroup.QuotationApi
+	{
+		quotationRouter.POST("add", quotationApi.Add)             // 娣诲姞鎶ヤ环鍗�
+		quotationRouter.DELETE("delete/:id", quotationApi.Delete) // 鍒犻櫎鎶ヤ环鍗�
+		quotationRouter.PUT("update", quotationApi.Update)        // 鏇存柊鎶ヤ环鍗�
+		quotationRouter.GET("list", quotationApi.List)            // 鑾峰彇鎶ヤ环鍗曞垪琛�
+	}
+}
diff --git a/service/index.go b/service/index.go
index 0e56603..c055e22 100644
--- a/service/index.go
+++ b/service/index.go
@@ -26,6 +26,7 @@
 	RegularCustomersService
 	PossibilityService
 	StatusService
+	QuotationService
 }
 
 var ServiceGroup = new(Group)
diff --git a/service/qutation.go b/service/qutation.go
new file mode 100644
index 0000000..247f4e8
--- /dev/null
+++ b/service/qutation.go
@@ -0,0 +1,54 @@
+package service
+
+import (
+	"aps_crm/model"
+	"aps_crm/pkg/ecode"
+)
+
+type QuotationService struct{}
+
+func (QuotationService) AddQuotation(quotation *model.Quotation) int {
+	err := model.NewQuotationSearch().Create(quotation)
+	if err != nil {
+		return ecode.QuotationExist
+	}
+
+	return ecode.OK
+}
+
+func (QuotationService) DeleteQuotation(id int) int {
+	_, err := model.NewQuotationSearch().SetId(id).Find()
+	if err != nil {
+		return ecode.QuotationNotExist
+	}
+
+	err = model.NewQuotationSearch().SetId(id).Delete()
+	if err != nil {
+		return ecode.QuotationNotExist
+	}
+	return ecode.OK
+}
+
+func (QuotationService) GetQuotationList() ([]*model.Quotation, int) {
+	list, err := model.NewQuotationSearch().FindAll()
+	if err != nil {
+		return nil, ecode.QuotationListErr
+	}
+
+	return list, ecode.OK
+}
+
+func (QuotationService) UpdateQuotation(quotation *model.Quotation) int {
+	// check quotation exist
+	_, err := model.NewQuotationSearch().SetId(quotation.Id).Find()
+	if err != nil {
+		return ecode.QuotationNotExist
+	}
+
+	err = model.NewQuotationSearch().SetId(quotation.Id).Update(quotation)
+	if err != nil {
+		return ecode.QuotationSetErr
+	}
+
+	return ecode.OK
+}

--
Gitblit v1.8.0