From e70a91570643c9ea174ba2f391945a568f23fa2e Mon Sep 17 00:00:00 2001
From: youjie <272855983@qq.com>
Date: Wed, 23 Oct 2024 15:59:46 +0800
Subject: [PATCH] 增加平库库存导入功能

---
 ant-design-vue-jeecg/src/views/system/inventory/SimpleInventoryDetailList.vue                                            | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/material/controller/MaterialController.java                  | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryDetail/controller/InventoryDetailController.java | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 3 files changed, 218 insertions(+), 7 deletions(-)

diff --git a/ant-design-vue-jeecg/src/views/system/inventory/SimpleInventoryDetailList.vue b/ant-design-vue-jeecg/src/views/system/inventory/SimpleInventoryDetailList.vue
index ec5eb73..584f1f6 100644
--- a/ant-design-vue-jeecg/src/views/system/inventory/SimpleInventoryDetailList.vue
+++ b/ant-design-vue-jeecg/src/views/system/inventory/SimpleInventoryDetailList.vue
@@ -141,6 +141,15 @@
         :action="importExcelUrl"
         @change="handleImportExcel"><a-button type="primary" icon="import">导入</a-button>
       </a-upload>
+      <a-upload
+        v-has="'inventoryDetail:import'"
+        name="file"
+        :showUploadList="false"
+        :multiple="false"
+        :headers="tokenHeader"
+        :action="importPinkuUrl"
+        @change="handleImportExcel"><a-button type="primary" icon="import">平库库存导入</a-button>
+      </a-upload>
       <a-button v-has="'inventoryDetail:controller'" @click='controller()' type='primary'>冻结</a-button>
       <a-button v-has="'inventoryDetail:releaseController'" @click='releaseController()' type='primary'>释放冻结</a-button>
       <a-button v-has="'inventoryHeader:quickShipmentInventoryHeader'" @click='quickShipment()' type='primary'>快速出库</a-button>
@@ -274,6 +283,9 @@ import Pagination from '@/components/jeecgbiz/Pagination'
 import ellipsis from "@comp/Ellipsis";
 import ExpressStorageModal from "@views/system/monitor/modules/ExpressStorageModal.vue"; //引入 Pagination组件
 import ExpressDeliveryModal from "@views/system/monitor/modules/ExpressDeliveryModal";
+import Vue from "vue";
+import {ACCESS_TOKEN} from "@/store/mutation-types";
+import store from "@/store";
 
 export default {
   name: 'SimpleInventoryDetailList',
@@ -470,6 +482,7 @@ export default {
         deleteBatch: '/inventory/inventoryDetail/deleteBatch',
         exportXlsUrl: '/inventory/inventoryDetail/exportXls',
         importExcelUrl: 'inventory/inventoryDetail/importExcel',
+        importPinkuUrl: 'inventory/inventoryDetail/importPinku',
         controller: 'inventory/inventoryHeader/controller',
         quickShipment: 'inventory/inventoryHeader/quickShipment',
         releaseController: 'inventory/inventoryHeader/releaseController',
@@ -485,6 +498,57 @@ export default {
     this.loadFrom()
     this.getSuperFieldList()
   },
+  handleImportPinku(info) {
+    this.loading = true;
+    if (info.file.status !== 'uploading') {
+      console.log(info.file, info.fileList);
+    }
+    if (info.file.status === 'done') {
+      this.loading = false;
+      if (info.file.response.success) {
+        // this.$message.success(`${info.file.name} 文件上传成功`);
+        if (info.file.response.code === 201) {
+          let {message, result: {msg, fileUrl, fileName}} = info.file.response
+          let href = window._CONFIG['domianURL'] + fileUrl
+          this.$warning({
+            title: message,
+            content: (<div>
+                <span>{msg}</span><br/>
+                <span>具体详情请 <a href={href} target="_blank" download={fileName}>点击下载</a> </span>
+              </div>
+            )
+          })
+        } else {
+          this.$message.success(info.file.response.message || `${info.file.name} 文件上传成功`)
+        }
+        this.loadData()
+      } else {
+        this.$message.error(`${info.file.name} ${info.file.response.message}.`);
+      }
+    } else if (info.file.status === 'error') {
+      this.loading = false;
+      if (info.file.response.status === 500) {
+        let data = info.file.response
+        const token = Vue.ls.get(ACCESS_TOKEN)
+        if (token && data.message.includes("Token失效")) {
+          this.$error({
+            title: '登录已过期',
+            content: '很抱歉,登录已过期,请重新登录',
+            okText: '重新登录',
+            mask: false,
+            onOk: () => {
+              store.dispatch('Logout').then(() => {
+                Vue.ls.remove(ACCESS_TOKEN)
+                window.location.reload();
+              })
+            }
+          })
+        }
+      } else {
+        this.$message.error(`文件上传失败: ${info.file.msg} `);
+      }
+    }
+  },
   mounted() {
     if(this.firstLoad == 0) {
       this.firstLoad = 1;
@@ -503,6 +567,9 @@ export default {
   computed: {
     importExcelUrl: function () {
       return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
+    },
+    importPinkuUrl: function () {
+      return `${window._CONFIG['domianURL']}/${this.url.importPinkuUrl}`
     }
   },
   methods: {
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/material/controller/MaterialController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/material/controller/MaterialController.java
index 3303d0c..f6446e2 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/material/controller/MaterialController.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/material/controller/MaterialController.java
@@ -1,8 +1,8 @@
 package org.jeecg.modules.wms.config.material.controller;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -16,8 +16,12 @@ import org.jeecg.modules.wms.config.material.entity.Material;
 import org.jeecg.modules.wms.config.material.entity.SearchDomain;
 import org.jeecg.modules.wms.config.material.service.IMaterialService;
 import org.jeecg.utils.HuahengJwtUtil;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.entity.ImportParams;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
 import org.springframework.web.servlet.ModelAndView;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -171,7 +175,59 @@ public class MaterialController extends JeecgController<Material, IMaterialServi
     @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
     @RequiresPermissions("material:import")
     public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
-        return super.importExcel(request, response, Material.class);
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        Iterator var6 = fileMap.entrySet().iterator();
+        if (var6.hasNext()) {
+            Map.Entry<String, MultipartFile> entity = (Map.Entry)var6.next();
+            MultipartFile file = (MultipartFile)entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+
+            try {
+                String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(request);
+                List<Material> list = ExcelImportUtil.importExcel(file.getInputStream(), Material.class, params);
+                long start = System.currentTimeMillis();
+                List<Material> materialList = materialService.list();
+                List<String> materialCodeList = materialList.stream().map(Material::getCode).collect(Collectors.toList());
+                List<Material> removeMaterialList = new ArrayList<>();
+                for (Material material : list) {
+                    if (materialCodeList.contains(material.getCode())) {
+                        removeMaterialList.add(material);
+                    }
+                    material.setWarehouseCode(warehouseCode);
+                }
+                list.removeAll(removeMaterialList);
+                if (!list.isEmpty()) {
+                    this.service.saveBatch(list);
+                }
+                log.info("消耗时间" + (System.currentTimeMillis() - start) + "毫秒");
+                Result var13 = Result.ok("文件导入成功!数据行数:" + list.size());
+                return var13;
+            } catch (Exception var24) {
+                String msg = var24.getMessage();
+                log.error(msg, var24);
+                Result var12;
+                if (msg != null && msg.indexOf("Duplicate entry") >= 0) {
+                    var12 = Result.error("文件导入失败:有重复数据!");
+                    return var12;
+                } else {
+                    var12 = Result.error("文件导入失败:" + var24.getMessage());
+                    return var12;
+                }
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException var23) {
+                    var23.printStackTrace();
+                }
+
+            }
+        } else {
+            return Result.error("文件导入失败!");
+        }
     }
 
     /**
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryDetail/controller/InventoryDetailController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryDetail/controller/InventoryDetailController.java
index 85f6593..05aed24 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryDetail/controller/InventoryDetailController.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryDetail/controller/InventoryDetailController.java
@@ -1,9 +1,8 @@
 package org.jeecg.modules.wms.inventory.inventoryDetail.controller;
 
+import java.io.IOException;
 import java.math.BigDecimal;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import javax.annotation.Resource;
@@ -14,14 +13,26 @@ import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.system.base.controller.JeecgController;
 import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.wms.api.mobile.entity.QuickReceiptBean;
+import org.jeecg.modules.wms.config.material.entity.Material;
 import org.jeecg.modules.wms.config.zone.entity.Zone;
 import org.jeecg.modules.wms.config.zone.service.IZoneService;
+import org.jeecg.modules.wms.framework.service.IHuahengMultiHandlerService;
 import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryDetail;
 import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryDetailService;
+import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptDetail;
+import org.jeecg.modules.wms.receipt.receiving.controller.ReceiveController;
+import org.jeecg.modules.wms.receipt.receiving.domain.Receive;
+import org.jeecg.modules.wms.receipt.receiving.service.IReceiveService;
 import org.jeecg.utils.HuahengJwtUtil;
 import org.jeecg.utils.StringUtils;
+import org.jeecg.utils.constant.QuantityConstant;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.entity.ImportParams;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
 import org.springframework.web.servlet.ModelAndView;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -50,6 +61,10 @@ public class InventoryDetailController extends JeecgController<InventoryDetail, 
 
     @Resource
     private IZoneService zoneService;
+    @Resource
+    private IReceiveService receiveService;
+    @Resource
+    private IHuahengMultiHandlerService huahengMultiHandlerService;
 
     /**
      * 分页列表查询
@@ -257,6 +272,79 @@ public class InventoryDetailController extends JeecgController<InventoryDetail, 
     }
 
     /**
+     * 通过excel导入平库库存数据
+     * @param  request
+     * @param  response
+     * @return
+     */
+    @RequestMapping(value = "/importPinku", method = RequestMethod.POST)
+    public Result<?> importPinku(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        Iterator var6 = fileMap.entrySet().iterator();
+        if (var6.hasNext()) {
+            Map.Entry<String, MultipartFile> entity = (Map.Entry)var6.next();
+            MultipartFile file = (MultipartFile)entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+
+            try {
+                long start = System.currentTimeMillis();
+                String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(request);
+                List<InventoryDetail> inventoryDetailList = ExcelImportUtil.importExcel(file.getInputStream(), InventoryDetail.class, params);
+                if (!inventoryDetailList.isEmpty()) {
+                    inventoryDetailList = inventoryDetailList.stream().filter(x->x.getZoneType().equals(QuantityConstant.ZONE_TYPE_FLAT)).collect(Collectors.toList());
+                }
+                for (InventoryDetail inventoryDetail : inventoryDetailList) {
+                    List<ReceiptDetail> receiptDetailList = new ArrayList<>();
+                    ReceiptDetail receiptDetail = new ReceiptDetail();
+                    receiptDetail.setBatch(inventoryDetail.getBatch());
+                    receiptDetail.setQty(inventoryDetail.getQty());
+                    receiptDetail.setInventoryStatus(inventoryDetail.getInventoryStatus());
+                    receiptDetail.setMaterialCode(inventoryDetail.getMaterialCode());
+                    receiptDetail.setMaterialName(inventoryDetail.getMaterialName());
+                    receiptDetail.setMaterialUnit(inventoryDetail.getMaterialUnit());
+                    receiptDetail.setMaterialSpec(inventoryDetail.getMaterialSpec());
+                    receiptDetailList.add(receiptDetail);
+                    QuickReceiptBean quickReceiptBean = new QuickReceiptBean();
+                    quickReceiptBean.setWarehouseCode(warehouseCode);
+                    quickReceiptBean.setContainerCode(inventoryDetail.getContainerCode());
+                    quickReceiptBean.setLocationCode(inventoryDetail.getLocationCode());
+                    quickReceiptBean.setCompanyCode(inventoryDetail.getCompanyCode());
+                    quickReceiptBean.setReceiptType(QuantityConstant.RECEIPT_BILL_TYPE_QTR);
+                    quickReceiptBean.setReceiptDetails(receiptDetailList);
+                    huahengMultiHandlerService.quickReceiptService(quickReceiptBean, warehouseCode);
+                }
+                log.info("消耗时间" + (System.currentTimeMillis() - start) + "毫秒");
+                Result var13 = Result.ok("文件导入成功!数据行数:" + inventoryDetailList.size());
+                return var13;
+            } catch (Exception var24) {
+                String msg = var24.getMessage();
+                log.error(msg, var24);
+                Result var12;
+                if (msg != null && msg.indexOf("Duplicate entry") >= 0) {
+                    var12 = Result.error("文件导入失败:有重复数据!");
+                    return var12;
+                } else {
+                    var12 = Result.error("文件导入失败:" + var24.getMessage());
+                    return var12;
+                }
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException var23) {
+                    var23.printStackTrace();
+                }
+
+            }
+        } else {
+            return Result.error("文件导入失败!");
+        }
+    }
+
+    /**
      * 根据多个库存头id分页列表查询
      */
     @ApiOperation(value = "盘点库存-根据多个库存头id分页列表查询", notes = "盘点库存-根据多个库存头id分页列表查询")
--
libgit2 0.22.2