|
@@ -4,10 +4,7 @@ import com.aizuda.boot.modules.flw.entity.FlwProcessActor;
|
|
|
import com.aizuda.boot.modules.flw.entity.FlwProcessCategory;
|
|
|
import com.aizuda.boot.modules.flw.entity.FlwProcessConfigure;
|
|
|
import com.aizuda.boot.modules.flw.entity.FlwProcessPermission;
|
|
|
-import com.aizuda.boot.modules.flw.entity.dto.FlwCategorySortDTO;
|
|
|
-import com.aizuda.boot.modules.flw.entity.dto.FlwProcessDTO;
|
|
|
-import com.aizuda.boot.modules.flw.entity.dto.FlwProcessPermissionDTO;
|
|
|
-import com.aizuda.boot.modules.flw.entity.dto.ProcessStartDTO;
|
|
|
+import com.aizuda.boot.modules.flw.entity.dto.*;
|
|
|
import com.aizuda.boot.modules.flw.entity.vo.FlwProcessCategoryVO;
|
|
|
import com.aizuda.boot.modules.flw.entity.vo.FlwProcessVO;
|
|
|
import com.aizuda.boot.modules.flw.flow.FlowForm;
|
|
@@ -15,8 +12,10 @@ import com.aizuda.boot.modules.flw.mapper.FlowlongMapper;
|
|
|
import com.aizuda.boot.modules.flw.service.*;
|
|
|
import com.aizuda.bpm.engine.FlowDataTransfer;
|
|
|
import com.aizuda.bpm.engine.FlowLongEngine;
|
|
|
+import com.aizuda.bpm.engine.ProcessService;
|
|
|
import com.aizuda.bpm.engine.core.FlowCreator;
|
|
|
import com.aizuda.bpm.engine.core.FlowLongContext;
|
|
|
+import com.aizuda.bpm.engine.core.enums.FlowState;
|
|
|
import com.aizuda.bpm.engine.entity.FlwInstance;
|
|
|
import com.aizuda.bpm.engine.entity.FlwProcess;
|
|
|
import com.aizuda.bpm.engine.model.*;
|
|
@@ -24,6 +23,9 @@ import com.aizuda.bpm.mybatisplus.mapper.FlwProcessMapper;
|
|
|
import com.aizuda.common.toolkit.DateUtils;
|
|
|
import com.aizuda.core.api.ApiAssert;
|
|
|
import com.aizuda.service.web.UserSession;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
@@ -43,6 +45,7 @@ import java.util.*;
|
|
|
@Service
|
|
|
@AllArgsConstructor
|
|
|
public class FlwProcessServiceImpl extends ServiceImpl<FlwProcessMapper, FlwProcess> implements IFlwProcessService {
|
|
|
+ private final ProcessService processService;
|
|
|
private IFlwProcessCategoryService flwProcessCategoryService;
|
|
|
private IFlwProcessPermissionService flwProcessPermissionService;
|
|
|
private IFlwProcessConfigureService flwProcessConfigureService;
|
|
@@ -51,6 +54,17 @@ public class FlwProcessServiceImpl extends ServiceImpl<FlwProcessMapper, FlwProc
|
|
|
private FlowlongMapper flowlongMapper;
|
|
|
private FlowLongEngine flowLongEngine;
|
|
|
|
|
|
+ @Override
|
|
|
+ public Page<FlwProcess> pageHistory(Page<FlwProcess> page, FlwProcessHistoryDTO dto) {
|
|
|
+ FlwProcess flwProcess = this.checkById(dto.getProcessId());
|
|
|
+ LambdaQueryWrapper<FlwProcess> lqw = Wrappers.lambdaQuery();
|
|
|
+ lqw.select(FlwProcess::getId, FlwProcess::getProcessName, FlwProcess::getProcessIcon,
|
|
|
+ FlwProcess::getProcessVersion, FlwProcess::getRemark, FlwProcess::getCreateTime);
|
|
|
+ lqw.eq(FlwProcess::getProcessState, 2);
|
|
|
+ lqw.eq(FlwProcess::getProcessKey, flwProcess.getProcessKey());
|
|
|
+ return super.page(page, lqw);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public List<FlwProcessCategoryVO> listCategoryAll(String keyword) {
|
|
|
return this.listCategoryVO(keyword, false);
|
|
@@ -199,41 +213,38 @@ public class FlwProcessServiceImpl extends ServiceImpl<FlwProcessMapper, FlwProc
|
|
|
int checkConditionNode = ModelHelper.checkConditionNode(rootNode);
|
|
|
if (checkConditionNode > 0) {
|
|
|
ApiAssert.fail(Objects.equals(1, checkConditionNode), "存在多个条件表达式为空");
|
|
|
- ApiAssert.fail(Objects.equals(2, checkConditionNode), "存在多个子节点为空");
|
|
|
+ ApiAssert.fail(Objects.equals(2, checkConditionNode), "存在多个条件子节点为空");
|
|
|
+ ApiAssert.fail(Objects.equals(3, checkConditionNode), "存在条件节点KEY重复");
|
|
|
}
|
|
|
ApiAssert.fail(!ModelHelper.checkExistApprovalNode(rootNode), "必须存在审批节点");
|
|
|
+ this.checkProcessKey(dto.getProcessId(), dto.getProcessKey());
|
|
|
+
|
|
|
+ // 设置创建者信息
|
|
|
+ UserSession userSession = UserSession.getLoginInfo();
|
|
|
+
|
|
|
+ // 部署流程定义,修改会产生历史流程
|
|
|
+ final Long processId = processService.deploy(dto.getProcessId(), dto.getModelContent(),
|
|
|
+ FlowCreator.of(userSession.getUserId(), userSession.getUsername()), true, flwProcess -> {
|
|
|
+ // 流程图标
|
|
|
+ flwProcess.setProcessIcon(dto.getProcessIcon());
|
|
|
+
|
|
|
+ // 流程类型
|
|
|
+ flwProcess.setProcessType(dto.getProcessType());
|
|
|
+
|
|
|
+ // 创建 0 不可用状态,需要发布后才可以使用
|
|
|
+ flwProcess.setFlowState(FlowState.inactive);
|
|
|
+
|
|
|
+ // 备注说明
|
|
|
+ flwProcess.setRemark(dto.getRemark());
|
|
|
+ });
|
|
|
|
|
|
- // 流程定义ID
|
|
|
- Long processId = dto.getProcessId();
|
|
|
- FlwProcess flwProcess = new FlwProcess();
|
|
|
- flwProcess.setProcessKey(dto.getProcessKey());
|
|
|
- flwProcess.setProcessName(dto.getProcessName());
|
|
|
- flwProcess.setProcessIcon(dto.getProcessIcon());
|
|
|
- flwProcess.setProcessType(dto.getProcessType());
|
|
|
- flwProcess.setUseScope(dto.getUseScope());
|
|
|
- flwProcess.setModelContent(dto.getModelContent());
|
|
|
- flwProcess.setProcessState(0); // 创建 0 不可用状态,需要发布后才可以使用
|
|
|
- flwProcess.setSort(1);
|
|
|
- flwProcess.setRemark(dto.getRemark());
|
|
|
- if (null == processId) {
|
|
|
- // 设置创建者信息
|
|
|
- UserSession userSession = UserSession.getLoginInfo();
|
|
|
- flwProcess.setCreateId(String.valueOf(userSession.getId()));
|
|
|
- flwProcess.setCreateBy(userSession.getUsername());
|
|
|
- flwProcess.setCreateTime(new Date());
|
|
|
- flwProcess.setProcessVersion(1); // 流程版本,默认 1
|
|
|
- ApiAssert.fail(!super.save(flwProcess), "流程定义保存失败");
|
|
|
- processId = flwProcess.getId();
|
|
|
- } else {
|
|
|
- flwProcess.setId(processId);
|
|
|
- ApiAssert.fail(!super.updateById(flwProcess), "流程定义保存失败");
|
|
|
- }
|
|
|
// 流程定义权限
|
|
|
List<FlwProcessPermissionDTO> processPermissionList = dto.getProcessPermissionList();
|
|
|
if (CollectionUtils.isNotEmpty(processPermissionList)) {
|
|
|
ApiAssert.fail(!flwProcessPermissionService.saveProcessPermissions(processId, processPermissionList),
|
|
|
"流程定义管理权限保存失败");
|
|
|
}
|
|
|
+
|
|
|
// 保存流程定义配置
|
|
|
if (null != dto.getCategoryId()) {
|
|
|
ApiAssert.fail(!flwProcessConfigureService.saveByDto(processId, dto), "流程定义配置保存失败");
|
|
@@ -241,6 +252,16 @@ public class FlwProcessServiceImpl extends ServiceImpl<FlwProcessMapper, FlwProc
|
|
|
return processId;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 验证判断非历史版本流程流程唯一标识key
|
|
|
+ */
|
|
|
+ private void checkProcessKey(Long processId, String processKey) {
|
|
|
+ Long count = lambdaQuery().ne(null != processId, FlwProcess::getId, processId)
|
|
|
+ .ne(FlwProcess::getProcessState, 2)
|
|
|
+ .eq(FlwProcess::getProcessKey, processKey).count();
|
|
|
+ ApiAssert.fail(count > 0, "流程唯一标识key不允许重复");
|
|
|
+ }
|
|
|
+
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@Override
|
|
|
public boolean removeProcessInfo(Long id) {
|
|
@@ -258,14 +279,14 @@ public class FlwProcessServiceImpl extends ServiceImpl<FlwProcessMapper, FlwProc
|
|
|
protected void checkOperateApproval(Long processId) {
|
|
|
UserSession userSession = UserSession.getLoginInfo();
|
|
|
if (null == userSession || !UserSession.isAdmin(userSession.getId())) {
|
|
|
- FlwProcessPermission fpp = getFlwProcessPermissionByProcessId(processId);
|
|
|
+ FlwProcessPermission fpp = getFlwProcessPermissionByProcessId(userSession, processId);
|
|
|
ApiAssert.fail(null == fpp || !fpp.allowOperateApproval(), "无权限编辑操作审批流程");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- protected FlwProcessPermission getFlwProcessPermissionByProcessId(Long processId) {
|
|
|
- UserSession userSession = UserSession.getLoginInfo();
|
|
|
- return flwProcessPermissionService.getByUserIdAndProcessId(userSession.getId(), processId);
|
|
|
+ protected FlwProcessPermission getFlwProcessPermissionByProcessId(UserSession userSession, Long processId) {
|
|
|
+ Long userId = null == userSession ? null : userSession.getId();
|
|
|
+ return flwProcessPermissionService.getByUserIdAndProcessId(userId, processId);
|
|
|
}
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@@ -280,7 +301,7 @@ public class FlwProcessServiceImpl extends ServiceImpl<FlwProcessMapper, FlwProc
|
|
|
if (CollectionUtils.isNotEmpty(processIds)) {
|
|
|
int j = 0;
|
|
|
fpcList.add(dto.toFlwProcessCategory(++i));
|
|
|
- for(Long processId : processIds) {
|
|
|
+ for (Long processId : processIds) {
|
|
|
FlwProcess fp = new FlwProcess();
|
|
|
fp.setId(processId);
|
|
|
fp.setSort(++j);
|
|
@@ -359,4 +380,29 @@ public class FlwProcessServiceImpl extends ServiceImpl<FlwProcessMapper, FlwProc
|
|
|
temp.setProcessState(1);
|
|
|
return super.updateById(temp);
|
|
|
}
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public boolean checkoutById(Long id) {
|
|
|
+ FlwProcess flwProcess = this.checkById(id);
|
|
|
+ final int hisVersion = flwProcess.getProcessVersion();
|
|
|
+ FlwProcess currentProcess = lambdaQuery().eq(FlwProcess::getProcessKey, flwProcess.getProcessKey())
|
|
|
+ .ne(FlwProcess::getProcessState, 2).one();
|
|
|
+ if (null != currentProcess) {
|
|
|
+ // 启用历史流程,设置为当前版本
|
|
|
+ FlwProcess temp = new FlwProcess();
|
|
|
+ temp.setId(flwProcess.getId());
|
|
|
+ temp.setProcessVersion(currentProcess.getProcessVersion());
|
|
|
+ temp.setProcessState(currentProcess.getProcessState());
|
|
|
+ if (super.updateById(temp)) {
|
|
|
+ // 当前流程归档为历史状态
|
|
|
+ FlwProcess his = new FlwProcess();
|
|
|
+ his.setId(currentProcess.getId());
|
|
|
+ his.setProcessVersion(hisVersion);
|
|
|
+ his.setFlowState(FlowState.history);
|
|
|
+ return super.updateById(his);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|