|
|
@@ -0,0 +1,500 @@
|
|
|
+package com.fs.course.service.impl;
|
|
|
+
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.fs.common.core.domain.R;
|
|
|
+import com.fs.common.utils.DateUtils;
|
|
|
+import com.fs.common.utils.StringUtils;
|
|
|
+import com.fs.company.domain.Company;
|
|
|
+import com.fs.company.mapper.CompanyMapper;
|
|
|
+import com.fs.config.cloud.CloudHostProper;
|
|
|
+import com.fs.core.utils.OrderCodeUtils;
|
|
|
+import com.fs.course.config.CourseConfig;
|
|
|
+import com.fs.course.domain.*;
|
|
|
+import com.fs.course.mapper.*;
|
|
|
+import com.fs.course.param.FsCourseSendRewardUParam;
|
|
|
+import com.fs.course.service.IFsCourseCheckinReceiveService;
|
|
|
+import com.fs.his.domain.FsUser;
|
|
|
+import com.fs.his.domain.FsUserWx;
|
|
|
+import com.fs.his.mapper.FsUserMapper;
|
|
|
+import com.fs.his.param.WxSendRedPacketParam;
|
|
|
+import com.fs.his.service.IFsStorePaymentService;
|
|
|
+import com.fs.his.service.IFsUserWxService;
|
|
|
+import com.fs.system.service.ISysConfigService;
|
|
|
+import com.github.binarywang.wxpay.bean.transfer.TransferBillsResult;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.hc.core5.http2.hpack.HPackException;
|
|
|
+import org.redisson.api.RLock;
|
|
|
+import org.redisson.api.RedissonClient;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.time.OffsetDateTime;
|
|
|
+import java.util.*;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 看课打卡奖品领取记录Service业务层处理
|
|
|
+ *
|
|
|
+ * @author fs
|
|
|
+ * @date 2025-03-11
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class FsCourseCheckinReceiveServiceImpl implements IFsCourseCheckinReceiveService {
|
|
|
+
|
|
|
+ private static final Logger logger = LoggerFactory.getLogger(FsCourseCheckinReceiveServiceImpl.class);
|
|
|
+
|
|
|
+ private static final String CHECKIN_PRIZE_LOCK = "course:checkin:prize:lock:%d";
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RedissonClient redissonClient;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private FsCourseCheckinReceiveMapper fsCourseCheckinReceiveMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private FsCourseCheckinUserMapper fsCourseCheckinUserMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private FsCourseCheckinActivityMapper fsCourseCheckinActivityMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private FsCourseCheckinPrizeMapper fsCourseCheckinPrizeMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ISysConfigService configService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private FsUserMapper fsUserMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private FsCourseWatchLogMapper courseWatchLogMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CompanyMapper companyMapper;
|
|
|
+
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IFsStorePaymentService paymentService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IFsUserWxService fsUserWxService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CloudHostProper cloudHostProper;
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询看课打卡奖品领取记录
|
|
|
+ *
|
|
|
+ * @param receiveId 看课打卡奖品领取记录主键
|
|
|
+ * @return 看课打卡奖品领取记录
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public FsCourseCheckinReceive selectFsCourseCheckinReceiveByReceiveId(Long receiveId) {
|
|
|
+ return fsCourseCheckinReceiveMapper.selectFsCourseCheckinReceiveByReceiveId(receiveId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询看课打卡奖品领取记录列表
|
|
|
+ *
|
|
|
+ * @param fsCourseCheckinReceive 看课打卡奖品领取记录
|
|
|
+ * @return 看课打卡奖品领取记录集合
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<FsCourseCheckinReceive> selectFsCourseCheckinReceiveList(FsCourseCheckinReceive fsCourseCheckinReceive) {
|
|
|
+ return fsCourseCheckinReceiveMapper.selectFsCourseCheckinReceiveList(fsCourseCheckinReceive);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询待发放的领取记录
|
|
|
+ *
|
|
|
+ * @param limit 限制数量
|
|
|
+ * @return 领取记录列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<FsCourseCheckinReceive> selectPendingReceiveList(Integer limit) {
|
|
|
+ return fsCourseCheckinReceiveMapper.selectPendingReceiveList(limit);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 新增看课打卡奖品领取记录
|
|
|
+ *
|
|
|
+ * @param fsCourseCheckinReceive 看课打卡奖品领取记录
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int insertFsCourseCheckinReceive(FsCourseCheckinReceive fsCourseCheckinReceive) {
|
|
|
+ fsCourseCheckinReceive.setCreateTime(DateUtils.getNowDate());
|
|
|
+ return fsCourseCheckinReceiveMapper.insertFsCourseCheckinReceive(fsCourseCheckinReceive);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量新增领取记录
|
|
|
+ *
|
|
|
+ * @param receiveList 领取记录列表
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int batchInsertFsCourseCheckinReceive(List<FsCourseCheckinReceive> receiveList) {
|
|
|
+ if (receiveList == null || receiveList.isEmpty()) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ return fsCourseCheckinReceiveMapper.batchInsertFsCourseCheckinReceive(receiveList);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改看课打卡奖品领取记录
|
|
|
+ *
|
|
|
+ * @param fsCourseCheckinReceive 看课打卡奖品领取记录
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int updateFsCourseCheckinReceive(FsCourseCheckinReceive fsCourseCheckinReceive) {
|
|
|
+ fsCourseCheckinReceive.setUpdateTime(DateUtils.getNowDate());
|
|
|
+ return fsCourseCheckinReceiveMapper.updateFsCourseCheckinReceive(fsCourseCheckinReceive);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量删除看课打卡奖品领取记录
|
|
|
+ *
|
|
|
+ * @param receiveIds 需要删除的看课打卡奖品领取记录主键集合
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int deleteFsCourseCheckinReceiveByReceiveIds(Long[] receiveIds) {
|
|
|
+ return fsCourseCheckinReceiveMapper.deleteFsCourseCheckinReceiveByReceiveIds(receiveIds);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除看课打卡奖品领取记录信息
|
|
|
+ *
|
|
|
+ * @param receiveId 看课打卡奖品领取记录主键
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int deleteFsCourseCheckinReceiveByReceiveId(Long receiveId) {
|
|
|
+ return fsCourseCheckinReceiveMapper.deleteFsCourseCheckinReceiveByReceiveId(receiveId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据活动ID删除领取记录
|
|
|
+ *
|
|
|
+ * @param activityId 活动ID
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int deleteFsCourseCheckinReceiveByActivityId(Long activityId) {
|
|
|
+ return fsCourseCheckinReceiveMapper.deleteFsCourseCheckinReceiveByActivityId(activityId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查并创建奖品领取记录
|
|
|
+ * 当用户打卡天数达到要求时,自动创建领取记录
|
|
|
+ *
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public Map<String, Object> checkAndCreateReceiveRecord(FsCourseSendRewardUParam fsCourseSendRewardUParam) {
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
+
|
|
|
+ // 1. 查询活动信息
|
|
|
+ FsCourseCheckinActivity activity = fsCourseCheckinActivityMapper.selectFsCourseCheckinActivityByActivityId(fsCourseSendRewardUParam.getActivityId());
|
|
|
+ if (activity == null) {
|
|
|
+ result.put("success", false);
|
|
|
+ result.put("msg", "活动不存在");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 查询用户打卡统计
|
|
|
+ FsCourseCheckinUser checkinUser = fsCourseCheckinUserMapper.selectByActivityAndUser(fsCourseSendRewardUParam.getActivityId(), fsCourseSendRewardUParam.getUserId());
|
|
|
+ if (checkinUser == null) {
|
|
|
+ result.put("success", false);
|
|
|
+ result.put("msg", "用户打卡记录不存在");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 检查是否达到打卡天数要求
|
|
|
+ if (checkinUser.getCheckinDays() < activity.getCheckinDays()) {
|
|
|
+ result.put("success", false);
|
|
|
+ result.put("msg", "打卡天数不足");
|
|
|
+ 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. 查询奖品(一个活动只配一个奖品)
|
|
|
+ List<FsCourseCheckinPrize> prizeList = fsCourseCheckinPrizeMapper.selectFsCourseCheckinPrizeByActivityId(activity.getActivityId());
|
|
|
+ if (prizeList.isEmpty()) {
|
|
|
+ result.put("success", false);
|
|
|
+ result.put("msg", "活动未配置奖品");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 6. 创建单个领取记录
|
|
|
+ Date now = new Date();
|
|
|
+ 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.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);
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 统计用户在某活动下的领取记录数量
|
|
|
+ * @param activityId 活动ID
|
|
|
+ * @param userId 用户ID
|
|
|
+ * @return 领取记录数量
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int countReceiveByActivityAndUser(Long activityId, Long userId) {
|
|
|
+ FsCourseCheckinReceive query = new FsCourseCheckinReceive();
|
|
|
+ query.setActivityId(activityId);
|
|
|
+ query.setUserId(userId);
|
|
|
+ List<FsCourseCheckinReceive> list = fsCourseCheckinReceiveMapper.selectFsCourseCheckinReceiveList(query);
|
|
|
+ return list != null ? list.size() : 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 发放奖品(红包或积分商品券)
|
|
|
+ *
|
|
|
+ * @param receiveId 领取记录ID
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Transactional
|
|
|
+ public Map<String, Object> sendPrize(Long receiveId, FsCourseSendRewardUParam param) {
|
|
|
+ FsCourseCheckinReceive receive = fsCourseCheckinReceiveMapper.selectFsCourseCheckinReceiveByReceiveId(receiveId);
|
|
|
+ if (receive == null || receive.getReceiveStatus() != 0) {
|
|
|
+ return new HashMap<>();
|
|
|
+ }
|
|
|
+ FsUser user = fsUserMapper.selectFsUserById(receive.getUserId());
|
|
|
+
|
|
|
+ String lockKey = String.format(CHECKIN_PRIZE_LOCK, receiveId);
|
|
|
+ RLock lock = redissonClient.getLock(lockKey);
|
|
|
+
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+
|
|
|
+ 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) {
|
|
|
+ // 积分商品类型 - 直接返回标识,不实际发放
|
|
|
+ success = true; // 积分商品券标记为成功,由前端处理
|
|
|
+ result.put("prizeType", 2);
|
|
|
+ result.put("goodsId", receive.getGoodsId());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (success) {
|
|
|
+ receive.setReceiveStatus(1); // 发放成功
|
|
|
+ receive.setReceiveTime(now);
|
|
|
+ result.put("success", true);
|
|
|
+ result.put("msg", "发放成功");
|
|
|
+ } else {
|
|
|
+ receive.setReceiveStatus(2); // 发放失败
|
|
|
+ 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", false);
|
|
|
+ result.put("msg", "系统异常,请稍后重试");
|
|
|
+ return result;
|
|
|
+ } finally {
|
|
|
+ if (lock.isHeldByCurrentThread()) {
|
|
|
+ lock.unlock();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 发放红包
|
|
|
+ * 根据 sendRedPacketRewardFsUser 方法
|
|
|
+ */
|
|
|
+ private boolean sendRedpacket(FsCourseCheckinReceive receive, FsCourseSendRewardUParam param, FsUser user) {
|
|
|
+ try {
|
|
|
+ // 获取配置信息
|
|
|
+ String json = configService.selectConfigByKey("course.config");
|
|
|
+ CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
|
|
|
+
|
|
|
+
|
|
|
+ // 3. 确定红包金额(从奖品配置中获取,sendRedPacketRewardFsUser方法)
|
|
|
+ BigDecimal amount = receive.getRedpacketAmount() != null ? receive.getRedpacketAmount() : BigDecimal.ZERO;
|
|
|
+ if (amount.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
+ logger.error("红包金额无效 - 用户ID: {}, 金额: {}", user.getUserId(), amount);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 准备发送红包参数(从sendRedPacketRewardFsUser方法)
|
|
|
+ WxSendRedPacketParam packetParam = new WxSendRedPacketParam();
|
|
|
+ packetParam.setOpenId(user.getMpOpenId());
|
|
|
+
|
|
|
+ // 来源是小程序切换openId(从sendRedPacketRewardFsUser方法)
|
|
|
+ if (param.getSource() == 2) {
|
|
|
+ if (user.getMpOpenId() != null) {
|
|
|
+ packetParam.setOpenId(user.getMpOpenId());
|
|
|
+ } else {
|
|
|
+ //查询是否绑定小程序
|
|
|
+ FsUserWx fsUserWx = fsUserWxService.selectByAppIdAndUserId(param.getAppId(), user.getUserId(), 1);
|
|
|
+ if (fsUserWx == null) {
|
|
|
+ logger.error("openId参数错误,请清理缓存重新授权");
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ packetParam.setOpenId(fsUserWx.getOpenId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //判断服务号配置是否存在
|
|
|
+ if (StringUtils.isNotEmpty(config.getMpAppId())) {
|
|
|
+ packetParam.setMpAppId(config.getMpAppId());
|
|
|
+ }
|
|
|
+ // 5. 设置基本参数(从sendRedPacketRewardFsUser方法)
|
|
|
+ packetParam.setAmount(amount);
|
|
|
+ packetParam.setSource(param.getSource());
|
|
|
+ packetParam.setRedPacketMode(config.getRedPacketMode());
|
|
|
+ packetParam.setCompanyId(receive.getCompanyId());
|
|
|
+ packetParam.setAppId(param.getAppId());
|
|
|
+ packetParam.setUser(user);
|
|
|
+//
|
|
|
+ // 7. 检查公司余额(从sendRedPacketRewardFsUser方法)
|
|
|
+ Company company = companyMapper.selectCompanyById(receive.getCompanyId());
|
|
|
+ if (company == null || company.getMoney().compareTo(amount) < 0) {
|
|
|
+ logger.error("公司余额不足 - 公司ID: {}, 需要金额: {}, 可用余额: {}",
|
|
|
+ receive.getCompanyId(), amount, company != null ? company.getMoney() : 0);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ packetParam.setOutBatchNo(receive.getOutBatchNo());
|
|
|
+ R sendRedPacket = paymentService.sendRedPacket(packetParam);
|
|
|
+ if (sendRedPacket.get("code").equals(200)) {
|
|
|
+ TransferBillsResult transferBillsResult;
|
|
|
+ OffsetDateTime offsetDateTime;
|
|
|
+ if (sendRedPacket.get("isNew").equals(1)) {
|
|
|
+ transferBillsResult = (TransferBillsResult) sendRedPacket.get("data");
|
|
|
+
|
|
|
+ receive.setOutBatchNo(transferBillsResult.getOutBillNo());
|
|
|
+ receive.setBatchId(transferBillsResult.getTransferBillNo());
|
|
|
+ offsetDateTime = OffsetDateTime.parse(transferBillsResult.getCreateTime());
|
|
|
+ } else {
|
|
|
+ receive.setOutBatchNo(sendRedPacket.get("orderCode").toString());
|
|
|
+ receive.setBatchId(sendRedPacket.get("batchId").toString());
|
|
|
+ offsetDateTime = OffsetDateTime.parse(sendRedPacket.get("createTime").toString());
|
|
|
+ }
|
|
|
+ receive.setCreateTime(Date.from(offsetDateTime.toInstant()));
|
|
|
+
|
|
|
+ logger.info("红包发送成功 - 用户ID: {}, 金额: {}, 批次号: {}",
|
|
|
+ user.getUserId(), amount, receive.getReceiveId());
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error("发放红包失败 - 用户ID: {}, 活动ID: {}", user.getUserId(), receive.getActivityId(), e);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 发放积分商品券
|
|
|
+ * 积分商品券直接返回标识,不实际发放,由前端处理
|
|
|
+ */
|
|
|
+ private boolean sendGoodsCoupon(FsCourseCheckinReceive receive) {
|
|
|
+ // 积分商品券直接返回成功标识,实际发放由前端或后续流程处理
|
|
|
+ // 这里不生成实际的优惠券码,只是标记为发放成功
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量发放待发放的奖品
|
|
|
+ *
|
|
|
+ * @param limit 限制数量
|
|
|
+ * @return 发放成功数量
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int batchSendPendingPrizes(Integer limit) {
|
|
|
+ List<FsCourseCheckinReceive> pendingList = fsCourseCheckinReceiveMapper.selectPendingReceiveList(limit);
|
|
|
+ int successCount = 0;
|
|
|
+// for (FsCourseCheckinReceive receive : pendingList) {
|
|
|
+// if (sendPrize(receive.getReceiveId())) {
|
|
|
+// successCount++;
|
|
|
+// }
|
|
|
+// }
|
|
|
+ return successCount;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 发送通知给用户
|
|
|
+ *
|
|
|
+ * @param receiveId 领取记录ID
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public boolean sendNotify(Long receiveId) {
|
|
|
+ FsCourseCheckinReceive receive = fsCourseCheckinReceiveMapper.selectFsCourseCheckinReceiveByReceiveId(receiveId);
|
|
|
+ if (receive == null || receive.getReceiveStatus() != 1) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // TODO: 根据活动通知模板发送消息给用户
|
|
|
+ // 可以通过微信模板消息、短信等方式通知
|
|
|
+
|
|
|
+ Date now = new Date();
|
|
|
+ receive.setNotifyStatus(1); // 已通知
|
|
|
+ receive.setNotifyTime(now);
|
|
|
+ receive.setUpdateTime(now);
|
|
|
+ fsCourseCheckinReceiveMapper.updateFsCourseCheckinReceive(receive);
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+}
|