Merge remote-tracking branch 'websoft/master'

# Conflicts:
#	src/views/business/contract-manage.vue
#	src/views/business/project-apply.vue
This commit is contained in:
2026-08-27 18:21:24 +08:00
5 changed files with 200 additions and 43 deletions
+28
View File
@@ -28,3 +28,31 @@
- 已去 gap 的 footer 容器:`vehicle/customer-archive.vue`(`.archive-form__footer`)、`business/components/master-order-editor.vue`(`footer`)、`business/components/master-order-dispatch.vue`(`.segment-actions`/`.pending-actions`)、`business/project-apply.vue`(`.project-apply-dialog__footer`)、`business/components/business-crud-page.vue`(`.business-crud-form-page-dialog .avue-form__menu`)、payment 6 个表单页(`*__actions`)、`settlement/components/pre-settlement-editor.vue`(`&__page-actions`)、`settlement/components/formal-settlement-editor.vue`(`.formal-editor__page-actions`)、`settlement/receivable-payable-detail.vue`(`.settlement-detail-page__actions`)。 - 已去 gap 的 footer 容器:`vehicle/customer-archive.vue`(`.archive-form__footer`)、`business/components/master-order-editor.vue`(`footer`)、`business/components/master-order-dispatch.vue`(`.segment-actions`/`.pending-actions`)、`business/project-apply.vue`(`.project-apply-dialog__footer`)、`business/components/business-crud-page.vue`(`.business-crud-form-page-dialog .avue-form__menu`)、payment 6 个表单页(`*__actions`)、`settlement/components/pre-settlement-editor.vue`(`&__page-actions`)、`settlement/components/formal-settlement-editor.vue`(`.formal-editor__page-actions`)、`settlement/receivable-payable-detail.vue`(`.settlement-detail-page__actions`)。
- 风控:确认 Avue 的 `.avue-form__menu`/`.avue-dialog__footer` 自身不带按钮间距,去掉 gap 后由 EP 默认 12px margin 接管(不会贴死)。 - 风控:确认 Avue 的 `.avue-form__menu`/`.avue-dialog__footer` 自身不带按钮间距,去掉 gap 后由 EP 默认 12px margin 接管(不会贴死)。
- 范围说明:本次聚焦近几轮在统一的模块(vehicle/payment/business/settlement)。若要把 loading-manage、contract-manage、transit 等其它模块的底部栏也纳入,需再处理。 - 范围说明:本次聚焦近几轮在统一的模块(vehicle/payment/business/settlement)。若要把 loading-manage、contract-manage、transit 等其它模块的底部栏也纳入,需再处理。
## 客商档案搜索区「所属组织」从扁平下拉改为树形下拉
- 起因:用户截图 `/vehicle/customer-archive` 搜索区,指出「所属组织」是扁平下拉,要求统一按新增/编辑表单(多选 `el-tree-select`)实现。
- 原 column 配置:`prop: 'deptName'` + `search: true` + `searchType: 'select'` + `dicData: [{label:'全部',value:''}, ...flattenDept]`initDeptTree() 异步把 dicData 写回 column(数据已加载,只是渲染风格不一致)。
- 改动:
- column 移除 `searchType: 'select'``searchValue: ''``dicData`,仅保留 `search: true, searchOrder: 1`
- `initDeptTree()` 中改写 `deptColumn.renderSearch = scope => this.renderDeptSearch(scope)`
- 新增 `methods.renderDeptSearch(scope)`:通过 `vue``h` 函数返回一个 `el-tree-select` vnode(多选 + check-strictly + 树形 + 折叠 tag + 全宽),onUpdate 时把 ID 数组按 `deptOptions` 查 rawLabel,逗号拼接写入 `scope.row.deptName`(即 searchForm.deptName),保持后端接口字段不变。
- `searchChange/searchReset` 链路无需改:`onLoad` 已通过 `query` 透传 deptName 到后端。
- `src/styles/element-ui.scss` 新增 `.avue-crud__search .el-form-item__content > .el-tree-select { width:100%; max-width:100%; }`:搜索区树形下拉全宽兜底,不影响新增/编辑表单(用 `el-col :span=6` 栅格自然分开)。
- 方案说明:Avue-crud 搜索 form-temp 内部 render 函数支持 column.renderSearch 自定义渲染(`header-search2.mjs` 行 93 `render: ele.renderSearch`),不需要重写整个搜索区;自定义 slot `<template #search-deptName>` 在 el-input 等自闭合组件上无法落地(slot 名不会被 el-input 识别),所以走 renderSearch。
- 选择项:用户确认「仅替换所属组织一格」「多选」「传 deptName」三项。
- 排查「出不来了」反馈:主人实测搜索区只有 label,控件区域空白。原因 `h('el-tree-select', {...})` 传字符串时 Vue 3 `_createVNode` 直接把 type 当 ELEMENTshapeFlag=1)处理,**不会调用 resolveComponent**,结果浏览器渲染出未知标签 `<el-tree-select>`,内容为空。
- 修复:从 `element-plus` import `ElTreeSelect` 组件对象,`h(ElTreeSelect, {...})` 走组件 vnode 路径;同时把 `modelValue` 默认值改为 `[]`(多选模式数组要求,避免 el-tree-select 警告)。
- 教训:Avue `column.render`/`renderSearch` 等接受 vnode 的字段,传字符串组件名时 Vue 不会 resolve,必须直接 import 组件对象或在 setup 内 `resolveComponent()`
- 排查「选中不了」反馈:控件显示出来了,但点击树节点无法选中/再选。根因 `onUpdate:modelValue` 里把 `scope.row.deptName` 写成了名字**字符串**,而该字段正是 el-tree-select 的 `modelValue`(多选模式必须是**ID 数组**),第一次选中后 modelValue 变字符串,el-tree-select 内部状态错乱,后续点击无法更新。
- 修复:renderDeptSearch 的 `onUpdate:modelValue` 只把 `scope.row.deptName` 写成 ID 数组(保留数组形态);在 `searchChange(params, done)` 里把 Avue 拷贝出来的 `params.deptName` 数组(注意:`filterParams``deepClone`params 与 scope.row 是不同引用,改它不破坏搜索框显示)按 `deptOptions` 查 rawLabel 再 `join(',')` 转成名字字符串写入 `query`,后端字段 deptName 不变。重置由 Avue `resetForm` 清空 scope.row.deptName 为 `''`renderDeptSearch 读到非数组回退 `[]` 显示空,无需额外处理。
## 船舶表单「安放龙骨日期/建造完工日期」label 收窄并换行
- 起因:用户截图 `transportCapacity/ship` 新增船舶弹窗,指出该字段 label 宽达 185px,要求最大 88px 并允许换行。
- 改动:`src/views/transportCapacity/ship.vue` 第 169 行,给该 `el-form-item` 增加 `label-width="88px"` 覆盖全局 `label-width="100"`;全局 `.ship-form :deep(.el-form-item__label)` 已设置 `white-space: normal; line-height: 20px`,换行已支持。
## 船舶证书信息两块表单改 4 列
- 起因:用户截图 `transportCapacity/ship` 船舶证书信息,指出「船舶所有权证书」「内河船舶安全与环保证书」两块想改成 4 列。
- 改动:`src/views/transportCapacity/ship.vue`
- 「船舶所有权证书」5 个字段:第一行 `登记号码/初次登记号码/船舶所有人/取得所有权日期` 4 列,第二行 `船舶识别号` 1 列(所有 `el-col :span="8"``:span="6"`)。
- 「内河船舶安全与环保证书」4 个字段:合并为一行 4 列(`总吨/净吨/船检登记号/船舶类型`),`el-col :span="8"``:span="6"`
- 未改动:船舶国籍证书、最低安全配员证书(日期范围,保持 `span=16` 整行)、光船租赁登记证明书、船舶营业运输证书(用户未要求)。
+108 -3
View File
@@ -127,7 +127,7 @@
.avue-crud__search .el-form-item--small.el-form-item, .avue-crud__search .el-form-item--small.el-form-item,
.avue-crud__search .el-form-item--large.el-form-item, .avue-crud__search .el-form-item--large.el-form-item,
.avue-crud__search .el-form-item--medium.el-form-item { .avue-crud__search .el-form-item--medium.el-form-item {
margin-bottom: 1px; margin-bottom: 8px;
} }
.avue-crud__search .el-form-item__label { .avue-crud__search .el-form-item__label {
@@ -135,6 +135,13 @@
//white-space: nowrap; //white-space: nowrap;
} }
// 全宽兜底:搜索表单内树形下拉占满(覆盖默认搜索项宽度)
// 注意:搜索 form 内的 el-tree-select 也走该规则;新增/编辑表单用 span=6 的栅格自然分开,不受影响。
.avue-crud__search .el-form-item__content > .el-tree-select {
width: 100%;
max-width: 100%;
}
.avue-crud__search.el-card { .avue-crud__search.el-card {
border: none; border: none;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
@@ -1072,8 +1079,8 @@
font-size: var(--el-form-label-font-size); font-size: var(--el-form-label-font-size);
} }
// ============ 加深输入框 / 下拉框占位符颜色 ============ // ============ 输入框 / 下拉框占位符与选中值颜色 ============
// 客户反馈默认 placeholder 灰色(#a8abb2)太浅,统一加深一档到 #909399Element Plus 次级文字标准灰)。 // 客户反馈默认 placeholder 灰色(#a8abb2)太浅,统一加深到 #909399Element Plus 次级文字标准灰)。
// 同时覆盖原生 input/textarea 与 el-select 的占位文本,保证全站一致。 // 同时覆盖原生 input/textarea 与 el-select 的占位文本,保证全站一致。
// 注:.el-select__placeholder.is-transparent 是聚焦未选值时的透明态,无需处理。 // 注:.el-select__placeholder.is-transparent 是聚焦未选值时的透明态,无需处理。
.el-input__inner, .el-input__inner,
@@ -1092,6 +1099,104 @@
} }
} }
// 未选中:占位符用次级灰 #909399
.el-select__placeholder { .el-select__placeholder {
color: #909399 !important; color: #909399 !important;
} }
// 已选中:选中文本用主文字色 #333333,与占位符明显区分。
// 注意:Element Plus 选中值节点同时带 el-select__selected-item 与 el-select__placeholder 两个类,
// 而上面占位符规则用了 !important,故此处必须同样 !important 才能胜出(本规则 specificity 更高)。
// 仅作用于非禁用态,禁用态保留 Element Plus 的禁用灰(--el-select-disabled-color),避免被覆盖。
.el-select__wrapper:not(.is-disabled) .el-select__selected-item {
color: #606266 !important;
}
// ============ 全局 el-tree-select 样式:隐藏圆圈/复选框,统一为树形 ▶ 箭头展开风格 ============
// 目标:将所有带 ○/●/☑ 圆圈的 tree-select 下拉改为纯树形展开(▶ 箭头 + 选中蓝字),与截图2一致。
.el-tree-select {
// 隐藏下拉面板内的 checkbox / radio 圆圈
.el-tree-node__content > .el-checkbox {
display: none;
}
// 展开箭头始终可见(即使叶子节点也保留占位,保证对齐)
.el-tree-node__expand-icon {
font-size: 12px;
color: #c0c4cc;
&.is-leaf {
// 叶子节点:透明占位符,保持缩进对齐
color: transparent;
&::before {
display: none;
}
}
&:not(.is-leaf) {
// 可展开节点:hover 加深
&:hover {
color: #909399;
}
}
}
// 选中节点:蓝色文字高亮(替代原来的 ● 实心圆)
.el-tree-node.is-current > .el-tree-node__content {
color: var(--el-color-primary, #409eff);
font-weight: 600;
}
// hover 态
.el-tree-node__content:hover {
background-color: var(--el-fill-color-light, #f5f7fa);
}
// 节点标签文字
.el-tree-node__label {
font-size: 14px;
color: #333333;
}
// 选中节点的标签颜色继承 is-current 的蓝色
.el-tree-node.is-current > .el-tree-node__content > .el-tree-node__label {
color: inherit;
}
}
// ============ 全局 el-cascadercheckStrictly)样式:隐藏 ○/● 单选圆圈 ============
// 当 el-cascader 配置 checkStrictly:true 时,面板内每项前显示 el-radio 圆圈。
// 全局隐藏这些圆圈,改为纯文字选中高亮风格,与 tree-select 统一。
.el-cascader-panel {
// 隐藏级联面板内的 radio 单选圆圈
.el-cascader-node__prefix {
.el-radio {
display: none;
}
}
// 选中项:蓝色文字 + 加粗(替代原来的 ● 实心圆)
.el-cascader-node.is-active {
.el-cascader-node__label {
color: var(--el-color-primary, #409eff);
font-weight: 600;
}
}
// hover 态
.el-cascader-node:hover {
background-color: var(--el-fill-color-light, #f5f7fa);
}
// 节点标签默认颜色
.el-cascader-node__label {
font-size: 14px;
color: #333333;
}
// 禁用态
.el-cascader-node.is-disabled {
color: var(--el-text-color-placeholder, #c0c4cc);
cursor: not-allowed;
}
}
+1
View File
@@ -279,6 +279,7 @@ export default {
:deep(.track-tracking-page__search .el-form-item__label) { :deep(.track-tracking-page__search .el-form-item__label) {
min-width: 96px; min-width: 96px;
max-width: 96px;
font-size: 16px; font-size: 16px;
font-weight: 600; font-weight: 600;
} }
+28 -28
View File
@@ -143,7 +143,7 @@
> >
<section-card title="基础船舶信息"> <section-card title="基础船舶信息">
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<el-form-item label="船舶所属组织" prop="organizationName"> <el-form-item label="船舶所属组织" prop="organizationName">
<el-select <el-select
v-model="shipForm.organizationName" v-model="shipForm.organizationName"
@@ -160,13 +160,17 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="船名" prop="shipName"> <el-form-item label="船名" prop="shipName">
<el-input v-model="shipForm.shipName" maxlength="20" show-word-limit /> <el-input v-model="shipForm.shipName" maxlength="20" show-word-limit />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="12">
<el-form-item label="安放龙骨日期/建造完工日期" prop="keelLayingDate"> <el-form-item
label="安放龙骨日期/建造完工日期"
prop="keelLayingDate"
label-width="88px"
>
<div class="date-range-inline"> <div class="date-range-inline">
<el-date-picker <el-date-picker
v-model="shipForm.keelLayingDate" v-model="shipForm.keelLayingDate"
@@ -186,7 +190,7 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<el-form-item label="总长(m" prop="totalLength"> <el-form-item label="总长(m" prop="totalLength">
<el-input <el-input
v-model="shipForm.totalLength" v-model="shipForm.totalLength"
@@ -194,7 +198,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="船宽(m" prop="shipWidth"> <el-form-item label="船宽(m" prop="shipWidth">
<el-input <el-input
v-model="shipForm.shipWidth" v-model="shipForm.shipWidth"
@@ -202,7 +206,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="型深(m" prop="moldedDepth"> <el-form-item label="型深(m" prop="moldedDepth">
<el-input <el-input
v-model="shipForm.moldedDepth" v-model="shipForm.moldedDepth"
@@ -210,9 +214,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> <el-col :span="6">
<el-row :gutter="18">
<el-col :span="8">
<el-form-item label="最大船高(m" prop="maxShipHeight"> <el-form-item label="最大船高(m" prop="maxShipHeight">
<el-input <el-input
v-model="shipForm.maxShipHeight" v-model="shipForm.maxShipHeight"
@@ -220,7 +222,9 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> </el-row>
<el-row :gutter="18">
<el-col :span="6">
<el-form-item label="空载吃水(t" prop="lightDraft"> <el-form-item label="空载吃水(t" prop="lightDraft">
<el-input <el-input
v-model="shipForm.lightDraft" v-model="shipForm.lightDraft"
@@ -228,7 +232,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="满载吃水(t" prop="fullLoadDraft"> <el-form-item label="满载吃水(t" prop="fullLoadDraft">
<el-input <el-input
v-model="shipForm.fullLoadDraft" v-model="shipForm.fullLoadDraft"
@@ -236,9 +240,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> <el-col :span="12">
<el-row :gutter="18">
<el-col :span="8">
<el-form-item label="航区" prop="navigationArea"> <el-form-item label="航区" prop="navigationArea">
<div class="navigation-area-field"> <div class="navigation-area-field">
<el-select v-model="shipForm.navigationArea" placeholder="请选择"> <el-select v-model="shipForm.navigationArea" placeholder="请选择">
@@ -279,24 +281,22 @@
<div class="cert-block"> <div class="cert-block">
<div class="cert-block__title">船舶所有权证书</div> <div class="cert-block__title">船舶所有权证书</div>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<el-form-item label="登记号码" prop="ownershipRegistrationNo"> <el-form-item label="登记号码" prop="ownershipRegistrationNo">
<el-input v-model="shipForm.ownershipRegistrationNo" maxlength="50" /> <el-input v-model="shipForm.ownershipRegistrationNo" maxlength="50" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="初次登记号码" prop="initialRegistrationNo"> <el-form-item label="初次登记号码" prop="initialRegistrationNo">
<el-input v-model="shipForm.initialRegistrationNo" maxlength="50" /> <el-input v-model="shipForm.initialRegistrationNo" maxlength="50" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="船舶所有人" prop="shipOwner"> <el-form-item label="船舶所有人" prop="shipOwner">
<el-input v-model="shipForm.shipOwner" maxlength="50" /> <el-input v-model="shipForm.shipOwner" maxlength="50" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> <el-col :span="6">
<el-row :gutter="18">
<el-col :span="8">
<el-form-item label="取得所有权日期" prop="ownershipAcquisitionDate"> <el-form-item label="取得所有权日期" prop="ownershipAcquisitionDate">
<el-date-picker <el-date-picker
v-model="shipForm.ownershipAcquisitionDate" v-model="shipForm.ownershipAcquisitionDate"
@@ -305,7 +305,9 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> </el-row>
<el-row :gutter="18">
<el-col :span="6">
<el-form-item label="船舶识别号" prop="shipIdentifierNo"> <el-form-item label="船舶识别号" prop="shipIdentifierNo">
<el-input <el-input
v-model="shipForm.shipIdentifierNo" v-model="shipForm.shipIdentifierNo"
@@ -324,7 +326,7 @@
<div class="cert-block"> <div class="cert-block">
<div class="cert-block__title">内河船舶安全与环保证书</div> <div class="cert-block__title">内河船舶安全与环保证书</div>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<el-form-item label="总吨" prop="grossTonnage"> <el-form-item label="总吨" prop="grossTonnage">
<el-input-number <el-input-number
v-model="shipForm.grossTonnage" v-model="shipForm.grossTonnage"
@@ -334,7 +336,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="净吨" prop="netTonnage"> <el-form-item label="净吨" prop="netTonnage">
<el-input-number <el-input-number
v-model="shipForm.netTonnage" v-model="shipForm.netTonnage"
@@ -344,14 +346,12 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="船检登记号" prop="shipInspectionNo"> <el-form-item label="船检登记号" prop="shipInspectionNo">
<el-input v-model="shipForm.shipInspectionNo" maxlength="50" /> <el-input v-model="shipForm.shipInspectionNo" maxlength="50" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> <el-col :span="6">
<el-row :gutter="18">
<el-col :span="8">
<el-form-item label="船舶类型" prop="shipType"> <el-form-item label="船舶类型" prop="shipType">
<el-select v-model="shipForm.shipType" placeholder="请选择船舶类型" clearable> <el-select v-model="shipForm.shipType" placeholder="请选择船舶类型" clearable>
<el-option label="散货船" value="散货船" /> <el-option label="散货船" value="散货船" />
+35 -12
View File
@@ -488,7 +488,6 @@
>新增联系人</el-button >新增联系人</el-button
> >
</div> </div>
<section-card>
<el-table :data="contactTableData" border class="contact-table"> <el-table :data="contactTableData" border class="contact-table">
<el-table-column label="序号" prop="__index" width="90" align="center" /> <el-table-column label="序号" prop="__index" width="90" align="center" />
<el-table-column label="联系人姓名" prop="contactName" min-width="150" /> <el-table-column label="联系人姓名" prop="contactName" min-width="150" />
@@ -520,7 +519,6 @@
@size-change="size => handleDetailSizeChange('contact', size)" @size-change="size => handleDetailSizeChange('contact', size)"
@current-change="page => handleDetailCurrentChange('contact', page)" @current-change="page => handleDetailCurrentChange('contact', page)"
/> />
</section-card>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="收款信息" name="receiptAccounts"> <el-tab-pane label="收款信息" name="receiptAccounts">
@@ -1372,6 +1370,8 @@
</template> </template>
<script> <script>
import { h } from 'vue';
import { ElTreeSelect } from 'element-plus';
import { import {
getList, getList,
getDetail, getDetail,
@@ -1773,11 +1773,8 @@ export default {
label: '所属组织', label: '所属组织',
prop: 'deptName', prop: 'deptName',
search: true, search: true,
searchType: 'select',
searchOrder: 1, searchOrder: 1,
searchValue: '',
minWidth: 180, minWidth: 180,
dicData: [{ label: '全部', value: '' }],
}, },
{ {
label: '准入类型', label: '准入类型',
@@ -2441,13 +2438,7 @@ export default {
this.deptOptions = this.flattenDept(this.deptTree); this.deptOptions = this.flattenDept(this.deptTree);
this.setDefaultTopLevelDept(); this.setDefaultTopLevelDept();
const deptColumn = this.findColumn(this.option.column, 'deptName'); const deptColumn = this.findColumn(this.option.column, 'deptName');
deptColumn.dicData = [ deptColumn.renderSearch = scope => this.renderDeptSearch(scope);
{ label: '全部', value: '' },
...this.deptOptions.map(item => ({
label: item.label,
value: item.rawLabel,
})),
];
}) })
.finally(() => { .finally(() => {
this.deptSearchInitialized = true; this.deptSearchInitialized = true;
@@ -2669,6 +2660,31 @@ export default {
this.archiveForm.deptName = deptNames.join(','); this.archiveForm.deptName = deptNames.join(',');
this.$refs.archiveForm?.validateField('deptName'); this.$refs.archiveForm?.validateField('deptName');
}, },
renderDeptSearch(scope) {
// 搜索区所属组织:多选树形下拉(与新增/编辑表单一致)
// 多选返回 ID 数组,转换为部门名称按逗号拼接写入 searchForm.deptName
return h(ElTreeSelect, {
modelValue: Array.isArray(scope.row?.deptName) ? scope.row.deptName : [],
'onUpdate:modelValue': value => {
// 多选模式:modelValue 必须是 ID 数组,否则 el-tree-select 内部状态会错乱导致无法再次选中
const ids = Array.isArray(value) ? value : value ? [value] : [];
if (scope.row) scope.row.deptName = ids;
},
data: this.deptTree,
'node-key': 'value',
'check-strictly': true,
multiple: true,
filterable: true,
clearable: true,
'render-after-expand': false,
collapseTags: true,
'collapse-tags-tooltip': true,
'default-expand-all': false,
style: 'width: 100%',
placeholder: '请选择 所属组织',
props: { label: 'label', value: 'value', children: 'children' },
});
},
handleNoFixedTermChange(checked) { handleNoFixedTermChange(checked) {
this.archiveForm.businessTermType = checked ? '长期' : '固定期限'; this.archiveForm.businessTermType = checked ? '长期' : '固定期限';
if (checked) { if (checked) {
@@ -4529,6 +4545,13 @@ export default {
this.onLoad(this.page); this.onLoad(this.page);
}, },
searchChange(params, done) { searchChange(params, done) {
// 搜索区所属组织多选返回的是部门 ID 数组,需转成部门名称逗号串传给后端(与列表接口 deptName 字段一致)
if (Array.isArray(params.deptName)) {
params.deptName = params.deptName
.map(id => this.deptOptions.find(item => String(item.value) === String(id))?.rawLabel)
.filter(Boolean)
.join(',');
}
this.query = this.buildQuery(params); this.query = this.buildQuery(params);
this.page.currentPage = 1; this.page.currentPage = 1;
this.onLoad(this.page); this.onLoad(this.page);