diff --git a/.workbuddy/memory/2026-10-13.md b/.workbuddy/memory/2026-10-13.md
new file mode 100644
index 0000000..d4dff4c
--- /dev/null
+++ b/.workbuddy/memory/2026-10-13.md
@@ -0,0 +1,11 @@
+# 2026-10-13
+
+## 车辆调度弹窗:使用部门级联选择器宽度对齐
+
+- 现象:`/transportCapacity/vehicle-dispatch` 新增/编辑弹窗中,使用部门 `el-cascader` 明显窄于同行车牌号 `el-input`。
+- 根因:`el-cascader` 是 `display: inline-block` 宽度按内容收缩(不像 `el-autocomplete` / `el-input` 有 `--el-input-width: 100%` 兜底);而页面里写的 `.vehicle-dispatch-page :deep(.vehicle-dispatch-form-control){width:100%}` 命中不到 —— avue-crud 弹窗默认 `append-to-body: true`(`append-to-body": validData(crud.tableOption.dialogAppendToBody, true)`),DOM Teleport 到 body,已不在 `.vehicle-dispatch-page` 之下。
+- 修法(走项目既有约定):
+ 1. `src/option/transportCapacity/vehicle-dispatch.js` 增加 `dialogCustomClass: 'vehicle-dispatch-dialog'`;
+ 2. `src/styles/element-ui.scss` 增加全局规则 `.vehicle-dispatch-dialog .el-form-item__content > .el-cascader { width:100%; max-width:100% }`。
+- 自检:dev(2889) `curl /src/styles/element-ui.scss` 与 `/src/option/transportCapacity/vehicle-dispatch.js` 均 200,编译产物含新规则。
+- 遗留观察:同文件里 `.vehicle-dispatch-page :deep(.avue--detail ...)` 那一批查看态禁用样式,同样因 Teleport 属死规则(未改,待确认是否需要迁到 `.vehicle-dispatch-dialog` 作用域)。
diff --git a/.workbuddy/memory/MEMORY.md b/.workbuddy/memory/MEMORY.md
index 6be373c..e094720 100644
--- a/.workbuddy/memory/MEMORY.md
+++ b/.workbuddy/memory/MEMORY.md
@@ -12,6 +12,8 @@
**坑二:宿主 view 直绑全局 `$route.query.*` 给子组件 prop。** 缓存实例被灌入当前页 id → 拿错 id 查后端(批量弹「运单管理不存在」),live computed 还会误 push 标签。修法:`routePathLocked` 锁路径 + watcher / push 前判 `isOwnedRouteActive` + 宿主绑定加路径守卫。⚠️ `routePathLocked` **必须放 `data()`**(Options API 顺序 data → computed → watch(immediate) → created;放 created 会读到空值、挡掉首次加载)。已修 waybill-manage-page / transport-plan-page + 三个宿主 view。
+**坑四:avue-crud 弹窗 `append-to-body` 默认 true(`dialog-form3.js`:`validData(tableOption.dialogAppendToBody, true)`),DOM Teleport 到 body。** 于是页面里以页面容器为祖先的 scoped 选择器(`.xxx-page :deep(.yyy)`)**命中不到弹窗内容**,尤其 `el-cascader`(inline-block、宽度按内容收缩,不像 `el-input`/`el-autocomplete` 有 `--el-input-width:100%` 兜底)会明显比同行 input 窄。修法:option 里配 `dialogCustomClass: 'xxx-dialog'`,规则写到 `src/styles/element-ui.scss` 的 `.xxx-dialog ...`(项目既有约定,10+ 处同款);或把基准类放在 **Teleport 内部元素**上(如 ship.vue 的 `.ship-form` 挂在 el-form 上,自身带 scope 属性,照样生效)。
+
**坑三:路由表重复定义 → 内容区整页空白(2026-09-18)。** `/business/contract-manage/detail` 在 `router/views/index.js` 定义两次、子路由同名 `合同详情`。重名 `addRoute` 会 `removeRoute(name)` 移除旧子记录,但**不从父记录 children 里摘除**,第一条 Layout 壳记录留在 matcher 且靠前 → `resolve()` 命中它 → `$route.matched.length === 1` → 二级 router-view 无匹配 → 侧栏/标签正常但内容空白。修法:删重复定义。排查:扫「顶层 path + 首个子路由 name」重复项。
## 样式硬规则
diff --git a/cascader-width-check.html b/cascader-width-check.html
new file mode 100644
index 0000000..06ec13c
--- /dev/null
+++ b/cascader-width-check.html
@@ -0,0 +1,84 @@
+
+
+
+
+ cascader width check
+
+
+
+
+
+
diff --git a/src/option/transportCapacity/vehicle-dispatch.js b/src/option/transportCapacity/vehicle-dispatch.js
index 55361af..d2313cd 100644
--- a/src/option/transportCapacity/vehicle-dispatch.js
+++ b/src/option/transportCapacity/vehicle-dispatch.js
@@ -12,6 +12,9 @@ export const option = {
height: 'auto',
calcHeight: 32,
dialogWidth: 1200,
+ // 弹窗根节点 class:avue-crud 弹窗默认 append-to-body 到 body,
+ // 页面内 scoped 样式命中不到弹窗内容,故用该 class 在全局样式里做兜底(见 styles/element-ui.scss)
+ dialogCustomClass: 'vehicle-dispatch-dialog',
labelPosition: 'right',
labelWidth: 'auto',
tip: false,
diff --git a/src/styles/element-ui.scss b/src/styles/element-ui.scss
index 56985dc..d2ea9a6 100644
--- a/src/styles/element-ui.scss
+++ b/src/styles/element-ui.scss
@@ -652,6 +652,19 @@
background: #fff;
}
+// 车辆调度新增/编辑/查看弹窗:使用部门 el-cascader 默认 display: inline-block、宽度按内容收缩,
+// 会比同行的 el-input(--el-input-width 默认 100%)窄一大截,需显式拉满列宽。
+// 两个必须注意的点(踩过):
+// 1) avue-crud 弹窗默认 append-to-body 到 body,页面内 `.vehicle-dispatch-page :deep(...)`
+// 这类以页面容器为祖先的选择器匹配不到弹窗内容,必须用弹窗自身 class(dialogCustomClass)在全局兜底;
+// 2) avue 表单项在 el-form-item__content 与控件之间还有两层包裹 div
+// (form/index3.js 渲染:content > div > [div|elTooltip] > 控件),
+// 所以要用后代选择器,不能写 `>` 直接子级。
+.vehicle-dispatch-dialog .el-form-item__content .el-cascader {
+ width: 100%;
+ max-width: 100%;
+}
+
// 过程配置新增/编辑/查看弹窗(手写 el-dialog,参照 vehicle/credit-score-quantification):
// 灰底弹窗体(全站 .el-dialog__body 已统一)内堆叠 分组白卡,
// 卡间 12px 间距由 section-card 自身 margin-bottom 保证,与项目其他弹窗风格统一
diff --git a/src/views/business/project-apply.vue b/src/views/business/project-apply.vue
index 45fd72b..13f28b1 100644
--- a/src/views/business/project-apply.vue
+++ b/src/views/business/project-apply.vue
@@ -2842,7 +2842,7 @@ export default {
}
:deep(.el-form-item) {
- margin-bottom: 24px;
+ //margin-bottom: 24px;
}
:deep(.el-form-item__label) {
diff --git a/src/views/vehicle/customer-archive.vue b/src/views/vehicle/customer-archive.vue
index adff90a..1fd1182 100644
--- a/src/views/vehicle/customer-archive.vue
+++ b/src/views/vehicle/customer-archive.vue
@@ -5707,6 +5707,6 @@ export default {
margin-bottom: 0;
}
.el-form-item {
- margin-bottom: 24px !important;
+ //margin-bottom: 24px !important;
}
diff --git a/vite.config.mjs b/vite.config.mjs
index 3c635fd..a7036fd 100644
--- a/vite.config.mjs
+++ b/vite.config.mjs
@@ -47,28 +47,28 @@ export default ({ mode, command }) => {
__VUE_I18N_LEGACY_API__: true,
__INTLIFY_PROD_DEVTOOLS__: false,
},
- server: {
- port: 2888,
- proxy: {
- '/api': {
- // 本地网关默认 80 端口(blade-gateway bootstrap.yml);开发时需先启动网关及 blade-auth/blade-system 等服务
- // 注意:本机 8080 一般是 Nacos,不是业务网关
- target: 'http://localhost',
- // target: 'http://172.16.203.228:8000', // 仅联调远程网关时启用(且不要 rewrite)
- changeOrigin: true,
- rewrite: path => path.replace(/^\/api/, ''),
- },
- },
- },
// server: {
- // port: 2889,
+ // port: 2888,
// proxy: {
// '/api': {
- // target: 'http://172.16.203.228:8000',
+ // // 本地网关默认 80 端口(blade-gateway bootstrap.yml);开发时需先启动网关及 blade-auth/blade-system 等服务
+ // // 注意:本机 8080 一般是 Nacos,不是业务网关
+ // target: 'http://localhost',
+ // // target: 'http://172.16.203.228:8000', // 仅联调远程网关时启用(且不要 rewrite)
// changeOrigin: true,
+ // rewrite: path => path.replace(/^\/api/, ''),
// },
// },
// },
+ server: {
+ port: 2889,
+ proxy: {
+ '/api': {
+ target: 'http://172.16.203.228:8000',
+ changeOrigin: true,
+ },
+ },
+ },
resolve: {
alias: {
'~': resolve(__dirname, './'),