首先创建一个自定义注解,此注解使用在流程抄送的service方法上
import java.lang.annotation.*;
/**
* 流程需要抄送的功能
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FuncCCAnnotation {
String desc() default "";
String funcId() default "";
}
使用时只需要在方法上注解
/**
* 完成任务
*
* @param baseProcessForm 流程任务表单
* @return string
*/
@Override
@Transactional(rollbackFor = RuntimeException.class)
@FuncCCAnnotation(desc ="通过", funcId ="5")
public StringcompleteTask(BaseProcessForm baseProcessForm) {
//具体省略
}
最后创建aop
import java.lang.reflect.Method;
import java.util.*;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import javax.validation.constraints.NotNull;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.sx.common.exception.SxException;
import com.sx.common.util.ServletUtil;
import com.sx.gov.express.annotation.FuncCCAnnotation;
import com.sx.gov.express.entity.SxFlowCc;
import com.sx.gov.express.form.BaseProcessForm;
import com.sx.gov.express.service.SxFlowCcService;
import com.sx.smart.form.util.DbUtils;
import com.sx.system.constants.SystemCommonConstants;
import com.sx.system.mapper.SysUserMapper;
import com.sx.system.uitl.UserUtil;
import com.sx.work.flow.exceptionhandler.FlowExceptionEnum;
import com.sx.work.flow.mapper.FlowIdentityMapper;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.flowable.bpmn.model.*;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.TaskService;
import org.flowable.task.api.Task;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@Aspect
@Component
public class FuncCcAop {
@Autowired
private TaskServicetaskService;
@Autowired
private RepositoryServicerepositoryService;
@Autowired
private FlowIdentityMapperflowIdentityMapper;
@Autowired
private SysUserMapperuserMapper;
@Autowired
private SxFlowCcServicesxFlowCcService;
/**
* 切面
*/
@Pointcut("@annotation(com.sx.gov.express.annotation.FuncCCAnnotation)")
public void insertCC() {
}
/**
* 环绕操作
*
* @param point 切入点
* @return 原方法返回值
* @throws Throwable 异常信息
*/
@Around("insertCC()")
public Object aroundLog(@NotNull ProceedingJoinPoint point)throws Throwable {
String methodName = point.getSignature().getName();
String declaringTypeName = point.getSignature().getDeclaringTypeName();
Signature signature = point.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
Object[] paramValues = point.getArgs();
// String[] paramNames = ((MethodSignature) point.getSignature()).getParameterNames();
BaseProcessForm baseProcessForm = (BaseProcessForm) paramValues[0];
String flowTaskId = baseProcessForm.getFlowTaskId();
Task task =taskService.createTaskQuery().includeProcessVariables().taskId(flowTaskId).singleResult();
BpmnModel bpmnModel =repositoryService.getBpmnModel(task.getProcessDefinitionId());
FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey());
// 查找当前节点的用户配置
Map> extensionElements = flowNode.getExtensionElements();
List ccCustom = extensionElements.get("ccCustom");
if (ccCustom !=null) {
FuncCCAnnotation funcCCAnnotation = method.getAnnotation(FuncCCAnnotation.class);
String action = funcCCAnnotation.desc();
String funcId = funcCCAnnotation.funcId();
ExtensionAttribute ccFuncId = ccCustom.get(0).getAttributes().get("funcId").get(0);
String[] ccFuncIds = ccFuncId.getValue().split(",");
if (ArrayUtils.contains(ccFuncIds, funcId)) {
String itemCode = (String) task.getProcessVariables().get("itemCode");
String taskCode = (String) task.getProcessVariables().get("taskCode");
String itemName = DbUtils.getItemByCode(itemCode).getItemName();
String userTaskId = task.getTaskDefinitionKey();
String userTaskName = task.getName();
String createUserName = UserUtil.getUser().getUserName();
Set userSet = userTaskVariables(ccCustom, itemCode, taskCode);
List sxFlowCcList = userSet.stream().map(uid -> {
SxFlowCc sxFlowCc =new SxFlowCc();
sxFlowCc.setItemCode(itemCode);
sxFlowCc.setTaskCode(taskCode);
sxFlowCc.setItemName(itemName);
sxFlowCc.setAction(action);
sxFlowCc.setUserTaskId(userTaskId);
sxFlowCc.setUserTaskName(userTaskName);
sxFlowCc.setCcUserId(Integer.parseInt(uid));
sxFlowCc.setCcUserName(UserUtil.getUserInfo(uid).getUserName());
sxFlowCc.setCreateUserName(createUserName);
return sxFlowCc;
}).collect(Collectors.toList());
if (CollUtil.isNotEmpty(userSet)) {
sxFlowCcService.saveBatch(sxFlowCcList);
}
}
}
return point.proceed();
}
/**
* 具体处理用户信息
*
* @param ccCustom
* @return Set
*/
private SetuserTaskVariables(List ccCustom, String itemCode, String taskCode) {
Set assigneeSet =new HashSet<>();
Map valueMap =null;
// 人员处理--直接设置用户uid
boolean userFlag = ccCustom.get(0).getAttributes().get("userFlag") !=null;
boolean roleFlag = ccCustom.get(0).getAttributes().get("roleFlag") !=null;
boolean orgFlag = ccCustom.get(0).getAttributes().get("orgFlag") !=null;
if (userFlag) {
Map> childElements = ccCustom.get(0).getChildElements();
Map> user = childElements.get("user").get(0).getAttributes();
String formField = user.get("formField").get(0).getValue();
List uid = Arrays.asList(user.get("uid").get(0).getValue().split(","));
if ("1".equals(formField)) {
//指定人员
assigneeSet.addAll(uid);
}else if ("2".equals(formField)) {
//从表单中获取录入的人员信息
valueMap = DbUtils.getValMapByItem(itemCode, taskCode);
Map finalValueMap = valueMap;
List collectIds = uid.stream().map(id -> String.valueOf(finalValueMap.get(id))).collect(Collectors.toList());
collectIds.forEach(collectId -> {
assigneeSet.addAll(Arrays.stream(collectId.split(",")).collect(Collectors.toList()));
});
}
}
// 角色处理--查找到角色相对应的uid
if (roleFlag) {
Set assigneeRolSet =new HashSet<>();
Map> childElements = ccCustom.get(0).getChildElements();
List roleIds = Arrays.asList(
childElements.get("role").get(0).getAttributes().get("roleId").get(0).getValue().split(","));
Set uids =flowIdentityMapper.selectUidByRoleIds(roleIds);
assigneeRolSet.addAll(uids);
if (userFlag) {
//如果配置了人员信息,则取交集
assigneeSet.retainAll(assigneeRolSet);
}else {
assigneeSet.addAll(assigneeRolSet);
}
}
// 部门机构处理--查找到部门相对应的uid
if (orgFlag) {
Set assigneeOrgSet =new HashSet<>();
Map> childElements = ccCustom.get(0).getChildElements();
Map> org = childElements.get("org").get(0).getAttributes();
String formField = org.get("formField").get(0).getValue();
List orgIds = Arrays.asList(org.get("orgId").get(0).getValue().split(","));
if ("2".equals(formField)) {
//"2"表示从表单字段中获取机构信息
valueMap = valueMap ==null ? DbUtils.getValMapByItem(itemCode, taskCode) : valueMap;
Map finalValueMap1 = valueMap;
List orgs =new ArrayList<>();
orgIds.forEach(orgId -> {
//拿到字段对应的值 格式为[{"name":"市场监督管理局","value":"438"}]
String values = String.valueOf(finalValueMap1.get(orgId));
//从机构信息中获取机构id
JSONArray objects = JSONArray.parseArray(values);
for (Object object : objects) {
JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(object));
String value = jsonObject.getString("value");
orgs.add(value);
}
});
orgIds = orgs;
}
Set uids =flowIdentityMapper.selectUidByOrgIds(orgIds);
assigneeOrgSet.addAll(uids);
if (userFlag || roleFlag) {
//如果配置了人员信息或者权限标识,则取交集
assigneeSet.retainAll(assigneeOrgSet);
}else {
assigneeSet.addAll(assigneeOrgSet);
}
}
return assigneeSet;
}
}
以上为核心代码