Commit 7995e161 authored by 韩桐桐's avatar 韩桐桐

Merge remote-tracking branch 'origin/develop_tzs_register' into develop_tzs_register

parents 8ae34c73 13d4c293
package com.yeejoin.amos.boot.module.jg.api.dto; package com.yeejoin.amos.boot.module.jg.api.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.yeejoin.amos.boot.biz.common.dto.BaseDto; import com.yeejoin.amos.boot.biz.common.dto.BaseDto;
...@@ -162,7 +161,6 @@ public class JgMaintainNoticeDto extends BaseDto { ...@@ -162,7 +161,6 @@ public class JgMaintainNoticeDto extends BaseDto {
@ApiModelProperty(value = "接收机构机构代码") @ApiModelProperty(value = "接收机构机构代码")
private String receiveOrgCode; private String receiveOrgCode;
@TableField(exist = false)
@ApiModelProperty(value = "告知设备列表") @ApiModelProperty(value = "告知设备列表")
private List<Map<String, Object>> deviceList; private List<Map<String, Object>> deviceList;
......
package com.yeejoin.amos.boot.module.jg.api.dto; package com.yeejoin.amos.boot.module.jg.api.dto;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler; import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize;
...@@ -131,11 +130,9 @@ public class JgReformNoticeDto extends BaseDto { ...@@ -131,11 +130,9 @@ public class JgReformNoticeDto extends BaseDto {
private String entrustingUnitName; private String entrustingUnitName;
@ApiModelProperty (value = "委托书附件") @ApiModelProperty (value = "委托书附件")
@TableField(typeHandler = FastjsonTypeHandler.class)
private List<JSONObject> powerOfAttorney; private List<JSONObject> powerOfAttorney;
@ApiModelProperty (value = "施工合同附件") @ApiModelProperty (value = "施工合同附件")
@TableField(typeHandler = FastjsonTypeHandler.class)
private List<JSONObject> constructionContract; private List<JSONObject> constructionContract;
@ApiModelProperty (value = "施工合同是否本单位与甲方直接签署") @ApiModelProperty (value = "施工合同是否本单位与甲方直接签署")
...@@ -163,7 +160,6 @@ public class JgReformNoticeDto extends BaseDto { ...@@ -163,7 +160,6 @@ public class JgReformNoticeDto extends BaseDto {
private String equCategory; private String equCategory;
/* ---------------- -------------- */ /* ---------------- -------------- */
@TableField (exist = false)
@ApiModelProperty (value = "告知设备列表") @ApiModelProperty (value = "告知设备列表")
private List<Map<String, Object>> deviceList; private List<Map<String, Object>> deviceList;
...@@ -228,4 +224,11 @@ public class JgReformNoticeDto extends BaseDto { ...@@ -228,4 +224,11 @@ public class JgReformNoticeDto extends BaseDto {
@ApiModelProperty (value = "其他附件") @ApiModelProperty (value = "其他附件")
private String otherAccessories; private String otherAccessories;
/**
*工作流下一节点任务id
*/
@ApiModelProperty (value = "工作流下一节点任务id")
private String nextTaskId;
} }
package com.yeejoin.amos.boot.module.jg.biz.init; package com.yeejoin.amos.boot.module.jg.biz.init;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yeejoin.amos.boot.module.jg.api.entity.JgInstallationNotice;
import com.yeejoin.amos.boot.module.jg.api.entity.JgUseRegistration; import com.yeejoin.amos.boot.module.jg.api.entity.JgUseRegistration;
import com.yeejoin.amos.boot.module.jg.biz.service.impl.CommonServiceImpl; import com.yeejoin.amos.boot.module.jg.biz.service.impl.CommonServiceImpl;
import com.yeejoin.amos.boot.module.jg.biz.service.impl.JgInstallationNoticeServiceImpl;
import com.yeejoin.amos.boot.module.jg.biz.service.impl.JgUseRegistrationServiceImpl; import com.yeejoin.amos.boot.module.jg.biz.service.impl.JgUseRegistrationServiceImpl;
import com.yeejoin.amos.boot.module.ymt.api.enums.FlowStatusEnum; import com.yeejoin.amos.boot.module.ymt.api.enums.FlowStatusEnum;
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationArguments;
...@@ -20,18 +22,29 @@ public class ApplicationRunnerImpl implements ApplicationRunner { ...@@ -20,18 +22,29 @@ public class ApplicationRunnerImpl implements ApplicationRunner {
private CommonServiceImpl commonService; private CommonServiceImpl commonService;
public ApplicationRunnerImpl(JgUseRegistrationServiceImpl useRegistrationService, CommonServiceImpl commonService) { private JgInstallationNoticeServiceImpl installationNoticeService;
public ApplicationRunnerImpl(JgUseRegistrationServiceImpl useRegistrationService,
CommonServiceImpl commonService,
JgInstallationNoticeServiceImpl installationNoticeService) {
this.commonService = commonService; this.commonService = commonService;
this.useRegistrationService = useRegistrationService; this.useRegistrationService = useRegistrationService;
this.installationNoticeService = installationNoticeService;
} }
@Override @Override
public void run(ApplicationArguments args) { public void run(ApplicationArguments args) {
// TODO 增加删除启动时, 完成时 // TODO 增加删除启动时, 完成时
// 使用登记数据初始化
List<JgUseRegistration> jgUseRegistrations = useRegistrationService.list(new LambdaQueryWrapper<JgUseRegistration>().ne(JgUseRegistration::getStatus, FlowStatusEnum.TO_BE_FINISHED.getName())); List<JgUseRegistration> jgUseRegistrations = useRegistrationService.list(new LambdaQueryWrapper<JgUseRegistration>().ne(JgUseRegistration::getStatus, FlowStatusEnum.TO_BE_FINISHED.getName()));
jgUseRegistrations.forEach(jgUseRegistration -> { jgUseRegistrations.forEach(jgUseRegistration -> {
commonService.saveExecuteFlowData2Redis(jgUseRegistration.getInstanceId(), useRegistrationService.buildInstanceRuntimeData(jgUseRegistration)); commonService.saveExecuteFlowData2Redis(jgUseRegistration.getInstanceId(), useRegistrationService.buildInstanceRuntimeData(jgUseRegistration));
}); });
// 安装告知数据初始化
List<JgInstallationNotice> jgInstallationNotices = installationNoticeService.list(new LambdaQueryWrapper<JgInstallationNotice>().ne(JgInstallationNotice::getNoticeStatus, FlowStatusEnum.TO_BE_FINISHED.getCode()));
jgInstallationNotices.forEach(jgInstallation -> {
commonService.saveExecuteFlowData2Redis(jgInstallation.getInstanceId(), installationNoticeService.buildInstanceRuntimeData(jgInstallation));
});
} }
} }
...@@ -7,18 +7,17 @@ import com.alibaba.fastjson.JSONObject; ...@@ -7,18 +7,17 @@ import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.pagehelper.util.StringUtil;
import com.yeejoin.amos.boot.biz.common.bo.ReginParams; import com.yeejoin.amos.boot.biz.common.bo.ReginParams;
import com.yeejoin.amos.boot.biz.common.dao.mapper.DataDictionaryMapper; import com.yeejoin.amos.boot.biz.common.dao.mapper.DataDictionaryMapper;
import com.yeejoin.amos.boot.biz.common.entity.DataDictionary; import com.yeejoin.amos.boot.biz.common.entity.DataDictionary;
import com.yeejoin.amos.boot.biz.common.utils.DateUtils; import com.yeejoin.amos.boot.biz.common.utils.DateUtils;
import com.yeejoin.amos.boot.biz.common.utils.RedisKey; import com.yeejoin.amos.boot.biz.common.utils.RedisKey;
import com.yeejoin.amos.boot.biz.common.utils.RedisUtils; import com.yeejoin.amos.boot.biz.common.utils.RedisUtils;
import com.yeejoin.amos.boot.module.jg.api.dto.JgInstallationNoticeDto; import com.yeejoin.amos.boot.module.jg.api.dto.*;
import com.yeejoin.amos.boot.module.jg.api.dto.TaskMessageDto;
import com.yeejoin.amos.boot.module.jg.api.dto.TaskModelDto;
import com.yeejoin.amos.boot.module.jg.api.dto.WorkflowResultDto;
import com.yeejoin.amos.boot.module.jg.api.entity.JgInstallationNotice; import com.yeejoin.amos.boot.module.jg.api.entity.JgInstallationNotice;
import com.yeejoin.amos.boot.module.jg.api.entity.JgInstallationNoticeEq; import com.yeejoin.amos.boot.module.jg.api.entity.JgInstallationNoticeEq;
import com.yeejoin.amos.boot.module.jg.api.entity.JgUseRegistration;
import com.yeejoin.amos.boot.module.jg.api.enums.BusinessTypeEnum; import com.yeejoin.amos.boot.module.jg.api.enums.BusinessTypeEnum;
import com.yeejoin.amos.boot.module.jg.api.enums.CompanyTypeEnum; import com.yeejoin.amos.boot.module.jg.api.enums.CompanyTypeEnum;
import com.yeejoin.amos.boot.module.jg.api.mapper.CommonMapper; import com.yeejoin.amos.boot.module.jg.api.mapper.CommonMapper;
...@@ -46,6 +45,8 @@ import com.yeejoin.amos.feign.workflow.model.ActWorkflowStartDTO; ...@@ -46,6 +45,8 @@ import com.yeejoin.amos.feign.workflow.model.ActWorkflowStartDTO;
import com.yeejoin.amos.feign.workflow.model.ProcessTaskDTO; import com.yeejoin.amos.feign.workflow.model.ProcessTaskDTO;
import com.yeejoin.amos.feign.workflow.model.TaskResultDTO; import com.yeejoin.amos.feign.workflow.model.TaskResultDTO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
...@@ -65,6 +66,7 @@ import org.typroject.tyboot.core.restful.utils.ResponseModel; ...@@ -65,6 +66,7 @@ import org.typroject.tyboot.core.restful.utils.ResponseModel;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.text.ParseException; import java.text.ParseException;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -159,6 +161,9 @@ public class JgInstallationNoticeServiceImpl extends BaseService<JgInstallationN ...@@ -159,6 +161,9 @@ public class JgInstallationNoticeServiceImpl extends BaseService<JgInstallationN
@Autowired @Autowired
private CommonServiceImpl commonService; private CommonServiceImpl commonService;
@Autowired
private RedissonClient redissonClient;
/** /**
* 根据sequenceNbr查询 * 根据sequenceNbr查询
* *
...@@ -332,7 +337,7 @@ public class JgInstallationNoticeServiceImpl extends BaseService<JgInstallationN ...@@ -332,7 +337,7 @@ public class JgInstallationNoticeServiceImpl extends BaseService<JgInstallationN
commonService.buildTaskModel(Collections.singletonList(taskModelDto)); commonService.buildTaskModel(Collections.singletonList(taskModelDto));
} }
} }
commonService.saveExecuteFlowData2Redis(notice.getInstanceId(),this.buildInstanceRuntimeData(notice));
} else { } else {
JgInstallationNotice bean = new JgInstallationNotice(); JgInstallationNotice bean = new JgInstallationNotice();
BeanUtils.copyProperties(noticeDto, bean); BeanUtils.copyProperties(noticeDto, bean);
...@@ -377,13 +382,6 @@ public class JgInstallationNoticeServiceImpl extends BaseService<JgInstallationN ...@@ -377,13 +382,6 @@ public class JgInstallationNoticeServiceImpl extends BaseService<JgInstallationN
} }
/** /**
* 列表查询 示例
*/
public List<JgInstallationNoticeDto> queryForJgInstallationNoticeList() {
return this.queryForList("", false);
}
/**
* 批量删除 * 批量删除
* *
* @param sequenceNbrs 主键 * @param sequenceNbrs 主键
...@@ -533,16 +531,22 @@ public class JgInstallationNoticeServiceImpl extends BaseService<JgInstallationN ...@@ -533,16 +531,22 @@ public class JgInstallationNoticeServiceImpl extends BaseService<JgInstallationN
// 暂存任务 // 暂存任务
buildTaskDraft(list); buildTaskDraft(list);
} }
List<JgInstallationNoticeEq> jgRelationEquipList = equipList.stream().map(jgRelationEquip -> { List<JgInstallationNoticeEq> jgRelationEquipList = equipList.stream().map(jgRelationEquip -> {
List<JgInstallationNotice> collect = list.stream().filter(jgInstallationNotice -> jgRelationEquip.getEquipTransferId().equals(jgInstallationNotice.getApplyNo())).collect(Collectors.toList()); List<JgInstallationNotice> collect = list.stream().filter(jgInstallationNotice -> jgRelationEquip.getEquipTransferId().equals(jgInstallationNotice.getApplyNo())).collect(Collectors.toList());
Long sequenceNbr = collect.get(0).getSequenceNbr(); Long sequenceNbr = collect.get(0).getSequenceNbr();
return jgRelationEquip.setEquipTransferId(String.valueOf(sequenceNbr)); return jgRelationEquip.setEquipTransferId(String.valueOf(sequenceNbr));
}).collect(Collectors.toList()); }).collect(Collectors.toList());
jgInstallationNoticeEqMapper.insertBatchSomeColumn(jgRelationEquipList); jgInstallationNoticeEqMapper.insertBatchSomeColumn(jgRelationEquipList);
this.updateRedisBatch(list);
return list; return list;
} }
private void updateRedisBatch(List<JgInstallationNotice> jgInstallationNotices) {
jgInstallationNotices.stream().filter(n-> StringUtil.isNotEmpty(n.getInstanceId())).forEach(jgInstallationNotice -> {
commonService.saveExecuteFlowData2Redis(jgInstallationNotice.getInstanceId(), this.buildInstanceRuntimeData(jgInstallationNotice));
});
}
/** /**
* 暂存任务生成待办 * 暂存任务生成待办
* @param list 业务信息 * @param list 业务信息
...@@ -777,12 +781,21 @@ public class JgInstallationNoticeServiceImpl extends BaseService<JgInstallationN ...@@ -777,12 +781,21 @@ public class JgInstallationNoticeServiceImpl extends BaseService<JgInstallationN
} }
@Transactional @Transactional(rollbackFor = Exception.class)
public void cancel(JgInstallationNoticeDto noticeDto) { public void cancel(JgInstallationNoticeDto noticeDto) {
String instanceId = noticeDto.getInstanceId();
String nextTaskId = noticeDto.getNextTaskId();
String lockKey = CommonServiceImpl.buildJgExecuteLockKey(instanceId);
RLock lock = redissonClient.getLock(lockKey);
try {
boolean isLocked = lock.tryLock(0, 180, TimeUnit.SECONDS);
// 解决并发问题:多个人同时操作一个流程(并发执行通过、驳回、撤回)
if(!isLocked){
throw new BadRequest("当前流程已经被执行!");
}
// 流程执行时,状态及权限校验
commonService.checkForRevocationFlow(nextTaskId, instanceId);
JgInstallationNotice jgInstallationNotice = this.baseMapper.selectById(noticeDto.getSequenceNbr()); JgInstallationNotice jgInstallationNotice = this.baseMapper.selectById(noticeDto.getSequenceNbr());
// 检查实际状态是否不等于期望状态
commonService.checkExpectedStatus(jgInstallationNotice.getNoticeStatus());
ProcessTaskDTO processTaskDTO = iCmWorkflowService.rollBack(jgInstallationNotice.getInstanceId()); ProcessTaskDTO processTaskDTO = iCmWorkflowService.rollBack(jgInstallationNotice.getInstanceId());
// 提取节点等信息 // 提取节点等信息
WorkflowResultDto workflowResultDto = commonService.buildWorkFlowInfo(Collections.singletonList(processTaskDTO)).get(0); WorkflowResultDto workflowResultDto = commonService.buildWorkFlowInfo(Collections.singletonList(processTaskDTO)).get(0);
...@@ -801,15 +814,32 @@ public class JgInstallationNoticeServiceImpl extends BaseService<JgInstallationN ...@@ -801,15 +814,32 @@ public class JgInstallationNoticeServiceImpl extends BaseService<JgInstallationN
jsonObject.put("flowStatus", FlowStatusEnum.ROLLBACK.getCode()); jsonObject.put("flowStatus", FlowStatusEnum.ROLLBACK.getCode());
jsonObject.put("nextTaskId", jgInstallationNotice.getNextTaskId()); jsonObject.put("nextTaskId", jgInstallationNotice.getNextTaskId());
commonService.rollbackTask(jgInstallationNotice.getInstanceId(), jsonObject); commonService.rollbackTask(jgInstallationNotice.getInstanceId(), jsonObject);
commonService.saveExecuteFlowData2Redis(instanceId, this.buildInstanceRuntimeData(jgInstallationNotice));
}catch (InterruptedException e) {
e.printStackTrace();
} finally {
if(lock.isHeldByCurrentThread()){
lock.unlock();
}
}
} }
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void accept(JgInstallationNoticeDto dto,String op) { public void accept(JgInstallationNoticeDto dto,String op) {
ReginParams reginParams = JSONObject.parseObject(redisUtils.get(RedisKey.buildReginKey(RequestContext.getExeUserId(), RequestContext.getToken())).toString(), ReginParams.class); String instanceId = dto.getInstanceId();
JgInstallationNotice jgInstallationNotice = this.getById(dto.getSequenceNbr()); String nextTaskId = dto.getNextTaskId();
// 检查实际状态是否不等于期望状态 String lockKey = CommonServiceImpl.buildJgExecuteLockKey(instanceId);
commonService.checkExpectedStatus(jgInstallationNotice.getNoticeStatus()); RLock lock = redissonClient.getLock(lockKey);
try {
boolean isLocked = lock.tryLock(0, 180, TimeUnit.SECONDS);
// 解决并发问题:多个人同时操作一个流程(并发执行通过、驳回、撤回)
if(!isLocked){
throw new BadRequest("当前流程已经被执行!");
}
// 流程执行时,状态及权限校验
commonService.checkForExecuteFlow(nextTaskId, instanceId);
JgInstallationNotice jgInstallationNotice = this.getById(dto.getSequenceNbr());
jgInstallationNotice.setProcessAdvice(dto.getProcessAdvice()); jgInstallationNotice.setProcessAdvice(dto.getProcessAdvice());
// 组装设备注册代码 // 组装设备注册代码
StringBuilder stringBuffer = new StringBuilder(); StringBuilder stringBuffer = new StringBuilder();
...@@ -821,7 +851,7 @@ public class JgInstallationNoticeServiceImpl extends BaseService<JgInstallationN ...@@ -821,7 +851,7 @@ public class JgInstallationNoticeServiceImpl extends BaseService<JgInstallationN
} }
// 执行工作流并返回组装好的工作流信息 // 执行工作流并返回组装好的工作流信息
WorkflowResultDto workflowResultDto = getWorkflowResultDto(op, jgInstallationNotice); WorkflowResultDto workflowResultDto = getWorkflowResultDto(op, jgInstallationNotice);
jgInstallationNotice.setPromoter(reginParams.getUserModel().getUserId()); jgInstallationNotice.setPromoter(RequestContext.getExeUserId());
jgInstallationNotice.setNextTaskId(workflowResultDto.getNextTaskId()); jgInstallationNotice.setNextTaskId(workflowResultDto.getNextTaskId());
TaskV2Model taskV2Model = new TaskV2Model(); TaskV2Model taskV2Model = new TaskV2Model();
if ("0".equals(op)) { if ("0".equals(op)) {
...@@ -1004,6 +1034,22 @@ public class JgInstallationNoticeServiceImpl extends BaseService<JgInstallationN ...@@ -1004,6 +1034,22 @@ public class JgInstallationNoticeServiceImpl extends BaseService<JgInstallationN
jgInstallationNotice.setNextExecuteUserIds(workflowResultDto.getNextExecutorUserIds()); jgInstallationNotice.setNextExecuteUserIds(workflowResultDto.getNextExecutorUserIds());
jgInstallationNotice.setNextExecuteIds(workflowResultDto.getNextExecutorRoleIds()); jgInstallationNotice.setNextExecuteIds(workflowResultDto.getNextExecutorRoleIds());
this.updateById(jgInstallationNotice); this.updateById(jgInstallationNotice);
commonService.saveExecuteFlowData2Redis(instanceId, this.buildInstanceRuntimeData(jgInstallationNotice));
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if(lock.isHeldByCurrentThread()){
lock.unlock();
}
}
}
public InstanceRuntimeData buildInstanceRuntimeData(JgInstallationNotice jgInstallationNotice) {
return InstanceRuntimeData.builder()
.nextExecuteUserIds(jgInstallationNotice.getNextExecuteUserIds())
.promoter(jgInstallationNotice.getPromoter())
.nextTaskId(jgInstallationNotice.getNextTaskId())
.build();
} }
......
...@@ -7,16 +7,14 @@ import com.alibaba.fastjson.JSONObject; ...@@ -7,16 +7,14 @@ import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.pagehelper.util.StringUtil;
import com.yeejoin.amos.boot.biz.common.bo.ReginParams; import com.yeejoin.amos.boot.biz.common.bo.ReginParams;
import com.yeejoin.amos.boot.biz.common.entity.DataDictionary; import com.yeejoin.amos.boot.biz.common.entity.DataDictionary;
import com.yeejoin.amos.boot.biz.common.service.IDataDictionaryService; import com.yeejoin.amos.boot.biz.common.service.IDataDictionaryService;
import com.yeejoin.amos.boot.biz.common.service.impl.DataDictionaryServiceImpl; import com.yeejoin.amos.boot.biz.common.service.impl.DataDictionaryServiceImpl;
import com.yeejoin.amos.boot.biz.common.utils.DateUtils; import com.yeejoin.amos.boot.biz.common.utils.DateUtils;
import com.yeejoin.amos.boot.biz.common.utils.RedisUtils; import com.yeejoin.amos.boot.biz.common.utils.RedisUtils;
import com.yeejoin.amos.boot.module.jg.api.dto.JgMaintainNoticeDto; import com.yeejoin.amos.boot.module.jg.api.dto.*;
import com.yeejoin.amos.boot.module.jg.api.dto.TaskMessageDto;
import com.yeejoin.amos.boot.module.jg.api.dto.TaskModelDto;
import com.yeejoin.amos.boot.module.jg.api.dto.WorkflowResultDto;
import com.yeejoin.amos.boot.module.jg.api.entity.JgMaintainNotice; import com.yeejoin.amos.boot.module.jg.api.entity.JgMaintainNotice;
import com.yeejoin.amos.boot.module.jg.api.entity.JgMaintainNoticeEq; import com.yeejoin.amos.boot.module.jg.api.entity.JgMaintainNoticeEq;
import com.yeejoin.amos.boot.module.jg.api.enums.BusinessTypeEnum; import com.yeejoin.amos.boot.module.jg.api.enums.BusinessTypeEnum;
...@@ -30,10 +28,15 @@ import com.yeejoin.amos.boot.module.jg.biz.utils.WordTemplateUtils; ...@@ -30,10 +28,15 @@ import com.yeejoin.amos.boot.module.jg.biz.utils.WordTemplateUtils;
import com.yeejoin.amos.boot.module.ymt.api.entity.RegistrationInfo; import com.yeejoin.amos.boot.module.ymt.api.entity.RegistrationInfo;
import com.yeejoin.amos.boot.module.ymt.api.enums.ApplicationFormTypeEnum; import com.yeejoin.amos.boot.module.ymt.api.enums.ApplicationFormTypeEnum;
import com.yeejoin.amos.boot.module.ymt.api.enums.FlowStatusEnum; import com.yeejoin.amos.boot.module.ymt.api.enums.FlowStatusEnum;
import com.yeejoin.amos.boot.module.ymt.api.mapper.*; import com.yeejoin.amos.boot.module.ymt.api.mapper.EquipmentCategoryMapper;
import com.yeejoin.amos.boot.module.ymt.api.mapper.OtherInfoMapper;
import com.yeejoin.amos.boot.module.ymt.api.mapper.RegistrationInfoMapper;
import com.yeejoin.amos.boot.module.ymt.api.mapper.SupervisoryCodeInfoMapper;
import com.yeejoin.amos.feign.systemctl.model.TaskV2Model; import com.yeejoin.amos.feign.systemctl.model.TaskV2Model;
import com.yeejoin.amos.feign.workflow.Workflow; import com.yeejoin.amos.feign.workflow.Workflow;
import com.yeejoin.amos.feign.workflow.model.*; import com.yeejoin.amos.feign.workflow.model.*;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -49,6 +52,7 @@ import org.typroject.tyboot.core.restful.utils.ResponseModel; ...@@ -49,6 +52,7 @@ import org.typroject.tyboot.core.restful.utils.ResponseModel;
import java.text.ParseException; import java.text.ParseException;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -95,9 +99,6 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto ...@@ -95,9 +99,6 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto
DataDictionaryServiceImpl iDataDictionaryService; DataDictionaryServiceImpl iDataDictionaryService;
@Autowired @Autowired
private TzBaseUnitLicenceMapper baseUnitLicenceMapper;
@Autowired
private CommonServiceImpl commonService; private CommonServiceImpl commonService;
@Autowired @Autowired
...@@ -109,6 +110,9 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto ...@@ -109,6 +110,9 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto
@Autowired @Autowired
JgInstallationNoticeServiceImpl jgInstallationNoticeService; JgInstallationNoticeServiceImpl jgInstallationNoticeService;
@Autowired
private RedissonClient redissonClient;
/** /**
* 根据sequenceNbr查询 * 根据sequenceNbr查询
* *
...@@ -142,7 +146,7 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto ...@@ -142,7 +146,7 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto
// 设备信息 "equCategory", "equDefine", "equRegisterCode", "produceCountry", "produceLicenseNum", // 设备信息 "equCategory", "equDefine", "equRegisterCode", "produceCountry", "produceLicenseNum",
JgMaintainNoticeEq jgMaintainNoticeEq = jgMaintainNoticeEqMapper.selectOne(new LambdaQueryWrapper<JgMaintainNoticeEq>().eq(JgMaintainNoticeEq::getEquipTransferId, sequenceNbr)); JgMaintainNoticeEq jgMaintainNoticeEq = jgMaintainNoticeEqMapper.selectOne(new LambdaQueryWrapper<JgMaintainNoticeEq>().eq(JgMaintainNoticeEq::getEquipTransferId, sequenceNbr));
Map<String, Object> map = idxBizJgRegisterInfoService.getDetailFieldCamelCaseByRecord(jgMaintainNoticeEq.getEquId()); Map<String, Object> map = idxBizJgRegisterInfoService.getDetailFieldCamelCaseByRecord(jgMaintainNoticeEq.getEquId());
map.put("uuseUnitCreditCode",map.get("useUnitCreditCode")); map.put("uuseUnitCreditCode", map.get("useUnitCreditCode"));
map.remove("useUnitCreditCode"); map.remove("useUnitCreditCode");
map.remove("address"); map.remove("address");
map.remove("sequenceNbr"); map.remove("sequenceNbr");
...@@ -266,6 +270,7 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto ...@@ -266,6 +270,7 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto
commonService.buildTaskModel(Collections.singletonList(taskModelDto)); commonService.buildTaskModel(Collections.singletonList(taskModelDto));
} }
} }
commonService.saveExecuteFlowData2Redis(notice.getInstanceId(),this.buildInstanceRuntimeData(notice));
} else { } else {
JgMaintainNotice bean = new JgMaintainNotice(); JgMaintainNotice bean = new JgMaintainNotice();
BeanUtils.copyProperties(noticeDto, bean); BeanUtils.copyProperties(noticeDto, bean);
...@@ -288,7 +293,7 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto ...@@ -288,7 +293,7 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto
String type = reginParams.getCompany().getLevel(); String type = reginParams.getCompany().getLevel();
String userId = reginParams.getUserModel().getUserId(); String userId = reginParams.getUserModel().getUserId();
List<DataDictionary> dictionaries = dataDictionaryService.getByType("WXLX"); List<DataDictionary> dictionaries = dataDictionaryService.getByType("WXLX");
Page<JgMaintainNotice> noticePage = jgMaintainNoticeMapper.queryForPage(page, model, type, orgCode,userId); Page<JgMaintainNotice> noticePage = jgMaintainNoticeMapper.queryForPage(page, model, type, orgCode, userId);
Page<JgMaintainNoticeDto> noticeDtoPage = new Page<>(); Page<JgMaintainNoticeDto> noticeDtoPage = new Page<>();
BeanUtils.copyProperties(noticePage, noticeDtoPage, "records"); BeanUtils.copyProperties(noticePage, noticeDtoPage, "records");
List<JgMaintainNoticeDto> records = noticePage.getRecords().stream().map(notice -> { List<JgMaintainNoticeDto> records = noticePage.getRecords().stream().map(notice -> {
...@@ -433,7 +438,7 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto ...@@ -433,7 +438,7 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto
dto.setCreateUserName(reginParams.getUserModel().getRealName()); dto.setCreateUserName(reginParams.getUserModel().getRealName());
dto.setCreateUserId(reginParams.getUserModel().getUserId()); dto.setCreateUserId(reginParams.getUserModel().getUserId());
DataDictionary dictionary = iDataDictionaryService.getByCode(dto.getMaintainType(),"WXLX"); DataDictionary dictionary = iDataDictionaryService.getByCode(dto.getMaintainType(), "WXLX");
dto.setMaintainTypeDesc(dictionary.getName()); dto.setMaintainTypeDesc(dictionary.getName());
dto.setFullAddress(dto.getProvinceName() + dto.getCityName() + dto.getCountyName() + dto.getStreetName() + dto.getAddress()); dto.setFullAddress(dto.getProvinceName() + dto.getCityName() + dto.getCountyName() + dto.getStreetName() + dto.getAddress());
list.add(dto); list.add(dto);
...@@ -446,16 +451,22 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto ...@@ -446,16 +451,22 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto
// 暂存任务 // 暂存任务
buildTaskDraft(list); buildTaskDraft(list);
} }
List<JgMaintainNoticeEq> jgRelationEquipList = equipList.stream().map(jgRelationEquip -> { List<JgMaintainNoticeEq> jgRelationEquipList = equipList.stream().map(jgRelationEquip -> {
List<JgMaintainNotice> collect = list.stream().filter(JgMaintainNotice -> jgRelationEquip.getEquipTransferId().equals(JgMaintainNotice.getApplyNo())).collect(Collectors.toList()); List<JgMaintainNotice> collect = list.stream().filter(JgMaintainNotice -> jgRelationEquip.getEquipTransferId().equals(JgMaintainNotice.getApplyNo())).collect(Collectors.toList());
Long sequenceNbr = collect.get(0).getSequenceNbr(); Long sequenceNbr = collect.get(0).getSequenceNbr();
return jgRelationEquip.setEquipTransferId(String.valueOf(sequenceNbr)); return jgRelationEquip.setEquipTransferId(String.valueOf(sequenceNbr));
}).collect(Collectors.toList()); }).collect(Collectors.toList());
jgMaintainNoticeEqMapper.insertBatchSomeColumn(jgRelationEquipList); jgMaintainNoticeEqMapper.insertBatchSomeColumn(jgRelationEquipList);
this.updateRedisBatch(list);
return list; return list;
} }
private void updateRedisBatch(List<JgMaintainNotice> jgMaintainNotices) {
jgMaintainNotices.stream().filter(n -> StringUtil.isNotEmpty(n.getInstanceId())).forEach(jgMaintainNotice -> {
commonService.saveExecuteFlowData2Redis(jgMaintainNotice.getInstanceId(), this.buildInstanceRuntimeData(jgMaintainNotice));
});
}
/** /**
* 暂存任务生成待办 * 暂存任务生成待办
* *
...@@ -563,8 +574,9 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto ...@@ -563,8 +574,9 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto
} }
private void convertField(JgMaintainNoticeDto model) { private void convertField(JgMaintainNoticeDto model) {
if (null == model) if (null == model) {
return; return;
}
// 处理附件 // 处理附件
if (!ValidationUtil.isEmpty(model.getPowerOfAttorneyList())) { if (!ValidationUtil.isEmpty(model.getPowerOfAttorneyList())) {
model.setPowerOfAttorney(JSON.toJSONString(model.getPowerOfAttorneyList())); model.setPowerOfAttorney(JSON.toJSONString(model.getPowerOfAttorneyList()));
...@@ -675,9 +687,19 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto ...@@ -675,9 +687,19 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto
} }
public void cancel(JgMaintainNoticeDto noticeDto) { public void cancel(JgMaintainNoticeDto noticeDto) {
String instanceId = noticeDto.getInstanceId();
String nextTaskId = noticeDto.getNextTaskId();
String lockKey = CommonServiceImpl.buildJgExecuteLockKey(instanceId);
RLock lock = redissonClient.getLock(lockKey);
try {
boolean isLocked = lock.tryLock(0, 180, TimeUnit.SECONDS);
// 解决并发问题:多个人同时操作一个流程(并发执行通过、驳回、撤回)
if (!isLocked) {
throw new BadRequest("当前流程已经被执行!");
}
// 流程执行时,状态及权限校验
commonService.checkForRevocationFlow(nextTaskId, instanceId);
JgMaintainNotice jgMaintainNotice = this.baseMapper.selectById(noticeDto.getSequenceNbr()); JgMaintainNotice jgMaintainNotice = this.baseMapper.selectById(noticeDto.getSequenceNbr());
// 检查实际状态是否不等于期望状态
commonService.checkExpectedStatus(jgMaintainNotice.getNoticeStatus());
ProcessTaskDTO processTaskDTO = cmWorkflowService.rollBack(jgMaintainNotice.getInstanceId()); ProcessTaskDTO processTaskDTO = cmWorkflowService.rollBack(jgMaintainNotice.getInstanceId());
// 提取节点等信息 // 提取节点等信息
WorkflowResultDto workflowResultDto = commonService.buildWorkFlowInfo(Collections.singletonList(processTaskDTO)).get(0); WorkflowResultDto workflowResultDto = commonService.buildWorkFlowInfo(Collections.singletonList(processTaskDTO)).get(0);
...@@ -687,7 +709,6 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto ...@@ -687,7 +709,6 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto
jgMaintainNotice.setNextTaskId(workflowResultDto.getNextTaskId()); jgMaintainNotice.setNextTaskId(workflowResultDto.getNextTaskId());
jgMaintainNotice.setNextExecuteUserIds(workflowResultDto.getNextExecutorUserIds()); jgMaintainNotice.setNextExecuteUserIds(workflowResultDto.getNextExecutorUserIds());
updateById(jgMaintainNotice); updateById(jgMaintainNotice);
// 删除待办 // 删除待办
JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(jgMaintainNotice)); JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(jgMaintainNotice));
jsonObject.put("nextExecuteUser", jgMaintainNotice.getNextExecuteIds()); jsonObject.put("nextExecuteUser", jgMaintainNotice.getNextExecuteIds());
...@@ -696,15 +717,39 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto ...@@ -696,15 +717,39 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto
jsonObject.put("flowStatus", FlowStatusEnum.ROLLBACK.getCode()); jsonObject.put("flowStatus", FlowStatusEnum.ROLLBACK.getCode());
commonService.rollbackTask(jgMaintainNotice.getInstanceId(), jsonObject); commonService.rollbackTask(jgMaintainNotice.getInstanceId(), jsonObject);
commonService.saveExecuteFlowData2Redis(instanceId, this.buildInstanceRuntimeData(jgMaintainNotice));
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
public InstanceRuntimeData buildInstanceRuntimeData(JgMaintainNotice jgMaintainNotice) {
return InstanceRuntimeData.builder()
.nextExecuteUserIds(jgMaintainNotice.getNextExecuteUserIds())
.promoter(jgMaintainNotice.getPromoter())
.nextTaskId(jgMaintainNotice.getNextTaskId())
.build();
} }
@Transactional @Transactional
public void accept(JgMaintainNoticeDto dto, String op, String opinion) { public void accept(JgMaintainNoticeDto dto, String op, String opinion) {
String instanceId = dto.getInstanceId();
String nextTaskId = dto.getNextTaskId();
String lockKey = CommonServiceImpl.buildJgExecuteLockKey(instanceId);
RLock lock = redissonClient.getLock(lockKey);
try {
boolean isLocked = lock.tryLock(0, 180, TimeUnit.SECONDS);
// 解决并发问题:多个人同时操作一个流程(并发执行通过、驳回、撤回)
if (!isLocked) {
throw new BadRequest("当前流程已经被执行!");
}
// 流程执行时,状态及权限校验
commonService.checkForExecuteFlow(nextTaskId, instanceId);
JgMaintainNotice jgMaintainNotice = this.jgMaintainNoticeMapper.selectById(dto.getSequenceNbr()); JgMaintainNotice jgMaintainNotice = this.jgMaintainNoticeMapper.selectById(dto.getSequenceNbr());
// 检查实际状态是否不等于期望状态
commonService.checkExpectedStatus(jgMaintainNotice.getNoticeStatus());
// 组装设备注册代码 // 组装设备注册代码
StringBuilder stringBuffer = new StringBuilder(); StringBuilder stringBuffer = new StringBuilder();
String ym = null; String ym = null;
...@@ -821,6 +866,14 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto ...@@ -821,6 +866,14 @@ public class JgMaintainNoticeServiceImpl extends BaseService<JgMaintainNoticeDto
jgMaintainNotice.setNextTaskId(workflowResultDto.getNextTaskId()); jgMaintainNotice.setNextTaskId(workflowResultDto.getNextTaskId());
jgMaintainNoticeMapper.updateById(jgMaintainNotice); jgMaintainNoticeMapper.updateById(jgMaintainNotice);
} }
commonService.saveExecuteFlowData2Redis(instanceId, this.buildInstanceRuntimeData(jgMaintainNotice));
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
} }
......
...@@ -6,14 +6,13 @@ import com.alibaba.fastjson.JSON; ...@@ -6,14 +6,13 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.pagehelper.util.StringUtil;
import com.yeejoin.amos.boot.biz.common.bo.ReginParams; import com.yeejoin.amos.boot.biz.common.bo.ReginParams;
import com.yeejoin.amos.boot.biz.common.utils.DateUtils; import com.yeejoin.amos.boot.biz.common.utils.DateUtils;
import com.yeejoin.amos.boot.biz.common.utils.RedisKey; import com.yeejoin.amos.boot.biz.common.utils.RedisKey;
import com.yeejoin.amos.boot.biz.common.utils.RedisUtils; import com.yeejoin.amos.boot.biz.common.utils.RedisUtils;
import com.yeejoin.amos.boot.module.jg.api.dto.JgReformNoticeDto; import com.yeejoin.amos.boot.module.jg.api.dto.*;
import com.yeejoin.amos.boot.module.jg.api.dto.TaskMessageDto; import com.yeejoin.amos.boot.module.jg.api.entity.JgInstallationNotice;
import com.yeejoin.amos.boot.module.jg.api.dto.TaskModelDto;
import com.yeejoin.amos.boot.module.jg.api.dto.WorkflowResultDto;
import com.yeejoin.amos.boot.module.jg.api.entity.JgReformNotice; import com.yeejoin.amos.boot.module.jg.api.entity.JgReformNotice;
import com.yeejoin.amos.boot.module.jg.api.entity.JgReformNoticeEq; import com.yeejoin.amos.boot.module.jg.api.entity.JgReformNoticeEq;
import com.yeejoin.amos.boot.module.jg.api.enums.BusinessTypeEnum; import com.yeejoin.amos.boot.module.jg.api.enums.BusinessTypeEnum;
...@@ -26,13 +25,18 @@ import com.yeejoin.amos.boot.module.jg.biz.utils.WordTemplateUtils; ...@@ -26,13 +25,18 @@ import com.yeejoin.amos.boot.module.jg.biz.utils.WordTemplateUtils;
import com.yeejoin.amos.boot.module.ymt.api.entity.RegistrationInfo; import com.yeejoin.amos.boot.module.ymt.api.entity.RegistrationInfo;
import com.yeejoin.amos.boot.module.ymt.api.enums.ApplicationFormTypeEnum; import com.yeejoin.amos.boot.module.ymt.api.enums.ApplicationFormTypeEnum;
import com.yeejoin.amos.boot.module.ymt.api.enums.FlowStatusEnum; import com.yeejoin.amos.boot.module.ymt.api.enums.FlowStatusEnum;
import com.yeejoin.amos.boot.module.ymt.api.mapper.*; import com.yeejoin.amos.boot.module.ymt.api.mapper.EquipmentCategoryMapper;
import com.yeejoin.amos.boot.module.ymt.api.mapper.OtherInfoMapper;
import com.yeejoin.amos.boot.module.ymt.api.mapper.RegistrationInfoMapper;
import com.yeejoin.amos.boot.module.ymt.api.mapper.SupervisoryCodeInfoMapper;
import com.yeejoin.amos.feign.systemctl.model.TaskV2Model; import com.yeejoin.amos.feign.systemctl.model.TaskV2Model;
import com.yeejoin.amos.feign.workflow.model.ActWorkflowBatchDTO; import com.yeejoin.amos.feign.workflow.model.ActWorkflowBatchDTO;
import com.yeejoin.amos.feign.workflow.model.ActWorkflowStartDTO; import com.yeejoin.amos.feign.workflow.model.ActWorkflowStartDTO;
import com.yeejoin.amos.feign.workflow.model.ProcessTaskDTO; import com.yeejoin.amos.feign.workflow.model.ProcessTaskDTO;
import com.yeejoin.amos.feign.workflow.model.TaskResultDTO; import com.yeejoin.amos.feign.workflow.model.TaskResultDTO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -48,6 +52,7 @@ import org.typroject.tyboot.core.restful.utils.ResponseModel; ...@@ -48,6 +52,7 @@ import org.typroject.tyboot.core.restful.utils.ResponseModel;
import java.text.ParseException; import java.text.ParseException;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
...@@ -89,8 +94,7 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg ...@@ -89,8 +94,7 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg
RedisUtils redisUtils; RedisUtils redisUtils;
@Autowired @Autowired
private JgReformNoticeMapper jgReformNoticeMapper; private JgReformNoticeMapper jgReformNoticeMapper;
@Autowired
private TzBaseUnitLicenceMapper baseUnitLicenceMapper;
@Autowired @Autowired
private CommonServiceImpl commonService; private CommonServiceImpl commonService;
@Autowired @Autowired
...@@ -101,6 +105,9 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg ...@@ -101,6 +105,9 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg
@Autowired @Autowired
JgInstallationNoticeServiceImpl jgInstallationNoticeService; JgInstallationNoticeServiceImpl jgInstallationNoticeService;
@Autowired
private RedissonClient redissonClient;
/** /**
* 根据sequenceNbr查询 * 根据sequenceNbr查询
* *
...@@ -130,7 +137,7 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg ...@@ -130,7 +137,7 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg
} }
String[] fields = {"productPhoto", "designDoc", "designStandard", "factoryStandard", String[] fields = {"productPhoto", "designDoc", "designStandard", "factoryStandard",
"productQualityYieldProve", "insUseMaintainExplain", "inspectReport", "productQualityYieldProve", "insUseMaintainExplain", "inspectReport",
"proxyStatementAttachment", "installContractAttachment","otherAccessories"}; "proxyStatementAttachment", "installContractAttachment", "otherAccessories"};
// 设备信息 // 设备信息
List<Map<String, Object>> equipmentInfos = jgReformNoticeMapper.queryEquipInformation(sequenceNbr); List<Map<String, Object>> equipmentInfos = jgReformNoticeMapper.queryEquipInformation(sequenceNbr);
Map<String, Object> equipMap = null; Map<String, Object> equipMap = null;
...@@ -206,10 +213,10 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg ...@@ -206,10 +213,10 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg
jgReformNoticeMapper.updateById(notice); jgReformNoticeMapper.updateById(notice);
//删除暂存 //删除暂存
commonService.deleteTaskModel(notice.getSequenceNbr()+""); commonService.deleteTaskModel(notice.getSequenceNbr() + "");
// 如果为保存并提交,则创建代办 // 如果为保存并提交,则创建代办
this.buildTask(Collections.singletonList(notice), Collections.singletonList(workflowResultDto)); this.buildTask(Collections.singletonList(notice), Collections.singletonList(workflowResultDto));
}else { } else {
TaskResultDTO dto = new TaskResultDTO(); TaskResultDTO dto = new TaskResultDTO();
dto.setResultCode("approvalStatus"); dto.setResultCode("approvalStatus");
dto.setTaskId(notice.getNextTaskId()); dto.setTaskId(notice.getNextTaskId());
...@@ -243,6 +250,7 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg ...@@ -243,6 +250,7 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg
// 创建新的代办 // 创建新的代办
this.createNewTodo(notice, workflowResultDto, taskV2Model, FlowStatusEnum.TO_BE_PROCESSED); this.createNewTodo(notice, workflowResultDto, taskV2Model, FlowStatusEnum.TO_BE_PROCESSED);
} }
commonService.saveExecuteFlowData2Redis(notice.getInstanceId(),this.buildInstanceRuntimeData(notice));
} else { } else {
JgReformNotice bean = new JgReformNotice(); JgReformNotice bean = new JgReformNotice();
BeanUtils.copyProperties(noticeDto, bean); BeanUtils.copyProperties(noticeDto, bean);
...@@ -385,11 +393,11 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg ...@@ -385,11 +393,11 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg
dto.setCreateUserName(reginParams.getUserModel().getRealName()); dto.setCreateUserName(reginParams.getUserModel().getRealName());
dto.setCreateUserId(reginParams.getUserModel().getUserId()); dto.setCreateUserId(reginParams.getUserModel().getUserId());
dto.setCreateUserCompanyName(reginParams.getCompany().getCompanyName()); dto.setCreateUserCompanyName(reginParams.getCompany().getCompanyName());
dto.setEquCategory(Objects.toString(obj.get("EQU_CATEGORY"),"")); dto.setEquCategory(Objects.toString(obj.get("EQU_CATEGORY"), ""));
dto.setEquListCode(Objects.toString(obj.get("EQU_DEFINE"),"")); dto.setEquListCode(Objects.toString(obj.get("EQU_DEFINE"), ""));
dto.setSupervisoryCode(Objects.toString(obj.get("SUPERVISORY_CODE"),"")); dto.setSupervisoryCode(Objects.toString(obj.get("SUPERVISORY_CODE"), ""));
dto.setEquList(Objects.toString(obj.get("EQU_LIST"),"")); dto.setEquList(Objects.toString(obj.get("EQU_LIST"), ""));
dto.setFullAddress(Objects.toString(obj.get("ADDRESS"),"")); dto.setFullAddress(Objects.toString(obj.get("ADDRESS"), ""));
if (SUBMIT_TYPE_FLOW.equals(submitType)) { if (SUBMIT_TYPE_FLOW.equals(submitType)) {
WorkflowResultDto workflowResult = workflowResultList.get(i); WorkflowResultDto workflowResult = workflowResultList.get(i);
...@@ -398,7 +406,7 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg ...@@ -398,7 +406,7 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg
dto.setPromoter(reginParams.getUserModel().getUserId()); dto.setPromoter(reginParams.getUserModel().getUserId());
dto.setNextTaskId(workflowResult.getNextTaskId()); dto.setNextTaskId(workflowResult.getNextTaskId());
dto.setNextExecuteUserIds(workflowResult.getNextExecutorUserIds()); dto.setNextExecuteUserIds(workflowResult.getNextExecutorUserIds());
}else{ } else {
dto.setNextExecuteUserIds(RequestContext.getExeUserId()); dto.setNextExecuteUserIds(RequestContext.getExeUserId());
} }
dto.setInstallUnitName(reginParams.getCompany().getCompanyName()); dto.setInstallUnitName(reginParams.getCompany().getCompanyName());
...@@ -423,22 +431,28 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg ...@@ -423,22 +431,28 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg
if (SUBMIT_TYPE_FLOW.equals(submitType)) { if (SUBMIT_TYPE_FLOW.equals(submitType)) {
this.buildTask(list, workflowResultList); this.buildTask(list, workflowResultList);
}else { } else {
this.saveTempReformNotice(list); this.saveTempReformNotice(list);
} }
List<JgReformNoticeEq> jgRelationEquipList = equipList.stream().map(jgRelationEquip -> { List<JgReformNoticeEq> jgRelationEquipList = equipList.stream().map(jgRelationEquip -> {
List<JgReformNotice> collect = list.stream().filter(JgReformNotice -> jgRelationEquip.getEquipTransferId().equals(JgReformNotice.getApplyNo())).collect(Collectors.toList()); List<JgReformNotice> collect = list.stream().filter(JgReformNotice -> jgRelationEquip.getEquipTransferId().equals(JgReformNotice.getApplyNo())).collect(Collectors.toList());
Long sequenceNbr = collect.get(0).getSequenceNbr(); Long sequenceNbr = collect.get(0).getSequenceNbr();
return jgRelationEquip.setEquipTransferId(String.valueOf(sequenceNbr)); return jgRelationEquip.setEquipTransferId(String.valueOf(sequenceNbr));
}).collect(Collectors.toList()); }).collect(Collectors.toList());
jgReformNoticeEqMapper.insertBatchSomeColumn(jgRelationEquipList); jgReformNoticeEqMapper.insertBatchSomeColumn(jgRelationEquipList);
this.updateRedisBatch(list);
return list; return list;
} }
private void updateRedisBatch(List<JgReformNotice> jgReformNotices) {
jgReformNotices.stream().filter(n-> StringUtil.isNotEmpty(n.getInstanceId())).forEach(jgReformNotice -> {
commonService.saveExecuteFlowData2Redis(jgReformNotice.getInstanceId(), this.buildInstanceRuntimeData(jgReformNotice));
});
}
/** /**
* 批量暂存 * 批量暂存
*
* @param noticeList 移交信息 * @param noticeList 移交信息
*/ */
private void saveTempReformNotice(List<JgReformNotice> noticeList) { private void saveTempReformNotice(List<JgReformNotice> noticeList) {
...@@ -456,7 +470,7 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg ...@@ -456,7 +470,7 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg
.taskContent(String.format("来自%s【%s】的业务办理,【申请单号:%s】", item.getEquList(), Objects.toString(item.getSupervisoryCode(), ""), item.getApplyNo())) .taskContent(String.format("来自%s【%s】的业务办理,【申请单号:%s】", item.getEquList(), Objects.toString(item.getSupervisoryCode(), ""), item.getApplyNo()))
.taskCode(item.getApplyNo()) .taskCode(item.getApplyNo())
.taskType(BusinessTypeEnum.JG_MODIFICATION_NOTIFICATION.getCode()) .taskType(BusinessTypeEnum.JG_MODIFICATION_NOTIFICATION.getCode())
.relationId(item.getSequenceNbr()+"") .relationId(item.getSequenceNbr() + "")
.build(); .build();
} }
...@@ -634,13 +648,22 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg ...@@ -634,13 +648,22 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg
* *
* @param noticeDto 改造信息 * @param noticeDto 改造信息
*/ */
@Transactional(rollbackFor = Exception.class)
public void cancel(JgReformNoticeDto noticeDto) { public void cancel(JgReformNoticeDto noticeDto) {
String instanceId = noticeDto.getInstanceId();
String nextTaskId = noticeDto.getNextTaskId();
String lockKey = CommonServiceImpl.buildJgExecuteLockKey(instanceId);
RLock lock = redissonClient.getLock(lockKey);
try {
boolean isLocked = lock.tryLock(0, 180, TimeUnit.SECONDS);
// 解决并发问题:多个人同时操作一个流程(并发执行通过、驳回、撤回)
if (!isLocked) {
throw new BadRequest("当前流程已经被执行!");
}
// 流程执行时,状态及权限校验
commonService.checkForRevocationFlow(nextTaskId, instanceId);
// 查询 改造信息 // 查询 改造信息
JgReformNotice notice = baseMapper.selectById(noticeDto.getSequenceNbr()); JgReformNotice notice = baseMapper.selectById(noticeDto.getSequenceNbr());
if (notice != null) {
// 检查实际状态是否不等于期望状态
commonService.checkExpectedStatus(notice.getNoticeStatus());
// 回滚工作流 // 回滚工作流
ProcessTaskDTO processTaskDTO = cmWorkflowService.rollBack(noticeDto.getInstanceId()); ProcessTaskDTO processTaskDTO = cmWorkflowService.rollBack(noticeDto.getInstanceId());
WorkflowResultDto workflowResultDto = commonService.buildWorkFlowInfo(Collections.singletonList(processTaskDTO)).get(0); WorkflowResultDto workflowResultDto = commonService.buildWorkFlowInfo(Collections.singletonList(processTaskDTO)).get(0);
...@@ -650,13 +673,19 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg ...@@ -650,13 +673,19 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg
notice.setNextTaskId(workflowResultDto.getNextTaskId()); notice.setNextTaskId(workflowResultDto.getNextTaskId());
notice.setNextExecuteUserIds(workflowResultDto.getNextExecutorUserIds()); notice.setNextExecuteUserIds(workflowResultDto.getNextExecutorUserIds());
baseMapper.updateById(notice); baseMapper.updateById(notice);
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(notice)); JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(notice));
jsonObject.put("nextExecuteUser", notice.getNextExecuteIds()); jsonObject.put("nextExecuteUser", notice.getNextExecuteIds());
jsonObject.put("taskType", BusinessTypeEnum.JG_MODIFICATION_NOTIFICATION.getCode()); jsonObject.put("taskType", BusinessTypeEnum.JG_MODIFICATION_NOTIFICATION.getCode());
jsonObject.put("flowStatus", FlowStatusEnum.ROLLBACK.getCode()); jsonObject.put("flowStatus", FlowStatusEnum.ROLLBACK.getCode());
jsonObject.put("flowStatusLabel", FlowStatusEnum.ROLLBACK.getName()); jsonObject.put("flowStatusLabel", FlowStatusEnum.ROLLBACK.getName());
commonService.rollbackTask(notice.getInstanceId(), jsonObject); commonService.rollbackTask(notice.getInstanceId(), jsonObject);
commonService.saveExecuteFlowData2Redis(instanceId, this.buildInstanceRuntimeData(notice));
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
} }
} }
...@@ -667,12 +696,21 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg ...@@ -667,12 +696,21 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg
* @param op 通过或驳回 * @param op 通过或驳回
*/ */
public void accept(JgReformNoticeDto dto, String op) { public void accept(JgReformNoticeDto dto, String op) {
String instanceId = dto.getInstanceId();
String nextTaskId = dto.getNextTaskId();
String lockKey = CommonServiceImpl.buildJgExecuteLockKey(instanceId);
RLock lock = redissonClient.getLock(lockKey);
try {
boolean isLocked = lock.tryLock(0, 180, TimeUnit.SECONDS);
// 解决并发问题:多个人同时操作一个流程(并发执行通过、驳回、撤回)
if (!isLocked) {
throw new BadRequest("当前流程已经被执行!");
}
// 流程执行时,状态及权限校验
commonService.checkForExecuteFlow(nextTaskId, instanceId);
ReginParams reginParams = JSONObject.parseObject(redisUtils.get(RedisKey.buildReginKey(RequestContext.getExeUserId(), RequestContext.getToken())).toString(), ReginParams.class); ReginParams reginParams = JSONObject.parseObject(redisUtils.get(RedisKey.buildReginKey(RequestContext.getExeUserId(), RequestContext.getToken())).toString(), ReginParams.class);
JgReformNotice jgReformNotice = baseMapper.selectById(dto.getSequenceNbr()); JgReformNotice jgReformNotice = baseMapper.selectById(dto.getSequenceNbr());
// 检查实际状态是否不等于期望状态
commonService.checkExpectedStatus(jgReformNotice.getNoticeStatus());
jgReformNotice.setCreateUserCompanyName(reginParams.getCompany().getCompanyName()); jgReformNotice.setCreateUserCompanyName(reginParams.getCompany().getCompanyName());
// 组装设备注册代码 // 组装设备注册代码
StringBuilder stringBuffer = new StringBuilder(); StringBuilder stringBuffer = new StringBuilder();
...@@ -752,6 +790,22 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg ...@@ -752,6 +790,22 @@ public class JgReformNoticeServiceImpl extends BaseService<JgReformNoticeDto, Jg
this.createNewTodo(jgReformNotice, workflowResultDto, taskV2Model, FlowStatusEnum.REJECTED); this.createNewTodo(jgReformNotice, workflowResultDto, taskV2Model, FlowStatusEnum.REJECTED);
jgReformNoticeMapper.updateById(jgReformNotice); jgReformNoticeMapper.updateById(jgReformNotice);
} }
commonService.saveExecuteFlowData2Redis(instanceId, this.buildInstanceRuntimeData(jgReformNotice));
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
public InstanceRuntimeData buildInstanceRuntimeData(JgReformNotice jgReformNotice) {
return InstanceRuntimeData.builder()
.nextExecuteUserIds(jgReformNotice.getNextExecuteUserIds())
.promoter(jgReformNotice.getPromoter())
.nextTaskId(jgReformNotice.getNextTaskId())
.build();
} }
/** /**
......
...@@ -7,14 +7,13 @@ import com.alibaba.fastjson.JSONObject; ...@@ -7,14 +7,13 @@ import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.pagehelper.util.StringUtil;
import com.yeejoin.amos.boot.biz.common.bo.ReginParams; import com.yeejoin.amos.boot.biz.common.bo.ReginParams;
import com.yeejoin.amos.boot.biz.common.utils.DateUtils; import com.yeejoin.amos.boot.biz.common.utils.DateUtils;
import com.yeejoin.amos.boot.biz.common.utils.RedisKey; import com.yeejoin.amos.boot.biz.common.utils.RedisKey;
import com.yeejoin.amos.boot.biz.common.utils.RedisUtils; import com.yeejoin.amos.boot.biz.common.utils.RedisUtils;
import com.yeejoin.amos.boot.module.jg.api.dto.JgTransferNoticeDto; import com.yeejoin.amos.boot.module.jg.api.dto.*;
import com.yeejoin.amos.boot.module.jg.api.dto.TaskMessageDto; import com.yeejoin.amos.boot.module.jg.api.entity.JgMaintainNotice;
import com.yeejoin.amos.boot.module.jg.api.dto.TaskModelDto;
import com.yeejoin.amos.boot.module.jg.api.dto.WorkflowResultDto;
import com.yeejoin.amos.boot.module.jg.api.entity.JgTransferNotice; import com.yeejoin.amos.boot.module.jg.api.entity.JgTransferNotice;
import com.yeejoin.amos.boot.module.jg.api.entity.JgTransferNoticeEq; import com.yeejoin.amos.boot.module.jg.api.entity.JgTransferNoticeEq;
import com.yeejoin.amos.boot.module.jg.api.enums.BusinessTypeEnum; import com.yeejoin.amos.boot.module.jg.api.enums.BusinessTypeEnum;
...@@ -35,6 +34,8 @@ import com.yeejoin.amos.feign.workflow.model.ActWorkflowBatchDTO; ...@@ -35,6 +34,8 @@ import com.yeejoin.amos.feign.workflow.model.ActWorkflowBatchDTO;
import com.yeejoin.amos.feign.workflow.model.ActWorkflowStartDTO; import com.yeejoin.amos.feign.workflow.model.ActWorkflowStartDTO;
import com.yeejoin.amos.feign.workflow.model.ProcessTaskDTO; import com.yeejoin.amos.feign.workflow.model.ProcessTaskDTO;
import com.yeejoin.amos.feign.workflow.model.TaskResultDTO; import com.yeejoin.amos.feign.workflow.model.TaskResultDTO;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -45,9 +46,12 @@ import org.springframework.util.StringUtils; ...@@ -45,9 +46,12 @@ import org.springframework.util.StringUtils;
import org.typroject.tyboot.core.foundation.context.RequestContext; import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil; import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.service.BaseService; import org.typroject.tyboot.core.rdbms.service.BaseService;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.utils.ResponseModel; import org.typroject.tyboot.core.restful.utils.ResponseModel;
import java.text.ParseException; import java.text.ParseException;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -92,6 +96,9 @@ public class JgTransferNoticeServiceImpl extends BaseService<JgTransferNoticeDto ...@@ -92,6 +96,9 @@ public class JgTransferNoticeServiceImpl extends BaseService<JgTransferNoticeDto
@Autowired @Autowired
private CommonServiceImpl commonService; private CommonServiceImpl commonService;
@Autowired
private RedissonClient redissonClient;
/** /**
* 根据sequenceNbr查询 * 根据sequenceNbr查询
* *
...@@ -313,6 +320,7 @@ public class JgTransferNoticeServiceImpl extends BaseService<JgTransferNoticeDto ...@@ -313,6 +320,7 @@ public class JgTransferNoticeServiceImpl extends BaseService<JgTransferNoticeDto
commonService.buildTaskModel(Collections.singletonList(taskModelDto)); commonService.buildTaskModel(Collections.singletonList(taskModelDto));
} }
} }
commonService.saveExecuteFlowData2Redis(notice.getInstanceId(),this.buildInstanceRuntimeData(notice));
} else { } else {
JgTransferNotice bean = new JgTransferNotice(); JgTransferNotice bean = new JgTransferNotice();
BeanUtils.copyProperties(noticeDto, bean); BeanUtils.copyProperties(noticeDto, bean);
...@@ -324,10 +332,9 @@ public class JgTransferNoticeServiceImpl extends BaseService<JgTransferNoticeDto ...@@ -324,10 +332,9 @@ public class JgTransferNoticeServiceImpl extends BaseService<JgTransferNoticeDto
/** /**
* 分页查询 * 分页查询
*/ */
@Override
public Page<JgTransferNoticeDto> queryForJgTransferNoticePage(Page<JgTransferNotice> page, JgTransferNoticeDto model, String type, ReginParams reginParams) { public Page<JgTransferNoticeDto> queryForJgTransferNoticePage(Page<JgTransferNotice> page, JgTransferNoticeDto model, String type, ReginParams reginParams) {
String orgCode; String orgCode = reginParams.getCompany().getCompanyCode();
orgCode = reginParams.getCompany().getCompanyCode();
// model.setReceiveOrgCode(orgCode);
model.setTransferToUserIds(reginParams.getUserModel().getUserId()); model.setTransferToUserIds(reginParams.getUserModel().getUserId());
Page<JgTransferNotice> noticePage = jgTransferNoticeMapper.queryForPage(page, model, type, orgCode); Page<JgTransferNotice> noticePage = jgTransferNoticeMapper.queryForPage(page, model, type, orgCode);
...@@ -384,11 +391,17 @@ public class JgTransferNoticeServiceImpl extends BaseService<JgTransferNoticeDto ...@@ -384,11 +391,17 @@ public class JgTransferNoticeServiceImpl extends BaseService<JgTransferNoticeDto
Long sequenceNbr = collect.get(0).getSequenceNbr(); Long sequenceNbr = collect.get(0).getSequenceNbr();
return jgRelationEquip.setEquipTransferId(String.valueOf(sequenceNbr)); return jgRelationEquip.setEquipTransferId(String.valueOf(sequenceNbr));
}).collect(Collectors.toList()); }).collect(Collectors.toList());
jgTransferNoticeEqMapper.insertBatchSomeColumn(jgRelationEquipList); jgTransferNoticeEqMapper.insertBatchSomeColumn(jgRelationEquipList);
this.updateRedisBatch(list);
return list; return list;
} }
private void updateRedisBatch(List<JgTransferNotice> jgTransferNotices) {
jgTransferNotices.stream().filter(n -> StringUtil.isNotEmpty(n.getInstanceId())).forEach(jgTransferNotice -> {
commonService.saveExecuteFlowData2Redis(jgTransferNotice.getInstanceId(), this.buildInstanceRuntimeData(jgTransferNotice));
});
}
/** /**
* 暂存任务生成待办 * 暂存任务生成待办
* *
...@@ -602,38 +615,73 @@ public class JgTransferNoticeServiceImpl extends BaseService<JgTransferNoticeDto ...@@ -602,38 +615,73 @@ public class JgTransferNoticeServiceImpl extends BaseService<JgTransferNoticeDto
} }
@Transactional @Transactional(rollbackFor = Exception.class)
public void cancel(JgTransferNoticeDto noticeDto) { public void cancel(JgTransferNoticeDto noticeDto) {
JgTransferNotice jgInstallationNotice = this.baseMapper.selectById(noticeDto.getSequenceNbr()); String instanceId = noticeDto.getInstanceId();
if (jgInstallationNotice != null) { String nextTaskId = noticeDto.getNextTaskId();
//检查实际状态是否不是待受理状态 String lockKey = CommonServiceImpl.buildJgExecuteLockKey(instanceId);
commonService.checkExpectedStatus(jgInstallationNotice.getNoticeStatus()); RLock lock = redissonClient.getLock(lockKey);
try {
boolean isLocked = lock.tryLock(0, 180, TimeUnit.SECONDS);
// 解决并发问题:多个人同时操作一个流程(并发执行通过、驳回、撤回)
if (!isLocked) {
throw new BadRequest("当前流程已经被执行!");
}
// 流程执行时,状态及权限校验
commonService.checkForRevocationFlow(nextTaskId, instanceId);
JgTransferNotice jgTransferNotice = this.baseMapper.selectById(noticeDto.getSequenceNbr());
ProcessTaskDTO processTaskDTO = iCmWorkflowService.rollBack(jgInstallationNotice.getInstanceId()); ProcessTaskDTO processTaskDTO = iCmWorkflowService.rollBack(jgTransferNotice.getInstanceId());
// 提取节点等信息 // 提取节点等信息
WorkflowResultDto workflowResultDto = commonService.buildWorkFlowInfo(Collections.singletonList(processTaskDTO)).get(0); WorkflowResultDto workflowResultDto = commonService.buildWorkFlowInfo(Collections.singletonList(processTaskDTO)).get(0);
jgInstallationNotice.setPromoter(""); jgTransferNotice.setPromoter("");
jgInstallationNotice.setNextExecuteIds(workflowResultDto.getNextExecutorRoleIds()); jgTransferNotice.setNextExecuteIds(workflowResultDto.getNextExecutorRoleIds());
jgInstallationNotice.setNextExecuteUserIds(workflowResultDto.getNextExecutorUserIds()); jgTransferNotice.setNextExecuteUserIds(workflowResultDto.getNextExecutorUserIds());
jgInstallationNotice.setNoticeStatus(String.valueOf(FlowStatusEnum.ROLLBACK.getCode())); jgTransferNotice.setNoticeStatus(String.valueOf(FlowStatusEnum.ROLLBACK.getCode()));
jgInstallationNotice.setNextTaskId(workflowResultDto.getNextTaskId()); jgTransferNotice.setNextTaskId(workflowResultDto.getNextTaskId());
jgTransferNoticeMapper.updateById(jgInstallationNotice); jgTransferNoticeMapper.updateById(jgTransferNotice);
TaskMessageDto taskMessageDto = new TaskMessageDto(); TaskMessageDto taskMessageDto = new TaskMessageDto();
BeanUtils.copyProperties(jgInstallationNotice, taskMessageDto); BeanUtils.copyProperties(jgTransferNotice, taskMessageDto);
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(taskMessageDto)); JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(taskMessageDto));
jsonObject.put("taskType", BusinessTypeEnum.JG_ADVICE_REMOVAL.getCode()); jsonObject.put("taskType", BusinessTypeEnum.JG_ADVICE_REMOVAL.getCode());
jsonObject.put("nextExecuteUser", jgInstallationNotice.getNextExecuteIds()); jsonObject.put("nextExecuteUser", jgTransferNotice.getNextExecuteIds());
jsonObject.put("flowStatusLabel", FlowStatusEnum.ROLLBACK.getName()); jsonObject.put("flowStatusLabel", FlowStatusEnum.ROLLBACK.getName());
jsonObject.put("flowStatus", FlowStatusEnum.ROLLBACK.getCode()); jsonObject.put("flowStatus", FlowStatusEnum.ROLLBACK.getCode());
jsonObject.put("nextTaskId", jgInstallationNotice.getNextTaskId()); jsonObject.put("nextTaskId", jgTransferNotice.getNextTaskId());
commonService.rollbackTask(jgInstallationNotice.getInstanceId(), jsonObject); commonService.rollbackTask(jgTransferNotice.getInstanceId(), jsonObject);
commonService.saveExecuteFlowData2Redis(instanceId, this.buildInstanceRuntimeData(jgTransferNotice));
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
} }
} }
@Transactional
public void accept(JgTransferNoticeDto dto, String op, String opinion) {
ReginParams reginParams = JSONObject.parseObject(redisUtils.get(RedisKey.buildReginKey(RequestContext.getExeUserId(), RequestContext.getToken())).toString(), ReginParams.class); public InstanceRuntimeData buildInstanceRuntimeData(JgTransferNotice jgTransferNotice) {
return InstanceRuntimeData.builder()
.nextExecuteUserIds(jgTransferNotice.getNextExecuteUserIds())
.promoter(jgTransferNotice.getPromoter())
.nextTaskId(jgTransferNotice.getNextTaskId())
.build();
}
@Transactional(rollbackFor = Exception.class)
public void accept(JgTransferNoticeDto dto, String op, String opinion) {
String instanceId = dto.getInstanceId();
String nextTaskId = dto.getNextTaskId();
String lockKey = CommonServiceImpl.buildJgExecuteLockKey(instanceId);
RLock lock = redissonClient.getLock(lockKey);
try {
boolean isLocked = lock.tryLock(0, 180, TimeUnit.SECONDS);
// 解决并发问题:多个人同时操作一个流程(并发执行通过、驳回、撤回)
if (!isLocked) {
throw new BadRequest("当前流程已经被执行!");
}
// 流程执行时,状态及权限校验
commonService.checkForExecuteFlow(nextTaskId, instanceId);
JgTransferNotice jgTransferNotice = this.jgTransferNoticeMapper.selectById(dto.getSequenceNbr()); JgTransferNotice jgTransferNotice = this.jgTransferNoticeMapper.selectById(dto.getSequenceNbr());
// 检查实际状态是否不等于期望状态 // 检查实际状态是否不等于期望状态
...@@ -650,7 +698,7 @@ public class JgTransferNoticeServiceImpl extends BaseService<JgTransferNoticeDto ...@@ -650,7 +698,7 @@ public class JgTransferNoticeServiceImpl extends BaseService<JgTransferNoticeDto
// 执行工作流并返回组装好的工作流信息 // 执行工作流并返回组装好的工作流信息
WorkflowResultDto workflowResultDto = getWorkflowResultDto(op, opinion, jgTransferNotice); WorkflowResultDto workflowResultDto = getWorkflowResultDto(op, opinion, jgTransferNotice);
jgTransferNotice.setPromoter(reginParams.getUserModel().getUserId()); jgTransferNotice.setPromoter(RequestContext.getExeUserId());
jgTransferNotice.setNextTaskId(workflowResultDto.getNextTaskId()); jgTransferNotice.setNextTaskId(workflowResultDto.getNextTaskId());
TaskV2Model taskV2Model = new TaskV2Model(); TaskV2Model taskV2Model = new TaskV2Model();
if ("0".equals(op)) { if ("0".equals(op)) {
...@@ -776,6 +824,14 @@ public class JgTransferNoticeServiceImpl extends BaseService<JgTransferNoticeDto ...@@ -776,6 +824,14 @@ public class JgTransferNoticeServiceImpl extends BaseService<JgTransferNoticeDto
jgTransferNotice.setNextExecuteIds(workflowResultDto.getNextExecutorRoleIds()); jgTransferNotice.setNextExecuteIds(workflowResultDto.getNextExecutorRoleIds());
jgTransferNoticeMapper.updateById(jgTransferNotice); jgTransferNoticeMapper.updateById(jgTransferNotice);
} }
commonService.saveExecuteFlowData2Redis(instanceId, this.buildInstanceRuntimeData(jgTransferNotice));
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
} }
/** /**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment