refactor(wms/mes): 统一多场景查询逻辑,移除关键字混搜

1. 移除所有多字段关键字混搜,改为各筛选字段独立查询
2. 调整excel导出相关逻辑,优化文件名处理与导入模板
3. 修复物料导入的类型解析与token获取逻辑
4. 更新依赖与前端页面文案、筛选参数
This commit is contained in:
SunYF
2026-09-08 13:43:08 +08:00
parent e852c7cd37
commit 6d8bb75696
16 changed files with 141 additions and 114 deletions
+29 -10
View File
@@ -148,7 +148,7 @@ func queryMaterialsHandler(ctx *svc.ServiceContext) http.HandlerFunc {
itemType := atoi(r.URL.Query().Get("itemType"), 0)
startDate := r.URL.Query().Get("startDate")
endDate := r.URL.Query().Get("endDate")
keyword := r.URL.Query().Get("keyword") // 兼容旧版,作为物料编码/名称兜底
keyword := r.URL.Query().Get("keyword") // 仅供下拉选择框(MaterialSelect)远程搜索:编码/名称任一匹配;列表页禁用此混搜模式
q := ctx.EntClient.Material.Query()
if materialCode != "" {
@@ -191,7 +191,7 @@ func queryMaterialsHandler(ctx *svc.ServiceContext) http.HandlerFunc {
return
}
list, err := q.Order(ent.Asc("id")).
list, err := q.Order(ent.Desc("id")).
Offset((page - 1) * pageSize).
Limit(pageSize).
All(ctx0())
@@ -316,13 +316,14 @@ func exportMaterialsHandler(ctx *svc.ServiceContext) http.HandlerFunc {
if itemType != 0 {
q = q.Where(material.ItemTypeEQ(itemType))
}
list, err := q.Order(ent.Asc("id")).All(ctx0())
list, err := q.Order(ent.Desc("id")).All(ctx0())
if err != nil {
fail(w, http.StatusInternalServerError, err.Error())
return
}
type exportRow struct {
ID int
Code string
Name string
ShortName string
@@ -336,18 +337,18 @@ func exportMaterialsHandler(ctx *svc.ServiceContext) http.HandlerFunc {
rows := make([]exportRow, 0, len(list))
for _, m := range list {
rows = append(rows, exportRow{
Code: m.Code, Name: m.Name, ShortName: m.ShortName, Spec: m.Spec,
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,
})
}
if r.URL.Query().Get("format") == "xlsx" {
headers := []string{"物料编码", "名称", "简称", "规格", "单位", "品类", "类型", "说明", "创建时间"}
headers := []string{"ID", "物料编码", "名称", "简称", "规格", "单位", "品类", "类型", "说明", "创建时间"}
matrix := make([][]any, 0, len(rows))
for _, rr := range rows {
matrix = append(matrix, []any{
rr.Code, rr.Name, rr.ShortName, rr.Spec, rr.Unit,
rr.ID, rr.Code, rr.Name, rr.ShortName, rr.Spec, rr.Unit,
itemTypeLabel(rr.ItemType), manageModeLabel(rr.ManageMode),
rr.Description, unixFmt(rr.CreatedAt),
})
@@ -359,8 +360,26 @@ func exportMaterialsHandler(ctx *svc.ServiceContext) http.HandlerFunc {
}
}
// parseManageMode 解析导入模板"类型"列:支持中文(结构件/精密件,含"(批次)/(SN)"后缀)
// 与旧数字格式(1/2)双向兼容;无法识别返回 0。
func parseManageMode(s string) int {
if s == "" {
return 0
}
if strings.Contains(s, "精密") || strings.EqualFold(s, "SN") {
return 2
}
if strings.Contains(s, "结构") || strings.Contains(s, "批次") {
return 1
}
if n := atoi(s, 0); n == 1 || n == 2 {
return n
}
return 0
}
// excelMaterialImportHandler 物料档案 Excel 批量导入
// 模板(首行忽略表头):物料编码 | 名称 | 简称 | 规格 | 单位 | 类型(1结构件/2精密件) | 说明
// 模板(首行忽略表头):物料编码 | 名称 | 简称 | 规格 | 单位 | 类型(结构件/精密件) | 说明
// 强约束:全成功或全失败(一次性全导入 or 全失败,禁止部分成功)。
// 阶段1 逐行解析+校验(编码必填且唯一 / 名称必填 / 类型合法) → 任一错则整体拒绝并列出错误行;
// 阶段2 全部通过 → 开启单事务整体提交,任一步失败整体回滚。
@@ -424,7 +443,7 @@ func excelMaterialImportHandler(ctx *svc.ServiceContext) http.HandlerFunc {
pr.shortName = cell(2)
pr.spec = cell(3)
pr.unit = cell(4)
pr.manageMode = atoi(cell(5), 1)
pr.manageMode = parseManageMode(cell(5))
pr.description = cell(6)
if pr.code == "" {
@@ -435,8 +454,8 @@ func excelMaterialImportHandler(ctx *svc.ServiceContext) http.HandlerFunc {
errs = append(errs, importErr{pr.row, pr.code, "名称为空"})
continue
}
if pr.manageMode != 1 && pr.manageMode != 2 {
errs = append(errs, importErr{pr.row, pr.code, "类型必须为 1(结构件) 或 2(精密件)"})
if pr.manageMode == 0 {
errs = append(errs, importErr{pr.row, pr.code, "类型无法识别,请填写「结构件」或「精密件」(兼容 1/2)"})
continue
}
exists, _ := ctx.EntClient.Material.Query().