feat(mes): 添加定时同步可生产数量到WMS及BOM项相关标准字段
- 在main.go中添加定时任务每10分钟同步可生产数量到WMS系统 - 为BomItem实体添加relatedStandard字段及相关CRUD方法 - 为InspectionRecord实体添加reportNo、materialCode、materialName等字段 - 更新ent schema确保新字段的验证和默认值设置 - 添加必要的数据库迁移和字段映射逻辑
This commit is contained in:
@@ -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(不覆盖终值)
|
||||
|
||||
Reference in New Issue
Block a user