feat: 完成客户第12条需求+多系统改造

1. 新增预警表添加工单号字段,支持按工单号检索预警
2. 添加工单过滤在制品/绩效报表/预警中心查询
3. 补全WMS台账字段口径与权限配置
4. 修复备料单与数量不符处理流程
5. 新增配送进度/库位联动/自动出库功能
6. 修复AGV配送状态更新逻辑
7. 优化退料与库存管理细节
This commit is contained in:
SunYF
2026-09-19 17:04:58 +08:00
parent 62e45b7379
commit 05b0b8a909
89 changed files with 7912 additions and 429 deletions
@@ -81,14 +81,15 @@ func ListAlertRulesHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
}
}
// ListAlertsHandler GET /alerts?status=&type=&from=&to=&page=&pageSize=
// 预警消息收件箱:支持 状态/类型/时间范围(YYYY-MM-DD) 筛选;带 page 返回分页对象,否则返回全量数组(顶部铃铛未读数复用)。
// ListAlertsHandler GET /alerts?status=&type=&orderNo=&from=&to=&page=&pageSize=
// 预警消息收件箱:支持 状态/类型/工单号/时间范围(YYYY-MM-DD) 筛选;带 page 返回分页对象,否则返回全量数组(顶部铃铛未读数复用)。
func ListAlertsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := r.URL.Query()
query := logic.AlertQuery{
Status: q.Get("status"),
Type: q.Get("type"),
OrderNo: q.Get("orderNo"),
From: q.Get("from"),
To: q.Get("to"),
Page: atoiDefault(q.Get("page"), 0),
@@ -218,12 +218,41 @@ func GenerateMaterialHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
}
}
// AutoOutboundHandler POST /material-requests/auto-outbound 备料自动出库(一键补出)。
// 日常由「生成备料单」自动触发(客户第1条:平时无需操作);库存补齐后库管可在此一键补出。
func AutoOutboundHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req struct {
PlanDate string `json:"planDate"`
OrderNo string `json:"orderNo"`
}
if err := httpx.ParseJSON(r, &req); err != nil {
httpx.BadRequest(w, "请求体解析失败")
return
}
if req.PlanDate == "" && req.OrderNo == "" {
httpx.BadRequest(w, "planDate 与 orderNo 至少填一个")
return
}
done, short := logic.New(svcCtx).AutoOutboundRequests(r.Context(), req.PlanDate, req.OrderNo, operator(r, ""))
httpx.OkMessage(w, "自动出库完成", map[string]any{"done": done, "short": short})
}
}
func ListMaterialRequestsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := r.URL.Query()
data, err := logic.New(svcCtx).ListMaterialRequestsFiltered(r.Context(),
q.Get("orderNo"), q.Get("planDate"), q.Get("status"),
q.Get("materialCode"), q.Get("materialName"), q.Get("targetDock"), q.Get("stationNo"))
data, err := logic.New(svcCtx).ListMaterialRequests(r.Context(), logic.MaterialRequestQuery{
OrderNo: q.Get("orderNo"),
PlanDate: q.Get("planDate"),
Status: q.Get("status"),
MaterialCode: q.Get("materialCode"),
MaterialName: q.Get("materialName"),
TargetDock: q.Get("targetDock"),
StationNo: q.Get("stationNo"),
Source: q.Get("source"),
Keyword: q.Get("keyword"),
})
if err != nil {
httpx.Fail(w, 3104, err.Error())
return
@@ -237,7 +266,12 @@ func ListMaterialRequestsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
func ListMaterialRequestsInternalHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
q := r.URL.Query()
data, err := logic.New(svcCtx).ListMaterialRequests(r.Context(), q.Get("orderNo"), q.Get("planDate"), q.Get("status"), q.Get("stationNo"))
data, err := logic.New(svcCtx).ListMaterialRequests(r.Context(), logic.MaterialRequestQuery{
OrderNo: q.Get("orderNo"),
PlanDate: q.Get("planDate"),
Status: q.Get("status"),
StationNo: q.Get("stationNo"),
})
if err != nil {
httpx.Fail(w, 3105, err.Error())
return
@@ -286,7 +320,7 @@ func ListDocksHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
}
// ReceiveMaterialRequestHandler POST /material-requests/receive 接料确认(MES 备料页人工点「已接料」)。
// qty 可空(≤0 表示确认本批全部剩余);累加 sentQty 封顶 reqQty,达量自动 DONE
// qty 可空(≤0 表示确认本批全部剩余);累加 receivedQty(已接料),上限为已发出量
func ReceiveMaterialRequestHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req struct {
@@ -110,7 +110,7 @@ func OrderQueryInternalHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
func InProcessInternalHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
stationNo := atoiDefault(r.URL.Query().Get("stationNo"), 0)
data, err := logic.New(svcCtx).WorkpiecesInProcess(r.Context(), stationNo)
data, err := logic.New(svcCtx).WorkpiecesInProcess(r.Context(), stationNo, r.URL.Query().Get("orderNo"))
if err != nil {
httpx.Fail(w, 2006, err.Error())
return
@@ -271,10 +271,11 @@ func SuggestedDockCodesHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
// InProcessHandler GET /workpieces/in-process 跨天在制品视图(停在各工位未完工工件)
// stationNo 可选:0=上线位, 13=下线位, 其余为物理工位;不传或<=0 返回全部。
// orderNo 可选:按工单号模糊过滤(客户第12条「记录查看加一项看工单号查询」)。
func InProcessHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
stationNo, _ := strconv.Atoi(r.URL.Query().Get("stationNo"))
data, err := logic.New(svcCtx).WorkpiecesInProcess(r.Context(), stationNo)
data, err := logic.New(svcCtx).WorkpiecesInProcess(r.Context(), stationNo, r.URL.Query().Get("orderNo"))
if err != nil {
httpx.Fail(w, 3001, err.Error())
return