/*
|
* Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
|
*
|
* Redistribution and use in source and binary forms, with or without
|
* modification, are permitted provided that the following conditions are met:
|
*
|
* Redistributions of source code must retain the above copyright notice,
|
* this list of conditions and the following disclaimer.
|
* Redistributions in binary form must reproduce the above copyright
|
* notice, this list of conditions and the following disclaimer in the
|
* documentation and/or other materials provided with the distribution.
|
* Neither the name of the dreamlu.net developer nor the names of its
|
* contributors may be used to endorse or promote products derived from
|
* this software without specific prior written permission.
|
* Author: Chill 庄骞 (smallchill@163.com)
|
*/
|
package org.springblade.modules.application.service.impl;
|
|
import com.aliyun.oss.ServiceException;
|
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.impl.persistence.entity.ExecutionEntity;
|
import org.flowable.engine.runtime.ProcessInstance;
|
import org.flowable.task.api.Task;
|
import org.springblade.common.utils.CommonUtil;
|
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.flow.core.utils.TaskUtil;
|
import org.springblade.modules.application.entity.*;
|
import org.springblade.modules.application.service.*;
|
import org.springblade.modules.application.vo.ApplicationVO;
|
import org.springblade.modules.application.mapper.ApplicationMapper;
|
import org.springblade.core.mp.base.BaseServiceImpl;
|
import org.springblade.modules.application.wrapper.ApplicationWrapper;
|
import org.springblade.modules.enterprise.wrapper.EnterpriseWrapper;
|
import org.springblade.modules.reject.entity.RejectEntity;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* 申请表 服务实现类
|
*
|
* @author BladeX
|
* @since 2022-12-13
|
*/
|
@Service
|
@AllArgsConstructor
|
public class ApplicationServiceImpl extends BaseServiceImpl<ApplicationMapper, ApplicationEntity> implements IApplicationService {
|
private final IBasicInfoService basicInfoService;
|
private final IPlanService planService;
|
private final ISchemeService schemeService;
|
private final IGoodsService goodsService;
|
private final ICarService carService;
|
|
private final IFlowService flowService;
|
private final TaskService taskService;
|
private final RuntimeService runtimeService;
|
private final RepositoryService repositoryService;
|
|
@Override
|
public IPage<ApplicationVO> selectApplicationPage(IPage<ApplicationVO> page, ApplicationVO application) {
|
return page.setRecords(baseMapper.selectApplicationPage(page, application));
|
}
|
|
@Transactional
|
@Override
|
public Boolean saveVo(ApplicationEntity application, BasicInfoEntity basicInfoEntity, CarEntity carEntity, PlanEntity planEntity, SchemeEntity schemeEntity, GoodsEntity goodsEntity) {
|
|
boolean result = false;
|
//保存
|
ApplicationEntity applicationEntity = getMaxNoEntity();
|
String str = "";
|
if (applicationEntity != null) {
|
str = applicationEntity.getNo();
|
}
|
application.setNo(CommonUtil.createNo("", str));
|
boolean save = super.save(application);
|
|
basicInfoEntity.setApplicationId(application.getId().toString());
|
boolean b = basicInfoService.save(basicInfoEntity);
|
|
planEntity.setApplicationId(application.getId().toString());
|
boolean p = planService.save(planEntity);
|
|
schemeEntity.setApplicationId(application.getId().toString());
|
boolean s = schemeService.save(schemeEntity);
|
|
goodsEntity.setApplicationId(application.getId().toString());
|
boolean g = goodsService.save(goodsEntity);
|
|
carEntity.setApplicationId(application.getId().toString());
|
boolean c = carService.save(carEntity);
|
result = b && p && s && g && c && save;
|
|
return result;
|
}
|
|
@Override
|
public ApplicationVO getVo(ApplicationEntity application) {
|
ApplicationVO applicationVO = ApplicationWrapper.build().entityVO(application);
|
String applicationId = applicationVO.getId().toString();
|
|
applicationVO.setBasicInfoEntity(basicInfoService.getOne(Condition.getQueryWrapper(new BasicInfoEntity(applicationId))));
|
applicationVO.setSchemeEntity(schemeService.getOne(Condition.getQueryWrapper(new SchemeEntity(applicationId))));
|
applicationVO.setPlanEntity(planService.getOne(Condition.getQueryWrapper(new PlanEntity(applicationId))));
|
applicationVO.setCarEntity(carService.getOne(Condition.getQueryWrapper(new CarEntity(applicationId))));
|
applicationVO.setBasicInfoEntity(basicInfoService.getOne(Condition.getQueryWrapper(new BasicInfoEntity(applicationId))));
|
|
GoodsEntity goods = goodsService.getOne(Condition.getQueryWrapper(new GoodsEntity(applicationId)));
|
applicationVO.setGoodsEntity(goods);
|
applicationVO.setGoodsName(goods.getGoodsName());
|
return applicationVO;
|
}
|
|
@Override
|
@Transactional
|
public Boolean updateVoById(ApplicationEntity application, BasicInfoEntity basicInfoEntity, CarEntity carEntity, PlanEntity planEntity, SchemeEntity schemeEntity, GoodsEntity goodsEntity) {
|
String applicationId = application.getId().toString();
|
basicInfoEntity.setId(basicInfoService.getOne(Condition.getQueryWrapper(new BasicInfoEntity(applicationId))).getId());
|
carEntity.setId(carService.getOne(Condition.getQueryWrapper(new CarEntity(applicationId))).getId());
|
planEntity.setId(planService.getOne(Condition.getQueryWrapper(new PlanEntity(applicationId))).getId());
|
schemeEntity.setId(schemeService.getOne(Condition.getQueryWrapper(new SchemeEntity(applicationId))).getId());
|
goodsEntity.setId(goodsService.getOne(Condition.getQueryWrapper(new GoodsEntity(applicationId))).getId());
|
|
boolean b = basicInfoService.updateById(basicInfoEntity);
|
boolean c = carService.updateById(carEntity);
|
boolean p = planService.updateById(planEntity);
|
boolean s = schemeService.updateById(schemeEntity);
|
boolean g = goodsService.updateById(goodsEntity);
|
boolean update = super.updateById(application);
|
return b && p && s && g && c && update;
|
}
|
|
@Override
|
public ApplicationEntity getByNo(String no) {
|
return baseMapper.getByNo(no);
|
}
|
|
@Override
|
public Boolean startProcess(ApplicationEntity application, BasicInfoEntity basicInfoEntity, CarEntity carEntity, PlanEntity planEntity, SchemeEntity schemeEntity, GoodsEntity goodsEntity) {
|
|
boolean result = false;
|
String businessTable = FlowUtil.getBusinessTable(ProcessConstant.AUDIT_KEY);
|
if (Func.isEmpty(application.getId())) {
|
//保存
|
ApplicationEntity applicationEntity = getMaxNoEntity();
|
String str = "";
|
if (applicationEntity != null) {
|
str = applicationEntity.getNo();
|
}
|
application.setNo(CommonUtil.createNo("", str));
|
boolean save = super.save(application);
|
|
basicInfoEntity.setApplicationId(application.getId().toString());
|
boolean b = basicInfoService.save(basicInfoEntity);
|
|
planEntity.setApplicationId(application.getId().toString());
|
boolean p = planService.save(planEntity);
|
|
schemeEntity.setApplicationId(application.getId().toString());
|
boolean s = schemeService.save(schemeEntity);
|
|
goodsEntity.setApplicationId(application.getId().toString());
|
boolean g = goodsService.save(goodsEntity);
|
|
carEntity.setApplicationId(application.getId().toString());
|
boolean c = carService.save(carEntity);
|
result = b && p && s && g && c && save;
|
|
//启动流程
|
Kv variables = Kv.create()
|
.set(ProcessConstant.TASK_VARIABLE_CREATE_USER, basicInfoEntity.getName())
|
.set("taskUser", TaskUtil.getTaskUser(application.getTaskUser()));
|
BladeFlow flow = flowService.startProcessInstanceById(application.getProcessDefinitionId(), FlowUtil.getBusinessKey(businessTable, String.valueOf(application.getId())), variables);
|
if (Func.isNotEmpty(flow)) {
|
log.error("流程已启动,流程ID:" + flow.getProcessInstanceId());
|
// 返回流程id写入leave
|
application.setProcessInstanceId(flow.getProcessInstanceId());
|
updateById(application);
|
} else {
|
throw new ServiceException("开启流程失败");
|
}
|
} else {
|
updateById(application);
|
}
|
|
return result;
|
}
|
|
@Override
|
public Boolean completeTask(BladeFlow flow, ApplicationEntity applicationEntity, RejectEntity rejectEntity) {
|
String taskId = flow.getTaskId();
|
|
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
|
|
// 通过任务对象获取流程实例
|
ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
|
// 通过流程实例获取“业务键”
|
String businessKey = pi.getBusinessKey().split(":")[1];
|
|
//获取实例对象改变业务状态
|
ApplicationEntity entity = getById(businessKey);
|
|
if (!StringUtil.isBlank(applicationEntity.getSuggestion())){
|
entity.setSuggestion(applicationEntity.getSuggestion());
|
}
|
if (entity.getStatus() == 1){
|
entity.setStatus(2);
|
}
|
|
String processInstanceId = flow.getProcessInstanceId();
|
String comment = Func.toStr(flow.getComment(), ProcessConstant.PASS_COMMENT);
|
// 增加评论
|
if (StringUtil.isNoneBlank(processInstanceId, comment)) {
|
taskService.addComment(taskId, processInstanceId, comment);
|
}
|
// 创建变量
|
Map<String, Object> variables = flow.getVariables();
|
if (variables == null) {
|
variables = Kv.create();
|
}
|
variables.put("suggestion",Func.toStr(applicationEntity.getSuggestion(),""));
|
variables.put(ProcessConstant.PASS_KEY, flow.isPass());
|
// 完成任务
|
taskService.complete(taskId, variables);
|
|
|
//判读是否有末尾节点
|
if (getEndNode(task,entity.getProcessDefinitionId())){
|
//判断是否pass
|
if ((Boolean)variables.get(ProcessConstant.PASS_KEY)){
|
//改变业务状态
|
entity.setStatus(10);
|
//生成通行证
|
|
|
}
|
}
|
updateById(entity);
|
return true;
|
}
|
|
/**
|
* 获取最大编号
|
*
|
* @return
|
*/
|
public ApplicationEntity getMaxNoEntity() {
|
return baseMapper.getMaxNoEntity();
|
}
|
|
public boolean getEndNode(Task task,String definitionId){
|
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();
|
if (targetFlowElement instanceof EndEvent){
|
return true;
|
}
|
}
|
return false;
|
}
|
}
|