Browse Source

fix(s0): align manufacturing menu titles and order

- Align S0 manufacturing menu titles with approved list.
- Reorder 12 primary menus before 8 extended menus.
- Add 1.0.162 migration for SysMenu title/order updates.
- Bump Web package to 2.4.189.
- Note: dev DB smoke required one disclosed manual corrective UPDATE for SysMenu.Id=1329003000005 after version marker had already advanced; final DB state matches migration target.
YY968XX 4 tháng trước cách đây
mục cha
commit
4c1282c6ba

+ 1 - 1
Web/package.json

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

+ 2 - 2
Web/src/views/aidop/s0/manufacturing/LineMaterialList.vue

@@ -1,5 +1,5 @@
 <template>
-	<AidopDemoShell :title="pageTitle" subtitle="S0 / Manufacturing / 线边物料">
+	<AidopDemoShell :title="pageTitle" subtitle="S0 / Manufacturing / 生产线物料维护列表">
 		<el-form :inline="true" :model="query" class="mb12" @submit.prevent>
 			<el-form-item label="关键字">
 				<el-input v-model="query.keyword" clearable style="width: 160px" />
@@ -136,7 +136,7 @@ import AidopDemoShell from '../../components/AidopDemoShell.vue';
 import { s0MfgLineMaterialsApi } from '../api/s0ManufacturingApi';
 
 const route = useRoute();
-const pageTitle = computed(() => (route.meta?.title as string) || '线边物料');
+const pageTitle = computed(() => (route.meta?.title as string) || '生产线物料维护列表');
 type Row = Record<string, any>;
 
 const query = reactive({

+ 2 - 2
Web/src/views/aidop/s0/manufacturing/PersonSkillAssignmentList.vue

@@ -1,5 +1,5 @@
 <template>
-	<AidopDemoShell :title="pageTitle" subtitle="S0 / Manufacturing / 人员技能维护">
+	<AidopDemoShell :title="pageTitle" subtitle="S0 / Manufacturing / 人员技能维护列表">
 		<el-form :inline="true" :model="query" class="mb12" @submit.prevent>
 			<el-form-item label="关键字">
 				<el-input v-model="query.keyword" clearable style="width: 160px" />
@@ -127,7 +127,7 @@ const PERSON_SKILL_SCOPE = {
 } as const;
 
 const route = useRoute();
-const pageTitle = computed(() => (route.meta?.title as string) || '人员技能维护');
+const pageTitle = computed(() => (route.meta?.title as string) || '人员技能维护列表');
 type Row = Record<string, any>;
 
 const query = reactive({

+ 1 - 1
Web/src/views/aidop/s0/manufacturing/ProductionLineList.vue

@@ -194,7 +194,7 @@ import { loadDictOptions, type OptionItem } from '../api/s0SalesApi';
 import DictDataMaintainPanel from '../sales/components/DictDataMaintainPanel.vue';
 
 const route = useRoute();
-const pageTitle = computed(() => (route.meta?.title as string) || '生产线编码清单');
+const pageTitle = computed(() => (route.meta?.title as string) || '生产线维护列表');
 
 const { companyOptions, factoryOptions, loadOrgs, factoriesForCompany } = useS0MfgOrgScope();
 const queryFactories = computed(() => factoriesForCompany(query.companyRefId));

+ 1 - 1
Web/src/views/aidop/s0/manufacturing/StandardBomManagement.vue

@@ -156,7 +156,7 @@ import {
 } from '../api/s0ManufacturingApi';
 
 const route = useRoute();
-const pageTitle = computed(() => (route.meta?.title as string) || '标准 BOM');
+const pageTitle = computed(() => (route.meta?.title as string) || '标准BOM列表');
 
 type MaterialRow = { id: number; code: string; name: string };
 

+ 1 - 1
Web/src/views/aidop/s0/manufacturing/StandardProcessList.vue

@@ -106,7 +106,7 @@ import { useS0MfgOrgScope } from '../composables/useS0MfgOrgScope';
 import { s0MfgStandardOperationsApi, type S0StdOpMasterRow } from '../api/s0ManufacturingApi';
 
 const route = useRoute();
-const pageTitle = computed(() => (route.meta?.title as string) || '标准工序');
+const pageTitle = computed(() => (route.meta?.title as string) || '标准工序列表');
 
 const { companyOptions, loadOrgs, factoriesForCompany } = useS0MfgOrgScope();
 const queryFactories = computed(() => factoriesForCompany(query.companyRefId));

+ 2 - 2
Web/src/views/aidop/s0/manufacturing/WorkCenterList.vue

@@ -1,5 +1,5 @@
 <template>
-	<AidopDemoShell :title="pageTitle" subtitle="S0 / Manufacturing / 工作中心">
+	<AidopDemoShell :title="pageTitle" subtitle="S0 / Manufacturing / 工作中心列表">
 		<el-form :inline="true" :model="query" class="mb12" @submit.prevent>
 			<el-form-item label="关键字">
 				<el-input v-model="query.keyword" clearable style="width: 160px" />
@@ -92,7 +92,7 @@ import AidopDemoShell from '../../components/AidopDemoShell.vue';
 import { s0MfgWorkCentersApi } from '../api/s0ManufacturingApi';
 
 const route = useRoute();
-const pageTitle = computed(() => (route.meta?.title as string) || '工作中心');
+const pageTitle = computed(() => (route.meta?.title as string) || '工作中心列表');
 type Row = Record<string, any>;
 
 const query = reactive({

+ 2 - 2
Web/src/views/aidop/s0/sales/ItemSubstituteDetailList.vue

@@ -1,5 +1,5 @@
 <template>
-	<AidopDemoShell :title="pageTitle" subtitle="S0 / Manufacturing / 物料替代">
+	<AidopDemoShell :title="pageTitle" subtitle="S0 / Manufacturing / 物料替代关系列表">
 		<el-form :inline="true" :model="query" class="mb12" @submit.prevent>
 			<el-form-item label="组织">
 				<el-input v-model="query.domain" clearable placeholder="请输入组织编码" style="width: 160px" />
@@ -91,7 +91,7 @@ import AidopDemoShell from '../../components/AidopDemoShell.vue';
 import { s0ItemSubstituteDetailsApi, type S0ItemSubstituteDetailUpsert } from '../api/s0SalesApi';
 
 const route = useRoute();
-const pageTitle = computed(() => (route.meta?.title as string) || '物料替代');
+const pageTitle = computed(() => (route.meta?.title as string) || '物料替代关系列表');
 type Row = Record<string, any>;
 
 const query = reactive({

+ 1 - 1
Web/src/views/aidop/s0/sales/SubstituteSchemeSelectList.vue

@@ -1,5 +1,5 @@
 <template>
-	<AidopDemoShell :title="pageTitle" subtitle="S0 / Sales / 选择替代方案">
+	<AidopDemoShell :title="pageTitle" subtitle="S0 / Manufacturing / 选择替代方案">
 		<el-form :inline="true" :model="query" class="mb12" @submit.prevent>
 			<el-form-item label="替代方案">
 				<el-input v-model="query.substituteCode" clearable placeholder="请输入替代方案编码" style="width: 220px" />

+ 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.161</AssemblyVersion>
-    <FileVersion>1.0.161</FileVersion>
-    <Version>1.0.161</Version>
+    <AssemblyVersion>1.0.162</AssemblyVersion>
+    <FileVersion>1.0.162</FileVersion>
+    <Version>1.0.162</Version>
   </PropertyGroup>
 
   <ItemGroup>
@@ -118,6 +118,9 @@
     <None Update="UpdateScripts\1.0.158.sql">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
+    <None Update="UpdateScripts\1.0.162.sql">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
   </ItemGroup>
 
   <ItemGroup>

+ 43 - 0
server/Admin.NET.Web.Entry/UpdateScripts/1.0.162.sql

@@ -0,0 +1,43 @@
+-- ============================================================
+-- 1.0.162.sql
+-- S0 制造建模菜单标题与排序对齐(S0-MANUFACTURING-MODELING-MENU-TITLE-ALIGNMENT-1)
+--
+-- 影响范围:21 行 UPDATE
+--   - 7 行 SysMenu.Title 改名
+--   - 14 行 SysMenu.OrderNo 重排
+--
+-- 安全保证:
+--   - 仅 UPDATE,不 INSERT / DELETE / DROP / TRUNCATE
+--   - 每条 UPDATE 带 Id 守卫 + 旧值守卫(Title 或 OrderNo)
+--   - 幂等:若存量库已是新值,对应 UPDATE 影响 0 行
+--   - 不动 SysTenantMenu
+--   - 不动 path / Component / Name / Id / Pid / Type / Icon / Status
+--   - 不影响非 S0 Manufacturing 菜单(Pid != 1329003000000 的行均不命中)
+-- ============================================================
+
+-- A. 7 行 Title 改名
+UPDATE SysMenu SET Title='标准BOM列表',       UpdateTime=NOW() WHERE Id=1329003000001 AND Title='标准 BOM';
+UPDATE SysMenu SET Title='标准工序列表',       UpdateTime=NOW() WHERE Id=1329003000002 AND Title='标准工序';
+UPDATE SysMenu SET Title='生产线维护列表',     UpdateTime=NOW() WHERE Id=1329003000003 AND Title='生产线编码清单';
+UPDATE SysMenu SET Title='物料替代关系列表',   UpdateTime=NOW() WHERE Id=1329003000005 AND Title='物料替代';
+UPDATE SysMenu SET Title='人员技能维护列表',   UpdateTime=NOW() WHERE Id=1329003000008 AND Title='人员技能维护';
+UPDATE SysMenu SET Title='工作中心列表',       UpdateTime=NOW() WHERE Id=1329003000010 AND Title='工作中心';
+UPDATE SysMenu SET Title='生产线物料维护列表', UpdateTime=NOW() WHERE Id=1329003000011 AND Title='线边物料';
+
+-- B. 用户清单 12 项 OrderNo 重排(仅 6 行实际变更,其他 6 项 OrderNo 已与目标一致)
+UPDATE SysMenu SET OrderNo=30,  UpdateTime=NOW() WHERE Id=1329003000019 AND OrderNo=180;  -- 工序流转卡 → 第 3
+UPDATE SysMenu SET OrderNo=40,  UpdateTime=NOW() WHERE Id=1329003000003 AND OrderNo=30;   -- 生产线维护列表 → 第 4
+UPDATE SysMenu SET OrderNo=50,  UpdateTime=NOW() WHERE Id=1329003000004 AND OrderNo=40;   -- 标准工艺路线列表 → 第 5
+UPDATE SysMenu SET OrderNo=60,  UpdateTime=NOW() WHERE Id=1329003000005 AND OrderNo=50;   -- 物料替代关系列表 → 第 6
+UPDATE SysMenu SET OrderNo=70,  UpdateTime=NOW() WHERE Id=1329003000018 AND OrderNo=18;   -- 选择替代方案 → 第 7
+UPDATE SysMenu SET OrderNo=120, UpdateTime=NOW() WHERE Id=1329003000020 AND OrderNo=190;  -- 订单排程周期 → 第 12
+
+-- C. 8 个扩展菜单 OrderNo 后移至 130-200 段
+UPDATE SysMenu SET OrderNo=130, UpdateTime=NOW() WHERE Id=1329003000006 AND OrderNo=60;   -- 工单控制参数
+UPDATE SysMenu SET OrderNo=140, UpdateTime=NOW() WHERE Id=1329003000007 AND OrderNo=70;   -- 人员技能
+UPDATE SysMenu SET OrderNo=150, UpdateTime=NOW() WHERE Id=1329003000012 AND OrderNo=120;  -- 生产要素参数
+UPDATE SysMenu SET OrderNo=160, UpdateTime=NOW() WHERE Id=1329003000013 AND OrderNo=130;  -- 物料工艺要素
+UPDATE SysMenu SET OrderNo=170, UpdateTime=NOW() WHERE Id=1329003000014 AND OrderNo=140;  -- 前处理要素
+UPDATE SysMenu SET OrderNo=180, UpdateTime=NOW() WHERE Id=1329003000015 AND OrderNo=150;  -- 前处理要素参数
+UPDATE SysMenu SET OrderNo=190, UpdateTime=NOW() WHERE Id=1329003000016 AND OrderNo=160;  -- SOP 文件类型
+UPDATE SysMenu SET OrderNo=200, UpdateTime=NOW() WHERE Id=1329003000017 AND OrderNo=170;  -- SOP 维护

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

@@ -658,23 +658,23 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
 
         var leaves = new (long IdOff, string Path, string Name, string Title, string Component, int Order)[]
         {
-            (1, "/aidop/s0/manufacturing/standard-bom", "aidopS0MfgStandardBom", "标准 BOM", "/aidop/s0/manufacturing/StandardBomManagement", 10),
-            (2, "/aidop/s0/manufacturing/standard-operation", "aidopS0MfgStandardOperation", "标准工序", "/aidop/s0/manufacturing/StandardProcessList", 20),
-            (3, "/aidop/s0/manufacturing/production-line", "aidopS0MfgProductionLine", "生产线编码清单", "/aidop/s0/manufacturing/ProductionLineList", 30),
-            (4, "/aidop/s0/manufacturing/routing", "aidopS0MfgRouting", "标准工艺路线列表", "/aidop/s0/manufacturing/RoutingList", 40),
-            (5, "/aidop/s0/manufacturing/material-substitution", "aidopS0MfgMaterialSubstitution", "物料替代", "/aidop/s0/manufacturing/MaterialSubstitutionList", 50),
-            (6, "/aidop/s0/manufacturing/work-order-control", "aidopS0MfgWorkOrderControl", "工单控制参数", "/aidop/s0/manufacturing/WorkOrderControlParams", 60),
-            (7, "/aidop/s0/manufacturing/person-skill", "aidopS0MfgPersonSkill", "人员技能", "/aidop/s0/manufacturing/PersonnelSkillList", 70),
-            (8, "/aidop/s0/manufacturing/person-skill-assignment", "aidopS0MfgPersonSkillAssignment", "人员技能维护", "/aidop/s0/manufacturing/PersonSkillAssignmentList", 80),
+            (1, "/aidop/s0/manufacturing/standard-bom", "aidopS0MfgStandardBom", "标准BOM列表", "/aidop/s0/manufacturing/StandardBomManagement", 10),
+            (2, "/aidop/s0/manufacturing/standard-operation", "aidopS0MfgStandardOperation", "标准工序列表", "/aidop/s0/manufacturing/StandardProcessList", 20),
+            (3, "/aidop/s0/manufacturing/production-line", "aidopS0MfgProductionLine", "生产线维护列表", "/aidop/s0/manufacturing/ProductionLineList", 40),
+            (4, "/aidop/s0/manufacturing/routing", "aidopS0MfgRouting", "标准工艺路线列表", "/aidop/s0/manufacturing/RoutingList", 50),
+            (5, "/aidop/s0/manufacturing/material-substitution", "aidopS0MfgMaterialSubstitution", "物料替代关系列表", "/aidop/s0/manufacturing/MaterialSubstitutionList", 60),
+            (6, "/aidop/s0/manufacturing/work-order-control", "aidopS0MfgWorkOrderControl", "工单控制参数", "/aidop/s0/manufacturing/WorkOrderControlParams", 130),
+            (7, "/aidop/s0/manufacturing/person-skill", "aidopS0MfgPersonSkill", "人员技能", "/aidop/s0/manufacturing/PersonnelSkillList", 140),
+            (8, "/aidop/s0/manufacturing/person-skill-assignment", "aidopS0MfgPersonSkillAssignment", "人员技能维护列表", "/aidop/s0/manufacturing/PersonSkillAssignmentList", 80),
             (9, "/aidop/s0/manufacturing/line-post", "aidopS0MfgLinePost", "产线岗位维护", "/aidop/s0/manufacturing/LinePostList", 90),
-            (10, "/aidop/s0/manufacturing/work-center", "aidopS0MfgWorkCenter", "工作中心", "/aidop/s0/manufacturing/WorkCenterList", 100),
-            (11, "/aidop/s0/manufacturing/line-material", "aidopS0MfgLineMaterial", "线边物料", "/aidop/s0/manufacturing/LineMaterialList", 110),
-            (12, "/aidop/s0/manufacturing/element-param-production", "aidopS0MfgElementParamProduction", "生产要素参数", "/aidop/s0/manufacturing/ProductionElementParamList", 120),
-            (13, "/aidop/s0/manufacturing/material-process-element", "aidopS0MfgMaterialProcessElement", "物料工艺要素", "/aidop/s0/manufacturing/MaterialProcessElementList", 130),
-            (14, "/aidop/s0/manufacturing/preprocess-element", "aidopS0MfgPreprocessElement", "前处理要素", "/aidop/s0/manufacturing/PreprocessElementList", 140),
-            (15, "/aidop/s0/manufacturing/preprocess-element-param", "aidopS0MfgElementParamPreprocess", "前处理要素参数", "/aidop/s0/manufacturing/PreprocessElementParamList", 150),
-            (16, "/aidop/s0/manufacturing/sop-file-type", "aidopS0MfgSopFileType", "SOP 文件类型", "/aidop/s0/manufacturing/SopFileTypeList", 160),
-            (17, "/aidop/s0/manufacturing/sop-document", "aidopS0MfgSopDocument", "SOP 维护", "/aidop/s0/manufacturing/SopMaintenanceList", 170),
+            (10, "/aidop/s0/manufacturing/work-center", "aidopS0MfgWorkCenter", "工作中心列表", "/aidop/s0/manufacturing/WorkCenterList", 100),
+            (11, "/aidop/s0/manufacturing/line-material", "aidopS0MfgLineMaterial", "生产线物料维护列表", "/aidop/s0/manufacturing/LineMaterialList", 110),
+            (12, "/aidop/s0/manufacturing/element-param-production", "aidopS0MfgElementParamProduction", "生产要素参数", "/aidop/s0/manufacturing/ProductionElementParamList", 150),
+            (13, "/aidop/s0/manufacturing/material-process-element", "aidopS0MfgMaterialProcessElement", "物料工艺要素", "/aidop/s0/manufacturing/MaterialProcessElementList", 160),
+            (14, "/aidop/s0/manufacturing/preprocess-element", "aidopS0MfgPreprocessElement", "前处理要素", "/aidop/s0/manufacturing/PreprocessElementList", 170),
+            (15, "/aidop/s0/manufacturing/preprocess-element-param", "aidopS0MfgElementParamPreprocess", "前处理要素参数", "/aidop/s0/manufacturing/PreprocessElementParamList", 180),
+            (16, "/aidop/s0/manufacturing/sop-file-type", "aidopS0MfgSopFileType", "SOP 文件类型", "/aidop/s0/manufacturing/SopFileTypeList", 190),
+            (17, "/aidop/s0/manufacturing/sop-document", "aidopS0MfgSopDocument", "SOP 维护", "/aidop/s0/manufacturing/SopMaintenanceList", 200),
         };
 
         foreach (var (idOff, path, name, title, component, order) in leaves)
@@ -706,7 +706,7 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
             Icon = "ele-List",
             Type = MenuTypeEnum.Menu,
             CreateTime = ct,
-            OrderNo = 18,
+            OrderNo = 70,
             Remark = "S0 选择替代方案(只读查询)"
         };
 
@@ -721,7 +721,7 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
             Icon = "ele-Tickets",
             Type = MenuTypeEnum.Menu,
             CreateTime = ct,
-            OrderNo = 180,
+            OrderNo = 30,
             Remark = "S0 工序流转卡(数据源:legacy MissedPrint 只读视图)"
         };
 
@@ -736,7 +736,7 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
             Icon = "ele-Calendar",
             Type = MenuTypeEnum.Menu,
             CreateTime = ct,
-            OrderNo = 190,
+            OrderNo = 120,
             Remark = "S0 订单排程周期标准"
         };
     }