Merge remote-tracking branch 'websoft/master'

# Conflicts:
#	src/views/business/components/waybill-import-dialog.vue
This commit is contained in:
2026-08-14 02:50:07 +08:00
43 changed files with 140 additions and 75 deletions
+8
View File
@@ -93,3 +93,11 @@
1. `.dialog-section-title > span { line-height: 1 }` 收紧标题文字行高。
2. `&__section-actions .el-link { display:inline-flex; align-items:center; line-height:1 }` 让链接严格垂直居中。
- 校验:两处使用 `.dialog-section-title--action.business-crud-page__goods-title` + `__section-actions` 的货物信息标题都会生效。
## transportCapacity/driver.vue 到期筛选标签靠右对齐
- 需求:将搜索栏下方「全部/30天内到期/已到期」筛选标签靠右对齐,放到搜索按钮前面并保留间距。
- 改动(src/views/transportCapacity/driver.vue):
- `.driver-page__expiry-tags``margin-right: auto` 改为 `margin-right: 12px`
- 保留 `order: -1` 使标签在 Flex 排列中位于搜索按钮之前;全局 `.avue-crud__search .avue-form__menu` 已设 `justify-content: flex-end`,删除 `auto` 后标签与按钮作为一个整体靠右排列,不再分居两端。
- 间距:标签内部 `gap: 8px` 保留;标签与搜索按钮之间 12px。
+33
View File
@@ -0,0 +1,33 @@
# 2026-08-14 工作记录
## temporary-credit-limit 弹窗 label 固定 6 汉字宽度并换行
- 需求:用户反馈 `/business/temporary-credit-limit` 新增弹窗中 label「已使用项目资金使用额度(万元)」过宽(227px),希望超过 6 个汉字就换行。
- 宽度来源:
- `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 }` 阻止换行。
- 改动:
1. `src/option/business/temporary-credit-limit.js`option 增加 `dialogCustomClass: 'temporary-credit-limit-dialog'`
2. `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 自动换行。
3. 同时给 `.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` 列插槽,标签被渲染进**搜索条件网格**(位置不对)。
- 改动(两页同样处理):
1. `.vue``<template #expireStatus-search>``<template #search-menu>`,标签 div 内容不变。
2. `.vue` 样式 `__expiry-tags`:去掉 `width: 100%`,改为 `order: -1; margin-right: 12px; min-width: 0;`(与 driver 完全一致,使标签左移并落在搜索按钮前)。
3. 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 文件通过;页面刷新即可见效果。
+1 -1
View File
@@ -84,7 +84,7 @@ app.use(Avue, {
crudOption: {
searchIcon: true,
searchIndex: 4,
searchLabelWidth: 160,
searchLabelWidth: 88,
searchMenuSpan: 24,
searchMenuPosition: 'right',
menuWidth: 180,
+2 -2
View File
@@ -35,8 +35,8 @@ export const getCargoTypeOption = ctx => ({
updateBtnText: '提交',
searchShow: true,
searchIcon: true,
searchLabelWidth: 50,
searchMenuSpan: 10,
searchLabelWidth: 88,
searchMenuSpan: 12,
searchIndex: 4,
searchMenuPosition: 'right',
border: true,
+1
View File
@@ -495,6 +495,7 @@ export const option = createCrudOption([
prop: 'remark',
type: 'textarea',
span: 24,
minRows: 2,
hide: true,
order: 40,
maxlength: 2000,
+2 -2
View File
@@ -120,7 +120,7 @@ export const option = {
label: '备注',
prop: 'remark',
type: 'textarea',
minRows: 3,
minRows: 2,
span: 24,
order: 360,
minWidth: 180,
@@ -175,7 +175,7 @@ export const option = {
label: '备注',
prop: 'basicRemark',
type: 'textarea',
minRows: 3,
minRows: 2,
span: 24,
order: 315,
minWidth: 180,
@@ -87,6 +87,7 @@ export const config = {
};
export const option = {
dialogCustomClass: 'temporary-credit-limit-dialog',
...createCrudOption([
{
label: '申请单号',
@@ -258,6 +259,7 @@ export const option = {
prop: 'remark',
type: 'textarea',
span: 24,
minRows: 2,
hide: true,
maxlength: 200,
showWordLimit: true,
+3 -3
View File
@@ -416,7 +416,7 @@ export const option = {
label: '备注',
prop: 'remark',
type: 'textarea',
minRows: 4,
minRows: 2,
span: 24,
order: 330,
minWidth: 180,
@@ -572,7 +572,7 @@ export const option = {
prop: 'goodsJson',
type: 'textarea',
formslot: true,
minRows: 5,
minRows: 2,
span: 24,
order: 270,
hide: true,
@@ -593,7 +593,7 @@ export const option = {
prop: 'attachmentsJson',
type: 'textarea',
formslot: true,
minRows: 3,
minRows: 2,
span: 24,
order: 260,
hide: true,
+5 -5
View File
@@ -670,7 +670,7 @@ export const option = {
label: '备注',
prop: 'remark',
type: 'textarea',
minRows: 4,
minRows: 2,
span: 24,
order: 810,
minWidth: 180,
@@ -788,7 +788,7 @@ export const option = {
label: '货物信息',
prop: 'goodsJson',
type: 'textarea',
minRows: 5,
minRows: 2,
span: 24,
hide: true,
display: false,
@@ -800,7 +800,7 @@ export const option = {
label: '承运信息',
prop: 'carrierJson',
type: 'textarea',
minRows: 4,
minRows: 2,
span: 24,
hide: true,
display: false,
@@ -812,7 +812,7 @@ export const option = {
label: '过程配置',
prop: 'processJson',
type: 'textarea',
minRows: 4,
minRows: 2,
span: 24,
hide: true,
display: false,
@@ -824,7 +824,7 @@ export const option = {
label: '运费信息',
prop: 'freightJson',
type: 'textarea',
minRows: 4,
minRows: 2,
span: 24,
hide: true,
display: false,
+2 -2
View File
@@ -411,7 +411,7 @@ export const platformOption = {
label: '用户拓展',
prop: 'userExt',
type: 'textarea',
minRows: 8,
minRows: 2,
span: 24,
overHidden: true,
row: true,
@@ -500,7 +500,7 @@ export const platformFormOption = {
label: '用户拓展',
prop: 'userExt',
type: 'textarea',
minRows: 8,
minRows: 2,
span: 24,
},
],
+1 -1
View File
@@ -13,7 +13,7 @@ export default {
grid: true,
selection: true,
labelWidth: 'auto',
searchLabelWidth: 160,
searchLabelWidth: 88,
menuWidth: 180,
dialogClickModal: false,
column: [
+1 -1
View File
@@ -13,7 +13,7 @@ export default {
grid: true,
selection: true,
labelWidth: 'auto',
searchLabelWidth: 160,
searchLabelWidth: 88,
menuWidth: 180,
dialogWidth: 500,
dialogClickModal: false,
@@ -5,7 +5,7 @@ export const option = {
searchShow: true,
searchMenuSpan: 24,
searchIcon: true,
searchIndex: 4,
searchIndex: 6,
searchMenuPosition: 'right',
border: true,
index: true,
@@ -96,7 +96,7 @@ export const option = {
{
label: '',
prop: 'expireStatus',
search: true,
search: false,
searchOrder: 0,
searchSpan: 6,
hide: true,
@@ -5,7 +5,7 @@ export const option = {
searchShow: true,
searchMenuSpan: 24,
searchIcon: true,
searchIndex: 4,
searchIndex: 6,
searchMenuPosition: 'right',
border: true,
index: true,
@@ -149,7 +149,7 @@ export const option = {
{
label: '',
prop: 'expireStatus',
search: true,
search: false,
searchOrder: 0,
searchSpan: 6,
hide: true,
+1 -1
View File
@@ -36,7 +36,7 @@ export const option = {
dialogWidth: 960,
labelPosition: 'right',
labelWidth: 'auto',
searchLabelWidth: 160,
searchLabelWidth: 88,
tip: false,
searchBtnText: '查询',
emptyBtnText: '重置',
@@ -35,7 +35,7 @@ export const option = {
dialogWidth: 960,
labelPosition: 'right',
labelWidth: 'auto',
searchLabelWidth: 160,
searchLabelWidth: 88,
tip: false,
searchBtnText: '查询',
emptyBtnText: '重置',
+1 -1
View File
@@ -16,7 +16,7 @@ export const option = {
dialogWidth: 960,
labelPosition: 'right',
labelWidth: 'auto',
searchLabelWidth: 160,
searchLabelWidth: 88,
tip: false,
searchBtnText: '查询',
emptyBtnText: '重置',
+1 -1
View File
@@ -25,7 +25,7 @@ export const option = {
dialogWidth: 960,
labelPosition: 'right',
labelWidth: 'auto',
searchLabelWidth: 160,
searchLabelWidth: 88,
tip: false,
searchBtnText: '查询',
emptyBtnText: '重置',
+1 -1
View File
@@ -33,7 +33,7 @@ export const option = {
dialogWidth: 960,
labelPosition: 'right',
labelWidth: 'auto',
searchLabelWidth: 160,
searchLabelWidth: 88,
tip: false,
searchBtnText: '查询',
emptyBtnText: '重置',
@@ -26,7 +26,7 @@ export const option = {
dialogWidth: 960,
labelPosition: 'right',
labelWidth: 'auto',
searchLabelWidth: 160,
searchLabelWidth: 88,
tip: false,
searchBtnText: '查询',
emptyBtnText: '重置',
+1 -1
View File
@@ -36,7 +36,7 @@ export const option = {
dialogWidth: 960,
labelPosition: 'right',
labelWidth: 'auto',
searchLabelWidth: 160,
searchLabelWidth: 88,
tip: false,
searchBtnText: '查询',
emptyBtnText: '重置',
+21 -4
View File
@@ -131,8 +131,8 @@
}
.avue-crud__search .el-form-item__label {
min-width: 160px;
white-space: nowrap;
min-width: 88px;
//white-space: nowrap;
}
.avue-crud__search.el-card {
@@ -289,6 +289,22 @@
}
}
// 3d) 临时额度管理弹窗:label 固定 6 个汉字宽度,超长自动换行
.temporary-credit-limit-dialog {
.el-form-item__label {
flex: 0 0 calc(6em + 24px) !important;
width: calc(6em + 24px) !important;
white-space: normal !important;
word-break: break-all;
overflow-wrap: anywhere;
line-height: 18px;
}
.el-form-item {
align-items: center;
}
}
// 3) Avue 弹窗内分组(option.group)渲染为白卡,标题在卡内
.el-dialog .avue-form__group {
background: #fff;
@@ -314,7 +330,7 @@
background: #fff;
border-radius: 6px;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);
padding: 16px;
//padding: 16px;
margin-bottom: 16px;
.avue-form__group--title {
@@ -684,6 +700,7 @@
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
gap: 8px;
}
@@ -787,5 +804,5 @@
margin-top: -30px !important;
}
.el-form-item__label {
margin-left: 20px !important;
margin-left: 12px !important;
}
+1 -1
View File
@@ -163,7 +163,7 @@ export default {
viewBtn: true,
selection: true,
labelWidth: 'auto',
searchLabelWidth: 160,
searchLabelWidth: 88,
menuWidth: 180,
dialogWidth: 900,
dialogClickModal: false,
+3 -3
View File
@@ -164,7 +164,7 @@ export default {
viewBtn: true,
selection: true,
labelWidth: 'auto',
searchLabelWidth: 160,
searchLabelWidth: 88,
menuWidth: 180,
dialogWidth: 900,
dialogClickModal: false,
@@ -277,7 +277,7 @@ export default {
label: '规则值',
prop: 'scopeValue',
span: 24,
minRows: 5,
minRows: 2,
type: 'textarea',
display: false,
hide: true,
@@ -488,7 +488,7 @@ export default {
label: '规则值',
prop: 'scopeValue',
span: 24,
minRows: 5,
minRows: 2,
type: 'textarea',
display: true,
hide: true,
+3 -3
View File
@@ -206,7 +206,7 @@ export default {
searchIndex: 8,
searchMenuPosition: 'right',
labelWidth: 'auto',
searchLabelWidth: 160,
searchLabelWidth: 88,
border: true,
index: true,
viewBtn: true,
@@ -270,7 +270,7 @@ export default {
label: '请求阈值',
prop: 'limitCount',
type: 'number',
minRows: 1,
minRows: 2,
value: 100,
hide: true,
labelTip: '单个时间窗口内允许通过的最大请求数,超出后触发限流并返回 429',
@@ -280,7 +280,7 @@ export default {
label: '时间窗口',
prop: 'limitPeriod',
type: 'number',
minRows: 1,
minRows: 2,
value: 1,
hide: true,
labelTip: '限流统计周期的数值,与时间单位组合使用,如时间窗口 1 + 时间单位分钟表示每分钟一个周期',
+1 -1
View File
@@ -249,7 +249,7 @@ export default {
selection: true,
viewBtn: true,
labelWidth: 'auto',
searchLabelWidth: 160,
searchLabelWidth: 88,
menuWidth: 240,
dialogWidth: 600,
dialogClickModal: false,
+1 -1
View File
@@ -239,7 +239,7 @@ export default {
tip: false,
searchShow: true,
labelWidth: 'auto',
searchLabelWidth: 160,
searchLabelWidth: 88,
searchMenuSpan: 24,
searchIcon: true,
searchIndex: 4,
+1 -1
View File
@@ -397,7 +397,7 @@ export default {
labelWidth: '108px',
tip: false,
searchShow: true,
searchLabelWidth: 160,
searchLabelWidth: 88,
searchIcon: true,
searchIndex: 4,
searchMenuSpan: 24,
+1 -1
View File
@@ -291,7 +291,7 @@ export default {
label: '区划备注',
prop: 'remark',
type: 'textarea',
minRows: 6,
minRows: 2,
span: 24,
},
],
+1 -1
View File
@@ -1,5 +1,5 @@
<template>
<business-crud-page :api="api" :config="config" :crud-option="option" :menu-width="245" />
<business-crud-page :api="api" :config="config" :crud-option="option" :menu-width="252" />
</template>
<script>
+1 -1
View File
@@ -103,7 +103,7 @@ export default {
value: 1,
span: 24,
width: 120,
searchLabelWidth: 160,
searchLabelWidth: 88,
row: true,
dicUrl: '/blade-system/dict/dictionary?code=oss',
props: {
+1 -1
View File
@@ -102,7 +102,7 @@ export default {
value: 1,
span: 24,
width: 100,
searchLabelWidth: 160,
searchLabelWidth: 88,
row: true,
dicUrl: '/blade-system/dict/dictionary?code=sms',
props: {
+1 -1
View File
@@ -152,7 +152,7 @@ export default {
prop: 'remark',
type: 'textarea',
span: 24,
minRows: 6,
minRows: 2,
hide: true,
},
],
+2 -2
View File
@@ -87,7 +87,7 @@ export default {
value: 1,
span: 24,
width: 120,
searchLabelWidth: 160,
searchLabelWidth: 88,
row: true,
gridRow: true,
dicUrl: '/blade-system/dict/dictionary?code=datasource_category',
@@ -110,7 +110,7 @@ export default {
label: 'YAML',
prop: 'shardingConfig',
span: 24,
minRows: 5,
minRows: 2,
hide: true,
display: false,
gridRow: true,
+2 -2
View File
@@ -89,7 +89,7 @@ export default {
value: 1,
span: 24,
width: 120,
searchLabelWidth: 160,
searchLabelWidth: 88,
row: true,
gridRow: true,
display: false,
@@ -113,7 +113,7 @@ export default {
label: 'YAML',
prop: 'shardingConfig',
span: 24,
minRows: 5,
minRows: 2,
hide: true,
display: false,
gridRow: true,
+1 -1
View File
@@ -1350,7 +1350,7 @@ export default {
align-items: center;
gap: 8px;
order: -1;
margin-right: auto;
margin-right: 12px;
min-width: 0;
:deep(.el-check-tag) {
+4 -2
View File
@@ -44,7 +44,7 @@
批量删除
</el-button>
</template>
<template #expireStatus-search>
<template #search-menu>
<div class="transport-ship-page__expiry-tags">
<el-check-tag
v-for="item in expiryTagOptions"
@@ -1051,7 +1051,9 @@ export default {
flex-wrap: wrap;
align-items: center;
gap: 8px;
width: 100%;
order: -1;
margin-right: 12px;
min-width: 0;
:deep(.el-check-tag) {
margin: 0;
+4 -2
View File
@@ -41,7 +41,7 @@
>批量删除
</el-button>
</template>
<template #expireStatus-search>
<template #search-menu>
<div class="transport-vehicle-page__expiry-tags">
<el-check-tag
v-for="item in expiryTagOptions"
@@ -1195,7 +1195,9 @@ export default {
flex-wrap: wrap;
align-items: center;
gap: 8px;
width: 100%;
order: -1;
margin-right: 12px;
min-width: 0;
:deep(.el-check-tag) {
margin: 0;
+1 -1
View File
@@ -41,7 +41,7 @@ export default {
label: '个性签名',
prop: 'textarea',
type: 'textarea',
minRows: 8,
minRows: 2,
row: true,
},
],
+1 -1
View File
@@ -112,7 +112,7 @@ export default {
label: '个性签名',
prop: 'textarea',
type: 'textarea',
minRows: 8,
minRows: 2,
span: 24,
overHidden: true,
row: true,
+2 -2
View File
@@ -193,7 +193,7 @@ export default {
dialogWidth: 960,
labelPosition: 'right',
labelWidth: 'auto',
searchLabelWidth: 160,
searchLabelWidth: 88,
tip: false,
searchShow: true,
searchMenuSpan: 24,
@@ -346,7 +346,7 @@ export default {
label: '备注',
prop: 'remark',
type: 'textarea',
minRows: 5,
minRows: 2,
span: 24,
hide: true,
placeholder: '请输入',
+2 -2
View File
@@ -180,7 +180,7 @@ export default {
dialogWidth: 960,
labelPosition: 'right',
labelWidth: 'auto',
searchLabelWidth: 160,
searchLabelWidth: 88,
tip: false,
searchShow: true,
searchMenuSpan: 24,
@@ -333,7 +333,7 @@ export default {
label: '备注',
prop: 'remark',
type: 'textarea',
minRows: 5,
minRows: 2,
span: 24,
hide: true,
placeholder: '请输入',
+13 -13
View File
@@ -50,26 +50,26 @@ export default ({
__VUE_I18N_LEGACY_API__: true,
__INTLIFY_PROD_DEVTOOLS__: false,
},
server: {
port: 2888,
proxy: {
'/api': {
target: 'http://localhost',
//target: 'https://saber3.bladex.cn/api',
changeOrigin: true,
rewrite: path => path.replace(/^\/api/, ''),
},
},
},
// server: {
// port: 2889,
// port: 2888,
// proxy: {
// '/api': {
// target: 'http://172.16.203.228:8000',
// target: 'http://localhost',
// //target: 'https://saber3.bladex.cn/api',
// 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, './'),