Переглянути джерело

feat(s5): 库存数据五页只读页面 + 菜单重指

- 新增 暂收在检/库存查询/进出存查询/盘点标签确认/盘点结果查询 5 个只读 UI 页面(照截图还原查询区/列名/空态,无接口、静态空表)
- SysMenuSeedData.cs 5 条菜单 Component 由 placeholder 重指真实页面(不含标签查询)
- UpdateScripts/1.0.217.sql 重指既有 5 条菜单 Component(幂等 UPDATE)
- bump version Web 2.4.212 / server 1.0.217
YY968XX 1 тиждень тому
батько
коміт
e6eb1bdc89

+ 1 - 1
Web/package.json

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

+ 116 - 0
Web/src/views/aidop/s5/inventory/inoutQueryList.vue

@@ -0,0 +1,116 @@
+<template>
+	<AidopDemoShell :title="pageTitle" subtitle="只读列表">
+		<el-form :inline="true" :model="query" class="mb12" @submit.prevent>
+			<el-form-item label="物料编码">
+				<el-input v-model="query.materialCode" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="货位">
+				<el-select v-model="query.location" placeholder="请选择" 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-input v-model="query.workOrderNo" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="交易类型">
+				<el-select v-model="query.transType" placeholder="请选择" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="创建时间">
+				<el-date-picker v-model="query.createTime" type="date" value-format="YYYY-MM-DD" style="width: 180px" />
+			</el-form-item>
+			<el-form-item label="创建用户">
+				<el-input v-model="query.createUser" 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="transTime" label="交易时间" min-width="170" 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="location" label="货位" min-width="110" show-overflow-tooltip resizable />
+			<el-table-column prop="locationName" label="货位名称" min-width="130" show-overflow-tooltip resizable />
+			<el-table-column prop="batchNo" label="批次号" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="beginQty" label="期初数" min-width="110" resizable />
+			<el-table-column prop="inQty" label="入库数" min-width="110" resizable />
+			<el-table-column prop="outQty" label="出库数" min-width="110" resizable />
+			<el-table-column prop="endQty" label="期末数" min-width="110" resizable />
+			<el-table-column prop="unit" label="单位" min-width="90" resizable />
+			<el-table-column prop="transType" label="交易类型" min-width="150" show-overflow-tooltip resizable />
+			<el-table-column prop="workOrderNo" label="工单号" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="deliveryNo" label="发货单号" min-width="150" show-overflow-tooltip resizable />
+			<el-table-column prop="deliveryType" label="发货类型" min-width="120" show-overflow-tooltip resizable />
+			<el-table-column prop="remark" label="备注" min-width="160" show-overflow-tooltip resizable />
+			<el-table-column prop="createUser" label="创建用户" min-width="120" 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="aidopS5InventoryInoutQuery">
+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({
+	materialCode: '',
+	location: '',
+	batchNo: '',
+	workOrderNo: '',
+	transType: '',
+	createTime: '',
+	createUser: '',
+	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.materialCode = '';
+	query.location = '';
+	query.batchNo = '';
+	query.workOrderNo = '';
+	query.transType = '';
+	query.createTime = '';
+	query.createUser = '';
+	query.page = 1;
+}
+</script>
+
+<style scoped lang="scss">
+.mb12 {
+	margin-bottom: 12px;
+}
+.pager {
+	margin-top: 12px;
+	display: flex;
+	justify-content: flex-end;
+}
+</style>

+ 107 - 0
Web/src/views/aidop/s5/inventory/pendingInspectionList.vue

@@ -0,0 +1,107 @@
+<template>
+	<AidopDemoShell :title="pageTitle" subtitle="只读列表">
+		<el-form :inline="true" :model="query" class="mb12" @submit.prevent>
+			<el-form-item label="要货令单号">
+				<el-input v-model="query.demandNo" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="货架">
+				<el-input v-model="query.shelf" 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-input v-model="query.materialCode" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="检验状态">
+				<el-select v-model="query.inspectStatus" placeholder="请选择" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="供应商">
+				<el-select v-model="query.supplier" 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="demandNo" label="要货令单号" min-width="150" show-overflow-tooltip resizable />
+			<el-table-column prop="demandLineNo" label="要货令行号" min-width="120" 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="batchNo" label="批次号" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="qty" label="数量" min-width="100" resizable />
+			<el-table-column prop="unit" label="单位" min-width="90" resizable />
+			<el-table-column prop="pendingShelf" label="待检货架" min-width="120" show-overflow-tooltip resizable />
+			<el-table-column prop="deliveryNo" label="送货单号" min-width="150" show-overflow-tooltip resizable />
+			<el-table-column prop="inspectNo" label="检验单号" min-width="150" show-overflow-tooltip resizable />
+			<el-table-column prop="inspectStatus" label="检验状态" min-width="110" resizable />
+			<el-table-column prop="supplier" label="供应商" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="supplierShortName" label="供应商简称" min-width="140" 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="aidopS5InventoryPendingInspection">
+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({
+	demandNo: '',
+	shelf: '',
+	batchNo: '',
+	materialCode: '',
+	inspectStatus: '',
+	supplier: '',
+	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.demandNo = '';
+	query.shelf = '';
+	query.batchNo = '';
+	query.materialCode = '';
+	query.inspectStatus = '';
+	query.supplier = '';
+	query.page = 1;
+}
+</script>
+
+<style scoped lang="scss">
+.mb12 {
+	margin-bottom: 12px;
+}
+.pager {
+	margin-top: 12px;
+	display: flex;
+	justify-content: flex-end;
+}
+</style>

+ 117 - 0
Web/src/views/aidop/s5/inventory/stockQueryList.vue

@@ -0,0 +1,117 @@
+<template>
+	<AidopDemoShell :title="pageTitle" subtitle="只读列表">
+		<el-form :inline="true" :model="query" class="mb12" @submit.prevent>
+			<el-form-item label="类型">
+				<el-select v-model="query.type" placeholder="请选择" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="库位">
+				<el-select v-model="query.location" 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-input v-model="query.stockGt" clearable style="width: 160px" />
+			</el-form-item>
+			<el-form-item label="非限制库存大于">
+				<el-input v-model="query.unrestrictedGt" clearable style="width: 160px" />
+			</el-form-item>
+			<el-form-item label="质检库存大于">
+				<el-input v-model="query.qcStockGt" clearable style="width: 160px" />
+			</el-form-item>
+			<el-form-item label="冻结库存大于">
+				<el-input v-model="query.frozenGt" clearable style="width: 160px" />
+			</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="type" label="类型" min-width="100" resizable />
+			<el-table-column prop="location" label="库位" min-width="110" show-overflow-tooltip resizable />
+			<el-table-column prop="locationName" label="库位名称" min-width="130" 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="batchNo" label="批次号" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="shelf" label="货架" min-width="110" show-overflow-tooltip resizable />
+			<el-table-column prop="version" label="版本" min-width="90" resizable />
+			<el-table-column prop="unrestrictedStock" label="非限制库存" min-width="120" resizable />
+			<el-table-column prop="qcStock" label="质检库存" min-width="110" resizable />
+			<el-table-column prop="frozenStock" label="冻结库存" min-width="110" resizable />
+			<el-table-column prop="unit" label="单位" min-width="90" resizable />
+			<el-table-column prop="supplier" label="供应商" min-width="140" 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="aidopS5InventoryStockQuery">
+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({
+	type: '',
+	location: '',
+	materialCode: '',
+	batchNo: '',
+	stockGt: '',
+	unrestrictedGt: '',
+	qcStockGt: '',
+	frozenGt: '',
+	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.type = '';
+	query.location = '';
+	query.materialCode = '';
+	query.batchNo = '';
+	query.stockGt = '';
+	query.unrestrictedGt = '';
+	query.qcStockGt = '';
+	query.frozenGt = '';
+	query.page = 1;
+}
+</script>
+
+<style scoped lang="scss">
+.mb12 {
+	margin-bottom: 12px;
+}
+.pager {
+	margin-top: 12px;
+	display: flex;
+	justify-content: flex-end;
+}
+</style>

+ 105 - 0
Web/src/views/aidop/s5/inventory/stocktakeLabelConfirmList.vue

@@ -0,0 +1,105 @@
+<template>
+	<AidopDemoShell :title="pageTitle" subtitle="只读列表">
+		<el-form :inline="true" :model="query" class="mb12" @submit.prevent>
+			<el-form-item label="库位">
+				<el-select v-model="query.location" placeholder="请选择" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="货架">
+				<el-input v-model="query.shelf" 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-select v-model="query.checkResult" 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="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="location" label="库位" min-width="110" show-overflow-tooltip resizable />
+			<el-table-column prop="shelf" label="货架" min-width="110" show-overflow-tooltip resizable />
+			<el-table-column prop="actualLocation" label="实盘库位" min-width="120" show-overflow-tooltip resizable />
+			<el-table-column prop="actualShelf" label="实盘货架" min-width="120" show-overflow-tooltip resizable />
+			<el-table-column prop="batchNo" label="批次号" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="unit" label="单位" min-width="90" resizable />
+			<el-table-column prop="labelQty" label="标签数量" min-width="110" resizable />
+			<el-table-column prop="actualQty" label="实盘数量" min-width="110" resizable />
+			<el-table-column prop="diffQty" label="差异数量" min-width="110" resizable />
+			<el-table-column prop="status" label="状态" min-width="100" resizable />
+			<el-table-column prop="stocktakeResult" label="盘点结果" min-width="120" resizable />
+			<el-table-column prop="stocktakePerson" label="盘点人" min-width="120" show-overflow-tooltip resizable />
+			<el-table-column prop="stocktakeTime" 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="aidopS5InventoryStocktakeLabel">
+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({
+	location: '',
+	shelf: '',
+	materialCode: '',
+	batchNo: '',
+	checkResult: '',
+	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.location = '';
+	query.shelf = '';
+	query.materialCode = '';
+	query.batchNo = '';
+	query.checkResult = '';
+	query.page = 1;
+}
+</script>
+
+<style scoped lang="scss">
+.mb12 {
+	margin-bottom: 12px;
+}
+.pager {
+	margin-top: 12px;
+	display: flex;
+	justify-content: flex-end;
+}
+</style>

+ 82 - 0
Web/src/views/aidop/s5/inventory/stocktakeResultList.vue

@@ -0,0 +1,82 @@
+<template>
+	<AidopDemoShell :title="pageTitle" subtitle="只读列表">
+		<el-form :inline="true" :model="query" class="mb12" @submit.prevent>
+			<el-form-item label="盘点名称">
+				<el-select v-model="query.stocktakeName" placeholder="请选择" clearable style="width: 220px" />
+			</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="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="location" label="库位" min-width="110" show-overflow-tooltip resizable />
+			<el-table-column prop="shelf" label="货架" min-width="110" show-overflow-tooltip resizable />
+			<el-table-column prop="unit" label="单位" min-width="90" resizable />
+			<el-table-column prop="firstCountQty" label="初盘量" min-width="110" resizable />
+			<el-table-column prop="recountQty" label="重盘量" min-width="110" resizable />
+			<el-table-column prop="frozenQty" label="冻结数量" min-width="110" resizable />
+			<el-table-column prop="firstRecountDiff" label="初盘与重盘差异" min-width="140" resizable />
+			<el-table-column prop="recountFrozenDiff" label="重盘与冻结差异" min-width="140" resizable />
+			<el-table-column prop="remark" 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="aidopS5InventoryStocktakeResult">
+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({
+	stocktakeName: '',
+	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.stocktakeName = '';
+	query.page = 1;
+}
+</script>
+
+<style scoped lang="scss">
+.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.216</AssemblyVersion>
-    <FileVersion>1.0.216</FileVersion>
-    <Version>1.0.216</Version>
+    <AssemblyVersion>1.0.217</AssemblyVersion>
+    <FileVersion>1.0.217</FileVersion>
+    <Version>1.0.217</Version>
   </PropertyGroup>
 
   <ItemGroup>
@@ -208,6 +208,9 @@
     <None Update="UpdateScripts\1.0.216.sql">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
+    <None Update="UpdateScripts\1.0.217.sql">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
   </ItemGroup>
 
   <ItemGroup>

+ 23 - 0
server/Admin.NET.Web.Entry/UpdateScripts/1.0.217.sql

@@ -0,0 +1,23 @@
+-- ============================================================
+-- 1.0.217.sql
+-- A2-1-S5-INVENTORY-5PAGES-REAL-PAGE-1
+--
+-- 业务目标:将 S5 库存数据目录 (1322000000017) 下除标签查询外的 5 条既有三级菜单
+--   的 Component 由占位组件 /aidop/planning/index 重指到真实只读页面:
+--     - 1329015030002 暂收在检列表   → /aidop/s5/inventory/pendingInspectionList
+--     - 1329015030003 库存查询       → /aidop/s5/inventory/stockQueryList
+--     - 1329015030004 进出存查询     → /aidop/s5/inventory/inoutQueryList
+--     - 1329015030005 盘点标签确认   → /aidop/s5/inventory/stocktakeLabelConfirmList
+--     - 1329015030006 盘点结果查询   → /aidop/s5/inventory/stocktakeResultList
+--
+-- 安全保证:
+--   - 仅 UPDATE 五条既有菜单的 Component / Remark / UpdateTime;不新增、不 DELETE / DROP / TRUNCATE。
+--   - 菜单 Id / Pid / Path / Name / 租户分配(SysTenantMenu)均不变,无需补分配。
+--   - 不动标签查询菜单 (1329015030001);不动 SysRoleMenu / SysOrg / SysUser / SysRole / SysTenant;不动其他 Sx 菜单。
+-- ============================================================
+
+UPDATE SysMenu SET Component = '/aidop/s5/inventory/pendingInspectionList',      Remark = 'S5 暂收在检列表(只读列表)',   UpdateTime = NOW() WHERE Id = 1329015030002;
+UPDATE SysMenu SET Component = '/aidop/s5/inventory/stockQueryList',             Remark = 'S5 库存查询(只读列表)',       UpdateTime = NOW() WHERE Id = 1329015030003;
+UPDATE SysMenu SET Component = '/aidop/s5/inventory/inoutQueryList',             Remark = 'S5 进出存查询(只读列表)',     UpdateTime = NOW() WHERE Id = 1329015030004;
+UPDATE SysMenu SET Component = '/aidop/s5/inventory/stocktakeLabelConfirmList',  Remark = 'S5 盘点标签确认(只读列表)',   UpdateTime = NOW() WHERE Id = 1329015030005;
+UPDATE SysMenu SET Component = '/aidop/s5/inventory/stocktakeResultList',        Remark = 'S5 盘点结果查询(只读列表)',   UpdateTime = NOW() WHERE Id = 1329015030006;

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

@@ -550,11 +550,11 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
         const long inventoryDirId = 1322000000017L;
         const long inventoryBase = 1329015030000L;
         yield return new SysMenu { Id = inventoryBase + 1, Pid = inventoryDirId, Title = "标签查询", Path = "/aidop/s5/inventory/label-query", Name = "aidopS5InventoryLabelQuery", Component = "/aidop/s5/inventory/labelQueryList", Icon = "ele-Search", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 10, Remark = "S5 标签查询(只读列表,数据源 aidopdev.MissedPrint)" };
-        yield return new SysMenu { Id = inventoryBase + 2, Pid = inventoryDirId, Title = "暂收在检列表", Path = "/aidop/s5/inventory/pending-inspection", Name = "aidopS5InventoryPendingInspection", Component = placeholderComponent, Icon = "ele-Document", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 20, Remark = "S5 暂收在检列表(真实页面待交付)" };
-        yield return new SysMenu { Id = inventoryBase + 3, Pid = inventoryDirId, Title = "库存查询", Path = "/aidop/s5/inventory/stock-query", Name = "aidopS5InventoryStockQuery", Component = placeholderComponent, Icon = "ele-Search", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 30, Remark = "S5 库存查询(真实页面待交付)" };
-        yield return new SysMenu { Id = inventoryBase + 4, Pid = inventoryDirId, Title = "进出存查询", Path = "/aidop/s5/inventory/inout-query", Name = "aidopS5InventoryInoutQuery", Component = placeholderComponent, Icon = "ele-Search", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 40, Remark = "S5 进出存查询(真实页面待交付)" };
-        yield return new SysMenu { Id = inventoryBase + 5, Pid = inventoryDirId, Title = "盘点标签确认", Path = "/aidop/s5/inventory/stocktake-label", Name = "aidopS5InventoryStocktakeLabel", Component = placeholderComponent, Icon = "ele-Document", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 50, Remark = "S5 盘点标签确认(真实页面待交付)" };
-        yield return new SysMenu { Id = inventoryBase + 6, Pid = inventoryDirId, Title = "盘点结果查询", Path = "/aidop/s5/inventory/stocktake-result", Name = "aidopS5InventoryStocktakeResult", Component = placeholderComponent, Icon = "ele-Search", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 60, Remark = "S5 盘点结果查询(真实页面待交付)" };
+        yield return new SysMenu { Id = inventoryBase + 2, Pid = inventoryDirId, Title = "暂收在检列表", Path = "/aidop/s5/inventory/pending-inspection", Name = "aidopS5InventoryPendingInspection", Component = "/aidop/s5/inventory/pendingInspectionList", Icon = "ele-Document", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 20, Remark = "S5 暂收在检列表(只读列表)" };
+        yield return new SysMenu { Id = inventoryBase + 3, Pid = inventoryDirId, Title = "库存查询", Path = "/aidop/s5/inventory/stock-query", Name = "aidopS5InventoryStockQuery", Component = "/aidop/s5/inventory/stockQueryList", Icon = "ele-Search", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 30, Remark = "S5 库存查询(只读列表)" };
+        yield return new SysMenu { Id = inventoryBase + 4, Pid = inventoryDirId, Title = "进出存查询", Path = "/aidop/s5/inventory/inout-query", Name = "aidopS5InventoryInoutQuery", Component = "/aidop/s5/inventory/inoutQueryList", Icon = "ele-Search", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 40, Remark = "S5 进出存查询(只读列表)" };
+        yield return new SysMenu { Id = inventoryBase + 5, Pid = inventoryDirId, Title = "盘点标签确认", Path = "/aidop/s5/inventory/stocktake-label", Name = "aidopS5InventoryStocktakeLabel", Component = "/aidop/s5/inventory/stocktakeLabelConfirmList", Icon = "ele-Document", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 50, Remark = "S5 盘点标签确认(只读列表)" };
+        yield return new SysMenu { Id = inventoryBase + 6, Pid = inventoryDirId, Title = "盘点结果查询", Path = "/aidop/s5/inventory/stocktake-result", Name = "aidopS5InventoryStocktakeResult", Component = "/aidop/s5/inventory/stocktakeResultList", Icon = "ele-Search", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 60, Remark = "S5 盘点结果查询(只读列表)" };
 
         // 物料仓储看板 (1322000000018) 下 4 个三级
         const long warehouseKanbanDirId = 1322000000018L;