Переглянути джерело

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

lishiqiang 1 тиждень тому
батько
коміт
246e65973b
17 змінених файлів з 916 додано та 16 видалено
  1. 83 12
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/report/BankStatementReportController.java
  2. 36 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/report/vo/DistributorBalancePageReqVO.java
  3. 43 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/report/vo/DistributorBalanceRespVO.java
  4. 39 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/report/vo/PrepaidRechargeLedgerPageReqVO.java
  5. 45 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/report/vo/PrepaidRechargeLedgerRespVO.java
  6. 38 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/report/DistributorBalanceMapper.java
  7. 38 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/report/PrepaidRechargeLedgerMapper.java
  8. 35 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/report/DistributorBalanceService.java
  9. 35 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/report/PrepaidRechargeLedgerService.java
  10. 95 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/report/impl/DistributorBalanceServiceImpl.java
  11. 88 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/report/impl/PrepaidRechargeLedgerServiceImpl.java
  12. 4 4
      ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/orderjzdetail/OrderJzDetailMapper.xml
  13. 164 0
      ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/report/DistributorBalanceMapper.xml
  14. 173 0
      ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/report/PrepaidRechargeLedgerMapper.xml
  15. BIN
      ship-module-trade/ship-module-trade-biz/src/main/resources/templates/confirmation_template.xlsx
  16. BIN
      ship-module-trade/ship-module-trade-biz/src/main/resources/templates/tourist_template_agent.xlsx
  17. BIN
      ship-module-trade/ship-module-trade-biz/src/main/resources/templates/tourist_template_operator.xlsx

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

@@ -3,18 +3,8 @@ package com.yc.ship.module.trade.controller.admin.report;
 import com.yc.ship.framework.apilog.core.annotation.ApiAccessLog;
 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 com.yc.ship.module.trade.controller.admin.report.vo.*;
+import com.yc.ship.module.trade.service.report.*;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
@@ -56,6 +46,12 @@ public class BankStatementReportController {
     @Resource
     private IncomeAuditService incomeAuditService;
 
+    @Resource
+    private PrepaidRechargeLedgerService prepaidRechargeLedgerService;
+
+    @Resource
+    private DistributorBalanceService distributorBalanceService;
+
     /**
      * 查询银行对账报表分页
      *
@@ -182,4 +178,79 @@ public class BankStatementReportController {
         incomeAuditService.exportIncomeAuditExcel(pageReqVO, response);
     }
 
+
+
+    // ==================== 预存款充值流水接口 ====================
+
+    /**
+     * 查询预存款充值流水分页
+     *
+     * @param pageReqVO 分页查询条件
+     * @return 分页结果
+     */
+    @GetMapping("/prepaid-recharge-ledger/page")
+    @Operation(summary = "查询预存款充值流水分页")
+/*
+    @PreAuthorize("@ss.hasPermission('trade:report:bank-statement:query')")
+*/
+    public CommonResult<PageResult<PrepaidRechargeLedgerRespVO>> getPrepaidRechargeLedgerPage(@Valid PrepaidRechargeLedgerPageReqVO pageReqVO) {
+        PageResult<PrepaidRechargeLedgerRespVO> pageResult = prepaidRechargeLedgerService.getPrepaidRechargeLedgerPage(pageReqVO);
+        return success(pageResult);
+    }
+
+    /**
+     * 导出预存款充值流水 Excel(数字字段导出为数字格式)
+     *
+     * @param pageReqVO 查询条件
+     * @param response  HTTP响应
+     * @throws IOException IO异常
+     */
+    @GetMapping("/prepaid-recharge-ledger/export-excel")
+    @Operation(summary = "导出预存款充值流水 Excel")
+/*
+    @PreAuthorize("@ss.hasPermission('trade:report:bank-statement:export')")
+*/
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportPrepaidRechargeLedgerExcel(@Valid PrepaidRechargeLedgerPageReqVO pageReqVO,
+                                                 HttpServletResponse response) throws IOException {
+        prepaidRechargeLedgerService.exportPrepaidRechargeLedgerExcel(pageReqVO, response);
+    }
+
+    // ==================== 预存款余额表接口 ====================
+
+    /**
+     * 查询预存款余额表分页
+     *
+     * @param pageReqVO 分页查询条件
+     * @return 分页结果
+     */
+    @GetMapping("/distributor-balance/page")
+    @Operation(summary = "查询预存款余额表分页")
+/*
+    @PreAuthorize("@ss.hasPermission('trade:report:bank-statement:query')")
+*/
+    public CommonResult<PageResult<DistributorBalanceRespVO>> getDistributorBalancePage(@Valid DistributorBalancePageReqVO pageReqVO) {
+        PageResult<DistributorBalanceRespVO> pageResult = distributorBalanceService.getDistributorBalancePage(pageReqVO);
+        return success(pageResult);
+    }
+
+    /**
+     * 导出预存款余额表 Excel(数字字段导出为数字格式)
+     *
+     * @param pageReqVO 查询条件
+     * @param response  HTTP响应
+     * @throws IOException IO异常
+     */
+    @GetMapping("/distributor-balance/export-excel")
+    @Operation(summary = "导出预存款余额表 Excel")
+/*
+    @PreAuthorize("@ss.hasPermission('trade:report:bank-statement:export')")
+*/
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportDistributorBalanceExcel(@Valid DistributorBalancePageReqVO pageReqVO,
+                                               HttpServletResponse response) throws IOException {
+        distributorBalanceService.exportDistributorBalanceExcel(pageReqVO, response);
+    }
+
+
 }

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

@@ -0,0 +1,36 @@
+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 static com.yc.ship.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
+
+/**
+ * 预存款余额表分页查询 Request VO
+ *
+ * @author 管理员
+ */
+@Schema(description = "管理后台 - 预存款余额表分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class DistributorBalancePageReqVO extends PageParam {
+
+    @Schema(description = "组团社", example = "长江国际旅行社")
+    private String travelAgency;
+
+    @Schema(description = "开始日期", example = "2024-01-01")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+    private LocalDate startDate;
+
+    @Schema(description = "结束日期", example = "2024-01-31")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+    private LocalDate endDate;
+
+}

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

@@ -0,0 +1,43 @@
+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 管理员
+ */
+@Schema(description = "管理后台 - 预存款余额表 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class DistributorBalanceRespVO {
+
+    @Schema(description = "主键ID", hidden = true)
+    private Long id;
+
+    @Schema(description = "组团社", example = "长江国际旅行社")
+    @ExcelProperty("组团社")
+    private String travelAgency;
+
+    @Schema(description = "累计充值金额", example = "10000.00")
+    @NumberFormat("0.00")
+    @ExcelProperty("累计充值金额")
+    private BigDecimal totalRechargeAmount;
+
+    @Schema(description = "累计消费金额", example = "5000.00")
+    @NumberFormat("0.00")
+    @ExcelProperty("累计消费金额")
+    private BigDecimal totalConsumeAmount;
+
+    @Schema(description = "余额", example = "5000.00")
+    @NumberFormat("0.00")
+    @ExcelProperty("余额")
+    private BigDecimal balance;
+
+}

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

@@ -0,0 +1,39 @@
+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 static com.yc.ship.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
+
+/**
+ * 预存款充值流水分页查询 Request VO
+ *
+ * @author 管理员
+ */
+@Schema(description = "管理后台 - 预存款充值流水分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class PrepaidRechargeLedgerPageReqVO extends PageParam {
+
+    @Schema(description = "充值日期-开始", example = "2024-01-01")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+    private LocalDate rechargeDateStart;
+
+    @Schema(description = "充值日期-结束", example = "2024-01-31")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+    private LocalDate rechargeDateEnd;
+
+    @Schema(description = "组团社", example = "长江国际旅行社")
+    private String travelAgency;
+
+    @Schema(description = "充值方式(1:转账充值,2:自动充值)", example = "1")
+    private Integer paymentType;
+
+}

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

@@ -0,0 +1,45 @@
+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 管理员
+ */
+@Schema(description = "管理后台 - 预存款充值流水 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class PrepaidRechargeLedgerRespVO {
+
+    @Schema(description = "主键ID", hidden = true)
+    private Long id;
+
+    @Schema(description = "充值日期", example = "2024/01/15")
+    @ExcelProperty("充值日期")
+    private String rechargeDate;
+
+    @Schema(description = "组团社", example = "长江国际旅行社")
+    @ExcelProperty("组团社")
+    private String travelAgency;
+
+    @Schema(description = "充值方式", example = "转账充值")
+    @ExcelProperty("充值方式")
+    private String paymentTypeName;
+
+    @Schema(description = "交易金额", example = "10000.00")
+    @NumberFormat("0.00")
+    @ExcelProperty("交易金额")
+    private BigDecimal amount;
+
+    @Schema(description = "备注", example = "预存款充值")
+    @ExcelProperty("备注")
+    private String remark;
+
+}

+ 38 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/report/DistributorBalanceMapper.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.DistributorBalancePageReqVO;
+import com.yc.ship.module.trade.controller.admin.report.vo.DistributorBalanceRespVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 预存款余额表 Mapper
+ *
+ * @author 管理员
+ */
+@Mapper
+public interface DistributorBalanceMapper extends BaseMapperX<DistributorBalanceRespVO> {
+
+    /**
+     * 分页查询预存款余额表
+     *
+     * @param page 分页参数
+     * @param vo   查询条件
+     * @return 分页结果
+     */
+    IPage<DistributorBalanceRespVO> selectDistributorBalancePage(
+            IPage<DistributorBalanceRespVO> page, @Param("vo") DistributorBalancePageReqVO vo);
+
+    /**
+     * 导出查询预存款余额表(不分页,用于 Excel 导出)
+     *
+     * @param vo 查询条件
+     * @return 数据列表
+     */
+    List<DistributorBalanceRespVO> selectDistributorBalanceExportList(@Param("vo") DistributorBalancePageReqVO vo);
+
+}

+ 38 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/report/PrepaidRechargeLedgerMapper.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.PrepaidRechargeLedgerPageReqVO;
+import com.yc.ship.module.trade.controller.admin.report.vo.PrepaidRechargeLedgerRespVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 预存款充值流水 Mapper
+ *
+ * @author 管理员
+ */
+@Mapper
+public interface PrepaidRechargeLedgerMapper extends BaseMapperX<PrepaidRechargeLedgerRespVO> {
+
+    /**
+     * 分页查询预存款充值流水
+     *
+     * @param page 分页参数
+     * @param vo   查询条件
+     * @return 分页结果
+     */
+    IPage<PrepaidRechargeLedgerRespVO> selectPrepaidRechargeLedgerPage(
+            IPage<PrepaidRechargeLedgerRespVO> page, @Param("vo") PrepaidRechargeLedgerPageReqVO vo);
+
+    /**
+     * 导出查询预存款充值流水(不分页,用于 Excel 导出)
+     *
+     * @param vo 查询条件
+     * @return 数据列表
+     */
+    List<PrepaidRechargeLedgerRespVO> selectPrepaidRechargeLedgerExportList(@Param("vo") PrepaidRechargeLedgerPageReqVO vo);
+
+}

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

@@ -0,0 +1,35 @@
+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.DistributorBalancePageReqVO;
+import com.yc.ship.module.trade.controller.admin.report.vo.DistributorBalanceRespVO;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 预存款余额表 Service 接口
+ *
+ * @author 管理员
+ */
+public interface DistributorBalanceService {
+
+    /**
+     * 查询预存款余额表分页
+     *
+     * @param pageReqVO 分页查询条件
+     * @return 分页结果
+     */
+    PageResult<DistributorBalanceRespVO> getDistributorBalancePage(DistributorBalancePageReqVO pageReqVO);
+
+    /**
+     * 导出预存款余额表 Excel
+     *
+     * @param pageReqVO 查询条件
+     * @param response  HTTP响应
+     * @throws IOException IO异常
+     */
+    void exportDistributorBalanceExcel(DistributorBalancePageReqVO pageReqVO,
+                                        HttpServletResponse response) throws IOException;
+
+}

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

@@ -0,0 +1,35 @@
+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.PrepaidRechargeLedgerPageReqVO;
+import com.yc.ship.module.trade.controller.admin.report.vo.PrepaidRechargeLedgerRespVO;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 预存款充值流水 Service 接口
+ *
+ * @author 管理员
+ */
+public interface PrepaidRechargeLedgerService {
+
+    /**
+     * 查询预存款充值流水分页
+     *
+     * @param pageReqVO 分页查询条件
+     * @return 分页结果
+     */
+    PageResult<PrepaidRechargeLedgerRespVO> getPrepaidRechargeLedgerPage(PrepaidRechargeLedgerPageReqVO pageReqVO);
+
+    /**
+     * 导出预存款充值流水 Excel
+     *
+     * @param pageReqVO 查询条件
+     * @param response  HTTP响应
+     * @throws IOException IO异常
+     */
+    void exportPrepaidRechargeLedgerExcel(PrepaidRechargeLedgerPageReqVO pageReqVO,
+                                          HttpServletResponse response) throws IOException;
+
+}

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

@@ -0,0 +1,95 @@
+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.DistributorBalancePageReqVO;
+import com.yc.ship.module.trade.controller.admin.report.vo.DistributorBalanceRespVO;
+import com.yc.ship.module.trade.dal.mysql.report.DistributorBalanceMapper;
+import com.yc.ship.module.trade.service.report.DistributorBalanceService;
+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 管理员
+ */
+@Service
+@Slf4j
+public class DistributorBalanceServiceImpl implements DistributorBalanceService {
+
+    @Resource
+    private DistributorBalanceMapper distributorBalanceMapper;
+
+    /**
+     * 查询预存款余额表分页
+     *
+     * @param pageReqVO 分页查询条件
+     * @return 分页结果
+     */
+    @Override
+    public PageResult<DistributorBalanceRespVO> getDistributorBalancePage(DistributorBalancePageReqVO pageReqVO) {
+        IPage<DistributorBalanceRespVO> page = distributorBalanceMapper.selectDistributorBalancePage(
+                new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO);
+        return new PageResult<>(page.getRecords(), page.getTotal());
+    }
+
+    /**
+     * 导出预存款余额表 Excel
+     *
+     * @param pageReqVO 查询条件
+     * @param response  HTTP响应
+     * @throws IOException IO异常
+     */
+    @Override
+    public void exportDistributorBalanceExcel(DistributorBalancePageReqVO pageReqVO,
+                                               HttpServletResponse response) throws IOException {
+        // 1. 查询所有数据(不分页)
+        List<DistributorBalanceRespVO> list = distributorBalanceMapper.selectDistributorBalanceExportList(pageReqVO);
+        if (CollUtil.isEmpty(list)) {
+            log.warn("[exportDistributorBalanceExcel] 无数据可导出");
+        } else {
+            // 2. 计算合计行并追加到列表末尾
+            DistributorBalanceRespVO summary = calculateSummary(list);
+            list.add(summary);
+        }
+        // 3. 导出 Excel(数字字段使用 @NumberFormat 注解确保导出为数字格式)
+        ExcelUtils.write(response, "预存款余额表.xls", "预存款余额表", DistributorBalanceRespVO.class, list);
+    }
+
+    /**
+     * 计算合计行数据
+     */
+    private DistributorBalanceRespVO calculateSummary(List<DistributorBalanceRespVO> list) {
+        DistributorBalanceRespVO summary = new DistributorBalanceRespVO();
+        summary.setTravelAgency("合计");
+
+        BigDecimal totalRechargeAmount = BigDecimal.ZERO;
+        BigDecimal totalConsumeAmount = BigDecimal.ZERO;
+        BigDecimal totalBalance = BigDecimal.ZERO;
+
+        for (DistributorBalanceRespVO item : list) {
+            totalRechargeAmount = totalRechargeAmount.add(
+                    item.getTotalRechargeAmount() != null ? item.getTotalRechargeAmount() : BigDecimal.ZERO);
+            totalConsumeAmount = totalConsumeAmount.add(
+                    item.getTotalConsumeAmount() != null ? item.getTotalConsumeAmount() : BigDecimal.ZERO);
+            totalBalance = totalBalance.add(
+                    item.getBalance() != null ? item.getBalance() : BigDecimal.ZERO);
+        }
+
+        summary.setTotalRechargeAmount(totalRechargeAmount);
+        summary.setTotalConsumeAmount(totalConsumeAmount);
+        summary.setBalance(totalBalance);
+        return summary;
+    }
+
+}

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

@@ -0,0 +1,88 @@
+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.PrepaidRechargeLedgerPageReqVO;
+import com.yc.ship.module.trade.controller.admin.report.vo.PrepaidRechargeLedgerRespVO;
+import com.yc.ship.module.trade.dal.mysql.report.PrepaidRechargeLedgerMapper;
+import com.yc.ship.module.trade.service.report.PrepaidRechargeLedgerService;
+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 管理员
+ */
+@Service
+@Slf4j
+public class PrepaidRechargeLedgerServiceImpl implements PrepaidRechargeLedgerService {
+
+    @Resource
+    private PrepaidRechargeLedgerMapper prepaidRechargeLedgerMapper;
+
+    /**
+     * 查询预存款充值流水分页
+     *
+     * @param pageReqVO 分页查询条件
+     * @return 分页结果
+     */
+    @Override
+    public PageResult<PrepaidRechargeLedgerRespVO> getPrepaidRechargeLedgerPage(PrepaidRechargeLedgerPageReqVO pageReqVO) {
+        IPage<PrepaidRechargeLedgerRespVO> page = prepaidRechargeLedgerMapper.selectPrepaidRechargeLedgerPage(
+                new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO);
+        return new PageResult<>(page.getRecords(), page.getTotal());
+    }
+
+    /**
+     * 导出预存款充值流水 Excel
+     *
+     * @param pageReqVO 查询条件
+     * @param response  HTTP响应
+     * @throws IOException IO异常
+     */
+    @Override
+    public void exportPrepaidRechargeLedgerExcel(PrepaidRechargeLedgerPageReqVO pageReqVO,
+                                                 HttpServletResponse response) throws IOException {
+        // 1. 查询所有数据(不分页)
+        List<PrepaidRechargeLedgerRespVO> list = prepaidRechargeLedgerMapper.selectPrepaidRechargeLedgerExportList(pageReqVO);
+        if (CollUtil.isEmpty(list)) {
+            log.warn("[exportPrepaidRechargeLedgerExcel] 无数据可导出");
+        } else {
+            // 2. 计算合计行并追加到列表末尾
+            PrepaidRechargeLedgerRespVO summary = calculateSummary(list);
+            list.add(summary);
+        }
+        // 3. 导出 Excel(数字字段使用 @NumberFormat 注解确保导出为数字格式)
+        ExcelUtils.write(response, "预存款充值流水表.xls", "预存款充值流水", PrepaidRechargeLedgerRespVO.class, list);
+    }
+
+    /**
+     * 计算合计行数据
+     */
+    private PrepaidRechargeLedgerRespVO calculateSummary(List<PrepaidRechargeLedgerRespVO> list) {
+        PrepaidRechargeLedgerRespVO summary = new PrepaidRechargeLedgerRespVO();
+        summary.setRechargeDate("合计");
+        summary.setTravelAgency(null);
+        summary.setPaymentTypeName(null);
+        summary.setRemark(null);
+
+        BigDecimal totalAmount = BigDecimal.ZERO;
+        for (PrepaidRechargeLedgerRespVO item : list) {
+            totalAmount = totalAmount.add(
+                    item.getAmount() != null ? item.getAmount() : BigDecimal.ZERO);
+        }
+        summary.setAmount(totalAmount);
+        return summary;
+    }
+
+}

+ 4 - 4
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/orderjzdetail/OrderJzDetailMapper.xml

@@ -45,7 +45,7 @@
         <if test="vo.signStatus != null and vo.signStatus == 0">
             and d.sign_time is null
         </if>
-        order by d.address asc, d.arrive_time asc
+        order by d.address + 0 asc, d.arrive_time + 0 asc
     </select>
 
     <!-- selectVisitorExportList: 导出游客接站明细,条件与selectPage2一致,不分页 -->
@@ -84,7 +84,7 @@
         <if test="vo.signStatus != null and vo.signStatus == 0">
             and d.sign_time is null
         </if>
-        order by d.address asc, d.arrive_time asc
+        order by d.address + 0 asc, d.arrive_time + 0 asc
     </select>
 
     <select id="selectPage3" resultType="map">
@@ -152,7 +152,7 @@
         <if test="vo.otaId != null and vo.otaId != ''">
             and o.source_id = #{vo.otaId}
         </if>
-        order by d.address asc, d.arrive_time asc
+        order by d.address + 0 asc, d.arrive_time + 0 asc
     </select>
 
     <!-- 赠送行程导出查询:条件与selectGiftPage一致,不分页 -->
@@ -197,7 +197,7 @@
         <if test="vo.otaId != null and vo.otaId != ''">
             and o.source_id = #{vo.otaId}
         </if>
-        order by d.address asc, d.arrive_time asc
+        order by d.address + 0 asc, d.arrive_time + 0 asc
     </select>
 
     <!-- 赠送行程补登订单查询:根据订单号/证件号后4位搜索,关联trade_detail过滤product_id -->

+ 164 - 0
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/report/DistributorBalanceMapper.xml

@@ -0,0 +1,164 @@
+<?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.DistributorBalanceMapper">
+
+    <!-- 分页查询预存款余额表 -->
+    <!-- 
+        业务说明:
+        1. 以分销商(ota_distributor)为主表
+        2. 累计充值金额 = 后台充值(ota_distributor_recharge) + 自助充值(ota_distributor_self_recharge) 在日期范围内的成功金额
+        3. 累计消费金额 = ota_trade_log 中消费类型(trade_mode=2)在日期范围内的交易金额
+        4. 余额 = 分销商当前余额(balance)
+    -->
+    <select id="selectDistributorBalancePage"
+            resultType="com.yc.ship.module.trade.controller.admin.report.vo.DistributorBalanceRespVO">
+        SELECT * FROM (
+            SELECT
+                d.id,
+                d.name AS travelAgency,
+                IFNULL(recharge.total_recharge, 0) AS totalRechargeAmount,
+                IFNULL(consume.total_consume, 0) AS totalConsumeAmount,
+                IFNULL(d.balance, 0) AS balance
+            FROM ota_distributor d
+            LEFT JOIN (
+                SELECT 
+                    distributor_id,
+                    SUM(recharge_amount) AS total_recharge
+                FROM (
+                    SELECT 
+                        r.distributor_id,
+                        SUM(tl.trade_amount) AS recharge_amount
+                    FROM ota_distributor_recharge r
+                    INNER JOIN ota_trade_log tl ON r.recharge_log_id = tl.id AND tl.deleted = 0 AND tl.trade_type = 1
+                    WHERE r.deleted = 0
+                      AND r.status = 1
+                    AND tl.trade_mode = 1
+                     AND tl.trade_type = 1
+                    <if test="vo.startDate != null">
+                        AND DATE(tl.trade_time) &gt;= #{vo.startDate}
+                    </if>
+                    <if test="vo.endDate != null">
+                        AND DATE(tl.trade_time) &lt;= #{vo.endDate}
+                    </if>
+                    GROUP BY r.distributor_id
+                    UNION ALL
+                    SELECT 
+                        sr.distributor_id,
+                        SUM(sr.money) AS recharge_amount
+                    FROM ota_distributor_self_recharge sr
+                    INNER JOIN ota_trade_log tl ON tl.id = sr.recharge_log_id AND tl.deleted = 0
+                    WHERE sr.deleted = 0
+                      AND sr.recharge_state = 1
+                      AND tl.trade_type = 1
+                    <if test="vo.startDate != null">
+                        AND DATE(tl.trade_time) &gt;= #{vo.startDate}
+                    </if>
+                    <if test="vo.endDate != null">
+                        AND DATE(tl.trade_time) &lt;= #{vo.endDate}
+                    </if>
+                    GROUP BY sr.distributor_id
+                ) t
+                GROUP BY distributor_id
+            ) recharge ON d.id = recharge.distributor_id
+            LEFT JOIN (
+                SELECT 
+                    tl.distributor_id,
+                    SUM(tl.trade_amount) AS total_consume
+                FROM ota_trade_log tl
+                WHERE tl.deleted = 0
+                  AND tl.trade_mode = 2
+                  AND tl.trade_type = 1
+                <if test="vo.startDate != null">
+                    AND DATE(tl.trade_time) &gt;= #{vo.startDate}
+                </if>
+                <if test="vo.endDate != null">
+                    AND DATE(tl.trade_time) &lt;= #{vo.endDate}
+                </if>
+                GROUP BY tl.distributor_id
+            ) consume ON d.id = consume.distributor_id
+            WHERE d.deleted = 0
+            <if test="vo.travelAgency != null and vo.travelAgency != ''">
+                AND d.name LIKE CONCAT('%', #{vo.travelAgency}, '%')
+            </if>
+        ) temp
+        WHERE (totalRechargeAmount <![CDATA[>]]> 0 OR totalConsumeAmount <![CDATA[>]]> 0 OR balance <![CDATA[>]]> 0)
+        ORDER BY id DESC
+    </select>
+
+    <!-- 导出查询(与分页查询条件一致,不分页) -->
+    <select id="selectDistributorBalanceExportList"
+            resultType="com.yc.ship.module.trade.controller.admin.report.vo.DistributorBalanceRespVO">
+        SELECT * FROM (
+            SELECT
+                d.id,
+                d.name AS travelAgency,
+                IFNULL(recharge.total_recharge, 0) AS totalRechargeAmount,
+                IFNULL(consume.total_consume, 0) AS totalConsumeAmount,
+                IFNULL(d.balance, 0) AS balance
+            FROM ota_distributor d
+            LEFT JOIN (
+                SELECT 
+                    distributor_id,
+                    SUM(recharge_amount) AS total_recharge
+                FROM (
+                    SELECT 
+                        r.distributor_id,
+                        SUM(tl.trade_amount) AS recharge_amount
+                    FROM ota_distributor_recharge r
+                    INNER JOIN ota_trade_log tl ON r.recharge_log_id = tl.id AND tl.deleted = 0 AND tl.trade_type = 1
+                    WHERE r.deleted = 0
+                      AND r.status = 1
+                      AND tl.trade_mode = 1
+                      AND tl.trade_type = 1
+                    <if test="vo.startDate != null">
+                        AND DATE(tl.trade_time) &gt;= #{vo.startDate}
+                    </if>
+                    <if test="vo.endDate != null">
+                        AND DATE(tl.trade_time) &lt;= #{vo.endDate}
+                    </if>
+                    GROUP BY r.distributor_id
+                    UNION ALL
+                    SELECT 
+                        sr.distributor_id,
+                        SUM(sr.money) AS recharge_amount
+                    FROM ota_distributor_self_recharge sr
+                    INNER JOIN ota_trade_log tl ON tl.id = sr.recharge_log_id AND tl.deleted = 0
+                    WHERE sr.deleted = 0
+                      AND sr.recharge_state = 1
+                      AND tl.trade_type = 1
+                    <if test="vo.startDate != null">
+                        AND DATE(tl.trade_time) &gt;= #{vo.startDate}
+                    </if>
+                    <if test="vo.endDate != null">
+                        AND DATE(tl.trade_time) &lt;= #{vo.endDate}
+                    </if>
+                    GROUP BY sr.distributor_id
+                ) t
+                GROUP BY distributor_id
+            ) recharge ON d.id = recharge.distributor_id
+            LEFT JOIN (
+                SELECT 
+                    tl.distributor_id,
+                    SUM(tl.trade_amount) AS total_consume
+                FROM ota_trade_log tl
+                WHERE tl.deleted = 0
+                  AND tl.trade_mode = 2
+                  AND tl.trade_type = 1
+                <if test="vo.startDate != null">
+                    AND DATE(tl.trade_time) &gt;= #{vo.startDate}
+                </if>
+                <if test="vo.endDate != null">
+                    AND DATE(tl.trade_time) &lt;= #{vo.endDate}
+                </if>
+                GROUP BY tl.distributor_id
+            ) consume ON d.id = consume.distributor_id
+            WHERE d.deleted = 0
+            <if test="vo.travelAgency != null and vo.travelAgency != ''">
+                AND d.name LIKE CONCAT('%', #{vo.travelAgency}, '%')
+            </if>
+        ) temp
+        WHERE (totalRechargeAmount <![CDATA[>]]> 0 OR totalConsumeAmount <![CDATA[>]]> 0 OR balance <![CDATA[>]]> 0)
+        ORDER BY id DESC
+    </select>
+
+</mapper>

+ 173 - 0
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/report/PrepaidRechargeLedgerMapper.xml

@@ -0,0 +1,173 @@
+<?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.PrepaidRechargeLedgerMapper">
+
+    <!-- 分页查询预存款充值流水 -->
+    <!-- 业务说明:
+         1. 后台充值(recharge_mode=1): ota_distributor_recharge + ota_trade_log 关联,支付方式固定为"后台充值"
+         2. 自助充值(在线支付): ota_distributor_self_recharge + ota_trade_log 关联,支付方式来自 pay_type 字段
+         3. 使用 UNION ALL 合并两种充值类型,提升查询性能
+         支付方式筛选值:1-后台充值 2-微信 3-支付宝 4-云闪付 5-银行卡
+    -->
+    <select id="selectPrepaidRechargeLedgerPage"
+            resultType="com.yc.ship.module.trade.controller.admin.report.vo.PrepaidRechargeLedgerRespVO">
+        <!-- 后台充值:recharge_mode=1,通过 ota_distributor_recharge.recharge_log_id 关联 ota_trade_log.id -->
+        SELECT
+            r.id,
+            DATE_FORMAT(tl.trade_time, '%Y/%m/%d %H:%i:%s') AS rechargeDate,
+            d.name AS travelAgency,
+            '后台充值' AS paymentTypeName,
+            r.money AS amount,
+            r.apply_remark AS remark,
+            tl.trade_time AS sort_time
+        FROM ota_distributor_recharge r
+        INNER JOIN ota_distributor d ON r.distributor_id = d.id AND d.deleted = 0
+        INNER JOIN ota_trade_log tl ON r.recharge_log_id = tl.id AND tl.deleted = 0 AND tl.trade_type = 1
+        WHERE r.deleted = 0
+          AND r.status = 1
+        <if test="vo.rechargeDateStart != null">
+            AND DATE(tl.trade_time) &gt;= #{vo.rechargeDateStart}
+        </if>
+        <if test="vo.rechargeDateEnd != null">
+            AND DATE(tl.trade_time) &lt;= #{vo.rechargeDateEnd}
+        </if>
+        <if test="vo.travelAgency != null and vo.travelAgency != ''">
+            AND d.name LIKE CONCAT('%', #{vo.travelAgency}, '%')
+        </if>
+        <!-- 支付方式筛选:1-后台充值 -->
+        <if test="vo.paymentType != null and vo.paymentType != 1">
+            AND 1=0
+        </if>
+        UNION ALL
+        <!-- 自助充值:通过 ota_distributor_self_recharge.id 关联 ota_trade_log.order_id -->
+        SELECT
+            sr.id,
+            DATE_FORMAT(tl.trade_time, '%Y/%m/%d %H:%i:%s') AS rechargeDate,
+            d.name AS travelAgency,
+            CASE sr.pay_type
+                WHEN 1 THEN '微信'
+                WHEN 2 THEN '支付宝'
+                WHEN 3 THEN '云闪付'
+                WHEN 9 THEN '对公转账'
+                ELSE '其他'
+            END AS paymentTypeName,
+            sr.money AS amount,
+            NULL AS remark,
+            tl.trade_time AS sort_time
+        FROM ota_distributor_self_recharge sr
+        INNER JOIN ota_distributor d ON sr.distributor_id = d.id AND d.deleted = 0
+        INNER JOIN ota_trade_log tl ON tl.order_id = CAST(sr.id AS CHAR) AND tl.deleted = 0 AND tl.trade_type = 11
+        WHERE sr.deleted = 0
+          AND sr.recharge_state = 1
+        <if test="vo.rechargeDateStart != null">
+            AND DATE(tl.trade_time) &gt;= #{vo.rechargeDateStart}
+        </if>
+        <if test="vo.rechargeDateEnd != null">
+            AND DATE(tl.trade_time) &lt;= #{vo.rechargeDateEnd}
+        </if>
+        <if test="vo.travelAgency != null and vo.travelAgency != ''">
+            AND d.name LIKE CONCAT('%', #{vo.travelAgency}, '%')
+        </if>
+        <!-- 支付方式筛选:2-微信 3-支付宝 4-云闪付 5-对公转账 -->
+        <if test="vo.paymentType != null">
+            <if test="vo.paymentType == 2">
+                AND sr.pay_type = 1
+            </if>
+            <if test="vo.paymentType == 3">
+                AND sr.pay_type = 2
+            </if>
+            <if test="vo.paymentType == 4">
+                AND sr.pay_type = 3
+            </if>
+            <if test="vo.paymentType == 5">
+                AND sr.pay_type = 9
+            </if>
+            <if test="vo.paymentType == 1">
+                AND 1=0
+            </if>
+        </if>
+        ORDER BY sort_time DESC
+    </select>
+
+    <!-- 导出查询(与分页查询条件一致,不分页) -->
+    <select id="selectPrepaidRechargeLedgerExportList"
+            resultType="com.yc.ship.module.trade.controller.admin.report.vo.PrepaidRechargeLedgerRespVO">
+        <!-- 后台充值:通过 ota_distributor_recharge.recharge_log_id 关联 ota_trade_log.id -->
+        SELECT
+            r.id,
+            DATE_FORMAT(tl.trade_time, '%Y/%m/%d %H:%i:%s') AS rechargeDate,
+            d.name AS travelAgency,
+            '后台充值' AS paymentTypeName,
+            r.money AS amount,
+            r.apply_remark AS remark,
+            tl.trade_time AS sort_time
+        FROM ota_distributor_recharge r
+        INNER JOIN ota_distributor d ON r.distributor_id = d.id AND d.deleted = 0
+        INNER JOIN ota_trade_log tl ON r.recharge_log_id = tl.id AND tl.deleted = 0 AND tl.trade_type = 1
+        WHERE r.deleted = 0
+          AND r.status = 1
+        <if test="vo.rechargeDateStart != null">
+            AND DATE(tl.trade_time) &gt;= #{vo.rechargeDateStart}
+        </if>
+        <if test="vo.rechargeDateEnd != null">
+            AND DATE(tl.trade_time) &lt;= #{vo.rechargeDateEnd}
+        </if>
+        <if test="vo.travelAgency != null and vo.travelAgency != ''">
+            AND d.name LIKE CONCAT('%', #{vo.travelAgency}, '%')
+        </if>
+        <!-- 支付方式筛选:1-后台充值 -->
+        <if test="vo.paymentType != null and vo.paymentType != 1">
+            AND 1=0
+        </if>
+        UNION ALL
+        <!-- 自助充值:通过 ota_distributor_self_recharge.id 关联 ota_trade_log.order_id -->
+        SELECT
+            sr.id,
+            DATE_FORMAT(tl.trade_time, '%Y/%m/%d %H:%i:%s') AS rechargeDate,
+            d.name AS travelAgency,
+            CASE sr.pay_type
+                WHEN 1 THEN '微信'
+                WHEN 2 THEN '支付宝'
+                WHEN 3 THEN '云闪付'
+                WHEN 9 THEN '对公转账'
+                ELSE '其他'
+            END AS paymentTypeName,
+            sr.money AS amount,
+            NULL AS remark,
+            tl.trade_time AS sort_time
+        FROM ota_distributor_self_recharge sr
+        INNER JOIN ota_distributor d ON sr.distributor_id = d.id AND d.deleted = 0
+        INNER JOIN ota_trade_log tl ON tl.order_id = CAST(sr.id AS CHAR) AND tl.deleted = 0 AND tl.trade_type = 11
+        WHERE sr.deleted = 0
+          AND sr.recharge_state = 1
+        <if test="vo.rechargeDateStart != null">
+            AND DATE(tl.trade_time) &gt;= #{vo.rechargeDateStart}
+        </if>
+        <if test="vo.rechargeDateEnd != null">
+            AND DATE(tl.trade_time) &lt;= #{vo.rechargeDateEnd}
+        </if>
+        <if test="vo.travelAgency != null and vo.travelAgency != ''">
+            AND d.name LIKE CONCAT('%', #{vo.travelAgency}, '%')
+        </if>
+        <!-- 支付方式筛选:2-微信 3-支付宝 4-云闪付 5-对公转账 -->
+        <if test="vo.paymentType != null">
+            <if test="vo.paymentType == 2">
+                AND sr.pay_type = 1
+            </if>
+            <if test="vo.paymentType == 3">
+                AND sr.pay_type = 2
+            </if>
+            <if test="vo.paymentType == 4">
+                AND sr.pay_type = 3
+            </if>
+            <if test="vo.paymentType == 5">
+                AND sr.pay_type = 9
+            </if>
+            <if test="vo.paymentType == 1">
+                AND 1=0
+            </if>
+        </if>
+        ORDER BY sort_time DESC
+    </select>
+
+</mapper>

BIN
ship-module-trade/ship-module-trade-biz/src/main/resources/templates/confirmation_template.xlsx


BIN
ship-module-trade/ship-module-trade-biz/src/main/resources/templates/tourist_template_agent.xlsx


BIN
ship-module-trade/ship-module-trade-biz/src/main/resources/templates/tourist_template_operator.xlsx