From 5f0bb044b603a335954b11bf3880f4ad6824e98f Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期五, 20 十二月 2024 17:37:47 +0800 Subject: [PATCH] add: 花材销售统计 --- src/main/java/com/mzl/flower/dto/request/statisticAnalysis/FlowerSaleDTO.java | 74 ++++++++++ src/main/java/com/mzl/flower/dto/response/statisticAnalysis/FlowerSaleVO.java | 77 +++++++++++ src/main/resources/mapper/statisticsAnalysis/SalesStatisticsAnalysisMapper.xml | 94 +++++++++++++ src/main/java/com/mzl/flower/mapper/statisticsAnalysis/SalesStatisticsAnalysisMapper.java | 20 ++ src/main/java/com/mzl/flower/service/impl/statisticsAnalysis/StatisticAnalysisServiceImpl.java | 79 +++++++++++ src/main/java/com/mzl/flower/dto/response/statisticAnalysis/FlowerSaleStatisticVO.java | 30 ++++ src/main/java/com/mzl/flower/web/v2/statisticsAnalysis/StatisticAnalysisController.java | 31 +++- src/main/java/com/mzl/flower/service/statisticsAnalysis/StatisticAnalysisService.java | 10 + 8 files changed, 407 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/mzl/flower/dto/request/statisticAnalysis/FlowerSaleDTO.java b/src/main/java/com/mzl/flower/dto/request/statisticAnalysis/FlowerSaleDTO.java new file mode 100644 index 0000000..18ea733 --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/request/statisticAnalysis/FlowerSaleDTO.java @@ -0,0 +1,74 @@ +package com.mzl.flower.dto.request.statisticAnalysis; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.time.LocalDateTime; + +@Data +public class FlowerSaleDTO { + + @ApiModelProperty(value = "供应商id") + private Long supplierId; + + @ApiModelProperty(value = "供应商名称") + private String supplierName; + + @ApiModelProperty("注册手机号") + private String registerTel; + + @ApiModelProperty("联系方式") + private String contactTel; + + @ApiModelProperty(value = "集货站id") + private Long stationId; + + @ApiModelProperty(value = "商品分类") + private String flowerCategory; + + @ApiModelProperty(value = "商品等级") + private String flowerLevel; + + @ApiModelProperty("销售地区-省") + private String customerProvince; + + @ApiModelProperty("销售地区-市") + private String customerCity; + + @ApiModelProperty("销售地区-区") + private String customerRegion; + + @ApiModelProperty(value = "订单号") + private String orderNo; + + @ApiModelProperty(value = "订单开始日期") + private LocalDateTime orderStartDate; + + @ApiModelProperty(value = "订单结束日期") + private LocalDateTime orderEndDate; + + @ApiModelProperty(hidden = true) + private LocalDateTime startDate; + + @ApiModelProperty(hidden = true) + private LocalDateTime endDate; + + @ApiModelProperty(value = "支付时间-开始;yyyy-MM-dd") + private String startDateStr; + + @ApiModelProperty(value = "支付时间-结束;yyyy-MM-dd") + private String endDateStr; + + @ApiModelProperty(value = "创建时间-开始;yyyy-MM-dd") + private String createStartDateStr; + + @ApiModelProperty(value = "创建时间-结束;yyyy-MM-dd") + private String createEndDateStr; + + @ApiModelProperty(hidden = true) + private LocalDateTime createStartDate; + + @ApiModelProperty(hidden = true) + private LocalDateTime createEndDate; +} diff --git a/src/main/java/com/mzl/flower/dto/response/statisticAnalysis/FlowerSaleStatisticVO.java b/src/main/java/com/mzl/flower/dto/response/statisticAnalysis/FlowerSaleStatisticVO.java new file mode 100644 index 0000000..8b982c1 --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/response/statisticAnalysis/FlowerSaleStatisticVO.java @@ -0,0 +1,30 @@ +package com.mzl.flower.dto.response.statisticAnalysis; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class FlowerSaleStatisticVO { + + @ApiModelProperty("销售金额") + private BigDecimal saleAmount; + + @ApiModelProperty("销售扎数") + private BigDecimal saleNum; + + @ApiModelProperty("商品总数") + private Integer goodsNum; + + @ApiModelProperty("缺货扎数") + private BigDecimal lackNum; + + @ApiModelProperty("补货扎数") + private BigDecimal replaceNum; + + @ApiModelProperty("降级扎数") + private BigDecimal reduceNum; + + +} diff --git a/src/main/java/com/mzl/flower/dto/response/statisticAnalysis/FlowerSaleVO.java b/src/main/java/com/mzl/flower/dto/response/statisticAnalysis/FlowerSaleVO.java new file mode 100644 index 0000000..be2bb17 --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/response/statisticAnalysis/FlowerSaleVO.java @@ -0,0 +1,77 @@ +package com.mzl.flower.dto.response.statisticAnalysis; + +import com.fasterxml.jackson.annotation.JsonFormat; +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 FlowerSaleVO { + + @ApiModelProperty(value = "供应商id") + private Long supplierId; + + @ApiModelProperty(value = "供应商名称") + private String supplierName; + + @ApiModelProperty("注册手机号") + private String registerTel; + + @ApiModelProperty("联系方式") + private String customerTel; + + @ApiModelProperty("集货站id") + private Long stationId; + + @ApiModelProperty("集货站名称") + private String stationName; + + @ApiModelProperty(value = "品类") + private String flowerCategory; + + @ApiModelProperty(value = "商品名称") + private String flowerName; + + @ApiModelProperty(value = "等级") + private String flowerLevel; + + @ApiModelProperty(value = "规格") + private String flowerUnit; + + @ApiModelProperty(value = "底价") + private BigDecimal supplierPrice; + + @ApiModelProperty(value = "售价") + private BigDecimal price; + + @ApiModelProperty(value = "销售扎数") + private Integer num; + + @ApiModelProperty(value = "销售地址") + private String address; + + @ApiModelProperty(value = "支付时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat + private LocalDateTime paymentTime; + + @ApiModelProperty(value = "订单ID号") + private String orderId; + + @ApiModelProperty(value = "订单号") + private String orderNo; + + @ApiModelProperty(value = "缺货扎数") + private Integer lackNum; + + @ApiModelProperty(value = "补货扎数") + private Integer replaceNum; + + @ApiModelProperty(value = "降级扎数") + private Integer reduceNum; + + +} diff --git a/src/main/java/com/mzl/flower/mapper/statisticsAnalysis/SalesStatisticsAnalysisMapper.java b/src/main/java/com/mzl/flower/mapper/statisticsAnalysis/SalesStatisticsAnalysisMapper.java new file mode 100644 index 0000000..456cf24 --- /dev/null +++ b/src/main/java/com/mzl/flower/mapper/statisticsAnalysis/SalesStatisticsAnalysisMapper.java @@ -0,0 +1,20 @@ +package com.mzl.flower.mapper.statisticsAnalysis; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.mzl.flower.dto.request.statisticAnalysis.FlowerSaleDTO; +import com.mzl.flower.dto.response.statisticAnalysis.FlowerSaleStatisticVO; +import com.mzl.flower.dto.response.statisticAnalysis.FlowerSaleVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface SalesStatisticsAnalysisMapper { + + Page<FlowerSaleVO> getFlowerSalePage(Page page, @Param("dto") FlowerSaleDTO dto); + + FlowerSaleStatisticVO getFlowerSaleStatistics(@Param("dto") FlowerSaleDTO dto); + + List<FlowerSaleVO> getFlowerSaleSList(@Param("dto") FlowerSaleDTO dto); + +} + diff --git a/src/main/java/com/mzl/flower/service/impl/statisticsAnalysis/StatisticAnalysisServiceImpl.java b/src/main/java/com/mzl/flower/service/impl/statisticsAnalysis/StatisticAnalysisServiceImpl.java index 9cc8f69..68430ff 100644 --- a/src/main/java/com/mzl/flower/service/impl/statisticsAnalysis/StatisticAnalysisServiceImpl.java +++ b/src/main/java/com/mzl/flower/service/impl/statisticsAnalysis/StatisticAnalysisServiceImpl.java @@ -3,20 +3,29 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.mzl.flower.base.cache.DictCacheClient; import com.mzl.flower.dto.request.statisticAnalysis.FlowerMaterialDTO; +import com.mzl.flower.dto.request.statisticAnalysis.FlowerSaleDTO; import com.mzl.flower.dto.response.report.OrderReportResultVO; import com.mzl.flower.dto.response.statisticAnalysis.FlowerMaterialStaticVO; import com.mzl.flower.dto.response.statisticAnalysis.FlowerMaterialVO; +import com.mzl.flower.dto.response.statisticAnalysis.FlowerSaleStatisticVO; +import com.mzl.flower.dto.response.statisticAnalysis.FlowerSaleVO; import com.mzl.flower.mapper.statisticsAnalysis.FlowerMaterialMapper; +import com.mzl.flower.mapper.statisticsAnalysis.SalesStatisticsAnalysisMapper; import com.mzl.flower.service.BaseService; import com.mzl.flower.service.statisticsAnalysis.StatisticAnalysisService; import com.mzl.flower.utils.ExcelExportUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.net.URLEncoder; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; @@ -29,6 +38,8 @@ @Autowired private FlowerMaterialMapper flowerMaterialMapper; + @Resource + SalesStatisticsAnalysisMapper salesStatisticAnalysisMapper; @Override public Page<FlowerMaterialVO> getFlowerMaterialPage(Page page, FlowerMaterialDTO dto) { @@ -98,4 +109,72 @@ log.error(e.getMessage(), e); } } + + + @Override + public Page<FlowerSaleVO> getFlowerSalePage(Page page, FlowerSaleDTO dto) { + dto.setCreateStartDate(parseLocalDateTime(dto.getCreateStartDateStr(), 17, 0, 0, -1)); + dto.setCreateEndDate(parseLocalDateTime(dto.getCreateEndDateStr(), 17, 0, 0, 0)); + return salesStatisticAnalysisMapper.getFlowerSalePage(page, dto); + } + + @Override + public FlowerSaleStatisticVO getFlowerSaleStatistics(FlowerSaleDTO dto) { + return salesStatisticAnalysisMapper.getFlowerSaleStatistics(dto); + } + + @Override + public void exportFlowerSales(HttpServletResponse response, FlowerSaleDTO dto) { + dto.setCreateStartDate(parseLocalDateTime(dto.getCreateStartDateStr(), 17, 0, 0, -1)); + dto.setCreateEndDate(parseLocalDateTime(dto.getCreateEndDateStr(), 17, 0, 0, 0)); + List<FlowerSaleVO> list=salesStatisticAnalysisMapper.getFlowerSaleSList(dto); + String[] rowsName = new String[]{"序号", "供应商id", "供应商名称", "注册手机号", "联系方式", "集货站", "品类", "商品名称", "等级", "规格", "底价", "售价", + "销售扎数", "销售地址", "支付时间", "订单号", "缺货扎数", "补货扎数", "降级扎数"}; + List<Object[]> dataList = new ArrayList<>(); + int sn = 1; + for (FlowerSaleVO o : list) { + Object[] objs = new Object[rowsName.length]; + int a = 0; + objs[a++] = sn; // 序号 + objs[a++] = o.getSupplierId(); // 供应商id + objs[a++] = o.getSupplierName(); // 供应商名称 + objs[a++] = o.getRegisterTel(); // 注册手机号 + objs[a++] = o.getCustomerTel(); // 联系方式" + objs[a++] = o.getStationName(); // 集货站 + objs[a++] = o.getFlowerCategory(); // 品类 + objs[a++] = o.getFlowerName(); //商品名称 + objs[a++] = o.getFlowerLevel(); //等级 + objs[a++] = o.getFlowerUnit(); //规格 + objs[a++] = o.getSupplierPrice();//底价 + objs[a++] = o.getPrice(); //售价 + objs[a++] = o.getNum(); //销售扎数 + objs[a++] = o.getAddress(); //销售地址 + objs[a++] = o.getPaymentTime(); //支付时间 + objs[a++] = o.getOrderNo(); //订单号 + objs[a++] = o.getLackNum(); //缺货扎数 + objs[a++] = o.getReduceNum(); //补货扎数 + objs[a++] = o.getReduceNum(); //降级扎数 + 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); + } + } + + protected LocalDateTime parseLocalDateTime(final String dateStr, int hour, int minute, int second, long plusDays) { + LocalDateTime dateTime = null; + if (StringUtils.isNotBlank(dateStr)) { + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate date = LocalDate.parse(dateStr, dateTimeFormatter).plusDays(plusDays); + dateTime = date.atTime(hour, minute, second); + } + + return dateTime; + } } diff --git a/src/main/java/com/mzl/flower/service/statisticsAnalysis/StatisticAnalysisService.java b/src/main/java/com/mzl/flower/service/statisticsAnalysis/StatisticAnalysisService.java index dc6dfe6..0ead561 100644 --- a/src/main/java/com/mzl/flower/service/statisticsAnalysis/StatisticAnalysisService.java +++ b/src/main/java/com/mzl/flower/service/statisticsAnalysis/StatisticAnalysisService.java @@ -2,8 +2,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.mzl.flower.dto.request.statisticAnalysis.FlowerMaterialDTO; +import com.mzl.flower.dto.request.statisticAnalysis.FlowerSaleDTO; import com.mzl.flower.dto.response.statisticAnalysis.FlowerMaterialStaticVO; +import com.mzl.flower.dto.response.statisticAnalysis.FlowerSaleStatisticVO; import com.mzl.flower.dto.response.statisticAnalysis.FlowerMaterialVO; +import com.mzl.flower.dto.response.statisticAnalysis.FlowerSaleVO; import javax.servlet.http.HttpServletResponse; @@ -15,4 +18,11 @@ FlowerMaterialStaticVO getFlowerMaterialStatis(FlowerMaterialDTO dto); void exportFlowerMaterialSales(HttpServletResponse response, FlowerMaterialDTO dto); + + + Page<FlowerSaleVO> getFlowerSalePage(Page page, FlowerSaleDTO dto); + + FlowerSaleStatisticVO getFlowerSaleStatistics(FlowerSaleDTO dto); + + void exportFlowerSales(HttpServletResponse response, FlowerSaleDTO dto); } diff --git a/src/main/java/com/mzl/flower/web/v2/statisticsAnalysis/StatisticAnalysisController.java b/src/main/java/com/mzl/flower/web/v2/statisticsAnalysis/StatisticAnalysisController.java index 42f410d..c8eb798 100644 --- a/src/main/java/com/mzl/flower/web/v2/statisticsAnalysis/StatisticAnalysisController.java +++ b/src/main/java/com/mzl/flower/web/v2/statisticsAnalysis/StatisticAnalysisController.java @@ -5,16 +5,12 @@ import com.mzl.flower.base.BaseController; 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.QueryPartnerOrderDTO; -import com.mzl.flower.dto.request.report.QuerySupplierDTO; import com.mzl.flower.dto.request.statisticAnalysis.FlowerMaterialDTO; -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.dto.request.statisticAnalysis.FlowerSaleDTO; import com.mzl.flower.dto.response.statisticAnalysis.FlowerMaterialStaticVO; +import com.mzl.flower.dto.response.statisticAnalysis.FlowerSaleStatisticVO; import com.mzl.flower.dto.response.statisticAnalysis.FlowerMaterialVO; -import com.mzl.flower.service.report.OrderReportService; +import com.mzl.flower.dto.response.statisticAnalysis.FlowerSaleVO; import com.mzl.flower.service.statisticsAnalysis.StatisticAnalysisService; import com.mzl.flower.utils.ConverterUtil; import io.swagger.annotations.Api; @@ -55,7 +51,7 @@ @ApiOperation(value = "花材统计-统计", notes = "花材统计统计") public ResponseEntity<ReturnDataDTO<FlowerMaterialStaticVO>> getFlowerMaterialStatis(@Validated FlowerMaterialDTO dto ) { - return returnData(R.SUCCESS.getCode(), ConverterUtil.transObject(statisticAnalysisService.getFlowerMaterialStatis(dto), FlowerMaterialStaticVO.class)); + return returnData(R.SUCCESS.getCode(), ConverterUtil.transObject(statisticAnalysisService.getFlowerMaterialStatis(dto), FlowerSaleStatisticVO.class)); } @@ -66,4 +62,23 @@ } + @GetMapping("/flower-sale/page") + @ApiOperation(value = "花材销售统计-分页", notes = "花材销售统计-分页") + public ResponseEntity<ReturnDataDTO<Page<FlowerSaleVO>>> getFlowerSalePage(Page page, @Validated FlowerSaleDTO dto) { + return returnData(R.SUCCESS.getCode(), ConverterUtil.transPage(statisticAnalysisService.getFlowerSalePage(page, dto), FlowerSaleVO.class)); + } + + @GetMapping("/flower-sale/statistics") + @ApiOperation(value = "花材销售统计-统计", notes = "花材销售统计") + public ResponseEntity<ReturnDataDTO<FlowerSaleStatisticVO>> getFlowerSaleStatistics(@Validated FlowerSaleDTO dto) { + return returnData(R.SUCCESS.getCode(), ConverterUtil.transObject(statisticAnalysisService.getFlowerSaleStatistics(dto), FlowerSaleStatisticVO.class)); + } + + + @GetMapping({"/flower-sale/export"}) + @ApiOperation(value = "花材销售统计-导出") + public void exportFlowerSales(HttpServletResponse response, @Validated FlowerSaleDTO dto) { + statisticAnalysisService.exportFlowerSales(response, dto); + } + } \ No newline at end of file diff --git a/src/main/resources/mapper/statisticsAnalysis/SalesStatisticsAnalysisMapper.xml b/src/main/resources/mapper/statisticsAnalysis/SalesStatisticsAnalysisMapper.xml new file mode 100644 index 0000000..757a74a --- /dev/null +++ b/src/main/resources/mapper/statisticsAnalysis/SalesStatisticsAnalysisMapper.xml @@ -0,0 +1,94 @@ +<?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.mzl.flower.mapper.statisticsAnalysis.SalesStatisticsAnalysisMapper"> + + <select id="getFlowerSaleStatistics" + resultType="com.mzl.flower.dto.response.statisticAnalysis.FlowerSaleStatisticVO"> + select sum(t.total) as saleAmount, + sum(t.num) as saleNum, + count(t.flower_id) as goodsNum, + sum(t.lackNum) as lackNum, + sum(t.replaceNum) as replaceNum, + sum(t.reduceNum) as reduceNum + from ( <include refid="flowerSalePageSql"></include>) t + </select> + + <select id="getFlowerSalePage" resultType="com.mzl.flower.dto.response.statisticAnalysis.FlowerSaleVO"> + <include refid="flowerSalePageSql"></include> + </select> + + <select id="getFlowerSaleSList" resultType="com.mzl.flower.dto.response.statisticAnalysis.FlowerSaleVO"> + <include refid="flowerSalePageSql"></include> + </select> + <sql id="flowerSalePageSql"> + SELECT + oi.*, + s.NAME stationName, + si.contact_tel registerTel, + si.contact_tel customerTel, + si.id supplierId, + si.name supplierName, + o.id orderId, + o.order_no, + o.payment_time, + CONCAT(o.customer_province, ' ', o.customer_city, ' ', o.customer_region, ' ', o.customer_address) AS address, + COALESCE((SELECT oic.num FROM t_order_item_check oic WHERE oic.order_item_id = oi.id AND oic.type = 'replace'), + 0) replaceNum, + COALESCE((SELECT oic.num FROM t_order_item_check oic WHERE oic.order_item_id = oi.id AND oic.type = 'reduce'), + 0) reduceNum, + COALESCE((SELECT oic.num FROM t_order_item_check oic WHERE oic.order_item_id = oi.id AND oic.type = 'lack'), 0) + lackNum + FROM + t_order_item oi + 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 o ON oi.order_id = o.id + LEFT JOIN t_flower f on oi.flower_id = f.id + <include refid="flowerSaleWhere"></include> + </sql> + + <sql id="flowerSaleWhere"> + WHERE oi.deleted = 0 + and o.payment_time is not null + and o.status_backend not in ('PENDING','CANCEL','REFUND') + <if test="dto.supplierId != null"> + and si.id = #{dto.supplierId} + </if> + <if test="dto.supplierName != null and dto.supplierName != ''"> + AND si.name LIKE concat('%', #{dto.supplierName},'%') + </if> + <if test="dto.registerTel!=null and dto.registerTel!=''"> + AND si.contact_tel LIKE CONCAT('%',#{dto.registerTel}, '%') + </if> + <if test="dto.stationId != null"> + AND oi.station_id = #{dto.stationId} + </if> + <if test="dto.flowerCategory != null"> + AND f.category = #{dto.flowerCategory} + </if> + <if test="dto.flowerLevel != null and dto.flowerLevel != ''"> + AND oi.flower_level = #{dto.flowerLevel} + </if> + <if test="dto.customerProvince!=null and dto.customerProvince!=''"> + AND o.customer_province like CONCAT('%',#{dto.customerProvince}, '%') + </if> + <if test="dto.customerCity!=null and dto.customerCity!=''"> + AND o.customer_city like CONCAT('%',#{dto.customerCity}, '%') + </if> + <if test="dto.customerRegion!=null and dto.customerRegion!=''"> + AND o.customer_region like CONCAT('%',#{dto.customerRegion}, '%') + </if> + <if test="dto.orderNo != null and dto.orderNo != ''"> + AND o.order_no LIKE concat('%', #{dto.orderNo},'%') + </if> + <!-- 修改查询日期对应的的创建时间为支付时间 2024-10-12--> + <if test="dto.createStartDate != null"> + AND o.payment_time >= #{dto.createStartDate} + </if> + <if test="dto.createEndDate != null"> + AND o.payment_time < #{dto.createEndDate} + </if> +</sql> + + +</mapper> \ No newline at end of file -- Gitblit v1.9.3