Browse Source

feat: 添加锁解决跨系统重复开单

checkBack
Yen 1 year ago
parent
commit
1ded6c0f90
  1. 12
      src/main/java/com/qs/serve/common/framework/mvc/HttpServletRequestFilter.java
  2. 35
      src/main/java/com/qs/serve/common/framework/redis/RedisService.java
  3. 12
      src/main/java/com/qs/serve/common/util/AuthContextUtils.java
  4. 1
      src/main/java/com/qs/serve/modules/sys/service/impl/SysPostServiceImpl.java
  5. 2
      src/main/java/com/qs/serve/modules/sys/service/impl/SysPostUserServiceImpl.java
  6. 6
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetServiceImpl.java
  7. 5
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java
  8. 10
      src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyItemController.java
  9. 8
      src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItem.java
  10. 4
      src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyApplicationService.java
  11. 7
      src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyApplicationServiceImpl.java
  12. 2
      src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java
  13. 7
      src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java

12
src/main/java/com/qs/serve/common/framework/mvc/HttpServletRequestFilter.java

@ -1,15 +1,18 @@
package com.qs.serve.common.framework.mvc;
import com.qs.serve.common.config.DevEnvironmentConfig;
import com.qs.serve.common.framework.redis.RedisService;
import com.qs.serve.common.framework.security.model.LoginUser;
import com.qs.serve.common.util.AuthContextUtils;
import com.qs.serve.common.util.DateUtils;
import com.qs.serve.common.util.ServletUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
@ -36,6 +39,8 @@ import java.time.format.DateTimeFormatter;
@Order(10000)
public class HttpServletRequestFilter implements Filter{
@Resource
RedisService redisService;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
@ -98,6 +103,13 @@ public class HttpServletRequestFilter implements Filter{
}else {
log.error(buffer.toString());
}
String themeKey = AuthContextUtils.getLockTheme();
if(StringUtils.hasText(themeKey)){
log.warn("释放资源key:{}",themeKey);
redisService.remove(themeKey);
}
//释放资源 防止线程池重复利用出现脏数据
AuthContextUtils.removeThreadLocal();
}
@Override

35
src/main/java/com/qs/serve/common/framework/redis/RedisService.java

@ -1,5 +1,7 @@
package com.qs.serve.common.framework.redis;
import com.qs.serve.common.util.Assert;
import com.qs.serve.common.util.AuthContextUtils;
import lombok.AllArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
@ -34,6 +36,39 @@ public class RedisService {
private StringRedisTemplate stringRedisTemplate;
/**
* 加锁
* @param theme
* @param id
* @return 是否在锁
*/
public void throwResLock(String theme,String id){
String key = "LOCK_RES:"+theme+":"+id;
String value = this.getString(key);
System.out.println("throwResLock:"+value);
String newVal = "lock";
if(newVal.equals(value)){
Assert.throwEx("服务正在处理,请稍后再试");
}
this.set(key,newVal,10,TimeUnit.MINUTES);
String value2 = this.getString(key);
if(!newVal.equals(value2)){
Assert.throwEx("锁失效");
}
AuthContextUtils.setLockTheme(key);
}
/**
* 释放锁
* @param theme
* @param id
* @return 是否在锁
*/
public void removeResLock(String theme,String id){
String key = "LOCK_RES:"+theme+":"+id;
this.remove(key);
}
/**
* 写入缓存

12
src/main/java/com/qs/serve/common/util/AuthContextUtils.java

@ -26,6 +26,13 @@ public class AuthContextUtils {
private final static ThreadLocal<String> THREAD_TENANT = new ThreadLocal<>();
private final static ThreadLocal<Long> THREAD_SUPPLIER = new ThreadLocal<>();
private final static ThreadLocal<String> RES_THEME_LOCK = new ThreadLocal<>();
public static void removeThreadLocal(){
THREAD_TENANT.remove();
THREAD_SUPPLIER.remove();
RES_THEME_LOCK.remove();
}
public static String getAppId(){
return getAppId(true);
@ -69,6 +76,11 @@ public class AuthContextUtils {
public static String getTenant(){return THREAD_TENANT.get();}
public static void setLockTheme(String value){RES_THEME_LOCK.set(value);}
public static String getLockTheme(){return RES_THEME_LOCK.get();}
public static void setSupplierId(String value){
if(value!=null){
try {

1
src/main/java/com/qs/serve/modules/sys/service/impl/SysPostServiceImpl.java

@ -119,6 +119,7 @@ public class SysPostServiceImpl extends ServiceImpl<SysPostMapper, SysPost> impl
post.setPathIds(pPathId +"_"+post.getId());
post.setPathNames(pPathName+"_"+post.getPostName());
}
this.updateById(post);
this.toFlushPathIds(post.getId(),post.getPathIds(),post.getPostName());
}
}

2
src/main/java/com/qs/serve/modules/sys/service/impl/SysPostUserServiceImpl.java

@ -44,7 +44,7 @@ public class SysPostUserServiceImpl extends ServiceImpl<SysPostUserMapper,SysPos
for (SysPostUser postUser : postUserList) {
LambdaQueryWrapper<SysPostUser> lqw = new LambdaQueryWrapper<>();
lqw.likeRight(SysPostUser::getPathIds,postUser.getPathIds()+"_");
lqw.select(SysPostUser::getUserId,SysPostUser::getId);
//lqw.select(SysPostUser::getUserId,SysPostUser::getId);
List<SysPostUser> sysPostUsers = this.list(lqw);
for (SysPostUser childUser : sysPostUsers) {
userIdSet.add(childUser.getUserId());

6
src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetServiceImpl.java

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qs.serve.common.config.properties.ProjectProperties;
import com.qs.serve.common.framework.manager.AsyncFactory;
import com.qs.serve.common.framework.manager.AsyncManager;
import com.qs.serve.common.framework.redis.RedisService;
import com.qs.serve.common.model.dto.R;
import com.qs.serve.common.model.enums.BudgetLogOptFlag;
import com.qs.serve.common.util.*;
@ -83,6 +84,7 @@ public class TbsBudgetServiceImpl extends ServiceImpl<TbsBudgetMapper,TbsBudget>
private final VtbFundFlowService vtbFundFlowService;
private final TbsActivityTemplateMapper tbsActivityTemplateMapper;
private RedisService redisService;
private SysAttachService attachService;
private SeeYonRequestService seeYonService;
private ProjectProperties projectProperties;
@ -90,10 +92,12 @@ public class TbsBudgetServiceImpl extends ServiceImpl<TbsBudgetMapper,TbsBudget>
@Override
public void commitApply(Long id) {
TbsBudget tbsBudget = this.getById(id);
redisService.throwResLock(TbsBudget.class.getSimpleName(),id.toString());
seeYonService.testConnection();
String templateCode = TbsSeeYonConst.BudgetApplyConf.Code();
SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId());
TbsBudget tbsBudget = this.getById(id);
if(tbsBudget.getBudgetState().equals(1)){
Assert.throwEx("已开启");
}

5
src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java

@ -8,6 +8,7 @@ import com.qs.serve.common.config.properties.ProjectApisProperties;
import com.qs.serve.common.config.properties.ProjectProperties;
import com.qs.serve.common.framework.manager.AsyncFactory;
import com.qs.serve.common.framework.manager.AsyncManager;
import com.qs.serve.common.framework.redis.RedisService;
import com.qs.serve.common.model.consts.ApplyTypeConst;
import com.qs.serve.common.model.enums.BudgetLogOptFlag;
import com.qs.serve.common.model.consts.BudgetLogRollbackFlag;
@ -88,6 +89,7 @@ import java.util.stream.Collectors;
@AllArgsConstructor
public class TbsCostApplyServiceImpl extends ServiceImpl<TbsCostApplyMapper,TbsCostApply> implements TbsCostApplyService {
private RedisService redisService;
private TbsActivityChannelPointMapper tbsActivityChannelPointMapper;
private VtbVerificationMapper vtbVerificationMapper;
private TbsBudgetApplicationService budgetApplicationService;
@ -499,8 +501,9 @@ public class TbsCostApplyServiceImpl extends ServiceImpl<TbsCostApplyMapper,TbsC
@Override
@Transactional(rollbackFor = Exception.class)
public void commitApply(String id) {
seeYonService.testConnection();
TbsCostApply tbsCostApply = this.getById(id);
redisService.throwResLock(TbsCostApply.class.getSimpleName(),id);
seeYonService.testConnection();
if(!tbsCostApply.getChargeState().equals(TbsCostApplyState.State_0_unPublish.getCode())
&&!tbsCostApply.getChargeState().equals(TbsCostApplyState.State_4_refused.getCode())){
Assert.throwEx("操作失败,申请费用状态不支持");

10
src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyItemController.java

@ -13,6 +13,7 @@ import com.qs.serve.modules.sys.service.SysAttachService;
import com.qs.serve.modules.sys.service.SysUserService;
import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget;
import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudgetMapper;
import com.qs.serve.modules.tzc.common.TzPolicyItemStatus;
import com.qs.serve.modules.tzc.common.TzcPolicyStatus;
import com.qs.serve.modules.tzc.entity.TzcPolicy;
import com.qs.serve.modules.tzc.entity.TzcPolicyGoods;
@ -29,6 +30,7 @@ import com.qs.serve.modules.tzc.entity.TzcPolicyItem;
import com.qs.serve.modules.tzc.service.TzcPolicyItemService;
import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@ -101,7 +103,15 @@ public class TzcPolicyItemController {
policy = tzcPolicyService.getById(param.getPolicyId());
}
LocalDateTime nowTime = LocalDateTime.now();
for (TzcPolicyItem policyItem : list) {
int expire = 0;
if(policyItem.getPolicyEndDate().atStartOfDay().isBefore(nowTime)){
expire = 1;
}
policyItem.setExpireFlag(expire);
List<TzcPolicyGoods> policyGoodsList = tzcPolicyGoodsService.listByItemId(policyItem.getId());
policyItem.setPolicyGoodsList(policyGoodsList);
if(policyItem.getAttachIds()!=null&&policyItem.getAttachIds().length>0){

8
src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItem.java

@ -85,6 +85,8 @@ public class TzcPolicyItem implements Serializable {
private Integer releaseFlag;
/** 释放时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(updateStrategy = FieldStrategy.NOT_NULL)
private LocalDateTime releaseTime;
@ -232,6 +234,12 @@ public class TzcPolicyItem implements Serializable {
@TableField(exist = false)
private List<?> matchBudgetList;
/**
* 是否过期
*/
@TableField(exist = false)
private Integer expireFlag;
public void initSetNull(){
this.setId(null);
this.setCreateBy(null);

4
src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyApplicationService.java

@ -27,6 +27,10 @@ public interface TzcPolicyApplicationService {
*/
void syncExpireRelease();
/**
* 取消释放
* @param policyItemId
*/
void cancelReleasePolicyItem(Long policyItemId);
void releasePolicyItem(Long policyItemId, SysUser user);

7
src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyApplicationServiceImpl.java

@ -7,6 +7,7 @@ import com.qs.serve.common.config.properties.ProjectApisProperties;
import com.qs.serve.common.config.properties.ProjectProperties;
import com.qs.serve.common.framework.manager.AsyncFactory;
import com.qs.serve.common.framework.manager.AsyncManager;
import com.qs.serve.common.framework.redis.RedisService;
import com.qs.serve.common.model.enums.BudgetLogOptFlag;
import com.qs.serve.common.model.consts.BudgetLogRollbackFlag;
import com.qs.serve.common.model.dto.R;
@ -61,6 +62,7 @@ import com.qs.serve.modules.tzc.service.TzcPolicyItemService;
import com.qs.serve.modules.tzc.service.TzcPolicyService;
import com.qs.serve.modules.vtb.common.VtbFundFlowType;
import com.qs.serve.modules.vtb.entity.VtbFundFlow;
import com.qs.serve.modules.vtb.entity.VtbVerification;
import com.qs.serve.modules.vtb.service.VtbFundFlowService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -84,6 +86,7 @@ import java.util.stream.Collectors;
@AllArgsConstructor
public class TzcPolicyApplicationServiceImpl implements TzcPolicyApplicationService {
private RedisService redisService;
private TzcPolicyMapper tzcPolicyMapper;
private TzcPolicyService tzcPolicyService;
private TzcPolicyItemService tzcPolicyItemService;
@ -378,8 +381,10 @@ public class TzcPolicyApplicationServiceImpl implements TzcPolicyApplicationServ
@Override
@Transactional(rollbackFor = Exception.class)
public void commitPolicy(Long policyId){
seeYonService.testConnection();
TzcPolicy tzcPolicy = tzcPolicyService.getById(policyId);
redisService.throwResLock(TzcPolicy.class.getSimpleName(),tzcPolicy.getId()+"");
seeYonService.testConnection();
Integer tzcPolicyStatus = tzcPolicy.getPolicyStatus();
if(!tzcPolicy.allowEditFlag()){
Assert.throwEx("操作失败,政策状态不支持");

2
src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java

@ -335,7 +335,7 @@ public class VtbVerificationController {
* @param commitBo
* @return
*/
@LimitSubmit(interval = 3000)
@LimitSubmit(interval = 30000)
@PostMapping("/commit")
@SysLog(module = SystemModule.Verification, title = "核销", biz = BizType.UPDATE)
@PreAuthorize("hasRole('vtb:verification:commit')")

7
src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java

@ -8,6 +8,7 @@ import com.qs.serve.common.config.properties.ProjectApisProperties;
import com.qs.serve.common.config.properties.ProjectProperties;
import com.qs.serve.common.framework.manager.AsyncFactory;
import com.qs.serve.common.framework.manager.AsyncManager;
import com.qs.serve.common.framework.redis.RedisService;
import com.qs.serve.common.model.AmountDTO;
import com.qs.serve.common.model.enums.BudgetLogOptFlag;
import com.qs.serve.common.model.dto.R;
@ -103,6 +104,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
private final SysSyncLogService sysSyncLogService;
private final ProjectApisProperties projectApisProperties;
private final RedisService redisService;
private final VtbVerificationChannelService verificationChannelService;
private final VtbVerificationChannelPointService verificationChannelPointService;
@ -674,10 +676,10 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
@Override
@Transactional(rollbackFor = Exception.class)
public void commit(VtbVerificationBo verificationBo) {
TbsActivity activity = activityService.getById(verificationBo.getActivityId());
redisService.throwResLock(VtbVerification.class.getSimpleName(),activity.getId()+"");
SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId());
sysUser.checkSyAccount();
TbsActivity activity = activityService.getById(verificationBo.getActivityId());
//自定义成本中心核销
List<VtbVerificationSubjectCenterBo> subjectCenterBoList = verificationBo.getSubjectCenterList();
boolean isCenterCheck = CollectionUtil.isNotEmpty(subjectCenterBoList);
@ -850,6 +852,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
}
verification.setAmount(totalAmount);
verification.setAmountRecord(totalAmount);
//保存
this.saveOrUpdate(verification);
this.commitSy(activity,sysUser,verification,saleBizNames,bizBizNames);

Loading…
Cancel
Save