lemon icon indicating copy to clipboard operation
lemon copied to clipboard

流程跟踪图生成TODO问题解决。

Open jollyja opened this issue 11 years ago • 2 comments

com.mossle.bpm.graph.ActivitiHistoryGraphBuilder.fetchHistoricActivityInstances()

原代码

// TODO: 如果用了uuid会造成这样排序出问题 // 但是如果用startTime,可能出现因为处理速度太快,时间一样,导致次序颠倒的问题 historicActivityInstanceQueryImpl.processInstanceId(processInstanceId) .orderByHistoricActivityInstanceId().asc();

替换成

historicActivityInstanceQueryImpl.processInstanceId(processInstanceId) ..orderBy(new HistoricActivityInstanceQueryProperty("to_number(id_)")).asc();

原理 activiti默认使用Long类型作为该字段的数据源(DbIdGenerator), 以字符串形式保存到数据库,未作前补0处理,导致以字符串方式orderby无法达到目标要求, 通过数据库内置函数对该字段做类型转换,以数字型进行排序即可; to_number在oracle和db2上都是支持的,其他数据库不清楚。

Mr jollyja [email protected] 2014.09.12

jollyja avatar Sep 12 '14 05:09 jollyja

to_number在mysql上并不支持

在fetchHistoricActivityInstances()中添加

    Collections.sort(historicActivityInstances,new Comparator(){
        @Override
        public int compare(Object o1, Object o2) {
            // TODO Auto-generated method stub
            HistoricActivityInstance arg1 = (HistoricActivityInstance)o1;
            HistoricActivityInstance arg2 = (HistoricActivityInstance)o2;
            Integer id1=Integer.parseInt(arg1.getId()); 
            Integer id2=Integer.parseInt(arg2.getId()); 
            return id1.compareTo(id2);
        }
    });

即可解决

ZLZhang1 avatar Aug 24 '15 11:08 ZLZhang1

//如果id使用标准uuid(8-4-4-4-12)的解决方法, Collections.sort(historicActivityInstances, new Comparator() {

        @Override
        public int compare(Object o1, Object o2) {
            HistoricActivityInstance arg1 = (HistoricActivityInstance)o1;
            HistoricActivityInstance arg2 = (HistoricActivityInstance)o2;
            String uuid_id1 = arg1.getId();
            String uuid_id2 = arg2.getId();
            return UUID.fromString(uuid_id1).compareTo(UUID.fromString(uuid_id2));
        }
    });

oleilei avatar Oct 30 '15 15:10 oleilei