|
|
@@ -278,18 +278,7 @@ public class FsCourseCheckinReceiveServiceImpl implements IFsCourseCheckinReceiv
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- // 4. 检查是否已创建领取记录
|
|
|
- FsCourseCheckinReceive query = new FsCourseCheckinReceive();
|
|
|
- query.setActivityId(activity.getActivityId());
|
|
|
- query.setUserId(fsCourseSendRewardUParam.getUserId());
|
|
|
- List<FsCourseCheckinReceive> existList = fsCourseCheckinReceiveMapper.selectFsCourseCheckinReceiveList(query);
|
|
|
- if (!existList.isEmpty()) {
|
|
|
- result.put("success", false);
|
|
|
- result.put("msg", "已创建领取记录");
|
|
|
- return result; // 已创建领取记录
|
|
|
- }
|
|
|
-
|
|
|
- // 5. 查询奖品(一个活动只配一个奖品)
|
|
|
+ // 4. 查询奖品(一个活动只配一个奖品)
|
|
|
List<FsCourseCheckinPrize> prizeList = fsCourseCheckinPrizeMapper.selectFsCourseCheckinPrizeByActivityId(activity.getActivityId());
|
|
|
if (prizeList.isEmpty()) {
|
|
|
result.put("success", false);
|
|
|
@@ -297,35 +286,76 @@ public class FsCourseCheckinReceiveServiceImpl implements IFsCourseCheckinReceiv
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- // 6. 创建单个领取记录
|
|
|
- Date now = new Date();
|
|
|
+ FsCourseCheckinReceive receive;
|
|
|
FsCourseCheckinPrize prize = prizeList.get(0); // 只取第一个奖品
|
|
|
- FsCourseCheckinReceive receive = new FsCourseCheckinReceive();
|
|
|
- receive.setActivityId(activity.getActivityId());
|
|
|
- receive.setPrizeId(prize.getPrizeId());
|
|
|
- receive.setUserId(fsCourseSendRewardUParam.getUserId());
|
|
|
- receive.setCompanyId(checkinUser.getCompanyId());
|
|
|
- receive.setProjectId(checkinUser.getProjectId());
|
|
|
- receive.setPrizeType(prize.getPrizeType());
|
|
|
- receive.setPrizeName(prize.getPrizeName());
|
|
|
- receive.setRedpacketAmount(prize.getRedpacketAmount());
|
|
|
- receive.setGoodsId(prize.getGoodsId());
|
|
|
- receive.setGrandGiftId(prize.getGrandGiftId());
|
|
|
- receive.setReceiveStatus(0); // 待发放
|
|
|
- receive.setCreateTime(now);
|
|
|
- //创建批次号
|
|
|
- String code = OrderCodeUtils.getOrderSn();
|
|
|
- if (StringUtils.isEmpty(code)) {
|
|
|
- return R.error("红包单号生成失败,请重试");
|
|
|
- }
|
|
|
- receive.setOutBatchNo("fsCourse"+cloudHostProper.getProjectCode() + code);
|
|
|
-
|
|
|
- fsCourseCheckinReceiveMapper.insertFsCourseCheckinReceive(receive);
|
|
|
-
|
|
|
- // 7. 发放奖励
|
|
|
- result = sendPrize(receive.getReceiveId(), fsCourseSendRewardUParam, prize.getFreeCouponId());
|
|
|
|
|
|
- return result;
|
|
|
+ String lockKey = String.format(CHECKIN_PRIZE_LOCK, fsCourseSendRewardUParam.getUserId());
|
|
|
+ RLock lock = redissonClient.getLock(lockKey);
|
|
|
+
|
|
|
+ try {
|
|
|
+ boolean locked = lock.tryLock(5, 300, TimeUnit.SECONDS);
|
|
|
+ if (!locked) {
|
|
|
+ logger.error("获取锁失败 - 用户ID: {}", fsCourseSendRewardUParam.getUserId());
|
|
|
+ result.put("success", false);
|
|
|
+ result.put("msg", "系统繁忙,请稍后重试");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 5. 检查是否已创建领取记录
|
|
|
+ FsCourseCheckinReceive query = new FsCourseCheckinReceive();
|
|
|
+ query.setActivityId(activity.getActivityId());
|
|
|
+ query.setUserId(fsCourseSendRewardUParam.getUserId());
|
|
|
+ List<FsCourseCheckinReceive> existList = fsCourseCheckinReceiveMapper.selectFsCourseCheckinReceiveList(query);
|
|
|
+ if (!existList.isEmpty()) {
|
|
|
+ receive = existList.get(0);
|
|
|
+ if (receive.getReceiveStatus() == 1 || receive.getReceiveStatus() == 2) {
|
|
|
+ result.put("success", false);
|
|
|
+ result.put("msg", "已创建领取记录");
|
|
|
+ return result; // 已创建领取记录
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 6. 创建单个领取记录
|
|
|
+ receive = new FsCourseCheckinReceive();
|
|
|
+ receive.setActivityId(activity.getActivityId());
|
|
|
+ receive.setPrizeId(prize.getPrizeId());
|
|
|
+ receive.setUserId(fsCourseSendRewardUParam.getUserId());
|
|
|
+ receive.setCompanyId(checkinUser.getCompanyId());
|
|
|
+ receive.setProjectId(checkinUser.getProjectId());
|
|
|
+ receive.setPrizeType(prize.getPrizeType());
|
|
|
+ receive.setPrizeName(prize.getPrizeName());
|
|
|
+ receive.setRedpacketAmount(prize.getRedpacketAmount());
|
|
|
+ receive.setGoodsId(prize.getGoodsId());
|
|
|
+ receive.setGrandGiftId(prize.getGrandGiftId());
|
|
|
+ receive.setReceiveStatus(0); // 待发放
|
|
|
+ receive.setCreateTime(new Date());
|
|
|
+ //创建批次号
|
|
|
+ String code = OrderCodeUtils.getOrderSn();
|
|
|
+ if (StringUtils.isEmpty(code)) {
|
|
|
+ result.put("success", false);
|
|
|
+ result.put("msg", "红包单号生成失败,请重试");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ receive.setOutBatchNo("fsCourse"+cloudHostProper.getProjectCode() + code);
|
|
|
+
|
|
|
+ fsCourseCheckinReceiveMapper.insertFsCourseCheckinReceive(receive);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 7. 发放奖励
|
|
|
+ result = sendPrize(receive.getReceiveId(), fsCourseSendRewardUParam, prize.getFreeCouponId());
|
|
|
+
|
|
|
+ return result;
|
|
|
+
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ logger.error("获取锁被中断 - 用户ID: {}", fsCourseSendRewardUParam.getUserId(), e);
|
|
|
+ Thread.currentThread().interrupt();
|
|
|
+ result.put("success", false);
|
|
|
+ result.put("msg", "系统异常,请稍后重试");
|
|
|
+ return result;
|
|
|
+ } finally {
|
|
|
+ if (lock.isHeldByCurrentThread()) {
|
|
|
+ lock.unlock();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -357,99 +387,72 @@ public class FsCourseCheckinReceiveServiceImpl implements IFsCourseCheckinReceiv
|
|
|
}
|
|
|
FsUser user = fsUserMapper.selectFsUserById(receive.getUserId());
|
|
|
|
|
|
- String lockKey = String.format(CHECKIN_PRIZE_LOCK, receiveId);
|
|
|
- RLock lock = redissonClient.getLock(lockKey);
|
|
|
+ Date now = new Date();
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
+ boolean success = false;
|
|
|
+ if (receive.getPrizeType() == 1) {
|
|
|
+ // 红包类型 - 调用红包发放接口
|
|
|
+ success = sendRedpacket(receive, param, user);
|
|
|
+ } else if (receive.getPrizeType() == 2) {
|
|
|
+ // 发放积分商品优惠券
|
|
|
+ FsCoupon coupon = fsCouponMapper.selectFsCouponByCouponId(freeCouponId);
|
|
|
+ if (coupon != null && coupon.getStatus() != 0) {
|
|
|
+ int receiveCount = fsUserCouponMapper.checkReceive(param.getUserId(), coupon.getCouponId());
|
|
|
+ if (receiveCount < coupon.getLimitCount()) {
|
|
|
+ FsUserCoupon fsUserCoupon = new FsUserCoupon();
|
|
|
+ fsUserCoupon.setCouponId(coupon.getCouponId());
|
|
|
+ fsUserCoupon.setCouponCode("C"+System.currentTimeMillis());
|
|
|
+ fsUserCoupon.setUserId(param.getUserId());
|
|
|
+ fsUserCoupon.setCreateTime(DateUtils.getNowDate());
|
|
|
+ if (coupon.getLimitType() == 2){
|
|
|
+ long limitDay = coupon.getLimitDay().longValue() * 24 * 60 * 60 * 1000;
|
|
|
+ long time = new Date().getTime();
|
|
|
+ fsUserCoupon.setLimitTime(new Date(limitDay+time));
|
|
|
+ }else {
|
|
|
+ fsUserCoupon.setLimitTime(coupon.getLimitTime());
|
|
|
+ }
|
|
|
+ fsUserCoupon.setStatus(0);
|
|
|
+ fsUserCouponMapper.insertFsUserCoupon(fsUserCoupon);
|
|
|
|
|
|
- try {
|
|
|
- boolean locked = lock.tryLock(5, 300, TimeUnit.SECONDS);
|
|
|
- if (!locked) {
|
|
|
- logger.error("获取锁失败 - 领取记录ID: {}", receiveId);
|
|
|
- Map<String, Object> result = new HashMap<>();
|
|
|
- result.put("success", false);
|
|
|
- result.put("msg", "系统繁忙,请稍后重试");
|
|
|
- return result;
|
|
|
- }
|
|
|
+ //更新剩余数量
|
|
|
+ fsCouponMapper.updateRemainCount(coupon.getCouponId());
|
|
|
|
|
|
- Date now = new Date();
|
|
|
- Map<String, Object> result = new HashMap<>();
|
|
|
- boolean success = false;
|
|
|
- if (receive.getPrizeType() == 1) {
|
|
|
- // 红包类型 - 调用红包发放接口
|
|
|
- success = sendRedpacket(receive, param, user);
|
|
|
- } else if (receive.getPrizeType() == 2) {
|
|
|
- // 发放积分商品优惠券
|
|
|
- FsCoupon coupon = fsCouponMapper.selectFsCouponByCouponId(freeCouponId);
|
|
|
- if (coupon != null && coupon.getStatus() != 0) {
|
|
|
- int receiveCount = fsUserCouponMapper.checkReceive(param.getUserId(), coupon.getCouponId());
|
|
|
- if (receiveCount < coupon.getLimitCount()) {
|
|
|
- FsUserCoupon fsUserCoupon = new FsUserCoupon();
|
|
|
- fsUserCoupon.setCouponId(coupon.getCouponId());
|
|
|
- fsUserCoupon.setCouponCode("C"+System.currentTimeMillis());
|
|
|
- fsUserCoupon.setUserId(param.getUserId());
|
|
|
- fsUserCoupon.setCreateTime(DateUtils.getNowDate());
|
|
|
- if (coupon.getLimitType() == 2){
|
|
|
- long limitDay = coupon.getLimitDay().longValue() * 24 * 60 * 60 * 1000;
|
|
|
- long time = new Date().getTime();
|
|
|
- fsUserCoupon.setLimitTime(new Date(limitDay+time));
|
|
|
- }else {
|
|
|
- fsUserCoupon.setLimitTime(coupon.getLimitTime());
|
|
|
- }
|
|
|
- fsUserCoupon.setStatus(0);
|
|
|
- fsUserCouponMapper.insertFsUserCoupon(fsUserCoupon);
|
|
|
-
|
|
|
- //更新剩余数量
|
|
|
- fsCouponMapper.updateRemainCount(coupon.getCouponId());
|
|
|
-
|
|
|
- success = true;
|
|
|
- result.put("prizeType", 2);
|
|
|
- result.put("freeCouponId", fsUserCoupon.getId());
|
|
|
- result.put("goodsId", coupon.getFreeGoodsId());
|
|
|
-
|
|
|
- // 更新领取记录中的优惠券ID
|
|
|
- receive.setFreeCouponId(fsUserCoupon.getId());
|
|
|
- receive.setGoodsId(coupon.getFreeGoodsId());
|
|
|
- }
|
|
|
+ success = true;
|
|
|
+ result.put("prizeType", 2);
|
|
|
+ result.put("freeCouponId", fsUserCoupon.getId());
|
|
|
+ result.put("goodsId", coupon.getFreeGoodsId());
|
|
|
+
|
|
|
+ // 更新领取记录中的优惠券ID
|
|
|
+ receive.setFreeCouponId(fsUserCoupon.getId());
|
|
|
+ receive.setGoodsId(coupon.getFreeGoodsId());
|
|
|
}
|
|
|
- } else if (receive.getPrizeType() == 3) {
|
|
|
- success = true;
|
|
|
- result.put("prizeType", 3);
|
|
|
- result.put("grandGiftId", receive.getGrandGiftId());
|
|
|
- result.put("receiveId", receiveId);
|
|
|
}
|
|
|
+ } else if (receive.getPrizeType() == 3) {
|
|
|
+ success = true;
|
|
|
+ result.put("prizeType", 3);
|
|
|
+ result.put("grandGiftId", receive.getGrandGiftId());
|
|
|
+ result.put("receiveId", receiveId);
|
|
|
+ }
|
|
|
|
|
|
- if (success) {
|
|
|
- //红包类型, 积分商品免单券
|
|
|
- if (receive.getPrizeType() == 1 || receive.getPrizeType() == 2) {
|
|
|
- receive.setReceiveStatus(1); // 发放成功
|
|
|
- receive.setReceiveTime(now);
|
|
|
- }else {
|
|
|
- receive.setReceiveStatus(0); // 待发放
|
|
|
- }
|
|
|
- result.put("success", true);
|
|
|
- result.put("msg", "发放成功");
|
|
|
- } else {
|
|
|
- receive.setReceiveStatus(2); // 发放失败
|
|
|
+ if (success) {
|
|
|
+ //红包类型, 积分商品免单券
|
|
|
+ if (receive.getPrizeType() == 1 || receive.getPrizeType() == 2) {
|
|
|
+ receive.setReceiveStatus(1); // 发放成功
|
|
|
receive.setReceiveTime(now);
|
|
|
- result.put("success", false);
|
|
|
- result.put("msg", "发放失败");
|
|
|
}
|
|
|
-
|
|
|
- receive.setUpdateTime(now);
|
|
|
- fsCourseCheckinReceiveMapper.updateFsCourseCheckinReceive(receive);
|
|
|
-
|
|
|
- return result;
|
|
|
- } catch (InterruptedException e) {
|
|
|
- logger.error("获取锁被中断 - 领取记录ID: {}", receiveId, e);
|
|
|
- Thread.currentThread().interrupt();
|
|
|
- Map<String, Object> result = new HashMap<>();
|
|
|
+ result.put("success", true);
|
|
|
+ result.put("msg", "发放成功");
|
|
|
+ } else {
|
|
|
+ receive.setReceiveStatus(2); // 发放失败
|
|
|
+ receive.setReceiveTime(now);
|
|
|
result.put("success", false);
|
|
|
- result.put("msg", "系统异常,请稍后重试");
|
|
|
- return result;
|
|
|
- } finally {
|
|
|
- if (lock.isHeldByCurrentThread()) {
|
|
|
- lock.unlock();
|
|
|
- }
|
|
|
+ result.put("msg", "发放失败");
|
|
|
}
|
|
|
+
|
|
|
+ receive.setUpdateTime(now);
|
|
|
+ fsCourseCheckinReceiveMapper.updateFsCourseCheckinReceive(receive);
|
|
|
+
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -679,6 +682,7 @@ public class FsCourseCheckinReceiveServiceImpl implements IFsCourseCheckinReceiv
|
|
|
public List<FsCourseCheckinReceive> selectReceiveListByUserId(Long userId) {
|
|
|
FsCourseCheckinReceive query = new FsCourseCheckinReceive();
|
|
|
query.setUserId(userId);
|
|
|
+ query.setReceiveStatus(1);
|
|
|
List<FsCourseCheckinReceive> list = fsCourseCheckinReceiveMapper.selectFsCourseCheckinReceiveList(query);
|
|
|
if (list == null || list.isEmpty()) {
|
|
|
return new ArrayList<>();
|