Files
bj_power/bj_power_wms/internal/mesclient/client.go
T
SunYF b6799c9de4 feat: 完成产线与仓储系统多模块迭代升级
本次迭代覆盖MES与WMS核心业务:
1. 新增接驳台托盘传感器读取与AGV对接能力
2. 完善工单排产、备料流程与权限体系拆分
3. 优化看板接口与前端路由、样式
4. 新增操作日志、库存盘点与角色保护逻辑
5. 修复代理地址、BOM保存等已知问题
2026-09-04 14:18:53 +08:00

107 lines
2.7 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 mesclient MES 内部接口客户端(备料单拉取/状态回写,AGV 配送用)。
package mesclient
import (
"bytes"
"context"
"encoding/json"
"fmt"
"net/http"
"time"
)
// Client MES 内部接口客户端
type Client struct {
baseURL string
token string
hc *http.Client
}
func New(baseURL, token string) *Client {
if baseURL == "" {
baseURL = "http://127.0.0.1:8888"
}
return &Client{
baseURL: baseURL,
token: token,
hc: &http.Client{Timeout: 6 * time.Second},
}
}
// MaterialRequest MES 备料单行
type MaterialRequest struct {
ID int `json:"id"`
RequestNo string `json:"requestNo"`
OrderNo string `json:"orderNo"`
PlanDate string `json:"planDate"`
MaterialCode string `json:"materialCode"`
MaterialName string `json:"materialName"`
Unit string `json:"unit"`
ManageMode string `json:"manageMode"`
ReqQty float64 `json:"reqQty"`
Status string `json:"status"`
TargetDock string `json:"targetDock"`
Operator string `json:"operator"`
}
// ListMaterialRequests 拉取备料单(含 target_dock
// status 空=全部;传 PENDING 可只取待发料。
func (c *Client) ListMaterialRequests(ctx context.Context, status string) ([]MaterialRequest, error) {
u := c.baseURL + "/api/internal/material-requests"
q := ""
if status != "" {
q = "?status=" + status
}
req, err := http.NewRequestWithContext(ctx, http.MethodGet, u+q, nil)
if err != nil {
return nil, err
}
req.Header.Set("X-API-TOKEN", c.token)
resp, err := c.hc.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
var env struct {
Code int `json:"code"`
Data []MaterialRequest `json:"data"`
Msg string `json:"message"`
}
dec := json.NewDecoder(resp.Body)
// MES 的 data 可能是 [object] 数组
if err := dec.Decode(&env); err != nil {
return nil, err
}
if env.Data == nil {
return []MaterialRequest{}, nil
}
return env.Data, nil
}
// MarkStatus 回写备料单状态(DELIVERING / DONE
func (c *Client) MarkStatus(ctx context.Context, requestNo, status string) error {
b, _ := json.Marshal(map[string]string{"requestNo": requestNo, "status": status})
req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.baseURL+"/api/internal/material-request/status", bytes.NewReader(b))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-API-TOKEN", c.token)
resp, err := c.hc.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode >= 300 {
return &RespError{Status: resp.StatusCode}
}
return nil
}
type RespError struct {
Status int
}
func (e *RespError) Error() string {
return "mes call failed with status " + fmt.Sprintf("%d", e.Status)
}