|
|
@@ -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) {
|