Opentext Cordys BOP 4 平台数据库使用分析一则(在途流程)

今天地市用户反馈新上线的资费审批流程系统中,查询已办功能发现异常提示。

Opentext Cordys BOP 4 平台数据库使用分析一则(在途流程)_第1张图片

如上图所示,点击“已办”中某条数据,如果流程已经结束,则在初始化审批单时,将出现弹出如下提示:

Opentext Cordys BOP 4 平台数据库使用分析一则(在途流程)_第2张图片

源Java Webservice代码如下:

    /** * 获取当前节点的属性以及赋值 */
        if (instanceId != null && !"".equals(instanceId) && !"PARAMETER".equals(instanceId)) {
            queryAdminDataSql = "SELECT * FROM PROCESS_INSTANCE_DATA WHERE INSTANCE_ID = '" + instanceId + "'";
        } else {
          ......
        }
        String namespace = "http://schemas.cordys.com/bpm/monitoring/1.0";
        String methodName = "QueryAdminData";
        String datasetValue = "<dataset>" +
                "<constructor language=\"DBSQL\">" +
                "<query>" + queryAdminDataSql + "</query>" +
                "</constructor>" +
                "</dataset>";
        sro = new SOAPRequestObject(namespace, methodName, null, null);
        int dataset = 0;
        try {
            dataset = BSF.getXMLDocument().load(datasetValue.getBytes("utf-8"));
        } catch (UnsupportedEncodingException e2) {
          ....
        }
        sro.addParameterAsXml(dataset);
        int resultXml = 0;
        int currentActivityXml = 0;
        try {
            resultXml = sro.execute();
            String resultStr = Node.writeToString(resultXml, true);
            resultStr = resultStr.replaceAll("&lt;", "<").replaceAll("&gt;", ">").replaceAll("&quot;", "\"");
            resultXml = BSF.getXMLDocument().load(resultStr.getBytes("utf-8"));
            resultXml = XPath.getFirstMatch(".//*[local-name()='package']/*[local-name()='process']", null, resultXml);
            //如果手动传入环节id为start
            int currentNode = 0;
            if ("start".equalsIgnoreCase(activityId)) {
                currentNode = XPath.getFirstMatch("//action[@actionType='Start Event']", null, resultXml);
            } else {
                currentNode = XPath.getFirstMatch("//action[@id='" + activityId + "']", null, resultXml);
            }
            if (currentNode == 0) {
                result += "<resultFlag>false</resultFlag>";
                result += "<errorDetail>没有找到该环节,环节id:" + activityId + "</errorDetail>";
                result += "<analysisResult></analysisResult>";
                result += "</resultData>";
                int resultData = BSF.getXMLDocument().load(result.getBytes("utf-8"));
                return resultData;
            }

对于此用法,涉及到Cordys元数据存储规则,“在process_instance与process_instance_data表的关系上,如果流程结束了,process_instance_data表中将无此流程数据,或者说process_instance_data表只存储在途流程实例数据。”

打开Cordys平台数据库,验证分析结论,SQL语句如下:

SELECT * FROM `PROCESS_INSTANCE_DATA` where INSTANCE_ID in (SELECT INSTANCE_ID FROM `PROCESS_INSTANCE` where `STATUS` = 'COMPLETE');

验证结果是:流程实例状态为“COMPLETE”的数据,在PROCESS_INSTANCE_DATA表中不存在这些流程实例。如下图查询结果所示:
Opentext Cordys BOP 4 平台数据库使用分析一则(在途流程)_第3张图片

参考:
Cordys(C3)工作流办结流程数据迁移清理方案及实践 肖永威 2014.01

你可能感兴趣的:(数据库,流程,Cordys)