package org.jeecg.modules.flowable.apithird.business.service.impl; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.collections4.CollectionUtils; import org.flowable.engine.HistoryService; import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.task.api.Task; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.modules.flowable.apithird.business.dto.FlowMyBusinessDto; import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness; import org.jeecg.modules.flowable.apithird.business.mapper.FlowMyBusinessMapper; import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService; import org.jeecg.modules.flowable.apithird.entity.SysUser; import org.jeecg.modules.flowable.domain.dto.FlowTaskDto; import org.jeecg.modules.flowable.util.TimeUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.Collections; import java.util.Date; import java.util.List; /** * @Description: 流程业务扩展表 * @Author: jeecg-boot * @Date: 2021-11-25 * @Version: V1.0 */ @Service public class FlowMyBusinessServiceImpl extends ServiceImpl implements IFlowMyBusinessService { @Resource private FlowMyBusinessMapper flowMyBusinessMapper; @Autowired private HistoryService historyService; @Autowired private TaskService taskService; public HistoricActivityInstance getPreviousNode(String taskId) { // 获取当前任务的执行实例 ID String processInstanceId = historyService.createHistoricTaskInstanceQuery() .taskId(taskId) .singleResult() .getProcessInstanceId(); // 查询历史活动实例 List historicActivityInstances = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processInstanceId) .activityType("userTask") .finished() .orderByHistoricActivityInstanceEndTime() .desc() .list(); // 取第一个结果,即上一级节点 if (!historicActivityInstances.isEmpty()) { return historicActivityInstances.get(0); } return null; } @Transactional // 降低隔离级别 public FlowMyBusiness getByDataId(String dataId) { //如果保存数据前未调用必调的FlowCommonService.initActBusiness方法,就会有问题 FlowMyBusiness business = flowMyBusinessMapper.selectByDataId(dataId); return business; } public FlowMyBusiness getByProcessInstanceId(String processInstanceId) { LambdaQueryWrapper flowMyBusinessLambdaQueryWrapper = new LambdaQueryWrapper<>(); flowMyBusinessLambdaQueryWrapper.eq(FlowMyBusiness::getProcessInstanceId,processInstanceId) ; //如果保存数据前未调用必调的FlowCommonService.initActBusiness方法,就会有问题 FlowMyBusiness business = this.getOne(flowMyBusinessLambdaQueryWrapper); return business; } /** * 流程-我的已办 * @param flowMyBusinessDto * @return */ public List ListMyBusiness(FlowMyBusinessDto flowMyBusinessDto){ return flowMyBusinessMapper.ListMyBusiness(flowMyBusinessDto); } /** * 流程总台账 * @param flowMyBusinessDto * @return */ public IPage getPageList(Page page, FlowMyBusinessDto flowMyBusinessDto){ IPage flowMyBusinessDtoIPage =flowMyBusinessMapper.PageList(page,flowMyBusinessDto); flowMyBusinessDtoIPage.getRecords().forEach(item -> { if (!("").equals(item.getTaskId())&&item.getTaskId()!=null){ HistoricActivityInstance historicActivityInstance = getPreviousNode(item.getTaskId()); if (historicActivityInstance != null){ item.setPreNode(historicActivityInstance.getActivityName()); } } if (item.getTodoUsers() == null){ item.setTodoUsers(""); }else { //去除[] item.setTodoUsers(item.getTodoUsers().replaceAll("\\[", "").replaceAll("\\]", "")); item.setTodoUsers(item.getTodoUsers().replaceAll("\"", "")); } if (item.getDoneUsers() == null){ item.setDoneUsers(""); }else { //去除[] item.setDoneUsers(item.getDoneUsers().replaceAll("\\[", "").replaceAll("\\]", "")); item.setDoneUsers(item.getDoneUsers().replaceAll("\"", "")); } //计算处理时长 Date kssj=item.getStartTime(); Date jssj; if (item.getEndTime() != null){ jssj=item.getEndTime(); }else { jssj=new Date(); } item.setDuration(TimeUtil.howLong(kssj, jssj,2)); }); return flowMyBusinessDtoIPage; } @Override public FlowMyBusiness getFlowMyBusiness(String instanceId) { List businessList = super.list( new QueryWrapper().eq("process_instance_id", instanceId)); return businessList.isEmpty() ? null : businessList.get(0); } @Override public FlowMyBusiness getFlowMyBusiness(String instanceId, String taskId) { List businessList = super.list( new QueryWrapper().eq("process_instance_id", instanceId).eq("task_id", taskId)); return businessList.isEmpty() ? null : businessList.get(0); } @Override public FlowMyBusiness selectByDataId(String dataId) { List businessList = super.list( new QueryWrapper().eq("data_id", dataId)); return businessList.isEmpty() ? null : businessList.get(0); } @Override public List selectListByDataId(String dataId) { //如果保存数据前未调用必调的FlowCommonService.initActBusiness方法,就会有问题 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(FlowMyBusiness::getDataId, dataId); List list = flowMyBusinessMapper.selectList(queryWrapper); if(CollectionUtils.isEmpty(list)){ return Collections.emptyList(); } return list; } @Override public boolean isUserAuthorized(FlowMyBusiness flowMyBusiness, LoginUser user) { List todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class); return todoUsers != null && todoUsers.contains(user.getUsername()); } @Override public boolean claimTask(String taskId, LoginUser user) { Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); if (task == null) { return false; } if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) { return false; } taskService.claim(taskId, user.getUsername()); return true; } }