瀏覽代碼

领料界面 指定领料追踪

home 2 年之前
父節點
當前提交
b6d17ce073
共有 20 個文件被更改,包括 452 次插入286 次删除
  1. 3 13
      hx-service-api/storage-api/src/main/java/com/fjhx/entity/scheduling/Scheduling.java
  2. 72 0
      hx-service-api/storage-api/src/main/java/com/fjhx/entity/scheduling/SchedulingActual.java
  3. 17 0
      hx-service-api/storage-api/src/main/java/com/fjhx/params/stock/SchedulingActualEx.java
  4. 17 0
      hx-service-api/storage-api/src/main/java/com/fjhx/params/stock/SchedulingActualVo.java
  5. 1 1
      hx-service/storage-restructure/src/main/java/com/fjhx/scheduling/service/impl/StockAreaServiceImpl.java
  6. 1 1
      hx-service/storage-restructure/src/main/java/com/fjhx/scheduling/service/impl/StockHouseServiceImpl.java
  7. 1 1
      hx-service/storage/src/main/java/com/fjhx/scheduling/controller/SchedulingController.java
  8. 16 0
      hx-service/storage/src/main/java/com/fjhx/scheduling/mapper/SchedulingActualMapper.java
  9. 5 0
      hx-service/storage/src/main/java/com/fjhx/scheduling/mapper/SchedulingActualMapper.xml
  10. 1 2
      hx-service/storage/src/main/java/com/fjhx/scheduling/mapper/SchedulingMapper.java
  11. 1 1
      hx-service/storage/src/main/java/com/fjhx/scheduling/mapper/SchedulingMapper.xml
  12. 1 1
      hx-service/storage/src/main/java/com/fjhx/scheduling/service/ISchedulingService.java
  13. 28 0
      hx-service/storage/src/main/java/com/fjhx/scheduling/service/SchedulingActualService.java
  14. 54 0
      hx-service/storage/src/main/java/com/fjhx/scheduling/service/impl/SchedulingActualServiceImpl.java
  15. 1 1
      hx-service/storage/src/main/java/com/fjhx/scheduling/service/impl/SchedulingServiceImpl.java
  16. 1 1
      hx-service/storage/src/main/java/com/fjhx/stock/controller/StockDetailController.java
  17. 4 4
      hx-service/storage/src/main/java/com/fjhx/stock/mapper/StockDetailMapper.java
  18. 60 68
      hx-service/storage/src/main/java/com/fjhx/stock/mapper/StockDetailMapper.xml
  19. 1 1
      hx-service/storage/src/main/java/com/fjhx/stock/service/StockDetailService.java
  20. 167 191
      hx-service/storage/src/main/java/com/fjhx/stock/service/impl/StockDetailServiceImpl.java

+ 3 - 13
hx-service-api/storage-api/src/main/java/com/fjhx/entity/scheduling/entity/Scheduling.java → hx-service-api/storage-api/src/main/java/com/fjhx/entity/scheduling/Scheduling.java

@@ -14,7 +14,7 @@
  *  this software without specific prior written permission.
  *  Author: Chill 庄骞 (smallchill@163.com)
  */
-package com.fjhx.entity.scheduling.entity;
+package com.fjhx.entity.scheduling;
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
@@ -114,23 +114,13 @@ public class Scheduling {
     private Integer paperStatus;
 
     /**
-     * 喷印人员推荐领料rfid
-     */
-    private String materialRfid;
-
-    /**
-     * 打纸人员推荐领料rfid
-     */
-    private String paperRfid;
-
-    /**
      * 喷印人员出入库单号
      */
-    private String materialInOutStorageNo;
+    private Long materialFlag;
 
     /**
      * 打纸人员出入库单号
      */
-    private String paperInOutStorageNo;
+    private Long paperFlag;
 
 }

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

@@ -0,0 +1,72 @@
+package com.fjhx.entity.scheduling;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 推荐领料 实际领料结果
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-08-09
+ */
+@Data
+public class SchedulingActual implements Serializable {
+
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    /**
+     * 领料标识
+     */
+    private Long flag;
+
+    /**
+     * 物料编码
+     */
+    private String materialCode;
+
+    /**
+     * 物料rfid
+     */
+    private String materialRfid;
+
+    /**
+     * 数量
+     */
+    private BigDecimal quantity;
+
+    /**
+     * 类型 1推荐领料且已领取 2推荐领料未领取 3额外领料
+     */
+    private Integer type;
+
+    /**
+     * 工号
+     */
+    private String jobNo;
+
+    /**
+     * 指定领料发布时间
+     */
+    private Date planDate;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+
+}

+ 17 - 0
hx-service-api/storage-api/src/main/java/com/fjhx/params/stock/SchedulingActualEx.java

@@ -0,0 +1,17 @@
+package com.fjhx.params.stock;
+
+import com.fjhx.entity.scheduling.SchedulingActual;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 推荐领料 实际领料结果
+ *
+ * @author ${author}
+ * @since 2022-08-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SchedulingActualEx extends SchedulingActual {
+
+}

+ 17 - 0
hx-service-api/storage-api/src/main/java/com/fjhx/params/stock/SchedulingActualVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.params.stock;
+
+import com.fjhx.entity.scheduling.SchedulingActual;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 推荐领料 实际领料结果
+ *
+ * @author ${author}
+ * @since 2022-08-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SchedulingActualVo extends SchedulingActual {
+
+}

+ 1 - 1
hx-service/storage-restructure/src/main/java/com/fjhx/service/stock/impl/StockAreaServiceImpl.java → hx-service/storage-restructure/src/main/java/com/fjhx/scheduling/service/impl/StockAreaServiceImpl.java

@@ -1,4 +1,4 @@
-package com.fjhx.service.stock.impl;
+package com.fjhx.scheduling.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;

+ 1 - 1
hx-service/storage-restructure/src/main/java/com/fjhx/service/stock/impl/StockHouseServiceImpl.java → hx-service/storage-restructure/src/main/java/com/fjhx/scheduling/service/impl/StockHouseServiceImpl.java

@@ -1,4 +1,4 @@
-package com.fjhx.service.stock.impl;
+package com.fjhx.scheduling.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;

+ 1 - 1
hx-service/storage/src/main/java/com/fjhx/scheduling/controller/SchedulingController.java

@@ -16,7 +16,7 @@
  */
 package com.fjhx.scheduling.controller;
 
-import com.fjhx.entity.scheduling.entity.Scheduling;
+import com.fjhx.entity.scheduling.Scheduling;
 import com.fjhx.scheduling.service.ISchedulingService;
 import com.fjhx.utils.HmacUtil;
 import io.swagger.annotations.Api;

+ 16 - 0
hx-service/storage/src/main/java/com/fjhx/scheduling/mapper/SchedulingActualMapper.java

@@ -0,0 +1,16 @@
+package com.fjhx.scheduling.mapper;
+
+import com.fjhx.entity.scheduling.SchedulingActual;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 推荐领料 实际领料结果 Mapper 接口
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-08-09
+ */
+public interface SchedulingActualMapper extends BaseMapper<SchedulingActual> {
+
+}

+ 5 - 0
hx-service/storage/src/main/java/com/fjhx/scheduling/mapper/SchedulingActualMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.scheduling.mapper.SchedulingActualMapper">
+
+</mapper>

+ 1 - 2
hx-service/storage/src/main/java/com/fjhx/scheduling/mapper/SchedulingMapper.java

@@ -16,9 +16,8 @@
  */
 package com.fjhx.scheduling.mapper;
 
-import com.fjhx.entity.scheduling.entity.Scheduling;
+import com.fjhx.entity.scheduling.Scheduling;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 
 /**
  * 仓库 Mapper 接口

+ 1 - 1
hx-service/storage/src/main/java/com/fjhx/scheduling/mapper/SchedulingMapper.xml

@@ -3,7 +3,7 @@
 <mapper namespace="com.fjhx.scheduling.mapper.SchedulingMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="schedulingResultMap" type="com.fjhx.entity.scheduling.entity.Scheduling">
+    <resultMap id="schedulingResultMap" type="com.fjhx.entity.scheduling.Scheduling">
         <id column="id" property="id"/>
         <result column="is_delete" property="isDelete"/>
         <result column="plan_date" property="planDate"/>

+ 1 - 1
hx-service/storage/src/main/java/com/fjhx/scheduling/service/ISchedulingService.java

@@ -16,7 +16,7 @@
  */
 package com.fjhx.scheduling.service;
 
-import com.fjhx.entity.scheduling.entity.Scheduling;
+import com.fjhx.entity.scheduling.Scheduling;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 /**

+ 28 - 0
hx-service/storage/src/main/java/com/fjhx/scheduling/service/SchedulingActualService.java

@@ -0,0 +1,28 @@
+package com.fjhx.scheduling.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.entity.scheduling.SchedulingActual;
+import com.fjhx.params.stock.SchedulingActualVo;
+import com.fjhx.base.BaseService;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 推荐领料 实际领料结果 服务类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-08-09
+ */
+public interface SchedulingActualService extends BaseService<SchedulingActual> {
+
+    Page<SchedulingActual> getPage(Map<String, String> condition);
+
+    void add(SchedulingActualVo stockSchedulingActualVo);
+
+    void edit(SchedulingActualVo stockSchedulingActualVo);
+
+    void delete(SchedulingActualVo stockSchedulingActualVo);
+
+}

+ 54 - 0
hx-service/storage/src/main/java/com/fjhx/scheduling/service/impl/SchedulingActualServiceImpl.java

@@ -0,0 +1,54 @@
+package com.fjhx.scheduling.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.entity.scheduling.SchedulingActual;
+import com.fjhx.params.stock.SchedulingActualVo;
+import com.fjhx.scheduling.mapper.SchedulingActualMapper;
+import com.fjhx.scheduling.service.SchedulingActualService;
+import com.fjhx.utils.WrapperUtil;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 推荐领料 实际领料结果 服务实现类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-08-09
+ */
+@Service
+public class SchedulingActualServiceImpl extends ServiceImpl<SchedulingActualMapper, SchedulingActual> implements SchedulingActualService {
+
+    @Override
+    public Page<SchedulingActual> getPage(Map<String, String> condition) {
+
+        QueryWrapper<SchedulingActual> wrapper = Wrappers.query();
+
+        WrapperUtil.init(condition, wrapper)
+                .createTimeDesc();
+
+        Page<SchedulingActual> page = page(condition, wrapper);
+        return page;
+    }
+
+    @Override
+    public void add(SchedulingActualVo stockSchedulingActualVo) {
+        save(stockSchedulingActualVo);
+    }
+
+    @Override
+    public void edit(SchedulingActualVo stockSchedulingActualVo) {
+        updateById(stockSchedulingActualVo);
+    }
+
+    @Override
+    public void delete(SchedulingActualVo stockSchedulingActualVo) {
+        removeById(stockSchedulingActualVo.getId());
+    }
+
+}

+ 1 - 1
hx-service/storage/src/main/java/com/fjhx/scheduling/service/impl/SchedulingServiceImpl.java

@@ -16,7 +16,7 @@
  */
 package com.fjhx.scheduling.service.impl;
 
-import com.fjhx.entity.scheduling.entity.Scheduling;
+import com.fjhx.entity.scheduling.Scheduling;
 import com.fjhx.scheduling.mapper.SchedulingMapper;
 import com.fjhx.scheduling.service.ISchedulingService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

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

@@ -62,7 +62,7 @@ public class StockDetailController {
      * 提交限定领料列表
      */
     @PostMapping("/submitRestrictedPicking")
-    public R submitRestrictedPicking(@RequestBody List<Map<String, String>> condition) {
+    public R submitRestrictedPicking(@RequestBody Map<String, Object> condition) {
         stockDetailService.submitRestrictedPicking(condition);
         return R.success();
     }

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

@@ -1,5 +1,6 @@
 package com.fjhx.stock.mapper;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fjhx.entity.stock.StockDetail;
@@ -22,7 +23,8 @@ public interface StockDetailMapper extends BaseMapper<StockDetail> {
 
     Map<String, Object> getMaterialInfoByQrCode(@Param("qrCode") String qrCode);
 
-    List<Map<String, Object>> restrictedPicking(@Param("ew") QueryWrapper<Object> wrapper, @Param("jobNo") String jobNo);
+    @InterceptorIgnore(tenantLine = "1")
+    List<Map<String, Object>> restrictedPicking(@Param("jobNo") String jobNo);
 
     @MapKey("materialCode")
     Map<String, Map<String, BigDecimal>> getMaterialQuantity(@Param("ew") QueryWrapper<Object> wrapper);
@@ -42,8 +44,6 @@ public interface StockDetailMapper extends BaseMapper<StockDetail> {
 
     Map<String, Object> selectAdditionalMeterAndArea(@Param("ew") QueryWrapper<Object> wrapper);
 
-    List<Map<String, Object>> selectNotClaimed(@Param("rfidCodeList") List<String> rfidCodeList, @Param("materialCode") String materialId);
-
-    List<Map<String, Object>> selectAdditional(@Param("rfidCodeList") List<String> rfidCodeList, @Param("materialCode") String materialId);
+    List<Map<String, Object>> selectClaimed(@Param("ew") QueryWrapper<Object> wrapper);
 
 }

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

@@ -16,18 +16,40 @@
         where sd.QRCode = #{qrCode}
     </select>
 
-    <select id="restrictedPicking" resultType="java.util.Map">
-        select ss.id,
-               if(ss.printer = #{jobNo} and ss.material_status = 0, m.Code, m2.Code)   materialCode,
-               if(ss.printer = #{jobNo} and ss.material_status = 0, m.Name, m2.Name)   materialName,
-               if(ss.printer = #{jobNo} and ss.material_status = 0, m.Width, m2.Width) materialWidth,
-               if(ss.printer = #{jobNo} and ss.material_status = 0, ss.material_quantity,
-                  ss.paper_quantity)                                                   availableQuantity,
-               if(ss.printer = #{jobNo} and ss.material_status = 0, 1, 2)              type
-        from stock_scheduling ss
-                 left join material m on ss.material_code = m.Code
-                 left join material m2 on ss.paper_code = m2.Code
-            ${ew.customSqlSegment}
+    <select id="restrictedPicking" resultType="java.util.LinkedHashMap">
+        select t.id,
+               t.availableQuantity,
+               t.type,
+               t.planDate,
+               m.Code  materialCode,
+               m.Name  materialName,
+               m.Width materialWidth
+        from (
+                 (
+                     select ss.id,
+                            ss.material_quantity availableQuantity,
+                            ss.material_code     code,
+                            1                    type,
+                            ss.plan_date         planDate
+                     from stock_scheduling ss
+                     where ss.printer = #{jobNo}
+                       and ss.material_status = 0
+                       and ss.is_delete = 0
+                 )
+                 union
+                 (
+                     select ss.id,
+                            ss.paper_quantity availableQuantity,
+                            ss.paper_code     code,
+                            2                 type,
+                            ss.plan_date      planDate
+                     from stock_scheduling ss
+                     where ss.paper_man = #{jobNo}
+                       and ss.paper_status = 0
+                       and ss.is_delete = 0
+                 )
+             ) t
+                 left join material m on t.code = m.Code
     </select>
 
     <select id="getMaterialQuantity" resultType="java.util.Map">
@@ -73,8 +95,7 @@
         select
         ss.material_code code,
         ss.material_quantity quantity,
-        ss.material_rfid rfid,
-        ss.material_in_out_storage_no inOutStorageNo
+        ss.material_flag flag
         from stock_scheduling ss
         ${ew.customSqlSegment}
         <if test="jobNo neq null and jobNo neq ''">
@@ -86,8 +107,7 @@
         select
         ss.paper_code code,
         ss.paper_quantity quantity,
-        ss.paper_rfid rfid,
-        ss.paper_in_out_storage_no inOutStorageNo
+        ss.paper_flag flag
         from stock_scheduling ss
         ${ew.customSqlSegment}
         <if test="jobNo neq null and jobNo neq ''">
@@ -121,58 +141,30 @@
             ${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="materialCode neq null and materialCode neq ''">
-            where m.Code = #{materialCode}
-        </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="materialCode neq null and materialCode neq ''">
-            and m.Code = #{materialCode}
-        </if>
+    <select id="selectClaimed" resultType="java.util.Map">
+        select m.Name            materialName,
+               m.Code            materialCode,
+               sca.material_rfid materialRfid,
+               u.RealName        userName,
+               sca.quantity      quantity,
+               m.Width           materialWidth
+        from stock_scheduling_actual sca
+                 left join material m on m.Code = sca.material_code
+                 left join u_user u on u.JobNo = sca.job_no
+                 right join (
+            (
+                select ss.plan_date     plan_date,
+                       ss.material_flag flag
+                from stock_scheduling ss
+            )
+            union
+            (
+                select ss.plan_date  plan_date,
+                       ss.paper_flag flag
+                from stock_scheduling ss
+            )
+        ) ss on ss.flag = sca.flag
+            ${ew.customSqlSegment}
     </select>
 
 </mapper>

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

@@ -24,7 +24,7 @@ public interface StockDetailService extends BaseService<StockDetail> {
 
     List<Map<String, Object>> restrictedPicking(Map<String, String> condition);
 
-    void submitRestrictedPicking(List<Map<String, String>> condition);
+    void submitRestrictedPicking(Map<String, Object> condition);
 
     List<HashMap<String, Object>> pickingTrackingUserStatistics(Map<String, String> condition);
 

+ 167 - 191
hx-service/storage/src/main/java/com/fjhx/stock/service/impl/StockDetailServiceImpl.java

@@ -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);
     }
 
     /**