正在显示
18 个修改的文件
包含
363 行增加
和
130 行删除
| 1 | 1 | ||
| 2 | -- 表product_material_group 增加唯一索引 idx_unq_product_material_group_company_id_org_id_material_group_number | 2 | -- 表product_material_group 增加唯一索引 idx_unq_product_material_group_company_id_org_id_material_group_number |
| 3 | 3 | ||
| 4 | -create UNIQUE INDEX idx_unq_product_material_group_company_id_org_id_material_group_number on manufacture.product_material_group using btree(company_id,org_id,material_group_number); | ||
| 4 | +create UNIQUE INDEX idx_unq_product_material_group_company_id_org_id_material_group_number on manufacture.product_material_group using btree(company_id,org_id,material_group_number); | ||
| 5 | + | ||
| 6 | +-- 表product_material 增加唯一索引 idx_unq_product_material_company_id_material_number | ||
| 7 | +create UNIQUE INDEX idx_unq_product_material_company_id_material_number on manufacture.product_material using btree(company_id,material_number); |
| @@ -14,19 +14,15 @@ type CreateProductCommand struct { | @@ -14,19 +14,15 @@ type CreateProductCommand struct { | ||
| 14 | // 组织ID | 14 | // 组织ID |
| 15 | OrgId int `cname:"组织ID" json:"orgId" valid:"Required"` | 15 | OrgId int `cname:"组织ID" json:"orgId" valid:"Required"` |
| 16 | // 产品编号 编码规则为“CP”+2 位年+2 位月+2 位日+3 位流水码,如 CP211229001 | 16 | // 产品编号 编码规则为“CP”+2 位年+2 位月+2 位日+3 位流水码,如 CP211229001 |
| 17 | - ProductCode string `cname:"产品编号 编码规则为“CP”+2 位年+2 位月+2 位日+3 位流水码,如 CP211229001" json:"productCode"` | 17 | + ProductCode string `cname:"产品编号 编码规则为“CP”+2 位年+2 位月+2 位日+3 位流水码,如 CP211229001" json:"productCode" valid:"Required"` |
| 18 | // 产品名称 | 18 | // 产品名称 |
| 19 | - ProductName string `cname:"产品名称" json:"productName" valid:"Required"` | 19 | + // ProductName string `cname:"产品名称" json:"productName" valid:"Required"` |
| 20 | // 产品类别 | 20 | // 产品类别 |
| 21 | - ProductCategory string `cname:"产品类别" json:"productCategory" valid:"Required"` | ||
| 22 | - // 数量(保留两位小数) | ||
| 23 | - //Quantity float64 `cname:"数量(保留两位小数)" json:"quantity" valid:"Required"` | 21 | + // ProductCategory string `cname:"产品类别" json:"productCategory" valid:"Required"` |
| 24 | // 单位 | 22 | // 单位 |
| 25 | - Unit string `cname:"单位" json:"unit" valid:"Required"` | 23 | + // Unit string `cname:"单位" json:"unit" valid:"Required"` |
| 26 | // 单份重量(原材料) | 24 | // 单份重量(原材料) |
| 27 | UnitWeight float64 `cname:"单份重量(原材料)" json:"unitWeight" valid:"Required"` | 25 | UnitWeight float64 `cname:"单份重量(原材料)" json:"unitWeight" valid:"Required"` |
| 28 | - // 重量 | ||
| 29 | - //Weight float64 `cname:"重量" json:"weight" valid:"Required"` | ||
| 30 | } | 26 | } |
| 31 | 27 | ||
| 32 | func (createProductCommand *CreateProductCommand) Valid(validation *validation.Validation) { | 28 | func (createProductCommand *CreateProductCommand) Valid(validation *validation.Validation) { |
| @@ -12,19 +12,15 @@ type UpdateProductCommand struct { | @@ -12,19 +12,15 @@ type UpdateProductCommand struct { | ||
| 12 | // 产品ID | 12 | // 产品ID |
| 13 | ProductId int `cname:"产品ID" json:"productId" valid:"Required"` | 13 | ProductId int `cname:"产品ID" json:"productId" valid:"Required"` |
| 14 | // 产品编号 编码规则为“CP”+2 位年+2 位月+2 位日+3 位流水码,如 CP211229001 | 14 | // 产品编号 编码规则为“CP”+2 位年+2 位月+2 位日+3 位流水码,如 CP211229001 |
| 15 | - ProductCode string `cname:"产品编号 编码规则为“CP”+2 位年+2 位月+2 位日+3 位流水码,如 CP211229001" json:"productCode"` | 15 | + //ProductCode string `cname:"产品编号 编码规则为“CP”+2 位年+2 位月+2 位日+3 位流水码,如 CP211229001" json:"productCode"` |
| 16 | // 产品名称 | 16 | // 产品名称 |
| 17 | - ProductName string `cname:"产品名称" json:"productName" valid:"Required"` | 17 | + ProductName string `cname:"产品名称" json:"productName" ` |
| 18 | // 产品类别 | 18 | // 产品类别 |
| 19 | - ProductCategory string `cname:"产品类别" json:"productCategory" valid:"Required"` | ||
| 20 | - // 数量(保留两位小数) | ||
| 21 | - //Quantity float64 `cname:"数量(保留两位小数)" json:"quantity" valid:"Required"` | 19 | + ProductCategory string `cname:"产品类别" json:"productCategory"` |
| 22 | // 单位 | 20 | // 单位 |
| 23 | - Unit string `cname:"单位" json:"unit" valid:"Required"` | 21 | + Unit string `cname:"单位" json:"unit"` |
| 24 | // 单份重量(原材料) | 22 | // 单份重量(原材料) |
| 25 | UnitWeight float64 `cname:"单份重量(原材料)" json:"unitWeight" valid:"Required"` | 23 | UnitWeight float64 `cname:"单份重量(原材料)" json:"unitWeight" valid:"Required"` |
| 26 | - // 重量 | ||
| 27 | - //Weight float64 `cname:"重量" json:"weight" valid:"Required"` | ||
| 28 | } | 24 | } |
| 29 | 25 | ||
| 30 | func (updateProductCommand *UpdateProductCommand) Valid(validation *validation.Validation) { | 26 | func (updateProductCommand *UpdateProductCommand) Valid(validation *validation.Validation) { |
| @@ -14,7 +14,6 @@ import ( | @@ -14,7 +14,6 @@ import ( | ||
| 14 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/redis" | 14 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/redis" |
| 15 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" | 15 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" |
| 16 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" | 16 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" |
| 17 | - "time" | ||
| 18 | ) | 17 | ) |
| 19 | 18 | ||
| 20 | // 产品服务 | 19 | // 产品服务 |
| @@ -22,7 +21,7 @@ type ProductService struct { | @@ -22,7 +21,7 @@ type ProductService struct { | ||
| 22 | } | 21 | } |
| 23 | 22 | ||
| 24 | // 创建产品服务 | 23 | // 创建产品服务 |
| 25 | -func (productService *ProductService) CreateProduct(createProductCommand *command.CreateProductCommand) (interface{}, error) { | 24 | +func (productService *ProductService) CreateProduct(opt *domain.OperateInfo, createProductCommand *command.CreateProductCommand) (interface{}, error) { |
| 26 | if err := createProductCommand.ValidateCommand(); err != nil { | 25 | if err := createProductCommand.ValidateCommand(); err != nil { |
| 27 | return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | 26 | return nil, application.ThrowError(application.ARG_ERROR, err.Error()) |
| 28 | } | 27 | } |
| @@ -37,50 +36,23 @@ func (productService *ProductService) CreateProduct(createProductCommand *comman | @@ -37,50 +36,23 @@ func (productService *ProductService) CreateProduct(createProductCommand *comman | ||
| 37 | transactionContext.RollbackTransaction() | 36 | transactionContext.RollbackTransaction() |
| 38 | }() | 37 | }() |
| 39 | 38 | ||
| 40 | - if len(createProductCommand.ProductCode) == 0 { | ||
| 41 | - generator := redis.NewProductCodeCache(createProductCommand.CompanyId) | ||
| 42 | - code, err := redis.GenCode(generator) | ||
| 43 | - if err != nil { | ||
| 44 | - log.Logger.Error(err.Error()) | ||
| 45 | - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "服务器异常") | ||
| 46 | - } | ||
| 47 | - createProductCommand.ProductCode = code | 39 | + batchAddProductService, _ := domainService.NewPGBatchAddProductService(transactionContext.(*pgTransaction.TransactionContext)) |
| 40 | + item := &domain.ImportProductItem{ | ||
| 41 | + ProductCode: createProductCommand.ProductCode, | ||
| 42 | + UnitWeight: utils.AssertString(createProductCommand.UnitWeight), | ||
| 48 | } | 43 | } |
| 49 | - var userService = domainService.NewUserService() | ||
| 50 | - var org *domain.Org | ||
| 51 | - org, err = userService.Organization(createProductCommand.OrgId) | ||
| 52 | - if err != nil { | ||
| 53 | - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 44 | + if _, err = batchAddProductService.BatchAddProduct(opt, []*domain.ImportProductItem{ |
| 45 | + item, | ||
| 46 | + }, false); err != nil { | ||
| 47 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 54 | } | 48 | } |
| 55 | - | ||
| 56 | - newProduct := &domain.Product{ | ||
| 57 | - CompanyId: createProductCommand.CompanyId, | ||
| 58 | - OrgId: createProductCommand.OrgId, | ||
| 59 | - ProductCode: createProductCommand.ProductCode, | ||
| 60 | - ProductName: createProductCommand.ProductName, | ||
| 61 | - ProductCategory: createProductCommand.ProductCategory, | ||
| 62 | - ProductSpec: &domain.UnitQuantity{ | ||
| 63 | - Unit: createProductCommand.Unit, | ||
| 64 | - UnitWeight: createProductCommand.UnitWeight, | ||
| 65 | - }, | ||
| 66 | - CreatedAt: time.Now(), | ||
| 67 | - UpdatedAt: time.Now(), | ||
| 68 | - Ext: domain.NewExt(org.OrgName), | ||
| 69 | - } | ||
| 70 | - productRepository, _, _ := factory.FastPgProduct(transactionContext, 0) | ||
| 71 | - | ||
| 72 | - if item, err := productRepository.FindOne(map[string]interface{}{"companyId": createProductCommand.CompanyId, "productCode": createProductCommand.ProductCode}); err == nil && item != nil { | ||
| 73 | - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "产品编号重复,请重新提交") | 49 | + if len(item.FailReason) > 0 { |
| 50 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, item.FailReason) | ||
| 74 | } | 51 | } |
| 75 | - | ||
| 76 | - if product, err := productRepository.Save(newProduct); err != nil { | ||
| 77 | - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 78 | - } else { | ||
| 79 | - if err := transactionContext.CommitTransaction(); err != nil { | ||
| 80 | - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 81 | - } | ||
| 82 | - return product, nil | 52 | + if err := transactionContext.CommitTransaction(); err != nil { |
| 53 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 83 | } | 54 | } |
| 55 | + return struct{}{}, nil | ||
| 84 | } | 56 | } |
| 85 | 57 | ||
| 86 | // 返回产品服务 | 58 | // 返回产品服务 |
| @@ -242,7 +214,7 @@ func (productService *ProductService) BatchRemoveProduct(cmd *command.BatchRemov | @@ -242,7 +214,7 @@ func (productService *ProductService) BatchRemoveProduct(cmd *command.BatchRemov | ||
| 242 | } | 214 | } |
| 243 | 215 | ||
| 244 | // 更新产品服务 | 216 | // 更新产品服务 |
| 245 | -func (productService *ProductService) UpdateProduct(updateProductCommand *command.UpdateProductCommand) (interface{}, error) { | 217 | +func (productService *ProductService) UpdateProduct(opt *domain.OperateInfo, updateProductCommand *command.UpdateProductCommand) (interface{}, error) { |
| 246 | if err := updateProductCommand.ValidateCommand(); err != nil { | 218 | if err := updateProductCommand.ValidateCommand(); err != nil { |
| 247 | return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | 219 | return nil, application.ThrowError(application.ARG_ERROR, err.Error()) |
| 248 | } | 220 | } |
| @@ -260,19 +232,11 @@ func (productService *ProductService) UpdateProduct(updateProductCommand *comman | @@ -260,19 +232,11 @@ func (productService *ProductService) UpdateProduct(updateProductCommand *comman | ||
| 260 | if err != nil { | 232 | if err != nil { |
| 261 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 233 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
| 262 | } | 234 | } |
| 263 | - if len(updateProductCommand.ProductCode) == 0 { | ||
| 264 | - generator := redis.NewProductCodeCache(product.CompanyId) | ||
| 265 | - code, err := redis.GenCode(generator) | ||
| 266 | - if err != nil { | ||
| 267 | - log.Logger.Error(err.Error()) | ||
| 268 | - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "服务器异常") | ||
| 269 | - } | ||
| 270 | - updateProductCommand.ProductCode = code | ||
| 271 | - } | ||
| 272 | - if updateProductCommand.ProductCode != product.ProductCode { | ||
| 273 | - if item, err := productRepository.FindOne(map[string]interface{}{"companyId": product.CompanyId, "productCode": updateProductCommand.ProductCode}); err == nil && item != nil { | ||
| 274 | - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "产品编号重复,请重新提交") | ||
| 275 | - } | 235 | + |
| 236 | + var material *domain.ProductMaterial | ||
| 237 | + productMaterialRepository, _, _ := factory.FastProductMaterial(transactionContext, 0) | ||
| 238 | + if material, err = productMaterialRepository.FindOne(map[string]interface{}{"companyId": product.CompanyId, "materialNumber": product.ProductCode}); err != nil || material == nil { | ||
| 239 | + return nil, application.ThrowError(application.BUSINESS_ERROR, "物料不存在") | ||
| 276 | } | 240 | } |
| 277 | 241 | ||
| 278 | var userService = domainService.NewUserService() | 242 | var userService = domainService.NewUserService() |
| @@ -281,8 +245,13 @@ func (productService *ProductService) UpdateProduct(updateProductCommand *comman | @@ -281,8 +245,13 @@ func (productService *ProductService) UpdateProduct(updateProductCommand *comman | ||
| 281 | if err != nil { | 245 | if err != nil { |
| 282 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 246 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
| 283 | } | 247 | } |
| 248 | + | ||
| 249 | + updateProductCommand.ProductName = material.MaterialName | ||
| 250 | + updateProductCommand.Unit = material.ProductMaterialExt.Unit | ||
| 251 | + updateProductCommand.ProductCategory = material.MaterialCategory.Category | ||
| 284 | data := tool_funs.SimpleStructToMap(updateProductCommand) | 252 | data := tool_funs.SimpleStructToMap(updateProductCommand) |
| 285 | data["orgName"] = org.OrgName | 253 | data["orgName"] = org.OrgName |
| 254 | + | ||
| 286 | if err := product.Update(data); err != nil { | 255 | if err := product.Update(data); err != nil { |
| 287 | return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error()) | 256 | return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error()) |
| 288 | } | 257 | } |
| 1 | package dto | 1 | package dto |
| 2 | 2 | ||
| 3 | -import "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | 3 | +import ( |
| 4 | + "fmt" | ||
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 6 | +) | ||
| 4 | 7 | ||
| 5 | type MaterialGroupDto struct { | 8 | type MaterialGroupDto struct { |
| 6 | // 物料分组ID | 9 | // 物料分组ID |
| @@ -26,3 +29,30 @@ func (d *MaterialGroupDto) LoadDto(m *domain.ProductMaterialGroup, orgId int) *M | @@ -26,3 +29,30 @@ func (d *MaterialGroupDto) LoadDto(m *domain.ProductMaterialGroup, orgId int) *M | ||
| 26 | d.MaterialGroupNumber = m.MaterialGroupNumber | 29 | d.MaterialGroupNumber = m.MaterialGroupNumber |
| 27 | return d | 30 | return d |
| 28 | } | 31 | } |
| 32 | + | ||
| 33 | +func (productMaterialGroup *MaterialGroupDto) PID() string { | ||
| 34 | + return fmt.Sprintf("%d", productMaterialGroup.Pid) | ||
| 35 | +} | ||
| 36 | +func (productMaterialGroup *MaterialGroupDto) ID() string { | ||
| 37 | + return fmt.Sprintf("%d", productMaterialGroup.ProductMaterialGroupId) | ||
| 38 | +} | ||
| 39 | + | ||
| 40 | +type MaterialGroupDtos []*MaterialGroupDto | ||
| 41 | + | ||
| 42 | +func (tree MaterialGroupDtos) Len() int { | ||
| 43 | + return len(tree) | ||
| 44 | +} | ||
| 45 | + | ||
| 46 | +func (tree MaterialGroupDtos) Less(i, j int) bool { | ||
| 47 | + if tree[i].Pid < tree[j].Pid { | ||
| 48 | + return true | ||
| 49 | + } | ||
| 50 | + if tree[i].Pid == tree[j].Pid { | ||
| 51 | + return tree[i].ProductMaterialGroupId < tree[j].ProductMaterialGroupId | ||
| 52 | + } | ||
| 53 | + return false | ||
| 54 | +} | ||
| 55 | + | ||
| 56 | +func (tree MaterialGroupDtos) Swap(i, j int) { | ||
| 57 | + tree[i], tree[j] = tree[j], tree[i] | ||
| 58 | +} |
| 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 SelectorProductMaterialGroupQuery struct { | ||
| 12 | + // 查询偏离量 | ||
| 13 | + //Offset int `cname:"查询偏离量" json:"offset"` | ||
| 14 | + // 查询限制 | ||
| 15 | + //Limit int `cname:"查询限制" json:"limit"` | ||
| 16 | + // options 'tree' 'list' default tree | ||
| 17 | + Style string `json:"style"` | ||
| 18 | + // 当前公司 | ||
| 19 | + CompanyId int `cname:"当前公司" json:"companyId,omitempty" valid:"Required"` | ||
| 20 | + // 页码 | ||
| 21 | + //PageNumber int `cname:"页码" json:"pageNumber,omitempty"` | ||
| 22 | + // 页数 | ||
| 23 | + //PageSize int `cname:"页数" json:"pageSize,omitempty"` | ||
| 24 | +} | ||
| 25 | + | ||
| 26 | +func (cmd *SelectorProductMaterialGroupQuery) Valid(validation *validation.Validation) { | ||
| 27 | + //cmd.Offset, cmd.Limit = domain.Pagination(cmd.PageNumber, cmd.PageSize) | ||
| 28 | + cmd.Style = "tree" | ||
| 29 | +} | ||
| 30 | + | ||
| 31 | +func (cmd *SelectorProductMaterialGroupQuery) ValidateQuery() error { | ||
| 32 | + valid := validation.Validation{} | ||
| 33 | + b, err := valid.Valid(cmd) | ||
| 34 | + if err != nil { | ||
| 35 | + return err | ||
| 36 | + } | ||
| 37 | + if !b { | ||
| 38 | + elem := reflect.TypeOf(cmd).Elem() | ||
| 39 | + for _, validErr := range valid.Errors { | ||
| 40 | + field, isExist := elem.FieldByName(validErr.Field) | ||
| 41 | + if isExist { | ||
| 42 | + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1)) | ||
| 43 | + } else { | ||
| 44 | + return fmt.Errorf(validErr.Message) | ||
| 45 | + } | ||
| 46 | + } | ||
| 47 | + } | ||
| 48 | + return nil | ||
| 49 | +} |
| @@ -12,6 +12,7 @@ import ( | @@ -12,6 +12,7 @@ import ( | ||
| 12 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | 12 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" |
| 13 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService" | 13 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService" |
| 14 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" | 14 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" |
| 15 | + "sort" | ||
| 15 | ) | 16 | ) |
| 16 | 17 | ||
| 17 | // 物料分组服务 | 18 | // 物料分组服务 |
| @@ -38,6 +39,7 @@ func (productMaterialGroupService *ProductMaterialGroupService) CreateProductMat | @@ -38,6 +39,7 @@ func (productMaterialGroupService *ProductMaterialGroupService) CreateProductMat | ||
| 38 | MaterialGroupName: createProductMaterialGroupCommand.MaterialGroupName, | 39 | MaterialGroupName: createProductMaterialGroupCommand.MaterialGroupName, |
| 39 | MaterialGroupNumber: createProductMaterialGroupCommand.MaterialGroupNumber, | 40 | MaterialGroupNumber: createProductMaterialGroupCommand.MaterialGroupNumber, |
| 40 | } | 41 | } |
| 42 | + | ||
| 41 | var productMaterialGroup *domain.ProductMaterialGroup | 43 | var productMaterialGroup *domain.ProductMaterialGroup |
| 42 | materialService, _ := domainService.NewPGMaterialService(transactionContext.(*pgTransaction.TransactionContext)) | 44 | materialService, _ := domainService.NewPGMaterialService(transactionContext.(*pgTransaction.TransactionContext)) |
| 43 | if productMaterialGroup, err = materialService.AddMaterialGroup(operateInfo, newProductMaterialGroup); err != nil { | 45 | if productMaterialGroup, err = materialService.AddMaterialGroup(operateInfo, newProductMaterialGroup); err != nil { |
| @@ -185,7 +187,7 @@ func (productMaterialGroupService *ProductMaterialGroupService) UpdateProductMat | @@ -185,7 +187,7 @@ func (productMaterialGroupService *ProductMaterialGroupService) UpdateProductMat | ||
| 185 | productMaterialGroup := &domain.ProductMaterialGroup{ | 187 | productMaterialGroup := &domain.ProductMaterialGroup{ |
| 186 | ProductMaterialGroupId: cmd.ProductMaterialGroupId, | 188 | ProductMaterialGroupId: cmd.ProductMaterialGroupId, |
| 187 | MaterialGroupName: cmd.MaterialGroupName, | 189 | MaterialGroupName: cmd.MaterialGroupName, |
| 188 | - MaterialGroupNumber: cmd.MaterialGroupNumber, | 190 | + //MaterialGroupNumber: cmd.MaterialGroupNumber, |
| 189 | } | 191 | } |
| 190 | materialService, _ := domainService.NewPGMaterialService(transactionContext.(*pgTransaction.TransactionContext)) | 192 | materialService, _ := domainService.NewPGMaterialService(transactionContext.(*pgTransaction.TransactionContext)) |
| 191 | if productMaterialGroup, err := materialService.UpdateMaterialGroup(operateInfo, productMaterialGroup); err != nil { | 193 | if productMaterialGroup, err := materialService.UpdateMaterialGroup(operateInfo, productMaterialGroup); err != nil { |
| @@ -233,6 +235,48 @@ func (productMaterialGroupService *ProductMaterialGroupService) SearchProductMat | @@ -233,6 +235,48 @@ func (productMaterialGroupService *ProductMaterialGroupService) SearchProductMat | ||
| 233 | return count, results, nil | 235 | return count, results, nil |
| 234 | } | 236 | } |
| 235 | 237 | ||
| 238 | +func (productMaterialGroupService *ProductMaterialGroupService) SelectorProductMaterialGroup(operateInfo *domain.OperateInfo, cmd *query.SelectorProductMaterialGroupQuery) (int64, interface{}, error) { | ||
| 239 | + if err := cmd.ValidateQuery(); err != nil { | ||
| 240 | + return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 241 | + } | ||
| 242 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 243 | + if err != nil { | ||
| 244 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 245 | + } | ||
| 246 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 247 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 248 | + } | ||
| 249 | + defer func() { | ||
| 250 | + transactionContext.RollbackTransaction() | ||
| 251 | + }() | ||
| 252 | + var productMaterialGroupRepository domain.ProductMaterialGroupRepository | ||
| 253 | + productMaterialGroupRepository, _, _ = factory.FastProductMaterialGroup(transactionContext, 0) | ||
| 254 | + queryOptions := utils.ObjectToMap(cmd) | ||
| 255 | + count, productGroups, err := productMaterialGroupRepository.Find(queryOptions) | ||
| 256 | + if err != nil { | ||
| 257 | + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 258 | + } | ||
| 259 | + var results = make([]*dto.MaterialGroupDto, 0) | ||
| 260 | + for i := range productGroups { | ||
| 261 | + newItem := &dto.MaterialGroupDto{} | ||
| 262 | + newItem.LoadDto(productGroups[i], operateInfo.OrgId) | ||
| 263 | + results = append(results, newItem) | ||
| 264 | + } | ||
| 265 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 266 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 267 | + } | ||
| 268 | + if cmd.Style == "tree" { | ||
| 269 | + sort.Stable(dto.MaterialGroupDtos(results)) | ||
| 270 | + nodes := make([]utils.TreeNode, 0) | ||
| 271 | + for i := range results { | ||
| 272 | + nodes = append(nodes, results[i]) | ||
| 273 | + } | ||
| 274 | + tree := utils.NewTree(nodes) | ||
| 275 | + return count, tree.Nodes, nil | ||
| 276 | + } | ||
| 277 | + return count, results, nil | ||
| 278 | +} | ||
| 279 | + | ||
| 236 | func NewProductMaterialGroupService(options map[string]interface{}) *ProductMaterialGroupService { | 280 | func NewProductMaterialGroupService(options map[string]interface{}) *ProductMaterialGroupService { |
| 237 | newProductMaterialGroupService := &ProductMaterialGroupService{} | 281 | newProductMaterialGroupService := &ProductMaterialGroupService{} |
| 238 | return newProductMaterialGroupService | 282 | return newProductMaterialGroupService |
| @@ -2,6 +2,7 @@ package domain | @@ -2,6 +2,7 @@ package domain | ||
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | "fmt" | 4 | "fmt" |
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" | ||
| 5 | "strconv" | 6 | "strconv" |
| 6 | "time" | 7 | "time" |
| 7 | ) | 8 | ) |
| @@ -99,15 +100,18 @@ type ImportProductItem struct { | @@ -99,15 +100,18 @@ type ImportProductItem struct { | ||
| 99 | } | 100 | } |
| 100 | 101 | ||
| 101 | func (item *ImportProductItem) Valid() error { | 102 | func (item *ImportProductItem) Valid() error { |
| 102 | - if len(item.ProductName) == 0 { | ||
| 103 | - return fmt.Errorf("品名不能为空") | ||
| 104 | - } | ||
| 105 | - if len(item.Unit) == 0 { | ||
| 106 | - return fmt.Errorf("规格不能为空") | ||
| 107 | - } | ||
| 108 | - if len(item.ProductCategory) == 0 { | ||
| 109 | - return fmt.Errorf("类别不能为空") | 103 | + if len(item.ProductCode) == 0 { |
| 104 | + return fmt.Errorf("产品编号不能为空") | ||
| 110 | } | 105 | } |
| 106 | + //if len(item.ProductName) == 0 { | ||
| 107 | + // return fmt.Errorf("品名不能为空") | ||
| 108 | + //} | ||
| 109 | + //if len(item.Unit) == 0 { | ||
| 110 | + // return fmt.Errorf("规格不能为空") | ||
| 111 | + //} | ||
| 112 | + //if len(item.ProductCategory) == 0 { | ||
| 113 | + // return fmt.Errorf("类别不能为空") | ||
| 114 | + //} | ||
| 111 | if len(item.UnitWeight) == 0 { | 115 | if len(item.UnitWeight) == 0 { |
| 112 | item.UnitWeight = "0" | 116 | item.UnitWeight = "0" |
| 113 | } | 117 | } |
| @@ -116,3 +120,13 @@ func (item *ImportProductItem) Valid() error { | @@ -116,3 +120,13 @@ func (item *ImportProductItem) Valid() error { | ||
| 116 | } | 120 | } |
| 117 | return nil | 121 | return nil |
| 118 | } | 122 | } |
| 123 | + | ||
| 124 | +type Products []*Product | ||
| 125 | + | ||
| 126 | +func (products Products) ProductCodes() []string { | ||
| 127 | + var result = utils.NewSet() | ||
| 128 | + for _, v := range products { | ||
| 129 | + result.Add(v.ProductCode) | ||
| 130 | + } | ||
| 131 | + return result.KeysStr() | ||
| 132 | +} |
| @@ -59,3 +59,11 @@ func (productMaterials ProductMaterials) ToMapById() map[int]*ProductMaterial { | @@ -59,3 +59,11 @@ func (productMaterials ProductMaterials) ToMapById() map[int]*ProductMaterial { | ||
| 59 | } | 59 | } |
| 60 | return mapProductMaterial | 60 | return mapProductMaterial |
| 61 | } | 61 | } |
| 62 | + | ||
| 63 | +func (productMaterials ProductMaterials) ToMapByNumber() map[string]*ProductMaterial { | ||
| 64 | + var mapProductMaterial = make(map[string]*ProductMaterial, 0) | ||
| 65 | + for _, v := range productMaterials { | ||
| 66 | + mapProductMaterial[v.MaterialNumber] = v | ||
| 67 | + } | ||
| 68 | + return mapProductMaterial | ||
| 69 | +} |
| @@ -2,6 +2,7 @@ package domain | @@ -2,6 +2,7 @@ package domain | ||
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | "fmt" | 4 | "fmt" |
| 5 | + "strconv" | ||
| 5 | "time" | 6 | "time" |
| 6 | ) | 7 | ) |
| 7 | 8 | ||
| @@ -49,6 +50,27 @@ func (productMaterialGroup *ProductMaterialGroup) Update(data map[string]interfa | @@ -49,6 +50,27 @@ func (productMaterialGroup *ProductMaterialGroup) Update(data map[string]interfa | ||
| 49 | return nil | 50 | return nil |
| 50 | } | 51 | } |
| 51 | 52 | ||
| 53 | +func (productMaterialGroup *ProductMaterialGroup) GroupNumberComposeUp(parent *ProductMaterialGroup, latestNumber string, total int) string { | ||
| 54 | + iNumber, err := strconv.ParseInt(latestNumber, 10, 64) | ||
| 55 | + | ||
| 56 | + if err == nil { | ||
| 57 | + iNumber += 1 | ||
| 58 | + return formatFunc(iNumber) | ||
| 59 | + } | ||
| 60 | + if parent != nil { | ||
| 61 | + return parent.MaterialGroupNumber + formatFunc(int64(total+1)) | ||
| 62 | + } | ||
| 63 | + return formatFunc(int64(total + 1)) | ||
| 64 | +} | ||
| 65 | + | ||
| 66 | +func formatFunc(iNumber int64) string { | ||
| 67 | + sNumber := fmt.Sprintf("%d", iNumber) | ||
| 68 | + if len(sNumber)%2 == 1 { | ||
| 69 | + return "0" + sNumber | ||
| 70 | + } | ||
| 71 | + return sNumber | ||
| 72 | +} | ||
| 73 | + | ||
| 52 | /***** 1.实现树 *****/ | 74 | /***** 1.实现树 *****/ |
| 53 | 75 | ||
| 54 | func (productMaterialGroup *ProductMaterialGroup) PID() string { | 76 | func (productMaterialGroup *ProductMaterialGroup) PID() string { |
| 1 | +package dao | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
| 6 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +type ProductMaterialGroupDao struct { | ||
| 10 | + transactionContext *pgTransaction.TransactionContext | ||
| 11 | +} | ||
| 12 | + | ||
| 13 | +func (dao *ProductMaterialGroupDao) CurrentGroupLatestNumber(companyId int, productMaterialGroupId int) (string, int, error) { | ||
| 14 | + m := new(models.ProductMaterialGroup) | ||
| 15 | + var result string | ||
| 16 | + var total int | ||
| 17 | + query := dao.transactionContext.PgTx.Model(m).Where("company_id = ?", companyId) | ||
| 18 | + query.Where("pid = ?", productMaterialGroupId) | ||
| 19 | + query.ColumnExpr("max(material_group_number) number") | ||
| 20 | + query.ColumnExpr("count(material_group_number) total") | ||
| 21 | + query.AllWithDeleted() | ||
| 22 | + err := query.Select(&result, &total) | ||
| 23 | + return result, total, err | ||
| 24 | +} | ||
| 25 | + | ||
| 26 | +func NewProductMaterialGroupDao(transactionContext *pgTransaction.TransactionContext) (*ProductMaterialGroupDao, error) { | ||
| 27 | + if transactionContext == nil { | ||
| 28 | + return nil, fmt.Errorf("transactionContext参数不能为nil") | ||
| 29 | + } else { | ||
| 30 | + return &ProductMaterialGroupDao{ | ||
| 31 | + transactionContext: transactionContext, | ||
| 32 | + }, nil | ||
| 33 | + } | ||
| 34 | +} |
| @@ -6,8 +6,8 @@ import ( | @@ -6,8 +6,8 @@ import ( | ||
| 6 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | 6 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" |
| 7 | "github.com/linmadan/egglib-go/utils/tool_funs" | 7 | "github.com/linmadan/egglib-go/utils/tool_funs" |
| 8 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | 8 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" |
| 9 | - "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/redis" | ||
| 10 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository" | 9 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository" |
| 10 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" | ||
| 11 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" | 11 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" |
| 12 | "strconv" | 12 | "strconv" |
| 13 | "time" | 13 | "time" |
| @@ -36,10 +36,22 @@ func (ptr *PGBatchAddProductService) BatchAddProduct(opt *domain.OperateInfo, li | @@ -36,10 +36,22 @@ func (ptr *PGBatchAddProductService) BatchAddProduct(opt *domain.OperateInfo, li | ||
| 36 | if err != nil { | 36 | if err != nil { |
| 37 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 37 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
| 38 | } | 38 | } |
| 39 | - | ||
| 40 | - var generator = redis.NewProductCodeCache(opt.CompanyId) | 39 | + var materials domain.ProductMaterials |
| 40 | + if materials, err = ptr.GetProductMaterialByImportItems(opt.CompanyId, list); err != nil { | ||
| 41 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 42 | + } | ||
| 43 | + mapMaterials := materials.ToMapByNumber() | ||
| 41 | for i := range list { | 44 | for i := range list { |
| 42 | item := list[i] | 45 | item := list[i] |
| 46 | + if v, ok := mapMaterials[item.ProductCode]; !ok { | ||
| 47 | + item.FailReason = "导入的产品编号不存在" | ||
| 48 | + failRows = append(failRows, item) | ||
| 49 | + continue | ||
| 50 | + } else { | ||
| 51 | + item.Unit = v.ProductMaterialExt.Unit | ||
| 52 | + item.ProductName = v.MaterialName | ||
| 53 | + item.ProductCategory = v.MaterialCategory.Category | ||
| 54 | + } | ||
| 43 | if err := item.Valid(); err != nil { | 55 | if err := item.Valid(); err != nil { |
| 44 | item.FailReason = err.Error() | 56 | item.FailReason = err.Error() |
| 45 | failRows = append(failRows, item) | 57 | failRows = append(failRows, item) |
| @@ -69,14 +81,6 @@ func (ptr *PGBatchAddProductService) BatchAddProduct(opt *domain.OperateInfo, li | @@ -69,14 +81,6 @@ func (ptr *PGBatchAddProductService) BatchAddProduct(opt *domain.OperateInfo, li | ||
| 69 | continue | 81 | continue |
| 70 | } | 82 | } |
| 71 | } | 83 | } |
| 72 | - if len(newItem.ProductCode) == 0 { | ||
| 73 | - code, err := redis.GenCode(generator) | ||
| 74 | - if err != nil { | ||
| 75 | - log.Logger.Error(err.Error()) | ||
| 76 | - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "服务器异常") | ||
| 77 | - } | ||
| 78 | - newItem.ProductCode = code | ||
| 79 | - } | ||
| 80 | 84 | ||
| 81 | if _, ok := mapProduct[newItem.ProductCode]; !ok { | 85 | if _, ok := mapProduct[newItem.ProductCode]; !ok { |
| 82 | mapProduct[newItem.ProductCode] = newItem | 86 | mapProduct[newItem.ProductCode] = newItem |
| @@ -105,6 +109,28 @@ func (ptr *PGBatchAddProductService) updateProduct(opt *domain.OperateInfo, item | @@ -105,6 +109,28 @@ func (ptr *PGBatchAddProductService) updateProduct(opt *domain.OperateInfo, item | ||
| 105 | return nil | 109 | return nil |
| 106 | } | 110 | } |
| 107 | 111 | ||
| 112 | +func (ptr *PGBatchAddProductService) GetProductMaterialByProductCodes(companyId int, productCodes []string) ([]*domain.ProductMaterial, error) { | ||
| 113 | + productMaterialRepository, _ := repository.NewProductMaterialRepository(ptr.transactionContext) | ||
| 114 | + _, productMaterials, err := productMaterialRepository.Find(map[string]interface{}{"companyId": companyId, "materialNumbers": productCodes}) | ||
| 115 | + return productMaterials, err | ||
| 116 | +} | ||
| 117 | + | ||
| 118 | +func (ptr *PGBatchAddProductService) GetProductMaterialByImportItems(companyId int, list []*domain.ImportProductItem) ([]*domain.ProductMaterial, error) { | ||
| 119 | + productCodes := ptr.GetProductCodesByImportItems(list) | ||
| 120 | + if len(productCodes) == 0 { | ||
| 121 | + return []*domain.ProductMaterial{}, nil | ||
| 122 | + } | ||
| 123 | + return ptr.GetProductMaterialByProductCodes(companyId, productCodes) | ||
| 124 | +} | ||
| 125 | + | ||
| 126 | +func (ptr *PGBatchAddProductService) GetProductCodesByImportItems(list []*domain.ImportProductItem) []string { | ||
| 127 | + var result = utils.NewSet() | ||
| 128 | + for _, v := range list { | ||
| 129 | + result.Add(v.ProductCode) | ||
| 130 | + } | ||
| 131 | + return result.KeysStr() | ||
| 132 | +} | ||
| 133 | + | ||
| 108 | func NewPGBatchAddProductService(transactionContext *pgTransaction.TransactionContext) (*PGBatchAddProductService, error) { | 134 | func NewPGBatchAddProductService(transactionContext *pgTransaction.TransactionContext) (*PGBatchAddProductService, error) { |
| 109 | if transactionContext == nil { | 135 | if transactionContext == nil { |
| 110 | return nil, fmt.Errorf("transactionContext参数不能为nil") | 136 | return nil, fmt.Errorf("transactionContext参数不能为nil") |
| @@ -123,10 +123,10 @@ func (ptr *PGCommonStatisticsService) HourProductiveStatistics(queryOptions map[ | @@ -123,10 +123,10 @@ func (ptr *PGCommonStatisticsService) HourProductiveStatistics(queryOptions map[ | ||
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | type HourProductiveStatisticsRequest struct { | 125 | type HourProductiveStatisticsRequest struct { |
| 126 | - CompanyId int `json:"companyId" valid:"Required"` | ||
| 127 | - OrgId int `json:"orgId" valid:"Required"` | ||
| 128 | - WorkshopId int `json:"workshopId" valid:"Required"` | ||
| 129 | - Date time.Time `json:"date"` | 126 | + CompanyId int `json:"companyId" valid:"Required"` |
| 127 | + OrgId int `json:"orgId" valid:"Required"` | ||
| 128 | + WorkshopId int `json:"workshopId" valid:"Required"` | ||
| 129 | + Date utils.TimeString `json:"date"` | ||
| 130 | } | 130 | } |
| 131 | 131 | ||
| 132 | func NewXYData(xData []string, values interface{}) interface{} { | 132 | func NewXYData(xData []string, values interface{}) interface{} { |
| @@ -154,8 +154,8 @@ func (ptr *PGCommonStatisticsService) DailyProductiveStatistics(queryOptions map | @@ -154,8 +154,8 @@ func (ptr *PGCommonStatisticsService) DailyProductiveStatistics(queryOptions map | ||
| 154 | Total float64 `json:"total"` | 154 | Total float64 `json:"total"` |
| 155 | } | 155 | } |
| 156 | var date = time.Now() | 156 | var date = time.Now() |
| 157 | - if !xtime.IsZero(request.Date) { | ||
| 158 | - date = request.Date | 157 | + if !xtime.IsZero(time.Time(request.Date)) { |
| 158 | + date = time.Time(request.Date) | ||
| 159 | } | 159 | } |
| 160 | workshop, err := workshopRepository.FindOne(map[string]interface{}{"workshopId": request.WorkshopId}) | 160 | workshop, err := workshopRepository.FindOne(map[string]interface{}{"workshopId": request.WorkshopId}) |
| 161 | if err != nil || workshop == nil { | 161 | if err != nil || workshop == nil { |
| @@ -213,8 +213,8 @@ func (ptr *PGCommonStatisticsService) ProportionOfSecondLevelStatistics(queryOpt | @@ -213,8 +213,8 @@ func (ptr *PGCommonStatisticsService) ProportionOfSecondLevelStatistics(queryOpt | ||
| 213 | } | 213 | } |
| 214 | productRecordDao, _ := dao.NewProductRecordDao(ptr.transactionContext) | 214 | productRecordDao, _ := dao.NewProductRecordDao(ptr.transactionContext) |
| 215 | var date = time.Now() | 215 | var date = time.Now() |
| 216 | - if !xtime.IsZero(request.Date) { | ||
| 217 | - date = request.Date | 216 | + if !xtime.IsZero(time.Time(request.Date)) { |
| 217 | + date = time.Time(request.Date) | ||
| 218 | } | 218 | } |
| 219 | var input = []struct { | 219 | var input = []struct { |
| 220 | name string | 220 | name string |
| @@ -262,8 +262,8 @@ func (ptr *PGCommonStatisticsService) WorkshopProductionEfficiencyStatistics(que | @@ -262,8 +262,8 @@ func (ptr *PGCommonStatisticsService) WorkshopProductionEfficiencyStatistics(que | ||
| 262 | } | 262 | } |
| 263 | productRecordDao, _ := dao.NewDeviceDailyRunningRecordDao(ptr.transactionContext) | 263 | productRecordDao, _ := dao.NewDeviceDailyRunningRecordDao(ptr.transactionContext) |
| 264 | var date = time.Now() | 264 | var date = time.Now() |
| 265 | - if !xtime.IsZero(request.Date) { | ||
| 266 | - date = request.Date | 265 | + if !xtime.IsZero(time.Time(request.Date)) { |
| 266 | + date = time.Time(request.Date) | ||
| 267 | } | 267 | } |
| 268 | var input = []struct { | 268 | var input = []struct { |
| 269 | name string | 269 | name string |
| @@ -4,6 +4,7 @@ import ( | @@ -4,6 +4,7 @@ import ( | ||
| 4 | "fmt" | 4 | "fmt" |
| 5 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | 5 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" |
| 6 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | 6 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" |
| 7 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao" | ||
| 7 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository" | 8 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository" |
| 8 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" | 9 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" |
| 9 | "sort" | 10 | "sort" |
| @@ -66,6 +67,10 @@ func (ptr *PGMaterialService) AddMaterialGroup(opt *domain.OperateInfo, item *do | @@ -66,6 +67,10 @@ func (ptr *PGMaterialService) AddMaterialGroup(opt *domain.OperateInfo, item *do | ||
| 66 | parent *domain.ProductMaterialGroup | 67 | parent *domain.ProductMaterialGroup |
| 67 | newProductMaterialGroup *domain.ProductMaterialGroup | 68 | newProductMaterialGroup *domain.ProductMaterialGroup |
| 68 | productMaterialGroupRepository, _ = repository.NewProductMaterialGroupRepository(ptr.transactionContext) | 69 | productMaterialGroupRepository, _ = repository.NewProductMaterialGroupRepository(ptr.transactionContext) |
| 70 | + | ||
| 71 | + productMaterialGroupDao *dao.ProductMaterialGroupDao | ||
| 72 | + latestNumber string | ||
| 73 | + total int | ||
| 69 | ) | 74 | ) |
| 70 | if user, err = NewUserService().User(opt.UserId); err != nil { | 75 | if user, err = NewUserService().User(opt.UserId); err != nil { |
| 71 | return nil, err | 76 | return nil, err |
| @@ -81,6 +86,12 @@ func (ptr *PGMaterialService) AddMaterialGroup(opt *domain.OperateInfo, item *do | @@ -81,6 +86,12 @@ func (ptr *PGMaterialService) AddMaterialGroup(opt *domain.OperateInfo, item *do | ||
| 81 | if newProductMaterialGroup, err = productMaterialGroupRepository.FindOne(map[string]interface{}{"companyId": opt.CompanyId, "materialGroupNumber": item.MaterialGroupNumber}); err == nil || newProductMaterialGroup != nil { | 86 | if newProductMaterialGroup, err = productMaterialGroupRepository.FindOne(map[string]interface{}{"companyId": opt.CompanyId, "materialGroupNumber": item.MaterialGroupNumber}); err == nil || newProductMaterialGroup != nil { |
| 82 | return nil, fmt.Errorf("物料分组编码已存在") | 87 | return nil, fmt.Errorf("物料分组编码已存在") |
| 83 | } | 88 | } |
| 89 | + productMaterialGroupDao, _ = dao.NewProductMaterialGroupDao(ptr.transactionContext) | ||
| 90 | + latestNumber, total, err = productMaterialGroupDao.CurrentGroupLatestNumber(opt.CompanyId, item.Pid) | ||
| 91 | + if err != nil { | ||
| 92 | + return nil, err | ||
| 93 | + } | ||
| 94 | + | ||
| 84 | newProductMaterialGroup = &domain.ProductMaterialGroup{ | 95 | newProductMaterialGroup = &domain.ProductMaterialGroup{ |
| 85 | CompanyId: opt.CompanyId, | 96 | CompanyId: opt.CompanyId, |
| 86 | OrgId: opt.OrgId, | 97 | OrgId: opt.OrgId, |
| @@ -92,16 +103,17 @@ func (ptr *PGMaterialService) AddMaterialGroup(opt *domain.OperateInfo, item *do | @@ -92,16 +103,17 @@ func (ptr *PGMaterialService) AddMaterialGroup(opt *domain.OperateInfo, item *do | ||
| 92 | UpdatedAt: time.Now(), | 103 | UpdatedAt: time.Now(), |
| 93 | Ext: domain.NewExt(org.OrgName).WithOperator(user), | 104 | Ext: domain.NewExt(org.OrgName).WithOperator(user), |
| 94 | } | 105 | } |
| 106 | + newProductMaterialGroup.MaterialGroupNumber = newProductMaterialGroup.GroupNumberComposeUp(parent, latestNumber, total) | ||
| 95 | newProductMaterialGroup, err = productMaterialGroupRepository.Save(newProductMaterialGroup) | 107 | newProductMaterialGroup, err = productMaterialGroupRepository.Save(newProductMaterialGroup) |
| 96 | return newProductMaterialGroup, err | 108 | return newProductMaterialGroup, err |
| 97 | } | 109 | } |
| 98 | 110 | ||
| 99 | func (ptr *PGMaterialService) UpdateMaterialGroup(opt *domain.OperateInfo, item *domain.ProductMaterialGroup) (*domain.ProductMaterialGroup, error) { | 111 | func (ptr *PGMaterialService) UpdateMaterialGroup(opt *domain.OperateInfo, item *domain.ProductMaterialGroup) (*domain.ProductMaterialGroup, error) { |
| 100 | var ( | 112 | var ( |
| 101 | - user *domain.User | ||
| 102 | - org *domain.Org | ||
| 103 | - err error | ||
| 104 | - parent *domain.ProductMaterialGroup | 113 | + user *domain.User |
| 114 | + org *domain.Org | ||
| 115 | + err error | ||
| 116 | + //parent *domain.ProductMaterialGroup | ||
| 105 | productMaterialGroup *domain.ProductMaterialGroup | 117 | productMaterialGroup *domain.ProductMaterialGroup |
| 106 | productMaterialGroupRepository, _ = repository.NewProductMaterialGroupRepository(ptr.transactionContext) | 118 | productMaterialGroupRepository, _ = repository.NewProductMaterialGroupRepository(ptr.transactionContext) |
| 107 | ) | 119 | ) |
| @@ -111,24 +123,25 @@ func (ptr *PGMaterialService) UpdateMaterialGroup(opt *domain.OperateInfo, item | @@ -111,24 +123,25 @@ func (ptr *PGMaterialService) UpdateMaterialGroup(opt *domain.OperateInfo, item | ||
| 111 | if org, err = NewUserService().Organization(opt.OrgId); err != nil { | 123 | if org, err = NewUserService().Organization(opt.OrgId); err != nil { |
| 112 | return nil, err | 124 | return nil, err |
| 113 | } | 125 | } |
| 114 | - if item.ProductMaterialGroupId == item.Pid { | ||
| 115 | - return nil, fmt.Errorf("当前物料分组不能做为自己上级") | ||
| 116 | - } | 126 | + //if item.ProductMaterialGroupId == item.Pid { |
| 127 | + // return nil, fmt.Errorf("当前物料分组不能做为自己上级") | ||
| 128 | + //} | ||
| 117 | if productMaterialGroup, err = productMaterialGroupRepository.FindOne(map[string]interface{}{"companyId": opt.CompanyId, "productMaterialGroupId": item.ProductMaterialGroupId}); err != nil || productMaterialGroup == nil { | 129 | if productMaterialGroup, err = productMaterialGroupRepository.FindOne(map[string]interface{}{"companyId": opt.CompanyId, "productMaterialGroupId": item.ProductMaterialGroupId}); err != nil || productMaterialGroup == nil { |
| 118 | return nil, fmt.Errorf("物料分组不存在") | 130 | return nil, fmt.Errorf("物料分组不存在") |
| 119 | } | 131 | } |
| 120 | - if item.Pid != productMaterialGroup.ProductMaterialGroupId && item.Pid != 0 { | ||
| 121 | - if parent, err = productMaterialGroupRepository.FindOne(map[string]interface{}{"companyId": opt.CompanyId, "productMaterialGroupId": item.Pid}); err != nil || parent == nil { | ||
| 122 | - return nil, fmt.Errorf("上级物料分组不存在") | ||
| 123 | - } | ||
| 124 | - } | ||
| 125 | - if productMaterialGroup.MaterialGroupNumber != item.MaterialGroupNumber { | ||
| 126 | - if group, err := productMaterialGroupRepository.FindOne(map[string]interface{}{"companyId": opt.CompanyId, "materialGroupNumber": item.MaterialGroupNumber}); err == nil || group != nil { | ||
| 127 | - return nil, fmt.Errorf("物料分组编码已存在") | ||
| 128 | - } | ||
| 129 | - } | ||
| 130 | 132 | ||
| 131 | - productMaterialGroup.MaterialGroupNumber = item.MaterialGroupNumber | 133 | + //if item.Pid != productMaterialGroup.ProductMaterialGroupId && item.Pid != 0 { |
| 134 | + // if parent, err = productMaterialGroupRepository.FindOne(map[string]interface{}{"companyId": opt.CompanyId, "productMaterialGroupId": item.Pid}); err != nil || parent == nil { | ||
| 135 | + // return nil, fmt.Errorf("上级物料分组不存在") | ||
| 136 | + // } | ||
| 137 | + //} | ||
| 138 | + //if productMaterialGroup.MaterialGroupNumber != item.MaterialGroupNumber { | ||
| 139 | + // if group, err := productMaterialGroupRepository.FindOne(map[string]interface{}{"companyId": opt.CompanyId, "materialGroupNumber": item.MaterialGroupNumber}); err == nil || group != nil { | ||
| 140 | + // return nil, fmt.Errorf("物料分组编码已存在") | ||
| 141 | + // } | ||
| 142 | + //} | ||
| 143 | + //productMaterialGroup.MaterialGroupNumber = item.MaterialGroupNumber | ||
| 144 | + | ||
| 132 | productMaterialGroup.MaterialGroupName = item.MaterialGroupName | 145 | productMaterialGroup.MaterialGroupName = item.MaterialGroupName |
| 133 | productMaterialGroup.UpdatedAt = item.UpdatedAt | 146 | productMaterialGroup.UpdatedAt = item.UpdatedAt |
| 134 | productMaterialGroup.Ext = domain.NewExt(org.OrgName).WithOperator(user) | 147 | productMaterialGroup.Ext = domain.NewExt(org.OrgName).WithOperator(user) |
| @@ -166,6 +166,9 @@ func (repository *ProductMaterialRepository) Find(queryOptions map[string]interf | @@ -166,6 +166,9 @@ func (repository *ProductMaterialRepository) Find(queryOptions map[string]interf | ||
| 166 | if v, ok := queryOptions["materialCategory"]; ok && v != "" { | 166 | if v, ok := queryOptions["materialCategory"]; ok && v != "" { |
| 167 | query.Where(fmt.Sprintf(`material_category->>'category' like '%%%v%%'`, v)) | 167 | query.Where(fmt.Sprintf(`material_category->>'category' like '%%%v%%'`, v)) |
| 168 | } | 168 | } |
| 169 | + if v, ok := queryOptions["materialNumbers"]; ok && len(v.([]string)) > 0 { | ||
| 170 | + query.Where("material_number in (?)", pg.In(v)) | ||
| 171 | + } | ||
| 169 | query.SetOffsetAndLimit(domain.MaxQueryRow) | 172 | query.SetOffsetAndLimit(domain.MaxQueryRow) |
| 170 | query.SetOrderDirect("product_material_id", "DESC") | 173 | query.SetOrderDirect("product_material_id", "DESC") |
| 171 | if count, err := query.SelectAndCount(); err != nil { | 174 | if count, err := query.SelectAndCount(); err != nil { |
| 1 | package utils | 1 | package utils |
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | + "github.com/linmadan/egglib-go/utils/xtime" | ||
| 4 | "strconv" | 5 | "strconv" |
| 5 | "time" | 6 | "time" |
| 6 | ) | 7 | ) |
| @@ -103,3 +104,32 @@ func TimeBeforeEqual(t1, t2 time.Time) bool { | @@ -103,3 +104,32 @@ func TimeBeforeEqual(t1, t2 time.Time) bool { | ||
| 103 | } | 104 | } |
| 104 | return false | 105 | return false |
| 105 | } | 106 | } |
| 107 | + | ||
| 108 | +type TimeString time.Time | ||
| 109 | + | ||
| 110 | +func (timeString *TimeString) UnmarshalJSON(data []byte) error { | ||
| 111 | + if len(data) == 2 { | ||
| 112 | + return nil | ||
| 113 | + } | ||
| 114 | + t, err := xtime.Parse(string(data[1 : len(data)-1])) | ||
| 115 | + if err != nil { | ||
| 116 | + return err | ||
| 117 | + } | ||
| 118 | + *timeString = TimeString(t) | ||
| 119 | + return nil | ||
| 120 | +} | ||
| 121 | + | ||
| 122 | +func (timeString TimeString) MarshalJSON() ([]byte, error) { | ||
| 123 | + if xtime.IsZero(time.Time(timeString)) { | ||
| 124 | + return []byte(`""`), nil | ||
| 125 | + } | ||
| 126 | + b := make([]byte, 0) | ||
| 127 | + b = append(b, '"') | ||
| 128 | + b = time.Time(timeString).AppendFormat(b, time.RFC3339) | ||
| 129 | + b = append(b, '"') | ||
| 130 | + return b, nil | ||
| 131 | +} | ||
| 132 | + | ||
| 133 | +func (timeString TimeString) Time() time.Time { | ||
| 134 | + return time.Time(timeString) | ||
| 135 | +} |
| @@ -19,7 +19,7 @@ func (controller *ProductController) CreateProduct() { | @@ -19,7 +19,7 @@ func (controller *ProductController) CreateProduct() { | ||
| 19 | op := ParseOperateInfo(controller.BaseController) | 19 | op := ParseOperateInfo(controller.BaseController) |
| 20 | createProductCommand.CompanyId = op.CompanyId | 20 | createProductCommand.CompanyId = op.CompanyId |
| 21 | createProductCommand.OrgId = op.OrgId | 21 | createProductCommand.OrgId = op.OrgId |
| 22 | - data, err := productService.CreateProduct(createProductCommand) | 22 | + data, err := productService.CreateProduct(ParseOperateInfo(controller.BaseController), createProductCommand) |
| 23 | controller.Response(data, err) | 23 | controller.Response(data, err) |
| 24 | } | 24 | } |
| 25 | 25 | ||
| @@ -29,7 +29,7 @@ func (controller *ProductController) UpdateProduct() { | @@ -29,7 +29,7 @@ func (controller *ProductController) UpdateProduct() { | ||
| 29 | Must(controller.Unmarshal(updateProductCommand)) | 29 | Must(controller.Unmarshal(updateProductCommand)) |
| 30 | productId, _ := controller.GetInt(":productId") | 30 | productId, _ := controller.GetInt(":productId") |
| 31 | updateProductCommand.ProductId = productId | 31 | updateProductCommand.ProductId = productId |
| 32 | - data, err := productService.UpdateProduct(updateProductCommand) | 32 | + data, err := productService.UpdateProduct(ParseOperateInfo(controller.BaseController), updateProductCommand) |
| 33 | controller.Response(data, err) | 33 | controller.Response(data, err) |
| 34 | } | 34 | } |
| 35 | 35 |
| @@ -78,14 +78,10 @@ func (controller *ProductMaterialGroupController) SearchProductMaterialGroup() { | @@ -78,14 +78,10 @@ func (controller *ProductMaterialGroupController) SearchProductMaterialGroup() { | ||
| 78 | 78 | ||
| 79 | func (controller *ProductMaterialGroupController) SelectorProductMaterialGroup() { | 79 | func (controller *ProductMaterialGroupController) SelectorProductMaterialGroup() { |
| 80 | productMaterialGroupService := service.NewProductMaterialGroupService(nil) | 80 | productMaterialGroupService := service.NewProductMaterialGroupService(nil) |
| 81 | - cmd := &query.SearchProductMaterialGroupQuery{} | ||
| 82 | - offset, _ := controller.GetInt("offset") | ||
| 83 | - cmd.Offset = offset | ||
| 84 | - limit, _ := controller.GetInt("limit") | ||
| 85 | - cmd.Limit = limit | 81 | + cmd := &query.SelectorProductMaterialGroupQuery{} |
| 86 | operateInfo := ParseOperateInfo(controller.BaseController) | 82 | operateInfo := ParseOperateInfo(controller.BaseController) |
| 87 | cmd.CompanyId = operateInfo.CompanyId | 83 | cmd.CompanyId = operateInfo.CompanyId |
| 88 | - count, data, err := productMaterialGroupService.SearchProductMaterialGroup(ParseOperateInfo(controller.BaseController), cmd) | 84 | + count, data, err := productMaterialGroupService.SelectorProductMaterialGroup(ParseOperateInfo(controller.BaseController), cmd) |
| 89 | controller.Response(map[string]interface{}{ | 85 | controller.Response(map[string]interface{}{ |
| 90 | "groups": data, | 86 | "groups": data, |
| 91 | "count": count, | 87 | "count": count, |
-
请 注册 或 登录 后发表评论