Przeglądaj źródła

技术员领料匹配多卷

home 2 lat temu
rodzic
commit
2b08bc70f6
17 zmienionych plików z 366 dodań i 91 usunięć
  1. 38 17
      hx-common/common-tool/src/main/java/com/fjhx/utils/BigDecimalUtil.java
  2. 3 1
      hx-common/service-flow/src/main/java/com/fjhx/feign/FlowClient.java
  3. 25 32
      hx-service-api/service-flow-api/src/main/java/com/fjhx/utils/FlowConstructor.java
  4. 1 1
      hx-service-api/storage-restructure-api/src/main/java/com/fjhx/constants/ConfigConstant.java
  5. 49 0
      hx-service-api/storage-restructure-api/src/main/java/com/fjhx/enums/MaterialTypeEnum.java
  6. 5 0
      hx-service/storage-restructure/src/main/java/com/fjhx/controller/material/MaterialController.java
  7. 12 4
      hx-service/storage-restructure/src/main/java/com/fjhx/controller/supplier/SupplierController.java
  8. 10 2
      hx-service/storage-restructure/src/main/java/com/fjhx/mapper/supplier/SupplierMapper.java
  9. 74 1
      hx-service/storage-restructure/src/main/java/com/fjhx/mapper/supplier/SupplierMapper.xml
  10. 1 1
      hx-service/storage-restructure/src/main/java/com/fjhx/service/material/impl/MaterialServiceImpl.java
  11. 4 2
      hx-service/storage-restructure/src/main/java/com/fjhx/service/supplier/SupplierService.java
  12. 82 21
      hx-service/storage-restructure/src/main/java/com/fjhx/service/supplier/impl/SupplierServiceImpl.java
  13. 3 1
      hx-service/storage/src/main/java/com/fjhx/stock/mapper/StockBackMapper.xml
  14. 1 1
      hx-service/storage/src/main/java/com/fjhx/stock/mapper/StockDetailMapper.java
  15. 0 1
      hx-service/storage/src/main/java/com/fjhx/stock/mapper/StockDetailMapper.xml
  16. 1 1
      hx-service/storage/src/main/java/com/fjhx/stock/service/impl/StockBackServiceImpl.java
  17. 57 5
      hx-service/storage/src/main/java/com/fjhx/stock/service/impl/StockDetailServiceImpl.java

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

@@ -1,5 +1,7 @@
 package com.fjhx.utils;
 
+import cn.hutool.core.convert.Convert;
+
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 
@@ -66,6 +68,41 @@ public class BigDecimalUtil {
         return objToBigDecimal(v1).divide(objToBigDecimal(v2), scale, RoundingMode.HALF_UP);
     }
 
+    /**
+     * 大于
+     */
+    public static boolean gt(Object v1, Object v2) {
+        return objToBigDecimal(v1).compareTo(objToBigDecimal(v2)) > 0;
+    }
+
+    /**
+     * 大于等于
+     */
+    public static boolean ge(Object v1, Object v2) {
+        return objToBigDecimal(v1).compareTo(objToBigDecimal(v2)) >= 0;
+    }
+
+    /**
+     * 小于
+     */
+    public static boolean lt(Object v1, Object v2) {
+        return objToBigDecimal(v1).compareTo(objToBigDecimal(v2)) < 0;
+    }
+
+    /**
+     * 小于等于
+     */
+    public static boolean le(Object v1, Object v2) {
+        return objToBigDecimal(v1).compareTo(objToBigDecimal(v2)) <= 0;
+    }
+
+    /**
+     * 等于
+     */
+    public static boolean eq(Object v1, Object v2) {
+        return objToBigDecimal(v1).compareTo(objToBigDecimal(v2)) == 0;
+    }
+
 
     /*
      * ==============================================================================================
@@ -164,23 +201,7 @@ public class BigDecimalUtil {
         if (value == null) {
             throw new NullPointerException("参与计算的字段为空");
         }
-        BigDecimal bd;
-        if (value instanceof BigDecimal) {
-            bd = (BigDecimal) value;
-        } else if (value instanceof String) {
-            bd = new BigDecimal((String) value);
-        } else if (value instanceof Float) {
-            bd = BigDecimal.valueOf((float) value);
-        } else if (value instanceof Double) {
-            bd = BigDecimal.valueOf((Double) value);
-        } else if (value instanceof Integer) {
-            bd = BigDecimal.valueOf((Integer) value);
-        } else if (value instanceof Long) {
-            bd = BigDecimal.valueOf((Long) value);
-        } else {
-            throw new ArithmeticException("未知的计算类型");
-        }
-        return bd;
+        return Convert.toBigDecimal(value);
     }
 
 }

+ 3 - 1
hx-common/service-flow/src/main/java/com/fjhx/feign/FlowClient.java

@@ -166,10 +166,10 @@ public class FlowClient implements IFlowClient {
         ExampleInfo oleExampleInfo = exampleInfoService.getOne(Wrappers.<ExampleInfo>lambdaQuery()
                 .eq(ExampleInfo::getFlowLinkNo, jumpVo.getFlowLinkNo())
                 .eq(ExampleInfo::getComplete, StatusConstant.NO));
+        Assert.notEmpty(oleExampleInfo, FlowExplainConstant.EXAMPLE_INFO_NULL);
 
         // 复制除一个对象做修改
         ExampleInfo exampleInfo = ObjectUtil.clone(oleExampleInfo);
-        Assert.notEmpty(exampleInfo, FlowExplainConstant.EXAMPLE_INFO_NULL);
 
         String cacheDataStr = jumpVo.getCacheDataStr();
         if (ObjectUtil.isNotEmpty(cacheDataStr)) {
@@ -187,10 +187,12 @@ public class FlowClient implements IFlowClient {
 
         if (ButtonNameEnum.REJECT.getType().equals(jumpVo.getNameType())) {
 
+            // 不通过
             exampleInfo.setHandleResult(HandleResultEnum.FAIL.getType());
 
         } else if (FlowConstant.END_CODE.equals(jumpVo.getJumpNodeCode())) {
 
+            // 通过
             exampleInfo.setHandleResult(HandleResultEnum.SUCCESS.getType());
 
             // 赋值结束处理方法

+ 25 - 32
hx-service-api/service-flow-api/src/main/java/com/fjhx/utils/FlowConstructor.java

@@ -100,13 +100,6 @@ public class FlowConstructor {
         return jump(flowVo.getFlowLinkNo(), flowVo.getButtonId(), flowVo.getRemarks(), null);
     }
 
-    /**
-     * 流程跳转
-     *
-     * @param flowLinkNo 流程关联编号
-     * @param buttonId   按钮id
-     * @param remarks    审批意见
-     */
     public ExampleResult jump(Long flowLinkNo, Long buttonId, String remarks) {
         return jump(flowLinkNo, buttonId, remarks, null);
     }
@@ -140,31 +133,6 @@ public class FlowConstructor {
     }
 
     /**
-     * 缓存对象转字符串
-     *
-     * @param cacheData 缓存对象
-     * @return 缓存字符串
-     */
-    private String getCacheDataStr(Object cacheData) {
-        String cacheDataStr = "";
-        if (ObjectUtil.isNotEmpty(cacheData)) {
-            cacheDataStr = JSONObject.toJSONString(cacheData);
-        }
-        return cacheDataStr;
-    }
-
-    /**
-     * 获取流程编码
-     *
-     * @return 流程编码
-     */
-    private String getCode() {
-        String code = exampleAbstract.getCode();
-        Assert.notEmpty(code, FlowExplainConstant.CODE_EMPTY);
-        return code;
-    }
-
-    /**
      * 流程跳转
      */
     private ExampleResult flowJump(JumpVo jumpVo) {
@@ -194,4 +162,29 @@ public class FlowConstructor {
         return result;
     }
 
+    /**
+     * 缓存对象转字符串
+     *
+     * @param cacheData 缓存对象
+     * @return 缓存字符串
+     */
+    private String getCacheDataStr(Object cacheData) {
+        String cacheDataStr = "";
+        if (ObjectUtil.isNotEmpty(cacheData)) {
+            cacheDataStr = JSONObject.toJSONString(cacheData);
+        }
+        return cacheDataStr;
+    }
+
+    /**
+     * 获取流程编码
+     *
+     * @return 流程编码
+     */
+    private String getCode() {
+        String code = exampleAbstract.getCode();
+        Assert.notEmpty(code, FlowExplainConstant.CODE_EMPTY);
+        return code;
+    }
+
 }

+ 1 - 1
hx-service-api/storage-restructure-api/src/main/java/com/fjhx/constants/common/ConfigConstant.java → hx-service-api/storage-restructure-api/src/main/java/com/fjhx/constants/ConfigConstant.java

@@ -1,4 +1,4 @@
-package com.fjhx.constants.common;
+package com.fjhx.constants;
 
 /**
  * 配置key常量

+ 49 - 0
hx-service-api/storage-restructure-api/src/main/java/com/fjhx/enums/MaterialTypeEnum.java

@@ -0,0 +1,49 @@
+package com.fjhx.enums;
+
+import lombok.Getter;
+
+import java.util.HashMap;
+
+/**
+ * 物料属性
+ */
+@Getter
+public enum MaterialTypeEnum {
+
+    JET_PRINT(0, "直喷"),
+    TRANSFER(1, "热转"),
+    TYPING(2, "打纸"),
+    INK(3, "墨水"),
+    OTHER(4, "其他");
+
+    private final Integer type;
+    private final String name;
+
+    private static final HashMap<Integer, MaterialTypeEnum> map = new HashMap<>();
+
+    MaterialTypeEnum(Integer type, String name) {
+        this.type = type;
+        this.name = name;
+    }
+
+    static {
+        for (MaterialTypeEnum value : MaterialTypeEnum.values()) {
+            map.put(value.getType(), value);
+        }
+    }
+
+    /**
+     * 根据type获取枚举
+     */
+    public static MaterialTypeEnum get(Integer type) {
+        return map.get(type);
+    }
+
+    /**
+     * 根据type值获取枚举
+     */
+    public static String getName(Integer type) {
+        return map.get(type).getName();
+    }
+
+}

+ 5 - 0
hx-service/storage-restructure/src/main/java/com/fjhx/controller/material/MaterialController.java

@@ -82,5 +82,10 @@ public class MaterialController {
         return R.success(materialService.getDistinctList(Material::getPurpose));
     }
 
+//    /**
+//     * 获取采购周期
+//     */
+//    @PostMapping("/get")
+
 }
 

+ 12 - 4
hx-service/storage-restructure/src/main/java/com/fjhx/controller/supplier/SupplierController.java

@@ -31,7 +31,7 @@ public class SupplierController {
 
     @PostMapping("/page")
     public R page(@RequestBody Map<String, String> condition) {
-        Page<Supplier> result = supplierService.getPage(condition);
+        Page<Map<String, Object>> result = supplierService.getPage(condition);
         return R.success(result);
     }
 
@@ -73,12 +73,20 @@ public class SupplierController {
     /**
      * 供应商采购周期
      */
-    @PostMapping("/getSafetyWarnDayList")
-    public R getSafetyWarnDayList() {
-        List<Map<String, Object>> result = supplierService.getSafetyWarnDayList();
+    @PostMapping("/getSafetyWarnDay")
+    public R getSafetyWarnDay() {
+        List<Map<String, Object>> result = supplierService.getSafetyWarnDay();
         return R.success(result);
     }
 
+    /**
+     * 供应商条件统计
+     */
+    @PostMapping("/getStatistics")
+    public R getStatistics(@RequestBody Map<String, String> condition) {
+        List<Map<String, Object>> result = supplierService.getStatistics(condition);
+        return R.success(result);
+    }
 
 }
 

+ 10 - 2
hx-service/storage-restructure/src/main/java/com/fjhx/mapper/supplier/SupplierMapper.java

@@ -1,7 +1,9 @@
 package com.fjhx.mapper.supplier;
 
-import com.fjhx.entity.supplier.Supplier;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.entity.supplier.Supplier;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -18,6 +20,12 @@ public interface SupplierMapper extends BaseMapper<Supplier> {
 
     List<Map<String, Object>> getAccountDate();
 
-    List<Map<String, Object>> getSafetyWarnDayList();
+    List<Map<String, Object>> getSafetyWarnDay();
+
+    List<Map<String, Object>> getStatistics(@Param("condition") Map<String, String> condition);
+
+    Integer allCount(@Param("condition") Map<String, String> condition);
+
+    Page<Map<String, Object>> getPage(@Param("page") Page<Supplier> page, @Param("condition") Map<String, String> condition);
 
 }

+ 74 - 1
hx-service/storage-restructure/src/main/java/com/fjhx/mapper/supplier/SupplierMapper.xml

@@ -2,6 +2,27 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fjhx.mapper.supplier.SupplierMapper">
 
+    <select id="getPage" resultType="java.util.Map">
+        select distinct s.id,
+                        s.code supplierCoded,
+                        s.name supplierName,
+                        mc.name malssifyName,
+                        s.account_date accountDate,
+                        s.account_date_remark accountDateRemark,
+                        sc.link_men linkMen,
+                        s.telephone
+        from supplier s
+        left join supplier_price sp on s.id = sp.supplier_id
+        left join material m on m.id = sp.material_id
+        left join material_classify mc on m.classify_id = mc.id
+        left join supplier_contacts sc on sc.supplier_id = s.id
+        where s.del_flag = 0
+        <include refid="condition"/>
+        <if test="condition.type neq null and condition.type neq ''">
+            and m.technology_type = #{condition.type}
+        </if>
+    </select>
+
     <select id="getAccountDate" resultType="java.util.Map">
         select s.account_date        value,
                count(s.account_date) count
@@ -11,7 +32,7 @@
         order by s.account_date
     </select>
 
-    <select id="getSafetyWarnDayList" resultType="java.util.Map">
+    <select id="getSafetyWarnDay" resultType="java.util.Map">
         select count(0) count, t.value value
         from (
                  select distinct sp.supplier_id,
@@ -30,4 +51,56 @@
         order by t.value
     </select>
 
+    <select id="getStatistics" resultType="java.util.Map">
+        select t.technology_type type, count(0) count
+        from (
+            select distinct s.id, m.technology_type
+            from supplier_price sp
+            inner join supplier s on s.id = sp.supplier_id
+            inner join material m on m.id = sp.material_id
+            where s.del_flag = 0
+            <include refid="condition"/>
+        ) t
+        group by t.technology_type
+        order by t.technology_type
+    </select>
+
+    <select id="allCount" resultType="java.lang.Integer">
+        select count(distinct s.id)
+        from supplier s
+        left join supplier_price sp on s.id = sp.supplier_id
+        left join material m on m.id = sp.material_id
+        where s.del_flag = 0
+        <include refid="condition"/>
+    </select>
+
+    <sql id="condition">
+        <if test="condition.keyword neq null and condition.keyword neq ''">
+            and instr(s.name, #{condition.keyword}) > 0
+        </if>
+        <if test="condition.accountDate neq null and condition.accountDate neq ''">
+            and s.account_date = #{accountDate}
+        </if>
+        <if test="condition.purpose neq null and condition.purpose neq ''">
+            and m.purpose = #{condition.purpose}
+        </if>
+        <choose>
+            <when test="condition.safetyWarnDay eq 1">
+                AND m.safety_warn_day &lt; 5
+            </when>
+            <when test="condition.safetyWarnDay eq 2">
+                AND m.safety_warn_day between 6 and 15
+            </when>
+            <when test="condition.safetyWarnDay eq 3">
+                AND m.safety_warn_day between 16 and 30
+            </when>
+            <when test="condition.safetyWarnDay eq 4">
+                AND m.safety_warn_day between 31 and 45
+            </when>
+            <when test="condition.safetyWarnDay eq 5">
+                AND m.safety_warn_day &gt; 45
+            </when>
+        </choose>
+    </sql>
+
 </mapper>

+ 1 - 1
hx-service/storage-restructure/src/main/java/com/fjhx/service/material/impl/MaterialServiceImpl.java

@@ -4,7 +4,7 @@ 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.constants.common.ConfigConstant;
+import com.fjhx.constants.ConfigConstant;
 import com.fjhx.entity.material.Material;
 import com.fjhx.mapper.material.MaterialMapper;
 import com.fjhx.service.common.CommonConfigService;

+ 4 - 2
hx-service/storage-restructure/src/main/java/com/fjhx/service/supplier/SupplierService.java

@@ -18,7 +18,7 @@ import java.util.Map;
  */
 public interface SupplierService extends StorageBaseService<Supplier> {
 
-    Page<Supplier> getPage(Map<String, String> condition);
+    Page<Map<String, Object>> getPage(Map<String, String> condition);
 
     void add(SupplierVo supplierVo);
 
@@ -28,6 +28,8 @@ public interface SupplierService extends StorageBaseService<Supplier> {
 
     List<Map<String, Object>> getAccountDate();
 
-    List<Map<String, Object>> getSafetyWarnDayList();
+    List<Map<String, Object>> getSafetyWarnDay();
+
+    List<Map<String, Object>> getStatistics(Map<String, String> condition);
 
 }

+ 82 - 21
hx-service/storage-restructure/src/main/java/com/fjhx/service/supplier/impl/SupplierServiceImpl.java

@@ -1,8 +1,8 @@
 package com.fjhx.service.supplier.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
-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.plugins.pagination.Page;
@@ -12,6 +12,7 @@ import com.fjhx.entity.supplier.Supplier;
 import com.fjhx.entity.supplier.SupplierBank;
 import com.fjhx.entity.supplier.SupplierContacts;
 import com.fjhx.entity.supplier.SupplierKeep;
+import com.fjhx.enums.MaterialTypeEnum;
 import com.fjhx.mapper.supplier.SupplierMapper;
 import com.fjhx.params.supplier.SupplierKeepVo;
 import com.fjhx.params.supplier.SupplierVo;
@@ -20,11 +21,12 @@ import com.fjhx.service.supplier.SupplierBankService;
 import com.fjhx.service.supplier.SupplierContactsService;
 import com.fjhx.service.supplier.SupplierKeepService;
 import com.fjhx.service.supplier.SupplierService;
-import com.fjhx.utils.WrapperUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -52,16 +54,11 @@ public class SupplierServiceImpl extends ServiceImpl<SupplierMapper, Supplier> i
     @Autowired
     private CommonFileService commonFileService;
 
-    @Override
-    public Page<Supplier> getPage(Map<String, String> condition) {
-
-        QueryWrapper<Supplier> wrapper = Wrappers.query();
-
-        WrapperUtil.init(condition, wrapper)
-                .createTimeDesc();
+    private static final Object obj = new Object();
 
-        Page<Supplier> page = page(condition, wrapper);
-        return page;
+    @Override
+    public Page<Map<String, Object>> getPage(Map<String, String> condition) {
+        return baseMapper.getPage(createPage(condition), condition);
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -70,7 +67,11 @@ public class SupplierServiceImpl extends ServiceImpl<SupplierMapper, Supplier> i
 
         // TODO 创建供应商账号
 
-        save(supplierVo);
+        synchronized (obj) {
+            String supplierCode = getSupplierCode();
+            supplierVo.setCode(supplierCode);
+            save(supplierVo);
+        }
 
         Long id = supplierVo.getId();
 
@@ -180,23 +181,83 @@ public class SupplierServiceImpl extends ServiceImpl<SupplierMapper, Supplier> i
     }
 
     @Override
-    public List<Map<String, Object>> getSafetyWarnDayList() {
-        List<Map<String, Object>> safetyWarnDayList = baseMapper.getSafetyWarnDayList();
+    public List<Map<String, Object>> getSafetyWarnDay() {
+        List<Map<String, Object>> safetyWarnDayList = baseMapper.getSafetyWarnDay();
 
         safetyWarnDayList.forEach(item -> {
-            Integer value = (Integer) item.get("value");
+            Integer value = Convert.toInt(item.get("value"));
+            Integer count = Convert.toInt(item.get("count"));
             String label;
 
-//            switch (value) {
-//                case 1:
-//            }
+            switch (value) {
+                case 1:
+                    label = getLabel("0~5天", count);
+                    break;
+                case 2:
+                    label = getLabel("6~15天", count);
+                    break;
+                case 3:
+                    label = getLabel("16~30天", count);
+                    break;
+                case 4:
+                    label = getLabel("31~45天", count);
+                    break;
+                default:
+                    label = getLabel("45天以上", count);
+            }
+            item.put("label", label);
+        });
 
-//            item.put("label", label);
+        return safetyWarnDayList;
+    }
 
-        });
+    @Override
+    public List<Map<String, Object>> getStatistics(Map<String, String> condition) {
 
+        List<Map<String, Object>> result = new ArrayList<>();
 
-        return safetyWarnDayList;
+        // 统计全部数量
+        HashMap<String, Object> allMap = new HashMap<>();
+        Integer count = baseMapper.allCount(condition);
+        allMap.put("label", "全部(" + count + ")");
+        result.add(allMap);
+
+
+        List<Map<String, Object>> list = baseMapper.getStatistics(condition);
+
+        Map<Integer, Integer> map = list.stream().collect(Collectors.toMap(
+                item -> Convert.toInt(item.get("type")),
+                item -> Convert.toInt(item.get("count"))));
+
+        for (int i = 0; i < 5; i++) {
+            Map<String, Object> item = new HashMap<>();
+            Integer itemCount = map.get(i);
+            item.put("label", MaterialTypeEnum.getName(i) + "(" + (itemCount == null ? 0 : itemCount) + ")");
+            item.put("value", i);
+            result.add(item);
+        }
+
+        return result;
+    }
+
+    /**
+     * 生成label
+     */
+    private String getLabel(String str, Integer count) {
+        return String.format("%s(%s)", str, count);
+    }
+
+    /**
+     * 生成供应商编号
+     */
+    private String getSupplierCode() {
+        Supplier supplier = getOne(Wrappers.<Supplier>lambdaQuery()
+                .likeRight(Supplier::getCode, "C")
+                .orderByDesc(Supplier::getCode).last("limit 1"));
+        if (supplier == null) {
+            return "C0001";
+        }
+        return "C" + (Convert.toInt(supplier.getCode().replace("C", "")) + 1);
     }
 
 }

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

@@ -8,6 +8,7 @@
                m.name materialName
         from stock_waterdetial swd
                  left join material m on m.Code = swd.MaterialCode
+                 left join acc_account aa on aa.ID = swd.OperUserId
             ${ew.customSqlSegment}
     </select>
 
@@ -247,7 +248,8 @@
         from stock_back sb
                  inner join stock_back_details sbd on sb.id = sbd.stock_back_id
                  inner join material m on sbd.material_id = m.ID
-                 left join u_user uu on sb.operator_id = uu.ID
+                 left join acc_account ac on ac.AccountNo = sb.operator_id
+                 left join u_user uu on ac.ID = uu.ID
             ${ew.customSqlSegment}
     </select>
 

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

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

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

@@ -66,7 +66,6 @@
         from stock_detail sd
                  left join stock_area sa on sa.ID = sd.PlaceAreaId
         where sd.MaterialCode = #{materialCode}
-          and sd.Quantity &gt; #{availableQuantity}
           and sd.StockHouseId = 'c185883dba22478cb593d33f6b66cc53'
         order by sd.Quantity
     </select>

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

@@ -87,7 +87,7 @@ public class StockBackServiceImpl extends ServiceImpl<StockBackMapper, StockBack
         Date date = new Date();
 
         QueryWrapper<Object> wrapper = Wrappers.query()
-                .eq("swd.OperUserId", userId)
+                .eq("aa.AccountNo", userId)
                 .in("swd.StockChangeType", 20, 23)
                 .between("swd.CreatedTime", DateUtil.beginOfDay(date), DateUtil.endOfDay(date))
                 .groupBy("m.id");

+ 57 - 5
hx-service/storage/src/main/java/com/fjhx/stock/service/impl/StockDetailServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fjhx.stock.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.convert.Convert;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -123,29 +124,80 @@ public class StockDetailServiceImpl extends ServiceImpl<StockDetailMapper, Stock
                 BigDecimal userArea = BigDecimalUtil.init(userQuantity).multiply(materialWidth).divide(100, 1).getValue();
                 item.put("userArea", userArea);
             }
-
         }
 
         // 查询推荐物料
         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"));
+
+            List<Map<String, Object>> itemList = baseMapper.selectRecommendMaterial(k);
+
             int size = Math.min(v.size(), itemList.size());
 
+            // 物料循环
             for (int i = 0; i < size; i++) {
                 BigDecimal availableQuantity = (BigDecimal) v.get(i).get("availableQuantity");
 
+                // 是否需要匹配2卷
+                boolean flag = true;
+
+                // 匹配单卷
                 for (int j = 0; j < itemList.size(); j++) {
                     Map<String, Object> itemMap = itemList.get(j);
-                    if (((BigDecimal) itemMap.get("quantity")).compareTo(availableQuantity) >= 0) {
+
+                    if (BigDecimalUtil.ge(itemMap.get("quantity"), availableQuantity)) {
                         v.get(i).putAll(itemMap);
                         itemList.remove(itemMap);
+                        flag = false;
                         break;
                     }
-                    itemList.remove(itemMap);
-                    j--;
+
+                }
+
+                // 匹配2卷
+                if (flag) {
+                    for (int j = 0; j < itemList.size() - 1; j++) {
+                        Map<String, Object> itemMap1 = itemList.get(j);
+
+                        boolean matchingFlag = false;
+                        for (int l = itemList.size() - j + 1; l < itemList.size(); l++) {
+                            Map<String, Object> itemMap2 = itemList.get(l);
+
+                            if (BigDecimalUtil.ge(
+                                    BigDecimalUtil.add(itemMap1.get("quantity"), itemMap2.get("quantity")),
+                                    availableQuantity)) {
+
+                                Object areaName1 = itemMap1.get("areaName");
+                                Object areaName2 = itemMap2.get("areaName");
+
+                                if (ObjectUtil.isAllNotEmpty(areaName1, areaName2)) {
+                                    itemMap1.put("areaName", areaName1 + "," + areaName2);
+                                } else if (ObjectUtil.isNotEmpty(areaName2)) {
+                                    itemMap1.put("areaName", "暂未绑定位置," + areaName2);
+                                } else if (ObjectUtil.isNotEmpty(areaName1)) {
+                                    itemMap1.put("areaName", areaName1 + ",暂未绑定位置");
+                                }
+
+                                itemMap1.put("rfidCode", itemMap1.get("rfidCode") + "," + itemMap2.get("rfidCode"));
+                                itemMap1.put("quantity", itemMap1.get("quantity") + "," + itemMap2.get("quantity"));
+
+                                // 添加推荐物料
+                                v.get(i).putAll(itemMap1);
+
+                                // 删除匹配到的数据
+                                itemList.remove(itemMap1);
+                                itemList.remove(itemMap2);
+                                matchingFlag = true;
+                                break;
+                            }
+                        }
+                        if (matchingFlag) {
+                            break;
+                        }
+                    }
                 }
             }
         });