Jelajahi Sumber

feat(customer): 添加伙伴商协同平台首页数据功能

- 新增 PartnerInfoIndexDataVo 数据视图对象用于首页数据展示
- 添加 partnerInfoIndexData 接口方法用于获取伙伴商首页统计信息
- 实现远程订单服务调用获取订单统计数据包括今日订单、周销售额、待发货量等
- 添加发货趋势、商品类型销售占比、最新发货动态等数据统计功能
- 集成产品服务获取在售商品数量信息
hurx 1 hari lalu
induk
melakukan
0af1de6987

+ 8 - 0
ruoyi-api/ruoyi-api-order/src/main/java/org/dromara/product/api/RemoteOrderInfoService.java

@@ -4,6 +4,7 @@ import org.dromara.product.api.domain.dto.HotProductRankingDto;
 import org.dromara.product.api.domain.dto.LatestOrderDto;
 import org.dromara.product.api.domain.dto.LatestOrderDto;
 import org.dromara.product.api.domain.dto.OrderAmountTrendDto;
 import org.dromara.product.api.domain.dto.OrderAmountTrendDto;
 import org.dromara.product.api.domain.dto.OrderStatusCountDto;
 import org.dromara.product.api.domain.dto.OrderStatusCountDto;
+import org.dromara.product.api.domain.dto.PartnerOrderIndexDto;
 
 
 import java.util.List;
 import java.util.List;
 
 
@@ -40,4 +41,11 @@ public interface RemoteOrderInfoService {
      * @return 热销商品排行列表
      * @return 热销商品排行列表
      */
      */
     List<HotProductRankingDto> getHotProductRankings(String itemKey, int limit);
     List<HotProductRankingDto> getHotProductRankings(String itemKey, int limit);
+
+    /**
+     * 获取伙伴商协同平台首页订单统计数据
+     * @param partnerId 伙伴商ID
+     * @return 订单统计数据
+     */
+    PartnerOrderIndexDto getPartnerOrderIndex(Long partnerId);
 }
 }

+ 131 - 0
ruoyi-api/ruoyi-api-order/src/main/java/org/dromara/product/api/domain/dto/PartnerOrderIndexDto.java

@@ -0,0 +1,131 @@
+package org.dromara.product.api.domain.dto;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 伙伴商协同平台订单统计数据DTO
+ *
+ * @author LionLi
+ * @date 2026-06-01
+ */
+@Data
+public class PartnerOrderIndexDto implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 今日新增订单数
+     */
+    private Long todayOrders;
+
+    /**
+     * 本周销售总额
+     */
+    private BigDecimal weekRevenue;
+
+    /**
+     * 待发货数量
+     */
+    private Long pendingShipment;
+
+    /**
+     * 近7天发货量走势
+     */
+    private List<DayShipment> shipmentTrend;
+
+    /**
+     * 商品类型销售占比
+     */
+    private List<TypeSales> productTypeSales;
+
+    /**
+     * 最新发货动态
+     */
+    private List<ShipmentOrder> latestShipments;
+
+    /**
+     * 每日发货量
+     */
+    @Data
+    public static class DayShipment implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 日期,格式: "MM-dd"
+         */
+        private String date;
+
+        /**
+         * 发货量
+         */
+        private Long count;
+    }
+
+    /**
+     * 商品类型销售占比
+     */
+    @Data
+    public static class TypeSales implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 类型名称
+         */
+        private String name;
+
+        /**
+         * 销售数量/金额
+         */
+        private Long value;
+    }
+
+    /**
+     * 发货订单
+     */
+    @Data
+    public static class ShipmentOrder implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 订单编号
+         */
+        private String orderNo;
+
+        /**
+         * 商品名称
+         */
+        private String productName;
+
+        /**
+         * 订单金额
+         */
+        private BigDecimal amount;
+
+        /**
+         * 收货人
+         */
+        private String customer;
+
+        /**
+         * 发货状态
+         */
+        private String status;
+
+        /**
+         * 时间
+         */
+        private String date;
+    }
+}

+ 15 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/PartnerInfoController.java

@@ -1,6 +1,7 @@
 package org.dromara.customer.controller;
 package org.dromara.customer.controller;
 
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.util.ObjectUtil;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.NotNull;
@@ -15,8 +16,10 @@ import org.dromara.common.log.annotation.Log;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.web.core.BaseController;
 import org.dromara.common.web.core.BaseController;
 import org.dromara.customer.domain.bo.PartnerInfoBo;
 import org.dromara.customer.domain.bo.PartnerInfoBo;
+import org.dromara.customer.domain.vo.PartnerInfoIndexDataVo;
 import org.dromara.customer.domain.vo.PartnerInfoVo;
 import org.dromara.customer.domain.vo.PartnerInfoVo;
 import org.dromara.customer.domain.vo.PartnerManageIndexDataVo;
 import org.dromara.customer.domain.vo.PartnerManageIndexDataVo;
 import org.dromara.customer.service.IPartnerInfoService;
 import org.dromara.customer.service.IPartnerInfoService;
@@ -48,6 +51,18 @@ public class PartnerInfoController extends BaseController {
         return partnerInfoService.partnerManageIndexData();
         return partnerInfoService.partnerManageIndexData();
     }
     }
 
 
+    /**
+     * 伙伴商协同平台首页数据
+     */
+    @GetMapping("/partnerInfoIndexData")
+    public R<PartnerInfoIndexDataVo> partnerInfoIndexData() {
+        Long partnerId = LoginHelper.getLoginUser().getPartnerId();
+        if (ObjectUtil.isEmpty(partnerId)) {
+            return R.fail("未获取到当前伙伴商信息");
+        }
+        return partnerInfoService.partnerInfoIndexData(partnerId);
+    }
+
     /**
     /**
      * 查询伙伴商基本信息列表
      * 查询伙伴商基本信息列表
      */
      */

+ 136 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/PartnerInfoIndexDataVo.java

@@ -0,0 +1,136 @@
+package org.dromara.customer.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 伙伴商协同平台首页数据视图对象
+ *
+ * @author LionLi
+ * @date 2026-06-01
+ */
+@Data
+public class PartnerInfoIndexDataVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 今日新增订单
+     */
+    private Long todayOrders;
+
+    /**
+     * 本周销售总额
+     */
+    private BigDecimal weekRevenue;
+
+    /**
+     * 待发货数量
+     */
+    private Long pendingShipment;
+
+    /**
+     * 在售商品数
+     */
+    private Long onSaleProducts;
+
+    /**
+     * 近期订单发货量走势
+     */
+    private List<ShipmentTrend> shipmentTrend;
+
+    /**
+     * 商品类型销售占比
+     */
+    private List<ProductTypeSales> productTypeSales;
+
+    /**
+     * 最新发货动态
+     */
+    private List<LatestShipment> latestShipments;
+
+    /**
+     * 发货量走势
+     */
+    @Data
+    public static class ShipmentTrend implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 日期,格式: "MM-dd"
+         */
+        private String date;
+
+        /**
+         * 发货量
+         */
+        private Long count;
+    }
+
+    /**
+     * 商品类型销售占比
+     */
+    @Data
+    public static class ProductTypeSales implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 类型名称
+         */
+        private String name;
+
+        /**
+         * 销售数量/金额
+         */
+        private Long value;
+    }
+
+    /**
+     * 最新发货订单
+     */
+    @Data
+    public static class LatestShipment implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 订单编号
+         */
+        private String orderNo;
+
+        /**
+         * 商品名称
+         */
+        private String productName;
+
+        /**
+         * 订单金额
+         */
+        private BigDecimal amount;
+
+        /**
+         * 收货人
+         */
+        private String customer;
+
+        /**
+         * 发货状态
+         */
+        private String status;
+
+        /**
+         * 时间
+         */
+        private String date;
+    }
+}

+ 32 - 27
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/IPartnerInfoService.java

@@ -6,6 +6,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.customer.domain.PartnerInfo;
 import org.dromara.customer.domain.PartnerInfo;
 import org.dromara.customer.domain.bo.PartnerInfoBo;
 import org.dromara.customer.domain.bo.PartnerInfoBo;
+import org.dromara.customer.domain.vo.PartnerInfoIndexDataVo;
 import org.dromara.customer.domain.vo.PartnerInfoVo;
 import org.dromara.customer.domain.vo.PartnerInfoVo;
 import org.dromara.customer.domain.vo.PartnerManageIndexDataVo;
 import org.dromara.customer.domain.vo.PartnerManageIndexDataVo;
 
 
@@ -15,7 +16,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.Set;
 
 
 /**
 /**
- * 伙伴商基本信息Service接口
+ * 浼欎即鍟嗗熀鏈�俊鎭疭ervice鎺ュ彛
  *
  *
  * @author LionLi
  * @author LionLi
  * @date 2026-01-21
  * @date 2026-01-21
@@ -23,72 +24,76 @@ import java.util.Set;
 public interface IPartnerInfoService extends IService<PartnerInfo> {
 public interface IPartnerInfoService extends IService<PartnerInfo> {
 
 
     /**
     /**
-     * 查询伙伴商基本信息
+     * 鏌ヨ�浼欎即鍟嗗熀鏈�俊鎭?
      *
      *
-     * @param id 主键
-     * @return 伙伴商基本信息
+     * @param id 涓婚敭
+     * @return 浼欎即鍟嗗熀鏈�俊鎭?
      */
      */
     PartnerInfoVo queryById(Long id);
     PartnerInfoVo queryById(Long id);
 
 
     /**
     /**
-     * 分页查询伙伴商基本信息列表
+     * 鍒嗛〉鏌ヨ�浼欎即鍟嗗熀鏈�俊鎭�垪琛?
      *
      *
-     * @param bo        查询条件
-     * @param pageQuery 分页参数
-     * @return 伙伴商基本信息分页列表
+     * @param bo        鏌ヨ�鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 浼欎即鍟嗗熀鏈�俊鎭�垎椤靛垪琛?
      */
      */
     TableDataInfo<PartnerInfoVo> queryPageList(PartnerInfoBo bo, PageQuery pageQuery);
     TableDataInfo<PartnerInfoVo> queryPageList(PartnerInfoBo bo, PageQuery pageQuery);
 
 
     /**
     /**
-     * 查询符合条件的伙伴商基本信息列表
+     * 鏌ヨ�绗﹀悎鏉′欢鐨勪紮浼村晢鍩烘湰淇℃伅鍒楄〃
      *
      *
-     * @param bo 查询条件
-     * @return 伙伴商基本信息列表
+     * @param bo 鏌ヨ�鏉′欢
+     * @return 浼欎即鍟嗗熀鏈�俊鎭�垪琛?
      */
      */
     List<PartnerInfoVo> queryList(PartnerInfoBo bo);
     List<PartnerInfoVo> queryList(PartnerInfoBo bo);
 
 
     /**
     /**
-     * 新增伙伴商基本信息
+     * 鏂板�浼欎即鍟嗗熀鏈�俊鎭?
      *
      *
-     * @param bo 伙伴商基本信息
-     * @return 是否新增成功
+     * @param bo 浼欎即鍟嗗熀鏈�俊鎭?
+     * @return 鏄�惁鏂板�鎴愬姛
      */
      */
     Boolean insertByBo(PartnerInfoBo bo);
     Boolean insertByBo(PartnerInfoBo bo);
 
 
     /**
     /**
-     * 修改伙伴商基本信息
+     * 淇�敼浼欎即鍟嗗熀鏈�俊鎭?
      *
      *
-     * @param bo 伙伴商基本信息
-     * @return 是否修改成功
+     * @param bo 浼欎即鍟嗗熀鏈�俊鎭?
+     * @return 鏄�惁淇�敼鎴愬姛
      */
      */
     Boolean updateByBo(PartnerInfoBo bo);
     Boolean updateByBo(PartnerInfoBo bo);
 
 
     /**
     /**
-     * 校验并批量删除伙伴商基本信息信息
+     * 鏍¢獙骞舵壒閲忓垹闄や紮浼村晢鍩烘湰淇℃伅淇℃伅
      *
      *
-     * @param ids     待删除的主键集合
-     * @param isValid 是否进行有效性校验
-     * @return 是否删除成功
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄�惁杩涜�鏈夋晥鎬ф牎楠?
+     * @return 鏄�惁鍒犻櫎鎴愬姛
      */
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
 
     /**
     /**
-     * 获取当前登录用户的伙伴商信息
+     * 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛鐨勪紮浼村晢淇℃伅
      *
      *
-     * @return 伙伴商基本信息
+     * @return 浼欎即鍟嗗熀鏈�俊鎭?
      */
      */
     PartnerInfoVo queryCurrentPartnerInfo();
     PartnerInfoVo queryCurrentPartnerInfo();
 
 
-    /*根据ids查询伙伴商名称*/
+    /**
+     * 根据ids查询伙伴商名称
+     */
     Map<Long, String> selectPartnerNameByIds(Set<Long> ids);
     Map<Long, String> selectPartnerNameByIds(Set<Long> ids);
 
 
     /**
     /**
-     * 查询伙伴商名称查询伙伴商信息
+     * 鏌ヨ�浼欎即鍟嗗悕绉版煡璇�紮浼村晢淇℃伅
      *
      *
-     * @param partnerName 主键
-     * @return 伙伴商信息
+     * @param partnerName 涓婚敭
+     * @return 浼欎即鍟嗕俊鎭?
      */
      */
     List<PartnerInfoVo> selectByPartnerName(String partnerName);
     List<PartnerInfoVo> selectByPartnerName(String partnerName);
 
 
     R<PartnerManageIndexDataVo> partnerManageIndexData();
     R<PartnerManageIndexDataVo> partnerManageIndexData();
+
+    R<PartnerInfoIndexDataVo> partnerInfoIndexData(Long partnerId);
 }
 }

+ 62 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/PartnerInfoServiceImpl.java

@@ -19,6 +19,7 @@ import org.dromara.customer.domain.PartnerContract;
 import org.dromara.customer.domain.PartnerInfo;
 import org.dromara.customer.domain.PartnerInfo;
 import org.dromara.customer.domain.PartnerUser;
 import org.dromara.customer.domain.PartnerUser;
 import org.dromara.customer.domain.bo.PartnerInfoBo;
 import org.dromara.customer.domain.bo.PartnerInfoBo;
+import org.dromara.customer.domain.vo.PartnerInfoIndexDataVo;
 import org.dromara.customer.domain.vo.PartnerInfoVo;
 import org.dromara.customer.domain.vo.PartnerInfoVo;
 import org.dromara.customer.domain.vo.PartnerManageIndexDataVo;
 import org.dromara.customer.domain.vo.PartnerManageIndexDataVo;
 import org.dromara.customer.mapper.PartnerContactsMapper;
 import org.dromara.customer.mapper.PartnerContactsMapper;
@@ -26,6 +27,9 @@ import org.dromara.customer.mapper.PartnerContractMapper;
 import org.dromara.customer.mapper.PartnerInfoMapper;
 import org.dromara.customer.mapper.PartnerInfoMapper;
 import org.dromara.customer.mapper.PartnerUserMapper;
 import org.dromara.customer.mapper.PartnerUserMapper;
 import org.dromara.customer.service.IPartnerInfoService;
 import org.dromara.customer.service.IPartnerInfoService;
+import org.dromara.product.api.RemoteOrderInfoService;
+import org.dromara.product.api.RemoteProductService;
+import org.dromara.product.api.domain.dto.PartnerOrderIndexDto;
 import org.dromara.system.api.RemoteDictService;
 import org.dromara.system.api.RemoteDictService;
 import org.dromara.system.api.domain.vo.RemoteDictDataVo;
 import org.dromara.system.api.domain.vo.RemoteDictDataVo;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
@@ -55,6 +59,12 @@ public class PartnerInfoServiceImpl extends ServiceImpl<PartnerInfoMapper, Partn
     @DubboReference
     @DubboReference
     private RemoteDictService remoteDictService;
     private RemoteDictService remoteDictService;
 
 
+    @DubboReference
+    private RemoteOrderInfoService remoteOrderInfoService;
+
+    @DubboReference
+    private RemoteProductService remoteProductService;
+
     /**
     /**
      * 查询伙伴商基本信息
      * 查询伙伴商基本信息
      *
      *
@@ -393,4 +403,56 @@ public class PartnerInfoServiceImpl extends ServiceImpl<PartnerInfoMapper, Partn
 
 
         return R.ok(vo);
         return R.ok(vo);
     }
     }
+
+    @Override
+    public R<PartnerInfoIndexDataVo> partnerInfoIndexData(Long partnerId) {
+        PartnerInfoIndexDataVo vo = new PartnerInfoIndexDataVo();
+
+        // 1. 远程获取订单统计数据
+        PartnerOrderIndexDto orderData = remoteOrderInfoService.getPartnerOrderIndex(partnerId);
+        if (orderData != null) {
+            vo.setTodayOrders(orderData.getTodayOrders());
+            vo.setWeekRevenue(orderData.getWeekRevenue());
+            vo.setPendingShipment(orderData.getPendingShipment());
+
+            // 发货量走势
+            if (CollUtil.isNotEmpty(orderData.getShipmentTrend())) {
+                vo.setShipmentTrend(orderData.getShipmentTrend().stream().map(ds -> {
+                    PartnerInfoIndexDataVo.ShipmentTrend st = new PartnerInfoIndexDataVo.ShipmentTrend();
+                    st.setDate(ds.getDate());
+                    st.setCount(ds.getCount());
+                    return st;
+                }).collect(Collectors.toList()));
+            }
+
+            // 商品类型销售占比
+            if (CollUtil.isNotEmpty(orderData.getProductTypeSales())) {
+                vo.setProductTypeSales(orderData.getProductTypeSales().stream().map(ts -> {
+                    PartnerInfoIndexDataVo.ProductTypeSales pts = new PartnerInfoIndexDataVo.ProductTypeSales();
+                    pts.setName(ts.getName());
+                    pts.setValue(ts.getValue());
+                    return pts;
+                }).collect(Collectors.toList()));
+            }
+
+            // 最新发货动态
+            if (CollUtil.isNotEmpty(orderData.getLatestShipments())) {
+                vo.setLatestShipments(orderData.getLatestShipments().stream().map(so -> {
+                    PartnerInfoIndexDataVo.LatestShipment ls = new PartnerInfoIndexDataVo.LatestShipment();
+                    ls.setOrderNo(so.getOrderNo());
+                    ls.setProductName(so.getProductName());
+                    ls.setAmount(so.getAmount());
+                    ls.setCustomer(so.getCustomer());
+                    ls.setStatus(so.getStatus());
+                    ls.setDate(so.getDate());
+                    return ls;
+                }).collect(Collectors.toList()));
+            }
+        }
+
+        // 2. 在售商品数
+        vo.setOnSaleProducts(remoteProductService.getTotalProductCount());
+
+        return R.ok(vo);
+    }
 }
 }

+ 95 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/dubbo/RemoteOrderInfoServiceImpl.java

@@ -21,10 +21,12 @@ import org.dromara.product.api.domain.dto.HotProductRankingDto;
 import org.dromara.product.api.domain.dto.LatestOrderDto;
 import org.dromara.product.api.domain.dto.LatestOrderDto;
 import org.dromara.product.api.domain.dto.OrderAmountTrendDto;
 import org.dromara.product.api.domain.dto.OrderAmountTrendDto;
 import org.dromara.product.api.domain.dto.OrderStatusCountDto;
 import org.dromara.product.api.domain.dto.OrderStatusCountDto;
+import org.dromara.product.api.domain.dto.PartnerOrderIndexDto;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDate;
+import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
@@ -240,4 +242,97 @@ public class RemoteOrderInfoServiceImpl implements RemoteOrderInfoService {
             .map(entry -> new HotProductRankingDto(entry.getKey(), entry.getValue()))
             .map(entry -> new HotProductRankingDto(entry.getKey(), entry.getValue()))
             .collect(Collectors.toList());
             .collect(Collectors.toList());
     }
     }
+
+    @Override
+    public PartnerOrderIndexDto getPartnerOrderIndex(Long partnerId) {
+        PartnerOrderIndexDto dto = new PartnerOrderIndexDto();
+        LocalDate today = LocalDate.now();
+        Date todayStart = java.sql.Date.valueOf(today);
+        Date todayEnd = java.sql.Date.valueOf(today.plusDays(1));
+        LocalDate weekStart = today.with(java.time.DayOfWeek.MONDAY);
+        Date weekStartDate = java.sql.Date.valueOf(weekStart);
+
+        dto.setTodayOrders(orderMainService.count(Wrappers.<OrderMain>lambdaQuery()
+            .eq(OrderMain::getAssigneeId, partnerId)
+            .ge(OrderMain::getCreateTime, todayStart)
+            .lt(OrderMain::getCreateTime, todayEnd)));
+
+        List<OrderMain> weekOrders = orderMainService.list(Wrappers.<OrderMain>lambdaQuery()
+            .eq(OrderMain::getAssigneeId, partnerId)
+            .ge(OrderMain::getCreateTime, weekStartDate)
+            .lt(OrderMain::getCreateTime, todayEnd)
+            .select(OrderMain::getTotalAmount));
+        dto.setWeekRevenue(weekOrders.stream()
+            .map(OrderMain::getTotalAmount).filter(Objects::nonNull)
+            .reduce(BigDecimal.ZERO, BigDecimal::add));
+
+        dto.setPendingShipment(orderMainService.count(Wrappers.<OrderMain>lambdaQuery()
+            .eq(OrderMain::getAssigneeId, partnerId)
+            .notIn(OrderMain::getOrderStatus, "3", "4")));
+
+        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MM-dd");
+        List<PartnerOrderIndexDto.DayShipment> shipmentTrend = new ArrayList<>();
+        for (int i = 6; i >= 0; i--) {
+            LocalDate date = today.minusDays(i);
+            Long count = orderMainService.count(Wrappers.<OrderMain>lambdaQuery()
+                .eq(OrderMain::getAssigneeId, partnerId)
+                .in(OrderMain::getOrderStatus, "3", "4")
+                .ge(OrderMain::getCreateTime, java.sql.Date.valueOf(date))
+                .lt(OrderMain::getCreateTime, java.sql.Date.valueOf(date.plusDays(1))));
+            PartnerOrderIndexDto.DayShipment ds = new PartnerOrderIndexDto.DayShipment();
+            ds.setDate(date.format(dateFormatter));
+            ds.setCount(count);
+            shipmentTrend.add(ds);
+        }
+        dto.setShipmentTrend(shipmentTrend);
+
+        List<OrderMain> partnerOrders = orderMainService.list(Wrappers.<OrderMain>lambdaQuery()
+            .eq(OrderMain::getAssigneeId, partnerId).select(OrderMain::getId));
+        List<PartnerOrderIndexDto.TypeSales> typeSalesList = Collections.emptyList();
+        if (CollUtil.isNotEmpty(partnerOrders)) {
+            Set<Long> orderIds = partnerOrders.stream().map(OrderMain::getId).collect(Collectors.toSet());
+            List<OrderProduct> products = orderProductService.list(Wrappers.<OrderProduct>lambdaQuery()
+                .in(OrderProduct::getOrderId, orderIds).select(OrderProduct::getProductName));
+            Map<String, Long> nameCountMap = products.stream()
+                .filter(p -> p.getProductName() != null)
+                .collect(Collectors.groupingBy(OrderProduct::getProductName, Collectors.counting()));
+            typeSalesList = nameCountMap.entrySet().stream()
+                .sorted(Map.Entry.<String, Long>comparingByValue().reversed()).limit(5)
+                .map(entry -> { PartnerOrderIndexDto.TypeSales ts = new PartnerOrderIndexDto.TypeSales(); ts.setName(entry.getKey()); ts.setValue(entry.getValue()); return ts; })
+                .collect(Collectors.toList());
+        }
+        dto.setProductTypeSales(typeSalesList);
+
+        List<OrderMain> latestOrders = orderMainService.list(Wrappers.<OrderMain>lambdaQuery()
+            .eq(OrderMain::getAssigneeId, partnerId)
+            .orderByDesc(OrderMain::getCreateTime).last("LIMIT 10"));
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        List<PartnerOrderIndexDto.ShipmentOrder> shipments = new ArrayList<>();
+        if (CollUtil.isNotEmpty(latestOrders)) {
+            Set<Long> latestOrderIds = latestOrders.stream().map(OrderMain::getId).collect(Collectors.toSet());
+            List<OrderProduct> latestProducts = orderProductService.list(Wrappers.<OrderProduct>lambdaQuery()
+                .in(OrderProduct::getOrderId, latestOrderIds));
+            Map<Long, String> productNameMap = latestProducts.stream()
+                .collect(Collectors.groupingBy(OrderProduct::getOrderId,
+                    Collectors.collectingAndThen(Collectors.toList(), list -> list.isEmpty() ? "" : list.get(0).getProductName())));
+            Set<Long> customerIds = latestOrders.stream().map(OrderMain::getCustomerId).filter(Objects::nonNull).collect(Collectors.toSet());
+            Map<Long, String> customerNameMap = CollUtil.isEmpty(customerIds) ? Collections.emptyMap() : remoteCustomerService.selectCustomerNameByIds(customerIds);
+            for (OrderMain order : latestOrders) {
+                PartnerOrderIndexDto.ShipmentOrder so = new PartnerOrderIndexDto.ShipmentOrder();
+                so.setOrderNo(order.getOrderNo());
+                so.setProductName(productNameMap.getOrDefault(order.getId(), ""));
+                so.setAmount(order.getTotalAmount());
+                so.setCustomer(customerNameMap.getOrDefault(order.getCustomerId(), ""));
+                String status = order.getOrderStatus();
+                if ("3".equals(status)) so.setStatus("部分发货");
+                else if ("4".equals(status)) so.setStatus("已发货");
+                else so.setStatus(status);
+                if (order.getCreateTime() != null)
+                    so.setDate(order.getCreateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().format(dtf));
+                shipments.add(so);
+            }
+        }
+        dto.setLatestShipments(shipments);
+        return dto;
+    }
 }
 }