add
SubOrder 销售子单
add, Delete, update, list
增加产品管管理模块
| | |
| | | StatusApi |
| | | QuotationApi |
| | | MasterOrderApi |
| | | SubOrderApi |
| | | } |
| | | |
| | | var ApiGroup = new(Group) |
| | |
| | | statusService = service.ServiceGroup.StatusService |
| | | quotationService = service.ServiceGroup.QuotationService |
| | | masterOrderService = service.ServiceGroup.MasterOrderService |
| | | subOrderService = service.ServiceGroup.SubOrderService |
| | | ) |
New file |
| | |
| | | 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, ¶ms) |
| | | 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, ¶ms) |
| | | 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 |
| | | } |
| | |
| | | } |
| | | } |
| | | }, |
| | | "/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": [ |
| | |
| | | }, |
| | | "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" |
| | | } |
| | | } |
| | | }, |
| | |
| | | } |
| | | } |
| | | }, |
| | | "request.AddSubOrder": { |
| | | "type": "object", |
| | | "properties": { |
| | | "subOrder": { |
| | | "$ref": "#/definitions/request.SubOrder" |
| | | } |
| | | } |
| | | }, |
| | | "request.ChangePasswordReq": { |
| | | "type": "object", |
| | | "properties": { |
| | |
| | | "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" |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | }, |
| | | "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": { |
| | |
| | | } |
| | | } |
| | | }, |
| | | "/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": [ |
| | |
| | | }, |
| | | "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" |
| | | } |
| | | } |
| | | }, |
| | |
| | | } |
| | | } |
| | | }, |
| | | "request.AddSubOrder": { |
| | | "type": "object", |
| | | "properties": { |
| | | "subOrder": { |
| | | "$ref": "#/definitions/request.SubOrder" |
| | | } |
| | | } |
| | | }, |
| | | "request.ChangePasswordReq": { |
| | | "type": "object", |
| | | "properties": { |
| | |
| | | "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" |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | }, |
| | | "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": { |
| | |
| | | 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: |
| | |
| | | required: |
| | | - name |
| | | type: object |
| | | request.AddSubOrder: |
| | | properties: |
| | | subOrder: |
| | | $ref: '#/definitions/request.SubOrder' |
| | | type: object |
| | | request.ChangePasswordReq: |
| | | properties: |
| | | newPassword: |
| | |
| | | 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: |
| | |
| | | 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: |
| | |
| | | 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: |
| | |
| | | [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 |
| | |
| | | Status{}, |
| | | Quotation{}, |
| | | MasterOrder{}, |
| | | SubOrder{}, |
| | | Product{}, |
| | | ) |
| | | return err |
| | | } |
New file |
| | |
| | | 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" |
| | | } |
New file |
| | |
| | | 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 |
| | | } |
| | |
| | | MasterOrderResponse struct { |
| | | List []*model.MasterOrder `json:"list"` |
| | | } |
| | | |
| | | SubOrderResponse struct { |
| | | List []*model.SubOrder `json:"list"` |
| | | } |
| | | ) |
New file |
| | |
| | | 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 |
| | | } |
| | |
| | | MasterOrderUpdateErr = 2600005 // 更新主订单失败 |
| | | MasterOrderDeleteErr = 2600006 // 删除主订单失败 |
| | | |
| | | SubOrderExist = 2700001 // 子订单已存在 |
| | | SubOrderNotExist = 2700002 // 子订单不存在 |
| | | SubOrderListErr = 2700003 // 获取子订单列表失败 |
| | | SubOrderSetErr = 2700004 // 设置子订单失败 |
| | | SubOrderUpdateErr = 2700005 // 更新子订单失败 |
| | | SubOrderDeleteErr = 2700006 // 删除子订单失败 |
| | | |
| | | ) |
| | |
| | | StatusRouter |
| | | QuotationRouter |
| | | MasterOrderRouter |
| | | SubOrderRouter |
| | | } |
| | | |
| | | func InitRouter() *gin.Engine { |
| | |
| | | routerGroup.InitStatusRouter(PrivateGroup) // 注册status路由 |
| | | routerGroup.InitQuotationRouter(PrivateGroup) // 注册quotation路由 |
| | | routerGroup.InitMasterOrderRouter(PrivateGroup) // 注册masterOrder路由 |
| | | routerGroup.InitSubOrderRouter(PrivateGroup) // 注册subOrder路由 |
| | | } |
| | | return Router |
| | | } |
New file |
| | |
| | | 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) // 获取子订单列表 |
| | | } |
| | | } |
| | |
| | | StatusService |
| | | QuotationService |
| | | MasterOrderService |
| | | SubOrderService |
| | | } |
| | | |
| | | var ServiceGroup = new(Group) |
New file |
| | |
| | | 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 |
| | | } |