Browse Source

feature1.0.0-img: 添加分布式锁

master
penny 4 years ago
parent
commit
7ce488193c
  1. 83
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/CreatorProfitServiceImpl.java
  2. 71
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/ProfitVerifyOrderServiceImpl.java
  3. 2
      bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/CreatorProfitMapper.xml

83
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/CreatorProfitServiceImpl.java

@ -4,6 +4,7 @@ import cn.hutool.core.util.IdUtil;
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.bnyer.common.redis.service.RedisService; import com.bnyer.common.redis.service.RedisService;
import com.bnyer.common.redis.service.RedissonService;
import com.bnyer.img.domain.CreatorProfit; import com.bnyer.img.domain.CreatorProfit;
import com.bnyer.img.domain.InviteLog; import com.bnyer.img.domain.InviteLog;
import com.bnyer.img.dto.CreatorProfitPageDto; import com.bnyer.img.dto.CreatorProfitPageDto;
@ -40,12 +41,15 @@ public class CreatorProfitServiceImpl implements CreatorProfitService {
@Autowired @Autowired
private InviteLogMapper inviteLogMapper; private InviteLogMapper inviteLogMapper;
@Autowired
private RedissonService redissonService;
@Override @Override
public boolean checkCreatorProfitExist(String mark) { public boolean checkCreatorProfitExist(String mark) {
CreatorProfit creatorProfit = creatorProfitMapper.checkCreatorProfitExist(mark); CreatorProfit creatorProfit = creatorProfitMapper.checkCreatorProfitExist(mark);
if(creatorProfit != null){ if (creatorProfit != null) {
return true; return true;
}else{ } else {
return false; return false;
} }
} }
@ -56,15 +60,15 @@ public class CreatorProfitServiceImpl implements CreatorProfitService {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
long times = System.currentTimeMillis(); long times = System.currentTimeMillis();
String date = format.format(times); String date = format.format(times);
String mark = creatorProfit.getCreatorId()+creatorProfit.getImgId()+creatorProfit.getAppType()+creatorProfit.getPlatform()+ String mark = creatorProfit.getCreatorId().toString() + creatorProfit.getImgId().toString() + creatorProfit.getAppType() + creatorProfit.getPlatform() +
"0"+date.replace("-",""); "0" + date.replace("-", "");
//缓存中下载总数+1 //缓存中下载总数+1
tiktokImgService.writeDownloadTotalNum(creatorProfit.getAppType(),creatorProfit.getPlatform()); tiktokImgService.writeDownloadTotalNum(creatorProfit.getAppType(), creatorProfit.getPlatform());
//检查收益表是否存在广告记录,存在则更新次数 //检查收益表是否存在广告记录,存在则更新次数
boolean b = this.checkCreatorProfitExist(mark); boolean b = this.checkCreatorProfitExist(mark);
if(b){ if (b) {
int update = this.updateCreatorProfitDownloadNum(mark); int update = this.updateCreatorProfitDownloadNum(mark);
log.info("唯一标识【{}】收益下载次数+1",mark); log.info("唯一标识【{}】收益下载次数+1", mark);
return update; return update;
} }
//不存在则新增广告记录 //不存在则新增广告记录
@ -77,22 +81,22 @@ public class CreatorProfitServiceImpl implements CreatorProfitService {
creatorProfit.setDownloadNum(1); creatorProfit.setDownloadNum(1);
creatorProfit.setMark(mark); creatorProfit.setMark(mark);
//根据平台生成订单号 //根据平台生成订单号
switch (creatorProfit.getPlatform()){ switch (creatorProfit.getPlatform()) {
case "0" : case "0":
creatorProfit.setOrderNo("DY"+IdUtil.getSnowflakeNextIdStr()); creatorProfit.setOrderNo("DY" + IdUtil.getSnowflakeNextIdStr());
break; break;
case "1" : case "1":
creatorProfit.setOrderNo("KS"+IdUtil.getSnowflakeNextIdStr()); creatorProfit.setOrderNo("KS" + IdUtil.getSnowflakeNextIdStr());
break; break;
case "2" : case "2":
creatorProfit.setOrderNo("WX"+IdUtil.getSnowflakeNextIdStr()); creatorProfit.setOrderNo("WX" + IdUtil.getSnowflakeNextIdStr());
break; break;
default: default:
creatorProfit.setOrderNo("UNI"+IdUtil.getSnowflakeNextIdStr()); creatorProfit.setOrderNo("UNI" + IdUtil.getSnowflakeNextIdStr());
break; break;
} }
int insert = creatorProfitMapper.insert(creatorProfit); int insert = creatorProfitMapper.insert(creatorProfit);
log.info("新增艺术家【{}】图片【{}】应用【{}】平台【{}】收益记录",creatorProfit.getCreatorId(), creatorProfit.getImgId(), creatorProfit.getAppType(), creatorProfit.getPlatform()); log.info("新增艺术家【{}】图片【{}】应用【{}】平台【{}】收益记录", creatorProfit.getCreatorId(), creatorProfit.getImgId(), creatorProfit.getAppType(), creatorProfit.getPlatform());
return insert; return insert;
} }
@ -106,17 +110,17 @@ public class CreatorProfitServiceImpl implements CreatorProfitService {
LambdaQueryWrapper<InviteLog> wrapper = new LambdaQueryWrapper<InviteLog>(); LambdaQueryWrapper<InviteLog> wrapper = new LambdaQueryWrapper<InviteLog>();
wrapper.eq(InviteLog::getInvitedCreatorId, creatorProfit.getCreatorId()); wrapper.eq(InviteLog::getInvitedCreatorId, creatorProfit.getCreatorId());
List<InviteLog> inviteLogs = inviteLogMapper.selectList(wrapper); List<InviteLog> inviteLogs = inviteLogMapper.selectList(wrapper);
if(inviteLogs.size() > 0){ if (inviteLogs.size() > 0) {
List<String> updateList = new ArrayList<>(); List<String> updateList = new ArrayList<>();
List<CreatorProfit> insertList = new ArrayList<>(); List<CreatorProfit> insertList = new ArrayList<>();
for (InviteLog inviteLog : inviteLogs) { for (InviteLog inviteLog : inviteLogs) {
String mark = inviteLog.getCreatorId()+creatorProfit.getImgId()+creatorProfit.getAppType()+creatorProfit.getPlatform()+ String mark = inviteLog.getCreatorId().toString() + creatorProfit.getImgId().toString() + creatorProfit.getAppType() + creatorProfit.getPlatform() +
"1"+date.replace("-",""); "1" + date.replace("-", "");
//检查收益表是否存在邀请记录,存在则记录更新邀请者Id //检查收益表是否存在邀请记录,存在则记录更新邀请者Id
boolean b = this.checkCreatorProfitExist(mark); boolean b = this.checkCreatorProfitExist(mark);
if(b){ if (b) {
updateList.add(mark); updateList.add(mark);
}else{ } else {
//不存在则新增邀请者id //不存在则新增邀请者id
creatorProfit.setCreatorId(inviteLog.getCreatorId()); creatorProfit.setCreatorId(inviteLog.getCreatorId());
creatorProfit.setCreateTime(new Date()); creatorProfit.setCreateTime(new Date());
@ -128,29 +132,29 @@ public class CreatorProfitServiceImpl implements CreatorProfitService {
creatorProfit.setDownloadNum(1); creatorProfit.setDownloadNum(1);
creatorProfit.setMark(mark); creatorProfit.setMark(mark);
//根据平台生成订单号 //根据平台生成订单号
switch (creatorProfit.getPlatform()){ switch (creatorProfit.getPlatform()) {
case "0" : case "0":
creatorProfit.setOrderNo("DY"+IdUtil.getSnowflakeNextIdStr()); creatorProfit.setOrderNo("DY" + IdUtil.getSnowflakeNextIdStr());
break; break;
case "1" : case "1":
creatorProfit.setOrderNo("KS"+IdUtil.getSnowflakeNextIdStr()); creatorProfit.setOrderNo("KS" + IdUtil.getSnowflakeNextIdStr());
break; break;
case "2" : case "2":
creatorProfit.setOrderNo("WX"+IdUtil.getSnowflakeNextIdStr()); creatorProfit.setOrderNo("WX" + IdUtil.getSnowflakeNextIdStr());
break; break;
default: default:
creatorProfit.setOrderNo("UNI"+IdUtil.getSnowflakeNextIdStr()); creatorProfit.setOrderNo("UNI" + IdUtil.getSnowflakeNextIdStr());
break; break;
} }
insertList.add(creatorProfit); insertList.add(creatorProfit);
} }
} }
if(updateList.size() > 0){ if (updateList.size() > 0) {
//批量更新邀请记录 //批量更新邀请记录
//TODO 修改此处BUG //TODO 修改此处BUG
creatorProfitMapper.batchUpdateDownload(updateList); creatorProfitMapper.batchUpdateDownload(updateList);
} }
if(insertList.size() > 0){ if (insertList.size() > 0) {
//批量新增邀请记录 //批量新增邀请记录
creatorProfitMapper.batchInsertInviteProfit(insertList); creatorProfitMapper.batchInsertInviteProfit(insertList);
} }
@ -187,7 +191,6 @@ public class CreatorProfitServiceImpl implements CreatorProfitService {
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public int changeIsShow(Long id, String status) { public int changeIsShow(Long id, String status) {
@ -195,7 +198,7 @@ public class CreatorProfitServiceImpl implements CreatorProfitService {
wrapper.eq(CreatorProfit::getId, id); wrapper.eq(CreatorProfit::getId, id);
CreatorProfit creatorProfit = new CreatorProfit(); CreatorProfit creatorProfit = new CreatorProfit();
creatorProfit.setIsShow(status); creatorProfit.setIsShow(status);
return creatorProfitMapper.update(creatorProfit,wrapper); return creatorProfitMapper.update(creatorProfit, wrapper);
} }
@Override @Override
@ -225,7 +228,7 @@ public class CreatorProfitServiceImpl implements CreatorProfitService {
} }
//批量更新收益表确认收益状态 //批量更新收益表确认收益状态
creatorProfitMapper.batchUpdate(idList); creatorProfitMapper.batchUpdate(idList);
log.info("==============批量更新艺术家收益状态完成,耗时【{}】毫秒!===============",System.currentTimeMillis() - startTime); log.info("==============批量更新艺术家收益状态完成,耗时【{}】毫秒!===============", System.currentTimeMillis() - startTime);
} }
@Override @Override
@ -262,8 +265,8 @@ public class CreatorProfitServiceImpl implements CreatorProfitService {
} }
@Override @Override
public List<CreatorProfitPreVo> queryFrontPreProfit(Long creatorId,String type) { public List<CreatorProfitPreVo> queryFrontPreProfit(Long creatorId, String type) {
return creatorProfitMapper.queryFrontPreProfit(creatorId,type); return creatorProfitMapper.queryFrontPreProfit(creatorId, type);
} }
@Override @Override
@ -278,7 +281,7 @@ public class CreatorProfitServiceImpl implements CreatorProfitService {
@Override @Override
public List<CreatorProfitInAmtVo> queryFrontInProfitAmt(Long creatorId, String type) { public List<CreatorProfitInAmtVo> queryFrontInProfitAmt(Long creatorId, String type) {
return creatorProfitMapper.queryFrontInProfitAmt(creatorId,type); return creatorProfitMapper.queryFrontInProfitAmt(creatorId, type);
} }
@Override @Override
@ -288,7 +291,7 @@ public class CreatorProfitServiceImpl implements CreatorProfitService {
@Override @Override
public List<CreatorProfitEndAmtVo> queryFrontEndProfitAmt(Long creatorId, String type) { public List<CreatorProfitEndAmtVo> queryFrontEndProfitAmt(Long creatorId, String type) {
return creatorProfitMapper.queryFrontEndProfitAmt(creatorId,type); return creatorProfitMapper.queryFrontEndProfitAmt(creatorId, type);
} }
@Override @Override
@ -304,10 +307,10 @@ public class CreatorProfitServiceImpl implements CreatorProfitService {
@Override @Override
public List<CreatorProfit> queryProfitByCreatorId(Long creatorId) { public List<CreatorProfit> queryProfitByCreatorId(Long creatorId) {
LambdaQueryWrapper<CreatorProfit> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<CreatorProfit> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(CreatorProfit::getCreatorId,creatorId); wrapper.eq(CreatorProfit::getCreatorId, creatorId);
wrapper.eq(CreatorProfit::getStatus, "1"); wrapper.eq(CreatorProfit::getStatus, "1");
wrapper.eq(CreatorProfit::getConfirmStatus, "1"); wrapper.eq(CreatorProfit::getConfirmStatus, "1");
wrapper.notIn(CreatorProfit::getType,"2"); wrapper.notIn(CreatorProfit::getType, "2");
return creatorProfitMapper.selectList(wrapper); return creatorProfitMapper.selectList(wrapper);
} }

71
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/ProfitVerifyOrderServiceImpl.java

@ -1,5 +1,6 @@
package com.bnyer.img.service.impl; package com.bnyer.img.service.impl;
import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bnyer.common.core.exception.ServiceException; import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.StringUtils; import com.bnyer.common.core.utils.StringUtils;
@ -110,7 +111,7 @@ public class ProfitVerifyOrderServiceImpl implements ProfitVerifyOrderService {
//获取分布式锁 //获取分布式锁
RLock lock = redissonService.getRLock(RedisKeyConstant.VERIFY_PROFIT_LOCK_KEY + params.getId()); RLock lock = redissonService.getRLock(RedisKeyConstant.VERIFY_PROFIT_LOCK_KEY + params.getId());
try{ try{
if(lock.tryLock(0L, 30L, TimeUnit.SECONDS)){ if(lock.tryLock(2L, 10L, TimeUnit.SECONDS)){
log.info("锁获取成功,开始执行审核收益操作"); log.info("锁获取成功,开始执行审核收益操作");
//审核通过计算收益 //审核通过计算收益
//昨日总收益的80%作为广告收益 //昨日总收益的80%作为广告收益
@ -171,6 +172,7 @@ public class ProfitVerifyOrderServiceImpl implements ProfitVerifyOrderService {
} }
}catch (Exception e){ }catch (Exception e){
log.error("审核收益单失败!错误原因为【{}】",e.getMessage()); log.error("审核收益单失败!错误原因为【{}】",e.getMessage());
throw new ServiceException("系统繁忙,请勿重复操作!");
}finally { }finally {
//释放锁 //释放锁
if(lock.isHeldByCurrentThread()){ if(lock.isHeldByCurrentThread()){
@ -196,35 +198,52 @@ public class ProfitVerifyOrderServiceImpl implements ProfitVerifyOrderService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public int transInfoWallet() { public int transInfoWallet() {
//查询所有审核通过的艺术家 //获取分布式锁
List<Creator> creators = creatorService.queryPassList(); RLock lock = redissonService.getRLock(RedisKeyConstant.VERIFY_PROFIT_LOCK_KEY + RandomUtil.randomString(8));
//查询审所有核状态为已到账,且已确认且类型不为会员的收益 try{
List<ConfirmProfitVo> confirmProfits = creatorProfitService.queryConfirmList(); if(lock.tryLock(2L, 10L, TimeUnit.SECONDS)){
List<Creator> list = new ArrayList<>(); log.info("锁获取成功,开始执行转入钱包操作");
List<Long> creatorIdList = new ArrayList<>(); //查询所有审核通过的艺术家
if(confirmProfits.size() > 0 && creators.size() > 0){ List<Creator> creators = creatorService.queryPassList();
for (ConfirmProfitVo confirmProfit : confirmProfits) { //查询审所有核状态为已到账,且已确认且类型不为会员的收益
for (Creator creator : creators) { List<ConfirmProfitVo> confirmProfits = creatorProfitService.queryConfirmList();
if(confirmProfit.getCreatorId().equals(creator.getId())){ List<Creator> list = new ArrayList<>();
creator.setAmt(creator.getAmt().add(confirmProfit.getAmt())); List<Long> creatorIdList = new ArrayList<>();
list.add(creator); if(confirmProfits.size() > 0 && creators.size() > 0){
creatorIdList.add(confirmProfit.getCreatorId()); for (ConfirmProfitVo confirmProfit : confirmProfits) {
for (Creator creator : creators) {
if(confirmProfit.getCreatorId().equals(creator.getId())){
creator.setAmt(creator.getAmt().add(confirmProfit.getAmt()));
list.add(creator);
creatorIdList.add(confirmProfit.getCreatorId());
}
}
}
//更新艺术家钱包
creatorService.batchUpdate(list);
//批量更新收益单状态
List<Long> profitIdList = new ArrayList<>();
for (Long aLong : creatorIdList) {
List<CreatorProfit> creatorProfits = creatorProfitService.queryProfitByCreatorId(aLong);
for (CreatorProfit creatorProfit : creatorProfits) {
profitIdList.add(creatorProfit.getId());
}
} }
return creatorProfitService.batchUpdate(profitIdList);
}else{
return 0;
} }
}else{
throw new ServiceException("系统繁忙,请稍候重试!");
} }
//更新艺术家钱包 }catch (Exception e){
creatorService.batchUpdate(list); log.error("转入钱包失败!错误原因为【{}】",e.getMessage());
//批量更新收益单状态 throw new ServiceException("系统繁忙,请勿重复操作!");
List<Long> profitIdList = new ArrayList<>(); }finally {
for (Long aLong : creatorIdList) { if(lock.isHeldByCurrentThread()){
List<CreatorProfit> creatorProfits = creatorProfitService.queryProfitByCreatorId(aLong); lock.unlock();
for (CreatorProfit creatorProfit : creatorProfits) { log.info("转入钱包操作执行完毕,释放锁成功!");
profitIdList.add(creatorProfit.getId());
}
} }
return creatorProfitService.batchUpdate(profitIdList);
}else{
return 0;
} }
} }
} }

2
bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/CreatorProfitMapper.xml

@ -136,7 +136,7 @@
<set> <set>
download_num = download_num + 1, update_time = (select NOW()) download_num = download_num + 1, update_time = (select NOW())
</set> </set>
where mark = #{item.mark} and status = '0' where mark = #{item} and status = '0'
</foreach> </foreach>
</update> </update>

Loading…
Cancel
Save