刘光辉
9 小时以前 0dfe84494048ce27ba8449831782128412d3eb13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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;
}