使用java实现三级审批流程业务代码,实现业务为
三级 a > b> c
二级 a>b
a -> b-> c
b驳回>a
c驳回>a
要求a和b和c都能看到审核过程(在前端体现),根据不同状态展示
@Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult updateDlfxWarnProblem(DlfxWarnProblem dlfxWarnProblem) {
DlfxProcessWarnProblem processWarnProblem = dlfxWarnProblem.getCurProcess();
dlfxWarnProblem.setUpdateTime(DateUtils.getNowDate());
processWarnProblem.setUpdateTime(DateUtils.getNowDate());
/**
* 根据提交状态submitState 判断是否进入下一阶段
* 保存:
* 根据阶段判断是否处于第一阶段:
* 一阶段:根据主键pId更新数据 problemDesc solutions
* 大于一阶段:根据主键pId更新流程表中的数据 auditDesc
* 提交:
* 1、根据阶段判断是否处于第一阶段:
* 一阶段:根据主键pId更新数据 problemDesc solutions auditStage
* 大于一阶段:
* 根据主键pId更新数据 problemDesc solutions auditStage(同意 进入下一个阶段,驳回直接回退到第一阶段且auditNum为auditNum+1)
* 根据主键pId更新流程表中的数据 auditDesc auditStage auditState(同意 进入下一个阶段,驳回直接回退到第一阶段且auditNum为auditNum+1)
* 2、根据组织机构编码查询下一环节审批人,构造流程信息插入数据,并根据该项预警是否需要发送短信来给审批人发短信
*
*/
try {
Integer submitState = dlfxWarnProblem.getSubmitState();
Long stage = dlfxWarnProblem.getAuditStage();
if (Constants.PROCESS_SAVE.equals(submitState)) {
//保存
Integer a = dlfxWarnProblemMapper.updateDlfxWarnProblem(dlfxWarnProblem);
processWarnProblem.setAuditState(Constants.PROCESS_SAVE.longValue());
dlfxProcessWarnProblemMapper.updateDlfxProcessWarnProblem(processWarnProblem);
return AjaxResult.success();
}
dlfxWarnProblem.setAuditNum(dlfxWarnProblem.getAuditNum() + 1);
// 查询配置
DlfxProcessConfig config = new DlfxProcessConfig();
config.setIsDelete(0);
List<DlfxProcessConfig> configList = dlfxProcessConfigMapper.selectDlfxProcessConfigList(config);
Map<String, List<Long>> configMap = configList.stream()
.sorted(Comparator.comparing(DlfxProcessConfig::getOrderNum))
.collect(Collectors.groupingBy(DlfxProcessConfig::getProcessCode,
Collectors.mapping(DlfxProcessConfig::getStage, Collectors.toList())));
//根据阶段查询下一环节审批人
DlfxPost dlfxPost = new DlfxPost();
List<Long> stageList = configMap.get(dlfxWarnProblem.getAuditCode());
int index;
// 现附上二级单位id
String depId = dlfxWarnProblem.getSecondDeptId();
// 审批树
List<String> auditTreeArray = Arrays.stream(Optional.ofNullable(processWarnProblem.getAuditTree())
.orElse("").split("/"))
.collect(Collectors.toList());
if (Constants.PROCESS_SUBMIT.equals(submitState)) {
if (Constants.REFUSE_STAGE.equals(dlfxWarnProblem.getAuditStage())) {
dlfxWarnProblem.setAuditStage(Constants.START_STAGE);
}
index = stageList.indexOf(dlfxWarnProblem.getAuditStage()) + 1;
if (index >= stageList.size() - 1) {
index = stageList.size() - 1;
depId = Constants.JT_DEPT_ID;
}
// 获取下一阶段
dlfxPost.setStage(stageList.get(index));
} else {
dlfxPost.setErpNumber(auditTreeArray.get(0));
depId = StrUtil.isBlank(dlfxWarnProblem.getThirdDeptId()) ? dlfxWarnProblem.getSecondDeptId()
: dlfxWarnProblem.getThirdDeptId();
}
dlfxPost.setDeptId(depId);
List<DlfxPost> posts = dlfxPostMapper.selectDlfxPostList(dlfxPost);
if (posts.isEmpty()) {
return AjaxResult.error("当前公司当前阶段没有下一阶段审批人员,请从值班用户职责配置中配置人员");
}
//防止并发,为submitInfo方法添加分布式锁
String key = dlfxWarnProblem.getpId() + dlfxWarnProblem.getProblemName();
RLock lock = redissonClient.getLock(key);
try {
lock.lock();
if (!Constants.JT_DEPT_ID.equals(depId)) {
// 查看当前流程pid是否一致的
List<DlfxProcessWarnProblem> processWarnProblems = dlfxProcessWarnProblemMapper.selectDlfxProcessWarnProblemByPid(processWarnProblem.getpId(), processWarnProblem.getAuditStage());
if (!ObjectUtils.isEmpty(processWarnProblems)) {
processWarnProblems.forEach(c -> {
//ErpNumber不相同,流程阶段相同,pid相同,表示问题重复了,删除另一个用户的信息
if (c.getErpNumber() != processWarnProblem.getErpNumber() &&
c.getAuditStage().equals(processWarnProblem.getAuditStage())) {
c.setIsDelete(1);
// todo 需要优化不能循环插入
dlfxProcessWarnProblemMapper.updateDlfxProcessWarnProblem(c);
}
});
}
}
submitInfo(dlfxWarnProblem, processWarnProblem, submitState, posts);
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
return AjaxResult.success();
} catch (
Exception e) {
e.printStackTrace();
return AjaxResult.error();
}
}
/**
* 构造流程信息
*
* @param processWarnProblem
* @param dlfxWarnProblem
* @param post
*/
public void getProcessWarnProblem(DlfxProcessWarnProblem processWarnProblem, DlfxProcessWarnProblem nextProcess, DlfxWarnProblem dlfxWarnProblem, DlfxPost post) {
nextProcess.setProcessId(null);
nextProcess.setAuditTree(processWarnProblem.getAuditTree());
nextProcess.setAuditStage(dlfxWarnProblem.getAuditStage());
nextProcess.setCreateor(DateUtils.getDate());
nextProcess.setpId(dlfxWarnProblem.getpId());
nextProcess.setAuditState(Constants.PROCESS_NEW.longValue());
nextProcess.setAuditNum(dlfxWarnProblem.getAuditNum());
nextProcess.setErpNumber(post.getErpNumber());
nextProcess.setReportName(post.getName());
nextProcess.setMobile(post.getMobile());
nextProcess.setPostCode(post.getPostCode());
nextProcess.setPostName(post.getPostName());
}
private void submitInfo(DlfxWarnProblem dlfxWarnProblem, DlfxProcessWarnProblem processWarnProblem, Integer submitState, List<DlfxPost> posts) {
dlfxWarnProblem.setAuditStage(getNextStage(dlfxWarnProblem));
// 更新问题列表
dlfxWarnProblemMapper.updateDlfxWarnProblem(dlfxWarnProblem);
//存在就不追加不存在就追加
if (StringUtils.isEmpty(processWarnProblem.getAuditTree())) {
processWarnProblem.setAuditTree(processWarnProblem.getErpNumber());
} else {
List<String> list = Arrays.stream(processWarnProblem.getAuditTree().split("/"))
.collect(Collectors.toList());
if (!list.contains(processWarnProblem.getErpNumber())) {
processWarnProblem.setAuditTree(processWarnProblem.getAuditTree() + "/" + processWarnProblem.getErpNumber());
}
}
if (Constants.PROCESS_SUBMIT.equals(submitState)) {
processWarnProblem.setAuditState(Constants.PROCESS_SUBMIT.longValue());
processWarnProblem.setAuditNum(dlfxWarnProblem.getAuditNum());
dlfxProcessWarnProblemMapper.updateDlfxProcessWarnProblem(processWarnProblem);
} else {
//驳回
processWarnProblem.setAuditState(Constants.PROCESS_REJICT.longValue());
dlfxProcessWarnProblemMapper.updateDlfxProcessWarnProblem(processWarnProblem);
}
if (Constants.SUCCESS_STAGE.equals(dlfxWarnProblem.getAuditStage())) {
// 问题落表
int success = r01YjwtService.passAdd(dlfxWarnProblem);
if (success <= 0) {
log.info("问题数据落表处理失败!");
}
} else {
DlfxProcessWarnProblem nextProcess = new DlfxProcessWarnProblem();
if (!posts.isEmpty()) {
getProcessWarnProblem(processWarnProblem, nextProcess, dlfxWarnProblem, posts.get(0));
}
dlfxProcessWarnProblemMapper.insertDlfxProcessWarnProblem(nextProcess);
}
//判断是否需要发短信
DlfxWarnConfig config = dlfxWarnProblem.getConfig();
if (config.getIsSendSms() == 0) {
String erpNumber=processWarnProblem.getAuditTree().split("/")[0];
DlfxPost dlfxPost=new DlfxPost();
dlfxPost.setErpNumber(erpNumber);
dlfxPost.setIsDelete(0);
List<DlfxPost> posts1 = dlfxPostMapper.selectDlfxPostList(dlfxPost);
//TODO 调用短信接口发送短信
if(dlfxWarnProblem.getAuditStage()==Constants.REFUSE_STAGE){
// System.out.println("您提交的问题未通过审核");
HttpSend.send(posts1.get(0).getMobile(),"您提交的问题未通过审核","");
}if(dlfxWarnProblem.getAuditStage()==Constants.SUCCESS_STAGE){
// System.out.println("您提交的问题已通过审核");
HttpSend.send(posts1.get(0).getMobile(),"您提交的问题已通过审核","");
}
}
}
// 获取下一环节阶段
private Long getNextStage(DlfxWarnProblem dlfxWarnProblem) {
String code = dlfxWarnProblem.getAuditCode();
Integer submitState = dlfxWarnProblem.getSubmitState();
if (Constants.PROCESS_REJICT.equals(submitState)) {
return Constants.REFUSE_STAGE;
}
DlfxProcessConfig config = new DlfxProcessConfig();
config.setIsDelete(0);
config.setProcessCode(code);
List<DlfxProcessConfig> configs = dlfxProcessConfigMapper.selectDlfxProcessConfigList(config);
// 获取最大的阶段
DlfxProcessConfig maxConfig = configs.stream()
.max(Comparator.comparing(DlfxProcessConfig::getOrderNum))
.orElse(new DlfxProcessConfig());
//判断当前阶段是否等于最大阶段
if (dlfxWarnProblem.getAuditStage().equals(maxConfig.getStage())) {
//是 返回结束阶段的参数
return Constants.SUCCESS_STAGE;
}
// 找到当前的配置
DlfxProcessConfig nowConfig = configs.stream()
.filter(t -> dlfxWarnProblem.getAuditStage().equals(t.getStage()) || dlfxWarnProblem.getAuditStage() == 999)
.findFirst().orElse(new DlfxProcessConfig());
// 过滤数据,查找下一个排序的数据
return configs.stream().filter(t -> Constants.PROCESS_SUBMIT.equals(submitState)
&& t.getOrderNum().equals(nowConfig.getOrderNum() + 1))
.mapToLong(t -> t.getStage()).findFirst().orElse(dlfxWarnProblem.getAuditStage());
}