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