正在显示
21 个修改的文件
包含
692 行增加
和
134 行删除
@@ -34,10 +34,76 @@ func FastPgWorkshop(transactionContext application.TransactionContext, id int, o | @@ -34,10 +34,76 @@ func FastPgWorkshop(transactionContext application.TransactionContext, id int, o | ||
34 | return rep, mod, err | 34 | return rep, mod, err |
35 | } | 35 | } |
36 | 36 | ||
37 | +// FastPgWorkstation 快速返回工作定位对象 | ||
38 | +// | ||
39 | +// transactionContext 事务 | ||
40 | +// workshopId 车间ID | ||
41 | +// lineId 生产线ID | ||
42 | +// sectionId 对象ID | ||
43 | +func FastPgWorkstation(transactionContext application.TransactionContext, workshopId, lineId, sectionId int, options ...option) (domain.WorkshopRepository, *domain.WorkStation, error) { | ||
44 | + var rep domain.WorkshopRepository | ||
45 | + var mod *domain.Workshop | ||
46 | + var err error | ||
47 | + if value, err := CreateWorkshopRepository(map[string]interface{}{ | ||
48 | + "transactionContext": transactionContext, | ||
49 | + }); err != nil { | ||
50 | + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
51 | + } else { | ||
52 | + rep = value | ||
53 | + } | ||
54 | + | ||
55 | + if mod, err = rep.FindOne(map[string]interface{}{"workshopId": workshopId}); err != nil { | ||
56 | + if err == domain.ErrorNotFound { | ||
57 | + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该车间不存在") | ||
58 | + } | ||
59 | + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
60 | + } | ||
61 | + | ||
62 | + workStation, err := mod.FindWorkStation(workshopId, lineId, sectionId) | ||
63 | + if err != nil { | ||
64 | + return rep, nil, err | ||
65 | + } | ||
66 | + o := NewFastOptions(options...) | ||
67 | + if o.SetPrincipal { | ||
68 | + workStation.Principal = mod.Principal | ||
69 | + } | ||
70 | + return rep, workStation, err | ||
71 | +} | ||
72 | + | ||
73 | +// FastPgProductJob 快速返回工位对象 | ||
74 | +// | ||
75 | +// transactionContext 事务 | ||
76 | +// id 对象唯一标识 | ||
77 | +func FastPgProductJob(transactionContext application.TransactionContext, id int, options ...option) (domain.ProductJobRepository, *domain.ProductJob, error) { | ||
78 | + var rep domain.ProductJobRepository | ||
79 | + var mod *domain.ProductJob | ||
80 | + var err error | ||
81 | + if value, err := CreateProductJobRepository(map[string]interface{}{ | ||
82 | + "transactionContext": transactionContext, | ||
83 | + }); err != nil { | ||
84 | + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
85 | + } else { | ||
86 | + rep = value | ||
87 | + } | ||
88 | + if id > 0 { | ||
89 | + if mod, err = rep.FindOne(map[string]interface{}{"productJobId": id}); err != nil { | ||
90 | + if err == domain.ErrorNotFound { | ||
91 | + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该车间不存在") | ||
92 | + } | ||
93 | + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
94 | + } | ||
95 | + } | ||
96 | + //if err = fastPgDataAuth(transactionContext, mod, options...); err != nil { | ||
97 | + // return nil, nil, err | ||
98 | + //} | ||
99 | + return rep, mod, err | ||
100 | +} | ||
101 | + | ||
37 | /***** 2.配置 *****/ | 102 | /***** 2.配置 *****/ |
38 | 103 | ||
39 | type FastOptions struct { | 104 | type FastOptions struct { |
40 | DataAuthRequired bool | 105 | DataAuthRequired bool |
106 | + SetPrincipal bool | ||
41 | OperateInfo *domain.OperateInfo | 107 | OperateInfo *domain.OperateInfo |
42 | } | 108 | } |
43 | 109 | ||
@@ -66,3 +132,10 @@ func WithOperator(op *domain.OperateInfo) option { | @@ -66,3 +132,10 @@ func WithOperator(op *domain.OperateInfo) option { | ||
66 | options.OperateInfo = op | 132 | options.OperateInfo = op |
67 | } | 133 | } |
68 | } | 134 | } |
135 | + | ||
136 | +// WithOperator 操作人 | ||
137 | +func WithSetPrincipal() option { | ||
138 | + return func(options *FastOptions) { | ||
139 | + options.SetPrincipal = true | ||
140 | + } | ||
141 | +} |
@@ -10,11 +10,13 @@ import ( | @@ -10,11 +10,13 @@ import ( | ||
10 | 10 | ||
11 | type CreateProductJobCommand struct { | 11 | type CreateProductJobCommand struct { |
12 | // 企业id | 12 | // 企业id |
13 | - CompanyId int `cname:"企业id" json:"companyId" valid:"Required"` | 13 | + //CompanyId int `cname:"企业id" json:"companyId" valid:"Required"` |
14 | // 组织ID | 14 | // 组织ID |
15 | - OrgId int `cname:"组织ID" json:"orgId" valid:"Required"` | 15 | + //OrgId int `cname:"组织ID" json:"orgId" valid:"Required"` |
16 | // 工位名称 | 16 | // 工位名称 |
17 | JobName string `cname:"工位名称" json:"jobName" valid:"Required"` | 17 | JobName string `cname:"工位名称" json:"jobName" valid:"Required"` |
18 | + // 工位名称 | ||
19 | + ProcessName string `cname:"工位名称" json:"processName" valid:"Required"` | ||
18 | // 车间ID | 20 | // 车间ID |
19 | WorkshopId int `cname:"车间ID" json:"workshopId" valid:"Required"` | 21 | WorkshopId int `cname:"车间ID" json:"workshopId" valid:"Required"` |
20 | // 生产线ID | 22 | // 生产线ID |
@@ -26,7 +28,7 @@ type CreateProductJobCommand struct { | @@ -26,7 +28,7 @@ type CreateProductJobCommand struct { | ||
26 | } | 28 | } |
27 | 29 | ||
28 | func (createProductJobCommand *CreateProductJobCommand) Valid(validation *validation.Validation) { | 30 | func (createProductJobCommand *CreateProductJobCommand) Valid(validation *validation.Validation) { |
29 | - validation.SetError("CustomValid", "未实现的自定义认证") | 31 | + //validation.SetError("CustomValid", "未实现的自定义认证") |
30 | } | 32 | } |
31 | 33 | ||
32 | func (createProductJobCommand *CreateProductJobCommand) ValidateCommand() error { | 34 | func (createProductJobCommand *CreateProductJobCommand) ValidateCommand() error { |
@@ -14,7 +14,7 @@ type RemoveProductJobCommand struct { | @@ -14,7 +14,7 @@ type RemoveProductJobCommand struct { | ||
14 | } | 14 | } |
15 | 15 | ||
16 | func (removeProductJobCommand *RemoveProductJobCommand) Valid(validation *validation.Validation) { | 16 | func (removeProductJobCommand *RemoveProductJobCommand) Valid(validation *validation.Validation) { |
17 | - validation.SetError("CustomValid", "未实现的自定义认证") | 17 | + //validation.SetError("CustomValid", "未实现的自定义认证") |
18 | } | 18 | } |
19 | 19 | ||
20 | func (removeProductJobCommand *RemoveProductJobCommand) ValidateCommand() error { | 20 | func (removeProductJobCommand *RemoveProductJobCommand) ValidateCommand() error { |
@@ -24,7 +24,7 @@ type UpdateProductJobCommand struct { | @@ -24,7 +24,7 @@ type UpdateProductJobCommand struct { | ||
24 | } | 24 | } |
25 | 25 | ||
26 | func (updateProductJobCommand *UpdateProductJobCommand) Valid(validation *validation.Validation) { | 26 | func (updateProductJobCommand *UpdateProductJobCommand) Valid(validation *validation.Validation) { |
27 | - validation.SetError("CustomValid", "未实现的自定义认证") | 27 | + //validation.SetError("CustomValid", "未实现的自定义认证") |
28 | } | 28 | } |
29 | 29 | ||
30 | func (updateProductJobCommand *UpdateProductJobCommand) ValidateCommand() error { | 30 | func (updateProductJobCommand *UpdateProductJobCommand) ValidateCommand() error { |
1 | +package dto | ||
2 | + | ||
3 | +import "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
4 | + | ||
5 | +type ProductJobDto struct { | ||
6 | + // 工位ID | ||
7 | + ProductJobId int `json:"productJobId,omitempty"` | ||
8 | + // 工位名称 | ||
9 | + JobName string `json:"jobName,omitempty"` | ||
10 | + // 工序名称 | ||
11 | + ProcessName string `json:"processName,omitempty"` | ||
12 | + //// 工作位置键值 (车间ID+'.'+生产线ID+'.'+工段ID) | ||
13 | + //WorkStationId string `json:"workStationId,omitempty"` | ||
14 | + //// 车间ID | ||
15 | + //WorkshopId int `json:"workshopId,omitempty"` | ||
16 | + //// 车间名称 | ||
17 | + //WorkshopName string `json:"workshopName,omitempty"` | ||
18 | + //// 生产线ID | ||
19 | + //LineId int `json:"lineId,omitempty"` | ||
20 | + //// 生产线名称 | ||
21 | + //LineName string `json:"lineName,omitempty"` | ||
22 | + //// 工段ID | ||
23 | + //SectionId int `json:"sectionId,omitempty"` | ||
24 | + //// 工段名称 | ||
25 | + //SectionName string `json:"sectionName,omitempty"` | ||
26 | + //// 负责人 (用户对象) | ||
27 | + //Principal *domain.User `json:"principal,omitempty"` | ||
28 | + *domain.WorkStation | ||
29 | +} | ||
30 | + | ||
31 | +func (m *ProductJobDto) LoadDto(job *domain.ProductJob) { | ||
32 | + m.ProductJobId = job.ProductJobId | ||
33 | + m.JobName = job.JobName | ||
34 | + m.ProcessName = job.ProcessName | ||
35 | + m.WorkStation = job.WorkStation | ||
36 | +} |
@@ -14,7 +14,7 @@ type GetProductJobQuery struct { | @@ -14,7 +14,7 @@ type GetProductJobQuery struct { | ||
14 | } | 14 | } |
15 | 15 | ||
16 | func (getProductJobQuery *GetProductJobQuery) Valid(validation *validation.Validation) { | 16 | func (getProductJobQuery *GetProductJobQuery) Valid(validation *validation.Validation) { |
17 | - validation.SetError("CustomValid", "未实现的自定义认证") | 17 | + //validation.SetError("CustomValid", "未实现的自定义认证") |
18 | } | 18 | } |
19 | 19 | ||
20 | func (getProductJobQuery *GetProductJobQuery) ValidateQuery() error { | 20 | func (getProductJobQuery *GetProductJobQuery) ValidateQuery() error { |
@@ -2,6 +2,7 @@ package query | @@ -2,6 +2,7 @@ package query | ||
2 | 2 | ||
3 | import ( | 3 | import ( |
4 | "fmt" | 4 | "fmt" |
5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
5 | "reflect" | 6 | "reflect" |
6 | "strings" | 7 | "strings" |
7 | 8 | ||
@@ -10,23 +11,37 @@ import ( | @@ -10,23 +11,37 @@ import ( | ||
10 | 11 | ||
11 | type ListProductJobQuery struct { | 12 | type ListProductJobQuery struct { |
12 | // 查询偏离量 | 13 | // 查询偏离量 |
13 | - Offset int `cname:"查询偏离量" json:"offset" valid:"Required"` | 14 | + Offset int `cname:"查询偏离量" json:"offset,omitempty"` |
14 | // 查询限制 | 15 | // 查询限制 |
15 | - Limit int `cname:"查询限制" json:"limit" valid:"Required"` | 16 | + Limit int `cname:"查询限制" json:"limit,omitempty"` |
17 | + // 当前公司 | ||
18 | + CompanyId int `json:"-"` | ||
19 | + // 当前登录的组织 | ||
20 | + OrgId int `json:"-"` | ||
21 | + // 页码 | ||
22 | + PageNumber int `cname:"页码" json:"pageNumber,omitempty"` | ||
23 | + // 页数 | ||
24 | + PageSize int `cname:"页数" json:"pageSize,omitempty"` | ||
25 | + // 工位名称 | ||
26 | + JobName string `cname:"车间名称" json:"jobName,omitempty"` | ||
27 | + // 车间名称 | ||
28 | + WorkshopName string `cname:"车间名称" json:"workshopName,omitempty"` | ||
29 | + // 生产线名称 | ||
30 | + LineName string `cname:"生产线名称" json:"lineName,omitempty"` | ||
16 | } | 31 | } |
17 | 32 | ||
18 | -func (listProductJobQuery *ListProductJobQuery) Valid(validation *validation.Validation) { | ||
19 | - validation.SetError("CustomValid", "未实现的自定义认证") | 33 | +func (cmd *ListProductJobQuery) Valid(validation *validation.Validation) { |
34 | + cmd.Offset, cmd.Limit = domain.Pagination(cmd.PageNumber, cmd.PageSize) | ||
20 | } | 35 | } |
21 | 36 | ||
22 | -func (listProductJobQuery *ListProductJobQuery) ValidateQuery() error { | 37 | +func (cmd *ListProductJobQuery) ValidateQuery() error { |
23 | valid := validation.Validation{} | 38 | valid := validation.Validation{} |
24 | - b, err := valid.Valid(listProductJobQuery) | 39 | + b, err := valid.Valid(cmd) |
25 | if err != nil { | 40 | if err != nil { |
26 | return err | 41 | return err |
27 | } | 42 | } |
28 | if !b { | 43 | if !b { |
29 | - elem := reflect.TypeOf(listProductJobQuery).Elem() | 44 | + elem := reflect.TypeOf(cmd).Elem() |
30 | for _, validErr := range valid.Errors { | 45 | for _, validErr := range valid.Errors { |
31 | field, isExist := elem.FieldByName(validErr.Field) | 46 | field, isExist := elem.FieldByName(validErr.Field) |
32 | if isExist { | 47 | if isExist { |
1 | +package query | ||
2 | + | ||
3 | +import ( | ||
4 | + "fmt" | ||
5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
6 | + "reflect" | ||
7 | + "strings" | ||
8 | + | ||
9 | + "github.com/beego/beego/v2/core/validation" | ||
10 | +) | ||
11 | + | ||
12 | +type SearchProductJobQuery struct { | ||
13 | + // 查询偏离量 | ||
14 | + Offset int `cname:"查询偏离量" json:"offset,omitempty"` | ||
15 | + // 查询限制 | ||
16 | + Limit int `cname:"查询限制" json:"limit,omitempty"` | ||
17 | + // 当前公司 | ||
18 | + CompanyId int `cname:"当前公司" json:"companyId,omitempty" valid:"Required"` | ||
19 | + // 当前登录的组织 | ||
20 | + OrgId int `cname:"当前登录的组织" json:"orgId,omitempty" valid:"Required"` | ||
21 | + // 页码 | ||
22 | + PageNumber int `cname:"页码" json:"pageNumber,omitempty"` | ||
23 | + // 页数 | ||
24 | + PageSize int `cname:"页数" json:"pageSize,omitempty"` | ||
25 | + // 工位名称 | ||
26 | + JobName string `cname:"车间名称" json:"jobName,omitempty"` | ||
27 | + // 车间名称 | ||
28 | + WorkshopName string `cname:"车间名称" json:"workshopName,omitempty"` | ||
29 | + // 生产线名称 | ||
30 | + LineName string `cname:"生产线名称" json:"lineName,omitempty"` | ||
31 | +} | ||
32 | + | ||
33 | +func (cmd *SearchProductJobQuery) Valid(validation *validation.Validation) { | ||
34 | + cmd.Offset, cmd.Limit = domain.Pagination(cmd.PageNumber, cmd.PageSize) | ||
35 | +} | ||
36 | + | ||
37 | +func (cmd *SearchProductJobQuery) ValidateQuery() error { | ||
38 | + valid := validation.Validation{} | ||
39 | + b, err := valid.Valid(cmd) | ||
40 | + if err != nil { | ||
41 | + return err | ||
42 | + } | ||
43 | + if !b { | ||
44 | + elem := reflect.TypeOf(cmd).Elem() | ||
45 | + for _, validErr := range valid.Errors { | ||
46 | + field, isExist := elem.FieldByName(validErr.Field) | ||
47 | + if isExist { | ||
48 | + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1)) | ||
49 | + } else { | ||
50 | + return fmt.Errorf(validErr.Message) | ||
51 | + } | ||
52 | + } | ||
53 | + } | ||
54 | + return nil | ||
55 | +} |
@@ -6,8 +6,11 @@ import ( | @@ -6,8 +6,11 @@ import ( | ||
6 | "github.com/linmadan/egglib-go/utils/tool_funs" | 6 | "github.com/linmadan/egglib-go/utils/tool_funs" |
7 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory" | 7 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory" |
8 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productJob/command" | 8 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productJob/command" |
9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productJob/dto" | ||
9 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productJob/query" | 10 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productJob/query" |
10 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | 11 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" |
12 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" | ||
13 | + "time" | ||
11 | ) | 14 | ) |
12 | 15 | ||
13 | // 工位服务 | 16 | // 工位服务 |
@@ -15,8 +18,8 @@ type ProductJobService struct { | @@ -15,8 +18,8 @@ type ProductJobService struct { | ||
15 | } | 18 | } |
16 | 19 | ||
17 | // 创建工位服务 | 20 | // 创建工位服务 |
18 | -func (productJobService *ProductJobService) CreateProductJob(createProductJobCommand *command.CreateProductJobCommand) (interface{}, error) { | ||
19 | - if err := createProductJobCommand.ValidateCommand(); err != nil { | 21 | +func (productJobService *ProductJobService) CreateProductJob(operateInfo *domain.OperateInfo, cmd *command.CreateProductJobCommand) (interface{}, error) { |
22 | + if err := cmd.ValidateCommand(); err != nil { | ||
20 | return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | 23 | return nil, application.ThrowError(application.ARG_ERROR, err.Error()) |
21 | } | 24 | } |
22 | transactionContext, err := factory.CreateTransactionContext(nil) | 25 | transactionContext, err := factory.CreateTransactionContext(nil) |
@@ -29,24 +32,36 @@ func (productJobService *ProductJobService) CreateProductJob(createProductJobCom | @@ -29,24 +32,36 @@ func (productJobService *ProductJobService) CreateProductJob(createProductJobCom | ||
29 | defer func() { | 32 | defer func() { |
30 | transactionContext.RollbackTransaction() | 33 | transactionContext.RollbackTransaction() |
31 | }() | 34 | }() |
32 | - newProductJob := &domain.ProductJob{ | ||
33 | - CompanyId: createProductJobCommand.CompanyId, | ||
34 | - OrgId: createProductJobCommand.OrgId, | ||
35 | - JobName: createProductJobCommand.JobName, | ||
36 | - //WorkshopId: createProductJobCommand.WorkshopId, | ||
37 | - //LineId: createProductJobCommand.LineId, | ||
38 | - //SectionId: createProductJobCommand.SectionId, | ||
39 | - RelatedDevices: createProductJobCommand.RelatedDevices, | 35 | + |
36 | + //var workshopRepository domain.WorkshopRepository | ||
37 | + var workStation *domain.WorkStation | ||
38 | + _, workStation, err = factory.FastPgWorkstation(transactionContext, cmd.WorkshopId, cmd.LineId, cmd.SectionId, factory.WithSetPrincipal()) | ||
39 | + if err != nil { | ||
40 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
40 | } | 41 | } |
42 | + | ||
41 | var productJobRepository domain.ProductJobRepository | 43 | var productJobRepository domain.ProductJobRepository |
42 | - if value, err := factory.CreateProductJobRepository(map[string]interface{}{ | ||
43 | - "transactionContext": transactionContext, | ||
44 | - }); err != nil { | ||
45 | - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
46 | - } else { | ||
47 | - productJobRepository = value | 44 | + var productJob *domain.ProductJob |
45 | + productJobRepository, productJob, _ = factory.FastPgProductJob(transactionContext, 0) | ||
46 | + | ||
47 | + if job, err := productJobRepository.FindOne(map[string]interface{}{ | ||
48 | + "jobName": cmd.JobName, | ||
49 | + "workStationId": workStation.WorkStationId, | ||
50 | + }); err == nil && job != nil { | ||
51 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "有重复的工位") | ||
48 | } | 52 | } |
49 | - if productJob, err := productJobRepository.Save(newProductJob); err != nil { | 53 | + |
54 | + productJob = &domain.ProductJob{ | ||
55 | + CompanyId: operateInfo.CompanyId, | ||
56 | + OrgId: operateInfo.OrgId, | ||
57 | + JobName: cmd.JobName, | ||
58 | + ProcessName: cmd.ProcessName, | ||
59 | + CreatedAt: time.Now(), | ||
60 | + UpdatedAt: time.Now(), | ||
61 | + WorkStation: workStation, | ||
62 | + RelatedDevices: cmd.RelatedDevices, | ||
63 | + } | ||
64 | + if productJob, err := productJobRepository.Save(productJob); err != nil { | ||
50 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 65 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
51 | } else { | 66 | } else { |
52 | if err := transactionContext.CommitTransaction(); err != nil { | 67 | if err := transactionContext.CommitTransaction(); err != nil { |
@@ -71,26 +86,17 @@ func (productJobService *ProductJobService) GetProductJob(getProductJobQuery *qu | @@ -71,26 +86,17 @@ func (productJobService *ProductJobService) GetProductJob(getProductJobQuery *qu | ||
71 | defer func() { | 86 | defer func() { |
72 | transactionContext.RollbackTransaction() | 87 | transactionContext.RollbackTransaction() |
73 | }() | 88 | }() |
74 | - var productJobRepository domain.ProductJobRepository | ||
75 | - if value, err := factory.CreateProductJobRepository(map[string]interface{}{ | ||
76 | - "transactionContext": transactionContext, | ||
77 | - }); err != nil { | ||
78 | - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
79 | - } else { | ||
80 | - productJobRepository = value | ||
81 | - } | ||
82 | - productJob, err := productJobRepository.FindOne(map[string]interface{}{"productJobId": getProductJobQuery.ProductJobId}) | 89 | + //var productJobRepository domain.ProductJobRepository |
90 | + _, productJob, err := factory.FastPgProductJob(transactionContext, getProductJobQuery.ProductJobId) | ||
83 | if err != nil { | 91 | if err != nil { |
84 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 92 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
85 | } | 93 | } |
86 | - if productJob == nil { | ||
87 | - return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(getProductJobQuery.ProductJobId))) | ||
88 | - } else { | ||
89 | - if err := transactionContext.CommitTransaction(); err != nil { | ||
90 | - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
91 | - } | ||
92 | - return productJob, nil | 94 | + if err := transactionContext.CommitTransaction(); err != nil { |
95 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
93 | } | 96 | } |
97 | + newJobDto := &dto.ProductJobDto{} | ||
98 | + newJobDto.LoadDto(productJob) | ||
99 | + return newJobDto, nil | ||
94 | } | 100 | } |
95 | 101 | ||
96 | // 返回工位服务列表 | 102 | // 返回工位服务列表 |
@@ -170,8 +176,8 @@ func (productJobService *ProductJobService) RemoveProductJob(removeProductJobCom | @@ -170,8 +176,8 @@ func (productJobService *ProductJobService) RemoveProductJob(removeProductJobCom | ||
170 | } | 176 | } |
171 | 177 | ||
172 | // 更新工位服务 | 178 | // 更新工位服务 |
173 | -func (productJobService *ProductJobService) UpdateProductJob(updateProductJobCommand *command.UpdateProductJobCommand) (interface{}, error) { | ||
174 | - if err := updateProductJobCommand.ValidateCommand(); err != nil { | 179 | +func (productJobService *ProductJobService) UpdateProductJob(cmd *command.UpdateProductJobCommand) (interface{}, error) { |
180 | + if err := cmd.ValidateCommand(); err != nil { | ||
175 | return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | 181 | return nil, application.ThrowError(application.ARG_ERROR, err.Error()) |
176 | } | 182 | } |
177 | transactionContext, err := factory.CreateTransactionContext(nil) | 183 | transactionContext, err := factory.CreateTransactionContext(nil) |
@@ -184,24 +190,41 @@ func (productJobService *ProductJobService) UpdateProductJob(updateProductJobCom | @@ -184,24 +190,41 @@ func (productJobService *ProductJobService) UpdateProductJob(updateProductJobCom | ||
184 | defer func() { | 190 | defer func() { |
185 | transactionContext.RollbackTransaction() | 191 | transactionContext.RollbackTransaction() |
186 | }() | 192 | }() |
187 | - var productJobRepository domain.ProductJobRepository | ||
188 | - if value, err := factory.CreateProductJobRepository(map[string]interface{}{ | ||
189 | - "transactionContext": transactionContext, | ||
190 | - }); err != nil { | ||
191 | - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
192 | - } else { | ||
193 | - productJobRepository = value | ||
194 | - } | ||
195 | - productJob, err := productJobRepository.FindOne(map[string]interface{}{"productJobId": updateProductJobCommand.ProductJobId}) | 193 | + |
194 | + //var workshopRepository domain.WorkshopRepository | ||
195 | + var workStation *domain.WorkStation | ||
196 | + _, workStation, err = factory.FastPgWorkstation(transactionContext, cmd.WorkshopId, cmd.LineId, cmd.SectionId, factory.WithSetPrincipal()) | ||
196 | if err != nil { | 197 | if err != nil { |
197 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 198 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
198 | } | 199 | } |
199 | - if productJob == nil { | ||
200 | - return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(updateProductJobCommand.ProductJobId))) | ||
201 | - } | ||
202 | - if err := productJob.Update(tool_funs.SimpleStructToMap(updateProductJobCommand)); err != nil { | ||
203 | - return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error()) | 200 | + |
201 | + var productJobRepository domain.ProductJobRepository | ||
202 | + var productJob *domain.ProductJob | ||
203 | + var checkDuplicateJobName = false | ||
204 | + productJobRepository, productJob, _ = factory.FastPgProductJob(transactionContext, cmd.ProductJobId) | ||
205 | + | ||
206 | + if cmd.JobName != productJob.JobName { | ||
207 | + checkDuplicateJobName = true | ||
208 | + } | ||
209 | + if workStation.WorkStationId != productJob.WorkStation.WorkStationId { | ||
210 | + checkDuplicateJobName = true | ||
211 | + } | ||
212 | + if checkDuplicateJobName { | ||
213 | + if job, err := productJobRepository.FindOne(map[string]interface{}{ | ||
214 | + "jobName": cmd.JobName, | ||
215 | + "companyId": productJob.CompanyId, | ||
216 | + "orgId": productJob.OrgId, | ||
217 | + "workStationId": workStation.WorkStationId, | ||
218 | + }); err == nil && job != nil { | ||
219 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "有重复的工位") | ||
220 | + } | ||
204 | } | 221 | } |
222 | + | ||
223 | + productJob.WorkStation = workStation | ||
224 | + productJob.JobName = cmd.JobName | ||
225 | + productJob.RelatedDevices = cmd.RelatedDevices | ||
226 | + productJob.UpdatedAt = time.Now() | ||
227 | + | ||
205 | if productJob, err := productJobRepository.Save(productJob); err != nil { | 228 | if productJob, err := productJobRepository.Save(productJob); err != nil { |
206 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 229 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
207 | } else { | 230 | } else { |
@@ -212,6 +235,46 @@ func (productJobService *ProductJobService) UpdateProductJob(updateProductJobCom | @@ -212,6 +235,46 @@ func (productJobService *ProductJobService) UpdateProductJob(updateProductJobCom | ||
212 | } | 235 | } |
213 | } | 236 | } |
214 | 237 | ||
238 | +// 搜索工位服务列表 | ||
239 | +func (productJobService *ProductJobService) SearchProductJob(operateInfo *domain.OperateInfo, listProductJobQuery *query.SearchProductJobQuery) (int64, interface{}, error) { | ||
240 | + listProductJobQuery.OrgId = operateInfo.OrgId | ||
241 | + listProductJobQuery.CompanyId = operateInfo.CompanyId | ||
242 | + if err := listProductJobQuery.ValidateQuery(); err != nil { | ||
243 | + return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
244 | + } | ||
245 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
246 | + if err != nil { | ||
247 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
248 | + } | ||
249 | + if err := transactionContext.StartTransaction(); err != nil { | ||
250 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
251 | + } | ||
252 | + defer func() { | ||
253 | + transactionContext.RollbackTransaction() | ||
254 | + }() | ||
255 | + var productJobRepository domain.ProductJobRepository | ||
256 | + if value, err := factory.CreateProductJobRepository(map[string]interface{}{ | ||
257 | + "transactionContext": transactionContext, | ||
258 | + }); err != nil { | ||
259 | + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
260 | + } else { | ||
261 | + productJobRepository = value | ||
262 | + } | ||
263 | + | ||
264 | + count, productJobs, err := productJobRepository.Find(utils.ObjectToMap(listProductJobQuery)) | ||
265 | + if err != nil { | ||
266 | + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
267 | + } | ||
268 | + var result = make([]*dto.ProductJobDto, 0) | ||
269 | + for i := range productJobs { | ||
270 | + item := productJobs[i] | ||
271 | + newJobDto := &dto.ProductJobDto{} | ||
272 | + newJobDto.LoadDto(item) | ||
273 | + result = append(result, newJobDto) | ||
274 | + } | ||
275 | + return count, result, nil | ||
276 | +} | ||
277 | + | ||
215 | func NewProductJobService(options map[string]interface{}) *ProductJobService { | 278 | func NewProductJobService(options map[string]interface{}) *ProductJobService { |
216 | newProductJobService := &ProductJobService{} | 279 | newProductJobService := &ProductJobService{} |
217 | return newProductJobService | 280 | return newProductJobService |
@@ -133,8 +133,8 @@ func (productSectionService *ProductSectionService) ListProductSection(listProdu | @@ -133,8 +133,8 @@ func (productSectionService *ProductSectionService) ListProductSection(listProdu | ||
133 | } | 133 | } |
134 | 134 | ||
135 | // 移除工段服务 | 135 | // 移除工段服务 |
136 | -func (productSectionService *ProductSectionService) RemoveProductSection(removeProductSectionCommand *command.RemoveProductSectionCommand) (interface{}, error) { | ||
137 | - if err := removeProductSectionCommand.ValidateCommand(); err != nil { | 136 | +func (productSectionService *ProductSectionService) RemoveProductSection(cmd *command.RemoveProductSectionCommand) (interface{}, error) { |
137 | + if err := cmd.ValidateCommand(); err != nil { | ||
138 | return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | 138 | return nil, application.ThrowError(application.ARG_ERROR, err.Error()) |
139 | } | 139 | } |
140 | transactionContext, err := factory.CreateTransactionContext(nil) | 140 | transactionContext, err := factory.CreateTransactionContext(nil) |
@@ -149,13 +149,25 @@ func (productSectionService *ProductSectionService) RemoveProductSection(removeP | @@ -149,13 +149,25 @@ func (productSectionService *ProductSectionService) RemoveProductSection(removeP | ||
149 | }() | 149 | }() |
150 | var workshopRepository domain.WorkshopRepository | 150 | var workshopRepository domain.WorkshopRepository |
151 | var workshop *domain.Workshop | 151 | var workshop *domain.Workshop |
152 | - workshopRepository, workshop, err = factory.FastPgWorkshop(transactionContext, removeProductSectionCommand.WorkshopId) | 152 | + workshopRepository, workshop, err = factory.FastPgWorkshop(transactionContext, cmd.WorkshopId) |
153 | if err != nil { | 153 | if err != nil { |
154 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 154 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
155 | } | 155 | } |
156 | - if err = workshop.RemoveSection(removeProductSectionCommand.LineId, removeProductSectionCommand.SectionId); err != nil { | 156 | + |
157 | + workStation, err := workshop.FindWorkStation(workshop.WorkshopId, cmd.LineId, cmd.SectionId) | ||
158 | + if err != nil { | ||
157 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 159 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
158 | } | 160 | } |
161 | + var productJobRepository domain.ProductJobRepository | ||
162 | + productJobRepository, _, _ = factory.FastPgProductJob(transactionContext, 0) | ||
163 | + if count, _, err := productJobRepository.Find(map[string]interface{}{"workStationId": workStation.WorkStationId, "limit": 1}); err == nil && count > 0 { | ||
164 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "该工段下存在工位") | ||
165 | + } | ||
166 | + | ||
167 | + if err = workshop.RemoveSection(cmd.LineId, cmd.SectionId); err != nil { | ||
168 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
169 | + } | ||
170 | + | ||
159 | if workshop, err = workshopRepository.Save(workshop); err != nil { | 171 | if workshop, err = workshopRepository.Save(workshop); err != nil { |
160 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 172 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
161 | } | 173 | } |
@@ -70,3 +70,11 @@ func (info OperateInfo) GetUserId(userId int) int { | @@ -70,3 +70,11 @@ func (info OperateInfo) GetUserId(userId int) int { | ||
70 | func (info OperateInfo) String() string { | 70 | func (info OperateInfo) String() string { |
71 | return fmt.Sprintf("UserId: %v OrgId:%v CompanyId:%v", info.UserId, info.OrgId, info.CompanyId) | 71 | return fmt.Sprintf("UserId: %v OrgId:%v CompanyId:%v", info.UserId, info.OrgId, info.CompanyId) |
72 | } | 72 | } |
73 | + | ||
74 | +func Pagination(pageNumber, pageSize int) (offset int, limit int) { | ||
75 | + if pageSize != 0 { | ||
76 | + offset = (pageNumber - 1) * pageSize | ||
77 | + limit = pageSize | ||
78 | + } | ||
79 | + return | ||
80 | +} |
@@ -12,6 +12,8 @@ type ProductJob struct { | @@ -12,6 +12,8 @@ type ProductJob struct { | ||
12 | OrgId int `json:"orgId,omitempty"` | 12 | OrgId int `json:"orgId,omitempty"` |
13 | // 工位名称 | 13 | // 工位名称 |
14 | JobName string `json:"jobName,omitempty"` | 14 | JobName string `json:"jobName,omitempty"` |
15 | + // 工序名称 | ||
16 | + ProcessName string `json:"processName,omitempty"` | ||
15 | // 创建时间 | 17 | // 创建时间 |
16 | CreatedAt time.Time `json:"createdAt,omitempty"` | 18 | CreatedAt time.Time `json:"createdAt,omitempty"` |
17 | // 更新时间 | 19 | // 更新时间 |
@@ -39,50 +41,12 @@ func (productJob *ProductJob) Identify() interface{} { | @@ -39,50 +41,12 @@ func (productJob *ProductJob) Identify() interface{} { | ||
39 | } | 41 | } |
40 | 42 | ||
41 | func (productJob *ProductJob) Update(data map[string]interface{}) error { | 43 | func (productJob *ProductJob) Update(data map[string]interface{}) error { |
42 | - if productJobId, ok := data["productJobId"]; ok { | ||
43 | - productJob.ProductJobId = productJobId.(int) | ||
44 | - } | ||
45 | - if companyId, ok := data["companyId"]; ok { | ||
46 | - productJob.CompanyId = companyId.(int) | ||
47 | - } | ||
48 | - if orgId, ok := data["orgId"]; ok { | ||
49 | - productJob.OrgId = orgId.(int) | ||
50 | - } | ||
51 | if jobName, ok := data["jobName"]; ok { | 44 | if jobName, ok := data["jobName"]; ok { |
52 | productJob.JobName = jobName.(string) | 45 | productJob.JobName = jobName.(string) |
53 | } | 46 | } |
54 | - if createdAt, ok := data["createdAt"]; ok { | ||
55 | - productJob.CreatedAt = createdAt.(time.Time) | ||
56 | - } | ||
57 | - if updatedAt, ok := data["updatedAt"]; ok { | ||
58 | - productJob.UpdatedAt = updatedAt.(time.Time) | ||
59 | - } | ||
60 | - if deletedAt, ok := data["deletedAt"]; ok { | ||
61 | - productJob.DeletedAt = deletedAt.(time.Time) | ||
62 | - } | ||
63 | - if workStationId, ok := data["workStationId"]; ok { | ||
64 | - productJob.WorkStation.WorkStationId = workStationId.(string) | ||
65 | - } | ||
66 | - if workshopId, ok := data["workshopId"]; ok { | ||
67 | - productJob.WorkStation.WorkshopId = workshopId.(int) | ||
68 | - } | ||
69 | - if workshopName, ok := data["workshopName"]; ok { | ||
70 | - productJob.WorkStation.WorkshopName = workshopName.(string) | ||
71 | - } | ||
72 | - if lineId, ok := data["lineId"]; ok { | ||
73 | - productJob.WorkStation.LineId = lineId.(int) | ||
74 | - } | ||
75 | - if lineName, ok := data["lineName"]; ok { | ||
76 | - productJob.WorkStation.LineName = lineName.(string) | ||
77 | - } | ||
78 | - if sectionId, ok := data["sectionId"]; ok { | ||
79 | - productJob.WorkStation.SectionId = sectionId.(int) | ||
80 | - } | ||
81 | - if sectionName, ok := data["sectionName"]; ok { | ||
82 | - productJob.WorkStation.SectionName = sectionName.(string) | 47 | + if relatedDevices, ok := data["relatedDevices"]; ok { |
48 | + productJob.RelatedDevices = relatedDevices.([]int) | ||
83 | } | 49 | } |
84 | - //if relatedDevices, ok := data["relatedDevices"]; ok { | ||
85 | - // productJob.RelatedDevices = relatedDevices.(array) | ||
86 | - //} | 50 | + productJob.UpdatedAt = time.Now() |
87 | return nil | 51 | return nil |
88 | } | 52 | } |
1 | package domain | 1 | package domain |
2 | 2 | ||
3 | +import "fmt" | ||
4 | + | ||
3 | // 工作位置(车间、生产线、工段组成),唯一标识工作位置 | 5 | // 工作位置(车间、生产线、工段组成),唯一标识工作位置 |
4 | type WorkStation struct { | 6 | type WorkStation struct { |
5 | // 工作位置键值 (车间ID+'.'+生产线ID+'.'+工段ID) | 7 | // 工作位置键值 (车间ID+'.'+生产线ID+'.'+工段ID) |
@@ -16,4 +18,18 @@ type WorkStation struct { | @@ -16,4 +18,18 @@ type WorkStation struct { | ||
16 | SectionId int `json:"sectionId,omitempty"` | 18 | SectionId int `json:"sectionId,omitempty"` |
17 | // 工段名称 | 19 | // 工段名称 |
18 | SectionName string `json:"sectionName,omitempty"` | 20 | SectionName string `json:"sectionName,omitempty"` |
21 | + // 负责人 (用户对象) | ||
22 | + Principal *User `json:"principal,omitempty"` | ||
23 | +} | ||
24 | + | ||
25 | +func NewWorkStation(w *Workshop, l *ProductLine, s *ProductSection) *WorkStation { | ||
26 | + return &WorkStation{ | ||
27 | + WorkStationId: fmt.Sprintf("%v.%v.%v", w.WorkshopId, l.LineId, s.SectionId), | ||
28 | + WorkshopId: w.WorkshopId, | ||
29 | + WorkshopName: w.WorkshopName, | ||
30 | + LineId: l.LineId, | ||
31 | + LineName: l.LineName, | ||
32 | + SectionId: s.SectionId, | ||
33 | + SectionName: s.SectionName, | ||
34 | + } | ||
19 | } | 35 | } |
@@ -187,3 +187,19 @@ func (workshop *Workshop) FindSection(lineId, sectionId int) (*ProductSection, e | @@ -187,3 +187,19 @@ func (workshop *Workshop) FindSection(lineId, sectionId int) (*ProductSection, e | ||
187 | } | 187 | } |
188 | return nil, fmt.Errorf("工段不存在") | 188 | return nil, fmt.Errorf("工段不存在") |
189 | } | 189 | } |
190 | + | ||
191 | +// 查询生产线 | ||
192 | +func (workshop *Workshop) FindWorkStation(workshopId, lineId, sectionId int) (*WorkStation, error) { | ||
193 | + if workshop.WorkshopId != workshopId { | ||
194 | + return nil, fmt.Errorf("不存在") | ||
195 | + } | ||
196 | + line, err := workshop.FindLine(lineId) | ||
197 | + if err != nil { | ||
198 | + return nil, err | ||
199 | + } | ||
200 | + section, err := workshop.FindSection(lineId, sectionId) | ||
201 | + if err != nil { | ||
202 | + return nil, err | ||
203 | + } | ||
204 | + return NewWorkStation(workshop, line, section), nil | ||
205 | +} |
@@ -20,9 +20,11 @@ type ProductJob struct { | @@ -20,9 +20,11 @@ type ProductJob struct { | ||
20 | // 更新时间 | 20 | // 更新时间 |
21 | UpdatedAt time.Time `comment:"更新时间"` | 21 | UpdatedAt time.Time `comment:"更新时间"` |
22 | // 删除时间 | 22 | // 删除时间 |
23 | - DeletedAt time.Time `comment:"删除时间"` | 23 | + DeletedAt time.Time `pg:",soft_delete" comment:"删除时间"` |
24 | // 工作位置 | 24 | // 工作位置 |
25 | WorkStation *domain.WorkStation `comment:"工作位置"` | 25 | WorkStation *domain.WorkStation `comment:"工作位置"` |
26 | // 关联设备列表 | 26 | // 关联设备列表 |
27 | - RelatedDevices []int `pg:",soft_delete" comment:"关联设备列表" pg:",array"` | 27 | + RelatedDevices []int ` comment:"关联设备列表"` |
28 | + // 工序名称 | ||
29 | + ProcessName string ` comment:"工序名称"` | ||
28 | } | 30 | } |
@@ -16,5 +16,6 @@ func TransformToProductJobDomainModelFromPgModels(productJobModel *models.Produc | @@ -16,5 +16,6 @@ func TransformToProductJobDomainModelFromPgModels(productJobModel *models.Produc | ||
16 | DeletedAt: productJobModel.DeletedAt, | 16 | DeletedAt: productJobModel.DeletedAt, |
17 | WorkStation: productJobModel.WorkStation, | 17 | WorkStation: productJobModel.WorkStation, |
18 | RelatedDevices: productJobModel.RelatedDevices, | 18 | RelatedDevices: productJobModel.RelatedDevices, |
19 | + ProcessName: productJobModel.ProcessName, | ||
19 | }, nil | 20 | }, nil |
20 | } | 21 | } |
@@ -35,20 +35,15 @@ func (repository *ProductJobRepository) Save(productJob *domain.ProductJob) (*do | @@ -35,20 +35,15 @@ func (repository *ProductJobRepository) Save(productJob *domain.ProductJob) (*do | ||
35 | "deleted_at", | 35 | "deleted_at", |
36 | "work_station", | 36 | "work_station", |
37 | "related_devices", | 37 | "related_devices", |
38 | + "process_name", | ||
38 | } | 39 | } |
39 | - insertFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields) | ||
40 | - insertPlaceHoldersSnippet := sqlbuilder.SqlPlaceHoldersSnippet(sqlBuildFields) | 40 | + insertFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlbuilder.RemoveSqlFields(sqlBuildFields, "product_job_id", "deleted_at")) |
41 | + insertPlaceHoldersSnippet := sqlbuilder.SqlPlaceHoldersSnippet(sqlbuilder.RemoveSqlFields(sqlBuildFields, "product_job_id", "deleted_at")) | ||
41 | returningFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields) | 42 | returningFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields) |
42 | - updateFields := sqlbuilder.RemoveSqlFields(sqlBuildFields, "productJob_id") | 43 | + updateFields := sqlbuilder.RemoveSqlFields(sqlBuildFields, "product_job_id", "deleted_at") |
43 | updateFieldsSnippet := sqlbuilder.SqlUpdateFieldsSnippet(updateFields) | 44 | updateFieldsSnippet := sqlbuilder.SqlUpdateFieldsSnippet(updateFields) |
44 | tx := repository.transactionContext.PgTx | 45 | tx := repository.transactionContext.PgTx |
45 | if productJob.Identify() == nil { | 46 | if productJob.Identify() == nil { |
46 | - productJobId, err := repository.nextIdentify() | ||
47 | - if err != nil { | ||
48 | - return productJob, err | ||
49 | - } else { | ||
50 | - productJob.ProductJobId = int(productJobId) | ||
51 | - } | ||
52 | if _, err := tx.QueryOne( | 47 | if _, err := tx.QueryOne( |
53 | pg.Scan( | 48 | pg.Scan( |
54 | &productJob.ProductJobId, | 49 | &productJob.ProductJobId, |
@@ -59,18 +54,18 @@ func (repository *ProductJobRepository) Save(productJob *domain.ProductJob) (*do | @@ -59,18 +54,18 @@ func (repository *ProductJobRepository) Save(productJob *domain.ProductJob) (*do | ||
59 | &productJob.UpdatedAt, | 54 | &productJob.UpdatedAt, |
60 | &productJob.DeletedAt, | 55 | &productJob.DeletedAt, |
61 | &productJob.WorkStation, | 56 | &productJob.WorkStation, |
62 | - pg.Array(&productJob.RelatedDevices), | 57 | + &productJob.RelatedDevices, |
58 | + &productJob.ProcessName, | ||
63 | ), | 59 | ), |
64 | - fmt.Sprintf("INSERT INTO product_jobs (%s) VALUES (%s) RETURNING %s", insertFieldsSnippet, insertPlaceHoldersSnippet, returningFieldsSnippet), | ||
65 | - productJob.ProductJobId, | 60 | + fmt.Sprintf("INSERT INTO manufacture.product_job (%s) VALUES (%s) RETURNING %s", insertFieldsSnippet, insertPlaceHoldersSnippet, returningFieldsSnippet), |
66 | productJob.CompanyId, | 61 | productJob.CompanyId, |
67 | productJob.OrgId, | 62 | productJob.OrgId, |
68 | productJob.JobName, | 63 | productJob.JobName, |
69 | productJob.CreatedAt, | 64 | productJob.CreatedAt, |
70 | productJob.UpdatedAt, | 65 | productJob.UpdatedAt, |
71 | - productJob.DeletedAt, | ||
72 | productJob.WorkStation, | 66 | productJob.WorkStation, |
73 | - pg.Array(productJob.RelatedDevices), | 67 | + productJob.RelatedDevices, |
68 | + productJob.ProcessName, | ||
74 | ); err != nil { | 69 | ); err != nil { |
75 | return productJob, err | 70 | return productJob, err |
76 | } | 71 | } |
@@ -85,18 +80,18 @@ func (repository *ProductJobRepository) Save(productJob *domain.ProductJob) (*do | @@ -85,18 +80,18 @@ func (repository *ProductJobRepository) Save(productJob *domain.ProductJob) (*do | ||
85 | &productJob.UpdatedAt, | 80 | &productJob.UpdatedAt, |
86 | &productJob.DeletedAt, | 81 | &productJob.DeletedAt, |
87 | &productJob.WorkStation, | 82 | &productJob.WorkStation, |
88 | - pg.Array(&productJob.RelatedDevices), | 83 | + &productJob.RelatedDevices, |
84 | + &productJob.ProcessName, | ||
89 | ), | 85 | ), |
90 | - fmt.Sprintf("UPDATE product_jobs SET %s WHERE product_job_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet), | ||
91 | - productJob.ProductJobId, | 86 | + fmt.Sprintf("UPDATE manufacture.product_job SET %s WHERE product_job_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet), |
92 | productJob.CompanyId, | 87 | productJob.CompanyId, |
93 | productJob.OrgId, | 88 | productJob.OrgId, |
94 | productJob.JobName, | 89 | productJob.JobName, |
95 | productJob.CreatedAt, | 90 | productJob.CreatedAt, |
96 | productJob.UpdatedAt, | 91 | productJob.UpdatedAt, |
97 | - productJob.DeletedAt, | ||
98 | productJob.WorkStation, | 92 | productJob.WorkStation, |
99 | - pg.Array(productJob.RelatedDevices), | 93 | + productJob.RelatedDevices, |
94 | + productJob.ProcessName, | ||
100 | productJob.Identify(), | 95 | productJob.Identify(), |
101 | ); err != nil { | 96 | ); err != nil { |
102 | return productJob, err | 97 | return productJob, err |
@@ -118,6 +113,10 @@ func (repository *ProductJobRepository) FindOne(queryOptions map[string]interfac | @@ -118,6 +113,10 @@ func (repository *ProductJobRepository) FindOne(queryOptions map[string]interfac | ||
118 | productJobModel := new(models.ProductJob) | 113 | productJobModel := new(models.ProductJob) |
119 | query := sqlbuilder.BuildQuery(tx.Model(productJobModel), queryOptions) | 114 | query := sqlbuilder.BuildQuery(tx.Model(productJobModel), queryOptions) |
120 | query.SetWhereByQueryOption("product_job.product_job_id = ?", "productJobId") | 115 | query.SetWhereByQueryOption("product_job.product_job_id = ?", "productJobId") |
116 | + query.SetWhereByQueryOption("company_id = ?", "companyId") | ||
117 | + query.SetWhereByQueryOption("org_id = ?", "orgId") | ||
118 | + query.SetWhereByQueryOption("job_name=?", "jobName") | ||
119 | + query.SetWhereByQueryOption("work_station->>'workStationId'=?", "workStationId") | ||
121 | if err := query.First(); err != nil { | 120 | if err := query.First(); err != nil { |
122 | if err.Error() == "pg: no rows in result set" { | 121 | if err.Error() == "pg: no rows in result set" { |
123 | return nil, fmt.Errorf("没有此资源") | 122 | return nil, fmt.Errorf("没有此资源") |
@@ -136,7 +135,23 @@ func (repository *ProductJobRepository) Find(queryOptions map[string]interface{} | @@ -136,7 +135,23 @@ func (repository *ProductJobRepository) Find(queryOptions map[string]interface{} | ||
136 | var productJobModels []*models.ProductJob | 135 | var productJobModels []*models.ProductJob |
137 | productJobs := make([]*domain.ProductJob, 0) | 136 | productJobs := make([]*domain.ProductJob, 0) |
138 | query := sqlbuilder.BuildQuery(tx.Model(&productJobModels), queryOptions) | 137 | query := sqlbuilder.BuildQuery(tx.Model(&productJobModels), queryOptions) |
139 | - query.SetOffsetAndLimit(20) | 138 | + |
139 | + query.SetWhereByQueryOption("company_id = ?", "companyId") | ||
140 | + query.SetWhereByQueryOption("org_id = ?", "orgId") | ||
141 | + query.SetWhereByQueryOption("work_station->>'workStationId'=?", "workStationId") | ||
142 | + if v, ok := queryOptions["jobName"]; ok && len(v.(string)) > 0 { | ||
143 | + query.Where(fmt.Sprintf(`job_name like '%%%v%%'`, v)) | ||
144 | + } | ||
145 | + if v, ok := queryOptions["workshopName"]; ok && len(v.(string)) > 0 { | ||
146 | + query.Where(fmt.Sprintf(`work_station->>'workshopName' like '%%%v%%'`, v)) | ||
147 | + } | ||
148 | + if v, ok := queryOptions["lineName"]; ok && len(v.(string)) > 0 { | ||
149 | + query.Where(fmt.Sprintf(`work_station->>'lineName' like '%%%v%%'`, v)) | ||
150 | + } | ||
151 | + if v, ok := queryOptions["sectionName"]; ok && len(v.(string)) > 0 { | ||
152 | + query.Where(fmt.Sprintf(`work_station->>'sectionName' like '%%%v%%'`, v)) | ||
153 | + } | ||
154 | + query.SetOffsetAndLimit(domain.MaxQueryRow) | ||
140 | query.SetOrderDirect("product_job_id", "DESC") | 155 | query.SetOrderDirect("product_job_id", "DESC") |
141 | if count, err := query.SelectAndCount(); err != nil { | 156 | if count, err := query.SelectAndCount(); err != nil { |
142 | return 0, productJobs, err | 157 | return 0, productJobs, err |
pkg/infrastructure/utils/utils.go
0 → 100644
1 | +package utils | ||
2 | + | ||
3 | +import ( | ||
4 | + "bytes" | ||
5 | + "encoding/json" | ||
6 | + "fmt" | ||
7 | + jsonlib "github.com/linmadan/egglib-go/utils/json" | ||
8 | + "io" | ||
9 | + "reflect" | ||
10 | + "strconv" | ||
11 | + "strings" | ||
12 | + "time" | ||
13 | +) | ||
14 | + | ||
15 | +func CamelCase(name string, firstUpper bool) string { | ||
16 | + array := []byte(name) | ||
17 | + if len(array) == 0 { | ||
18 | + return "" | ||
19 | + } | ||
20 | + rspArray := make([]byte, len(array)) | ||
21 | + if firstUpper { | ||
22 | + copy(rspArray[:1], strings.ToUpper(string(array[:1]))) | ||
23 | + } else { | ||
24 | + copy(rspArray[:1], strings.ToLower(string(array[:1]))) | ||
25 | + } | ||
26 | + copy(rspArray[1:], array[1:]) | ||
27 | + return string(rspArray) | ||
28 | +} | ||
29 | + | ||
30 | +func ObjectToMap(o interface{}) map[string]interface{} { | ||
31 | + if o == nil { | ||
32 | + return nil | ||
33 | + } | ||
34 | + value := reflect.ValueOf(o) | ||
35 | + if value.Kind() != reflect.Ptr { | ||
36 | + return nil | ||
37 | + } | ||
38 | + elem := value.Elem() | ||
39 | + relType := elem.Type() | ||
40 | + m := make(map[string]interface{}) | ||
41 | + for i := 0; i < relType.NumField(); i++ { | ||
42 | + field := relType.Field(i) | ||
43 | + if elem.Field(i).IsZero() { | ||
44 | + continue | ||
45 | + } | ||
46 | + m[CamelCase(field.Name, false)] = elem.Field(i).Interface() | ||
47 | + } | ||
48 | + return m | ||
49 | +} | ||
50 | + | ||
51 | +// AssertString convert v to string value | ||
52 | +func AssertString(v interface{}) string { | ||
53 | + if v == nil { | ||
54 | + return "" | ||
55 | + } | ||
56 | + | ||
57 | + // if func (v *Type) String() string, we can't use Elem() | ||
58 | + switch vt := v.(type) { | ||
59 | + case fmt.Stringer: | ||
60 | + return vt.String() | ||
61 | + } | ||
62 | + | ||
63 | + val := reflect.ValueOf(v) | ||
64 | + if val.Kind() == reflect.Ptr && !val.IsNil() { | ||
65 | + val = val.Elem() | ||
66 | + } | ||
67 | + | ||
68 | + switch vt := val.Interface().(type) { | ||
69 | + case bool: | ||
70 | + return strconv.FormatBool(vt) | ||
71 | + case error: | ||
72 | + return vt.Error() | ||
73 | + case float32: | ||
74 | + return strconv.FormatFloat(float64(vt), 'f', -1, 32) | ||
75 | + case float64: | ||
76 | + return strconv.FormatFloat(vt, 'f', -1, 64) | ||
77 | + case fmt.Stringer: | ||
78 | + return vt.String() | ||
79 | + case int: | ||
80 | + return strconv.Itoa(vt) | ||
81 | + case int8: | ||
82 | + return strconv.Itoa(int(vt)) | ||
83 | + case int16: | ||
84 | + return strconv.Itoa(int(vt)) | ||
85 | + case int32: | ||
86 | + return strconv.Itoa(int(vt)) | ||
87 | + case int64: | ||
88 | + return strconv.FormatInt(vt, 10) | ||
89 | + case string: | ||
90 | + return vt | ||
91 | + case uint: | ||
92 | + return strconv.FormatUint(uint64(vt), 10) | ||
93 | + case uint8: | ||
94 | + return strconv.FormatUint(uint64(vt), 10) | ||
95 | + case uint16: | ||
96 | + return strconv.FormatUint(uint64(vt), 10) | ||
97 | + case uint32: | ||
98 | + return strconv.FormatUint(uint64(vt), 10) | ||
99 | + case uint64: | ||
100 | + return strconv.FormatUint(vt, 10) | ||
101 | + case []byte: | ||
102 | + return string(vt) | ||
103 | + default: | ||
104 | + return fmt.Sprint(val.Interface()) | ||
105 | + } | ||
106 | +} | ||
107 | + | ||
108 | +// ValidatePtr validate v is a ptr value | ||
109 | +func ValidatePtr(v *reflect.Value) error { | ||
110 | + // sequence is very important, IsNil must be called after checking Kind() with reflect.Ptr, | ||
111 | + // panic otherwise | ||
112 | + if !v.IsValid() || v.Kind() != reflect.Ptr || v.IsNil() { | ||
113 | + return fmt.Errorf("not a valid pointer: %v", v) | ||
114 | + } | ||
115 | + | ||
116 | + return nil | ||
117 | +} | ||
118 | + | ||
119 | +func LoadCustomFieldToMap(src interface{}, fields ...string) map[string]interface{} { | ||
120 | + rsp := LoadCustomField(src, fields...) | ||
121 | + if rsp == nil { | ||
122 | + return map[string]interface{}{} | ||
123 | + } | ||
124 | + return rsp.(map[string]interface{}) | ||
125 | +} | ||
126 | + | ||
127 | +func LoadCustomField(src interface{}, fields ...string) interface{} { | ||
128 | + typeSrc := reflect.TypeOf(src) | ||
129 | + valueSrc := reflect.ValueOf(src) | ||
130 | + | ||
131 | + if v, ok := src.(reflect.Value); ok { | ||
132 | + valueSrc = v | ||
133 | + typeSrc = v.Type() | ||
134 | + } | ||
135 | + if typeSrc.Kind() == reflect.Ptr { | ||
136 | + valueSrc = valueSrc.Elem() | ||
137 | + } | ||
138 | + k := valueSrc.Kind() | ||
139 | + switch k { | ||
140 | + case reflect.Array, reflect.Slice: | ||
141 | + len := valueSrc.Len() | ||
142 | + retSliceMap := make([]map[string]interface{}, 0) | ||
143 | + if len == 0 { | ||
144 | + return retSliceMap | ||
145 | + } | ||
146 | + for i := 0; i < len; i++ { | ||
147 | + v := valueSrc.Index(i) | ||
148 | + retSliceMap = append(retSliceMap, (LoadCustomField(v, fields...)).(map[string]interface{})) | ||
149 | + } | ||
150 | + return retSliceMap | ||
151 | + case reflect.Struct: | ||
152 | + retSliceMap := make(map[string]interface{}) | ||
153 | + for _, filed := range fields { | ||
154 | + f := valueSrc.FieldByName(filed) | ||
155 | + if !f.IsValid() { | ||
156 | + continue | ||
157 | + } | ||
158 | + v := f.Interface() | ||
159 | + if t, ok := v.(time.Time); ok { | ||
160 | + v = t.Local().Format("2006-01-02 15:04:05") | ||
161 | + } | ||
162 | + retSliceMap[CamelCase(filed, false)] = v | ||
163 | + } | ||
164 | + return retSliceMap | ||
165 | + default: | ||
166 | + return src | ||
167 | + } | ||
168 | + return src | ||
169 | +} | ||
170 | + | ||
171 | +func AppendCustomField(src interface{}, options map[string]interface{}) interface{} { | ||
172 | + var mapSrc map[string]interface{} | ||
173 | + var ok bool | ||
174 | + mapSrc, ok = src.(map[string]interface{}) | ||
175 | + if !ok { | ||
176 | + jsonlib.Unmarshal([]byte(jsonlib.MarshalToString(src)), &mapSrc) | ||
177 | + } | ||
178 | + for field, value := range options { | ||
179 | + mapSrc[CamelCase(field, false)] = value | ||
180 | + } | ||
181 | + return mapSrc | ||
182 | +} | ||
183 | + | ||
184 | +/* | ||
185 | + | ||
186 | +json 格式化 | ||
187 | + | ||
188 | +*/ | ||
189 | + | ||
190 | +func Marshal(v interface{}) ([]byte, error) { | ||
191 | + return json.Marshal(v) | ||
192 | +} | ||
193 | + | ||
194 | +func Unmarshal(data []byte, v interface{}) error { | ||
195 | + decoder := json.NewDecoder(bytes.NewReader(data)) | ||
196 | + if err := unmarshalUseNumber(decoder, v); err != nil { | ||
197 | + return formatError(string(data), err) | ||
198 | + } | ||
199 | + | ||
200 | + return nil | ||
201 | +} | ||
202 | + | ||
203 | +func UnmarshalFromString(str string, v interface{}) error { | ||
204 | + decoder := json.NewDecoder(strings.NewReader(str)) | ||
205 | + if err := unmarshalUseNumber(decoder, v); err != nil { | ||
206 | + return formatError(str, err) | ||
207 | + } | ||
208 | + | ||
209 | + return nil | ||
210 | +} | ||
211 | + | ||
212 | +func UnmarshalFromReader(reader io.Reader, v interface{}) error { | ||
213 | + var buf strings.Builder | ||
214 | + teeReader := io.TeeReader(reader, &buf) | ||
215 | + decoder := json.NewDecoder(teeReader) | ||
216 | + if err := unmarshalUseNumber(decoder, v); err != nil { | ||
217 | + return formatError(buf.String(), err) | ||
218 | + } | ||
219 | + | ||
220 | + return nil | ||
221 | +} | ||
222 | + | ||
223 | +func unmarshalUseNumber(decoder *json.Decoder, v interface{}) error { | ||
224 | + decoder.UseNumber() | ||
225 | + return decoder.Decode(v) | ||
226 | +} | ||
227 | + | ||
228 | +func formatError(v string, err error) error { | ||
229 | + return fmt.Errorf("string: `%s`, error: `%s`", v, err.Error()) | ||
230 | +} | ||
231 | + | ||
232 | +type ReflectVal struct { | ||
233 | + T reflect.Type | ||
234 | + V reflect.Value | ||
235 | +} | ||
236 | + | ||
237 | +/* | ||
238 | + 拷贝当前对象到目标对象,具有相同属性的值 | ||
239 | +*/ | ||
240 | +func CopyObject(src, dst interface{}) { | ||
241 | + var srcMap = make(map[string]ReflectVal) | ||
242 | + | ||
243 | + vs := reflect.ValueOf(src) | ||
244 | + ts := reflect.TypeOf(src) | ||
245 | + vd := reflect.ValueOf(dst) | ||
246 | + td := reflect.TypeOf(dst) | ||
247 | + | ||
248 | + ls := vs.Elem().NumField() | ||
249 | + for i := 0; i < ls; i++ { | ||
250 | + srcMap[ts.Elem().Field(i).Name] = ReflectVal{ | ||
251 | + T: vs.Elem().Field(i).Type(), | ||
252 | + V: vs.Elem().Field(i), | ||
253 | + } | ||
254 | + } | ||
255 | + | ||
256 | + ld := vd.Elem().NumField() | ||
257 | + for i := 0; i < ld; i++ { | ||
258 | + n := td.Elem().Field(i).Name | ||
259 | + t := vd.Elem().Field(i).Type() | ||
260 | + if v, ok := srcMap[n]; ok && v.T == t && vd.Elem().Field(i).CanSet() { | ||
261 | + vd.Elem().Field(i).Set(v.V) | ||
262 | + } | ||
263 | + } | ||
264 | +} |
@@ -10,22 +10,22 @@ import ( | @@ -10,22 +10,22 @@ import ( | ||
10 | "strconv" | 10 | "strconv" |
11 | ) | 11 | ) |
12 | 12 | ||
13 | -func ResponseGrid(c beego.BaseController, data interface{}, err error) { | 13 | +func ResponseGrid(c beego.BaseController, total int64, data interface{}, err error) { |
14 | var response utils.JsonResponse | 14 | var response utils.JsonResponse |
15 | if err != nil { | 15 | if err != nil { |
16 | response = utils.ResponseError(c.Ctx, err) | 16 | response = utils.ResponseError(c.Ctx, err) |
17 | } else { | 17 | } else { |
18 | - response = ResponseGridData(c.Ctx, data) | 18 | + response = ResponseGridData(c.Ctx, total, data) |
19 | } | 19 | } |
20 | c.Data["json"] = response | 20 | c.Data["json"] = response |
21 | c.ServeJSON() | 21 | c.ServeJSON() |
22 | } | 22 | } |
23 | 23 | ||
24 | -func ResponseGridData(ctx *context.Context, data interface{}) utils.JsonResponse { | 24 | +func ResponseGridData(ctx *context.Context, total int64, data interface{}) utils.JsonResponse { |
25 | jsonResponse := utils.JsonResponse{} | 25 | jsonResponse := utils.JsonResponse{} |
26 | jsonResponse["code"] = 0 | 26 | jsonResponse["code"] = 0 |
27 | jsonResponse["msg"] = "ok" | 27 | jsonResponse["msg"] = "ok" |
28 | - jsonResponse["data"] = map[string]interface{}{"grid": data} | 28 | + jsonResponse["data"] = map[string]interface{}{"total": total, "grid": data} |
29 | ctx.Input.SetData("outputData", jsonResponse) | 29 | ctx.Input.SetData("outputData", jsonResponse) |
30 | return jsonResponse | 30 | return jsonResponse |
31 | } | 31 | } |
@@ -42,6 +42,13 @@ func ParseOperateInfo(c beego.BaseController) *domain.OperateInfo { | @@ -42,6 +42,13 @@ func ParseOperateInfo(c beego.BaseController) *domain.OperateInfo { | ||
42 | opt.UserId = header(c, constant.HeaderUserId) | 42 | opt.UserId = header(c, constant.HeaderUserId) |
43 | opt.CompanyId = header(c, constant.HeaderCompanyId) | 43 | opt.CompanyId = header(c, constant.HeaderCompanyId) |
44 | opt.OrgId = header(c, constant.HeaderOrgId) | 44 | opt.OrgId = header(c, constant.HeaderOrgId) |
45 | + // 默认公司组织 | ||
46 | + if opt.CompanyId == 0 { | ||
47 | + opt.CompanyId = 1 | ||
48 | + } | ||
49 | + if opt.OrgId == 0 { | ||
50 | + opt.OrgId = 1 | ||
51 | + } | ||
45 | return opt | 52 | return opt |
46 | } | 53 | } |
47 | 54 |
@@ -15,7 +15,7 @@ func (controller *ProductJobController) CreateProductJob() { | @@ -15,7 +15,7 @@ func (controller *ProductJobController) CreateProductJob() { | ||
15 | productJobService := service.NewProductJobService(nil) | 15 | productJobService := service.NewProductJobService(nil) |
16 | createProductJobCommand := &command.CreateProductJobCommand{} | 16 | createProductJobCommand := &command.CreateProductJobCommand{} |
17 | controller.Unmarshal(createProductJobCommand) | 17 | controller.Unmarshal(createProductJobCommand) |
18 | - data, err := productJobService.CreateProductJob(createProductJobCommand) | 18 | + data, err := productJobService.CreateProductJob(ParseOperateInfo(controller.BaseController), createProductJobCommand) |
19 | controller.Response(data, err) | 19 | controller.Response(data, err) |
20 | } | 20 | } |
21 | 21 | ||
@@ -58,3 +58,11 @@ func (controller *ProductJobController) ListProductJob() { | @@ -58,3 +58,11 @@ func (controller *ProductJobController) ListProductJob() { | ||
58 | data, err := productJobService.ListProductJob(listProductJobQuery) | 58 | data, err := productJobService.ListProductJob(listProductJobQuery) |
59 | controller.Response(data, err) | 59 | controller.Response(data, err) |
60 | } | 60 | } |
61 | + | ||
62 | +func (controller *ProductJobController) SearchProductJob() { | ||
63 | + productJobService := service.NewProductJobService(nil) | ||
64 | + listProductJobQuery := &query.SearchProductJobQuery{} | ||
65 | + controller.Unmarshal(listProductJobQuery) | ||
66 | + total, data, err := productJobService.SearchProductJob(ParseOperateInfo(controller.BaseController), listProductJobQuery) | ||
67 | + ResponseGrid(controller.BaseController, total, data, err) | ||
68 | +} |
@@ -11,4 +11,5 @@ func init() { | @@ -11,4 +11,5 @@ func init() { | ||
11 | web.Router("/product-jobs/:productJobId", &controllers.ProductJobController{}, "Get:GetProductJob") | 11 | web.Router("/product-jobs/:productJobId", &controllers.ProductJobController{}, "Get:GetProductJob") |
12 | web.Router("/product-jobs/:productJobId", &controllers.ProductJobController{}, "Delete:RemoveProductJob") | 12 | web.Router("/product-jobs/:productJobId", &controllers.ProductJobController{}, "Delete:RemoveProductJob") |
13 | web.Router("/product-jobs/", &controllers.ProductJobController{}, "Get:ListProductJob") | 13 | web.Router("/product-jobs/", &controllers.ProductJobController{}, "Get:ListProductJob") |
14 | + web.Router("/product-jobs/search", &controllers.ProductJobController{}, "Post:SearchProductJob") | ||
14 | } | 15 | } |
-
请 注册 或 登录 后发表评论