| | |
| | | */ |
| | | package org.springblade.modules.applicationCarChange.service.impl; |
| | | |
| | | import lombok.AllArgsConstructor; |
| | | import org.flowable.bpmn.model.*; |
| | | import org.flowable.engine.RepositoryService; |
| | | import org.flowable.engine.RuntimeService; |
| | | import org.flowable.engine.TaskService; |
| | | import org.flowable.engine.runtime.ProcessInstance; |
| | | import org.flowable.task.api.Task; |
| | | import org.springblade.common.constant.AuditStatusConstant; |
| | | import org.springblade.core.log.exception.ServiceException; |
| | | import org.springblade.core.mp.support.Condition; |
| | | import org.springblade.core.secure.utils.AuthUtil; |
| | | import org.springblade.core.tool.support.Kv; |
| | | import org.springblade.core.tool.utils.Func; |
| | | import org.springblade.core.tool.utils.StringUtil; |
| | | import org.springblade.flow.business.service.IFlowService; |
| | | import org.springblade.flow.core.constant.ProcessConstant; |
| | | import org.springblade.flow.core.entity.BladeFlow; |
| | | import org.springblade.flow.core.utils.FlowUtil; |
| | | import org.springblade.modules.application.entity.ApplicationEntity; |
| | | import org.springblade.modules.application.entity.BasicInfoEntity; |
| | | import org.springblade.modules.application.entity.CarEntity; |
| | | import org.springblade.modules.application.service.IApplicationService; |
| | | import org.springblade.modules.application.service.ICarService; |
| | | import org.springblade.modules.application.vo.ApplicationVO; |
| | | import org.springblade.modules.application.wrapper.ApplicationWrapper; |
| | | import org.springblade.modules.applicationCarChange.entity.ApplicationCarChangeEntity; |
| | | import org.springblade.modules.applicationCarChange.vo.ApplicationCarChangeVO; |
| | | import org.springblade.modules.applicationCarChange.mapper.ApplicationCarChangeMapper; |
| | | import org.springblade.modules.applicationCarChange.service.IApplicationCarChangeService; |
| | | import org.springblade.core.mp.base.BaseServiceImpl; |
| | | import org.springblade.modules.applicationCarChange.wrapper.ApplicationCarChangeWrapper; |
| | | import org.springblade.modules.applicationDelay.entity.ApplicationDelayEntity; |
| | | import org.springblade.modules.applicationDelay.vo.ApplicationDelayVO; |
| | | import org.springframework.stereotype.Service; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * 车辆变更申请表 服务实现类 |
| | |
| | | * @since 2022-12-13 |
| | | */ |
| | | @Service |
| | | @AllArgsConstructor |
| | | public class ApplicationCarChangeServiceImpl extends BaseServiceImpl<ApplicationCarChangeMapper, ApplicationCarChangeEntity> implements IApplicationCarChangeService { |
| | | private final ICarService carService; |
| | | private final IApplicationService applicationService; |
| | | |
| | | private final IFlowService flowService; |
| | | private final TaskService taskService; |
| | | private final RuntimeService runtimeService; |
| | | private final RepositoryService repositoryService; |
| | | |
| | | @Override |
| | | public IPage<ApplicationCarChangeVO> selectApplicationCarChangePage(IPage<ApplicationCarChangeVO> page, ApplicationCarChangeVO applicationCarChange) { |
| | | return page.setRecords(baseMapper.selectApplicationCarChangePage(page, applicationCarChange)); |
| | | } |
| | | |
| | | @Override |
| | | public Boolean startProcess(ApplicationCarChangeEntity entity, CarEntity carEntity) { |
| | | String businessTable = FlowUtil.getBusinessTable(ProcessConstant.CAR_CHANGE_AUDIT); |
| | | if (Func.isEmpty(entity.getId())) { |
| | | // 保存变更信息 |
| | | save(entity); |
| | | //保存车辆信息 |
| | | ApplicationEntity applicationEntity = applicationService.getByNo(entity.getNo()); |
| | | carEntity.setCarChangeId(entity.getId().toString()); |
| | | carEntity.setApplicationId(applicationEntity.getId().toString()); |
| | | carService.save(carEntity); |
| | | // 启动流程 |
| | | Kv variables = Kv.create() |
| | | .set(ProcessConstant.TASK_VARIABLE_CREATE_USER, AuthUtil.getUserName()); |
| | | BladeFlow flow = flowService.startProcessInstanceById(entity.getProcessDefinitionId(), FlowUtil.getBusinessKey(businessTable, String.valueOf(entity.getId())), variables); |
| | | if (Func.isNotEmpty(flow)) { |
| | | log.debug("流程已启动,流程ID:" + flow.getProcessInstanceId()); |
| | | // 返回流程id写入leave |
| | | entity.setProcessInstanceId(flow.getProcessInstanceId()); |
| | | updateById(entity); |
| | | } else { |
| | | throw new ServiceException("开启流程失败"); |
| | | } |
| | | } else { |
| | | |
| | | updateById(entity); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | public Boolean completeTask(BladeFlow flow) { |
| | | String taskId = flow.getTaskId(); |
| | | String processInstanceId = flow.getProcessInstanceId(); |
| | | String comment = Func.toStr(flow.getComment(), ProcessConstant.PASS_COMMENT); |
| | | // 增加评论 |
| | | if (StringUtil.isNoneBlank(processInstanceId, comment)) { |
| | | taskService.addComment(taskId, processInstanceId, comment); |
| | | } |
| | | |
| | | Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); |
| | | ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult(); |
| | | // 通过流程实例获取“业务键” |
| | | String businessKey = pi.getBusinessKey().split(":")[1]; |
| | | |
| | | //获取实例对象 |
| | | ApplicationCarChangeEntity entity = getById(businessKey); |
| | | ApplicationEntity applicationEntity = applicationService.getByNo(entity.getNo()); |
| | | |
| | | //驳回时 |
| | | if (!flow.isPass()){ |
| | | entity.setStatus(AuditStatusConstant.REJECT_AUDIT); |
| | | } |
| | | |
| | | //通过且下一个节点结束流程时 |
| | | if (flow.isPass() && getEndNode(task, entity.getProcessDefinitionId())) { |
| | | //替换车辆信息 |
| | | CarEntity searchCar = new CarEntity(); |
| | | searchCar.setApplicationId(applicationEntity.getId().toString()); |
| | | |
| | | List<CarEntity> listCar = carService.list(Condition.getQueryWrapper(searchCar)); |
| | | listCar.forEach(car->{ |
| | | if (car.getStatus().equals("1")){ |
| | | car.setStatus("2"); |
| | | }else if (car.getStatus().equals("3") && car.getCarChangeId().equals(entity.getId().toString())){ |
| | | car.setStatus("1"); |
| | | } |
| | | }); |
| | | carService.updateBatchById(listCar); |
| | | //修改流程状态 |
| | | entity.setStatus(AuditStatusConstant.FINISH); |
| | | } |
| | | |
| | | updateById(entity); |
| | | |
| | | // 创建变量 |
| | | Map<String, Object> variables = flow.getVariables(); |
| | | if (variables == null) { |
| | | variables = Kv.create(); |
| | | } |
| | | variables.put(ProcessConstant.PASS_KEY, flow.isPass()); |
| | | // 完成任务 |
| | | taskService.complete(taskId, variables); |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | public ApplicationCarChangeVO getVo(ApplicationCarChangeEntity detail) { |
| | | ApplicationCarChangeVO vo = ApplicationCarChangeWrapper.build().entityVO(detail); |
| | | CarEntity carEntity = new CarEntity(); |
| | | carEntity.setCarChangeId(detail.getId().toString()); |
| | | carEntity.setStatus("3"); |
| | | vo.setCarEntity(carService.getOne(Condition.getQueryWrapper(carEntity))); |
| | | return vo; |
| | | } |
| | | |
| | | /** |
| | | * 判断是否包含最终节点且为倒数第二个节点 |
| | | * @param task |
| | | * @param definitionId |
| | | * @return |
| | | */ |
| | | public boolean getEndNode(Task task, String definitionId){ |
| | | boolean isEnd=false; |
| | | boolean finalTask = false; |
| | | BpmnModel bpmnModel = repositoryService.getBpmnModel(definitionId); |
| | | FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); |
| | | List<SequenceFlow> outgoingFlows = flowNode.getOutgoingFlows(); |
| | | for (SequenceFlow outgoingFlow : outgoingFlows) { |
| | | FlowElement targetFlowElement = outgoingFlow.getTargetFlowElement(); |
| | | FlowElement sourceFlowElement = outgoingFlow.getSourceFlowElement(); |
| | | if (sourceFlowElement.getId().equals("finalTask")){ |
| | | finalTask = true; |
| | | } |
| | | if (targetFlowElement instanceof EndEvent){ |
| | | isEnd = true; |
| | | break; |
| | | } |
| | | } |
| | | return isEnd&&finalTask; |
| | | } |
| | | } |