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