yonge před 5 roky
rodič
revize
8006bbd5eb

+ 2 - 5
mec-workflow/src/main/java/com/ym/mec/workfow/controller/flow/OrderController.java

@@ -13,12 +13,10 @@ import org.snaker.engine.entity.HistoryTask;
 import org.snaker.engine.entity.Process;
 import org.snaker.engine.entity.Task;
 import org.snaker.engine.helper.AssertHelper;
-import org.snaker.engine.model.ProcessModel;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
@@ -61,15 +59,14 @@ public class OrderController extends BaseController {
 	}
 
 	@GetMapping(value = "detail")
-	@ResponseBody
 	public Object json(String processId, String orderId) {
 		Process process = snakerEngine.process().getProcessById(processId);
 		AssertHelper.notNull(process);
-		ProcessModel model = process.getModel();
 		Map<String, Object> jsonMap = new HashMap<String, Object>();
+		/*ProcessModel model = process.getModel();
 		if (model != null) {
 			jsonMap.put("process", model);
-		}
+		}*/
 
 		if (StringUtils.isNotEmpty(orderId)) {
 			List<Task> tasks = snakerEngine.query().getActiveTasks(new QueryFilter().setOrderId(orderId));

+ 3 - 3
mec-workflow/src/main/java/com/ym/mec/workfow/controller/flow/TaskController.java

@@ -183,13 +183,13 @@ public class TaskController extends BaseController {
 
 	/**
 	 * 历史任务撤回
-	 * @param taskId
+	 * @param orderId
 	 * @return
 	 */
 	@PostMapping(value = "undo")
-	public Object historyTaskUndo(String taskId) {
+	public Object historyTaskUndo(String orderId) {
 		SysUser user = SysUserFeignService.queryUserInfo();
-		snakerEngine.task().withdrawTask(taskId, user.getUsername());
+		snakerEngine.order().withdraw(orderId, user.getUsername());
 		return succeed();
 	}
 }

+ 9 - 2
mec-workflow/src/main/java/com/ym/mec/workfow/controller/web/LeaveController.java

@@ -53,13 +53,20 @@ public class LeaveController extends BaseController {
 	}
 
 	@PostMapping(value = "approve")
-	public Object approve(String taskId) {
+	public Object approve(String taskId, boolean isAgree) {
 		SysUser user = SysUserFeignService.queryUserInfo();
 
 		System.out.println(user.getUsername() + "审批***************");
 
-		List<Task> tasks = snakerEngine.executeTask(taskId, user.getUsername());
+		List<Task> tasks = null;
 
+		// 审批同意
+		if (isAgree) {
+			tasks = snakerEngine.executeTask(taskId, user.getUsername());
+		} else {
+			// 审批驳回
+			tasks = snakerEngine.executeAndJumpTask(taskId, user.getUsername(), null, null);
+		}
 		if (tasks.size() == 0) {
 			System.out.println("**********流程已结束*********");
 		}

+ 2 - 2
mec-workflow/src/main/resources/flows/leave.snaker

@@ -11,8 +11,8 @@
 <transition g="" name="transition3" offset="0,0" to="decision1"/>
 </task>
 <decision displayName="decision1" layout="426,124,-1,-1" name="decision1">
-<transition displayName="&lt;=5天" expr="${days} &lt;= 5" g="" name="transition4" offset="0,0" to="end1"/>
-<transition displayName="&gt;5天" expr="${days} &gt; 5" g="" name="transition5" offset="0,0" to="approveBoss"/>
+<transition displayName="&lt;=5天" expr="#days &lt;= 5" g="" name="transition4" offset="0,0" to="end1"/>
+<transition displayName="&gt;5天" expr="#days &gt; 5" g="" name="transition5" offset="0,0" to="approveBoss"/>
 </decision>
 <task assignee="boss" displayName="总经理审批" layout="404,231,-1,-1" name="approveBoss" performType="ANY">
 <transition g="" name="transition6" offset="0,0" to="end1"/>

+ 29 - 22
workflowy/src/main/java/org/snaker/engine/IOrderService.java

@@ -33,7 +33,7 @@ public interface IOrderService {
 	 * @return Order 活动流程实例对象
 	 */
 	Order createOrder(Process process, String operator, Map<String, Object> args);
-	
+
 	/**
 	 * 根据流程、操作人员、父流程实例ID创建流程实例
 	 * @param process 流程定义对象
@@ -45,40 +45,40 @@ public interface IOrderService {
 	 */
 	Order createOrder(Process process, String operator, Map<String, Object> args, String parentId, String parentNodeName);
 
-    /**
-     * 向指定实例id添加全局变量数据
-     * @param orderId 实例id
-     * @param args 变量数据
-     */
-    void addVariable(String orderId, Map<String ,Object> args);
-	
+	/**
+	 * 向指定实例id添加全局变量数据
+	 * @param orderId 实例id
+	 * @param args 变量数据
+	 */
+	void addVariable(String orderId, Map<String, Object> args);
+
 	/**
 	 * 创建抄送实例
 	 * @param orderId 流程实例id
 	 * @param actorIds 参与者id
-     * @param creator 创建人id
+	 * @param creator 创建人id
 	 * @since 1.5
 	 */
 	void createCCOrder(String orderId, String creator, String... actorIds);
-	
+
 	/**
 	 * 流程实例正常完成
 	 * @param orderId 流程实例id
 	 */
 	void complete(String orderId);
-	
+
 	/**
 	 * 保存流程实例
 	 * @param order 流程实例对象
 	 */
 	void saveOrder(Order order);
-	
+
 	/**
 	 * 流程实例强制终止
 	 * @param orderId 流程实例id
 	 */
 	void terminate(String orderId);
-	
+
 	/**
 	 * 流程实例强制终止
 	 * @param orderId 流程实例id
@@ -86,26 +86,33 @@ public interface IOrderService {
 	 */
 	void terminate(String orderId, String operator);
 
-    /**
-     * 唤醒历史流程实例
-     * @param orderId 流程实例id
-     * @return 活动实例对象
-     */
-    Order resume(String orderId);
-	
+	/**
+	 * 撤销流程实例
+	 * @param orderId 流程实例id
+	 * @param operator 处理人员
+	 */
+	void withdraw(String orderId, String operator);
+
+	/**
+	 * 唤醒历史流程实例
+	 * @param orderId 流程实例id
+	 * @return 活动实例对象
+	 */
+	Order resume(String orderId);
+
 	/**
 	 * 更新流程实例
 	 * @param order 流程实例对象
 	 */
 	void updateOrder(Order order);
-	
+
 	/**
 	 * 更新抄送记录为已阅
 	 * @param orderId 流程实例id
 	 * @param actorIds 参与者id
 	 */
 	void updateCCStatus(String orderId, String... actorIds);
-	
+
 	/**
 	 * 删除抄送记录
 	 * @param orderId 流程实例id

+ 37 - 1
workflowy/src/main/java/org/snaker/engine/core/OrderService.java

@@ -17,9 +17,11 @@ package org.snaker.engine.core;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.lang.StringUtils;
 import org.snaker.engine.Completion;
 import org.snaker.engine.IOrderService;
 import org.snaker.engine.SnakerEngine;
+import org.snaker.engine.SnakerException;
 import org.snaker.engine.access.QueryFilter;
 import org.snaker.engine.entity.*;
 import org.snaker.engine.entity.Process;
@@ -210,7 +212,41 @@ public class OrderService extends AccessService implements IOrderService {
         }
 	}
 
-    /**
+	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+	public void withdraw(String orderId, String operator) {
+		Order order = access().getOrder(orderId);
+		
+		if(!StringUtils.equals(operator, order.getCreator())){
+			throw new SnakerException("当前参与者[" + operator + "]不允许撤销流程实例[orderId=" + orderId + "]");
+		}
+		
+		SnakerEngine engine = ServiceContext.getEngine();
+		
+		List<HistoryTask> historyTasks = engine.query().getHistoryTasks(new QueryFilter().setOrderId(orderId));
+		for(HistoryTask historyTask : historyTasks){
+			if(!StringUtils.equals(operator, historyTask.getOperator())){
+				throw new SnakerException("流程实例在处理中,不能被撤销");
+			}
+		}
+		
+		List<Task> tasks = engine.query().getActiveTasks(new QueryFilter().setOrderId(orderId));
+		for(Task task : tasks) {
+			access().deleteTask(task);
+		}
+		
+		HistoryOrder history = new HistoryOrder(order);
+		history.setOrderState(STATE_TERMINATION);
+		history.setEndTime(DateHelper.getTime());
+		
+		access().updateHistory(history);
+		access().deleteOrder(order);
+        Completion completion = getCompletion();
+        if(completion != null) {
+            completion.complete(history);
+        }
+	}
+
+	/**
      * 激活已完成的历史流程实例
      * @param orderId 实例id
      * @return 活动实例对象

+ 4 - 0
workflowy/src/main/java/org/snaker/engine/model/NodeModel.java

@@ -26,6 +26,8 @@ import org.snaker.engine.core.Execution;
 import org.snaker.engine.helper.ClassHelper;
 import org.snaker.engine.helper.StringHelper;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
 /**
  * 节点元素(存在输入输出的变迁)
  * @author yuqs
@@ -40,10 +42,12 @@ public abstract class NodeModel extends BaseModel implements Action {
 	/**
 	 * 输入变迁集合
 	 */
+	@JsonIgnore
 	private List<TransitionModel> inputs = new ArrayList<TransitionModel>();
 	/**
 	 * 输出变迁集合
 	 */
+	@JsonIgnore
 	private List<TransitionModel> outputs = new ArrayList<TransitionModel>();
 	/**
 	 * layout