Merge remote-tracking branch 'websoft/dev'
This commit is contained in:
+41
-7
@@ -139,9 +139,23 @@ const CERT_SNAPSHOT_GROUPS = {
|
|||||||
{
|
{
|
||||||
title: '从业资格证信息',
|
title: '从业资格证信息',
|
||||||
fields: [
|
fields: [
|
||||||
|
{ key: 'qualificationType', label: '从业资格认证类型' },
|
||||||
{ key: 'qualificationNo', label: '从业资格证号' },
|
{ key: 'qualificationNo', label: '从业资格证号' },
|
||||||
{ key: 'qualificationUrl', label: '从业资格证照片', type: TYPE_IMAGE },
|
{
|
||||||
{ key: 'qualificationValidEnd', label: '从业资格证有效期止', type: TYPE_DATE },
|
key: 'qualificationFront',
|
||||||
|
label: '从业资格证封面页',
|
||||||
|
type: TYPE_IMAGE,
|
||||||
|
legacyKeys: ['qualificationUrl'],
|
||||||
|
},
|
||||||
|
{ key: 'qualificationBack', label: '从业资格证内容页', type: TYPE_IMAGE },
|
||||||
|
{ key: 'qualificationValidStart', label: '从业资格证有效期起', type: TYPE_DATE },
|
||||||
|
{
|
||||||
|
key: 'qualificationValidEnd',
|
||||||
|
label: '从业资格证有效期止',
|
||||||
|
type: TYPE_DATE,
|
||||||
|
longTermKey: 'qualificationLongTerm',
|
||||||
|
},
|
||||||
|
{ key: 'qualificationLongTerm', label: '从业资格证长期有效', type: TYPE_LONG_TERM },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@@ -268,9 +282,28 @@ const normalizeDate = value => {
|
|||||||
return text;
|
return text;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 取字段值,兼容字段改名前的旧键
|
||||||
|
*
|
||||||
|
* 后端把某字段改名后,改名之前提交的记录里存的仍是旧键(例:从业资格证封面页
|
||||||
|
* 由 `qualificationUrl` 改为 `qualificationFront`)。只读新键会得到空,
|
||||||
|
* 审核页就把已填的封面页显示成「—」,误导审核员以为对方没传。
|
||||||
|
* 新旧键都存在时以新键为准。
|
||||||
|
*/
|
||||||
|
const readFieldValue = (snapshot, field) => {
|
||||||
|
if (!snapshot) return undefined;
|
||||||
|
const value = snapshot[field.key];
|
||||||
|
if (!isEmptyValue(value)) return value;
|
||||||
|
const legacyKeys = field.legacyKeys || [];
|
||||||
|
for (let i = 0; i < legacyKeys.length; i += 1) {
|
||||||
|
if (!isEmptyValue(snapshot[legacyKeys[i]])) return snapshot[legacyKeys[i]];
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
|
||||||
/** 比较用的归一化取值:展示相同即视为未变更 */
|
/** 比较用的归一化取值:展示相同即视为未变更 */
|
||||||
const canonicalOf = (snapshot, field) => {
|
const canonicalOf = (snapshot, field) => {
|
||||||
const value = snapshot ? snapshot[field.key] : undefined;
|
const value = readFieldValue(snapshot, field);
|
||||||
if (field.type === TYPE_LONG_TERM) {
|
if (field.type === TYPE_LONG_TERM) {
|
||||||
if (isEmptyValue(value)) return '';
|
if (isEmptyValue(value)) return '';
|
||||||
return isLongTermOn(value) ? '1' : '0';
|
return isLongTermOn(value) ? '1' : '0';
|
||||||
@@ -286,7 +319,7 @@ const canonicalOf = (snapshot, field) => {
|
|||||||
|
|
||||||
/** 展示文案:日期型受「长期有效」影响,图片型返回 URL 由组件渲染缩略图 */
|
/** 展示文案:日期型受「长期有效」影响,图片型返回 URL 由组件渲染缩略图 */
|
||||||
const textOf = (snapshot, field) => {
|
const textOf = (snapshot, field) => {
|
||||||
const value = snapshot ? snapshot[field.key] : undefined;
|
const value = readFieldValue(snapshot, field);
|
||||||
if (field.type === TYPE_IMAGE) {
|
if (field.type === TYPE_IMAGE) {
|
||||||
return isEmptyValue(value) ? '' : String(value);
|
return isEmptyValue(value) ? '' : String(value);
|
||||||
}
|
}
|
||||||
@@ -323,11 +356,11 @@ const buildRow = (field, pendingSnapshot, effectiveSnapshot, hasBaseline) => {
|
|||||||
label: field.label,
|
label: field.label,
|
||||||
type,
|
type,
|
||||||
effective: {
|
effective: {
|
||||||
raw: effectiveSnapshot ? effectiveSnapshot[field.key] : undefined,
|
raw: readFieldValue(effectiveSnapshot, target),
|
||||||
text: textOf(effectiveSnapshot, target),
|
text: textOf(effectiveSnapshot, target),
|
||||||
},
|
},
|
||||||
pending: {
|
pending: {
|
||||||
raw: pendingSnapshot ? pendingSnapshot[field.key] : undefined,
|
raw: readFieldValue(pendingSnapshot, target),
|
||||||
text: textOf(pendingSnapshot, target),
|
text: textOf(pendingSnapshot, target),
|
||||||
},
|
},
|
||||||
changed: Boolean(changeType),
|
changed: Boolean(changeType),
|
||||||
@@ -363,7 +396,8 @@ export const buildSnapshotDiff = (bizType, pendingJson, effectiveJson) => {
|
|||||||
|
|
||||||
const groups = groupsConfig.map(group => {
|
const groups = groupsConfig.map(group => {
|
||||||
const rows = group.fields.map(field => {
|
const rows = group.fields.map(field => {
|
||||||
knownKeys.push(field.key);
|
// 旧键已由所属字段并入展示,不能再作为独立字段出现,否则同一张封面页会出现两行
|
||||||
|
knownKeys.push(field.key, ...(field.legacyKeys || []));
|
||||||
return buildRow(field, pending.value, effective.value, hasBaseline);
|
return buildRow(field, pending.value, effective.value, hasBaseline);
|
||||||
});
|
});
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -42,6 +42,12 @@
|
|||||||
<el-descriptions-item label="认证类型">
|
<el-descriptions-item label="认证类型">
|
||||||
{{ bizTypeLabel }}
|
{{ bizTypeLabel }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="审核人">
|
||||||
|
{{ detail.auditUserName || '-' }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item :label="auditTimeLabel">
|
||||||
|
{{ detail.auditTime ? formatCertDateTime(detail.auditTime) : '-' }}
|
||||||
|
</el-descriptions-item>
|
||||||
</el-descriptions>
|
</el-descriptions>
|
||||||
</section-card>
|
</section-card>
|
||||||
|
|
||||||
@@ -149,6 +155,13 @@ export default {
|
|||||||
statusTag() {
|
statusTag() {
|
||||||
return certStatusTag(this.detail.status);
|
return certStatusTag(this.detail.status);
|
||||||
},
|
},
|
||||||
|
// 审核时间一栏按审核结论换标签:还在「审核中」的记录没有结论,不能写成通过或驳回时间
|
||||||
|
auditTimeLabel() {
|
||||||
|
const status = String(this.detail.status);
|
||||||
|
if (status === String(CERT_RECORD_STATUS.APPROVED)) return '审核通过时间';
|
||||||
|
if (status === String(CERT_RECORD_STATUS.REJECTED)) return '审核驳回时间';
|
||||||
|
return '审核时间';
|
||||||
|
},
|
||||||
// 只有「审核中」的记录可审;已通过/已驳回/已作废都是终态
|
// 只有「审核中」的记录可审;已通过/已驳回/已作废都是终态
|
||||||
auditable() {
|
auditable() {
|
||||||
return String(this.detail.status) === String(CERT_RECORD_STATUS.PENDING);
|
return String(this.detail.status) === String(CERT_RECORD_STATUS.PENDING);
|
||||||
|
|||||||
Reference in New Issue
Block a user