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

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

@ -1,5 +1,6 @@
package com.bnyer.img.service.impl;
import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bnyer.common.core.exception.ServiceException;
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());
try{
if(lock.tryLock(0L, 30L, TimeUnit.SECONDS)){
if(lock.tryLock(2L, 10L, TimeUnit.SECONDS)){
log.info("锁获取成功,开始执行审核收益操作");
//审核通过计算收益
//昨日总收益的80%作为广告收益
@ -171,6 +172,7 @@ public class ProfitVerifyOrderServiceImpl implements ProfitVerifyOrderService {
}
}catch (Exception e){
log.error("审核收益单失败!错误原因为【{}】",e.getMessage());
throw new ServiceException("系统繁忙,请勿重复操作!");
}finally {
//释放锁
if(lock.isHeldByCurrentThread()){
@ -196,6 +198,11 @@ public class ProfitVerifyOrderServiceImpl implements ProfitVerifyOrderService {
@Override
@Transactional(rollbackFor = Exception.class)
public int transInfoWallet() {
//获取分布式锁
RLock lock = redissonService.getRLock(RedisKeyConstant.VERIFY_PROFIT_LOCK_KEY + RandomUtil.randomString(8));
try{
if(lock.tryLock(2L, 10L, TimeUnit.SECONDS)){
log.info("锁获取成功,开始执行转入钱包操作");
//查询所有审核通过的艺术家
List<Creator> creators = creatorService.queryPassList();
//查询审所有核状态为已到账,且已确认且类型不为会员的收益
@ -226,5 +233,17 @@ public class ProfitVerifyOrderServiceImpl implements ProfitVerifyOrderService {
}else{
return 0;
}
}else{
throw new ServiceException("系统繁忙,请稍候重试!");
}
}catch (Exception e){
log.error("转入钱包失败!错误原因为【{}】",e.getMessage());
throw new ServiceException("系统繁忙,请勿重复操作!");
}finally {
if(lock.isHeldByCurrentThread()){
lock.unlock();
log.info("转入钱包操作执行完毕,释放锁成功!");
}
}
}
}

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

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

Loading…
Cancel
Save