当处理activiti转办问题时,需要做的就是处理审批人和备注问题。
处理的思路是,先将当前环节标志成转办标签,再通过BUSINESS_KEY_找到流程实例的历史记录,找到最新的一条复制一份出来,表示需要转办到的人的历史记录并设置好审批人(默认转办人的环节‘单位领导’也是做转办人的环节名字,如不是则手动处理下),在更换当前流程的审批人,将任务分到转办人那里去,再将原来最新的历史记录处理掉(通过修改endTime改为处理完成,并将主键进行替换,为了将他隔离开,不与复制出来的id冲突,再通过同样的方式进行comment表的处理并将comment表新增的记录与上面的相关)。
代码如下:
public Boolean giveOther(String taskId, String userCode, String message) { // 先查任务 Task task = activitiService.loadTaskInfo(taskId); if (task == null) { throw new BusinessException("任务不存在"); } task.setDescription("转办"); taskService.saveTask(task); boolean result = false; if (!StringUtils.isEmpty(taskId)) { // 查询最新的审批记录 List<ActHiTaskInst> list = jt.queryForBeans(ActHiTaskInst.class, " SELECT\n" + "\ta.* \n" + "FROM\n" + "\t`act_hi_taskinst` AS a\n" + "\tLEFT JOIN act_hi_procinst AS b ON b.PROC_INST_ID_ = a.PROC_INST_ID_ \n" + "\twhere b.BUSINESS_KEY_ = ?\n" + "ORDER BY\n" + "\ta.START_TIME_ DESC ", taskId); ActHiTaskInst oldHiTaskInst = list.get(0); // 复制一份最新的 ActHiTaskInst hiTaskInst = new ActHiTaskInst(); BeanUtils.copyProperties(oldHiTaskInst, hiTaskInst); hiTaskInst.setASSIGNEE_(userCode); //hiTaskInst.setNAME_("转办"); hiTaskInst.setASSIGNEE_(userCode); hiTaskInst.setSTART_TIME_(new Date()); actHiTaskInstRepo.save(hiTaskInst); // 更换审核人 taskService.setAssignee(taskService.createTaskQuery().processInstanceBusinessKey(taskId).list().get(0).getId(), userCode); // 先处理原来的 String id = UUIDUtil.getUUID(); oldHiTaskInst.setEND_TIME_(new Date()); oldHiTaskInst.setID_(id); actHiTaskInstRepo.save(oldHiTaskInst); // 处理备注 // 查询最新的备注记录 List<ActHiComment> list2 = jt.queryForBeans(ActHiComment.class, " SELECT\n" + "\ta.* \n" + "FROM\n" + "\t`act_hi_comment` AS a\n" + "\tLEFT JOIN act_hi_taskinst AS b ON a.PROC_INST_ID_ = b.PROC_INST_ID_ \n" + "WHERE\n" + "\ta.TASK_ID_ = ?\n" + "ORDER BY\n" + "\tb.START_TIME_ DESC ", hiTaskInst.getID_()); ActHiComment oldActHiComment = list2.get(0); // 复制一份备注记录 ActHiComment actHiComment = new ActHiComment(); BeanUtils.copyProperties(oldActHiComment, actHiComment); actHiComment.setTASK_ID_(id);// 作为老的转办提出人的备注 actHiComment.setMESSAGE_(message); actHiComment.setTYPE_("comment"); actHiComment.setFULL_MSG_(message.getBytes(StandardCharsets.UTF_8)); actHiCommentRepo.save(actHiComment); result = true; } return result; }
@Entity @Table(name = "act_hi_taskinst") @DynamicInsert @DynamicUpdate @Data public class ActHiTaskInst { @Id @Column(name = "ID_") private String ID_; @Column(name = "PROC_DEF_ID_") private String PROC_DEF_ID_; @Column(name = "TASK_DEF_KEY_") private String TASK_DEF_KEY_; @Column(name = "PROC_INST_ID_") private String PROC_INST_ID_; @Column(name = "EXECUTION_ID_") private String EXECUTION_ID_; @Column(name = "NAME_") private String NAME_; @Column(name = "PARENT_TASK_ID_") private String PARENT_TASK_ID_; @Column(name = "DESCRIPTION_") private String DESCRIPTION_; @Column(name = "OWNER_") private String OWNER_; @Column(name = "ASSIGNEE_") private String ASSIGNEE_; @Column(name = "START_TIME_") private Date START_TIME_; @Column(name = "CLAIM_TIME_") private String CLAIM_TIME_; @Column(name = "END_TIME_") private Date END_TIME_; @Column(name = "DURATION_") private String DURATION_; @Column(name = "DELETE_REASON_") private String DELETE_REASON_; @Column(name = "PRIORITY_") private String PRIORITY_; @Column(name = "DUE_DATE_") private String DUE_DATE_; @Column(name = "FORM_KEY_") private String FORM_KEY_; @Column(name = "CATEGORY_") private String CATEGORY_; @Column(name = "TENANT_ID_") private String TENANT_ID_; }
save方法是采用jpa的方式,可自行采用项目对应的方式使用。taskService是activiti的api。
效果如下:
欢迎大佬们交流。。