feat&refactor: 完成多模块功能迭代与配置优化
本次提交覆盖多个业务模块的功能完善与体验优化:
1. **鉴权与配置调整**:
- 统一JWT滑动续签逻辑,简化Token存储,移除RefreshToken相关冗余代码
- 调整多项目配置文件中JWT过期时间为3600秒,统一会话闲置窗口
- 工位配置放开1~12限制,改为仅校验大于0
2. **术语统一替换**:全链路将"精密件"替换为"电气件",修正物料管理描述
3. **功能新增**:
- 新增工位类型、工艺路线与产线点位台账模块
- 添加工艺PDF预览面板、工位终端代理转发接口
- 新增操作日志按操作人列表筛选、工位登出日志记录
- 新增PLC移料指令与产线点位状态管理
4. **业务流程优化**:
- 调整BOM物料删除校验逻辑,优化工单备料计算
- 补充物料图号、检测单号等追溯字段
- 完善工艺流程图与工位绑定关系说明
- 优化前端页面文案与交互细节
5. **代码规范与维护**:
- 新增通用工具函数与前端静态资源
- 整理路由权限与中间件逻辑
- 修复部分接口与配置的不兼容问题
This commit is contained in:
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user