ludc
2025-01-16 986aa62ed00bee39363bab41b4eeb8259d446efd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package com.vci.server.workflow.event;
 
import org.jbpm.api.listener.EventListenerExecution;
 
import com.vci.corba.common.VCIError;
import com.vci.corba.omd.data.BusinessObject;
import com.vci.corba.omd.lcm.LifeCycle;
import com.vci.corba.omd.lcm.TransitionVO;
import com.vci.server.base.utility.ServerServiceProvider;
 
 
 
/**
 * 业务对象生命周期状态跃迁事件
 * <p>主逻辑:从流程事件的参数列表中提取出 targetLCStatus 作为要跃迁到的生命周期状态<p>
 * @author xiongchao
 * 
 */
public class TransferStatus extends BaseEvent {
 
    /**
     * 
     */
    private static final long serialVersionUID = -8638494241304071397L;
 
    /**
     * 事件参数  目标生命周期状态
     */
    private String targetStatus = "";
    /**
     * 本地成员变量,目标发布状态,默认为空,即不发布(仅跃迁)
     */
    private String releaseStatus = "";
    
    public String getTargetStatus() {
        return targetStatus;
    }
    
    public void setTargetStatus(String targetStatus) {
        this.targetStatus = targetStatus;
    }
    
    public String getReleaseStatus() {
        return releaseStatus;
    }
 
    public void setReleaseStatus(String releaseStatus) {
        this.releaseStatus = releaseStatus;
    }
 
    /**
     * 返回是否是流程终止而触发当前事件
     * @param e
     * @return
     */
    protected boolean isIntermitting(EventListenerExecution e){
        boolean res = false;
        String intermit = (String) e.getProcessInstance().getVariable("intermit");
        // 平台规则:当全仅当 intermit 的值等于true时,才代表是执行‘流程中止’
        if(intermit != null && !"".equals(intermit) && "true".equals(intermit)){
            res = true;
        }
        return res;
    }
    
    @Override
    public void doEvent(EventListenerExecution e) throws Exception {
        // 普通跃迁事件,当且仅当是非‘流程终止’时才执行
        if(!isIntermitting(e)){
            doEventDetail(e);
        }
    }
    
    protected void doEventDetail(EventListenerExecution e) throws Exception{
        /**
         * 1、取出当前任务名称
         * 2、取出本事件在当前任务里的参数
         * 3、从参数中提取 targetLCStatus 参数值,如果没有则抛出异常,阻止流程继续提交
         * 4、检查 targetLCStatus 是否当前业务类型生命周期有效的状态
         */
        if(getTargetStatus() == null || "".equals(getTargetStatus())){
            throw new IllegalArgumentException("跃迁业务对象生命周期状态异常:'targetStatus' 的参数值为 null 或 空");
        }
        
        // 取出流程里关联的数据
        BusinessObject[] bos = super.getBusinessObjects();
        // 取出生命周期名称
        String lcName = bos[0].lctId;
        // 构建跃迁数据
        TransitionVO[] vos = new TransitionVO[bos.length];
        String[] releaseStatus = new String[bos.length];
        
        for (int i = 0; i < releaseStatus.length; i++) {
            TransitionVO targetTVO = getTransitionVO(lcName, bos[i].lcStatus, getTargetStatus());
            if(targetTVO == null){
                throw new IllegalArgumentException("跃迁业务对象生命周期状态异常:'targetStatus' 的参数值 '" + getTargetStatus() + "' 无效,在生命周期 '" + lcName + "' 里不存在。" +
                        " 或者是生命周期里从 '" + bos[i].lcStatus + "' 到 '" + getTargetStatus() + "' 之间的连线不存在,无法进行跃迁!");
            }
            vos[i] = targetTVO;
            // 设置发发布状态值,此事件里值为空(即,不发布,仅做跃迁
            releaseStatus[i] = getReleaseStatus();
        }
        
        // 执行跃迁及发布
        ServerServiceProvider.getBOFService().batchTransferBusinessObjectAndRelease(bos, vos, releaseStatus);
    }
    
    /**
     * 查询生命周期节点
     * @param lcName 生命周期名称
     * @param lcDestStatus 状态
     * @return
     */
    protected TransitionVO getTransitionVO(String lcName, String lcSrcStatus,String lcDestStatus) {
        if (lcSrcStatus == null || lcDestStatus == null) {
            return null;
        }
        
        lcSrcStatus = lcSrcStatus.trim();
        lcDestStatus = lcDestStatus.trim();
        
        try {
            LifeCycle lc = ServerServiceProvider.getOMDService().getLifeCycleService().getLifeCycle(lcName);
            if(lc == null) {
                return null;
            }
            
            for (int i = 0; i < lc.routes.length; ++i) {
                TransitionVO route = lc.routes[i];
                if (route.destination.equals(lcDestStatus) && route.source.equals(lcSrcStatus)){
                    return route;
                }
            }
        } catch (VCIError e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
        return null;
    }
 
 
}