docs(business): 生成业务契约文档并重构MES客户端代码

- 创建案例.md文档,包含业务场景清单、业务流程、案例和回归测试三份完整文档
- WMS库房管理系统涵盖入库、出库、库存、检验、盘点等24个业务场景
- MES产线控制系统包含工单、排产、BOM、备料、质检、追溯等23个业务场景
- 工位终端系统支持上线、报工、下线、领料、巡检等15个现场作业场景
- 主链路从合同到成品入库,异常链路处理不合格、数量不符、退料等情况
- 删除MES客户端中的ScanRecord相关代码,精简客户端结构
- 更新客户端初始化逻辑,移除扫描记录相关的依赖注入配置
This commit is contained in:
SunYF
2026-09-20 18:25:44 +08:00
parent 5f68e77d5f
commit 8e6e8e1d20
46 changed files with 1052 additions and 3954 deletions
+1 -65
View File
@@ -2,56 +2,13 @@ package logic
import (
"context"
"errors"
"time"
"bj_power_mes/ent"
"bj_power_mes/ent/dailyplan"
"bj_power_mes/ent/scanrecord"
"bj_power_mes/ent/workorder"
"bj_power_mes/ent/workpiece"
)
type ScanReq struct {
Station string `json:"station"`
Sn string `json:"sn"`
OrderNo string `json:"orderNo"`
Type string `json:"type"` // ONLINE / PROCESS / DONE / TEMP_STORE
ProcessCode int `json:"processCode"`
Operator string `json:"operator"`
}
// ReportScan 扫码报工:记录 scan_record,并更新工单进度
func (s *Service) ReportScan(ctx context.Context, req ScanReq, operator string) error {
if req.Sn == "" {
return errors.New("sn 不能为空")
}
scanType := req.Type
if scanType == "" {
scanType = "PROCESS"
}
if req.Operator == "" {
req.Operator = operator
}
_, err := s.ctx.EntClient.ScanRecord.Create().
SetStation(req.Station).SetSn(req.Sn).SetOrderNo(req.OrderNo).
SetType(scanType).SetProcessCode(req.ProcessCode).SetOperator(req.Operator).
SetTime(time.Now()).Save(ctx)
if err != nil {
return err
}
s.ctx.EventLog.Write(ctx, "scan.report", req.OrderNo, operator, "scan_record", req.Sn, "扫码报工", map[string]any{"station": req.Station, "type": scanType, "processCode": req.ProcessCode})
// 更新工单进度:调高 finished 进度(去重按 sn+工序)
wp, err := s.ctx.EntClient.Workpiece.Query().Where(workpiece.Sn(req.Sn)).First(ctx)
if err == nil && wp != nil && wp.WorkOrderId > 0 {
s.bumpWorkOrderProgress(ctx, wp.OrderNo, wp.Sn)
}
s.notifyDashboard()
return nil
}
// bumpWorkOrderProgress 增加工单已完成数量(由完工动作驱动;扫码报工仅流转状态不重复计数)
// bumpWorkOrderProgress 增加工单已完成数量(由完工动作驱动)
func (s *Service) bumpWorkOrderProgress(ctx context.Context, orderNo, sn string) {
wo, err := s.ctx.EntClient.WorkOrder.Query().Where(workorder.WorkOrderNo(orderNo)).First(ctx)
if err != nil || wo == nil {
@@ -90,24 +47,3 @@ func (s *Service) bumpDailyPlanCompleted(ctx context.Context, orderNo string, t
SetCompletedQty(newQty).SetStatus(st).Save(ctx)
}
}
// ListScanRecords 查询扫码报工记录
func (s *Service) ListScanRecords(ctx context.Context, sn, orderNo string, page, pageSize int) ([]*ent.ScanRecord, int, error) {
q := s.ctx.EntClient.ScanRecord.Query()
if sn != "" {
q = q.Where(scanrecord.Sn(sn))
}
if orderNo != "" {
q = q.Where(scanrecord.OrderNoEqualFold(orderNo))
}
if sn != "" {
q = q.Where(scanrecord.SnEqualFold(sn))
}
total, err := q.Count(ctx)
if err != nil {
return nil, 0, err
}
rows, err := q.Order(ent.Desc(scanrecord.FieldID)).
Offset((page - 1) * pageSize).Limit(pageSize).All(ctx)
return rows, total, err
}