Memory_LG 3 هفته پیش
والد
کامیت
e313c461ad

+ 291 - 0
qmjszx-admin/src/main/java/beilv/web/controller/carinformation/CardAppController.java

@@ -0,0 +1,291 @@
+package beilv.web.controller.carinformation;
+
+import beilv.admissionticket.domain.AdmissionTicket;
+import beilv.admissionticket.service.IAdmissionTicketService;
+import beilv.bootacourse.domain.BootACourseBO;
+import beilv.bootacourse.service.IBootACourseService;
+import beilv.carinformation.domain.CarInformation;
+import beilv.carinformation.service.ICarInformationService;
+import beilv.common.core.controller.BaseController;
+import beilv.common.core.domain.AjaxResult;
+import beilv.common.core.page.TableDataInfo;
+import beilv.common.utils.DateUtils;
+import beilv.common.utils.uuid.IdUtils;
+import beilv.competition.domain.Competition;
+import beilv.competition.domain.RedisTask;
+import beilv.competition.service.ICompetitionService;
+import beilv.system.service.ISysConfigService;
+import beilv.usermembershipcard.domain.UserMembershipCard;
+import beilv.usermembershipcard.service.IUserMembershipCardService;
+import beilv.vipCard.domain.VipCard;
+import beilv.vipCard.service.IVipCardService;
+import beilv.vipCardLog.domain.VipCardLog;
+import beilv.vipCardLog.service.IVipCardLogService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.math.RoundingMode;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
+
+import static beilv.competition.domain.Constant.ORDER_QUEUE;
+
+@Controller
+@RequestMapping("/app-api/cardApp")
+public class CardAppController extends BaseController {
+
+    private static final Logger logger = LoggerFactory.getLogger(CardAppController.class);
+
+    @Autowired
+    private ICarInformationService carInformationService;
+
+    @Autowired
+    private IUserMembershipCardService userMembershipCardService;
+
+    @Autowired
+    private IVipCardLogService vipCardLogService;
+
+    @Autowired
+    private IVipCardService vipCardService;
+
+    @Autowired
+    private IBootACourseService courseService;
+
+    @Autowired
+    private ICompetitionService competitionService;
+
+    @Autowired
+    private IAdmissionTicketService ticketService;
+
+    @Autowired
+    private ISysConfigService configService;
+
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
+    /**
+     * 新增充值记录
+     */
+    @PostMapping("/addVipCardLog")
+    @ResponseBody
+    public AjaxResult addSave(@RequestBody VipCardLog vipCardLog) {
+        String uuid = IdUtils.fastSimpleUUID();
+        vipCardLog.setId(uuid);
+        vipCardLog.setBusId(IdUtils.fastSimpleUUID());
+        vipCardLog.setOrderType("chongzhi");
+        vipCardLog.setPaymentStatus("payment_status_to_be_paid");
+        vipCardLog.setCreateTime(DateUtils.getNowDate());
+        vipCardLog.setPaymentType("weChart");
+        createOrderTaskQueue(uuid, "chongzhi", "");
+        return insertVipCardLog(vipCardLog, uuid);
+    }
+
+    /**
+     * 新增其他订单记录
+     */
+    @PostMapping("/addOrderLog")
+    @ResponseBody
+    public AjaxResult addOrderLog(@RequestBody VipCardLog vipCardLog) {
+        String uuid = IdUtils.fastSimpleUUID();
+        vipCardLog.setId(uuid);
+        vipCardLog.setCreateTime(DateUtils.getNowDate());
+        if (!validateOrder(vipCardLog)) {
+            return AjaxResult.error("订单验证失败");
+        }
+        createOrderTaskQueue(uuid, vipCardLog.getOrderType(), vipCardLog.getBusId());
+        return insertVipCardLog(vipCardLog, uuid);
+    }
+
+    /**
+     * 充值回调
+     */
+    @PostMapping("/addVipCardLogCallBack")
+    @ResponseBody
+    public AjaxResult addVipCardLogCallBack(@RequestBody VipCardLog vipCardLog) {
+        return toAjax(vipCardLogService.updateVipCardLogByOrderId(vipCardLog));
+    }
+
+    /**
+     * 其他支付回调
+     */
+    @PostMapping("/addOrderLogCallBack")
+    @ResponseBody
+    public AjaxResult addOrderLogCallBack(@RequestBody VipCardLog vipCardLog) {
+        return toAjax(vipCardLogService.updateVipCardLogByOrderId(vipCardLog));
+    }
+
+    /**
+     * 查询我的订单
+     */
+    @PostMapping("/selectOrderList")
+    @ResponseBody
+    public AjaxResult selectOrderList(@RequestBody VipCardLog vipCardLog) {
+        return AjaxResult.success(vipCardLogService.selectVipCardLogList(vipCardLog));
+    }
+
+    /**
+     * 小程序退款
+     */
+    @PostMapping("/refund")
+    @ResponseBody
+    public AjaxResult refund(@RequestBody VipCardLog vipCardLog) {
+        return AjaxResult.success(vipCardLogService.refundById(vipCardLog, true));
+    }
+
+    /**
+     * 查询卡种信息列表
+     */
+    @PostMapping("/cardInformationlist")
+    @ResponseBody
+    public AjaxResult cardInformationlist(@RequestBody CarInformation carInformation) {
+        return AjaxResult.success(carInformationService.selectCarInformationList(carInformation));
+    }
+
+    @PostMapping("/getVipCardInfo")
+    @ResponseBody
+    public AjaxResult getVipCardInfo(@RequestBody VipCardLog vipCardLog) {
+        return AjaxResult.success(vipCardService.selectVipCardByUserId(vipCardLog.getUserId()));
+    }
+
+    /**
+     * 查询用户会员卡列表
+     */
+    @PostMapping("/getUserCardList")
+    @ResponseBody
+    public AjaxResult getUserCardList(@RequestBody UserMembershipCard userMembershipCard) {
+        return AjaxResult.success(userMembershipCardService.selectUserMembershipCardList(userMembershipCard));
+    }
+
+    /**
+     * 查询约场记录
+     */
+    @PostMapping("/selectYueQiuList")
+    @ResponseBody
+    public AjaxResult selectYueChangList(@RequestBody VipCardLog vipCardLog) {
+        startPage();
+        TableDataInfo dataTable = getDataTable(vipCardLogService.selectYueQiuList(vipCardLog));
+        return AjaxResult.success(dataTable.getRows());
+    }
+
+    /**
+     * 查询参赛记录  orderType = cansai
+     * 查询购买门票记录 orderType = menpiao
+     */
+    @PostMapping("/selectCompetitionList")
+    @ResponseBody
+    public AjaxResult selectCanSaiList(@RequestBody VipCardLog vipCardLog) {
+        startPage();
+        return AjaxResult.success(getDataTable(vipCardLogService.selectCanSaiList(vipCardLog)));
+    }
+
+    /**
+     * 新增订单开启定时任务
+     */
+    private void createOrderTaskQueue(String uuid, String orderType, String busId) {
+        long timeOut = Long.parseLong(configService.selectConfigByKey("order.task.timeout"));
+        long timeoutTime = LocalDateTime.now().plus(timeOut, ChronoUnit.MINUTES)
+                .atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
+
+        RedisTask redisTaskApply = new RedisTask(uuid, "", "payment_status_cancelled", orderType, busId);
+        redisTemplate.opsForZSet().add(ORDER_QUEUE + uuid, redisTaskApply.toString(), timeoutTime);
+    }
+
+    /**
+     * 验证订单
+     */
+    private boolean validateOrder(VipCardLog vipCardLog) {
+        String orderType = vipCardLog.getOrderType();
+        String paymentType = vipCardLog.getPaymentType();
+
+        if ("yueqiu".equals(orderType)) {
+            return validateYueQiuOrder(vipCardLog);
+        } else if ("cansai".equals(orderType)) {
+            return validateCanSaiOrder(vipCardLog);
+        }
+
+        if ("weChart".equals(paymentType)) {
+            vipCardLog.setPaymentStatus("payment_status_to_be_paid");
+        } else {
+            vipCardLog.setPaymentStatus("payment_status_have_paid");
+            vipCardLog.setPaymentTime(vipCardLog.getCreateTime());
+            if ("vipCard".equals(paymentType)) {
+                return validateVipCardPayment(vipCardLog);
+            } else if ("numCard".equals(paymentType)) {
+                return validateNumCardPayment(vipCardLog);
+            } else {
+                logger.error("未知支付类型: {}", paymentType);
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private boolean validateYueQiuOrder(VipCardLog vipCardLog) {
+        BootACourseBO courseBO = new BootACourseBO(vipCardLog.getBusId());
+        if (!courseService.isOk(courseBO)) {
+            return false;
+        }
+        AdmissionTicket admissionTicket = new AdmissionTicket();
+        admissionTicket.setId(vipCardLog.getBusId());
+        admissionTicket.setAdmissionTicketStatus("2");
+        ticketService.updateBeilvAdmissionTicket(admissionTicket);
+        return true;
+    }
+
+    private boolean validateCanSaiOrder(VipCardLog vipCardLog) {
+        Competition competition = competitionService.selectCompetitionById(Integer.valueOf(vipCardLog.getBusId()));
+        String competitionState = competition.getCompetitionState();
+        if ("competiton_state_3".equals(competitionState)) {
+            return false;
+        } else if ("competiton_state_4".equals(competitionState)) {
+            return false;
+        }
+        int registrantsNumber = vipCardLogService.getRegistrantsNumber(vipCardLog);
+        if (registrantsNumber >= competition.getTeamMax()) {
+            return false;
+        }
+        return true;
+    }
+
+    private boolean validateVipCardPayment(VipCardLog vipCardLog) {
+        VipCard vipCard = vipCardService.selectVipCardById(vipCardLog.getPaymentId());
+        if (vipCard == null) {
+            logger.error("会员卡不存在: {}", vipCardLog.getPaymentId());
+            return false;
+        }
+        vipCard.setBalance(vipCard.getBalance().subtract(vipCardLog.getPracticalMoney()).setScale(2, RoundingMode.HALF_UP));
+        vipCardService.updateVipCard(vipCard);
+        return true;
+    }
+
+    private boolean validateNumCardPayment(VipCardLog vipCardLog) {
+        UserMembershipCard userMembershipCard = userMembershipCardService.selectUserMembershipCardById(Long.valueOf(vipCardLog.getPaymentId()));
+        if (userMembershipCard == null) {
+            logger.error("次卡不存在: {}", vipCardLog.getPaymentId());
+            return false;
+        }
+        if (userMembershipCard.getRemainingNumber() == 0) {
+            logger.error("次卡次数不足: {}", vipCardLog.getPaymentId());
+            return false;
+        }
+        userMembershipCard.setRemainingNumber(userMembershipCard.getRemainingNumber() - 1);
+        userMembershipCardService.updateUserMembershipCard(userMembershipCard);
+        return true;
+    }
+
+    private AjaxResult insertVipCardLog(VipCardLog vipCardLog, String uuid){
+        if (vipCardLogService.insertVipCardLog(vipCardLog) > 0) {
+            return AjaxResult.success("操作成功!", uuid);
+        } else {
+            return toAjax(0);
+        }
+    }
+}

+ 0 - 383
qmjszx-admin/src/main/java/beilv/web/controller/carinformation/cardAppController.java

@@ -1,383 +0,0 @@
-package beilv.web.controller.carinformation;
-
-import beilv.admissionticket.domain.AdmissionTicket;
-import beilv.admissionticket.service.IAdmissionTicketService;
-import beilv.bootacourse.domain.BootACourseBO;
-import beilv.bootacourse.service.IBootACourseService;
-import beilv.carinformation.domain.CarInformation;
-import beilv.carinformation.service.ICarInformationService;
-import beilv.common.core.controller.BaseController;
-import beilv.common.core.domain.AjaxResult;
-import beilv.common.core.page.TableDataInfo;
-import beilv.common.utils.DateUtils;
-import beilv.common.utils.StringUtils;
-import beilv.common.utils.uuid.IdUtils;
-import beilv.competition.domain.Competition;
-import beilv.competition.domain.RedisTask;
-import beilv.competition.service.ICompetitionService;
-import beilv.system.service.ISysConfigService;
-import beilv.usermembershipcard.domain.UserMembershipCard;
-import beilv.usermembershipcard.service.IUserMembershipCardService;
-import beilv.vipCard.domain.VipCard;
-import beilv.vipCard.service.IVipCardService;
-import beilv.vipCardLog.domain.VipCardLog;
-import beilv.vipCardLog.service.IVipCardLogService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.StringRedisTemplate;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import java.math.RoundingMode;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.time.temporal.ChronoUnit;
-
-import static beilv.competition.domain.Constant.ORDER_QUEUE;
-import static beilv.competition.domain.Constant.TICKET_QUEUE;
-
-/**
- * 会员卡AppController
- *
- * @author ruoyi
- * @date 2025-01-02
- */
-@Controller
-@RequestMapping("/app-api/cardApp")
-//@RequestMapping("/cardApp")
-public class cardAppController extends BaseController {
-
-    @Autowired
-    private ICarInformationService carInformationService;
-
-    @Autowired
-    private IUserMembershipCardService userMembershipCardService;
-
-    @Autowired
-    private IVipCardLogService vipCardLogService;
-
-    @Autowired
-    private IVipCardService vipCardService;
-
-    @Autowired
-    private IBootACourseService courseService;
-
-    @Autowired
-    private ICompetitionService competitionService;
-
-    @Autowired
-    private IAdmissionTicketService ticketService;
-
-    @Autowired
-    private ISysConfigService configService;
-
-    @Autowired
-    private StringRedisTemplate redisTemplate;
-
-    /**
-     * 新增充值记录
-     * id                   生成的数据标识(后续交互的关键信息)
-     * user_id              用户id
-     * bus_id               业务关联id(根据支付方式不同, 写入的值不同)
-     * order_type           订单类型(充值:chongzhi; 约球:yueqiu; 购卡:gouka; 报名参赛:cansai; 观看门票:menpiao)
-     * payment_status       支付状态: 生成订单, 默认为待支付:payment_status_to_be_paid
-     * create_time          订单生成时间
-     * payment_type         支付类型(微信:weChart; 会员卡:vipCard; 次卡:numCard)
-     * payment_time         支付时间: 如果支付类型为微信, 则回调接口设置时间; 如果是会员卡或次卡, 直接设置为订单生成时间
-     * cancellation_time    取消时间: 支付类型为微信支付, 则回调接口设置时间; 如果是会员卡或次卡, 则不会产生数据
-     * verify_time          核销时间: 定时任务核销
-     * refund_time          退款时间: 用户发起退款时生成的时间
-     * practical_money      实际支付金额
-     * ooriginal_price      原价
-     * member_price         会员价
-     */
-    @PostMapping("/addVipCardLog")
-    @ResponseBody
-    public AjaxResult addSave(@RequestBody VipCardLog vipCardLog) {
-        String uuid = IdUtils.fastSimpleUUID();
-        vipCardLog.setId(uuid);
-        vipCardLog.setBusId(IdUtils.fastSimpleUUID());
-        vipCardLog.setOrderType("chongzhi");
-        vipCardLog.setPaymentStatus("payment_status_to_be_paid");
-        vipCardLog.setCreateTime(DateUtils.getNowDate());
-        vipCardLog.setPaymentType("weChart");
-
-        //开启定时任务
-        createOrderTaskQueue(uuid,"chongzhi", "");
-
-        if (vipCardLogService.insertVipCardLog(vipCardLog) > 0) {
-            return AjaxResult.success("操作成功!", uuid);
-        } else {
-            return toAjax(0);
-        }
-    }
-
-    /**
-     * 新增其他订单记录
-     * id                   生成的数据标识(后续交互的关键信息)
-     * user_id              用户id
-     * bus_id               业务关联id
-     * (当支付方式为微信时: 约球: 场地id; 购卡: 卡片id; 报名参赛: 赛事id; 门票: 赛事id)
-     * (当支付方式为会员卡时: 会员卡id)
-     * (当支付方式为次卡时: 次卡id)
-     * order_type           订单类型(充值:chongzhi; 约球:yueqiu; 购卡:gouka; 报名参赛:cansai; 观看门票:menpiao)
-     * payment_status       支付状态: 生成订单, 默认为待支付:payment_status_to_be_paid
-     * create_time          订单生成时间
-     * payment_type         支付类型(微信:weChart; 会员卡:vipCard; 次卡:numCard)
-     * payment_time         支付时间: 如果支付类型为微信, 则回调接口设置时间; 如果是会员卡或次卡, 直接设置为订单生成时间
-     * cancellation_time    取消时间: 支付类型为微信支付, 则回调接口设置时间; 如果是会员卡或次卡, 则不会产生数据
-     * verify_time          核销时间: 定时任务核销
-     * refund_time          退款时间: 用户发起退款时生成的时间
-     * practical_money      实际支付金额
-     * ooriginal_price      原价
-     * member_price         会员价
-     */
-    @PostMapping("/addOrderLog")
-    @ResponseBody
-    public AjaxResult addOrderLog(@RequestBody VipCardLog vipCardLog) {
-        String uuid = IdUtils.fastSimpleUUID();
-        vipCardLog.setId(uuid);//设置订单编号
-        vipCardLog.setCreateTime(DateUtils.getNowDate());//设置订单生成时间
-
-
-        //验证购票种类及对应的信息是否可用
-        String orderType = vipCardLog.getOrderType();
-        if ("yueqiu".equals(orderType)) {
-            //约球, 验证场次是否可用, 如果可用将其锁定
-            if (courseService.isOk(new BootACourseBO(vipCardLog.getBusId()))) {
-                //将门票信息修改为2: 线上预约的时段;
-                AdmissionTicket admissionTicket = new AdmissionTicket();
-                admissionTicket.setId(vipCardLog.getBusId());
-                admissionTicket.setAdmissionTicketStatus("2");
-                ticketService.updateBeilvAdmissionTicket(admissionTicket);
-            } else {
-                return AjaxResult.error("当前场次已被预订!");
-            }
-        } else if ("cansai".equals(orderType)) {
-            //参赛, 验证赛事报名是否结束, 参赛人员是否已满. 如果可用则锁定名额
-
-            //查询赛事信息.
-            Competition competition = competitionService.selectCompetitionById(Integer.valueOf(vipCardLog.getBusId()));
-            String competitionState = competition.getCompetitionState();
-            if ("competiton_state_3".equals(competitionState)) {
-                return AjaxResult.error("赛事报名结束!");
-            } else if ("competiton_state_4".equals(competitionState)) {
-                return AjaxResult.error("赛事已关闭!");
-            } else {
-                //查询已经报名的人数会团队数
-                int registrantsNumber = vipCardLogService.getRegistrantsNumber(vipCardLog);
-                if (registrantsNumber >= competition.getTeamMax()) {
-                    return AjaxResult.error("参赛人(团队)数已满!");
-                }
-            }
-        }
-
-
-        //验证支付方式
-        String paymentType = vipCardLog.getPaymentType();
-        if ("weChart".equals(paymentType)) {
-            //微信支付, 状态为待支付.
-            vipCardLog.setPaymentStatus("payment_status_to_be_paid");
-        } else {
-            //其他支付, 状态已支付
-            vipCardLog.setPaymentStatus("payment_status_have_paid");
-            vipCardLog.setPaymentTime(vipCardLog.getCreateTime());//支付时间同订单生成时间
-            if ("vipCard".equals(paymentType)) {
-                //如果是会员卡, 进行会员卡扣费
-                VipCard vipCard = vipCardService.selectVipCardById(vipCardLog.getPaymentId());
-                vipCard.setBalance(vipCard.getBalance().subtract(vipCardLog.getPracticalMoney()).setScale(2, RoundingMode.HALF_UP));
-                vipCardService.updateVipCard(vipCard);
-            } else if ("numCard".equals(paymentType)) {
-                //如果是次卡, 进行次卡扣次数
-                UserMembershipCard userMembershipCard = userMembershipCardService.selectUserMembershipCardById(Long.valueOf(vipCardLog.getPaymentId()));
-                if (userMembershipCard.getRemainingNumber() == 0) {
-                    return AjaxResult.error("次数不足!");
-                }
-                userMembershipCard.setRemainingNumber(userMembershipCard.getRemainingNumber() - 1);
-                userMembershipCardService.updateUserMembershipCard(userMembershipCard);
-
-            } else {
-                return AjaxResult.error("未知支付类型!");
-            }
-
-            if ("yueqiu".equals(orderType)) {
-                AdmissionTicket admissionTicket = new AdmissionTicket();
-                admissionTicket.setId(vipCardLog.getBusId());
-                ticketService.createTask(admissionTicket);
-            }
-
-        }
-
-        //开启定时任务
-        createOrderTaskQueue(uuid, vipCardLog.getOrderType(), vipCardLog.getBusId());
-
-        if (vipCardLogService.insertVipCardLog(vipCardLog) > 0) {
-            return AjaxResult.success("操作成功!", uuid);
-        } else {
-            return toAjax(0);
-        }
-    }
-
-
-    /**
-     * 充值回调
-     *
-     * @param vipCardLog orderId
-     *                   paymentStatus
-     * @return
-     */
-    @PostMapping("/addVipCardLogCallBack")
-    @ResponseBody
-    public AjaxResult addVipCardLogCallBack(@RequestBody VipCardLog vipCardLog) {
-        return toAjax(vipCardLogService.updateVipCardLogByOrderId(vipCardLog));
-    }
-
-
-
-    /**
-     * 其他支付回调
-     */
-    @PostMapping("/addOrderLogCallBack")
-    @ResponseBody
-    public AjaxResult addOrderLogCallBack(@RequestBody VipCardLog vipCardLog) {
-        return toAjax(vipCardLogService.updateVipCardLogByOrderId(vipCardLog));
-    }
-
-
-
-    /**
-     * 查询我的订单
-     */
-    @PostMapping("/selectOrderList")
-    @ResponseBody
-    public AjaxResult selectOrderList(@RequestBody VipCardLog vipCardLog) {
-        return AjaxResult.success(vipCardLogService.selectVipCardLogList(vipCardLog));
-    }
-
-    /**
-     * 小程序退款
-     */
-    @PostMapping("/refund")
-    @ResponseBody
-    public AjaxResult refund(@RequestBody VipCardLog vipCardLog) {
-        return AjaxResult.success(vipCardLogService.refundById(vipCardLog, true));
-    }
-
-    /**
-     * 查询卡种信息列表
-     */
-    @PostMapping("/cardInformationlist")
-    @ResponseBody
-    public AjaxResult cardInformationlist(@RequestBody CarInformation carInformation) {
-        return AjaxResult.success(carInformationService.selectCarInformationList(carInformation));
-    }
-
-    @PostMapping("/getVipCardInfo")
-    @ResponseBody
-    public AjaxResult getVipCardInfo(@RequestBody VipCardLog vipCardLog){
-        return AjaxResult.success(vipCardService.selectVipCardByUserId(vipCardLog.getUserId()));
-    }
-
-    /**
-     * 查询用户会员卡列表
-     */
-    @PostMapping("/getUserCardList")
-    @ResponseBody
-    public AjaxResult getUserCardList(@RequestBody UserMembershipCard userMembershipCard) {
-        return AjaxResult.success(userMembershipCardService.selectUserMembershipCardList(userMembershipCard));
-    }
-
-    /**
-     * 查询约场记录
-     */
-    @PostMapping("/selectYueQiuList")
-    @ResponseBody
-    public AjaxResult selectYueChangList(@RequestBody VipCardLog vipCardLog) {
-        startPage();
-        TableDataInfo dataTable = getDataTable(vipCardLogService.selectYueQiuList(vipCardLog));
-        return AjaxResult.success(dataTable.getRows());
-    }
-
-
-
-    /**
-     * 查询参赛记录  orderType = cansai
-     * 查询购买门票记录 orderType = menpiao
-     */
-    @PostMapping("/selectCompetitionList")
-    @ResponseBody
-    public AjaxResult selectCanSaiList(@RequestBody VipCardLog vipCardLog) {
-        startPage();
-        return AjaxResult.success(getDataTable(vipCardLogService.selectCanSaiList(vipCardLog)));
-    }
-
-    /**
-     * 新增订单开启定时任务
-     * @param uuid
-     */
-    private void createOrderTaskQueue(String uuid, String orderType, String busId){
-        //超时分钟数
-        long timeOut = Long.parseLong(configService.selectConfigByKey("order.task.timeout"));
-
-        long timeoutTime = LocalDateTime.now().plus(timeOut, ChronoUnit.MINUTES).atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
-
-        //创建订单, 开启定时
-        RedisTask redisTaskApply = new RedisTask(uuid, "","payment_status_cancelled", orderType, busId);
-        redisTemplate.opsForZSet().add(ORDER_QUEUE + uuid, redisTaskApply.toString(), timeoutTime);
-    }
-
-
-
-
-//    /**
-//     * 查询购卡记录列表
-//     */
-//    @PostMapping("/getRecordlist")
-//    @ResponseBody
-//    public AjaxResult list(@RequestBody CardPurchaseRecord cardPurchaseRecord) {
-//        List<CardPurchaseRecord> list = cardPurchaseRecordService.selectCardPurchaseRecordList(cardPurchaseRecord);
-//        return AjaxResult.success(list);
-//    }
-//
-//    /**
-//     * 购卡生成订单
-//     */
-//    @PostMapping("/addCard")
-//    @ResponseBody
-//    public AjaxResult addCard(@RequestBody CardPurchaseRecord cardPurchaseRecord) {
-//        return AjaxResult.success(cardPurchaseRecordService.insertCardPurchaseRecord(cardPurchaseRecord));
-//    }
-//
-//    /**
-//     * 购卡回调(购卡、取消订单)
-//     */
-//    @PostMapping("/addCardCallback")
-//    @ResponseBody
-//    public AjaxResult addCardCallback(@RequestBody CardPurchaseRecord cardPurchaseRecord) {
-//        return toAjax(cardPurchaseRecordService.addCardCallback(cardPurchaseRecord));
-//    }
-//
-
-
-
-
-
-//
-//    /*
-//     * 退卡
-//     *
-//     * @author 韩福成
-//     * @date 2025/1/7 上午10:46
-//     */
-//    @PostMapping("/refundCard")
-//    @ResponseBody
-//    public AjaxResult refundCard(@RequestBody UserMembershipCard userMembershipCard) {
-//        int inserted = userMembershipCardService.refundCard(userMembershipCard);
-//        if (inserted == -1) {
-//            return AjaxResult.error("退款金额小于0,不支持退款!");
-//        }
-//        return toAjax(inserted);
-//    }
-}

+ 163 - 188
qmjszx-business/src/main/java/beilv/competition/task/RedisTaskChecker.java

@@ -10,6 +10,8 @@ import beilv.stadium.domain.Stadium;
 import beilv.vipCardLog.domain.VipCardLog;
 import beilv.vipCardLog.mapper.VipCardLogMapper;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -21,123 +23,82 @@ import java.util.Set;
 
 import static beilv.competition.domain.Constant.*;
 
-/**
- * 轮询Redis有序集合, 处理到期的任务.
- * 将到期的任务发布, 由监听者接收
- * 同时移除其他相同eventId的任务
- */
-
 @Component
 public class RedisTaskChecker {
 
+    // 日志记录器
+    private static final Logger logger = LoggerFactory.getLogger(RedisTaskChecker.class);
+
+    // 注入 Redis 模板
     @Autowired
     private StringRedisTemplate stringRedisTemplate;
 
+    // 注入比赛 Mapper
     @Resource
     private CompetitionMapper competitionMapper;
 
+    // 注入会员卡日志 Mapper
     @Resource
     private VipCardLogMapper vipCardLogMapper;
 
+    // 注入门票 Mapper
     @Resource
     private AdmissionTicketMapper ticketMapper;
 
+    // 注入 ObjectMapper 用于 JSON 转换
+    @Autowired
+    private ObjectMapper objectMapper;
+
     /**
-     * 检测到期任务, 并将消息发布
+     * 定时任务,每秒检查一次,处理报名结束的任务
      */
     @Scheduled(fixedRate = 1000)
     public void checkTasks() {
-        long currentTime = System.currentTimeMillis() / 1000;
-
-        // 获取所有有序集合的键
-        Set<String> keys = stringRedisTemplate.keys(TASK_QUEUE_QUERY_APPLY);
-        if (keys != null && !keys.isEmpty()) {
-            for (String key : keys) {
-                // 获取当前时间之前的所有任务
-                Set<String> tasks = stringRedisTemplate.opsForZSet().rangeByScore(key, 0, currentTime);
-                if (tasks != null && !tasks.isEmpty()) {
-                    for (String taskJson : tasks) {
-                        try {
-//                            System.out.println("taskJson => " + taskJson);
-
-                            //获取任务信息
-                            ObjectMapper objectMapper = new ObjectMapper();
-                            RedisTask task = objectMapper.readValue(taskJson, RedisTask.class);
-
-                            //赛事报名结束: 参赛订单核销, 赛事状态:报名结束
-
-                            Competition competition = new Competition();
-                            competition.setId(task.getCompetitionId());
-                            competition.setCompetitionState(task.getCompetitionState());
-                            competitionMapper.updateCompetition(competition);
-
-
-                            //赛事id, 订单状态, 核验时间
-                            VipCardLog vipCardLog = new VipCardLog(String.valueOf(task.getCompetitionId()), "cansai", task.getPaymentStatus(), DateUtils.getNowDate());
-                            vipCardLogMapper.updateVipCardLogByBusId(vipCardLog);
-
-                            // 移除当前已发布的任务
-                            stringRedisTemplate.opsForZSet().remove(key, taskJson);
-                            System.out.println("Removed task: " + taskJson);
-                        } catch (Exception e) {
-                            e.printStackTrace();
-                        }
-                    }
-                }
-            }
-        }
+        processTasks(TASK_QUEUE_QUERY_APPLY, this::handleTaskApply);
     }
 
-
+    /**
+     * 定时任务,每秒检查一次,处理比赛开始的任务
+     */
     @Scheduled(fixedRate = 1000)
     public void checkTasksStart() {
-        long currentTime = System.currentTimeMillis() / 1000;
-
-        // 获取所有有序集合的键
-        Set<String> keys = stringRedisTemplate.keys(TASK_QUEUE_QUERY_START);
-        if (keys != null && !keys.isEmpty()) {
-            for (String key : keys) {
-                // 获取当前时间之前的所有任务
-                Set<String> tasks = stringRedisTemplate.opsForZSet().rangeByScore(key, 0, currentTime);
-                if (tasks != null && !tasks.isEmpty()) {
-                    for (String taskJson : tasks) {
-                        try {
-//                            System.out.println("taskJson => " + taskJson);
-
-                            //获取任务信息
-                            ObjectMapper objectMapper = new ObjectMapper();
-                            RedisTask task = objectMapper.readValue(taskJson, RedisTask.class);
-
-                            //比赛开始, 门票订单核销, 赛事状态, 比赛开始
-
-                            Competition competition = new Competition();
-                            competition.setId(task.getCompetitionId());
-                            competition.setCompetitionState(task.getCompetitionState());
-                            competitionMapper.updateCompetition(competition);
-
-                            //赛事id, 订单状态, 核验时间
-                            VipCardLog vipCardLog = new VipCardLog(String.valueOf(task.getCompetitionId()), "menpiao", task.getPaymentStatus(), DateUtils.getNowDate());
-                            vipCardLogMapper.updateVipCardLogByBusId(vipCardLog);
+        processTasks(TASK_QUEUE_QUERY_START, this::handleTaskStart);
+    }
 
+    /**
+     * 定时任务,每秒检查一次,处理比赛结束的任务
+     */
+    @Scheduled(fixedRate = 1000)
+    public void checkTasksEnd() {
+        processTasks(TASK_QUEUE_QUERY_END, this::handleTaskEnd);
+    }
 
-                            // 移除当前已发布的任务
-                            stringRedisTemplate.opsForZSet().remove(key, taskJson);
-                            System.out.println("Removed task: " + taskJson);
-                        } catch (Exception e) {
-                            e.printStackTrace();
-                        }
-                    }
-                }
-            }
-        }
+    /**
+     * 定时任务,每秒检查一次,处理门票相关任务
+     */
+    @Scheduled(fixedRate = 1000)
+    public void checkTicket() {
+        processTasks(TICKET_QUEUE_ALL, this::handleTicketTask);
     }
 
+    /**
+     * 定时任务,每秒检查一次,处理订单相关任务
+     */
     @Scheduled(fixedRate = 1000)
-    public void checkTasksEnd() {
-        long currentTime = System.currentTimeMillis() / 1000;
+    public void checkOrder() {
+        processTasks(ORDER_QUEUE_ALL, this::handleOrderTask);
+    }
+
+    /**
+     * 通用的任务处理方法
+     * @param keyPattern Redis 键的模式
+     * @param taskHandler 具体的任务处理逻辑
+     */
+    private void processTasks(String keyPattern, TaskHandler taskHandler) {
+        long currentTime = System.currentTimeMillis() / 1000; // 当前时间戳(秒)
 
-        // 获取所有有序集合的键
-        Set<String> keys = stringRedisTemplate.keys(TASK_QUEUE_QUERY_END);
+        // 获取所有匹配的 Redis 
+        Set<String> keys = stringRedisTemplate.keys(keyPattern);
         if (keys != null && !keys.isEmpty()) {
             for (String key : keys) {
                 // 获取当前时间之前的所有任务
@@ -145,25 +106,16 @@ public class RedisTaskChecker {
                 if (tasks != null && !tasks.isEmpty()) {
                     for (String taskJson : tasks) {
                         try {
-//                            System.out.println("taskJson => " + taskJson);
-
-                            //获取任务信息
-                            ObjectMapper objectMapper = new ObjectMapper();
+                            // 将 JSON 字符串转换为 RedisTask 对象
                             RedisTask task = objectMapper.readValue(taskJson, RedisTask.class);
-
-                            //比赛开始, 门票订单核销, 赛事状态, 比赛开始
-
-                            Competition competition = new Competition();
-                            competition.setId(task.getCompetitionId());
-                            competition.setCompetitionState(task.getCompetitionState());
-                            competitionMapper.updateCompetition(competition);
-
-
-                            // 移除当前已发布的任务
+                            // 调用具体的任务处理逻辑
+                            taskHandler.handle(task);
+                            // 从 Redis 中移除已处理的任务
                             stringRedisTemplate.opsForZSet().remove(key, taskJson);
-                            System.out.println("Removed task: " + taskJson);
+                            logger.info("Removed task: {}", taskJson);
                         } catch (Exception e) {
-                            e.printStackTrace();
+                            // 记录异常信息
+                            logger.error("Error processing task: {}", taskJson, e);
                         }
                     }
                 }
@@ -171,102 +123,125 @@ public class RedisTaskChecker {
         }
     }
 
+    /**
+     * 处理报名结束的任务
+     * @param task RedisTask 对象
+     */
+    private void handleTaskApply(RedisTask task) {
+        // 更新比赛状态
+        updateCompetitionState(task.getCompetitionId(), task.getCompetitionState());
+        // 更新会员卡日志
+        updateVipCardLog(task.getCompetitionId(), "cansai", task.getPaymentStatus());
+    }
 
-    @Scheduled(fixedRate = 1000)
-    public void checkTicket() {
-        long currentTime = System.currentTimeMillis() / 1000;
-
-        // 获取所有有序集合的键
-        Set<String> keys = stringRedisTemplate.keys(TICKET_QUEUE_ALL);
-        if (keys != null && !keys.isEmpty()) {
-            for (String key : keys) {
-                // 获取当前时间之前的所有任务
-                Set<String> tasks = stringRedisTemplate.opsForZSet().rangeByScore(key, 0, currentTime);
-                if (tasks != null && !tasks.isEmpty()) {
-                    for (String taskJson : tasks) {
-                        try {
-//                            System.out.println("taskJson => " + taskJson);
-
-                            //获取任务信息
-                            ObjectMapper objectMapper = new ObjectMapper();
-                            RedisTask task = objectMapper.readValue(taskJson, RedisTask.class);
+    /**
+     * 处理比赛开始的任务
+     * @param task RedisTask 对象
+     */
+    private void handleTaskStart(RedisTask task) {
+        // 更新比赛状态
+        updateCompetitionState(task.getCompetitionId(), task.getCompetitionState());
+        // 更新会员卡日志
+        updateVipCardLog(task.getCompetitionId(), "menpiao", task.getPaymentStatus());
+    }
 
-                            //修改订单状态为核销
-                            VipCardLog vipCardLog = new VipCardLog();
-                            vipCardLog.setBusId(String.valueOf(task.getCompetitionId()));
-                            vipCardLog.setOrderType("yueqiu");
-                            vipCardLog.setVerifyTime(DateUtils.getNowDate());
-                            vipCardLog.setPaymentStatus(task.getPaymentStatus());
-                            vipCardLogMapper.updateVipCardLogByBusId(vipCardLog);
+    /**
+     * 处理比赛结束的任务
+     * @param task RedisTask 对象
+     */
+    private void handleTaskEnd(RedisTask task) {
+        // 更新比赛状态
+        updateCompetitionState(task.getCompetitionId(), task.getCompetitionState());
+    }
 
-                            //修改场次状态为核销
-                            AdmissionTicket admissionTicket = new AdmissionTicket();
-                            admissionTicket.setId(task.getCompetitionId());
-                            admissionTicket.setAdmissionTicketStatus(task.getCompetitionState());
-                            ticketMapper.updateBeilvAdmissionTicket(admissionTicket);
+    /**
+     * 处理门票相关任务
+     * @param task RedisTask 对象
+     */
+    private void handleTicketTask(RedisTask task) {
+        // 更新会员卡日志
+        updateVipCardLog(task.getCompetitionId(), "yueqiu", task.getPaymentStatus());
+        // 更新门票状态
+        updateAdmissionTicketStatus(task.getCompetitionId(), task.getCompetitionState());
+    }
 
-                            // 移除当前已发布的任务
-                            stringRedisTemplate.opsForZSet().remove(key, taskJson);
-                            System.out.println("Removed task: " + taskJson);
-                        } catch (Exception e) {
-                            e.printStackTrace();
-                        }
-                    }
-                }
-            }
+    /**
+     * 处理订单相关任务
+     * @param task RedisTask 对象
+     */
+    private void handleOrderTask(RedisTask task) {
+        // 更新会员卡日志
+        updateVipCardLog(task.getCompetitionId(), task.getPaymentStatus());
+        // 如果是约球订单,重置球场信息
+        if ("yueqiu".equals(task.getOrderType())) {
+            resetAdmissionTicketStatus(task.getBusId());
         }
     }
 
+    /**
+     * 更新比赛状态
+     * @param competitionId 比赛 ID
+     * @param competitionState 比赛状态
+     */
+    private void updateCompetitionState(String competitionId, String competitionState) {
+        Competition competition = new Competition();
+        competition.setId(competitionId);
+        competition.setCompetitionState(competitionState);
+        competitionMapper.updateCompetition(competition);
+    }
 
-    @Scheduled(fixedRate = 1000)
-    public void checkOrder() {
-        long currentTime = System.currentTimeMillis() / 1000;
-
-        // 获取所有有序集合的键
-        Set<String> keys = stringRedisTemplate.keys(ORDER_QUEUE_ALL);
-        if (keys != null && !keys.isEmpty()) {
-            for (String key : keys) {
-                // 获取当前时间之前的所有任务
-                Set<String> tasks = stringRedisTemplate.opsForZSet().rangeByScore(key, 0, currentTime);
-                if (tasks != null && !tasks.isEmpty()) {
-                    for (String taskJson : tasks) {
-                        try {
-//                            System.out.println("taskJson => " + taskJson);
-
-                            //获取任务信息
-                            ObjectMapper objectMapper = new ObjectMapper();
-                            RedisTask task = objectMapper.readValue(taskJson, RedisTask.class);
+    /**
+     * 更新会员卡日志
+     * @param competitionId 比赛 ID
+     * @param orderType 订单类型
+     * @param paymentStatus 支付状态
+     */
+    private void updateVipCardLog(String competitionId, String orderType, String paymentStatus) {
+        VipCardLog vipCardLog = new VipCardLog(String.valueOf(competitionId), orderType, paymentStatus, DateUtils.getNowDate());
+        vipCardLogMapper.updateVipCardLogByBusId(vipCardLog);
+    }
 
-                            //根据订单id, 修改订单为已取消
-                            VipCardLog vipCardLog = new VipCardLog();
-                            vipCardLog.setId(task.getCompetitionId());
-                            vipCardLog.setPaymentStatus(task.getPaymentStatus());
-                            vipCardLog.setCancellationTime(DateUtils.getNowDate());
-                            vipCardLogMapper.updateVipCardLog(vipCardLog);
+    /**
+     * 更新会员卡日志(仅支付状态)
+     * @param competitionId 比赛 ID
+     * @param paymentStatus 支付状态
+     */
+    private void updateVipCardLog(String competitionId, String paymentStatus) {
+        VipCardLog vipCardLog = new VipCardLog();
+        vipCardLog.setId(competitionId);
+        vipCardLog.setPaymentStatus(paymentStatus);
+        vipCardLog.setCancellationTime(DateUtils.getNowDate());
+        vipCardLogMapper.updateVipCardLog(vipCardLog);
+    }
 
-                            //判断订单类型, 如果是约球, 要重置球场信息
-                            if("yueqiu".equals(task.getOrderType())){
-                                AdmissionTicket admissionTicket = new AdmissionTicket();
-                                admissionTicket.setId(task.getBusId());
-                                admissionTicket.setAdmissionTicketStatus("0");
-                                ticketMapper.updateBeilvAdmissionTicket(admissionTicket);
-                            }
+    /**
+     * 更新门票状态
+     * @param ticketId 门票 ID
+     * @param status 状态
+     */
+    private void updateAdmissionTicketStatus(String ticketId, String status) {
+        AdmissionTicket admissionTicket = new AdmissionTicket();
+        admissionTicket.setId(ticketId);
+        admissionTicket.setAdmissionTicketStatus(status);
+        ticketMapper.updateBeilvAdmissionTicket(admissionTicket);
+    }
 
-                            // 移除当前已发布的任务
-                            stringRedisTemplate.opsForZSet().remove(key, taskJson);
-                            System.out.println("Removed task: " + taskJson);
-                        } catch (Exception e) {
-                            e.printStackTrace();
-                        }
-                    }
-                }
-            }
-        }
+    /**
+     * 重置门票状态
+     * @param ticketId 门票 ID
+     */
+    private void resetAdmissionTicketStatus(String ticketId) {
+        AdmissionTicket admissionTicket = new AdmissionTicket();
+        admissionTicket.setId(ticketId);
+        admissionTicket.setAdmissionTicketStatus("0");
+        ticketMapper.updateBeilvAdmissionTicket(admissionTicket);
     }
 
-    public void removeTaskByKey(String zKey){
-        stringRedisTemplate.delete(zKey);
+    /**
+     * 定义任务处理逻辑的函数式接口
+     */
+    @FunctionalInterface
+    interface TaskHandler {
+        void handle(RedisTask task);
     }
 }
-
-