ソースを参照

midjourney失效车票退款

zoujiajian 2 年 前
コミット
8e67d59e87

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/request/OrderRefundReq.java

@@ -40,5 +40,7 @@ public class OrderRefundReq {
 	 */
 	private BigDecimal refundBalance;
 
+	private Boolean isOnly;
+
 	private String operator;
 }

+ 10 - 4
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -332,7 +332,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
         String outNo = orderRefundService.centerRefund(refundReq, orderDon);
         orderDon.setRefundDesc(refundReq.getRefundDesc());
         //记录退款信息
-        commonRefund(orderDon, refundReq.getRefundMoney(), refundReq.getOperator(), goodsDon, sku, outNo, refundType);
+        commonRefund(orderDon, refundReq.getRefundMoney(), refundReq.getOperator(), goodsDon, sku, outNo, refundType, refundReq.getIsOnly(), refundReq.getRefundBalance());
         //修改订单状态
         orderDon.setStatus(OrderDon.Status.refund);
         orderDonMapper.updateById(orderDon);
@@ -695,7 +695,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
     /**
      * 退款后 处理关联
      */
-    public void commonRefund(OrderDon orderDon, BigDecimal refundMoney, String operator, GoodsDon goodsDon, GoodsDonSku sku, String outNo, String refundType) {
+    public void commonRefund(OrderDon orderDon, BigDecimal refundMoney, String operator, GoodsDon goodsDon, GoodsDonSku sku, String outNo, String refundType, Boolean isOnly, BigDecimal refundBalance) {
         TASK_POOL.execute(() -> {
             orderRefundService.refundRecord(orderDon, refundMoney, operator, goodsDon, sku, outNo, refundType);
             //退款一次
@@ -710,8 +710,14 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             if (orderDon.getCouponUserId() != 0) {
                 couponFontService.updateOrderDonCouponStatus(orderDon);
             }
+            //退等比例月
+            if (isOnly != null && isOnly) {
+                userBenefitsService.addUserBalance(orderDon.getUserId(), refundBalance, UserBalanceSourceRecord.Source.refund, orderDon.getYhsId());
+                BigDecimal orderDonRefundBalance = Optional.ofNullable(orderDon.getRefundBalance()).orElse(BigDecimal.ZERO);
+                orderDon.setRefundBalance(orderDonRefundBalance.add(refundBalance));
+            }
             //若存在余额支付,退还余额
-            if (orderDon.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+            if (isOnly == null && orderDon.getBalance().compareTo(BigDecimal.ZERO) > 0) {
                 userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getBalance(), UserBalanceSourceRecord.Source.balance, orderDon.getYhsId());
             }
             try {
@@ -725,7 +731,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                 log.error("wx减少抽奖机会错误,orderId:{},error:{}", orderDon.getId(), e);
             }
             if (OrderDon.Type.BALANCE.getType().equals(refundType)) {
-                if (orderDon.getMoney().compareTo(BigDecimal.ZERO) > 0) {
+                if (isOnly == null && orderDon.getMoney().compareTo(BigDecimal.ZERO) > 0) {
                     userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getRefundBalance(), UserBalanceSourceRecord.Source.refund, orderDon.getYhsId());
                 }
             } else {

+ 71 - 7
netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java

@@ -2,6 +2,7 @@ package com.cyksj.web.controller.group;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.thread.ThreadUtil;
@@ -29,16 +30,17 @@ import com.cyksj.model.dto.QuestionnaireView;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.views.GroupsRelationView;
 import com.cyksj.model.request.OrderPayRequest;
+import com.cyksj.model.request.OrderRefundReq;
 import com.cyksj.model.request.SpecialGoodsTicketReq;
 import com.cyksj.model.response.GptStandbyResp;
 import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.chatgpt.ChatGptAuthService;
+import com.cyksj.service.mange.CmsOrderDonService;
 import com.cyksj.service.mange.coupon.CouponCommonService;
 import com.cyksj.service.mange.ticket.TicketAdvertiseConfigClickRecordService;
 import com.cyksj.service.order.OrderDonService;
 import com.cyksj.service.relation.GroupRelationFrontService;
-import com.cyksj.service.sys.SysConfigService;
 import com.cyksj.service.user.UserBindRelationService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.web.util.StpUserUtil;
@@ -52,7 +54,11 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -87,8 +93,6 @@ public class GroupRelationController {
 
     private final RedisService redisService;
 
-    private final UserFuncPropertyMapper userFuncPropertyMapper;
-
     private final DoubleVerifyClickRefreshRecordMapper refreshRecordMapper;
 
     private final QuestionResponseRecordMapper questionResponseRecordMapper;
@@ -107,10 +111,12 @@ public class GroupRelationController {
 
     private final GoodsCoursewareFileMapper goodsCoursewareFileMapper;
 
-    private final SysConfigService sysConfigService;
-
     private final GptTicketStandbyMapper gptTicketStandbyMapper;
 
+    private final CmsOrderDonService cmsOrderDonService;
+
+    private final GoodsDonSkuMapper goodsDonSkuMapper;
+
     private final static Sequence SEQUENCE = new Sequence(0);
 
     @RequestMapping("/get/renewal")
@@ -592,7 +598,7 @@ public class GroupRelationController {
                 .field(RenewalView::getUserId, relationUserIdList).op(Operator.InList)
                 .field(RenewalView::getGoodsId, 26)
                 .field(RenewalView::getAccount, "@yinhe.ac.cn").op(Operator.Contain)
-                .field(RenewalView::getExpiryTime).op(Operator.NotNull)
+                .field(RenewalView::getExpiryTime, DateUtil.offsetDay(DateTime.now(), 10)).op(Operator.GreaterThan)
                 .build());
         GptStandbyResp gptStandbyResp = new GptStandbyResp();
         gptStandbyResp.setIsHasAccount(number.intValue() > 0 ? true : false);
@@ -616,7 +622,7 @@ public class GroupRelationController {
                 .field(RenewalView::getUserId, relationUserIdList).op(Operator.InList)
                 .field(RenewalView::getGoodsId, 26)
                 .field(RenewalView::getAccount, "@yinhe.ac.cn").op(Operator.Contain)
-                .field(RenewalView::getExpiryTime).op(Operator.NotNull)
+                .field(RenewalView::getExpiryTime, DateUtil.offsetDay(DateTime.now(), 10)).op(Operator.GreaterThan)
                 .build());
         if (number.intValue() == 0) {
             throw BusinessRuntimeException.getInstance("你未有车票账号");
@@ -631,4 +637,62 @@ public class GroupRelationController {
         gptTicketStandbyMapper.insert(gptTicketStandby);
         return GatewayResponse.SUCCESS.newBuilder().toResult(number.intValue() > 0 ? true : false);
     }
+
+    /**
+     * midjourney车票退款
+     */
+    @PutMapping("/refund/ticketOrder/{relationId}")
+    @NoSubmit
+    public Result<String> ticketRefundOrders(@PathVariable Long relationId) throws Exception {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        List<Long> relationUserIdList = userBindRelationService.getRelationUserIdList(userId, null);
+        RenewalView renewalView = beanSearcher.searchFirst(RenewalView.class, MapUtils.builder()
+                .field(RenewalView::getRelationId, relationId)
+                .field(RenewalView::getUserId, relationUserIdList).op(Operator.InList)
+                .field(RenewalView::getGoodsId, 26)
+                .field(RenewalView::getAccount, "@yinhe.ac.cn").op(Operator.Contain)
+                .field(RenewalView::getExpiryTime, DateUtil.offsetDay(DateTime.now(), 10)).op(Operator.LessEqual)
+                .build());
+        if (renewalView == null) {
+            throw BusinessRuntimeException.getInstance("你车票不存在或不符合退款要求");
+        }
+        OrderDon orderDon = orderDonService.getOne(Wrappers.lambdaQuery(OrderDon.class)
+                .in(OrderDon::getUserId, relationUserIdList)
+                .eq(OrderDon::getRelationId, relationId)
+                .notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
+                .orderByDesc(OrderDon::getId)
+                .last("limit 1"));
+
+        if (orderDon == null) {
+            throw BusinessRuntimeException.getInstance("你对应车票的订单不存在");
+        }
+        GoodsDonSku sku = goodsDonSkuMapper.selectById(orderDon.getSkuId());
+        if (sku == null) {
+            throw BusinessRuntimeException.getInstance("该车票规格不存在,请联系客服进行人工退款..");
+        }
+        Date expiryTime = renewalView.getExpiryTime();
+        long remainDay = DateUtil.between(DateTime.now(), expiryTime, DateUnit.DAY) + 1;
+        BigDecimal money = orderDon.getMoney();
+        BigDecimal refundMoney = null;
+        BigDecimal refundBalance= null;
+        String refundType = null;
+        if (money.compareTo(BigDecimal.ZERO) > 0) {
+            BigDecimal dayMoney = money.divide(BigDecimal.valueOf(sku.getMonths()).multiply(BigDecimal.valueOf(30)), 2, RoundingMode.HALF_DOWN);
+            refundMoney = BigDecimal.valueOf(remainDay).multiply(dayMoney);
+            refundType = "money";
+        }
+        OrderRefundReq refundReq = new OrderRefundReq();
+        if (orderDon.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+            BigDecimal dayMoney = orderDon.getBalance().divide(BigDecimal.valueOf(sku.getMonths()).multiply(BigDecimal.valueOf(30)), 2, RoundingMode.HALF_DOWN);
+            refundBalance = BigDecimal.valueOf(remainDay).multiply(dayMoney);
+            refundReq.setIsOnly(true);
+        }
+        refundReq.setOrderId(orderDon.getId());
+        refundReq.setRefundDesc("失效车票退款");
+        refundReq.setRefundMoney(Optional.ofNullable(refundMoney).orElse(BigDecimal.ZERO));
+        refundReq.setRefundBalance(Optional.ofNullable(refundBalance).orElse(BigDecimal.ZERO));
+        refundReq.setRefundType(Optional.ofNullable(refundType).orElse("balance"));
+        cmsOrderDonService.unifiedRefund(refundReq);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
 }