Jelajahi Sumber

feat(s7): 成品仓储四页只读页面 + 菜单重指

- 新增 FQC检验任务列表/FQC检验结果列表/生产入库单列表/销售发货通知 4 个只读 UI 页面(照截图还原查询区/列名/空态,无接口、静态空表)
- SysMenuSeedData.cs 4 条菜单 Component 由 placeholder 重指真实页面
- UpdateScripts/1.0.219.sql 重指既有 4 条菜单 Component(幂等 UPDATE)
- bump version Web 2.4.214 / server 1.0.219
YY968XX 1 Minggu lalu
induk
melakukan
3f5c76cd3c

+ 1 - 1
Web/package.json

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

+ 106 - 0
Web/src/views/aidop/s7/finished-outbound/salesDeliveryNoticeList.vue

@@ -0,0 +1,106 @@
+<template>
+	<AidopDemoShell :title="pageTitle" subtitle="只读列表">
+		<el-form :inline="true" :model="query" class="mb12" @submit.prevent>
+			<el-form-item label="货运单号">
+				<el-input v-model="query.shipmentNo" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="销售单号">
+				<el-select v-model="query.salesOrderNo" placeholder="请选择" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="部门">
+				<el-select v-model="query.dept" placeholder="请选择" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="发货日期">
+				<el-date-picker
+					v-model="deliveryDateRange"
+					type="daterange"
+					value-format="YYYY-MM-DD"
+					range-separator="-"
+					start-placeholder="开始日期"
+					end-placeholder="结束日期"
+					unlink-panels
+					style="width: 260px"
+				/>
+			</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="deliveryNo" label="发货单号" min-width="160" show-overflow-tooltip resizable />
+			<el-table-column prop="salesOrderNo" label="销售单号" min-width="160" show-overflow-tooltip resizable />
+			<el-table-column prop="dept" label="部门" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="deliveryDate" label="发货日期" min-width="150" resizable />
+			<el-table-column prop="status" label="状态" min-width="110" resizable />
+			<el-table-column prop="remark" label="备注" min-width="180" 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="aidopS7FinishedOutboundSalesShipmentNotice">
+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({
+	shipmentNo: '',
+	salesOrderNo: '',
+	dept: '',
+	deliveryDateStart: '',
+	deliveryDateEnd: '',
+	page: 1,
+	pageSize: 10,
+});
+
+const deliveryDateRange = ref<[string, string] | null>(null);
+
+// 本批次为只读 UI 骨架,尚无真实销售发货通知接口:渲染空表,不发请求、不造数据。
+const loading = ref(false);
+const rows = ref<Record<string, unknown>[]>([]);
+const total = ref(0);
+
+function doSearch() {
+	query.deliveryDateStart = deliveryDateRange.value?.[0] || '';
+	query.deliveryDateEnd = deliveryDateRange.value?.[1] || '';
+	query.page = 1;
+}
+
+function resetQuery() {
+	query.shipmentNo = '';
+	query.salesOrderNo = '';
+	query.dept = '';
+	deliveryDateRange.value = null;
+	query.deliveryDateStart = '';
+	query.deliveryDateEnd = '';
+	query.page = 1;
+}
+</script>
+
+<style scoped lang="scss">
+.mb12 {
+	margin-bottom: 12px;
+}
+.pager {
+	margin-top: 12px;
+	display: flex;
+	justify-content: flex-end;
+}
+</style>

+ 90 - 0
Web/src/views/aidop/s7/fqc/fqcInspectionResultList.vue

@@ -0,0 +1,90 @@
+<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.productionBatchNo" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="生产指令单">
+				<el-input v-model="query.productionOrderNo" 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="inspectTime" label="检验时间" min-width="170" resizable />
+			<el-table-column prop="productionBatchNo" label="生产批号" min-width="140" 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="inspector" label="检验人" min-width="120" show-overflow-tooltip resizable />
+			<el-table-column prop="inspectQty" label="检验数量" min-width="110" resizable />
+			<el-table-column prop="sourceBillNo" label="来源单据编号" min-width="150" show-overflow-tooltip resizable />
+			<el-table-column prop="productionOrderNo" label="生产指定单" min-width="150" show-overflow-tooltip resizable />
+			<el-table-column prop="sapWorkOrderNo" label="SAP工单号" 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="aidopS7FqcResultList">
+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) || 'FQC检验结果列表');
+
+const query = reactive({
+	billNo: '',
+	productionBatchNo: '',
+	productionOrderNo: '',
+	page: 1,
+	pageSize: 10,
+});
+
+// 本批次为只读 UI 骨架,尚无真实 FQC 检验结果接口:渲染空表,不发请求、不造数据。
+const loading = ref(false);
+const rows = ref<Record<string, unknown>[]>([]);
+const total = ref(0);
+
+function doSearch() {
+	query.page = 1;
+}
+
+function resetQuery() {
+	query.billNo = '';
+	query.productionBatchNo = '';
+	query.productionOrderNo = '';
+	query.page = 1;
+}
+</script>
+
+<style scoped lang="scss">
+.mb12 {
+	margin-bottom: 12px;
+}
+.pager {
+	margin-top: 12px;
+	display: flex;
+	justify-content: flex-end;
+}
+</style>

+ 113 - 0
Web/src/views/aidop/s7/fqc/fqcInspectionTaskList.vue

@@ -0,0 +1,113 @@
+<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.productionBatchNo" 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-date-picker v-model="query.applyTime" 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>
+				<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="productionOrderNo" label="生产指令单" min-width="150" show-overflow-tooltip resizable />
+			<el-table-column prop="applyTime" label="申请时间" min-width="170" resizable />
+			<el-table-column prop="materialCode" label="物料编码" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="productName" label="产品名称" min-width="160" show-overflow-tooltip resizable />
+			<el-table-column prop="productModel" label="产品型号" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="productionBatchNo" label="生产批号" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="orderQty" label="指令单数量" min-width="120" resizable />
+			<el-table-column prop="applicant" 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="priority" label="检验优先级" min-width="110" resizable />
+			<el-table-column prop="inspectStartTime" label="检验开始时间" min-width="170" resizable />
+			<el-table-column prop="inspectFinishTime" label="检验完成时间" min-width="170" resizable />
+			<el-table-column prop="inspector" label="检验负责人" min-width="120" show-overflow-tooltip resizable />
+			<el-table-column prop="inspectProgress" label="检验进度" min-width="110" 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="aidopS7FqcTaskList">
+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) || 'FQC检验任务列表');
+
+const query = reactive({
+	billNo: '',
+	productionBatchNo: '',
+	materialCode: '',
+	applyTime: '',
+	inspectProgress: '未检验',
+	priority: '',
+	inspector: '',
+	page: 1,
+	pageSize: 10,
+});
+
+// 本批次为只读 UI 骨架,尚无真实 FQC 检验任务接口:渲染空表,不发请求、不造数据。
+const loading = ref(false);
+const rows = ref<Record<string, unknown>[]>([]);
+const total = ref(0);
+
+function doSearch() {
+	query.page = 1;
+}
+
+function resetQuery() {
+	query.billNo = '';
+	query.productionBatchNo = '';
+	query.materialCode = '';
+	query.applyTime = '';
+	query.inspectProgress = '未检验';
+	query.priority = '';
+	query.inspector = '';
+	query.page = 1;
+}
+</script>
+
+<style scoped lang="scss">
+.mb12 {
+	margin-bottom: 12px;
+}
+.pager {
+	margin-top: 12px;
+	display: flex;
+	justify-content: flex-end;
+}
+</style>

+ 122 - 0
Web/src/views/aidop/s7/production-receipt/productionInboundList.vue

@@ -0,0 +1,122 @@
+<template>
+	<AidopDemoShell :title="pageTitle" subtitle="只读列表">
+		<el-form :inline="true" :model="query" class="mb12" @submit.prevent>
+			<el-form-item label="入库单号">
+				<el-input v-model="query.inboundNo" 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="ERP工单号">
+				<el-input v-model="query.erpWorkOrderNo" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="批次">
+				<el-input v-model="query.batch" clearable style="width: 200px" />
+			</el-form-item>
+			<el-form-item label="入库日期">
+				<el-date-picker
+					v-model="inboundDateRange"
+					type="daterange"
+					value-format="YYYY-MM-DD"
+					range-separator="-"
+					start-placeholder="开始日期"
+					end-placeholder="结束日期"
+					unlink-panels
+					style="width: 260px"
+				/>
+			</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="inboundNo" label="入库单号" min-width="150" show-overflow-tooltip resizable />
+			<el-table-column prop="lineNo" label="项次" min-width="90" resizable />
+			<el-table-column prop="inboundDate" label="入库日期" min-width="150" resizable />
+			<el-table-column prop="status" label="状态" min-width="100" resizable />
+			<el-table-column prop="inboundType" label="入库类型" min-width="120" resizable />
+			<el-table-column prop="productionLine" label="生产线" min-width="120" show-overflow-tooltip resizable />
+			<el-table-column prop="workOrderNo" label="工单号" min-width="140" show-overflow-tooltip resizable />
+			<el-table-column prop="erpWorkOrderNo" label="ERP工单号" min-width="140" 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="inboundLocation" label="入库位" min-width="120" show-overflow-tooltip resizable />
+			<el-table-column prop="batch" 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="relatedBillNo" label="相关单号" min-width="150" show-overflow-tooltip resizable />
+			<el-table-column prop="createTime" 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="aidopS7ProductionReceiptOrderList">
+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({
+	inboundNo: '',
+	workOrderNo: '',
+	erpWorkOrderNo: '',
+	batch: '',
+	inboundDateStart: '',
+	inboundDateEnd: '',
+	page: 1,
+	pageSize: 10,
+});
+
+const inboundDateRange = ref<[string, string] | null>(null);
+
+// 本批次为只读 UI 骨架,尚无真实生产入库单接口:渲染空表,不发请求、不造数据。
+const loading = ref(false);
+const rows = ref<Record<string, unknown>[]>([]);
+const total = ref(0);
+
+function doSearch() {
+	query.inboundDateStart = inboundDateRange.value?.[0] || '';
+	query.inboundDateEnd = inboundDateRange.value?.[1] || '';
+	query.page = 1;
+}
+
+function resetQuery() {
+	query.inboundNo = '';
+	query.workOrderNo = '';
+	query.erpWorkOrderNo = '';
+	query.batch = '';
+	inboundDateRange.value = null;
+	query.inboundDateStart = '';
+	query.inboundDateEnd = '';
+	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.218</AssemblyVersion>
-    <FileVersion>1.0.218</FileVersion>
-    <Version>1.0.218</Version>
+    <AssemblyVersion>1.0.219</AssemblyVersion>
+    <FileVersion>1.0.219</FileVersion>
+    <Version>1.0.219</Version>
   </PropertyGroup>
 
   <ItemGroup>
@@ -214,6 +214,9 @@
     <None Update="UpdateScripts\1.0.218.sql">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
+    <None Update="UpdateScripts\1.0.219.sql">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
   </ItemGroup>
 
   <ItemGroup>

+ 21 - 0
server/Admin.NET.Web.Entry/UpdateScripts/1.0.219.sql

@@ -0,0 +1,21 @@
+-- ============================================================
+-- 1.0.219.sql
+-- A4-S7-FINISHED-WAREHOUSE-4PAGES-REAL-PAGE-1
+--
+-- 业务目标:将 S7 成品仓储下 4 条既有三级菜单的 Component
+--   由占位组件 /aidop/planning/index 重指到真实只读页面:
+--     - 1329017010001 FQC检验任务列表 → /aidop/s7/fqc/fqcInspectionTaskList
+--     - 1329017010002 FQC检验结果列表 → /aidop/s7/fqc/fqcInspectionResultList
+--     - 1329017020001 生产入库单列表   → /aidop/s7/production-receipt/productionInboundList
+--     - 1329017030001 销售发货通知     → /aidop/s7/finished-outbound/salesDeliveryNoticeList
+--
+-- 安全保证:
+--   - 仅 UPDATE 四条既有菜单的 Component / Remark / UpdateTime;不新增、不 DELETE / DROP / TRUNCATE。
+--   - 菜单 Id / Pid / Path / Name / 租户分配(SysTenantMenu)均不变,无需补分配。
+--   - 不动 SysRoleMenu / SysOrg / SysUser / SysRole / SysTenant;不动 S5 / S6 / S8 及其他 S7 菜单。
+-- ============================================================
+
+UPDATE SysMenu SET Component = '/aidop/s7/fqc/fqcInspectionTaskList',                  Remark = 'S7 FQC检验任务列表(只读列表)', UpdateTime = NOW() WHERE Id = 1329017010001;
+UPDATE SysMenu SET Component = '/aidop/s7/fqc/fqcInspectionResultList',                Remark = 'S7 FQC检验结果列表(只读列表)', UpdateTime = NOW() WHERE Id = 1329017010002;
+UPDATE SysMenu SET Component = '/aidop/s7/production-receipt/productionInboundList',   Remark = 'S7 生产入库单列表(只读列表)',   UpdateTime = NOW() WHERE Id = 1329017020001;
+UPDATE SysMenu SET Component = '/aidop/s7/finished-outbound/salesDeliveryNoticeList',  Remark = 'S7 销售发货通知(只读列表)',     UpdateTime = NOW() WHERE Id = 1329017030001;

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

@@ -607,18 +607,18 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
         // 成品质量管理 (1322000000023) 下 2 个三级
         const long fqcDirId = 1322000000023L;
         const long fqcBase = 1329017010000L;
-        yield return new SysMenu { Id = fqcBase + 1, Pid = fqcDirId, Title = "FQC检验任务列表", Path = "/aidop/s7/fqc/task-list", Name = "aidopS7FqcTaskList", Component = placeholderComponent, Icon = "ele-Document", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 10, Remark = "S7 FQC检验任务列表(真实页面待交付)" };
-        yield return new SysMenu { Id = fqcBase + 2, Pid = fqcDirId, Title = "FQC检验结果列表", Path = "/aidop/s7/fqc/result-list", Name = "aidopS7FqcResultList", Component = placeholderComponent, Icon = "ele-Document", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 20, Remark = "S7 FQC检验结果列表(真实页面待交付)" };
+        yield return new SysMenu { Id = fqcBase + 1, Pid = fqcDirId, Title = "FQC检验任务列表", Path = "/aidop/s7/fqc/task-list", Name = "aidopS7FqcTaskList", Component = "/aidop/s7/fqc/fqcInspectionTaskList", Icon = "ele-Document", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 10, Remark = "S7 FQC检验任务列表(只读列表)" };
+        yield return new SysMenu { Id = fqcBase + 2, Pid = fqcDirId, Title = "FQC检验结果列表", Path = "/aidop/s7/fqc/result-list", Name = "aidopS7FqcResultList", Component = "/aidop/s7/fqc/fqcInspectionResultList", Icon = "ele-Document", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 20, Remark = "S7 FQC检验结果列表(只读列表)" };
 
         // 生产入库管理 (1322000000024) 下 1 个三级
         const long productionReceiptDirId = 1322000000024L;
         const long productionReceiptBase = 1329017020000L;
-        yield return new SysMenu { Id = productionReceiptBase + 1, Pid = productionReceiptDirId, Title = "生产入库单列表", Path = "/aidop/s7/production-receipt/order-list", Name = "aidopS7ProductionReceiptOrderList", Component = placeholderComponent, Icon = "ele-Document", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 10, Remark = "S7 生产入库单列表(真实页面待交付)" };
+        yield return new SysMenu { Id = productionReceiptBase + 1, Pid = productionReceiptDirId, Title = "生产入库单列表", Path = "/aidop/s7/production-receipt/order-list", Name = "aidopS7ProductionReceiptOrderList", Component = "/aidop/s7/production-receipt/productionInboundList", Icon = "ele-Document", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 10, Remark = "S7 生产入库单列表(只读列表)" };
 
         // 成品出库管理 (1322000000025) 下 1 个三级
         const long finishedOutboundDirId = 1322000000025L;
         const long finishedOutboundBase = 1329017030000L;
-        yield return new SysMenu { Id = finishedOutboundBase + 1, Pid = finishedOutboundDirId, Title = "销售发货通知", Path = "/aidop/s7/finished-outbound/sales-shipment-notice", Name = "aidopS7FinishedOutboundSalesShipmentNotice", Component = placeholderComponent, Icon = "ele-Document", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 10, Remark = "S7 销售发货通知(真实页面待交付)" };
+        yield return new SysMenu { Id = finishedOutboundBase + 1, Pid = finishedOutboundDirId, Title = "销售发货通知", Path = "/aidop/s7/finished-outbound/sales-shipment-notice", Name = "aidopS7FinishedOutboundSalesShipmentNotice", Component = "/aidop/s7/finished-outbound/salesDeliveryNoticeList", Icon = "ele-Document", Type = MenuTypeEnum.Menu, CreateTime = ct, OrderNo = 10, Remark = "S7 销售发货通知(只读列表)" };
 
         // 成品仓储看板 (1322000000026) 下 2 个三级
         const long finishedWarehouseKanbanDirId = 1322000000026L;