作者 yangfu

refactor: 计划管理、生产班组、物料

  1 +package dto
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  5 + "strings"
  6 +)
  7 +
  8 +// 生产班组员工
  9 +type ProductGroupEmployeesDto struct {
  10 + // 用户Id 用户唯一标识
  11 + UserId int `json:"userId,omitempty"`
  12 + // 用户姓名
  13 + UserName string `json:"userName,omitempty"`
  14 + // 班组名称
  15 + GroupName string `json:"groupName,omitempty"`
  16 + // 上班班次 1:全天 2:白班 4:中班 8:夜班
  17 + WorkOnDescription string `json:"workOn,omitempty"`
  18 + // 工作位置键值 (车间ID+'.'+生产线ID+'.'+工段ID)
  19 + //WorkStationId string `json:"workStationId,omitempty"`
  20 +}
  21 +
  22 +func NewProductGroupEmployeesDto(group *domain.ProductGroup) []*ProductGroupEmployeesDto {
  23 + employees := make([]*ProductGroupEmployeesDto, 0)
  24 + if group.GroupLeader != nil {
  25 + employees = append(employees, NewGroupEmployee(group, group.GroupLeader))
  26 + }
  27 + for i := range group.GroupMembers {
  28 + employees = append(employees, NewGroupEmployee(group, group.GroupMembers[i]))
  29 + }
  30 + return employees
  31 +}
  32 +
  33 +func NewGroupEmployee(group *domain.ProductGroup, u *domain.User) *ProductGroupEmployeesDto {
  34 + item := &ProductGroupEmployeesDto{}
  35 + item.UserId = u.UserId
  36 + item.UserName = u.UserName
  37 + item.GroupName = group.GroupName
  38 + workOns := domain.WorkOnDescription(group.WorkOn)
  39 + item.WorkOnDescription = strings.Join(workOns, ",")
  40 + //item.WorkStationId = group.WorkStation.WorkStationId
  41 + return item
  42 +}
  43 +
  44 +type ProductGroupEmployeesDtos struct {
  45 + Result []*ProductGroupEmployeesDto
  46 + MapResult map[int]*ProductGroupEmployeesDto
  47 +}
  48 +
  49 +func (d *ProductGroupEmployeesDtos) Append(items ...*ProductGroupEmployeesDto) {
  50 + for i := range items {
  51 + if _, ok := d.MapResult[items[i].UserId]; ok {
  52 + continue
  53 + }
  54 + d.MapResult[items[i].UserId] = items[i]
  55 + d.Result = append(d.Result, items[i])
  56 + }
  57 +}
  58 +
  59 +func (d *ProductGroupEmployeesDtos) LoadDto(groups ...*domain.ProductGroup) {
  60 + for i := range groups {
  61 + items := NewProductGroupEmployeesDto(groups[i])
  62 + d.Append(items...)
  63 + }
  64 +}
  65 +
  66 +func NewProductGroupEmployeesDtos() *ProductGroupEmployeesDtos {
  67 + return &ProductGroupEmployeesDtos{
  68 + Result: make([]*ProductGroupEmployeesDto, 0),
  69 + MapResult: make(map[int]*ProductGroupEmployeesDto),
  70 + }
  71 +}
  1 +package query
  2 +
  3 +import (
  4 + "fmt"
  5 + "github.com/beego/beego/v2/core/validation"
  6 + "reflect"
  7 + "strings"
  8 +)
  9 +
  10 +type SearchProductGroupEmployeesQuery struct {
  11 + // 查询偏离量
  12 + //Offset int `cname:"查询偏离量" json:"offset"`
  13 + // 查询限制
  14 + //Limit int `cname:"查询限制" json:"limit"`
  15 + // 页码
  16 + //PageNumber int `cname:"页码" json:"pageNumber,omitempty"`
  17 + // 页数
  18 + //PageSize int `cname:"页数" json:"pageSize,omitempty"`
  19 + // 当前公司
  20 + CompanyId int `cname:"当前公司" json:"companyId,omitempty" valid:"Required"`
  21 + // 当前登录的组织
  22 + OrgId int `cname:"当前登录的组织" json:"orgId,omitempty"`
  23 + // 车间ID
  24 + WorkshopId int `cname:"车间ID" json: workshopId,omitempty"`
  25 + // 生产线ID
  26 + LineId int `cname:"生产线ID" json:"lineId,omitempty"`
  27 + // 工段ID
  28 + SectionId int `json:"sectionId,omitempty"`
  29 +}
  30 +
  31 +func (listProductGroupQuery *SearchProductGroupEmployeesQuery) Valid(validation *validation.Validation) {
  32 + //validation.SetError("CustomValid", "未实现的自定义认证")
  33 +}
  34 +
  35 +func (listProductGroupQuery *SearchProductGroupEmployeesQuery) ValidateQuery() error {
  36 + valid := validation.Validation{}
  37 + b, err := valid.Valid(listProductGroupQuery)
  38 + if err != nil {
  39 + return err
  40 + }
  41 + if !b {
  42 + elem := reflect.TypeOf(listProductGroupQuery).Elem()
  43 + for _, validErr := range valid.Errors {
  44 + field, isExist := elem.FieldByName(validErr.Field)
  45 + if isExist {
  46 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  47 + } else {
  48 + return fmt.Errorf(validErr.Message)
  49 + }
  50 + }
  51 + }
  52 + return nil
  53 +}
@@ -367,6 +367,48 @@ func (productGroupService *ProductGroupService) SearchProductGroup(operateInfo * @@ -367,6 +367,48 @@ func (productGroupService *ProductGroupService) SearchProductGroup(operateInfo *
367 return count, results, nil 367 return count, results, nil
368 } 368 }
369 369
  370 +// 返回生产班组服务列表
  371 +func (productGroupService *ProductGroupService) SearchProductGroupEmployees(operateInfo *domain.OperateInfo, cmd *query.SearchProductGroupEmployeesQuery) (int64, interface{}, error) {
  372 + if err := cmd.ValidateQuery(); err != nil {
  373 + return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error())
  374 + }
  375 + transactionContext, err := factory.CreateTransactionContext(nil)
  376 + if err != nil {
  377 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  378 + }
  379 + if err := transactionContext.StartTransaction(); err != nil {
  380 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  381 + }
  382 + defer func() {
  383 + transactionContext.RollbackTransaction()
  384 + }()
  385 +
  386 + //workshops, _ := factory.FastPgWorkshops(transactionContext, operateInfo.CompanyId)
  387 + queryOptions := utils.ObjectToMap(cmd)
  388 + //queryOptions = workshops.FindByNameWithQuery(queryOptions, cmd.WorkshopName, cmd.LineName, "")
  389 +
  390 + var productGroupRepository domain.ProductGroupRepository
  391 + productGroupRepository, _, _ = factory.FastPgProductGroup(transactionContext, 0)
  392 + _, productGroups, err := productGroupRepository.Find(queryOptions)
  393 + if err != nil {
  394 + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  395 + }
  396 + var results = dto.NewProductGroupEmployeesDtos()
  397 + for i := range productGroups {
  398 + item := productGroups[i]
  399 + //workStation := workshops.FindWorkStation(item.WorkStation.WorkshopId, item.WorkStation.LineId, item.WorkStation.SectionId)
  400 + //item.WorkStation = workStation
  401 + items := dto.NewProductGroupEmployeesDto(item)
  402 + results.Append(items...)
  403 + }
  404 + if err := transactionContext.CommitTransaction(); err != nil {
  405 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  406 + }
  407 + return int64(len(results.Result)), map[string]interface{}{
  408 + "employees": results.Result,
  409 + }, nil
  410 +}
  411 +
370 func NewProductGroupService(options map[string]interface{}) *ProductGroupService { 412 func NewProductGroupService(options map[string]interface{}) *ProductGroupService {
371 newProductGroupService := &ProductGroupService{} 413 newProductGroupService := &ProductGroupService{}
372 return newProductGroupService 414 return newProductGroupService
@@ -19,7 +19,7 @@ type SearchProductPlanQuery struct { @@ -19,7 +19,7 @@ type SearchProductPlanQuery struct {
19 // 当前登录的组织 19 // 当前登录的组织
20 OrgId int `cname:"当前登录的组织" json:"orgId,omitempty"` 20 OrgId int `cname:"当前登录的组织" json:"orgId,omitempty"`
21 // 匹配多个组织 21 // 匹配多个组织
22 - InOrgIds []int `cname:"匹配多个组织" json:"inOrgIds,omitempty" valid:"Required"` 22 + InOrgIds []int `cname:"匹配多个组织" json:"inOrgIds,omitempty"`
23 // 页码 23 // 页码
24 PageNumber int `cname:"页码" json:"pageNumber,omitempty"` 24 PageNumber int `cname:"页码" json:"pageNumber,omitempty"`
25 // 页数 25 // 页数
  1 +package dto
  2 +
  3 +import "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  4 +
  5 +type MaterialUnitConversionDto struct {
  6 + // 单位换算ID
  7 + UnitConversionId int `json:"unitConversionId,omitempty"`
  8 + // 物料名称
  9 + MaterialName string `json:"materialName,omitempty"`
  10 + // 转换前单位数量
  11 + FromUnitQuantity *domain.UnitQuantity `json:"fromUnitQuantity,omitempty"`
  12 + // 转换后单位数量
  13 + ToUnitQuantity *domain.UnitQuantity `json:"toUnitQuantity,omitempty"`
  14 +}
  15 +
  16 +func (d *MaterialUnitConversionDto) LoadDto(m *domain.UnitConversion) *MaterialUnitConversionDto {
  17 + d.UnitConversionId = m.UnitConversionId
  18 + d.MaterialName = m.Material.MaterialName
  19 + d.FromUnitQuantity = m.FromUnitQuantity
  20 + d.ToUnitQuantity = m.ToUnitQuantity
  21 + return d
  22 +}
  1 +package query
  2 +
  3 +import (
  4 + "fmt"
  5 + "github.com/beego/beego/v2/core/validation"
  6 + "reflect"
  7 + "strings"
  8 +)
  9 +
  10 +type SearchMaterialsQuery struct {
  11 + // 当前公司
  12 + CompanyId int `cname:"当前公司" json:"companyId,omitempty" valid:"Required"`
  13 + // 当前登录的组织
  14 + OrgId int `cname:"当前登录的组织" json:"orgId,omitempty"`
  15 + // 车间ID
  16 + WorkshopId int `cname:"车间ID" json: workshopId,omitempty"`
  17 + // 生产线ID
  18 + LineId int `cname:"生产线ID" json:"lineId,omitempty"`
  19 + // 工段ID
  20 + SectionId int `json:"sectionId,omitempty"`
  21 +}
  22 +
  23 +func (listProductGroupQuery *SearchMaterialsQuery) Valid(validation *validation.Validation) {
  24 + //validation.SetError("CustomValid", "未实现的自定义认证")
  25 +}
  26 +
  27 +func (listProductGroupQuery *SearchMaterialsQuery) ValidateQuery() error {
  28 + valid := validation.Validation{}
  29 + b, err := valid.Valid(listProductGroupQuery)
  30 + if err != nil {
  31 + return err
  32 + }
  33 + if !b {
  34 + elem := reflect.TypeOf(listProductGroupQuery).Elem()
  35 + for _, validErr := range valid.Errors {
  36 + field, isExist := elem.FieldByName(validErr.Field)
  37 + if isExist {
  38 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  39 + } else {
  40 + return fmt.Errorf(validErr.Message)
  41 + }
  42 + }
  43 + }
  44 + return nil
  45 +}
@@ -307,6 +307,42 @@ func (unitConversionService *UnitConversionService) SearchUnitConversion(operate @@ -307,6 +307,42 @@ func (unitConversionService *UnitConversionService) SearchUnitConversion(operate
307 return count, result, nil 307 return count, result, nil
308 } 308 }
309 309
  310 +// 返回单位换算服务列表
  311 +func (unitConversionService *UnitConversionService) SearchMaterial(operateInfo *domain.OperateInfo, listUnitConversionQuery *query.SearchMaterialsQuery) (int64, interface{}, error) {
  312 + if err := listUnitConversionQuery.ValidateQuery(); err != nil {
  313 + return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error())
  314 + }
  315 + transactionContext, err := factory.CreateTransactionContext(nil)
  316 + if err != nil {
  317 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  318 + }
  319 + if err := transactionContext.StartTransaction(); err != nil {
  320 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  321 + }
  322 + defer func() {
  323 + transactionContext.RollbackTransaction()
  324 + }()
  325 + unitConversionRepository, _, _ := factory.FastPgUnitConversion(transactionContext, 0)
  326 + count, unitConversions, err := unitConversionRepository.Find(utils.ObjectToMap(listUnitConversionQuery))
  327 + if err != nil {
  328 + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  329 + }
  330 + if err := transactionContext.CommitTransaction(); err != nil {
  331 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  332 + }
  333 +
  334 + var result = make([]*dto.MaterialUnitConversionDto, 0)
  335 + for i := range unitConversions {
  336 + item := unitConversions[i]
  337 + newItem := &dto.MaterialUnitConversionDto{}
  338 + newItem.LoadDto(item)
  339 + result = append(result, newItem)
  340 + }
  341 + return count, map[string]interface{}{
  342 + "materials": result,
  343 + }, nil
  344 +}
  345 +
310 func NewUnitConversionService(options map[string]interface{}) *UnitConversionService { 346 func NewUnitConversionService(options map[string]interface{}) *UnitConversionService {
311 newUnitConversionService := &UnitConversionService{} 347 newUnitConversionService := &UnitConversionService{}
312 return newUnitConversionService 348 return newUnitConversionService
@@ -166,7 +166,10 @@ func (repository *ProductGroupRepository) Find(queryOptions map[string]interface @@ -166,7 +166,10 @@ func (repository *ProductGroupRepository) Find(queryOptions map[string]interface
166 if v, ok := queryOptions["groupName"]; ok && len(v.(string)) > 0 { 166 if v, ok := queryOptions["groupName"]; ok && len(v.(string)) > 0 {
167 query.Where(fmt.Sprintf(`group_name like '%%%v%%'`, v)) 167 query.Where(fmt.Sprintf(`group_name like '%%%v%%'`, v))
168 } 168 }
169 - query.SetOffsetAndLimit(20) 169 + query.SetWhereByQueryOption("work_station->>'workshopId'='?'", "workshopId")
  170 + query.SetWhereByQueryOption("work_station->>'lineId'='?'", "lineId")
  171 + query.SetWhereByQueryOption("work_station->>'sectionId'='?'", "sectionId")
  172 + query.SetOffsetAndLimit(domain.MaxQueryRow)
170 query.SetOrderDirect("product_group_id", "DESC") 173 query.SetOrderDirect("product_group_id", "DESC")
171 if count, err := query.SelectAndCount(); err != nil { 174 if count, err := query.SelectAndCount(); err != nil {
172 return 0, productGroups, err 175 return 0, productGroups, err
@@ -183,7 +183,7 @@ func (repository *ProductPlanRepository) Find(queryOptions map[string]interface{ @@ -183,7 +183,7 @@ func (repository *ProductPlanRepository) Find(queryOptions map[string]interface{
183 query.Where(fmt.Sprintf(`workshop->>'workshopName' like '%%%v%%'`, v)) 183 query.Where(fmt.Sprintf(`workshop->>'workshopName' like '%%%v%%'`, v))
184 } 184 }
185 query.SetWhereByQueryOption("plan_status=?", "planStatus") 185 query.SetWhereByQueryOption("plan_status=?", "planStatus")
186 - query.SetOffsetAndLimit(20) 186 + query.SetOffsetAndLimit(domain.MaxQueryRow)
187 query.SetOrderDirect("product_plan_id", "DESC") 187 query.SetOrderDirect("product_plan_id", "DESC")
188 if count, err := query.SelectAndCount(); err != nil { 188 if count, err := query.SelectAndCount(); err != nil {
189 return 0, productPlans, err 189 return 0, productPlans, err
@@ -149,7 +149,7 @@ func (repository *ProductRecordRepository) Find(queryOptions map[string]interfac @@ -149,7 +149,7 @@ func (repository *ProductRecordRepository) Find(queryOptions map[string]interfac
149 var productRecordModels []*models.ProductRecord 149 var productRecordModels []*models.ProductRecord
150 productRecords := make([]*domain.ProductRecord, 0) 150 productRecords := make([]*domain.ProductRecord, 0)
151 query := sqlbuilder.BuildQuery(tx.Model(&productRecordModels), queryOptions) 151 query := sqlbuilder.BuildQuery(tx.Model(&productRecordModels), queryOptions)
152 - query.SetOffsetAndLimit(20) 152 + query.SetOffsetAndLimit(domain.MaxQueryRow)
153 query.SetOrderDirect("product_record_id", "DESC") 153 query.SetOrderDirect("product_record_id", "DESC")
154 if count, err := query.SelectAndCount(); err != nil { 154 if count, err := query.SelectAndCount(); err != nil {
155 return 0, productRecords, err 155 return 0, productRecords, err
@@ -157,7 +157,7 @@ func (repository *ProductRepository) Find(queryOptions map[string]interface{}) ( @@ -157,7 +157,7 @@ func (repository *ProductRepository) Find(queryOptions map[string]interface{}) (
157 if v, ok := queryOptions["productCategory"]; ok && len(v.(string)) > 0 { 157 if v, ok := queryOptions["productCategory"]; ok && len(v.(string)) > 0 {
158 query.Where(fmt.Sprintf(`product_category like '%%%v%%'`, v)) 158 query.Where(fmt.Sprintf(`product_category like '%%%v%%'`, v))
159 } 159 }
160 - query.SetOffsetAndLimit(20) 160 + query.SetOffsetAndLimit(domain.MaxQueryRow)
161 query.SetOrderDirect("product_id", "DESC") 161 query.SetOrderDirect("product_id", "DESC")
162 if count, err := query.SelectAndCount(); err != nil { 162 if count, err := query.SelectAndCount(); err != nil {
163 return 0, products, err 163 return 0, products, err
@@ -146,6 +146,9 @@ func (repository *UnitConversionRepository) Find(queryOptions map[string]interfa @@ -146,6 +146,9 @@ func (repository *UnitConversionRepository) Find(queryOptions map[string]interfa
146 query := sqlbuilder.BuildQuery(tx.Model(&unitConversionModels), queryOptions) 146 query := sqlbuilder.BuildQuery(tx.Model(&unitConversionModels), queryOptions)
147 query.SetWhereByQueryOption("company_id = ?", "companyId") 147 query.SetWhereByQueryOption("company_id = ?", "companyId")
148 query.SetWhereByQueryOption("org_id = ?", "orgId") 148 query.SetWhereByQueryOption("org_id = ?", "orgId")
  149 + query.SetWhereByQueryOption("work_station->>'workshopId'='?'", "workshopId")
  150 + query.SetWhereByQueryOption("work_station->>'lineId'='?'", "lineId")
  151 + query.SetWhereByQueryOption("work_station->>'sectionId'='?'", "sectionId")
149 if v, ok := queryOptions["inOrgIds"]; ok && len(v.([]int)) > 0 { 152 if v, ok := queryOptions["inOrgIds"]; ok && len(v.([]int)) > 0 {
150 query.Where(`org_id in (?)`, pg.In(v)) 153 query.Where(`org_id in (?)`, pg.In(v))
151 } 154 }
@@ -78,3 +78,14 @@ func (controller *ProductGroupController) SearchProductGroup() { @@ -78,3 +78,14 @@ func (controller *ProductGroupController) SearchProductGroup() {
78 total, data, err := productGroupService.SearchProductGroup(ParseOperateInfo(controller.BaseController), cmd) 78 total, data, err := productGroupService.SearchProductGroup(ParseOperateInfo(controller.BaseController), cmd)
79 ResponseGrid(controller.BaseController, total, data, err) 79 ResponseGrid(controller.BaseController, total, data, err)
80 } 80 }
  81 +
  82 +func (controller *ProductGroupController) SearchProductGroupEmployees() {
  83 + productGroupService := service.NewProductGroupService(nil)
  84 + cmd := &query.SearchProductGroupEmployeesQuery{}
  85 + Must(controller.Unmarshal(cmd))
  86 + operateInfo := ParseOperateInfo(controller.BaseController)
  87 + cmd.OrgId = operateInfo.OrgId
  88 + cmd.CompanyId = operateInfo.CompanyId
  89 + _, data, err := productGroupService.SearchProductGroupEmployees(operateInfo, cmd)
  90 + controller.Response(data, err)
  91 +}
@@ -78,3 +78,14 @@ func (controller *UnitConversionController) SearchUnitConversion() { @@ -78,3 +78,14 @@ func (controller *UnitConversionController) SearchUnitConversion() {
78 total, data, err := unitConversionService.SearchUnitConversion(ParseOperateInfo(controller.BaseController), cmd) 78 total, data, err := unitConversionService.SearchUnitConversion(ParseOperateInfo(controller.BaseController), cmd)
79 ResponseGrid(controller.BaseController, total, data, err) 79 ResponseGrid(controller.BaseController, total, data, err)
80 } 80 }
  81 +
  82 +func (controller *UnitConversionController) SearchMaterial() {
  83 + unitConversionService := service.NewUnitConversionService(nil)
  84 + cmd := &query.SearchMaterialsQuery{}
  85 + Must(controller.Unmarshal(cmd))
  86 + operateInfo := ParseOperateInfo(controller.BaseController)
  87 + cmd.OrgId = operateInfo.OrgId
  88 + cmd.CompanyId = operateInfo.CompanyId
  89 + _, data, err := unitConversionService.SearchMaterial(ParseOperateInfo(controller.BaseController), cmd)
  90 + controller.Response(data, err)
  91 +}
@@ -13,4 +13,5 @@ func init() { @@ -13,4 +13,5 @@ func init() {
13 web.Router("/product-groups/batch-remove", &controllers.ProductGroupController{}, "Post:BatchRemoveProductGroup") 13 web.Router("/product-groups/batch-remove", &controllers.ProductGroupController{}, "Post:BatchRemoveProductGroup")
14 web.Router("/product-groups/", &controllers.ProductGroupController{}, "Get:ListProductGroup") 14 web.Router("/product-groups/", &controllers.ProductGroupController{}, "Get:ListProductGroup")
15 web.Router("/product-groups/search", &controllers.ProductGroupController{}, "Post:SearchProductGroup") 15 web.Router("/product-groups/search", &controllers.ProductGroupController{}, "Post:SearchProductGroup")
  16 + web.Router("/product-groups/employees", &controllers.ProductGroupController{}, "Post:SearchProductGroupEmployees")
16 } 17 }
@@ -13,4 +13,6 @@ func init() { @@ -13,4 +13,6 @@ func init() {
13 web.Router("/unit-conversions/batch-remove", &controllers.UnitConversionController{}, "Post:BatchRemoveUnitConversion") 13 web.Router("/unit-conversions/batch-remove", &controllers.UnitConversionController{}, "Post:BatchRemoveUnitConversion")
14 web.Router("/unit-conversions/", &controllers.UnitConversionController{}, "Get:ListUnitConversion") 14 web.Router("/unit-conversions/", &controllers.UnitConversionController{}, "Get:ListUnitConversion")
15 web.Router("/unit-conversions/search", &controllers.UnitConversionController{}, "Post:SearchUnitConversion") 15 web.Router("/unit-conversions/search", &controllers.UnitConversionController{}, "Post:SearchUnitConversion")
  16 +
  17 + web.Router("/unit-conversions/materials", &controllers.UnitConversionController{}, "Post:SearchMaterial")
16 } 18 }