feat: 新增多类功能并优化现有流程
1. 工序工位支持0号上线位,更新解析逻辑与注释 2. 物料清单模块重命名为产品物料清单并优化文案 3. WMS与工位端新增用户/角色详情抽屉组件 4. 工单模块新增自动生成工单号、工位分组选择器 5. 日排产支持批量生成与详情查看 6. 工单列表重构操作菜单与表单优化
This commit is contained in:
@@ -4,6 +4,8 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"bj_power_mes/ent"
|
||||
@@ -34,15 +36,22 @@ type WorkOrderReq struct {
|
||||
|
||||
// CreateWorkOrder 创建工单(状态恒 CREATED,后续用状态流转按钮推进)
|
||||
func (s *Service) CreateWorkOrder(ctx context.Context, req WorkOrderReq, operator string) error {
|
||||
if req.WorkOrderNo == "" {
|
||||
return errors.New("工单号不能为空")
|
||||
}
|
||||
if req.ProductTypeId == 0 {
|
||||
return errors.New("请选择产品型号")
|
||||
}
|
||||
if req.Quantity <= 0 {
|
||||
req.Quantity = 1
|
||||
}
|
||||
// 工单号:未传入则按规则生成 WO-日期-001;若与已有工单号重复,自动递增序号(001→002…)。
|
||||
if req.WorkOrderNo == "" {
|
||||
req.WorkOrderNo = defaultWorkOrderNo()
|
||||
}
|
||||
finalNo, err := s.resolveUniqueWorkOrderNo(ctx, req.WorkOrderNo)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req.WorkOrderNo = finalNo
|
||||
|
||||
status := req.Status
|
||||
if status == "" {
|
||||
status = "CREATED"
|
||||
@@ -50,11 +59,8 @@ func (s *Service) CreateWorkOrder(ctx context.Context, req WorkOrderReq, operato
|
||||
if status != "CREATED" {
|
||||
status = "CREATED" // 创建恒为已创建;不允许直接创建到后续状态
|
||||
}
|
||||
// 工位组合=本工单要经过的工位,按工位号升序(传送带不回走)。
|
||||
// 完整的产线定义 = 关联工位(station.flow_id)+ 工位号 1→12 顺序,不再有独立的"工艺路线"对象。
|
||||
if req.ProcessSeq == "" {
|
||||
req.ProcessSeq = FullProcessSeq
|
||||
} else if err := ValidateProcessSeq(req.ProcessSeq); err != nil {
|
||||
// 工位组合为本工单要经过的工位,按工位号升序(传送带不回走),必填项,禁止留空/自动默认全选。
|
||||
if err := ValidateProcessSeq(req.ProcessSeq); err != nil {
|
||||
return err
|
||||
}
|
||||
req.ProcessSeq = NormalizeProcessSeq(req.ProcessSeq)
|
||||
@@ -95,6 +101,40 @@ func (s *Service) CreateWorkOrder(ctx context.Context, req WorkOrderReq, operato
|
||||
return nil
|
||||
}
|
||||
|
||||
// defaultWorkOrderNo 工单号默认规则:WO-YYYYMMDD-001(如 WO-20260918-001)。
|
||||
func defaultWorkOrderNo() string {
|
||||
return fmt.Sprintf("WO-%s-001", time.Now().Format("20060102"))
|
||||
}
|
||||
|
||||
// resolveUniqueWorkOrderNo 工单号唯一性保障:若 want 已存在,则按尾部序号自动递增
|
||||
// (WO-20260918-001 → 002 → 003…),最多尝试 999 次,仍冲突则报错由前端手动指定。
|
||||
// 尾部序号解析失败(无数字后缀)时,退化为在末尾追加 -001/-002…。
|
||||
func (s *Service) resolveUniqueWorkOrderNo(ctx context.Context, want string) (string, error) {
|
||||
parts := strings.Split(want, "-")
|
||||
prefix := want
|
||||
seq := 0
|
||||
if len(parts) >= 2 {
|
||||
if n, err := strconv.Atoi(parts[len(parts)-1]); err == nil {
|
||||
seq = n
|
||||
prefix = strings.Join(parts[:len(parts)-1], "-")
|
||||
}
|
||||
}
|
||||
for i := 0; i < 999; i++ {
|
||||
cand := want
|
||||
if i > 0 {
|
||||
cand = fmt.Sprintf("%s-%03d", prefix, seq+i)
|
||||
}
|
||||
cnt, err := s.ctx.EntClient.WorkOrder.Query().Where(workorder.WorkOrderNo(cand)).Count(ctx)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if cnt == 0 {
|
||||
return cand, nil
|
||||
}
|
||||
}
|
||||
return "", errors.New("工单号自动编号失败(序号已用尽),请手动指定工单号")
|
||||
}
|
||||
|
||||
// UpdateWorkOrder 编辑工单。仅「已创建」状态允许编辑(已下发/执行中/已暂停只能流转,已完成/已取消只读)。
|
||||
func (s *Service) UpdateWorkOrder(ctx context.Context, req WorkOrderReq, operator string) error {
|
||||
if req.Id == 0 {
|
||||
|
||||
Reference in New Issue
Block a user