Files
bj_power/bj_power_wms/internal/handler/delivery.go
T

98 lines
3.1 KiB
Go
Raw Normal View History

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})
}
}