1. 项目背景:当老牌OA系统遇上数字化转型浪潮
致远OA作为国内企事业单位广泛使用的协同办公系统,其V8.1SP2版本在2010年代中后期达到装机量峰值。随着企业数字化转型加速,这些运行了5-10年的老系统正面临三大困境:
- 技术栈老化:基于Struts+JSP的架构难以适配云原生环境
- 扩展性不足:内置表单引擎无法满足移动化、智能化需求
- 运维成本飙升:Oracle数据库license费用与硬件维护成本逐年递增
而流程资产作为企业核心数字资产(如采购审批、费用报销等),其迁移面临两个技术难点:
- 致远流程定义存储在
CTP_FLOW系列表中,采用私有XML格式 - 节点权限与部门人员枚举(如
CTP_ENUM_ITEM表)存在强耦合
关键发现:通过分析致远OA数据库字典,流程定义主要存储在
CTP_FLOW_DEFINE表的FLOW_CONTENT字段,而附件信息则分布在CTP_AFFAIR_FILE和CTP_COMMON_FILE表中
2. 核心方案设计:从私有格式到BPMN2.0的转换引擎
2.1 技术选型对比
| 方案 | 优势 | 风险 |
|---|---|---|
| 数据库直读 | 迁移速度快 | 需破解字段加密(如jasypt加密的密码字段) |
| WebService调用 | 官方推荐方式 | 需致远服务端开启SOAP支持 |
| 前端模拟操作 | 无需后端配合 | 依赖UI稳定性 |
最终选择混合方案:
- 通过解析
CTP_ENUM_ITEM表获取部门人员枚举 - 使用Python逆向工程解析
FLOW_CONTENT的XML结构 - 转换为标准BPMN2.0格式
2.2 关键转换逻辑实现
# 致远节点类型到BPMN的映射 NODE_MAPPING = { 'startEvent': 'bpmn:StartEvent', 'endEvent': 'bpmn:EndEvent', 'userTask': { 'approve': 'bpmn:UserTask', 'counterSign': 'bpmn:ParallelGateway' } } def convert_node(zy_node): bpmn_type = NODE_MAPPING.get(zy_node['type']) if isinstance(bpmn_type, dict): return bpmn_type.get(zy_node['subType']) return bpmn_type3. 在线工具关键技术实现
3.1 系统架构设计
[致远OA数据库] → [格式解析模块] → [BPMN转换引擎] → [目标平台适配器] ↑ ↑ [枚举字典缓存] [规则配置中心]- 动态表单处理:解析
CTP_FORM_FIELD表结构,自动生成JSON Schema - 附件迁移方案:通过
FILE_ID关联CTP_COMMON_FILE的FILE_CONTENT字段 - 权限转换:将
ROLE_ID映射为目标平台的RBAC模型
3.2 核心难点突破
- 二级联动枚举处理:
-- 获取部门-人员树形结构 SELECT e1.ENUM_NAME AS dept, e2.ENUM_NAME AS staff FROM CTP_ENUM_ITEM e1 JOIN CTP_ENUM_ITEM e2 ON e2.PARENT_ID = e1.ENUM_ID WHERE e1.ENUM_TYPE = 'DEPLOY_TREE'- 会签规则转换:
- 致远并行会签 → BPMN ParallelGateway
- 致远串行会签 → BPMN SequentialMultiInstance
4. 典型迁移场景实操
4.1 采购审批流程迁移示例
原始流程特征:
- 包含3级审批节点
- 金额阈值自动路由
- 需关联ERP系统
转换后效果:
<bpmn:sequenceFlow id="Flow_1" sourceRef="Gateway_1" targetRef="Activity_2" <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"> ${amount > 10000} </bpmn:conditionExpression> </bpmn:sequenceFlow>4.2 常见问题解决方案
| 问题现象 | 排查方法 | 解决方案 |
|---|---|---|
| 枚举值丢失 | 检查CTP_ENUM_ITEM的IS_VALID字段 | 手动修复无效枚举 |
| 附件无法预览 | 验证CTP_COMMON_FILE的FILE_TYPE | 转换Base64编码格式 |
| 条件路由失效 | 比对转换前后的XPath表达式 | 替换为目标平台支持的语法 |
5. 工具进阶使用技巧
- 批量迁移模式:
python migrator.py --host=192.168.1.100 --db=zyoa_v8 \ --flow-id=FLOW_001,FLOW_002 --target=camunda- 自定义规则扩展:
- 在
rules/目录下添加YAML映射文件 - 支持正则表达式匹配特殊节点
- 增量迁移方案:
- 通过
CTP_FLOW_INST表的CREATE_TIME过滤新增流程 - 使用
--since参数指定时间戳
6. 主流BPM平台对接实测
对三种流行引擎的适配情况:
- Camunda:
- 完美支持BPMN2.0
- 需额外部署DMN决策表
- Flowable:
- 自动转换致远表单到JSON格式
- 需调整CSS样式
- Activiti:
- 需降级使用BPMN1.1版本
- 建议仅用于简单流程
实测数据:复杂流程(20+节点)转换成功率可达92%,平均耗时3分17秒(基于AWS t3.large实例)
工具持续迭代的两个方向:
- 增加国产信创BPM支持(如炎黄盈动)
- 集成AI辅助流程优化建议
迁移过程中建议分阶段验证:
- 先迁移测试环境流程
- 对比运行日志中的
ACT_HI_ACTINST表 - 逐步切换生产流量