Pārlūkot izejas kodu

feat(bom-upload): 下拉框支持输入创建+过滤无效空行

- el-select 添加 allow-create + default-first-option,用户可输入不存在于
  选项列表中的新值(采购人员/供应商/决策阶段/状态均支持)
- 输入新值后自动追加到本地选项列表,下次可选
- 解析时过滤无效行:子物料号存在但无销售订单号/合同号/父物料号的行跳过
- DECISION_STAGE_OPTIONS / STATUS_OPTIONS 改为 ref 支持动态新增
- Web 2.4.419 -> 2.4.420
Pengxy 14 stundas atpakaļ
vecāks
revīzija
a058f17c3d

+ 1 - 1
Web/package.json

@@ -1,7 +1,7 @@
 {
 	"name": "admin.net",
 	"type": "module",
-	"version": "2.4.419",
+	"version": "2.4.420",
 	"packageManager": "pnpm@10.32.1",
 	"lastBuildTime": "2026.03.15",
 	"description": "Admin.NET 站在巨人肩膀上的 .NET 通用权限开发框架",

+ 28 - 2
Web/src/views/aidop/business/workOrderBomUpload.vue

@@ -57,6 +57,8 @@
 								v-if="['purchaser', 'supplier', 'decisionStage', 'status'].includes(col.key)"
 								v-model="row[col.key]"
 								filterable
+								allow-create
+								default-first-option
 								:remote="col.key === 'supplier'"
 								:remote-method="col.key === 'supplier' ? searchSuppliers : undefined"
 								:loading="col.key === 'purchaser' ? purchaserLoading : col.key === 'supplier' ? supplierLoading : false"
@@ -187,8 +189,8 @@ const TABLE_COLUMNS: ColDef[] = [
 	{ key: 'issue', label: '异常问题', minWidth: 120, type: 'text' },
 ];
 
-const DECISION_STAGE_OPTIONS = ['待决策', '已发资料', '集采再询价', '竞价或扩额', '替代采购', '已维护价格'];
-const STATUS_OPTIONS = ['待决策', '已下订单', '已通知送货', '已部分到货', '已完成', '已删除', '被替代'];
+const DECISION_STAGE_OPTIONS = ref(['待决策', '已发资料', '集采再询价', '竞价或扩额', '替代采购', '已维护价格']);
+const STATUS_OPTIONS = ref(['待决策', '已下订单', '已通知送货', '已部分到货', '已完成', '已删除', '被替代']);
 
 // ── 数据状态 ──
 interface ParsedRow {
@@ -384,8 +386,30 @@ async function autoMatchSourceList(row: ParsedRow) {
 // ── 可编辑列变更处理 ──
 function onCellChange(row: ParsedRow, key: string) {
 	if (key === 'purchaser') {
+		const val = String(row.purchaser ?? '').trim();
+		if (val && !purchaserOptions.value.includes(val)) {
+			purchaserOptions.value.push(val);
+		}
 		autoMatchSupplierLocal(row);
 	}
+	if (key === 'decisionStage') {
+		const val = String(row.decisionStage ?? '').trim();
+		if (val && !DECISION_STAGE_OPTIONS.value.includes(val)) {
+			DECISION_STAGE_OPTIONS.value.push(val);
+		}
+	}
+	if (key === 'status') {
+		const val = String(row.status ?? '').trim();
+		if (val && !STATUS_OPTIONS.value.includes(val)) {
+			STATUS_OPTIONS.value.push(val);
+		}
+	}
+	if (key === 'supplier') {
+		const val = String(row.supplier ?? '').trim();
+		if (val && !supplierOptions.value.some((s) => s.value === val)) {
+			supplierOptions.value.unshift({ value: val, label: val });
+		}
+	}
 	if (key === 'supplier' && row.supplier && row.itemNum) {
 		saveSupplySourceRule(
 			String(row.itemNum),
@@ -503,6 +527,8 @@ function onFileChange(e: Event) {
 
 				// 子物料号为空则跳过
 				if (!row.itemNum) continue;
+				// 无BOM关键字段的行跳过(仅有采购负责人但无订单/合同/父物料号的无效行)
+				if (!row.salesOrderNo && !row.contractNo && !row.parentItemNum) continue;
 
 				// 默认状态
 				if (!row.status) row.status = '待决策';