Jelajahi Sumber

选矿项目调整库存专用脚本封装成接口8.7

李卫 1 tahun lalu
induk
melakukan
60f2e589a2

+ 2 - 2
ruoyi-admin/src/main/resources/application-dev.yml

@@ -6,7 +6,7 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://47.100.220.92:3306/warewms_xuankuang_cy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
+                url: jdbc:mysql://47.100.220.92:3306/warewms_xuankuang_liwei?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
                 username: warewms
                 password: warewms123
                 driverClassName: com.mysql.cj.jdbc.Driver
@@ -58,7 +58,7 @@ spring:
                         multi-statement-allow: true
     redis:
         # 地址
-        host: 154.12.20.200
+        host: 192.168.157.130
         # 端口,默认为6379
         port: 6379
         # 数据库索引

+ 3 - 3
ruoyi-admin/src/test/java/com/ruoyi/admin/test/base/ProcessLocationTest.java

@@ -104,9 +104,9 @@ public class ProcessLocationTest {
     }
 
 
-
-
-
+    @Test
+    public void name() {
+    }
 
     /**
      * 重置一个库的库位库存信息

+ 1 - 0
ruoyi-ui/package.json

@@ -66,6 +66,7 @@
     "@vue/cli-service": "4.4.6",
     "babel-eslint": "10.1.0",
     "babel-plugin-dynamic-import-node": "2.3.3",
+    "babel-plugin-import": "^1.13.8",
     "chalk": "4.1.0",
     "compression-webpack-plugin": "5.0.2",
     "connect": "3.6.6",

+ 1 - 0
warewms-ams/pom.xml

@@ -25,6 +25,7 @@
             <artifactId>warewms-hard</artifactId>
         </dependency>
 
+
     </dependencies>
 
 </project>

+ 3 - 201
warewms-ams/src/main/java/com/ruoyi/ams/xuankuang/service/ProcessLocationService.java

@@ -1,204 +1,6 @@
 package com.ruoyi.ams.xuankuang.service;
 
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.comparator.CompareUtil;
-import cn.hutool.core.io.FileUtil;
-import cn.hutool.core.util.ObjectUtil;
-import com.alibaba.fastjson.JSONObject;
-import com.ruoyi.ams.inv.domain.InvLotLocId;
-import com.ruoyi.ams.inv.service.IInvLotAttService;
-import com.ruoyi.ams.inv.service.IInvLotLocIdService;
-import com.ruoyi.base.domain.BaseLocationInfo;
-import com.ruoyi.base.domain.BaseSku;
-import com.ruoyi.base.service.IBaseLocationInfoService;
-import com.ruoyi.base.service.IBaseSkuService;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import io.netty.util.internal.StringUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.compress.utils.Lists;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.util.Assert;
-
-import java.io.File;
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
-@Service
-@Slf4j
-public class ProcessLocationService {
-
-    private static final String FREE = "00";
-    @Autowired
-    private IBaseLocationInfoService baseLocationInfoService;
-
-    @Autowired
-    private IInvLotAttService invLotAttService;
-
-    @Autowired
-    private IInvLotLocIdService invLotLocIdService;
-
-    @Autowired
-    private IBaseSkuService baseSkuService;
-
-
-    //仓库ID的默认值
-    private static final Long WAREHOUSE_ID = 1L;
-
-
-    /**
-     * 选矿项目调整库存专用脚本
-     *
-     * @author ChenYang
-     */
-    public void handleLoacationInventory(String path) throws Exception {
-
-        Assert.isTrue(StringUtils.isNotBlank(path),"路径不能为空");
-        Map<String, String> skuTypeMapping = getSkuTypeMapping();
-        Assert.isTrue(CollectionUtil.isNotEmpty(skuTypeMapping), "skuTypeMapping is empty");
-
-        //2.到Excel中查询数据
-        //TODO 从路径获取文件
-        File excelFile = FileUtil.file(path);
-        ExcelUtil<ExcelLocLotModel> locLotModelExcelUtil = new ExcelUtil<ExcelLocLotModel>(ExcelLocLotModel.class);
-        List<ExcelLocLotModel> ExcelLocLotList = locLotModelExcelUtil.importExcel(FileUtil.getInputStream(excelFile));
-
-        //2.转json
-        /*String LocLotJsonInfo = "[{\"locationNo\":\"A-01-02\",\"bindSku\":\"C4H9O2PSSNH4\",\"quantity\":50,\"palletNo\":\"TP0023\"},{\"locationNo\":\"A-01-02\",\"bindSku\":\"C4H9O2PSSNH4\",\"quantity\":50,\"palletNo\":\"TP0023\"}]";
-        List<ExcelLocLotModel> ExcelLocLotList = JSONObject.parseArray(LocLotJsonInfo, ExcelLocLotModel.class);*/
-        List<ExcelLocLotModel> errorLocLotList = Lists.newArrayList();
-        for(ExcelLocLotModel locLotModel : ExcelLocLotList){
-            try {
-                String count = locLotModel.getQuantity();
-                BigDecimal quantity = StringUtils.isNotBlank(count) ? new BigDecimal(count) : null;
-                //所需的sku,库位号locationNo以及数量即可操作
-                String locationNo = handleLocationNo(locLotModel.getLocationNo());
-                redressInventory(locationNo, locLotModel.getBindSku(), locLotModel.getPalletNo(), quantity, skuTypeMapping);
-            }catch (RuntimeException ex){
-                log.warn("ex is {}", ex);
-                errorLocLotList.add(locLotModel);
-                continue;
-            }
-        }
-        System.err.println(JSONObject.toJSONString(errorLocLotList));
-    }
-
-
-    public Map<String, String> getSkuTypeMapping(){
-        //1.获取物料号(sku)和物料类型(type)的映射
-        List<BaseSku> skuList = baseSkuService.querySkuList();
-        Map<String, String> skuTypeMapping = skuList.stream().filter(item -> StringUtils.isNotBlank(item.getSku())).collect(Collectors.toMap(BaseSku::getSku, BaseSku::getSkuType));
-        return skuTypeMapping;
-    }
-
-
-    public void oneInventory(String locationNo, String bindSku, String palletNo, String quantity){
-        Map<String, String> skuTypeMapping = getSkuTypeMapping();
-        Assert.isTrue(CollectionUtil.isNotEmpty(skuTypeMapping), "skuTypeMapping is empty");
-        BigDecimal quantity2 = StringUtils.isNotBlank(quantity) ? new BigDecimal(quantity) : null;
-        locationNo = handleLocationNo(locationNo);
-        redressInventory(locationNo, bindSku, palletNo, quantity2, skuTypeMapping);
-    }
-    /**
-     * 重置一个库的库位库存信息
-     * @param locationNo 库位号
-     * @param bindSku
-     * @param palletNo
-     * @param quantity
-     * @param skuTypeMapping
-     */
-    public void redressInventory(String locationNo, String bindSku, String palletNo, BigDecimal quantity, Map<String, String> skuTypeMapping) {
-        //1.通过库位号获得库位的ID
-        BaseLocationInfo baseLocationInfo = baseLocationInfoService.selectBaseLocationInfoByIdOrNo(locationNo, WAREHOUSE_ID);
-        if (ObjectUtil.isNull(baseLocationInfo)) return;
-        if (StringUtils.isBlank(bindSku) && ObjectUtil.isNotNull(quantity)) return;
-
-
-        //2.1 如果当前库位是空的,或者库位数量是空的,则删除inv_lot_loc_id中的库存数据并重置库位数据
-        if((ObjectUtil.isNull(quantity) || CompareUtil.compare(quantity, BigDecimal.ZERO)<=0)){
-            //生成新的批次记录
-            invLotAttService.insertInvLotAtt(bindSku, palletNo);
-            invLotLocIdService.deleteInvLotLocList(baseLocationInfo.getId());
-            reSetLocationInfo(baseLocationInfo, bindSku, Constants.YES, skuTypeMapping);
-            return;
-        }
-
-        if(StringUtils.isNotBlank(bindSku)
-                && ObjectUtil.isNotNull(quantity)
-                && CompareUtil.compare(quantity, BigDecimal.ZERO) > 0){
-            //查出原先的库存情况,如果当前库存SKU不符合,则生成新的批次记录
-            List<InvLotLocId> invLotLocList = invLotLocIdService.getInvLotLocList(baseLocationInfo.getId());
-            if(CollectionUtil.isNotEmpty(invLotLocList)){
-                //此时数据是错的都要重新生成库存
-                List<String> skuList = invLotLocList.stream().map(item -> item.getSku()).collect(Collectors.toList());
-                if(CollectionUtil.isEmpty(skuList) || skuList.size() > 1 || !StringUtils.equals(skuList.get(0), bindSku)){
-                    //生成新的批次记录
-                    String lotnum = invLotAttService.insertInvLotAtt(bindSku, palletNo);
-                    //删除原先的库存记录`,生成新的库存记录
-                    invLotLocIdService.deleteInvLotLocList(baseLocationInfo.getId());
-                    invLotLocIdService.insertInvLotLocId(baseLocationInfo.getId(), lotnum, bindSku, quantity);
-                    //重置库位数据
-                    reSetLocationInfo(baseLocationInfo, bindSku, Constants.NO, skuTypeMapping);
-                    return;
-                } else {
-                    //此时只有数量是错的,那么update一下数量就好
-                    InvLotLocId invLotLocId = invLotLocList.get(0);
-                    invLotLocId.setQty(quantity);
-                    //TODO  其他关于数量的字段要改嘛
-                    invLotLocId.setQtyEach(quantity);
-                    invLotLocIdService.updateInvLotLocId(invLotLocId);
-                    //重置库存数据
-                    reSetLocationInfo(baseLocationInfo, bindSku, Constants.NO, skuTypeMapping);
-                    return;
-                }
-            }
-        }
-    }
-
-
-    /**
-     * 重置库位表字段
-     * @param baseLocationInfo
-     * @param bindSku 物料号
-     * @param isEmpty
-     * @param skuTypeMapping
-     */
-    private Boolean reSetLocationInfo(BaseLocationInfo baseLocationInfo, String bindSku, String isEmpty, Map<String, String> skuTypeMapping) {
-        //重置当前的库位信息
-        baseLocationInfo.setIsEmpty(isEmpty);
-        baseLocationInfo.setStockStatus(FREE);
-        baseLocationInfo.setUserdefine10(StringUtils.isNotBlank(bindSku) ? bindSku : null);
-        baseLocationInfo.setBindSku(StringUtils.isNotBlank(bindSku) ? skuTypeMapping.get(bindSku) : null );
-        return baseLocationInfoService.reSetLocationInfo(baseLocationInfo);
-    }
-
-
-
-    public static void main(String[] args) {
-//        System.out.println(handleLocationNo("A\t-02\t-08"));
-//        System.out.println(handleLocationNo("  A-02-08"));
-//        System.out.println(handleLocationNo("  -02-08"));
-//        System.out.println(handleLocationNo("Out-02-cache"));
-//        System.out.w's'x'z's'x'x'z(handleLocationNo("STAGE01"));
-    }
-
-
-    private static String handleLocationNo(String locationNo) {
-        if (StringUtils.isBlank(locationNo)) return StringUtil.EMPTY_STRING;
-        Pattern pattern = Pattern.compile("\\s*|\t|\r|\n");
-        Matcher matcher = pattern.matcher(locationNo);
-        String lotNo = matcher.replaceAll(StringUtil.EMPTY_STRING);
-        String start = StringUtils.split(lotNo, "-")[0];
-        if(start.length() == 1 && StringUtils.isAllUpperCase(start)){
-            lotNo = StringUtils.replace(lotNo, "-", "\t-");
-        }
-        return lotNo;
-    }
-
+public interface ProcessLocationService {
+    void handleLoacationInventory(String page) throws Exception;
+    void oneInventory(String locationNo, String bindSku, String palletNo, String quantity);
 }

+ 207 - 0
warewms-ams/src/main/java/com/ruoyi/ams/xuankuang/service/impl/ProcessLocationServiceImpl.java

@@ -0,0 +1,207 @@
+package com.ruoyi.ams.xuankuang.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.comparator.CompareUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.ams.inv.domain.InvLotLocId;
+import com.ruoyi.ams.inv.service.IInvLotAttService;
+import com.ruoyi.ams.inv.service.IInvLotLocIdService;
+import com.ruoyi.ams.xuankuang.service.ExcelLocLotModel;
+import com.ruoyi.ams.xuankuang.service.ProcessLocationService;
+import com.ruoyi.base.domain.BaseLocationInfo;
+import com.ruoyi.base.domain.BaseSku;
+import com.ruoyi.base.service.IBaseLocationInfoService;
+import com.ruoyi.base.service.IBaseSkuService;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import io.netty.util.internal.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.compress.utils.Lists;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+
+import java.io.File;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class ProcessLocationServiceImpl implements ProcessLocationService {
+
+    private static final String FREE = "00";
+    @Autowired
+    private IBaseLocationInfoService baseLocationInfoService;
+
+    @Autowired
+    private IInvLotAttService invLotAttService;
+
+    @Autowired
+    private IInvLotLocIdService invLotLocIdService;
+
+    @Autowired
+    private IBaseSkuService baseSkuService;
+
+
+    //仓库ID的默认值
+    private static final Long WAREHOUSE_ID = 1L;
+
+
+    /**
+     * 选矿项目调整库存专用脚本
+     *
+     * @author ChenYang
+     */
+    @Override
+    public void handleLoacationInventory(String path) throws Exception {
+        Assert.isTrue(StringUtils.isNotBlank(path),"路径不能为空");
+        Map<String, String> skuTypeMapping = getSkuTypeMapping();
+        Assert.isTrue(CollectionUtil.isNotEmpty(skuTypeMapping), "skuTypeMapping is empty");
+
+        //2.到Excel中查询数据
+        //TODO 从路径获取文件
+        File excelFile = FileUtil.file(path);
+        ExcelUtil<ExcelLocLotModel> locLotModelExcelUtil = new ExcelUtil<ExcelLocLotModel>(ExcelLocLotModel.class);
+        List<ExcelLocLotModel> ExcelLocLotList = locLotModelExcelUtil.importExcel(FileUtil.getInputStream(excelFile));
+
+        //2.转json
+        /*String LocLotJsonInfo = "[{\"locationNo\":\"A-01-02\",\"bindSku\":\"C4H9O2PSSNH4\",\"quantity\":50,\"palletNo\":\"TP0023\"},{\"locationNo\":\"A-01-02\",\"bindSku\":\"C4H9O2PSSNH4\",\"quantity\":50,\"palletNo\":\"TP0023\"}]";
+        List<ExcelLocLotModel> ExcelLocLotList = JSONObject.parseArray(LocLotJsonInfo, ExcelLocLotModel.class);*/
+        List<ExcelLocLotModel> errorLocLotList = Lists.newArrayList();
+        for(ExcelLocLotModel locLotModel : ExcelLocLotList){
+            try {
+                String count = locLotModel.getQuantity();
+                BigDecimal quantity = StringUtils.isNotBlank(count) ? new BigDecimal(count) : null;
+                //所需的sku,库位号locationNo以及数量即可操作
+                String locationNo = handleLocationNo(locLotModel.getLocationNo());
+                redressInventory(locationNo, locLotModel.getBindSku(), locLotModel.getPalletNo(), quantity, skuTypeMapping);
+            }catch (RuntimeException ex){
+                log.warn("ex is {}", ex);
+                errorLocLotList.add(locLotModel);
+                continue;
+            }
+        }
+        System.err.println(JSONObject.toJSONString(errorLocLotList));
+    }
+
+
+    public Map<String, String> getSkuTypeMapping(){
+        //1.获取物料号(sku)和物料类型(type)的映射
+        List<BaseSku> skuList = baseSkuService.querySkuList();
+        Map<String, String> skuTypeMapping = skuList.stream().filter(item -> StringUtils.isNotBlank(item.getSku())).collect(Collectors.toMap(BaseSku::getSku, BaseSku::getSkuType));
+        return skuTypeMapping;
+    }
+
+
+    @Override
+    public void oneInventory(String locationNo, String bindSku, String palletNo, String quantity){
+        Map<String, String> skuTypeMapping = getSkuTypeMapping();
+        Assert.isTrue(CollectionUtil.isNotEmpty(skuTypeMapping), "skuTypeMapping is empty");
+        BigDecimal quantity2 = StringUtils.isNotBlank(quantity) ? new BigDecimal(quantity) : null;
+        locationNo = handleLocationNo(locationNo);
+        redressInventory(locationNo, bindSku, palletNo, quantity2, skuTypeMapping);
+    }
+    /**
+     * 重置一个库的库位库存信息
+     * @param locationNo 库位号
+     * @param bindSku
+     * @param palletNo
+     * @param quantity
+     * @param skuTypeMapping
+     */
+    public void redressInventory(String locationNo, String bindSku, String palletNo, BigDecimal quantity, Map<String, String> skuTypeMapping) {
+        //1.通过库位号获得库位的ID
+        BaseLocationInfo baseLocationInfo = baseLocationInfoService.selectBaseLocationInfoByIdOrNo(locationNo, WAREHOUSE_ID);
+        if (ObjectUtil.isNull(baseLocationInfo)) return;
+        if (StringUtils.isBlank(bindSku) && ObjectUtil.isNotNull(quantity)) return;
+
+
+        //2.1 如果当前库位是空的,或者库位数量是空的,则删除inv_lot_loc_id中的库存数据并重置库位数据
+        if((ObjectUtil.isNull(quantity) || CompareUtil.compare(quantity, BigDecimal.ZERO)<=0)){
+            //生成新的批次记录
+            invLotAttService.insertInvLotAtt(bindSku, palletNo);
+            invLotLocIdService.deleteInvLotLocList(baseLocationInfo.getId());
+            reSetLocationInfo(baseLocationInfo, bindSku, Constants.YES, skuTypeMapping);
+            return;
+        }
+
+        if(StringUtils.isNotBlank(bindSku)
+                && ObjectUtil.isNotNull(quantity)
+                && CompareUtil.compare(quantity, BigDecimal.ZERO) > 0){
+            //查出原先的库存情况,如果当前库存SKU不符合,则生成新的批次记录
+            List<InvLotLocId> invLotLocList = invLotLocIdService.getInvLotLocList(baseLocationInfo.getId());
+            if(CollectionUtil.isNotEmpty(invLotLocList)){
+                //此时数据是错的都要重新生成库存
+                List<String> skuList = invLotLocList.stream().map(item -> item.getSku()).collect(Collectors.toList());
+                if(CollectionUtil.isEmpty(skuList) || skuList.size() > 1 || !StringUtils.equals(skuList.get(0), bindSku)){
+                    //生成新的批次记录
+                    String lotnum = invLotAttService.insertInvLotAtt(bindSku, palletNo);
+                    //删除原先的库存记录`,生成新的库存记录
+                    invLotLocIdService.deleteInvLotLocList(baseLocationInfo.getId());
+                    invLotLocIdService.insertInvLotLocId(baseLocationInfo.getId(), lotnum, bindSku, quantity);
+                    //重置库位数据
+                    reSetLocationInfo(baseLocationInfo, bindSku, Constants.NO, skuTypeMapping);
+                    return;
+                } else {
+                    //此时只有数量是错的,那么update一下数量就好
+                    InvLotLocId invLotLocId = invLotLocList.get(0);
+                    invLotLocId.setQty(quantity);
+                    //TODO  其他关于数量的字段要改嘛
+                    invLotLocId.setQtyEach(quantity);
+                    invLotLocIdService.updateInvLotLocId(invLotLocId);
+                    //重置库存数据
+                    reSetLocationInfo(baseLocationInfo, bindSku, Constants.NO, skuTypeMapping);
+                    return;
+                }
+            }
+        }
+    }
+
+
+    /**
+     * 重置库位表字段
+     * @param baseLocationInfo
+     * @param bindSku 物料号
+     * @param isEmpty
+     * @param skuTypeMapping
+     */
+    private Boolean reSetLocationInfo(BaseLocationInfo baseLocationInfo, String bindSku, String isEmpty, Map<String, String> skuTypeMapping) {
+        //重置当前的库位信息
+        baseLocationInfo.setIsEmpty(isEmpty);
+        baseLocationInfo.setStockStatus(FREE);
+        baseLocationInfo.setUserdefine10(StringUtils.isNotBlank(bindSku) ? bindSku : null);
+        baseLocationInfo.setBindSku(StringUtils.isNotBlank(bindSku) ? skuTypeMapping.get(bindSku) : null );
+        return baseLocationInfoService.reSetLocationInfo(baseLocationInfo);
+    }
+
+
+
+    public static void main(String[] args) {
+//        System.out.println(handleLocationNo("A\t-02\t-08"));
+//        System.out.println(handleLocationNo("  A-02-08"));
+//        System.out.println(handleLocationNo("  -02-08"));
+//        System.out.println(handleLocationNo("Out-02-cache"));
+//        System.out.w's'x'z's'x'x'z(handleLocationNo("STAGE01"));
+    }
+
+
+    private static String handleLocationNo(String locationNo) {
+        if (StringUtils.isBlank(locationNo)) return StringUtil.EMPTY_STRING;
+        Pattern pattern = Pattern.compile("\\s*|\t|\r|\n");
+        Matcher matcher = pattern.matcher(locationNo);
+        String lotNo = matcher.replaceAll(StringUtil.EMPTY_STRING);
+        String start = StringUtils.split(lotNo, "-")[0];
+        if(start.length() == 1 && StringUtils.isAllUpperCase(start)){
+            lotNo = StringUtils.replace(lotNo, "-", "\t-");
+        }
+        return lotNo;
+    }
+
+}