Commit 4ca58000 authored by suhuiguang's avatar suhuiguang

1.开通、报检并发问题处理

parent ee5b9cf6
package com.yeejoin.amos.boot.module.jyjc.api.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author Administrator
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class InstanceRuntimeData implements Serializable {
/**
* 下一个执行节点id
*/
private String nextTaskId;
/**
* 最近流程执行人
*/
private String promoter;
/**
* 下一节点执行人
*/
private String nextExecuteUserIds;
}
...@@ -16,7 +16,6 @@ import com.yeejoin.amos.feign.privilege.model.RoleModel; ...@@ -16,7 +16,6 @@ import com.yeejoin.amos.feign.privilege.model.RoleModel;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.typroject.tyboot.core.foundation.context.RequestContext; import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.enumeration.UserType; import org.typroject.tyboot.core.foundation.enumeration.UserType;
...@@ -37,7 +36,6 @@ import java.util.stream.Collectors; ...@@ -37,7 +36,6 @@ import java.util.stream.Collectors;
@RestController @RestController
@Api(tags = "检验业务申请单api") @Api(tags = "检验业务申请单api")
@RequestMapping(value = "/jyjc-opening-application") @RequestMapping(value = "/jyjc-opening-application")
@EnableScheduling
public class JyjcOpeningApplicationController extends BaseController { public class JyjcOpeningApplicationController extends BaseController {
@Autowired @Autowired
...@@ -54,9 +52,11 @@ public class JyjcOpeningApplicationController extends BaseController { ...@@ -54,9 +52,11 @@ public class JyjcOpeningApplicationController extends BaseController {
public ResponseModel<JyjcOpeningApplicationModel> save(@RequestBody JSONObject model) { public ResponseModel<JyjcOpeningApplicationModel> save(@RequestBody JSONObject model) {
JyjcOpeningApplicationModel jyjcOpeningApplicationModel = new JyjcOpeningApplicationModel(); JyjcOpeningApplicationModel jyjcOpeningApplicationModel = new JyjcOpeningApplicationModel();
// 兼容工作台暂存逻辑、编辑时报错逻辑 // 兼容工作台暂存逻辑、编辑时报错逻辑
if (model.containsKey("applyInfo")) { // 工作台暂存逻辑 if (model.containsKey("applyInfo")) {
// 工作台暂存逻辑
BeanUtil.copyProperties(model.get("applyInfo"), jyjcOpeningApplicationModel); BeanUtil.copyProperties(model.get("applyInfo"), jyjcOpeningApplicationModel);
} else { // 详情保存逻辑 } else {
// 详情保存逻辑
BeanUtil.copyProperties(model, jyjcOpeningApplicationModel); BeanUtil.copyProperties(model, jyjcOpeningApplicationModel);
} }
return ResponseHelper.buildResponse(jyjcOpeningApplicationServiceImpl.saveOrUpdateModel(jyjcOpeningApplicationModel, false)); return ResponseHelper.buildResponse(jyjcOpeningApplicationServiceImpl.saveOrUpdateModel(jyjcOpeningApplicationModel, false));
......
...@@ -9,19 +9,20 @@ import com.yeejoin.amos.boot.biz.common.entity.BaseEntity; ...@@ -9,19 +9,20 @@ import com.yeejoin.amos.boot.biz.common.entity.BaseEntity;
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.jyjc.api.enums.OpenBizTypeEnum; import com.yeejoin.amos.boot.module.jyjc.api.enums.OpenBizTypeEnum;
import com.yeejoin.amos.boot.module.jyjc.api.model.InstanceRuntimeData;
import com.yeejoin.amos.boot.module.ymt.api.dto.TzBaseEnterpriseInfoDto; import com.yeejoin.amos.boot.module.ymt.api.dto.TzBaseEnterpriseInfoDto;
import com.yeejoin.amos.boot.module.ymt.api.entity.TzBaseEnterpriseInfo; import com.yeejoin.amos.boot.module.ymt.api.entity.TzBaseEnterpriseInfo;
import com.yeejoin.amos.boot.module.ymt.api.entity.TzsUserInfo; import com.yeejoin.amos.boot.module.ymt.api.entity.TzsUserInfo;
import com.yeejoin.amos.boot.module.ymt.api.mapper.TzBaseEnterpriseInfoMapper; import com.yeejoin.amos.boot.module.ymt.api.mapper.TzBaseEnterpriseInfoMapper;
import com.yeejoin.amos.boot.module.ymt.api.mapper.TzsUserInfoMapper; import com.yeejoin.amos.boot.module.ymt.api.mapper.TzsUserInfoMapper;
import com.yeejoin.amos.feign.systemctl.Systemctl; import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
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;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.typroject.tyboot.core.foundation.context.RequestContext; import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import java.util.HashMap;
import java.util.List; import java.util.List;
@Service @Service
...@@ -47,6 +48,9 @@ public class CommonserviceImpl { ...@@ -47,6 +48,9 @@ public class CommonserviceImpl {
@Autowired @Autowired
TzBaseEnterpriseInfoMapper enterpriseInfoMapper; TzBaseEnterpriseInfoMapper enterpriseInfoMapper;
@Autowired
RedissonClient redissonClient;
/** /**
* @return ReginParams * @return ReginParams
...@@ -109,12 +113,69 @@ public class CommonserviceImpl { ...@@ -109,12 +113,69 @@ public class CommonserviceImpl {
} }
@Async /**
public void sendMessage(HashMap<String, String> smsParams, List<String> phones) { * 执行流程时前置校验是否已经执行
for (String phone : phones) { *
smsParams.put("mobile", phone); * @param taskId 任务id
Systemctl.smsClient.sendCommonSms(smsParams); * @param instanceId 实例id
*/
public void checkForExecuteFlow(String taskId, String instanceId) {
InstanceRuntimeData instanceRuntimeData = getInstanceRuntimeData(instanceId);
if (instanceRuntimeData == null) {
throw new BadRequest("当前流程已经被执行!请重新打开页面查看并执行!");
}
// 当前任务id与当前任务id不一致时,不让操作,解决老页面没关闭,但是流程已经被被人执行(通过、驳回、撤回),工作流未限制错误
String currentTaskId = instanceRuntimeData.getNextTaskId();
if (!taskId.equals(currentTaskId)) {
throw new BadRequest("当前流程已经被执行!请重新打开页面查看并执行!");
}
// 当前流程已经被转办给其他人或者页面按钮问题导致的权限未控制
String nextExecuteUserIds = instanceRuntimeData.getNextExecuteUserIds();
if (!nextExecuteUserIds.contains(RequestContext.getExeUserId())) {
throw new BadRequest("当前登录人无执行权限!");
} }
}
private InstanceRuntimeData getInstanceRuntimeData(String instanceId) {
RBucket<InstanceRuntimeData> rBucket = redissonClient.getBucket(buildJgInstanceDataKey(instanceId));
return rBucket.get();
} }
private static String buildJgInstanceDataKey(String instanceId) {
return "JC_INSTANCE_DATA:" + instanceId;
}
/**
* 最新流程数据缓存
*
* @param instanceId 实例id
* @param instanceData 流程数据
*/
public void saveExecuteFlowData2Redis(String instanceId, InstanceRuntimeData instanceData) {
redissonClient.getBucket(buildJgInstanceDataKey(instanceId)).set(instanceData);
}
/**
* 撤回时校验流程是否已经执行
*
* @param taskId 前端业务上送任务id
* @param instanceId 实例id
*/
public void checkForRevocationFlow(String taskId, String instanceId) {
InstanceRuntimeData instanceRuntimeData = getInstanceRuntimeData(instanceId);
if (instanceRuntimeData == null) {
throw new BadRequest("当前流程已经被执行!请重新打开页面查看并执行!");
}
// 前端页面上送任务id与当前任务id不一致时,不让操作,解决老页面没关闭,但是流程已经被被人执行(通过、驳回、撤回),工作流未限制错误
String currentTaskId = instanceRuntimeData.getNextTaskId();
if (!taskId.equals(currentTaskId)) {
throw new BadRequest("当前流程已经被执行!请重新打开页面查看并执行!");
}
if (!instanceRuntimeData.getPromoter().equals(RequestContext.getExeUserId())) {
throw new BadRequest("无权限执行该任务");
}
}
} }
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