瀏覽代碼

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

lishiqiang 1 天之前
父節點
當前提交
49aa33a598
共有 12 個文件被更改,包括 766 次插入0 次删除
  1. 87 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/business/DailyBusinessStatisticsController.java
  2. 18 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/business/vo/DailyBusinessStatisticsReqVO.java
  3. 48 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/business/vo/DailyBusinessStatisticsRespVO.java
  4. 71 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/report/BankStatementReportController.java
  5. 33 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/report/vo/BankStatementReportPageReqVO.java
  6. 58 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/report/vo/BankStatementReportRespVO.java
  7. 9 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeOrderMapper.java
  8. 13 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/business/DailyBusinessStatisticsService.java
  9. 29 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/business/DailyBusinessStatisticsServiceImpl.java
  10. 34 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/report/BankStatementReportService.java
  11. 329 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/report/impl/BankStatementReportServiceImpl.java
  12. 37 0
      ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/order/TradeOrderMapper.xml

+ 87 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/business/DailyBusinessStatisticsController.java

@@ -0,0 +1,87 @@
+package com.yc.ship.module.trade.controller.admin.business;
+
+import com.yc.ship.framework.common.pojo.CommonResult;
+import com.yc.ship.framework.common.pojo.PageParam;
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.common.util.object.BeanUtils;
+import com.yc.ship.framework.excel.core.util.ExcelUtils;
+import com.yc.ship.framework.operatelog.core.annotations.OperateLog;
+import com.yc.ship.module.trade.controller.admin.business.vo.DailyBusinessStatisticsReqVO;
+import com.yc.ship.module.trade.controller.admin.business.vo.DailyBusinessStatisticsRespVO;
+import com.yc.ship.module.trade.service.business.DailyBusinessStatisticsService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.apache.commons.io.IOUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import java.io.IOException;
+import java.util.List;
+
+import static com.yc.ship.framework.common.pojo.CommonResult.success;
+import static com.yc.ship.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
+
+@Tag(name = "管理后台 - 营业统计日报")
+@RestController
+@RequestMapping("/trade/business")
+@Validated
+public class DailyBusinessStatisticsController {
+    @Resource
+    private DailyBusinessStatisticsService dailyBusinessStatisticsService;
+
+    @PostMapping("/dailyBusinessStatistics/page")
+    @Operation(summary = "获得营业统计日报分页")
+    public CommonResult<PageResult<DailyBusinessStatisticsRespVO>> getDailyBusinessStatisticsPage(@RequestBody DailyBusinessStatisticsReqVO pageReqVO) {
+        PageResult<DailyBusinessStatisticsRespVO> pageResult = dailyBusinessStatisticsService.getDailyBusinessStatisticsPage(pageReqVO);
+        return success(pageResult);
+    }
+
+    @GetMapping("/dailyBusinessStatistics/export-excel")
+    @Operation(summary = "导出营业统计日报 Excel")
+    @OperateLog(type = EXPORT,enable = false)
+    public void exportDailyBusinessStatisticsList(@Valid DailyBusinessStatisticsReqVO pageReqVO, HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<DailyBusinessStatisticsRespVO> list = dailyBusinessStatisticsService.getDailyBusinessStatisticsPage(pageReqVO).getList();
+        // 计算合计
+        DailyBusinessStatisticsRespVO total = new DailyBusinessStatisticsRespVO();
+        total.setSourceName("合计");
+        int totalAdultCount = 0, totalChildCount = 0, totalInfantCount = 0, totalWithCount = 0;
+        int totalLeaderCount = 0, totalFreeCount = 0, totalFreeNum = 0, totalTotalCount = 0;
+        int totalActualAmount = 0, totalValidCount = 0;
+
+        for (DailyBusinessStatisticsRespVO item : list) {
+            totalAdultCount += item.getAdultCount() == null ? 0 : item.getAdultCount();
+            totalChildCount += item.getChildCount() == null ? 0 : item.getChildCount();
+            totalInfantCount += item.getInfantCount() == null ? 0 : item.getInfantCount();
+            totalWithCount += item.getWithCount() == null ? 0 : item.getWithCount();
+            totalLeaderCount += item.getLeaderCount() == null ? 0 : item.getLeaderCount();
+            totalFreeCount += item.getFreeCount() == null ? 0 : item.getFreeCount();
+            totalFreeNum += item.getFreeNum() == null ? 0 : item.getFreeNum();
+            totalTotalCount += item.getTotalCount() == null ? 0 : item.getTotalCount();
+            totalActualAmount += item.getActualAmount() == null ? 0 : item.getActualAmount();
+            totalValidCount += item.getValidCount() == null ? 0 : item.getValidCount();
+        }
+
+        total.setAdultCount(totalAdultCount);
+        total.setChildCount(totalChildCount);
+        total.setInfantCount(totalInfantCount);
+        total.setWithCount(totalWithCount);
+        total.setLeaderCount(totalLeaderCount);
+        total.setFreeCount(totalFreeCount);
+        total.setFreeNum(totalFreeNum);
+        total.setTotalCount(totalTotalCount);
+        total.setActualAmount(totalActualAmount);
+        total.setValidCount(totalValidCount);
+
+        list.add(total);
+
+        // 导出 Excel
+        ExcelUtils.write(response, "营业统计日报.xls", "数据", DailyBusinessStatisticsRespVO.class,
+                BeanUtils.toBean(list, DailyBusinessStatisticsRespVO.class));
+    }
+
+}

+ 18 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/business/vo/DailyBusinessStatisticsReqVO.java

@@ -0,0 +1,18 @@
+package com.yc.ship.module.trade.controller.admin.business.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;
+
+@Schema(description = "管理后台 - 营业统计日报 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class DailyBusinessStatisticsReqVO  extends PageParam {
+    @Schema(description = "航次ID", example = "13069")
+    private String voyageId;
+    @Schema(description = "航线ID", example = "11291")
+    private Long routeId;
+}

+ 48 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/business/vo/DailyBusinessStatisticsRespVO.java

@@ -0,0 +1,48 @@
+package com.yc.ship.module.trade.controller.admin.business.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 营业统计日报 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class DailyBusinessStatisticsRespVO {
+    @Schema(description = "组团社ID")
+    private String sourceId;
+    @Schema(description = "组团社")
+    @ExcelProperty("组团社")
+    private String sourceName;
+    @Schema(description = "成人数")
+    @ExcelProperty("成人数")
+    private Integer adultCount;
+    @Schema(description = "儿童数")
+    @ExcelProperty("儿童数")
+    private Integer childCount;
+    @Schema(description = "婴儿数")
+    @ExcelProperty("婴儿数")
+    private Integer infantCount;
+    @Schema(description = "陪同数")
+    @ExcelProperty("陪同数")
+    private Integer withCount;
+    @Schema(description = "领队数")
+    @ExcelProperty("领队数")
+    private Integer leaderCount;
+    //TODO 免票人数现在没有统计,直接取0
+    @Schema(description = "免票")
+    @ExcelProperty("免票")
+    private Integer freeCount;
+    @Schema(description = "16免1")
+    @ExcelProperty("16免1")
+    private Integer freeNum;
+    @Schema(description = "总人数")
+    @ExcelProperty("总人数")
+    private Integer totalCount;
+    @Schema(description = "营业额(含税)")
+    @ExcelProperty("营业额(含税)")
+    private Integer actualAmount;
+    @Schema(description = "有效人数")
+    @ExcelProperty("有效人数")
+    private Integer validCount;
+}

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

@@ -0,0 +1,71 @@
+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.service.report.BankStatementReportService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+
+import static com.yc.ship.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.yc.ship.framework.common.pojo.CommonResult.success;
+
+/**
+ * 银行对账报表 Controller
+ *
+ * @author auto-generated
+ */
+@Tag(name = "管理后台 - 银行对账报表")
+@RestController
+@RequestMapping("/trade/report/bank-statement")
+@Validated
+@Slf4j
+public class BankStatementReportController {
+
+    @Resource
+    private BankStatementReportService bankStatementReportService;
+
+    /**
+     * 查询银行对账报表分页
+     *
+     * @param pageReqVO 分页查询条件
+     * @return 分页结果
+     */
+    @GetMapping("/page")
+    @Operation(summary = "查询银行对账报表分页")
+    @PreAuthorize("@ss.hasPermission('trade:report:bank-statement:query')")
+    public CommonResult<PageResult<BankStatementReportRespVO>> getBankStatementReportPage(@Valid BankStatementReportPageReqVO pageReqVO) {
+        PageResult<BankStatementReportRespVO> pageResult = bankStatementReportService.getBankStatementReportPage(pageReqVO);
+        return success(pageResult);
+    }
+
+    /**
+     * 导出银行对账报表 Excel
+     *
+     * @param pageReqVO 查询条件
+     * @param response  HTTP响应
+     * @throws IOException IO异常
+     */
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出银行对账报表 Excel")
+    @PreAuthorize("@ss.hasPermission('trade:report:bank-statement:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportBankStatementReportExcel(@Valid BankStatementReportPageReqVO pageReqVO,
+                                                HttpServletResponse response) throws IOException {
+        bankStatementReportService.exportBankStatementReportExcel(pageReqVO, response);
+    }
+
+}

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

@@ -0,0 +1,33 @@
+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 auto-generated
+ */
+@Schema(description = "管理后台 - 银行对账报表分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class BankStatementReportPageReqVO extends PageParam {
+
+    @Schema(description = "交易日期开始", example = "2024-01-01")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+    private LocalDate startDate;
+
+    @Schema(description = "交易日期结束", example = "2024-12-31")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+    private LocalDate endDate;
+
+}

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

@@ -0,0 +1,58 @@
+package com.yc.ship.module.trade.controller.admin.report.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.yc.ship.framework.excel.core.annotations.DictFormat;
+import com.yc.ship.framework.excel.core.convert.DictConvert;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 银行对账报表 Response VO
+ *
+ * @author auto-generated
+ */
+@Schema(description = "管理后台 - 银行对账报表 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class BankStatementReportRespVO {
+
+    @Schema(description = "交易日期", example = "2024-01-01")
+    @ExcelProperty("交易日期")
+    private String tradeDate;
+
+    @Schema(description = "账单还款(扫码)", example = "1000.00")
+    @ExcelProperty("账单还款(扫码)")
+    private BigDecimal billRepayment;
+
+    @Schema(description = "预存款充值(扫码)", example = "2000.00")
+    @ExcelProperty("预存款充值(扫码)")
+    private BigDecimal depositRecharge;
+
+    @Schema(description = "订单支付(扫码)", example = "3000.00")
+    @ExcelProperty("订单支付(扫码)")
+    private BigDecimal orderPayment;
+
+    @Schema(description = "商户平台合计", example = "6000.00")
+    @ExcelProperty("商户平台合计")
+    private BigDecimal merchantPlatformTotal;
+
+    @Schema(description = "对公充值预存款", example = "5000.00")
+    @ExcelProperty("对公充值预存款")
+    private BigDecimal publicDepositRecharge;
+
+    @Schema(description = "农行进账合计", example = "11000.00")
+    @ExcelProperty("农行进账合计")
+    private BigDecimal agriculturalBankTotal;
+
+    @Schema(description = "其他银行(手工下账单)", example = "500.00")
+    @ExcelProperty("其他银行(手工下账单)")
+    private BigDecimal otherBankManual;
+
+    @Schema(description = "银行进账合计", example = "11500.00")
+    @ExcelProperty("银行进账合计")
+    private BigDecimal bankTotal;
+
+}

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

@@ -7,6 +7,8 @@ import com.yc.ship.framework.tenant.core.aop.TenantIgnore;
 import com.yc.ship.module.ota.controller.admin.distributor.vo.DistributorPageReqVO;
 import com.yc.ship.module.otc.api.agency.dto.AgencyUserLoginInfoRespDTO;
 import com.yc.ship.module.product.api.dto.CategoryRespDTO;
+import com.yc.ship.module.trade.controller.admin.business.vo.DailyBusinessStatisticsReqVO;
+import com.yc.ship.module.trade.controller.admin.business.vo.DailyBusinessStatisticsRespVO;
 import com.yc.ship.module.trade.controller.admin.order.vo.check.CheckOrderPageVO;
 import com.yc.ship.module.trade.controller.admin.order.vo.order.*;
 import com.yc.ship.module.trade.controller.admin.order.vo.otc.PrintRespVO;
@@ -221,4 +223,11 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
      * @return
      */
     OrderTotalRespVO selectTotal1ByOrderIds(@Param("orderIds") List<Long> orderIds);
+
+    /**
+     * 获取营业统计日报
+     * @param
+     * @return
+     */
+    IPage<DailyBusinessStatisticsRespVO> getDailyBusinessStatisticsPage(IPage<DailyBusinessStatisticsRespVO> page,@Param("vo")  DailyBusinessStatisticsReqVO pageReqVO);
 }

+ 13 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/business/DailyBusinessStatisticsService.java

@@ -0,0 +1,13 @@
+package com.yc.ship.module.trade.service.business;
+
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.module.trade.controller.admin.business.vo.DailyBusinessStatisticsReqVO;
+import com.yc.ship.module.trade.controller.admin.business.vo.DailyBusinessStatisticsRespVO;
+
+import javax.validation.Valid;
+import java.io.File;
+
+public interface DailyBusinessStatisticsService {
+    PageResult<DailyBusinessStatisticsRespVO> getDailyBusinessStatisticsPage(DailyBusinessStatisticsReqVO pageReqVO);
+
+}

+ 29 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/business/DailyBusinessStatisticsServiceImpl.java

@@ -0,0 +1,29 @@
+package com.yc.ship.module.trade.service.business;
+
+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.module.trade.controller.admin.business.vo.DailyBusinessStatisticsReqVO;
+import com.yc.ship.module.trade.controller.admin.business.vo.DailyBusinessStatisticsRespVO;
+import com.yc.ship.module.trade.dal.mysql.order.TradeOrderMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.InputStream;
+
+@Service
+@Validated
+public class DailyBusinessStatisticsServiceImpl implements DailyBusinessStatisticsService {
+    @Resource
+    private TradeOrderMapper tradeOrderMapper;
+
+    @Override
+    public PageResult<DailyBusinessStatisticsRespVO> getDailyBusinessStatisticsPage(DailyBusinessStatisticsReqVO pageReqVO) {
+        IPage<DailyBusinessStatisticsRespVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
+        IPage<DailyBusinessStatisticsRespVO> resultPage = tradeOrderMapper.getDailyBusinessStatisticsPage(page, pageReqVO);
+        return new PageResult<>(resultPage.getRecords(), resultPage.getTotal());
+    }
+
+}

+ 34 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/report/BankStatementReportService.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.BankStatementReportPageReqVO;
+import com.yc.ship.module.trade.controller.admin.report.vo.BankStatementReportRespVO;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 银行对账报表 Service
+ *
+ * @author auto-generated
+ */
+public interface BankStatementReportService {
+
+    /**
+     * 查询银行对账报表分页
+     *
+     * @param pageReqVO 分页查询条件
+     * @return 分页结果
+     */
+    PageResult<BankStatementReportRespVO> getBankStatementReportPage(BankStatementReportPageReqVO pageReqVO);
+
+    /**
+     * 导出银行对账报表 Excel
+     *
+     * @param pageReqVO 查询条件
+     * @param response  HTTP响应
+     * @throws IOException IO异常
+     */
+    void exportBankStatementReportExcel(BankStatementReportPageReqVO pageReqVO, HttpServletResponse response) throws IOException;
+
+}

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

@@ -0,0 +1,329 @@
+package com.yc.ship.module.trade.service.report.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.common.pojo.PageParam;
+import com.yc.ship.framework.excel.core.util.ExcelUtils;
+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.dal.dataobject.bill.BillDO;
+import com.yc.ship.module.trade.dal.dataobject.order.TradeOrderPayDO;
+import com.yc.ship.module.trade.dal.mysql.bill.BillMapper;
+import com.yc.ship.module.trade.dal.mysql.order.TradeOrderPayMapper;
+import com.yc.ship.module.trade.service.report.BankStatementReportService;
+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.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 银行对账报表 Service 实现类
+ *
+ * @author auto-generated
+ */
+@Service
+@Slf4j
+public class BankStatementReportServiceImpl implements BankStatementReportService {
+
+    @Resource
+    private TradeOrderPayMapper tradeOrderPayMapper;
+
+    @Resource
+    private BillMapper billMapper;
+
+    /**
+     * 查询银行对账报表分页
+     *
+     * @param pageReqVO 分页查询条件
+     * @return 分页结果
+     */
+    @Override
+    public PageResult<BankStatementReportRespVO> getBankStatementReportPage(BankStatementReportPageReqVO pageReqVO) {
+        // 1. 构建日期列表
+        List<LocalDate> dateList = buildDateList(pageReqVO.getStartDate(), pageReqVO.getEndDate());
+        if (CollUtil.isEmpty(dateList)) {
+            return new PageResult<>(new ArrayList<>(), 0L);
+        }
+
+        // 2. 分页处理日期列表
+        int pageNo = pageReqVO.getPageNo();
+        int pageSize = pageReqVO.getPageSize();
+        int total = dateList.size();
+        int fromIndex = (pageNo - 1) * pageSize;
+        int toIndex = Math.min(fromIndex + pageSize, total);
+
+        if (fromIndex >= total) {
+            return new PageResult<>(new ArrayList<>(), (long) total);
+        }
+        List<LocalDate> subDateList = new ArrayList<>();
+        if (toIndex == -1) {
+            subDateList = dateList.subList(fromIndex, dateList.size());
+        } else {
+            subDateList = dateList.subList(fromIndex, toIndex);
+        }
+
+        LocalDate startDate = subDateList.get(0);
+        LocalDate endDate = subDateList.get(subDateList.size() - 1);
+
+        // 3. 批量查询当前页日期范围内的所有统计数据(使用数据库聚合)
+        LocalDateTime startDateTime = startDate.atStartOfDay();
+        LocalDateTime endDateTime = endDate.plusDays(1).atStartOfDay();
+
+        // 3.1 批量查询账单还款数据 - 按日期分组汇总
+        LambdaQueryWrapper<BillDO> billWrapper = new LambdaQueryWrapper<>();
+        billWrapper.eq(BillDO::getBillStatus, 1)
+                .between(BillDO::getPayTime, startDateTime, endDateTime)
+                .select(BillDO::getPayTime, BillDO::getPayAmount); // 只查询必要字段
+        List<BillDO> billList = billMapper.selectList(billWrapper);
+
+        // 3.2 批量查询预存款充值数据
+        LambdaQueryWrapper<TradeOrderPayDO> depositWrapper = new LambdaQueryWrapper<>();
+        depositWrapper.eq(TradeOrderPayDO::getPayStatus, 1)
+                .eq(TradeOrderPayDO::getOrderType, 1)
+                .between(TradeOrderPayDO::getPaymentDate, startDateTime, endDateTime)
+                .select(TradeOrderPayDO::getPaymentDate, TradeOrderPayDO::getPayAmount);
+        List<TradeOrderPayDO> depositList = tradeOrderPayMapper.selectList(depositWrapper);
+
+        // 3.3 批量查询订单支付数据
+        LambdaQueryWrapper<TradeOrderPayDO> orderWrapper = new LambdaQueryWrapper<>();
+        orderWrapper.eq(TradeOrderPayDO::getPayStatus, 1)
+                .eq(TradeOrderPayDO::getOrderType, 0)
+                .between(TradeOrderPayDO::getPaymentDate, startDateTime, endDateTime)
+                .select(TradeOrderPayDO::getPaymentDate, TradeOrderPayDO::getPayAmount);
+        List<TradeOrderPayDO> orderPaymentList = tradeOrderPayMapper.selectList(orderWrapper);
+
+        // 4. 按日期分组并计算统计数据
+        Map<LocalDate, BigDecimal> billMap = groupByDateAndSum(billList, BillDO::getPayTime, BillDO::getPayAmount);
+        Map<LocalDate, BigDecimal> depositMap = groupByDateAndSum(depositList, TradeOrderPayDO::getPaymentDate, TradeOrderPayDO::getPayAmount);
+        Map<LocalDate, BigDecimal> orderMap = groupByDateAndSum(orderPaymentList, TradeOrderPayDO::getPaymentDate, TradeOrderPayDO::getPayAmount);
+
+        // 5. 构建结果列表
+        List<BankStatementReportRespVO> resultList = new ArrayList<>(subDateList.size());
+        for (LocalDate tradeDate : subDateList) {
+            BankStatementReportRespVO report = new BankStatementReportRespVO();
+            report.setTradeDate(tradeDate.toString());
+
+            BigDecimal billRepayment = billMap.getOrDefault(tradeDate, BigDecimal.ZERO);
+            BigDecimal depositRecharge = depositMap.getOrDefault(tradeDate, BigDecimal.ZERO);
+            BigDecimal orderPayment = orderMap.getOrDefault(tradeDate, BigDecimal.ZERO);
+
+            report.setBillRepayment(billRepayment);
+            report.setDepositRecharge(depositRecharge);
+            report.setOrderPayment(orderPayment);
+
+            // 商户平台合计 = 账单还款 + 预存款充值 + 订单支付
+            BigDecimal merchantPlatformTotal = billRepayment.add(depositRecharge).add(orderPayment);
+            report.setMerchantPlatformTotal(merchantPlatformTotal);
+
+            // 对公充值预存款 - TODO: 需要根据实际业务逻辑查询对公充值数据
+            BigDecimal publicDepositRecharge = BigDecimal.ZERO;
+            report.setPublicDepositRecharge(publicDepositRecharge);
+
+            // 农行进账合计 = 商户平台合计 + 对公充值预存款
+            BigDecimal agriculturalBankTotal = merchantPlatformTotal.add(publicDepositRecharge);
+            report.setAgriculturalBankTotal(agriculturalBankTotal);
+
+            // 其他银行(手工下账单) - TODO: 根据实际业务逻辑查询其他银行手工下账单数据
+            BigDecimal otherBankManual = BigDecimal.ZERO;
+            report.setOtherBankManual(otherBankManual);
+
+            // 银行进账合计 = 其他银行 + 农行进账合计
+            BigDecimal bankTotal = otherBankManual.add(agriculturalBankTotal);
+            report.setBankTotal(bankTotal);
+
+            resultList.add(report);
+        }
+
+        return new PageResult<>(resultList, (long) total);
+    }
+
+    /**
+     * 按日期分组并求和
+     */
+    private <T> Map<LocalDate, BigDecimal> groupByDateAndSum(List<T> list, Function<T, LocalDateTime> dateExtractor, Function<T, BigDecimal> amountExtractor) {
+        if (CollUtil.isEmpty(list)) {
+            return new HashMap<>();
+        }
+        return list.stream()
+                .collect(Collectors.groupingBy(
+                        item -> dateExtractor.apply(item).toLocalDate(),
+                        Collectors.reducing(BigDecimal.ZERO, amountExtractor, BigDecimal::add)
+                ));
+    }
+
+    /**
+     * 导出银行对账报表 Excel
+     *
+     * @param pageReqVO 查询条件
+     * @param response  HTTP响应
+     * @throws IOException IO异常
+     */
+    @Override
+    public void exportBankStatementReportExcel(BankStatementReportPageReqVO pageReqVO, HttpServletResponse response) throws IOException {
+        // 1. 查询所有数据(不分页)
+        pageReqVO.setPageNo(1);
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        PageResult<BankStatementReportRespVO> pageResult = getBankStatementReportPage(pageReqVO);
+        List<BankStatementReportRespVO> list = pageResult.getList();
+
+        // 2. 计算合计行
+        if (CollUtil.isNotEmpty(list)) {
+            BankStatementReportRespVO summary = calculateSummary(list);
+            summary.setTradeDate("合计"); // 合计行日期置空
+            list.add(summary);
+        }
+
+        // 3. 导出 Excel
+        ExcelUtils.write(response, "银行对账报表.xls", "数据", BankStatementReportRespVO.class, list);
+    }
+
+    /**
+     * 构建日期列表
+     */
+    private List<LocalDate> buildDateList(LocalDate startDate, LocalDate endDate) {
+        List<LocalDate> dateList = new ArrayList<>();
+        if (startDate == null || endDate == null) {
+            return dateList;
+        }
+        if (startDate.isAfter(endDate)) {
+            return dateList;
+        }
+
+        long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);
+        for (int i = 0; i <= daysBetween; i++) {
+            dateList.add(startDate.plusDays(i));
+        }
+        return dateList;
+    }
+
+    /**
+     * 根据日期构建报表数据
+     */
+    private BankStatementReportRespVO buildReportByDate(LocalDate tradeDate) {
+        BankStatementReportRespVO report = new BankStatementReportRespVO();
+        report.setTradeDate(tradeDate.toString());
+
+        LocalDateTime startDateTime = tradeDate.atStartOfDay();
+        LocalDateTime endDateTime = tradeDate.plusDays(1).atStartOfDay();
+
+        // 1. 查询账单还款(扫码) - 从bill表中查询
+        LambdaQueryWrapper<BillDO> billWrapper = new LambdaQueryWrapper<>();
+        billWrapper.eq(BillDO::getBillStatus, 1) // 已支付
+                .between(BillDO::getPayTime, startDateTime, endDateTime);
+        List<BillDO> billList = billMapper.selectList(billWrapper);
+        BigDecimal billRepayment = billList.stream()
+                .map(BillDO::getPayAmount)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        report.setBillRepayment(billRepayment == null ? BigDecimal.ZERO : billRepayment);
+
+        // 2. 查询预存款充值(扫码) - 从支付表中查询分销商充值订单
+        // TODO: 需要根据实际业务逻辑判断哪些是预存款充值
+        // 这里假设orderType为其他订单的是预存款充值
+        LambdaQueryWrapper<TradeOrderPayDO> depositWrapper = new LambdaQueryWrapper<>();
+        depositWrapper.eq(TradeOrderPayDO::getPayStatus, 1) // 已支付
+                .in(TradeOrderPayDO::getPaymentType, CollUtil.newArrayList(5)) // 支付方式
+                .between(TradeOrderPayDO::getPaymentDate, startDateTime, endDateTime);
+        // TODO: 需要添加具体的判断条件来区分扫码支付方式
+        List<TradeOrderPayDO> depositList = tradeOrderPayMapper.selectList(depositWrapper);
+        BigDecimal depositRecharge = depositList.stream()
+                .map(TradeOrderPayDO::getPayAmount)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        report.setDepositRecharge(depositRecharge == null ? BigDecimal.ZERO : depositRecharge);
+
+        // 3. 查询订单支付(扫码) - 从支付表中查询交易订单
+        LambdaQueryWrapper<TradeOrderPayDO> orderWrapper = new LambdaQueryWrapper<>();
+        orderWrapper.eq(TradeOrderPayDO::getPayStatus, 1) // 已支付
+                .in(TradeOrderPayDO::getPaymentType, CollUtil.newArrayList(1,2,3)) // 支付方式
+                .between(TradeOrderPayDO::getPaymentDate, startDateTime, endDateTime);
+        // TODO: 需要添加具体的判断条件来区分扫码支付方式
+        List<TradeOrderPayDO> orderPaymentList = tradeOrderPayMapper.selectList(orderWrapper);
+        BigDecimal orderPayment = orderPaymentList.stream()
+                .map(TradeOrderPayDO::getPayAmount)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        report.setOrderPayment(orderPayment == null ? BigDecimal.ZERO : orderPayment);
+
+        // 4. 商户平台合计 = 账单还款 + 预存款充值 + 订单支付
+        BigDecimal merchantPlatformTotal = report.getBillRepayment()
+                .add(report.getDepositRecharge())
+                .add(report.getOrderPayment());
+        report.setMerchantPlatformTotal(merchantPlatformTotal);
+
+        // 5. 对公充值预存款 - 从支付表中查询对公充值
+        LambdaQueryWrapper<TradeOrderPayDO> publicDepositRechargeWrapper = new LambdaQueryWrapper<>();
+        orderWrapper.eq(TradeOrderPayDO::getPayStatus, 1) // 已支付
+                .in(TradeOrderPayDO::getPaymentType, CollUtil.newArrayList(10)) // 支付方式
+                .between(TradeOrderPayDO::getPaymentDate, startDateTime, endDateTime);
+        // TODO: 需要根据实际业务逻辑查询对公充值数据
+        List<TradeOrderPayDO> publicDepositRechargeList = tradeOrderPayMapper.selectList(publicDepositRechargeWrapper);
+        BigDecimal publicDepositRecharge = publicDepositRechargeList.stream()
+                .map(TradeOrderPayDO::getPayAmount)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        report.setPublicDepositRecharge(publicDepositRecharge == null ? BigDecimal.ZERO : publicDepositRecharge);
+
+        // 6. 农行进账合计 = 商户平台合计 + 对公充值预存款
+        BigDecimal agriculturalBankTotal = report.getMerchantPlatformTotal()
+                .add(report.getPublicDepositRecharge());
+        report.setAgriculturalBankTotal(agriculturalBankTotal);
+
+        // 7. 其他银行(手工下账单) - 需要根据实际业务逻辑查询
+        // TODO: 根据实际业务逻辑查询其他银行手工下账单数据
+        BigDecimal otherBankManual = BigDecimal.ZERO;
+        report.setOtherBankManual(otherBankManual);
+
+        // 8. 银行进账合计 = 其他银行 + 农行进账合计
+        BigDecimal bankTotal = report.getOtherBankManual()
+                .add(report.getAgriculturalBankTotal());
+        report.setBankTotal(bankTotal);
+
+        return report;
+    }
+
+    /**
+     * 计算合计
+     */
+    private BankStatementReportRespVO calculateSummary(List<BankStatementReportRespVO> list) {
+        BankStatementReportRespVO summary = new BankStatementReportRespVO();
+
+        BigDecimal totalBillRepayment = BigDecimal.ZERO;
+        BigDecimal totalDepositRecharge = BigDecimal.ZERO;
+        BigDecimal totalOrderPayment = BigDecimal.ZERO;
+        BigDecimal totalMerchantPlatformTotal = BigDecimal.ZERO;
+        BigDecimal totalPublicDepositRecharge = BigDecimal.ZERO;
+        BigDecimal totalAgriculturalBankTotal = BigDecimal.ZERO;
+        BigDecimal totalOtherBankManual = BigDecimal.ZERO;
+        BigDecimal totalBankTotal = BigDecimal.ZERO;
+
+        for (BankStatementReportRespVO item : list) {
+            totalBillRepayment = totalBillRepayment.add(item.getBillRepayment());
+            totalDepositRecharge = totalDepositRecharge.add(item.getDepositRecharge());
+            totalOrderPayment = totalOrderPayment.add(item.getOrderPayment());
+            totalMerchantPlatformTotal = totalMerchantPlatformTotal.add(item.getMerchantPlatformTotal());
+            totalPublicDepositRecharge = totalPublicDepositRecharge.add(item.getPublicDepositRecharge());
+            totalAgriculturalBankTotal = totalAgriculturalBankTotal.add(item.getAgriculturalBankTotal());
+            totalOtherBankManual = totalOtherBankManual.add(item.getOtherBankManual());
+            totalBankTotal = totalBankTotal.add(item.getBankTotal());
+        }
+
+        summary.setBillRepayment(totalBillRepayment);
+        summary.setDepositRecharge(totalDepositRecharge);
+        summary.setOrderPayment(totalOrderPayment);
+        summary.setMerchantPlatformTotal(totalMerchantPlatformTotal);
+        summary.setPublicDepositRecharge(totalPublicDepositRecharge);
+        summary.setAgriculturalBankTotal(totalAgriculturalBankTotal);
+        summary.setOtherBankManual(totalOtherBankManual);
+        summary.setBankTotal(totalBankTotal);
+
+        return summary;
+    }
+
+}

+ 37 - 0
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/order/TradeOrderMapper.xml

@@ -458,6 +458,43 @@
         </if>
     </sql>
 
+    <select id="getDailyBusinessStatisticsPage"
+            resultType="com.yc.ship.module.trade.controller.admin.business.vo.DailyBusinessStatisticsRespVO">
+        SELECT
+            td.source_id AS sourceId,
+            td.source_name as sourceName,
+            IFNULL(tot.free_num, 0) AS freeNum,
+            0 AS freeCount,
+            IFNULL(topay.actual_amount, 0) AS actualAmount,
+            COUNT(1) AS totalCount,
+            SUM(CASE WHEN tv.type IN ('adultPlus', 'adultTake') THEN 1 ELSE 0 END) AS adultCount,
+            SUM(CASE WHEN tv.type IN ('childTake','childPlus','childNonTake') THEN 1 ELSE 0 END) AS childCount,
+            SUM(CASE WHEN tv.type = 'with' THEN 1 ELSE 0 END) AS withCount,
+            SUM(CASE WHEN tv.type = 'leader' THEN 1 ELSE 0 END) AS leaderCount,
+            SUM(CASE WHEN tv.type IN ('babyTake','babyPlus','babyNonTake') THEN 1 ELSE 0 END) AS infantCount,
+            COUNT(1) - IFNULL(tot.free_num, 0) AS validCount
+        FROM trade_order td
+                 INNER JOIN trade_order_user tou ON td.id = tou.order_id AND tou.deleted = 0
+                 LEFT JOIN trade_detail tdl ON td.id = tdl.order_id AND tdl.deleted = 0
+                 LEFT JOIN trade_visitor tv ON tdl.id = tv.detail_id AND tv.deleted = 0
+                 left join trade_order_total tot on td.id = tot.old_order_id and tot.deleted = 0
+                 LEFT JOIN (SELECT order_id, SUM(pay_amount) AS actual_amount
+                            FROM trade_order_pay
+                            WHERE pay_status = 1 GROUP BY order_id) topay ON td.id = topay.order_id
+        WHERE
+            td.deleted = 0
+            AND tv.type IS NOT NULL
+            AND td.order_status > 0
+        <if test="vo.voyageId != null and vo.voyageId != ''">
+            AND td.voyage_id = #{vo.voyageId}
+        </if>
+        <if test="vo.routeId != null and vo.routeId != ''">
+            AND exists (select 1 from product_voyage top where top.id = td.voyage_id and top.route_id = #{vo.routeId})
+        </if>
+        GROUP BY td.source_id;
+
+    </select>
+
     <select id="getTradeOrderUserPage"
             resultType="com.yc.ship.module.trade.controller.admin.order.vo.order.TradeOrderRespVO">
         SELECT td.*,toa.audit_time auditTime,tou.contact_name,tou.credential_no,tou.mobile,count(tdl.id) num,sum(CASE WHEN tdl.voucher_status in (1,2,3,4,6,8,9) THEN	1 ELSE 0 END) realnum,(tr.origin_amount-tr.refund_amount) feeAmount,tdl.product_name,tdl.spec_type,ifnull(tr.origin_amount-tr.refund_amount,0) realAmount