本次提交覆盖多个业务模块的功能完善与体验优化:
1. **鉴权与配置调整**:
- 统一JWT滑动续签逻辑,简化Token存储,移除RefreshToken相关冗余代码
- 调整多项目配置文件中JWT过期时间为3600秒,统一会话闲置窗口
- 工位配置放开1~12限制,改为仅校验大于0
2. **术语统一替换**:全链路将"精密件"替换为"电气件",修正物料管理描述
3. **功能新增**:
- 新增工位类型、工艺路线与产线点位台账模块
- 添加工艺PDF预览面板、工位终端代理转发接口
- 新增操作日志按操作人列表筛选、工位登出日志记录
- 新增PLC移料指令与产线点位状态管理
4. **业务流程优化**:
- 调整BOM物料删除校验逻辑,优化工单备料计算
- 补充物料图号、检测单号等追溯字段
- 完善工艺流程图与工位绑定关系说明
- 优化前端页面文案与交互细节
5. **代码规范与维护**:
- 新增通用工具函数与前端静态资源
- 整理路由权限与中间件逻辑
- 修复部分接口与配置的不兼容问题
157 lines
4.8 KiB
Go
157 lines
4.8 KiB
Go
package handler
|
||
|
||
import (
|
||
"net/http"
|
||
"strings"
|
||
|
||
"bj_power_mes/common/httpx"
|
||
"bj_power_mes/internal/logic"
|
||
"bj_power_mes/internal/svc"
|
||
)
|
||
|
||
// OccupyPointHandler POST /line/occupy(点位人工记账:IN 上料占位 / OUT 下料释放)
|
||
// 供工位终端在无 PLC 联调时、或上料位(IN)/末端下料检测位(11/12) 人工操作时维护点位台账(唯一事实源)。
|
||
func OccupyPointHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||
return func(w http.ResponseWriter, r *http.Request) {
|
||
var req struct {
|
||
PointNo string `json:"pointNo"`
|
||
Sn string `json:"sn"`
|
||
OrderNo string `json:"orderNo"`
|
||
Operator string `json:"operator"`
|
||
Action string `json:"action"` // IN=上料 / OUT=下料
|
||
}
|
||
if err := httpx.ParseJSON(r, &req); err != nil {
|
||
httpx.BadRequest(w, "请求体解析失败")
|
||
return
|
||
}
|
||
action := strings.ToUpper(strings.TrimSpace(req.Action))
|
||
if action == "" {
|
||
action = "IN"
|
||
}
|
||
if action != "IN" && action != "OUT" {
|
||
httpx.BadRequest(w, "action 仅支持 IN(上料) / OUT(下料)")
|
||
return
|
||
}
|
||
op := req.Operator
|
||
if op == "" {
|
||
op = operator(r, "")
|
||
}
|
||
if err := logic.New(svcCtx).OccupyPoint(r.Context(), req.PointNo, req.Sn, req.OrderNo, op, action); err != nil {
|
||
httpx.Fail(w, 2407, err.Error())
|
||
return
|
||
}
|
||
msg := "上料已记账"
|
||
if action == "OUT" {
|
||
msg = "下料已释放"
|
||
}
|
||
httpx.OkMessage(w, msg, nil)
|
||
}
|
||
}
|
||
|
||
// ListPointsHandler GET /line/points(产线点位台账:上料位/工位/缓存位/接驳台/末端 当前工件)
|
||
func ListPointsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||
return func(w http.ResponseWriter, r *http.Request) {
|
||
_ = logic.New(svcCtx).InitLinePoints(r.Context())
|
||
data, err := logic.New(svcCtx).ListPoints(r.Context())
|
||
if err != nil {
|
||
httpx.Fail(w, 2401, err.Error())
|
||
return
|
||
}
|
||
httpx.Ok(w, data)
|
||
}
|
||
}
|
||
|
||
// IssueMoveHandler POST /line/move(上位机下发移料指令:起点位 → 目标点位)
|
||
func IssueMoveHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||
return func(w http.ResponseWriter, r *http.Request) {
|
||
var req struct {
|
||
Sn string `json:"sn"`
|
||
FromPoint string `json:"fromPoint"`
|
||
ToPoint string `json:"toPoint"`
|
||
OrderNo string `json:"orderNo"`
|
||
}
|
||
if err := httpx.ParseJSON(r, &req); err != nil {
|
||
httpx.BadRequest(w, "请求体解析失败")
|
||
return
|
||
}
|
||
data, err := logic.New(svcCtx).IssueMove(r.Context(), req.Sn, req.FromPoint, req.ToPoint, req.OrderNo, operator(r, ""))
|
||
if err != nil {
|
||
httpx.Fail(w, 2402, err.Error())
|
||
return
|
||
}
|
||
httpx.OkMessage(w, "移料指令已下发", data)
|
||
}
|
||
}
|
||
|
||
// AckMoveHandler POST /line/move/ack(PLC 应答)
|
||
func AckMoveHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||
return func(w http.ResponseWriter, r *http.Request) {
|
||
var req struct {
|
||
CmdNo string `json:"cmdNo"`
|
||
}
|
||
if err := httpx.ParseJSON(r, &req); err != nil {
|
||
httpx.BadRequest(w, "请求体解析失败")
|
||
return
|
||
}
|
||
if err := logic.New(svcCtx).AckMove(r.Context(), req.CmdNo); err != nil {
|
||
httpx.Fail(w, 2403, err.Error())
|
||
return
|
||
}
|
||
httpx.OkMessage(w, "已应答", nil)
|
||
}
|
||
}
|
||
|
||
// ArriveMoveHandler POST /line/move/arrive(工件到位:回写台账并闭环指令)
|
||
func ArriveMoveHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||
return func(w http.ResponseWriter, r *http.Request) {
|
||
var req struct {
|
||
CmdNo string `json:"cmdNo"`
|
||
}
|
||
if err := httpx.ParseJSON(r, &req); err != nil {
|
||
httpx.BadRequest(w, "请求体解析失败")
|
||
return
|
||
}
|
||
if err := logic.New(svcCtx).ArriveMove(r.Context(), req.CmdNo); err != nil {
|
||
httpx.Fail(w, 2404, err.Error())
|
||
return
|
||
}
|
||
httpx.OkMessage(w, "到位已记账", nil)
|
||
}
|
||
}
|
||
|
||
// ListMoveCmdsHandler GET /line/moves?status=&sn=&limit=
|
||
func ListMoveCmdsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||
return func(w http.ResponseWriter, r *http.Request) {
|
||
q := r.URL.Query()
|
||
data, err := logic.New(svcCtx).ListMoveCmds(r.Context(), q.Get("status"), q.Get("sn"),
|
||
atoiDefault(q.Get("limit"), 50))
|
||
if err != nil {
|
||
httpx.Fail(w, 2405, err.Error())
|
||
return
|
||
}
|
||
httpx.Ok(w, data)
|
||
}
|
||
}
|
||
|
||
// CallMaterialHandler POST /line/call-material(工位终端叫料:选接驳台)
|
||
func CallMaterialHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||
return func(w http.ResponseWriter, r *http.Request) {
|
||
var req struct {
|
||
StationNo int `json:"stationNo"`
|
||
Dock string `json:"dock"`
|
||
OrderNo string `json:"orderNo"`
|
||
Items []logic.CallMaterialItem `json:"items"`
|
||
}
|
||
if err := httpx.ParseJSON(r, &req); err != nil {
|
||
httpx.BadRequest(w, "请求体解析失败")
|
||
return
|
||
}
|
||
n, err := logic.New(svcCtx).CallMaterial(r.Context(), req.StationNo, req.Dock, req.OrderNo, operator(r, ""), req.Items)
|
||
if err != nil {
|
||
httpx.Fail(w, 2406, err.Error())
|
||
return
|
||
}
|
||
httpx.OkMessage(w, "叫料已提交", map[string]any{"count": n})
|
||
}
|
||
}
|