1. 新增预警表添加工单号字段,支持按工单号检索预警 2. 添加工单过滤在制品/绩效报表/预警中心查询 3. 补全WMS台账字段口径与权限配置 4. 修复备料单与数量不符处理流程 5. 新增配送进度/库位联动/自动出库功能 6. 修复AGV配送状态更新逻辑 7. 优化退料与库存管理细节
98 lines
3.1 KiB
Go
98 lines
3.1 KiB
Go
package handler
|
||
|
||
import (
|
||
"net/http"
|
||
|
||
"bj_power_wms/ent"
|
||
"bj_power_wms/ent/ordermaterialledger"
|
||
"bj_power_wms/internal/svc"
|
||
)
|
||
|
||
// ledgerProgressRow 配送进度读模型行(WMS 侧可见的四段量)。
|
||
//
|
||
// 口径(2026-09-19 定稿):一个字段只有一个写者,跨系统只读聚合、绝不双写。
|
||
// - outQty 已发出 [写者:出库]
|
||
// - returnedQty 已退回 [写者:退库收货]
|
||
// - consumedQty 已消耗 [写者:报工反冲核销]
|
||
// - netOut 净领用 = outQty − returnedQty
|
||
// - gap 待发缺口 = totalQty − netOut
|
||
//
|
||
// 在途 / 线边两段由调用方(MES)用本地 received_qty 派生,WMS 不猜:
|
||
//
|
||
// 在途 = outQty − receivedQty 线边 = receivedQty − consumedQty
|
||
type ledgerProgressRow struct {
|
||
OrderNo string `json:"orderNo"`
|
||
MaterialCode string `json:"materialCode"`
|
||
MaterialName string `json:"materialName"`
|
||
TargetStation string `json:"targetStation"`
|
||
TotalQty int `json:"totalQty"`
|
||
OutQty int `json:"outQty"`
|
||
ReturnedQty int `json:"returnedQty"`
|
||
ConsumedQty int `json:"consumedQty"`
|
||
NetOut int `json:"netOut"`
|
||
Gap int `json:"gap"`
|
||
Status string `json:"status"`
|
||
CompletedAt int64 `json:"completedAt"`
|
||
}
|
||
|
||
// ledgerProgressInternalHandler 台账配送进度(X-API-TOKEN 内部接口)。
|
||
// MES 备料/配送进度页调用:拿四段量 + 缺口,再与本地已接料量合成完整去向。
|
||
func ledgerProgressInternalHandler(ctx *svc.ServiceContext) http.HandlerFunc {
|
||
return func(w http.ResponseWriter, r *http.Request) {
|
||
q := r.URL.Query()
|
||
orderNo := q.Get("orderNo")
|
||
materialCode := q.Get("materialCode")
|
||
page := atoi(q.Get("page"), 1)
|
||
pageSize := atoi(q.Get("pageSize"), 50)
|
||
if page < 1 {
|
||
page = 1
|
||
}
|
||
if pageSize < 1 || pageSize > 1000 {
|
||
pageSize = 50
|
||
}
|
||
|
||
builder := ctx.EntClient.OrderMaterialLedger.Query()
|
||
if orderNo != "" {
|
||
builder = builder.Where(ordermaterialledger.OrderNoEQ(orderNo))
|
||
}
|
||
if materialCode != "" {
|
||
builder = builder.Where(ordermaterialledger.MaterialCodeEqualFold(materialCode))
|
||
}
|
||
total, err := builder.Count(ctx0())
|
||
if err != nil {
|
||
fail(w, http.StatusInternalServerError, err.Error())
|
||
return
|
||
}
|
||
list, err := builder.Order(ent.Desc("created_at"), ent.Desc("id")).
|
||
Offset((page - 1) * pageSize).Limit(pageSize).All(ctx0())
|
||
if err != nil {
|
||
fail(w, http.StatusInternalServerError, err.Error())
|
||
return
|
||
}
|
||
|
||
rows := make([]ledgerProgressRow, 0, len(list))
|
||
for _, l := range list {
|
||
netOut := l.OutQty - l.ReturnedQty
|
||
gap := l.TotalQty - netOut
|
||
if gap < 0 {
|
||
gap = 0
|
||
}
|
||
rows = append(rows, ledgerProgressRow{
|
||
OrderNo: l.OrderNo,
|
||
MaterialCode: l.MaterialCode,
|
||
MaterialName: l.MaterialName,
|
||
TargetStation: l.TargetStation,
|
||
TotalQty: l.TotalQty,
|
||
OutQty: l.OutQty,
|
||
ReturnedQty: l.ReturnedQty,
|
||
ConsumedQty: l.ConsumedQty,
|
||
NetOut: netOut,
|
||
Gap: gap,
|
||
Status: l.Status,
|
||
CompletedAt: l.CompletedAt,
|
||
})
|
||
}
|
||
ok(w, map[string]any{"total": total, "list": rows, "page": page, "pageSize": pageSize})
|
||
}
|
||
}
|