Jelajahi Sumber

feat(s7): FQC 新增报检表单优化——报检数量默认带指令单数量、检验优先级改下拉(正常/紧急默认正常)

- 引用工单时报检数量默认回填指令单数量(qtyOrded)
- 检验优先级由文本框改为下拉框,选项 正常/紧急,新建默认正常
- 表单默认值/回填逻辑抽出 fqcApplyForm.ts + 单测;版本 Web 2.4.300
YY968XX 4 hari lalu
induk
melakukan
24eaaa210b

+ 1 - 1
Web/package.json

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

+ 26 - 0
Web/src/views/aidop/s7/fqc/fqcApplyForm.spec.ts

@@ -0,0 +1,26 @@
+import { describe, expect, it } from 'vitest';
+import { createFqcApplyForm, fillFqcApplyFormFromWorkOrder } from './fqcApplyForm';
+
+describe('成品报检表单默认值', () => {
+	it('新建时检验优先级默认为正常', () => {
+		expect(createFqcApplyForm().priority).toBe('正常');
+	});
+
+	it('引用工单时将指令单数量带入报检数量', () => {
+		const form = createFqcApplyForm();
+		fillFqcApplyFormFromWorkOrder(form, {
+			recId: 1,
+			batch: '500000010',
+			materialCode: '91HC0497',
+			productName: '集成操控设备主机',
+			productModel: 'AP9',
+			lotSerial: '260811001',
+			qtyOrded: 965,
+			qtyCompleted: 0,
+			status: 'C',
+		});
+
+		expect(form.qtyOrded).toBe(965);
+		expect(form.qty).toBe(965);
+	});
+});

+ 47 - 0
Web/src/views/aidop/s7/fqc/fqcApplyForm.ts

@@ -0,0 +1,47 @@
+import type { FqcWorkOrderRow } from '../api/fqcApply';
+
+export const FQC_PRIORITY_OPTIONS = ['正常', '紧急'] as const;
+
+export interface FqcApplyForm {
+	workOrdRecId: number | null;
+	batch: string;
+	materialCode: string;
+	productName: string;
+	productModel: string;
+	lotSerial: string;
+	qtyOrded: number | null;
+	qtyCompleted: number | null;
+	qty: number | null;
+	priority: string;
+	fireNo: string;
+	remark: string;
+}
+
+export function createFqcApplyForm(): FqcApplyForm {
+	return {
+		workOrdRecId: null,
+		batch: '',
+		materialCode: '',
+		productName: '',
+		productModel: '',
+		lotSerial: '',
+		qtyOrded: null,
+		qtyCompleted: null,
+		qty: null,
+		priority: '正常',
+		fireNo: '',
+		remark: '',
+	};
+}
+
+export function fillFqcApplyFormFromWorkOrder(form: FqcApplyForm, row: FqcWorkOrderRow) {
+	form.workOrdRecId = row.recId;
+	form.batch = row.batch || '';
+	form.materialCode = row.materialCode || '';
+	form.productName = row.productName || '';
+	form.productModel = row.productModel || '';
+	form.lotSerial = row.lotSerial || '';
+	form.qtyOrded = row.qtyOrded ?? null;
+	form.qtyCompleted = row.qtyCompleted ?? null;
+	form.qty = row.qtyOrded ?? null;
+}

+ 9 - 13
Web/src/views/aidop/s7/fqc/fqcApplyList.vue

@@ -51,7 +51,11 @@
 					<el-descriptions-item label="已完成数量">{{ form.qtyCompleted ?? '-' }}</el-descriptions-item>
 				</el-descriptions>
 				<el-form-item label="报检数量"><el-input-number v-model="form.qty" :controls="false" :min="0" style="width: 180px" /></el-form-item>
-				<el-form-item label="检验优先级"><el-input v-model="form.priority" style="width: 180px" /></el-form-item>
+				<el-form-item label="检验优先级">
+					<el-select v-model="form.priority" style="width: 180px">
+						<el-option v-for="item in FQC_PRIORITY_OPTIONS" :key="item" :label="item" :value="item" />
+					</el-select>
+				</el-form-item>
 				<el-form-item label="击发编号"><el-input v-model="form.fireNo" style="width: 260px" /></el-form-item>
 				<el-form-item label="备注"><el-input v-model="form.remark" type="textarea" :rows="2" style="width: 360px" /></el-form-item>
 			</el-form>
@@ -116,6 +120,7 @@ import { useRoute, useRouter } from 'vue-router';
 import { ElMessage } from 'element-plus';
 import AidopDemoShell from '/@/views/aidop/components/AidopDemoShell.vue';
 import { fetchFqcWorkOrders, fetchFqcApplyPage, fetchFqcApplyDetail, createFqcApply, generateFqcInspection, type FqcWorkOrderRow, type FqcApplyRow } from '../api/fqcApply';
+import { createFqcApplyForm, fillFqcApplyFormFromWorkOrder, FQC_PRIORITY_OPTIONS } from './fqcApplyForm';
 
 const route = useRoute();
 const router = useRouter();
@@ -154,11 +159,9 @@ function doSearch() {
 // 新增报检
 const createVisible = ref(false);
 const saving = ref(false);
-const form = reactive<{ workOrdRecId: number | null; batch: string; materialCode: string; productName: string; productModel: string; lotSerial: string; qtyOrded: number | null; qtyCompleted: number | null; qty: number | null; priority: string; fireNo: string; remark: string }>({
-	workOrdRecId: null, batch: '', materialCode: '', productName: '', productModel: '', lotSerial: '', qtyOrded: null, qtyCompleted: null, qty: null, priority: '', fireNo: '', remark: '',
-});
+const form = reactive(createFqcApplyForm());
 function openCreate() {
-	Object.assign(form, { workOrdRecId: null, batch: '', materialCode: '', productName: '', productModel: '', lotSerial: '', qtyOrded: null, qtyCompleted: null, qty: null, priority: '', fireNo: '', remark: '' });
+	Object.assign(form, createFqcApplyForm());
 	createVisible.value = true;
 }
 async function onCreate() {
@@ -213,14 +216,7 @@ function woHint(row: FqcWorkOrderRow): string {
 	return '';
 }
 function pickWo(row: FqcWorkOrderRow) {
-	form.workOrdRecId = row.recId;
-	form.batch = row.batch || '';
-	form.materialCode = row.materialCode || '';
-	form.productName = row.productName || '';
-	form.productModel = row.productModel || '';
-	form.lotSerial = row.lotSerial || '';
-	form.qtyOrded = row.qtyOrded ?? null;
-	form.qtyCompleted = row.qtyCompleted ?? null;
+	fillFqcApplyFormFromWorkOrder(form, row);
 	woVisible.value = false;
 }