package com.mossle.bpm.service; import javax.annotation.Resource; import com.mossle.spi.humantask.CounterSignDTO; import com.mossle.spi.humantask.TaskDefinitionConnector; import org.activiti.engine.ProcessEngine; import org.activiti.engine.RuntimeService; import org.activiti.engine.impl.persistence.entity.ExecutionEntity; import org.activiti.engine.runtime.Execution; import org.apache.commons.lang3.builder.ToStringBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; /** * 发文会签流程Service * * @author henryyan */ @Service public class CounterSignService { private Logger logger = LoggerFactory.getLogger(CounterSignService.class); private ProcessEngine processEngine; private TaskDefinitionConnector taskDefinitionConnector; public Boolean canComplete(Execution execution, Integer nrOfInstances, Integer nrOfActiveInstances, Integer nrOfCompletedInstances, Integer loopCounter) { return canComplete(execution, 100, nrOfInstances, nrOfActiveInstances, nrOfCompletedInstances, loopCounter); } /** * 是否允许结束会签(多实例) 参数的含义请参考用户手册 */ public Boolean canComplete(Execution execution, Integer rate, Integer nrOfInstances, Integer nrOfActiveInstances, Integer nrOfCompletedInstances, Integer loopCounter) { String activityId = execution.getActivityId(); String processDefinitionId = ((ExecutionEntity) execution) .getProcessInstance().getProcessDefinitionId(); RuntimeService runtimeService = processEngine.getRuntimeService(); CounterSignDTO counterSign = taskDefinitionConnector.findCounterSign( activityId, processDefinitionId); if (counterSign != null) { rate = counterSign.getRate(); } String agreeCounterName = "agreeCounter"; Object agreeCounter = runtimeService.getVariable(execution.getId(), agreeCounterName); if (agreeCounter == null) { // 初始化计数器 runtimeService.setVariable(execution.getId(), agreeCounterName, 1); } else { // 计数器累加 Integer integerCounter = (Integer) runtimeService.getVariable( execution.getId(), agreeCounterName); runtimeService.setVariable(execution.getId(), agreeCounterName, ++integerCounter); } logger.debug("execution: {}", ToStringBuilder.reflectionToString(execution)); logger.debug( "rate={}, nrOfInstances={}, nrOfActiveInstances={}, nrOfComptetedInstances={}, loopCounter={}", new Object[] { rate, nrOfInstances, nrOfActiveInstances, nrOfCompletedInstances, loopCounter }); // 计算通过的比例,以此决定是否结束会签 double completeRate = nrOfCompletedInstances.doubleValue() / nrOfInstances; boolean canComplete = (completeRate * 100) >= rate; logger.debug("rate: {}, completeRate: {}, canComplete={}", new Object[] { rate, completeRate, canComplete }); return canComplete; } @Resource public void setProcessEngine(ProcessEngine processEngine) { this.processEngine = processEngine; } @Resource public void setTaskDefinitionConnector( TaskDefinitionConnector taskDefinitionConnector) { this.taskDefinitionConnector = taskDefinitionConnector; } }