|
|
@@ -9,16 +9,17 @@ import com.iformall.common.IdWorker; |
|
|
import com.iformall.common.Result; |
|
|
import com.iformall.common.Result; |
|
|
import com.iformall.common.ResultData; |
|
|
import com.iformall.common.ResultData; |
|
|
import com.iformall.domain.po.*; |
|
|
import com.iformall.domain.po.*; |
|
|
import com.iformall.domain.po.base.TenantEntity; |
|
|
|
|
|
import com.iformall.domain.po.msg.WxMsgRecord; |
|
|
import com.iformall.domain.po.msg.WxMsgRecord; |
|
|
import com.iformall.domain.vo.WxActivityJoinQuestionAnswer; |
|
|
import com.iformall.domain.vo.WxActivityJoinQuestionAnswer; |
|
|
import com.iformall.enums.*; |
|
|
import com.iformall.enums.*; |
|
|
|
|
|
import com.iformall.exception.MallinkException; |
|
|
import com.iformall.mapper.*; |
|
|
import com.iformall.mapper.*; |
|
|
import com.iformall.mq.MqBaseProducer; |
|
|
import com.iformall.mq.MqBaseProducer; |
|
|
import com.iformall.service.ExcelService; |
|
|
import com.iformall.service.ExcelService; |
|
|
import com.iformall.service.WxActivityJoinService; |
|
|
import com.iformall.service.WxActivityJoinService; |
|
|
import com.iformall.service.WxCreditHistoryService; |
|
|
import com.iformall.service.WxCreditHistoryService; |
|
|
import com.iformall.utils.DateUtils; |
|
|
import com.iformall.utils.DateUtils; |
|
|
|
|
|
import com.iformall.utils.RedisLock; |
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
import org.slf4j.Logger; |
|
|
import org.slf4j.Logger; |
|
|
import org.slf4j.LoggerFactory; |
|
|
import org.slf4j.LoggerFactory; |
|
|
@@ -39,8 +40,12 @@ import java.util.Map; |
|
|
*/ |
|
|
*/ |
|
|
@Service |
|
|
@Service |
|
|
public class WxActivityJoinServiceImpl implements WxActivityJoinService { |
|
|
public class WxActivityJoinServiceImpl implements WxActivityJoinService { |
|
|
|
|
|
|
|
|
private final Logger logger = LoggerFactory.getLogger(this.getClass()); |
|
|
private final Logger logger = LoggerFactory.getLogger(this.getClass()); |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
|
RedisLock redisLock; |
|
|
|
|
|
|
|
|
@Autowired |
|
|
@Autowired |
|
|
WxActivityJoinMapper wxActivityJoinMapper; |
|
|
WxActivityJoinMapper wxActivityJoinMapper; |
|
|
|
|
|
|
|
|
@@ -72,29 +77,26 @@ public class WxActivityJoinServiceImpl implements WxActivityJoinService { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
|
|
|
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = {Exception.class}) |
|
|
public ResultData modifyStatus(WxActivityJoin wxActivityJoin) { |
|
|
public ResultData modifyStatus(WxActivityJoin wxActivityJoin) { |
|
|
WxActivityJoin wxActivityJoin1 = wxActivityJoinMapper.selectById(wxActivityJoin.getId()); |
|
|
WxActivityJoin wxActivityJoin1 = wxActivityJoinMapper.selectById(wxActivityJoin.getId()); |
|
|
if(wxActivityJoin1 == null){ |
|
|
if(wxActivityJoin1 == null){ |
|
|
return new ResultData(ErrorCode.ACTIVITY_JOIN_NOT_FOND); |
|
|
return new ResultData(ErrorCode.ACTIVITY_JOIN_NOT_FOND); |
|
|
} |
|
|
} |
|
|
if (wxActivityJoin.getStatus().equals(EnumActivityJoinStatus.CONFIRMED.getCode())) { |
|
|
if (wxActivityJoin.getStatus().equals(EnumActivityJoinStatus.CONFIRMED.getCode())) { |
|
|
WxActivity wxActivity = wxActivityMapper.selectById(wxActivityJoin.getActivityId()); |
|
|
|
|
|
Integer personLimit = wxActivity.getPersonLimit(); |
|
|
|
|
|
WxActivityJoin params = new WxActivityJoin(); |
|
|
|
|
|
params.updateTenantInfo(wxActivity); |
|
|
|
|
|
params.setActivityId(wxActivity.getId()); |
|
|
|
|
|
params.setStatus(EnumActivityJoinStatus.CONFIRMED.getCode()); |
|
|
|
|
|
int count = wxActivityJoinMapper.selectCount(new QueryWrapper(params)); |
|
|
|
|
|
if (personLimit.equals(count)) { |
|
|
|
|
|
return new ResultData(ErrorCode.ACTIVITY_PERSON_LIMITED, count); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
activityJoinRedisLock(wxActivityJoin.getActivityId()); |
|
|
}else{ |
|
|
}else{ |
|
|
if(wxActivityJoin1.getSignIn().equals(EnumActivityJoinSignStatus.YES.getCode())){ |
|
|
if(wxActivityJoin1.getSignIn().equals(EnumActivityJoinSignStatus.YES.getCode())){ |
|
|
return new ResultData(ErrorCode.ACTIVITY_JOIN_IS_SIGNIN); |
|
|
return new ResultData(ErrorCode.ACTIVITY_JOIN_IS_SIGNIN); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
wxActivityJoinMapper.updateById(wxActivityJoin); |
|
|
wxActivityJoinMapper.updateById(wxActivityJoin); |
|
|
|
|
|
if(wxActivityJoin.getStatus().equals(EnumActivityJoinStatus.CONFIRMED.getCode())){ |
|
|
|
|
|
long stock = redisLock.decrease(EnumCacheKey.ACTIVITY_STOCK.getMessage()+wxActivityJoin.getActivityId(), 1); |
|
|
|
|
|
if (stock < 0 ) { |
|
|
|
|
|
throw new MallinkException(ErrorCode.ACTIVITY_PERSON_LIMITED.getCode(),"活动报名人数已满!"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
return new ResultData(Result.SUCCESS, "操作成功"); |
|
|
return new ResultData(Result.SUCCESS, "操作成功"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@@ -172,8 +174,8 @@ public class WxActivityJoinServiceImpl implements WxActivityJoinService { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = {Exception.class}) |
|
|
|
|
|
@Override |
|
|
@Override |
|
|
|
|
|
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = {Exception.class}) |
|
|
public ResultData join(WxActivityJoin wxActivityJoin) { |
|
|
public ResultData join(WxActivityJoin wxActivityJoin) { |
|
|
WxActivity wxActivity = wxActivityMapper.selectById(wxActivityJoin.getActivityId()); |
|
|
WxActivity wxActivity = wxActivityMapper.selectById(wxActivityJoin.getActivityId()); |
|
|
if(wxActivity == null){ |
|
|
if(wxActivity == null){ |
|
|
@@ -192,7 +194,6 @@ public class WxActivityJoinServiceImpl implements WxActivityJoinService { |
|
|
return new ResultData(ErrorCode.ACTIVITY_NOT_JOIN); |
|
|
return new ResultData(ErrorCode.ACTIVITY_NOT_JOIN); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
WxActivityJoin joinQuery = new WxActivityJoin(); |
|
|
WxActivityJoin joinQuery = new WxActivityJoin(); |
|
|
joinQuery.setUserId(wxActivityJoin.getUserId()); |
|
|
joinQuery.setUserId(wxActivityJoin.getUserId()); |
|
|
joinQuery.setActivityId(wxActivityJoin.getActivityId()); |
|
|
joinQuery.setActivityId(wxActivityJoin.getActivityId()); |
|
|
@@ -203,18 +204,24 @@ public class WxActivityJoinServiceImpl implements WxActivityJoinService { |
|
|
if(wxActivity.getSignupExamine().equals(EnumDelFlag.YES.getCode())){ |
|
|
if(wxActivity.getSignupExamine().equals(EnumDelFlag.YES.getCode())){ |
|
|
wxActivityJoin.setStatus(EnumActivityJoinStatus.NOT_CONFIRMED.getCode()); |
|
|
wxActivityJoin.setStatus(EnumActivityJoinStatus.NOT_CONFIRMED.getCode()); |
|
|
}else{ |
|
|
}else{ |
|
|
WxActivityJoin params = new WxActivityJoin(); |
|
|
|
|
|
params.updateTenantInfo(wxActivity); |
|
|
|
|
|
params.setActivityId(wxActivity.getId()); |
|
|
|
|
|
params.setStatus(EnumActivityJoinStatus.CONFIRMED.getCode()); |
|
|
|
|
|
int joinCount = wxActivityJoinMapper.selectCount(new QueryWrapper(params)); |
|
|
|
|
|
if (joinCount >= wxActivity.getPersonLimit().intValue()) { |
|
|
|
|
|
return new ResultData(ErrorCode.ACTIVITY_PERSON_LIMITED, joinCount); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
activityJoinRedisLock(wxActivityJoin.getActivityId()); |
|
|
wxActivityJoin.setStatus(EnumActivityJoinStatus.CONFIRMED.getCode()); |
|
|
wxActivityJoin.setStatus(EnumActivityJoinStatus.CONFIRMED.getCode()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
WxCUserBasicInfo user = wxCUserBasicInfoMapper.selectById(wxActivityJoin.getUserId(),wxActivityJoin.getFinalTenantId()); |
|
|
WxCUserBasicInfo user = wxCUserBasicInfoMapper.selectById(wxActivityJoin.getUserId(),wxActivityJoin.getFinalTenantId()); |
|
|
|
|
|
//保存到报名表中 |
|
|
|
|
|
final IdWorker idWorker = IdWorker.get(); |
|
|
|
|
|
wxActivityJoin.setId(idWorker.nextId()); |
|
|
|
|
|
wxActivityJoin.setPhone(user.getPhone()); |
|
|
|
|
|
wxActivityJoin.setCreateTime(date); |
|
|
|
|
|
wxActivityJoin.setUpdateTime(date); |
|
|
|
|
|
wxActivityJoinMapper.insert(wxActivityJoin); |
|
|
|
|
|
if(wxActivityJoin.getStatus().equals(EnumActivityJoinStatus.CONFIRMED.getCode())){ |
|
|
|
|
|
long stock = redisLock.decrease(EnumCacheKey.ACTIVITY_STOCK.getMessage()+wxActivityJoin.getActivityId(), 1); |
|
|
|
|
|
if (stock < 0 ) { |
|
|
|
|
|
throw new MallinkException(ErrorCode.ACTIVITY_PERSON_LIMITED.getCode(),"活动报名人数已满!"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
//查询是否消耗积分 |
|
|
//查询是否消耗积分 |
|
|
if (wxActivity.getUseCredit().equals(EnumActivityUseCreditStatus.YES.getCode())) { |
|
|
if (wxActivity.getUseCredit().equals(EnumActivityUseCreditStatus.YES.getCode())) { |
|
|
Integer credit = wxActivity.getCredit(); |
|
|
Integer credit = wxActivity.getCredit(); |
|
|
@@ -232,13 +239,6 @@ public class WxActivityJoinServiceImpl implements WxActivityJoinService { |
|
|
wxCreditHistoryService.saveOrUpdate(wxCreditHistory,wxActivity.getTenantId()); |
|
|
wxCreditHistoryService.saveOrUpdate(wxCreditHistory,wxActivity.getTenantId()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//保存到报名表中 |
|
|
|
|
|
final IdWorker idWorker = IdWorker.get(); |
|
|
|
|
|
wxActivityJoin.setId(idWorker.nextId()); |
|
|
|
|
|
wxActivityJoin.setPhone(user.getPhone()); |
|
|
|
|
|
wxActivityJoin.setCreateTime(date); |
|
|
|
|
|
wxActivityJoin.setUpdateTime(date); |
|
|
|
|
|
wxActivityJoinMapper.insert(wxActivityJoin); |
|
|
|
|
|
return new ResultData(); |
|
|
return new ResultData(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@@ -291,4 +291,47 @@ public class WxActivityJoinServiceImpl implements WxActivityJoinService { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void activityJoinRedisLock(Long activityId){ |
|
|
|
|
|
|
|
|
|
|
|
if(!redisLock.hasCouponStockCache(activityId)) { |
|
|
|
|
|
//此处需要加锁,防止并发设置 |
|
|
|
|
|
long time = System.currentTimeMillis() + RedisLock.TIMEOUT; |
|
|
|
|
|
String timeStr = String.valueOf(time); |
|
|
|
|
|
boolean stocksetlock = redisLock.lock("activityLockStockSet_" + activityId, timeStr); |
|
|
|
|
|
if (stocksetlock) { |
|
|
|
|
|
if (!redisLock.hasActivityStockCache(activityId)) { |
|
|
|
|
|
WxActivity wxActivity = wxActivityMapper.selectById(activityId); |
|
|
|
|
|
if (wxActivity != null && wxActivity.getPersonLimit() != null) { |
|
|
|
|
|
Integer personLimit = wxActivity.getPersonLimit(); |
|
|
|
|
|
WxActivityJoin params = new WxActivityJoin(); |
|
|
|
|
|
params.updateTenantInfo(wxActivity); |
|
|
|
|
|
params.setActivityId(wxActivity.getId()); |
|
|
|
|
|
params.setStatus(EnumActivityJoinStatus.CONFIRMED.getCode()); |
|
|
|
|
|
int count = wxActivityJoinMapper.selectCount(new QueryWrapper(params)); |
|
|
|
|
|
int i = personLimit.intValue() - count; |
|
|
|
|
|
try { |
|
|
|
|
|
redisLock.setActivityStock(activityId, i ); |
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
logger.error("set activitystock to redis fail.", e); |
|
|
|
|
|
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), "redis设置活动报名失败" + activityId); |
|
|
|
|
|
} finally { |
|
|
|
|
|
redisLock.unlock("activityLockStockSet_" + activityId, timeStr); |
|
|
|
|
|
} |
|
|
|
|
|
} else { |
|
|
|
|
|
redisLock.unlock("activityLockStockSet_" + activityId, timeStr); |
|
|
|
|
|
throw new MallinkException(ErrorCode.ACTIVITY_NOT_FOND.getCode(),"活动未找到或不需要报名!"+activityId); |
|
|
|
|
|
} |
|
|
|
|
|
}else{ |
|
|
|
|
|
redisLock.unlock("activityLockStockSet_" + activityId, timeStr); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
long redisStock = redisLock.getActivityStock(activityId); |
|
|
|
|
|
if (redisStock <= 0) { |
|
|
|
|
|
throw new MallinkException(ErrorCode.ACTIVITY_PERSON_LIMITED.getCode(),"报名人数已满!:"+activityId); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |