feat&refactor: 完成多模块功能迭代与配置优化

本次提交覆盖多个业务模块的功能完善与体验优化:
1.  **鉴权与配置调整**:
    - 统一JWT滑动续签逻辑,简化Token存储,移除RefreshToken相关冗余代码
    - 调整多项目配置文件中JWT过期时间为3600秒,统一会话闲置窗口
    - 工位配置放开1~12限制,改为仅校验大于0
2.  **术语统一替换**:全链路将"精密件"替换为"电气件",修正物料管理描述
3.  **功能新增**:
    - 新增工位类型、工艺路线与产线点位台账模块
    - 添加工艺PDF预览面板、工位终端代理转发接口
    - 新增操作日志按操作人列表筛选、工位登出日志记录
    - 新增PLC移料指令与产线点位状态管理
4.  **业务流程优化**:
    - 调整BOM物料删除校验逻辑,优化工单备料计算
    - 补充物料图号、检测单号等追溯字段
    - 完善工艺流程图与工位绑定关系说明
    - 优化前端页面文案与交互细节
5.  **代码规范与维护**:
    - 新增通用工具函数与前端静态资源
    - 整理路由权限与中间件逻辑
    - 修复部分接口与配置的不兼容问题
This commit is contained in:
SunYF
2026-09-10 16:59:15 +08:00
parent 6d8bb75696
commit 0ab21b1234
202 changed files with 21397 additions and 3172 deletions
+18 -8
View File
@@ -37,6 +37,7 @@ func createMaterialHandler(ctx *svc.ServiceContext) http.HandlerFunc {
Description string `json:"description"`
ManageMode int `json:"manageMode"` // 1批次/2序列号
TemplateCode string `json:"templateCode"`
DrawingNo string `json:"drawingNo"`
}
if err := parseJSON(r, &req); err != nil {
fail(w, http.StatusBadRequest, "参数错误")
@@ -76,6 +77,7 @@ func createMaterialHandler(ctx *svc.ServiceContext) http.HandlerFunc {
SetIsBatchManaged(manageMode == 1).
SetIsSerialManaged(manageMode == 2).
SetNillableTemplateCode(strPtr(req.TemplateCode)).
SetNillableDrawingNo(strPtr(req.DrawingNo)).
Save(ctx0())
if err != nil {
logx.Errorf("create material failed: %v", err)
@@ -98,9 +100,10 @@ func updateMaterialHandler(ctx *svc.ServiceContext) http.HandlerFunc {
ShortName string `json:"shortName"`
Spec string `json:"spec"`
Unit string `json:"unit"`
Description string `json:"description"`
ManageMode int `json:"manageMode"`
}
Description string `json:"description"`
ManageMode int `json:"manageMode"`
DrawingNo string `json:"drawingNo"`
}
if err := parseJSON(r, &req); err != nil || req.ID <= 0 {
fail(w, http.StatusBadRequest, "参数错误")
return
@@ -119,6 +122,7 @@ func updateMaterialHandler(ctx *svc.ServiceContext) http.HandlerFunc {
upd.SetSpec(req.Spec)
upd.SetUnit(req.Unit)
upd.SetDescription(req.Description)
upd.SetDrawingNo(req.DrawingNo)
if req.ManageMode > 0 {
upd.SetManageMode(req.ManageMode).
SetIsBatchManaged(req.ManageMode == 1).
@@ -332,6 +336,7 @@ func exportMaterialsHandler(ctx *svc.ServiceContext) http.HandlerFunc {
ItemType int
ManageMode int
Description string
DrawingNo string
CreatedAt int64
}
rows := make([]exportRow, 0, len(list))
@@ -340,17 +345,19 @@ func exportMaterialsHandler(ctx *svc.ServiceContext) http.HandlerFunc {
ID: m.ID, Code: m.Code, Name: m.Name, ShortName: m.ShortName, Spec: m.Spec,
Unit: m.Unit, ItemType: m.ItemType, ManageMode: m.ManageMode,
Description: m.Description, CreatedAt: m.CreatedAt,
DrawingNo: m.DrawingNo,
})
}
if r.URL.Query().Get("format") == "xlsx" {
headers := []string{"ID", "物料编码", "名称", "简称", "规格", "单位", "品类", "类型", "说明", "创建时间"}
headers := []string{"ID", "物料编码", "名称", "简称", "规格", "单位", "品类", "类型", "说明", "图号", "创建时间"}
matrix := make([][]any, 0, len(rows))
for _, rr := range rows {
matrix = append(matrix, []any{
rr.ID, rr.Code, rr.Name, rr.ShortName, rr.Spec, rr.Unit,
itemTypeLabel(rr.ItemType), manageModeLabel(rr.ManageMode),
rr.Description, unixFmt(rr.CreatedAt),
rr.DrawingNo,
})
}
sendExcel(w, xlsxFilename("物料档案"), headers, matrix)
@@ -360,13 +367,13 @@ func exportMaterialsHandler(ctx *svc.ServiceContext) http.HandlerFunc {
}
}
// parseManageMode 解析导入模板"类型"列:支持中文(结构件/精密件,含"(批次)/(SN)"后缀)
// parseManageMode 解析导入模板"类型"列:支持中文(结构件/电气件,含"(批次)/(SN)"后缀)
// 与旧数字格式(1/2)双向兼容;无法识别返回 0。
func parseManageMode(s string) int {
if s == "" {
return 0
}
if strings.Contains(s, "精密") || strings.EqualFold(s, "SN") {
if strings.Contains(s, "电气") || strings.EqualFold(s, "SN") {
return 2
}
if strings.Contains(s, "结构") || strings.Contains(s, "批次") {
@@ -379,7 +386,7 @@ func parseManageMode(s string) int {
}
// excelMaterialImportHandler 物料档案 Excel 批量导入
// 模板(首行忽略表头):物料编码 | 名称 | 简称 | 规格 | 单位 | 类型(结构件/精密件) | 说明
// 模板(首行忽略表头):物料编码 | 名称 | 简称 | 规格 | 单位 | 类型(结构件/电气件) | 说明 | 图号(可选)
// 强约束:全成功或全失败(一次性全导入 or 全失败,禁止部分成功)。
// 阶段1 逐行解析+校验(编码必填且唯一 / 名称必填 / 类型合法) → 任一错则整体拒绝并列出错误行;
// 阶段2 全部通过 → 开启单事务整体提交,任一步失败整体回滚。
@@ -422,6 +429,7 @@ func excelMaterialImportHandler(ctx *svc.ServiceContext) http.HandlerFunc {
unit string
manageMode int
description string
drawingNo string
}
plans := make([]planRow, 0, len(rows)-1)
errs := make([]importErr, 0)
@@ -445,6 +453,7 @@ func excelMaterialImportHandler(ctx *svc.ServiceContext) http.HandlerFunc {
pr.unit = cell(4)
pr.manageMode = parseManageMode(cell(5))
pr.description = cell(6)
pr.drawingNo = cell(7)
if pr.code == "" {
errs = append(errs, importErr{pr.row, pr.code, "物料编码为空"})
@@ -455,7 +464,7 @@ func excelMaterialImportHandler(ctx *svc.ServiceContext) http.HandlerFunc {
continue
}
if pr.manageMode == 0 {
errs = append(errs, importErr{pr.row, pr.code, "类型无法识别,请填写「结构件」或「精密件」(兼容 1/2"})
errs = append(errs, importErr{pr.row, pr.code, "类型无法识别,请填写「结构件」或「电气件」(兼容 1/2"})
continue
}
exists, _ := ctx.EntClient.Material.Query().
@@ -494,6 +503,7 @@ func excelMaterialImportHandler(ctx *svc.ServiceContext) http.HandlerFunc {
SetNillableSpec(strPtr(pr.spec)).
SetNillableUnit(strPtr(pr.unit)).
SetNillableDescription(strPtr(pr.description)).
SetNillableDrawingNo(strPtr(pr.drawingNo)).
SetManageMode(pr.manageMode).
SetIsBatchManaged(pr.manageMode == 1).
SetIsSerialManaged(pr.manageMode == 2).