修改客商变更记录
This commit is contained in:
@@ -1276,11 +1276,11 @@ export default {
|
||||
findWaybillId(row, waybillNo) {
|
||||
const rows = this.splitText(row.loadingSubNos);
|
||||
const index = rows.findIndex(item => item === waybillNo);
|
||||
const linkedRows = this.parseJsonArray(row.waybillList || row.waybillRows || row.waybills);
|
||||
const linkedRows = parseJsonArray(row.waybillList || row.waybillRows || row.waybills);
|
||||
if (linkedRows[index]?.id || linkedRows[index]?.waybillId) {
|
||||
return linkedRows[index].id || linkedRows[index].waybillId;
|
||||
}
|
||||
const ids = this.parseJsonArray(row.waybillIdsJson);
|
||||
const ids = parseJsonArray(row.waybillIdsJson);
|
||||
return ids[index] || '';
|
||||
},
|
||||
async openWaybillDetail(row = {}) {
|
||||
|
||||
@@ -678,6 +678,11 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="变更账号" prop="changeUserName" min-width="160" />
|
||||
<el-table-column label="操作" width="90" fixed="right" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-link type="primary" @click="openChangeRecordDetail(row)">详情</el-link>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<empty-pagination
|
||||
:page="changeRecordPage"
|
||||
@@ -687,6 +692,40 @@
|
||||
/>
|
||||
</section-card>
|
||||
|
||||
<el-dialog
|
||||
v-model="changeRecordDetailVisible"
|
||||
title="变更记录详情"
|
||||
append-to-body
|
||||
destroy-on-close
|
||||
width="1100px"
|
||||
top="10px"
|
||||
class="change-record-detail-dialog"
|
||||
>
|
||||
<div v-if="changeRecordDetail" class="change-record-detail-meta">
|
||||
<span>变更日期:{{ changeRecordDetail.changeTime || '-' }}</span>
|
||||
<span>变更账号:{{ changeRecordDetail.changeUserName || '-' }}</span>
|
||||
</div>
|
||||
<el-table :data="changeRecordDetailRows" border :show-overflow-tooltip="false">
|
||||
<el-table-column prop="field" label="变更字段" min-width="180" />
|
||||
<el-table-column
|
||||
prop="before"
|
||||
label="变更前"
|
||||
min-width="360"
|
||||
class-name="change-record-detail-value"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="after"
|
||||
label="变更后"
|
||||
min-width="500"
|
||||
class-name="change-record-detail-value"
|
||||
/>
|
||||
</el-table>
|
||||
<el-empty v-if="!changeRecordDetailRows.length" description="暂无变更内容" :image-size="60" />
|
||||
<template #footer>
|
||||
<el-button type="primary" @click="changeRecordDetailVisible = false">关闭</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
<template #footer>
|
||||
<el-button @click="archiveBox = false">{{ readonly ? '关闭' : '取消' }}</el-button>
|
||||
<el-button type="primary" v-if="!readonly" @click="saveArchive">保存</el-button>
|
||||
@@ -1351,6 +1390,9 @@ export default {
|
||||
total: 0,
|
||||
records: [],
|
||||
},
|
||||
changeRecordDetailVisible: false,
|
||||
changeRecordDetail: null,
|
||||
changeRecordDetailRows: [],
|
||||
contactIndex: -1,
|
||||
contactForm: this.emptyContact(),
|
||||
contactMapBox: false,
|
||||
@@ -1916,6 +1958,9 @@ export default {
|
||||
registeredRegionName: '注册地址',
|
||||
registeredDetailAddress: '详细地址',
|
||||
invoiceType: '发票类型',
|
||||
qualificationAttachments: '客商材料',
|
||||
customerAttachments: '客商材料',
|
||||
客商材料: '客商材料',
|
||||
};
|
||||
if (fieldLabelMap[field]) return fieldLabelMap[field];
|
||||
const column = (this.option.column || []).find(item => item.prop === field);
|
||||
@@ -1996,6 +2041,68 @@ export default {
|
||||
})
|
||||
.join(';');
|
||||
},
|
||||
normalizeScoreChangeEntries(value) {
|
||||
const normalized = this.normalizeChangeFieldValue(value);
|
||||
if (Array.isArray(normalized)) return normalized;
|
||||
return normalized && typeof normalized === 'object' ? [normalized] : [];
|
||||
},
|
||||
formatScoreChangeDiff(beforeValue, afterValue) {
|
||||
const beforeEntries = this.normalizeScoreChangeEntries(beforeValue);
|
||||
const afterEntries = this.normalizeScoreChangeEntries(afterValue);
|
||||
const size = Math.max(beforeEntries.length, afterEntries.length);
|
||||
const fields = [
|
||||
['scoreDate', '评分日期'],
|
||||
['selfScore', '自评得分'],
|
||||
['reviewScore', '复评得分'],
|
||||
['finalScore', '最终得分'],
|
||||
['creditLevel', '信用等级'],
|
||||
['details', '评分明细'],
|
||||
];
|
||||
const formatValue = (field, value) => {
|
||||
if (field === 'details') {
|
||||
return this.formatScoreChangeValue([{ details: value }]).replace(/^第\d+条评分$/, '空');
|
||||
}
|
||||
if (value === undefined || value === null || value === '' || value === '-1') return '空';
|
||||
return field.endsWith('Score') ? `${this.formatScoreValue(value)}分` : String(value);
|
||||
};
|
||||
const before = [];
|
||||
const after = [];
|
||||
for (let index = 0; index < size; index += 1) {
|
||||
const left = beforeEntries[index] || {};
|
||||
const right = afterEntries[index] || {};
|
||||
fields.forEach(([field, label]) => {
|
||||
const leftValue = left[field];
|
||||
const rightValue = right[field];
|
||||
if (JSON.stringify(leftValue) === JSON.stringify(rightValue)) return;
|
||||
const prefix = size > 1 ? `第${index + 1}条-${label}` : label;
|
||||
before.push(`${prefix}:${formatValue(field, leftValue)}`);
|
||||
after.push(`${prefix}:${formatValue(field, rightValue)}`);
|
||||
});
|
||||
}
|
||||
return { before: before.join(';') || '空', after: after.join(';') || '空' };
|
||||
},
|
||||
formatAttachmentChangeValue(value) {
|
||||
const attachments = Array.isArray(value)
|
||||
? value
|
||||
: value && typeof value === 'object'
|
||||
? [value]
|
||||
: this.parseAttachments(value);
|
||||
const names = attachments
|
||||
.map(item => {
|
||||
const fileName =
|
||||
typeof item === 'string'
|
||||
? item
|
||||
: item?.originalName || item?.name || item?.fileName || item?.url || item?.link || '';
|
||||
const name = String(fileName).trim().split('?')[0].split('/').pop();
|
||||
try {
|
||||
return decodeURIComponent(name);
|
||||
} catch (error) {
|
||||
return name;
|
||||
}
|
||||
})
|
||||
.filter(Boolean);
|
||||
return names.length ? names.join('、') : '空';
|
||||
},
|
||||
formatChangeFieldValue(field, value) {
|
||||
value = this.normalizeChangeFieldValue(value);
|
||||
if (value === undefined || value === null || value === '' || value === '-1') return '空';
|
||||
@@ -2006,7 +2113,11 @@ export default {
|
||||
审核状态: 'approvalStatus',
|
||||
状态: 'status',
|
||||
客户类型: 'customerType',
|
||||
客商材料: 'qualificationAttachments',
|
||||
}[field] || field;
|
||||
if (['qualificationAttachments', 'customerAttachments'].includes(normalizedField)) {
|
||||
return this.formatAttachmentChangeValue(value);
|
||||
}
|
||||
if (normalizedField === '评分信息' || normalizedField === 'scores') {
|
||||
return this.formatScoreChangeValue(value) || '空';
|
||||
}
|
||||
@@ -2036,6 +2147,39 @@ export default {
|
||||
if (typeof value === 'object') return JSON.stringify(value);
|
||||
return String(value);
|
||||
},
|
||||
buildChangeRecordDetailRows(row = {}) {
|
||||
const beforeData = this.parseChangeData(row.beforeData);
|
||||
const afterData = this.parseChangeData(row.afterData);
|
||||
const fields = [...new Set([...Object.keys(beforeData), ...Object.keys(afterData)])];
|
||||
const rows = fields
|
||||
.filter(
|
||||
field =>
|
||||
field !== '变更内容' &&
|
||||
!(this.isEmptyChangeValue(beforeData[field]) && this.isEmptyChangeValue(afterData[field]))
|
||||
)
|
||||
.map(field => ({
|
||||
field: this.getChangeFieldLabel(field),
|
||||
...(this.isScoreChangeField(field)
|
||||
? this.formatScoreChangeDiff(beforeData[field], afterData[field])
|
||||
: {
|
||||
before: this.formatChangeFieldValue(field, beforeData[field]),
|
||||
after: this.formatChangeFieldValue(field, afterData[field]),
|
||||
}),
|
||||
}));
|
||||
const content = String(row.changeContent || '').trim();
|
||||
if (content) {
|
||||
rows.unshift({ field: '变更内容', before: '空', after: content });
|
||||
}
|
||||
return rows;
|
||||
},
|
||||
isScoreChangeField(field) {
|
||||
return ['评分信息', 'scores'].includes(field);
|
||||
},
|
||||
openChangeRecordDetail(row) {
|
||||
this.changeRecordDetail = row;
|
||||
this.changeRecordDetailRows = this.buildChangeRecordDetailRows(row);
|
||||
this.changeRecordDetailVisible = true;
|
||||
},
|
||||
formatChangeContent(row) {
|
||||
const beforeData = this.parseChangeData(row.beforeData);
|
||||
const afterData = this.parseChangeData(row.afterData);
|
||||
@@ -2047,8 +2191,11 @@ export default {
|
||||
!(this.isEmptyChangeValue(beforeData[field]) && this.isEmptyChangeValue(afterData[field]))
|
||||
)
|
||||
.map(field => {
|
||||
const before = this.formatChangeFieldValue(field, beforeData[field]);
|
||||
const after = this.formatChangeFieldValue(field, afterData[field]);
|
||||
const scoreDiff = this.isScoreChangeField(field)
|
||||
? this.formatScoreChangeDiff(beforeData[field], afterData[field])
|
||||
: null;
|
||||
const before = scoreDiff?.before || this.formatChangeFieldValue(field, beforeData[field]);
|
||||
const after = scoreDiff?.after || this.formatChangeFieldValue(field, afterData[field]);
|
||||
return `${this.getChangeFieldLabel(field)}:变更前:${before} → 变更后:${after}`;
|
||||
});
|
||||
const content = String(row.changeContent || '').trim();
|
||||
@@ -3168,6 +3315,9 @@ export default {
|
||||
},
|
||||
resetArchive() {
|
||||
this.readonly = false;
|
||||
this.changeRecordDetailVisible = false;
|
||||
this.changeRecordDetail = null;
|
||||
this.changeRecordDetailRows = [];
|
||||
this.archiveForm = this.emptyArchive();
|
||||
this.originalAccessType = '';
|
||||
this.qualificationFiles = [];
|
||||
@@ -4284,6 +4434,27 @@ export default {
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
:deep(.change-record-detail-dialog .el-dialog__body) {
|
||||
max-height: 65vh;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
:deep(.change-record-detail-dialog .change-record-detail-value .cell) {
|
||||
white-space: pre-wrap;
|
||||
word-break: break-word;
|
||||
overflow: visible;
|
||||
text-overflow: clip;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.change-record-detail-meta {
|
||||
display: flex;
|
||||
gap: 32px;
|
||||
margin-bottom: 16px;
|
||||
color: #606266;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
:deep(.archive-dialog .el-dialog__body) {
|
||||
max-height: 72vh;
|
||||
overflow: auto;
|
||||
|
||||
Reference in New Issue
Block a user