add
wangpengfei
2023-07-11 00c086f3158e8841ab495c62c3c41720e27456e0
add

SubOrder 销售子单
add, Delete, update, list

增加产品管管理模块
6个文件已添加
10个文件已修改
859 ■■■■■ 已修改文件
api/v1/index.go 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/v1/subOrder.go 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/docs.go 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/swagger.json 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/swagger.yaml 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
logs/aps-admin.err.log 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/index.go 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/product.go 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/request/subOrder.go 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/response/response.go 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/subOrder.go 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pkg/ecode/code.go 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
router/index.go 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
router/subOrder.go 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/index.go 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/subOrder.go 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
)
api/v1/subOrder.go
New file
@@ -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
}
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": {
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": {
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:
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
model/index.go
@@ -48,6 +48,8 @@
        Status{},
        Quotation{},
        MasterOrder{},
        SubOrder{},
        Product{},
    )
    return err
}
model/product.go
New file
@@ -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"
}
model/request/subOrder.go
New file
@@ -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
}
model/response/response.go
@@ -129,4 +129,8 @@
    MasterOrderResponse struct {
        List []*model.MasterOrder `json:"list"`
    }
    SubOrderResponse struct {
        List []*model.SubOrder `json:"list"`
    }
)
model/subOrder.go
New file
@@ -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:负责人id"`
        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
}
pkg/ecode/code.go
@@ -191,4 +191,11 @@
    MasterOrderUpdateErr = 2600005 // 更新主订单失败
    MasterOrderDeleteErr = 2600006 // 删除主订单失败
    SubOrderExist     = 2700001 // 子订单已存在
    SubOrderNotExist  = 2700002 // 子订单不存在
    SubOrderListErr   = 2700003 // 获取子订单列表失败
    SubOrderSetErr    = 2700004 // 设置子订单失败
    SubOrderUpdateErr = 2700005 // 更新子订单失败
    SubOrderDeleteErr = 2700006 // 删除子订单失败
)
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
}
router/subOrder.go
New file
@@ -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)            // 获取子订单列表
    }
}
service/index.go
@@ -28,6 +28,7 @@
    StatusService
    QuotationService
    MasterOrderService
    SubOrderService
}
var ServiceGroup = new(Group)
service/subOrder.go
New file
@@ -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
}