feat: 新增多类功能并优化现有流程

1. 工序工位支持0号上线位,更新解析逻辑与注释
2. 物料清单模块重命名为产品物料清单并优化文案
3. WMS与工位端新增用户/角色详情抽屉组件
4. 工单模块新增自动生成工单号、工位分组选择器
5. 日排产支持批量生成与详情查看
6. 工单列表重构操作菜单与表单优化
This commit is contained in:
SunYF
2026-09-18 13:54:30 +08:00
parent bf3a408839
commit 672cd23329
17 changed files with 780 additions and 207 deletions
+48 -8
View File
@@ -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 {