修改客商变更记录
This commit is contained in:
@@ -1276,11 +1276,11 @@ export default {
|
|||||||
findWaybillId(row, waybillNo) {
|
findWaybillId(row, waybillNo) {
|
||||||
const rows = this.splitText(row.loadingSubNos);
|
const rows = this.splitText(row.loadingSubNos);
|
||||||
const index = rows.findIndex(item => item === waybillNo);
|
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) {
|
if (linkedRows[index]?.id || linkedRows[index]?.waybillId) {
|
||||||
return 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] || '';
|
return ids[index] || '';
|
||||||
},
|
},
|
||||||
async openWaybillDetail(row = {}) {
|
async openWaybillDetail(row = {}) {
|
||||||
|
|||||||
@@ -678,6 +678,11 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="变更账号" prop="changeUserName" min-width="160" />
|
<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>
|
</el-table>
|
||||||
<empty-pagination
|
<empty-pagination
|
||||||
:page="changeRecordPage"
|
:page="changeRecordPage"
|
||||||
@@ -687,6 +692,40 @@
|
|||||||
/>
|
/>
|
||||||
</section-card>
|
</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>
|
<template #footer>
|
||||||
<el-button @click="archiveBox = false">{{ readonly ? '关闭' : '取消' }}</el-button>
|
<el-button @click="archiveBox = false">{{ readonly ? '关闭' : '取消' }}</el-button>
|
||||||
<el-button type="primary" v-if="!readonly" @click="saveArchive">保存</el-button>
|
<el-button type="primary" v-if="!readonly" @click="saveArchive">保存</el-button>
|
||||||
@@ -1351,6 +1390,9 @@ export default {
|
|||||||
total: 0,
|
total: 0,
|
||||||
records: [],
|
records: [],
|
||||||
},
|
},
|
||||||
|
changeRecordDetailVisible: false,
|
||||||
|
changeRecordDetail: null,
|
||||||
|
changeRecordDetailRows: [],
|
||||||
contactIndex: -1,
|
contactIndex: -1,
|
||||||
contactForm: this.emptyContact(),
|
contactForm: this.emptyContact(),
|
||||||
contactMapBox: false,
|
contactMapBox: false,
|
||||||
@@ -1916,6 +1958,9 @@ export default {
|
|||||||
registeredRegionName: '注册地址',
|
registeredRegionName: '注册地址',
|
||||||
registeredDetailAddress: '详细地址',
|
registeredDetailAddress: '详细地址',
|
||||||
invoiceType: '发票类型',
|
invoiceType: '发票类型',
|
||||||
|
qualificationAttachments: '客商材料',
|
||||||
|
customerAttachments: '客商材料',
|
||||||
|
客商材料: '客商材料',
|
||||||
};
|
};
|
||||||
if (fieldLabelMap[field]) return fieldLabelMap[field];
|
if (fieldLabelMap[field]) return fieldLabelMap[field];
|
||||||
const column = (this.option.column || []).find(item => item.prop === field);
|
const column = (this.option.column || []).find(item => item.prop === field);
|
||||||
@@ -1996,6 +2041,68 @@ export default {
|
|||||||
})
|
})
|
||||||
.join(';');
|
.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) {
|
formatChangeFieldValue(field, value) {
|
||||||
value = this.normalizeChangeFieldValue(value);
|
value = this.normalizeChangeFieldValue(value);
|
||||||
if (value === undefined || value === null || value === '' || value === '-1') return '空';
|
if (value === undefined || value === null || value === '' || value === '-1') return '空';
|
||||||
@@ -2006,7 +2113,11 @@ export default {
|
|||||||
审核状态: 'approvalStatus',
|
审核状态: 'approvalStatus',
|
||||||
状态: 'status',
|
状态: 'status',
|
||||||
客户类型: 'customerType',
|
客户类型: 'customerType',
|
||||||
|
客商材料: 'qualificationAttachments',
|
||||||
}[field] || field;
|
}[field] || field;
|
||||||
|
if (['qualificationAttachments', 'customerAttachments'].includes(normalizedField)) {
|
||||||
|
return this.formatAttachmentChangeValue(value);
|
||||||
|
}
|
||||||
if (normalizedField === '评分信息' || normalizedField === 'scores') {
|
if (normalizedField === '评分信息' || normalizedField === 'scores') {
|
||||||
return this.formatScoreChangeValue(value) || '空';
|
return this.formatScoreChangeValue(value) || '空';
|
||||||
}
|
}
|
||||||
@@ -2036,6 +2147,39 @@ export default {
|
|||||||
if (typeof value === 'object') return JSON.stringify(value);
|
if (typeof value === 'object') return JSON.stringify(value);
|
||||||
return String(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) {
|
formatChangeContent(row) {
|
||||||
const beforeData = this.parseChangeData(row.beforeData);
|
const beforeData = this.parseChangeData(row.beforeData);
|
||||||
const afterData = this.parseChangeData(row.afterData);
|
const afterData = this.parseChangeData(row.afterData);
|
||||||
@@ -2047,8 +2191,11 @@ export default {
|
|||||||
!(this.isEmptyChangeValue(beforeData[field]) && this.isEmptyChangeValue(afterData[field]))
|
!(this.isEmptyChangeValue(beforeData[field]) && this.isEmptyChangeValue(afterData[field]))
|
||||||
)
|
)
|
||||||
.map(field => {
|
.map(field => {
|
||||||
const before = this.formatChangeFieldValue(field, beforeData[field]);
|
const scoreDiff = this.isScoreChangeField(field)
|
||||||
const after = this.formatChangeFieldValue(field, afterData[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}`;
|
return `${this.getChangeFieldLabel(field)}:变更前:${before} → 变更后:${after}`;
|
||||||
});
|
});
|
||||||
const content = String(row.changeContent || '').trim();
|
const content = String(row.changeContent || '').trim();
|
||||||
@@ -3168,6 +3315,9 @@ export default {
|
|||||||
},
|
},
|
||||||
resetArchive() {
|
resetArchive() {
|
||||||
this.readonly = false;
|
this.readonly = false;
|
||||||
|
this.changeRecordDetailVisible = false;
|
||||||
|
this.changeRecordDetail = null;
|
||||||
|
this.changeRecordDetailRows = [];
|
||||||
this.archiveForm = this.emptyArchive();
|
this.archiveForm = this.emptyArchive();
|
||||||
this.originalAccessType = '';
|
this.originalAccessType = '';
|
||||||
this.qualificationFiles = [];
|
this.qualificationFiles = [];
|
||||||
@@ -4284,6 +4434,27 @@ export default {
|
|||||||
word-break: break-word;
|
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) {
|
:deep(.archive-dialog .el-dialog__body) {
|
||||||
max-height: 72vh;
|
max-height: 72vh;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
|||||||
Reference in New Issue
Block a user