Просмотр исходного кода

[update] 生成司机区间货损记录逻辑整改及统计方式整改,加入统计盈亏明细,司机未补货补货单单号

miajio 1 неделя назад
Родитель
Сommit
aa30b33bb2
13 измененных файлов с 365 добавлено и 88 удалено
  1. 10 0
      warehouse-admin-data/src/main/java/com/yr/warehouse/admin/driver/mapper/DriverGoodsLossStatProfitLossDetailMapper.java
  2. 9 0
      warehouse-admin-data/src/main/java/com/yr/warehouse/admin/driver/mapper/DriverGoodsLossStatUnReplenishSnapshotMapper.java
  3. 7 0
      warehouse-admin-data/src/main/java/com/yr/warehouse/admin/driver/mapper/DriverOnRouteAccountRecordDetailMapper.java
  4. 1 1
      warehouse-admin-data/src/main/java/com/yr/warehouse/admin/driver/mapper/DriverOnRouteDetailLogMapper.java
  5. 7 0
      warehouse-admin-data/src/main/java/com/yr/warehouse/admin/driver/vo/DriverGoodsLossIntervalVo.java
  6. 9 0
      warehouse-admin-data/src/main/java/com/yr/warehouse/admin/replenish/mapper/ReplenishOrderDetailMapper.java
  7. 2 1
      warehouse-admin-data/src/main/java/com/yr/warehouse/admin/replenish/mapper/ReplenishOrderInfoMapper.java
  8. 10 0
      warehouse-admin-data/src/main/resources/mapper/driver/DriverGoodsLossStatProfitLossDetailMapper.xml
  9. 8 0
      warehouse-admin-data/src/main/resources/mapper/driver/DriverGoodsLossStatUnReplenishSnapshotMapper.xml
  10. 13 0
      warehouse-admin-data/src/main/resources/mapper/driver/DriverOnRouteAccountRecordDetailMapper.xml
  11. 13 0
      warehouse-admin-data/src/main/resources/mapper/replenish/ReplenishOrderDetailMapper.xml
  12. 13 9
      warehouse-admin-data/src/main/resources/mapper/replenish/ReplenishOrderInfoMapper.xml
  13. 263 77
      warehouse-admin-server/src/main/java/com/yr/warehouse/admin/service/driver/impl/DriverGoodsLossIntervalServiceImpl.java

+ 10 - 0
warehouse-admin-data/src/main/java/com/yr/warehouse/admin/driver/mapper/DriverGoodsLossStatProfitLossDetailMapper.java

@@ -2,6 +2,9 @@ package com.yr.warehouse.admin.driver.mapper;
 
 import com.yr.warehouse.admin.driver.data.DriverGoodsLossStatProfitLossDetail;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface DriverGoodsLossStatProfitLossDetailMapper extends BaseMapper<DriverGoodsLossStatProfitLossDetail> {
 
+    /**
+     * 批量插入
+     *
+     * @param goodsLossMonthlyMainId 货损区间统计主表id(关联司机货损区间统计主表id)
+     * @param driverGoodsLossStatProfitLossDetails 批量插入数据
+     */
+    void insertBatch(@Param("goodsLossMonthlyMainId") Long goodsLossMonthlyMainId, @Param("driverGoodsLossStatProfitLossDetails") List<DriverGoodsLossStatProfitLossDetail> driverGoodsLossStatProfitLossDetails);
 }

+ 9 - 0
warehouse-admin-data/src/main/java/com/yr/warehouse/admin/driver/mapper/DriverGoodsLossStatUnReplenishSnapshotMapper.java

@@ -2,6 +2,9 @@ package com.yr.warehouse.admin.driver.mapper;
 
 import com.yr.warehouse.admin.driver.data.DriverGoodsLossStatUnReplenishSnapshot;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface DriverGoodsLossStatUnReplenishSnapshotMapper extends BaseMapper<DriverGoodsLossStatUnReplenishSnapshot> {
 
+    /**
+     * 批量插入
+     * @param goodsLossMonthlyMainId 货损区间统计主表id(关联司机货损区间统计主表id)
+     * @param driverGoodsLossStatUnReplenishSnapshots 司机区域货损统计未补货补货单快照
+     */
+    void insertBatch(@Param("goodsLossMonthlyMainId") Long goodsLossMonthlyMainId, @Param("driverGoodsLossStatUnReplenishSnapshots") List<DriverGoodsLossStatUnReplenishSnapshot> driverGoodsLossStatUnReplenishSnapshots);
 }

+ 7 - 0
warehouse-admin-data/src/main/java/com/yr/warehouse/admin/driver/mapper/DriverOnRouteAccountRecordDetailMapper.java

@@ -45,4 +45,11 @@ public interface DriverOnRouteAccountRecordDetailMapper extends BaseMapper<Drive
      * @param bo 编辑司机在途核算记录子表参数
      */
     void editorCreate(@Param("bo") DriverIntervalRouteAccountRecordEditorBo bo);
+
+    /**
+     * 根据司机在途核算记录主表ID查询司机在途核算记录子表
+     * @param routeAccountRecordMainIds 司机在途核算记录主表ID列表
+     * @return 司机在途核算记录子表列表
+     */
+    List<DriverOnRouteAccountRecordDetail> selectByRouteAccountRecordMainId(@Param("routeAccountRecordMainIds") List<Long> routeAccountRecordMainIds);
 }

+ 1 - 1
warehouse-admin-data/src/main/java/com/yr/warehouse/admin/driver/mapper/DriverOnRouteDetailLogMapper.java

@@ -22,7 +22,7 @@ public interface DriverOnRouteDetailLogMapper extends BaseMapper<DriverOnRouteDe
 
     /**
      * 批量插入
-     * @param driverOnRouteDetailLogs
+     * @param driverOnRouteDetailLogs 批量插入数据
      */
     void insertBatch(@Param("driverOnRouteDetailLogs") List<DriverOnRouteDetailLog> driverOnRouteDetailLogs);
 

+ 7 - 0
warehouse-admin-data/src/main/java/com/yr/warehouse/admin/driver/vo/DriverGoodsLossIntervalVo.java

@@ -1,11 +1,13 @@
 package com.yr.warehouse.admin.driver.vo;
 
 import com.yr.warehouse.admin.driver.data.DriverGoodsLossIntervalDetail;
+import com.yr.warehouse.admin.driver.data.DriverGoodsLossStatProfitLossDetail;
 import com.yr.warehouse.admin.driver.data.EquipmentLossIntervalDetail;
 import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * 司机货损区间统计视图
@@ -27,6 +29,11 @@ public class DriverGoodsLossIntervalVo implements Serializable {
     private EquipmentLossIntervalDetail equipmentLossIntervalDetail;
 
     /**
+     * 司机货损盈亏明细数据
+     */
+    private List<DriverGoodsLossStatProfitLossDetail> driverGoodsLossStatProfitLossDetails;
+
+    /**
      * 使用司机货损区间核算id
      */
     private Long useDriverOnRouteAccountRecordMainId;

+ 9 - 0
warehouse-admin-data/src/main/java/com/yr/warehouse/admin/replenish/mapper/ReplenishOrderDetailMapper.java

@@ -2,6 +2,9 @@ package com.yr.warehouse.admin.replenish.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yr.warehouse.admin.replenish.data.ReplenishOrderDetail;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,10 @@ import com.yr.warehouse.admin.replenish.data.ReplenishOrderDetail;
  */
 public interface ReplenishOrderDetailMapper extends BaseMapper<ReplenishOrderDetail> {
 
+    /**
+     * 根据补货单单号查询补货单明细列表
+     * @param orderNumbers 补货单号
+     * @return 补货单明细列表
+     */
+    List<ReplenishOrderDetail> searchByOrderNumbers(@Param("orderNumbers") List<String> orderNumbers);
 }

+ 2 - 1
warehouse-admin-data/src/main/java/com/yr/warehouse/admin/replenish/mapper/ReplenishOrderInfoMapper.java

@@ -1,6 +1,7 @@
 package com.yr.warehouse.admin.replenish.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yr.warehouse.admin.driver.data.DriverGoodsLossStatUnReplenishSnapshot;
 import com.yr.warehouse.admin.replenish.data.ReplenishOrderInfo;
 import org.apache.ibatis.annotations.Param;
 
@@ -25,5 +26,5 @@ public interface ReplenishOrderInfoMapper extends BaseMapper<ReplenishOrderInfo>
      * @param intervalEndTime 结束时间
      * @return 未补货的补货单
      */
-    List<ReplenishOrderInfo> selectUnReplenish(@Param("areaStaffIds") List<Long> areaStaffIds, @Param("intervalStartTime") LocalDateTime intervalStartTime, @Param("intervalEndTime") LocalDateTime intervalEndTime);
+    List<DriverGoodsLossStatUnReplenishSnapshot> searchDriverGoodsLossStatUnReplenishSnapshot(@Param("areaStaffIds") List<Long> areaStaffIds, @Param("intervalStartTime") LocalDateTime intervalStartTime, @Param("intervalEndTime") LocalDateTime intervalEndTime);
 }

+ 10 - 0
warehouse-admin-data/src/main/resources/mapper/driver/DriverGoodsLossStatProfitLossDetailMapper.xml

@@ -19,5 +19,15 @@
     <sql id="Base_Column_List">
         id, goodsLossMonthlyMainId, areaStaffId, goodsId, onRouteInventoryNum, unReplenishedNum, verifiedNum, profitLossNum, createTime
     </sql>
+    <insert id="insertBatch">
+        insert into yr_driver_goods_loss_stat_profit_loss_detail
+        (goodsLossMonthlyMainId, areaStaffId, goodsId, onRouteInventoryNum, unReplenishedNum, verifiedNum,
+        profitLossNum)
+        values
+        <foreach collection="driverGoodsLossStatProfitLossDetails" item="item" separator=",">
+            (#{goodsLossMonthlyMainId}, #{item.areaStaffId}, #{item.goodsId}, #{item.onRouteInventoryNum},
+            #{item.unReplenishedNum}, #{item.verifiedNum}, #{item.profitLossNum})
+        </foreach>
+    </insert>
 
 </mapper>

+ 8 - 0
warehouse-admin-data/src/main/resources/mapper/driver/DriverGoodsLossStatUnReplenishSnapshotMapper.xml

@@ -16,5 +16,13 @@
     <sql id="Base_Column_List">
         id, goodsLossMonthlyMainId, areaStaffId, unReplenishOrderNumber, unReplenishedNum, createTime
     </sql>
+    <insert id="insertBatch">
+        insert into yr_driver_goods_loss_stat_un_replenish_snapshot
+        (goodsLossMonthlyMainId, areaStaffId, unReplenishOrderNumber, unReplenishedNum)
+        values
+        <foreach collection="driverGoodsLossStatUnReplenishSnapshots" item="item" separator=",">
+            (#{goodsLossMonthlyMainId}, #{item.areaStaffId}, #{item.unReplenishOrderNumber}, #{item.unReplenishedNum})
+        </foreach>
+    </insert>
 
 </mapper>

+ 13 - 0
warehouse-admin-data/src/main/resources/mapper/driver/DriverOnRouteAccountRecordDetailMapper.xml

@@ -74,5 +74,18 @@
         </where>
         order by dorard.id desc
     </select>
+    <select id="selectByRouteAccountRecordMainId"
+            resultType="com.yr.warehouse.admin.driver.data.DriverOnRouteAccountRecordDetail"
+            parameterType="java.util.List">
+        select
+        <include refid="Base_Column_List"/>
+        from yr_driver_on_route_account_record_detail
+        <where>
+            <foreach item="item" collection="routeAccountRecordMainIds" index="index"
+                     open="routeAccountRecordMainId in (" separator="," close=")">
+                #{item}
+            </foreach>
+        </where>
+    </select>
 
 </mapper>

+ 13 - 0
warehouse-admin-data/src/main/resources/mapper/replenish/ReplenishOrderDetailMapper.xml

@@ -28,5 +28,18 @@
     <sql id="Base_Column_List">
         id, order_number, picking_number, real_picking_number, cargo_way_id, goods_id, cargo_way_limit_number, cargo_way_stock_number, is_replace, way, is_aggregation, cargo_way_replenish_status, create_time, create_uid, create_name, modify_time, modify_uid, modify_name
     </sql>
+    <select id="searchByOrderNumbers" resultType="com.yr.warehouse.admin.replenish.data.ReplenishOrderDetail"
+            parameterType="java.util.List">
+        select
+        <include refid="Base_Column_List"/>
+        from yr_replenish_order_detail
+        <where>
+            <if test="orderNumbers != null and orderNumbers.size > 0">
+                <foreach collection="orderNumbers" item="orderNumber" open="and order_number in (" separator="," close=")">
+                    #{orderNumber}
+                </foreach>
+            </if>
+        </where>
+    </select>
 
 </mapper>

+ 13 - 9
warehouse-admin-data/src/main/resources/mapper/replenish/ReplenishOrderInfoMapper.xml

@@ -31,23 +31,27 @@
     <sql id="Base_Column_List">
         id, operator_id, operator_chain, order_number, parent_order_number, warehouse_info_id, device_id, area_staff_id, replenish_account_id, replenish_user_name, replenish_user_id, replenish_time, replenish_type, replenish_status, file_urls, create_time, create_uid, create_name, modify_time, modify_uid, modify_name
     </sql>
-    <select id="selectUnReplenish" resultType="com.yr.warehouse.admin.replenish.data.ReplenishOrderInfo">
-        select <include refid="Base_Column_List" /> from yr_replenish_order_info
-        where replenish_time is null
-        and replenish_status = 0
+    <select id="searchDriverGoodsLossStatUnReplenishSnapshot" resultType="com.yr.warehouse.admin.driver.data.DriverGoodsLossStatUnReplenishSnapshot">
+        select
+            roi.area_staff_id as areaStaffId,
+            roi.order_number as unReplenishOrderNumber,
+            sum(rod.picking_number) as unReplenishedNum
+        from yr_replenish_order_info as roi
+        left join yr_replenish_order_detail as rod on roi.order_number = rod.order_number
+        where roi.replenish_time is null
+        and roi.replenish_status = 0
         <if test="areaStaffIds != null and areaStaffIds.size > 0">
-            and area_staff_id in
+            and roi.area_staff_id in
             <foreach item="item" collection="areaStaffIds" open="(" separator="," close=")">
                 #{item}
             </foreach>
         </if>
         <if test="intervalStartTime != null">
-            and create_time >= #{intervalStartTime}
+            and roi.create_time >= #{intervalStartTime}
         </if>
         <if test="intervalEndTime != null">
-            and #{intervalEndTime} >= create_time
+            and #{intervalEndTime} >= roi.create_time
         </if>
-        order by id desc
+        order by roi.id desc
     </select>
-
 </mapper>

+ 263 - 77
warehouse-admin-server/src/main/java/com/yr/warehouse/admin/service/driver/impl/DriverGoodsLossIntervalServiceImpl.java

@@ -11,11 +11,11 @@ import com.yr.warehouse.admin.driver.data.*;
 import com.yr.warehouse.admin.driver.mapper.*;
 import com.yr.warehouse.admin.driver.menu.DriverGoodsLossIntervalStockTakingType;
 import com.yr.warehouse.admin.driver.vo.DriverGoodsLossIntervalVo;
-import com.yr.warehouse.admin.replenish.data.ReplenishOrderInfo;
+import com.yr.warehouse.admin.replenish.data.ReplenishOrderDetail;
+import com.yr.warehouse.admin.replenish.mapper.ReplenishOrderDetailMapper;
 import com.yr.warehouse.admin.replenish.mapper.ReplenishOrderInfoMapper;
 import com.yr.warehouse.admin.service.driver.DriverGoodsLossIntervalService;
 import com.yr.warehouse.admin.service.statistics.DriverStatisticsService;
-import com.yr.warehouse.admin.statistics.vo.DriverStatisticsVo;
 import jakarta.annotation.Resource;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
@@ -31,8 +31,6 @@ import java.util.stream.Collectors;
  */
 @Service
 public class DriverGoodsLossIntervalServiceImpl implements DriverGoodsLossIntervalService {
-    @Resource
-    private DriverStatisticsService driverStatisticsService;
 
     @Resource
     private DriverGoodsLossRecordMapper driverGoodsLossRecordMapper;
@@ -50,6 +48,9 @@ public class DriverGoodsLossIntervalServiceImpl implements DriverGoodsLossInterv
     private DriverOnRouteAccountRecordMainMapper driverOnRouteAccountRecordMainMapper;
 
     @Resource
+    private DriverOnRouteAccountRecordDetailMapper driverOnRouteAccountRecordDetailMapper;
+
+    @Resource
     private DriverGoodsLossIntervalDetailMapper driverGoodsLossIntervalDetailMapper;
 
     @Resource
@@ -62,8 +63,43 @@ public class DriverGoodsLossIntervalServiceImpl implements DriverGoodsLossInterv
     private ReplenishOrderInfoMapper replenishOrderInfoMapper;
 
     @Resource
+    private ReplenishOrderDetailMapper replenishOrderDetailMapper;
+
+    @Resource
+    private DriverGoodsLossStatUnReplenishSnapshotMapper driverGoodsLossStatUnReplenishSnapshotMapper;
+
+    @Resource
+    private DriverGoodsLossStatProfitLossDetailMapper driverGoodsLossStatProfitLossDetailMapper;
+
+    @Resource
+    private DriverOnRouteDetailLogMapper driverOnRouteDetailLogMapper;
+
+    @Resource
     private TransactionTemplate transactionTemplate;
 
+    /**
+     * 构建司机货损区间统计视图
+     *
+     * @param driverGoodsLossIntervalDetail 货损统计数据
+     * @param equipmentLossIntervalDetail 设备货损统计数据
+     * @param driverGoodsLossStatProfitLossDetails 司机货损盈亏明细数据
+     * @param driverOnRouteAccountRecordMain 区域员工账户统计数据
+     * @return 货损区间统计视图
+     */
+    @NotNull
+    private static DriverGoodsLossIntervalVo buildGoodsLossIntervalVo(DriverGoodsLossIntervalDetail driverGoodsLossIntervalDetail,
+                                                                      EquipmentLossIntervalDetail equipmentLossIntervalDetail,
+                                                                      List<DriverGoodsLossStatProfitLossDetail> driverGoodsLossStatProfitLossDetails,
+                                                                      DriverOnRouteAccountRecordMain driverOnRouteAccountRecordMain) {
+        DriverGoodsLossIntervalVo driverGoodsLossIntervalVo = new DriverGoodsLossIntervalVo();
+        driverGoodsLossIntervalVo.setDriverGoodsLossIntervalDetail(driverGoodsLossIntervalDetail);
+        driverGoodsLossIntervalVo.setEquipmentLossIntervalDetail(equipmentLossIntervalDetail);
+        driverGoodsLossIntervalVo.setDriverGoodsLossStatProfitLossDetails(driverGoodsLossStatProfitLossDetails);
+        if (null != driverOnRouteAccountRecordMain) {
+            driverGoodsLossIntervalVo.setUseDriverOnRouteAccountRecordMainId(driverOnRouteAccountRecordMain.getId());
+        }
+        return driverGoodsLossIntervalVo;
+    }
 
     @Override
     public void generator(DriverIntervalCargoDamageGeneratorBo bo) {
@@ -91,7 +127,14 @@ public class DriverGoodsLossIntervalServiceImpl implements DriverGoodsLossInterv
         }
 
         // 获取司机未补货的补货单列表
-        List<ReplenishOrderInfo> replenishOrderInfos = replenishOrderInfoMapper.selectUnReplenish(bo.getAreaStaffIds(), bo.getIntervalStartTime(), bo.getIntervalEndTime());
+        List<DriverGoodsLossStatUnReplenishSnapshot> driverGoodsLossStatUnReplenishSnapshots = replenishOrderInfoMapper.searchDriverGoodsLossStatUnReplenishSnapshot(bo.getAreaStaffIds(), bo.getIntervalStartTime(), bo.getIntervalEndTime());
+        List<ReplenishOrderDetail> unReplenishOrderDetails = new ArrayList<>();
+        if (null != driverGoodsLossStatUnReplenishSnapshots && !driverGoodsLossStatUnReplenishSnapshots.isEmpty()) {
+            unReplenishOrderDetails = replenishOrderDetailMapper.searchByOrderNumbers(driverGoodsLossStatUnReplenishSnapshots.stream().map(DriverGoodsLossStatUnReplenishSnapshot::getUnReplenishOrderNumber).collect(Collectors.toList()));
+        }
+
+        // 获取结束日期的司机在途明细日志
+        List<DriverOnRouteDetailLog> driverOnRouteDetailLogs = driverOnRouteDetailLogMapper.searchByStatDate(bo.getAreaStaffIds(), bo.getEndStatDate());
 
         // 获取上一次司机的货损统计记录
         DriverGoodsLossIntervalMain lastDriverGoodsLossIntervalMain = driverGoodsLossIntervalMainMapper.queryLastByOperatorId(bo.getOperatorId(), bo.getWarehouseId(), bo.getIntervalStartTime());
@@ -104,22 +147,40 @@ public class DriverGoodsLossIntervalServiceImpl implements DriverGoodsLossInterv
 
         // 获取当前司机下所有未核算的核算记录主表
         List<DriverOnRouteAccountRecordMain> driverOnRouteAccountRecordMains = driverOnRouteAccountRecordMainMapper.selectUnVerified(bo.getAreaStaffIds());
-        Map<Long, DriverOnRouteAccountRecordMain> driverOnRouteAccountRecordMainMap = driverOnRouteAccountRecordMains.stream().collect(Collectors.toMap(DriverOnRouteAccountRecordMain::getAreaStaffId, Function.identity()));
+        Map<Long, DriverOnRouteAccountRecordMain> driverOnRouteAccountRecordMainMap = new HashMap<>();
+        // 获取当前司机下所有未核算的核算记录子表
+        Map<Long, List<DriverOnRouteAccountRecordDetail>> driverOnRouteAccountRecordDetailMap = new HashMap<>();
+
+        if (null != driverOnRouteAccountRecordMains && !driverOnRouteAccountRecordMains.isEmpty()) {
+            driverOnRouteAccountRecordMainMap = driverOnRouteAccountRecordMains.stream().collect(Collectors.toMap(DriverOnRouteAccountRecordMain::getAreaStaffId, Function.identity()));
+            List<Long> routeAccountRecordMainIds = driverOnRouteAccountRecordMains.stream().map(DriverOnRouteAccountRecordMain::getId).collect(Collectors.toList());
+            List<DriverOnRouteAccountRecordDetail> driverOnRouteAccountRecordDetails = driverOnRouteAccountRecordDetailMapper.selectByRouteAccountRecordMainId(routeAccountRecordMainIds);
+
+            driverOnRouteAccountRecordDetailMap = driverOnRouteAccountRecordDetails.stream().collect(Collectors.groupingBy(DriverOnRouteAccountRecordDetail::getRouteAccountRecordMainId));
+        }
+
 
         // 基于开始时间及结束时间抽取这段时间内每日统计的司机货损记录及设备货损记录
         List<DriverGoodsLossRecord> driverGoodsLossRecords = driverGoodsLossRecordMapper.searchGeneratorParam(bo);
         List<DriverEquipmentLossRecord> driverEquipmentLossRecords = driverEquipmentLossRecordMapper.searchGeneratorParam(bo);
 
         // 基于司机货损记录及设备货损记录生成司机对应的货损统计记录
-        Map<Long, DriverGoodsLossIntervalVo> driverGoodsLossIntervalDetailMap = generatorDriverGoodsLossIntervalDetailMap(bo.getAreaStaffIds(),
-                driverOnRouteAccountRecordMainMap,
-                driverGoodsLossRecords,
-                driverEquipmentLossRecords,
-                lastDriverGoodsLossIntervalDetails,
-                lastEquipmentLossIntervalDetails);
+        Map<Long, DriverGoodsLossIntervalVo> driverGoodsLossIntervalDetailMap = generatorDriverGoodsLossIntervalDetailMap(
+                bo.getAreaStaffIds(), // 司机id列表
+                driverOnRouteAccountRecordMainMap, // 司机在途账户统计记录
+                driverOnRouteAccountRecordDetailMap, // 司机在途账户统计记录子表
+                driverGoodsLossRecords, // 司机货损记录
+                driverEquipmentLossRecords, // 设备货损记录
+                driverGoodsLossStatUnReplenishSnapshots, // 货损统计未补货补货单快照
+                unReplenishOrderDetails, // 货损统计未补货补货单明细
+                lastDriverGoodsLossIntervalDetails, // 上一次司机货损统计记录
+                lastEquipmentLossIntervalDetails, // 上一次司机设备货损记录
+                driverOnRouteDetailLogs // 结束日期的司机在途明细日志
+        );
 
         List<DriverGoodsLossIntervalDetail> driverGoodsLossIntervalDetails = new ArrayList<>();
         List<EquipmentLossIntervalDetail> equipmentLossIntervalDetails = new ArrayList<>();
+        List<DriverGoodsLossStatProfitLossDetail> driverGoodsLossStatProfitLossDetails = new ArrayList<>();
 
         DriverGoodsLossIntervalMain driverGoodsLossIntervalMain = new DriverGoodsLossIntervalMain();
         driverGoodsLossIntervalMain.setIntervalStartTime(bo.getIntervalStartTime());
@@ -168,6 +229,12 @@ public class DriverGoodsLossIntervalServiceImpl implements DriverGoodsLossInterv
                     equipmentProfitLossNum += equipmentLossIntervalDetail.getProfitLossNum();
                 }
 
+                List<DriverGoodsLossStatProfitLossDetail> inDriverGoodsLossStatProfitLossDetails = driverGoodsLossIntervalVo.getDriverGoodsLossStatProfitLossDetails();
+                if (null != inDriverGoodsLossStatProfitLossDetails && !inDriverGoodsLossStatProfitLossDetails.isEmpty()) {
+                    driverGoodsLossStatProfitLossDetails.addAll(inDriverGoodsLossStatProfitLossDetails);
+                }
+
+
                 totalProfitLossNum = driverProfitLossNum + equipmentProfitLossNum;
 
                 if (null != driverGoodsLossIntervalVo.getUseDriverOnRouteAccountRecordMainId()) {
@@ -196,6 +263,14 @@ public class DriverGoodsLossIntervalServiceImpl implements DriverGoodsLossInterv
             driverGoodsLossIntervalDetailMapper.insertBatch(driverGoodsLossIntervalMain.getId(), driverGoodsLossIntervalDetails);
             equipmentLossIntervalDetailMapper.insertBatch(driverGoodsLossIntervalMain.getId(), equipmentLossIntervalDetails);
 
+            if (null != driverGoodsLossStatUnReplenishSnapshots && !driverGoodsLossStatUnReplenishSnapshots.isEmpty()) {
+                driverGoodsLossStatUnReplenishSnapshotMapper.insertBatch(driverGoodsLossIntervalMain.getId(), driverGoodsLossStatUnReplenishSnapshots);
+            }
+
+            if (!driverGoodsLossStatProfitLossDetails.isEmpty()) {
+                driverGoodsLossStatProfitLossDetailMapper.insertBatch(driverGoodsLossIntervalMain.getId(), driverGoodsLossStatProfitLossDetails);
+            }
+
             if (!useDriverOnRouteAccountRecordMains.isEmpty()) {
                 driverOnRouteAccountRecordMainMapper.batchBind(bo, useDriverOnRouteAccountRecordMains, driverGoodsLossIntervalMain.getId());
             }
@@ -206,96 +281,146 @@ public class DriverGoodsLossIntervalServiceImpl implements DriverGoodsLossInterv
     /**
      * 生成司机货损统计数据
      * @param areaStaffIds 区域员工id
-     * @param driverOnRouteAccountRecordMainMap 区域员工账户统计
+     * @param driverOnRouteAccountRecordMainMap 司机在途核算数据Map
+     * @param driverOnRouteAccountRecordDetailMap 司机在途核算明细Map
      * @param driverGoodsLossRecords 司机货损统计
      * @param driverEquipmentLossRecords 设备货损统计
+     * @param driverGoodsLossStatUnReplenishSnapshots 司机未补货快照
      * @param lastDriverGoodsLossIntervalDetails 上一次的司机货损统计
      * @param lastEquipmentLossIntervalDetails 上一次的设备货损统计
+     * @param driverOnRouteDetailLogs 司机在途明细日志
      * @return 司机对应的区间货损统计Map
      */
     private Map<Long, DriverGoodsLossIntervalVo> generatorDriverGoodsLossIntervalDetailMap(List<Long> areaStaffIds,
                                                                                            Map<Long, DriverOnRouteAccountRecordMain> driverOnRouteAccountRecordMainMap,
+                                                                                           Map<Long, List<DriverOnRouteAccountRecordDetail>> driverOnRouteAccountRecordDetailMap,
                                                                                            List<DriverGoodsLossRecord> driverGoodsLossRecords,
                                                                                            List<DriverEquipmentLossRecord> driverEquipmentLossRecords,
+                                                                                           List<DriverGoodsLossStatUnReplenishSnapshot> driverGoodsLossStatUnReplenishSnapshots,
+                                                                                           List<ReplenishOrderDetail> unReplenishOrderDetails,
                                                                                            List<DriverGoodsLossIntervalDetail> lastDriverGoodsLossIntervalDetails,
-                                                                                           List<EquipmentLossIntervalDetail> lastEquipmentLossIntervalDetails) {
+                                                                                           List<EquipmentLossIntervalDetail> lastEquipmentLossIntervalDetails,
+                                                                                           List<DriverOnRouteDetailLog> driverOnRouteDetailLogs) {
+        // 区域员工对应的货损统计
         Map<Long, List<DriverGoodsLossRecord>> areaStaffDriverGoodsLossRecordMap = driverGoodsLossRecords.stream().collect(Collectors.groupingBy(DriverGoodsLossRecord::getAreaStaffId));
+        // 区域员工对应的设备货损统计
         Map<Long, List<DriverEquipmentLossRecord>> areaStaffDriverEquipmentLossRecordMap = driverEquipmentLossRecords.stream().collect(Collectors.groupingBy(DriverEquipmentLossRecord::getAreaStaffId));
+        // 区域员工对应的未补货快照
+        Map<Long, List<DriverGoodsLossStatUnReplenishSnapshot>> areaStaffDriverGoodsLossStatUnReplenishSnapshotMap = null != driverGoodsLossStatUnReplenishSnapshots && !driverGoodsLossStatUnReplenishSnapshots.isEmpty() ?
+                driverGoodsLossStatUnReplenishSnapshots.stream().collect(Collectors.groupingBy(DriverGoodsLossStatUnReplenishSnapshot::getAreaStaffId)) : new HashMap<>();
+
+        // 区域员工对应的未补货单详情
+        Map<String, List<ReplenishOrderDetail>> unReplenishOrderDetailMap = null != unReplenishOrderDetails && !unReplenishOrderDetails.isEmpty() ?
+                unReplenishOrderDetails.stream().collect(Collectors.groupingBy(ReplenishOrderDetail::getOrderNumber)) : new HashMap<>();
 
+        // 上一次的司机货损统计
         Map<Long, DriverGoodsLossIntervalDetail> lastDriverGoodsLossIntervalDetailMap = null != lastDriverGoodsLossIntervalDetails && !lastDriverGoodsLossIntervalDetails.isEmpty() ?
                 lastDriverGoodsLossIntervalDetails.stream().collect(Collectors.toMap(DriverGoodsLossIntervalDetail::getAreaStaffId, v -> v)) : new HashMap<>();
+        // 上一次的设备货损统计
         Map<Long, EquipmentLossIntervalDetail> lastEquipmentLossIntervalDetailMap = null != lastEquipmentLossIntervalDetails && !lastEquipmentLossIntervalDetails.isEmpty() ?
                 lastEquipmentLossIntervalDetails.stream().collect(Collectors.toMap(EquipmentLossIntervalDetail::getAreaStaffId, v -> v)) : new HashMap<>();
 
+        // 司机最后一天商品货损明细日志
+        Map<Long, List<DriverOnRouteDetailLog>> driverOnRouteDetailLogMap = null != driverOnRouteDetailLogs && !driverOnRouteDetailLogs.isEmpty() ?
+                driverOnRouteDetailLogs.stream().collect(Collectors.groupingBy(DriverOnRouteDetailLog::getAreaStaffId)) : new HashMap<>();
+
+
         Map<Long, DriverGoodsLossIntervalVo> result = new HashMap<>();
         for (Long areaStaffId : areaStaffIds) {
             DriverOnRouteAccountRecordMain driverOnRouteAccountRecordMain = driverOnRouteAccountRecordMainMap.get(areaStaffId);
 
+            List<DriverOnRouteAccountRecordDetail> driverOnRouteAccountRecordDetailList = new ArrayList<>();
+            if (null != driverOnRouteAccountRecordMain) {
+                driverOnRouteAccountRecordDetailList = driverOnRouteAccountRecordDetailMap.get(driverOnRouteAccountRecordMain.getId());
+            }
+
             // 司机货损统计记录表
             List<DriverGoodsLossRecord> driverGoodsLossRecordList = areaStaffDriverGoodsLossRecordMap.get(areaStaffId);
             // 司机设备货损统计记录表
             List<DriverEquipmentLossRecord> driverEquipmentLossRecordList = areaStaffDriverEquipmentLossRecordMap.get(areaStaffId);
+            // 司机货损统计未补货快照
+            List<DriverGoodsLossStatUnReplenishSnapshot> driverGoodsLossStatUnReplenishSnapshotList = areaStaffDriverGoodsLossStatUnReplenishSnapshotMap.get(areaStaffId);
+
+            // 司机货损统计未补货明细列表
+            List<ReplenishOrderDetail> unReplenishOrderDetailList = new ArrayList<>();
+            if (null != driverGoodsLossStatUnReplenishSnapshotList && !driverGoodsLossStatUnReplenishSnapshotList.isEmpty()) {
+                for (DriverGoodsLossStatUnReplenishSnapshot driverGoodsLossStatUnReplenishSnapshot : driverGoodsLossStatUnReplenishSnapshotList) {
+                    List<ReplenishOrderDetail> replenishOrderDetails = unReplenishOrderDetailMap.get(driverGoodsLossStatUnReplenishSnapshot.getUnReplenishOrderNumber());
+                    if (null != replenishOrderDetails && !replenishOrderDetails.isEmpty()) {
+                        unReplenishOrderDetailList.addAll(replenishOrderDetails);
+                    }
+                }
+            }
+
 
             // 上一次的司机货损统计记录表
             DriverGoodsLossIntervalDetail lastDriverGoodsLossIntervalDetail = lastDriverGoodsLossIntervalDetailMap.get(areaStaffId);
             // 上一次的司机设备货损统计记录表
             EquipmentLossIntervalDetail lastEquipmentLossIntervalDetail = lastEquipmentLossIntervalDetailMap.get(areaStaffId);
 
-            // 生成司机货损统计
-            DriverGoodsLossIntervalDetail driverGoodsLossIntervalDetail = new DriverGoodsLossIntervalDetail();
-            driverGoodsLossIntervalDetail.setAreaStaffId(areaStaffId);
-            buildDriverGoodsLossRecord(driverGoodsLossIntervalDetail, lastDriverGoodsLossIntervalDetail, driverGoodsLossRecordList, driverOnRouteAccountRecordMain);
-
-            // 生成设备货损统计
-            EquipmentLossIntervalDetail equipmentLossIntervalDetail = new EquipmentLossIntervalDetail();
-            equipmentLossIntervalDetail.setAreaStaffId(areaStaffId);
-            buildDriverEquipmentLossRecord(equipmentLossIntervalDetail, lastEquipmentLossIntervalDetail, driverEquipmentLossRecordList);
+            // 司机商品货损明细日志
+            List<DriverOnRouteDetailLog> areaStaffDriverOnRouteDetailLogList = driverOnRouteDetailLogMap.get(areaStaffId);
+
+            // 构建设司机货损统计数据
+            DriverGoodsLossIntervalDetail driverGoodsLossIntervalDetail = buildDriverGoodsLossRecord(
+                    areaStaffId,
+                    lastDriverGoodsLossIntervalDetail,
+                    driverGoodsLossRecordList,
+                    driverOnRouteAccountRecordMain,
+                    driverGoodsLossStatUnReplenishSnapshotList
+            );
+
+            // 构建司机盈亏数据
+            List<DriverGoodsLossStatProfitLossDetail> driverGoodsLossStatProfitLossDetails = buildDriverGoodsLossStatProfitLossDetail(
+                    areaStaffId,
+                    areaStaffDriverOnRouteDetailLogList,
+                    driverOnRouteAccountRecordDetailList,
+                    unReplenishOrderDetailList
+            );
+
+            // 构建设备货损统计数据
+            EquipmentLossIntervalDetail equipmentLossIntervalDetail = buildDriverEquipmentLossRecord(
+                    areaStaffId,
+                    lastEquipmentLossIntervalDetail,
+                    driverEquipmentLossRecordList
+            );
 
             // 响应视图
-            DriverGoodsLossIntervalVo driverGoodsLossIntervalVo = buildGoodsLossIntervalVo(driverGoodsLossIntervalDetail, equipmentLossIntervalDetail, driverOnRouteAccountRecordMain);
+            DriverGoodsLossIntervalVo driverGoodsLossIntervalVo = buildGoodsLossIntervalVo(
+                    driverGoodsLossIntervalDetail,
+                    equipmentLossIntervalDetail,
+                    driverGoodsLossStatProfitLossDetails,
+                    driverOnRouteAccountRecordMain
+            );
             result.put(areaStaffId, driverGoodsLossIntervalVo);
         }
         return result;
     }
 
     /**
-     * 构建司机货损区间统计视图
-     *
-     * @param driverGoodsLossIntervalDetail 货损统计数据
-     * @param equipmentLossIntervalDetail 设备货损统计数据
-     * @param driverOnRouteAccountRecordMain 区域员工账户统计数据
-     * @return 货损区间统计视图
-     */
-    @NotNull
-    private static DriverGoodsLossIntervalVo buildGoodsLossIntervalVo(DriverGoodsLossIntervalDetail driverGoodsLossIntervalDetail, EquipmentLossIntervalDetail equipmentLossIntervalDetail, DriverOnRouteAccountRecordMain driverOnRouteAccountRecordMain) {
-        DriverGoodsLossIntervalVo driverGoodsLossIntervalVo = new DriverGoodsLossIntervalVo();
-        driverGoodsLossIntervalVo.setDriverGoodsLossIntervalDetail(driverGoodsLossIntervalDetail);
-        driverGoodsLossIntervalVo.setEquipmentLossIntervalDetail(equipmentLossIntervalDetail);
-        if (null != driverOnRouteAccountRecordMain) {
-            driverGoodsLossIntervalVo.setUseDriverOnRouteAccountRecordMainId(driverOnRouteAccountRecordMain.getId());
-        }
-        return driverGoodsLossIntervalVo;
-    }
-
-    /**
      * 构建司机货损统计数据
      *
-     * @param driverGoodsLossIntervalDetail 货损统计数据
+     * @param areaStaffId 司机id
      * @param lastDriverGoodsLossIntervalDetail 上一次的货损统计数据
      * @param driverGoodsLossRecordList 货损统计数据
      * @param driverOnRouteAccountRecordMain 司机在途核算数据
+     * @param driverGoodsLossStatUnReplenishSnapshotList 司机未补货快照
      */
-    private void buildDriverGoodsLossRecord(DriverGoodsLossIntervalDetail driverGoodsLossIntervalDetail,
-                                            DriverGoodsLossIntervalDetail lastDriverGoodsLossIntervalDetail,
-                                            List<DriverGoodsLossRecord> driverGoodsLossRecordList,
-                                            DriverOnRouteAccountRecordMain driverOnRouteAccountRecordMain) {
-        Long lastRemainingOnRouteStock = 0L;
+    private DriverGoodsLossIntervalDetail buildDriverGoodsLossRecord(
+            Long areaStaffId,
+            DriverGoodsLossIntervalDetail lastDriverGoodsLossIntervalDetail,
+            List<DriverGoodsLossRecord> driverGoodsLossRecordList,
+            DriverOnRouteAccountRecordMain driverOnRouteAccountRecordMain,
+            List<DriverGoodsLossStatUnReplenishSnapshot> driverGoodsLossStatUnReplenishSnapshotList
+    ) {
+        DriverGoodsLossIntervalDetail driverGoodsLossIntervalDetail = new DriverGoodsLossIntervalDetail();
+        driverGoodsLossIntervalDetail.setAreaStaffId(areaStaffId);
+
+
+        long lastRemainingOnRouteStock = 0L;
         if (null != lastDriverGoodsLossIntervalDetail) {
-            if (BoolEnum.isYes(lastDriverGoodsLossIntervalDetail.getUseVerifyNum())) {
-                lastRemainingOnRouteStock = lastDriverGoodsLossIntervalDetail.getWholeVerifyNum();
-            } else {
-                lastRemainingOnRouteStock = lastDriverGoodsLossIntervalDetail.getRemainingUnReplenishedNum();
-            }
+            // 上次剩余在途库存数 = 上次未补数 + 上次整件核数
+            lastRemainingOnRouteStock = lastDriverGoodsLossIntervalDetail.getRemainingUnReplenishedNum() + lastDriverGoodsLossIntervalDetail.getWholeVerifyNum();
         }
 
         // 上一次剩余在途库存数
@@ -315,14 +440,13 @@ public class DriverGoodsLossIntervalServiceImpl implements DriverGoodsLossInterv
         // 整件单核数
         driverGoodsLossIntervalDetail.setWholeVerifyNum(wholeVerifyNum);
 
-        Long pickingOrderCreateNum = 0L; // 拣货单开单数
-        Long wholeOrderCreateNum = 0L; // 整件单开单数
-        Long unshippedCancelNum = 0L; // 未出库取消数
-        Long shippedCancelNum = 0L; // 已出库取消数
-        Long replenishNum = 0L; // 补货数
-        Long returnWarehouseNum = 0L; // 回仓数
-        Long remainingUnReplenishedNum = 0L; // 当日在途数
-
+        long pickingOrderCreateNum = 0L; // 拣货单开单数
+        long wholeOrderCreateNum = 0L; // 整件单开单数
+        long unshippedCancelNum = 0L; // 未出库取消数
+        long shippedCancelNum = 0L; // 已出库取消数
+        long replenishNum = 0L; // 补货数
+        long returnWarehouseNum = 0L; // 回仓数
+        long remainingUnReplenishedNum = 0L; // 剩余未补货数
 
         if (null != driverGoodsLossRecordList && !driverGoodsLossRecordList.isEmpty()) {
             for (DriverGoodsLossRecord driverGoodsLossRecord : driverGoodsLossRecordList) {
@@ -333,21 +457,17 @@ public class DriverGoodsLossIntervalServiceImpl implements DriverGoodsLossInterv
                 replenishNum += driverGoodsLossRecord.getReplenishNum();
                 returnWarehouseNum += driverGoodsLossRecord.getReturnWarehouseNum();
             }
-
-            // 获取 driverGoodsLossRecordList 中 id 最大 driverGoodsLossRecord 对象
-            DriverGoodsLossRecord driverGoodsLossRecord = driverGoodsLossRecordList.stream().max(Comparator.comparing(DriverGoodsLossRecord::getId)).get();
-            if (BoolEnum.isYes(driverGoodsLossRecord.getUseVerified())) {
-                remainingUnReplenishedNum = driverGoodsLossRecord.getVerifiedNum();
-            } else {
-                remainingUnReplenishedNum = driverGoodsLossRecord.getCurrentOnRouteNum();
-            }
+        }
+        // 合计剩余未补货数
+        if (null != driverGoodsLossStatUnReplenishSnapshotList && !driverGoodsLossStatUnReplenishSnapshotList.isEmpty()) {
+            remainingUnReplenishedNum = driverGoodsLossStatUnReplenishSnapshotList.stream().mapToLong(DriverGoodsLossStatUnReplenishSnapshot::getUnReplenishedNum).sum();
         }
 
-        // 理论剩余未补
-        Long onRouteStock = lastRemainingOnRouteStock + pickingOrderCreateNum + wholeOrderCreateNum - unshippedCancelNum - replenishNum - returnWarehouseNum;
+        // 在途库存数 = 上次剩余在途库存数 + 拣货单开单数 + 整件单开单数 - 未出库取消数 - 补货数 - 回仓数
+        long onRouteStock = lastRemainingOnRouteStock + pickingOrderCreateNum + wholeOrderCreateNum - unshippedCancelNum - replenishNum - returnWarehouseNum;
 
-        // 盈亏数
-        Long profitLossNum = onRouteStock - wholeVerifyNum;
+        // 盈亏数 = 在途 - 核实数
+        long profitLossNum = onRouteStock - remainingUnReplenishedNum - wholeVerifyNum;
 
         driverGoodsLossIntervalDetail.setPickingOrderCreateNum(pickingOrderCreateNum);
         driverGoodsLossIntervalDetail.setWholeOrderCreateNum(wholeOrderCreateNum);
@@ -358,19 +478,83 @@ public class DriverGoodsLossIntervalServiceImpl implements DriverGoodsLossInterv
         driverGoodsLossIntervalDetail.setRemainingUnReplenishedNum(remainingUnReplenishedNum);
         driverGoodsLossIntervalDetail.setOnRouteStock(onRouteStock);
         driverGoodsLossIntervalDetail.setProfitLossNum(profitLossNum);
+        return driverGoodsLossIntervalDetail;
+    }
+
+    /**
+     * 构建司机货损盈亏统计数据明细
+     * @param areaStaffId 司机id
+     * @param areaStaffDriverOnRouteDetailLogList 司机在途明细日志
+     * @param driverOnRouteAccountRecordDetailList 司机在途核算明细
+     * @param unReplenishDetails 司机未补货明细列表
+     * @return 司机区间货损盈亏数据明细
+     */
+    private List<DriverGoodsLossStatProfitLossDetail> buildDriverGoodsLossStatProfitLossDetail(
+            Long areaStaffId,
+            List<DriverOnRouteDetailLog> areaStaffDriverOnRouteDetailLogList,
+            List<DriverOnRouteAccountRecordDetail> driverOnRouteAccountRecordDetailList,
+            List<ReplenishOrderDetail> unReplenishDetails
+    ) {
+        Set<Integer> goodsIds = new HashSet<>();
+
+        Map<Integer, List<DriverOnRouteDetailLog>> areaStaffDriverOnRouteDetailLogMapByGoodsId = areaStaffDriverOnRouteDetailLogList.stream().collect(Collectors.groupingBy(DriverOnRouteDetailLog::getGoodsId));
+        Map<Integer, List<DriverOnRouteAccountRecordDetail>> driverOnRouteAccountRecordDetailMapByGoodsId = driverOnRouteAccountRecordDetailList.stream().collect(Collectors.groupingBy(DriverOnRouteAccountRecordDetail::getGoodsId));
+        Map<Integer, List<ReplenishOrderDetail>> unReplenishDetailMapByGoodsId = unReplenishDetails.stream().collect(Collectors.groupingBy(ReplenishOrderDetail::getGoodsId));
+
+        goodsIds.addAll(areaStaffDriverOnRouteDetailLogMapByGoodsId.keySet());
+        goodsIds.addAll(driverOnRouteAccountRecordDetailMapByGoodsId.keySet());
+        goodsIds.addAll(unReplenishDetailMapByGoodsId.keySet());
+
+        List<DriverGoodsLossStatProfitLossDetail> driverGoodsLossStatProfitLossDetailList = new ArrayList<>();
+
+        for (Integer goodsId : goodsIds) {
+            DriverGoodsLossStatProfitLossDetail driverGoodsLossStatProfitLossDetail = new DriverGoodsLossStatProfitLossDetail();
+            driverGoodsLossStatProfitLossDetail.setAreaStaffId(areaStaffId);
+            driverGoodsLossStatProfitLossDetail.setGoodsId(goodsId);
+
+            long onRouteInventoryNum = 0L; // 在途库存数
+            long verifiedNum = 0L; // 核实数
+            long unReplenishedNum = 0L; // 未补货数
+
+            // 司机商品在途明细日志 - 昨日理论商品在途
+            List<DriverOnRouteDetailLog> driverOnRouteDetailLogs = areaStaffDriverOnRouteDetailLogMapByGoodsId.get(goodsId);
+            if (null != driverOnRouteDetailLogs && !driverOnRouteDetailLogs.isEmpty()) {
+                onRouteInventoryNum = driverOnRouteDetailLogs.stream().mapToLong(DriverOnRouteDetailLog::getTodayStockNum).sum();
+            }
+            // 司机商品在途核实数明细 - 实际商品在途核算
+            List<DriverOnRouteAccountRecordDetail> driverOnRouteAccountRecordDetails = driverOnRouteAccountRecordDetailMapByGoodsId.get(goodsId);
+            if (null != driverOnRouteAccountRecordDetails && !driverOnRouteAccountRecordDetails.isEmpty()) {
+                verifiedNum = driverOnRouteAccountRecordDetails.stream().mapToLong(DriverOnRouteAccountRecordDetail::getInventory).sum();
+            }
+            // 司机商品未补货商品明细
+            List<ReplenishOrderDetail> driverGoodsLossStatUnReplenishSnapshots = unReplenishDetailMapByGoodsId.get(goodsId);
+            if (null != driverGoodsLossStatUnReplenishSnapshots && !driverGoodsLossStatUnReplenishSnapshots.isEmpty()) {
+                unReplenishedNum = driverGoodsLossStatUnReplenishSnapshots.stream().mapToLong(ReplenishOrderDetail::getPickingNumber).sum();
+            }
+            // 盈亏数 = 在途库存数 - 核实数 - 未补货数
+            long profitLossNum = onRouteInventoryNum - verifiedNum - unReplenishedNum;
+
+            driverGoodsLossStatProfitLossDetail.setOnRouteInventoryNum(onRouteInventoryNum);
+            driverGoodsLossStatProfitLossDetail.setVerifiedNum(verifiedNum);
+            driverGoodsLossStatProfitLossDetail.setUnReplenishedNum(unReplenishedNum);
+            driverGoodsLossStatProfitLossDetail.setProfitLossNum(profitLossNum);
+            driverGoodsLossStatProfitLossDetailList.add(driverGoodsLossStatProfitLossDetail);
+        }
+        return driverGoodsLossStatProfitLossDetailList;
     }
 
     /**
      * 构建司机设备货损统计数据
      *
-     * @param equipmentLossIntervalDetail 设备货损统计数据
+     * @param areaStaffId 司机id
      * @param lastEquipmentLossIntervalDetail 上次设备货损统计数据
      * @param driverEquipmentLossRecordList 设备货损统计数据
      */
-    private void buildDriverEquipmentLossRecord(EquipmentLossIntervalDetail equipmentLossIntervalDetail,
+    private EquipmentLossIntervalDetail buildDriverEquipmentLossRecord(Long areaStaffId,
                                                 EquipmentLossIntervalDetail lastEquipmentLossIntervalDetail,
                                                 List<DriverEquipmentLossRecord> driverEquipmentLossRecordList) {
-
+        EquipmentLossIntervalDetail equipmentLossIntervalDetail = new EquipmentLossIntervalDetail();
+        equipmentLossIntervalDetail.setAreaStaffId(areaStaffId);
         Long lastRemainingEquipmentStock = 0L; // 上次剩余设备库存
         if (null != lastEquipmentLossIntervalDetail) {
             lastRemainingEquipmentStock = lastEquipmentLossIntervalDetail.getActualStockNum();
@@ -398,6 +582,8 @@ public class DriverGoodsLossIntervalServiceImpl implements DriverGoodsLossInterv
         equipmentLossIntervalDetail.setTheoreticalStockNum(theoreticalStockNum);
         equipmentLossIntervalDetail.setActualStockNum(actualStockNum);
         equipmentLossIntervalDetail.setProfitLossNum(actualStockNum - theoreticalStockNum);
+
+        return equipmentLossIntervalDetail;
     }
 
     public String checkStockTakingType(List<Long> areaStaffIds, List<Long> operatorAreaStaffIds) {