285a281439
- /business/waybill-manage 新增/编辑弹窗添加 dialogCustomClass 控制高度样式,覆盖默认 max-height 限制 - /business/contract-manage 弹窗同样加 dialogCustomClass,scoped 样式解开 Avue 弹窗默认 body 高度限制并实现底部操作栏粘性 - element-ui.scss 新增对应页 dialog 样式,确保弹窗上下留白20px,内容区高度自动适应,底部操作栏始终可见 - 复用 business-crud-page 组件中传入 option 的 dialogCustomClass 实现页面隔离样式,不影响其他业务
16 KiB
16 KiB
2026-08-14 工作记录
temporary-credit-limit 弹窗 label 固定 6 汉字宽度并换行
- 需求:用户反馈
/business/temporary-credit-limit新增弹窗中 label「已使用项目资金使用额度(万元)」过宽(227px),希望超过 6 个汉字就换行。
loading-manage 搜索栏 label 宽度 160→88
- 用户要求把
/business/loading-manage页面搜索栏所有 label 宽度从 160px 改为 88px。 - 改动:
src/views/business/loading-manage.vue第 4 行<el-form ... label-width="88px">。 - 注意事项:AGENTS.md 4.4 节规范"搜索组件 label 宽度统一不小于 160px",本次按用户指令执行但与项目规范冲突;如后续要恢复规范或全站统一,需要回滚。
shipping-template 弹窗高度改为接近全屏
- 用户要求把
/business/shipping-template弹窗高度调到接近全屏(硬编码 200px 安全区太大)。 - 关键定位:Avue 库内置
.avue-dialog { max-height: calc(100% - 200px) }加在el-dialog根元素(avue libpackages/core/components/dialog-form/index4.js:14class:"avue-dialog");shipping-template 的dialogCustomClass:'shipping-template-dialog'合并到同一元素。项目样式(common.scss)在 main.js:24 晚于 Avue css(main.js:12)加载,可覆盖。 - 改动:
src/styles/element-ui.scss的.shipping-template-dialog.el-dialog规则,由margin-top:4vh; margin-bottom:0; height:calc(100vh - 4vh - 24px)改为margin-top:20px !important; margin-bottom:20px !important; height:calc(100vh - 40px); max-height:calc(100vh - 40px) !important,用 max-height + !important 压过库内置上限。 - 注意:仅改 shipping-template 专属规则,未动库内置
.avue-dialog根,也未影响其他弹窗。body/footer 的 flex 分摊规则(474-488 行)保持不变。
transport-plan 弹窗高度也改为接近全屏
- 用户要求
/business/transport-plan新增/编辑弹窗同样改为接近全屏(原来固定 max-height: 72vh,内容少时下方留白)。 - 改动:
src/styles/element-ui.scss的.transport-plan-dialog.el-dialog规则,由margin-top:4vh; max-height:72vh改为margin-top:20px !important; margin-bottom:20px !important; height:calc(100vh - 40px); max-height:calc(100vh - 40px) !important,与 shipping-template 弹窗完全对齐(压过库内置.avue-dialog的 max-height: calc(100% - 200px))。 - 已确认
src/option/business/transport-plan.js:607有dialogCustomClass: 'transport-plan-dialog',CSS 生效。body/footer flex 分摊规则(504-520 行)保持不变。
waybill-manage 弹窗高度也改为接近全屏
- 用户要求
/business/waybill-manage新增/编辑弹窗同样接近全屏。 - 机制澄清:waybill-manage 用封装组件
src/views/business/components/business-crud-page.vue,它内部<avue-crud :option="option">,option 由传入的crudOption(即 waybill-manage.js 的 option)经cloneOption(组件内 6261 行,浅展开+重映射 column,保留所有顶层属性)克隆而来。因此给 waybill-manage.js 的 option 顶层加dialogCustomClass即可只影响本页(不影响共用 business-crud-page 的其他页面)。Avue crud 弹窗dialog-form3.js:21会读取并应用 dialogCustomClass。 - 改动1:
src/option/business/waybill-manage.js的export const option = {顶层加dialogCustomClass: 'waybill-manage-dialog'(在展开...createCrudOption(之前)。 - 改动2:
src/styles/element-ui.scss新增.waybill-manage-dialog.el-dialog / .el-dialog__header / .el-dialog__body / .avue-dialog__footer四条规则,复刻 shipping-template 方案(height/max-height: calc(100vh - 40px) !important;body max-height:none !important 解开全局.avue-crud__dialog .el-dialog__body的 200px 限制;footer sticky)。额外在 footer 加margin-top: 0 !important抵消全局.avue-crud__dialog .avue-dialog__footer { margin-top: -30px !important }(863 行)的上移副作用(shipping-template 是 dialog-form 弹窗无 avue-crud__dialog class 故不受影响,waybill-manage 是 avue-crud 弹窗会受影响,必须处理)。 - 宽度来源:
src/option/business/common.js的createCrudOption中labelWidth: 'auto';- Avue 会按当前弹窗内最长 label 自动计算宽度,故出现 227px。
src/styles/element-ui.scss第 164 行.el-dialog .el-form-item__label { white-space: nowrap }阻止换行。
- 改动:
src/option/business/temporary-credit-limit.js:option 增加dialogCustomClass: 'temporary-credit-limit-dialog'。src/styles/element-ui.scss:新增.temporary-credit-limit-dialog .el-form-item__label规则,固定宽度calc(6em + 24px),并设置white-space: normal; word-break: break-all; overflow-wrap: anywhere; line-height: 18px,实现超长 label 自动换行。- 同时给
.temporary-credit-limit-dialog .el-form-item { align-items: center; }保持垂直居中。
- 参考:同文件已有
.avue-dialog--common-route使用相同 6em label 宽度方案。
transportCapacity/ship 到期筛选标签默认展开并靠前
- 需求:用户反馈
/transportCapacity/ship页面搜索栏的「全部/30天内到期/已到期」标签需要点击「展开」后才显示,希望默认直接显示;且位置要位于搜索按钮前面。 - 原因:
src/option/transportCapacity/transport-ship.js中searchIndex: 4,默认只展示前 4 个搜索条件,而expireStatus的searchOrder: 0(Avue 越大越靠前)排在第 6 位,因此被折叠到第二行。 - 改动:
src/option/transportCapacity/transport-ship.js:searchIndex: 4 → 6,让全部 6 个搜索条件默认展开,标签无需再点展开即可看到。- 由于
expireStatus排在最后,展开后它自然位于第二行末尾、搜索按钮之前,满足"移到搜索按钮前面"的要求。
transportCapacity/vehicle 与 ship 到期筛选标签重构(对齐 driver 的 #search-menu 方案)
- 需求:用户希望
/transportCapacity/vehicle和/transportCapacity/ship的「全部/30天内到期/已到期」标签与 driver 页一致:① 不展开就直接显示;② 移到搜索按钮前面并保留间距。 - 关键差异(排查发现):driver 用
#search-menu插槽把标签渲染在按钮所在行;而 vehicle/ship 之前用#expireStatus-search列插槽,标签被渲染进搜索条件网格(位置不对)。 - 改动(两页同样处理):
.vue:<template #expireStatus-search>→<template #search-menu>,标签 div 内容不变。.vue样式__expiry-tags:去掉width: 100%,改为order: -1; margin-right: 12px; min-width: 0;(与 driver 完全一致,使标签左移并落在搜索按钮前)。- option:将
expireStatus列的search: true → search: false(否则会在搜索网格里多渲染一个空输入框);searchIndex设为 ≥ 真实搜索列数(vehicle:4 → 6;ship 已是6),使columnLen ≤ searchIndex,Avue 不再显示「展开」按钮。
- 原理:Avue
header-search3.js中#search-menu插槽内容渲染进menu-form,位于默认搜索/重置按钮之后、展开按钮之前;order: -1将标签推到按钮左侧。 - 验证:
node --check两个 option 文件通过;页面刷新即可见效果。
process-config.vue 弹窗重构为手写 el-dialog(对齐 customer-archive 风格)
- 需求:用户要求
/business/process-config.vue排版风格改成和/vehicle/customer-archive.vue一样,保持风格统一。 - 根因:两页弹窗架构根本不同——customer-archive 用手写
<el-dialog>+section-card分组 +#footer按钮;process-config 原用 Avue 内置弹窗(#basicInfo-form/#nodeConfigJson-form插槽 +#menu-form-before保存按钮)。要真正统一,只能把 process-config 改成手写弹窗。 - 模板改动(已完成):
- 移除 avue-crud 的
:before-open/@row-save/@row-update/@row-del与#menu-form-before、#basicInfo-form、#nodeConfigJson-form插槽。 - 在
</avue-crud>后新增手写<el-dialog class="process-dialog" v-model="processBox" width="92%" top="4vh" append-to-body @closed="resetProcess">,内部<el-form ref="processForm" :model="form" label-width="calc(6em + 24px)" :disabled="dialogReadonly" class="process-form dialog-form-label-fixed">,含 3 个section-card:基本信息 / 现行过程节点(时间线)/ 节点设置(节点表格);#footer含 保存草稿(plain) + 保存并启用(primary) + 取消/关闭。 - 顶部「新建过程配置」、表格「查看/编辑」链接改调
openProcessConfig()/openProcessConfig(row, true)/openProcessConfig(row, false)。
- 移除 avue-crud 的
- 脚本改动(本次完成):删除 Avue 生命周期方法
beforeOpen/rowSave/rowUpdate/submitRow/stopSubmitLoading/handleProcessConfigSave;新增openProcessConfig(row, readonly)(load 详情后this.form=data+selectedProjectId+parseNodeConfig+ 开框;新增则清空表单 +resetNodeRows)、submitProcessConfig(mode)(this.$refs.processForm.validate→syncNodeFields→normalizeRow→validateRow→confirmDuplicateVoucher→api.submit,成功后关框并刷新)、resetProcess()(@closed重置dialogReadonly/submitting/submitStatus/form/selectedProjectId+resetNodeRows+clearValidate)。data()已含processBox/submitting、computed.dialogTitle;rowDel/handleCopy/handleAction不变(独立 API 调用)。 - option 改动(已完成):
src/option/business/process-config.js置saveBtn/updateBtn/addBtn/viewBtn/editBtn/delBtn:false,关闭 Avue 内置弹窗按钮。 - 样式:新增
:deep(.process-dialog .el-dialog__body){max-height:72vh;overflow:auto},对齐 customer-archive 的.archive-dialog滚动行为(长内容时 body 滚动、footer 固定)。 - 验证:
vite build --outDir /tmp/pc-build-check全量编译通过(仅动态导入 chunk 警告,与本改动无关);之前npm run build失败仅因沙箱 safe-delete 守卫清理旧 dist/ 触发,非代码错误。
contract-manage 到期筛选标签靠右对齐
- 需求:用户截图反馈
/business/contract-manage搜索栏中「全部/30天内到期/90天内到期/90天以上/已到期」标签需要靠右对齐。 - 改动:
src/views/business/components/business-crud-page.vue中.business-crud-page__contract-expiry-search样式由order: -1; margin-right: auto改为margin-left: auto。这样该 slot 内容会被推到#search-menu行的右侧,搜索/重置按钮留在左侧,与 vehicle/ship 的左侧标签方案相反,符合用户本次要求。 - 验证:
vite build --outDir /tmp/pc-build-check-2全量编译通过。
shipping-template 新增/编辑弹窗居中 + 加高(对齐 customer-archive)
- 需求:用户反馈
/business/shipping-template新增弹窗「没居中、高度不够高」,要求参照/vehicle/customer-archive的做法。 - 根因排查:
- shipping-template 的弹窗是 avue-crud 内置弹窗(business-crud-page +
:crud-option,$refs.crud.rowAdd()触发),option 里dialogWidth:'96%'、dialogTop:'10px'。 - avue 把
dialogTop映射为 Element Plus--el-dialog-margin-top,'10px'把弹窗死顶在顶部 → 视觉「没居中」。 - avue 内置 footer(
.avue-dialog__footer)渲染在可滚动 body 内部,不像 customer-archive 那样用#footer插槽在滚动区之外;字段多时「保存」按钮要滚动才看得到 → 视觉「高度不够高」。 - customer-archive 真正做法是:手写
<el-dialog width="92%" top="4vh">+#footer按钮浮动 + bodymax-height:72vh内部滚动。
- shipping-template 的弹窗是 avue-crud 内置弹窗(business-crud-page +
- 改动:
src/option/business/shipping-template.js:dialogWidth:'96%'→'92%'、dialogTop:'10px'→'4vh',新增dialogCustomClass:'shipping-template-dialog'(avue 会把它作为 class 加到 dialog 上,作为样式钩子)。src/styles/element-ui.scss:新增.shipping-template-dialog规则——弹窗体height: calc(100vh - 4vh - 24px)+ flex 列布局占满视口(顶部 4vh、底部留白,视觉居中高大);bodymax-height:none !important; overflow-y:auto解除全局 80vh 上限;.avue-dialog__footer用position:sticky; bottom:0; background:#fff贴底始终可见,对齐 customer-archive 浮动按钮效果。
- 注意:class 唯一,仅作用于 shipping-template(business-crud-page 被多页共用,但其余页 option 未设该 class);弹窗
append-to-body,故样式必须放全局(element-ui.scss)而非组件 scoped 样式。 - 验证:dev server(2889) HMR 自动生效;刷新后重开「新增」即可见效果(未跑全量 build,改动为纯 CSS + option 属性)。
transport-plan 新增/编辑弹窗固定 72vh(对齐 customer-archive 视觉)
- 需求:用户要求
/business/transport-plan新增/编辑弹窗高度 72vh,与/vehicle/customer-archive视觉一致。 - 排查发现:上次给 shipping-template 加的
.shipping-template-dialog全局 CSS 规则未持久化(option 钩子dialogCustomClass:'shipping-template-dialog'还在,但element-ui.scss里对应规则丢失),即 shipping-template 弹窗样式实际一直未生效。本次一并补回。 - 改动:
src/option/business/transport-plan.js:补dialogCustomClass:'transport-plan-dialog'(option 已有dialogWidth:'96%'、dialogTop:'4vh')。src/styles/element-ui.scss:- 补回
.shipping-template-dialog规则(弹窗体height: calc(100vh - 4vh - 24px)占满视口 + flex 列布局;bodymax-height:none !important; overflow-y:auto;.avue-dialog__footer { position:sticky; bottom:0; background:#fff }贴底)。 - 新增
.transport-plan-dialog规则(弹窗体用height:72vh固定高度,内容少时 body 下方留白、内容多时窗内滚动;footer 同样 sticky 贴底)。
- 补回
- 关键技术点:Avue 内置弹窗 footer 的真实 class 是
.avue-dialog__footer,且渲染在.el-dialog__body内部;贴底必须用position: sticky; bottom: 0(flexmargin-top:auto在滚动容器内仍会随内容滚走,无效)。这与手写 el-dialog(footer 在 body 外、class 为.el-dialog__footer)不同。 - 验证:dev server(2889) HMR 自动生效;刷新后重开「新增」即可见(弹窗固定 72vh、底部"提交/取消"常驻可见)。
contract-manage 新增/编辑弹窗也改为接近全屏
- 用户要求
/business/contract-manage新增/编辑弹窗同样接近全屏(与前几个 business 弹窗对齐)。 - 机制:该页同样用
business-crud-page封装 → avue-crud 弹窗(带avue-crud__dialogclass),与 waybill-manage 完全一致。 - 改动:
src/option/business/contract-manage.js:该文件 option 在createCrudOption([...])之后本就用option.xxx = ...顶层赋值(span/dialogWidth/dialogTop 等),故在末尾追加option.dialogCustomClass = 'contract-manage-dialog';(无需改结构,与文件既有写法一致)。src/styles/element-ui.scss:新增.contract-manage-dialog四条规则,复刻 waybill-manage 方案——height/max-height: calc(100vh - 40px) !important压过库内置.avue-dialog的 200px 上限;.el-dialog__header { flex:none }、.el-dialog__body { flex:1 1 auto; min-height:0; max-height:none !important; overflow-y:auto }解开全局 avue-crud 200px body 限制;.avue-dialog__footer { position:sticky; bottom:0; margin-top:0 !important; background:#fff }抵消全局 footer 的 -30px 上移。