|
|
@@ -0,0 +1,373 @@
|
|
|
+package com.yr.warehouse.admin.service.driver.impl;
|
|
|
+
|
|
|
+import com.supplychain.api.response.areastaff.AreaStaffResponse;
|
|
|
+import com.yr.bluecat.common.entity.exception.MessageException;
|
|
|
+import com.yr.warehouse.admin.common.menu.BoolEnum;
|
|
|
+import com.yr.warehouse.admin.component.areastaff.AreaStaffComponent;
|
|
|
+import com.yr.warehouse.admin.component.auth.OperatorComponent;
|
|
|
+import com.yr.warehouse.admin.component.auth.vo.OrgOperatorVo;
|
|
|
+import com.yr.warehouse.admin.driver.bo.DriverIntervalCargoDamageGeneratorBo;
|
|
|
+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.service.driver.DriverGoodsLossIntervalService;
|
|
|
+import jakarta.annotation.Resource;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.support.TransactionTemplate;
|
|
|
+
|
|
|
+import java.util.*;
|
|
|
+import java.util.function.Function;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 司机区间货损服务接口实现
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class DriverGoodsLossIntervalServiceImpl implements DriverGoodsLossIntervalService {
|
|
|
+ @Resource
|
|
|
+ private AreaStaffComponent areaStaffComponent;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private OperatorComponent operatorComponent;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private DriverGoodsLossRecordMapper driverGoodsLossRecordMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private DriverEquipmentLossRecordMapper driverEquipmentLossRecordMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private DriverGoodsLossIntervalMainMapper driverGoodsLossIntervalMainMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private DriverOnRouteAccountRecordMainMapper driverOnRouteAccountRecordMainMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private DriverGoodsLossIntervalDetailMapper driverGoodsLossIntervalDetailMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private EquipmentLossIntervalDetailMapper equipmentLossIntervalDetailMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private TransactionTemplate transactionTemplate;
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void generator(DriverIntervalCargoDamageGeneratorBo bo) {
|
|
|
+ // 获取当前运营商下所有司机
|
|
|
+ List<AreaStaffResponse> areaStaffResponses = areaStaffComponent.searchByOperatorId(bo.getOperatorId());
|
|
|
+ if (null == areaStaffResponses || areaStaffResponses.isEmpty()) {
|
|
|
+ throw new MessageException("当前运营商下没有司机");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取当前运营商id链
|
|
|
+ OrgOperatorVo orgOperatorVo = operatorComponent.queryOperatorById(bo.getOperatorId());
|
|
|
+
|
|
|
+ List<Long> operatorAreaStaffIds = areaStaffResponses.stream().map(AreaStaffResponse::getId).collect(Collectors.toList());
|
|
|
+ // 基于参数中运营商司机id列表及运营商实际司机id列表进行校验,判断当前生成逻辑是定期货损统计还是抽查货损统计
|
|
|
+ String stockTakingType = checkStockTakingType(bo.getAreaStaffIds(), operatorAreaStaffIds);
|
|
|
+
|
|
|
+ // 如果是定期货损统计, 则将参数中司机id列表设置为运营商实际司机id列表
|
|
|
+ if (DriverGoodsLossIntervalStockTakingType.REGULAR.name().equals(stockTakingType)) {
|
|
|
+ bo.setAreaStaffIds(operatorAreaStaffIds);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取上一次司机的货损统计记录
|
|
|
+ DriverGoodsLossIntervalMain lastDriverGoodsLossIntervalMain = driverGoodsLossIntervalMainMapper.queryLastByOperatorId(bo.getOperatorId());
|
|
|
+ List<DriverGoodsLossIntervalDetail> lastDriverGoodsLossIntervalDetails = null;
|
|
|
+ List<EquipmentLossIntervalDetail> lastEquipmentLossIntervalDetails = null;
|
|
|
+ if (null != lastDriverGoodsLossIntervalMain) {
|
|
|
+ lastDriverGoodsLossIntervalDetails = driverGoodsLossIntervalDetailMapper.selectByMainIdAndAreaStaffId(lastDriverGoodsLossIntervalMain.getId(), bo.getAreaStaffIds());
|
|
|
+ lastEquipmentLossIntervalDetails = equipmentLossIntervalDetailMapper.selectByMainIdAndAreaStaffId(lastDriverGoodsLossIntervalMain.getId(), bo.getAreaStaffIds());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取当前司机下所有未核算的核算记录主表
|
|
|
+ List<DriverOnRouteAccountRecordMain> driverOnRouteAccountRecordMains = driverOnRouteAccountRecordMainMapper.selectUnVerified(bo.getAreaStaffIds());
|
|
|
+ Map<Long, DriverOnRouteAccountRecordMain> driverOnRouteAccountRecordMainMap = driverOnRouteAccountRecordMains.stream().collect(Collectors.toMap(DriverOnRouteAccountRecordMain::getAreaStaffId, Function.identity()));
|
|
|
+
|
|
|
+ // 基于开始时间及结束时间抽取这段时间内每日统计的司机货损记录及设备货损记录
|
|
|
+ List<DriverGoodsLossRecord> driverGoodsLossRecords = driverGoodsLossRecordMapper.searchGeneratorParam(bo);
|
|
|
+ List<DriverEquipmentLossRecord> driverEquipmentLossRecords = driverEquipmentLossRecordMapper.searchGeneratorParam(bo);
|
|
|
+
|
|
|
+ // 基于司机货损记录及设备货损记录生成司机对应的货损统计记录
|
|
|
+ Map<Long, DriverGoodsLossIntervalVo> driverGoodsLossIntervalDetailMap = generatorDriverGoodsLossIntervalDetailMap(bo.getAreaStaffIds(),
|
|
|
+ driverOnRouteAccountRecordMainMap,
|
|
|
+ driverGoodsLossRecords,
|
|
|
+ driverEquipmentLossRecords,
|
|
|
+ lastDriverGoodsLossIntervalDetails,
|
|
|
+ lastEquipmentLossIntervalDetails);
|
|
|
+
|
|
|
+ List<DriverGoodsLossIntervalDetail> driverGoodsLossIntervalDetails = new ArrayList<>();
|
|
|
+ List<EquipmentLossIntervalDetail> equipmentLossIntervalDetails = new ArrayList<>();
|
|
|
+
|
|
|
+ DriverGoodsLossIntervalMain driverGoodsLossIntervalMain = new DriverGoodsLossIntervalMain();
|
|
|
+ driverGoodsLossIntervalMain.setIntervalStartTime(bo.getIntervalStartTime());
|
|
|
+ driverGoodsLossIntervalMain.setIntervalEndTime(bo.getIntervalEndTime());
|
|
|
+ driverGoodsLossIntervalMain.setOperatorId(bo.getOperatorId());
|
|
|
+ driverGoodsLossIntervalMain.setOperatorChain(orgOperatorVo.getOperatorChain());
|
|
|
+ driverGoodsLossIntervalMain.setStockTakingType(stockTakingType);
|
|
|
+ long pickingOrderCreateNum = 0L; // 拣货单创建数
|
|
|
+ long wholeOrderCreateNum = 0L; // 整单创建数
|
|
|
+ long replenishNum = 0L; // 补货数
|
|
|
+ long returnWarehouseNum = 0L; // 回仓数
|
|
|
+ long onRouteInventoryNum = 0L; // 在途库存数
|
|
|
+ long unshippedCancelNum = 0L; // 未出库取消数
|
|
|
+ long shippedCancelNum = 0L; // 已出库取消数
|
|
|
+ long unReplenishedNum = 0L; // 未补货数
|
|
|
+ long driverProfitLossNum = 0L; // 司机货损数
|
|
|
+ long equipmentProfitLossNum = 0L; // 设备货损数
|
|
|
+ long totalProfitLossNum = 0L; // 总货损数
|
|
|
+
|
|
|
+ List<Long> useDriverOnRouteAccountRecordMains = new ArrayList<>();
|
|
|
+
|
|
|
+ for (Long areaStaffId : driverGoodsLossIntervalDetailMap.keySet()) {
|
|
|
+ DriverGoodsLossIntervalVo driverGoodsLossIntervalVo = driverGoodsLossIntervalDetailMap.get(areaStaffId);
|
|
|
+
|
|
|
+ if (null != driverGoodsLossIntervalVo) {
|
|
|
+ DriverGoodsLossIntervalDetail driverGoodsLossIntervalDetail = driverGoodsLossIntervalVo.getDriverGoodsLossIntervalDetail();
|
|
|
+ if (null != driverGoodsLossIntervalDetail) {
|
|
|
+ driverGoodsLossIntervalDetails.add(driverGoodsLossIntervalDetail);
|
|
|
+ pickingOrderCreateNum += driverGoodsLossIntervalDetail.getPickingOrderCreateNum();
|
|
|
+ wholeOrderCreateNum += driverGoodsLossIntervalDetail.getWholeOrderCreateNum();
|
|
|
+ replenishNum += driverGoodsLossIntervalDetail.getReplenishNum();
|
|
|
+ returnWarehouseNum += driverGoodsLossIntervalDetail.getReturnWarehouseNum();
|
|
|
+ onRouteInventoryNum += driverGoodsLossIntervalDetail.getLastRemainingOnRouteStock();
|
|
|
+ unshippedCancelNum += driverGoodsLossIntervalDetail.getUnshippedCancelNum();
|
|
|
+ shippedCancelNum += driverGoodsLossIntervalDetail.getShippedCancelNum();
|
|
|
+ unReplenishedNum += driverGoodsLossIntervalDetail.getRemainingUnReplenishedNum();
|
|
|
+ driverProfitLossNum += driverGoodsLossIntervalDetail.getProfitLossNum();
|
|
|
+ }
|
|
|
+ EquipmentLossIntervalDetail equipmentLossIntervalDetail = driverGoodsLossIntervalVo.getEquipmentLossIntervalDetail();
|
|
|
+ if (null != equipmentLossIntervalDetail) {
|
|
|
+ equipmentLossIntervalDetails.add(equipmentLossIntervalDetail);
|
|
|
+ equipmentProfitLossNum += equipmentLossIntervalDetail.getProfitLossNum();
|
|
|
+ }
|
|
|
+
|
|
|
+ totalProfitLossNum = driverProfitLossNum + equipmentProfitLossNum;
|
|
|
+
|
|
|
+ if (null != driverGoodsLossIntervalVo.getUseDriverOnRouteAccountRecordMainId()) {
|
|
|
+ useDriverOnRouteAccountRecordMains.add(driverGoodsLossIntervalVo.getUseDriverOnRouteAccountRecordMainId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ driverGoodsLossIntervalMain.setPickingOrderCreateNum(pickingOrderCreateNum);
|
|
|
+ driverGoodsLossIntervalMain.setWholeOrderCreateNum(wholeOrderCreateNum);
|
|
|
+ driverGoodsLossIntervalMain.setReplenishNum(replenishNum);
|
|
|
+ driverGoodsLossIntervalMain.setReturnWarehouseNum(returnWarehouseNum);
|
|
|
+ driverGoodsLossIntervalMain.setOnRouteInventoryNum(onRouteInventoryNum);
|
|
|
+ driverGoodsLossIntervalMain.setUnshippedCancelNum(unshippedCancelNum);
|
|
|
+ driverGoodsLossIntervalMain.setShippedCancelNum(shippedCancelNum);
|
|
|
+ driverGoodsLossIntervalMain.setUnReplenishedNum(unReplenishedNum);
|
|
|
+ driverGoodsLossIntervalMain.setDriverProfitLossNum(driverProfitLossNum);
|
|
|
+ driverGoodsLossIntervalMain.setEquipmentProfitLossNum(equipmentProfitLossNum);
|
|
|
+ driverGoodsLossIntervalMain.setTotalProfitLossNum(totalProfitLossNum);
|
|
|
+
|
|
|
+ transactionTemplate.execute(status -> {
|
|
|
+ driverGoodsLossIntervalMainMapper.insert(driverGoodsLossIntervalMain);
|
|
|
+
|
|
|
+ driverGoodsLossIntervalDetailMapper.insertBatch(driverGoodsLossIntervalMain.getId(), driverGoodsLossIntervalDetails);
|
|
|
+ equipmentLossIntervalDetailMapper.insertBatch(driverGoodsLossIntervalMain.getId(), equipmentLossIntervalDetails);
|
|
|
+ driverOnRouteAccountRecordMainMapper.batchBind(bo, useDriverOnRouteAccountRecordMains, driverGoodsLossIntervalMain.getId());
|
|
|
+ return null;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成司机货损统计数据
|
|
|
+ *
|
|
|
+ * @param driverGoodsLossRecords 司机货损统计
|
|
|
+ * @param driverEquipmentLossRecords 设备货损统计
|
|
|
+ * @param lastDriverGoodsLossIntervalDetails 上一次的司机货损统计
|
|
|
+ * @param lastEquipmentLossIntervalDetails 上一次的设备货损统计
|
|
|
+ * @return 司机对应的区间货损统计Map
|
|
|
+ */
|
|
|
+ private Map<Long, DriverGoodsLossIntervalVo> generatorDriverGoodsLossIntervalDetailMap(List<Long> areaStaffIds,
|
|
|
+ Map<Long, DriverOnRouteAccountRecordMain> driverOnRouteAccountRecordMainMap,
|
|
|
+ List<DriverGoodsLossRecord> driverGoodsLossRecords,
|
|
|
+ List<DriverEquipmentLossRecord> driverEquipmentLossRecords,
|
|
|
+ List<DriverGoodsLossIntervalDetail> lastDriverGoodsLossIntervalDetails,
|
|
|
+ List<EquipmentLossIntervalDetail> lastEquipmentLossIntervalDetails) {
|
|
|
+ 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, 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, DriverGoodsLossIntervalVo> result = new HashMap<>();
|
|
|
+ for (Long areaStaffId : areaStaffIds) {
|
|
|
+ DriverOnRouteAccountRecordMain driverOnRouteAccountRecordMain = driverOnRouteAccountRecordMainMap.get(areaStaffId);
|
|
|
+
|
|
|
+
|
|
|
+ List<DriverGoodsLossRecord> driverGoodsLossRecordList = areaStaffDriverGoodsLossRecordMap.get(areaStaffId);
|
|
|
+ List<DriverEquipmentLossRecord> driverEquipmentLossRecordList = areaStaffDriverEquipmentLossRecordMap.get(areaStaffId);
|
|
|
+
|
|
|
+ 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);
|
|
|
+
|
|
|
+ DriverGoodsLossIntervalVo driverGoodsLossIntervalVo = new DriverGoodsLossIntervalVo();
|
|
|
+ driverGoodsLossIntervalVo.setDriverGoodsLossIntervalDetail(driverGoodsLossIntervalDetail);
|
|
|
+ driverGoodsLossIntervalVo.setEquipmentLossIntervalDetail(equipmentLossIntervalDetail);
|
|
|
+ if (null !=driverOnRouteAccountRecordMain) {
|
|
|
+ driverGoodsLossIntervalVo.setUseDriverOnRouteAccountRecordMainId(driverOnRouteAccountRecordMain.getId());
|
|
|
+ }
|
|
|
+
|
|
|
+ result.put(areaStaffId, driverGoodsLossIntervalVo);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建司机货损统计数据
|
|
|
+ *
|
|
|
+ * @param driverGoodsLossIntervalDetail 货损统计数据
|
|
|
+ * @param lastDriverGoodsLossIntervalDetail 上一次的货损统计数据
|
|
|
+ * @param driverGoodsLossRecordList 货损统计数据
|
|
|
+ * @param driverOnRouteAccountRecordMain 司机在途核算数据
|
|
|
+ */
|
|
|
+ private void buildDriverGoodsLossRecord(DriverGoodsLossIntervalDetail driverGoodsLossIntervalDetail,
|
|
|
+ DriverGoodsLossIntervalDetail lastDriverGoodsLossIntervalDetail,
|
|
|
+ List<DriverGoodsLossRecord> driverGoodsLossRecordList,
|
|
|
+ DriverOnRouteAccountRecordMain driverOnRouteAccountRecordMain) {
|
|
|
+ Long lastRemainingOnRouteStock = 0L;
|
|
|
+ if (null != lastDriverGoodsLossIntervalDetail) {
|
|
|
+ if (BoolEnum.isYes(lastDriverGoodsLossIntervalDetail.getUseVerifyNum())) {
|
|
|
+ lastRemainingOnRouteStock = lastDriverGoodsLossIntervalDetail.getWholeVerifyNum();
|
|
|
+ } else {
|
|
|
+ lastRemainingOnRouteStock = lastDriverGoodsLossIntervalDetail.getRemainingUnReplenishedNum();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 上一次剩余在途库存数
|
|
|
+ driverGoodsLossIntervalDetail.setLastRemainingOnRouteStock(lastRemainingOnRouteStock);
|
|
|
+ // 是否核算
|
|
|
+ String useVerifyNum = BoolEnum.NO.name();
|
|
|
+ // 核算数
|
|
|
+ Long wholeVerifyNum = 0L;
|
|
|
+
|
|
|
+ if (null != driverOnRouteAccountRecordMain) {
|
|
|
+ useVerifyNum = BoolEnum.YES.name();
|
|
|
+ wholeVerifyNum = driverOnRouteAccountRecordMain.getStatTotalNum();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 是否使用整件核数
|
|
|
+ driverGoodsLossIntervalDetail.setUseVerifyNum(useVerifyNum);
|
|
|
+ // 整件单核数
|
|
|
+ driverGoodsLossIntervalDetail.setWholeVerifyNum(wholeVerifyNum);
|
|
|
+
|
|
|
+ Long pickingOrderCreateNum = 0L; // 拣货单开单数
|
|
|
+ Long wholeOrderCreateNum = 0L; // 整件单开单数
|
|
|
+ Long unshippedCancelNum = 0L; // 未出库取消数
|
|
|
+ Long shippedCancelNum = 0L; // 已出库取消数
|
|
|
+ Long replenishNum = 0L; // 补货数
|
|
|
+ Long returnWarehouseNum = 0L; // 回仓数
|
|
|
+ Long onRouteStock = 0L; // 当日在途数
|
|
|
+
|
|
|
+
|
|
|
+ if (null != driverGoodsLossRecordList && !driverGoodsLossRecordList.isEmpty()) {
|
|
|
+ for (DriverGoodsLossRecord driverGoodsLossRecord : driverGoodsLossRecordList) {
|
|
|
+ pickingOrderCreateNum += driverGoodsLossRecord.getPickingOrderCreateNum();
|
|
|
+ wholeOrderCreateNum += driverGoodsLossRecord.getWholeOrderCreateNum();
|
|
|
+ unshippedCancelNum += driverGoodsLossRecord.getUnshippedCancelNum();
|
|
|
+ shippedCancelNum += driverGoodsLossRecord.getShippedCancelNum();
|
|
|
+ replenishNum += driverGoodsLossRecord.getReplenishNum();
|
|
|
+ returnWarehouseNum += driverGoodsLossRecord.getReturnWarehouseNum();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取 driverGoodsLossRecordList 中 id 最大 driverGoodsLossRecord 对象
|
|
|
+ DriverGoodsLossRecord driverGoodsLossRecord = driverGoodsLossRecordList.stream().max(Comparator.comparing(DriverGoodsLossRecord::getId)).get();
|
|
|
+ if (BoolEnum.isYes(driverGoodsLossRecord.getUseVerified())) {
|
|
|
+ onRouteStock = driverGoodsLossRecord.getVerifiedNum();
|
|
|
+ } else {
|
|
|
+ onRouteStock = driverGoodsLossRecord.getCurrentOnRouteNum();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 理论剩余未补数
|
|
|
+ Long remainingUnReplenishedNum = lastRemainingOnRouteStock + pickingOrderCreateNum + wholeOrderCreateNum - unshippedCancelNum - replenishNum - returnWarehouseNum;
|
|
|
+
|
|
|
+ // 盈亏数
|
|
|
+ Long profitLossNum = remainingUnReplenishedNum - onRouteStock;
|
|
|
+
|
|
|
+ driverGoodsLossIntervalDetail.setPickingOrderCreateNum(pickingOrderCreateNum);
|
|
|
+ driverGoodsLossIntervalDetail.setWholeOrderCreateNum(wholeOrderCreateNum);
|
|
|
+ driverGoodsLossIntervalDetail.setUnshippedCancelNum(unshippedCancelNum);
|
|
|
+ driverGoodsLossIntervalDetail.setShippedCancelNum(shippedCancelNum);
|
|
|
+ driverGoodsLossIntervalDetail.setReplenishNum(replenishNum);
|
|
|
+ driverGoodsLossIntervalDetail.setReturnWarehouseNum(returnWarehouseNum);
|
|
|
+ driverGoodsLossIntervalDetail.setRemainingUnReplenishedNum(remainingUnReplenishedNum);
|
|
|
+ driverGoodsLossIntervalDetail.setOnRouteStock(onRouteStock);
|
|
|
+ driverGoodsLossIntervalDetail.setProfitLossNum(profitLossNum);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建司机设备货损统计数据
|
|
|
+ *
|
|
|
+ * @param equipmentLossIntervalDetail 设备货损统计数据
|
|
|
+ * @param lastEquipmentLossIntervalDetail 上次设备货损统计数据
|
|
|
+ * @param driverEquipmentLossRecordList 设备货损统计数据
|
|
|
+ */
|
|
|
+ private void buildDriverEquipmentLossRecord(EquipmentLossIntervalDetail equipmentLossIntervalDetail,
|
|
|
+ EquipmentLossIntervalDetail lastEquipmentLossIntervalDetail,
|
|
|
+ List<DriverEquipmentLossRecord> driverEquipmentLossRecordList) {
|
|
|
+
|
|
|
+ Long lastRemainingEquipmentStock = 0L; // 上次剩余设备库存
|
|
|
+ if (null != lastEquipmentLossIntervalDetail) {
|
|
|
+ lastRemainingEquipmentStock = lastEquipmentLossIntervalDetail.getActualStockNum();
|
|
|
+ }
|
|
|
+ Long totalReplenishNum = 0L; // 设备补货数
|
|
|
+ Long equipmentSalesNum = 0L; // 设备销量
|
|
|
+ Long actualStockNum = 0L; // 实际设备库存
|
|
|
+
|
|
|
+
|
|
|
+ if (null != driverEquipmentLossRecordList && !driverEquipmentLossRecordList.isEmpty()) {
|
|
|
+ for (DriverEquipmentLossRecord driverEquipmentLossRecord : driverEquipmentLossRecordList) {
|
|
|
+ totalReplenishNum += driverEquipmentLossRecord.getEquipmentReplenishNum();
|
|
|
+ equipmentSalesNum += driverEquipmentLossRecord.getEquipmentSalesNum();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取 driverEquipmentLossRecordList 中 id 最大 driverEquipmentLossRecord 对象
|
|
|
+ DriverEquipmentLossRecord driverEquipmentLossRecord = driverEquipmentLossRecordList.stream().max(Comparator.comparing(DriverEquipmentLossRecord::getId)).get();
|
|
|
+ actualStockNum = driverEquipmentLossRecord.getActualEquipmentStockNum();
|
|
|
+ }
|
|
|
+
|
|
|
+ equipmentLossIntervalDetail.setLastRemainingEquipmentStock(lastRemainingEquipmentStock);
|
|
|
+ equipmentLossIntervalDetail.setTotalReplenishNum(totalReplenishNum);
|
|
|
+ equipmentLossIntervalDetail.setEquipmentSalesNum(equipmentSalesNum);
|
|
|
+ Long theoreticalStockNum = lastRemainingEquipmentStock + totalReplenishNum - equipmentSalesNum;
|
|
|
+ equipmentLossIntervalDetail.setTheoreticalStockNum(theoreticalStockNum);
|
|
|
+ equipmentLossIntervalDetail.setActualStockNum(actualStockNum);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public String checkStockTakingType(List<Long> areaStaffIds, List<Long> operatorAreaStaffIds) {
|
|
|
+ if (null == areaStaffIds || areaStaffIds.isEmpty()) {
|
|
|
+ return DriverGoodsLossIntervalStockTakingType.REGULAR.name();
|
|
|
+ }
|
|
|
+ // 如果 bo.getAreaStaffIds() 中存在不属于 operatorAreaStaffIds 的区域员工id
|
|
|
+ for (Long areaStaffId : areaStaffIds) {
|
|
|
+ if (!operatorAreaStaffIds.contains(areaStaffId)) {
|
|
|
+ throw new MessageException("选择的人员中存在不属于当前运营商的人员");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (Long areaStaffId : operatorAreaStaffIds) {
|
|
|
+ if (!areaStaffIds.contains(areaStaffId)) {
|
|
|
+ return DriverGoodsLossIntervalStockTakingType.SPOT_CHECK.name();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return DriverGoodsLossIntervalStockTakingType.REGULAR.name();
|
|
|
+ }
|
|
|
+
|
|
|
+}
|