cloud-web-corejs 1.1.0-dev.19 → 1.1.0-dev.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/components/baseInputExport/mixins.js +0 -6
- package/src/components/xform/docs/2026-09 /345/212/250/346/200/201/345/255/227/346/256/265/350/247/204/345/210/231/344/270/216/346/265/201/347/250/213/346/216/247/345/210/266/346/211/247/350/241/214/351/241/272/345/272/217/350/220/275/345/234/260/346/226/271/346/241/210.md" +409 -0
- package/src/components/xform/form-designer/designer.js +2101 -2084
- package/src/components/xform/form-designer/form-widget/dialog/importDialogMixin.js +34 -0
- package/src/components/xform/form-designer/form-widget/field-widget/fieldMixin.js +13 -1
- package/src/components/xform/form-designer/setting-panel/form-dynamicField-setting.vue +660 -602
- package/src/components/xform/form-designer/setting-panel/property-editor/field-import-button/import2-button-editor.vue +8 -0
- package/src/components/xform/form-render/container-item/data-table-mixin.js +6306 -6285
- package/src/components/xform/form-render/container-item/dynamicFieldMixin.js +54 -0
- package/src/components/xform/form-render/container-item/tab-item.vue +138 -129
- package/src/components/xform/form-render/fieldControlEngine.js +200 -0
- package/src/components/xform/form-render/fieldControlMixin.js +524 -0
- package/src/components/xform/form-render/formDynamicFieldMixin.js +2 -0
- package/src/components/xform/form-render/index.vue +161 -153
- package/src/components/xform/form-render/indexMixin.js +5404 -5331
- package/src/components/xform/mixins/defaultHandle.js +713 -707
- package/src/components/xform/utils/util.js +1711 -1708
package/package.json
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { getToken } from "../../utils/auth";
|
|
2
1
|
import { openCnPrint } from "../../components/cnPrint/index";
|
|
3
2
|
import { openHiPrint } from "../../components/hiprint/index";
|
|
4
3
|
import { openJdPrint } from "../../components/jdPrint/index";
|
|
@@ -7,10 +6,6 @@ import { openVipPrint } from "../../components/vipPrint/index";
|
|
|
7
6
|
import { openXhsPrint } from "../../components/xhsPrint/index";
|
|
8
7
|
|
|
9
8
|
let modules;
|
|
10
|
-
let configUtil = {
|
|
11
|
-
baseUrl: process.env.VUE_APP_BASE_API,
|
|
12
|
-
getToken,
|
|
13
|
-
};
|
|
14
9
|
|
|
15
10
|
modules = {
|
|
16
11
|
props: ["parentTarget", "option"],
|
|
@@ -390,7 +385,6 @@ modules = {
|
|
|
390
385
|
realFileName = fileName ? fileName + "-" + row.uuid : row.uuid;
|
|
391
386
|
}
|
|
392
387
|
let fileUrl =
|
|
393
|
-
configUtil.baseUrl +
|
|
394
388
|
that.option.prefix +
|
|
395
389
|
"/export_ins/download?uuid=" +
|
|
396
390
|
row.uuid +
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
# 动态字段规则与流程控制执行顺序落地方案
|
|
2
|
+
|
|
3
|
+
日期:2026-09-07
|
|
4
|
+
状态:待业务语义确认的实施草案。仅生成方案,未修改业务代码。
|
|
5
|
+
范围:当前工作区 xform 动态规则、流程字段控制、动态生成字段及保存校验入口。
|
|
6
|
+
|
|
7
|
+
## 1. 结论与已明确的方向
|
|
8
|
+
|
|
9
|
+
采用用户提出的执行顺序:进入详情页,先执行一遍动态字段规则,再执行流程规则;首次执行完成后停止动态规则自动重算,并支持配置让动态规则继续生效。
|
|
10
|
+
|
|
11
|
+
该方案适合现有架构。动态规则先计算单据业务状态,流程在后面覆盖当前节点需要控制的属性。两套规则不再独立监听、分别修改组件。
|
|
12
|
+
|
|
13
|
+
必须明确:
|
|
14
|
+
|
|
15
|
+
1. “停止生效”指停止监听和重新计算,保留首次结果,不撤销已设置的显示、必填等状态。
|
|
16
|
+
2. “持续生效”指每一轮均执行“动态规则 → 流程规则 → 应用最终状态”,不能只重新执行动态规则。
|
|
17
|
+
3. “执行一遍”必须等待后台脚本返回、结果应用及组件更新;请求发出不代表完成。
|
|
18
|
+
4. 流程不控制全部属性。流程实际写入的属性以后执行的结果为准,其余属性保留动态结果。
|
|
19
|
+
5. 初始化尚未完成时不能允许用户编辑或提交,避免出现流程限制尚未应用的操作空档。
|
|
20
|
+
|
|
21
|
+
此前审查提出的“动态规则只能收紧权限”不再作为本方案默认前提。严格顺序覆盖与限制合并是两种业务语义,按 C2 确认结果实施。
|
|
22
|
+
|
|
23
|
+
## 2. 待确认事项
|
|
24
|
+
|
|
25
|
+
以下均未视为已经批准。C1—C3 决定首期行为;C4—C7 在对应能力实施前确认。未回答不影响完善文档,但不能把推荐值自动作为生产策略。
|
|
26
|
+
|
|
27
|
+
| 编号 | 待确认问题 | 推荐方案 | 其他选择及影响 |
|
|
28
|
+
|---|---|---|---|
|
|
29
|
+
| C1 | 默认停止动态规则的范围 | 已有流程的单据仅初始化;无流程单据保持正常字段联动 | 所有详情页仅初始化,会让新建/未提交单据的编辑详情也停止联动 |
|
|
30
|
+
| C2 | 字段节点“可编辑”能否放开动态隐藏、禁用 | 按用户提出的严格顺序,允许流程实际写入的属性覆盖动态结果 | 若必须保留业务隐藏/禁用,需做限制合并,不能只调整执行顺序 |
|
|
31
|
+
| C3 | 首次后台规则失败、超时如何处理 | 应用已知流程限制,保留输入,阻止编辑/提交并允许重试 | 按模板状态降级继续,可能缺少业务必填/显隐,需要限定模板与操作 |
|
|
32
|
+
| C4 | 后台状态恢复语义 | 四个状态属性使用快照语义,未返回的属性恢复本周期基线 | 补丁语义需要显式恢复操作,最终结果会依赖历史请求 |
|
|
33
|
+
| C5 | 持续模式是否自动写 value/options | 首期聚焦四个状态;既有写值按模板盘点,明确覆盖条件并防循环;不因隐藏而自动清空用户值 | 任意自动赋值会触发 onChange、二次请求和用户输入覆盖 |
|
|
34
|
+
| C6 | 首期是否包含明细行/列级规则 | 首期支持主表字段、布局字段、命名容器及动态生成的主表字段;明细行目标另阶段实施 | 若首期必须覆盖行级,需增加表、列、稳定行身份及对应校验 |
|
|
35
|
+
| C7 | 历史模板迁移方式 | 增加语义版本,按模板迁移,优先有流程且启用动态规则的模板 | 全量切换会同时改变联动频率、属性恢复和权限覆盖结果 |
|
|
36
|
+
|
|
37
|
+
另需核对既有流程语义:活跃方法 hanldeWfWidgetItemNew() 目前只处理 type=1,“仅显示/隐藏”的 type=2/3 分支被注释。本次不自行恢复;若产品仍要求它们有效,应确认后另列实现与测试。
|
|
38
|
+
|
|
39
|
+
## 3. 当前实现与问题
|
|
40
|
+
|
|
41
|
+
### 3.1 当前顺序
|
|
42
|
+
|
|
43
|
+
单据和 wfParam 就绪 → hanldeCommonWidget2()(列准备、组件显隐、流程通用控制、节点放开)→ handleShowContent() → 字段渲染 → formDynamicFieldMixin 收集基线 → 动态规则覆盖状态 → 注册数据 watcher。
|
|
44
|
+
|
|
45
|
+
这与目标顺序相反。仅把函数调用位置交换仍不够:
|
|
46
|
+
|
|
47
|
+
- 动态规则依赖渲染后的 ref,后台方法尚未提供可等待的完整任务。
|
|
48
|
+
- “设计基线”取自已被流程修改的 schema。
|
|
49
|
+
- hanldeCommonWidget2 混合了列准备、非流程显隐和流程处理,不能直接把整个方法当成每轮流程收尾。
|
|
50
|
+
- 保存/流程校验没有等待防抖或后台计算完成。
|
|
51
|
+
|
|
52
|
+
### 3.2 已核实问题及处理
|
|
53
|
+
|
|
54
|
+
| 问题 | 原因 | 方案 |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| 动态覆盖流程状态 | 动态在流程之后直接执行 setter | 统一动态 → 流程管线 |
|
|
57
|
+
| 提交使用旧必填 | 120ms 防抖和后台请求未被等待 | 提交就绪检查及版本复核 |
|
|
58
|
+
| 旧请求覆盖新状态 | 无请求序号、生命周期检查 | 多版本有效性判断 |
|
|
59
|
+
| 异步字段不受控 | 映射只建立一次 | 结构就绪和目标注册 |
|
|
60
|
+
| 清空“不变”变为 false | 空字符串被布尔强转 | 规范化配置、严格类型 |
|
|
61
|
+
| 后台属性残留 | 仅目标缺失恢复,属性缺失不恢复 | 快照/补丁协议明确化 |
|
|
62
|
+
| 对象变化不触发 | join 将对象变成相同字符串 | 保留原始值类型的依赖监听 |
|
|
63
|
+
| 标签项可选但无效 | 设计器包含 tab-pane,运行时跳过 | 共用目标遍历与能力描述 |
|
|
64
|
+
| options 静默不生效 | 引擎调用 setOptions,通用组件提供 setOptionItems/loadOptions | 显式组件能力适配 |
|
|
65
|
+
|
|
66
|
+
上一轮通过只读追踪与 9 个内存最小场景核实核心行为;未完成真实审批页面、后台脚本联调。本文所有新接口均为拟议接口。
|
|
67
|
+
|
|
68
|
+
## 4. 配置设计
|
|
69
|
+
|
|
70
|
+
### 4.1 配置粒度
|
|
71
|
+
|
|
72
|
+
保留 dynamicFieldEnabled、dynamicFieldSourceType、本地规则、后台脚本、额外参数、触发字段。
|
|
73
|
+
|
|
74
|
+
建议新增:
|
|
75
|
+
|
|
76
|
+
- dynamicFieldRuleVersion:新语义版本,建议值 2。
|
|
77
|
+
- dynamicFieldRunMode:auto / initialOnly / continuous。
|
|
78
|
+
|
|
79
|
+
采用一个枚举,不增加多个互相影响的布尔开关。关闭动态规则与初始化后停止是不同状态。
|
|
80
|
+
|
|
81
|
+
按 C1 推荐方案:
|
|
82
|
+
|
|
83
|
+
| 启用开关 | 模式 | hasWf | 行为 |
|
|
84
|
+
|---|---|---|---|
|
|
85
|
+
| false | 任意 | 任意 | 不计算动态规则,正常执行其他控制 |
|
|
86
|
+
| true | auto | true | 首次动态 → 流程,之后停止自动重算 |
|
|
87
|
+
| true | auto | false | 初始化后保持字段依赖联动 |
|
|
88
|
+
| true | initialOnly | 任意 | 当前生命周期仅初始化一次 |
|
|
89
|
+
| true | continuous | 任意 | 每轮动态 → 流程 |
|
|
90
|
+
|
|
91
|
+
hasWf=false 必须是流程查询完成后的确定结果,不能把“尚未返回”当成“无流程”。
|
|
92
|
+
|
|
93
|
+
设计器展示“动态规则执行方式”:按场景默认、仅初始化、持续生效。提示默认适用范围,以及“每轮流程规则均在动态规则之后执行”。
|
|
94
|
+
|
|
95
|
+
首期整张表单配置;不增加逐规则、逐节点运行方式,以免多套监听和优先级交叉。
|
|
96
|
+
|
|
97
|
+
### 4.2 后台触发字段为空
|
|
98
|
+
|
|
99
|
+
现有语义是仅初始化请求。迁移时建议保留:continuous 但触发字段为空,数据编辑不自动请求,流程上下文明确刷新时可以重算。设计器提示该行为。
|
|
100
|
+
|
|
101
|
+
若要求 continuous 自动监听全部数据,应显式增加“全部业务数据”选项并确认性能,不默默扩大请求次数。
|
|
102
|
+
|
|
103
|
+
## 5. 状态模型与覆盖语义
|
|
104
|
+
|
|
105
|
+
### 5.1 分离四类状态
|
|
106
|
+
|
|
107
|
+
| 状态 | 定义 |
|
|
108
|
+
|---|---|
|
|
109
|
+
| definitionState | 模板/后台字段定义中原始四个状态 |
|
|
110
|
+
| baseState | 当前非流程组件显隐处理后的业务基线 |
|
|
111
|
+
| dynamicState | 从 baseState 计算的动态结果;一次模式保存它 |
|
|
112
|
+
| effectiveState | 动态结果经过流程及整单模式处理的最终结果 |
|
|
113
|
+
|
|
114
|
+
统一计算顺序:
|
|
115
|
+
|
|
116
|
+
definitionState → 非流程组件显隐 → baseState → 动态计算或冻结结果 → 流程通用/节点规则 → 整单只读等系统限制 → effectiveState → UI/校验。
|
|
117
|
+
|
|
118
|
+
不能从当前 options 的 hidden/disabled 推断状态来源。重新计算时也不能把上次 effectiveState 当成基线,否则取消规则或切换流程节点后旧状态无法恢复。
|
|
119
|
+
|
|
120
|
+
若角色显隐属于不可突破的访问限制,需要单独记录并作为最终约束;若只是展示偏好则可作为业务基线。此边界在 C2 确认时一起明确,不能把所有 hidden=true 当作权限隐藏。
|
|
121
|
+
|
|
122
|
+
现有 hanldeCommonWidget2 应拆分准备、非流程规则、流程规则与落地。流程判断条件尽量保持现状;计算仅操作轻量状态投影,不逐次深拷贝整个表单、表格数据或 fieldSchemaMap。
|
|
123
|
+
|
|
124
|
+
### 5.2 严格顺序下的结果示例
|
|
125
|
+
|
|
126
|
+
| 动态结果 | 流程实际操作 | 最终结果 |
|
|
127
|
+
|---|---|---|
|
|
128
|
+
| disabled=false | 通用禁用写 true | 禁用 |
|
|
129
|
+
| disabled=true | 字段节点可编辑写 false | 启用 |
|
|
130
|
+
| visible=false | 字段节点可编辑写 hidden=false | 显示 |
|
|
131
|
+
| required=true | 流程不写 required | 仍必填 |
|
|
132
|
+
| readonly=true | 流程只写 disabled=false | 仍只读 |
|
|
133
|
+
| disabled=true | 全局可编辑只跳过通用禁用 | 仍禁用 |
|
|
134
|
+
|
|
135
|
+
最后一行是现有实现的重要区别:全局可编辑分支是跳过限制,字段级可编辑是实际写入 false,不能未经确认统一成“清空全部动态限制”。
|
|
136
|
+
|
|
137
|
+
### 5.3 UI 与校验落地
|
|
138
|
+
|
|
139
|
+
先计算最终结果,再批量应用发生变化的属性,避免先启用再禁用的瞬时状态、闪烁和重复校验构建。
|
|
140
|
+
|
|
141
|
+
有效可见性包含字段自身和祖先容器。隐藏容器后,子字段的 setRequired/buildFieldRules 不应重新建立不可见字段的有效校验。
|
|
142
|
+
|
|
143
|
+
required 与是否参与当前校验分离。隐藏时跳过有效校验,不永久修改 required;恢复显示时按最终状态恢复。禁用/只读字段是否跳过必填先保留已有业务口径,单独验收“流程锁定且缺必填”场景。
|
|
144
|
+
|
|
145
|
+
整单只读不等于无差别禁用所有组件,保留查看、下载等既有能力判定。
|
|
146
|
+
|
|
147
|
+
## 6. 初始化和生命周期
|
|
148
|
+
|
|
149
|
+
### 6.1 首次进入详情
|
|
150
|
+
|
|
151
|
+
1. 进入 preparing,显示加载状态,阻挡编辑和提交。
|
|
152
|
+
2. 模板、单据、必要身份信息和流程上下文就绪。
|
|
153
|
+
3. 默认值、初始化数据脚本及首屏必要动态字段结构完成。
|
|
154
|
+
4. 注册目标,采集未被运行时规则改写的定义状态。
|
|
155
|
+
5. 计算并等待首次动态结果。
|
|
156
|
+
6. 执行流程规则,应用最终状态。
|
|
157
|
+
7. 等待组件更新、校验同步,进入 ready。
|
|
158
|
+
8. initialOnly 不注册数据 watcher;continuous 此时才注册。
|
|
159
|
+
|
|
160
|
+
准备期阻挡操作使用独立状态,不能调用会污染基线的 disableForm() 再尝试恢复。
|
|
161
|
+
|
|
162
|
+
计算尽量不依赖 ref;必须先挂载的组件在 preparing 状态下完成挂载和同步。对不可见懒加载组件不无限等待全部 ref。
|
|
163
|
+
|
|
164
|
+
onFormMounted/onChange 中会改数据的模板需要盘点。异步初始化必须有可等待任务,不能用固定延时猜测完成;也不能让初始化规则在默认值尚未稳定时先执行。
|
|
165
|
+
|
|
166
|
+
### 6.2 initialOnly
|
|
167
|
+
|
|
168
|
+
- 首次成功后保存 dynamicState,不监听普通数据修改。
|
|
169
|
+
- 后续改值、保存、校验不重新计算动态规则。
|
|
170
|
+
- 首次 value 引发 onChange 时,不使规则再次初始化。
|
|
171
|
+
- 流程上下文刷新仍重新执行流程规则,输入使用冻结的 dynamicState。
|
|
172
|
+
- ref 重挂载只重新应用状态,不发新动态请求。
|
|
173
|
+
- 表单身份、配置或结构明确重初始化时才开启新周期,不能因普通 nextTick 重置标志。
|
|
174
|
+
- 初始化失败不计为成功执行一次;用户重试可开启新计算序号。
|
|
175
|
+
|
|
176
|
+
### 6.3 continuous
|
|
177
|
+
|
|
178
|
+
依赖变化 → dirty → 防抖 → 动态计算 → 流程计算 → 一次性应用最终状态。
|
|
179
|
+
|
|
180
|
+
- 本地从条件提取依赖;后台保留触发值原始类型,不能 join 字符串。
|
|
181
|
+
- 每轮从稳定 baseState 计算,规则未命中可恢复。
|
|
182
|
+
- 流程上下文变化也使状态过期,重选模式并清理旧监听。
|
|
183
|
+
- auto 从无流程进入有流程,按新的流程阶段完整计算后冻结;现有宿主若已重挂载,就复用重挂载,不额外重复一轮。
|
|
184
|
+
- 依赖监听只决定动态计算是否过期;提交数据本身是否变化需单独追踪。
|
|
185
|
+
|
|
186
|
+
### 6.4 动态结构及表单替换
|
|
187
|
+
|
|
188
|
+
- 首次必要动态结构是 preparing 的就绪任务,失败/超时不能把缺字段的表单标为 ready。
|
|
189
|
+
- 结构生成后更新目标、定义基线、父子关系,进入统一管线。
|
|
190
|
+
- schema 已存在但 ref 未挂载时缓存最终状态,ref 注册后应用。
|
|
191
|
+
- 一次模式完成后显式 loadDynamicSchema() 产生全新字段,建议将此定义为结构重初始化:阻挡操作,对新结构重新执行动态 → 流程。API 文档需明确,这是一次模式的生命周期边界,不是普通字段变化。
|
|
192
|
+
- setFormJson() 销毁旧监听、timer、请求有效版本和映射,再开启新周期。
|
|
193
|
+
- beforeDestroy() 必须让在途结果失效,仅清 timer 不够。
|
|
194
|
+
|
|
195
|
+
## 7. 异步调度与失败策略
|
|
196
|
+
|
|
197
|
+
### 7.1 拟议内部接口
|
|
198
|
+
|
|
199
|
+
| 接口 | 职责 |
|
|
200
|
+
|---|---|
|
|
201
|
+
| initializeFieldControl() | 返回动态和流程均完成的 Promise |
|
|
202
|
+
| refreshFieldControl({ reason, force }) | 显式刷新,不能绕开流程 |
|
|
203
|
+
| ensureFieldControlReady({ operation, scope }) | 校验/提交前等待有效结果 |
|
|
204
|
+
| disposeFieldControl() | 注销监听并使旧请求失效 |
|
|
205
|
+
|
|
206
|
+
applyFormScriptStates 及上层必须返回真正完成任务。不能只判断 formHttp Promise resolve:现有 fail 分支也可能 resolve,需要检查业务成功和响应结构。
|
|
207
|
+
|
|
208
|
+
### 7.2 有效性控制
|
|
209
|
+
|
|
210
|
+
记录生命周期版本、结构版本、流程版本和计算序号。依赖一变立即使旧结果过期,不能等新请求发出才递增,否则新请求尚在防抖时旧结果仍可能落地。
|
|
211
|
+
|
|
212
|
+
返回时只有版本全部匹配才应用。等待最新有效任务,不能因旧请求完成就放行提交。
|
|
213
|
+
|
|
214
|
+
请求使用受控业务快照,排除 Vue 实例等非业务对象,不持有会随用户继续输入而变化的引用。大表按声明依赖控制负载,不复制整套渲染 schema。
|
|
215
|
+
|
|
216
|
+
### 7.3 失败与重试
|
|
217
|
+
|
|
218
|
+
按 C3 推荐:进入 error,保留输入和最后可信状态,应用已知流程限制,阻止本次编辑/提交,提供提示和重试。不能恢复成可编辑基线并伪装成功。
|
|
219
|
+
|
|
220
|
+
超时需有上限,具体值复用项目策略或联调确定。重试开启新序号;不得重发已成功的业务保存请求。
|
|
221
|
+
|
|
222
|
+
如果允许普通暂存降级,需要独立暂存语义和后端支持,不能令通用 validate 返回 true 达成。
|
|
223
|
+
|
|
224
|
+
## 8. 规则协议和副作用
|
|
225
|
+
|
|
226
|
+
### 8.1 本地规则
|
|
227
|
+
|
|
228
|
+
- 保留单层 AND/OR 和按列表顺序后者覆盖前者。
|
|
229
|
+
- 空条件组当前恒成立,设计器明确提示“无条件规则”;空白字段条件应报配置错误。
|
|
230
|
+
- 四个状态只接受 true/false;空字符串、null、缺失统一为未配置。
|
|
231
|
+
- “不变”表示本条规则不覆盖,不代表保持上轮结果。整轮仍从基线和全部命中规则计算。
|
|
232
|
+
- null/空字符串参与数字比较当前会按 0 处理;建议新版本改为不参与大小比较,迁移时盘点依赖旧行为的模板。
|
|
233
|
+
- 无效目标、重名、重命名后失效引用要在保存前及运行时给诊断。
|
|
234
|
+
|
|
235
|
+
### 8.2 后台四个状态
|
|
236
|
+
|
|
237
|
+
保留 objx.fieldStates 外层形状。例如:
|
|
238
|
+
|
|
239
|
+
{
|
|
240
|
+
"objx": {
|
|
241
|
+
"fieldStates": {
|
|
242
|
+
"reason": { "visible": true, "required": true },
|
|
243
|
+
"approvalSection": { "visible": false }
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
按 C4 快照方案,每次从所有有效目标的 baseState 开始,字段或属性缺失恢复基线,再交给流程计算;非法类型不能静默强转。
|
|
249
|
+
|
|
250
|
+
新版本建议显式提供必要流程 context:hasWf、taskStep、taskDefinitionKey/nodeCode、modelOrders、toModify 等。现有后台动态请求没有自动携带这些参数。扩展参数不能覆盖 formData/context;不传完整组件或无关身份数据。
|
|
251
|
+
|
|
252
|
+
额外参数脚本通过 this 访问表单。当前根 handleCustomEvent 只显式注入 dataId/formCode,设计器中裸 formModel 示例需修正为与实际上下文一致的表达式,例如 return { stage: this.formModel.status }。
|
|
253
|
+
|
|
254
|
+
### 8.3 value/options
|
|
255
|
+
|
|
256
|
+
它们是数据副作用,不套用“四状态遗漏就恢复”:
|
|
257
|
+
|
|
258
|
+
- value 缺失不赋值;null 是否清空按明确契约,不自动恢复默认值。
|
|
259
|
+
- 相同值不重复 setValue;数组/对象按字段类型比较,避免仅引用变化引起循环。
|
|
260
|
+
- options 适配 setOptionItems/loadOptions 等真实 API,不支持时有诊断。
|
|
261
|
+
- 选项移除后旧值不在列表,建议保留并提示;未经约定不静默清空。
|
|
262
|
+
- continuous 赋值触发依赖时,检测稳定状态并限制计算次数和总耗时;建议次数初值 5,超限报规则循环并阻止提交。
|
|
263
|
+
- initialOnly 不做多轮收敛:一次结果及数据同步后结束。需要 A 赋值再触发 B 的业务,应在一个脚本中完整计算或选择持续模式。
|
|
264
|
+
- 首次赋值之后的数据变化与后续流程判定顺序需确定,确保流程看到应用该次赋值后的数据。
|
|
265
|
+
|
|
266
|
+
## 9. 保存与流程提交
|
|
267
|
+
|
|
268
|
+
### 9.1 入口覆盖
|
|
269
|
+
|
|
270
|
+
| 入口 | 接入方式 | 保留行为 |
|
|
271
|
+
|---|---|---|
|
|
272
|
+
| getFormData(true) | 校验前 ensure | Promise 返回 |
|
|
273
|
+
| getFormData(false) | 保持同步读取 | 不承诺规则已完成 |
|
|
274
|
+
| validate(callback) | ensure 后原生与补充校验 | callback 仅调用一次 |
|
|
275
|
+
| validateForm(callback) | 复用同一内部校验 | 不遗漏另一公开入口 |
|
|
276
|
+
| saveDefaultHandle | payload/请求前复核版本 | 保留 formSavePending、防重、成功后重载恢复 |
|
|
277
|
+
| 流程启动/保存并提交 | 准备与确认后检查 | 不破坏前置脚本、确认和 done 顺序 |
|
|
278
|
+
| 审批绑定保存 | 复用统一入口 | 不擅自扩大未绑定保存审批的校验要求 |
|
|
279
|
+
| saveEditRow | ensure 后行范围校验 | 仅校验并提交当前行 |
|
|
280
|
+
| 自定义直接 formHttp/原生 validate | 盘点脚本,提供统一提交准备 API | 不宣称能自动拦截所有外部脚本 |
|
|
281
|
+
|
|
282
|
+
### 9.2 数据一致性
|
|
283
|
+
|
|
284
|
+
仅在点击按钮时等待一次不够,前置脚本、异步 validator 和确认框期间仍可改数据。
|
|
285
|
+
|
|
286
|
+
操作防重 → 等待规则就绪 → 校验本次 scope → 既有前置脚本/确认 → 复核数据、结构、流程版本 → 构建相同版本 payload → 请求。
|
|
287
|
+
|
|
288
|
+
若版本变更,重做必要计算、校验及 payload;有副作用的前置脚本不能自动重复执行。影响用户已确认内容的变化应中止或重新确认,不能悄悄提交另一份数据。
|
|
289
|
+
|
|
290
|
+
initialOnly 数据变化不重算动态,但仍需用冻结状态校验当前数据、等待流程就绪;“业务状态冻结”不等于放弃数据一致性。
|
|
291
|
+
|
|
292
|
+
行保存不能因为共享 ensure 就执行整单必填。规则计算范围与校验范围分离:必要时规则读取全单,校验仍只针对本行。
|
|
293
|
+
|
|
294
|
+
现有 validateEditRow 返回布尔值但内部调用带回调的 validateField,接入时必须核对异步 validator。建议新增可等待行校验入口,保留同步必填辅助函数,逐一更新调用者;不能直接把 Boolean 改为 Promise 后继续 if (!validateEditRow())。
|
|
295
|
+
|
|
296
|
+
## 10. 目标和组件范围
|
|
297
|
+
|
|
298
|
+
首期共用遍历器服务设计器与运行时:主表字段、布局字段、命名容器、tab-pane、动态主表字段;内部网格单元不独立受控。
|
|
299
|
+
|
|
300
|
+
目标记录 key、组件 name、schema、父目标、支持属性、定义状态和挂载状态。tab-pane 可以修改其 schema,不需要虚构字段 ref。
|
|
301
|
+
|
|
302
|
+
弹窗/抽屉作为独立表单生命周期,内部字段不进入父映射,设计器候选范围同步收敛。
|
|
303
|
+
|
|
304
|
+
行级能力后续采用“表标识 + 列标识 + 稳定行标识”,不使用排序后会变化的行下标作为身份。校验 prop 再转换为当前真实行下标。
|
|
305
|
+
|
|
306
|
+
可以监听明细集合影响主表目标,但不因此声称支持控制每一行的同名字段。首期不支持的目标在设计器明确禁选。
|
|
307
|
+
|
|
308
|
+
## 11. 文件改造清单
|
|
309
|
+
|
|
310
|
+
路径相对仓库根目录,以函数名定位,行号会随改动漂移。
|
|
311
|
+
|
|
312
|
+
| 文件 | 计划 |
|
|
313
|
+
|---|---|
|
|
314
|
+
| src/components/xform/form-render/formDynamicFieldMixin.js | 生命周期、模式、可等待调度、请求有效性及清理 |
|
|
315
|
+
| src/components/xform/form-render/container-item/dynamicFieldEngine.js | 状态规范化、统一遍历、纯计算与落地分离 |
|
|
316
|
+
| src/components/xform/form-render/indexMixin.js | 拆分准备/非流程/流程控制,初始化、setFormJson、流程变更、校验入口 |
|
|
317
|
+
| src/components/xform/form-render/index.vue | preparing/error/ready 与操作阻挡 |
|
|
318
|
+
| src/components/xform/form-render/container-item/dynamicFieldMixin.js | 动态结构就绪及目标注册、显式结构重初始化 |
|
|
319
|
+
| src/components/xform/form-render/container-item/data-table-mixin.js | 行保存 ensure 与异步行校验;动态列保持既有流程控制范围 |
|
|
320
|
+
| src/components/xform/form-designer/form-widget/field-widget/fieldMixin.js | ref 注册应用最终状态、差异 setter、选项适配 |
|
|
321
|
+
| src/components/xform/form-render/container-item/containerItemMixin.js | 祖先显隐与子字段校验同步 |
|
|
322
|
+
| src/components/xform/form-render/container-item/tab-item.vue | 标签项显隐及激活项切换验证 |
|
|
323
|
+
| src/components/xform/form-designer/setting-panel/form-dynamicField-setting.vue | 执行方式、空值规范化、配置及目标校验 |
|
|
324
|
+
| src/components/xform/form-designer/designer.js | 新模板版本和默认值 |
|
|
325
|
+
| src/components/xform/utils/util.js | 默认配置、克隆契约及遍历兼容 |
|
|
326
|
+
| src/components/xform/mixins/defaultHandle.js | payload 与请求前版本复核,兼容防重和恢复 |
|
|
327
|
+
| tests/unit/components/xform/ | 状态、时序、生命周期与提交回归 |
|
|
328
|
+
|
|
329
|
+
必要时新建轻量调度/流程计算工具,遵循 Vue 2 Options API、共享库 @base/ 导入、2 空格和 LF。不直接修改混淆 request.js,不改流程路由、审批参与人等无关逻辑。
|
|
330
|
+
|
|
331
|
+
补充发现 hanldeCommonWidget2 的 options.disbaled 拼写问题影响 wfModifyEnabled,应在拆分中单独验证并修正。修正标志不能顺便扩大可编辑权限。
|
|
332
|
+
|
|
333
|
+
## 12. 分阶段实施
|
|
334
|
+
|
|
335
|
+
### A. 确认与模板盘点
|
|
336
|
+
|
|
337
|
+
交付 C1—C3 决策、模板清单、后台返回样例和迁移表。盘点持续请求、增量返回、value、空字符串、空值按 0 比较,以及 type=2/3 历史配置。
|
|
338
|
+
|
|
339
|
+
前端仓库不能证明生产模板和后端权限契约,需补齐实际配置与服务端校验信息。
|
|
340
|
+
|
|
341
|
+
### B. 首次执行顺序
|
|
342
|
+
|
|
343
|
+
实现可等待初始化、轻量基线、目标注册、动态 → 流程 → 最终应用、initialOnly、失败阻挡、销毁防回写。
|
|
344
|
+
|
|
345
|
+
验收:后台延迟时没有可编辑空档;首次请求一次;改值不再请求;流程刷新正确应用限制;动态字段和标签项可控。
|
|
346
|
+
|
|
347
|
+
### C. 持续模式与提交
|
|
348
|
+
|
|
349
|
+
实现依赖监听、防抖、旧请求失效、ensure、所有已列提交入口及行范围校验。
|
|
350
|
+
|
|
351
|
+
验收:乱序返回结果正确;立即保存不跳过必填;每轮流程收尾;其他行缺必填不阻止当前行保存。
|
|
352
|
+
|
|
353
|
+
### D. 协议和迁移
|
|
354
|
+
|
|
355
|
+
按 C4/C5 落地状态协议、选项/赋值能力、设计器检查、版本迁移和诊断。四状态与副作用分开测试,旧模板不得静默改为新快照语义。
|
|
356
|
+
|
|
357
|
+
### E. 明细能力(按 C6 决定是否本期)
|
|
358
|
+
|
|
359
|
+
实施行级地址、局部更新、增删/排序/虚拟渲染、树表稳定标识和校验。不以修改共享列 schema 冒充正确的行实例控制。
|
|
360
|
+
|
|
361
|
+
## 13. 测试与联调
|
|
362
|
+
|
|
363
|
+
| 分类 | 场景 | 预期 |
|
|
364
|
+
|---|---|---|
|
|
365
|
+
| 顺序 | 动态启用、流程禁用 | 最终禁用 |
|
|
366
|
+
| 顺序 | 动态隐藏、字段节点可编辑 | 按 C2 明确结果 |
|
|
367
|
+
| 顺序 | 全局与字段级可编辑 | 验证实际写属性差异 |
|
|
368
|
+
| 一次模式 | 连续改依赖、保存、校验、ref 重挂载 | 动态请求仍为一次 |
|
|
369
|
+
| 一次模式 | 初始赋值引发 onChange | 不重复初始化 |
|
|
370
|
+
| 持续模式 | 修改条件 | 每轮流程均最后执行 |
|
|
371
|
+
| 模式切换 | auto 无流程到有流程 | 重选模式、清理监听 |
|
|
372
|
+
| 请求 | A 在 B 后返回或在 B 防抖期返回 | A 均不落地 |
|
|
373
|
+
| 生命周期 | 销毁/setFormJson 后旧结果返回 | 不改新表单 |
|
|
374
|
+
| 失败 | 业务 fail、网络失败、超时 | 按 C3,无永久 pending |
|
|
375
|
+
| 提交 | 修改后立即保存/启动/审批绑定保存 | 等待有效状态后校验 |
|
|
376
|
+
| 提交 | 前置脚本/确认/异步校验期间改数据 | 版本复核,不重发副作用动作 |
|
|
377
|
+
| 行保存 | 其他行/表外缺必填 | 不影响合法当前行 |
|
|
378
|
+
| 行保存 | 当前行异步校验失败 | 等待后阻止保存 |
|
|
379
|
+
| 恢复 | 规则未命中、后台遗漏属性 | 按版本和 C4 恢复 |
|
|
380
|
+
| 设计器 | 选 true 后清空 | 未配置,不变为 false |
|
|
381
|
+
| 条件 | null、空字符串、0、false、数组 | 符合类型规则 |
|
|
382
|
+
| 目标 | 动态字段、标签项、隐藏祖先 | 显隐和校验一致 |
|
|
383
|
+
| 结构 | loadDynamicSchema/setFormJson | 无旧映射和污染基线 |
|
|
384
|
+
| 流程 | 角色、节点、9999、toModify=false、整单只读 | 不越过选定权限语义 |
|
|
385
|
+
| 副作用 | 同值、对象、循环赋值、选项删项 | 不循环请求、不静默丢值 |
|
|
386
|
+
| 性能 | 大表、连续输入、频繁挂载 | 无全量 schema 深拷贝,监听可回收 |
|
|
387
|
+
|
|
388
|
+
回归已有行保存校验范围、列必填解析、保存后恢复、动态列创建、树表、H5 只读、流程启动确认时序用例。再执行项目要求的 lint/测试与真实节点联调。
|
|
389
|
+
|
|
390
|
+
文档生成不代表功能测试通过。
|
|
391
|
+
|
|
392
|
+
## 14. 兼容、上线和回滚
|
|
393
|
+
|
|
394
|
+
1. 新语义有版本标识,旧模板进入可识别兼容路径;兼容路径仍存在审查风险,不能声称已修复。
|
|
395
|
+
2. 优先迁移有流程且启用动态规则的模板,按首屏和各节点实际结果验收。
|
|
396
|
+
3. 历史空字符串配置真实意图无法自动恢复,迁移报告交模板维护者确认。
|
|
397
|
+
4. 诊断记录运行模式、版本、计算序号、命中规则、流程命中项及最终状态来源;不默认记录整份单据值。
|
|
398
|
+
5. 回滚按模板/部署版本,不清空用户数据,不以失败时解除禁用为回滚。旧版本若存在已确认权限覆盖问题,暂停受影响模板操作,不无条件恢复旧路径。
|
|
399
|
+
6. 同步设计器说明、后台字段文档,明确一次模式保留结果、持续模式流程最后执行和受支持目标范围。
|
|
400
|
+
|
|
401
|
+
## 15. 完成标准
|
|
402
|
+
|
|
403
|
+
- C1—C3 明确;涉及协议、明细、迁移时 C4—C7 已确认。
|
|
404
|
+
- 首次顺序可等待、可诊断,无用户可操作的中间状态。
|
|
405
|
+
- 一次/持续模式与配置一致,持续模式不能独立覆盖流程结果。
|
|
406
|
+
- 保存、流程、行保存按各自范围使用有效规则,失败能终止并重试。
|
|
407
|
+
- 模板迁移、回归、节点联调和回滚均有记录。
|
|
408
|
+
|
|
409
|
+
当前完成内容仅为审查和本方案文件。以上功能、测试和上线均待实施。
|