Explorar el Código

技术员领料

home hace 2 años
padre
commit
4827bf0737

+ 2 - 2
hx-common/common-tool/src/main/java/com/fjhx/utils/BigDecimalUtil.java

@@ -17,14 +17,14 @@ public class BigDecimalUtil {
      * 值保留几位小数
      */
     public static BigDecimal keepDecimals(Object value, int scale) {
-        return (objToBigDecimal(value)).divide(BigDecimal.ONE, scale, RoundingMode.HALF_UP);
+        return (objToBigDecimal(value)).setScale(scale, RoundingMode.HALF_UP);
     }
 
     /**
      * 默认保留2位小数
      */
     public static BigDecimal keepDecimals(Object value) {
-        return (objToBigDecimal(value)).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);
+        return (objToBigDecimal(value)).setScale(2, RoundingMode.HALF_UP);
     }
 
     /**

+ 10 - 0
hx-service-api/storage-api/src/main/java/com/fjhx/entity/scheduling/entity/Scheduling.java

@@ -123,4 +123,14 @@ public class Scheduling {
      */
     private String paperRfid;
 
+    /**
+     * 喷印人员出入库单号
+     */
+    private String materialInOutStorageNo;
+
+    /**
+     * 打纸人员出入库单号
+     */
+    private String paperInOutStorageNo;
+
 }

+ 1 - 1
hx-service-api/storage-api/src/main/java/com/fjhx/params/stock/PickingTrackingNumStatisticsResult.java

@@ -71,7 +71,7 @@ public class PickingTrackingNumStatisticsResult implements Serializable {
     private BigDecimal actualOutputRatio;
 
     /**
-     * 实际产出比
+     * 产出比差额
      */
     private BigDecimal outputRatioDifference;
 

+ 9 - 0
hx-service/storage/src/main/java/com/fjhx/stock/controller/StockDetailController.java

@@ -85,5 +85,14 @@ public class StockDetailController {
         return R.success(result);
     }
 
+    /**
+     * 指定领料信息
+     */
+    @PostMapping("/appointInfo")
+    public R appointInfo(@RequestBody Map<String, String> condition) {
+        List<Map<String, Object>> result = stockDetailService.appointInfo(condition);
+        return R.success(result);
+    }
+
 }
 

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

@@ -40,4 +40,10 @@ public interface StockDetailMapper extends BaseMapper<StockDetail> {
 
     List<Map<String, Object>> getMaterialWidthByCode(@Param("ew") QueryWrapper<Object> wrapper);
 
+    Map<String, Object> selectAdditionalMeterAndArea(@Param("ew") QueryWrapper<Object> wrapper);
+
+    List<Map<String, Object>> selectNotClaimed(@Param("rfidCodeList") List<String> rfidCodeList, @Param("materialId") String materialId);
+
+    List<Map<String, Object>> selectAdditional(@Param("rfidCodeList") List<String> rfidCodeList, @Param("materialId") String materialId);
+
 }

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

@@ -73,7 +73,8 @@
         select
         ss.material_code code,
         ss.material_quantity quantity,
-        ss.material_rfid rfid
+        ss.material_rfid rfid,
+        ss.material_in_out_storage_no inOutStorageNo
         from stock_scheduling ss
         ${ew.customSqlSegment}
         <if test="jobNo neq null and jobNo neq ''">
@@ -85,7 +86,8 @@
         select
         ss.paper_code code,
         ss.paper_quantity quantity,
-        ss.paper_rfid rfid
+        ss.paper_rfid rfid,
+        ss.paper_in_out_storage_no inOutStorageNo
         from stock_scheduling ss
         ${ew.customSqlSegment}
         <if test="jobNo neq null and jobNo neq ''">
@@ -95,10 +97,13 @@
     </select>
 
     <select id="getOutputList" resultType="java.util.Map">
-        select sw.MaterialCode materialCode,
-               sw.ChangeNum    changeNum,
-               sw.RfidCode     rfidCode
-        from stock_waterdetial sw
+        select swd.MaterialCode  materialCode,
+               swd.ChangeNum     changeNum,
+               swd.RfidCode      rfidCode,
+               si.InOutStorageNo inOutStorageNo
+        from stock_inoutbill si
+                 left join stock_water sw on si.ID = sw.LinkId
+                 left join stock_waterdetial swd on sw.id = swd.WaterId
             ${ew.customSqlSegment}
     </select>
 
@@ -108,4 +113,66 @@
             ${ew.customSqlSegment};
     </select>
 
+    <select id="selectAdditionalMeterAndArea" resultType="java.util.Map">
+        select sum(st.Quantity)                 appointMeter,
+               sum(st.Quantity * m.Width / 100) appointArea
+        from stock_tag st
+                 left join material m on st.MaterialCode = m.Code
+            ${ew.customSqlSegment}
+    </select>
+
+    <select id="selectNotClaimed" resultType="java.util.Map">
+        select
+        schedulingTable.materialRfid materialRfid,
+        uu.RealName userName,
+        st.Quantity quantity,
+        m.Name materialName,
+        m.Width materialWidth
+        from (
+        (
+        select ss.material_rfid materialRfid, ss.printer jobNo
+        from stock_scheduling ss
+        where ss.material_rfid in
+        <foreach collection="rfidCodeList" index="index" item="rfidCode" separator="," close=")" open="(">
+            #{rfidCode}
+        </foreach>
+        )
+        union
+        (
+        select ss.paper_rfid materialRfid, ss.paper_man jobNo
+        from stock_scheduling ss
+        where ss.paper_rfid in
+        <foreach collection="rfidCodeList" index="index" item="rfidCode" separator="," close=")" open="(">
+            #{rfidCode}
+        </foreach>
+        )
+        ) as schedulingTable
+        left join u_user uu on uu.JobNo = schedulingTable.jobNo
+        left join stock_tag st on st.RfidCode = schedulingTable.materialRfid
+        left join material m on st.MaterialCode = m.Code
+        <if test="materialId neq null and materialId neq ''">
+            where m.ID = #{materialId}
+        </if>
+    </select>
+
+    <select id="selectAdditional" resultType="java.util.Map">
+        select sw.RfidCode materialRfid,
+        uu.RealName userName,
+        st.Quantity quantity,
+        m.Name materialName,
+        m.Width materialWidth
+        from stock_waterdetial sw
+        left join u_user uu on uu.JobNo = sw.OperUserId
+        left join stock_tag st on st.RfidCode = sw.RfidCode
+        left join material m on st.MaterialCode = m.Code
+        where sw.StockChangeType = 20
+        and sw.RfidCode in
+        <foreach collection="rfidCodeList" index="index" item="rfidCode" separator="," open="(" close=")">
+            #{rfidCode}
+        </foreach>
+        <if test="materialId neq null and materialId neq ''">
+            and m.ID = #{materialId}
+        </if>
+    </select>
+
 </mapper>

+ 2 - 0
hx-service/storage/src/main/java/com/fjhx/stock/service/StockDetailService.java

@@ -30,4 +30,6 @@ public interface StockDetailService extends BaseService<StockDetail> {
 
     PickingTrackingNumStatisticsResult pickingTrackingNumStatistics(Map<String, String> condition);
 
+    List<Map<String, Object>> appointInfo(Map<String, String> condition);
+
 }

+ 175 - 19
hx-service/storage/src/main/java/com/fjhx/stock/service/impl/StockDetailServiceImpl.java

@@ -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));
+
+        // 出入库单号做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()
+        ));
+
+
+        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) {
+
+        // 出入库单号与推荐rfid关联表
+        Map<String, String> collect = list.stream().collect(Collectors.toMap(
+                item -> item.get("inOutStorageNo").toString(),
+                item -> item.get("rfid").toString()
+        ));
+
+        // 出入库单号做key,分组出库物料
+        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);
+
+            // 如果没有推荐物料的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();
+                }
+            }
+        }
+
+        // 查询推荐物料米数门幅
+        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));
+
+    }
 
     /**
      * 获取物料门幅键值对