xiaoyi
2026-10-30 8bdf5af7d5044de42694496d8dcd890979f718cd
fix(bpm): 同步流程定义的表单快照,修复改表单后发起流程仍是旧表单

现象:在【流程表单】里修改了「请假」表单(新增「用户选择器」字段),
但【发起流程】看到的还是旧的 3 个字段。

根因:
BPM 在【部署流程】时会把当时的表单内容复制一份快照到
bpm_process_definition_info.form_conf / form_fields:

// BpmProcessDefinitionServiceImpl:167
definitionDO.setFormFields(form.getFields()).setFormConf(form.getConf());

而 updateForm() 只更新 bpm_form 表,不会同步已部署流程的快照。

这个设计本身是合理的(保证已发起的流程用当时的表单,不被后续修改影响),
但副作用是:改完表单后如果不重新部署流程,新发起的流程也会用旧快照。

修复:
把 qingjia(请假)流程定义的表单快照同步为 bpm_form id=3 的最新内容。

同步前:快照 3 个字段(申请人 / 请假时间 / 天数)
同步后:快照 4 个字段(+ 用户选择器)

验证(发起流程页面实际调用的接口
GET /bpm/process-definition/list?suspensionState=1):
qingjia v2 formType=10 formId=3 字段数=4
- UserSelect 用户选择器
- input 申请人
- datePicker 请假时间
- inputNumber 天数

后续操作提醒:
以后修改流程表单后,需要到【流程管理 → 流程模型】重新【发布/部署】
该流程,快照才会刷新;否则新发起的流程仍用旧表单。

备份:/data/backup/mysql/manual/pre_sync_form_20261030174403.sql
已添加1个文件
46 ■■■■■ 文件已修改
sql/mysql/sync_bpm_form_snapshot_20261030.sql 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql/sync_bpm_form_snapshot_20261030.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
-- ============================================================
-- åŒæ­¥ BPM æµç¨‹å®šä¹‰çš„表单快照到最新表单
-- ç”Ÿæˆæ—¶é—´ï¼š2026-10-30
--
-- çŽ°è±¡ï¼šä¿®æ”¹äº† bpm_form è¯·å‡è¡¨å•(新增「用户选择器」字段),
--      ä½†å‘起流程时看到的还是旧表单(3 ä¸ªå­—段)。
--
-- æ ¹å› ï¼šBPM åœ¨ã€éƒ¨ç½²æµç¨‹ã€‘时会把当时的表单内容复制一份快照到
--      bpm_process_definition_info.form_conf / form_fields。
--      ï¼ˆBpmProcessDefinitionServiceImpl:167
--        definitionDO.setFormFields(form.getFields()).setFormConf(form.getConf());)
--
--      updateForm() åªæ›´æ–° bpm_form è¡¨ï¼Œä¸ä¼šåŒæ­¥å·²éƒ¨ç½²æµç¨‹çš„快照。
--      è¿™æ˜¯è®¾è®¡å¦‚此(保证已发起的流程表单不被改动),
--      ä½†ä¹Ÿå¯¼è‡´ï¼šæ”¹å®Œè¡¨å•后,新发起的流程用的还是旧快照。
--
-- æ­£ç¡®åšæ³•:改完表单后要重新【部署】流程模型,让快照刷新。
--          æœ¬æ¬¡ç›´æŽ¥åŒæ­¥æ•°æ®åº“,效果等同重新部署。
--
-- å½±å“èŒƒå›´ï¼šåªæœ‰ qingjia(请假)流程,绑定表单 id=3
-- å¹‚等:可重复执行
-- ============================================================
-- ---------- 1. åŒæ­¥å‰åŽå¯¹æ¯” ----------
SELECT 'bpm_form(最新)' AS æ¥æº, id, JSON_LENGTH(fields) AS å­—段数
  FROM bpm_form WHERE id = 3
UNION ALL
SELECT CONCAT('info.id=', id, '(快照)'), id, JSON_LENGTH(form_fields)
  FROM bpm_process_definition_info WHERE id IN (13, 14);
-- ---------- 2. æŠŠæœ€æ–°è¡¨å•同步到快照 ----------
UPDATE bpm_process_definition_info i
  JOIN bpm_form f ON f.id = i.form_id AND f.deleted = b'0'
   SET i.form_conf   = f.conf,
       i.form_fields = f.fields,
       i.updater     = '1',
       i.update_time = NOW()
 WHERE i.form_id = 3
   AND i.deleted = b'0';
-- ---------- 3. åŒæ­¥åŽæ ¡éªŒï¼ˆå¿«ç…§å­—段数应与表单一致)----------
SELECT 'bpm_form(最新)' AS æ¥æº, id, JSON_LENGTH(fields) AS å­—段数
  FROM bpm_form WHERE id = 3
UNION ALL
SELECT CONCAT('info.id=', id, '(快照)'), id, JSON_LENGTH(form_fields)
  FROM bpm_process_definition_info WHERE id IN (13, 14);