wanghao пре 2 месеци
родитељ
комит
6556f0dcaa
28 измењених фајлова са 1545 додато и 1 уклоњено
  1. 1 1
      consoleStatistics/src/main/java/com/jzg/console/ConsoleApplication.java
  2. 51 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/controller/CompanyBusinessReportController.java
  3. 51 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/controller/ContactPersonBusinessReportController.java
  4. 51 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/controller/RiskBusinessReportController.java
  5. 51 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/controller/SalesmanBusinessReportController.java
  6. 31 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/entity/ChannelReportDetailDto.java
  7. 28 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/entity/ChannelReportDto.java
  8. 22 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/mapper/CompanyBusinessReportMapper.java
  9. 22 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/mapper/ContactPersonBusinessReportMapper.java
  10. 22 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/mapper/RiskBusinessReportMapper.java
  11. 22 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/mapper/SalesmanBusinessReportMapper.java
  12. 19 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/service/CompanyBusinessReportService.java
  13. 19 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/service/ContactPersonBusinessReportService.java
  14. 19 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/service/RiskBusinessReportService.java
  15. 19 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/service/SalesmanBusinessReportService.java
  16. 42 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/service/impl/CompanyBusinessReportServiceImpl.java
  17. 42 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/service/impl/ContactPersonBusinessReportServiceImpl.java
  18. 42 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/service/impl/RiskBusinessReportServiceImpl.java
  19. 42 0
      consoleStatistics/src/main/java/com/jzg/console/businessReport/service/impl/SalesmanBusinessReportServiceImpl.java
  20. 52 0
      consoleStatistics/src/main/java/com/jzg/console/quotationReport/controller/QuotationReportController.java
  21. 24 0
      consoleStatistics/src/main/java/com/jzg/console/quotationReport/mapper/QuotationReportMapper.java
  22. 21 0
      consoleStatistics/src/main/java/com/jzg/console/quotationReport/service/QuotationReportService.java
  23. 50 0
      consoleStatistics/src/main/java/com/jzg/console/quotationReport/service/impl/QuotationReportServiceImpl.java
  24. 103 0
      consoleStatistics/src/main/resources/mapper/CompanyBusinessReportMapper.xml
  25. 113 0
      consoleStatistics/src/main/resources/mapper/ContactPersonBusinessReportMapper.xml
  26. 262 0
      consoleStatistics/src/main/resources/mapper/QuotationReportMapper.xml
  27. 182 0
      consoleStatistics/src/main/resources/mapper/RiskBusinessReportMapper.xml
  28. 142 0
      consoleStatistics/src/main/resources/mapper/SalesmanBusinessReportMapper.xml

+ 1 - 1
consoleStatistics/src/main/java/com/jzg/console/ConsoleApplication.java

@@ -11,7 +11,7 @@ import org.springframework.context.annotation.ComponentScan;
 @EnableDiscoveryClient
 @EnableFeignClients
 @ComponentScan(basePackages = {"com.jzg.commons","com.jzg.console"})
-@MapperScan({"com.jzg.console.mapper","com.jzg.commons.mapper"})
+@MapperScan({"com.jzg.console.mapper", "com.jzg.console.businessReport.mapper","com.jzg.console.quotationReport.mapper", "com.jzg.commons.mapper"})
 public class ConsoleApplication {
     public static void main(String[] args) {
         SpringApplication.run(ConsoleApplication.class, args);

+ 51 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/controller/CompanyBusinessReportController.java

@@ -0,0 +1,51 @@
+package com.jzg.console.businessReport.controller;
+
+import com.jzg.commons.core.base.BaseController;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+import com.jzg.console.businessReport.service.CompanyBusinessReportService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 保险公司业务报表接口。
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/console/businessReport/company")
+@Tag(name = "业务报表-保险公司")
+public class CompanyBusinessReportController extends BaseController {
+    private final CompanyBusinessReportService service;
+
+    @PostMapping("/page")
+    @Operation(summary = "保险公司报表分页查询")
+    public HttpResult<?> page(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
+        return HttpResult.ok(service.page(q));
+    }
+
+    @PostMapping("/detail/page")
+    @Operation(summary = "保险公司报表明细查询")
+    public HttpResult<?> detailPage(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
+        return HttpResult.ok(service.detailPage(q));
+    }
+
+    @PostMapping("/export")
+    @Operation(summary = "保险公司报表导出")
+    public HttpResult<?> export(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
+        service.export(q);
+        return HttpResult.ok("导出任务已提交,请在导出中心查看");
+    }
+
+    @PostMapping("/detail/export")
+    @Operation(summary = "保险公司报表明细导出")
+    public HttpResult<?> detailExport(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
+        service.detailExport(q);
+        return HttpResult.ok("导出任务已提交,请在导出中心查看");
+    }
+}

+ 51 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/controller/ContactPersonBusinessReportController.java

@@ -0,0 +1,51 @@
+package com.jzg.console.businessReport.controller;
+
+import com.jzg.commons.core.base.BaseController;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+import com.jzg.console.businessReport.service.ContactPersonBusinessReportService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 对接人业务报表接口。
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/console/businessReport/contact")
+@Tag(name = "业务报表-对接人")
+public class ContactPersonBusinessReportController extends BaseController {
+    private final ContactPersonBusinessReportService service;
+
+    @PostMapping("/page")
+    @Operation(summary = "对接人报表分页查询")
+    public HttpResult<?> page(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
+        return HttpResult.ok(service.page(q));
+    }
+
+    @PostMapping("/detail/page")
+    @Operation(summary = "对接人报表明细查询")
+    public HttpResult<?> detailPage(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
+        return HttpResult.ok(service.detailPage(q));
+    }
+
+    @PostMapping("/export")
+    @Operation(summary = "对接人报表导出")
+    public HttpResult<?> export(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
+        service.export(q);
+        return HttpResult.ok("导出任务已提交,请在导出中心查看");
+    }
+
+    @PostMapping("/detail/export")
+    @Operation(summary = "对接人报表明细导出")
+    public HttpResult<?> detailExport(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
+        service.detailExport(q);
+        return HttpResult.ok("导出任务已提交,请在导出中心查看");
+    }
+}

+ 51 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/controller/RiskBusinessReportController.java

@@ -0,0 +1,51 @@
+package com.jzg.console.businessReport.controller;
+
+import com.jzg.commons.core.base.BaseController;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+import com.jzg.console.businessReport.service.RiskBusinessReportService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 险种业务报表接口。
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/console/businessReport/risk")
+@Tag(name = "业务报表-险种")
+public class RiskBusinessReportController extends BaseController {
+    private final RiskBusinessReportService service;
+
+    @PostMapping("/page")
+    @Operation(summary = "险种报表分页查询")
+    public HttpResult<?> page(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
+        return HttpResult.ok(service.page(q));
+    }
+
+    @PostMapping("/detail/page")
+    @Operation(summary = "险种报表明细查询")
+    public HttpResult<?> detailPage(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
+        return HttpResult.ok(service.detailPage(q));
+    }
+
+    @PostMapping("/export")
+    @Operation(summary = "险种报表导出")
+    public HttpResult<?> export(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
+        service.export(q);
+        return HttpResult.ok("导出任务已提交,请在导出中心查看");
+    }
+
+    @PostMapping("/detail/export")
+    @Operation(summary = "险种报表明细导出")
+    public HttpResult<?> detailExport(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
+        service.detailExport(q);
+        return HttpResult.ok("导出任务已提交,请在导出中心查看");
+    }
+}

+ 51 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/controller/SalesmanBusinessReportController.java

@@ -0,0 +1,51 @@
+package com.jzg.console.businessReport.controller;
+
+import com.jzg.commons.core.base.BaseController;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+import com.jzg.console.businessReport.service.SalesmanBusinessReportService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 业务员业务报表接口。
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/console/businessReport/salesman")
+@Tag(name = "业务报表-业务员")
+public class SalesmanBusinessReportController extends BaseController {
+    private final SalesmanBusinessReportService service;
+
+    @PostMapping("/page")
+    @Operation(summary = "业务员报表分页查询")
+    public HttpResult<?> page(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
+        return HttpResult.ok(service.page(q));
+    }
+
+    @PostMapping("/detail/page")
+    @Operation(summary = "业务员报表明细查询")
+    public HttpResult<?> detailPage(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
+        return HttpResult.ok(service.detailPage(q));
+    }
+
+    @PostMapping("/export")
+    @Operation(summary = "业务员报表导出")
+    public HttpResult<?> export(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
+        service.export(q);
+        return HttpResult.ok("导出任务已提交,请在导出中心查看");
+    }
+
+    @PostMapping("/detail/export")
+    @Operation(summary = "业务员报表明细导出")
+    public HttpResult<?> detailExport(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
+        service.detailExport(q);
+        return HttpResult.ok("导出任务已提交,请在导出中心查看");
+    }
+}

+ 31 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/entity/ChannelReportDetailDto.java

@@ -0,0 +1,31 @@
+package com.jzg.console.businessReport.entity;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/** 渠道业务报表订单明细。 */
+@Data
+@Schema(description = "渠道业务报表明细")
+public class ChannelReportDetailDto {
+    @ExcelProperty("渠道编码") @ColumnWidth(16)
+    private String channelCode;
+    @ExcelProperty("渠道名称") @ColumnWidth(20)
+    private String channelName;
+    @ExcelProperty("订单号") @ColumnWidth(22)
+    private String orderNo;
+    @ExcelProperty("保险公司") @ColumnWidth(20)
+    private String companyName;
+    @ExcelProperty("险种") @ColumnWidth(16)
+    private String riskName;
+    @ExcelProperty("保费") @ColumnWidth(16)
+    private BigDecimal sumPremium;
+    @ExcelProperty("录单时间") @ColumnWidth(20)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+}

+ 28 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/entity/ChannelReportDto.java

@@ -0,0 +1,28 @@
+package com.jzg.console.businessReport.entity;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/** 渠道业务报表。当前渠道按订单来源统计,后续可切换为正式渠道主数据。 */
+@Data
+@Schema(description = "渠道业务报表")
+public class ChannelReportDto {
+    @ExcelProperty("渠道编码") @ColumnWidth(16)
+    private String channelCode;
+    @ExcelProperty("渠道名称") @ColumnWidth(20)
+    private String channelName;
+    @ExcelProperty("承保订单") @ColumnWidth(14)
+    private Long underwriteOrderNum;
+    @ExcelProperty("保费") @ColumnWidth(16)
+    private BigDecimal sumPremium;
+    @ExcelProperty("交强保费") @ColumnWidth(16)
+    private BigDecimal jqPremium;
+    @ExcelProperty("商业保费") @ColumnWidth(16)
+    private BigDecimal syPremium;
+    @ExcelProperty("驾意保费") @ColumnWidth(16)
+    private BigDecimal jyPremium;
+}

+ 22 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/mapper/CompanyBusinessReportMapper.java

@@ -0,0 +1,22 @@
+package com.jzg.console.businessReport.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.commons.annotation.IgnoreTenant;
+import com.jzg.commons.entity.report.dto.*;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+@Mapper
+public interface CompanyBusinessReportMapper {
+    @IgnoreTenant
+    IPage<ReportCompanyDataManageDto> page(Page<ReportCompanyDataManageDto> p, @Param("q") ReportSearchCommonVo q);
+    @IgnoreTenant
+    List<ReportCompanyDataManageDto> export(@Param("q") ReportSearchCommonVo q);
+    @IgnoreTenant
+    IPage<ReportCompanyDataManageDetailDto> detailPage(Page<ReportCompanyDataManageDetailDto> p, @Param("q") ReportSearchCommonVo q);
+    @IgnoreTenant
+    List<ReportCompanyDataManageDetailDto> detailExport(@Param("q") ReportSearchCommonVo q);
+}

+ 22 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/mapper/ContactPersonBusinessReportMapper.java

@@ -0,0 +1,22 @@
+package com.jzg.console.businessReport.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.commons.annotation.IgnoreTenant;
+import com.jzg.commons.entity.report.dto.*;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+@Mapper
+public interface ContactPersonBusinessReportMapper {
+    @IgnoreTenant
+    IPage<ReportContactPersonDataManageDto> page(Page<ReportContactPersonDataManageDto> p, @Param("q") ReportSearchCommonVo q);
+    @IgnoreTenant
+    List<ReportContactPersonDataManageDto> export(@Param("q") ReportSearchCommonVo q);
+    @IgnoreTenant
+    IPage<ReportContactPersonDataManageDetailDto> detailPage(Page<ReportContactPersonDataManageDetailDto> p, @Param("q") ReportSearchCommonVo q);
+    @IgnoreTenant
+    List<ReportContactPersonDataManageDetailDto> detailExport(@Param("q") ReportSearchCommonVo q);
+}

+ 22 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/mapper/RiskBusinessReportMapper.java

@@ -0,0 +1,22 @@
+package com.jzg.console.businessReport.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.commons.annotation.IgnoreTenant;
+import com.jzg.commons.entity.report.dto.*;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+@Mapper
+public interface RiskBusinessReportMapper {
+    @IgnoreTenant
+    IPage<ReportRiskDataManageDto> page(Page<ReportRiskDataManageDto> p, @Param("q") ReportSearchCommonVo q);
+    @IgnoreTenant
+    List<ReportRiskDataManageDto> export(@Param("q") ReportSearchCommonVo q);
+    @IgnoreTenant
+    IPage<ReportRiskDataManageDetailDto> detailPage(Page<ReportRiskDataManageDetailDto> p, @Param("q") ReportSearchCommonVo q);
+    @IgnoreTenant
+    List<ReportRiskDataManageDetailDto> detailExport(@Param("q") ReportSearchCommonVo q);
+}

+ 22 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/mapper/SalesmanBusinessReportMapper.java

@@ -0,0 +1,22 @@
+package com.jzg.console.businessReport.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.commons.annotation.IgnoreTenant;
+import com.jzg.commons.entity.report.dto.*;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+@Mapper
+public interface SalesmanBusinessReportMapper {
+    @IgnoreTenant
+    IPage<ReportSalesmanDataManageDto> page(Page<ReportSalesmanDataManageDto> p, @Param("q") ReportSearchCommonVo q);
+    @IgnoreTenant
+    List<ReportSalesmanDataManageDto> export(@Param("q") ReportSearchCommonVo q);
+    @IgnoreTenant
+    IPage<ReportSalesmanDataManageDetailDto> detailPage(Page<ReportSalesmanDataManageDetailDto> p, @Param("q") ReportSearchCommonVo q);
+    @IgnoreTenant
+    List<ReportSalesmanDataManageDetailDto> detailExport(@Param("q") ReportSearchCommonVo q);
+}

+ 19 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/service/CompanyBusinessReportService.java

@@ -0,0 +1,19 @@
+package com.jzg.console.businessReport.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.jzg.commons.entity.report.dto.ReportCompanyDataManageDetailDto;
+import com.jzg.commons.entity.report.dto.ReportCompanyDataManageDto;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+
+/**
+ * 保险公司业务报表服务。
+ */
+public interface CompanyBusinessReportService {
+    IPage<ReportCompanyDataManageDto> page(ReportSearchCommonVo q);
+
+    IPage<ReportCompanyDataManageDetailDto> detailPage(ReportSearchCommonVo q);
+
+    void export(ReportSearchCommonVo q);
+
+    void detailExport(ReportSearchCommonVo q);
+}

+ 19 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/service/ContactPersonBusinessReportService.java

@@ -0,0 +1,19 @@
+package com.jzg.console.businessReport.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.jzg.commons.entity.report.dto.ReportContactPersonDataManageDetailDto;
+import com.jzg.commons.entity.report.dto.ReportContactPersonDataManageDto;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+
+/**
+ * 对接人业务报表服务。
+ */
+public interface ContactPersonBusinessReportService {
+    IPage<ReportContactPersonDataManageDto> page(ReportSearchCommonVo q);
+
+    IPage<ReportContactPersonDataManageDetailDto> detailPage(ReportSearchCommonVo q);
+
+    void export(ReportSearchCommonVo q);
+
+    void detailExport(ReportSearchCommonVo q);
+}

+ 19 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/service/RiskBusinessReportService.java

@@ -0,0 +1,19 @@
+package com.jzg.console.businessReport.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.jzg.commons.entity.report.dto.ReportRiskDataManageDetailDto;
+import com.jzg.commons.entity.report.dto.ReportRiskDataManageDto;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+
+/**
+ * 险种业务报表服务。
+ */
+public interface RiskBusinessReportService {
+    IPage<ReportRiskDataManageDto> page(ReportSearchCommonVo q);
+
+    IPage<ReportRiskDataManageDetailDto> detailPage(ReportSearchCommonVo q);
+
+    void export(ReportSearchCommonVo q);
+
+    void detailExport(ReportSearchCommonVo q);
+}

+ 19 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/service/SalesmanBusinessReportService.java

@@ -0,0 +1,19 @@
+package com.jzg.console.businessReport.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.jzg.commons.entity.report.dto.ReportSalesmanDataManageDetailDto;
+import com.jzg.commons.entity.report.dto.ReportSalesmanDataManageDto;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+
+/**
+ * 业务员业务报表服务。
+ */
+public interface SalesmanBusinessReportService {
+    IPage<ReportSalesmanDataManageDto> page(ReportSearchCommonVo q);
+
+    IPage<ReportSalesmanDataManageDetailDto> detailPage(ReportSearchCommonVo q);
+
+    void export(ReportSearchCommonVo q);
+
+    void detailExport(ReportSearchCommonVo q);
+}

+ 42 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/service/impl/CompanyBusinessReportServiceImpl.java

@@ -0,0 +1,42 @@
+package com.jzg.console.businessReport.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.commons.entity.report.dto.*;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+import com.jzg.console.businessReport.mapper.CompanyBusinessReportMapper;
+import com.jzg.console.businessReport.service.CompanyBusinessReportService;
+import com.jzg.console.service.impl.ReportBaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 保险公司业务报表独立实现。
+ */
+@Service
+public class CompanyBusinessReportServiceImpl extends ReportBaseServiceImpl implements CompanyBusinessReportService {
+    private final CompanyBusinessReportMapper mapper;
+
+    public CompanyBusinessReportServiceImpl(CompanyBusinessReportMapper mapper) {
+        this.mapper = mapper;
+    }
+
+    public IPage<ReportCompanyDataManageDto> page(ReportSearchCommonVo q) {
+        return mapper.page(pageOf(q), q);
+    }
+
+    public IPage<ReportCompanyDataManageDetailDto> detailPage(ReportSearchCommonVo q) {
+        return mapper.detailPage(pageOf(q), q);
+    }
+
+    public void export(ReportSearchCommonVo q) {
+        upLoadFile(q, ReportCompanyDataManageDto.class, mapper.export(q), "业务报表-保险公司-列表-" + q.getUserId());
+    }
+
+    public void detailExport(ReportSearchCommonVo q) {
+        upLoadFile(q, ReportCompanyDataManageDetailDto.class, mapper.detailExport(q), "业务报表-保险公司-明细-" + q.getUserId());
+    }
+
+    private <T> Page<T> pageOf(ReportSearchCommonVo q) {
+        return new Page<>(q.getPageNo() == null || q.getPageNo() < 1 ? 1 : q.getPageNo(), q.getPageSize() == null || q.getPageSize() < 1 ? 20 : Math.min(q.getPageSize(), 200));
+    }
+}

+ 42 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/service/impl/ContactPersonBusinessReportServiceImpl.java

@@ -0,0 +1,42 @@
+package com.jzg.console.businessReport.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.commons.entity.report.dto.*;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+import com.jzg.console.businessReport.mapper.ContactPersonBusinessReportMapper;
+import com.jzg.console.businessReport.service.ContactPersonBusinessReportService;
+import com.jzg.console.service.impl.ReportBaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 对接人业务报表独立实现。
+ */
+@Service
+public class ContactPersonBusinessReportServiceImpl extends ReportBaseServiceImpl implements ContactPersonBusinessReportService {
+    private final ContactPersonBusinessReportMapper mapper;
+
+    public ContactPersonBusinessReportServiceImpl(ContactPersonBusinessReportMapper mapper) {
+        this.mapper = mapper;
+    }
+
+    public IPage<ReportContactPersonDataManageDto> page(ReportSearchCommonVo q) {
+        return mapper.page(pageOf(q), q);
+    }
+
+    public IPage<ReportContactPersonDataManageDetailDto> detailPage(ReportSearchCommonVo q) {
+        return mapper.detailPage(pageOf(q), q);
+    }
+
+    public void export(ReportSearchCommonVo q) {
+        upLoadFile(q, ReportContactPersonDataManageDto.class, mapper.export(q), "业务报表-对接人-列表-" + q.getUserId());
+    }
+
+    public void detailExport(ReportSearchCommonVo q) {
+        upLoadFile(q, ReportContactPersonDataManageDetailDto.class, mapper.detailExport(q), "业务报表-对接人-明细-" + q.getUserId());
+    }
+
+    private <T> Page<T> pageOf(ReportSearchCommonVo q) {
+        return new Page<>(q.getPageNo() == null || q.getPageNo() < 1 ? 1 : q.getPageNo(), q.getPageSize() == null || q.getPageSize() < 1 ? 20 : Math.min(q.getPageSize(), 200));
+    }
+}

+ 42 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/service/impl/RiskBusinessReportServiceImpl.java

@@ -0,0 +1,42 @@
+package com.jzg.console.businessReport.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.commons.entity.report.dto.*;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+import com.jzg.console.businessReport.mapper.RiskBusinessReportMapper;
+import com.jzg.console.businessReport.service.RiskBusinessReportService;
+import com.jzg.console.service.impl.ReportBaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 险种业务报表独立实现。
+ */
+@Service
+public class RiskBusinessReportServiceImpl extends ReportBaseServiceImpl implements RiskBusinessReportService {
+    private final RiskBusinessReportMapper mapper;
+
+    public RiskBusinessReportServiceImpl(RiskBusinessReportMapper mapper) {
+        this.mapper = mapper;
+    }
+
+    public IPage<ReportRiskDataManageDto> page(ReportSearchCommonVo q) {
+        return mapper.page(pageOf(q), q);
+    }
+
+    public IPage<ReportRiskDataManageDetailDto> detailPage(ReportSearchCommonVo q) {
+        return mapper.detailPage(pageOf(q), q);
+    }
+
+    public void export(ReportSearchCommonVo q) {
+        upLoadFile(q, ReportRiskDataManageDto.class, mapper.export(q), "业务报表-险种-列表-" + q.getUserId());
+    }
+
+    public void detailExport(ReportSearchCommonVo q) {
+        upLoadFile(q, ReportRiskDataManageDetailDto.class, mapper.detailExport(q), "业务报表-险种-明细-" + q.getUserId());
+    }
+
+    private <T> Page<T> pageOf(ReportSearchCommonVo q) {
+        return new Page<>(q.getPageNo() == null || q.getPageNo() < 1 ? 1 : q.getPageNo(), q.getPageSize() == null || q.getPageSize() < 1 ? 20 : Math.min(q.getPageSize(), 200));
+    }
+}

+ 42 - 0
consoleStatistics/src/main/java/com/jzg/console/businessReport/service/impl/SalesmanBusinessReportServiceImpl.java

@@ -0,0 +1,42 @@
+package com.jzg.console.businessReport.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.commons.entity.report.dto.*;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+import com.jzg.console.businessReport.mapper.SalesmanBusinessReportMapper;
+import com.jzg.console.businessReport.service.SalesmanBusinessReportService;
+import com.jzg.console.service.impl.ReportBaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 业务员业务报表独立实现。
+ */
+@Service
+public class SalesmanBusinessReportServiceImpl extends ReportBaseServiceImpl implements SalesmanBusinessReportService {
+    private final SalesmanBusinessReportMapper mapper;
+
+    public SalesmanBusinessReportServiceImpl(SalesmanBusinessReportMapper mapper) {
+        this.mapper = mapper;
+    }
+
+    public IPage<ReportSalesmanDataManageDto> page(ReportSearchCommonVo q) {
+        return mapper.page(pageOf(q), q);
+    }
+
+    public IPage<ReportSalesmanDataManageDetailDto> detailPage(ReportSearchCommonVo q) {
+        return mapper.detailPage(pageOf(q), q);
+    }
+
+    public void export(ReportSearchCommonVo q) {
+        upLoadFile(q, ReportSalesmanDataManageDto.class, mapper.export(q), "业务报表-业务员-列表-" + q.getUserId());
+    }
+
+    public void detailExport(ReportSearchCommonVo q) {
+        upLoadFile(q, ReportSalesmanDataManageDetailDto.class, mapper.detailExport(q), "业务报表-业务员-明细-" + q.getUserId());
+    }
+
+    private <T> Page<T> pageOf(ReportSearchCommonVo q) {
+        return new Page<>(q.getPageNo() == null || q.getPageNo() < 1 ? 1 : q.getPageNo(), q.getPageSize() == null || q.getPageSize() < 1 ? 20 : Math.min(q.getPageSize(), 200));
+    }
+}

+ 52 - 0
consoleStatistics/src/main/java/com/jzg/console/quotationReport/controller/QuotationReportController.java

@@ -0,0 +1,52 @@
+package com.jzg.console.quotationReport.controller;
+
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+import com.jzg.console.quotationReport.service.QuotationReportService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 保险公司业务报表接口。
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/console/quotationReport")
+@Tag(name = "报价数据-报价订单")
+public class QuotationReportController {
+    private final QuotationReportService quotationReportService;
+
+    @PostMapping("/quotation/page")
+    @Operation(summary = "报价订单报表分页查询")
+    public HttpResult<?> quotationPage(@RequestBody ReportSearchCommonVo q) {
+        return HttpResult.ok(quotationReportService.quotationPage(q));
+    }
+
+
+    @PostMapping("/quotation/export")
+    @Operation(summary = "报价订单报表导出")
+    public HttpResult<?> quotationExport(@RequestBody ReportSearchCommonVo q) {
+        quotationReportService.quotationExport(q);
+        return HttpResult.ok("导出任务已提交,请在导出中心查看");
+    }
+
+
+    @PostMapping("/company/page")
+    @Operation(summary = "保险公司分页查询")
+    public HttpResult<?> companyPage(@RequestBody ReportSearchCommonVo q) {
+        return HttpResult.ok(quotationReportService.companyPage(q));
+    }
+
+    @PostMapping("/company/export")
+    @Operation(summary = "保险公司报表导出")
+    public HttpResult<?> companyExport(@RequestBody ReportSearchCommonVo q) {
+        quotationReportService.companyExport(q);
+        return HttpResult.ok("导出任务已提交,请在导出中心查看");
+    }
+
+}

+ 24 - 0
consoleStatistics/src/main/java/com/jzg/console/quotationReport/mapper/QuotationReportMapper.java

@@ -0,0 +1,24 @@
+package com.jzg.console.quotationReport.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.commons.annotation.IgnoreTenant;
+import com.jzg.commons.entity.report.dto.ReportCompanyQuotationDataDto;
+import com.jzg.commons.entity.report.dto.ReportQuotationOrderDataDto;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface QuotationReportMapper {
+    @IgnoreTenant
+    IPage<ReportQuotationOrderDataDto> quotationPage(Page<ReportQuotationOrderDataDto> p, @Param("q") ReportSearchCommonVo q);
+    @IgnoreTenant
+    List<ReportQuotationOrderDataDto> quotationExport(@Param("q") ReportSearchCommonVo q);
+    @IgnoreTenant
+    IPage<ReportCompanyQuotationDataDto> companyPage(Page<ReportCompanyQuotationDataDto> p, @Param("q")ReportSearchCommonVo q);
+    @IgnoreTenant
+    List<ReportCompanyQuotationDataDto> companyExport( @Param("q")ReportSearchCommonVo q);
+}

+ 21 - 0
consoleStatistics/src/main/java/com/jzg/console/quotationReport/service/QuotationReportService.java

@@ -0,0 +1,21 @@
+package com.jzg.console.quotationReport.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.jzg.commons.entity.report.dto.ReportCompanyDataManageDetailDto;
+import com.jzg.commons.entity.report.dto.ReportCompanyDataManageDto;
+import com.jzg.commons.entity.report.dto.ReportCompanyQuotationDataDto;
+import com.jzg.commons.entity.report.dto.ReportQuotationOrderDataDto;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+
+/**
+ * 保险公司业务报表服务。
+ */
+public interface QuotationReportService {
+    IPage<ReportQuotationOrderDataDto> quotationPage(ReportSearchCommonVo q);
+
+    void quotationExport(ReportSearchCommonVo q);
+
+    IPage<ReportCompanyQuotationDataDto> companyPage(ReportSearchCommonVo q);
+
+    void companyExport(ReportSearchCommonVo q);
+}

+ 50 - 0
consoleStatistics/src/main/java/com/jzg/console/quotationReport/service/impl/QuotationReportServiceImpl.java

@@ -0,0 +1,50 @@
+package com.jzg.console.quotationReport.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.commons.entity.report.dto.ReportCompanyDataManageDetailDto;
+import com.jzg.commons.entity.report.dto.ReportCompanyDataManageDto;
+import com.jzg.commons.entity.report.dto.ReportCompanyQuotationDataDto;
+import com.jzg.commons.entity.report.dto.ReportQuotationOrderDataDto;
+import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+import com.jzg.console.businessReport.mapper.CompanyBusinessReportMapper;
+import com.jzg.console.quotationReport.mapper.QuotationReportMapper;
+import com.jzg.console.quotationReport.service.QuotationReportService;
+import com.jzg.console.service.impl.ReportBaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 保险公司业务报表独立实现。
+ */
+@Service
+public class QuotationReportServiceImpl extends ReportBaseServiceImpl implements QuotationReportService {
+    private final QuotationReportMapper mapper;
+
+    public QuotationReportServiceImpl(QuotationReportMapper mapper) {
+        this.mapper = mapper;
+    }
+
+
+    private <T> Page<T> pageOf(ReportSearchCommonVo q) {
+        return new Page<>(q.getPageNo() == null || q.getPageNo() < 1 ? 1 : q.getPageNo(), q.getPageSize() == null || q.getPageSize() < 1 ? 20 : Math.min(q.getPageSize(), 200));
+    }
+
+    @Override
+    public IPage<ReportQuotationOrderDataDto> quotationPage(ReportSearchCommonVo q) {
+        return mapper.quotationPage(pageOf(q), q);
+    }
+
+    @Override
+    public void quotationExport(ReportSearchCommonVo q) {
+        upLoadFile(q, ReportQuotationOrderDataDto.class, mapper.quotationExport(q), "报价数据-报价订单-列表-" + q.getUserId());
+    }
+
+    @Override
+    public IPage<ReportCompanyQuotationDataDto> companyPage(ReportSearchCommonVo q) {
+        return mapper.companyPage(pageOf(q), q);
+    }
+    @Override
+    public void  companyExport(ReportSearchCommonVo q) {
+        upLoadFile(q, ReportCompanyQuotationDataDto.class, mapper.companyExport(q), "报价数据-保险公司-列表-" + q.getUserId());
+    }
+}

+ 103 - 0
consoleStatistics/src/main/resources/mapper/CompanyBusinessReportMapper.xml

@@ -0,0 +1,103 @@
+<?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.jzg.console.businessReport.mapper.CompanyBusinessReportMapper">
+    <!-- 订单先过滤、费用按订单聚合,避免费用一对多放大订单数和金额。筛选列不套函数以便使用索引。 -->
+    <sql id="base">
+        WITH orders AS (
+            SELECT o.id,o.quote_no,o.agreement_id,o.company_id,o.company_name,o.product_id,o.product_name,
+                   o.order_status,o.entry_status,o.audit_status,o.real_quote_user_id,o.order_source,
+                   o.docking_person,o.docking_person_phone,o.create_time,o.signing_time,o.parent_id,o.system_code,ioci.license_no,
+        COALESCE(ifo.total_premium, 0) total_premium,
+        COALESCE(ifo.jq_premium, 0) jq_premium,
+        COALESCE(ifo.sy_premium, 0) sy_premium,
+        COALESCE(ifo.jy_premium, 0) jy_premium
+            FROM ins_orders o LEFT JOIN ins_orders_car_info ioci ON o.id = ioci.order_no
+            left join ins_fee_orders ifo on o.id = ifo.order_no
+            WHERE o.is_delete = 0
+              AND o.order_status = 5
+              <if test="q != null and q.companyId != null and q.companyId != ''">AND o.company_id = #{q.companyId}</if>
+              <if test="q != null and q.createTimeBegin != null and q.createTimeBegin != ''">AND o.create_time &gt;= #{q.createTimeBegin}</if>
+              <if test="q != null and q.createTimeEnd != null and q.createTimeEnd != ''">AND o.create_time &lt; #{q.createTimeEnd}</if>
+              <if test="q != null and q.signTimeBegin != null and q.signTimeBegin != ''">AND o.signing_time &gt;= #{q.signTimeBegin}</if>
+              <if test="q != null and q.signTimeEnd != null and q.signTimeEnd != ''">AND o.signing_time &lt; #{q.signTimeEnd}</if>
+              <if test="q != null and q.orderStatus != null and q.orderStatus.size() &gt; 0">
+                AND o.order_status IN <foreach collection="q.orderStatus" item="v" open="(" separator="," close=")">#{v}</foreach>
+              </if>
+              <if test="q != null and q.orderSource != null and q.orderSource.size() &gt; 0">
+                AND o.order_source IN <foreach collection="q.orderSource" item="v" open="(" separator="," close=")">#{v}</foreach>
+              </if>
+              <if test="q != null and q.productType != null and q.productType.size() &gt; 0">
+                AND o.product_id IN <foreach collection="q.productType" item="v" open="(" separator="," close=")">#{v}</foreach>
+              </if>
+              <if test="q != null and q.riskTypes != null and q.riskTypes.size() &gt; 0">
+                AND o.product_id IN <foreach collection="q.riskTypes" item="v" open="(" separator="," close=")">#{v}</foreach>
+              </if>
+              <if test="q != null and q.salesmanName != null and q.salesmanName != ''">AND o.real_quote_user_id LIKE CONCAT('%',#{q.salesmanName},'%')</if>
+              <if test="q != null and q.salesmanPhone != null and q.salesmanPhone != ''">AND o.real_quote_user_id = #{q.salesmanPhone}</if>
+              <if test="q != null and q.manageName != null and q.manageName != ''">AND o.docking_person LIKE CONCAT('%',#{q.manageName},'%')</if>
+              <if test="q != null and q.managePhone != null and q.managePhone != ''">AND o.docking_person_phone = #{q.managePhone}</if>
+              <if test="q != null and q.orderTypes != null and q.orderTypes.size() &gt; 0">
+                AND o.entry_status IN <foreach collection="q.orderTypes" item="v" open="(" separator="," close=")">#{v}</foreach>
+              </if>
+            <if test="q != null and q.systemCode != null and q.systemCode != ''">AND o.system_code =
+                #{q.systemCode}
+            </if>
+        )
+    </sql>
+
+    <select id="page" resultType="com.jzg.commons.entity.report.dto.ReportCompanyDataManageDto">
+        <include refid="base"/>
+        SELECT o.company_id companyId,o.company_name companyName,COALESCE(a.partner_company_id,'') partnerCompanyId,
+          COALESCE(pc.name_simple,'') partnerCompanyName,COUNT(DISTINCT o.id) sumOrderNum,
+          COALESCE(SUM(o.total_premium),0) sumPremium,COALESCE(SUM(o.total_premium),0) sumCompanyPremium,
+          COALESCE(SUM(CASE WHEN o.product_id='0330'  THEN o.total_premium ELSE 0 END),0) djPremium,
+          COALESCE(SUM(CASE WHEN o.product_id='034002'  THEN o.total_premium ELSE 0 END),0) dszPremium,
+          COALESCE(SUM(CASE WHEN o.product_id='034001'  THEN o.total_premium ELSE 0 END),0) dsyPremium,
+          COALESCE(SUM(CASE WHEN o.product_id='0330034002'  THEN o.total_premium ELSE 0 END),0) jszPremium,
+          COALESCE(SUM(CASE WHEN o.product_id='0330034001'  THEN o.total_premium ELSE 0 END),0) jsyPremium
+        FROM orders o LEFT JOIN ptl_agreement a ON a.id=o.agreement_id AND a.is_delete=0
+        LEFT JOIN esm_ins_company pc ON pc.id=a.partner_company_id AND pc.is_delete=0
+         where 1=1
+        <if test="q != null and q.partnerCompanyIds != null and q.partnerCompanyIds.size() &gt; 0">
+            AND a.partner_company_id IN
+            <foreach collection="q.partnerCompanyIds" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        GROUP BY o.company_id,o.company_name,a.partner_company_id,pc.name_simple ORDER BY o.company_id,a.partner_company_id
+
+    </select>
+    <select id="export" resultType="com.jzg.commons.entity.report.dto.ReportCompanyDataManageDto">
+        <include refid="base"/>
+        SELECT o.company_id companyId,o.company_name companyName,COALESCE(a.partner_company_id,'') partnerCompanyId,
+        COALESCE(pc.name_simple,'') partnerCompanyName,COUNT(DISTINCT o.id) sumOrderNum,
+        COALESCE(SUM(o.total_premium),0) sumPremium,COALESCE(SUM(o.total_premium),0) sumCompanyPremium,
+        COALESCE(SUM(CASE WHEN o.product_id='0330'  THEN o.total_premium ELSE 0 END),0) djPremium,
+        COALESCE(SUM(CASE WHEN o.product_id='034002'  THEN o.total_premium ELSE 0 END),0) dszPremium,
+        COALESCE(SUM(CASE WHEN o.product_id='034001'  THEN o.total_premium ELSE 0 END),0) dsyPremium,
+        COALESCE(SUM(CASE WHEN o.product_id='0330034002'  THEN o.total_premium ELSE 0 END),0) jszPremium,
+        COALESCE(SUM(CASE WHEN o.product_id='0330034001'  THEN o.total_premium ELSE 0 END),0) jsyPremium
+        FROM orders o LEFT JOIN ptl_agreement a ON a.id=o.agreement_id AND a.is_delete=0
+        LEFT JOIN esm_ins_company pc ON pc.id=a.partner_company_id AND pc.is_delete=0
+        where 1=1
+        <if test="q != null and q.partnerCompanyIds != null and q.partnerCompanyIds.size() &gt; 0">
+            AND a.partner_company_id IN
+            <foreach collection="q.partnerCompanyIds" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        GROUP BY o.company_id,o.company_name,a.partner_company_id,pc.name_simple ORDER BY o.company_id,a.partner_company_id
+    </select>
+
+    <sql id="detailSelect">
+      SELECT o.license_no AS licenseNo,o.company_id companyId,o.company_name companyName,COALESCE(a.partner_company_id,'') partnerCompanyId,
+      COALESCE(pc.name_simple,'') partnerCompanyName,o.id orderNo,o.product_name riskName,
+      CASE WHEN o.entry_status = 1 THEN '车险录入' WHEN o.entry_status = 2 THEN '代客录单' ELSE '外部订单' END orderTypeName,COALESCE(o.total_premium,0) sumPremium,o.create_time createTime,o.signing_time recordTime
+      FROM orders o LEFT JOIN ptl_agreement a ON a.id=o.agreement_id AND a.is_delete=0
+      LEFT JOIN esm_ins_company pc ON pc.id=a.partner_company_id AND pc.is_delete=0 where 1=1
+        <if test="q != null and q.partnerCompanyIds != null and q.partnerCompanyIds.size() &gt; 0">
+            AND a.partner_company_id IN
+            <foreach collection="q.partnerCompanyIds" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+    </sql>
+    <select id="detailPage" resultType="com.jzg.commons.entity.report.dto.ReportCompanyDataManageDetailDto"><include refid="base"/><include refid="detailSelect"/> ORDER BY o.create_time DESC,o.id</select>
+    <select id="detailExport" resultType="com.jzg.commons.entity.report.dto.ReportCompanyDataManageDetailDto"><include refid="base"/><include refid="detailSelect"/> ORDER BY o.create_time DESC,o.id</select>
+
+
+</mapper>

+ 113 - 0
consoleStatistics/src/main/resources/mapper/ContactPersonBusinessReportMapper.xml

@@ -0,0 +1,113 @@
+<?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.jzg.console.businessReport.mapper.ContactPersonBusinessReportMapper">
+    <!-- 订单先过滤、费用按订单聚合,避免费用一对多放大订单数和金额。筛选列不套函数以便使用索引。 -->
+    <sql id="base">
+        WITH orders AS (
+        SELECT o.id,o.quote_no,o.agreement_id,o.company_id,o.company_name,o.product_id,o.product_name,
+        o.order_status,o.entry_status,o.audit_status,o.real_quote_user_id,o.order_source,
+        o.docking_person,o.docking_person_phone,o.create_time,o.signing_time,o.parent_id,o.system_code,ioci.license_no,
+        COALESCE(ifo.total_premium, 0) total_premium,
+        COALESCE(ifo.jq_premium, 0) jq_premium,
+        COALESCE(ifo.sy_premium, 0) sy_premium,
+        COALESCE(ifo.jy_premium, 0) jy_premium
+        FROM ins_orders o LEFT JOIN ins_orders_car_info ioci ON o.id = ioci.order_no
+        left join ins_fee_orders ifo on o.id = ifo.order_no
+        WHERE o.is_delete = 0
+        AND o.order_status = 5
+        <if test="q != null and q.companyId != null and q.companyId != ''">AND o.company_id = #{q.companyId}</if>
+        <if test="q != null and q.createTimeBegin != null and q.createTimeBegin != ''">AND o.create_time &gt;=
+            #{q.createTimeBegin}
+        </if>
+        <if test="q != null and q.createTimeEnd != null and q.createTimeEnd != ''">AND o.create_time &lt;
+            #{q.createTimeEnd}
+        </if>
+        <if test="q != null and q.signTimeBegin != null and q.signTimeBegin != ''">AND o.signing_time &gt;=
+            #{q.signTimeBegin}
+        </if>
+        <if test="q != null and q.signTimeEnd != null and q.signTimeEnd != ''">AND o.signing_time &lt;
+            #{q.signTimeEnd}
+        </if>
+        <if test="q != null and q.orderStatus != null and q.orderStatus.size() &gt; 0">
+            AND o.order_status IN
+            <foreach collection="q.orderStatus" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        <if test="q != null and q.orderSource != null and q.orderSource.size() &gt; 0">
+            AND o.order_source IN
+            <foreach collection="q.orderSource" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        <if test="q != null and q.productType != null and q.productType.size() &gt; 0">
+            AND o.product_id IN
+            <foreach collection="q.productType" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        <if test="q != null and q.riskTypes != null and q.riskTypes.size() &gt; 0">
+            AND o.product_id IN
+            <foreach collection="q.riskTypes" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        <if test="q != null and q.salesmanName != null and q.salesmanName != ''">AND o.real_quote_user_id LIKE
+            CONCAT('%',#{q.salesmanName},'%')
+        </if>
+        <if test="q != null and q.salesmanPhone != null and q.salesmanPhone != ''">AND o.real_quote_user_id =
+            #{q.salesmanPhone}
+        </if>
+        <if test="q != null and q.manageName != null and q.manageName != ''">AND o.docking_person LIKE
+            CONCAT('%',#{q.manageName},'%')
+        </if>
+        <if test="q != null and q.managePhone != null and q.managePhone != ''">AND o.docking_person_phone =
+            #{q.managePhone}
+        </if>
+        <if test="q != null and q.orderTypes != null and q.orderTypes.size() &gt; 0">
+            AND o.entry_status IN
+            <foreach collection="q.orderTypes" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        <if test="q != null and q.systemCode != null and q.systemCode != ''">AND o.system_code =
+            #{q.systemCode}
+        </if>
+      )
+    </sql>
+
+
+    <sql id="detailSelect"><![CDATA[
+      SELECT o.docking_person contactPersonName,o.docking_person_phone contactPersonPhone,o.license_no AS licenseNo,o.company_id companyId,o.company_name companyName,COALESCE(a.partner_company_id,'') partnerCompanyId,
+      COALESCE(pc.name_simple,'') partnerCompanyName,o.id orderNo,o.product_name riskName,
+      CASE WHEN o.entry_status = 1 THEN '车险录入' WHEN o.entry_status = 2 THEN '代客录单' ELSE '外部订单' END orderTypeName,COALESCE(o.total_premium,0) sumPremium,o.create_time createTime,o.signing_time recordTime,
+      a.agreement_code agreeId ,a.agreement_name agreeName
+      FROM orders o LEFT JOIN ptl_agreement a ON a.id=o.agreement_id AND a.is_delete=0
+      LEFT JOIN esm_ins_company pc ON pc.id=a.partner_company_id AND pc.is_delete=0 where 1=1
+      ]]> <if test="q != null and q.partnerCompanyIds != null and q.partnerCompanyIds.size() &gt; 0">
+        AND a.partner_company_id IN
+        <foreach collection="q.partnerCompanyIds" item="v" open="(" separator="," close=")">#{v}</foreach>
+    </if></sql>
+
+
+    <sql id="contactAgg"><![CDATA[
+      SELECT o.docking_person contactPersonName,o.docking_person_phone contactPersonPhone,o.company_id companyId,o.company_name companyName,
+      COALESCE(a.partner_company_id,'') partnerCompanyId,COALESCE(pc.name_simple,'') partnerCompanyName,
+      ANY_VALUE(CASE WHEN a.agreement_type = 1 THEN '平台协议' WHEN a.agreement_type = 2 THEN '私有协议' ELSE '网销协议' END) AS agreeTypeName,
+      COUNT(DISTINCT o.id) sumOrderNum,COALESCE(SUM(o.total_premium),0) sumPremium,
+      ROUND(COALESCE(SUM(o.total_premium),0)/NULLIF(COUNT(DISTINCT o.id),0),2) avgOrderNumPremium,
+      COUNT(DISTINCT o.real_quote_user_id) sumPersonNum,ROUND(COALESCE(SUM(o.total_premium),0)/NULLIF(COUNT(DISTINCT o.real_quote_user_id),0),2) avgPersonNumPremium
+      FROM orders o LEFT JOIN ptl_agreement a ON a.id=o.agreement_id AND a.is_delete=0 LEFT JOIN esm_ins_company pc ON pc.id=a.partner_company_id AND pc.is_delete=0
+      GROUP BY o.docking_person,o.docking_person_phone,o.company_id,o.company_name,a.partner_company_id,pc.name_simple,a.match_type
+    ]]></sql>
+    <select id="page" resultType="com.jzg.commons.entity.report.dto.ReportContactPersonDataManageDto">
+        <include refid="base"/>
+        <include refid="contactAgg"/>
+    </select>
+    <select id="export" resultType="com.jzg.commons.entity.report.dto.ReportContactPersonDataManageDto">
+        <include refid="base"/>
+        <include refid="contactAgg"/>
+    </select>
+    <select id="detailPage" resultType="com.jzg.commons.entity.report.dto.ReportContactPersonDataManageDetailDto">
+        <include refid="base"/>
+        <include refid="detailSelect"/>
+        ORDER BY o.create_time DESC,o.id
+    </select>
+    <select id="detailExport" resultType="com.jzg.commons.entity.report.dto.ReportContactPersonDataManageDetailDto">
+        <include refid="base"/>
+        <include refid="detailSelect"/>
+        ORDER BY o.create_time DESC,o.id
+    </select>
+
+
+</mapper>

+ 262 - 0
consoleStatistics/src/main/resources/mapper/QuotationReportMapper.xml

@@ -0,0 +1,262 @@
+<?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.jzg.console.quotationReport.mapper.QuotationReportMapper">
+    <!-- 订单先过滤、费用按订单聚合,避免费用一对多放大订单数和金额。筛选列不套函数以便使用索引。 -->
+    <sql id="base">
+        WITH orders AS (
+            SELECT o.id,o.quote_no,o.agreement_id,o.company_id,o.company_name,o.product_id,o.product_name,
+                   o.order_status,o.entry_status,o.audit_status,o.real_quote_user_id,o.order_source,
+                   o.docking_person,o.docking_person_phone,o.create_time,o.signing_time,o.parent_id,o.system_code,
+                   ioci.license_no, ioci.vin_no, ioci.brand_name, ioci.engine_no,o.quote_time,
+        COALESCE(ifo.total_premium, 0) total_premium,
+        COALESCE(ifo.jq_premium, 0) jq_premium,
+        COALESCE(ifo.sy_premium, 0) sy_premium,
+        COALESCE(ifo.jy_premium, 0) jy_premium
+            FROM ins_orders o LEFT JOIN ins_orders_car_info ioci ON o.id = ioci.order_no
+            left join ins_fee_orders ifo on o.id = ifo.order_no
+            LEFT JOIN ptl_agreement a ON a.id=o.agreement_id AND a.is_delete=0
+            LEFT JOIN esm_ins_company pc ON pc.id=a.partner_company_id AND pc.is_delete=0
+            WHERE o.is_delete = 0
+
+              <if test="q != null and q.partnerCompanyIds != null and q.partnerCompanyIds.size() &gt; 0">
+                    AND a.partner_company_id IN
+                    <foreach collection="q.partnerCompanyIds" item="v" open="(" separator="," close=")">#{v}</foreach>
+              </if>
+              <if test="q != null and q.companyId != null and q.companyId != ''">AND o.company_id = #{q.companyId}</if>
+              <if test="q != null and q.createTimeBegin != null and q.createTimeBegin != ''">AND o.create_time &gt;= #{q.createTimeBegin}</if>
+              <if test="q != null and q.createTimeEnd != null and q.createTimeEnd != ''">AND o.create_time &lt; #{q.createTimeEnd}</if>
+              <if test="q != null and q.signTimeBegin != null and q.signTimeBegin != ''">AND o.signing_time &gt;= #{q.signTimeBegin}</if>
+              <if test="q != null and q.signTimeEnd != null and q.signTimeEnd != ''">AND o.signing_time &lt; #{q.signTimeEnd}</if>
+              <if test="q != null and q.orderStatus != null and q.orderStatus.size() &gt; 0">
+                AND o.order_status IN <foreach collection="q.orderStatus" item="v" open="(" separator="," close=")">#{v}</foreach>
+              </if>
+              <if test="q != null and q.orderSource != null and q.orderSource.size() &gt; 0">
+                AND o.order_source IN <foreach collection="q.orderSource" item="v" open="(" separator="," close=")">#{v}</foreach>
+              </if>
+              <if test="q != null and q.productType != null and q.productType.size() &gt; 0">
+                AND o.product_id IN <foreach collection="q.productType" item="v" open="(" separator="," close=")">#{v}</foreach>
+              </if>
+              <if test="q != null and q.riskTypes != null and q.riskTypes.size() &gt; 0">
+                AND o.product_id IN <foreach collection="q.riskTypes" item="v" open="(" separator="," close=")">#{v}</foreach>
+              </if>
+              <if test="q != null and q.salesmanName != null and q.salesmanName != ''">AND o.real_quote_user_id LIKE CONCAT('%',#{q.salesmanName},'%')</if>
+              <if test="q != null and q.salesmanPhone != null and q.salesmanPhone != ''">AND o.real_quote_user_id = #{q.salesmanPhone}</if>
+              <if test="q != null and q.manageName != null and q.manageName != ''">AND o.docking_person LIKE CONCAT('%',#{q.manageName},'%')</if>
+              <if test="q != null and q.managePhone != null and q.managePhone != ''">AND o.docking_person_phone = #{q.managePhone}</if>
+              <if test="q != null and q.orderTypes != null and q.orderTypes.size() &gt; 0">
+                AND o.entry_status IN <foreach collection="q.orderTypes" item="v" open="(" separator="," close=")">#{v}</foreach>
+              </if>
+                <if test="q != null and q.systemCode != null and q.systemCode != ''">AND o.system_code =
+                    #{q.systemCode}
+                </if>
+              <if test="q != null and q.orgIds != null and q.orgIds.size() &gt; 0">
+                AND o.real_quote_user_id IN ( <foreach collection="q.orgIds" item="orgId" separator="UNION ALL">
+                  SELECT su.mobile
+                  FROM sys_organization_user_link soul
+                  LEFT JOIN sys_user su ON soul.user_id = su.id
+                  WHERE soul.organization_id = #{orgId}
+                  AND soul.is_delete = 0
+                  AND su.is_delete = 0
+              </foreach>
+                  )
+             </if>
+        )
+    </sql>
+
+    <select id="quotationPage" resultType="com.jzg.commons.entity.report.dto.ReportQuotationOrderDataDto">
+        <include refid="base"/>
+        ,
+        <!-- 车辆维度聚合统计 -->
+        car_stat AS (
+        SELECT
+        license_no,
+        engine_no,
+        vin_no,
+        brand_name,
+        COUNT(id) AS quoteOrderNum,
+        COUNT(id) AS quoteCountNum,
+        MIN(NULLIF(total_premium, 0)) AS minPremium,
+        MAX(total_premium) AS maxPremium,
+        SUM(CASE WHEN order_status = 5 THEN total_premium ELSE 0 END) AS dealPremium
+        FROM orders
+        GROUP BY license_no, engine_no, vin_no, brand_name
+        ),
+        <!-- 单独提取成交保险公司(一台车可能多条成交,用GROUP_CONCAT拼接 -->
+        car_company AS (
+        SELECT
+        license_no,
+        engine_no,
+        vin_no,
+        brand_name,
+        GROUP_CONCAT(DISTINCT company_name SEPARATOR '、') AS dealCompanyName
+        FROM orders
+        WHERE order_status = 5
+        GROUP BY license_no, engine_no, vin_no, brand_name
+        )
+        SELECT
+        s.license_no,
+        s.engine_no,
+        s.vin_no,
+        s.brand_name,
+        s.quoteOrderNum,
+        s.quoteCountNum,
+        s.minPremium,
+        s.maxPremium,
+        IFNULL(c.dealCompanyName, '') AS dealCompanyName,
+        s.dealPremium
+        FROM car_stat s
+        LEFT JOIN car_company c
+        ON s.license_no = c.license_no
+        AND s.engine_no = c.engine_no
+        AND s.vin_no = c.vin_no
+        AND s.brand_name = c.brand_name
+        ORDER BY s.vin_no
+
+    </select>
+    <select id="quotationExport" resultType="com.jzg.commons.entity.report.dto.ReportQuotationOrderDataDto">
+        <include refid="base"/>
+        ,
+        <!-- 车辆维度聚合统计 -->
+        car_stat AS (
+        SELECT
+        license_no,
+        engine_no,
+        vin_no,
+        brand_name,
+        COUNT(id) AS quoteOrderNum,
+        COUNT(id) AS quoteCountNum,
+        MIN(NULLIF(total_premium, 0)) AS minPremium,
+        MAX(total_premium) AS maxPremium,
+        SUM(CASE WHEN order_status = 5 THEN total_premium ELSE 0 END) AS dealPremium
+        FROM orders
+        GROUP BY license_no, engine_no, vin_no, brand_name
+        ),
+        <!-- 单独提取成交保险公司(一台车可能多条成交,用GROUP_CONCAT拼接 -->
+        car_company AS (
+        SELECT
+        license_no,
+        engine_no,
+        vin_no,
+        brand_name,
+        GROUP_CONCAT(DISTINCT company_name SEPARATOR '、') AS dealCompanyName
+        FROM orders
+        WHERE order_status = 5
+        GROUP BY license_no, engine_no, vin_no, brand_name
+        )
+        SELECT
+        s.license_no,
+        s.engine_no,
+        s.vin_no,
+        s.brand_name,
+        s.quoteOrderNum,
+        s.quoteCountNum,
+        s.minPremium,
+        s.maxPremium,
+        IFNULL(c.dealCompanyName, '') AS dealCompanyName,
+        s.dealPremium
+        FROM car_stat s
+        LEFT JOIN car_company c
+        ON s.license_no = c.license_no
+        AND s.engine_no = c.engine_no
+        AND s.vin_no = c.vin_no
+        AND s.brand_name = c.brand_name
+        ORDER BY s.vin_no
+
+    </select>
+
+    <select id="companyPage" resultType="com.jzg.commons.entity.report.dto.ReportCompanyQuotationDataDto">
+        <include refid="base"/>,
+        company_stat AS (
+        SELECT
+        o.company_id AS companyId,
+        o.company_name AS companyName,
+        COALESCE(a.partner_company_id,'') partnerCompanyId,
+        COALESCE(pc.name_simple,'') partnerCompanyName,
+        COUNT(o.id) AS quoteCountNum,
+        SUM(CASE WHEN o.order_status IN (1,2,3,4,5,7) THEN 1 ELSE 0 END) AS quoteSuccessNum,
+        SUM(CASE WHEN o.order_status = 6 THEN 1 ELSE 0 END) AS quoteFailNum,
+        SUM(CASE WHEN o.quote_time IS NOT NULL THEN CAST(o.quote_time AS DECIMAL(10,2)) ELSE 0 END)  AS total_quote_second,
+        COUNT(CASE WHEN o.quote_time IS NOT NULL THEN 1 END) AS valid_quote_count,
+        SUM(CASE WHEN o.order_status IN (2,3,4,5,7) THEN 1 ELSE 0 END) AS waitAuditNum,
+        SUM(CASE WHEN o.order_status = 3 THEN 1 ELSE 0 END) AS staffProcessNum,
+        SUM(CASE WHEN o.order_status IN (4,5) THEN 1 ELSE 0 END) AS underwritPassNum,
+        SUM(CASE WHEN o.order_status = 7 THEN 1 ELSE 0 END) AS underwritRejectNum,
+        SUM(CASE WHEN o.order_status = 5  THEN 1 ELSE 0 END) AS dealOrderNum,
+        SUM(COUNT(*)) OVER () AS totalQuoteNum
+        FROM orders o
+        LEFT JOIN ptl_agreement a ON a.id=o.agreement_id AND a.is_delete=0
+        LEFT JOIN esm_ins_company pc ON pc.id=a.partner_company_id AND pc.is_delete=0
+        GROUP BY o.company_id, o.company_name,a.partner_company_id,pc.name_simple
+        )
+        SELECT
+        companyId,
+        companyName,
+        partnerCompanyId,
+        partnerCompanyName,
+        quoteCountNum,
+        ROUND(quoteCountNum * 100.0 / totalQuoteNum, 2) AS quoteCountNumProportion,
+        quoteSuccessNum,
+        quoteFailNum,
+        CASE WHEN valid_quote_count = 0 THEN 0.00
+        ELSE ROUND(total_quote_second / valid_quote_count, 2)
+        END AS avgQuoteTime,
+        waitAuditNum,
+        staffProcessNum,
+        underwritPassNum,
+        underwritRejectNum,
+        CASE WHEN waitAuditNum = 0 THEN 0.00 ELSE ROUND(underwritPassNum * 100.0 / waitAuditNum, 2) END AS underwritPassRate,
+        dealOrderNum,
+        CASE WHEN quoteCountNum = 0 THEN 0.00 ELSE ROUND(dealOrderNum * 100.0 / quoteCountNum, 2) END AS conversionRate
+        FROM company_stat
+
+
+    </select>
+
+    <select id="companyExport" resultType="com.jzg.commons.entity.report.dto.ReportCompanyQuotationDataDto">
+        <include refid="base"/>,
+        company_stat AS (
+        SELECT
+        o.company_id AS companyId,
+        o.company_name AS companyName,
+        COALESCE(a.partner_company_id,'') partnerCompanyId,
+        COALESCE(pc.name_simple,'') partnerCompanyName,
+        COUNT(o.id) AS quoteCountNum,
+        SUM(CASE WHEN o.order_status IN (1,2,3,4,5,7) THEN 1 ELSE 0 END) AS quoteSuccessNum,
+        SUM(CASE WHEN o.order_status = 6 THEN 1 ELSE 0 END) AS quoteFailNum,
+        SUM(CASE WHEN o.quote_time IS NOT NULL THEN CAST(o.quote_time AS DECIMAL(10,2)) ELSE 0 END)  AS total_quote_second,
+        COUNT(CASE WHEN o.quote_time IS NOT NULL THEN 1 END) AS valid_quote_count,
+        SUM(CASE WHEN o.order_status IN (2,3,4,5,7) THEN 1 ELSE 0 END) AS waitAuditNum,
+        SUM(CASE WHEN o.order_status = 3 THEN 1 ELSE 0 END) AS staffProcessNum,
+        SUM(CASE WHEN o.order_status IN (4,5) THEN 1 ELSE 0 END) AS underwritPassNum,
+        SUM(CASE WHEN o.order_status = 7 THEN 1 ELSE 0 END) AS underwritRejectNum,
+        SUM(CASE WHEN o.order_status = 5  THEN 1 ELSE 0 END) AS dealOrderNum,
+        SUM(COUNT(*)) OVER () AS totalQuoteNum
+        FROM orders o
+        LEFT JOIN ptl_agreement a ON a.id=o.agreement_id AND a.is_delete=0
+        LEFT JOIN esm_ins_company pc ON pc.id=a.partner_company_id AND pc.is_delete=0
+        GROUP BY o.company_id, o.company_name,a.partner_company_id,pc.name_simple
+        )
+        SELECT
+        companyId,
+        companyName,
+        partnerCompanyId,
+        partnerCompanyName,
+        quoteCountNum,
+        ROUND(quoteCountNum * 100.0 / totalQuoteNum, 2) AS quoteCountNumProportion,
+        quoteSuccessNum,
+        quoteFailNum,
+        CASE WHEN valid_quote_count = 0 THEN 0.00
+        ELSE ROUND(total_quote_second / valid_quote_count, 2)
+        END AS avgQuoteTime,
+        waitAuditNum,
+        staffProcessNum,
+        underwritPassNum,
+        underwritRejectNum,
+        CASE WHEN waitAuditNum = 0 THEN 0.00 ELSE ROUND(underwritPassNum * 100.0 / waitAuditNum, 2) END AS underwritPassRate,
+        dealOrderNum,
+        CASE WHEN quoteCountNum = 0 THEN 0.00 ELSE ROUND(dealOrderNum * 100.0 / quoteCountNum, 2) END AS conversionRate
+        FROM company_stat
+
+
+    </select>
+</mapper>

+ 182 - 0
consoleStatistics/src/main/resources/mapper/RiskBusinessReportMapper.xml

@@ -0,0 +1,182 @@
+<?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.jzg.console.businessReport.mapper.RiskBusinessReportMapper">
+    <!-- 订单先过滤、费用按订单聚合,避免费用一对多放大订单数和金额。筛选列不套函数以便使用索引。 -->
+    <sql id="base">
+        WITH orders AS (
+        SELECT o.id,o.quote_no,o.agreement_id,o.company_id,o.company_name,o.product_id,o.product_name,
+        o.order_status,o.entry_status,o.audit_status,o.real_quote_user_id,o.order_source,
+        o.docking_person,o.docking_person_phone,o.create_time,o.signing_time,o.parent_id,o.system_code,ioci.license_no,
+        COALESCE(ifo.total_premium, 0) total_premium,quoteCountNum
+        COALESCE(ifo.jq_premium, 0) jq_premium,
+        COALESCE(ifo.sy_premium, 0) sy_premium,
+        COALESCE(ifo.jy_premium, 0) jy_premium
+        FROM ins_orders o LEFT JOIN ins_orders_car_info ioci ON o.id = ioci.order_no
+        left join ins_fee_orders ifo on o.id = ifo.order_no
+        WHERE o.is_delete = 0
+        <if test="q != null and q.companyId != null and q.companyId != ''">AND o.company_id = #{q.companyId}</if>
+        <if test="q != null and q.createTimeBegin != null and q.createTimeBegin != ''">AND o.create_time &gt;= #{q.createTimeBegin}</if>
+        <if test="q != null and q.createTimeEnd != null and q.createTimeEnd != ''">AND o.create_time &lt; #{q.createTimeEnd}</if>
+        <if test="q != null and q.signTimeBegin != null and q.signTimeBegin != ''">AND o.signing_time &gt;= #{q.signTimeBegin}</if>
+        <if test="q != null and q.signTimeEnd != null and q.signTimeEnd != ''">AND o.signing_time &lt; #{q.signTimeEnd}</if>
+        <if test="q != null and q.orderStatus != null and q.orderStatus.size() &gt; 0">
+            AND o.order_status IN <foreach collection="q.orderStatus" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        <if test="q != null and q.orderSource != null and q.orderSource.size() &gt; 0">
+            AND o.order_source IN <foreach collection="q.orderSource" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        <if test="q != null and q.productType != null and q.productType.size() &gt; 0">
+            AND o.product_id IN <foreach collection="q.productType" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        <if test="q != null and q.riskTypes != null and q.riskTypes.size() &gt; 0">
+            AND o.product_id IN <foreach collection="q.riskTypes" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        <if test="q != null and q.salesmanName != null and q.salesmanName != ''">AND o.real_quote_user_id LIKE CONCAT('%',#{q.salesmanName},'%')</if>
+        <if test="q != null and q.salesmanPhone != null and q.salesmanPhone != ''">AND o.real_quote_user_id = #{q.salesmanPhone}</if>
+        <if test="q != null and q.manageName != null and q.manageName != ''">AND o.docking_person LIKE CONCAT('%',#{q.manageName},'%')</if>
+        <if test="q != null and q.managePhone != null and q.managePhone != ''">AND o.docking_person_phone = #{q.managePhone}</if>
+        <if test="q != null and q.orderTypes != null and q.orderTypes.size() &gt; 0">
+            AND o.entry_status IN <foreach collection="q.orderTypes" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        <if test="q != null and q.systemCode != null and q.systemCode != ''">AND o.system_code =
+            #{q.systemCode}
+        </if>
+        ),
+        order_with_partner AS (
+        SELECT
+        o.*,
+        a.partner_company_id,
+        pc.name_simple partnerCompanyName
+        FROM orders o
+        LEFT JOIN ptl_agreement a
+        ON a.id = o.agreement_id AND a.is_delete = 0
+        LEFT JOIN esm_ins_company pc
+        ON pc.id = a.partner_company_id AND pc.is_delete = 0
+        ),
+
+        group_base AS (
+        SELECT
+        system_code,
+        company_id,
+        company_name,
+        COALESCE(partner_company_id, '') AS partner_company_id,
+        COALESCE(partnerCompanyName, '') AS partnerCompanyName,
+        product_id,
+        product_name,
+        COUNT(id) quoteCountNum,
+        COUNT(DISTINCT COALESCE(quote_no, id)) quoteOrderNum,
+        SUM(CASE WHEN order_status = 5 THEN 1 ELSE 0 END) underwriteOrderNum,
+        SUM(CASE WHEN order_status = 5 THEN total_premium ELSE 0 END) underwritePremium
+        FROM order_with_partner
+        GROUP BY
+        company_id,
+        company_name,
+        partner_company_id,
+        partnerCompanyName,
+        product_id,
+        product_name
+        )
+    </sql>
+    <sql id="orderBy">
+        <choose>
+            <when test="q != null and q.orderType == 'sumOrderNum desc'">ORDER BY sum_order_num DESC</when>
+            <when test="q != null and q.orderType == 'sumPremium asc'">ORDER BY sum_premium ASC</when>
+            <when test="q != null and q.orderType == 'sumPremium desc'">ORDER BY sum_premium DESC</when>
+            <otherwise>ORDER BY o.company_id, o.id</otherwise>
+        </choose>
+    </sql>
+
+
+    <select id="page" resultType="com.jzg.commons.entity.report.dto.ReportRiskDataManageDto"><include refid="base"/>
+        SELECT
+        company_id AS companyId,
+        company_name AS companyName,
+        partner_company_id AS partnerCompanyId,
+        partnerCompanyName,
+        product_name AS riskName,
+        quoteCountNum,
+        quoteOrderNum,
+        underwriteOrderNum,
+        underwritePremium,
+        CASE
+        WHEN channel_total_order = 0 THEN 0
+        ELSE ROUND(underwriteOrderNum * 100.0 / channel_total_order, 2)
+        END penetrationRate,
+        ROUND(underwriteOrderNum * 100.0 / quoteCountNum, 2)  underwriteRate
+        FROM (
+        SELECT
+        *,
+        SUM(quoteCountNum) OVER (PARTITION BY company_id, partner_company_id) AS channel_total_order
+        FROM group_base
+        ) t
+        where 1=1
+        <if test="q != null and q.partnerCompanyIds != null and q.partnerCompanyIds.size() &gt; 0">
+            AND partner_company_id IN
+            <foreach collection="q.partnerCompanyIds" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        ORDER BY
+        companyId,
+        product_id
+    </select>
+    <select id="export" resultType="com.jzg.commons.entity.report.dto.ReportRiskDataManageDto"><include refid="base"/>
+        SELECT
+        company_id AS companyId,
+        company_name AS companyName,
+        partner_company_id AS partnerCompanyId,
+        partnerCompanyName,
+        product_name AS riskName,
+        quoteCountNum,
+        quoteOrderNum,
+        underwriteOrderNum,
+        underwritePremium,
+        CASE
+        WHEN channel_total_order = 0 THEN 0
+        ELSE ROUND(underwriteOrderNum * 100.0 / channel_total_order, 2)
+        END penetrationRate,
+        ROUND(underwriteOrderNum * 100.0 / quoteCountNum, 2)  underwriteRate
+        FROM (
+        SELECT
+        *,
+        SUM(quoteCountNum) OVER (PARTITION BY company_id, partner_company_id) AS channel_total_order
+        FROM group_base
+        ) t
+        where 1=1
+        <if test="q != null and q.partnerCompanyIds != null and q.partnerCompanyIds.size() &gt; 0">
+            AND partner_company_id IN
+            <foreach collection="q.partnerCompanyIds" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        ORDER BY
+        companyId,
+        product_id
+    </select>
+    <sql id="detailSelect"><![CDATA[
+      SELECT o.license_no AS licenseNo,o.company_id companyId,o.company_name companyName,COALESCE(a.partner_company_id,'') partnerCompanyId,
+      COALESCE(pc.name_simple,'') partnerCompanyName,o.id orderNo,o.product_name riskName,
+      CASE WHEN o.entry_status = 1 THEN '车险录入' WHEN o.entry_status = 2 THEN '代客录单' ELSE '外部订单' END orderTypeName,COALESCE(o.total_premium,0) sumPremium,o.create_time createTime,o.signing_time recordTime,
+       CASE o.order_status
+    WHEN 0 THEN '订单已提交'
+    WHEN 1 THEN '待核保'
+    WHEN 2 THEN '核保中'
+    WHEN 3 THEN '人工处理'
+    WHEN 4 THEN '待缴费'
+    WHEN 5 THEN '已承保'
+    WHEN 6 THEN '报价失败'
+    WHEN 7 THEN '核保失败'
+    WHEN 8 THEN '订单关闭'
+    ELSE '未知状态'
+END AS orderStatusName
+      FROM orders o LEFT JOIN ptl_agreement a ON a.id=o.agreement_id AND a.is_delete=0
+      LEFT JOIN esm_ins_company pc ON pc.id=a.partner_company_id AND pc.is_delete=0
+    ]]>
+        where 1=1
+        <if test="q != null and q.partnerCompanyIds != null and q.partnerCompanyIds.size() &gt; 0">
+            AND a.partner_company_id IN
+            <foreach collection="q.partnerCompanyIds" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+
+    </sql>
+    <select id="detailPage" resultType="com.jzg.commons.entity.report.dto.ReportRiskDataManageDetailDto"><include refid="base"/><include refid="detailSelect"/> ORDER BY o.create_time DESC,o.id</select>
+    <select id="detailExport" resultType="com.jzg.commons.entity.report.dto.ReportRiskDataManageDetailDto"><include refid="base"/><include refid="detailSelect"/> ORDER BY o.create_time DESC,o.id</select>
+
+
+</mapper>

+ 142 - 0
consoleStatistics/src/main/resources/mapper/SalesmanBusinessReportMapper.xml

@@ -0,0 +1,142 @@
+<?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.jzg.console.businessReport.mapper.SalesmanBusinessReportMapper">
+    <!-- 订单先过滤、费用按订单聚合,避免费用一对多放大订单数和金额。筛选列不套函数以便使用索引。 -->
+    <sql id="base">
+        WITH orders AS (
+        SELECT o.id,o.quote_no,o.agreement_id,o.company_id,o.company_name,o.product_id,o.product_name,
+        o.order_status,o.entry_status,o.audit_status,o.real_quote_user_id,o.order_source,
+        o.docking_person,o.docking_person_phone,o.create_time,o.signing_time,o.parent_id,o.system_code,ioci.license_no,
+        COALESCE(ioc.sum_premium, 0) total_premium,
+        COALESCE(ioc.jq_premium, 0) jq_premium,
+        COALESCE(ioc.sy_premium, 0) sy_premium,
+        COALESCE(ioc.jy_premium, 0) jy_premium,
+        COALESCE(ioc.tax_premium, 0) tax_premium
+        FROM ins_orders o LEFT JOIN ins_orders_car_info ioci ON o.id = ioci.order_no
+        left join ins_orders_costs ioc on o.id = ioc.order_no
+        WHERE o.is_delete = 0
+        AND o.order_status = 5
+        <if test="q != null and q.companyId != null and q.companyId != ''">AND o.company_id = #{q.companyId}</if>
+        <if test="q != null and q.createTimeBegin != null and q.createTimeBegin != ''">AND o.create_time &gt;=
+            #{q.createTimeBegin}
+        </if>
+        <if test="q != null and q.createTimeEnd != null and q.createTimeEnd != ''">AND o.create_time &lt;
+            #{q.createTimeEnd}
+        </if>
+        <if test="q != null and q.signTimeBegin != null and q.signTimeBegin != ''">AND o.signing_time &gt;=
+            #{q.signTimeBegin}
+        </if>
+        <if test="q != null and q.signTimeEnd != null and q.signTimeEnd != ''">AND o.signing_time &lt;
+            #{q.signTimeEnd}
+        </if>
+        <if test="q != null and q.orderStatus != null and q.orderStatus.size() &gt; 0">
+            AND o.order_status IN
+            <foreach collection="q.orderStatus" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        <if test="q != null and q.orderSource != null and q.orderSource.size() &gt; 0">
+            AND o.order_source IN
+            <foreach collection="q.orderSource" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        <if test="q != null and q.productType != null and q.productType.size() &gt; 0">
+            AND o.product_id IN
+            <foreach collection="q.productType" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        <if test="q != null and q.riskTypes != null and q.riskTypes.size() &gt; 0">
+            AND o.product_id IN
+            <foreach collection="q.riskTypes" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        <if test="q != null and q.salesmanName != null and q.salesmanName != ''">AND o.real_quote_user_id LIKE
+            CONCAT('%',#{q.salesmanName},'%')
+        </if>
+        <if test="q != null and q.salesmanPhone != null and q.salesmanPhone != ''">AND o.real_quote_user_id =
+            #{q.salesmanPhone}
+        </if>
+        <if test="q != null and q.manageName != null and q.manageName != ''">AND o.docking_person LIKE
+            CONCAT('%',#{q.manageName},'%')
+        </if>
+        <if test="q != null and q.managePhone != null and q.managePhone != ''">AND o.docking_person_phone =
+            #{q.managePhone}
+        </if>
+        <if test="q != null and q.systemCode != null and q.systemCode != ''">AND o.system_code =
+            #{q.systemCode}
+        </if>
+        <if test="q != null and q.orderTypes != null and q.orderTypes.size() &gt; 0">
+            AND o.entry_status IN
+            <foreach collection="q.orderTypes" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        )
+    </sql>
+
+
+    <sql id="detailSelect"><![CDATA[
+      SELECT suji.name salesmanName,o.real_quote_user_id salesmanPhone, o.license_no AS licenseNo, o.company_id companyId,o.company_name companyName,COALESCE(a.partner_company_id,'') partnerCompanyId,
+      COALESCE(pc.name_simple,'') partnerCompanyName,o.id orderNo,o.product_name riskName,
+      CASE WHEN o.entry_status = 1 THEN '车险录入' WHEN o.entry_status = 2 THEN '代客录单' ELSE '外部订单' END  orderTypeName,COALESCE(o.total_premium,0) sumPremium,o.create_time createTime,o.signing_time recordTime,
+      mgr_info.NAME manegerName
+      FROM orders o LEFT JOIN ptl_agreement a ON a.id=o.agreement_id AND a.is_delete=0
+      LEFT JOIN esm_ins_company pc ON pc.id=a.partner_company_id AND pc.is_delete=0
+    ]]>
+        left join sys_user su on su.mobile = o.real_quote_user_id
+        left join sys_user_jzg_info suji on su.id = suji.user_id and suji.system_code = #{q.systemCode}
+        LEFT JOIN sys_user_jzg_info mgr_info ON mgr_info.id = suji.leader_id AND mgr_info.system_code = #{q.systemCode}
+        where 1=1
+        <if test="q != null and q.salesmanTypes != null and q.salesmanTypes.size() &gt; 0">
+            AND suji.type_attr IN
+            <foreach collection="q.salesmanTypes" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        <if test="q != null and q.manageIds != null and q.manageIds.size() &gt; 0">
+            AND suji.leader_id IN
+            <foreach collection="q.manageIds" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+
+    </sql>
+
+
+
+    <sql id="salesAgg"><![CDATA[
+      SELECT ANY_VALUE(suji.name) salesmanName,o.real_quote_user_id salesmanPhone,ANY_VALUE(sd.name) deptName,
+      SUM(CASE WHEN o.order_status = 5 THEN 1 ELSE 0 END) underwriteOrderNum,
+      COALESCE(SUM(o.total_premium),0) sumPremium,COALESCE(SUM(o.jq_premium),0) jqPremium,COALESCE(SUM(o.sy_premium),0) syPremium,
+      COALESCE(SUM(o.jy_premium),0) jyPremium,COALESCE(SUM(o.tax_premium),0) taxPremium,
+      SUM(CASE WHEN o.product_id='0330' THEN 1 ELSE 0 END) djOrderNum,SUM(CASE WHEN o.product_id='034002' THEN 1 ELSE 0 END) dszOrderNum,
+      SUM(CASE WHEN o.product_id='034001' THEN 1 ELSE 0 END) dsyOrderNum,SUM(CASE WHEN o.product_id='0330034002' THEN 1 ELSE 0 END) jszOrderNum,
+      SUM(CASE WHEN o.product_id='0330034001' THEN 1 ELSE 0 END) jsyOrderNum,
+      ANY_VALUE(mgr_info.NAME) manegerName
+      FROM orders o
+      ]]>
+      left join sys_user su on su.mobile = o.real_quote_user_id
+      left join sys_user_jzg_info suji on su.id = suji.user_id and suji.system_code = #{q.systemCode}
+      left join sys_dept sd on sd.id = suji.dept_id
+      LEFT JOIN sys_user_jzg_info mgr_info ON mgr_info.id = suji.leader_id AND mgr_info.system_code = #{q.systemCode}
+      where 1=1
+        <if test="q != null and q.salesmanTypes != null and q.salesmanTypes.size() &gt; 0">
+            AND suji.type_attr IN
+            <foreach collection="q.salesmanTypes" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+        <if test="q != null and q.manageIds != null and q.manageIds.size() &gt; 0">
+            AND suji.leader_id IN
+            <foreach collection="q.manageIds" item="v" open="(" separator="," close=")">#{v}</foreach>
+        </if>
+      GROUP BY o.real_quote_user_id
+    </sql>
+    <select id="page" resultType="com.jzg.commons.entity.report.dto.ReportSalesmanDataManageDto">
+        <include refid="base"/>
+        <include refid="salesAgg"/>
+    </select>
+    <select id="export" resultType="com.jzg.commons.entity.report.dto.ReportSalesmanDataManageDto">
+        <include refid="base"/>
+        <include refid="salesAgg"/>
+    </select>
+
+    <select id="detailPage" resultType="com.jzg.commons.entity.report.dto.ReportSalesmanDataManageDetailDto">
+        <include refid="base"/>
+        <include refid="detailSelect"/>
+        ORDER BY o.create_time DESC,o.id
+    </select>
+    <select id="detailExport" resultType="com.jzg.commons.entity.report.dto.ReportSalesmanDataManageDetailDto">
+        <include refid="base"/>
+        <include refid="detailSelect"/>
+        ORDER BY o.create_time DESC,o.id
+    </select>
+
+</mapper>