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
+8 -16
View File
@@ -39,7 +39,6 @@ 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"`
ItemType int `json:"itemType"` // 1原材料/2半成品/3成品/4其他
SafetyStock int `json:"safetyStock"` // 安全库存(低于触发缺货预警)
}
@@ -48,7 +47,7 @@ func createMaterialHandler(ctx *svc.ServiceContext) http.HandlerFunc {
return
}
if req.Code == "" || req.Name == "" {
fail(w, http.StatusBadRequest, "code 和 name 必填")
fail(w, http.StatusBadRequest, "图号和名称必填")
return
}
// 其他类(辅料/工装/试验设备):规格强制必填(客户诉求 问题记录 L50)
@@ -66,7 +65,7 @@ func createMaterialHandler(ctx *svc.ServiceContext) http.HandlerFunc {
return
}
if exists {
fail(w, http.StatusConflict, "物料编码已存在: "+req.Code)
fail(w, http.StatusConflict, "图号已存在: "+req.Code)
return
}
@@ -94,7 +93,6 @@ func createMaterialHandler(ctx *svc.ServiceContext) http.HandlerFunc {
SetIsBatchManaged(manageMode == 1).
SetIsSerialManaged(manageMode == 2).
SetNillableTemplateCode(strPtr(req.TemplateCode)).
SetNillableDrawingNo(strPtr(req.DrawingNo)).
SetItemType(itemType).
SetSafetyStock(req.SafetyStock).
Save(ctx0())
@@ -121,7 +119,6 @@ func updateMaterialHandler(ctx *svc.ServiceContext) http.HandlerFunc {
Unit string `json:"unit"`
Description string `json:"description"`
ManageMode int `json:"manageMode"`
DrawingNo string `json:"drawingNo"`
ItemType int `json:"itemType"`
SafetyStock int `json:"safetyStock"`
}
@@ -143,7 +140,6 @@ 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.ItemType > 0 {
upd.SetItemType(req.ItemType)
}
@@ -361,7 +357,6 @@ func exportMaterialsHandler(ctx *svc.ServiceContext) http.HandlerFunc {
ItemType int
ManageMode int
Description string
DrawingNo string
CreatedAt int64
}
rows := make([]exportRow, 0, len(list))
@@ -370,19 +365,18 @@ 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", "物料编码", "名称", "简称", "规格", "单位", "品类", "类型", "说明", "图号", "创建时间"}
// 图号=物料编码(问题记录 L18 合并裁决):导出表头统一叫「图号」
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)
@@ -411,7 +405,8 @@ func parseManageMode(s string) int {
}
// excelMaterialImportHandler 物料档案 Excel 批量导入
// 模板(首行忽略表头):物料编码 | 名称 | 简称 | 规格 | 单位 | 类型(结构件/电气件) | 说明 | 图号(可选)
// 模板(首行忽略表头):图号 | 名称 | 简称 | 规格 | 单位 | 类型(结构件/电气件) | 说明
// (图号=物料编码,问题记录 L18 合并裁决,不再单设图号列)
// 强约束:全成功或全失败(一次性全导入 or 全失败,禁止部分成功)。
// 阶段1 逐行解析+校验(编码必填且唯一 / 名称必填 / 类型合法) → 任一错则整体拒绝并列出错误行;
// 阶段2 全部通过 → 开启单事务整体提交,任一步失败整体回滚。
@@ -454,7 +449,6 @@ 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)
@@ -478,10 +472,9 @@ 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, "物料编码为空"})
errs = append(errs, importErr{pr.row, pr.code, "图号为空"})
continue
}
if pr.name == "" {
@@ -495,7 +488,7 @@ func excelMaterialImportHandler(ctx *svc.ServiceContext) http.HandlerFunc {
exists, _ := ctx.EntClient.Material.Query().
Where(material.CodeEQ(pr.code)).Exist(ctx0())
if exists {
errs = append(errs, importErr{pr.row, pr.code, "物料编码已存在: " + pr.code})
errs = append(errs, importErr{pr.row, pr.code, "图号已存在: " + pr.code})
continue
}
plans = append(plans, pr)
@@ -528,7 +521,6 @@ 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).