|
@@ -3,13 +3,15 @@ package com.fjhx.stock.service.impl;
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
-import com.fjhx.constants.StatusConstant;
|
|
|
-import com.fjhx.entity.scheduling.entity.Scheduling;
|
|
|
+import com.fjhx.entity.scheduling.Scheduling;
|
|
|
+import com.fjhx.entity.scheduling.SchedulingActual;
|
|
|
import com.fjhx.entity.stock.StockDetail;
|
|
|
import com.fjhx.params.stock.PickingTrackingNumStatisticsResult;
|
|
|
import com.fjhx.scheduling.service.ISchedulingService;
|
|
|
+import com.fjhx.scheduling.service.SchedulingActualService;
|
|
|
import com.fjhx.stock.mapper.StockDetailMapper;
|
|
|
import com.fjhx.stock.service.StockDetailService;
|
|
|
import com.fjhx.utils.Assert;
|
|
@@ -18,6 +20,7 @@ import org.springblade.core.tenant.annotation.TenantIgnore;
|
|
|
import org.springblade.core.tool.utils.ObjectUtil;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
@@ -39,6 +42,9 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
|
|
|
@Autowired
|
|
|
private ISchedulingService schedulingService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private SchedulingActualService schedulingActualService;
|
|
|
+
|
|
|
@Override
|
|
|
public Map<String, Object> getMaterialInfoByQrCode(Map<String, String> condition) {
|
|
|
String qrCode = condition.get("qrCode");
|
|
@@ -61,12 +67,7 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
|
|
|
|
|
|
String jobNo = condition.get("jobNo");
|
|
|
|
|
|
- QueryWrapper<Object> wrapper = Wrappers.query()
|
|
|
- .eq("ss.is_delete", StatusConstant.No)
|
|
|
- .and(q -> q.eq("ss.printer", jobNo).or().eq("ss.paper_man", jobNo))
|
|
|
- .and(q -> q.eq("ss.material_status", StatusConstant.No).or().eq("ss.paper_status", StatusConstant.No));
|
|
|
-
|
|
|
- List<Map<String, Object>> list = baseMapper.restrictedPicking(wrapper, jobNo);
|
|
|
+ List<Map<String, Object>> list = baseMapper.restrictedPicking(jobNo);
|
|
|
|
|
|
if (list.size() == 0) {
|
|
|
return list;
|
|
@@ -87,10 +88,15 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
|
|
|
item.put("availableQuantity", BigDecimalUtil.keepDecimals(availableQuantity, 0));
|
|
|
|
|
|
// 计算排班面积
|
|
|
- BigDecimal availableArea = BigDecimalUtil.init(availableQuantity).multiply(materialWidth)
|
|
|
- .divide(100, 1).getValue();
|
|
|
+ BigDecimal availableArea = BigDecimalUtil.init(availableQuantity).multiply(materialWidth).divide(100, 1).getValue();
|
|
|
item.put("availableArea", availableArea);
|
|
|
|
|
|
+ // 查询推荐物料
|
|
|
+ Map<String, Object> recommendMaterial = baseMapper.selectRecommendMaterial(materialCode, availableQuantity);
|
|
|
+ if (recommendMaterial != null) {
|
|
|
+ item.putAll(recommendMaterial);
|
|
|
+ }
|
|
|
+
|
|
|
Map<String, BigDecimal> materialCodeQuantityMap = map.get(materialCode);
|
|
|
if (materialCodeQuantityMap == null) {
|
|
|
item.put("totalArea", BigDecimal.ZERO);
|
|
@@ -103,8 +109,7 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
|
|
|
if (bigDecimal == null) {
|
|
|
item.put("totalArea", BigDecimal.ZERO);
|
|
|
} else {
|
|
|
- BigDecimal totalArea = BigDecimalUtil.init(bigDecimal).multiply(materialWidth)
|
|
|
- .divide(100, 1).getValue();
|
|
|
+ BigDecimal totalArea = BigDecimalUtil.init(bigDecimal).multiply(materialWidth).divide(100, 1).getValue();
|
|
|
item.put("totalArea", totalArea);
|
|
|
}
|
|
|
|
|
@@ -113,52 +118,111 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
|
|
|
if (userQuantity == null) {
|
|
|
item.put("userArea", BigDecimal.ZERO);
|
|
|
} else {
|
|
|
- BigDecimal userArea = BigDecimalUtil.init(userQuantity).multiply(materialWidth)
|
|
|
- .divide(100, 1).getValue();
|
|
|
+ BigDecimal userArea = BigDecimalUtil.init(userQuantity).multiply(materialWidth).divide(100, 1).getValue();
|
|
|
item.put("userArea", userArea);
|
|
|
}
|
|
|
|
|
|
- // 查询推荐物料
|
|
|
- Map<String, Object> recommendMaterial = baseMapper.selectRecommendMaterial(materialCode, availableQuantity);
|
|
|
-
|
|
|
- if (recommendMaterial != null) {
|
|
|
- item.putAll(recommendMaterial);
|
|
|
- }
|
|
|
-
|
|
|
}
|
|
|
|
|
|
return list;
|
|
|
}
|
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
@Override
|
|
|
- public void submitRestrictedPicking(List<Map<String, String>> condition) {
|
|
|
+ public void submitRestrictedPicking(Map<String, Object> condition) {
|
|
|
+
|
|
|
+ // 推荐信息
|
|
|
+ List<Map<String, Object>> appointInfoList = (List<Map<String, Object>>) condition.get("appointInfo");
|
|
|
+
|
|
|
+ // 实际领料信息
|
|
|
+ List<Map<String, Object>> actualList = (List<Map<String, Object>>) condition.get("actual");
|
|
|
+
|
|
|
+ // 工号
|
|
|
+ String jobNo = condition.get("jobNo").toString();
|
|
|
+
|
|
|
+ // 本次指定领料出库标识
|
|
|
+ long flag = IdWorker.getId();
|
|
|
+
|
|
|
+ // 创建时间
|
|
|
+ Date date = new Date();
|
|
|
|
|
|
- List<Scheduling> schedulingList = condition.stream().map(item -> {
|
|
|
- String id = item.get("id");
|
|
|
- String type = item.get("type");
|
|
|
- String rfidCode = item.get("rfidCode");
|
|
|
- String inOutStorageNo = item.get("inOutStorageNo");
|
|
|
+ // 统计指定出库物料编码
|
|
|
+ HashSet<String> materialCodeList = new HashSet<>();
|
|
|
|
|
|
- Assert.notEmpty(id, "id不能为空");
|
|
|
- Assert.notEmpty(type, "type不能为空");
|
|
|
- Assert.notEmpty(inOutStorageNo, "inOutStorageNo不能为空");
|
|
|
+ // 推荐出库物料信息
|
|
|
+ List<SchedulingActual> schedulingActualList = new ArrayList<>();
|
|
|
+
|
|
|
+ List<Scheduling> schedulingList = appointInfoList.stream().map(item -> {
|
|
|
|
|
|
Scheduling scheduling = new Scheduling();
|
|
|
- scheduling.setId(id);
|
|
|
+
|
|
|
+ scheduling.setId(item.get("id").toString()); // id
|
|
|
+ String type = item.get("type").toString(); // 类型
|
|
|
+
|
|
|
+ String materialCode = item.get("materialCode").toString(); // 物料编码
|
|
|
+ materialCodeList.add(materialCode);
|
|
|
+
|
|
|
+ Object rfidCode = item.get("rfidCode"); // 推荐领料rfid
|
|
|
+ if (ObjectUtil.isNotEmpty(rfidCode)) {
|
|
|
+ SchedulingActual schedulingActual = new SchedulingActual();
|
|
|
+ schedulingActual.setMaterialCode(materialCode);
|
|
|
+ schedulingActual.setMaterialRfid(rfidCode.toString());
|
|
|
+ schedulingActual.setQuantity((BigDecimal) item.get("quantity"));
|
|
|
+ schedulingActual.setType(2);
|
|
|
+ schedulingActual.setJobNo(jobNo);
|
|
|
+ schedulingActual.setFlag(flag);
|
|
|
+ schedulingActual.setCreateTime(date);
|
|
|
+ schedulingActualList.add(schedulingActual);
|
|
|
+ }
|
|
|
+
|
|
|
if (type.equals("1")) {
|
|
|
scheduling.setMaterialStatus(1);
|
|
|
- scheduling.setMaterialRfid(rfidCode);
|
|
|
- scheduling.setMaterialInOutStorageNo(inOutStorageNo);
|
|
|
+ scheduling.setMaterialFlag(flag);
|
|
|
} else {
|
|
|
scheduling.setPaperStatus(1);
|
|
|
- scheduling.setPaperRfid(rfidCode);
|
|
|
- scheduling.setPaperInOutStorageNo(inOutStorageNo);
|
|
|
+ scheduling.setPaperFlag(flag);
|
|
|
}
|
|
|
+
|
|
|
return scheduling;
|
|
|
}).collect(Collectors.toList());
|
|
|
|
|
|
schedulingService.updateBatchById(schedulingList);
|
|
|
|
|
|
+ for (Map<String, Object> map : actualList) {
|
|
|
+ String materialCode = map.get("materialCode").toString();
|
|
|
+ String materialRfid = map.get("materialRfid").toString();
|
|
|
+ BigDecimal quantity = (BigDecimal) map.get("quantity");
|
|
|
+
|
|
|
+ if (!materialCodeList.contains(materialCode)) continue;
|
|
|
+
|
|
|
+ // 是否是推荐物料标记
|
|
|
+ boolean isRecommendFlag = false;
|
|
|
+
|
|
|
+ // 如果出库物料在推荐物料中,改变状态为推荐领料且已领取
|
|
|
+ for (SchedulingActual schedulingActual : schedulingActualList) {
|
|
|
+ if (schedulingActual.getMaterialRfid().equals(materialRfid)) {
|
|
|
+ schedulingActual.setType(1);
|
|
|
+ isRecommendFlag = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!isRecommendFlag) {
|
|
|
+ SchedulingActual schedulingActual = new SchedulingActual();
|
|
|
+ schedulingActual.setMaterialCode(materialCode);
|
|
|
+ schedulingActual.setMaterialRfid(materialRfid);
|
|
|
+ schedulingActual.setQuantity(quantity);
|
|
|
+ schedulingActual.setType(3);
|
|
|
+ schedulingActual.setJobNo(jobNo);
|
|
|
+ schedulingActual.setFlag(flag);
|
|
|
+ schedulingActual.setCreateTime(date);
|
|
|
+ schedulingActualList.add(schedulingActual);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ schedulingActualService.saveBatch(schedulingActualList);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -187,8 +251,7 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
|
|
|
|
|
|
// 查询指定领料列表
|
|
|
QueryWrapper<Object> wrapper = pickingTrackingStatisticsGetWrapper(condition);
|
|
|
- String jobNo = condition.get("jobNo");
|
|
|
- List<Map<String, Object>> list = baseMapper.getPlanListByUser(wrapper, jobNo);
|
|
|
+ List<Map<String, Object>> list = baseMapper.getPlanListByUser(wrapper, condition.get("jobNo"));
|
|
|
|
|
|
if (list.size() == 0) {
|
|
|
return result;
|
|
@@ -203,24 +266,15 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
|
|
|
// 赋值排班领料
|
|
|
setPlan(result, list, codeWidthMap);
|
|
|
|
|
|
- // 获取出入库单号
|
|
|
- List<String> inOutStorageNo = list.stream().filter(item -> ObjectUtil.isNotEmpty(item.get("inOutStorageNo")))
|
|
|
- .map(item -> item.get("inOutStorageNo").toString()).distinct().collect(Collectors.toList());
|
|
|
-
|
|
|
- // 没有出入库单号,没有实际领料
|
|
|
- if (inOutStorageNo.size() == 0) {
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- // 根据出入库单号查询实际领料
|
|
|
- List<Map<String, Object>> outputList = baseMapper.getOutputList(
|
|
|
- Wrappers.query().in("si.InOutStorageNo", inOutStorageNo));
|
|
|
+ // 获取指定和推荐领料map
|
|
|
+ List<Long> flagList = list.stream().map(item -> (Long) item.get("flag")).distinct().collect(Collectors.toList());
|
|
|
+ List<SchedulingActual> schedulingActualListByFlag = getSchedulingActualListByFlag(flagList);
|
|
|
|
|
|
// 赋值实际领料
|
|
|
- setActual(result, outputList, codeWidthMap);
|
|
|
+ setActual(result, schedulingActualListByFlag, codeWidthMap);
|
|
|
|
|
|
// 计算指定领料
|
|
|
- setAppoint(result, list, outputList);
|
|
|
+ setAppoint(result, schedulingActualListByFlag, codeWidthMap);
|
|
|
|
|
|
// 赋值比例
|
|
|
setRatio(result);
|
|
@@ -228,74 +282,26 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+ private List<SchedulingActual> getSchedulingActualListByFlag(List<Long> flagList) {
|
|
|
+ return schedulingActualService.list(Wrappers.<SchedulingActual>lambdaQuery()
|
|
|
+ .in(SchedulingActual::getFlag, flagList));
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public List<Map<String, Object>> appointInfo(Map<String, String> condition) {
|
|
|
String pickingType = condition.get("pickingType");
|
|
|
Assert.notEmpty(pickingType, "领料类型不能为空");
|
|
|
- String materialCode = condition.get("materialCode");
|
|
|
+
|
|
|
String jobNo = condition.get("jobNo");
|
|
|
+ String materialCode = condition.get("materialCode");
|
|
|
|
|
|
QueryWrapper<Object> wrapper = pickingTrackingStatisticsGetWrapper(condition);
|
|
|
- List<Map<String, Object>> list = baseMapper.getPlanListByUser(wrapper, jobNo);
|
|
|
-
|
|
|
- // 获取出入库单号
|
|
|
- List<String> inOutStorageNo = list.stream().filter(item -> ObjectUtil.isNotEmpty(item.get("inOutStorageNo")))
|
|
|
- .map(item -> item.get("inOutStorageNo").toString()).distinct().collect(Collectors.toList());
|
|
|
-
|
|
|
- if (inOutStorageNo.size() == 0) {
|
|
|
- return new ArrayList<>();
|
|
|
- }
|
|
|
-
|
|
|
- // 根据出入库单号查询实际领料
|
|
|
- List<Map<String, Object>> outputList = baseMapper.getOutputList(
|
|
|
- Wrappers.query().in("si.InOutStorageNo", inOutStorageNo));
|
|
|
-
|
|
|
- // 出入库单号做key,分组出库物料
|
|
|
- Map<String, List<Map<String, Object>>> inOutStorageNoMap = outputList.stream()
|
|
|
- .collect(Collectors.groupingBy(item -> item.get("inOutStorageNo").toString()));
|
|
|
-
|
|
|
- // 出入库单号与推荐rfid关联表
|
|
|
- Map<String, String> collect = list.stream().collect(Collectors.toMap(
|
|
|
- item -> item.get("inOutStorageNo").toString(),
|
|
|
- item -> item.get("rfid").toString()
|
|
|
- ));
|
|
|
|
|
|
+ wrapper.eq(ObjectUtil.isNotEmpty(materialCode), "m.Code", materialCode);
|
|
|
+ wrapper.eq(ObjectUtil.isNotEmpty(jobNo), "u.JobNo", jobNo);
|
|
|
+ wrapper.eq("sca.type", pickingType);
|
|
|
|
|
|
- List<String> rfidCodeList = new ArrayList<>();
|
|
|
-
|
|
|
- for (Map.Entry<String, List<Map<String, Object>>> entry : inOutStorageNoMap.entrySet()) {
|
|
|
- String key = entry.getKey(); // 出入库单号
|
|
|
- List<Map<String, Object>> value = entry.getValue(); // 出库物料
|
|
|
-
|
|
|
- String rfid = collect.get(key); // 推荐物料rfid
|
|
|
-
|
|
|
- // 遍历出库物料的rfid
|
|
|
- List<String> rfidCode = value.stream().map(item -> item.get("rfidCode").toString()).collect(Collectors.toList());
|
|
|
-
|
|
|
- if (pickingType.equals("1")) { // 查询指定领料未领取
|
|
|
- if (ObjectUtil.isEmpty(rfid)) continue;
|
|
|
- if (!rfidCode.contains(rfid)) {
|
|
|
- rfidCodeList.add(rfid);
|
|
|
- }
|
|
|
- } else { // 额外领料卷数
|
|
|
- for (int i = 0; i < rfidCode.size(); i++) {
|
|
|
- if (rfidCode.get(i).equals(rfid)) {
|
|
|
- rfidCode.remove(i);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- rfidCodeList.addAll(rfidCode);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- List<Map<String, Object>> result;
|
|
|
- if (pickingType.equals("1")) {
|
|
|
- result = baseMapper.selectNotClaimed(rfidCodeList, materialCode);
|
|
|
- } else {
|
|
|
- result = baseMapper.selectAdditional(rfidCodeList, materialCode);
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
+ return baseMapper.selectClaimed(wrapper);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -303,8 +309,7 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
|
|
|
|
|
|
// 查询指定领料列表
|
|
|
QueryWrapper<Object> wrapper = pickingTrackingStatisticsGetWrapper(condition);
|
|
|
- String jobNo = condition.get("jobNo");
|
|
|
- List<Map<String, Object>> list = baseMapper.getPlanListByUser(wrapper, jobNo);
|
|
|
+ List<Map<String, Object>> list = baseMapper.getPlanListByUser(wrapper, condition.get("jobNo"));
|
|
|
|
|
|
if (list.size() == 0) {
|
|
|
return list;
|
|
@@ -345,25 +350,15 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
|
|
|
// 赋值排班领料
|
|
|
setPlan(temp, listByCode, codeWidthMap);
|
|
|
|
|
|
- // 获取出入库单号
|
|
|
- List<String> inOutStorageNo = listByCode.stream().filter(item -> ObjectUtil.isNotEmpty(item.get("inOutStorageNo")))
|
|
|
- .map(item -> item.get("inOutStorageNo").toString()).distinct().collect(Collectors.toList());
|
|
|
-
|
|
|
- // 没有出入库单号,没有实际领料
|
|
|
- if (inOutStorageNo.size() == 0) {
|
|
|
- map.putAll(BeanUtil.beanToMap(temp));
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- // 根据出入库单号查询实际领料
|
|
|
- List<Map<String, Object>> outputList = baseMapper.getOutputList(
|
|
|
- Wrappers.query().in("si.InOutStorageNo", inOutStorageNo));
|
|
|
+ // 获取指定和推荐领料map
|
|
|
+ List<Long> flagList = listByCode.stream().map(item -> (Long) item.get("flag")).distinct().collect(Collectors.toList());
|
|
|
+ List<SchedulingActual> schedulingActualListByFlag = getSchedulingActualListByFlag(flagList);
|
|
|
|
|
|
// 赋值实际领料
|
|
|
- setActual(temp, outputList, codeWidthMap);
|
|
|
+ setActual(temp, schedulingActualListByFlag, codeWidthMap);
|
|
|
|
|
|
// 计算指定领料
|
|
|
- setAppoint(temp, listByCode, outputList);
|
|
|
+ setAppoint(temp, schedulingActualListByFlag, codeWidthMap);
|
|
|
|
|
|
// 赋值比例
|
|
|
setRatio(temp);
|
|
@@ -396,29 +391,6 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 赋值实际领料
|
|
|
- */
|
|
|
- private void setActual(PickingTrackingNumStatisticsResult result, List<Map<String, Object>> outputList, Map<String, Float> codeWidthMap) {
|
|
|
-
|
|
|
- // 实际领料卷数
|
|
|
- result.setActualNum(outputList.size());
|
|
|
-
|
|
|
- // 实际领料米数
|
|
|
- BigDecimal actualMeter = outputList.stream().map(item -> (BigDecimal) item.get("changeNum")).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
- result.setActualMeter(actualMeter);
|
|
|
-
|
|
|
- // 实际领料面积
|
|
|
- BigDecimal actualArea = outputList.stream().map(
|
|
|
- item -> BigDecimalUtil.init(item.get("quantity"))
|
|
|
- .multiply(codeWidthMap.get(item.get("code").toString()))
|
|
|
- .divide(100, 2)
|
|
|
- .getValue()
|
|
|
- ).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
- result.setActualArea(actualArea);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
* 赋值排班领料
|
|
|
*/
|
|
|
private void setPlan(PickingTrackingNumStatisticsResult result, List<Map<String, Object>> list, Map<String, Float> codeWidthMap) {
|
|
@@ -438,59 +410,63 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 赋值指定领料
|
|
|
+ * 赋值实际领料
|
|
|
*/
|
|
|
- private void setAppoint(PickingTrackingNumStatisticsResult result, List<Map<String, Object>> list,
|
|
|
- List<Map<String, Object>> outputList) {
|
|
|
+ private void setActual(PickingTrackingNumStatisticsResult result, List<SchedulingActual> schedulingActualListByFlag, Map<String, Float> codeWidthMap) {
|
|
|
|
|
|
- // 出入库单号与推荐rfid关联表
|
|
|
- Map<String, String> collect = list.stream().collect(Collectors.toMap(
|
|
|
- item -> item.get("inOutStorageNo").toString(),
|
|
|
- item -> item.get("rfid").toString()
|
|
|
- ));
|
|
|
+ List<SchedulingActual> schedulingActualList = schedulingActualListByFlag.stream()
|
|
|
+ .filter(item -> item.getType().equals(1) || item.getType().equals(3))
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
|
- // 出入库单号做key,分组出库物料
|
|
|
- Map<String, List<Map<String, Object>>> inOutStorageNo = outputList.stream()
|
|
|
- .collect(Collectors.groupingBy(item -> item.get("inOutStorageNo").toString()));
|
|
|
+ // 实际领料卷数
|
|
|
+ result.setActualNum(schedulingActualList.size());
|
|
|
|
|
|
- int appointNotClaimedNum = 0; // 指定未领料
|
|
|
- int additionalNum = 0; // 额外领料卷数
|
|
|
+ // 实际领料米数
|
|
|
+ BigDecimal actualMeter = schedulingActualList.stream().map(SchedulingActual::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ result.setActualMeter(actualMeter);
|
|
|
|
|
|
- List<String> additionalRfidCodeList = new ArrayList<>();
|
|
|
+ // 实际领料面积
|
|
|
+ BigDecimal actualArea = schedulingActualList.stream().map(
|
|
|
+ item -> BigDecimalUtil.init(item.getQuantity())
|
|
|
+ .multiply(codeWidthMap.get(item.getMaterialCode()))
|
|
|
+ .divide(100, 2)
|
|
|
+ .getValue()
|
|
|
+ ).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ result.setActualArea(actualArea);
|
|
|
+ }
|
|
|
|
|
|
- for (Map.Entry<String, List<Map<String, Object>>> entry : inOutStorageNo.entrySet()) {
|
|
|
- String key = entry.getKey();
|
|
|
- List<Map<String, Object>> value = entry.getValue();
|
|
|
+ /**
|
|
|
+ * 赋值指定领料
|
|
|
+ */
|
|
|
+ private void setAppoint(PickingTrackingNumStatisticsResult result, List<SchedulingActual> schedulingActualListByFlag, Map<String, Float> codeWidthMap) {
|
|
|
|
|
|
- String rfid = collect.get(key);
|
|
|
+ List<SchedulingActual> schedulingActualList = schedulingActualListByFlag.stream()
|
|
|
+ .filter(item -> item.getType().equals(1) || item.getType().equals(2))
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
|
- // 如果没有推荐物料的rfid,则领料记录全为额外领料
|
|
|
- if (ObjectUtil.isEmpty(rfid)) {
|
|
|
- additionalNum += value.size();
|
|
|
- } else {
|
|
|
- additionalRfidCodeList.add(rfid);
|
|
|
-
|
|
|
- List<String> rfidCode = value.stream().map(item -> item.get("rfidCode").toString()).collect(Collectors.toList());
|
|
|
- if (!rfidCode.contains(rfid)) {
|
|
|
- additionalNum += value.size() - 1;
|
|
|
- } else {
|
|
|
- appointNotClaimedNum += 1;
|
|
|
- additionalNum += value.size();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ // 指定领料卷数
|
|
|
+ int schedulingActualListSize = schedulingActualList.size();
|
|
|
+ result.setAppointNum(schedulingActualListSize);
|
|
|
|
|
|
- // 查询推荐物料米数门幅
|
|
|
- Map<String, Object> additionalMeterAndArea = baseMapper.selectAdditionalMeterAndArea(
|
|
|
- Wrappers.query().in("st.RfidCode", additionalRfidCodeList));
|
|
|
+ // 指定未领料
|
|
|
+ int appointNum = Integer.parseInt(schedulingActualList.stream().filter(item -> item.getType().equals(2)).count() + "");
|
|
|
+ result.setAppointNotClaimedNum(appointNum);
|
|
|
|
|
|
- result.setAppointNum(additionalRfidCodeList.size()); // 指定领料卷数
|
|
|
- result.setAppointNotClaimedNum(appointNotClaimedNum); // 指定未领料
|
|
|
- result.setAdditionalNum(additionalNum); // 额外领料卷数
|
|
|
+ // 额外领料卷数
|
|
|
+ result.setAdditionalNum(schedulingActualListByFlag.size() - schedulingActualListSize);
|
|
|
|
|
|
- result.setAppointMeter(BigDecimalUtil.keepDecimals(additionalMeterAndArea.get("appointMeter"), 2));
|
|
|
- result.setAppointArea(BigDecimalUtil.keepDecimals(additionalMeterAndArea.get("appointArea"), 2));
|
|
|
+ // 指定领料米数
|
|
|
+ BigDecimal appointMeter = schedulingActualList.stream().map(SchedulingActual::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ result.setAppointMeter(appointMeter);
|
|
|
|
|
|
+ // 指定领料面积
|
|
|
+ BigDecimal appointArea = schedulingActualList.stream().map(
|
|
|
+ item -> BigDecimalUtil.init(item.getQuantity())
|
|
|
+ .multiply(codeWidthMap.get(item.getMaterialCode()))
|
|
|
+ .divide(100, 2)
|
|
|
+ .getValue()
|
|
|
+ ).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ result.setAppointArea(appointArea);
|
|
|
}
|
|
|
|
|
|
/**
|