Parcourir la source

技术员领料接口优化

home il y a 2 ans
Parent
commit
e1e0192822

+ 1 - 1
hx-service/storage/src/main/java/com/fjhx/stock/mapper/StockDetailMapper.java

@@ -29,7 +29,7 @@ public interface StockDetailMapper extends BaseMapper<StockDetail> {
     @MapKey("materialCode")
     Map<String, Map<String, BigDecimal>> getMaterialQuantity(@Param("ew") QueryWrapper<Object> wrapper);
 
-    Map<String, Object> selectRecommendMaterial(@Param("materialCode") String materialCode, @Param("availableQuantity") BigDecimal availableQuantity);
+    List<Map<String, Object>> selectRecommendMaterial(@Param("materialCode") String materialCode, @Param("availableQuantity") BigDecimal availableQuantity);
 
     List<Map<String, Object>> getPlanList(@Param("ew") QueryWrapper<Object> wrapper);
 

+ 1 - 1
hx-service/storage/src/main/java/com/fjhx/stock/mapper/StockDetailMapper.xml

@@ -50,6 +50,7 @@
                  )
              ) t
                  left join material m on t.code = m.Code
+        order by t.availableQuantity
     </select>
 
     <select id="getMaterialQuantity" resultType="java.util.Map">
@@ -66,7 +67,6 @@
         where sd.MaterialCode = #{materialCode}
           and sd.Quantity &gt; #{availableQuantity}
         order by sd.Quantity
-        limit 1
     </select>
 
     <select id="getPlanList" resultType="java.util.Map">

+ 195 - 64
hx-service/storage/src/main/java/com/fjhx/stock/service/impl/StockDetailServiceImpl.java

@@ -91,12 +91,6 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
             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);
@@ -124,6 +118,20 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
 
         }
 
+        // 查询推荐物料
+        Map<String, List<Map<String, Object>>> listMapByMaterialCode = list.stream()
+                .collect(Collectors.groupingBy(item -> item.get("materialCode").toString()));
+
+        listMapByMaterialCode.forEach((k, v) -> {
+            List<Map<String, Object>> itemList = baseMapper.selectRecommendMaterial(k, (BigDecimal) v.get(0).get("availableQuantity"));
+
+            int size = Math.min(v.size(), itemList.size());
+
+            for (int i = 0; i < size; i++) {
+                v.get(i).putAll(itemList.get(i));
+            }
+        });
+
         return list;
     }
 
@@ -131,12 +139,27 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
     @Override
     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");
 
+        // 任意为空则返回
+        if (ObjectUtil.isEmpty(appointInfoList) || ObjectUtil.isEmpty(actualList)) return;
+
+        // 推荐领料信息按物料编码分组
+        Map<Object, List<Map<String, Object>>> appointInfoByCodeMap = appointInfoList.stream()
+                .collect(Collectors.groupingBy(item -> item.get("materialCode")));
+
+        // 实际领料信息按物料编码分组
+        Map<Object, List<Map<String, Object>>> actualByCodeMap = actualList.stream()
+                .collect(Collectors.groupingBy(item -> item.get("materialCode")));
+
         // 工号
         String jobNo = condition.get("jobNo").toString();
 
@@ -146,85 +169,193 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
         // 创建时间
         Date date = new Date();
 
-        // 统计指定出库物料编码
-        HashSet<String> materialCodeList = new HashSet<>();
+        // 需要修改的推荐出库物料信息
+        List<Scheduling> schedulingList = new ArrayList<>();
 
-        // 推荐出库物料信息
+        // 需要添加的出库物料信息
         List<SchedulingActual> schedulingActualList = new ArrayList<>();
 
-        List<Scheduling> schedulingList = appointInfoList.stream().map(item -> {
 
-            Scheduling scheduling = new Scheduling();
+//      =====================================
+//         循环推荐领料信息,与实际领料信息做比对
+//      =====================================
 
-            scheduling.setId(item.get("id").toString()); // id
-            String type = item.get("type").toString(); // 类型
+        appointInfoByCodeMap.forEach((k, v) -> {
 
-            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(BigDecimalUtil.objToBigDecimal(item.get("quantity")));
-                schedulingActual.setType(2);
-                schedulingActual.setJobNo(jobNo);
-                schedulingActual.setFlag(flag);
-                schedulingActual.setCreateTime(date);
-                schedulingActualList.add(schedulingActual);
-            }
+            /*
+            实际领料信息封装为map格式
+            key:rfid
+            value:详细详细
+             */
+            Map<String, Map<String, Object>> actualByRfidMap = actualByCodeMap.get(k).stream()
+                    .collect(Collectors.toMap(
+                            item -> item.get("materialRfid").toString(),
+                            item -> item
+                    ));
 
-            if (type.equals("1")) {
-                scheduling.setMaterialStatus(1);
-                scheduling.setMaterialFlag(flag);
-            } else {
-                scheduling.setPaperStatus(1);
-                scheduling.setPaperFlag(flag);
-            }
+            /*
+            推荐领料信息rfid去匹配实际领料rfid
+            如果匹配到,则为推荐领料出库
+             */
+            for (int i = 0; i < v.size(); i++) {
+                Map<String, Object> itemV = v.get(i);
 
-            return scheduling;
-        }).collect(Collectors.toList());
+                // 推荐领料信息的rfidCode
+                String rfidCode = itemV.get("rfidCode").toString();
 
-        schedulingService.updateBatchById(schedulingList);
+                // 匹配实际出库rfidCode
+                Map<String, Object> map = actualByRfidMap.get(rfidCode);
 
-        for (Map<String, Object> map : actualList) {
-            String materialCode = map.get("materialCode").toString();
-            String materialRfid = map.get("materialRfid").toString();
-            BigDecimal quantity = BigDecimalUtil.objToBigDecimal(map.get("quantity"));
+                // 如果不为空,则为推荐领料出库
+                if (map != null) {
 
-            if (!materialCodeList.contains(materialCode)) continue;
+                    Scheduling scheduling = createScheduling(itemV, flag);
+                    schedulingList.add(scheduling);
+                    v.remove(itemV);
+                    i--;
 
-            // 是否是推荐物料标记
-            boolean isRecommendFlag = false;
+                    SchedulingActual schedulingActual = createSchedulingActual(1, map, flag, jobNo, date);
+                    schedulingActualList.add(schedulingActual);
+                    actualByRfidMap.remove("rfidCode");
 
-            // 如果出库物料在推荐物料中,改变状态为推荐领料且已领取
-            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);
+            // 添加推荐未领取
+            List<Map<String, Object>> actual = new ArrayList<>(actualByRfidMap.values());
+
+            int size = Math.min(actual.size(), v.size());
+
+            for (int i = 0; i < size; i++) {
+                Map<String, Object> map = v.get(i);
+
+                Scheduling scheduling = createScheduling(map, flag);
+                schedulingList.add(scheduling);
+
+                map.put("materialRfid", map.get("rfidCode"));
+                SchedulingActual schedulingActual = createSchedulingActual(2, map, flag, jobNo, date);
                 schedulingActualList.add(schedulingActual);
             }
 
-        }
+            for (Map<String, Object> item : actual) {
+                SchedulingActual schedulingActual = createSchedulingActual(3, item, flag, jobNo, date);
+                schedulingActualList.add(schedulingActual);
+            }
 
+        });
+
+        schedulingService.updateBatchById(schedulingList);
         schedulingActualService.saveBatch(schedulingActualList);
 
+
+//        List<Scheduling> schedulingList = appointInfoList.stream().map(item -> {
+//
+//            Scheduling scheduling = new Scheduling();
+//
+//            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(BigDecimalUtil.objToBigDecimal(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.setMaterialFlag(flag);
+//            } else {
+//                scheduling.setPaperStatus(1);
+//                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 = BigDecimalUtil.objToBigDecimal(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);
+
     }
 
+    /**
+     * 生成推荐领料信息对象
+     *
+     * @return
+     */
+    private Scheduling createScheduling(Map<String, Object> map, Long flag) {
+        Scheduling scheduling = new Scheduling();
+
+        scheduling.setId(map.get("id").toString()); // id
+        String type = map.get("type").toString(); // 类型
+
+        if (type.equals("1")) {
+            scheduling.setMaterialStatus(1);
+            scheduling.setMaterialFlag(flag);
+        } else {
+            scheduling.setPaperStatus(1);
+            scheduling.setPaperFlag(flag);
+        }
+
+        return scheduling;
+    }
+
+    private SchedulingActual createSchedulingActual(Integer type, Map<String, Object> map, Long flag, String jobNo, Date date) {
+        SchedulingActual schedulingActual = new SchedulingActual();
+        schedulingActual.setMaterialCode(map.get("materialCode").toString());
+        schedulingActual.setMaterialRfid(map.get("materialRfid").toString());
+        schedulingActual.setQuantity(BigDecimalUtil.objToBigDecimal(map.get("quantity")));
+        schedulingActual.setType(type);
+        schedulingActual.setJobNo(jobNo);
+        schedulingActual.setFlag(flag);
+        schedulingActual.setCreateTime(date);
+        return schedulingActual;
+    }
+
+
     @Override
     public List<HashMap<String, Object>> pickingTrackingUserStatistics(Map<String, String> condition) {
 
@@ -388,10 +519,10 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
      */
     private void setRatio(PickingTrackingNumStatisticsResult result) {
         // 指定产出比
-        result.setAppointOutputRatio(BigDecimalUtil.init(result.getAppointArea()).divideTry(result.getPlanArea(), 4).getValue());
+        result.setAppointOutputRatio(BigDecimalUtil.init(result.getPlanArea()).divideTry(result.getAppointArea(), 4).getValue());
 
         // 实际产出比
-        result.setActualOutputRatio(BigDecimalUtil.init(result.getActualArea()).divideTry(result.getPlanArea(), 4).getValue());
+        result.setActualOutputRatio(BigDecimalUtil.init(result.getPlanArea()).divideTry(result.getActualArea(), 4).getValue());
 
         // 产出比差额
         result.setOutputRatioDifference(result.getAppointOutputRatio().subtract(result.getActualOutputRatio()));