Files
bj_power/bj_power_wms/internal/handler/delivery.go
T
SunYF 05b0b8a909 feat: 完成客户第12条需求+多系统改造
1. 新增预警表添加工单号字段,支持按工单号检索预警
2. 添加工单过滤在制品/绩效报表/预警中心查询
3. 补全WMS台账字段口径与权限配置
4. 修复备料单与数量不符处理流程
5. 新增配送进度/库位联动/自动出库功能
6. 修复AGV配送状态更新逻辑
7. 优化退料与库存管理细节
2026-09-19 17:04:58 +08:00

98 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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})
}
}