import { cloneDeep } from 'lodash-es';
|
|
export function isDisplayOnlyField(field: any) {
|
return field?.__config__?.isDisplayOnly === true;
|
}
|
|
export function isVirtualField(field: any) {
|
return field?.__config__?.isVirtualField === true;
|
}
|
|
export function isVirtualTable(field: any) {
|
return field?.__config__?.jnpfKey === 'table' && isVirtualField(field);
|
}
|
|
export function getFieldDataKey(field: any) {
|
return isVirtualField(field) ? field?.controlKey : field?.__vModel__;
|
}
|
|
function getDefaultVirtualFieldKey(field: any) {
|
if (field?.controlKey || field?.__vModel__) return field.controlKey || field.__vModel__;
|
const formId = field?.__config__?.formId || '';
|
return `${field?.__config__?.jnpfKey || 'field'}Field${formId.replace('formItem', '')}`;
|
}
|
|
export function setVirtualField(field: any, enabled: boolean, inherited = false) {
|
const config = field?.__config__;
|
if (!config) return;
|
if (enabled) {
|
const wasVirtual = isVirtualField(field);
|
field.controlKey = getDefaultVirtualFieldKey(field);
|
field.__vModel__ = '';
|
config.isVirtualField = true;
|
config.isDisplayOnly = false;
|
config.biz_log_enabled = false;
|
if (inherited && !wasVirtual) config.isVirtualFieldInherited = true;
|
return;
|
}
|
config.isVirtualField = false;
|
config.isVirtualFieldInherited = false;
|
field.controlKey = '';
|
}
|
|
export function setVirtualTable(table: any, enabled: boolean) {
|
const config = table?.__config__;
|
if (!config || config.jnpfKey !== 'table') return;
|
const children = Array.isArray(config.children) ? config.children : [];
|
if (enabled) {
|
setVirtualField(table, true);
|
config.tableName = '';
|
for (const child of children) {
|
setVirtualField(child, true, true);
|
child.__config__.isSubTable = true;
|
child.__config__.parentVModel = table.controlKey;
|
child.__config__.relationTable = '';
|
}
|
return;
|
}
|
const tableDataKey = getFieldDataKey(table);
|
setVirtualField(table, false);
|
table.__vModel__ = tableDataKey || '';
|
for (const child of children) {
|
child.__config__.parentVModel = table.__vModel__;
|
child.__config__.relationTable = '';
|
if (!child.__config__.isVirtualFieldInherited) continue;
|
setVirtualField(child, false);
|
child.__vModel__ = '';
|
}
|
}
|
|
/**
|
* 虚拟字段在设计数据中不占用数据库字段,运行时使用 controlKey 作为表单数据键。
|
*/
|
export function normalizeVirtualFields(fields: any[]) {
|
if (!Array.isArray(fields)) return;
|
for (const field of fields) {
|
const config = field?.__config__;
|
if (!config) continue;
|
if (isVirtualField(field)) {
|
field.controlKey = getDefaultVirtualFieldKey(field);
|
field.__vModel__ = field.controlKey;
|
if (config.jnpfKey === 'table' && Array.isArray(config.children)) {
|
for (const child of config.children) {
|
setVirtualField(child, true, true);
|
child.__config__.parentVModel = field.__vModel__;
|
}
|
}
|
}
|
if (Array.isArray(config.children)) normalizeVirtualFields(config.children);
|
}
|
}
|
|
/**
|
* 从提交副本中移除仅展示字段。布局沿用当前数据层级,子表按行继续处理。
|
*/
|
export function buildDisplayOnlySubmitData(fields: any[], formData: any) {
|
const data = cloneDeep(formData || {});
|
|
function walk(fieldList: any[], currentData: any) {
|
if (!Array.isArray(fieldList) || !currentData || typeof currentData !== 'object') return;
|
for (const field of fieldList) {
|
const config = field?.__config__;
|
if (!config) continue;
|
const vModel = getFieldDataKey(field);
|
if ((isDisplayOnlyField(field) || isVirtualField(field)) && vModel) {
|
delete currentData[vModel];
|
continue;
|
}
|
if (!Array.isArray(config.children)) continue;
|
if (config.jnpfKey === 'table' && vModel) {
|
const rows = currentData[vModel];
|
if (Array.isArray(rows)) {
|
rows.forEach((row) => walk(config.children, row));
|
}
|
} else {
|
walk(config.children, currentData);
|
}
|
}
|
}
|
|
walk(fields, data);
|
return data;
|
}
|