作者 yangfu

refactor: 计划管理、工位

@@ -11,6 +11,8 @@ type ProductGroupEmployeesDto struct { @@ -11,6 +11,8 @@ type ProductGroupEmployeesDto struct {
11 UserId int `json:"userId,omitempty"` 11 UserId int `json:"userId,omitempty"`
12 // 用户姓名 12 // 用户姓名
13 UserName string `json:"userName,omitempty"` 13 UserName string `json:"userName,omitempty"`
  14 + // 生产小组ID
  15 + ProductGroupId int `json:"productGroupId,omitempty"`
14 // 班组名称 16 // 班组名称
15 GroupName string `json:"groupName,omitempty"` 17 GroupName string `json:"groupName,omitempty"`
16 // 上班班次 1:全天 2:白班 4:中班 8:夜班 18 // 上班班次 1:全天 2:白班 4:中班 8:夜班
@@ -34,6 +36,7 @@ func NewGroupEmployee(group *domain.ProductGroup, u *domain.User) *ProductGroupE @@ -34,6 +36,7 @@ func NewGroupEmployee(group *domain.ProductGroup, u *domain.User) *ProductGroupE
34 item := &ProductGroupEmployeesDto{} 36 item := &ProductGroupEmployeesDto{}
35 item.UserId = u.UserId 37 item.UserId = u.UserId
36 item.UserName = u.UserName 38 item.UserName = u.UserName
  39 + item.ProductGroupId = group.ProductGroupId
37 item.GroupName = group.GroupName 40 item.GroupName = group.GroupName
38 workOns := domain.WorkOnDescription(group.WorkOn) 41 workOns := domain.WorkOnDescription(group.WorkOn)
39 item.WorkOnDescription = strings.Join(workOns, ",") 42 item.WorkOnDescription = strings.Join(workOns, ",")
@@ -9,8 +9,26 @@ import ( @@ -9,8 +9,26 @@ import (
9 ) 9 )
10 10
11 type ReceiveMaterialCommand struct { 11 type ReceiveMaterialCommand struct {
  12 + // 企业id
  13 + CompanyId int `cname:"企业id" json:"companyId" valid:"Required"`
  14 + // 组织ID
  15 + OrgId int `cname:"组织ID" json:"orgId" valid:"Required"`
12 // 生产计划ID 16 // 生产计划ID
13 - ProductPlanId int `cname:"生产计划ID" json:"productPlanId" valid:"Required"` 17 + ProductPlanId int `cname:"生产计划" json:"productPlanId" valid:"Required"`
  18 + // 车间ID
  19 + WorkshopId int `cname:"车间" json:"workshopId" valid:"Required"`
  20 + // 生产线ID
  21 + LineId int `cname:"生产线" json:"lineId" valid:"Required"`
  22 + // 工段ID
  23 + SectionId int `cname:"工段" json:"sectionId" valid:"Required"`
  24 + // 生产小组ID
  25 + ProductGroupId int `cname:"生产小组" json:"productGroupId" valid:"Required"`
  26 + // 员工Id 用户唯一标识
  27 + EmployeeId int `cname:"员工" json:"employeeId" valid:"Required"`
  28 + // 产品ID
  29 + ProductId int `cname:"产品" json:"productId" valid:"Required"`
  30 + // 重量
  31 + Weigh float64 `cname:"重量" json:"weigh" valid:"Required"`
14 } 32 }
15 33
16 func (receiveMaterialCommand *ReceiveMaterialCommand) Valid(validation *validation.Validation) { 34 func (receiveMaterialCommand *ReceiveMaterialCommand) Valid(validation *validation.Validation) {
@@ -9,8 +9,26 @@ import ( @@ -9,8 +9,26 @@ import (
9 ) 9 )
10 10
11 type ReturnMaterialCommand struct { 11 type ReturnMaterialCommand struct {
  12 + // 企业id
  13 + CompanyId int `cname:"企业id" json:"companyId" valid:"Required"`
  14 + // 组织ID
  15 + OrgId int `cname:"组织ID" json:"orgId" valid:"Required"`
12 // 生产计划ID 16 // 生产计划ID
13 - ProductPlanId int `cname:"生产计划ID" json:"productPlanId" valid:"Required"` 17 + ProductPlanId int `cname:"生产计划" json:"productPlanId" valid:"Required"`
  18 + // 车间ID
  19 + WorkshopId int `cname:"车间" json:"workshopId" valid:"Required"`
  20 + // 生产线ID
  21 + LineId int `cname:"生产线" json:"lineId" valid:"Required"`
  22 + // 工段ID
  23 + SectionId int `cname:"工段" json:"sectionId" valid:"Required"`
  24 + // 生产小组ID
  25 + ProductGroupId int `cname:"生产小组" json:"productGroupId" valid:"Required"`
  26 + // 员工Id 用户唯一标识
  27 + EmployeeId int `cname:"员工" json:"employeeId" valid:"Required"`
  28 + // 产品ID
  29 + ProductId int `cname:"产品" json:"productId" valid:"Required"`
  30 + // 重量
  31 + Weigh float64 `cname:"重量" json:"weigh" valid:"Required"`
14 } 32 }
15 33
16 func (returnMaterialCommand *ReturnMaterialCommand) Valid(validation *validation.Validation) { 34 func (returnMaterialCommand *ReturnMaterialCommand) Valid(validation *validation.Validation) {
@@ -2,6 +2,18 @@ package domain @@ -2,6 +2,18 @@ package domain
2 2
3 import "time" 3 import "time"
4 4
  5 +const (
  6 + RecordTypeReceiveMaterial = 1 // 领料
  7 + RecordTypeReturnMaterial = 2 // 退料
  8 + RecordTypeWeigh = 4 // 称重
  9 + RecordTypeSecondLevelWeigh = 8 // 二级品称重
  10 +)
  11 +
  12 +const (
  13 + ProductRecordNotApprove = 1 // 未审核
  14 + ProductRecordApproved = 2 // 已审核
  15 +)
  16 +
5 // 生产记录 17 // 生产记录
6 type ProductRecord struct { 18 type ProductRecord struct {
7 // 生产记录ID 19 // 生产记录ID
@@ -3,14 +3,28 @@ package domain @@ -3,14 +3,28 @@ package domain
3 // 生产记录信息 (物料、批次、产能(产能、领料、退料、二级品)) 3 // 生产记录信息 (物料、批次、产能(产能、领料、退料、二级品))
4 type ProductRecordInfo struct { 4 type ProductRecordInfo struct {
5 // 产能 5 // 产能
6 - ProductWeigh int `json:"productWeigh,omitempty"` 6 + Weigh float64 `json:"weigh,omitempty"`
  7 + // 产能 - 审核前
  8 + WeighBefore float64 `json:"weighBefore,omitempty"`
  9 + // 产能-审核后
  10 + WeighAfter float64 `json:"weighAfter,omitempty"`
  11 + // 审核状态 1:未审核 2:已审核
  12 + ApproveStatus int64 `json:"approveStatus"`
  13 + // 审核时间
  14 + ApproveAt int64 `json:"approveAt"`
7 // 物料信息 15 // 物料信息
8 Material *UnitConversion `json:"material,omitempty"` 16 Material *UnitConversion `json:"material,omitempty"`
9 // 生产计划信息(批次) 17 // 生产计划信息(批次)
10 ProductPlan *ProductPlan `json:"productPlan,omitempty"` 18 ProductPlan *ProductPlan `json:"productPlan,omitempty"`
  19 + // 单位换算ID
  20 + UnitConversionId int `json:"unitConversionId,omitempty"`
11 21
12 // 生产计划ID 22 // 生产计划ID
13 ProductPlanId int `json:"productPlanId,omitempty"` 23 ProductPlanId int `json:"productPlanId,omitempty"`
  24 + // 计划的产品名称
  25 + PlanProductName string `json:"planProductName,omitempty"`
  26 + // 批号
  27 + BatchNumber string `json:"batchNumber,omitempty"`
14 28
15 // 生产小组ID 29 // 生产小组ID
16 ProductGroupId int `json:"productGroupId,omitempty"` 30 ProductGroupId int `json:"productGroupId,omitempty"`
  1 +package domainService
  2 +
  3 +import (
  4 + "fmt"
  5 + "github.com/linmadan/egglib-go/core/application"
  6 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
  10 + "time"
  11 +)
  12 +
  13 +type PGProductRecordService struct {
  14 + transactionContext *pgTransaction.TransactionContext
  15 +}
  16 +
  17 +type SubmitOptions struct {
  18 + // 企业id
  19 + CompanyId int `cname:"企业id" json:"companyId" valid:"Required"`
  20 + // 组织ID
  21 + OrgId int `cname:"组织ID" json:"orgId" valid:"Required"`
  22 + // 生产计划ID
  23 + ProductPlanId int `cname:"生产计划" json:"productPlanId" valid:"Required"`
  24 + // 车间ID
  25 + WorkshopId int `cname:"车间" json:"workshopId" valid:"Required"`
  26 + // 生产线ID
  27 + LineId int `cname:"生产线" json:"lineId" valid:"Required"`
  28 + // 工段ID
  29 + SectionId int `cname:"工段" json:"sectionId" valid:"Required"`
  30 + // 生产小组ID
  31 + ProductGroupId int `cname:"生产小组" json:"productGroupId" valid:"Required"`
  32 + // 员工Id 用户唯一标识
  33 + EmployeeId int `cname:"员工" json:"employeeId" valid:"Required"`
  34 + // 物料ID
  35 + UnitConversionId int `cname:"物料ID" json:"unitConversionId" valid:"Required"`
  36 + // 重量
  37 + Weigh float64 `cname:"重量" json:"weigh" valid:"Required"`
  38 +}
  39 +
  40 +// SubmitProductRecord 提交生产记录
  41 +func (ptr *PGProductRecordService) SubmitProductRecord(productRecordType int, queryOptions map[string]interface{}) (interface{}, error) {
  42 + var request = &SubmitOptions{}
  43 + if err := utils.LoadQueryObject(queryOptions, &request); err != nil {
  44 + return nil, err
  45 + }
  46 +
  47 + productPlanRepository, _ := repository.NewProductPlanRepository(ptr.transactionContext)
  48 + //productGroupRepository,_:= repository.NewProductGroupRepository(ptr.transactionContext)
  49 + workshopRepository, _ := repository.NewWorkshopRepository(ptr.transactionContext)
  50 + unitConversionRepository, _ := repository.NewUnitConversionRepository(ptr.transactionContext)
  51 + productRecordRepository, _ := repository.NewProductRecordRepository(ptr.transactionContext)
  52 +
  53 + // 1.初始化
  54 + var (
  55 + plan *domain.ProductPlan
  56 + //group *domain.ProductGroup
  57 + workshop *domain.Workshop
  58 + workstation *domain.WorkStation
  59 + uc *domain.UnitConversion
  60 + err error
  61 + weight float64 = request.Weigh
  62 + )
  63 + if plan, err = productPlanRepository.FindOne(map[string]interface{}{"productPlanId": request.ProductPlanId}); err != nil {
  64 + return nil, err
  65 + }
  66 + //if group,err = productGroupRepository.FindOne(map[string]interface{}{"productGroupId":request.ProductGroupId});err!=nil{
  67 + // return nil, err
  68 + //}
  69 + if workshop, err = workshopRepository.FindOne(map[string]interface{}{"workshopId": request.WorkshopId}); err != nil {
  70 + return nil, err
  71 + }
  72 + if uc, err = unitConversionRepository.FindOne(map[string]interface{}{"unitConversionId": request.UnitConversionId}); err != nil {
  73 + return nil, err
  74 + }
  75 + if workstation, err = workshop.FindWorkStation(request.WorkshopId, request.LineId, request.SectionId); err != nil {
  76 + return nil, err
  77 + }
  78 +
  79 + var user *domain.User
  80 + userService := NewUserService()
  81 + user, err = userService.User(request.EmployeeId)
  82 + if err != nil {
  83 + return nil, err
  84 + }
  85 +
  86 + var org *domain.Org
  87 + org, err = userService.Organization(request.OrgId)
  88 + if err != nil {
  89 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  90 + }
  91 +
  92 + // 领料、退料需要换算产能
  93 + if productRecordType == domain.RecordTypeReceiveMaterial || productRecordType == domain.RecordTypeReturnMaterial {
  94 + weight = (weight / uc.FromUnitQuantity.Quantity) * uc.ToUnitQuantity.Quantity
  95 + }
  96 +
  97 + record := &domain.ProductRecord{
  98 + CompanyId: request.CompanyId,
  99 + OrgId: request.OrgId,
  100 + ProductRecordType: productRecordType,
  101 + ProductWorker: user,
  102 + WorkStation: workstation,
  103 + CreatedAt: time.Now(),
  104 + UpdatedAt: time.Now(),
  105 + ProductRecordInfo: &domain.ProductRecordInfo{
  106 + Weigh: weight,
  107 + WeighBefore: weight,
  108 + UnitConversionId: request.UnitConversionId,
  109 + ApproveStatus: domain.ProductRecordNotApprove,
  110 + ProductPlanId: request.ProductPlanId,
  111 + BatchNumber: plan.BatchNumber,
  112 + PlanProductName: plan.PlanProductName,
  113 + ProductGroupId: request.ProductGroupId,
  114 + },
  115 + Ext: domain.NewExt(org.OrgName),
  116 + }
  117 + if record, err = productRecordRepository.Save(record); err != nil {
  118 + return nil, err
  119 + }
  120 + return nil, nil
  121 +}
  122 +
  123 +func NewPGProductRecordService(transactionContext *pgTransaction.TransactionContext) (*PGProductRecordService, error) {
  124 + if transactionContext == nil {
  125 + return nil, fmt.Errorf("transactionContext参数不能为nil")
  126 + } else {
  127 + return &PGProductRecordService{
  128 + transactionContext: transactionContext,
  129 + }, nil
  130 + }
  131 +}
@@ -4,6 +4,7 @@ import ( @@ -4,6 +4,7 @@ import (
4 "bytes" 4 "bytes"
5 "encoding/json" 5 "encoding/json"
6 "fmt" 6 "fmt"
  7 + "github.com/beego/beego/v2/core/validation"
7 jsonlib "github.com/linmadan/egglib-go/utils/json" 8 jsonlib "github.com/linmadan/egglib-go/utils/json"
8 "io" 9 "io"
9 "reflect" 10 "reflect"
@@ -332,3 +333,13 @@ func ToArrayString(inputs []int) []string { @@ -332,3 +333,13 @@ func ToArrayString(inputs []int) []string {
332 } 333 }
333 return result 334 return result
334 } 335 }
  336 +
  337 +func LoadQueryObject(queryOption map[string]interface{}, obj interface{}) error {
  338 + jsonlib.UnmarshalFromString(jsonlib.MarshalToString(queryOption), obj)
  339 + validation := validation.Validation{}
  340 + result, err := validation.Valid(obj)
  341 + if !result && len(validation.Errors) > 0 {
  342 + return validation.Errors[0]
  343 + }
  344 + return err
  345 +}