瀏覽代碼

feat(s5): 来料检验任务列表/结果列表只读页面 + 菜单重指

- 新增 iqcTaskList.vue / iqcResultList.vue 两个只读 UI 页面(照截图还原查询区/列名/空态,无接口、静态空表)
- SysMenuSeedData.cs 两条菜单 Component 由 placeholder 重指真实页面
- UpdateScripts/1.0.215.sql 重指既有两条菜单 Component(幂等 UPDATE)
- bump version Web 2.4.210 / server 1.0.215
YY968XX 1 周之前
父節點
當前提交
fe3de2e4fe

+ 1 - 1
Web/package.json

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

+ 142 - 0
Web/src/views/aidop/s5/iqc/iqcResultList.vue

@@ -0,0 +1,142 @@
+<template>
+	<AidopDemoShell :title="pageTitle" subtitle="只读列表">
+		<el-form :inline="true" :model="query" class="mb12" @submit.prevent>
+			<el-form-item label="单据编号">
+				<el-input v-model="query.billNo" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="来源单据编号">
+				<el-input v-model="query.sourceBillNo" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="处理方式">
+				<el-select v-model="query.handleMode" placeholder="请选择" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="检验人">
+				<el-select v-model="query.inspector" placeholder="请选择" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="物料编码">
+				<el-input v-model="query.materialCode" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="批次号">
+				<el-input v-model="query.batchNo" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="检验日期-始">
+				<el-date-picker v-model="query.inspectDateStart" type="date" value-format="YYYY-MM-DD" style="width: 180px" />
+			</el-form-item>
+			<el-form-item label="检验日期-终">
+				<el-date-picker v-model="query.inspectDateEnd" type="date" value-format="YYYY-MM-DD" style="width: 180px" />
+			</el-form-item>
+			<el-form-item label="偏差申请">
+				<el-select v-model="query.deviationApply" placeholder="请选择" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="判定">
+				<el-select v-model="query.judgement" placeholder="请选择" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item>
+				<el-button type="primary" @click="doSearch">查询</el-button>
+				<el-button @click="resetQuery">重置</el-button>
+			</el-form-item>
+		</el-form>
+
+		<el-table :data="rows" row-key="id" v-loading="loading" border stripe>
+			<el-table-column prop="billNo" label="单据编号" min-width="150" show-overflow-tooltip resizable />
+			<el-table-column prop="sourceBillNo" label="来源单据编号" min-width="150" show-overflow-tooltip resizable />
+			<el-table-column prop="billType" label="单据类型" min-width="120" show-overflow-tooltip resizable />
+			<el-table-column prop="bizType" label="业务类型" min-width="120" show-overflow-tooltip resizable />
+			<el-table-column prop="inspectDate" label="检验日期" min-width="160" resizable />
+			<el-table-column prop="qcOrg" label="质检组织" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="deviationApply" label="偏差申请" min-width="110" resizable />
+			<el-table-column prop="deviationDesc" label="偏差说明" min-width="160" show-overflow-tooltip resizable />
+			<el-table-column prop="remark" label="备注" min-width="160" show-overflow-tooltip resizable />
+			<el-table-column prop="materialCode" label="物料编码" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="materialName" label="物料名称" min-width="160" show-overflow-tooltip resizable />
+			<el-table-column prop="spec" label="规格型号" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="sampleQty" label="样本数量" min-width="110" resizable />
+			<el-table-column prop="sampleInfo" label="样品信息" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="batchNo" label="批次号" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="inspectStrictness" label="检验宽严度" min-width="120" resizable />
+			<el-table-column prop="judgement" label="判定" min-width="100" resizable />
+			<el-table-column prop="inspector" label="检验人" min-width="120" show-overflow-tooltip resizable />
+			<el-table-column prop="inspectQty" label="检验数量" min-width="110" resizable />
+			<el-table-column prop="qualifiedQty" label="合格数量" min-width="110" resizable />
+			<el-table-column prop="unqualifiedQty" label="不合格数量" min-width="120" resizable />
+			<el-table-column prop="retainedQty" label="留样数量" min-width="110" resizable />
+			<el-table-column prop="destroyedQty" label="破坏数量" min-width="110" resizable />
+			<el-table-column prop="handleMode" label="处理方式" min-width="120" resizable />
+			<el-table-column prop="defectCategory" label="不良问题分类" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="drawingNo" label="图号" min-width="120" show-overflow-tooltip resizable />
+			<el-table-column prop="supplierBatchNo" label="供应商批号" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="supplierName" label="供应商名称" min-width="160" show-overflow-tooltip resizable />
+			<template #empty>
+				<el-empty description="暂无数据" />
+			</template>
+		</el-table>
+
+		<div class="pager">
+			<el-pagination
+				v-model:current-page="query.page"
+				v-model:page-size="query.pageSize"
+				:total="total"
+				:page-sizes="[10, 20, 50]"
+				layout="total, sizes, prev, pager, next"
+			/>
+		</div>
+	</AidopDemoShell>
+</template>
+
+<script setup lang="ts" name="aidopS5IqcResultList">
+import { computed, reactive, ref } from 'vue';
+import { useRoute } from 'vue-router';
+import AidopDemoShell from '/@/views/aidop/components/AidopDemoShell.vue';
+
+const route = useRoute();
+const pageTitle = computed(() => (route.meta?.title as string) || '来料检验结果列表');
+
+const query = reactive({
+	billNo: '',
+	sourceBillNo: '',
+	handleMode: '',
+	inspector: '',
+	materialCode: '',
+	batchNo: '',
+	inspectDateStart: '',
+	inspectDateEnd: '',
+	deviationApply: '',
+	judgement: '',
+	page: 1,
+	pageSize: 10,
+});
+
+// 本批次为只读 UI 骨架,尚无真实检验结果接口:渲染空表,不发请求、不造数据。
+const loading = ref(false);
+const rows = ref<Record<string, unknown>[]>([]);
+const total = ref(0);
+
+function doSearch() {
+	query.page = 1;
+}
+
+function resetQuery() {
+	query.billNo = '';
+	query.sourceBillNo = '';
+	query.handleMode = '';
+	query.inspector = '';
+	query.materialCode = '';
+	query.batchNo = '';
+	query.inspectDateStart = '';
+	query.inspectDateEnd = '';
+	query.deviationApply = '';
+	query.judgement = '';
+	query.page = 1;
+}
+</script>
+
+<style scoped lang="scss">
+.mb12 {
+	margin-bottom: 12px;
+}
+.pager {
+	margin-top: 12px;
+	display: flex;
+	justify-content: flex-end;
+}
+</style>

+ 160 - 0
Web/src/views/aidop/s5/iqc/iqcTaskList.vue

@@ -0,0 +1,160 @@
+<template>
+	<AidopDemoShell :title="pageTitle" subtitle="只读列表">
+		<div class="filter-hint">查询条件:未检验;</div>
+		<el-form :inline="true" :model="query" class="mb12" @submit.prevent>
+			<el-form-item label="单据编号">
+				<el-input v-model="query.billNo" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="物料编码">
+				<el-input v-model="query.materialCode" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="物料名称">
+				<el-input v-model="query.materialName" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="申请时间-始">
+				<el-date-picker v-model="query.applyTimeStart" type="date" value-format="YYYY-MM-DD" style="width: 180px" />
+			</el-form-item>
+			<el-form-item label="申请时间-终">
+				<el-date-picker v-model="query.applyTimeEnd" type="date" value-format="YYYY-MM-DD" style="width: 180px" />
+			</el-form-item>
+			<el-form-item label="检验进度">
+				<el-input v-model="query.inspectProgress" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="检验优先级">
+				<el-select v-model="query.priority" placeholder="请选择" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="检验负责人">
+				<el-select v-model="query.inspector" placeholder="请选择" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="供应商批号">
+				<el-input v-model="query.supplierBatchNo" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="供应商简称">
+				<el-input v-model="query.supplierShortName" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="瑞奇批号">
+				<el-input v-model="query.rqBatchNo" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="检验开始时间-始">
+				<el-date-picker v-model="query.inspectStartFrom" type="date" value-format="YYYY-MM-DD" style="width: 180px" />
+			</el-form-item>
+			<el-form-item label="检验开始时间-终">
+				<el-date-picker v-model="query.inspectStartTo" type="date" value-format="YYYY-MM-DD" style="width: 180px" />
+			</el-form-item>
+			<el-form-item label="检验完成时间-始">
+				<el-date-picker v-model="query.inspectFinishFrom" type="date" value-format="YYYY-MM-DD" style="width: 180px" />
+			</el-form-item>
+			<el-form-item label="检验完成时间-终">
+				<el-date-picker v-model="query.inspectFinishTo" type="date" value-format="YYYY-MM-DD" style="width: 180px" />
+			</el-form-item>
+			<el-form-item>
+				<el-button type="primary" @click="doSearch">查询</el-button>
+				<el-button @click="resetQuery">重置</el-button>
+			</el-form-item>
+		</el-form>
+
+		<el-table :data="rows" row-key="id" v-loading="loading" border stripe>
+			<el-table-column prop="supplierBatchNo" label="供应商批号" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="rqBatchNo" label="瑞奇批号" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="supplierCode" label="供应商编号" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="supplierShortName" label="供应商简称" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="warehouse" label="仓库" min-width="120" show-overflow-tooltip resizable />
+			<el-table-column prop="shelf" label="货架" min-width="120" show-overflow-tooltip resizable />
+			<el-table-column prop="materialCode" label="物料编码" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="materialName" label="物料名称" min-width="160" show-overflow-tooltip resizable />
+			<el-table-column prop="spec" label="规格型号" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="inspectQty" label="报检数量" min-width="110" resizable />
+			<el-table-column prop="unit" label="单位" min-width="90" resizable />
+			<el-table-column prop="inspectProgress" label="检验进度" min-width="110" resizable />
+			<el-table-column prop="priority" label="检验优先级" min-width="110" resizable />
+			<el-table-column prop="inspector" label="检验负责人" min-width="120" show-overflow-tooltip resizable />
+			<el-table-column prop="inspectStartTime" label="检验开始时间" min-width="170" resizable />
+			<el-table-column prop="inspectFinishTime" label="检验完成时间" min-width="170" resizable />
+			<template #empty>
+				<el-empty description="暂无数据" />
+			</template>
+		</el-table>
+
+		<div class="pager">
+			<el-pagination
+				v-model:current-page="query.page"
+				v-model:page-size="query.pageSize"
+				:total="total"
+				:page-sizes="[10, 20, 50]"
+				layout="total, sizes, prev, pager, next"
+			/>
+		</div>
+	</AidopDemoShell>
+</template>
+
+<script setup lang="ts" name="aidopS5IqcTaskList">
+import { computed, reactive, ref } from 'vue';
+import { useRoute } from 'vue-router';
+import AidopDemoShell from '/@/views/aidop/components/AidopDemoShell.vue';
+
+const route = useRoute();
+const pageTitle = computed(() => (route.meta?.title as string) || '来料检验任务列表');
+
+const query = reactive({
+	billNo: '',
+	materialCode: '',
+	materialName: '',
+	applyTimeStart: '',
+	applyTimeEnd: '',
+	inspectProgress: '未检验',
+	priority: '',
+	inspector: '',
+	supplierBatchNo: '',
+	supplierShortName: '',
+	rqBatchNo: '',
+	inspectStartFrom: '',
+	inspectStartTo: '',
+	inspectFinishFrom: '',
+	inspectFinishTo: '',
+	page: 1,
+	pageSize: 10,
+});
+
+// 本批次为只读 UI 骨架,尚无真实检验任务接口:渲染空表,不发请求、不造数据。
+const loading = ref(false);
+const rows = ref<Record<string, unknown>[]>([]);
+const total = ref(0);
+
+function doSearch() {
+	query.page = 1;
+}
+
+function resetQuery() {
+	query.billNo = '';
+	query.materialCode = '';
+	query.materialName = '';
+	query.applyTimeStart = '';
+	query.applyTimeEnd = '';
+	query.inspectProgress = '未检验';
+	query.priority = '';
+	query.inspector = '';
+	query.supplierBatchNo = '';
+	query.supplierShortName = '';
+	query.rqBatchNo = '';
+	query.inspectStartFrom = '';
+	query.inspectStartTo = '';
+	query.inspectFinishFrom = '';
+	query.inspectFinishTo = '';
+	query.page = 1;
+}
+</script>
+
+<style scoped lang="scss">
+.filter-hint {
+	font-weight: bold;
+	margin-bottom: 10px;
+}
+.mb12 {
+	margin-bottom: 12px;
+}
+.pager {
+	margin-top: 12px;
+	display: flex;
+	justify-content: flex-end;
+}
+</style>

+ 6 - 3
server/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj

@@ -11,9 +11,9 @@
     <GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
     <Copyright>Admin.NET</Copyright>
     <Description>Admin.NET ͨ��Ȩ�޿���ƽ̨</Description>
-    <AssemblyVersion>1.0.214</AssemblyVersion>
-    <FileVersion>1.0.214</FileVersion>
-    <Version>1.0.214</Version>
+    <AssemblyVersion>1.0.215</AssemblyVersion>
+    <FileVersion>1.0.215</FileVersion>
+    <Version>1.0.215</Version>
   </PropertyGroup>
 
   <ItemGroup>
@@ -202,6 +202,9 @@
     <None Update="UpdateScripts\1.0.214.sql">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
+    <None Update="UpdateScripts\1.0.215.sql">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
   </ItemGroup>
 
   <ItemGroup>

+ 27 - 0
server/Admin.NET.Web.Entry/UpdateScripts/1.0.215.sql

@@ -0,0 +1,27 @@
+-- ============================================================
+-- 1.0.215.sql
+-- A1-S5-IQC-TASK-RESULT-LIST-REAL-PAGE-1
+--
+-- 业务目标:将「来料检验任务列表」「来料检验结果列表」两条既有三级菜单
+--   (来料检验目录 1322000000015 下 1329015010001 / 1329015010002)
+--   的 Component 由占位组件 /aidop/planning/index 重指到真实只读页面:
+--     - 1329015010001 → /aidop/s5/iqc/iqcTaskList
+--     - 1329015010002 → /aidop/s5/iqc/iqcResultList
+--
+-- 安全保证:
+--   - 仅 UPDATE 两条既有菜单的 Component / Remark / UpdateTime;不新增、不 DELETE / DROP / TRUNCATE。
+--   - 菜单 Id / Pid / Path / Name / 租户分配(SysTenantMenu)均不变,无需补分配。
+--   - 不动 SysRoleMenu / SysOrg / SysUser / SysRole / SysTenant;不动 S0/S6/S7/S8 及其他 S5 菜单。
+-- ============================================================
+
+UPDATE SysMenu
+SET Component = '/aidop/s5/iqc/iqcTaskList',
+    Remark    = 'S5 来料检验任务列表(只读列表)',
+    UpdateTime = NOW()
+WHERE Id = 1329015010001;
+
+UPDATE SysMenu
+SET Component = '/aidop/s5/iqc/iqcResultList',
+    Remark    = 'S5 来料检验结果列表(只读列表)',
+    UpdateTime = NOW()
+WHERE Id = 1329015010002;

+ 3 - 3
server/Plugins/Admin.NET.Plugin.AiDOP/SeedData/SysMenuSeedData.cs

@@ -530,12 +530,12 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
     {
         const string placeholderComponent = "/aidop/planning/index";
 
-        // 来料检验 (1322000000015) 下 3 个三级(申请列表为真实页面,任务/结果列表仍为 placeholder
+        // 来料检验 (1322000000015) 下 3 个三级(申请/任务/结果列表均为真实只读页面
         const long iqcDirId = 1322000000015L;
         const long iqcBase = 1329015010000L;
         yield return new SysMenu { Id = iqcBase + 3, Pid = iqcDirId, Title = "来料检验申请列表", Path = "/aidop/s5/iqc/application-list", Name = "aidopS5IqcApplicationList", Component = "/aidop/s5/iqc/iqcApplicationList", Icon = "ele-Document", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 5, Remark = "S5 来料检验申请列表(只读列表)" };
-        yield return new SysMenu { Id = iqcBase + 1, Pid = iqcDirId, Title = "来料检验任务列表", Path = "/aidop/s5/iqc/task-list", Name = "aidopS5IqcTaskList", Component = placeholderComponent, Icon = "ele-Document", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 10, Remark = "S5 来料检验任务列表(真实页面待交付)" };
-        yield return new SysMenu { Id = iqcBase + 2, Pid = iqcDirId, Title = "来料检验结果列表", Path = "/aidop/s5/iqc/result-list", Name = "aidopS5IqcResultList", Component = placeholderComponent, Icon = "ele-Document", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 20, Remark = "S5 来料检验结果列表(真实页面待交付)" };
+        yield return new SysMenu { Id = iqcBase + 1, Pid = iqcDirId, Title = "来料检验任务列表", Path = "/aidop/s5/iqc/task-list", Name = "aidopS5IqcTaskList", Component = "/aidop/s5/iqc/iqcTaskList", Icon = "ele-Document", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 10, Remark = "S5 来料检验任务列表(只读列表)" };
+        yield return new SysMenu { Id = iqcBase + 2, Pid = iqcDirId, Title = "来料检验结果列表", Path = "/aidop/s5/iqc/result-list", Name = "aidopS5IqcResultList", Component = "/aidop/s5/iqc/iqcResultList", Icon = "ele-Document", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 20, Remark = "S5 来料检验结果列表(只读列表)" };
 
         // 仓储管理 (1322000000016) 下 5 个三级
         const long warehouseDirId = 1322000000016L;