From ad03b64b238e09a63990184aecb6bd99d402be40 Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Thu, 16 Oct 2025 13:26:38 +0800 Subject: [PATCH] =?UTF-8?q?2025-10-16=20=E9=87=87=E8=B4=AD=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E7=94=9F=E6=88=90=E5=A2=9E=E5=8A=A0=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/PurchaseArrivalServiceImpl.java | 2 +- .../wms/controller/WmsPrintController.java | 73 +++++++- .../gaotao/modules/wms/dao/WmsPrintDao.java | 33 +++- .../wms/entity/PoOrderRollNoImportData.java | 73 ++++++++ .../modules/wms/service/WmsPrintService.java | 22 ++- .../wms/service/impl/WmsPrintServiceImpl.java | 156 +++++++++++++++++- .../resources/mapper/wms/WmsPrintMapper.xml | 106 +++++++++--- 7 files changed, 432 insertions(+), 33 deletions(-) create mode 100644 src/main/java/com/gaotao/modules/wms/entity/PoOrderRollNoImportData.java diff --git a/src/main/java/com/gaotao/modules/oa/service/impl/PurchaseArrivalServiceImpl.java b/src/main/java/com/gaotao/modules/oa/service/impl/PurchaseArrivalServiceImpl.java index 82104f5..80089c9 100644 --- a/src/main/java/com/gaotao/modules/oa/service/impl/PurchaseArrivalServiceImpl.java +++ b/src/main/java/com/gaotao/modules/oa/service/impl/PurchaseArrivalServiceImpl.java @@ -159,7 +159,7 @@ public class PurchaseArrivalServiceImpl implements PurchaseArrivalService { params2.add(relatedOrderLineNo); params2.add(""); params2.add(requiredQtyCount); - params2.add(orderQty); + params2.add(requiredQty); params2.add("SYSTEM"); params2.add(supplierId); params2.add("IQC"); diff --git a/src/main/java/com/gaotao/modules/wms/controller/WmsPrintController.java b/src/main/java/com/gaotao/modules/wms/controller/WmsPrintController.java index b3bcd6a..a8ccddd 100644 --- a/src/main/java/com/gaotao/modules/wms/controller/WmsPrintController.java +++ b/src/main/java/com/gaotao/modules/wms/controller/WmsPrintController.java @@ -3,18 +3,16 @@ package com.gaotao.modules.wms.controller; import com.gaotao.common.utils.PageUtils; import com.gaotao.common.utils.R; import com.gaotao.modules.inventoryStock.entity.InventoryStockOutData; -import com.gaotao.modules.toolman.entity.ToolHeader; -import com.gaotao.modules.toolman.query.ToolHeaderQuery; import com.gaotao.modules.wms.data.InboundQcResultData; import com.gaotao.modules.wms.data.PoOrderRollNoOutData; +import com.gaotao.modules.wms.entity.PoOrderRollNoImportData; import com.gaotao.modules.wms.service.WmsPrintService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.util.List; +import java.util.Map; @RestController @@ -128,5 +126,68 @@ public class WmsPrintController { return R.ok().put("rows", rows); } + /** + * @description 采购标签Excel批量导入 + * @author AI + * @date 2025/10/16 + * @param file Excel文件 + * @param site 工厂 + * @param buNo BU + * @param orderNo 通知单号 + * @param partNo 物料编码 + * @param partDesc 物料名称 + * @param poOrderNo 采购订单号 + * @param poItemNo 采购订单行号 + * @param supplierId 供应商编码 + * @param supplierName 供应商名称 + * @param orderQty 订单数量 + * @param inspectionNo 检验单号 + * @param createBy 创建人 + * @return R + */ + @PostMapping("/uploadPoPartPrintExcel") + public R uploadPoPartPrintExcel(@RequestParam(value = "file") MultipartFile file, + @RequestParam(value = "site") String site, + @RequestParam(value = "buNo") String buNo, + @RequestParam(value = "orderNo") String orderNo, + @RequestParam(value = "partNo") String partNo, + @RequestParam(value = "partDesc") String partDesc, + @RequestParam(value = "poOrderNo") String poOrderNo, + @RequestParam(value = "poItemNo") String poItemNo, + @RequestParam(value = "supplierId") String supplierId, + @RequestParam(value = "supplierName") String supplierName, + @RequestParam(value = "orderQty") String orderQty, + @RequestParam(value = "inspectionNo") String inspectionNo, + @RequestParam(value = "createBy") String createBy){ + PoOrderRollNoImportData importData = new PoOrderRollNoImportData(); + importData.setSite(site); + importData.setBuNo(buNo); + importData.setOrderNo(orderNo); + importData.setPartNo(partNo); + importData.setPartDesc(partDesc); + importData.setPoOrderNo(poOrderNo); + importData.setPoItemNo(poItemNo); + importData.setSupplierId(supplierId); + importData.setSupplierName(supplierName); + importData.setOrderQty(orderQty); + importData.setInspectionNo(inspectionNo); + importData.setCreateBy(createBy); + wmsPrintService.uploadPoPartPrintExcel(file, importData); + return R.ok("导入成功"); + } + + /** + * @description 查询文件ID(用于下载模板) + * @author AI + * @date 2025/10/16 + * @param params 查询参数 + * @return R + */ + @PostMapping("/queryFileId") + public R queryFileId(@RequestBody Map params){ + Map result = wmsPrintService.queryFileId(params); + return R.ok().put("data", result); + } + } \ No newline at end of file diff --git a/src/main/java/com/gaotao/modules/wms/dao/WmsPrintDao.java b/src/main/java/com/gaotao/modules/wms/dao/WmsPrintDao.java index f9df92c..329cfdd 100644 --- a/src/main/java/com/gaotao/modules/wms/dao/WmsPrintDao.java +++ b/src/main/java/com/gaotao/modules/wms/dao/WmsPrintDao.java @@ -1,10 +1,8 @@ package com.gaotao.modules.wms.dao; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.gaotao.modules.inventoryStock.entity.InventoryStockOutData; -import com.gaotao.modules.pms.data.QcDetailReport; import com.gaotao.modules.wms.data.InboundQcResultData; import com.gaotao.modules.wms.data.PoOrderRollNoOutData; import org.apache.ibatis.annotations.Mapper; @@ -59,4 +57,35 @@ public interface WmsPrintDao { */ List getWarehouseList(InventoryStockOutData data); + /** + * @description 查询物料有效期信息 + * @author AI + * @date 2025/10/16 + * @param site 工厂 + * @param buNo BU + * @param partNo 物料编码 + * @return 物料有效期信息 + */ + PoOrderRollNoOutData getPartExpirationInfo(@Param("site") String site, @Param("buNo") String buNo, @Param("partNo") String partNo); + + /** + * @description 查询文件信息 + * @author AI + * @date 2025/10/16 + * @param orderRef1 参考1 + * @param orderRef2 参考2 + * @return 文件信息 + */ + java.util.Map queryFileId(@Param("orderRef1") String orderRef1, @Param("orderRef2") String orderRef2); + + /** + * @description 检查标签条码是否已存在 + * @author AI + * @date 2025/10/16 + * @param site 工厂 + * @param rollNo 标签条码 + * @return 存在返回数量,不存在返回0 + */ + int checkRollNoExists(@Param("site") String site, @Param("rollNo") String rollNo); + } \ No newline at end of file diff --git a/src/main/java/com/gaotao/modules/wms/entity/PoOrderRollNoImportData.java b/src/main/java/com/gaotao/modules/wms/entity/PoOrderRollNoImportData.java new file mode 100644 index 0000000..e849967 --- /dev/null +++ b/src/main/java/com/gaotao/modules/wms/entity/PoOrderRollNoImportData.java @@ -0,0 +1,73 @@ +package com.gaotao.modules.wms.entity; + +import lombok.Data; + +/** + * @CLASSNAME PoOrderRollNoImportData + * @DESCRIPTION 采购标签导入数据实体 + * @DATE 2025/10/16 + * @VERSION 1.0 + **/ +@Data +public class PoOrderRollNoImportData { + /** + * 工厂 + */ + private String site; + + /** + * BU + */ + private String buNo; + + /** + * 通知单号 + */ + private String orderNo; + + /** + * 物料编码 + */ + private String partNo; + + /** + * 物料名称 + */ + private String partDesc; + + /** + * 采购订单号 + */ + private String poOrderNo; + + /** + * 采购订单行号 + */ + private String poItemNo; + + /** + * 供应商编码 + */ + private String supplierId; + + /** + * 供应商名称 + */ + private String supplierName; + + /** + * 订单数量 + */ + private String orderQty; + + /** + * 检验单号 + */ + private String inspectionNo; + + /** + * 创建人 + */ + private String createBy; +} + diff --git a/src/main/java/com/gaotao/modules/wms/service/WmsPrintService.java b/src/main/java/com/gaotao/modules/wms/service/WmsPrintService.java index fcb8584..30ba5f9 100644 --- a/src/main/java/com/gaotao/modules/wms/service/WmsPrintService.java +++ b/src/main/java/com/gaotao/modules/wms/service/WmsPrintService.java @@ -4,9 +4,11 @@ import com.gaotao.common.utils.PageUtils; import com.gaotao.modules.inventoryStock.entity.InventoryStockOutData; import com.gaotao.modules.wms.data.InboundQcResultData; import com.gaotao.modules.wms.data.PoOrderRollNoOutData; -import org.springframework.web.bind.annotation.RequestBody; +import com.gaotao.modules.wms.entity.PoOrderRollNoImportData; +import org.springframework.web.multipart.MultipartFile; import java.util.List; +import java.util.Map; /** * @CLASSNAME WmsPrintService @@ -59,4 +61,22 @@ public interface WmsPrintService { * @return 仓库列表 */ List getWarehouseList(InventoryStockOutData inData); + + /** + * @description 采购标签Excel批量导入 + * @author AI + * @date 2025/10/16 + * @param file Excel文件 + * @param importData 导入数据 + */ + void uploadPoPartPrintExcel(MultipartFile file, PoOrderRollNoImportData importData); + + /** + * @description 查询文件ID(用于下载模板) + * @author AI + * @date 2025/10/16 + * @param params 查询参数 + * @return 文件信息 + */ + Map queryFileId(Map params); } \ No newline at end of file diff --git a/src/main/java/com/gaotao/modules/wms/service/impl/WmsPrintServiceImpl.java b/src/main/java/com/gaotao/modules/wms/service/impl/WmsPrintServiceImpl.java index d5d6c14..51d160b 100644 --- a/src/main/java/com/gaotao/modules/wms/service/impl/WmsPrintServiceImpl.java +++ b/src/main/java/com/gaotao/modules/wms/service/impl/WmsPrintServiceImpl.java @@ -5,22 +5,28 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.gaotao.common.utils.DateUtils; import com.gaotao.common.utils.PageUtils; import com.gaotao.modules.inventoryStock.entity.InventoryStockOutData; -import com.gaotao.modules.pms.data.QcDetailReport; import com.gaotao.modules.sys.entity.SysUserEntity; import com.gaotao.modules.trans.entity.TransNoControl; import com.gaotao.modules.trans.service.TransNoControlService; import com.gaotao.modules.wms.dao.WmsPrintDao; import com.gaotao.modules.wms.data.InboundQcResultData; import com.gaotao.modules.wms.data.PoOrderRollNoOutData; +import com.gaotao.modules.wms.entity.PoOrderRollNoImportData; import com.gaotao.modules.wms.service.WmsPrintService; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import java.io.InputStream; import java.math.BigDecimal; +import java.text.SimpleDateFormat; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; /** * @CLASSNAME WmsPrintServiceImpl @@ -137,4 +143,150 @@ public class WmsPrintServiceImpl implements WmsPrintService { public List getWarehouseList(InventoryStockOutData inData){ return wmsPrintDao.getWarehouseList(inData); } + + @Override + @Transactional + public void uploadPoPartPrintExcel(MultipartFile file, PoOrderRollNoImportData importData) { + InputStream is = null; + XSSFWorkbook workbook = null; + try { + // 转流 + is = file.getInputStream(); + // 读取工作簿 + workbook = new XSSFWorkbook(is); + // 读取工作表 + XSSFSheet sheet = workbook.getSheetAt(0); + // 获取行数 + int rows = sheet.getPhysicalNumberOfRows(); + + // 查询物料有效期信息(只需查询一次) + PoOrderRollNoOutData partInfo = wmsPrintDao.getPartExpirationInfo( + importData.getSite(), + importData.getBuNo(), + importData.getPartNo() + ); + + // 遍历每一行(从第二行开始) + for (int j = 1; j < rows; j++) { + // 获得该行 + XSSFRow row = sheet.getRow(j); + if (row == null) { + continue; + } + + // 创建保存对象 + PoOrderRollNoOutData saveData = new PoOrderRollNoOutData(); + + // 从主信息行获取的字段 + saveData.setSite(importData.getSite()); + saveData.setBuNo(importData.getBuNo()); + saveData.setInspectionNo(importData.getInspectionNo()); + saveData.setOrderNo(importData.getPoOrderNo()); + saveData.setItemNo(importData.getPoItemNo()); + saveData.setPartNo(importData.getPartNo()); + saveData.setPartDesc(importData.getPartDesc()); + saveData.setSupplierId(importData.getSupplierId()); + saveData.setSupplierName(importData.getSupplierName()); + saveData.setOrderQty(importData.getOrderQty()); + + // 从Excel中读取的字段 + // 标签条码(roll_no)- 第1列(索引0) + String rollNo = null; + if (row.getCell(0) != null) { + if (row.getCell(0).getCellType() == org.apache.poi.ss.usermodel.CellType.NUMERIC) { + // 如果是数字类型,转换为字符串 + rollNo = String.valueOf((long)row.getCell(0).getNumericCellValue()); + } else { + rollNo = row.getCell(0).getStringCellValue(); + } + } else { + throw new RuntimeException("第" + (j + 1) + "行:标签条码不能为空"); + } + + // 校验标签条码是否重复 + int existCount = wmsPrintDao.checkRollNoExists(importData.getSite(), rollNo); + if (existCount > 0) { + throw new RuntimeException("第" + (j + 1) + "行:标签条码 [" + rollNo + "] 已存在,不能重复导入"); + } + + saveData.setRollNo(rollNo); + + // 标签数量(roll_qty)- 第2列(索引1) + if (row.getCell(1) != null) { + saveData.setRollQty(new BigDecimal(row.getCell(1).getNumericCellValue())); + } else { + throw new RuntimeException("第" + (j + 1) + "行:标签数量不能为空"); + } + + // 批次号(batch_no)- 第3列(索引2) + if (row.getCell(2) != null) { + if (row.getCell(2).getCellType() == org.apache.poi.ss.usermodel.CellType.NUMERIC) { + saveData.setBatchNo(String.valueOf((long)row.getCell(2).getNumericCellValue())); + } else { + String batchNo = row.getCell(2).getStringCellValue(); + // 如果批次号是 * 则设置为空字符串 + saveData.setBatchNo("*".equals(batchNo) ? "" : batchNo); + } + } else { + saveData.setBatchNo(""); + } + + // 生产日期(production_date)- 第4列(索引3) + if (row.getCell(3) != null) { + if (row.getCell(3).getCellType() == org.apache.poi.ss.usermodel.CellType.NUMERIC) { + saveData.setProductionDate(row.getCell(3).getDateCellValue()); + } else { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + saveData.setProductionDate(sdf.parse(row.getCell(3).getStringCellValue())); + } + } else { + throw new RuntimeException("第" + (j + 1) + "行:生产日期不能为空"); + } + + // 默认值字段 + saveData.setCreatedBy(importData.getCreateBy()); + saveData.setDelflag("N"); + saveData.setVersion(0); + saveData.setPrintFlag(0); + saveData.setHardtagInFlag("未入库"); + + // 计算有效期相关日期 + if (partInfo != null && "Y".equals(partInfo.getExpirationFlag()) && saveData.getProductionDate() != null) { + if (partInfo.getExpirationDay() != null && partInfo.getExpirationDay() > 0) { + saveData.setExpirationDate(DateUtils.addDateDays(saveData.getProductionDate(), partInfo.getExpirationDay())); + } + if (partInfo.getExpirationWarningDay() != null && partInfo.getExpirationWarningDay() > 0) { + saveData.setExpirationWarningDate(DateUtils.addDateDays(saveData.getProductionDate(), partInfo.getExpirationWarningDay())); + } + } + + // 保存数据 + wmsPrintDao.savePoOrderRollNo(saveData); + } + } catch (Exception e) { + throw new RuntimeException("导入失败:" + e.getMessage()); + } finally { + try { + if (workbook != null) { + workbook.close(); + } + if (is != null) { + is.close(); + } + } catch (Exception e) { + // 忽略关闭异常 + } + } + } + + @Override + public Map queryFileId(Map params) { + String orderRef1 = params.get("orderRef1"); + String orderRef2 = params.get("orderRef2"); + Map result = wmsPrintDao.queryFileId(orderRef1, orderRef2); + if (result == null) { + throw new RuntimeException("未找到模板文件"); + } + return result; + } } \ No newline at end of file diff --git a/src/main/resources/mapper/wms/WmsPrintMapper.xml b/src/main/resources/mapper/wms/WmsPrintMapper.xml index efff068..bdc6466 100644 --- a/src/main/resources/mapper/wms/WmsPrintMapper.xml +++ b/src/main/resources/mapper/wms/WmsPrintMapper.xml @@ -4,11 +4,27 @@ - select ROW_NUMBER() OVER (ORDER BY a.created_date) orderId,a.site,a.bu_no,a.inspection_no,a.order_no,a.item_no,a.roll_no,a.roll_qty,a.part_no,a.part_desc,a.supplier_id,a.supplier_name, - a.order_qty,a.created_by,a.created_date,a.update_by,a.updated_date,a.delflag,a.version,a.print_flag,a.citem_code, - a.citem_class,a.sendto_address,a.hardtag_in_flag,a.batch_no,a.production_date,a.validity_period,a.chip_disk_no, - a.expiration_warning_date,a.expiration_date - + SELECT + ROW_NUMBER () OVER (ORDER BY a.created_date) orderId, + a.site, + a.bu_no, + a.inspection_no, + a.order_no, + a.item_no, + a.roll_no, + a.roll_qty, + a.part_no, + a.part_desc, + a.supplier_id, + a.supplier_name, + a.order_qty, + a.created_by, + a.created_date, + a.update_by, + a.updated_date, + a.delflag, + a.version, + a.print_flag, + a.citem_code, + a.citem_class, + a.sendto_address, + a.hardtag_in_flag, + a.batch_no, + a.production_date, + a.validity_period, + a.chip_disk_no, + a.expiration_warning_date, + a.expiration_date from po_order_roll_no a - - - and A.site=#{site} - - - and A.bu_no=#{buNo} - - - and A.inspection_no=#{inspectionNo,jdbcType=VARCHAR} - - + where + A.site = #{site} and A.bu_no = #{buNo} + and A.inspection_no = #{inspectionNo,jdbcType=VARCHAR} + + + + + + + + + UPDATE inventory_stock