Sfoglia il codice sorgente

style(s0): restructure routing upsert form into grouped business form

FUNC-S0-002 标准工艺路线新增/编辑弹窗,纯前端 UI/文案优化。

字段中文化:可见 label 不再出现 Ufld* / UDeci* / Supp / IsConfirm /
CommentIndex 等 DTO/DB 字段名。中文名取自实体 SugarColumn 注释与列表列名,
未新造语义。Ufld1/Ufld4/Ufld7 实体注释即为「自定义字段」,实测数据存在两种
互斥用法(6456 行作活动编码、3 万余行为工序类中文词),语义未确认,
故按中性名「自定义字段一/二/三」展示并加行内说明,原值透传。

布局:弹窗 1080px + max-width calc(100vw-80px),改为
基本信息 / 工序活动 / 委外信息 / 其他信息 / 系统信息 五个分组;
基本信息两列,工序活动 3×3 网格(活动 | 数量 | 单位),委外字段集中;
栅格改 el-row/el-col 并加 xs 断点,小屏自动降一列;
用 12px 内边距抵消 gutter 负外边距,消除容器内 4px 横向溢出。

未改动:后端 / DTO / DB / 校验逻辑 / 物料与工作中心下拉 /
companyRefId-factoryRefId 默认组织逻辑;必填集仍为 RouteCode、RouteName、
MaterialCode、OperationCode 四项,与后端 [Required] 一致,仅对齐提示文案。
创建人/更新人经核实由 DTO 直接写入、非系统维护,故保持可编辑,仅降至末尾分组。

chore: bump version Web 2.4.363
YY968XX 2 mesi fa
parent
commit
f692ba12b6
2 ha cambiato i file con 204 aggiunte e 93 eliminazioni
  1. 1 1
      Web/package.json
  2. 203 92
      Web/src/views/aidop/s0/manufacturing/RoutingList.vue

+ 1 - 1
Web/package.json

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

+ 203 - 92
Web/src/views/aidop/s0/manufacturing/RoutingList.vue

@@ -72,93 +72,165 @@
 			/>
 		</div>
 
-		<el-dialog v-model="dialogVisible" :title="dialogTitle" width="920px" destroy-on-close @closed="resetForm">
-			<el-form ref="formRef" :model="form" :rules="rules" label-width="120px" class="routing-form">
-				<el-row :gutter="12">
-					<el-col :span="8">
-						<el-form-item label="排序" prop="sortNo">
-							<el-input-number v-model="form.sortNo" :min="0" :step="1" style="width: 100%" />
-						</el-form-item>
-					</el-col>
-					<el-col :span="8">
-						<el-form-item label="路线编码" prop="routeCode"><el-input v-model="form.routeCode" /></el-form-item>
-					</el-col>
-					<el-col :span="8">
-						<el-form-item label="路线名称" prop="routeName"><el-input v-model="form.routeName" /></el-form-item>
-					</el-col>
-					<el-col :span="8">
-						<el-form-item label="物料编码" prop="materialCode">
-							<el-select v-model="form.materialCode" filterable clearable placeholder="请选择物料" style="width: 100%">
-								<el-option v-for="o in materialOptions" :key="o.value" :label="o.label" :value="o.value" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :span="8">
-						<el-form-item label="工序编码" prop="operationCode"><el-input v-model="form.operationCode" /></el-form-item>
-					</el-col>
-					<el-col :span="8">
-						<el-form-item label="工序名称"><el-input v-model="form.operationDescription" /></el-form-item>
-					</el-col>
-					<el-col :span="8">
-						<el-form-item label="工作中心">
-							<el-select v-model="form.workCenterCode" filterable clearable placeholder="请选择工作中心" style="width: 100%">
-								<el-option v-for="o in workCenterOptions" :key="o.value" :label="o.label" :value="o.value" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :span="8">
-						<el-form-item label="报工工序"><el-input v-model="form.milestoneOperation" /></el-form-item>
-					</el-col>
-					<el-col :span="8"><el-form-item label="Ufld1"><el-input v-model="form.ufld1" /></el-form-item></el-col>
-					<el-col :span="8"><el-form-item label="活动一 Ufld2"><el-input v-model="form.ufld2" /></el-form-item></el-col>
-					<el-col :span="8">
-						<el-form-item label="数量一 UDeci1">
-							<el-input-number v-model="form.uDeci1" :controls="false" style="width: 100%" />
-						</el-form-item>
-					</el-col>
-					<el-col :span="8"><el-form-item label="单位一 Ufld3"><el-input v-model="form.ufld3" /></el-form-item></el-col>
-					<el-col :span="8"><el-form-item label="Ufld4"><el-input v-model="form.ufld4" /></el-form-item></el-col>
-					<el-col :span="8"><el-form-item label="活动二 Ufld5"><el-input v-model="form.ufld5" /></el-form-item></el-col>
-					<el-col :span="8">
-						<el-form-item label="数量二 UDeci2">
-							<el-input-number v-model="form.uDeci2" :controls="false" style="width: 100%" />
-						</el-form-item>
-					</el-col>
-					<el-col :span="8"><el-form-item label="单位二 Ufld6"><el-input v-model="form.ufld6" /></el-form-item></el-col>
-					<el-col :span="8"><el-form-item label="Ufld7"><el-input v-model="form.ufld7" /></el-form-item></el-col>
-					<el-col :span="8"><el-form-item label="活动三 Ufld8"><el-input v-model="form.ufld8" /></el-form-item></el-col>
-					<el-col :span="8">
-						<el-form-item label="数量三 UDeci3">
-							<el-input-number v-model="form.uDeci3" :controls="false" style="width: 100%" />
-						</el-form-item>
-					</el-col>
-					<el-col :span="8"><el-form-item label="单位三 Ufld9"><el-input v-model="form.ufld9" /></el-form-item></el-col>
-					<el-col :span="8">
-						<el-form-item label="基本批量 UDeci4">
-							<el-input-number v-model="form.uDeci4" :controls="false" style="width: 100%" />
-						</el-form-item>
-					</el-col>
-					<el-col :span="8">
-						<el-form-item label="工序委外 UDeci5">
-							<el-input-number v-model="form.uDeci5" :controls="false" style="width: 100%" />
-						</el-form-item>
-					</el-col>
-					<el-col :span="8"><el-form-item label="供应商 Supp"><el-input v-model="form.supplierCode" /></el-form-item></el-col>
-					<el-col :span="8">
-						<el-form-item label="委外提前期">
-							<el-input-number v-model="form.outsourcedLeadTime" :min="0" :step="1" style="width: 100%" />
-						</el-form-item>
-					</el-col>
-					<el-col :span="8"><el-form-item label="启用"><el-switch v-model="form.isEnabled" /></el-form-item></el-col>
-					<el-col :span="8"><el-form-item label="确认 IsConfirm"><el-switch v-model="form.isConfirm" /></el-form-item></el-col>
-					<el-col :span="8">
-						<el-form-item label="CommentIndex">
-							<el-input-number v-model="form.commentIndex" :controls="false" style="width: 100%" />
-						</el-form-item>
-					</el-col>
-					<el-col :span="8"><el-form-item label="创建人"><el-input v-model="form.createUser" /></el-form-item></el-col>
-					<el-col :span="8"><el-form-item label="更新人"><el-input v-model="form.updateUser" /></el-form-item></el-col>
-				</el-row>
+		<el-dialog v-model="dialogVisible" :title="dialogTitle" width="1080px" class="routing-dialog" destroy-on-close @closed="resetForm">
+			<!--
+				分组表单:基本信息 / 工序活动 / 委外信息 / 其他信息 / 系统信息。
+				Create 与 Edit 复用同一套布局(本页无按模式差异的显示控制),
+				所有 v-model 绑定、prop 与校验规则与改版前完全一致,仅调整 label 文案与排布。
+			-->
+			<el-form ref="formRef" :model="form" :rules="rules" label-width="110px" class="routing-form">
+				<div class="form-section">
+					<div class="form-section__title">基本信息</div>
+					<el-row :gutter="24">
+						<el-col :xs="24" :sm="12">
+							<el-form-item label="工艺路线编码" prop="routeCode">
+								<el-input v-model="form.routeCode" placeholder="请输入工艺路线编码" />
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12">
+							<el-form-item label="工艺路线名称" prop="routeName">
+								<el-input v-model="form.routeName" placeholder="请输入工艺路线名称" />
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12">
+							<el-form-item label="物料编码" prop="materialCode">
+								<el-select v-model="form.materialCode" filterable clearable placeholder="请选择物料" style="width: 100%">
+									<el-option v-for="o in materialOptions" :key="o.value" :label="o.label" :value="o.value" />
+								</el-select>
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12">
+							<el-form-item label="工作中心">
+								<el-select v-model="form.workCenterCode" filterable clearable placeholder="请选择工作中心" style="width: 100%">
+									<el-option v-for="o in workCenterOptions" :key="o.value" :label="o.label" :value="o.value" />
+								</el-select>
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12">
+							<el-form-item label="工序编码" prop="operationCode">
+								<el-input v-model="form.operationCode" placeholder="请输入工序编码" />
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12">
+							<el-form-item label="工序名称">
+								<el-input v-model="form.operationDescription" placeholder="请输入工序名称" />
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12">
+							<el-form-item label="排序" prop="sortNo">
+								<el-input-number v-model="form.sortNo" :min="0" :step="1" controls-position="right" style="width: 100%" />
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12">
+							<el-form-item label="报工工序">
+								<el-input v-model="form.milestoneOperation" placeholder="请输入报工工序" />
+							</el-form-item>
+						</el-col>
+					</el-row>
+				</div>
+
+				<div class="form-section">
+					<div class="form-section__title">工序活动</div>
+					<el-row :gutter="24">
+						<el-col :xs="24" :sm="10">
+							<el-form-item label="活动一" label-width="72px"><el-input v-model="form.ufld2" /></el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="7">
+							<el-form-item label="数量一" label-width="72px">
+								<el-input-number v-model="form.uDeci1" :controls="false" style="width: 100%" />
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="7">
+							<el-form-item label="单位一" label-width="72px"><el-input v-model="form.ufld3" /></el-form-item>
+						</el-col>
+					</el-row>
+					<el-row :gutter="24">
+						<el-col :xs="24" :sm="10">
+							<el-form-item label="活动二" label-width="72px"><el-input v-model="form.ufld5" /></el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="7">
+							<el-form-item label="数量二" label-width="72px">
+								<el-input-number v-model="form.uDeci2" :controls="false" style="width: 100%" />
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="7">
+							<el-form-item label="单位二" label-width="72px"><el-input v-model="form.ufld6" /></el-form-item>
+						</el-col>
+					</el-row>
+					<el-row :gutter="24">
+						<el-col :xs="24" :sm="10">
+							<el-form-item label="活动三" label-width="72px"><el-input v-model="form.ufld8" /></el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="7">
+							<el-form-item label="数量三" label-width="72px">
+								<el-input-number v-model="form.uDeci3" :controls="false" style="width: 100%" />
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="7">
+							<el-form-item label="单位三" label-width="72px"><el-input v-model="form.ufld9" /></el-form-item>
+						</el-col>
+					</el-row>
+				</div>
+
+				<div class="form-section">
+					<div class="form-section__title">委外信息</div>
+					<el-row :gutter="24">
+						<el-col :xs="24" :sm="12">
+							<el-form-item label="工序委外">
+								<el-input-number v-model="form.uDeci5" :controls="false" style="width: 100%" />
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12">
+							<el-form-item label="供应商代码"><el-input v-model="form.supplierCode" placeholder="请输入供应商代码" /></el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12">
+							<el-form-item label="委外提前期">
+								<el-input-number v-model="form.outsourcedLeadTime" :min="0" :step="1" controls-position="right" style="width: 100%" />
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12">
+							<el-form-item label="基本批量">
+								<el-input-number v-model="form.uDeci4" :controls="false" style="width: 100%" />
+							</el-form-item>
+						</el-col>
+					</el-row>
+				</div>
+
+				<div class="form-section">
+					<div class="form-section__title">其他信息</div>
+					<el-row :gutter="24">
+						<el-col :xs="24" :sm="12"><el-form-item label="启用"><el-switch v-model="form.isEnabled" /></el-form-item></el-col>
+						<el-col :xs="24" :sm="12"><el-form-item label="确认"><el-switch v-model="form.isConfirm" /></el-form-item></el-col>
+					</el-row>
+					<!--
+						自定义字段一/二/三 = 旧系统 Ufld1/Ufld4/Ufld7。实体注释即为「自定义字段」,
+						DTO 无注释;实测数据两种互斥用法(6456 行为活动编码,另 3 万余行为工序类中文词),
+						业务语义未确认,故按中性名称展示、原样透传,不臆造业务含义。
+					-->
+					<div class="form-section__hint">以下为旧系统自定义列,业务语义尚未确认,页面仅按原值透传,不参与任何计算。</div>
+					<el-row :gutter="24">
+						<el-col :xs="24" :sm="12"><el-form-item label="自定义字段一"><el-input v-model="form.ufld1" /></el-form-item></el-col>
+						<el-col :xs="24" :sm="12"><el-form-item label="自定义字段二"><el-input v-model="form.ufld4" /></el-form-item></el-col>
+						<el-col :xs="24" :sm="12"><el-form-item label="自定义字段三"><el-input v-model="form.ufld7" /></el-form-item></el-col>
+						<el-col :xs="24" :sm="12">
+							<el-form-item label="批注索引">
+								<el-input-number v-model="form.commentIndex" :controls="false" style="width: 100%" />
+							</el-form-item>
+						</el-col>
+					</el-row>
+				</div>
+
+				<div class="form-section">
+					<div class="form-section__title">系统信息</div>
+					<!--
+						创建人/更新人当前由 DTO 直接写入(控制器 ApplyUpsert 原样赋值),
+						**不是**系统自动维护字段,因此保持可编辑、不改写入行为,仅降到末尾分组。
+					-->
+					<el-row :gutter="24">
+						<el-col :xs="24" :sm="12"><el-form-item label="创建人"><el-input v-model="form.createUser" /></el-form-item></el-col>
+						<el-col :xs="24" :sm="12"><el-form-item label="更新人"><el-input v-model="form.updateUser" /></el-form-item></el-col>
+					</el-row>
+				</div>
 			</el-form>
 			<template #footer>
 				<el-button @click="dialogVisible = false">取消</el-button>
@@ -260,9 +332,11 @@ function emptyForm() {
 const form = reactive(emptyForm());
 
 const rules: FormRules = {
-	routeCode: [{ required: true, message: '请填写路线编码', trigger: 'blur' }],
-	routeName: [{ required: true, message: '请填写路线名称', trigger: 'blur' }],
-	materialCode: [{ required: true, message: '请填写物料编码', trigger: 'blur' }],
+	// 必填集与后端 DTO 的 [Required] 严格一致(RouteCode / RouteName / MaterialCode / OperationCode);
+	// 本轮只对齐提示文案与新 label,不增删任何 required。
+	routeCode: [{ required: true, message: '请填写工艺路线编码', trigger: 'blur' }],
+	routeName: [{ required: true, message: '请填写工艺路线名称', trigger: 'blur' }],
+	materialCode: [{ required: true, message: '请选择物料编码', trigger: 'change' }],
 	operationCode: [{ required: true, message: '请填写工序编码', trigger: 'blur' }],
 };
 
@@ -347,7 +421,7 @@ function openCreate() {
 async function openEdit(row: Row) {
 	resetForm();
 	editingId.value = row.id;
-	dialogTitle.value = `编辑 ${row.routeCode} / ${row.operationCode}`;
+	dialogTitle.value = '编辑工艺路线明细';
 	const detail = await s0MfgRoutingOpDetailsApi.get(row.id);
 	rowToForm(detail);
 	dialogVisible.value = true;
@@ -451,8 +525,45 @@ onMounted(async () => {
 	display: flex;
 	justify-content: flex-end;
 }
+/* 弹窗:宽屏用固定宽度,窄屏自动收缩,杜绝横向滚动条 */
+.routing-dialog {
+	max-width: calc(100vw - 80px);
+}
 .routing-form {
-	max-height: 70vh;
+	max-height: 68vh;
 	overflow-y: auto;
+	/* 横向一律不滚:所有列走 el-row/el-col 栅格 + 输入框 100% 宽 */
+	overflow-x: hidden;
+	/* :gutter="24" 会给 el-row 加 -12px 左右负外边距,这里用等量内边距抵消,
+	   否则内容会比滚动容器宽出若干像素(overflow-x:hidden 只是遮住、并未消除) */
+	padding: 0 12px;
+}
+.form-section + .form-section {
+	margin-top: 20px;
+}
+.form-section__title {
+	margin-bottom: 16px;
+	padding-bottom: 8px;
+	border-bottom: 1px solid var(--el-border-color-lighter);
+	font-size: 14px;
+	font-weight: 600;
+	color: var(--el-text-color-primary);
+}
+.form-section__hint {
+	/* 上边距略大:让提示明确归属于其下方的自定义字段,而不是上一行的开关 */
+	margin: 6px 0 14px;
+	font-size: 12px;
+	line-height: 1.6;
+	color: var(--el-text-color-secondary);
+}
+:deep(.el-form-item) {
+	margin-bottom: 18px;
+}
+/* 数字框与普通输入框视觉统一:左对齐、同宽 */
+:deep(.el-input-number) {
+	width: 100%;
+}
+:deep(.el-input-number .el-input__inner) {
+	text-align: left;
 }
 </style>