feat(mes): 添加定时同步可生产数量到WMS及BOM项相关标准字段

- 在main.go中添加定时任务每10分钟同步可生产数量到WMS系统
- 为BomItem实体添加relatedStandard字段及相关CRUD方法
- 为InspectionRecord实体添加reportNo、materialCode、materialName等字段
- 更新ent schema确保新字段的验证和默认值设置
- 添加必要的数据库迁移和字段映射逻辑
This commit is contained in:
SunYF
2026-09-17 12:49:07 +08:00
parent b4b274301d
commit 1cc93795ce
191 changed files with 24504 additions and 1250 deletions
@@ -1,9 +1,14 @@
package handler
import (
"encoding/json"
"fmt"
"io"
"net/http"
"strconv"
"strings"
"bj_power_workstation/internal/store"
"bj_power_workstation/internal/svc"
)
@@ -34,4 +39,65 @@ func tighteningListHandler(ctx *svc.ServiceContext) http.HandlerFunc {
"list": list,
})
}
}
// tighteningRecordHandler POST /api/tightening/record —— 录入一条拧紧数据。
// 真实场景:工件走到「需要拧紧枪」的工艺步骤时界面聚焦拧紧输入框,人工操作拧紧枪把采集到的
// 扭矩值打入输入框回车 → 本接口按当前工件 SN + 工艺步骤落本地库,再由后台同步器上报 MES。
// 入参 {sn, workOrderNo, stepId, stepName, screwNo, torque, angle, result, operator}
// result 由前端按该步骤考核标准(扭矩 RANGE)判定后传入,非 NG 一律记 OK。
func tighteningRecordHandler(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 struct {
Sn string `json:"sn"`
WorkOrderNo string `json:"workOrderNo"`
StepId string `json:"stepId"`
StepName string `json:"stepName"`
ScrewNo string `json:"screwNo"`
Torque float64 `json:"torque"`
Angle float64 `json:"angle"`
Result string `json:"result"`
Operator string `json:"operator"`
}
if err := json.Unmarshal(payload, &req); err != nil {
fail(w, http.StatusBadRequest, "请求体解析失败")
return
}
if strings.TrimSpace(req.Sn) == "" {
fail(w, http.StatusBadRequest, "缺少工件 SN,请先上料")
return
}
if strings.TrimSpace(req.StepId) == "" {
fail(w, http.StatusBadRequest, "缺少拧紧工艺步骤")
return
}
if req.Result != "NG" {
req.Result = "OK"
}
dockCode := fmt.Sprintf("DOCK%02d", ctx.Config.Station.StationNo)
id, err := ctx.Store.InsertTorqueResult(store.TorqueResult{
WorkOrderNo: req.WorkOrderNo,
Sn: req.Sn,
DockCode: dockCode,
ScrewNo: req.ScrewNo,
StepId: req.StepId,
StepName: req.StepName,
Torque: req.Torque,
Angle: req.Angle,
Result: req.Result,
Operator: req.Operator,
})
if err != nil {
fail(w, http.StatusInternalServerError, "拧紧数据入库失败:"+err.Error())
return
}
ctx.Store.AddEventLog(req.WorkOrderNo, req.Operator, "torque_record",
fmt.Sprintf("拧紧录入 sn=%s 步骤=%s 扭矩=%.1f 结果=%s", req.Sn, req.StepName, req.Torque, req.Result))
ok(w, map[string]any{"id": id, "result": req.Result})
}
}