feat(mes): 添加定时同步可生产数量到WMS及BOM项相关标准字段
- 在main.go中添加定时任务每10分钟同步可生产数量到WMS系统 - 为BomItem实体添加relatedStandard字段及相关CRUD方法 - 为InspectionRecord实体添加reportNo、materialCode、materialName等字段 - 更新ent schema确保新字段的验证和默认值设置 - 添加必要的数据库迁移和字段映射逻辑
This commit is contained in:
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user