diff --git a/.workbuddy/memory/2026-09-03.md b/.workbuddy/memory/2026-09-03.md
new file mode 100644
index 0000000..4edfd3b
--- /dev/null
+++ b/.workbuddy/memory/2026-09-03.md
@@ -0,0 +1,24 @@
+
+## 合同管理独立表单页下拉框定位修复
+- `src/views/business/contract-manage.vue` 全部 12 处 `el-select` 加 `:teleported="false"` + `:fit-input-width="true"`:下拉保持在输入框正下方、宽度与输入框一致(原 teleport 到 body 导致下拉漂移且按内容撑宽)。
+- 若后续新增独立表单页出现同样问题,照加这两个属性即可。
+- 追加:teleported=false 后 popper 因下方空间不足自动上翻,再给 12 处 el-select 加 `placement="bottom-start"` + `:popper-options="{ modifiers: [{ name: 'flip', enabled: false }] }"` 强制始终在下方展示。
+
+## 调度弹窗司机输入框宽度不一致修复
+- 现象:「编辑调度信息(精简录入)」弹窗中,司机(el-autocomplete)输入框比同行 250px 的其他输入框宽。
+- 根因:`business-crud-page.vue` 约 13434 行的「表单控件统一 250px」规则漏了 `.el-autocomplete`(autocomplete 根节点是包装层,内部才是 .el-input)。
+- 修复:在该规则选择器列表追加 `> .el-autocomplete` 和 `> .el-autocomplete > .el-input`,与运单独立表单页(13658 行 business-crud-page--form-page 先例)一致。
+- 经验:凡「控件统一 250px」类规则,选择器必须包含 `.el-autocomplete` 包装层。
+
+## 调度弹窗收发货地址行溢出修复
+- 现象:「编辑调度信息」弹窗收发货信息行,地址输入框过宽,右侧「联系方式」列被挤出弹窗。
+- 根因:`__dispatch-shipping-form __route-address-row` 网格地址列为 `minmax(280px, 1fr)`,各列最小宽度合计 1030px,弹窗不够宽时 grid 不换行直接溢出。
+- 修复:地址列改 `minmax(0, 1fr)`(宽屏仍 1fr 拉伸,窄窗自动收窄,总最小宽降到 750px)。
+- 备注:基础规则 `__route-address-row`(13750 行,运单独立表单页等在用,7 列含 40px 按钮列)仍是 minmax(280px,1fr),同样窄窗有溢出风险,暂未动(用户未反馈该页问题)。
+
+## el-select 选中值 / 占位符颜色区分(全局)
+- 需求:已选值 #606266,未选值保持 placeholder 灰 #909399。
+- 根因:Element Plus 的选中值文本与占位符**共用同一节点** `
`,仅靠 `.el-select__selected-item` 无法区分,导致未选态也被染成选中色。
+- 区分标志:只有「未选值」或「已展开但无搜索输入」时才带 `.is-transparent`。
+- 修复(`src/styles/element-ui.scss`):选中规则改为 `.el-select__wrapper:not(.is-disabled) .el-select__selected-item:not(.is-transparent)`;多选 tag 文字另加 `.el-select__tags-text` 规则(tag 自身 color 优先级更高,父级规则盖不到)。
+- 经验:以后写任何「区分 el-select 有值/无值」的 CSS,一律用 `:not(.is-transparent)`。
diff --git a/src/page/login/userlogin.vue b/src/page/login/userlogin.vue
index d71e11c..d981745 100644
--- a/src/page/login/userlogin.vue
+++ b/src/page/login/userlogin.vue
@@ -55,13 +55,13 @@
{{ $t('login.submit') }}
-
{{ $t('login.register') }}
-
+
+
+
+
+
+
+
diff --git a/src/styles/element-ui.scss b/src/styles/element-ui.scss
index cba5269..e5439c6 100644
--- a/src/styles/element-ui.scss
+++ b/src/styles/element-ui.scss
@@ -1117,11 +1117,18 @@
color: #909399 !important;
}
-// 已选中:选中文本用主文字色 #333333,与占位符明显区分。
-// 注意:Element Plus 选中值节点同时带 el-select__selected-item 与 el-select__placeholder 两个类,
-// 而上面占位符规则用了 !important,故此处必须同样 !important 才能胜出(本规则 specificity 更高)。
+// 已选中:选中文本用主文字色 #606266,与占位符明显区分。
+// 关键:Element Plus 的「选中值文本」与「占位符」共用同一个节点,
+//
+// 只有未选值(或已展开但无搜索输入)时才会带 .is-transparent。
+// 因此这里必须排除 .is-transparent,否则未选值的占位符也会被染成选中色,与占位符灰无法区分。
// 仅作用于非禁用态,禁用态保留 Element Plus 的禁用灰(--el-select-disabled-color),避免被覆盖。
-.el-select__wrapper:not(.is-disabled) .el-select__selected-item {
+.el-select__wrapper:not(.is-disabled) .el-select__selected-item:not(.is-transparent) {
+ color: #606266 !important;
+}
+
+// 多选:选中项渲染为 el-tag,文字色由 tag 自身控制,上面规则覆盖不到,单独处理。
+.el-select__wrapper:not(.is-disabled) .el-select__tags-text {
color: #606266 !important;
}
diff --git a/src/views/base/region.vue b/src/views/base/region.vue
index 121730f..0809380 100644
--- a/src/views/base/region.vue
+++ b/src/views/base/region.vue
@@ -770,6 +770,6 @@ export default {
margin-bottom: 12px !important;
}
.el-form-item{
- margin-bottom: 8px !important;
+ margin-bottom: 9px !important;
}
diff --git a/src/views/business/components/business-crud-page.vue b/src/views/business/components/business-crud-page.vue
index 219cb9f..6144030 100644
--- a/src/views/business/components/business-crud-page.vue
+++ b/src/views/business/components/business-crud-page.vue
@@ -13573,7 +13573,9 @@ export default {
:deep(.el-form-item__content > .el-select),
:deep(.el-form-item__content > .el-cascader),
:deep(.el-form-item__content > .el-input-number),
- :deep(.el-form-item__content > .el-date-editor) {
+ :deep(.el-form-item__content > .el-date-editor),
+ :deep(.el-form-item__content > .el-autocomplete),
+ :deep(.el-form-item__content > .el-autocomplete > .el-input) {
width: 250px;
max-width: 100%;
}
@@ -13644,7 +13646,7 @@ export default {
&__shipping-title,
&__goods-title,
&__task-title {
- min-width: 100%;
+ //min-width: 100%;
}
&__shipping-route-action {
@@ -13891,7 +13893,7 @@ export default {
);
gap: 8px;
align-items: center;
- width: 100%;
+ width:98%;
:deep(.el-input),
:deep(.el-select),
@@ -13945,7 +13947,9 @@ export default {
}
&__dispatch-shipping-form &__route-address-row {
- grid-template-columns: 260px minmax(280px, 1fr) 58px minmax(160px, 220px) 72px minmax(
+ // 地址列用 minmax(0, 1fr):窗口较窄时地址输入框自动收窄,
+ // 避免各列最小宽度合计超出弹窗宽度,把右侧联系方式挤出弹窗。
+ grid-template-columns: 260px minmax(0, 1fr) 58px minmax(160px, 220px) 72px minmax(
160px,
220px
);
diff --git a/src/views/vehicle/customer-archive.vue b/src/views/vehicle/customer-archive.vue
index b580c2d..3299260 100644
--- a/src/views/vehicle/customer-archive.vue
+++ b/src/views/vehicle/customer-archive.vue
@@ -497,38 +497,37 @@
>新增联系人
-
-
-
-
-
-
-
- {{ formatContactAddress(row) || '-' }}
-
-
-
-
-
- {{ row.branchName || archiveForm.deptName || '-' }}
-
-
-
-
-
- 修改
-
- 删除
-
-
-
-
handleDetailSizeChange('contact', size)"
- @current-change="page => handleDetailCurrentChange('contact', page)"
- />
-
+
+
+
+
+
+
+
+ {{ formatContactAddress(row) || '-' }}
+
+
+
+
+
+ {{ row.branchName || archiveForm.deptName || '-' }}
+
+
+
+
+
+ 修改
+
+ 删除
+
+
+
+ handleDetailSizeChange('contact', size)"
+ @current-change="page => handleDetailCurrentChange('contact', page)"
+ />