fix: 自动发起流程获取当前线程登陆人问题

This commit is contained in:
2024-08-26 17:01:51 +08:00
parent f984b97eab
commit 8578c7ea3e
5 changed files with 63 additions and 12 deletions
@@ -8,6 +8,7 @@ import com.jero.common.api.vo.ResultCommon;
import com.jero.common.aspect.TranslationAspect; import com.jero.common.aspect.TranslationAspect;
import com.jero.common.constant.enums.YesOrNoEnum; import com.jero.common.constant.enums.YesOrNoEnum;
import com.jero.common.exception.JeroBootException; import com.jero.common.exception.JeroBootException;
import com.jero.common.system.vo.LoginUser;
import com.jero.modules.activiti.enums.ProcessTypeEnum; import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.common.entity.CommonVO; import com.jero.modules.activiti.process.common.entity.CommonVO;
import com.jero.modules.activiti.process.common.entity.CounterSignNodeNameConstants; import com.jero.modules.activiti.process.common.entity.CounterSignNodeNameConstants;
@@ -20,17 +21,15 @@ import com.jero.modules.activiti.process.esInitChange.entity.enums.ESPProjectTyp
import com.jero.modules.activiti.process.esInitChange.entity.vo.InitChangeDataVO; import com.jero.modules.activiti.process.esInitChange.entity.vo.InitChangeDataVO;
import com.jero.modules.activiti.process.esInitChange.mapper.ProcessEsInitChangeMapper; import com.jero.modules.activiti.process.esInitChange.mapper.ProcessEsInitChangeMapper;
import com.jero.modules.activiti.process.esInitChange.service.ProcessEsInitChangeService; import com.jero.modules.activiti.process.esInitChange.service.ProcessEsInitChangeService;
import com.jero.modules.activiti.process.esRevision.service.EsRevisionService;
import com.jero.modules.activiti.process.fb.dto.BasicProcessInfoDTO; import com.jero.modules.activiti.process.fb.dto.BasicProcessInfoDTO;
import com.jero.modules.activiti.process.fb.service.IProcessHandleService; import com.jero.modules.activiti.process.fb.service.IProcessHandleService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO; import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.service.ProcessAllService;
import com.jero.modules.activiti.service.ProcessNodeLinkService; import com.jero.modules.activiti.service.ProcessNodeLinkService;
import com.jero.modules.laws.common.constant.FieldCommon; import com.jero.modules.laws.common.constant.FieldCommon;
import com.jero.modules.laws.common.service.ILawsCommonService; import com.jero.modules.laws.common.service.ILawsCommonService;
import com.jero.modules.laws.common.util.CurrentUserUtil;
import com.jero.modules.laws.enterprise.entity.EnterpriseStandardPlan; import com.jero.modules.laws.enterprise.entity.EnterpriseStandardPlan;
import com.jero.modules.laws.enterprise.service.ESSequenceNumberProvider; import com.jero.modules.laws.enterprise.service.ESSequenceNumberProvider;
import com.jero.modules.laws.enterprise.service.EnterpriseStandardAuthDeptService;
import com.jero.modules.laws.enterprise.service.EnterpriseStandardPlanService; import com.jero.modules.laws.enterprise.service.EnterpriseStandardPlanService;
import com.jero.modules.laws.enterprise.util.EnterpriseStandardUtil; import com.jero.modules.laws.enterprise.util.EnterpriseStandardUtil;
import com.jero.modules.laws.standard.entity.LawsEnterpriseStandard; import com.jero.modules.laws.standard.entity.LawsEnterpriseStandard;
@@ -82,12 +81,6 @@ public class ProcessEsInitChangeServiceImpl extends ServiceImpl<ProcessEsInitCha
@Resource @Resource
private IProcessHandleService processHandleService; private IProcessHandleService processHandleService;
@Resource
private EsRevisionService revisionService;
@Resource
private ProcessAllService processAllService;
@Resource @Resource
private ILawsCommonService commonService; private ILawsCommonService commonService;
@@ -98,7 +91,7 @@ public class ProcessEsInitChangeServiceImpl extends ServiceImpl<ProcessEsInitCha
private TranslationAspect translationAspect; private TranslationAspect translationAspect;
@Resource @Resource
private EnterpriseStandardAuthDeptService esAdService; private CurrentUserUtil currentUserUtil;
@Override @Override
public void startProcess(InitChangeDataVO initChangeData) { public void startProcess(InitChangeDataVO initChangeData) {
@@ -217,7 +210,11 @@ public class ProcessEsInitChangeServiceImpl extends ServiceImpl<ProcessEsInitCha
Map<String, Object> variables = new HashMap<>(); Map<String, Object> variables = new HashMap<>();
variables.put("createUser", mainDraftUser); variables.put("createUser", mainDraftUser);
// 启动流程 // 启动流程
LoginUser currentUser = new LoginUser();
currentUser.setId(mainDraftUser);
currentUserUtil.bindUserToThread(currentUser);
ProcessInstance processInstance = actFlowCommonService.startProcess(processDefinitionKey, variables); ProcessInstance processInstance = actFlowCommonService.startProcess(processDefinitionKey, variables);
currentUserUtil.clearCurrentUser();
ProcessEsInitChange initChange = new ProcessEsInitChange(); ProcessEsInitChange initChange = new ProcessEsInitChange();
// 获取流程实例ID // 获取流程实例ID
String processDefinitionId = processInstance.getProcessDefinitionId(); String processDefinitionId = processInstance.getProcessDefinitionId();
@@ -7,6 +7,7 @@ import com.jero.common.api.vo.ResultCommon;
import com.jero.common.aspect.TranslationAspect; import com.jero.common.aspect.TranslationAspect;
import com.jero.common.constant.enums.YesOrNoEnum; import com.jero.common.constant.enums.YesOrNoEnum;
import com.jero.common.exception.JeroBootException; import com.jero.common.exception.JeroBootException;
import com.jero.common.system.vo.LoginUser;
import com.jero.modules.activiti.enums.ProcessTypeEnum; import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.common.entity.CommonVO; import com.jero.modules.activiti.process.common.entity.CommonVO;
import com.jero.modules.activiti.process.common.enums.ProcessType; import com.jero.modules.activiti.process.common.enums.ProcessType;
@@ -19,6 +20,7 @@ import com.jero.modules.activiti.process.fb.dto.BasicProcessInfoDTO;
import com.jero.modules.activiti.process.fb.service.IProcessHandleService; import com.jero.modules.activiti.process.fb.service.IProcessHandleService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO; import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.service.ProcessNodeLinkService; import com.jero.modules.activiti.service.ProcessNodeLinkService;
import com.jero.modules.laws.common.util.CurrentUserUtil;
import com.jero.modules.laws.enterprise.entity.EnterpriseStandardRecheckPlan; import com.jero.modules.laws.enterprise.entity.EnterpriseStandardRecheckPlan;
import com.jero.modules.laws.enterprise.service.EnterpriseStandardRecheckPlanService; import com.jero.modules.laws.enterprise.service.EnterpriseStandardRecheckPlanService;
import com.jero.modules.sys.utils.UserUtils; import com.jero.modules.sys.utils.UserUtils;
@@ -69,6 +71,9 @@ public class ProcessEsRecheckServiceImpl extends ServiceImpl<ProcessEsRecheckMap
@Resource @Resource
private EnterpriseStandardRecheckPlanService esRecheckService; private EnterpriseStandardRecheckPlanService esRecheckService;
@Resource
private CurrentUserUtil currentUserUtil;
@Override @Override
public void startProcess(ESRecheckDataVO recheckData) { public void startProcess(ESRecheckDataVO recheckData) {
// 执行流程发起前的操作 // 执行流程发起前的操作
@@ -152,7 +157,11 @@ public class ProcessEsRecheckServiceImpl extends ServiceImpl<ProcessEsRecheckMap
// 设置流程变量 // 设置流程变量
Map<String, Object> actVariables = this.setVariablesAutoStart(variables); Map<String, Object> actVariables = this.setVariablesAutoStart(variables);
// 启动流程 // 启动流程
LoginUser currentUser = new LoginUser();
currentUser.setId(userId);
currentUserUtil.bindUserToThread(currentUser);
ProcessInstance processInstance = actFlowCommonService.startProcess(processDefinitionKey, actVariables); ProcessInstance processInstance = actFlowCommonService.startProcess(processDefinitionKey, actVariables);
currentUserUtil.clearCurrentUser();
// 获取流程实例ID // 获取流程实例ID
String processDefinitionId = processInstance.getProcessDefinitionId(); String processDefinitionId = processInstance.getProcessDefinitionId();
String processInstanceId = processInstance.getId(); String processInstanceId = processInstance.getId();
@@ -13,6 +13,7 @@ import com.jero.common.api.vo.SendMessageAPI;
import com.jero.common.aspect.TranslationAspect; import com.jero.common.aspect.TranslationAspect;
import com.jero.common.constant.enums.YesOrNoEnum; import com.jero.common.constant.enums.YesOrNoEnum;
import com.jero.common.exception.JeroBootException; import com.jero.common.exception.JeroBootException;
import com.jero.common.system.vo.LoginUser;
import com.jero.modules.activiti.entity.ProcessAll; import com.jero.modules.activiti.entity.ProcessAll;
import com.jero.modules.activiti.entity.ProcessApprovalRecord; import com.jero.modules.activiti.entity.ProcessApprovalRecord;
import com.jero.modules.activiti.enums.CommitFlagEnum; import com.jero.modules.activiti.enums.CommitFlagEnum;
@@ -41,6 +42,7 @@ import com.jero.modules.activiti.service.ProcessAllService;
import com.jero.modules.activiti.service.ProcessApprovalRecordService; import com.jero.modules.activiti.service.ProcessApprovalRecordService;
import com.jero.modules.activiti.service.ProcessNodeLinkService; import com.jero.modules.activiti.service.ProcessNodeLinkService;
import com.jero.modules.laws.common.constant.MessageTemplateCodeCommon; import com.jero.modules.laws.common.constant.MessageTemplateCodeCommon;
import com.jero.modules.laws.common.util.CurrentUserUtil;
import com.jero.modules.laws.enterprise.entity.EnterpriseStandardPlan; import com.jero.modules.laws.enterprise.entity.EnterpriseStandardPlan;
import com.jero.modules.laws.enterprise.service.EnterpriseStandardPlanService; import com.jero.modules.laws.enterprise.service.EnterpriseStandardPlanService;
import com.jero.modules.laws.system.entity.LawsContactManage; import com.jero.modules.laws.system.entity.LawsContactManage;
@@ -119,6 +121,9 @@ public class EsRevisionServiceImpl extends ServiceImpl<EsRevisionMapper, Process
@Resource @Resource
private ProcessDraftService prcDraftService; private ProcessDraftService prcDraftService;
@Resource
private CurrentUserUtil currentUserUtil;
@Override @Override
public void startProcess(ESRevisionDataVO revisionData) { public void startProcess(ESRevisionDataVO revisionData) {
// 执行流程发起前的操作 // 执行流程发起前的操作
@@ -259,7 +264,11 @@ public class EsRevisionServiceImpl extends ServiceImpl<EsRevisionMapper, Process
Map<String, Object> variables = new HashMap<>(); Map<String, Object> variables = new HashMap<>();
variables.put("mainDraftUser", mainDraftUser); variables.put("mainDraftUser", mainDraftUser);
// 启动流程 // 启动流程
LoginUser currentUser = new LoginUser();
currentUser.setId(mainDraftUser);
currentUserUtil.bindUserToThread(currentUser);
ProcessInstance processInstance = actFlowCommonService.startProcess(processDefinitionKey, variables); ProcessInstance processInstance = actFlowCommonService.startProcess(processDefinitionKey, variables);
currentUserUtil.clearCurrentUser();
ProcessEsRevision revision = new ProcessEsRevision(); ProcessEsRevision revision = new ProcessEsRevision();
// 获取流程实例ID // 获取流程实例ID
String processDefinitionId = processInstance.getProcessDefinitionId(); String processDefinitionId = processInstance.getProcessDefinitionId();
@@ -4,6 +4,13 @@ import com.jero.common.system.vo.LoginUser;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.UnavailableSecurityManagerException; import org.apache.shiro.UnavailableSecurityManagerException;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.SimplePrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.ThreadContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/** /**
* @Author: liao * @Author: liao
@@ -11,8 +18,12 @@ import org.apache.shiro.UnavailableSecurityManagerException;
* @Description: 当前用户工具类 * @Description: 当前用户工具类
*/ */
@Slf4j @Slf4j
@Component
public class CurrentUserUtil { public class CurrentUserUtil {
@Autowired
private SecurityManager securityManager;
/** /**
* @Author: liao * @Author: liao
* @Date: 2023/10/26 16:58 * @Date: 2023/10/26 16:58
@@ -86,4 +97,29 @@ public class CurrentUserUtil {
} }
} }
/**
* 为当前线程绑定一个临时用户
*/
public void bindUserToThread(LoginUser tempUser) {
// 设置安全管理器
SecurityUtils.setSecurityManager(securityManager);
// 使用 SecurityManager 和用户信息构建 Subject
Subject.Builder builder = new Subject.Builder(SecurityUtils.getSecurityManager());
PrincipalCollection principalCollection = new SimplePrincipalCollection(tempUser, "yourRealmName");
builder.principals(principalCollection);
Subject subject = builder.buildSubject();
// 绑定 Subject 到当前线程
ThreadContext.bind(subject);
}
/**
* 清理当前线程中的用户信息
*/
public void clearCurrentUser() {
// 解绑当前线程的 Subject
ThreadContext.unbindSubject();
}
} }
@@ -134,10 +134,10 @@ public class ESRecheckPlanJob implements Job {
LocalDate minusMonths = recheckLocalDate.minusMonths(1); LocalDate minusMonths = recheckLocalDate.minusMonths(1);
String recheckResult = recheckPlan.getRecheckResult(); String recheckResult = recheckPlan.getRecheckResult();
// 流程中/修订/废止/封存 的不需要重新发起流程 // 流程中/修订/废止/封存 的不需要重新发起流程
if (YesOrNoEnum.YES.getValue().equals(recheckPlan.getInProcessFlag()) || if (StrUtil.isNotBlank(recheckResult) && (YesOrNoEnum.YES.getValue().equals(recheckPlan.getInProcessFlag()) ||
recheckResult.equals(RECHECK_INIT_CHANGE) || recheckResult.equals(RECHECK_INIT_CHANGE) ||
recheckResult.equals(RECHECK_ABOLISH) || recheckResult.equals(RECHECK_ABOLISH) ||
recheckResult.equals(RECHECK_ARCHIVE)) { recheckResult.equals(RECHECK_ARCHIVE))) {
// 已经发起过流程,不需要重复发起 // 已经发起过流程,不需要重复发起
log.info("企标编号为{}的企标已经达到复审日期前一个月,但是已经发起过复审流程,无需重复发起", es.getStandardNumber()); log.info("企标编号为{}的企标已经达到复审日期前一个月,但是已经发起过复审流程,无需重复发起", es.getStandardNumber());
continue; continue;