|
@@ -14,10 +14,12 @@ import com.fjhx.stock.service.StockDetailService;
|
|
|
import com.fjhx.utils.Assert;
|
|
|
import com.fjhx.utils.BigDecimalUtil;
|
|
|
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 java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
@@ -131,15 +133,22 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
|
|
|
String id = item.get("id");
|
|
|
String type = item.get("type");
|
|
|
String rfidCode = item.get("rfidCode");
|
|
|
+ String inOutStorageNo = item.get("inOutStorageNo");
|
|
|
+
|
|
|
+ Assert.notEmpty(id, "id不能为空");
|
|
|
+ Assert.notEmpty(type, "type不能为空");
|
|
|
+ Assert.notEmpty(inOutStorageNo, "inOutStorageNo不能为空");
|
|
|
|
|
|
Scheduling scheduling = new Scheduling();
|
|
|
scheduling.setId(id);
|
|
|
if (type.equals("1")) {
|
|
|
scheduling.setMaterialStatus(1);
|
|
|
scheduling.setMaterialRfid(rfidCode);
|
|
|
+ scheduling.setMaterialInOutStorageNo(inOutStorageNo);
|
|
|
} else {
|
|
|
scheduling.setPaperStatus(1);
|
|
|
scheduling.setPaperRfid(rfidCode);
|
|
|
+ scheduling.setPaperInOutStorageNo(inOutStorageNo);
|
|
|
}
|
|
|
return scheduling;
|
|
|
}).collect(Collectors.toList());
|
|
@@ -172,44 +181,129 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
|
|
|
|
|
|
PickingTrackingNumStatisticsResult result = new PickingTrackingNumStatisticsResult();
|
|
|
|
|
|
-
|
|
|
+
|
|
|
QueryWrapper<Object> wrapper = pickingTrackingStatisticsGetWrapper("ss.plan_date", condition);
|
|
|
-
|
|
|
String jobNo = condition.get("jobNo");
|
|
|
-
|
|
|
List<Map<String, Object>> list = baseMapper.getPlanListByUser(wrapper, jobNo);
|
|
|
|
|
|
if (list.size() == 0) {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- result.setAppointNum(list.size());
|
|
|
-
|
|
|
|
|
|
List<String> code = list.stream().map(item -> item.get("code").toString()).distinct().collect(Collectors.toList());
|
|
|
+
|
|
|
|
|
|
Map<String, Float> codeWidthMap = getCodeWidthMap(code);
|
|
|
|
|
|
-
|
|
|
- setActual(result, condition, code, codeWidthMap);
|
|
|
-
|
|
|
|
|
|
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));
|
|
|
+
|
|
|
+
|
|
|
+ setActual(result, outputList, codeWidthMap);
|
|
|
+
|
|
|
+
|
|
|
+ setAppoint(result, list, outputList);
|
|
|
+
|
|
|
+
|
|
|
+ result.setAppointOutputRatio(BigDecimalUtil.init(result.getAppointArea()).divide(result.getPlanArea(), 4).getValue());
|
|
|
+
|
|
|
+
|
|
|
+ result.setActualOutputRatio(BigDecimalUtil.init(result.getActualArea()).divide(result.getPlanArea(), 4).getValue());
|
|
|
+
|
|
|
+
|
|
|
+ result.setOutputRatioDifference(result.getAppointOutputRatio().subtract(result.getActualOutputRatio()));
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Map<String, Object>> appointInfo(Map<String, String> condition) {
|
|
|
+ String pickingType = condition.get("pickingType");
|
|
|
+ Assert.notEmpty(pickingType, "领料类型不能为空");
|
|
|
+
|
|
|
+ String materialId = condition.get("materialId");
|
|
|
+
|
|
|
+ QueryWrapper<Object> wrapper = pickingTrackingStatisticsGetWrapper("ss.plan_date", condition);
|
|
|
+ String jobNo = condition.get("jobNo");
|
|
|
+ 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));
|
|
|
+
|
|
|
+
|
|
|
+ Map<String, List<Map<String, Object>>> inOutStorageNoMap = outputList.stream()
|
|
|
+ .collect(Collectors.groupingBy(item -> item.get("inOutStorageNo").toString()));
|
|
|
+
|
|
|
+
|
|
|
+ Map<String, String> collect = list.stream().collect(Collectors.toMap(
|
|
|
+ item -> item.get("inOutStorageNo").toString(),
|
|
|
+ item -> item.get("rfid").toString()
|
|
|
+ ));
|
|
|
+
|
|
|
+
|
|
|
+ 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);
|
|
|
+
|
|
|
+ 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, materialId);
|
|
|
+ } else {
|
|
|
+ result = baseMapper.selectAdditional(rfidCodeList, materialId);
|
|
|
+ }
|
|
|
+
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
|
|
|
* 赋值实际领料
|
|
|
*/
|
|
|
- private void setActual(PickingTrackingNumStatisticsResult result, Map<String, String> condition, List<String> code, Map<String, Float> codeWidthMap) {
|
|
|
-
|
|
|
-
|
|
|
- List<Map<String, Object>> outputList = baseMapper.getOutputList(
|
|
|
- pickingTrackingStatisticsGetWrapper("sw.CreatedTime", condition)
|
|
|
- .in("sw.MaterialCode", code)
|
|
|
- .eq("sw.StockChangeType", 20));
|
|
|
+ private void setActual(PickingTrackingNumStatisticsResult result, List<Map<String, Object>> outputList, Map<String, Float> codeWidthMap) {
|
|
|
|
|
|
|
|
|
result.setActualNum(outputList.size());
|
|
@@ -220,7 +314,10 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
|
|
|
|
|
|
|
|
|
BigDecimal actualArea = outputList.stream().map(
|
|
|
- item -> BigDecimalUtil.init(item.get("quantity")).multiply(codeWidthMap.get(item.get("code").toString())).getValue(2)
|
|
|
+ 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);
|
|
|
|
|
@@ -231,16 +328,75 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
|
|
|
*/
|
|
|
private void setPlan(PickingTrackingNumStatisticsResult result, List<Map<String, Object>> list, Map<String, Float> codeWidthMap) {
|
|
|
|
|
|
- BigDecimal planMeter = list.stream().map(item -> (BigDecimal) item.get("quantity")).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ BigDecimal planMeter = list.stream().map(item -> (BigDecimal) item.get("quantity"))
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP);
|
|
|
result.setPlanMeter(planMeter);
|
|
|
|
|
|
|
|
|
BigDecimal planArea = list.stream()
|
|
|
- .map(item -> BigDecimalUtil.init(item.get("quantity")).multiply(codeWidthMap.get(item.get("code").toString())).getValue(2))
|
|
|
+ .map(item -> BigDecimalUtil.init(item.get("quantity"))
|
|
|
+ .multiply(codeWidthMap.get(item.get("code").toString()))
|
|
|
+ .divide(100, 2)
|
|
|
+ .getValue())
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
result.setPlanArea(planArea);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ * 赋值指定领料
|
|
|
+ */
|
|
|
+ private void setAppoint(PickingTrackingNumStatisticsResult result, List<Map<String, Object>> list,
|
|
|
+ List<Map<String, Object>> outputList) {
|
|
|
+
|
|
|
+
|
|
|
+ Map<String, String> collect = list.stream().collect(Collectors.toMap(
|
|
|
+ item -> item.get("inOutStorageNo").toString(),
|
|
|
+ item -> item.get("rfid").toString()
|
|
|
+ ));
|
|
|
+
|
|
|
+
|
|
|
+ Map<String, List<Map<String, Object>>> inOutStorageNo = outputList.stream()
|
|
|
+ .collect(Collectors.groupingBy(item -> item.get("inOutStorageNo").toString()));
|
|
|
+
|
|
|
+ int appointNotClaimedNum = 0;
|
|
|
+ int additionalNum = 0;
|
|
|
+
|
|
|
+ List<String> additionalRfidCodeList = new ArrayList<>();
|
|
|
+
|
|
|
+ for (Map.Entry<String, List<Map<String, Object>>> entry : inOutStorageNo.entrySet()) {
|
|
|
+ String key = entry.getKey();
|
|
|
+ List<Map<String, Object>> value = entry.getValue();
|
|
|
+
|
|
|
+ String rfid = collect.get(key);
|
|
|
+
|
|
|
+
|
|
|
+ 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();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ Map<String, Object> additionalMeterAndArea = baseMapper.selectAdditionalMeterAndArea(
|
|
|
+ Wrappers.query().in("st.RfidCode", additionalRfidCodeList));
|
|
|
+
|
|
|
+ result.setAppointNum(additionalRfidCodeList.size());
|
|
|
+ result.setAppointNotClaimedNum(appointNotClaimedNum);
|
|
|
+ result.setAdditionalNum(additionalNum);
|
|
|
+
|
|
|
+ result.setAppointMeter(BigDecimalUtil.keepDecimals(additionalMeterAndArea.get("appointMeter"), 2));
|
|
|
+ result.setAppointArea(BigDecimalUtil.keepDecimals(additionalMeterAndArea.get("appointArea"), 2));
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
|
|
|
* 获取物料门幅键值对
|