Files
bj_power/bj_power_wms/internal/handler/orders.go
T
SunYF 8e6e8e1d20 docs(business): 生成业务契约文档并重构MES客户端代码
- 创建案例.md文档,包含业务场景清单、业务流程、案例和回归测试三份完整文档
- WMS库房管理系统涵盖入库、出库、库存、检验、盘点等24个业务场景
- MES产线控制系统包含工单、排产、BOM、备料、质检、追溯等23个业务场景
- 工位终端系统支持上线、报工、下线、领料、巡检等15个现场作业场景
- 主链路从合同到成品入库,异常链路处理不合格、数量不符、退料等情况
- 删除MES客户端中的ScanRecord相关代码,精简客户端结构
- 更新客户端初始化逻辑,移除扫描记录相关的依赖注入配置
2026-09-20 18:25:44 +08:00

84 lines
2.5 KiB
Go

package handler
import (
"encoding/json"
"net/http"
"net/url"
"sort"
"time"
"bj_power_wms/internal/svc"
)
// 视为"已完成"的工单状态(查询时排到最后,未完成的优先显示)
var mesDoneStatuses = map[string]bool{
"FINISHED": true, "COMPLETED": true, "DONE": true,
"CLOSED": true, "已完结": true, "已完成": true,
}
type mesOrder struct {
WorkOrderNo string `json:"workOrderNo"`
ProductCode string `json:"productCode"`
ProductName string `json:"productName"`
Quantity int `json:"quantity"`
Status string `json:"status"`
}
// ordersHandler 调用 MES 内部接口获取工单列表,把未完成工单排前面,供备料出库下拉选择
func ordersHandler(ctx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
orderNo := r.URL.Query().Get("orderNo")
// limit:无输入条件时默认返回 20 条(未完成优先),供备料出库工单号下拉首屏展示;
// 模糊搜索时同样返回匹配结果的前 limit 条。
limit := atoi(r.URL.Query().Get("limit"), 20)
if limit <= 0 {
limit = 20
}
mesURL := ctx.Config.Mes.BaseURL + "/api/internal/order/query?orderNo=" + url.QueryEscape(orderNo)
req, err := http.NewRequest(http.MethodGet, mesURL, nil)
if err != nil {
// 构造请求都失败属代码级异常,返回空列表让备料出库页可降级(仍可手输工单号)
ok(w, []mesOrder{})
return
}
req.Header.Set("X-API-TOKEN", ctx.Config.Mes.Token)
cli := &http.Client{Timeout: 5 * time.Second}
resp, err := cli.Do(req)
if err != nil {
// MES 未启用/不可达:优雅降级为空列表,不抛 502 打断备料出库页
// (用户仍可在 prep 页直接手输工单号查询台账;非 MES 场景请用「通用出库」)
ok(w, []mesOrder{})
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
ok(w, []mesOrder{})
return
}
var body struct {
Data []mesOrder `json:"data"`
}
if err := json.NewDecoder(resp.Body).Decode(&body); err != nil {
ok(w, []mesOrder{})
return
}
list := body.Data
if list == nil {
list = []mesOrder{}
}
sort.SliceStable(list, func(i, j int) bool {
di := mesDoneStatuses[list[i].Status]
dj := mesDoneStatuses[list[j].Status]
if di != dj {
return !di // 未完成在前
}
return list[i].WorkOrderNo < list[j].WorkOrderNo
})
// 排序(未完成优先)后截断:无输入默认前 20 条;模糊搜索返回匹配的前 20 条。
if len(list) > limit {
list = list[:limit]
}
ok(w, list)
}
}