소스 검색

Merge branch 'main' of http://47.98.207.247:3000/lsq/ship-ota-server into main

luofeiyun 2 일 전
부모
커밋
80f68d99d0

+ 1 - 0
ship-module-trade/ship-module-trade-api/src/main/java/com/yc/ship/module/trade/enums/ErrorCodeConstants.java

@@ -147,6 +147,7 @@ public interface ErrorCodeConstants {
 
     // ========== 核销 ==========
     ErrorCode ORDER_NOT_EXIST = new ErrorCode(30_100, "订单不存在");
+    ErrorCode ORDER_ISINVOICE = new ErrorCode(30_100, "订单已开票不能修改");
     ErrorCode ORDER_NOT_VOYAGE_CHANGE = new ErrorCode(30_101, "航次不能修改");
     ErrorCode ORDER_NOT_VOYAGE = new ErrorCode(30_101, "航次不能为空");
     ErrorCode USE_DATE_RANGE_ERROR = new ErrorCode(30_102, "使用日期范围不正确");

+ 22 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/report/vo/RefundStatisticsVO.java

@@ -0,0 +1,22 @@
+package com.yc.ship.module.trade.controller.admin.report.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 退款统计 VO
+ *
+ * @author auto-generated
+ */
+@Data
+public class RefundStatisticsVO {
+
+    private LocalDateTime refundTime;
+
+    private BigDecimal refundAmount;
+
+ 
+
+}

+ 13 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeOrderPayMapper.java

@@ -3,10 +3,13 @@ package com.yc.ship.module.trade.dal.mysql.order;
 
 import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeOrderPayDO;
+import com.yc.ship.module.trade.controller.admin.report.vo.RefundStatisticsVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
 
 
 /**
@@ -20,4 +23,14 @@ public interface TradeOrderPayMapper extends BaseMapperX<TradeOrderPayDO> {
     BigDecimal selectHadPayAmount(@Param("orderId") Long orderId);
     TradeOrderPayDO selectPayOrderBySupplierOrderNo(@Param("supplierOrderNo") String supplierOrderNo);
     TradeOrderPayDO getOrderPayType(@Param("orderId") Long orderId);
+
+    /**
+     * 查询退款统计数据(按退款时间分组)
+     *
+     * @param startDateTime 开始时间
+     * @param endDateTime   结束时间
+     * @return 退款统计列表
+     */
+    List<RefundStatisticsVO> selectRefundStatistics(@Param("startDateTime") LocalDateTime startDateTime,
+                                                     @Param("endDateTime") LocalDateTime endDateTime);
 }

+ 6 - 3
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/impl/OtcTradeOrderServiceImpl.java

@@ -332,7 +332,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         if (tradeOrderDO != null && tradeOrderDO.getOrderStatus() == 6) {
             return CommonResult.success(orderId);
         }
-        return CommonResult.error(999, "待轮询");
+        return CommonResult.success( "待轮询");
     }
 
     @Override
@@ -341,7 +341,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         if (tradeOrderDO != null && tradeOrderDO.getDeposiStatus() == 2) {
             return CommonResult.success(orderId);
         }
-        return CommonResult.error(999, "待轮询");
+        return CommonResult.success("待轮询");
     }
 
     @Override
@@ -350,7 +350,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         if (tradeOrderDO != null && tradeOrderDO.getIsSupplementary() == 2) {
             return CommonResult.success(orderId);
         }
-        return CommonResult.error(999, "待轮询");
+        return CommonResult.success("待轮询");
     }
 
     @Override
@@ -1971,6 +1971,9 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         if (tradeOrderDO == null) {
             return CommonResult.error(ORDER_NOT_EXIST);
         }
+        if (tradeOrderDO.getIsInvoice() != null && tradeOrderDO.getIsInvoice() == 1) {
+            return CommonResult.error(ORDER_ISINVOICE);
+        }
         int auditType = 0;
         String orderNo = tradeOrderDO.getOrderNo();
         Long oldvoyageId = tradeOrderDO.getVoyageId();

+ 5 - 5
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/pay/impl/TradeOrderPayServiceImpl.java

@@ -242,7 +242,7 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
                             Asserts.isTrue(false, "补差价已支付,不要重复操作");
                         } else {
                             //2.创建定金支付交易单
-                            payOrderReqVO.setPayAmount(tradeOrder.getSupplementAmount());
+                            payOrderReqVO.setPayAmount(tradeOrder.getSupplementAmount().abs());
                             TradeOrderPayDO tradeOrderPayDO = buildOrderPay(tradeOrder, payOrderReqVO);
                             tradeOrderPayDO.setOrderType(PAY_ORDER_TYPE_BC);
                             payOrderReqVO.setStoreId(tradeOrder.getStoreId());
@@ -803,7 +803,7 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
     @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ORDER_DEPOSI_PAY)
     public void updateDeposiOrderPaid(TradeOrderDO tradeOrderDO, TradeOrderPayDO tradeOrderPayDO) {
         Integer orderStatus = tradeOrderDO.getOrderStatus();
-        BigDecimal realPayAmount = (tradeOrderDO.getRealPayAmount()==null?BigDecimal.ZERO:tradeOrderDO.getRealPayAmount()).add(tradeOrderDO.getDeposi());
+        BigDecimal realPayAmount = (tradeOrderDO.getRealPayAmount()==null?BigDecimal.ZERO:tradeOrderDO.getRealPayAmount()).add(tradeOrderPayDO.getPayAmount());
         tradeOrderMapper.update(new LambdaUpdateWrapper<TradeOrderDO>()
                 .eq(TradeOrderDO::getId, tradeOrderDO.getId())
                 .set(TradeOrderDO::getRealPayAmount, realPayAmount)
@@ -817,7 +817,7 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
     @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ORDER_BC_PAY)
     public void updateBcOrderPaid(TradeOrderDO tradeOrderDO, TradeOrderPayDO tradeOrderPayDO) {
         Integer orderStatus = tradeOrderDO.getOrderStatus();
-        BigDecimal realPayAmount = (tradeOrderDO.getRealPayAmount()==null?BigDecimal.ZERO:tradeOrderDO.getRealPayAmount()).add(tradeOrderDO.getSupplementAmount());
+        BigDecimal realPayAmount = (tradeOrderDO.getRealPayAmount()==null?BigDecimal.ZERO:tradeOrderDO.getRealPayAmount()).add(tradeOrderPayDO.getPayAmount());
         tradeOrderMapper.update(new LambdaUpdateWrapper<TradeOrderDO>()
                 .eq(TradeOrderDO::getId, tradeOrderDO.getId())
                 .set(TradeOrderDO::getRealPayAmount, realPayAmount)
@@ -988,7 +988,7 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
         TradeMchInfoDO tradeMchInfoDO = tradeOrderRepositoryService.getByMchId(mchId);
         Asserts.isTrue(tradeMchInfoDO != null, "未配置商户号信息{}", tradeMchInfoDO);
         //根据支付方式获取channelId
-        String name = tradeOrderPayDO.getOrderType() == PAY_ORDER_TYPE_DEPOSI ? SellMethodEnum.valueOf(tradeOrderPayDO.getSellMethod()).name() : PaySourceEnum.valueOf(tradeOrderPayDO.getSellMethod()).name();
+        String name = SellMethodEnum.valueOf(tradeOrderPayDO.getSellMethod()).name();
         String channelId = getChannelIdByPayType(tradeOrderPayDO.getOrderType(), name, PayTypeEnum.valueOf(tradeOrderPayDO.getPaymentType()), payOrderReqVO.getPayExtraType());
         if (tradeMchInfoDO != null) {
             tradeOrderPayDO.setMerchantNo(tradeMchInfoDO.getMchId());
@@ -1034,7 +1034,7 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
         TradeMchInfoDO tradeMchInfoDO = tradeOrderRepositoryService.getByMchId(mchId);
         Asserts.isTrue(tradeMchInfoDO != null, "未配置商户号信息{}", tradeMchInfoDO);
         //根据支付方式获取channelId
-        String name = tradeOrderPayDO.getOrderType() == PAY_ORDER_TYPE_TRADE ? SellMethodEnum.valueOf(tradeOrderPayDO.getSellMethod()).name() : PaySourceEnum.valueOf(tradeOrderPayDO.getSellMethod()).name();
+        String name = SellMethodEnum.valueOf(tradeOrderPayDO.getSellMethod()).name();
         String channelId = getChannelIdByPayType(tradeOrderPayDO.getOrderType(), name, PayTypeEnum.valueOf(tradeOrderPayDO.getPaymentType()), payOrderReqVO.getPayExtraType());
         if (tradeMchInfoDO != null) {
             tradeOrderPayDO.setMerchantNo(tradeMchInfoDO.getMchId());

+ 28 - 7
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/report/impl/BankStatementReportServiceImpl.java

@@ -9,6 +9,7 @@ import com.yc.ship.module.trade.controller.admin.report.vo.BankStatementReportPa
 import com.yc.ship.module.trade.controller.admin.report.vo.BankStatementReportRespVO;
 import com.yc.ship.module.trade.dal.dataobject.bill.BillDO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeOrderPayDO;
+import com.yc.ship.module.trade.controller.admin.report.vo.RefundStatisticsVO;
 import com.yc.ship.module.trade.dal.mysql.bill.BillMapper;
 import com.yc.ship.module.trade.dal.mysql.order.TradeOrderPayMapper;
 import com.yc.ship.module.trade.service.report.BankStatementReportService;
@@ -81,7 +82,7 @@ public class BankStatementReportServiceImpl implements BankStatementReportServic
 
         // 3.1 批量查询账单还款数据 - 按日期分组汇总
         LambdaQueryWrapper<BillDO> billWrapper = new LambdaQueryWrapper<>();
-        billWrapper.eq(BillDO::getBillStatus, 1)
+        billWrapper.in(BillDO::getBillStatus, 1,2)
                 .between(BillDO::getPayTime, startDateTime, endDateTime)
                 .select(BillDO::getPayTime, BillDO::getPayAmount); // 只查询必要字段
         List<BillDO> billList = billMapper.selectList(billWrapper);
@@ -89,22 +90,26 @@ public class BankStatementReportServiceImpl implements BankStatementReportServic
         // 3.2 批量查询预存款充值数据
         LambdaQueryWrapper<TradeOrderPayDO> depositWrapper = new LambdaQueryWrapper<>();
         depositWrapper.eq(TradeOrderPayDO::getPayStatus, 1)
-                .eq(TradeOrderPayDO::getOrderType, 1)
+                .eq(TradeOrderPayDO::getPaymentType, 5)
                 .between(TradeOrderPayDO::getPaymentDate, startDateTime, endDateTime)
                 .select(TradeOrderPayDO::getPaymentDate, TradeOrderPayDO::getPayAmount);
         List<TradeOrderPayDO> depositList = tradeOrderPayMapper.selectList(depositWrapper);
 
-        // 3.3 批量查询订单支付数据
+        // 3.3 批量查询订单支付数据(需减去退款金额,计算净支付)
         LambdaQueryWrapper<TradeOrderPayDO> orderWrapper = new LambdaQueryWrapper<>();
         orderWrapper.eq(TradeOrderPayDO::getPayStatus, 1)
-                .eq(TradeOrderPayDO::getOrderType, 0)
+                .in(TradeOrderPayDO::getPaymentType, 1,2,3)
                 .between(TradeOrderPayDO::getPaymentDate, startDateTime, endDateTime)
                 .select(TradeOrderPayDO::getPaymentDate, TradeOrderPayDO::getPayAmount);
         List<TradeOrderPayDO> orderPaymentList = tradeOrderPayMapper.selectList(orderWrapper);
 
+        // 3.4 批量查询退款数据(关联trade_order_pay和trade_refund,按退款时间分组)
+        List<RefundStatisticsVO> refundList = tradeOrderPayMapper.selectRefundStatistics(startDateTime, endDateTime);
+
         // 4. 按日期分组并计算统计数据
         Map<LocalDate, BigDecimal> billMap = groupByDateAndSum(billList, BillDO::getPayTime, BillDO::getPayAmount);
         Map<LocalDate, BigDecimal> depositMap = groupByDateAndSum(depositList, TradeOrderPayDO::getPaymentDate, TradeOrderPayDO::getPayAmount);
+        Map<LocalDate, BigDecimal> refundMap = groupByDateAndSumRefund(refundList);
         Map<LocalDate, BigDecimal> orderMap = groupByDateAndSum(orderPaymentList, TradeOrderPayDO::getPaymentDate, TradeOrderPayDO::getPayAmount);
 
         // 5. 构建结果列表
@@ -115,14 +120,15 @@ public class BankStatementReportServiceImpl implements BankStatementReportServic
 
             BigDecimal billRepayment = billMap.getOrDefault(tradeDate, BigDecimal.ZERO);
             BigDecimal depositRecharge = depositMap.getOrDefault(tradeDate, BigDecimal.ZERO);
+            BigDecimal refundAmount = refundMap.getOrDefault(tradeDate, BigDecimal.ZERO);
             BigDecimal orderPayment = orderMap.getOrDefault(tradeDate, BigDecimal.ZERO);
 
             report.setBillRepayment(billRepayment);
             report.setDepositRecharge(depositRecharge);
-            report.setOrderPayment(orderPayment);
+            report.setOrderPayment(orderPayment.subtract(refundAmount));
 
-            // 商户平台合计 = 账单还款 + 预存款充值 + 订单支付
-            BigDecimal merchantPlatformTotal = billRepayment.add(depositRecharge).add(orderPayment);
+            // 商户平台合计 = 账单还款 + 预存款充值 + 订单支付 - 退款
+            BigDecimal merchantPlatformTotal = billRepayment.add(depositRecharge).add(report.getOrderPayment());
             report.setMerchantPlatformTotal(merchantPlatformTotal);
 
             // 对公充值预存款 - TODO: 需要根据实际业务逻辑查询对公充值数据
@@ -161,6 +167,21 @@ public class BankStatementReportServiceImpl implements BankStatementReportServic
                 ));
     }
 
+    /**
+     * 按日期分组并求和(退款数据专用)
+     */
+    private Map<LocalDate, BigDecimal> groupByDateAndSumRefund(List<RefundStatisticsVO> list) {
+        if (CollUtil.isEmpty(list)) {
+            return new HashMap<>();
+        }
+        return list.stream()
+                .filter(item -> item.getRefundTime() != null)
+                .collect(Collectors.groupingBy(
+                        item -> item.getRefundTime().toLocalDate(),
+                        Collectors.reducing(BigDecimal.ZERO, RefundStatisticsVO::getRefundAmount, BigDecimal::add)
+                ));
+    }
+
     /**
      * 导出银行对账报表 Excel
      *

+ 1 - 6
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/report/impl/BankTransactionDetailsServiceImpl.java

@@ -149,12 +149,7 @@ public class BankTransactionDetailsServiceImpl implements BankTransactionDetails
 
         BigDecimal totalAmount = BigDecimal.ZERO;
         for (BankTransactionDetailsRespVO item : list) {
-            if (item.getAmount() != null && item.getAmount().compareTo(BigDecimal.ZERO) > 0) {
-                totalAmount = totalAmount.add(item.getAmount());
-            } else if (item.getAmount() != null && item.getAmount().compareTo(BigDecimal.ZERO) < 0) {
-                if("2".equals(item.getTransactionType())) {
-                    totalAmount = totalAmount.add(item.getAmount());
-                }
+            if (item.getAmount() != null) {
                 totalAmount = totalAmount.add(item.getAmount());
             }
         }

+ 14 - 0
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/order/TradeOrderPayMapper.xml

@@ -25,4 +25,18 @@
         where p.order_id = #{orderId} and p.pay_status = 1 and p.deleted = 0
         LIMIT 1
     </select>
+
+    <select id="selectRefundStatistics" resultType="com.yc.ship.module.trade.controller.admin.report.vo.RefundStatisticsVO">
+        SELECT
+            tr.refund_time AS refundTime,
+            IFNULL(pay.refund_amount, 0) AS refundAmount
+        FROM trade_order_pay pay
+        LEFT JOIN trade_refund tr ON tr.order_id = pay.order_id AND tr.deleted = 0
+        WHERE pay.deleted = 0
+          AND pay.pay_status = 1
+          AND pay.payment_type IN (1, 2, 3)
+          AND tr.refund_status = 6
+          AND tr.refund_time >= #{startDateTime}
+          AND tr.refund_time <![CDATA[<]]> #{endDateTime}
+    </select>
 </mapper>

+ 20 - 6
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/report/IncomeOrderLedgerMapper.xml

@@ -23,14 +23,15 @@
             IFNULL(tot.free_num, 0) AS freeCount,
             (IFNULL(tot.adult_total_num, 0) + IFNULL(tot.child_total_num, 0) +
              IFNULL(tot.baby_total_num, 0) + IFNULL(tot.with_total_num, 0) + IFNULL(tot.free_num, 0)) AS totalCount,
-            o.pay_amount AS marketingPrice,
+            p.pay_amount - COALESCE(refund_fee_sum.refund_amount, 0) AS marketingPrice,
             o.free_amount AS discountAmount,
             COALESCE(refund_fee_sum.refundFee, 0) AS refundFee,
-            (o.pay_amount - IFNULL(o.free_amount, 0) - COALESCE(refund_fee_sum.refundFee, 0)) AS actualSettlementPrice
+           (p.pay_amount - IFNULL(o.free_amount, 0) - COALESCE(refund_fee_sum.refundFee, 0) - COALESCE(refund_fee_sum.refund_amount, 0)) AS actualSettlementPrice
         FROM trade_order o
         INNER JOIN product_voyage v ON o.voyage_id = v.id AND v.deleted = 0
         INNER JOIN resource_route r ON v.route_id = r.id AND r.deleted = 0
         LEFT JOIN trade_order_total tot ON o.id = tot.old_order_id AND tot.deleted = 0
+        INNER JOIN trade_order_pay p on p.order_id = o.id AND p.deleted = 0 and p.pay_status = 1
         LEFT JOIN (
             SELECT rm.order_id,
                    GROUP_CONCAT(DISTINCT rm.room_model_name SEPARATOR ',') AS room_model_name
@@ -39,12 +40,18 @@
             GROUP BY rm.order_id
         ) rm ON o.id = rm.order_id
         LEFT JOIN (
-            SELECT order_id, SUM(fee) AS refundFee
+            SELECT order_id, SUM(fee) AS refundFee, SUM(refund_amount) AS refund_amount
             FROM trade_refund
             WHERE deleted = 0 AND refund_status IN (6)
             GROUP BY order_id
         ) refund_fee_sum ON o.id = refund_fee_sum.order_id
         WHERE o.deleted = 0
+        AND NOT EXISTS (
+            SELECT 1 FROM ota_bill_order bo
+            INNER JOIN ota_bill b ON bo.bill_id = b.id AND b.deleted = 0
+            WHERE bo.order_id = o.id AND bo.deleted = 0
+            AND b.bill_status = 0
+        )
         <if test="vo.orderNo != null and vo.orderNo != ''">
             AND o.order_no LIKE CONCAT('%', #{vo.orderNo}, '%')
         </if>
@@ -106,14 +113,15 @@
             IFNULL(tot.free_num, 0) AS freeCount,
             (IFNULL(tot.adult_total_num, 0) + IFNULL(tot.child_total_num, 0) +
              IFNULL(tot.baby_total_num, 0) + IFNULL(tot.with_total_num, 0) + IFNULL(tot.free_num, 0)) AS totalCount,
-            o.pay_amount AS marketingPrice,
+            p.pay_amount - COALESCE(refund_fee_sum.refund_amount, 0) AS marketingPrice,
             o.free_amount AS discountAmount,
             COALESCE(refund_fee_sum.refundFee, 0) AS refundFee,
-            (o.pay_amount - IFNULL(o.free_amount, 0) - COALESCE(refund_fee_sum.refundFee, 0)) AS actualSettlementPrice
+            (p.pay_amount - IFNULL(o.free_amount, 0) - COALESCE(refund_fee_sum.refundFee, 0) - COALESCE(refund_fee_sum.refund_amount, 0)) AS actualSettlementPrice
         FROM trade_order o
         INNER JOIN product_voyage v ON o.voyage_id = v.id AND v.deleted = 0
         INNER JOIN resource_route r ON v.route_id = r.id AND r.deleted = 0
         LEFT JOIN trade_order_total tot ON o.id = tot.old_order_id AND tot.deleted = 0
+        inner join trade_order_pay p on p.order_id = o.id AND p.deleted = 0 and p.pay_status = 1
         LEFT JOIN (
             SELECT rm.order_id,
                    GROUP_CONCAT(DISTINCT rm.room_model_name SEPARATOR ',') AS room_model_name
@@ -122,12 +130,18 @@
             GROUP BY rm.order_id
         ) rm ON o.id = rm.order_id
         LEFT JOIN (
-            SELECT order_id, SUM(fee) AS refundFee
+            SELECT order_id, SUM(fee) AS refundFee, SUM(refund_amount) AS refund_amount
             FROM trade_refund
             WHERE deleted = 0 AND refund_status IN (6)
             GROUP BY order_id
         ) refund_fee_sum ON o.id = refund_fee_sum.order_id
         WHERE o.deleted = 0
+        AND NOT EXISTS (
+            SELECT 1 FROM ota_bill_order bo
+            INNER JOIN ota_bill b ON bo.bill_id = b.id AND b.deleted = 0
+            WHERE bo.order_id = o.id AND bo.deleted = 0
+            AND b.bill_status = 1
+        )
         <if test="vo.orderNo != null and vo.orderNo != ''">
             AND o.order_no LIKE CONCAT('%', #{vo.orderNo}, '%')
         </if>