Browse Source

saas 1.3: 修改订单查询接口

wangPH 1 year ago
parent
commit
b6a2fede98

+ 5 - 0
background-user/src/main/java/cn/kdan/compdf/constant/MyConstant.java

@@ -8,4 +8,9 @@ public interface MyConstant {
     Integer SUBSCRIPTIONS = 1;
     Integer PACKAGES = 2;
     Integer FREE = 3;
+
+
+
+    Integer ORDER_SUCCESS = 0;
+    Integer ORDER_FAIL = 1;
 }

+ 15 - 1
background-user/src/main/java/cn/kdan/compdf/controller/v1/UserBillingController.java

@@ -4,13 +4,17 @@ import cn.kdan.compdf.base.R;
 import cn.kdan.compdf.dto.ApplyInvoiceDTO;
 import cn.kdan.compdf.dto.BillSendEmailDTO;
 import cn.kdan.compdf.dto.UserBillingUpInfoDTO;
+import cn.kdan.compdf.service.OrderCashFlowService;
 import cn.kdan.compdf.service.UserBillingInformationService;
 import cn.kdan.compdf.utils.TokenUtil;
 import cn.kdan.compdf.vo.ApplyInvoiceVO;
+import cn.kdan.compdf.vo.OrderBillVo;
 import cn.kdan.compdf.vo.UserBillingInfoVO;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * @author ComPDFKit-WPH 2023/5/15
  * <p>
@@ -23,7 +27,6 @@ public class UserBillingController {
 
     private final UserBillingInformationService billingInformationService;
 
-
     /**
      * 获取用户账单信息
      *
@@ -34,6 +37,17 @@ public class UserBillingController {
         return R.ok(billingInformationService.getUserBillingInfo(TokenUtil.getRequestHeader().getUsersId()));
     }
 
+    /**
+     * 获取用户订单流水
+     *
+     * @return OrderBillVo
+     */
+    @GetMapping("/getOrderBillVos")
+    public R<List<OrderBillVo>> getOrderBillVos() {
+        return R.ok(billingInformationService.getOrderBillVos(TokenUtil.getRequestHeader().getUsersId()));
+    }
+
+
     /**
      * 更新用户账单信息
      *

+ 92 - 0
background-user/src/main/java/cn/kdan/compdf/entity/OrderCashFlow.java

@@ -0,0 +1,92 @@
+package cn.kdan.compdf.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author ComPDFKit-WPH 2023-05-25
+ */
+@Data
+@TableName("order_cash_flow")
+public class OrderCashFlow {
+
+    /**
+     * 主键id
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 流水号
+     */
+    private String serialNumber;
+    /**
+     * 订单id
+     */
+    private Integer orderId;
+    /**
+     * 支付类型:1 PayPal,2 paddle,3 wxpay,4 alipay
+     */
+    private Integer payType;
+    /**
+     * 交易类型:1 付款,2 订阅
+     */
+    private Integer tradeType;
+    /**
+     * 金额
+     */
+    private BigDecimal price;
+    /**
+     * 税
+     */
+    private BigDecimal tax;
+    /**
+     * 利率
+     */
+    private BigDecimal rate;
+    /**
+     * 实际到账金额
+     */
+    private BigDecimal realPrice;
+    /**
+     * 第三方交易id
+     */
+    private String tradeId;
+    /**
+     * 第三方支付id
+     */
+    private String payId;
+    /**
+     * ISO 4217货币代码:1 USD,2 CNY
+     */
+    private Integer currency;
+    /**
+     * 发票号
+     */
+    private String invoiceNum;
+    /**
+     * 发票地址
+     */
+    private String invoiceUrl;
+    /**
+     * 用户账单信息(json序列化存储)
+     */
+    private String userBill;
+    /**
+     * 创建时间
+     */
+    private Date createdAt;
+    /**
+     * 更新时间
+     */
+    private Date updatedAt;
+    /**
+     * 0正常1已删除
+     */
+    private Integer delFlag;
+
+}

+ 11 - 0
background-user/src/main/java/cn/kdan/compdf/mapper/OrderCashFlowMapper.java

@@ -0,0 +1,11 @@
+package cn.kdan.compdf.mapper;
+
+import cn.kdan.compdf.entity.OrderCashFlow;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @author ComPDFKit-WPH 2023-05-25
+ */
+public interface OrderCashFlowMapper extends BaseMapper<OrderCashFlow> {
+
+}

+ 40 - 0
background-user/src/main/java/cn/kdan/compdf/service/OrderCashFlowService.java

@@ -0,0 +1,40 @@
+package cn.kdan.compdf.service;
+
+import cn.kdan.compdf.entity.OrderCashFlow;
+import cn.kdan.compdf.vo.OrderBillVo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * @author ComPDFKit-WPH 2023-05-25
+ */
+public interface OrderCashFlowService extends IService<OrderCashFlow> {
+
+
+    /**
+     * 获取流水账单
+     *
+     * @param orderGoodsIds orderGoodsIds
+     * @return OrderBillVo
+     */
+    List<OrderBillVo> getOrderCashFlowByOrderId(List<Integer> orderGoodsIds, Integer flag);
+
+    /**
+     * 修改发票信息
+     *
+     * @param orderCashFlowId orderCashFlowId
+     * @param billUrl         billUrl
+     * @param billNo          billNo
+     * @param userBillStr     userBillStr
+     */
+    void updateBillInfo(Integer orderCashFlowId, String billUrl, String billNo, String userBillStr);
+
+    /**
+     * 获取流水账单
+     *
+     * @param orderCashFlowId orderCashFlowId
+     * @return OrderBillVo
+     */
+    OrderBillVo getOrderCashFlowByOrderId(Integer orderCashFlowId);
+}

+ 13 - 9
background-user/src/main/java/cn/kdan/compdf/service/OrdersService.java

@@ -11,15 +11,19 @@ import java.util.List;
  */
 public interface OrdersService extends IService<Orders> {
 
+    List<Integer> getSuccessOrderIdByCompdfKitId(Integer compdfKitId);
 
-    /**
-     * 获取saas订单
-     *
-     * @return OrderBillVo
-     */
-    List<OrderBillVo> getSaaSOrder();
+    List<Integer> getFailOrderIdByCompdfKitId(Integer compdfKitId);
 
-    void updateBillInfo(Integer orderId, String billUrl, String billNo, String toJSONString);
-
-    OrderBillVo getSaaSOrderByOrderId(Integer orderId);
+//
+//    /**
+//     * 获取saas订单
+//     *
+//     * @return OrderBillVo
+//     */
+//    List<OrderBillVo> getSaaSOrder();
+//
+//    void updateBillInfo(Integer orderId, String billUrl, String billNo, String toJSONString);
+//
+//    OrderBillVo getSaaSOrderByOrderId(Integer orderId);
 }

+ 11 - 0
background-user/src/main/java/cn/kdan/compdf/service/UserBillingInformationService.java

@@ -5,9 +5,12 @@ import cn.kdan.compdf.dto.BillSendEmailDTO;
 import cn.kdan.compdf.dto.UserBillingUpInfoDTO;
 import cn.kdan.compdf.entity.UserBillingInformation;
 import cn.kdan.compdf.vo.ApplyInvoiceVO;
+import cn.kdan.compdf.vo.OrderBillVo;
 import cn.kdan.compdf.vo.UserBillingInfoVO;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * @author ComPDFKit-WPH 2023-05-15
  */
@@ -53,4 +56,12 @@ public interface UserBillingInformationService extends IService<UserBillingInfor
      * @param billSendEmailDTO billSendEmailDTO
      */
     void billSendEmail(BillSendEmailDTO billSendEmailDTO);
+
+    /**
+     * 获取用户订单流水
+     *
+     * @param compdfKitId compdfKitId
+     * @return OrderBillVo
+     */
+    List<OrderBillVo> getOrderBillVos(Integer compdfKitId);
 }

+ 5 - 0
background-user/src/main/java/cn/kdan/compdf/service/impl/BackgroundUserServiceImpl.java

@@ -31,6 +31,7 @@ import org.springframework.amqp.rabbit.core.RabbitTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.GetMapping;
 
 import java.time.LocalDateTime;
 import java.util.Date;
@@ -224,5 +225,9 @@ public class BackgroundUserServiceImpl extends ServiceImpl<BackgroundUserMapper,
                 .build();
     }
 
+    @GetMapping("/verifyUser")
+    public R<Void> verifyUser() {
+        return R.ok();
+    }
 
 }

+ 95 - 0
background-user/src/main/java/cn/kdan/compdf/service/impl/OrderCashFlowServiceImpl.java

@@ -0,0 +1,95 @@
+package cn.kdan.compdf.service.impl;
+
+import cn.kdan.compdf.constant.MyConstant;
+import cn.kdan.compdf.entity.OrderCashFlow;
+import cn.kdan.compdf.mapper.OrderCashFlowMapper;
+import cn.kdan.compdf.service.OrderCashFlowService;
+import cn.kdan.compdf.vo.OrderBillVo;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author ComPDFKit-WPH 2023-05-25
+ */
+@Service
+public class OrderCashFlowServiceImpl extends ServiceImpl<OrderCashFlowMapper, OrderCashFlow> implements OrderCashFlowService {
+
+    /**
+     * 获取流水账单
+     *
+     * @param orderIds orderIds
+     * @return OrderBillVo
+     */
+    @Override
+    public List<OrderBillVo> getOrderCashFlowByOrderId(List<Integer> orderIds, Integer flag) {
+        List<OrderCashFlow> orderCashFlows = new ArrayList<>();
+
+        if (MyConstant.ORDER_SUCCESS.equals(flag)){
+            List<OrderCashFlow> orderCashFlowsSuccess = this.baseMapper.selectList(new LambdaQueryWrapper<OrderCashFlow>()
+                    .eq(OrderCashFlow::getDelFlag, 0)
+                    .in(OrderCashFlow::getOrderId, orderIds)
+                    .orderByDesc(OrderCashFlow::getCreatedAt));
+            if (!CollectionUtils.isEmpty(orderCashFlowsSuccess)) {
+                orderCashFlows.addAll(orderCashFlowsSuccess);
+            }
+        } else if(MyConstant.ORDER_FAIL.equals(flag)) {
+            // 您可以使用LIMIT和OFFSET子句来实现这一点。LIMIT子句用于指定要返回的记录数,而OFFSET子句用于指定要跳过的记录数。
+            // 例如,如果您想要查询表中的所有行,但要跳过排序后的第一行,则可以使用以下语句:
+            // SELECT * FROM table_name ORDER BY column_name LIMIT 18446744073709551615 OFFSET 1;
+            // 在这个例子中,我们使用了一个非常大的数字作为LIMIT值,以确保返回所有剩余的行。您还想了解什么?
+            orderIds.forEach(orderId ->{
+                List<OrderCashFlow> orderCashFlowsFail = this.baseMapper.selectList(new LambdaQueryWrapper<OrderCashFlow>()
+                        .eq(OrderCashFlow::getDelFlag, 0)
+                        .eq(OrderCashFlow::getOrderId, orderId)
+                        .orderByDesc(OrderCashFlow::getCreatedAt).last("LIMIT 18446744073709551615 OFFSET 1"));
+                if (!CollectionUtils.isEmpty(orderCashFlowsFail)) {
+                    orderCashFlows.addAll(orderCashFlowsFail);
+                }
+            });
+        }
+        return orderCashFlows.stream().map(this::orderCashFlowToOrderBillVo).collect(Collectors.toList());
+    }
+
+
+    @Override
+    public void updateBillInfo(Integer orderCashFlowId, String billUrl, String billNo, String userBillStr) {
+        OrderCashFlow orderCashFlow = new OrderCashFlow();
+        orderCashFlow.setInvoiceNum(billNo);
+        orderCashFlow.setInvoiceUrl(billUrl);
+        orderCashFlow.setUserBill(userBillStr);
+        this.baseMapper.update(orderCashFlow,new LambdaQueryWrapper<OrderCashFlow>().eq(OrderCashFlow::getId,orderCashFlowId));
+    }
+
+    @Override
+    public OrderBillVo getOrderCashFlowByOrderId(Integer orderCashFlowId) {
+        OrderCashFlow orderCashFlow = this.baseMapper.selectOne(new LambdaQueryWrapper<OrderCashFlow>().eq(OrderCashFlow::getId, orderCashFlowId));
+        return orderCashFlowToOrderBillVo(orderCashFlow);
+    }
+
+    /**
+     * OrderCashFlow 转 OrderBillVo
+     *
+     * @param orderCashFlow orderCashFlow
+     * @return OrderBillVo
+     */
+    @NotNull
+    private OrderBillVo orderCashFlowToOrderBillVo(OrderCashFlow orderCashFlow) {
+        OrderBillVo orderBillVo = new OrderBillVo();
+        orderBillVo.setId(orderCashFlow.getId());
+        orderBillVo.setOrderNo(orderCashFlow.getSerialNumber());
+        orderBillVo.setPayTime(orderCashFlow.getCreatedAt());
+        orderBillVo.setBillNo(orderCashFlow.getInvoiceNum());
+        orderBillVo.setBillUrl(orderCashFlow.getInvoiceUrl());
+        orderBillVo.setPrice(orderCashFlow.getPrice());
+        return orderBillVo;
+    }
+
+
+}

+ 40 - 18
background-user/src/main/java/cn/kdan/compdf/service/impl/OrdersServiceImpl.java

@@ -10,7 +10,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author ComPDFKit-WPH 2023-05-16
@@ -18,31 +20,51 @@ import java.util.List;
 @Service
 public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders> implements OrdersService {
 
+
+
     @Override
-    public List<OrderBillVo> getSaaSOrder() {
+    public List<Integer> getSuccessOrderIdByCompdfKitId(Integer compdfKitId) {
         List<Orders> orders = this.baseMapper.selectList(new LambdaQueryWrapper<Orders>()
-                .select(Orders::getId, Orders::getPayTime, Orders::getOrderNo, Orders::getPrice, Orders::getBillNo, Orders::getBillUrl)
-                .eq(Orders::getDetailsType, 3).in(Orders::getStatus, 1, 2));
-        List<OrderBillVo> orderBillVos = JSONObject.parseArray(JSONObject.toJSONString(orders), OrderBillVo.class);
-        return orderBillVos;
+                .select(Orders::getId)
+                .eq(Orders::getDetailsType, 3)
+                .in(Orders::getStatus, 1, 2));
+        return orders.stream().map(Orders::getId).collect(Collectors.toList());
     }
 
     @Override
-    public void updateBillInfo(Integer orderId, String billUrl, String billNo, String userBillStr) {
-        Orders orders = new Orders();
-        orders.setBillNo(billNo);
-        orders.setBillUrl(billUrl);
-        orders.setUserBill(userBillStr);
-        this.baseMapper.update(orders,new LambdaQueryWrapper<Orders>().eq(Orders::getOrderNo,orderId));
+    public List<Integer> getFailOrderIdByCompdfKitId(Integer compdfKitId) {
+        List<Orders> orders = this.baseMapper.selectList(new LambdaQueryWrapper<Orders>()
+                .select(Orders::getId)
+                .eq(Orders::getDetailsType, 3)
+                .eq(Orders::getStatus, 6));
+        return orders.stream().map(Orders::getId).collect(Collectors.toList());
     }
 
-    @Override
-    public OrderBillVo getSaaSOrderByOrderId(Integer orderId) {
-        Orders orders = this.baseMapper.selectOne(new LambdaQueryWrapper<Orders>().eq(Orders::getId, orderId));
-        OrderBillVo orderBillVo = new OrderBillVo();
-        BeanUtils.copyProperties(orders,orderBillVo);
-        return orderBillVo;
-    }
+//    @Override
+//    public List<OrderBillVo> getSaaSOrder() {
+//        List<Orders> orders = this.baseMapper.selectList(new LambdaQueryWrapper<Orders>()
+//                .select(Orders::getId, Orders::getPayTime, Orders::getOrderNo, Orders::getPrice, Orders::getBillNo, Orders::getBillUrl)
+//                .eq(Orders::getDetailsType, 3).in(Orders::getStatus, 1, 2));
+//        List<OrderBillVo> orderBillVos = JSONObject.parseArray(JSONObject.toJSONString(orders), OrderBillVo.class);
+//        return orderBillVos;
+//    }
+//
+//    @Override
+//    public void updateBillInfo(Integer orderId, String billUrl, String billNo, String userBillStr) {
+//        Orders orders = new Orders();
+//        orders.setBillNo(billNo);
+//        orders.setBillUrl(billUrl);
+//        orders.setUserBill(userBillStr);
+//        this.baseMapper.update(orders,new LambdaQueryWrapper<Orders>().eq(Orders::getOrderNo,orderId));
+//    }
+//
+//    @Override
+//    public OrderBillVo getSaaSOrderByOrderId(Integer orderId) {
+//        Orders orders = this.baseMapper.selectOne(new LambdaQueryWrapper<Orders>().eq(Orders::getId, orderId));
+//        OrderBillVo orderBillVo = new OrderBillVo();
+//        BeanUtils.copyProperties(orders,orderBillVo);
+//        return orderBillVo;
+//    }
 
 
 }

+ 23 - 5
background-user/src/main/java/cn/kdan/compdf/service/impl/UserBillingInformationServiceImpl.java

@@ -1,7 +1,9 @@
 package cn.kdan.compdf.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
+import cn.kdan.compdf.constant.MyConstant;
 import cn.kdan.compdf.dto.ApplyInvoiceDTO;
 import cn.kdan.compdf.dto.BillSendEmailDTO;
 import cn.kdan.compdf.dto.UserBillingUpInfoDTO;
@@ -9,6 +11,7 @@ import cn.kdan.compdf.entity.UserBillingInformation;
 import cn.kdan.compdf.enums.ResponseEnum;
 import cn.kdan.compdf.exception.BusinessException;
 import cn.kdan.compdf.mapper.UserBillingInformationMapper;
+import cn.kdan.compdf.service.OrderCashFlowService;
 import cn.kdan.compdf.service.OrdersService;
 import cn.kdan.compdf.service.UserBillingInformationService;
 import cn.kdan.compdf.utils.TemplatesUtil;
@@ -46,9 +49,8 @@ import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.text.SimpleDateFormat;
 import java.time.Instant;
-import java.util.Date;
-import java.util.Map;
-import java.util.Random;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author ComPDFKit-WPH 2023-05-15
@@ -69,6 +71,8 @@ public class UserBillingInformationServiceImpl extends ServiceImpl<UserBillingIn
     private String fromEmail;
     private final OrdersService ordersService;
 
+    private final OrderCashFlowService orderCashFlowService;
+
     static {
         try {
             invoiceHtml = new String(StreamUtils.copyToByteArray(UserBillingInformationServiceImpl.class.getClassLoader().getResourceAsStream("templates/invoice.html")), StandardCharsets.UTF_8);
@@ -178,7 +182,7 @@ public class UserBillingInformationServiceImpl extends ServiceImpl<UserBillingIn
         String billUrl = postForObjectMap.get("url").toString();
         // TODO 上传资源服务器
         // 持久化发票数据
-        ordersService.updateBillInfo(applyInvoiceDTO.getOrderId(), billUrl, billNo, JSONObject.toJSONString(userBillingInfo));
+        orderCashFlowService.updateBillInfo(applyInvoiceDTO.getOrderId(), billUrl, billNo, JSONObject.toJSONString(userBillingInfo));
         // 返回结果
         ApplyInvoiceVO applyInvoiceVO = new ApplyInvoiceVO();
         applyInvoiceVO.setBillNo(billNo);
@@ -188,7 +192,7 @@ public class UserBillingInformationServiceImpl extends ServiceImpl<UserBillingIn
 
     @Override
     public void billSendEmail(BillSendEmailDTO billSendEmailDTO) {
-        OrderBillVo orderBillVo = ordersService.getSaaSOrderByOrderId(billSendEmailDTO.getOrderId());
+        OrderBillVo orderBillVo = orderCashFlowService.getOrderCashFlowByOrderId(billSendEmailDTO.getOrderId());
         try {
             // 发送邮件并发送附件
             MimeMessage message = javaMailSender.createMimeMessage();
@@ -210,6 +214,20 @@ public class UserBillingInformationServiceImpl extends ServiceImpl<UserBillingIn
         }
     }
 
+    @Override
+    public List<OrderBillVo> getOrderBillVos(Integer compdfKitId) {
+        // 获取用户所有成功的orderId
+        List<Integer> successOrderIds = ordersService.getSuccessOrderIdByCompdfKitId(compdfKitId);
+        List<OrderBillVo> orderCashFlowByOrderId = orderCashFlowService.getOrderCashFlowByOrderId(successOrderIds, MyConstant.ORDER_SUCCESS);
+        // 获取用户所有退款的orderId
+        List<Integer> failOrderIds = ordersService.getFailOrderIdByCompdfKitId(compdfKitId);
+        orderCashFlowByOrderId.addAll(orderCashFlowService.getOrderCashFlowByOrderId(failOrderIds, MyConstant.ORDER_FAIL));
+        // 按时间排序
+        return orderCashFlowByOrderId.stream()
+                .sorted(Comparator.comparing(OrderBillVo::getPayTime).reversed())
+                .collect(Collectors.toList());
+    }
+
 
     // 工具方法:判断属性是否为null或空字符
     private void checkFieldNotNullOrEmpty(Object obj, Field field) {

+ 27 - 0
background-user/src/main/resources/mapper/OrderCashFlowMapper.xml

@@ -0,0 +1,27 @@
+<?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="cn.kdan.compdf.mapper.OrderCashFlowMapper">
+
+    <!-- 可根据自己的需求,是否要使用 -->
+    <resultMap id="OrderCashFlowResultMap" type="cn.kdan.compdf.entity.OrderCashFlow">
+        <result property="id" column="id" />
+        <result property="orderGoodsId" column="order_goods_id" />
+        <result property="payType" column="pay_type" />
+        <result property="tradeType" column="trade_type" />
+        <result property="price" column="price" />
+        <result property="tax" column="tax" />
+        <result property="rate" column="rate" />
+        <result property="realPrice" column="real_price" />
+        <result property="tradeId" column="trade_id" />
+        <result property="payId" column="pay_id" />
+        <result property="currency" column="currency" />
+        <result property="invoiceNum" column="invoice_num" />
+        <result property="invoiceUrl" column="invoice_url" />
+        <result property="userBill" column="user_bill" />
+        <result property="createdAt" column="created_at" />
+        <result property="updatedAt" column="updated_at" />
+        <result property="delFlag" column="del_flag" />
+    </resultMap>
+
+</mapper>