Browse Source

追加商品的结算价后修改结算单

Yangzw 7 months ago
parent
commit
ac3ea9a8d4
20 changed files with 329 additions and 14 deletions
  1. 24 0
      feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/enums/SelectTimeEnum.java
  2. 50 0
      feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/pojo/echarts/EChartsResult.java
  3. 1 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/CaclEnum.java
  4. 3 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofit/vo/PtProfitPageReqVO.java
  5. 3 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofit/vo/PtProfitRespVO.java
  6. 2 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofit/vo/PtProfitSaveReqVO.java
  7. 5 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptprofit/PtProfitDO.java
  8. 6 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/dto/OrderDTO.java
  9. 9 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/dto/OrderItemDTO.java
  10. 49 8
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/shopsettlement/ShopSettlementServiceImpl.java
  11. 2 2
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/shopsettlement/ShopSettlementMapper.xml
  12. 8 3
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/spu/vo/ProductSkuRespVO.java
  13. 6 0
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/spu/vo/ProductSkuSaveReqVO.java
  14. 9 0
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/dal/dataobject/sku/ProductSkuDO.java
  15. 9 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/TradeOrderController.java
  16. 4 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/mysql/order/TradeOrderMapper.java
  17. 8 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryService.java
  18. 103 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryServiceImpl.java
  19. 16 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderStatusCount.java
  20. 12 0
      sql/mysql/建空库SQL/20_20240805.sql

+ 24 - 0
feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/enums/SelectTimeEnum.java

@@ -0,0 +1,24 @@
+package cn.newfeifan.mall.framework.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 搜索条件的时间枚举类
+ */
+
+@Getter
+@AllArgsConstructor
+public enum SelectTimeEnum {
+
+    WEEK("week","本周"),
+    LAST_WEEK("lastWeek","上周"),
+    LAST_MONTH("lastMonth","上月"),
+    THREE_MONTH("threeMonth","近三月"),
+    HALF_YEAR("halfYear","近半年"),
+    YEAR("year","近一年"),
+    ;
+
+    private final String type;
+    private final String mark;
+}

+ 50 - 0
feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/pojo/echarts/EChartsResult.java

@@ -0,0 +1,50 @@
+package cn.newfeifan.mall.framework.common.pojo.echarts;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 返回echarts的结果类
+ */
+
+@Data
+@Builder
+public class EChartsResult {
+
+    /**
+     * day对象
+     */
+    private Axis xaxis;
+
+    /**
+     * 数量对象集合
+     */
+    private List<Series> series;
+
+
+    @Data
+    public static class Axis {
+        private String type;
+        private List<LocalDate> data;
+
+        public List<String> getData(){
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            return data.stream().map(date -> date.format(formatter)).collect(Collectors.toList());
+        }
+
+        public Axis(){
+            this.type = "category";
+        }
+    }
+
+    @Data
+    public static class Series{
+        private Integer type;
+        private List<Integer> data;
+    }
+}

+ 1 - 0
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/CaclEnum.java

@@ -32,6 +32,7 @@ public enum CaclEnum {
     MANUAL_RETURN_INTEGRAL(25, "人工返回最早七天未获得的超出额度的合赢奖","人工返回最早七天未获得的合赢奖,超额的"),
     WITHDRAWAL(26, "用户提现","用户将可用积分提现到账户"),
     WITHDRAWAL_ERROR(27, "提现失败退回","提现失败退回积分到用户"),
+    ORDER_SETTLEMENT(28,"订单结算利润","店铺订单结算,每笔订单结算出来的利润(成本价 - 结算价)")
     ;
 
     /**

+ 3 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofit/vo/PtProfitPageReqVO.java

@@ -27,4 +27,7 @@ public class PtProfitPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+    @Schema(description = "利润")
+    private Long profit;
+
 }

+ 3 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofit/vo/PtProfitRespVO.java

@@ -30,4 +30,7 @@ public class PtProfitRespVO {
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
+    @Schema(description = "利润", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("利润")
+    private Long profit;
 }

+ 2 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofit/vo/PtProfitSaveReqVO.java

@@ -23,4 +23,6 @@ public class PtProfitSaveReqVO {
     @Schema(description = "平台总收益")
     private Long ptTotalAdd;
 
+    @Schema(description = "利润", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Long profit;
 }

+ 5 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptprofit/PtProfitDO.java

@@ -37,4 +37,9 @@ public class PtProfitDO extends BaseDO {
      */
     private Long ptTotalAdd;
 
+    /**
+     * 利润
+     */
+    private Long profit;
+
 }

+ 6 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/dto/OrderDTO.java

@@ -17,6 +17,12 @@ public class OrderDTO extends BaseDO {
      * 例如说,1146347329394184195
      */
     private String no;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
     /**
      * 购买的商品数量
      */

+ 9 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/dto/OrderItemDTO.java

@@ -84,4 +84,13 @@ public class OrderItemDTO {
      * 成本价,单位: 分
      */
     private Integer costPrice;
+
+    /**
+     * 结算价,单位: 分
+     */
+    private Integer settlementPrice;
+    /**
+     * 高精度结算价
+     */
+    private BigDecimal highPrecisionSettlementPrice;
 }

+ 49 - 8
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/shopsettlement/ShopSettlementServiceImpl.java

@@ -3,9 +3,12 @@ package cn.newfeifan.mall.module.distri.service.shopsettlement;
 import cn.newfeifan.mall.module.api.shop.ShopApi;
 import cn.newfeifan.mall.module.api.shop.dto.ShopDTO;
 import cn.newfeifan.mall.module.distri.constant.DistriConstants;
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo.PtProfitSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo.PtProfitLogSaveReqVO;
 import cn.newfeifan.mall.module.distri.controller.admin.ptsettlement.vo.TransferTemplateRespVO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.orderitemsettlement.OrderItemSettlementDO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ordersettlement.OrderSettlementDO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofit.PtProfitDO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ptsettlement.PtSettlementDO;
 import cn.newfeifan.mall.module.distri.dal.mysql.dailybill.DailyBillMapper;
 import cn.newfeifan.mall.module.distri.dal.mysql.orderitemsettlement.OrderItemSettlementMapper;
@@ -14,6 +17,8 @@ import cn.newfeifan.mall.module.distri.dal.mysql.ptsettlement.PtSettlementMapper
 import cn.newfeifan.mall.module.distri.service.dailybill.dto.MerchantDTO;
 import cn.newfeifan.mall.module.distri.service.dailybill.dto.OrderDTO;
 import cn.newfeifan.mall.module.distri.service.dailybill.dto.OrderItemDTO;
+import cn.newfeifan.mall.module.distri.service.ptprofit.PtProfitService;
+import cn.newfeifan.mall.module.distri.service.ptprofitlog.PtProfitLogService;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -36,6 +41,7 @@ import java.util.List;
 import java.util.Map;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.module.distri.enums.CaclEnum.ORDER_SETTLEMENT;
 import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.SHOP_SETTLEMENT_NOT_EXISTS;
 
 /**
@@ -65,6 +71,12 @@ public class ShopSettlementServiceImpl implements ShopSettlementService {
     @Resource
     private ShopApi shopApi;
 
+    @Resource
+    private PtProfitLogService ptProfitLogService;
+
+    @Resource
+    private PtProfitService ptProfitService;
+
     @Override
     public Long createShopSettlement(ShopSettlementSaveReqVO createReqVO) {
         // 插入
@@ -190,12 +202,11 @@ public class ShopSettlementServiceImpl implements ShopSettlementService {
                 for (OrderDTO order : orders) {
                     // 获取所有的订单id
                     orderIds.add(order.getId());
-                    for (OrderItemDTO item : order.getItems()) {
 
-                        if(order.getId() == 246){
-                            System.out.println("1");
-                        }
+                    // 记录每笔订单的利润
+                    BigDecimal profit = BigDecimal.ZERO;
 
+                    for (OrderItemDTO item : order.getItems()) {
                         //拿到该店铺下的所有订单项id
                         orderItemIds.add(item.getId());
                         //计算订单的收入金额(pt)
@@ -205,12 +216,42 @@ public class ShopSettlementServiceImpl implements ShopSettlementService {
                         payIntegral += item.getPayIntegral();
                         ptPayIntegral += item.getPayIntegral();
                         // 商品的成本价(成本 * 数量)
-                        shopAmount += item.getCostPrice() * item.getCount();
-                        ptShopAmount += item.getCostPrice() * item.getCount();
+                        shopAmount += item.getSettlementPrice() * item.getCount();
+                        ptShopAmount += item.getSettlementPrice() * item.getCount();
                         // 商品的高精度成本价(成本 * 数量)
-                        shopHighAmount = shopHighAmount.add(BigDecimal.valueOf(item.getHighPrecisionPrice().doubleValue() * item.getCount()));
-                        ptShopHighAmount = ptShopHighAmount.add(BigDecimal.valueOf(item.getHighPrecisionPrice().doubleValue() * item.getCount()));
+                        shopHighAmount = shopHighAmount.add(BigDecimal.valueOf(item.getHighPrecisionSettlementPrice().doubleValue() * item.getCount()));
+                        ptShopHighAmount = ptShopHighAmount.add(BigDecimal.valueOf(item.getHighPrecisionSettlementPrice().doubleValue() * item.getCount()));
+
+                        // 如果商品成本不为0,则计算利润
+                        if(!item.getSettlementPrice().equals(0)){
+                            profit = profit.add(BigDecimal.valueOf(item.getCostPrice() - item.getSettlementPrice()));
+                        } else if(item.getHighPrecisionSettlementPrice().compareTo(new BigDecimal("0")) == 0){
+                            // 商品的高精度成本价
+                            profit = profit.add(item.getHighPrecisionPrice().subtract(item.getHighPrecisionSettlementPrice()));
+                        }
+                    }
 
+                    // 订单利润大于0的时候才操作
+                    if(profit.compareTo(BigDecimal.ZERO) > 0){
+                        PtProfitDO ptProfit = ptProfitService.getPtProfit();
+
+                        // 金额转积分 放大一万倍
+                        long value = profit.multiply(BigDecimal.valueOf(DistriConstants.PERCENT)).longValue();
+                        ptProfit.setProfit(ptProfit.getProfit() + value);
+                        ptProfit.setPtTotalAdd(ptProfit.getPtTotalAdd() + value);
+
+                        ptProfitService.updatePtProfit(BeanUtils.toBean(ptProfit, PtProfitSaveReqVO.class));
+
+                        // 记录平台钱包的变动日志
+                        PtProfitLogSaveReqVO ptProfitLog = PtProfitLogSaveReqVO.builder()
+                                .amount(value)
+                                .afterAmount(ptProfit.getPtTotalAdd())
+                                .profitStatus(ORDER_SETTLEMENT.getType())
+                                .orderId(order.getId())
+                                .orderNo(order.getNo())
+                                .userId(order.getUserId())
+                                .build();
+                        ptProfitLogService.createPtProfitLog(ptProfitLog);
                     }
                 }
 

+ 2 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/shopsettlement/ShopSettlementMapper.xml

@@ -33,7 +33,7 @@
 
     <select id="getOrderByMerchantIdWithsShopId"
             resultMap="BaseResultMap">
-        select o.id,o.no from trade_order o
+        select o.id,o.no,o.user_id from trade_order o
         join trade_order_item item on o.id = item.order_id
         where pay_status = 1
         and o.deleted = 0
@@ -45,7 +45,7 @@
     </select>
 
     <select id="getOrderItem" resultType="cn.newfeifan.mall.module.distri.service.dailybill.dto.OrderItemDTO">
-        select id,order_id,count,price,delivery_price,pay_price,high_precision_price,promotion_fee,cost_price,pay_integral,pay_rmb from trade_order_item
+        select id,order_id,count,price,delivery_price,pay_price,high_precision_price,promotion_fee,cost_price,pay_integral,pay_rmb,settlement_price,high_precision_settlement_price from trade_order_item
         where deleted = 0
           and settlement_time is null
           and after_sale_status = 0

+ 8 - 3
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/spu/vo/ProductSkuRespVO.java

@@ -55,14 +55,19 @@ public class ProductSkuRespVO {
     @Schema(description = "备注")
     private String mark;
 
-
     @Schema(description = "店铺id", example = "20588")
     private Long shopId;
 
     @Schema(description = "商户id", example = "8240")
     private Long merchantId;
 
-        @Schema(description = "高精度价格", example = "9255")
-        private BigDecimal highPrecisionPrice;
+    @Schema(description = "高精度价格", example = "9255")
+    private BigDecimal highPrecisionPrice;
+
+    @Schema(description = "结算价,单位: 分", example = "19500")
+    private Integer settlementPrice;
+
+    @Schema(description = "高精度结算价", example = "19997")
+    private BigDecimal highPrecisionSettlementPrice;
 
 }

+ 6 - 0
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/spu/vo/ProductSkuSaveReqVO.java

@@ -88,4 +88,10 @@ public class ProductSkuSaveReqVO {
 
     @Schema(description = "高精度价格", example = "9255")
     private BigDecimal highPrecisionPrice;
+
+    @Schema(description = "结算价,单位: 分", example = "19500")
+    private Integer settlementPrice;
+
+    @Schema(description = "高精度结算价", example = "19997")
+    private BigDecimal highPrecisionSettlementPrice;
 }

+ 9 - 0
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/dal/dataobject/sku/ProductSkuDO.java

@@ -114,6 +114,15 @@ public class ProductSkuDO extends BaseDO {
      * 高精度价格
      */
     private BigDecimal highPrecisionPrice;
+
+    /**
+     * 结算价,单位: 分
+     */
+    private Integer settlementPrice;
+    /**
+     * 高精度结算价
+     */
+    private BigDecimal highPrecisionSettlementPrice;
     /**
      * 商品属性
      */

+ 9 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/TradeOrderController.java

@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.newfeifan.mall.framework.common.pojo.CommonResult;
 import cn.newfeifan.mall.framework.common.pojo.PageParam;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.pojo.echarts.EChartsResult;
 import cn.newfeifan.mall.framework.excel.core.util.ExcelUtils;
 import cn.newfeifan.mall.framework.operatelog.core.annotations.OperateLog;
 import cn.newfeifan.mall.module.distri.mq.message.order.CalcMessage;
@@ -408,4 +409,12 @@ public class TradeOrderController {
                 list);
     }
 
+    @GetMapping("/getOrderStatusCount")
+    @Operation(summary = "获得订单状态数量")
+    @PreAuthorize("@ss.hasPermission('trade:order:query')")
+    public CommonResult<EChartsResult> getOrderStatusCount(String selectTime) {
+
+        return success(tradeOrderQueryService.getOrderStatusCount(selectTime));
+    }
+
 }

+ 4 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/mysql/order/TradeOrderMapper.java

@@ -10,12 +10,14 @@ import cn.newfeifan.mall.module.trade.controller.app.order.vo.AppTradeOrderPageR
 import cn.newfeifan.mall.module.trade.dal.dataobject.order.TradeOrderDO;
 import cn.newfeifan.mall.module.trade.enums.order.TradeOrderRefundStatusEnum;
 import cn.newfeifan.mall.module.trade.enums.order.TradeOrderStatusEnum;
+import cn.newfeifan.mall.module.trade.service.order.TradeOrderStatusCount;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
@@ -214,4 +216,6 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
                 .eq(TradeOrderDO::getUserId,userId)
         );
     }
+
+    List<TradeOrderStatusCount> selectOrderCountByStatusWithTime(@Param("start") LocalDate start, @Param("end") LocalDate end, @Param("status") Integer status);
 }

+ 8 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryService.java

@@ -1,6 +1,7 @@
 package cn.newfeifan.mall.module.trade.service.order;
 
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.pojo.echarts.EChartsResult;
 import cn.newfeifan.mall.module.distri.mq.message.order.DistriOrderMessage;
 import cn.newfeifan.mall.module.distri.mq.message.order.OrderCalcMessage;
 import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderPageItemRespVO;
@@ -250,4 +251,11 @@ public interface TradeOrderQueryService {
      * @return 数量
      */
     Long getOrderCountByRefundStatus(Integer status, Long userId);
+
+    /**
+     * 根据选择的时间段获取对应的订单状态数量
+     * @param selectTime 时间段
+     * @return 订单状态数量
+     */
+    EChartsResult getOrderStatusCount(String selectTime);
 }

+ 103 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryServiceImpl.java

@@ -6,6 +6,7 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.pojo.echarts.EChartsResult;
 import cn.newfeifan.mall.module.distri.dal.mysql.ordersettlement.OrderSettlementMapper;
 import cn.newfeifan.mall.module.distri.mq.message.order.DistriOrderMessage;
 import cn.newfeifan.mall.module.distri.mq.message.order.OrderCalcMessage;
@@ -47,17 +48,22 @@ import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
+import static cn.newfeifan.mall.framework.common.enums.SelectTimeEnum.*;
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils.convertSet;
 import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.EXPRESS_NOT_EXISTS;
 import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.ORDER_NOT_FOUND;
+import static cn.newfeifan.mall.module.trade.enums.order.TradeOrderStatusEnum.*;
 
 /**
  * 交易订单【读】 Service 实现类
@@ -143,7 +149,7 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
         }
 
         // 分页查询
-        PageResult<TradeOrderDO> tradeOrderDOPageResult = tradeOrderMapper.selectPage(reqVO, userIds,orderIds);
+        PageResult<TradeOrderDO> tradeOrderDOPageResult = tradeOrderMapper.selectPage(reqVO, userIds, orderIds);
         if (reqVO.getStatus() != null && reqVO.getStatus().equals(TradeOrderStatusEnum.AFTER_SALE.getStatus())) {
             for (TradeOrderDO tradeOrderDO : tradeOrderDOPageResult.getList()) {
                 tradeOrderDO.setStatus(TradeOrderStatusEnum.AFTER_SALE.getStatus());
@@ -354,6 +360,102 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
         return tradeOrderMapper.selectCountByRefundStatus(status, userId);
     }
 
+    @Override
+    public EChartsResult getOrderStatusCount(String selectTime) {
+        LocalDate today = LocalDate.now(); // 获取今天的日期
+
+        // 本周
+        if(selectTime.equals(WEEK.getType())){
+            LocalDate weekStart = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); // 获取本周的开始日期
+            LocalDate weekEnd = today.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); // 获取本周的结束日期
+
+            List<LocalDate> weekDates = generateWeekDates(weekStart, weekEnd); // 生成本周的日期数组
+
+            return EChartsResult.builder()
+                    .xaxis(new EChartsResult.Axis()
+                            .setData(weekDates))
+                    .series(getSeries(weekStart,today))
+                    .build()
+            ;
+        } else if(selectTime.equals(LAST_WEEK.getType())){
+            // 上周
+            LocalDate lastWeekStart = today.minusWeeks(1).with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); // 获取上周的开始日期
+            LocalDate lastWeekEnd = today.minusWeeks(1).with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); // 获取上周的结束日期
+
+            List<LocalDate> weekDates = generateWeekDates(lastWeekStart, lastWeekEnd); // 生成上周的日期数组
+
+            return EChartsResult.builder()
+                    .xaxis(new EChartsResult.Axis()
+                            .setData(weekDates))
+                    .series(getSeries(lastWeekStart,lastWeekEnd))
+                    .build()
+                    ;
+        } else if(selectTime.equals(LAST_MONTH.getType())){
+            // 上月
+            LocalDate lastMonthStart = today.minusMonths(1).with(TemporalAdjusters.firstDayOfMonth()); // 获取上个月的开始日期
+            LocalDate lastMonthEnd = today.minusMonths(1).with(TemporalAdjusters.lastDayOfMonth()); // 获取上个月的结束日期
+
+            List<LocalDate> weekDates = generateWeekDates(lastMonthStart, lastMonthEnd); // 生成上周的日期数组
+            return EChartsResult.builder()
+                    .xaxis(new EChartsResult.Axis()
+                            .setData(weekDates))
+                    .series(getSeries(lastMonthStart,lastMonthEnd))
+                    .build()
+                    ;
+        }
+
+
+        return null;
+    }
+
+    /**
+     * 生成指定日期范围内的日期数组
+     * @param start 开始日期
+     * @param end 结束日期
+     * @return 日期数组
+     */
+    private static List<LocalDate> generateWeekDates(LocalDate start, LocalDate end) {
+        return Stream.iterate(start, date -> date.plusDays(1))
+                .limit(end.toEpochDay() - start.toEpochDay() + 1)
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 根据日期范围获取订单状态数量
+     * @param start 开始日期
+     * @param end 结束日期
+     * @param status 状态
+     * @param series 系列列表
+     */
+    private void selectOrderCountByStatusWithTime(LocalDate start, LocalDate end, Integer status, List<EChartsResult.Series> series) {
+        List<TradeOrderStatusCount> counts = tradeOrderMapper.selectOrderCountByStatusWithTime(start, end, status);
+        series.add(new EChartsResult.Series()
+                .setData(counts.stream().map(TradeOrderStatusCount::getOrderCount).collect(Collectors.toList()))
+                .setType(status));
+    }
+
+    /**
+     * 获取系列列表
+     * @param start 开始日期
+     * @param end 结束日期
+     * @return 系列列表
+     */
+    private List<EChartsResult.Series> getSeries(LocalDate start, LocalDate end){
+        List<EChartsResult.Series> series = new ArrayList<>();
+        // 待支付
+        selectOrderCountByStatusWithTime(start,end,UNPAID.getStatus(),series);
+        // 待发货
+        selectOrderCountByStatusWithTime(start,end,UNDELIVERED.getStatus(), series);
+        // 已发货
+        selectOrderCountByStatusWithTime(start,end,DELIVERED.getStatus(), series);
+        // 已完成
+        selectOrderCountByStatusWithTime(start,end,COMPLETED.getStatus(), series);
+        // 已取消
+        selectOrderCountByStatusWithTime(start, end, CANCELED.getStatus(), series);
+
+        return series;
+    }
+
     public static ShopBO getShopBO(StringRedisTemplate stringRedisTemplate, AdminUserMapper userMapper, Logger log) {
         Long loginUserId = getLoginUserId();
         String s = stringRedisTemplate.opsForValue().get("shop:" + loginUserId);

+ 16 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderStatusCount.java

@@ -0,0 +1,16 @@
+package cn.newfeifan.mall.module.trade.service.order;
+
+import lombok.Data;
+
+import java.time.LocalDate;
+
+/**
+ * 订单状态数量统计
+ */
+
+@Data
+public class TradeOrderStatusCount {
+
+    private LocalDate orderDate;
+    private Integer orderCount;
+}

+ 12 - 0
sql/mysql/建空库SQL/20_20240805.sql

@@ -0,0 +1,12 @@
+ALTER TABLE product_sku
+    ADD COLUMN `settlement_price` int DEFAULT '0' COMMENT '结算价,单位: 分',
+	ADD COLUMN `high_precision_settlement_price` decimal(11,6) DEFAULT '0' COMMENT '高精度结算价';
+
+
+ALTER TABLE trade_order_item
+    ADD COLUMN `settlement_price` int DEFAULT '0' COMMENT '结算价,单位: 分',
+	ADD COLUMN `high_precision_settlement_price` decimal(11,6) DEFAULT '0' COMMENT '高精度结算价';
+
+
+ALTER TABLE distri_pt_profit
+    ADD COLUMN `profit` bigint NOT NULL DEFAULT '0' COMMENT '利润';