Merge remote-tracking branch 'origin/master' into feature/bfi-api-rate
# Conflicts: # src/views/payment/receipt-flow.vue
This commit is contained in:
@@ -38,7 +38,6 @@ export const createOption = () => ({
|
||||
delBtn: false,
|
||||
selection: true,
|
||||
dialogClickModal: false,
|
||||
menuWidth: 240,
|
||||
menuFixed: 'right',
|
||||
column: [
|
||||
{
|
||||
@@ -112,6 +111,7 @@ export const createOption = () => ({
|
||||
{
|
||||
label: '创建人',
|
||||
prop: 'createUserName',
|
||||
minWidth: 110,
|
||||
addDisplay: false,
|
||||
editDisplay: false,
|
||||
viewDisplay: false,
|
||||
@@ -120,6 +120,7 @@ export const createOption = () => ({
|
||||
{
|
||||
label: '更新人',
|
||||
prop: 'updateUserName',
|
||||
minWidth: 110,
|
||||
addDisplay: false,
|
||||
editDisplay: false,
|
||||
viewDisplay: false,
|
||||
@@ -131,6 +132,7 @@ export const createOption = () => ({
|
||||
type: 'datetime',
|
||||
format: 'YYYY-MM-DD HH:mm:ss',
|
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss',
|
||||
width: 180,
|
||||
sortable: true,
|
||||
addDisplay: false,
|
||||
editDisplay: false,
|
||||
@@ -142,6 +144,7 @@ export const createOption = () => ({
|
||||
type: 'datetime',
|
||||
format: 'YYYY-MM-DD HH:mm:ss',
|
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss',
|
||||
width: 180,
|
||||
sortable: true,
|
||||
addDisplay: false,
|
||||
editDisplay: false,
|
||||
|
||||
+123
-19
@@ -1,29 +1,133 @@
|
||||
/**
|
||||
* 路线变更记录内容格式化
|
||||
* 路线变更记录内容解析
|
||||
*
|
||||
* 存储格式(单行):
|
||||
* YD-20260904-0022:发货地 A → B;到货地 C → D;YD-20260904-0025:发货地 E → F;到货地 G → H
|
||||
* 路线顺序:A → B → C 调整为 B → A → C
|
||||
*
|
||||
* 展示格式(变更前 / 变更后分行):
|
||||
* YD-20260904-0022:发货地 A →
|
||||
* B
|
||||
* 到货地 C →
|
||||
* D
|
||||
* 解析结果(分组,供变更记录列表按「分组标题 - 字段 - 变更前/后」渲染):
|
||||
* [
|
||||
* {
|
||||
* title: 'YD-20260904-0022',
|
||||
* text: '',
|
||||
* fields: [{ label: '发货地', before: 'A', after: 'B', single: 'B', changed: true, unchanged: false }],
|
||||
* },
|
||||
* { title: '', text: '无法识别的原文', fields: [] },
|
||||
* ]
|
||||
*
|
||||
* 说明:仅用于展示层,不改变已存储的 content 文本(历史数据同样适用)。
|
||||
*/
|
||||
export const formatRouteChangeContent = (content, emptyText = '-') => {
|
||||
if (content === undefined || content === null) return emptyText;
|
||||
const text = String(content).trim();
|
||||
if (!text) return emptyText;
|
||||
// 长标签必须排在短标签前(「发货地址」优先于「发货地」),否则会被前缀吃掉
|
||||
const FIELD_LABELS = ['发货地址', '到货地址', '发货地', '到货地', '装货地', '卸货地', '收货地'];
|
||||
const FIELD_LABEL_PATTERN = new RegExp(`^(${FIELD_LABELS.join('|')})\\s*([\\s\\S]*)$`);
|
||||
// 变更前 / 变更后分隔符:→、➔、➜、->、-->、–>、—>
|
||||
const ARROW_PATTERN = /\s*(?:→|➔|➜|[\-–—]{1,2}\s*>)\s*/;
|
||||
// 运单地址之外的变更描述,例如「A → B → C 调整为 B → A → C」
|
||||
const ADJUST_PATTERN = /^([\s\S]*?)\s调整为\s*([\s\S]*)$/;
|
||||
const EMPTY_TEXT = ['', '-', '--', '—', 'null', 'undefined'];
|
||||
// 冒号前内容超过该长度时不视为分组标题(运单号通常长于该值)
|
||||
const TITLE_MAX_LENGTH = 12;
|
||||
|
||||
return text
|
||||
.replace(/\r\n?/g, '\n')
|
||||
// 多条记录之间换行
|
||||
.replace(/[ \t]*[;;][ \t]*/g, '\n')
|
||||
// 变更前地址 / 变更后地址分行(箭头保留在上一行行尾)
|
||||
.replace(/[ \t]*[-—]+>[ \t]*|[ \t]*→[ \t]*/g, ' →\n')
|
||||
.replace(/\n{2,}/g, '\n')
|
||||
.replace(/[ \t]+\n/g, '\n')
|
||||
.trim();
|
||||
const normalizeValue = value => {
|
||||
const text = String(value === undefined || value === null ? '' : value).trim();
|
||||
return EMPTY_TEXT.includes(text.toLowerCase()) ? '-' : text;
|
||||
};
|
||||
|
||||
const buildField = (label, rawValue) => {
|
||||
const value = String(rawValue === undefined || rawValue === null ? '' : rawValue).trim();
|
||||
const adjustMatched = value.match(ADJUST_PATTERN);
|
||||
let before = value;
|
||||
let after = '';
|
||||
let hasPair = false;
|
||||
|
||||
if (adjustMatched) {
|
||||
before = adjustMatched[1];
|
||||
after = adjustMatched[2];
|
||||
hasPair = true;
|
||||
} else {
|
||||
const parts = value.split(ARROW_PATTERN);
|
||||
if (parts.length > 1) {
|
||||
before = parts[0];
|
||||
after = parts[1];
|
||||
hasPair = true;
|
||||
}
|
||||
}
|
||||
|
||||
const beforeText = normalizeValue(before);
|
||||
const afterText = normalizeValue(after);
|
||||
|
||||
return {
|
||||
label,
|
||||
before: beforeText,
|
||||
after: afterText,
|
||||
// 单值展示(未拆分出前后值时使用)
|
||||
single: hasPair ? afterText : beforeText,
|
||||
changed: hasPair && beforeText !== afterText,
|
||||
unchanged: hasPair && beforeText === afterText,
|
||||
};
|
||||
};
|
||||
|
||||
const parseSegment = segment => {
|
||||
// 形如「发货地 A → B」(前面只有「;」分隔,无分组标题)→ 归入上一条运单
|
||||
const leadingMatched = segment.match(FIELD_LABEL_PATTERN);
|
||||
if (leadingMatched && leadingMatched[2].trim()) {
|
||||
return {
|
||||
type: 'field',
|
||||
title: '',
|
||||
text: '',
|
||||
fields: [buildField(leadingMatched[1], leadingMatched[2])],
|
||||
};
|
||||
}
|
||||
|
||||
const colonIndex = segment.search(/[::]/);
|
||||
if (colonIndex === -1) {
|
||||
return { type: 'text', title: '', text: segment, fields: [] };
|
||||
}
|
||||
|
||||
const head = segment.slice(0, colonIndex).trim();
|
||||
const tail = segment.slice(colonIndex + 1).trim();
|
||||
const fieldMatched = tail.match(FIELD_LABEL_PATTERN);
|
||||
|
||||
// 形如「YD-20260904-0022:发货地 A → B」
|
||||
if (fieldMatched && fieldMatched[2].trim()) {
|
||||
return {
|
||||
type: 'waybill',
|
||||
title: head,
|
||||
text: '',
|
||||
fields: [buildField(fieldMatched[1], fieldMatched[2])],
|
||||
};
|
||||
}
|
||||
|
||||
// 形如「路线顺序:A → B → C 调整为 B → A → C」
|
||||
if (head && head.length <= TITLE_MAX_LENGTH) {
|
||||
return { type: 'group', title: head, text: '', fields: [buildField('', tail)] };
|
||||
}
|
||||
|
||||
return { type: 'text', title: '', text: segment, fields: [] };
|
||||
};
|
||||
|
||||
export const parseRouteChangeContent = content => {
|
||||
if (content === undefined || content === null) return [];
|
||||
const text = String(content).replace(/\r\n?/g, '\n').trim();
|
||||
if (!text) return [];
|
||||
|
||||
const segments = text
|
||||
.split(/[;;\n]+/)
|
||||
.map(item => item.trim())
|
||||
.filter(Boolean);
|
||||
|
||||
const groups = [];
|
||||
|
||||
segments.forEach(segment => {
|
||||
const group = parseSegment(segment);
|
||||
const last = groups[groups.length - 1];
|
||||
// 同一运单下的「到货地…」等无标题字段,合并进上一个运单分组
|
||||
if (group.type === 'field' && last && (last.type === 'waybill' || last.type === 'field')) {
|
||||
last.fields.push(...group.fields);
|
||||
return;
|
||||
}
|
||||
groups.push(group);
|
||||
});
|
||||
|
||||
return groups;
|
||||
};
|
||||
|
||||
@@ -2991,12 +2991,51 @@
|
||||
<el-table :data="waybillRouteChangeRecords" border>
|
||||
<el-table-column prop="changeTime" label="变更时间" min-width="170" />
|
||||
<el-table-column prop="changeUser" label="变更人" min-width="120" />
|
||||
<el-table-column prop="content" label="变更内容" min-width="360">
|
||||
<el-table-column
|
||||
prop="content"
|
||||
label="变更内容"
|
||||
min-width="360"
|
||||
:show-overflow-tooltip="false"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
<div
|
||||
class="business-crud-page__route-change-record-content"
|
||||
v-text="formatRouteChangeContent(row.content)"
|
||||
/>
|
||||
<div class="business-crud-page__route-change-record-content">
|
||||
<div
|
||||
v-for="(group, groupIndex) in parseRouteChangeContent(row.content)"
|
||||
:key="groupIndex"
|
||||
class="business-crud-page__route-change-group"
|
||||
>
|
||||
<div v-if="group.title" class="business-crud-page__route-change-group-title">
|
||||
{{ group.title }}
|
||||
</div>
|
||||
<div v-if="group.text" class="business-crud-page__route-change-group-text">
|
||||
{{ group.text }}
|
||||
</div>
|
||||
<div
|
||||
v-for="(field, fieldIndex) in group.fields"
|
||||
:key="fieldIndex"
|
||||
class="business-crud-page__route-change-field"
|
||||
>
|
||||
<span class="business-crud-page__route-change-field-label">
|
||||
{{ field.label }}
|
||||
</span>
|
||||
<template v-if="field.changed">
|
||||
<span class="business-crud-page__route-change-before">
|
||||
{{ field.before }}
|
||||
</span>
|
||||
<span class="business-crud-page__route-change-arrow">→</span>
|
||||
<span class="business-crud-page__route-change-after">
|
||||
{{ field.after }}
|
||||
</span>
|
||||
</template>
|
||||
<span v-else class="business-crud-page__route-change-single">
|
||||
{{ field.single }}
|
||||
<span v-if="field.unchanged" class="business-crud-page__route-change-flag">
|
||||
未变更
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="remark" label="备注" min-width="200" show-overflow-tooltip />
|
||||
@@ -5283,7 +5322,7 @@ import { formatContractOptionLabel } from '@/utils/contract';
|
||||
import { openImportDialog } from '@/utils/import-excel';
|
||||
import { normalizeMapSearchResults, searchAmapPlaceText } from '@/utils/map-search';
|
||||
import { loadMeasurementUnitOptions } from '@/utils/measurement-unit';
|
||||
import { formatRouteChangeContent } from '@/utils/route-change';
|
||||
import { parseRouteChangeContent } from '@/utils/route-change';
|
||||
import { applyTableMenuWidth } from '@/utils/table-menu';
|
||||
import { downloadFileByUrl, downloadXls } from '@/utils/util';
|
||||
import { isMobile } from '@/utils/validate';
|
||||
@@ -6630,7 +6669,7 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
formatContractOptionLabel,
|
||||
formatRouteChangeContent,
|
||||
parseRouteChangeContent,
|
||||
initStandaloneFormPage() {
|
||||
if (!this.isStandaloneFormPage) return;
|
||||
const mode = this.$route.query.mode === 'edit' ? 'edit' : 'add';
|
||||
@@ -15900,10 +15939,65 @@ export default {
|
||||
}
|
||||
|
||||
&__route-change-record-content {
|
||||
white-space: pre-wrap;
|
||||
overflow-wrap: anywhere;
|
||||
word-break: break-word;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
line-height: 22px;
|
||||
white-space: normal;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
&__route-change-group {
|
||||
padding-left: 8px;
|
||||
border-left: 2px solid #409eff;
|
||||
}
|
||||
|
||||
&__route-change-group-title {
|
||||
margin-bottom: 4px;
|
||||
color: #409eff;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
&__route-change-group-text {
|
||||
color: #606266;
|
||||
word-break: break-word;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
|
||||
&__route-change-field {
|
||||
display: grid;
|
||||
grid-template-columns: 54px minmax(0, 1fr);
|
||||
column-gap: 8px;
|
||||
row-gap: 2px;
|
||||
}
|
||||
|
||||
&__route-change-field-label {
|
||||
color: #909399;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
&__route-change-before,
|
||||
&__route-change-single {
|
||||
color: #606266;
|
||||
word-break: break-word;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
|
||||
&__route-change-arrow {
|
||||
color: #c0c4cc;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
&__route-change-after {
|
||||
color: #409eff;
|
||||
word-break: break-word;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
|
||||
&__route-change-flag {
|
||||
margin-left: 6px;
|
||||
color: #c0c4cc;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
@media (max-width: 1200px) {
|
||||
|
||||
@@ -3020,12 +3020,57 @@
|
||||
<el-table :data="waybillRouteChangeRecords" border>
|
||||
<el-table-column prop="changeTime" label="变更时间" min-width="170" />
|
||||
<el-table-column prop="changeUser" label="变更人" min-width="120" />
|
||||
<el-table-column prop="content" label="变更内容" min-width="360">
|
||||
<el-table-column
|
||||
prop="content"
|
||||
label="变更内容"
|
||||
min-width="360"
|
||||
:show-overflow-tooltip="false"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
<div
|
||||
class="waybill-manage-page__route-change-record-content"
|
||||
v-text="formatRouteChangeContent(row.content)"
|
||||
/>
|
||||
<div class="waybill-manage-page__route-change-record-content">
|
||||
<div
|
||||
v-for="(group, groupIndex) in parseRouteChangeContent(row.content)"
|
||||
:key="groupIndex"
|
||||
class="waybill-manage-page__route-change-group"
|
||||
>
|
||||
<div
|
||||
v-if="group.title"
|
||||
class="waybill-manage-page__route-change-group-title"
|
||||
>
|
||||
{{ group.title }}
|
||||
</div>
|
||||
<div v-if="group.text" class="waybill-manage-page__route-change-group-text">
|
||||
{{ group.text }}
|
||||
</div>
|
||||
<div
|
||||
v-for="(field, fieldIndex) in group.fields"
|
||||
:key="fieldIndex"
|
||||
class="waybill-manage-page__route-change-field"
|
||||
>
|
||||
<span class="waybill-manage-page__route-change-field-label">
|
||||
{{ field.label }}
|
||||
</span>
|
||||
<template v-if="field.changed">
|
||||
<span class="waybill-manage-page__route-change-before">
|
||||
{{ field.before }}
|
||||
</span>
|
||||
<span class="waybill-manage-page__route-change-arrow">→</span>
|
||||
<span class="waybill-manage-page__route-change-after">
|
||||
{{ field.after }}
|
||||
</span>
|
||||
</template>
|
||||
<span v-else class="waybill-manage-page__route-change-single">
|
||||
{{ field.single }}
|
||||
<span
|
||||
v-if="field.unchanged"
|
||||
class="waybill-manage-page__route-change-flag"
|
||||
>
|
||||
未变更
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="remark" label="备注" min-width="200" show-overflow-tooltip />
|
||||
@@ -3667,7 +3712,7 @@ import { wgs84ToGcj02 } from '@/utils/coordinate';
|
||||
import { openImportDialog } from '@/utils/import-excel';
|
||||
import { normalizeMapSearchResults, searchAmapPlaceText } from '@/utils/map-search';
|
||||
import { loadMeasurementUnitOptions } from '@/utils/measurement-unit';
|
||||
import { formatRouteChangeContent } from '@/utils/route-change';
|
||||
import { parseRouteChangeContent } from '@/utils/route-change';
|
||||
import { applyTableMenuWidth } from '@/utils/table-menu';
|
||||
import { downloadFileByUrl, downloadXls } from '@/utils/util';
|
||||
import { isMobile } from '@/utils/validate';
|
||||
@@ -4755,7 +4800,7 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
formatContractOptionLabel,
|
||||
formatRouteChangeContent,
|
||||
parseRouteChangeContent,
|
||||
// 页面被 keep-alive 缓存/卸载时调用,关闭本页所有 append-to-body 的弹窗,
|
||||
// 避免 Teleport 出去的 DOM 残留在 body 上盖住后续页面(详见 data 里的说明)。
|
||||
closeInnerDialogs() {
|
||||
@@ -11846,10 +11891,65 @@ export default {
|
||||
}
|
||||
|
||||
&__route-change-record-content {
|
||||
white-space: pre-wrap;
|
||||
overflow-wrap: anywhere;
|
||||
word-break: break-word;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
line-height: 22px;
|
||||
white-space: normal;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
&__route-change-group {
|
||||
padding-left: 8px;
|
||||
border-left: 2px solid #409eff;
|
||||
}
|
||||
|
||||
&__route-change-group-title {
|
||||
margin-bottom: 4px;
|
||||
color: #409eff;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
&__route-change-group-text {
|
||||
color: #606266;
|
||||
word-break: break-word;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
|
||||
&__route-change-field {
|
||||
display: grid;
|
||||
grid-template-columns: 54px minmax(0, 1fr);
|
||||
column-gap: 8px;
|
||||
row-gap: 2px;
|
||||
}
|
||||
|
||||
&__route-change-field-label {
|
||||
color: #909399;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
&__route-change-before,
|
||||
&__route-change-single {
|
||||
color: #606266;
|
||||
word-break: break-word;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
|
||||
&__route-change-arrow {
|
||||
color: #c0c4cc;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
&__route-change-after {
|
||||
color: #409eff;
|
||||
word-break: break-word;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
|
||||
&__route-change-flag {
|
||||
margin-left: 6px;
|
||||
color: #c0c4cc;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
&__common-address-toolbar {
|
||||
|
||||
@@ -1683,9 +1683,56 @@
|
||||
><el-table-column prop="changeTime" label="变更时间" min-width="170" /><el-table-column
|
||||
prop="changeUser"
|
||||
label="变更人"
|
||||
min-width="120" /><el-table-column prop="content" label="变更内容" min-width="360"
|
||||
min-width="120" /><el-table-column
|
||||
prop="content"
|
||||
label="变更内容"
|
||||
min-width="360"
|
||||
:show-overflow-tooltip="false"
|
||||
><template #default="{ row }"
|
||||
><div class="loading-route-change-dialog__record-content">{{ formatRouteChangeContent(row.content) }}</div></template
|
||||
><div class="loading-route-change-dialog__record-content">
|
||||
<div
|
||||
v-for="(group, groupIndex) in parseRouteChangeContent(row.content)"
|
||||
:key="groupIndex"
|
||||
class="loading-route-change-dialog__change-group"
|
||||
>
|
||||
<div
|
||||
v-if="group.title"
|
||||
class="loading-route-change-dialog__change-group-title"
|
||||
>
|
||||
{{ group.title }}
|
||||
</div>
|
||||
<div v-if="group.text" class="loading-route-change-dialog__change-group-text">
|
||||
{{ group.text }}
|
||||
</div>
|
||||
<div
|
||||
v-for="(field, fieldIndex) in group.fields"
|
||||
:key="fieldIndex"
|
||||
class="loading-route-change-dialog__change-field"
|
||||
>
|
||||
<span class="loading-route-change-dialog__change-field-label">
|
||||
{{ field.label }}
|
||||
</span>
|
||||
<template v-if="field.changed">
|
||||
<span class="loading-route-change-dialog__change-before">
|
||||
{{ field.before }}
|
||||
</span>
|
||||
<span class="loading-route-change-dialog__change-arrow">→</span>
|
||||
<span class="loading-route-change-dialog__change-after">
|
||||
{{ field.after }}
|
||||
</span>
|
||||
</template>
|
||||
<span v-else class="loading-route-change-dialog__change-single">
|
||||
{{ field.single }}
|
||||
<span
|
||||
v-if="field.unchanged"
|
||||
class="loading-route-change-dialog__change-flag"
|
||||
>
|
||||
未变更
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div></template
|
||||
></el-table-column
|
||||
><el-table-column
|
||||
prop="remark"
|
||||
@@ -1798,7 +1845,7 @@ import TableHeaderTools from '@/components/table-header-tools/main.vue';
|
||||
import dayjs from 'dayjs';
|
||||
import { isMobile } from '@/utils/validate';
|
||||
import { normalizeMapSearchResults, searchAmapPlaceText } from '@/utils/map-search';
|
||||
import { formatRouteChangeContent } from '@/utils/route-change';
|
||||
import { parseRouteChangeContent } from '@/utils/route-change';
|
||||
|
||||
const defaultTransportType = '';
|
||||
const defaultCandidateTransportType = '';
|
||||
@@ -2277,7 +2324,7 @@ export default {
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
formatRouteChangeContent,
|
||||
parseRouteChangeContent,
|
||||
formatTaskCarrierContractLabel(item = {}) {
|
||||
const carrierName = item.carrierName || item.partyB || '';
|
||||
const contractLabel = formatContractOptionLabel(item);
|
||||
@@ -5129,10 +5176,56 @@ export default {
|
||||
gap: 4px;
|
||||
}
|
||||
.loading-route-change-dialog__record-content {
|
||||
white-space: pre-wrap;
|
||||
overflow-wrap: anywhere;
|
||||
word-break: break-word;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
line-height: 22px;
|
||||
white-space: normal;
|
||||
text-align: left;
|
||||
}
|
||||
.loading-route-change-dialog__change-group {
|
||||
padding-left: 8px;
|
||||
border-left: 2px solid #409eff;
|
||||
}
|
||||
.loading-route-change-dialog__change-group-title {
|
||||
margin-bottom: 4px;
|
||||
color: #409eff;
|
||||
font-weight: 500;
|
||||
}
|
||||
.loading-route-change-dialog__change-group-text {
|
||||
color: #606266;
|
||||
word-break: break-word;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
.loading-route-change-dialog__change-field {
|
||||
display: grid;
|
||||
grid-template-columns: 54px minmax(0, 1fr);
|
||||
column-gap: 8px;
|
||||
row-gap: 2px;
|
||||
}
|
||||
.loading-route-change-dialog__change-field-label {
|
||||
color: #909399;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.loading-route-change-dialog__change-before,
|
||||
.loading-route-change-dialog__change-single {
|
||||
color: #606266;
|
||||
word-break: break-word;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
.loading-route-change-dialog__change-arrow {
|
||||
color: #c0c4cc;
|
||||
text-align: right;
|
||||
}
|
||||
.loading-route-change-dialog__change-after {
|
||||
color: #409eff;
|
||||
word-break: break-word;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
.loading-route-change-dialog__change-flag {
|
||||
margin-left: 6px;
|
||||
color: #c0c4cc;
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
.loading-route-change-map-dialog {
|
||||
|
||||
@@ -52,12 +52,13 @@
|
||||
<el-icon><Delete /></el-icon>
|
||||
<span>重置</span>
|
||||
</el-button>
|
||||
<el-tooltip :content="expanded ? '折叠' : '展开'" placement="top">
|
||||
<el-button text @click="expanded = !expanded">
|
||||
<el-icon><component :is="expanded ? ArrowUp : ArrowDown" /></el-icon>
|
||||
<span>{{ expanded ? '折叠' : '展开' }}</span>
|
||||
</el-button>
|
||||
</el-tooltip>
|
||||
<el-button
|
||||
v-if="showSearchToggle"
|
||||
text
|
||||
:icon="expanded ? ArrowUp : ArrowDown"
|
||||
@click="expanded = !expanded"
|
||||
>{{ expanded ? '收起' : '展开' }}</el-button
|
||||
>
|
||||
</div>
|
||||
</el-form>
|
||||
</section>
|
||||
@@ -81,10 +82,18 @@ export default {
|
||||
Delete,
|
||||
Search,
|
||||
expanded: false,
|
||||
// 与 avue-crud 一致:搜索项数量超过 searchIndex(默认一行 4 项)时才显示“展开/收起”
|
||||
searchIndex: 4,
|
||||
searchItemCount: 6,
|
||||
billTypeOptions,
|
||||
maturityStatusOptions,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
showSearchToggle() {
|
||||
return this.searchItemCount > this.searchIndex;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
@@ -43,11 +43,13 @@
|
||||
<div class="bill-payment-search__actions">
|
||||
<el-button type="primary" :loading="loading" @click="$emit('search')">查询</el-button>
|
||||
<el-button @click="$emit('reset')">重置</el-button>
|
||||
<el-tooltip :content="expanded ? '折叠' : '展开'" placement="top">
|
||||
<el-button text @click="expanded = !expanded">
|
||||
<el-icon><component :is="expanded ? ArrowUp : ArrowDown" /></el-icon>
|
||||
</el-button>
|
||||
</el-tooltip>
|
||||
<el-button
|
||||
v-if="showSearchToggle"
|
||||
text
|
||||
:icon="expanded ? ArrowUp : ArrowDown"
|
||||
@click="expanded = !expanded"
|
||||
>{{ expanded ? '收起' : '展开' }}</el-button
|
||||
>
|
||||
</div>
|
||||
</el-form>
|
||||
</section>
|
||||
@@ -67,7 +69,20 @@ export default {
|
||||
},
|
||||
emits: ['search', 'reset'],
|
||||
data() {
|
||||
return { ArrowDown, ArrowUp, expanded: false, approvalStatusOptions };
|
||||
return {
|
||||
ArrowDown,
|
||||
ArrowUp,
|
||||
expanded: false,
|
||||
// 与 avue-crud 一致:搜索项数量超过 searchIndex(默认一行 4 项)时才显示“展开/收起”
|
||||
searchIndex: 4,
|
||||
searchItemCount: 4,
|
||||
approvalStatusOptions,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
showSearchToggle() {
|
||||
return this.searchItemCount > this.searchIndex;
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.loadOrganizationOptions();
|
||||
|
||||
@@ -45,11 +45,13 @@
|
||||
<div class="invoice-page__search-actions">
|
||||
<el-button type="primary" @click="handleSearch">查询</el-button>
|
||||
<el-button @click="resetSearch">重置</el-button>
|
||||
<el-tooltip :content="searchExpanded ? '折叠' : '展开'" placement="top">
|
||||
<el-button text @click="searchExpanded = !searchExpanded">
|
||||
<el-icon><component :is="searchExpanded ? ArrowUp : ArrowDown" /></el-icon>
|
||||
</el-button>
|
||||
</el-tooltip>
|
||||
<el-button
|
||||
v-if="showSearchToggle"
|
||||
text
|
||||
:icon="searchExpanded ? ArrowUp : ArrowDown"
|
||||
@click="searchExpanded = !searchExpanded"
|
||||
>{{ searchExpanded ? '收起' : '展开' }}</el-button
|
||||
>
|
||||
</div>
|
||||
</el-form>
|
||||
</section>
|
||||
@@ -256,6 +258,9 @@ export default {
|
||||
ArrowUp,
|
||||
query: emptyQuery(),
|
||||
searchExpanded: false,
|
||||
// 与 avue-crud 一致:搜索项数量超过 searchIndex(默认一行 4 项)时才显示“展开/收起”
|
||||
searchIndex: 4,
|
||||
searchItemCount: 5,
|
||||
searchVisible: true,
|
||||
tableSize: 'default',
|
||||
approvalStatusOptions: api.approvalStatusOptions,
|
||||
@@ -275,6 +280,9 @@ export default {
|
||||
visibleColumns() {
|
||||
return this.columns.filter(column => this.visibleColumnKeys.includes(column.prop));
|
||||
},
|
||||
showSearchToggle() {
|
||||
return this.searchItemCount > this.searchIndex;
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.loadOrganizationOptions();
|
||||
|
||||
@@ -54,11 +54,13 @@
|
||||
<div class="receipt-page__search-actions">
|
||||
<el-button type="primary" @click="handleSearch">查询</el-button>
|
||||
<el-button @click="resetSearch">重置</el-button>
|
||||
<el-tooltip :content="searchExpanded ? '折叠' : '展开'" placement="top">
|
||||
<el-button text @click="searchExpanded = !searchExpanded">
|
||||
<el-icon><component :is="searchExpanded ? ArrowUp : ArrowDown" /></el-icon>
|
||||
</el-button>
|
||||
</el-tooltip>
|
||||
<el-button
|
||||
v-if="showSearchToggle"
|
||||
text
|
||||
:icon="searchExpanded ? ArrowUp : ArrowDown"
|
||||
@click="searchExpanded = !searchExpanded"
|
||||
>{{ searchExpanded ? '收起' : '展开' }}</el-button
|
||||
>
|
||||
</div>
|
||||
</el-form>
|
||||
</section>
|
||||
@@ -241,6 +243,9 @@ export default {
|
||||
ArrowUp,
|
||||
query: emptyQuery(),
|
||||
searchExpanded: false,
|
||||
// 与 avue-crud 一致:搜索项数量超过 searchIndex(默认一行 4 项)时才显示“展开/收起”
|
||||
searchIndex: 4,
|
||||
searchItemCount: 6,
|
||||
searchVisible: true,
|
||||
tableSize: 'default',
|
||||
approvalStatusOptions: api.approvalStatusOptions,
|
||||
@@ -260,6 +265,9 @@ export default {
|
||||
visibleColumns() {
|
||||
return this.columns.filter(column => this.visibleColumnKeys.includes(column.prop));
|
||||
},
|
||||
showSearchToggle() {
|
||||
return this.searchItemCount > this.searchIndex;
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.loadOrganizationOptions();
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
collapse-tags-tooltip
|
||||
:max-collapse-tags="1"
|
||||
:disabled="readonly"
|
||||
placeholder="请选择预结算/正式结算单"
|
||||
placeholder="请输入"
|
||||
class="payment-form-page__settlement-select"
|
||||
@visible-change="handleSettlementSelectVisible"
|
||||
>
|
||||
@@ -448,7 +448,7 @@
|
||||
></el-table
|
||||
>
|
||||
<div v-else>
|
||||
<div class="payment-form-page__reference-search">
|
||||
<el-card class="payment-form-page__reference-search">
|
||||
<el-form
|
||||
:model="referenceQuery"
|
||||
label-position="right"
|
||||
@@ -486,7 +486,7 @@
|
||||
<el-button @click="resetReferenceSearch">清空</el-button>
|
||||
</div>
|
||||
</el-form>
|
||||
</div>
|
||||
</el-card>
|
||||
<el-tabs v-model="referenceTab" @tab-change="handleReferenceTabChange">
|
||||
<el-tab-pane v-if="canSelectFormalSettlement" label="正式结算单" name="formal">
|
||||
<el-table
|
||||
@@ -1075,7 +1075,7 @@ export default {
|
||||
!this.form.preSettlementId &&
|
||||
!this.form.preSettlementIds?.length
|
||||
) {
|
||||
callback(new Error('请选择结算单'));
|
||||
callback(new Error('请输入'));
|
||||
return;
|
||||
}
|
||||
callback();
|
||||
|
||||
@@ -80,11 +80,13 @@
|
||||
<div class="claim-record-page__search-actions">
|
||||
<el-button type="primary" @click="handleSearch">查询</el-button>
|
||||
<el-button @click="resetSearch">重置</el-button>
|
||||
<el-tooltip :content="searchExpanded ? '折叠' : '展开'" placement="top">
|
||||
<el-button text @click="searchExpanded = !searchExpanded">
|
||||
<el-icon><component :is="searchExpanded ? ArrowUp : ArrowDown" /></el-icon>
|
||||
</el-button>
|
||||
</el-tooltip>
|
||||
<el-button
|
||||
v-if="showSearchToggle"
|
||||
text
|
||||
:icon="searchExpanded ? ArrowUp : ArrowDown"
|
||||
@click="searchExpanded = !searchExpanded"
|
||||
>{{ searchExpanded ? '收起' : '展开' }}</el-button
|
||||
>
|
||||
</div>
|
||||
</el-form>
|
||||
</section-card>
|
||||
@@ -191,6 +193,9 @@ export default {
|
||||
ArrowUp,
|
||||
query: emptyQuery(),
|
||||
searchExpanded: false,
|
||||
// 与 avue-crud 一致:搜索项数量超过 searchIndex(默认一行 4 项)时才显示“展开/收起”
|
||||
searchIndex: 4,
|
||||
searchItemCount: 11,
|
||||
searchVisible: true,
|
||||
tableSize: 'default',
|
||||
claimStatusOptions: api.claimStatusOptions,
|
||||
@@ -209,6 +214,9 @@ export default {
|
||||
visibleColumns() {
|
||||
return this.columns.filter(column => this.visibleColumnKeys.includes(column.prop));
|
||||
},
|
||||
showSearchToggle() {
|
||||
return this.searchItemCount > this.searchIndex;
|
||||
},
|
||||
isAdmin() {
|
||||
return isAdministrator(this.userInfo);
|
||||
},
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
<el-form-item label="对方户名">
|
||||
<el-input v-model="query.counterpartyName" clearable placeholder="请输入" />
|
||||
</el-form-item>
|
||||
<el-form-item label="对方开户行">
|
||||
<el-input v-model="query.counterpartyBank" clearable placeholder="请输入" />
|
||||
</el-form-item>
|
||||
<el-form-item label="对方账号">
|
||||
<el-input v-model="query.counterpartyAccount" clearable placeholder="请输入" />
|
||||
</el-form-item>
|
||||
@@ -86,11 +89,13 @@
|
||||
<div class="receipt-flow-page__search-actions">
|
||||
<el-button type="primary" @click="handleSearch">查询</el-button>
|
||||
<el-button @click="resetSearch">重置</el-button>
|
||||
<el-tooltip :content="searchExpanded ? '折叠' : '展开'" placement="top">
|
||||
<el-button text @click="searchExpanded = !searchExpanded">
|
||||
<el-icon><component :is="searchExpanded ? ArrowUp : ArrowDown" /></el-icon>
|
||||
</el-button>
|
||||
</el-tooltip>
|
||||
<el-button
|
||||
v-if="showSearchToggle"
|
||||
text
|
||||
:icon="searchExpanded ? ArrowUp : ArrowDown"
|
||||
@click="searchExpanded = !searchExpanded"
|
||||
>{{ searchExpanded ? '收起' : '展开' }}</el-button
|
||||
>
|
||||
</div>
|
||||
</el-form>
|
||||
</section>
|
||||
@@ -321,6 +326,9 @@ export default {
|
||||
syncing: false,
|
||||
pushingId: null,
|
||||
searchExpanded: false,
|
||||
// 与 avue-crud 一致:搜索项数量超过 searchIndex(默认一行 4 项)时才显示“展开/收起”
|
||||
searchIndex: 4,
|
||||
searchItemCount: 7,
|
||||
page: { current: 1, size: 10, total: 0 },
|
||||
detailDialog: { visible: false, loading: false, data: {}, claimRecords: [] },
|
||||
};
|
||||
@@ -330,6 +338,9 @@ export default {
|
||||
visibleColumns() {
|
||||
return this.columns.filter(column => this.visibleColumnKeys.includes(column.prop));
|
||||
},
|
||||
showSearchToggle() {
|
||||
return this.searchItemCount > this.searchIndex;
|
||||
},
|
||||
isAdmin() {
|
||||
return isAdministrator(this.userInfo);
|
||||
},
|
||||
|
||||
@@ -675,24 +675,27 @@
|
||||
</div>
|
||||
|
||||
<el-dialog v-model="candidate.visible" title="选择预结算单" width="88%" append-to-body>
|
||||
<el-form
|
||||
:model="candidate.query"
|
||||
inline
|
||||
label-position="right"
|
||||
label-width="88px"
|
||||
class="formal-editor__candidate-search"
|
||||
>
|
||||
<el-form-item label="预结算单号"
|
||||
<el-card>
|
||||
<el-form
|
||||
:model="candidate.query"
|
||||
inline
|
||||
label-position="right"
|
||||
label-width="88px"
|
||||
class="formal-editor__candidate-search"
|
||||
>
|
||||
<el-form-item label="预结算单号"
|
||||
><el-input v-model="candidate.query.preSettlementNo" clearable
|
||||
/></el-form-item>
|
||||
<el-form-item label="合同编号"
|
||||
/></el-form-item>
|
||||
<el-form-item label="合同编号"
|
||||
><el-input v-model="candidate.query.contractNo" clearable
|
||||
/></el-form-item>
|
||||
<el-form-item
|
||||
/></el-form-item>
|
||||
<el-form-item
|
||||
><el-button @click="resetCandidates">重置</el-button
|
||||
><el-button type="primary" @click="loadCandidates">查询</el-button></el-form-item
|
||||
>
|
||||
</el-form>
|
||||
>
|
||||
</el-form>
|
||||
</el-card>
|
||||
|
||||
<el-table
|
||||
ref="candidateTable"
|
||||
v-loading="candidate.loading"
|
||||
|
||||
Reference in New Issue
Block a user