Explorar el Código

车票补偿天数记录

zoujiajian hace 9 meses
padre
commit
99fb84b8b0

+ 4 - 0
netflix-dao/src/main/java/com/cyksj/mapper/claudecode/ClaudeCodeDeductOrderRelateMapper.java

@@ -2,6 +2,9 @@ package com.cyksj.mapper.claudecode;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.entity.ClaudeCodeDeductOrderRelate;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 项目名: yhlxj11111111
@@ -10,4 +13,5 @@ import com.cyksj.model.entity.ClaudeCodeDeductOrderRelate;
  * 创建时间:2025/10/15 10:43
  */
 public interface ClaudeCodeDeductOrderRelateMapper extends BaseMapper<ClaudeCodeDeductOrderRelate> {
+	Integer selectDeductUpgradeRelation(@Param("relationId") Long relationId, @Param("userIds") List<Long> userIdList);
 }

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GroupsRelation.java

@@ -218,6 +218,11 @@ public class GroupsRelation extends BaseEntity {
      */
     private Integer reservedDays;
 
+    /**
+     * 补偿 天数
+     */
+    private Integer compensationDays;
+
 	@AllArgsConstructor
     @Getter
     public enum Status{

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/model/views/OrderDonUserRefundDetailView.java

@@ -2,6 +2,7 @@ package com.cyksj.model.views;
 
 import com.cyksj.model.entity.OrderDon;
 import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
@@ -26,6 +27,18 @@ public class OrderDonUserRefundDetailView {
 	@DbField("count(if(status = 'refund',1,NULL))")
 	private Integer refundOrders;
 
+	/**
+	 * 订单对应车票剩余时长
+	 */
+	@DbIgnore
+	private Integer remainsDays;
+
+	/**
+	 * 车票补偿时长
+	 */
+	@DbIgnore
+	private Integer compensationDays;
+
 
 	@Getter
 	@Setter

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java

@@ -137,6 +137,9 @@ public class RenewalView {
     @DbField("gr.status")
     private String status;
 
+    @DbField("gr.compensation_days")
+    private Integer compensationDays;
+
     @DbField("a.account")
     private String account;
 

+ 16 - 0
netflix-dao/src/main/resources/mapper/ClaudeCodeDeductOrderRelateMapper.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.cyksj.mapper.claudecode.ClaudeCodeDeductOrderRelateMapper">
+
+    <select id="selectDeductUpgradeRelation" resultType="java.lang.Integer">
+        select count(o.id) from claude_code_deduct_order_relate ccor inner join order_don o on o.id = ccor.order_id
+        and ccor.relation_id = #{relationId}
+        where o.user_id in
+        <foreach collection="userIds" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+        and o.status = 'refund'
+        limit 1
+    </select>
+</mapper>

+ 2 - 1
netflix-dao/src/main/resources/mapper/GroupRelationMapper.xml

@@ -34,7 +34,8 @@
         unfrozen_time = null,
         reserved_days = null,
         recharge_remark = null,
-        is_recover = 0
+        is_recover = 0,
+        compensation_days = 0
         where id = #{entity.id}
         <if test="expireTime != null">
             and expiry_time = #{expireTime}

+ 7 - 1
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -852,6 +852,8 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             newRelation.setGptTaskId(relation.getGptTaskId());
             newRelation.setCardKey(relation.getCardKey());
             newRelation.setGptToken(relation.getGptToken());
+            //补偿时长
+            newRelation.setCompensationDays(relation.getCompensationDays());
 
             //清除原先车票
             relation.setNewRelationId(newRelation.getId());
@@ -1042,7 +1044,11 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                         .eq(UserTicketClearedRecord::getSource, UserTicketClearedRecord.Source.cc_deduct)
                         .gt(UserTicketClearedRecord::getCreatedTime, orderDon.getCreatedTime()));
                 if (selectCount1 > 0) {
-                    throw BusinessRuntimeException.getInstance("车票已被抵扣升级 无法退款");
+                    //抵扣车票对应的 新车票是否已经退款
+                    Integer selectCount = claudeCodeDeductOrderRelateMapper.selectDeductUpgradeRelation(relationId, userIdList);
+                    if (selectCount == 0) {
+                        throw BusinessRuntimeException.getInstance("车票已被抵扣升级 无法退款");
+                    }
                 }
             }
             //虚拟原订单是否已过期

+ 11 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -1241,7 +1241,7 @@ public class CmsOrderController {
 	 * 用户退款详情
 	 */
 	@GetMapping("/get/user/refund/detail")
-	public Result<OrderDonUserRefundDetailView> getUserRefundDetail(Long userId) {
+	public Result<OrderDonUserRefundDetailView> getUserRefundDetail(Long userId, Long orderId) {
 		if (userId == null || userId == 0) {
 			return GatewayResponse.SUCCESS.newBuilder().toResult();
 		}
@@ -1249,6 +1249,7 @@ public class CmsOrderController {
 		try {
 			userIdList = userBindRelationService.getRelationUserIdList(userId, null);
 		} catch (Exception e) {
+			userIdList = List.of(userId);
 		}
 		String userIds = null;
 		if (CollUtil.isNotEmpty(userIdList)) {
@@ -1261,6 +1262,15 @@ public class CmsOrderController {
 			builder.put("uid", String.format(" and user_id = %s", userId));
 		}
 		OrderDonUserRefundDetailView orderDonUserRefundDetailView = beanSearcher.searchFirst(OrderDonUserRefundDetailView.class, builder.build());
+		OrderDon orderDon = orderDonMapper.selectById(orderId);
+		if (orderDon != null && orderDon.getRelationId() != null && orderDon.getRelationId() > 0) {
+			GroupsRelation relation = relationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class).eq(GroupsRelation::getId, orderDon.getRelationId()).in(GroupsRelation::getUserId, userIdList));
+			if (relation != null && relation.getExpiryTime() != null && relation.getExpiryTime().after(DateTime.now())) {
+				Long remainDays = DateUtil.betweenDay(DateTime.now(), relation.getExpiryTime(), false);
+				orderDonUserRefundDetailView.setRemainsDays(remainDays.intValue());
+				orderDonUserRefundDetailView.setCompensationDays(relation.getCompensationDays());
+			}
+		}
 		return GatewayResponse.SUCCESS.newBuilder().toResult(orderDonUserRefundDetailView);
 	}