Commit fcffbf59 by 赵剑炜

增加自审批工作流

parent 37140e2e
......@@ -23,6 +23,7 @@ public class EquipmentTypeDto {
private Boolean isLeaf;
private List<String> supplierList;
private String photo;
private Integer childCount;
private List<EquipmentTypeDto> children = new ArrayList<>();
public void addChild(EquipmentTypeDto child) {
......
......@@ -21,21 +21,23 @@ import com.junmp.v2.message.api.bean.req.MessageSendReq;
import com.junmp.v2.sys.api.UserServiceApi;
import com.junmp.v2.sys.api.bean.user.dto.RoleUserDto;
import com.junmp.v2.sys.api.bean.user.vo.QueryUserInfoVo;
import com.junmp.v2.sys.user.service.SysUserService;
import org.flowable.bpmn.model.Process;
import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.TaskService;
import org.flowable.engine.*;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import com.junmp.junmpProcess.enums.AssigneeTypeEnums;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.task.api.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.*;
import static com.junmp.junmpProcess.common.CommonConstants.BUSINESS_STATUS_4;
import static com.junmp.junmpProcess.common.CommonConstants.PROCESS_STATUS;
import static com.junmp.junmpProcess.utils.BpmnModelUtils.getChildNode;
/**
......@@ -44,6 +46,8 @@ import static com.junmp.junmpProcess.utils.BpmnModelUtils.getChildNode;
*/
@Component
public class CounterSignListener implements ExecutionListener {
@Autowired
private ProcessEngine processEngine;
@Resource
private TaskService taskService;
@Resource
......@@ -178,34 +182,59 @@ public class CounterSignListener implements ExecutionListener {
}
else if (Type.equals("10"))//自己审批
{
assigneeList.add(LoginContext.getContext().getLoginUser().getUserId().toString());
execution.setVariable("skip", true);
// // 查询当前执行流程实例的任务列表
// String processInstanceId = execution.getProcessInstanceId();
// List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstanceId).list();
//
// // 如果任务列表为空,说明流程刚启动,直接完成整个流程实例
// if (tasks.isEmpty()) {
// ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// RuntimeService runtimeService = processEngine.getRuntimeService();
// runtimeService.deleteProcessInstance(processInstanceId, "自动审批通过");
// } else {
// // 完成找到的第一个任务
// taskService.complete(tasks.get(0).getId(), null);
// }
}
if (assigneeList.size()!=0)
{
execution.setVariable(variable, assigneeList);
assigneeList.forEach(userId->//为相应的用户推送消息
{
MessageSendReq sendReq = new MessageSendReq();
sendReq.setReceiveUserIds(String.valueOf(userId));
sendReq.setMsgTitle("单据审批提示");
sendReq.setBizType("单据审批");
sendReq.setMsgContent("您有一条单据流程需要进行审批");
sendReq.setPriority("0");
sendReq.setSendTime(DateTime.now());
messageApi.sendMessage(sendReq);
messageApi.queryCount(new MessageReq());
/*推送发送未读数量*/
MessageReq req1 = new MessageReq();
req1.setReadFlag(0);
req1.setReceiveUserId(Long.valueOf(userId));
Integer count1 = messageApi.queryCount(req1);
messageApi.pushMsgToUser(userId,count1);
if (userId!=LoginContext.getContext().getLoginUser().getUserId().toString())//非本人审核单据
{
MessageSendReq sendReq = new MessageSendReq();
sendReq.setReceiveUserIds(String.valueOf(userId));
sendReq.setMsgTitle("单据审批提示");
sendReq.setBizType("单据审批");
sendReq.setMsgContent("您有一条单据流程需要进行审批");
sendReq.setPriority("0");
sendReq.setSendTime(DateTime.now());
messageApi.sendMessage(sendReq);
messageApi.queryCount(new MessageReq());
/*推送发送未读数量*/
MessageReq req1 = new MessageReq();
req1.setReadFlag(0);
req1.setReceiveUserId(Long.valueOf(userId));
Integer count1 = messageApi.queryCount(req1);
messageApi.pushMsgToUser(userId,count1);
}
});
}
} else {
}
}
}
......@@ -63,6 +63,7 @@ import java.util.stream.Collectors;
@SneakyThrows
@Override
protected void processCompleted(FlowableEngineEntityEvent event) {
if (event.getType() == FlowableEngineEventType.PROCESS_COMPLETED) {
// 获取流程实例ID
String processInstanceId = event.getProcessInstanceId();
......@@ -70,7 +71,11 @@ import java.util.stream.Collectors;
// 获取流程定义ID
String processDefinitionId = event.getProcessDefinitionId();
List<HistoricVariableInstance> orderType = historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstanceId).variableName("orderType").list();
String Type= orderType.get(0).getValue().toString();
if(orderType.size()>0)
{
String Type= orderType.get(0).getValue().toString();
if (Type.equals("workOrder"))//出入库单据
{
OrderMainReq req=new OrderMainReq();
......@@ -112,31 +117,7 @@ import java.util.stream.Collectors;
if (Type.equals("stocktakeOrder")){//盘库申请单
}
// 获取流程实例关联的变量
// Map<String, Object> processVariables = getProcessVariables(processInstanceId);
// if (processVariables!=null)
// {
// // 获取单据类型
// String documentType = (String) processVariables.get("documentType");
// updateOrderReq = JSONObject.parseObject(documentType, new TypeReference<UpdateOrderReq>() {
// });
// updateOrderReq.setExamineState("finished");
// updateOrderReq.setOrderState("ready");
// orderMainService.updateOrder(updateOrderReq);
// // 获取单据类型
// String orderReq = (String) processVariables.get("orderReq");
// // 根据单据类型执行不同的操作
// if ("equipment".equals(documentType)) {
// // 执行装备相关操作,防止循环应用,丢入消息队列
// orderMainService.AddOrder(updateOrderReq);
// } else if ("personnel".equals(documentType)) {
// // 执行人员相关操作
// // ...
// }
// }
}
}
}
......
package com.junmp.jyzb.listener;
import org.flowable.engine.RepositoryService;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.junmp.v2.auth.api.context.LoginContext;
import org.apache.commons.lang3.BooleanUtils;
import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author LoveMyOrange
* @create 2022-10-15 19:47
*/
@Component
public class ServiceListener implements ExecutionListener {
@Resource
private RepositoryService repositoryService;
public class SkipTaskListener implements ExecutionListener {
@Override
public void notify(DelegateExecution execution) {
Object skip=execution.getVariable("skip");
}
}
......@@ -287,23 +287,39 @@ public class EquipmentTypeServiceImpl extends ServiceImpl<EquipmentTypeMapper, E
public List<EquipmentTypeDto> buildTypeTree(List<EquipmentType> searchResults, List<EquipmentType> allTypes) {
Map<String, EquipmentTypeDto> typeDtoMap = new HashMap<>();
// 将所有组织机构转换为OrgDto并放入map中
// 将所有设备类型转换为EquipmentTypeDto并放入map中,同时计算子节点数量
for (EquipmentType type : allTypes) {
EquipmentTypeDto typeDto = new EquipmentTypeDto();
BeanPlusUtil.copyProperties(type, typeDto);
// 其他字段的映射...
// 将OrgDto放入map中,以orgId为键
// 计算子节点数量
int childCount = 0;
for (EquipmentType childType : allTypes) {
if (childType.getParentId().equals(type.getId())) {
childCount++;
}
}
typeDto.setChildCount(childCount);
if (childCount<=0)
{
typeDto.setIsLeaf(true);
}
else
{
typeDto.setIsLeaf(false);
}
// 将EquipmentTypeDto放入map中,以id为键
typeDtoMap.put(typeDto.getId(), typeDto);
}
List<EquipmentTypeDto> tree = new ArrayList<>();
// 遍历所有搜索到的组织机构数据,构建树
// 遍历所有搜索到的设备类型数据,构建树
for (EquipmentType searchResult : searchResults) {
EquipmentTypeDto typeDto = typeDtoMap.get(searchResult.getId());
// 如果找到对应的OrgDto
// 如果找到对应的EquipmentTypeDto
if (typeDto != null && !tree.contains(typeDto)) {
// 从当前节点开始,依次向上查找上级节点,直到最顶层
String parentId = typeDto.getParentId();
......@@ -320,7 +336,7 @@ public class EquipmentTypeServiceImpl extends ServiceImpl<EquipmentTypeMapper, E
// 如果上级节点是最顶层,将上级节点添加到树中,确保不重复添加
if (parentDto.getParentId().equals("00000000-0000-0000-0000-000000000000")
&&parentDto.getId()!="00000000-0000-0000-0000-000000000000" && !tree.contains(parentDto)) {
&& !parentDto.getId().equals("00000000-0000-0000-0000-000000000000") && !tree.contains(parentDto)) {
tree.add(parentDto);
}
......@@ -331,6 +347,7 @@ public class EquipmentTypeServiceImpl extends ServiceImpl<EquipmentTypeMapper, E
parentId = null; // 上级节点不存在,跳出循环
}
}
}
}
......
......@@ -314,6 +314,7 @@ public class PubOrgServiceImpl extends ServiceImpl<PubOrgMapper, PubOrg> implem
}
// Convert PubOrg list to OrgDto list
List<OrgDto> orgs = new ArrayList<>();
list.forEach(p -> {
OrgDto org = new OrgDto();
BeanPlusUtil.copyProperties(p, org);
......@@ -394,11 +395,11 @@ public class PubOrgServiceImpl extends ServiceImpl<PubOrgMapper, PubOrg> implem
// 添加 MatchQueryBuilder 作为 must 条件
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("dName", keyword).operator(Operator.AND);
MatchQueryBuilder matchQueryBuilder2 = QueryBuilders.matchQuery("dName.pinyin", keyword).operator(Operator.AND);
// MatchQueryBuilder matchQueryBuilder2 = QueryBuilders.matchQuery("dName.pinyin", keyword).operator(Operator.AND);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(matchQueryBuilder);
boolQueryBuilder.should(matchQueryBuilder2);
// boolQueryBuilder.should(matchQueryBuilder2);
// 添加过滤条件,只获取 delFlag 为 1 的数据
builder.postFilter(QueryBuilders.termQuery("delFlag", 1));
......@@ -516,7 +517,7 @@ public class PubOrgServiceImpl extends ServiceImpl<PubOrgMapper, PubOrg> implem
public List<OrgDto> getOrgTreeByEs(QueryOrgReq req) throws IOException {
// 先进行搜索,获取前20条数据
List<PubOrg> searchResults = searchOrg(0, 15, req.getOrgName());
List<PubOrg> searchResults = searchOrg(0, 10, req.getOrgName());
req.setDelFlag(1);
LambdaQueryWrapper<PubOrg> wp = this.createWrapper(req);
// 获取所有组织机构数据
......@@ -624,6 +625,7 @@ public class PubOrgServiceImpl extends ServiceImpl<PubOrgMapper, PubOrg> implem
LambdaQueryWrapper<PubOrg> wp= this.createWrapper(req);
List<PubOrg> list = this.list(wp);
List<OrgDto> orgs=new ArrayList<>();
Comparator<PubOrg> orgComparator = (org1, org2) -> {
String orgCode1 = org1.getOrgCode();
......
......@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.junmp.junmpProcess.dto.StartProcessInstanceDTO;
import com.junmp.junmpProcess.factory.FlowServiceFactory;
import com.junmp.junmpProcess.service.IFlowInstanceService;
......@@ -20,6 +21,8 @@ import com.junmp.v2.common.util.BeanPlusUtil;
import com.junmp.v2.sys.user.entity.SysUser;
import com.junmp.v2.sys.user.service.SysUserService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.BooleanUtils;
import org.flowable.bpmn.model.UserTask;
import org.flowable.common.engine.api.FlowableObjectNotFoundException;
import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.engine.history.HistoricActivityInstance;
......@@ -136,25 +139,41 @@ public class FlowInstanceServiceImpl extends FlowServiceFactory implements IFlow
// {
// return ApiRes.failure("流程不存在或已挂起");
// }
try {
// try {
ProcessInstance processInstance = processInstanceBuilder
.processDefinitionId(processInstanceDto.getProcessDefinitionId())
.variable("initiator",StartUser.getUserId())
.variables(processVariables)
.variable("initiator", StartUser != null ? StartUser.getUserId() : null)
.variables(processVariables != null ? processVariables : Collections.emptyMap())
.businessStatus(BUSINESS_STATUS_1)
.start();
// 从流程执行上下文中获取流程变量
Object skip = runtimeService.getVariable(processInstance.getId(), "skip");
if (ObjectUtils.isNotEmpty(skip) && BooleanUtils.toBoolean(skip.toString())){
Task currentTask = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
// 直接完成当前任务
taskService.complete(currentTask.getId());
return processInstance.getId();
}
else
{
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
task.setAssignee(StartUser.getUserId().toString());
return processInstance.getProcessInstanceId();
} catch (Exception e) {
String fullErrorMessage = getFullErrorMessage(e);
// 处理在启动流程实例时发生的异常
throw new ServiceException(OrderExceptionEnum.ROLE_ERROR);
// throw new ServiceException(fullErrorMessage);
}
// } catch (Exception e) {
// String fullErrorMessage = getFullErrorMessage(e);
// // 处理在启动流程实例时发生的异常
// throw new ServiceException(OrderExceptionEnum.ROLE_ERROR);
//// throw new ServiceException(fullErrorMessage);
//
// }
//手动完成第一个任务
}
......
......@@ -195,6 +195,8 @@ public class BpmnConvert {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode[] approverGroups = objectMapper.convertValue(node.get("approverGroups"), JsonNode[].class);
userTask.setExecutionListeners(getTaskListeners());//角色监听
// userTask.setExecutionListeners(SkipTaskListeners());//跳过事件监听
MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics();
// 审批人集合参数
multiInstanceLoopCharacteristics.setInputDataItem(userTask.getId()+"assigneeList");
......@@ -217,15 +219,38 @@ public class BpmnConvert {
*/
private static List<FlowableListener> getTaskListeners() {
ArrayList<FlowableListener> taskListeners = new ArrayList<>();
// 第一个监听器
FlowableListener counterSignListener = new FlowableListener();
counterSignListener.setEvent(ExecutionListener.EVENTNAME_START);
counterSignListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
counterSignListener.setImplementation("${counterSignListener}");
taskListeners.add(counterSignListener);
// 第二个监听器
FlowableListener skipTaskListener = new FlowableListener();
skipTaskListener.setEvent(ExecutionListener.EVENTNAME_START);
skipTaskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
skipTaskListener.setImplementation("${skipTaskListener}");
taskListeners.add(skipTaskListener);
return taskListeners;
}
/**
* 监听任务启动后角色分配事件
*
* @return 监听节点列表
*/
private static List<FlowableListener> SkipTaskListeners() {
ArrayList<FlowableListener> taskListeners = new ArrayList<>();
//监听器开始class
FlowableListener listener = new FlowableListener();
listener.setEvent(ExecutionListener.EVENTNAME_START);//监听任务启动
listener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
listener.setImplementation("${counterSignListener}");//启动角色分配监听事件
listener.setImplementation("${SkipTaskListener}");//启动角色分配监听事件
taskListeners.add(listener);
return taskListeners;
}
/**
* 绘制分支节点
* @param process 绘图对象
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论