Przeglądaj źródła

Merge remote-tracking branch 'origin/main' into main

luofeiyun 1 tydzień temu
rodzic
commit
a1263ff207
25 zmienionych plików z 1023 dodań i 37 usunięć
  1. 8 0
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/controller/admin/voyage/VoyageController.java
  2. 1 0
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/controller/admin/voyage/vo/VoyagePageReqVO.java
  3. 2 0
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/controller/admin/voyage/vo/VoyageRespVO.java
  4. 2 0
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/dataobject/voyage/VoyageDO.java
  5. 1 0
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/mysql/voyage/VoyageMapper.java
  6. 2 0
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyage/VoyageService.java
  7. 19 0
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyage/VoyageServiceImpl.java
  8. 72 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/report/BankStatementReportController.java
  9. 51 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/report/vo/BankTransactionDetailsPageReqVO.java
  10. 54 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/report/vo/BankTransactionDetailsRespVO.java
  11. 28 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/report/vo/IncomeAuditPageReqVO.java
  12. 40 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/report/vo/IncomeAuditRespVO.java
  13. 2 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeOrderMapper.java
  14. 39 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/report/BankTransactionDetailsMapper.java
  15. 38 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/report/IncomeAuditMapper.java
  16. 13 13
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/impl/OtcTradeOrderServiceImpl.java
  17. 34 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/report/BankTransactionDetailsService.java
  18. 34 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/report/IncomeAuditService.java
  19. 160 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/report/impl/BankTransactionDetailsServiceImpl.java
  20. 99 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/report/impl/IncomeAuditServiceImpl.java
  21. 21 19
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/smsSendconfig/SmsSendconfigServiceImpl.java
  22. 13 3
      ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/order/TradeOrderMapper.xml
  23. 207 0
      ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/report/BankTransactionDetailsMapper.xml
  24. 81 0
      ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/report/IncomeAuditMapper.xml
  25. 2 2
      ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/report/IncomeOrderLedgerMapper.xml

+ 8 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/controller/admin/voyage/VoyageController.java

@@ -207,4 +207,12 @@ public class VoyageController {
                 BeanUtils.toBean(list, VoyageRespVO.class));
     }
 
+
+    @PutMapping("/update-lock")
+    @Operation(summary = "锁定或解锁航次管理")
+    @PreAuthorize("@ss.hasPermission('product:voyage:update-lock')")
+    public CommonResult<Boolean> updateLockVoyage(String id) {
+        voyageService.updateLockVoyage(id);
+        return success(true);
+    }
 }

+ 1 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/controller/admin/voyage/vo/VoyagePageReqVO.java

@@ -61,4 +61,5 @@ public class VoyagePageReqVO extends PageParam {
     @Schema(description = "航次ID列表")
     private List<Long> voyageIds;
 
+    private Integer isLock;
 }

+ 2 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/controller/admin/voyage/vo/VoyageRespVO.java

@@ -146,4 +146,6 @@ public class VoyageRespVO {
 
     @Schema(description = "航次方向")
     private Integer direction;
+
+    private Integer isLock;
 }

+ 2 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/dataobject/voyage/VoyageDO.java

@@ -138,4 +138,6 @@ public class VoyageDO extends TenantBaseDO {
      */
     private String childBookingNotice;
 
+
+    private Integer isLock;
 }

+ 1 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/mysql/voyage/VoyageMapper.java

@@ -36,6 +36,7 @@ public interface VoyageMapper extends BaseMapperX<VoyageDO> {
                 .eqIfPresent(VoyageDO::getType, reqVO.getType())
                 .eqIfPresent(VoyageDO::getTransfer, reqVO.getTransfer())
                 .eqIfPresent(VoyageDO::getShelfStatus, reqVO.getShelfStatus())
+                .eqIfPresent(VoyageDO::getIsLock, reqVO.getIsLock())
                 .betweenIfPresent(VoyageDO::getCreateTime, reqVO.getCreateTime())
                 .inIfPresent(VoyageDO::getId, reqVO.getVoyageIds())
                 .orderByDesc(VoyageDO::getId));

+ 2 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyage/VoyageService.java

@@ -94,4 +94,6 @@ public interface VoyageService {
      * @return
      */
     List<AppVoyageDayRespVO> getVoyageListByShipIdAndDate(Long shipId, String date);
+
+    void updateLockVoyage(String id);
 }

+ 19 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyage/VoyageServiceImpl.java

@@ -427,4 +427,23 @@ public class VoyageServiceImpl implements VoyageService {
         return voyageMapper.selectVoyageListByShipIdAndDate(shipId, date);
     }
 
+    @Override
+    public void updateLockVoyage(String id) {
+        log.info("准备锁定或解锁航次: {}", id);
+        VoyageDO voyageDO = voyageMapper.selectById(id);
+        if (voyageDO == null) {
+            log.info("未查询到航次: {}, 返回异常", id);
+            throw exception(VOYAGE_NOT_EXISTS);
+        }
+        if(voyageDO.getIsLock() == null || voyageDO.getIsLock().intValue() == 0){
+            log.info("航次: {} 当前锁定状态: 解锁, 将改为锁定 ...", id);
+            voyageDO.setIsLock(1);
+        } else {
+            log.info("航次: {} 当前锁定状态: 锁定, 将改为解锁 ...", id);
+            voyageDO.setIsLock(0);
+        }
+        voyageMapper.updateById(voyageDO);
+        log.info("航次: {}, {}完成 ...", id, (voyageDO.getIsLock().intValue() == 0 ? "解锁" : "锁定"));
+    }
+
 }

+ 72 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/report/BankStatementReportController.java

@@ -5,9 +5,15 @@ import com.yc.ship.framework.common.pojo.CommonResult;
 import com.yc.ship.framework.common.pojo.PageResult;
 import com.yc.ship.module.trade.controller.admin.report.vo.BankStatementReportPageReqVO;
 import com.yc.ship.module.trade.controller.admin.report.vo.BankStatementReportRespVO;
+import com.yc.ship.module.trade.controller.admin.report.vo.BankTransactionDetailsPageReqVO;
+import com.yc.ship.module.trade.controller.admin.report.vo.BankTransactionDetailsRespVO;
+import com.yc.ship.module.trade.controller.admin.report.vo.IncomeAuditPageReqVO;
+import com.yc.ship.module.trade.controller.admin.report.vo.IncomeAuditRespVO;
 import com.yc.ship.module.trade.controller.admin.report.vo.IncomeOrderLedgerPageReqVO;
 import com.yc.ship.module.trade.controller.admin.report.vo.IncomeOrderLedgerRespVO;
 import com.yc.ship.module.trade.service.report.BankStatementReportService;
+import com.yc.ship.module.trade.service.report.BankTransactionDetailsService;
+import com.yc.ship.module.trade.service.report.IncomeAuditService;
 import com.yc.ship.module.trade.service.report.IncomeOrderLedgerService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -44,6 +50,12 @@ public class BankStatementReportController {
     @Resource
     private IncomeOrderLedgerService incomeOrderLedgerService;
 
+    @Resource
+    private BankTransactionDetailsService bankTransactionDetailsService;
+
+    @Resource
+    private IncomeAuditService incomeAuditService;
+
     /**
      * 查询银行对账报表分页
      *
@@ -110,4 +122,64 @@ public class BankStatementReportController {
         incomeOrderLedgerService.exportIncomeOrderLedgerExcel(pageReqVO, response);
     }
 
+    // ==================== 银行流水交易明细接口 ====================
+
+    /**
+     * 查询银行流水交易明细分页
+     *
+     * @param pageReqVO 分页查询条件
+     * @return 分页结果
+     */
+    @GetMapping("/bank-transaction-details/page")
+    @Operation(summary = "查询银行流水交易明细分页")
+    public CommonResult<PageResult<BankTransactionDetailsRespVO>> getBankTransactionDetailsPage(@Valid BankTransactionDetailsPageReqVO pageReqVO) {
+        PageResult<BankTransactionDetailsRespVO> pageResult = bankTransactionDetailsService.getBankTransactionDetailsPage(pageReqVO);
+        return success(pageResult);
+    }
+
+    /**
+     * 导出银行流水交易明细 Excel(数字字段导出为数字格式)
+     *
+     * @param pageReqVO 查询条件
+     * @param response  HTTP响应
+     * @throws IOException IO异常
+     */
+    @GetMapping("/bank-transaction-details/export-excel")
+    @Operation(summary = "导出银行流水交易明细 Excel")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportBankTransactionDetailsExcel(@Valid BankTransactionDetailsPageReqVO pageReqVO,
+                                                    HttpServletResponse response) throws IOException {
+        bankTransactionDetailsService.exportBankTransactionDetailsExcel(pageReqVO, response);
+    }
+
+    // ==================== 收入稽核表接口 ====================
+
+    /**
+     * 查询收入稽核表分页
+     *
+     * @param pageReqVO 分页查询条件
+     * @return 分页结果
+     */
+    @GetMapping("/income-audit/page")
+    @Operation(summary = "查询收入稽核表分页")
+    public CommonResult<PageResult<IncomeAuditRespVO>> getIncomeAuditPage(@Valid IncomeAuditPageReqVO pageReqVO) {
+        PageResult<IncomeAuditRespVO> pageResult = incomeAuditService.getIncomeAuditPage(pageReqVO);
+        return success(pageResult);
+    }
+
+    /**
+     * 导出收入稽核表 Excel(数字字段导出为数字格式)
+     *
+     * @param pageReqVO 查询条件
+     * @param response  HTTP响应
+     * @throws IOException IO异常
+     */
+    @GetMapping("/income-audit/export-excel")
+    @Operation(summary = "导出收入稽核表 Excel")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIncomeAuditExcel(@Valid IncomeAuditPageReqVO pageReqVO,
+                                       HttpServletResponse response) throws IOException {
+        incomeAuditService.exportIncomeAuditExcel(pageReqVO, response);
+    }
+
 }

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

@@ -0,0 +1,51 @@
+package com.yc.ship.module.trade.controller.admin.report.vo;
+
+import com.yc.ship.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+import static com.yc.ship.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
+import static com.yc.ship.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+/**
+ * 银行流水交易明细分页查询 Request VO
+ *
+ * @author auto-generated
+ */
+@Schema(description = "管理后台 - 银行流水交易明细分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class BankTransactionDetailsPageReqVO extends PageParam {
+
+    @Schema(description = "交易时间开始", example = "2024-01-01 00:00:00")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime transactionTimeStart;
+
+    @Schema(description = "交易时间结束", example = "2024-12-31 23:59:59")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime transactionTimeEnd;
+
+    @Schema(description = "开航时间", example = "2024-03-01")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+    private LocalDate boardDate;
+
+    @Schema(description = "订单号/账单号", example = "CJXLY-20260421-YC-45")
+    private String orderNo;
+
+    @Schema(description = "客户名称(组团社)", example = "重庆蓝波湾国际旅行社有限公司")
+    private String customerName;
+
+    @Schema(description = "支付方式", example = "1")
+    private Integer paymentMethod;
+
+    @Schema(description = "交易类型:1-支付 2-退款 3-充值 4-账单还款", example = "1")
+    private Integer transactionType;
+
+}

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

@@ -0,0 +1,54 @@
+package com.yc.ship.module.trade.controller.admin.report.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.format.NumberFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 银行流水交易明细 Response VO(同时用于 Excel 导出)
+ *
+ * @author auto-generated
+ */
+@Schema(description = "管理后台 - 银行流水交易明细 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class BankTransactionDetailsRespVO {
+
+    @Schema(description = "交易时间", example = "2026-02-08 15:50:07")
+    @ExcelProperty("交易时间")
+    private String transactionTime;
+
+    @Schema(description = "开航时间", example = "2026/04/21")
+    @ExcelProperty("开航时间")
+    private String boardingTime;
+
+    @Schema(description = "订单号/账单号", example = "CJXLY-20260421-YC-45")
+    @ExcelProperty("订单号/账单号")
+    private String orderNo;
+
+    @Schema(description = "组团社", example = "重庆蓝波湾国际旅行社有限公司")
+    @ExcelProperty("组团社")
+    private String travelAgencyName;
+
+    @Schema(description = "支付方式", example = "微信")
+    @ExcelProperty("支付方式")
+    private String paymentMethod;
+
+    @Schema(description = "交易类型", example = "支付")
+    @ExcelProperty("交易类型")
+    private String transactionType;
+
+    @Schema(description = "交易金额", example = "10000.00")
+    @NumberFormat("0.00")
+    @ExcelProperty("交易金额")
+    private BigDecimal amount;
+
+    @Schema(description = "银行流水号", example = "100426020818272998847032")
+    @ExcelProperty("银行流水号(抓取农行流水)")
+    private String bankSerialNo;
+
+}

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

@@ -0,0 +1,28 @@
+package com.yc.ship.module.trade.controller.admin.report.vo;
+
+import com.yc.ship.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.util.List;
+
+/**
+ * 收入稽核表分页查询 Request VO
+ *
+ * @author auto-generated
+ */
+@Schema(description = "管理后台 - 收入稽核表分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class IncomeAuditPageReqVO extends PageParam {
+
+    @Schema(description = "航次ID列表(多选)", example = "[1, 2, 3]")
+    private List<Long> voyageIds;
+
+    @Schema(description = "组团社", example = "长江国际旅行社")
+    private String travelAgency;
+
+}

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

@@ -0,0 +1,40 @@
+package com.yc.ship.module.trade.controller.admin.report.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.format.NumberFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 收入稽核表 Response VO(同时用于 Excel 导出)
+ *
+ * @author auto-generated
+ */
+@Schema(description = "管理后台 - 收入稽核表 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IncomeAuditRespVO {
+
+    @Schema(description = "组团社", example = "长江国际旅行社")
+    @ExcelProperty("组团社")
+    private String travelAgency;
+
+    @Schema(description = "宜昌-重庆收入", example = "50000.00")
+    @NumberFormat("0.00")
+    @ExcelProperty("宜昌-重庆")
+    private BigDecimal yichangToChongqing;
+
+    @Schema(description = "重庆-宜昌收入", example = "30000.00")
+    @NumberFormat("0.00")
+    @ExcelProperty("重庆-宜昌")
+    private BigDecimal chongqingToYichang;
+
+    @Schema(description = "合计", example = "80000.00")
+    @NumberFormat("0.00")
+    @ExcelProperty("合计")
+    private BigDecimal totalAmount;
+
+}

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

@@ -253,4 +253,6 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
     List<Map<String, Object>> queryOrderLink(@Param("day") int day,@Param("direction")int direction);
 
     List<Map<String, Object>> queryOrderJzPhone(@Param("day") int day,@Param("direction")int direction);
+
+    List<Map<String, Object>> queryOrderVisitorMobile(@Param("day") int day,@Param("direction") int direction);
 }

+ 39 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/report/BankTransactionDetailsMapper.java

@@ -0,0 +1,39 @@
+package com.yc.ship.module.trade.dal.mysql.report;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
+import com.yc.ship.module.trade.controller.admin.report.vo.BankTransactionDetailsPageReqVO;
+import com.yc.ship.module.trade.controller.admin.report.vo.BankTransactionDetailsRespVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 银行流水交易明细 Mapper
+ *
+ * @author auto-generated
+ */
+@Mapper
+public interface BankTransactionDetailsMapper extends BaseMapperX<BankTransactionDetailsRespVO> {
+
+    /**
+     * 分页查询银行流水交易明细
+     *
+     * @param page 分页参数
+     * @param vo   查询条件
+     * @return 分页结果
+     */
+    IPage<BankTransactionDetailsRespVO> selectBankTransactionDetailsPage(
+            IPage<BankTransactionDetailsRespVO> page, @Param("vo") BankTransactionDetailsPageReqVO vo);
+
+    /**
+     * 导出查询银行流水交易明细(不分页,用于 Excel 导出)
+     *
+     * @param vo 查询条件
+     * @return 数据列表
+     */
+    List<BankTransactionDetailsRespVO> selectBankTransactionDetailsExportList(
+            @Param("vo") BankTransactionDetailsPageReqVO vo);
+
+}

+ 38 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/report/IncomeAuditMapper.java

@@ -0,0 +1,38 @@
+package com.yc.ship.module.trade.dal.mysql.report;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
+import com.yc.ship.module.trade.controller.admin.report.vo.IncomeAuditPageReqVO;
+import com.yc.ship.module.trade.controller.admin.report.vo.IncomeAuditRespVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 收入稽核表 Mapper
+ *
+ * @author auto-generated
+ */
+@Mapper
+public interface IncomeAuditMapper extends BaseMapperX<IncomeAuditRespVO> {
+
+    /**
+     * 分页查询收入稽核表
+     *
+     * @param page 分页参数
+     * @param vo   查询条件
+     * @return 分页结果
+     */
+    IPage<IncomeAuditRespVO> selectIncomeAuditPage(
+            IPage<IncomeAuditRespVO> page, @Param("vo") IncomeAuditPageReqVO vo);
+
+    /**
+     * 导出查询收入稽核表(不分页,用于 Excel 导出)
+     *
+     * @param vo 查询条件
+     * @return 数据列表
+     */
+    List<IncomeAuditRespVO> selectIncomeAuditExportList(@Param("vo") IncomeAuditPageReqVO vo);
+
+}

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

@@ -1695,7 +1695,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             if (orderMoney != null && realAmount != null && realAmount.compareTo(orderMoney) != 0) {
                 shipTradeOrderCreateReqVO.setAmount(orderMoney);
                 shipTradeOrderCreateReqVO.setPayAmount(realAmount);
-                shipTradeOrderCreateReqVO.setConfirmType(1);
+//                shipTradeOrderCreateReqVO.setConfirmType(1);
             } else {
                 shipTradeOrderCreateReqVO.setConfirmType(0);
                 shipTradeOrderCreateReqVO.setAmount(orderMoney);
@@ -1742,7 +1742,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
 
             shipTradeOrderCreateReqVO.setOrderProperty(orderProperty);
             if (createVO.getPolicyList()!=null && !createVO.getPolicyList().isEmpty()) {
-                shipTradeOrderCreateReqVO.setConfirmType(1);
+//                shipTradeOrderCreateReqVO.setConfirmType(1);
                 TradeOrderBindDO tradeOrderBindDO = new TradeOrderBindDO();
                 tradeOrderBindDO.setId(IdWorker.getId());
                 tradeOrderBindDO.setType(3);
@@ -1895,12 +1895,12 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             if (!CollUtil.isEmpty(createVO.getPolicyList())) {
                 orderStatus = TradeOrderStatusEnum.TRANSFER.getStatus();
                 AuditUserDO auditUserDO = auditUserMapper.selectOne(new LambdaQueryWrapperX<AuditUserDO>().eq(AuditUserDO::getType, auditType).eq(AuditUserDO::getAuditStatus, 1).eq(AuditUserDO::getDeleted, 0).orderByDesc(AuditUserDO::getCreateTime).last("limit 1"));
-                tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>().set("audit_type", auditType).set("order_status", TradeOrderStatusEnum.TRANSFER.getStatus()).set("audit_user",auditUserDO.getAuditUser()).set("audit_status", 1).eq("id", orderId));
+                tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>().set("audit_type", auditType).set("order_status", TradeOrderStatusEnum.TRANSFER.getStatus()).set("audit_user",auditUserDO.getAuditUser()).set("audit_status", 1).set("confirm_type",1).eq("id", orderId));
             }else {
                 if (auditType > 0 && createVO.getIsYd() != 1) {
                     orderStatus = TradeOrderStatusEnum.TRANSFER.getStatus();
                     AuditUserDO auditUserDO = auditUserMapper.selectOne(new LambdaQueryWrapperX<AuditUserDO>().eq(AuditUserDO::getType, auditType).eq(AuditUserDO::getAuditStatus, 1).eq(AuditUserDO::getDeleted, 0).orderByDesc(AuditUserDO::getCreateTime).last("limit 1"));
-                    tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>().set("audit_type", auditType).set("order_status", TradeOrderStatusEnum.TRANSFER.getStatus()).set("audit_user", auditUserDO.getAuditUser()).set("audit_status", 1).eq("id", orderId));
+                    tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>().set("audit_type", auditType).set("order_status", TradeOrderStatusEnum.TRANSFER.getStatus()).set("audit_user", auditUserDO.getAuditUser()).set("audit_status", 1).set("confirm_type",1).eq("id", orderId));
                 }
             }
             if (!tradeOrderRoomDOList.isEmpty()) {
@@ -1991,7 +1991,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             shipTradeOrderCreateReqVO.setAmount(orderMoney);
             shipTradeOrderCreateReqVO.setPayAmount(realAmount);
             if ((orderMoney != null && realAmount != null && (realAmount.compareTo(orderMoney) != 0) || shipTradeOrderCreateReqVO.getAmount().compareTo(tradeOrderDO.getAmount())!=0)) {
-                shipTradeOrderCreateReqVO.setConfirmType(1);
+                //shipTradeOrderCreateReqVO.setConfirmType(1);
                 TradeOrderBindDO tradeOrderBindDO = new TradeOrderBindDO();
                 tradeOrderBindDO.setId(IdWorker.getId());
                 tradeOrderBindDO.setType(1);
@@ -2000,7 +2000,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 tradeOrderBindDO.setRemark("modify订单金额修改,订单金额:" + orderMoney + ",订单修改后实际金额:" + realAmount);
                 shipTradeOrderCreateReqVO.setTradeOrderBindDO(tradeOrderBindDO);
             } else if (createVO.getSummary().getDeposi() != null && shipTradeOrderCreateReqVO.getDeposi().compareTo(tradeOrderDO.getDeposi())!=0) {
-                shipTradeOrderCreateReqVO.setConfirmType(1);
+                //shipTradeOrderCreateReqVO.setConfirmType(1);
                 TradeOrderBindDO tradeOrderBindDO = new TradeOrderBindDO();
                 tradeOrderBindDO.setId(IdWorker.getId());
                 tradeOrderBindDO.setType(1);
@@ -2010,7 +2010,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 shipTradeOrderCreateReqVO.setTradeOrderBindDO(tradeOrderBindDO);
                 shipTradeOrderCreateReqVO.setDeposiStatus(1);
             }else if (!createVO.getPolicyList().isEmpty()) {
-                shipTradeOrderCreateReqVO.setConfirmType(1);
+                //shipTradeOrderCreateReqVO.setConfirmType(1);
                 TradeOrderBindDO tradeOrderBindDO = new TradeOrderBindDO();
                 tradeOrderBindDO.setId(IdWorker.getId());
                 tradeOrderBindDO.setType(3);
@@ -2019,11 +2019,11 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 tradeOrderBindDO.setRemark("提交营销政策");
                 shipTradeOrderCreateReqVO.setTradeOrderBindDO(tradeOrderBindDO);
             } else {
-                shipTradeOrderCreateReqVO.setConfirmType(0);
-            }
-            if (tradeOrderDO.getOrderStatus() == 6) {
-                shipTradeOrderCreateReqVO.setConfirmType(1);
+//                shipTradeOrderCreateReqVO.setConfirmType(0);
             }
+//            if (tradeOrderDO.getOrderStatus() == 6) {
+//                shipTradeOrderCreateReqVO.setConfirmType(1);
+//            }
             shipTradeOrderCreateReqVO.setDiscountId(discountId);
             if (createVO.getSummary().getRealOrderMoney() != null) {
                 shipTradeOrderCreateReqVO.setPayAmount(createVO.getSummary().getRealOrderMoney());
@@ -2275,13 +2275,13 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             String msg = "";
             if (auditType > 0 && createVO.getIsYd() != 1) {
                 AuditUserDO auditUserDO = auditUserMapper.selectOne(new LambdaQueryWrapperX<AuditUserDO>().eq(AuditUserDO::getType, auditType).eq(AuditUserDO::getAuditStatus, 1).eq(AuditUserDO::getDeleted, 0).orderByDesc(AuditUserDO::getCreateTime).last("limit 1"));
-                tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>().set("audit_type", auditType).set("audit_user", auditUserDO == null ? "" : auditUserDO.getAuditUser()).set("order_status", TradeOrderStatusEnum.TRANSFER.getStatus()).set("audit_status", 1).eq("id", neworderId));
+                tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>().set("audit_type", auditType).set("audit_user", auditUserDO == null ? "" : auditUserDO.getAuditUser()).set("order_status", TradeOrderStatusEnum.TRANSFER.getStatus()).set("audit_status", 1).set("confirm_type",1).eq("id", neworderId));
                 log.error(orderNo+">>>>>>>>>>>>>>>>>>>>>> motifyOtcOrder 进入审核流程 <<<<<<<<<<<<<<<<<<<<<<"+auditType+";"+(auditUserDO == null ? "" : auditUserDO.getAuditUser()));
                 msg = "修改提交成功,等待管理员审核";
                 neworderStatus = TradeOrderStatusEnum.TRANSFER.getStatus();
             } else if (oldDeposi.compareTo(newDeposi)!=0) {
                 AuditUserDO auditUserDO = auditUserMapper.selectOne(new LambdaQueryWrapperX<AuditUserDO>().eq(AuditUserDO::getType, 3).eq(AuditUserDO::getAuditStatus, 1).eq(AuditUserDO::getDeleted, 0).orderByDesc(AuditUserDO::getCreateTime).last("limit 1"));
-                tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>().set("audit_type", 3).set("audit_user", auditUserDO == null ? "" : auditUserDO.getAuditUser()).set("order_status", TradeOrderStatusEnum.TRANSFER.getStatus()).set("audit_status", 1).eq("id", neworderId));
+                tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>().set("audit_type", 3).set("audit_user", auditUserDO == null ? "" : auditUserDO.getAuditUser()).set("order_status", TradeOrderStatusEnum.TRANSFER.getStatus()).set("audit_status", 1).set("confirm_type",1).eq("id", neworderId));
                 msg = "修改提交成功,等待管理员审核";
                 neworderStatus = TradeOrderStatusEnum.TRANSFER.getStatus();
                 log.error(orderNo+">>>>>>>>>>>>>>>>>>>>>> motifyOtcOrder 进入审核流程2 <<<<<<<<<<<<<<<<<<<<<<"+3+";"+(auditUserDO == null ? "" : auditUserDO.getAuditUser()));

+ 34 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/report/BankTransactionDetailsService.java

@@ -0,0 +1,34 @@
+package com.yc.ship.module.trade.service.report;
+
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.module.trade.controller.admin.report.vo.BankTransactionDetailsPageReqVO;
+import com.yc.ship.module.trade.controller.admin.report.vo.BankTransactionDetailsRespVO;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 银行流水交易明细 Service
+ *
+ * @author auto-generated
+ */
+public interface BankTransactionDetailsService {
+
+    /**
+     * 查询银行流水交易明细分页
+     *
+     * @param pageReqVO 分页查询条件
+     * @return 分页结果
+     */
+    PageResult<BankTransactionDetailsRespVO> getBankTransactionDetailsPage(BankTransactionDetailsPageReqVO pageReqVO);
+
+    /**
+     * 导出银行流水交易明细 Excel
+     *
+     * @param pageReqVO 查询条件
+     * @param response  HTTP响应
+     * @throws IOException IO异常
+     */
+    void exportBankTransactionDetailsExcel(BankTransactionDetailsPageReqVO pageReqVO, HttpServletResponse response) throws IOException;
+
+}

+ 34 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/report/IncomeAuditService.java

@@ -0,0 +1,34 @@
+package com.yc.ship.module.trade.service.report;
+
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.module.trade.controller.admin.report.vo.IncomeAuditPageReqVO;
+import com.yc.ship.module.trade.controller.admin.report.vo.IncomeAuditRespVO;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 收入稽核表 Service 接口
+ *
+ * @author auto-generated
+ */
+public interface IncomeAuditService {
+
+    /**
+     * 查询收入稽核表分页
+     *
+     * @param pageReqVO 分页查询条件
+     * @return 分页结果
+     */
+    PageResult<IncomeAuditRespVO> getIncomeAuditPage(IncomeAuditPageReqVO pageReqVO);
+
+    /**
+     * 导出收入稽核表 Excel
+     *
+     * @param pageReqVO 查询条件
+     * @param response  HTTP响应
+     * @throws IOException IO异常
+     */
+    void exportIncomeAuditExcel(IncomeAuditPageReqVO pageReqVO, HttpServletResponse response) throws IOException;
+
+}

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

@@ -0,0 +1,160 @@
+package com.yc.ship.module.trade.service.report.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.excel.core.util.ExcelUtils;
+import com.yc.ship.module.trade.controller.admin.report.vo.BankTransactionDetailsPageReqVO;
+import com.yc.ship.module.trade.controller.admin.report.vo.BankTransactionDetailsRespVO;
+import com.yc.ship.module.trade.dal.mysql.report.BankTransactionDetailsMapper;
+import com.yc.ship.module.trade.enums.PayTypeEnum;
+import com.yc.ship.module.trade.service.report.BankTransactionDetailsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 银行流水交易明细 Service 实现类
+ * <p>
+ * 数据来源:
+ * 1. 订单支付(trade_order_pay, orderType=0, payStatus=1)
+ * 2. 订单退款(trade_order_pay, refundAmount > 0)
+ * 3. 充值(trade_order_pay, orderType=1)
+ * 4. 账单还款(ota_bill, billStatus=1)
+ * <p>
+ * 性能优化:
+ * - 使用 UNION ALL 在数据库层合并四类交易数据,单次 SQL 完成查询
+ * - 外层包装统一过滤条件,避免多次查询内存合并
+ * - 分页查询由 MyBatis-Plus IPage 自动处理
+ *
+ * @author auto-generated
+ */
+@Service
+@Slf4j
+public class BankTransactionDetailsServiceImpl implements BankTransactionDetailsService {
+
+    /** 交易类型常量 */
+    private static final int TRANSACTION_TYPE_PAYMENT = 1;
+    private static final int TRANSACTION_TYPE_REFUND = 2;
+    private static final int TRANSACTION_TYPE_RECHARGE = 3;
+    private static final int TRANSACTION_TYPE_BILL_REPAYMENT = 4;
+
+    @Resource
+    private BankTransactionDetailsMapper bankTransactionDetailsMapper;
+
+    /**
+     * 查询银行流水交易明细分页
+     */
+    @Override
+    public PageResult<BankTransactionDetailsRespVO> getBankTransactionDetailsPage(BankTransactionDetailsPageReqVO pageReqVO) {
+        IPage<BankTransactionDetailsRespVO> page = bankTransactionDetailsMapper.selectBankTransactionDetailsPage(
+                new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO);
+        // 转换枚举值为中文名称
+        convertEnumToName(page.getRecords());
+        return new PageResult<>(page.getRecords(), page.getTotal());
+    }
+
+    /**
+     * 导出银行流水交易明细 Excel
+     * 数字字段导出为数字格式(通过 @NumberFormat 注解实现)
+     */
+    @Override
+    public void exportBankTransactionDetailsExcel(BankTransactionDetailsPageReqVO pageReqVO,
+                                                   HttpServletResponse response) throws IOException {
+        // 1. 查询所有数据(不分页)
+        List<BankTransactionDetailsRespVO> list = bankTransactionDetailsMapper.selectBankTransactionDetailsExportList(pageReqVO);
+        if (CollUtil.isEmpty(list)) {
+            log.warn("[exportBankTransactionDetailsExcel] 无数据可导出");
+        } else {
+            // 2. 转换枚举值为中文名称
+            convertEnumToName(list);
+            // 3. 计算合计行并追加到列表末尾
+            BankTransactionDetailsRespVO summary = calculateSummary(list);
+            list.add(summary);
+        }
+        // 4. 导出 Excel(amount 字段使用 @NumberFormat("0.00") 注解确保导出为数字格式)
+        ExcelUtils.write(response, "银行流水交易明细表.xls", "银行流水交易明细", BankTransactionDetailsRespVO.class, list);
+    }
+
+    /**
+     * 将枚举值转换为中文名称,便于前端展示和 Excel 导出
+     */
+    private void convertEnumToName(List<BankTransactionDetailsRespVO> list) {
+        if (CollUtil.isEmpty(list)) {
+            return;
+        }
+        for (BankTransactionDetailsRespVO item : list) {
+            // 转换交易类型
+            if (item.getTransactionType() != null) {
+                switch (item.getTransactionType()) {
+                    case "1":
+                        item.setTransactionType("支付");
+                        break;
+                    case "2":
+                        item.setTransactionType("退款");
+                        break;
+                    case "3":
+                        item.setTransactionType("充值");
+                        break;
+                    case "4":
+                        item.setTransactionType("账单还款");
+                        break;
+                    default:
+                        break;
+                }
+            }
+            // 转换支付方式
+            if (item.getPaymentMethod() != null) {
+                try {
+                    int payType = Integer.parseInt(item.getPaymentMethod());
+                    String payTypeName = getPayTypeName(payType);
+                    item.setPaymentMethod(payTypeName);
+                } catch (NumberFormatException e) {
+                    // 已经是中文名称,无需转换
+                }
+            }
+        }
+    }
+
+    /**
+     * 获取支付方式名称
+     */
+    private String getPayTypeName(int payType) {
+        for (PayTypeEnum e : PayTypeEnum.values()) {
+            if (e.getType() == payType) {
+                return e.getName();
+            }
+        }
+        return "其他";
+    }
+
+    /**
+     * 计算合计行数据
+     */
+    private BankTransactionDetailsRespVO calculateSummary(List<BankTransactionDetailsRespVO> list) {
+        BankTransactionDetailsRespVO summary = new BankTransactionDetailsRespVO();
+        summary.setTransactionTime("合计");
+        summary.setBoardingTime("");
+        summary.setOrderNo("");
+        summary.setTravelAgencyName("");
+        summary.setPaymentMethod("");
+        summary.setTransactionType("");
+        summary.setBankSerialNo("");
+
+        BigDecimal totalAmount = BigDecimal.ZERO;
+        for (BankTransactionDetailsRespVO item : list) {
+            if (item.getAmount() != null) {
+                totalAmount = totalAmount.add(item.getAmount());
+            }
+        }
+        summary.setAmount(totalAmount);
+        return summary;
+    }
+
+}

+ 99 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/report/impl/IncomeAuditServiceImpl.java

@@ -0,0 +1,99 @@
+package com.yc.ship.module.trade.service.report.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.excel.core.util.ExcelUtils;
+import com.yc.ship.module.trade.controller.admin.report.vo.IncomeAuditPageReqVO;
+import com.yc.ship.module.trade.controller.admin.report.vo.IncomeAuditRespVO;
+import com.yc.ship.module.trade.dal.mysql.report.IncomeAuditMapper;
+import com.yc.ship.module.trade.service.report.IncomeAuditService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 收入稽核表 Service 实现类
+ *
+ * @author auto-generated
+ */
+@Service
+@Slf4j
+public class IncomeAuditServiceImpl implements IncomeAuditService {
+
+    @Resource
+    private IncomeAuditMapper incomeAuditMapper;
+
+    /**
+     * 查询收入稽核表分页
+     *
+     * @param pageReqVO 分页查询条件
+     * @return 分页结果
+     */
+    @Override
+    public PageResult<IncomeAuditRespVO> getIncomeAuditPage(IncomeAuditPageReqVO pageReqVO) {
+        IPage<IncomeAuditRespVO> page = incomeAuditMapper.selectIncomeAuditPage(
+                new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO);
+        return new PageResult<>(page.getRecords(), page.getTotal());
+    }
+
+    /**
+     * 导出收入稽核表 Excel
+     * 数字字段导出为数字格式(通过 @NumberFormat 注解实现)
+     *
+     * @param pageReqVO 查询条件
+     * @param response  HTTP响应
+     * @throws IOException IO异常
+     */
+    @Override
+    public void exportIncomeAuditExcel(IncomeAuditPageReqVO pageReqVO,
+                                       HttpServletResponse response) throws IOException {
+        // 1. 查询所有数据(不分页)
+        List<IncomeAuditRespVO> list = incomeAuditMapper.selectIncomeAuditExportList(pageReqVO);
+        if (CollUtil.isEmpty(list)) {
+            log.warn("[exportIncomeAuditExcel] 无数据可导出");
+        } else {
+            // 2. 计算合计行并追加到列表末尾
+            IncomeAuditRespVO summary = calculateSummary(list);
+            list.add(summary);
+        }
+        // 3. 导出 Excel(数字字段使用 @NumberFormat 注解确保导出为数字格式)
+        ExcelUtils.write(response, "收入稽核表.xls", "收入稽核表", IncomeAuditRespVO.class, list);
+    }
+
+    /**
+     * 计算合计行数据
+     *
+     * @param list 数据列表
+     * @return 合计行
+     */
+    private IncomeAuditRespVO calculateSummary(List<IncomeAuditRespVO> list) {
+        IncomeAuditRespVO summary = new IncomeAuditRespVO();
+        summary.setTravelAgency("合计");
+
+        BigDecimal totalYichangToChongqing = BigDecimal.ZERO;
+        BigDecimal totalChongqingToYichang = BigDecimal.ZERO;
+        BigDecimal totalAmount = BigDecimal.ZERO;
+
+        for (IncomeAuditRespVO item : list) {
+            totalYichangToChongqing = totalYichangToChongqing.add(
+                    item.getYichangToChongqing() != null ? item.getYichangToChongqing() : BigDecimal.ZERO);
+            totalChongqingToYichang = totalChongqingToYichang.add(
+                    item.getChongqingToYichang() != null ? item.getChongqingToYichang() : BigDecimal.ZERO);
+            totalAmount = totalAmount.add(
+                    item.getTotalAmount() != null ? item.getTotalAmount() : BigDecimal.ZERO);
+        }
+
+        summary.setYichangToChongqing(totalYichangToChongqing);
+        summary.setChongqingToYichang(totalChongqingToYichang);
+        summary.setTotalAmount(totalAmount);
+        return summary;
+    }
+
+}

+ 21 - 19
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/smsSendconfig/SmsSendconfigServiceImpl.java

@@ -315,31 +315,17 @@ public class SmsSendconfigServiceImpl implements SmsSendconfigService {
         List<Map<String,Object>> linkList = tradeOrderMapper.queryOrderLink(day,type);
         // 查询接站登记人
         List<Map<String,Object>> jzPhoneList = tradeOrderMapper.queryOrderJzPhone(day,type);
+        // 查询订单游客电话
+        List<Map<String,Object>> visitorMobileList = tradeOrderMapper.queryOrderVisitorMobile(day,type);
         // 查询短信配置
         SmsTemplateDO smsTemplateDO = smsTemplateMapper.selectByCode(code);
         // 合并两个列表并去重
         Set<String> phoneSet = new HashSet<>();
         Map<String, Map<String, Object>> phoneDataMap = new HashMap<>();
+        processPhoneList(linkList, "link_mobile", phoneSet, phoneDataMap);
+        processPhoneList(jzPhoneList, "phone", phoneSet, phoneDataMap);
+        processPhoneList(visitorMobileList, "mobile", phoneSet, phoneDataMap);
 
-        if (linkList != null) {
-            for (Map<String, Object> map : linkList) {
-                String phone = (String) map.get("link_mobile");
-                if (phone != null && !phone.isEmpty()) {
-                    phoneSet.add(phone);
-                }
-            }
-        }
-        if (jzPhoneList != null) {
-            for (Map<String, Object> map : jzPhoneList) {
-                String phone = (String) map.get("phone");
-                if (phone != null && !phone.isEmpty()) {
-                    phoneSet.add(phone);
-                    if (!phoneDataMap.containsKey(phone)) {
-                        phoneDataMap.put(phone, map);
-                    }
-                }
-            }
-        }
         List<String> phoneList = new ArrayList<>(phoneSet);
         List<String> params = smsTemplateDO.getParams();// ["【pick】","【time】"]
         Map<String, Object> templateParams = new HashMap<>();
@@ -376,4 +362,20 @@ public class SmsSendconfigServiceImpl implements SmsSendconfigService {
         }
     }
 
+    private void processPhoneList(List<Map<String, Object>> dataList, String phoneKey,
+                                  Set<String> phoneSet, Map<String, Map<String, Object>> phoneDataMap) {
+        if (dataList == null) {
+            return;
+        }
+        for (Map<String, Object> map : dataList) {
+            String phone = (String) map.get(phoneKey);
+            if (phone != null && !phone.isEmpty()) {
+                phoneSet.add(phone);
+                if (!phoneDataMap.containsKey(phone)) {
+                    phoneDataMap.put(phone, map);
+                }
+            }
+        }
+    }
+
 }

+ 13 - 3
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/order/TradeOrderMapper.xml

@@ -505,7 +505,7 @@
         LEFT JOIN (select m2.order_id,sum(m2.refund_amount) refund_amount,sum(m2.origin_amount) origin_amount from trade_refund m2  where m2.refund_status = 6 and m2.refund_method !=2 GROUP BY m2.order_id) tr on td.id = tr.order_id
         LEFT JOIN trade_order_room_model torm on torm.order_id = td.id
         left join trade_insurance tins on tins.order_id = td.id
-        where td.deleted = 0 and tou.deleted = 0 and tins.deleted = 0
+        where td.deleted = 0 and tou.deleted = 0 and (tins.deleted = 0 or tins.deleted is null)
         <if test="vo.orderStatus!=null and vo.orderStatus.size()>0">
             and  td.order_status in
             <foreach collection="vo.orderStatus" item="item" separator=","  open="(" close=")">
@@ -2584,7 +2584,7 @@
                                                 LEFT JOIN product_voyage pv ON td.voyage_id = pv.id
                                                 LEFT JOIN resource_route rr ON pv.route_id = rr.id
         where DATE_FORMAT(td.travel_date, '%Y-%m-%d') = DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL (-#{day}) DAY), '%Y-%m-%d')
-          and td.deleted='0' and td.link_mobile is not null and td.order_status in (0,1,2,3,6,7,8,9,12,13,14,15) and rr.direction = #{direction};
+          and td.deleted='0' and td.link_mobile is not null and td.order_status in (0,1,2,3,6,7,8,9,12,13,14,15) and rr.direction = #{direction}
     </select>
 
     <select id="queryOrderJzPhone" resultType="java.util.Map">
@@ -2594,7 +2594,17 @@
                                            LEFT JOIN product_voyage pv ON td.voyage_id = pv.id
                                            LEFT JOIN resource_route rr ON pv.route_id = rr.id
         where DATE_FORMAT(td.travel_date, '%Y-%m-%d') = DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL (-#{day}) DAY), '%Y-%m-%d')
-          and td.deleted='0' and tzd.phone is not null and td.order_status in (0,1,2,3,6,7,8,9,12,13,14,15) and rr.direction = #{direction};
+          and td.deleted='0' and tzd.phone is not null and td.order_status in (0,1,2,3,6,7,8,9,12,13,14,15) and rr.direction = #{direction}
+    </select>
+
+    <select id="queryOrderVisitorMobile" resultType="java.util.Map">
+        select distinct tv.mobile from trade_order td
+                                           left join trade_visitor tv on tv.order_id = td.id
+                                           LEFT JOIN product_voyage pv ON td.voyage_id = pv.id
+                                           LEFT JOIN resource_route rr ON pv.route_id = rr.id
+        where DATE_FORMAT(td.travel_date, '%Y-%m-%d') = DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL (-#{day}) DAY), '%Y-%m-%d')
+          and td.deleted='0' and (tv.mobile is not null and tv.mobile !='') and tv.deleted='0' and td.order_status in (0,1,2,3,6,7,8,9,12,13,14,15) and rr.direction = #{direction}
+
     </select>
 </mapper>
 

+ 207 - 0
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/report/BankTransactionDetailsMapper.xml

@@ -0,0 +1,207 @@
+<?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.yc.ship.module.trade.dal.mysql.report.BankTransactionDetailsMapper">
+
+    <!-- 公共查询条件片段 -->
+    <sql id="queryConditions">
+        <if test="vo.transactionTimeStart != null">
+            AND t.transactionTime &gt;= #{vo.transactionTimeStart}
+        </if>
+        <if test="vo.transactionTimeEnd != null">
+            AND t.transactionTime &lt;= #{vo.transactionTimeEnd}
+        </if>
+        <if test="vo.boardDate != null">
+            AND t.boardingTime = #{vo.boardDate}
+        </if>
+        <if test="vo.orderNo != null and vo.orderNo != ''">
+            AND t.orderNo LIKE CONCAT('%', #{vo.orderNo}, '%')
+        </if>
+        <if test="vo.customerName != null and vo.customerName != ''">
+            AND t.travelAgencyName LIKE CONCAT('%', #{vo.customerName}, '%')
+        </if>
+        <if test="vo.paymentMethod != null">
+            AND t.paymentMethod = #{vo.paymentMethod}
+        </if>
+        <if test="vo.transactionType != null">
+            AND t.transactionType = #{vo.transactionType}
+        </if>
+    </sql>
+
+    <!-- 分页查询银行流水交易明细 -->
+    <select id="selectBankTransactionDetailsPage"
+            resultType="com.yc.ship.module.trade.controller.admin.report.vo.BankTransactionDetailsRespVO">
+        SELECT * FROM (
+            <!-- 1. 订单支付记录 -->
+            SELECT
+                DATE_FORMAT(pay.payment_date, '%Y-%m-%d %H:%i:%s') AS transactionTime,
+                DATE_FORMAT(voy.start_time, '%Y-%m-%d') AS boardingTime,
+                o.order_no AS orderNo,
+                o.source_name AS travelAgencyName,
+                pay.payment_type AS paymentMethod,
+                1 AS transactionType,
+                pay.pay_amount AS amount,
+                IFNULL(pay.payment_no, '') AS bankSerialNo
+            FROM trade_order_pay pay
+            INNER JOIN trade_order o ON pay.order_id = o.id AND o.deleted = 0
+            LEFT JOIN product_voyage voy ON o.voyage_id = voy.id AND voy.deleted = 0
+            WHERE pay.deleted = 0
+              AND pay.pay_status = 1
+              AND pay.sell_method != 101
+        and o.order_status in (3,6,7,8,9,10,12,13,15)
+        AND pay.refund_amount = 0
+        UNION ALL
+
+            <!-- 2. 订单退款记录 -->
+            SELECT
+                DATE_FORMAT(pay.payment_date, '%Y-%m-%d %H:%i:%s') AS transactionTime,
+                DATE_FORMAT(voy.start_time, '%Y-%m-%d') AS boardingTime,
+                o.order_no AS orderNo,
+                o.source_name AS travelAgencyName,
+                pay.payment_type AS paymentMethod,
+                2 AS transactionType,
+                -IFNULL(pay.refund_amount, 0) AS amount,
+                IFNULL(pay.payment_no, '') AS bankSerialNo
+            FROM trade_order_pay pay
+            INNER JOIN trade_order o ON pay.order_id = o.id AND o.deleted = 0
+            LEFT JOIN product_voyage voy ON o.voyage_id = voy.id AND voy.deleted = 0
+            WHERE pay.deleted = 0
+              AND pay.pay_status = 1
+              AND pay.refund_amount IS NOT NULL
+              AND pay.refund_amount &gt; 0
+
+            UNION ALL
+
+            <!-- 3. 充值记录(分销商在线充值) -->
+            SELECT
+                DATE_FORMAT(pay.payment_date, '%Y-%m-%d %H:%i:%s') AS transactionTime,
+                DATE_FORMAT(voy.start_time, '%Y-%m-%d') AS boardingTime,
+                pay.bill_no AS orderNo,
+                IFNULL(dsrs.name, '') AS travelAgencyName,
+                pay.payment_type AS paymentMethod,
+                3 AS transactionType,
+                pay.pay_amount AS amount,
+                IFNULL(pay.payment_no, '') AS bankSerialNo
+            FROM trade_order_pay pay
+             INNER JOIN trade_order o ON pay.order_id = o.id AND o.deleted = 0
+             LEFT JOIN product_voyage voy ON o.voyage_id = voy.id AND voy.deleted = 0
+            LEFT JOIN ota_distributor_self_recharge dsr ON pay.order_id = dsr.id AND dsr.deleted = 0 AND dsr.recharge_state = 1
+            LEFT JOIN ota_distributor dsrs ON dsr.distributor_id = dsrs.id AND dsrs.deleted = 0
+            WHERE pay.deleted = 0
+              AND pay.pay_status = 1
+              AND pay.sell_method = 101
+
+            UNION ALL
+
+            <!-- 4. 账单还款记录 -->
+        SELECT
+        DATE_FORMAT(pay.payment_date, '%Y-%m-%d %H:%i:%s') AS transactionTime,
+        '' AS boardingTime,
+        pay.bill_no AS orderNo,
+        o.source_name  AS travelAgencyName,
+        pay.payment_type AS paymentMethod,
+        4 AS transactionType,
+        pay.pay_amount AS amount,
+        IFNULL(pay.payment_no, '') AS bankSerialNo
+        FROM trade_order_pay pay
+        INNER JOIN trade_order o ON pay.order_id = o.id AND o.deleted = 0
+        INNER JOIN ota_bill_order obo ON obo.order_id = o.id
+        INNER JOIN ota_bill bill ON bill.id = obo.bill_id AND bill.deleted = 0
+        WHERE pay.deleted = 0
+        AND pay.pay_status = 1
+        AND bill.bill_status in (1,2)
+        ) t
+        WHERE 1 = 1
+        <include refid="queryConditions"/>
+        ORDER BY t.transactionTime DESC
+    </select>
+
+    <!-- 导出查询(与分页查询一致,不分页) -->
+    <select id="selectBankTransactionDetailsExportList"
+            resultType="com.yc.ship.module.trade.controller.admin.report.vo.BankTransactionDetailsRespVO">
+        SELECT * FROM (
+            <!-- 1. 订单支付记录 -->
+            SELECT
+                DATE_FORMAT(pay.payment_date, '%Y-%m-%d %H:%i:%s') AS transactionTime,
+                DATE_FORMAT(voy.start_time, '%Y-%m-%d') AS boardingTime,
+                o.order_no AS orderNo,
+                o.source_name AS travelAgencyName,
+                pay.payment_type AS paymentMethod,
+                1 AS transactionType,
+                pay.pay_amount AS amount,
+                IFNULL(pay.payment_no, '') AS bankSerialNo
+            FROM trade_order_pay pay
+            INNER JOIN trade_order o ON pay.order_id = o.id AND o.deleted = 0
+            LEFT JOIN product_voyage voy ON o.voyage_id = voy.id AND voy.deleted = 0
+            WHERE pay.deleted = 0
+              AND pay.pay_status = 1
+              AND pay.sell_method != 101
+        and o.order_status in (3,6,7,8,9,10,12,13,15)
+        AND pay.refund_amount = 0
+
+        UNION ALL
+
+            <!-- 2. 订单退款记录 -->
+            SELECT
+                DATE_FORMAT(pay.payment_date, '%Y-%m-%d %H:%i:%s') AS transactionTime,
+                DATE_FORMAT(voy.start_time, '%Y-%m-%d') AS boardingTime,
+                o.order_no AS orderNo,
+                o.source_name AS travelAgencyName,
+                pay.payment_type AS paymentMethod,
+                2 AS transactionType,
+                -IFNULL(pay.refund_amount, 0) AS amount,
+                IFNULL(pay.payment_no, '') AS bankSerialNo
+            FROM trade_order_pay pay
+            INNER JOIN trade_order o ON pay.order_id = o.id AND o.deleted = 0
+            LEFT JOIN product_voyage voy ON o.voyage_id = voy.id AND voy.deleted = 0
+            WHERE pay.deleted = 0
+              AND pay.pay_status = 1
+              AND pay.refund_amount IS NOT NULL
+              AND pay.refund_amount &gt; 0
+
+            UNION ALL
+
+            <!-- 3. 充值记录(分销商在线充值) -->
+            SELECT
+                DATE_FORMAT(pay.payment_date, '%Y-%m-%d %H:%i:%s') AS transactionTime,
+        DATE_FORMAT(voy.start_time, '%Y-%m-%d') AS boardingTime,
+        pay.bill_no AS orderNo,
+                IFNULL(dsrs.name, '') AS travelAgencyName,
+                pay.payment_type AS paymentMethod,
+                3 AS transactionType,
+                pay.pay_amount AS amount,
+                IFNULL(pay.payment_no, '') AS bankSerialNo
+            FROM trade_order_pay pay
+        INNER JOIN trade_order o ON pay.order_id = o.id AND o.deleted = 0
+        LEFT JOIN product_voyage voy ON o.voyage_id = voy.id AND voy.deleted = 0
+            LEFT JOIN ota_distributor_self_recharge dsr ON pay.order_id = dsr.id AND dsr.deleted = 0 AND dsr.recharge_state = 1
+            LEFT JOIN ota_distributor dsrs ON dsr.distributor_id = dsrs.id AND dsrs.deleted = 0
+            WHERE pay.deleted = 0
+              AND pay.pay_status = 1
+              AND pay.sell_method = 101
+
+            UNION ALL
+
+            <!-- 4. 账单还款记录 -->
+        SELECT
+        DATE_FORMAT(pay.payment_date, '%Y-%m-%d %H:%i:%s') AS transactionTime,
+        '' AS boardingTime,
+        pay.bill_no AS orderNo,
+        o.source_name  AS travelAgencyName,
+        pay.payment_type AS paymentMethod,
+        4 AS transactionType,
+        pay.pay_amount AS amount,
+        IFNULL(pay.payment_no, '') AS bankSerialNo
+        FROM trade_order_pay pay
+        INNER JOIN trade_order o ON pay.order_id = o.id AND o.deleted = 0
+        INNER JOIN ota_bill_order obo ON obo.order_id = o.id
+        INNER JOIN ota_bill bill ON bill.id = obo.bill_id AND bill.deleted = 0
+        WHERE pay.deleted = 0
+        AND pay.pay_status = 1
+        AND bill.bill_status in (1,2)
+        ) t
+        WHERE 1 = 1
+        <include refid="queryConditions"/>
+        ORDER BY t.transactionTime DESC
+    </select>
+
+</mapper>

+ 81 - 0
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/report/IncomeAuditMapper.xml

@@ -0,0 +1,81 @@
+<?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.yc.ship.module.trade.dal.mysql.report.IncomeAuditMapper">
+
+    <!-- 分页查询收入稽核表(按组团社分组,统计不同航向的收入) -->
+    <select id="selectIncomeAuditPage"
+            resultType="com.yc.ship.module.trade.controller.admin.report.vo.IncomeAuditRespVO">
+        SELECT
+            t.travel_agency AS travelAgency,
+            IFNULL(SUM(CASE WHEN t.direction = 1 THEN t.income_amount ELSE 0 END), 0) AS yichangToChongqing,
+            IFNULL(SUM(CASE WHEN t.direction != 1 THEN t.income_amount ELSE 0 END), 0) AS chongqingToYichang,
+            IFNULL(SUM(t.income_amount), 0) AS totalAmount
+        FROM (
+            SELECT
+                o.source_name AS travel_agency,
+                r.direction,
+                (o.pay_amount - COALESCE(refund_fee_sum.refundFee, 0)) AS income_amount
+            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 (
+                SELECT order_id, SUM(fee) AS refundFee
+                FROM trade_refund
+                WHERE deleted = 0 AND refund_status = 6
+                GROUP BY order_id
+            ) refund_fee_sum ON o.id = refund_fee_sum.order_id
+            WHERE o.deleted = 0
+            <if test="vo.voyageIds != null and vo.voyageIds.size() > 0">
+                AND o.voyage_id IN
+                <foreach collection="vo.voyageIds" item="voyageId" open="(" separator="," close=")">
+                    #{voyageId}
+                </foreach>
+            </if>
+            <if test="vo.travelAgency != null and vo.travelAgency != ''">
+                AND o.source_name LIKE CONCAT('%', #{vo.travelAgency}, '%')
+            </if>
+        ) t
+        WHERE t.travel_agency IS NOT NULL AND t.travel_agency != ''
+        GROUP BY t.travel_agency
+        ORDER BY totalAmount DESC
+    </select>
+
+    <!-- 导出查询(与分页查询条件一致,不分页) -->
+    <select id="selectIncomeAuditExportList"
+            resultType="com.yc.ship.module.trade.controller.admin.report.vo.IncomeAuditRespVO">
+        SELECT
+            t.travel_agency AS travelAgency,
+            IFNULL(SUM(CASE WHEN t.direction = 1 THEN t.income_amount ELSE 0 END), 0) AS yichangToChongqing,
+            IFNULL(SUM(CASE WHEN t.direction != 1 THEN t.income_amount ELSE 0 END), 0) AS chongqingToYichang,
+            IFNULL(SUM(t.income_amount), 0) AS totalAmount
+        FROM (
+            SELECT
+                o.source_name AS travel_agency,
+                r.direction,
+                (o.pay_amount - COALESCE(refund_fee_sum.refundFee, 0)) AS income_amount
+            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 (
+                SELECT order_id, SUM(fee) AS refundFee
+                FROM trade_refund
+                WHERE deleted = 0 AND refund_status = 6
+                GROUP BY order_id
+            ) refund_fee_sum ON o.id = refund_fee_sum.order_id
+            WHERE o.deleted = 0
+            <if test="vo.voyageIds != null and vo.voyageIds.size() > 0">
+                AND o.voyage_id IN
+                <foreach collection="vo.voyageIds" item="voyageId" open="(" separator="," close=")">
+                    #{voyageId}
+                </foreach>
+            </if>
+            <if test="vo.travelAgency != null and vo.travelAgency != ''">
+                AND o.source_name LIKE CONCAT('%', #{vo.travelAgency}, '%')
+            </if>
+        ) t
+        WHERE t.travel_agency IS NOT NULL AND t.travel_agency != ''
+        GROUP BY t.travel_agency
+        ORDER BY totalAmount DESC
+    </select>
+
+</mapper>

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

@@ -41,7 +41,7 @@
         LEFT JOIN (
             SELECT order_id, SUM(fee) AS refundFee
             FROM trade_refund
-            WHERE deleted = 0 AND refund_status IN (3)
+            WHERE deleted = 0 AND refund_status = 6
             GROUP BY order_id
         ) refund_fee_sum ON o.id = refund_fee_sum.order_id
         WHERE o.deleted = 0
@@ -115,7 +115,7 @@
         LEFT JOIN (
             SELECT order_id, SUM(fee) AS refundFee
             FROM trade_refund
-            WHERE deleted = 0 AND refund_status IN (3)
+            WHERE deleted = 0 AND refund_status = 6
             GROUP BY order_id
         ) refund_fee_sum ON o.id = refund_fee_sum.order_id
         WHERE o.deleted = 0