🐛 从业资格证字段改名后审核页兼容旧键,补全封面/内容页与有效期起止

从业资格证信息组原先只列证号、照片、有效期止三项,且照片用的是字段改名前的旧键
qualificationUrl。改名之前提交的记录里仍存旧键,只读新键会得到空值,审核页把已填的
封面页显示成「—」,审核员据此以为对方没传材料。现按 VehicleCertSubmitRequest 的
字段名补全该组,并新增 readFieldValue 统一兼容旧键,新旧键并存时以新键为准。

旧键已并入所属字段展示,knownKeys 同步登记,避免同一张封面页出现两行。
This commit is contained in:
2026-10-09 10:01:19 +08:00
parent 3320155416
commit 2500540933
+41 -7
View File
@@ -139,9 +139,23 @@ const CERT_SNAPSHOT_GROUPS = {
{
title: '从业资格证信息',
fields: [
{ key: 'qualificationType', 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;
};
/**
* 取字段值,兼容字段改名前的旧键
*
* 后端把某字段改名后,改名之前提交的记录里存的仍是旧键(例:从业资格证封面页
* 由 `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 value = snapshot ? snapshot[field.key] : undefined;
const value = readFieldValue(snapshot, field);
if (field.type === TYPE_LONG_TERM) {
if (isEmptyValue(value)) return '';
return isLongTermOn(value) ? '1' : '0';
@@ -286,7 +319,7 @@ const canonicalOf = (snapshot, field) => {
/** 展示文案:日期型受「长期有效」影响,图片型返回 URL 由组件渲染缩略图 */
const textOf = (snapshot, field) => {
const value = snapshot ? snapshot[field.key] : undefined;
const value = readFieldValue(snapshot, field);
if (field.type === TYPE_IMAGE) {
return isEmptyValue(value) ? '' : String(value);
}
@@ -323,11 +356,11 @@ const buildRow = (field, pendingSnapshot, effectiveSnapshot, hasBaseline) => {
label: field.label,
type,
effective: {
raw: effectiveSnapshot ? effectiveSnapshot[field.key] : undefined,
raw: readFieldValue(effectiveSnapshot, target),
text: textOf(effectiveSnapshot, target),
},
pending: {
raw: pendingSnapshot ? pendingSnapshot[field.key] : undefined,
raw: readFieldValue(pendingSnapshot, target),
text: textOf(pendingSnapshot, target),
},
changed: Boolean(changeType),
@@ -363,7 +396,8 @@ export const buildSnapshotDiff = (bizType, pendingJson, effectiveJson) => {
const groups = groupsConfig.map(group => {
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 {