feat(mes): 添加定时同步可生产数量到WMS及BOM项相关标准字段

- 在main.go中添加定时任务每10分钟同步可生产数量到WMS系统
- 为BomItem实体添加relatedStandard字段及相关CRUD方法
- 为InspectionRecord实体添加reportNo、materialCode、materialName等字段
- 更新ent schema确保新字段的验证和默认值设置
- 添加必要的数据库迁移和字段映射逻辑
This commit is contained in:
SunYF
2026-09-17 12:49:07 +08:00
parent b4b274301d
commit 1cc93795ce
191 changed files with 24504 additions and 1250 deletions
+42 -4
View File
@@ -50,6 +50,20 @@ func startStocktakeHandler(ctx *svc.ServiceContext) http.HandlerFunc {
return
}
// 盘点快照是多行写入(每条库存一行明细 + 一张盘点单),整体事务化:
// 要么快照完整落库、要么全回滚,杜绝部分明细写入后失败导致盘点基准不完整。
tx, err := ctx.EntClient.Tx(ctx0())
if err != nil {
fail(w, http.StatusInternalServerError, "开启事务失败: "+err.Error())
return
}
committed := false
defer func() {
if !committed {
_ = tx.Rollback()
}
}()
count := 0
for _, inv := range rows {
tt := "BATCH"
@@ -63,18 +77,25 @@ func startStocktakeHandler(ctx *svc.ServiceContext) http.HandlerFunc {
if tid == "" {
continue
}
ctx.EntClient.StocktakeItem.Create().
// 库位四级贯通(U18):快照冻结区域+货架/层/位置,盘点差异可精确定位到货位。
if _, e := tx.StocktakeItem.Create().
SetStocktakeNo(no).
SetTargetType(tt).
SetTargetID(tid).
SetNillableMaterialCode(strPtr(inv.MaterialCode)).
SetNillableZoneCode(strPtr(inv.ZoneCode)).
SetNillableShelfNo(strPtr(inv.ShelfNo)).
SetNillableLayerNo(strPtr(inv.LayerNo)).
SetNillablePositionNo(strPtr(inv.PositionNo)).
SetBookQty(book).
SaveX(ctx0())
Save(ctx0()); e != nil {
fail(w, http.StatusInternalServerError, "创建盘点明细失败: "+e.Error())
return
}
count++
}
rec, err := ctx.EntClient.StocktakeOrder.Create().
rec, err := tx.StocktakeOrder.Create().
SetStocktakeNo(no).
SetNillableOperator(strPtr(req.Operator)).
SetTotalTargets(count).
@@ -83,6 +104,12 @@ func startStocktakeHandler(ctx *svc.ServiceContext) http.HandlerFunc {
fail(w, http.StatusInternalServerError, "创建盘点单失败: "+err.Error())
return
}
if err = tx.Commit(); err != nil {
fail(w, http.StatusInternalServerError, "提交事务失败: "+err.Error())
return
}
committed = true
ctx.EventLog.Write(ctx0(), "stocktake.start", r.Header.Get("X-Username"), "stocktake", rec.StocktakeNo,
"发起盘点 "+rec.StocktakeNo, map[string]any{"totalTargets": count, "zones": req.Zones,
"materialCodes": req.MaterialCodes, "manageMode": req.ManageMode})
@@ -147,6 +174,11 @@ func recordStocktakeHandler(ctx *svc.ServiceContext) http.HandlerFunc {
"bookQty": item.BookQty,
"scannedQty": qty,
"diffQty": diff,
// 库位四级贯通(U18):扫码即回显货位,操作员当场核对位置。
"zoneCode": item.ZoneCode,
"shelfNo": item.ShelfNo,
"layerNo": item.LayerNo,
"positionNo": item.PositionNo,
})
}
}
@@ -189,6 +221,11 @@ func finishStocktakeHandler(ctx *svc.ServiceContext) http.HandlerFunc {
Book int `json:"bookQty"`
Scanned int `json:"scannedQty"`
Diff int `json:"diffQty"`
// 库位四级贯通(U18):差异行携带货位,盘盈盘亏可精确定位到区域/货架/层/位置。
ZoneCode string `json:"zoneCode"`
ShelfNo string `json:"shelfNo"`
LayerNo string `json:"layerNo"`
PositionNo string `json:"positionNo"`
}
diffs := []diffRow{}
counted := 0
@@ -217,7 +254,8 @@ func finishStocktakeHandler(ctx *svc.ServiceContext) http.HandlerFunc {
}
counted++
if it.DiffQty != 0 {
diffs = append(diffs, diffRow{it.TargetID, it.TargetType, it.BookQty, it.ScannedQty, it.DiffQty})
diffs = append(diffs, diffRow{it.TargetID, it.TargetType, it.BookQty, it.ScannedQty, it.DiffQty,
it.ZoneCode, it.ShelfNo, it.LayerNo, it.PositionNo})
if req.Adjust {
if it.TargetType == "BATCH" {
// 增量调整:quantity += diffQty(不覆盖终值)