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