From 00c086f3158e8841ab495c62c3c41720e27456e0 Mon Sep 17 00:00:00 2001
From: wangpengfei <274878379@qq.com>
Date: 星期二, 11 七月 2023 15:25:58 +0800
Subject: [PATCH] add

---
 api/v1/index.go            |    2 
 api/v1/subOrder.go         |  141 +++++++++
 model/request/subOrder.go  |   20 +
 pkg/ecode/code.go          |    7 
 docs/swagger.yaml          |  122 ++++++++
 docs/docs.go               |  190 ++++++++++++
 docs/swagger.json          |  190 ++++++++++++
 model/response/response.go |    4 
 model/product.go           |   18 +
 service/index.go           |    1 
 router/subOrder.go         |   19 +
 model/index.go             |    2 
 service/subOrder.go        |   54 +++
 logs/aps-admin.err.log     |   13 
 router/index.go            |    2 
 model/subOrder.go          |   74 ++++
 16 files changed, 859 insertions(+), 0 deletions(-)

diff --git a/api/v1/index.go b/api/v1/index.go
index a226025..af7f83b 100644
--- a/api/v1/index.go
+++ b/api/v1/index.go
@@ -33,6 +33,7 @@
 	StatusApi
 	QuotationApi
 	MasterOrderApi
+	SubOrderApi
 }
 
 var ApiGroup = new(Group)
@@ -65,4 +66,5 @@
 	statusService            = service.ServiceGroup.StatusService
 	quotationService         = service.ServiceGroup.QuotationService
 	masterOrderService       = service.ServiceGroup.MasterOrderService
+	subOrderService          = service.ServiceGroup.SubOrderService
 )
diff --git a/api/v1/subOrder.go b/api/v1/subOrder.go
new file mode 100644
index 0000000..2ec0fd3
--- /dev/null
+++ b/api/v1/subOrder.go
@@ -0,0 +1,141 @@
+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 SubOrderApi struct{}
+
+// Add
+//
+//	@Tags		SubOrder
+//	@Summary	娣诲姞瀛愯鍗�
+//	@Produce	application/json
+//	@Param		object	body		request.AddSubOrder	true	"鏌ヨ鍙傛暟"
+//	@Success	200		{object}	contextx.Response{}
+//	@Router		/api/subOrder/add [post]
+func (s *SubOrderApi) Add(c *gin.Context) {
+	var params request.AddSubOrder
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode, subOrder := checkSubOrderParams(params.SubOrder)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	errCode = subOrderService.AddSubOrder(&subOrder)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Delete
+//
+//	@Tags		SubOrder
+//	@Summary	鍒犻櫎瀛愯鍗�
+//	@Produce	application/json
+//	@Param		id	path		int	true	"鏌ヨ鍙傛暟"
+//	@Success	200	{object}	contextx.Response{}
+//	@Router		/api/subOrder/delete/{id} [delete]
+func (s *SubOrderApi) Delete(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	id, _ := strconv.Atoi(c.Param("id"))
+	errCode := subOrderService.DeleteSubOrder(id)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Update
+//
+//	@Tags		SubOrder
+//	@Summary	鏇存柊瀛愯鍗�
+//	@Produce	application/json
+//	@Param		object	body		request.UpdateSubOrder	true	"鏌ヨ鍙傛暟"
+//	@Success	200		{object}	contextx.Response{}
+//	@Router		/api/subOrder/update [put]
+func (s *SubOrderApi) Update(c *gin.Context) {
+	var params request.UpdateSubOrder
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode, subOrder := checkSubOrderParams(params.SubOrder)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	errCode = subOrderService.UpdateSubOrder(&subOrder)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// List
+//
+//	@Tags		SubOrder
+//	@Summary	鑾峰彇瀛愯鍗曞垪琛�
+//	@Produce	application/json
+//	@Success	200	{object}	contextx.Response{}
+//	@Router		/api/subOrder/list [get]
+func (s *SubOrderApi) List(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	subOrders, errCode := subOrderService.GetSubOrderList()
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.OkWithDetailed(response.SubOrderResponse{
+		List: subOrders,
+	})
+}
+
+// checkSubOrderParams
+// 妫�鏌ュ瓙璁㈠崟鍙傛暟
+func checkSubOrderParams(subOrder request.SubOrder) (errCode int, newSubOrder model.SubOrder) {
+	if subOrder.Number == "" {
+		return ecode.InvalidParams, newSubOrder
+	}
+	if subOrder.MemberId == 0 {
+		return ecode.InvalidParams, newSubOrder
+	}
+
+	newSubOrder.ClientId = subOrder.ClientId
+	newSubOrder.MasterOrderId = subOrder.MasterOrderId
+	newSubOrder.Number = subOrder.Number
+	newSubOrder.MemberId = subOrder.MemberId
+
+	newSubOrder.Products = subOrder.Product
+
+	return ecode.OK, newSubOrder
+}
diff --git a/docs/docs.go b/docs/docs.go
index d9ffe10..1ef0d67 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -3163,6 +3163,113 @@
                 }
             }
         },
+        "/api/subOrder/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "SubOrder"
+                ],
+                "summary": "娣诲姞瀛愯鍗�",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddSubOrder"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/subOrder/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "SubOrder"
+                ],
+                "summary": "鍒犻櫎瀛愯鍗�",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/subOrder/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "SubOrder"
+                ],
+                "summary": "鑾峰彇瀛愯鍗曞垪琛�",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/subOrder/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "SubOrder"
+                ],
+                "summary": "鏇存柊瀛愯鍗�",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateSubOrder"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/user/changePassword": {
             "post": {
                 "produces": [
@@ -3942,6 +4049,32 @@
                 },
                 "name": {
                     "type": "string"
+                }
+            }
+        },
+        "model.Product": {
+            "type": "object",
+            "properties": {
+                "amount": {
+                    "type": "integer"
+                },
+                "desc": {
+                    "type": "string"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "price": {
+                    "type": "number"
+                },
+                "total": {
+                    "type": "number"
                 }
             }
         },
@@ -4881,6 +5014,14 @@
                 }
             }
         },
+        "request.AddSubOrder": {
+            "type": "object",
+            "properties": {
+                "subOrder": {
+                    "$ref": "#/definitions/request.SubOrder"
+                }
+            }
+        },
         "request.ChangePasswordReq": {
             "type": "object",
             "properties": {
@@ -5165,6 +5306,29 @@
                     "type": "array",
                     "items": {
                         "type": "integer"
+                    }
+                }
+            }
+        },
+        "request.SubOrder": {
+            "type": "object",
+            "properties": {
+                "clientId": {
+                    "type": "integer"
+                },
+                "masterOrderId": {
+                    "type": "integer"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "product": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
                     }
                 }
             }
@@ -6047,6 +6211,32 @@
                 }
             }
         },
+        "request.UpdateSubOrder": {
+            "type": "object",
+            "properties": {
+                "clientId": {
+                    "type": "integer"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "masterOrderId": {
+                    "type": "integer"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "product": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
+                    }
+                }
+            }
+        },
         "response.CityResponse": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.json b/docs/swagger.json
index c0e0598..ab980ca 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -3151,6 +3151,113 @@
                 }
             }
         },
+        "/api/subOrder/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "SubOrder"
+                ],
+                "summary": "娣诲姞瀛愯鍗�",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddSubOrder"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/subOrder/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "SubOrder"
+                ],
+                "summary": "鍒犻櫎瀛愯鍗�",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/subOrder/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "SubOrder"
+                ],
+                "summary": "鑾峰彇瀛愯鍗曞垪琛�",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/subOrder/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "SubOrder"
+                ],
+                "summary": "鏇存柊瀛愯鍗�",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateSubOrder"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/user/changePassword": {
             "post": {
                 "produces": [
@@ -3930,6 +4037,32 @@
                 },
                 "name": {
                     "type": "string"
+                }
+            }
+        },
+        "model.Product": {
+            "type": "object",
+            "properties": {
+                "amount": {
+                    "type": "integer"
+                },
+                "desc": {
+                    "type": "string"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "price": {
+                    "type": "number"
+                },
+                "total": {
+                    "type": "number"
                 }
             }
         },
@@ -4869,6 +5002,14 @@
                 }
             }
         },
+        "request.AddSubOrder": {
+            "type": "object",
+            "properties": {
+                "subOrder": {
+                    "$ref": "#/definitions/request.SubOrder"
+                }
+            }
+        },
         "request.ChangePasswordReq": {
             "type": "object",
             "properties": {
@@ -5153,6 +5294,29 @@
                     "type": "array",
                     "items": {
                         "type": "integer"
+                    }
+                }
+            }
+        },
+        "request.SubOrder": {
+            "type": "object",
+            "properties": {
+                "clientId": {
+                    "type": "integer"
+                },
+                "masterOrderId": {
+                    "type": "integer"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "product": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
                     }
                 }
             }
@@ -6035,6 +6199,32 @@
                 }
             }
         },
+        "request.UpdateSubOrder": {
+            "type": "object",
+            "properties": {
+                "clientId": {
+                    "type": "integer"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "masterOrderId": {
+                    "type": "integer"
+                },
+                "memberId": {
+                    "type": "integer"
+                },
+                "number": {
+                    "type": "string"
+                },
+                "product": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Product"
+                    }
+                }
+            }
+        },
         "response.CityResponse": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index 176ac93..3d30a6b 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -355,6 +355,23 @@
       name:
         type: string
     type: object
+  model.Product:
+    properties:
+      amount:
+        type: integer
+      desc:
+        type: string
+      id:
+        type: integer
+      name:
+        type: string
+      number:
+        type: string
+      price:
+        type: number
+      total:
+        type: number
+    type: object
   model.Province:
     properties:
       cities:
@@ -984,6 +1001,11 @@
     required:
     - name
     type: object
+  request.AddSubOrder:
+    properties:
+      subOrder:
+        $ref: '#/definitions/request.SubOrder'
+    type: object
   request.ChangePasswordReq:
     properties:
       newPassword:
@@ -1185,6 +1207,21 @@
         description: 鍦板尯ID鍒楄〃
         items:
           type: integer
+        type: array
+    type: object
+  request.SubOrder:
+    properties:
+      clientId:
+        type: integer
+      masterOrderId:
+        type: integer
+      memberId:
+        type: integer
+      number:
+        type: string
+      product:
+        items:
+          $ref: '#/definitions/model.Product'
         type: array
     type: object
   request.UpdateCities:
@@ -1780,6 +1817,23 @@
         type: array
     required:
     - list
+    type: object
+  request.UpdateSubOrder:
+    properties:
+      clientId:
+        type: integer
+      id:
+        type: integer
+      masterOrderId:
+        type: integer
+      memberId:
+        type: integer
+      number:
+        type: string
+      product:
+        items:
+          $ref: '#/definitions/model.Product'
+        type: array
     type: object
   response.CityResponse:
     properties:
@@ -3900,6 +3954,74 @@
       summary: 鏇存柊鐘舵��
       tags:
       - Status
+  /api/subOrder/add:
+    post:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.AddSubOrder'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 娣诲姞瀛愯鍗�
+      tags:
+      - SubOrder
+  /api/subOrder/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:
+      - SubOrder
+  /api/subOrder/list:
+    get:
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 鑾峰彇瀛愯鍗曞垪琛�
+      tags:
+      - SubOrder
+  /api/subOrder/update:
+    put:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.UpdateSubOrder'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 鏇存柊瀛愯鍗�
+      tags:
+      - SubOrder
   /api/user/changePassword:
     post:
       parameters:
diff --git a/logs/aps-admin.err.log b/logs/aps-admin.err.log
index ff4e4b6..dd58b9b 100644
--- a/logs/aps-admin.err.log
+++ b/logs/aps-admin.err.log
@@ -332,3 +332,16 @@
 [2023-07-06 13:55:26]	[error]	[gorm.io/driver/mysql.Migrator.AlterColumn.func1:59]	trace	{"error": "Error 1170 (42000): BLOB/TEXT column 'name' used in key specification without a key length", "elapsed": 0.0007354, "rows": 0, "sql": "ALTER TABLE `client_level` MODIFY COLUMN `name` longtext"}
 [2023-07-06 13:55:26]	[error]	[main.main:29]	model Init err:Error 1170 (42000): BLOB/TEXT column 'name' used in key specification without a key length
 [2023-07-10 11:06:33]	[error]	[aps_crm/model.(*PossibilitySearch).Create:46]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.possibility' doesn't exist", "elapsed": 0.0032687, "rows": 0, "sql": "INSERT INTO `possibility` (`name`) VALUES ('10')"}
+[2023-07-10 20:54:43]	[error]	[aps_crm/model.(*SubOrderSearch).Create:45]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.sub_order' doesn't exist", "elapsed": 0.001705, "rows": 0, "sql": "INSERT INTO `sub_order` (`client_id`,`member_id`,`master_order_id`,`number`,`created_at`,`updated_at`,`deleted_at`) VALUES (11,110,1,'AC6521','2023-07-10 20:54:43.768','2023-07-10 20:54:43.768',NULL)"}
+[2023-07-11 10:43:59]	[error]	[gorm.io/gorm/migrator.Migrator.AutoMigrate:104]	failed to parse value model.SubOrder{Id:0, ClientId:0, MemberId:0, MasterOrderId:0, Number:"", Products:[]model.Product(nil), Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}}, got error invalid field found for struct aps_crm/model.SubOrder's field Products: define a valid foreign key for relations or implement the Valuer/Scanner interface
+[2023-07-11 10:43:59]	[error]	[gorm.io/gorm/migrator.Migrator.CreateTable:198]	failed to parse value model.SubOrder{Id:0, ClientId:0, MemberId:0, MasterOrderId:0, Number:"", Products:[]model.Product(nil), Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}}, got error invalid field found for struct aps_crm/model.SubOrder's field Products: define a valid foreign key for relations or implement the Valuer/Scanner interface
+[2023-07-11 10:43:59]	[error]	[main.main:29]	model Init err:invalid field found for struct aps_crm/model.SubOrder's field Products: define a valid foreign key for relations or implement the Valuer/Scanner interface
+[2023-07-11 11:31:58]	[error]	[gorm.io/gorm/migrator.Migrator.AutoMigrate:104]	failed to parse value model.SubOrder{Id:0, ClientId:0, MemberId:0, MasterOrderId:0, Number:"", ProductOrder:model.ProductOrder{Id:0, Products:[]model.Product(nil)}, Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}}, got error invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
+[2023-07-11 11:31:58]	[error]	[gorm.io/gorm/migrator.Migrator.CreateTable:198]	failed to parse value model.SubOrder{Id:0, ClientId:0, MemberId:0, MasterOrderId:0, Number:"", ProductOrder:model.ProductOrder{Id:0, Products:[]model.Product(nil)}, Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}}, got error invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
+[2023-07-11 11:31:58]	[error]	[main.main:29]	model Init err:invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
+[2023-07-11 11:32:32]	[error]	[gorm.io/gorm/migrator.Migrator.AutoMigrate:104]	failed to parse value model.SubOrder{Id:0, ClientId:0, MemberId:0, MasterOrderId:0, Number:"", ProductOrder:model.ProductOrder{Id:0, Products:[]model.Product(nil)}, Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}}, got error invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
+[2023-07-11 11:32:32]	[error]	[gorm.io/gorm/migrator.Migrator.CreateTable:198]	failed to parse value model.SubOrder{Id:0, ClientId:0, MemberId:0, MasterOrderId:0, Number:"", ProductOrder:model.ProductOrder{Id:0, Products:[]model.Product(nil)}, Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}}, got error invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
+[2023-07-11 11:32:32]	[error]	[main.main:29]	model Init err:invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
+[2023-07-11 11:33:55]	[error]	[gorm.io/gorm/migrator.Migrator.AutoMigrate:104]	failed to parse value model.SubOrder{Id:0, ClientId:0, MemberId:0, MasterOrderId:0, Number:"", ProductOrder:model.ProductOrder{Id:0, Products:[]model.Product(nil)}, Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}}, got error invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
+[2023-07-11 11:33:55]	[error]	[gorm.io/gorm/migrator.Migrator.CreateTable:198]	failed to parse value model.SubOrder{Id:0, ClientId:0, MemberId:0, MasterOrderId:0, Number:"", ProductOrder:model.ProductOrder{Id:0, Products:[]model.Product(nil)}, Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}}, got error invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
+[2023-07-11 11:33:55]	[error]	[main.main:29]	model Init err:invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
diff --git a/model/index.go b/model/index.go
index cda1221..91a30b1 100644
--- a/model/index.go
+++ b/model/index.go
@@ -48,6 +48,8 @@
 		Status{},
 		Quotation{},
 		MasterOrder{},
+		SubOrder{},
+		Product{},
 	)
 	return err
 }
diff --git a/model/product.go b/model/product.go
new file mode 100644
index 0000000..029857b
--- /dev/null
+++ b/model/product.go
@@ -0,0 +1,18 @@
+package model
+
+import "gorm.io/gorm"
+
+type Product struct {
+	Id         int     `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
+	Name       string  `json:"name" gorm:"column:name;type:varchar(255);comment:浜у搧鍚嶇О"`
+	Price      float64 `json:"price" gorm:"column:price;type:decimal(10,2);comment:浜у搧浠锋牸"`
+	Number     string  `json:"number" gorm:"column:number;type:varchar(255);comment:浜у搧缂栧彿"`
+	Amount     int     `json:"amount" gorm:"column:amount;type:int;comment:浜у搧鏁伴噺"`
+	Total      float64 `json:"total" gorm:"column:total;type:decimal(10,2);comment:浜у搧鎬讳环"`
+	Desc       string  `json:"desc" gorm:"column:desc;type:varchar(255);comment:浜у搧鎻忚堪"`
+	gorm.Model `json:"-"`
+}
+
+func (Product) TableName() string {
+	return "products"
+}
diff --git a/model/request/subOrder.go b/model/request/subOrder.go
new file mode 100644
index 0000000..994550f
--- /dev/null
+++ b/model/request/subOrder.go
@@ -0,0 +1,20 @@
+package request
+
+import "aps_crm/model"
+
+type AddSubOrder struct {
+	SubOrder SubOrder `json:"subOrder"`
+}
+
+type SubOrder struct {
+	ClientId      int             `json:"clientId"`
+	MasterOrderId int             `json:"masterOrderId"`
+	Number        string          `json:"number"`
+	MemberId      int             `json:"memberId"`
+	Product       []model.Product `json:"product"`
+}
+
+type UpdateSubOrder struct {
+	Id int `json:"id"`
+	SubOrder
+}
diff --git a/model/response/response.go b/model/response/response.go
index 2142098..842c0f3 100644
--- a/model/response/response.go
+++ b/model/response/response.go
@@ -129,4 +129,8 @@
 	MasterOrderResponse struct {
 		List []*model.MasterOrder `json:"list"`
 	}
+
+	SubOrderResponse struct {
+		List []*model.SubOrder `json:"list"`
+	}
 )
diff --git a/model/subOrder.go b/model/subOrder.go
new file mode 100644
index 0000000..b1f3479
--- /dev/null
+++ b/model/subOrder.go
@@ -0,0 +1,74 @@
+package model
+
+import (
+	"aps_crm/pkg/mysqlx"
+	"gorm.io/gorm"
+)
+
+type (
+	SubOrder struct {
+		Id            int       `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
+		ClientId      int       `json:"clientId" gorm:"column:client_id;type:int;comment:瀹㈡埛id"`
+		MemberId      int       `json:"memberId" gorm:"column:member_id;type:int;comment:璐熻矗浜篿d"`
+		MasterOrderId int       `json:"masterOrderId" gorm:"column:master_order_id;type:int;comment:閿�鍞�诲崟id"`
+		Number        string    `json:"number" gorm:"column:number;type:varchar(255);comment:閿�鍞瓙鍗曞彿"`
+		Products      []Product `json:"products" gorm:"many2many:subOrder_product;"`
+		gorm.Model    `json:"-"`
+	}
+
+	SubOrderSearch struct {
+		SubOrder
+		Orm *gorm.DB
+	}
+)
+
+func (SubOrder) TableName() string {
+	return "sub_order"
+}
+
+func NewSubOrderSearch() *SubOrderSearch {
+	return &SubOrderSearch{
+		Orm: mysqlx.GetDB(),
+	}
+}
+
+func (slf *SubOrderSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&SubOrder{})
+	if slf.Id != 0 {
+		db = db.Where("id = ?", slf.Id)
+	}
+
+	return db
+}
+
+func (slf *SubOrderSearch) Create(record *SubOrder) error {
+	var db = slf.build()
+	return db.Create(record).Error
+}
+
+func (slf *SubOrderSearch) Delete() error {
+	var db = slf.build()
+	return db.Delete(&SubOrder{}).Error
+}
+
+func (slf *SubOrderSearch) Update(record *SubOrder) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
+
+func (slf *SubOrderSearch) Find() (result []SubOrder, err error) {
+	var db = slf.build()
+	err = db.Find(&result).Error
+	return
+}
+
+func (slf *SubOrderSearch) FindAll() (result []*SubOrder, err error) {
+	var db = slf.build()
+	err = db.Preload("Products").Find(&result).Error
+	return
+}
+
+func (slf *SubOrderSearch) SetId(id int) *SubOrderSearch {
+	slf.Id = id
+	return slf
+}
diff --git a/pkg/ecode/code.go b/pkg/ecode/code.go
index e16bafd..867c208 100644
--- a/pkg/ecode/code.go
+++ b/pkg/ecode/code.go
@@ -191,4 +191,11 @@
 	MasterOrderUpdateErr = 2600005 // 鏇存柊涓昏鍗曞け璐�
 	MasterOrderDeleteErr = 2600006 // 鍒犻櫎涓昏鍗曞け璐�
 
+	SubOrderExist     = 2700001 // 瀛愯鍗曞凡瀛樺湪
+	SubOrderNotExist  = 2700002 // 瀛愯鍗曚笉瀛樺湪
+	SubOrderListErr   = 2700003 // 鑾峰彇瀛愯鍗曞垪琛ㄥけ璐�
+	SubOrderSetErr    = 2700004 // 璁剧疆瀛愯鍗曞け璐�
+	SubOrderUpdateErr = 2700005 // 鏇存柊瀛愯鍗曞け璐�
+	SubOrderDeleteErr = 2700006 // 鍒犻櫎瀛愯鍗曞け璐�
+
 )
diff --git a/router/index.go b/router/index.go
index 9346158..2cf4c1b 100644
--- a/router/index.go
+++ b/router/index.go
@@ -39,6 +39,7 @@
 	StatusRouter
 	QuotationRouter
 	MasterOrderRouter
+	SubOrderRouter
 }
 
 func InitRouter() *gin.Engine {
@@ -95,6 +96,7 @@
 		routerGroup.InitStatusRouter(PrivateGroup)            // 娉ㄥ唽status璺敱
 		routerGroup.InitQuotationRouter(PrivateGroup)         // 娉ㄥ唽quotation璺敱
 		routerGroup.InitMasterOrderRouter(PrivateGroup)       // 娉ㄥ唽masterOrder璺敱
+		routerGroup.InitSubOrderRouter(PrivateGroup)          // 娉ㄥ唽subOrder璺敱
 	}
 	return Router
 }
diff --git a/router/subOrder.go b/router/subOrder.go
new file mode 100644
index 0000000..1cd0197
--- /dev/null
+++ b/router/subOrder.go
@@ -0,0 +1,19 @@
+package router
+
+import (
+	v1 "aps_crm/api/v1"
+	"github.com/gin-gonic/gin"
+)
+
+type SubOrderRouter struct{}
+
+func (s *SubOrderRouter) InitSubOrderRouter(router *gin.RouterGroup) {
+	subOrderRouter := router.Group("subOrder")
+	subOrderApi := v1.ApiGroup.SubOrderApi
+	{
+		subOrderRouter.POST("add", subOrderApi.Add)             // 娣诲姞瀛愯鍗�
+		subOrderRouter.DELETE("delete/:id", subOrderApi.Delete) // 鍒犻櫎瀛愯鍗�
+		subOrderRouter.PUT("update", subOrderApi.Update)        // 鏇存柊瀛愯鍗�
+		subOrderRouter.GET("list", subOrderApi.List)            // 鑾峰彇瀛愯鍗曞垪琛�
+	}
+}
diff --git a/service/index.go b/service/index.go
index 26577e4..d8ab5e1 100644
--- a/service/index.go
+++ b/service/index.go
@@ -28,6 +28,7 @@
 	StatusService
 	QuotationService
 	MasterOrderService
+	SubOrderService
 }
 
 var ServiceGroup = new(Group)
diff --git a/service/subOrder.go b/service/subOrder.go
new file mode 100644
index 0000000..cf6df59
--- /dev/null
+++ b/service/subOrder.go
@@ -0,0 +1,54 @@
+package service
+
+import (
+	"aps_crm/model"
+	"aps_crm/pkg/ecode"
+)
+
+type SubOrderService struct{}
+
+func (SubOrderService) AddSubOrder(subOrder *model.SubOrder) int {
+	err := model.NewSubOrderSearch().Create(subOrder)
+	if err != nil {
+		return ecode.SubOrderExist
+	}
+
+	return ecode.OK
+}
+
+func (SubOrderService) DeleteSubOrder(id int) int {
+	_, err := model.NewSubOrderSearch().SetId(id).Find()
+	if err != nil {
+		return ecode.SubOrderNotExist
+	}
+
+	err = model.NewSubOrderSearch().SetId(id).Delete()
+	if err != nil {
+		return ecode.SubOrderNotExist
+	}
+	return ecode.OK
+}
+
+func (SubOrderService) GetSubOrderList() ([]*model.SubOrder, int) {
+	list, err := model.NewSubOrderSearch().FindAll()
+	if err != nil {
+		return nil, ecode.SubOrderListErr
+	}
+
+	return list, ecode.OK
+}
+
+func (SubOrderService) UpdateSubOrder(subOrder *model.SubOrder) int {
+	// check subOrder exist
+	_, err := model.NewSubOrderSearch().SetId(subOrder.Id).Find()
+	if err != nil {
+		return ecode.SubOrderNotExist
+	}
+
+	err = model.NewSubOrderSearch().SetId(subOrder.Id).Update(subOrder)
+	if err != nil {
+		return ecode.SubOrderSetErr
+	}
+
+	return ecode.OK
+}

--
Gitblit v1.8.0