refactor: 重构产线工位与备料流程,移除冗余字段
1. 移除工单、工件、日排产中的冗余工位组合/接驳台字段 2. 新增工位接驳台编码字段与唯一约束,关联WMS接驳台主数据 3. 重构日排产为工位产量分配模式,替代原接驳台列表 4. 新增备料单工位级字段与分批出库支持 5. 移除定时同步可生产数量,改为WMS实时拉取接口 6. 过滤操作日志,排除登录/退出相关日志 7. 调整仪表盘工序展示逻辑为今日派工路线 8. 新增接驳台维护菜单与基础数据
This commit is contained in:
@@ -2,6 +2,7 @@ package logic
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"math"
|
||||
"sort"
|
||||
@@ -12,8 +13,6 @@ import (
|
||||
"bj_power_mes/ent/dailyplan"
|
||||
"bj_power_mes/ent/workorder"
|
||||
"bj_power_mes/internal/wmsclient"
|
||||
|
||||
"github.com/zeromicro/go-zero/core/logx"
|
||||
)
|
||||
|
||||
// producibleBomItem 可生产数量计算用的精简 BOM 行
|
||||
@@ -23,24 +22,31 @@ type producibleBomItem struct {
|
||||
unitQty float64 // 单台用量
|
||||
}
|
||||
|
||||
// SyncProducibleToWMS 计算「可生产数量」快照 + 「未来5天物料需求」并推送到 WMS。
|
||||
// ProducibleResult 可生产数量计算结果(供 WMS 按需实时拉取)
|
||||
type ProducibleResult struct {
|
||||
Items []wmsclient.ProducibleItem `json:"items"`
|
||||
Demands []wmsclient.ProducibleDemand `json:"demands"`
|
||||
ComputedAt int64 `json:"computedAt"`
|
||||
}
|
||||
|
||||
// ComputeProducible 计算「可生产数量」+「未来5天物料需求」,结果直接返回(不做定时推送)。
|
||||
//
|
||||
// 业务口径(问题记录 L470-474 + L256):
|
||||
// - 可生产套数 = min(各物料可用量 ÷ 单台用量)。BOM 单台用量在 MES、库存可用量在 WMS,
|
||||
// 故由 MES 拉取 WMS 可用量(/api/internal/stock/check)后本地计算,再把快照推回 WMS 只读展示。
|
||||
// 故由 MES 拉取 WMS 可用量(/api/internal/stock/check)后本地计算,WMS 打开页面时实时来拉。
|
||||
// - 未来5天需求量 = 近5天(含今日)日排产台数 × 单台用量,按物料汇总,供 WMS 备料四态「预警」判定。
|
||||
//
|
||||
// 两系统独立运行约束:仅 MES→WMS 单向调用;未配置 WMS 或不可达时记录日志并跳过,绝不阻塞 MES。
|
||||
func (s *Service) SyncProducibleToWMS(ctx context.Context) error {
|
||||
// 两系统独立运行约束:未配置 WMS 或不可达时返回错误,由调用方(WMS)提示,绝不阻塞 MES。
|
||||
func (s *Service) ComputeProducible(ctx context.Context) (*ProducibleResult, error) {
|
||||
if s.ctx.Wms == nil || s.ctx.EntClient == nil {
|
||||
return nil
|
||||
return nil, errors.New("未配置 WMS 地址,无法计算可生产数量")
|
||||
}
|
||||
all, err := s.ctx.EntClient.BomItem.Query().All(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
if len(all) == 0 {
|
||||
return nil // 无 BOM 不推送
|
||||
return &ProducibleResult{Items: []wmsclient.ProducibleItem{}, Demands: []wmsclient.ProducibleDemand{}, ComputedAt: time.Now().Unix()}, nil
|
||||
}
|
||||
|
||||
// 1) 按 产品编码 → BOM名称 → 明细行 分组
|
||||
@@ -90,8 +96,7 @@ func (s *Service) SyncProducibleToWMS(ctx context.Context) error {
|
||||
sort.Strings(codes)
|
||||
avail, err := s.ctx.Wms.StockAvailable(ctx, codes)
|
||||
if err != nil {
|
||||
logx.Errorf("[producible] 拉取 WMS 可用量失败,跳过本次同步: %v", err)
|
||||
return err
|
||||
return nil, errors.New("拉取 WMS 可用量失败: " + err.Error())
|
||||
}
|
||||
|
||||
// 4) 产品名称映射(product_type 优先,work_order 兜底)
|
||||
@@ -170,12 +175,7 @@ func (s *Service) SyncProducibleToWMS(ctx context.Context) error {
|
||||
// 6) 未来5天物料需求(备料四态「预警」数据源)
|
||||
demands := s.computeFuture5Demand(ctx, chosen)
|
||||
|
||||
if err := s.ctx.Wms.SyncProducible(ctx, items, demands); err != nil {
|
||||
logx.Errorf("[producible] 推送 WMS 失败: %v", err)
|
||||
return err
|
||||
}
|
||||
logx.Infof("[producible] 已同步可生产数量 %d 项、未来5天需求 %d 项到 WMS", len(items), len(demands))
|
||||
return nil
|
||||
return &ProducibleResult{Items: items, Demands: demands, ComputedAt: now}, nil
|
||||
}
|
||||
|
||||
// computeFuture5Demand 近5天(含今日)日排产台数 × 单台用量,按物料汇总为未来5天需求量。
|
||||
|
||||
Reference in New Issue
Block a user