package handler import ( "encoding/json" "io" "net/http" "bj_power_workstation/internal/svc" ) // ============ 工位终端 → MES 内部 API 代理(巡检/应急/数量不符/退料) ============ // MES 侧对应接口以 X-API-TOKEN 保护(/api/internal/station/*),本服务用配置 token 转发。 // 统一:读请求体 → 注入 operator(当前登录人) → POST MES → 原样透传响应体。 // inspectionSubmitHandler POST /api/inspection/submit(签到/点检/过程巡检/完工确认/异常) // 请求体:{category, stationNo, orderNo, sn, shift, result, items, photo, remark, processCode, stepId, stepName, measuredValue} func inspectionSubmitHandler(ctx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { payload, err := io.ReadAll(r.Body) if err != nil { fail(w, http.StatusBadRequest, "请求体读取失败") return } var req map[string]any if err := json.Unmarshal(payload, &req); err != nil { fail(w, http.StatusBadRequest, "请求体解析失败") return } if req["category"] == nil || req["category"] == "" { fail(w, http.StatusBadRequest, "记录类型 category 必填") return } injectOperator(req, r) body, _ := json.Marshal(req) resp, _, perr := ctx.Mes.Post("/api/internal/station/inspection", json.RawMessage(body)) mesJSON(w, resp, perr) } } // emergencyCallHandler POST /api/emergency/call(应急呼叫:落 MES 预警中心) // 请求体:{stationNo, orderNo, remark} func emergencyCallHandler(ctx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { payload, err := io.ReadAll(r.Body) if err != nil { fail(w, http.StatusBadRequest, "请求体读取失败") return } var req map[string]any if err := json.Unmarshal(payload, &req); err != nil { fail(w, http.StatusBadRequest, "请求体解析失败") return } injectOperator(req, r) body, _ := json.Marshal(req) resp, _, perr := ctx.Mes.Post("/api/internal/station/emergency", json.RawMessage(body)) mesJSON(w, resp, perr) } } // qtyReportHandler POST /api/qty-report(工位数量不符上报:应发/实收/差异+原因) // 请求体:{stationNo, orderNo, sn, materialCode, materialName, planQty, actualQty, cause} func qtyReportHandler(ctx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { payload, err := io.ReadAll(r.Body) if err != nil { fail(w, http.StatusBadRequest, "请求体读取失败") return } var req map[string]any if err := json.Unmarshal(payload, &req); err != nil { fail(w, http.StatusBadRequest, "请求体解析失败") return } if req["materialCode"] == nil || req["materialCode"] == "" { fail(w, http.StatusBadRequest, "物料编码必填") return } injectOperator(req, r) body, _ := json.Marshal(req) resp, _, perr := ctx.Mes.Post("/api/internal/station/qty-report", json.RawMessage(body)) mesJSON(w, resp, perr) } } // returnMaterialHandler POST /api/return-material(工位退料回库房 → WMS 预建待确认退库单) // 请求体:{orderNo, stationNo, sn, materialCode, materialName, spec, qty, unit, reason} func returnMaterialHandler(ctx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { payload, err := io.ReadAll(r.Body) if err != nil { fail(w, http.StatusBadRequest, "请求体读取失败") return } var req map[string]any if err := json.Unmarshal(payload, &req); err != nil { fail(w, http.StatusBadRequest, "请求体解析失败") return } if req["materialCode"] == nil || req["materialCode"] == "" { fail(w, http.StatusBadRequest, "物料编码必填") return } if q, ok := req["qty"].(float64); !ok || int(q) <= 0 { fail(w, http.StatusBadRequest, "退库数量必须大于 0") return } injectOperator(req, r) body, _ := json.Marshal(req) resp, _, perr := ctx.Mes.Post("/api/internal/station/return-material", json.RawMessage(body)) mesJSON(w, resp, perr) } } // inspectionUploadHandler POST /api/inspection/upload(巡检拍照 base64 上传,代理 MES 内部接口) // 请求体:{filename, data(base64)} func inspectionUploadHandler(ctx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { payload, err := io.ReadAll(r.Body) if err != nil { fail(w, http.StatusBadRequest, "请求体读取失败") return } resp, _, perr := ctx.Mes.Post("/api/internal/station/inspection-upload", json.RawMessage(payload)) mesJSON(w, resp, perr) } } // injectOperator 若请求体未带 operator,则补当前登录人(工位终端 JWT 解析) func injectOperator(req map[string]any, r *http.Request) { if req["operator"] == nil || req["operator"] == "" { if u := currentUsername(r); u != "" { req["operator"] = u } } }