From 6c80cecea3e83ea93575dd3dc2299ed2b6c85d5e Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期五, 11 十月 2024 08:35:35 +0800
Subject: [PATCH] add:花农结算报表

---
 src/main/java/com/mzl/flower/web/v2/report/OrderReportController.java             |   24 ++++
 src/main/java/com/mzl/flower/mapper/report/OrderReportMapper.java                 |    7 +
 src/main/java/com/mzl/flower/dto/response/report/OrderSupplierReportResultVO.java |   47 +++++++
 src/main/java/com/mzl/flower/service/report/OrderReportService.java               |    8 +
 src/main/resources/mapper/report/OrderReportMapper.xml                            |  118 +++++++++++++++++++
 src/main/java/com/mzl/flower/dto/response/report/SupplierReportCalendarBO.java    |   20 +++
 src/main/java/com/mzl/flower/dto/request/report/QuerySupplierDTO.java             |   28 ++++
 src/main/java/com/mzl/flower/service/impl/report/OrderReportServiceImpl.java      |   76 ++++++++++++
 8 files changed, 324 insertions(+), 4 deletions(-)

diff --git a/src/main/java/com/mzl/flower/dto/request/report/QuerySupplierDTO.java b/src/main/java/com/mzl/flower/dto/request/report/QuerySupplierDTO.java
new file mode 100644
index 0000000..3eff5ac
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/report/QuerySupplierDTO.java
@@ -0,0 +1,28 @@
+package com.mzl.flower.dto.request.report;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDate;
+
+@Data
+public class QuerySupplierDTO {
+    @ApiModelProperty(value = "供应商id")
+    private Long supplierId;
+
+    @ApiModelProperty(value = "下单开始日期")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @NotNull(message = "下单日期不能为空")
+    private LocalDate startDate;
+
+    @ApiModelProperty(value = "下单结束日期")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @NotNull(message = "下单日期不能为空")
+    private LocalDate endDate;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/report/OrderSupplierReportResultVO.java b/src/main/java/com/mzl/flower/dto/response/report/OrderSupplierReportResultVO.java
new file mode 100644
index 0000000..baf5129
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/report/OrderSupplierReportResultVO.java
@@ -0,0 +1,47 @@
+package com.mzl.flower.dto.response.report;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.mzl.flower.base.AbstractTransDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+public class OrderSupplierReportResultVO extends AbstractTransDTO {
+
+    @ApiModelProperty("日期")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime orderDate;
+
+    @ApiModelProperty("供应商ID")
+    private String supplierId;
+
+    @ApiModelProperty("供应商名称")
+    private String supplierName;
+
+    @ApiModelProperty("花农底价")
+    private BigDecimal orderSupplierPriceAmount;
+
+    @ApiModelProperty("降级扣款")
+    private BigDecimal orderCheckFee;
+
+    @ApiModelProperty("缺货扣款(缺货+补货)")
+    private BigDecimal orderLackFeeSupplier;
+
+    @ApiModelProperty("售后扣花农款")
+    private BigDecimal salesFeeSupplier;
+
+    @ApiModelProperty("实际销售扎数")
+    private Integer realSaleNum;
+
+    @ApiModelProperty("结算费用")
+    private BigDecimal profitFeeAmount;
+
+    @ApiModelProperty("订单状态")
+    private String settleStatus;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/report/SupplierReportCalendarBO.java b/src/main/java/com/mzl/flower/dto/response/report/SupplierReportCalendarBO.java
new file mode 100644
index 0000000..b618424
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/report/SupplierReportCalendarBO.java
@@ -0,0 +1,20 @@
+package com.mzl.flower.dto.response.report;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+public class SupplierReportCalendarBO {
+
+    @ApiModelProperty("下单的开始时间")
+    private LocalDate startDate;
+
+    @ApiModelProperty("下单的结束时间")
+    private LocalDate endDate;
+
+    @ApiModelProperty(value = "供应商id")
+    private Long supplierId;
+
+}
diff --git a/src/main/java/com/mzl/flower/mapper/report/OrderReportMapper.java b/src/main/java/com/mzl/flower/mapper/report/OrderReportMapper.java
index c4b039a..10868a8 100644
--- a/src/main/java/com/mzl/flower/mapper/report/OrderReportMapper.java
+++ b/src/main/java/com/mzl/flower/mapper/report/OrderReportMapper.java
@@ -1,6 +1,7 @@
 package com.mzl.flower.mapper.report;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.dto.response.report.*;
 import com.mzl.flower.dto.response.report.OrderDetailReportResultVO;
 import com.mzl.flower.dto.response.report.OrderPartnerReportResultVO;
 import com.mzl.flower.dto.response.report.OrderReportCalendarBO;
@@ -17,4 +18,10 @@
     OrderPartnerReportResultVO getPartnerOrderDateReport(@Param("dto")  OrderReportCalendarBO calendarBO);
 
     OrderPartnerReportResultVO getPartnerOrderDateReportStatis(@Param("dto") OrderReportCalendarBO bo);
+
+    List<OrderSupplierReportResultVO> getOrderSupplierPageReport(@Param("dto") SupplierReportCalendarBO calendarBO, Page page);
+
+    List<OrderSupplierReportResultVO> getOrderSupplierReport(@Param("dto") SupplierReportCalendarBO calendarBO);
+
+    OrderSupplierReportResultVO getOrderSupplierCountReport(@Param("dto") SupplierReportCalendarBO calendarBO);
 }
diff --git a/src/main/java/com/mzl/flower/service/impl/report/OrderReportServiceImpl.java b/src/main/java/com/mzl/flower/service/impl/report/OrderReportServiceImpl.java
index a915f65..d71bd92 100644
--- a/src/main/java/com/mzl/flower/service/impl/report/OrderReportServiceImpl.java
+++ b/src/main/java/com/mzl/flower/service/impl/report/OrderReportServiceImpl.java
@@ -3,10 +3,8 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.mzl.flower.config.exception.ValidationException;
 import com.mzl.flower.dto.request.report.QueryOrderDTO;
-import com.mzl.flower.dto.response.report.OrderDetailReportResultVO;
-import com.mzl.flower.dto.response.report.OrderPartnerReportResultVO;
-import com.mzl.flower.dto.response.report.OrderReportCalendarBO;
-import com.mzl.flower.dto.response.report.OrderReportResultVO;
+import com.mzl.flower.dto.request.report.QuerySupplierDTO;
+import com.mzl.flower.dto.response.report.*;
 import com.mzl.flower.mapper.report.OrderReportMapper;
 import com.mzl.flower.service.BaseService;
 import com.mzl.flower.service.calendar.CalendarService;
@@ -281,6 +279,76 @@
         }
     }
 
+    @Override
+    public Page<OrderSupplierReportResultVO> getOrderSupplierPage(Page page, QuerySupplierDTO dto) {
+        SupplierReportCalendarBO supplierReportCalendarBO = new SupplierReportCalendarBO();
+        if (StringUtils.isEmpty(dto.getStartDate()) || StringUtils.isEmpty(dto.getEndDate())) {
+            throw new ValidationException("日期不能为空");
+        }
+        supplierReportCalendarBO.setSupplierId(dto.getSupplierId());
+        supplierReportCalendarBO.setStartDate(dto.getStartDate());
+        supplierReportCalendarBO.setEndDate(dto.getEndDate());
+        List<OrderSupplierReportResultVO> list = orderReportMapper.getOrderSupplierPageReport(supplierReportCalendarBO, page);
+        page.setRecords(list);
+        return page;
+    }
+
+    @Override
+    public OrderSupplierReportResultVO getOrderSupplierClout(QuerySupplierDTO dto) {
+        SupplierReportCalendarBO supplierReportCalendarBO = new SupplierReportCalendarBO();
+        if (StringUtils.isEmpty(dto.getStartDate()) || StringUtils.isEmpty(dto.getEndDate())) {
+            throw new ValidationException("日期不能为空");
+        }
+        supplierReportCalendarBO.setSupplierId(dto.getSupplierId());
+        supplierReportCalendarBO.setStartDate(dto.getStartDate());
+        supplierReportCalendarBO.setEndDate(dto.getEndDate());
+        OrderSupplierReportResultVO orderSupplierCountReport = orderReportMapper.getOrderSupplierCountReport(supplierReportCalendarBO);
+        return orderSupplierCountReport;
+    }
+
+
+    @Override
+    public void exportSupplierList(HttpServletResponse response, QuerySupplierDTO dto) {
+        SupplierReportCalendarBO supplierReportCalendarBO = new SupplierReportCalendarBO();
+        if (StringUtils.isEmpty(dto.getStartDate()) || StringUtils.isEmpty(dto.getEndDate())) {
+            throw new ValidationException("日期不能为空");
+        }
+        supplierReportCalendarBO.setSupplierId(dto.getSupplierId());
+        supplierReportCalendarBO.setStartDate(dto.getStartDate());
+        supplierReportCalendarBO.setEndDate(dto.getEndDate());
+        List<OrderSupplierReportResultVO> list = orderReportMapper.getOrderSupplierReport(supplierReportCalendarBO);
+
+        String[] rowsName = new String[]{"序号","日期", "供应商ID", "供应商","花农底价"
+                , "降级扣款",  "缺货扣款(缺货+补货)","售后扣花农款","售后扣合伙人款","实际销售扎数","结算费用","订单状态"};
+        List<Object[]> dataList = new ArrayList<>();
+        int sn = 1;
+        for (OrderSupplierReportResultVO o : list) {
+            Object[] objs = new Object[rowsName.length];
+            int a = 0;
+            objs[a++] = sn; // 序号
+            objs[a++] = format(o.getOrderDate(), "yyyy-MM-dd"); // 日期
+            objs[a++] = o.getSupplierId(); // 供应商ID
+            objs[a++] = o.getSupplierName(); // 供应商
+            objs[a++] = o.getOrderSupplierPriceAmount(); // 花农底价
+            objs[a++] = o.getOrderCheckFee(); //降级扣款
+            objs[a++] = o.getOrderLackFeeSupplier();//缺货扣款
+            objs[a++] = o.getSalesFeeSupplier(); // 售后扣花农款
+            objs[a++] = o.getRealSaleNum(); // 实际销售扎数
+            objs[a++] = o.getProfitFeeAmount(); // 结算费用
+            objs[a++] = o.getSettleStatus(); // 订单状态
+            dataList.add(objs);
+            sn++;
+        }
+
+        ExcelExportUtil excelExportUtil = new ExcelExportUtil("花农结算报表", rowsName, dataList, response);
+        try {
+            response.addHeader("filename", URLEncoder.encode("花农结算报表.xls", "UTF-8"));
+            response.addHeader("Access-Control-Expose-Headers", "filename");
+            excelExportUtil.export();
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+    }
     // 计算 startDate 的前一天 17:00:00
     public static LocalDateTime calculateStartTime(LocalDateTime startDateTime) {
         // 获取 LocalDate 部分
diff --git a/src/main/java/com/mzl/flower/service/report/OrderReportService.java b/src/main/java/com/mzl/flower/service/report/OrderReportService.java
index 06065d5..c30c944 100644
--- a/src/main/java/com/mzl/flower/service/report/OrderReportService.java
+++ b/src/main/java/com/mzl/flower/service/report/OrderReportService.java
@@ -2,9 +2,11 @@
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.mzl.flower.dto.request.report.QueryOrderDTO;
+import com.mzl.flower.dto.request.report.QuerySupplierDTO;
 import com.mzl.flower.dto.response.report.OrderDetailReportResultVO;
 import com.mzl.flower.dto.response.report.OrderPartnerReportResultVO;
 import com.mzl.flower.dto.response.report.OrderReportResultVO;
+import com.mzl.flower.dto.response.report.OrderSupplierReportResultVO;
 
 import javax.servlet.http.HttpServletResponse;
 
@@ -37,4 +39,10 @@
     OrderPartnerReportResultVO getPartnerSaleStatis(QueryOrderDTO dto);
 
     void exportPartnerSalesList(HttpServletResponse response, QueryOrderDTO dto);
+
+    Page<OrderSupplierReportResultVO> getOrderSupplierPage(Page page, QuerySupplierDTO dto);
+
+    OrderSupplierReportResultVO getOrderSupplierClout(QuerySupplierDTO dto);
+
+    void exportSupplierList(HttpServletResponse response, QuerySupplierDTO dto);
 }
diff --git a/src/main/java/com/mzl/flower/web/v2/report/OrderReportController.java b/src/main/java/com/mzl/flower/web/v2/report/OrderReportController.java
index 741d754..7c8cfd9 100644
--- a/src/main/java/com/mzl/flower/web/v2/report/OrderReportController.java
+++ b/src/main/java/com/mzl/flower/web/v2/report/OrderReportController.java
@@ -6,8 +6,10 @@
 import com.mzl.flower.base.R;
 import com.mzl.flower.base.ReturnDataDTO;
 import com.mzl.flower.dto.request.report.QueryOrderDTO;
+import com.mzl.flower.dto.request.report.QuerySupplierDTO;
 import com.mzl.flower.dto.response.report.OrderDetailReportResultVO;
 import com.mzl.flower.dto.response.report.OrderReportResultVO;
+import com.mzl.flower.dto.response.report.OrderSupplierReportResultVO;
 import com.mzl.flower.service.report.OrderReportService;
 import com.mzl.flower.utils.ConverterUtil;
 import io.swagger.annotations.Api;
@@ -90,4 +92,26 @@
         orderReportService.exportPartnerSalesList(response, dto);
     }
 
+    /**
+     * 花农结算报表
+     */
+    @GetMapping("/supplier/page")
+    @ApiOperation(value = "花农结算报表-分页", notes = "花农结算报表-分页")
+    public ResponseEntity<ReturnDataDTO<Page<OrderSupplierReportResultVO>>> supplier(Page page, QuerySupplierDTO dto) {
+        return returnData(R.SUCCESS.getCode(), orderReportService.getOrderSupplierPage(page, dto));
+    }
+
+    @GetMapping("/supplier/count")
+    @ApiOperation(value = "花农结算报表-统计", notes = "花农结算报表-统计")
+    public ResponseEntity<ReturnDataDTO<Page<OrderSupplierReportResultVO>>> supplierCount(QuerySupplierDTO dto) {
+        return returnData(R.SUCCESS.getCode(), orderReportService.getOrderSupplierClout(dto));
+    }
+
+    @GetMapping({"/supplier/export"})
+    @ApiOperation(value = "花农结算报表导出")
+    public void supplierExports(HttpServletResponse response, @Validated QuerySupplierDTO dto) {
+        orderReportService.exportSupplierList(response, dto);
+    }
+
+
 }
\ No newline at end of file
diff --git a/src/main/resources/mapper/report/OrderReportMapper.xml b/src/main/resources/mapper/report/OrderReportMapper.xml
index 47c7696..6925cc6 100644
--- a/src/main/resources/mapper/report/OrderReportMapper.xml
+++ b/src/main/resources/mapper/report/OrderReportMapper.xml
@@ -336,4 +336,122 @@
         on t2.order_id =t3.order_id
     </sql>
 
+
+    <sql id="baseSupplierSql">
+        SELECT
+        t2.*,
+        IFNULL( t3.sales_fee_supplier, 0 ) AS sales_fee_supplier
+        FROM
+        (
+        SELECT
+        t1.order_item_id,
+        t1.supplier_id,
+        t1.dateinfo,
+        t1.order_id,
+        sum( t1.supplier_price_amount ) AS order_supplier_price_amount,
+        sum( t1.check_fee ) AS order_check_fee,
+        sum( t1.replace_fee ) AS order_replace_fee,
+        sum( t1.lack_fee_supplier ) AS order_lack_fee_supplier,
+        sum( t1.num ) AS order_num,
+        sum( t1.lack_num ) AS order_lack_num
+        FROM
+        (
+        SELECT
+        oi.id AS order_item_id,
+        o.id order_id,
+        oi.supplier_id supplier_id,
+        CASE
+        WHEN HOUR ( o.payment_time ) >= 17 THEN
+        DATE_FORMAT( DATE_ADD( o.payment_time, INTERVAL 1 DAY ), '%Y-%m-%d' ) ELSE DATE_FORMAT( o.payment_time, '%Y-%m-%d' )
+        END AS dateinfo,
+        IFNULL( oi.num, 0 ) AS num,
+        IFNULL( oi.total, 0 ) AS total,
+        IFNULL( oi.supplier_price, 0 ) * IFNULL( oi.num, 0 ) AS supplier_price_amount,
+        IFNULL( ois.check_fee, 0 ) AS check_fee,
+        IFNULL( ois.replace_fee, 0 ) AS replace_fee,
+        IFNULL( ois.lack_fee_supplier, 0 ) AS lack_fee_supplier,
+        IFNULL( (select oic.num from t_order_item_check oic where oic.order_item_id = oi.id and oic.type = 'lack'),0) as lack_num
+        FROM
+        t_order o
+        LEFT JOIN t_order_item oi ON oi.order_id = o.id
+        LEFT JOIN t_station s ON s.id = oi.station_id
+        LEFT JOIN t_supplier_info si ON si.id = oi.supplier_id
+        LEFT JOIN t_order_item_settlement ois ON ois.order_item_id = oi.id
+        WHERE
+        oi.deleted = 0
+        and  o.payment_time is not null
+        <if test="dto.startDate != null">
+            and o.payment_time >= #{dto.startDate}
+        </if>
+        <if test="dto.endDate != null">
+            and o.payment_time &lt;= #{dto.endDate}
+        </if>
+        <if test="dto.supplierId != null">
+            and oi.supplierId &lt;= #{dto.supplierId}
+        </if>
+        ) t1
+        GROUP BY
+        t1.order_item_id
+        ) t2
+        LEFT JOIN ( SELECT ois.order_item_id, IFNULL( sum( ois.sales_fee_supplier ), 0 ) AS sales_fee_supplier FROM t_order_item_settlement ois GROUP BY order_item_id ) t3 ON t2.order_item_id = t3.order_item_id
+    </sql>
+    <select id="getOrderSupplierPageReport" resultType="com.mzl.flower.dto.response.report.OrderSupplierReportResultVO">
+        select
+        dateinfo,
+        supplier_id,
+        supplierName,
+        sum(order_supplier_price_amount) order_supplier_price_amount,
+        sum(order_check_fee) order_check_fee,
+        sum(order_replace_fee) + sum(order_lack_fee_supplier) order_lack_fee_supplier,
+        sum(order_num)-sum(order_lack_num) as real_sale_num,
+        sum(sales_fee_supplier) sales_fee_supplier,
+        sum(order_supplier_price_amount) -   sum(order_check_fee) - sum(order_replace_fee) -  sum(order_lack_fee_supplier) -  sum(sales_fee_supplier) profitFeeAmount
+        from(
+        SELECT
+        oi.id,vor.*,p.name as supplierName
+        FROM   t_order_item oi
+        left join (<include refid="baseSupplierSql"></include>) vor
+        on oi.id =vor.order_item_id
+        left join t_supplier_info p
+        on vor.supplier_id=p.id
+        left join t_order o
+        on vor.order_id= o.id
+        and o.status_backend not in ('PENDING','CANCEL','REFUND')
+        )  s group by dateinfo,supplier_id
+    </select>
+
+    <select id="getOrderSupplierCountReport" resultType="com.mzl.flower.dto.response.report.OrderSupplierReportResultVO">
+        Select
+        sum(order_supplier_price_amount) order_supplier_price_amount,
+        sum(order_check_fee) order_check_fee,
+        sum(order_lack_fee_supplier) order_lack_fee_supplier,
+        sum(real_sale_num) real_sale_num,
+        sum(sales_fee_supplier) sales_fee_supplier,
+        sum(profitFeeAmount) profitFeeAmount
+        from(
+        select
+        dateinfo,
+        supplier_id,
+        supplierName,
+        sum(order_supplier_price_amount) order_supplier_price_amount,
+        sum(order_check_fee) order_check_fee,
+        sum(order_replace_fee) + sum(order_lack_fee_supplier) order_lack_fee_supplier,
+        sum(order_num)-sum(order_lack_num) as real_sale_num,
+        sum(sales_fee_supplier) sales_fee_supplier,
+        sum(order_supplier_price_amount) - sum(order_check_fee) - sum(order_replace_fee) - sum(order_lack_fee_supplier)
+        - sum(sales_fee_supplier) profitFeeAmount
+        from(
+        SELECT
+        oi.id,vor.*,p.name as supplierName
+        FROM t_order_item oi
+        left join (<include refid="baseSupplierSql"></include>) vor
+        on oi.id =vor.order_item_id
+        left join t_supplier_info p
+        on vor.supplier_id=p.id
+        left join t_order o
+        on vor.order_id= o.id
+        and o.status_backend not in ('PENDING','CANCEL','REFUND')
+        )
+        ) s
+    </select>
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.3