作者 yangfu

refactor: 计划管理、工位

@@ -16,6 +16,7 @@ require ( @@ -16,6 +16,7 @@ require (
16 github.com/imkira/go-interpol v1.1.0 // indirect 16 github.com/imkira/go-interpol v1.1.0 // indirect
17 github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7 17 github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7
18 github.com/moul/http2curl v1.0.0 // indirect 18 github.com/moul/http2curl v1.0.0 // indirect
  19 + github.com/mozillazg/go-pinyin v0.19.0
19 github.com/onsi/ginkgo v1.15.2 20 github.com/onsi/ginkgo v1.15.2
20 github.com/onsi/gomega v1.11.0 21 github.com/onsi/gomega v1.11.0
21 github.com/sergi/go-diff v1.2.0 // indirect 22 github.com/sergi/go-diff v1.2.0 // indirect
@@ -249,6 +249,8 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9 @@ -249,6 +249,8 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9
249 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= 249 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
250 github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs= 250 github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs=
251 github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= 251 github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ=
  252 +github.com/mozillazg/go-pinyin v0.19.0 h1:p+J8/kjJ558KPvVGYLvqBhxf8jbZA2exSLCs2uUVN8c=
  253 +github.com/mozillazg/go-pinyin v0.19.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc=
252 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 254 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
253 github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= 255 github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=
254 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= 256 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
  1 +package query
  2 +
  3 +import (
  4 + "fmt"
  5 + "reflect"
  6 + "strings"
  7 +
  8 + "github.com/beego/beego/v2/core/validation"
  9 +)
  10 +
  11 +type GenProductCodeQuery struct {
  12 + // 企业id
  13 + CompanyId int `cname:"企业id" json:"companyId" valid:"Required"`
  14 +}
  15 +
  16 +func (getProductQuery *GenProductCodeQuery) Valid(validation *validation.Validation) {
  17 + //validation.SetError("CustomValid", "未实现的自定义认证")
  18 +}
  19 +
  20 +func (getProductQuery *GenProductCodeQuery) ValidateQuery() error {
  21 + valid := validation.Validation{}
  22 + b, err := valid.Valid(getProductQuery)
  23 + if err != nil {
  24 + return err
  25 + }
  26 + if !b {
  27 + elem := reflect.TypeOf(getProductQuery).Elem()
  28 + for _, validErr := range valid.Errors {
  29 + field, isExist := elem.FieldByName(validErr.Field)
  30 + if isExist {
  31 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  32 + } else {
  33 + return fmt.Errorf(validErr.Message)
  34 + }
  35 + }
  36 + }
  37 + return nil
  38 +}
@@ -362,6 +362,23 @@ func (productService *ProductService) BatchAddProduct(opt *domain.OperateInfo, l @@ -362,6 +362,23 @@ func (productService *ProductService) BatchAddProduct(opt *domain.OperateInfo, l
362 return failRows, nil 362 return failRows, nil
363 } 363 }
364 364
  365 +// 创建产品服务
  366 +func (productService *ProductService) GenProductCode(createProductCommand *query.GenProductCodeQuery) (interface{}, error) {
  367 + if err := createProductCommand.ValidateQuery(); err != nil {
  368 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  369 + }
  370 +
  371 + generator := redis.NewProductCodeCache(createProductCommand.CompanyId)
  372 + code, err := redis.GenCode(generator)
  373 + if err != nil {
  374 + log.Logger.Error(err.Error())
  375 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "服务器异常")
  376 + }
  377 + return map[string]interface{}{
  378 + "code": code,
  379 + }, nil
  380 +}
  381 +
365 func NewProductService(options map[string]interface{}) *ProductService { 382 func NewProductService(options map[string]interface{}) *ProductService {
366 newProductService := &ProductService{} 383 newProductService := &ProductService{}
367 return newProductService 384 return newProductService
@@ -13,6 +13,8 @@ type UpdateProductJobCommand struct { @@ -13,6 +13,8 @@ type UpdateProductJobCommand struct {
13 ProductJobId int `cname:"工位ID" json:"productJobId" valid:"Required"` 13 ProductJobId int `cname:"工位ID" json:"productJobId" valid:"Required"`
14 // 工位名称 14 // 工位名称
15 JobName string `cname:"工位名称" json:"jobName" valid:"Required"` 15 JobName string `cname:"工位名称" json:"jobName" valid:"Required"`
  16 + // 工位名称
  17 + ProcessName string `cname:"工序名称" json:"processName" valid:"Required"`
16 // 车间ID 18 // 车间ID
17 WorkshopId int `cname:"车间ID" json:"workshopId" valid:"Required"` 19 WorkshopId int `cname:"车间ID" json:"workshopId" valid:"Required"`
18 // 生产线ID 20 // 生产线ID
@@ -31,7 +31,9 @@ type ProductJobDto struct { @@ -31,7 +31,9 @@ type ProductJobDto struct {
31 // 权限标识 (当前登录组织匹配为true,否则false) 31 // 权限标识 (当前登录组织匹配为true,否则false)
32 //AuthFlag bool `json:"authFlag"` 32 //AuthFlag bool `json:"authFlag"`
33 // 关联设备列表 33 // 关联设备列表
34 - RelatedDevices []DeviceDto `json:"relatedDevices,omitempty"` 34 + RelatedDevices []int `json:"relatedDevices,omitempty"`
  35 + // 关联设备列表
  36 + RelatedDeviceList []DeviceDto `json:"relatedDevicesList,omitempty"`
35 } 37 }
36 38
37 type DeviceDto struct { 39 type DeviceDto struct {
@@ -48,15 +50,16 @@ func (d *ProductJobDto) LoadDto(job *domain.ProductJob, orgId int) { @@ -48,15 +50,16 @@ func (d *ProductJobDto) LoadDto(job *domain.ProductJob, orgId int) {
48 d.JobName = job.JobName 50 d.JobName = job.JobName
49 d.ProcessName = job.ProcessName 51 d.ProcessName = job.ProcessName
50 d.WorkStation = job.WorkStation 52 d.WorkStation = job.WorkStation
  53 + d.RelatedDevices = job.RelatedDevices
51 //d.AuthFlag = domain.CheckOrgAuth(orgId, job.OrgId) 54 //d.AuthFlag = domain.CheckOrgAuth(orgId, job.OrgId)
52 //if job.Ext != nil { 55 //if job.Ext != nil {
53 // d.OrgName = job.Ext.OrgName 56 // d.OrgName = job.Ext.OrgName
54 //} 57 //}
55 } 58 }
56 59
57 -func (d *ProductJobDto) WithRelatedDevices(devices []*domain.Device) *ProductJobDto { 60 +func (d *ProductJobDto) WithRelatedDevicesList(devices []*domain.Device) *ProductJobDto {
58 for i := range devices { 61 for i := range devices {
59 - d.RelatedDevices = append(d.RelatedDevices, DeviceDto{ 62 + d.RelatedDeviceList = append(d.RelatedDeviceList, DeviceDto{
60 DeviceName: devices[i].DeviceName, 63 DeviceName: devices[i].DeviceName,
61 DeviceId: devices[i].DeviceId, 64 DeviceId: devices[i].DeviceId,
62 DeviceCode: devices[i].DeviceCode, 65 DeviceCode: devices[i].DeviceCode,
@@ -101,18 +101,18 @@ func (productJobService *ProductJobService) GetProductJob(getProductJobQuery *qu @@ -101,18 +101,18 @@ func (productJobService *ProductJobService) GetProductJob(getProductJobQuery *qu
101 newJobDto := &dto.ProductJobDto{} 101 newJobDto := &dto.ProductJobDto{}
102 newJobDto.LoadDto(productJob, 0) 102 newJobDto.LoadDto(productJob, 0)
103 103
104 - if len(productJob.RelatedDevices) > 0 {  
105 - deviceRepository, _, _ := factory.FastPgDevice(transactionContext, 0)  
106 - _, devices, err := deviceRepository.Find(map[string]interface{}{  
107 - "companyId": productJob.CompanyId,  
108 - "orgId": productJob.OrgId,  
109 - "inDeviceId": productJob.RelatedDevices,  
110 - })  
111 - if err != nil {  
112 - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())  
113 - }  
114 - newJobDto.WithRelatedDevices(devices)  
115 - } 104 + //if len(productJob.RelatedDevices) > 0 {
  105 + // deviceRepository, _, _ := factory.FastPgDevice(transactionContext, 0)
  106 + // _, devices, err := deviceRepository.Find(map[string]interface{}{
  107 + // "companyId": productJob.CompanyId,
  108 + // "orgId": productJob.OrgId,
  109 + // "inDeviceId": productJob.RelatedDevices,
  110 + // })
  111 + // if err != nil {
  112 + // return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  113 + // }
  114 + // newJobDto.WithRelatedDevicesList(devices)
  115 + //}
116 116
117 if err := transactionContext.CommitTransaction(); err != nil { 117 if err := transactionContext.CommitTransaction(); err != nil {
118 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) 118 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
@@ -289,6 +289,7 @@ func (productJobService *ProductJobService) UpdateProductJob(cmd *command.Update @@ -289,6 +289,7 @@ func (productJobService *ProductJobService) UpdateProductJob(cmd *command.Update
289 productJob.JobName = cmd.JobName 289 productJob.JobName = cmd.JobName
290 productJob.RelatedDevices = cmd.RelatedDevices 290 productJob.RelatedDevices = cmd.RelatedDevices
291 productJob.UpdatedAt = time.Now() 291 productJob.UpdatedAt = time.Now()
  292 + productJob.ProcessName = cmd.ProcessName
292 293
293 if productJob, err := productJobRepository.Save(productJob); err != nil { 294 if productJob, err := productJobRepository.Save(productJob); err != nil {
294 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 295 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
@@ -21,15 +21,17 @@ type CreateProductPlanCommand struct { @@ -21,15 +21,17 @@ type CreateProductPlanCommand struct {
21 // 生产日期 21 // 生产日期
22 ProductDate string `cname:"生产日期" json:"productDate" valid:"Required"` 22 ProductDate string `cname:"生产日期" json:"productDate" valid:"Required"`
23 // 上班班次 1:全天 2:白班 4:中班 8:夜班 23 // 上班班次 1:全天 2:白班 4:中班 8:夜班
24 - WorkOn int `cname:"上班班次 1:全天 2:白班 4:中班 8:夜班" json:"workOn" valid:"Required"` 24 + WorkOn int `cname:"上班班次 1:全天 2:白班 4:中班 8:夜班" json:"workOn"`
25 // 机台 (A、B、C、D 区分机器大小) 25 // 机台 (A、B、C、D 区分机器大小)
26 - Machine string `cname:"机台 (A、B、C、D 区分机器大小)" json:"machine" valid:"Required"` 26 + Machine string `cname:"机台 (A、B、C、D 区分机器大小)" json:"machine"`
27 // 计划的产品名称 27 // 计划的产品名称
28 - PlanProductName string `cname:"计划的产品名称" json:"planProductName" valid:"Required"` 28 + //PlanProductName string `cname:"计划的产品名称" json:"planProductName"`
  29 + // 产品ID
  30 + ProductId int `cname:"产品ID" json:"productId" valid:"Required"`
29 // 数量(保留两位小数) 31 // 数量(保留两位小数)
30 Quantity float64 `cname:"数量(保留两位小数)" json:"quantity" valid:"Required"` 32 Quantity float64 `cname:"数量(保留两位小数)" json:"quantity" valid:"Required"`
31 // 单位 33 // 单位
32 - Unit string `cname:"单位" json:"unit" valid:"Required"` 34 + //Unit string `cname:"单位" json:"unit" `
33 // 单份重量(原材料) 35 // 单份重量(原材料)
34 //nitWeight float64 `cname:"单份重量(原材料)" json:"unitWeight" valid:"Required"` 36 //nitWeight float64 `cname:"单份重量(原材料)" json:"unitWeight" valid:"Required"`
35 // 重量 37 // 重量
@@ -23,19 +23,21 @@ type UpdateProductPlanCommand struct { @@ -23,19 +23,21 @@ type UpdateProductPlanCommand struct {
23 // 生产日期 23 // 生产日期
24 ProductDate string `cname:"生产日期" json:"productDate" valid:"Required"` 24 ProductDate string `cname:"生产日期" json:"productDate" valid:"Required"`
25 // 上班班次 1:全天 2:白班 4:中班 8:夜班 25 // 上班班次 1:全天 2:白班 4:中班 8:夜班
26 - WorkOn int `cname:"上班班次 1:全天 2:白班 4:中班 8:夜班" json:"workOn" valid:"Required"` 26 + WorkOn int `cname:"上班班次 1:全天 2:白班 4:中班 8:夜班" json:"workOn"`
27 // 机台 (A、B、C、D 区分机器大小) 27 // 机台 (A、B、C、D 区分机器大小)
28 - Machine string `cname:"机台 (A、B、C、D 区分机器大小)" json:"machine" valid:"Required"` 28 + Machine string `cname:"机台 (A、B、C、D 区分机器大小)" json:"machine"`
29 // 计划的产品名称 29 // 计划的产品名称
30 - PlanProductName string `cname:"计划的产品名称" json:"planProductName" valid:"Required"` 30 + PlanProductName string `cname:"计划的产品名称" json:"planProductName"`
  31 + // 产品ID
  32 + ProductId int `cname:"产品ID" json:"productId" valid:"Required"`
31 // 数量(保留两位小数) 33 // 数量(保留两位小数)
32 Quantity float64 `cname:"数量(保留两位小数)" json:"quantity" valid:"Required"` 34 Quantity float64 `cname:"数量(保留两位小数)" json:"quantity" valid:"Required"`
33 // 单位 35 // 单位
34 - Unit string `cname:"单位" json:"unit" valid:"Required"` 36 + Unit string `cname:"单位" json:"unit"`
35 // 单份重量(原材料) 37 // 单份重量(原材料)
36 //UnitWeight float64 `cname:"单份重量(原材料)" json:"unitWeight" valid:"Required"` 38 //UnitWeight float64 `cname:"单份重量(原材料)" json:"unitWeight" valid:"Required"`
37 // 重量 39 // 重量
38 - Weight float64 `cname:"重量" json:"weight" valid:"Required"` 40 + Weight float64 `cname:"重量" json:"weight"`
39 // 备注 41 // 备注
40 Remark string `cname:"备注" json:"remark" valid:"Required"` 42 Remark string `cname:"备注" json:"remark" valid:"Required"`
41 // 生产日期 43 // 生产日期
@@ -53,6 +53,12 @@ func (productPlanService *ProductPlanService) CreateProductPlan(cmd *command.Cre @@ -53,6 +53,12 @@ func (productPlanService *ProductPlanService) CreateProductPlan(cmd *command.Cre
53 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 53 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
54 } 54 }
55 55
  56 + var product *domain.Product
  57 + _, product, err = factory.FastPgProduct(transactionContext, cmd.ProductId)
  58 + if err != nil {
  59 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  60 + }
  61 +
56 newProductPlan := &domain.ProductPlan{ 62 newProductPlan := &domain.ProductPlan{
57 CompanyId: cmd.CompanyId, 63 CompanyId: cmd.CompanyId,
58 OrgId: cmd.OrgId, 64 OrgId: cmd.OrgId,
@@ -61,18 +67,27 @@ func (productPlanService *ProductPlanService) CreateProductPlan(cmd *command.Cre @@ -61,18 +67,27 @@ func (productPlanService *ProductPlanService) CreateProductPlan(cmd *command.Cre
61 Workshop: workshop.CloneSample(), 67 Workshop: workshop.CloneSample(),
62 WorkOn: cmd.WorkOn, 68 WorkOn: cmd.WorkOn,
63 Machine: cmd.Machine, 69 Machine: cmd.Machine,
64 - PlanProductName: cmd.PlanProductName, 70 + PlanProductName: product.ProductName,
65 PlanDevoted: &domain.UnitQuantity{ 71 PlanDevoted: &domain.UnitQuantity{
66 - Unit: cmd.Unit,  
67 - Quantity: cmd.Quantity,  
68 - Weight: cmd.Weight, 72 + Unit: product.ProductSpec.Unit,
  73 + Quantity: cmd.Quantity,
  74 + Weight: product.ProductWeigh(cmd.Quantity),
  75 + UnitWeight: product.ProductSpec.UnitWeight,
69 }, 76 },
70 PlanStatus: domain.PlanOffline, 77 PlanStatus: domain.PlanOffline,
71 WorkStation: &domain.WorkStation{}, 78 WorkStation: &domain.WorkStation{},
72 Remark: cmd.Remark, 79 Remark: cmd.Remark,
73 CreatedAt: time.Now(), 80 CreatedAt: time.Now(),
74 UpdatedAt: time.Now(), 81 UpdatedAt: time.Now(),
75 - Ext: domain.NewExt(org.OrgName), 82 + Ext: domain.NewExt(org.OrgName).WithProductPlanExt(&domain.ProductPlanExt{
  83 + ProductId: product.ProductId,
  84 + ProductCode: product.ProductCode,
  85 + ProductName: product.ProductName,
  86 + //ProductSpec: product.ProductSpec,
  87 + }),
  88 + }
  89 + if cmd.Weight > 0 {
  90 + newProductPlan.PlanDevoted.Weight = cmd.Weight
76 } 91 }
77 if productPlan, err = productPlanRepository.Save(newProductPlan); err != nil { 92 if productPlan, err = productPlanRepository.Save(newProductPlan); err != nil {
78 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 93 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
@@ -232,7 +247,26 @@ func (productPlanService *ProductPlanService) UpdateProductPlan(cmd *command.Upd @@ -232,7 +247,26 @@ func (productPlanService *ProductPlanService) UpdateProductPlan(cmd *command.Upd
232 if err != nil { 247 if err != nil {
233 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 248 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
234 } 249 }
  250 +
  251 + var product *domain.Product
  252 + _, product, err = factory.FastPgProduct(transactionContext, cmd.ProductId)
  253 + if err != nil {
  254 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  255 + }
  256 +
235 productPlan.Workshop = workshop.CloneSample() 257 productPlan.Workshop = workshop.CloneSample()
  258 + productPlan.Ext.WithProductPlanExt(&domain.ProductPlanExt{
  259 + ProductId: product.ProductId,
  260 + ProductCode: product.ProductCode,
  261 + ProductName: product.ProductName,
  262 + //ProductSpec: product.ProductSpec,
  263 + })
  264 + productPlan.PlanDevoted.UnitWeight = product.ProductSpec.UnitWeight
  265 + cmd.PlanProductName = product.ProductName
  266 + cmd.Unit = product.ProductSpec.Unit
  267 + if cmd.Weight == 0 {
  268 + cmd.Weight = product.ProductWeigh(cmd.Quantity)
  269 + }
236 270
237 if err := productPlan.Update(tool_funs.SimpleStructToMap(cmd)); err != nil { 271 if err := productPlan.Update(tool_funs.SimpleStructToMap(cmd)); err != nil {
238 return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error()) 272 return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
1 -//go:build !local 1 +//+build !local
2 2
3 package constant 3 package constant
4 4
@@ -10,6 +10,9 @@ type Ext struct { @@ -10,6 +10,9 @@ type Ext struct {
10 10
11 // 考勤记录扩展 11 // 考勤记录扩展
12 AttendanceExt *ProductAttendanceRecordExt `json:"attendanceExt,omitempty"` 12 AttendanceExt *ProductAttendanceRecordExt `json:"attendanceExt,omitempty"`
  13 +
  14 + // 生产计划扩展
  15 + ProductPlanExt *ProductPlanExt `json:"productPlanExt,omitempty"`
13 } 16 }
14 17
15 func NewExt(orgName string) *Ext { 18 func NewExt(orgName string) *Ext {
@@ -27,3 +30,8 @@ func (e *Ext) WithAttendanceExt(ext *ProductAttendanceRecordExt) *Ext { @@ -27,3 +30,8 @@ func (e *Ext) WithAttendanceExt(ext *ProductAttendanceRecordExt) *Ext {
27 e.AttendanceExt = ext 30 e.AttendanceExt = ext
28 return e 31 return e
29 } 32 }
  33 +
  34 +func (e *Ext) WithProductPlanExt(ext *ProductPlanExt) *Ext {
  35 + e.ProductPlanExt = ext
  36 + return e
  37 +}
@@ -75,6 +75,13 @@ func (product *Product) Update(data map[string]interface{}) error { @@ -75,6 +75,13 @@ func (product *Product) Update(data map[string]interface{}) error {
75 return nil 75 return nil
76 } 76 }
77 77
  78 +func (item *Product) ProductWeigh(quality float64) float64 {
  79 + if quality <= 0 {
  80 + return 0
  81 + }
  82 + return item.ProductSpec.UnitWeight * quality
  83 +}
  84 +
78 // 导入数据体 85 // 导入数据体
79 type ImportProductItem struct { 86 type ImportProductItem struct {
80 // 产品编号 编码规则为“CP”+2 位年+2 位月+2 位日+3 位流水码,如 CP211229001 87 // 产品编号 编码规则为“CP”+2 位年+2 位月+2 位日+3 位流水码,如 CP211229001
  1 +package domain
  2 +
  3 +// 生产计划扩展
  4 +type ProductPlanExt struct {
  5 + // 产品ID
  6 + ProductId int `json:"productId,omitempty"`
  7 + // 产品编号 编码规则为“CP”+2 位年+2 位月+2 位日+3 位流水码,如 CP211229001
  8 + ProductCode string `json:"productCode,omitempty"`
  9 + // 产品名称
  10 + ProductName string `json:"productName,omitempty"`
  11 + // 产品规格
  12 + //ProductSpec *UnitQuantity `json:"productSpec,omitempty"`
  13 +}
@@ -8,4 +8,10 @@ type ProductRecordInfo struct { @@ -8,4 +8,10 @@ type ProductRecordInfo struct {
8 Material *UnitConversion `json:"material,omitempty"` 8 Material *UnitConversion `json:"material,omitempty"`
9 // 生产计划信息(批次) 9 // 生产计划信息(批次)
10 ProductPlan *ProductPlan `json:"productPlan,omitempty"` 10 ProductPlan *ProductPlan `json:"productPlan,omitempty"`
  11 +
  12 + // 生产计划ID
  13 + ProductPlanId int `json:"productPlanId,omitempty"`
  14 +
  15 + // 生产小组ID
  16 + ProductGroupId int `json:"productGroupId,omitempty"`
11 } 17 }
  1 +package converter
  2 +
  3 +import (
  4 + "github.com/mozillazg/go-pinyin"
  5 + "strings"
  6 +)
  7 +
  8 +func ToPinYin(hans string, sep string) string {
  9 + a := pinyin.NewArgs()
  10 + tmp := pinyin.Pinyin(hans, a)
  11 + result := make([]string, 0)
  12 + for i := range tmp {
  13 + result = append(result, tmp[i]...)
  14 + }
  15 + return strings.Join(result, sep)
  16 +}
  1 +package converter
  2 +
  3 +import "testing"
  4 +
  5 +func TestToPinYin(t *testing.T) {
  6 + inputs := []struct {
  7 + hans string
  8 + }{
  9 + {
  10 + "杨超越",
  11 + },
  12 + {
  13 + "陈阿鸡",
  14 + },
  15 + }
  16 +
  17 + for i := range inputs {
  18 + got := ToPinYin(inputs[i].hans, " ")
  19 + t.Log(got)
  20 + }
  21 +}
@@ -92,3 +92,13 @@ func (controller *ProductController) BatchAddProduct() { @@ -92,3 +92,13 @@ func (controller *ProductController) BatchAddProduct() {
92 data, err := productService.BatchAddProduct(ParseOperateInfo(controller.BaseController), cmd.List) 92 data, err := productService.BatchAddProduct(ParseOperateInfo(controller.BaseController), cmd.List)
93 controller.Response(data, err) 93 controller.Response(data, err)
94 } 94 }
  95 +
  96 +func (controller *ProductController) GenProductCode() {
  97 + productService := service.NewProductService(nil)
  98 + cmd := &query.GenProductCodeQuery{}
  99 + Must(controller.Unmarshal(cmd))
  100 + op := ParseOperateInfo(controller.BaseController)
  101 + cmd.CompanyId = op.CompanyId
  102 + data, err := productService.GenProductCode(cmd)
  103 + controller.Response(data, err)
  104 +}
@@ -14,4 +14,5 @@ func init() { @@ -14,4 +14,5 @@ func init() {
14 web.Router("/products/", &controllers.ProductController{}, "Get:ListProduct") 14 web.Router("/products/", &controllers.ProductController{}, "Get:ListProduct")
15 web.Router("/products/search", &controllers.ProductController{}, "Post:SearchProduct") 15 web.Router("/products/search", &controllers.ProductController{}, "Post:SearchProduct")
16 web.Router("/products/batch-add", &controllers.ProductController{}, "Post:BatchAddProduct") 16 web.Router("/products/batch-add", &controllers.ProductController{}, "Post:BatchAddProduct")
  17 + web.Router("/products/generate-code", &controllers.ProductController{}, "Post:GenProductCode")
17 } 18 }