Browse Source

定时完成核销

Memory_LG 3 tuần trước cách đây
mục cha
commit
13b9b9bad5
19 tập tin đã thay đổi với 250 bổ sung72 xóa
  1. 9 0
      qmjszx-admin/src/main/java/beilv/web/controller/admissionticket/AdmissionTicketController.java
  2. 8 2
      qmjszx-admin/src/main/java/beilv/web/controller/carinformation/cardAppController.java
  3. 2 3
      qmjszx-admin/src/main/java/beilv/web/controller/competition/CompetitionController.java
  4. 6 2
      qmjszx-admin/src/main/java/beilv/web/controller/vipCardLog/VipCardLogController.java
  5. 2 2
      qmjszx-admin/src/main/resources/templates/admissionticket/admissionTicket.html
  6. 3 3
      qmjszx-admin/src/main/resources/templates/competition/competition.html
  7. 1 1
      qmjszx-admin/src/main/resources/templates/system/vipCardLog/vipCardLog.html
  8. 5 0
      qmjszx-business/src/main/java/beilv/admissionticket/service/IAdmissionTicketService.java
  9. 71 12
      qmjszx-business/src/main/java/beilv/admissionticket/service/impl/AdmissionTicketServiceImpl.java
  10. 1 1
      qmjszx-business/src/main/java/beilv/competition/domain/Competition.java
  11. 3 0
      qmjszx-business/src/main/java/beilv/competition/domain/Constant.java
  12. 1 1
      qmjszx-business/src/main/java/beilv/competition/domain/RedisTask.java
  13. 27 27
      qmjszx-business/src/main/java/beilv/competition/service/impl/CompetitionServiceImpl.java
  14. 55 0
      qmjszx-business/src/main/java/beilv/competition/task/RedisTaskChecker.java
  15. 2 0
      qmjszx-business/src/main/java/beilv/vipCardLog/mapper/VipCardLogMapper.java
  16. 1 1
      qmjszx-business/src/main/java/beilv/vipCardLog/service/IVipCardLogService.java
  17. 46 8
      qmjszx-business/src/main/java/beilv/vipCardLog/service/impl/VipCardLogServiceImpl.java
  18. 1 8
      qmjszx-business/src/main/resources/mapper/card/UserMembershipCardMapper.xml
  19. 6 1
      qmjszx-business/src/main/resources/mapper/vipCardLog/VipCardLogMapper.xml

+ 9 - 0
qmjszx-admin/src/main/java/beilv/web/controller/admissionticket/AdmissionTicketController.java

@@ -145,4 +145,13 @@ public class AdmissionTicketController extends BaseController {
     public AjaxResult confirm(AdmissionTicket beilvAdmissionTicket){
         return toAjax(beilvAdmissionTicketService.confirm(beilvAdmissionTicket));
     }
+
+    /**
+     * 约球页面线下退款 暂未开启
+     */
+//    @PostMapping("/refund")
+//    @ResponseBody
+//    public AjaxResult refund(AdmissionTicket beilvAdmissionTicket){
+//        return beilvAdmissionTicketService.refund(beilvAdmissionTicket);
+//    }
 }

+ 8 - 2
qmjszx-admin/src/main/java/beilv/web/controller/carinformation/cardAppController.java

@@ -183,6 +183,12 @@ public class cardAppController extends BaseController {
                 return AjaxResult.error("未知支付类型!");
             }
 
+            if ("yueqiu".equals(orderType)) {
+                AdmissionTicket admissionTicket = new AdmissionTicket();
+                admissionTicket.setId(vipCardLog.getBusId());
+                ticketService.createTask(admissionTicket);
+            }
+
         }
         if (vipCardLogService.insertVipCardLog(vipCardLog) > 0) {
             return AjaxResult.success("操作成功!", uuid);
@@ -228,12 +234,12 @@ public class cardAppController extends BaseController {
     }
 
     /**
-     * 退款
+     * 小程序退款
      */
     @PostMapping("/refund")
     @ResponseBody
     public AjaxResult refund(@RequestBody VipCardLog vipCardLog) {
-        return AjaxResult.success(vipCardLogService.selectVipCardLogList(vipCardLog));
+        return AjaxResult.success(vipCardLogService.refundById(vipCardLog, true));
     }
 
     /**

+ 2 - 3
qmjszx-admin/src/main/java/beilv/web/controller/competition/CompetitionController.java

@@ -187,15 +187,14 @@ public class CompetitionController extends BaseController {
     }
 
     /**
-     * 针对某个购票记录进行退票处理
-     *
+     * 赛事线下退款
      * @param orderId 购票记录id
      * @return
      */
     @GetMapping("/close/{orderId}")
     @ResponseBody
     public AjaxResult closeStadiumById(@PathVariable("orderId") String orderId) {
-        return vipCardLogService.refundById(new VipCardLog(orderId));
+        return vipCardLogService.refundById(new VipCardLog(orderId), false);
     }
 
 }

+ 6 - 2
qmjszx-admin/src/main/java/beilv/web/controller/vipCardLog/VipCardLogController.java

@@ -6,7 +6,6 @@ import beilv.common.core.domain.AjaxResult;
 import beilv.common.core.page.TableDataInfo;
 import beilv.common.enums.BusinessType;
 import beilv.common.utils.poi.ExcelUtil;
-import beilv.vipCard.domain.VipCard;
 import beilv.vipCardLog.domain.VipCardLog;
 import beilv.vipCardLog.service.IVipCardLogService;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -116,9 +115,14 @@ public class VipCardLogController extends BaseController {
     }
 
 
+    /**
+     * 订单页面退款
+     * @param vipCardLog
+     * @return
+     */
     @PostMapping("/refund")
     @ResponseBody
     public AjaxResult refund(VipCardLog vipCardLog){
-        return vipCardLogService.refundById(vipCardLog);
+        return vipCardLogService.refundById(vipCardLog, false);
     }
 }

+ 2 - 2
qmjszx-admin/src/main/resources/templates/admissionticket/admissionTicket.html

@@ -98,7 +98,7 @@
                     align: 'center',
                     formatter: function (value, row, index) {
                         var actions = [];
-                        if(row.admissionTicketStatus==="2"){
+                        if (row.admissionTicketStatus === "2") {
                             actions.push('<a class="btn btn-danger btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="confirm(\'' + row.id + '\')"><i class="fa fa-edit"></i>核销</a>');
                         }
                         return actions.join('');
@@ -126,7 +126,7 @@
         }*/
     }
 
-    function confirm(id){
+    function confirm(id) {
         $.operate.post(prefix + "/confirm", {"id": id, "admissionTicketStatus": "4"});
     }
 

+ 3 - 3
qmjszx-admin/src/main/resources/templates/competition/competition.html

@@ -136,7 +136,7 @@
                     formatter: function (value, row, index) {
                         var actions = [];
                         if (row.competitionState === 'competiton_state_1') {
-                            actions.push('<a class="btn btn-success btn-xs ' + publisFlag + '" href="javascript:void(0)" onclick="publish(\'' + row.id + '\', \'' + row.competitionTitle + '\', \'' + row.applyStartTime + '\', \'' + row.applyBeforeTime + '\')"><i class="fa fa-edit"></i>发布</a> ')
+                            actions.push('<a class="btn btn-success btn-xs ' + publisFlag + '" href="javascript:void(0)" onclick="publish(\'' + row.id + '\', \'' + row.competitionTitle + '\', \'' + row.applyStartTime + '\', \'' + row.applyBeforeTime + '\', \'' + row.applyEndTime + '\')"><i class="fa fa-edit"></i>发布</a> ')
                             actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.editToSet(\'' + row.id + '\')"><i class="fa fa-edit"></i>编辑</a> ');
                             actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a>');
                         } else if(row.competitionState === 'competiton_state_4'){
@@ -156,7 +156,7 @@
         $.modal.open("参赛人员名单", prefix+"/openDetails/"+id);
     }
 
-    function publish(id, dataName, applyStartTime, applyBeforeTime){
+    function publish(id, dataName, applyStartTime, applyBeforeTime, applyEndTime){
         table.set();
         $.modal.confirm("确定发布该条" + dataName + "信息吗?<br/>发布后赛事信息无法修改!", function() {
             var url = $.common.isEmpty(id) ? table.options.publishUrl : table.options.publishUrl.replace("{id}", id);
@@ -177,7 +177,7 @@
                 }else if(allowPublishTime <= currentTime){
                     $.modal.alertError("取消报名时间早于当前时间, 请先修改取消报名时间!")
                 }else if(allowPublishTime > currentTime){
-                    var data = { "id": id , "applyStartTime": formatApplyStartTime(allowPublishTime), "allowPublishTime": (startTime.getTime() - beforeTimeMs)/1000};
+                    var data = { "id": id , "applyStartTime": formatApplyStartTime(startTime), "allowPublishTime": (startTime.getTime() - beforeTimeMs)/1000, "applyEndTime":formatApplyStartTime(new Date(applyEndTime))};
                     $.operate.submit(url, "post", "json", data);
                 }
             }

+ 1 - 1
qmjszx-admin/src/main/resources/templates/system/vipCardLog/vipCardLog.html

@@ -84,7 +84,7 @@
                 },
                 {
                     field: 'orderType',
-                    title: '支付方式',
+                    title: '订单类型',
                     formatter: function (value, row, index) {
                         return $.table.selectDictLabel(orderTypeDatas, value);
                     }

+ 5 - 0
qmjszx-business/src/main/java/beilv/admissionticket/service/IAdmissionTicketService.java

@@ -1,6 +1,7 @@
 package beilv.admissionticket.service;
 
 import beilv.admissionticket.domain.AdmissionTicket;
+import beilv.common.core.domain.AjaxResult;
 
 import java.util.List;
 import java.util.Map;
@@ -61,4 +62,8 @@ public interface IAdmissionTicketService {
     Map<String, Object> getThresholdValue(String ticketId);
 
     int confirm(AdmissionTicket beilvAdmissionTicket);
+
+    void createTask(AdmissionTicket AdmissionTicket);
+
+    AjaxResult refund(AdmissionTicket beilvAdmissionTicket);
 }

+ 71 - 12
qmjszx-business/src/main/java/beilv/admissionticket/service/impl/AdmissionTicketServiceImpl.java

@@ -3,19 +3,45 @@ package beilv.admissionticket.service.impl;
 import beilv.admissionticket.domain.AdmissionTicket;
 import beilv.admissionticket.mapper.AdmissionTicketMapper;
 import beilv.admissionticket.service.IAdmissionTicketService;
+import beilv.common.core.domain.AjaxResult;
 import beilv.common.core.text.Convert;
+import beilv.common.utils.DateUtils;
+import beilv.competition.domain.RedisTask;
+import beilv.vipCardLog.domain.VipCardLog;
+import beilv.vipCardLog.mapper.VipCardLogMapper;
+import beilv.vipCardLog.service.IVipCardLogService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
+import static beilv.competition.domain.Constant.TASK_QUEUE_APPLY;
+import static beilv.competition.domain.Constant.TICKET_QUEUE;
+
 @Service
 public class AdmissionTicketServiceImpl implements IAdmissionTicketService {
 
     @Autowired
     private AdmissionTicketMapper ticketMapper;
 
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
+    @Autowired
+    private VipCardLogMapper vipCardLogMapper;
+
+    @Autowired
+    private StringRedisTemplate stringRedisTemplate;
+
+    @Autowired
+    private IVipCardLogService vipCardLogService;
+
     @Override
     public int insertAdmissionTicketToList(List<AdmissionTicket> ticketList) {
         return ticketMapper.insertAdmissionTicketToList(ticketList);
@@ -31,8 +57,7 @@ public class AdmissionTicketServiceImpl implements IAdmissionTicketService {
      * @return 约球购票
      */
     @Override
-    public AdmissionTicket selectBeilvAdmissionTicketById(String id)
-    {
+    public AdmissionTicket selectBeilvAdmissionTicketById(String id) {
         return beilvAdmissionTicketMapper.selectBeilvAdmissionTicketById(id);
     }
 
@@ -43,8 +68,7 @@ public class AdmissionTicketServiceImpl implements IAdmissionTicketService {
      * @return 约球购票
      */
     @Override
-    public List<AdmissionTicket> selectBeilvAdmissionTicketList(AdmissionTicket AdmissionTicket)
-    {
+    public List<AdmissionTicket> selectBeilvAdmissionTicketList(AdmissionTicket AdmissionTicket) {
         return beilvAdmissionTicketMapper.selectBeilvAdmissionTicketList(AdmissionTicket);
     }
 
@@ -55,8 +79,7 @@ public class AdmissionTicketServiceImpl implements IAdmissionTicketService {
      * @return 结果
      */
     @Override
-    public int insertBeilvAdmissionTicket(AdmissionTicket AdmissionTicket)
-    {
+    public int insertBeilvAdmissionTicket(AdmissionTicket AdmissionTicket) {
         return beilvAdmissionTicketMapper.insertBeilvAdmissionTicket(AdmissionTicket);
     }
 
@@ -67,8 +90,7 @@ public class AdmissionTicketServiceImpl implements IAdmissionTicketService {
      * @return 结果
      */
     @Override
-    public int updateBeilvAdmissionTicket(AdmissionTicket AdmissionTicket)
-    {
+    public int updateBeilvAdmissionTicket(AdmissionTicket AdmissionTicket) {
         return beilvAdmissionTicketMapper.updateBeilvAdmissionTicket(AdmissionTicket);
     }
 
@@ -79,8 +101,7 @@ public class AdmissionTicketServiceImpl implements IAdmissionTicketService {
      * @return 结果
      */
     @Override
-    public int deleteBeilvAdmissionTicketByIds(String ids)
-    {
+    public int deleteBeilvAdmissionTicketByIds(String ids) {
         return beilvAdmissionTicketMapper.deleteBeilvAdmissionTicketByIds(Convert.toStrArray(ids));
     }
 
@@ -91,8 +112,7 @@ public class AdmissionTicketServiceImpl implements IAdmissionTicketService {
      * @return 结果
      */
     @Override
-    public int deleteBeilvAdmissionTicketById(String id)
-    {
+    public int deleteBeilvAdmissionTicketById(String id) {
         return beilvAdmissionTicketMapper.deleteBeilvAdmissionTicketById(id);
     }
 
@@ -108,6 +128,45 @@ public class AdmissionTicketServiceImpl implements IAdmissionTicketService {
 
     @Override
     public int confirm(AdmissionTicket beilvAdmissionTicket) {
+        //手动核销, 修改订单状态为核销
+        VipCardLog vipCardLog = new VipCardLog();
+        vipCardLog.setBusId(beilvAdmissionTicket.getId());
+        vipCardLog.setOrderType("yueqiu");
+        vipCardLog.setVerifyTime(DateUtils.getNowDate());
+        vipCardLog.setPaymentStatus("payment_status_verification");
+        vipCardLogMapper.updateVipCardLogByBusId(vipCardLog);
+
+        //移除定时任务
+        stringRedisTemplate.delete(TICKET_QUEUE+beilvAdmissionTicket.getId());
+
+        //修改场次状态为核销
         return beilvAdmissionTicketMapper.updateBeilvAdmissionTicket(beilvAdmissionTicket);
     }
+
+    @Override
+    public AjaxResult refund(AdmissionTicket beilvAdmissionTicket) {
+        VipCardLog vipCardLog = new VipCardLog();
+        vipCardLog.setBusId(beilvAdmissionTicket.getId());
+        return vipCardLogService.refundById(vipCardLog, false);
+    }
+
+    @Override
+    public void createTask(AdmissionTicket AdmissionTicket){
+        AdmissionTicket admissionTicket = beilvAdmissionTicketMapper.selectBeilvAdmissionTicketById(AdmissionTicket.getId());
+        Date ticketDate = admissionTicket.getTicketDate(); //2025-11-14
+        String session = admissionTicket.getSession().split("-")[0] + ":00"; //10:00:00
+
+        // 将日期和时间拼接成一个字符串
+        String dateTimeStr = ticketDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate() + " " + session;
+
+        // 使用 DateTimeFormatter 解析字符串为 LocalDateTime 对象
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, formatter);
+
+        // 获取到期时间
+        long timestamp = dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+        //约场后, 开启定时任务.
+        RedisTask redisTaskApply = new RedisTask(admissionTicket.getId(),"4","payment_status_verification");
+        redisTemplate.opsForZSet().add(TICKET_QUEUE + admissionTicket.getId(), redisTaskApply.toString(), timestamp/1000);
+    }
 }

+ 1 - 1
qmjszx-business/src/main/java/beilv/competition/domain/Competition.java

@@ -26,7 +26,7 @@ public class Competition extends BaseEntity {
     /**
      * id
      */
-    private Integer id;
+    private String id;
 
     /**
      * 活动标题

+ 3 - 0
qmjszx-business/src/main/java/beilv/competition/domain/Constant.java

@@ -9,6 +9,9 @@ public class Constant {
     public static final String TASK_QUEUE_QUERY_START = "competition_start:*";
     public static final String TASK_QUEUE_QUERY_END = "competition_end:*";
 
+    public static final String TICKET_QUEUE = "ticket:";
+    public static final String TICKET_QUEUE_ALL = "ticket:*";
+
     public Constant() {
     }
 }

+ 1 - 1
qmjszx-business/src/main/java/beilv/competition/domain/RedisTask.java

@@ -13,7 +13,7 @@ import java.util.Date;
 @AllArgsConstructor
 @NoArgsConstructor
 public class RedisTask {
-    private Integer competitionId;
+    private String competitionId;
     private String competitionState;
     private String paymentStatus;
 

+ 27 - 27
qmjszx-business/src/main/java/beilv/competition/service/impl/CompetitionServiceImpl.java

@@ -40,30 +40,30 @@ public class CompetitionServiceImpl implements ICompetitionService {
     private final static String BAO_MING_JIE_SHU = "competiton_state_3";
     private final static String YI_GUAN_BI = "competiton_state_4";
 
-    @PostConstruct
-    public void init() {
-        // 找到所有报名中的赛事
-        Competition competition = new Competition();
-        competition.setCompetitionState(BAO_MING_ZHONG);
-        List<Competition> competitionList = this.selectCompetitionList(competition);
-        competitionList.forEach(item -> {
-            Date date = new Date(item.getApplyStartTime().getTime() - (long) (item.getApplyBeforeTime() * 60 * 60 * 1000));
-            if (new Date().getTime() >= date.getTime()) {
-                item.setCompetitionState(BAO_MING_JIE_SHU);
-                competitionMapper.updateCompetition(item);
-
-                Stadium stadium = new Stadium();
-                stadium.setCompetitionId(String.valueOf(item.getId()));
-                stadium.setPaymentStatus("payment_status_verification");
-                stadium.setVerificationTime(new Date());
-
-                competitionMapper.updateBookARace(stadium);
-            } else {
-                Timer timer = new Timer();
-                timer.schedule(new CloseReg(competitionMapper, item.getId()), date);
-            }
-        });
-    }
+//    @PostConstruct
+//    public void init() {
+//        // 找到所有报名中的赛事
+//        Competition competition = new Competition();
+//        competition.setCompetitionState(BAO_MING_ZHONG);
+//        List<Competition> competitionList = this.selectCompetitionList(competition);
+//        competitionList.forEach(item -> {
+//            Date date = new Date(item.getApplyStartTime().getTime() - (long) (item.getApplyBeforeTime() * 60 * 60 * 1000));
+//            if (new Date().getTime() >= date.getTime()) {
+//                item.setCompetitionState(BAO_MING_JIE_SHU);
+//                competitionMapper.updateCompetition(item);
+//
+//                Stadium stadium = new Stadium();
+//                stadium.setCompetitionId(String.valueOf(item.getId()));
+//                stadium.setPaymentStatus("payment_status_verification");
+//                stadium.setVerificationTime(new Date());
+//
+//                competitionMapper.updateBookARace(stadium);
+//            } else {
+//                Timer timer = new Timer();
+//                timer.schedule(new CloseReg(competitionMapper, item.getId()), date);
+//            }
+//        });
+//    }
 
     /**
      * 查询赛事发布
@@ -149,10 +149,10 @@ public class CompetitionServiceImpl implements ICompetitionService {
         redisTemplate.opsForZSet().add(TASK_QUEUE_APPLY + competition.getId(), redisTaskApply.toString(), competition.getAllowPublishTime());
 
         RedisTask redisTaskStart = new RedisTask(competition.getId(),"competiton_state_5","payment_status_verification");
-        redisTemplate.opsForZSet().add(TASK_QUEUE_START + competition.getId(), redisTaskStart.toString(), competition.getApplyStartTime().getTime());
+        redisTemplate.opsForZSet().add(TASK_QUEUE_START + competition.getId(), redisTaskStart.toString(), competition.getApplyStartTime().getTime()/1000);
 
         RedisTask redisTaskEnd = new RedisTask(competition.getId(),"competiton_state_6","");
-        redisTemplate.opsForZSet().add(TASK_QUEUE_END + competition.getId(), redisTaskEnd.toString(), competition.getApplyEndTime().getTime());
+        redisTemplate.opsForZSet().add(TASK_QUEUE_END + competition.getId(), redisTaskEnd.toString(), competition.getApplyEndTime().getTime()/1000);
 
         return competitionMapper.publishCompetition(competition);
     }
@@ -163,7 +163,7 @@ public class CompetitionServiceImpl implements ICompetitionService {
         if (competitionMapper.selectStadumIsOpenById(id)) {
             //修改赛事状态
             Competition competition = new Competition();
-            competition.setId(Integer.valueOf(id));
+            competition.setId(id);
             competition.setCompetitionState(YI_GUAN_BI);
             return competitionMapper.publishCompetition(competition);
         } else {

+ 55 - 0
qmjszx-business/src/main/java/beilv/competition/task/RedisTaskChecker.java

@@ -1,5 +1,7 @@
 package beilv.competition.task;
 
+import beilv.admissionticket.domain.AdmissionTicket;
+import beilv.admissionticket.mapper.AdmissionTicketMapper;
 import beilv.common.utils.DateUtils;
 import beilv.competition.domain.Competition;
 import beilv.competition.domain.RedisTask;
@@ -37,6 +39,9 @@ public class RedisTaskChecker {
     @Resource
     private VipCardLogMapper vipCardLogMapper;
 
+    @Resource
+    private AdmissionTicketMapper ticketMapper;
+
     /**
      * 检测到期任务, 并将消息发布
      */
@@ -165,6 +170,56 @@ public class RedisTaskChecker {
             }
         }
     }
+
+
+    @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);
+
+                            //修改订单状态为核销
+                            VipCardLog vipCardLog = new VipCardLog();
+                            vipCardLog.setBusId(String.valueOf(task.getCompetitionId()));
+                            vipCardLog.setOrderType("yueqiu");
+                            vipCardLog.setVerifyTime(DateUtils.getNowDate());
+                            vipCardLog.setPaymentStatus(task.getPaymentStatus());
+                            vipCardLogMapper.updateVipCardLogByBusId(vipCardLog);
+
+                            //修改场次状态为核销
+                            AdmissionTicket admissionTicket = new AdmissionTicket();
+                            admissionTicket.setId(task.getCompetitionId());
+                            admissionTicket.setAdmissionTicketStatus(task.getCompetitionState());
+                            ticketMapper.updateBeilvAdmissionTicket(admissionTicket);
+
+                            // 移除当前已发布的任务
+                            stringRedisTemplate.opsForZSet().remove(key, taskJson);
+                            System.out.println("Removed task: " + taskJson);
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void removeTaskByKey(String zKey){
+        stringRedisTemplate.delete(zKey);
+    }
 }
 
 

+ 2 - 0
qmjszx-business/src/main/java/beilv/vipCardLog/mapper/VipCardLogMapper.java

@@ -68,4 +68,6 @@ public interface VipCardLogMapper {
     List<Map<String, Object>> selectCanSaiList(VipCardLog vipCardLog);
 
     void updateVipCardLogByBusId(VipCardLog vipCardLog);
+
+    VipCardLog selectVipCardLogByBusId(String busId);
 }

+ 1 - 1
qmjszx-business/src/main/java/beilv/vipCardLog/service/IVipCardLogService.java

@@ -68,7 +68,7 @@ public interface IVipCardLogService {
 
     int getRegistrantsNumber(VipCardLog vipCardLog);
 
-    AjaxResult refundById(VipCardLog vipCardLog);
+    AjaxResult refundById(VipCardLog vipCardLog, boolean isOnline);
 
     List<Map<String, Object>> selectYueQiuList(VipCardLog vipCardLog);
 

+ 46 - 8
qmjszx-business/src/main/java/beilv/vipCardLog/service/impl/VipCardLogServiceImpl.java

@@ -6,13 +6,12 @@ import beilv.admissionticket.service.IAdmissionTicketService;
 import beilv.carinformation.domain.CarInformation;
 import beilv.carinformation.service.ICarInformationService;
 import beilv.common.core.domain.AjaxResult;
-import beilv.common.core.page.TableDataInfo;
 import beilv.common.core.text.Convert;
 import beilv.common.utils.DateUtils;
 import beilv.common.utils.StringUtils;
-import beilv.common.utils.uuid.IdUtils;
 import beilv.competition.domain.Competition;
 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;
@@ -25,11 +24,12 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.util.List;
 import java.util.Map;
 
-import static beilv.common.utils.PageUtils.startPage;
-
 /**
  * 充值记录Service业务层处理
  *
@@ -54,7 +54,11 @@ public class VipCardLogServiceImpl implements IVipCardLogService {
     private ICarInformationService carInformationService;
 
     @Autowired
-    private AdmissionTicketMapper ticketMapper;
+    private IAdmissionTicketService ticketService;
+
+    @Autowired
+    private ISysConfigService configService;
+
 
     /**
      * 查询充值记录
@@ -179,13 +183,19 @@ public class VipCardLogServiceImpl implements IVipCardLogService {
                 //购卡订单, 支付成功, 生成卡片写入到次卡表
                 userMembershipCardService.insertUserMembershipCard(new UserMembershipCard(orderInfo.getUserId(), vipCardLog.getId(), carInformation.getTotalNumber(), "0", "3", DateUtils.getNowDate()));
             }
+
+            if("yueqiu".equals(orderType)){
+                AdmissionTicket admissionTicket = new AdmissionTicket();
+                admissionTicket.setId(orderInfo.getBusId());
+                ticketService.createTask(admissionTicket);
+            }
         } else if ("payment_status_cancelled".equals(vipCardLog.getPaymentStatus())) {
             vipCardLog.setCancellationTime(DateUtils.getNowDate());
             if ("yueqiu".equals(orderInfo.getOrderType())) {
                 AdmissionTicket admissionTicket = new AdmissionTicket();
                 admissionTicket.setId(orderInfo.getBusId());
                 admissionTicket.setAdmissionTicketStatus("0");
-                ticketMapper.updateBeilvAdmissionTicket(admissionTicket);
+                ticketService.updateBeilvAdmissionTicket(admissionTicket);
             }
         }
     }
@@ -196,9 +206,14 @@ public class VipCardLogServiceImpl implements IVipCardLogService {
     }
 
     @Override
-    public AjaxResult refundById(VipCardLog vipCardLog) {
+    public AjaxResult refundById(VipCardLog vipCardLog, boolean isOnline) {
         //拉去订单信息
-        VipCardLog orderInfo = vipCardLogMapper.selectVipCardLogById(vipCardLog.getId());
+        VipCardLog orderInfo;
+        if(StringUtils.isNotEmpty(vipCardLog.getId())){
+            orderInfo =  vipCardLogMapper.selectVipCardLogById(vipCardLog.getId());
+        }else{
+            orderInfo = vipCardLogMapper.selectVipCardLogByBusId(vipCardLog.getBusId());
+        }
 
         if ("payment_status_to_be_paid".equals(orderInfo.getPaymentStatus())) {
             return AjaxResult.error("订单未支付, 无需退款!");
@@ -223,6 +238,29 @@ public class VipCardLogServiceImpl implements IVipCardLogService {
 
         if ("yueqiu".equals(orderInfo.getOrderType())) {
 
+            if(isOnline){
+                //获取设定的取消时间范围(分钟)
+                long cancelMinutes = Long.parseLong(configService.selectConfigByKey("cancel.minutes"));
+                //根据订单获取约场的开始时间
+                AdmissionTicket admissionTicket = ticketService.selectBeilvAdmissionTicketById(orderInfo.getBusId());
+                String startTime = admissionTicket.getSession().split("-")[0]; // 10:00
+
+                // 当前时间
+                LocalDateTime now = LocalDateTime.now();
+
+                // 将 startTime 转换为 LocalDateTime
+                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
+                LocalDateTime startDateTime = LocalDateTime.of(now.toLocalDate(), LocalDateTime.parse(startTime, formatter).toLocalTime());
+
+                // 计算 startTime 减去 cancelMinutes 后的时间
+                LocalDateTime cancelTime = startDateTime.minus(cancelMinutes, ChronoUnit.MINUTES);
+
+                //判断当前时间是否可以退款
+                if(now.isBefore(cancelTime)){
+                    return AjaxResult.error("距离开场仅剩"+cancelMinutes+"分钟, 不允许线上退款!如需退款请线下联系工作人员!");
+                }
+            }
+
             if ("numCard".equals(orderInfo.getPaymentType())) {
                 refundSum++;
             } else {

+ 1 - 8
qmjszx-business/src/main/resources/mapper/card/UserMembershipCardMapper.xml

@@ -33,24 +33,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             b.username,
             b.mobile,
             a.record_id,
-            c.card_name cardName,
-            c.total_number,
             a.remaining_number,
-            a.state,
-            c.card_type
+            a.state
         FROM
             user_membership_card a
             left join sys_member b on a.user_id = b.id
-            left join card_purchase_record c on a.record_id = c.id
         <where>
             <if test="userId != null  and userId != ''"> and a.user_id = #{userId}</if>
             <if test="recordId != null  and recordId != ''"> and a.record_id = #{recordId}</if>
-            <if test="totalNumber != null "> and c.total_number = #{totalNumber}</if>
             <if test="remainingNumber != null "> and a.remaining_number = #{remainingNumber}</if>
             <if test="version != null  and version != ''"> and a.version = #{version}</if>
             <if test="mobile != null  and mobile != ''"> and b.mobile like concat('%', #{mobile}, '%')</if>
-            <if test="cardName != null  and cardName != ''"> and c.card_name like concat('%', #{cardName}, '%')</if>
-            <if test="cardType != null  and cardType != ''"> and c.card_type = #{cardType}</if>
             <if test="state != null  and state != ''">
                 <choose>
                     <when test="state == 'hasClubCard'">

+ 6 - 1
qmjszx-business/src/main/resources/mapper/vipCardLog/VipCardLogMapper.xml

@@ -177,7 +177,7 @@
         left join beilv_venue d on b.venue_id = d.id
         <where>
             and (payment_status = 'payment_status_have_paid' or payment_status = 'payment_status_verification')
-            <if test="userId ! =null and userId ! =''">
+            <if test="userId != null and userId != ''">
                 and a.user_id = #{userId}
             </if>
         </where>
@@ -231,4 +231,9 @@
         where order_type = #{orderType} and bus_id = #{busId}
     </update>
 
+    <select id="selectVipCardLogByBusId" parameterType="String" resultMap="VipCardLogResult">
+        <include refid="selectVipCardLogVo"/>
+        where bus_id = #{busId}
+    </select>
+
 </mapper>