From 7ac9f182ed98f374af95ca3b47aac36c0e3e809d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Fri, 6 Feb 2026 16:24:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(box):=20=E9=87=8D=E6=9E=84=E8=A3=85?= =?UTF-8?q?=E7=AE=B1=E6=B8=85=E5=8D=95=E5=8A=9F=E8=83=BD=E5=B9=B6=E5=A2=9E?= =?UTF-8?q?=E5=BC=BA=E5=BA=8F=E5=88=97=E5=8F=B7=E7=94=9F=E6=88=90=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重命名 BoxController 为 BoxListController - 扩展 BasdeSerialNumberControllerService 中的 generateSerialNumber 方法,支持自定义中间字符串和长度参数 - 在 BoxListController 中新增 getItems 和 getForwards 接口用于获取明细和代发物料列表 - 实现装箱清单 Excel 导出功能,包含基础信息和物料清单数据 - 新增 MaterialCodeForwardImportDTO 数据传输对象用于代发物料导入导出 - 实现代发物料的 Excel 导入导出功能,支持批量处理 - 在 PackagingCodeController 中使用序列号服务生成包装码编号 - 扩展 ShipmentMaterialCodeItemVO 和 ShipmentMaterialCodeQRVO 对象,增加状态和序号字段 - 新增数据库查询方法 getByPackagingCodeId 和 getItemsVOById - 更新 MyBatis 映射文件,优化查询逻辑并添加排序功能 --- .../pojo/vo/ShipmentMaterialCodeItemVO.java | 5 + .../pojo/vo/ShipmentMaterialCodeQRVO.java | 13 +- .../mapper/WmsShipmentDeliveryMapper.java | 1 + .../WmsShipmentPackagingCodeMapper.java | 7 +- .../service/IWmsShipmentDeliveryService.java | 1 + .../IWmsShipmentPackagingCodeService.java | 8 +- .../impl/WmsShipmentDeliveryServiceImpl.java | 4 + .../WmsShipmentPackagingCodeServiceImpl.java | 10 +- .../mapper/WmsShipmentDeliveryMapper.xml | 6 + .../WmsShipmentPackagingCodeItemMapper.xml | 3 +- .../mapper/WmsShipmentPackagingCodeMapper.xml | 9 ++ .../shipment/controller/BoxController.java | 34 ------ .../controller/BoxListController.java | 111 ++++++++++++++++++ .../controller/MaterialCodeController.java | 44 +++++++ .../controller/PackagingCodeController.java | 6 +- .../dto/MaterialCodeForwardImportDTO.java | 38 ++++++ .../BasdeSerialNumberControllerService.java | 15 +-- .../template/发货清单模版.xlsx | Bin 12003 -> 12006 bytes .../template/装箱清单模版.xlsx | Bin 0 -> 12043 bytes 19 files changed, 262 insertions(+), 53 deletions(-) delete mode 100644 nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/BoxController.java create mode 100644 nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/BoxListController.java create mode 100644 nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/MaterialCodeForwardImportDTO.java create mode 100644 nflg-wms-shipment/src/main/resources/template/装箱清单模版.xlsx diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentMaterialCodeItemVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentMaterialCodeItemVO.java index 3cc52db1..7f82121a 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentMaterialCodeItemVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentMaterialCodeItemVO.java @@ -60,6 +60,11 @@ public class ShipmentMaterialCodeItemVO { */ private BigDecimal minPackagingNum; + /** + * 状态,0:未装箱;1:已装箱;5:已安装 + */ + private Integer status; + /** * 创建人 */ diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentMaterialCodeQRVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentMaterialCodeQRVO.java index 4f2558eb..81f9d8d9 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentMaterialCodeQRVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentMaterialCodeQRVO.java @@ -9,6 +9,11 @@ public class ShipmentMaterialCodeQRVO { private Long id; + /** + * 序号 + */ + private Integer index; + /** * 唯一码 */ @@ -25,10 +30,15 @@ public class ShipmentMaterialCodeQRVO { private String materialDescribe; /** - * 数量 + * 应发数量 */ private BigDecimal num; + /** + * 实发数量 + */ + private BigDecimal actualNum; + /** * 单位 */ @@ -38,4 +48,5 @@ public class ShipmentMaterialCodeQRVO { * 状态,0:未装箱;1:已装箱; */ private Integer status; + } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsShipmentDeliveryMapper.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsShipmentDeliveryMapper.java index 7de37bd5..780302c3 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsShipmentDeliveryMapper.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsShipmentDeliveryMapper.java @@ -13,4 +13,5 @@ import com.nflg.wms.repository.entity.WmsShipmentDelivery; */ public interface WmsShipmentDeliveryMapper extends BaseMapper { + WmsShipmentDelivery getByPackagingCodeId(Long id); } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsShipmentPackagingCodeMapper.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsShipmentPackagingCodeMapper.java index f8a4d537..cc85d26a 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsShipmentPackagingCodeMapper.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsShipmentPackagingCodeMapper.java @@ -4,9 +4,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.qo.BoxSearchQO; -import com.nflg.wms.common.pojo.vo.BoxVO; -import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO; -import com.nflg.wms.common.pojo.vo.ShipmentPackagingCodeVO; +import com.nflg.wms.common.pojo.qo.ShipmentSiteStockItemQO; +import com.nflg.wms.common.pojo.vo.*; import com.nflg.wms.repository.entity.WmsShipmentPackagingCode; import java.util.List; @@ -30,4 +29,6 @@ public interface WmsShipmentPackagingCodeMapper extends BaseMapper searchForUnload(String code); List getForInstall(Long id); + + PageData getItemsVOById(ShipmentSiteStockItemQO qo, Page objectPage); } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsShipmentDeliveryService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsShipmentDeliveryService.java index 3791722f..3b4a9d78 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsShipmentDeliveryService.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsShipmentDeliveryService.java @@ -16,4 +16,5 @@ import java.util.List; */ public interface IWmsShipmentDeliveryService extends IService { + WmsShipmentDelivery getByPackagingCodeId(Long id); } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsShipmentPackagingCodeService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsShipmentPackagingCodeService.java index 6043c487..e4ac5ef5 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsShipmentPackagingCodeService.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsShipmentPackagingCodeService.java @@ -2,11 +2,11 @@ package com.nflg.wms.repository.service; import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.qo.BoxSearchQO; -import com.nflg.wms.common.pojo.vo.BoxVO; -import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO; -import com.nflg.wms.common.pojo.vo.ShipmentPackagingCodeVO; +import com.nflg.wms.common.pojo.qo.ShipmentSiteStockItemQO; +import com.nflg.wms.common.pojo.vo.*; import com.nflg.wms.repository.entity.WmsShipmentPackagingCode; import com.baomidou.mybatisplus.extension.service.IService; +import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import java.util.List; @@ -33,4 +33,6 @@ public interface IWmsShipmentPackagingCodeService extends IService searchForUnload(String code); List getForInstall(Long id); + + PageData getItemsVOById(ShipmentSiteStockItemQO qo); } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentDeliveryServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentDeliveryServiceImpl.java index 9d950c76..83a8e545 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentDeliveryServiceImpl.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentDeliveryServiceImpl.java @@ -17,4 +17,8 @@ import org.springframework.stereotype.Service; @Service public class WmsShipmentDeliveryServiceImpl extends ServiceImpl implements IWmsShipmentDeliveryService { + @Override + public WmsShipmentDelivery getByPackagingCodeId(Long id) { + return baseMapper.getByPackagingCodeId(id); + } } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentPackagingCodeServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentPackagingCodeServiceImpl.java index 00d481ce..b02c76fa 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentPackagingCodeServiceImpl.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentPackagingCodeServiceImpl.java @@ -4,9 +4,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.qo.BoxSearchQO; -import com.nflg.wms.common.pojo.vo.BoxVO; -import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO; -import com.nflg.wms.common.pojo.vo.ShipmentPackagingCodeVO; +import com.nflg.wms.common.pojo.qo.ShipmentSiteStockItemQO; +import com.nflg.wms.common.pojo.vo.*; import com.nflg.wms.repository.entity.WmsShipmentPackagingCode; import com.nflg.wms.repository.mapper.WmsShipmentPackagingCodeMapper; import com.nflg.wms.repository.service.IWmsShipmentPackagingCodeService; @@ -55,4 +54,9 @@ public class WmsShipmentPackagingCodeServiceImpl extends ServiceImpl getForInstall(Long id) { return baseMapper.getForInstall(id); } + + @Override + public PageData getItemsVOById(ShipmentSiteStockItemQO qo) { + return baseMapper.getItemsVOById(qo, new Page<>(qo.getPage(), qo.getPageSize())); + } } diff --git a/nflg-wms-repository/src/main/resources/mapper/WmsShipmentDeliveryMapper.xml b/nflg-wms-repository/src/main/resources/mapper/WmsShipmentDeliveryMapper.xml index 3162750e..2f2c1659 100644 --- a/nflg-wms-repository/src/main/resources/mapper/WmsShipmentDeliveryMapper.xml +++ b/nflg-wms-repository/src/main/resources/mapper/WmsShipmentDeliveryMapper.xml @@ -2,4 +2,10 @@ + diff --git a/nflg-wms-repository/src/main/resources/mapper/WmsShipmentPackagingCodeItemMapper.xml b/nflg-wms-repository/src/main/resources/mapper/WmsShipmentPackagingCodeItemMapper.xml index 4e73729a..67268aa4 100644 --- a/nflg-wms-repository/src/main/resources/mapper/WmsShipmentPackagingCodeItemMapper.xml +++ b/nflg-wms-repository/src/main/resources/mapper/WmsShipmentPackagingCodeItemMapper.xml @@ -3,11 +3,12 @@ + + diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/BoxController.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/BoxController.java deleted file mode 100644 index 23a14794..00000000 --- a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/BoxController.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.nflg.wms.shipment.controller; - -import com.nflg.wms.common.pojo.ApiResult; -import com.nflg.wms.common.pojo.PageData; -import com.nflg.wms.common.pojo.qo.BoxSearchQO; -import com.nflg.wms.common.pojo.vo.BoxVO; -import com.nflg.wms.repository.service.IWmsShipmentPackagingCodeService; -import com.nflg.wms.starter.BaseController; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -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; - -/** - * 装箱清单 - */ -@RestController -@RequestMapping("box") -public class BoxController extends BaseController { - - @Resource - private IWmsShipmentPackagingCodeService packagingCodeService; - - /** - * 搜索 - */ - @PostMapping("search") - public ApiResult> search(@Valid @RequestBody BoxSearchQO qo){ - return ApiResult.success(packagingCodeService.searchInCar(qo)); - } - -} diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/BoxListController.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/BoxListController.java new file mode 100644 index 00000000..2f61ecf2 --- /dev/null +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/BoxListController.java @@ -0,0 +1,111 @@ +package com.nflg.wms.shipment.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.nflg.wms.common.pojo.ApiResult; +import com.nflg.wms.common.pojo.PageData; +import com.nflg.wms.common.pojo.qo.BoxSearchQO; +import com.nflg.wms.common.pojo.qo.ShipmentSiteStockItemQO; +import com.nflg.wms.common.pojo.vo.BoxVO; +import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeItemVO; +import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO; +import com.nflg.wms.common.util.VUtil; +import com.nflg.wms.repository.entity.WmsShipmentDelivery; +import com.nflg.wms.repository.entity.WmsShipmentMaterialCodeForward; +import com.nflg.wms.repository.entity.WmsShipmentPackagingCode; +import com.nflg.wms.repository.service.IWmsShipmentDeliveryService; +import com.nflg.wms.repository.service.IWmsShipmentMaterialCodeForwardService; +import com.nflg.wms.repository.service.IWmsShipmentPackagingCodeItemService; +import com.nflg.wms.repository.service.IWmsShipmentPackagingCodeService; +import com.nflg.wms.starter.BaseController; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.ttzero.excel.entity.TemplateSheet; +import org.ttzero.excel.entity.Workbook; + +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 装箱清单 + */ +@RestController +@RequestMapping("box") +public class BoxListController extends BaseController { + + @Resource + private IWmsShipmentPackagingCodeService packagingCodeService; + + @Resource + private IWmsShipmentMaterialCodeForwardService materialCodeForwardService; + + @Resource + private IWmsShipmentDeliveryService deliveryService; + + @Resource + private IWmsShipmentPackagingCodeItemService packagingCodeItemService; + + /** + * 搜索 + */ + @PostMapping("search") + public ApiResult> search(@Valid @RequestBody BoxSearchQO qo) { + return ApiResult.success(packagingCodeService.searchInCar(qo)); + } + + /** + * 获取明细 + */ + @PostMapping("getItems") + public ApiResult> getItems(@Valid @RequestBody ShipmentSiteStockItemQO qo) { + return ApiResult.success(packagingCodeService.getItemsVOById(qo)); + } + + /** + * 获取代发物料列表 + */ + @PostMapping("getForwards") + public ApiResult> getForwards(@Valid @RequestBody ShipmentSiteStockItemQO qo) { + return ApiResult.success(materialCodeForwardService.lambdaQuery() + .eq(WmsShipmentMaterialCodeForward::getPackagingCodeId, qo.getId()) + .orderByAsc(WmsShipmentMaterialCodeForward::getId) + .page(new Page<>(qo.getPage(), qo.getPageSize())) + ); + } + + /** + * 导出装箱清单 + * @param id 装箱清单id + */ + @GetMapping("export") + public void export(HttpServletResponse response, @RequestParam Long id) throws IOException { + WmsShipmentPackagingCode info = packagingCodeService.getById(id); + VUtil.trueThrowBusinessError(Objects.isNull(info)).throwMessage("包装箱不存在"); + WmsShipmentDelivery delivery = deliveryService.getByPackagingCodeId(id); + VUtil.trueThrowBusinessError(Objects.isNull(delivery)).throwMessage("发货单不存在"); + Map base = new HashMap<>(); + base.put("name", info.getName()); + base.put("materialNo", delivery.getMaterialNo()); + base.put("deviceNo", delivery.getDeviceNo()); + base.put("customerName", delivery.getCustomerName()); + base.put("soNo", delivery.getSoNo()); + List list = packagingCodeItemService.getPackList(id); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("装箱清单-" + info.getName() + ".xlsx", StandardCharsets.UTF_8)); + new Workbook() + .addSheet(new TemplateSheet(new ClassPathResource("template/装箱清单模版.xlsx").getInputStream()) + .setData("base", base) + .setData("list", list) + ).writeTo(response.getOutputStream()); + } + +} diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/MaterialCodeController.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/MaterialCodeController.java index 5ff971a1..73219b1d 100644 --- a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/MaterialCodeController.java +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/MaterialCodeController.java @@ -10,10 +10,12 @@ import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.qo.*; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeItemVO; +import com.nflg.wms.common.util.EecExcelUtil; import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.VUtil; import com.nflg.wms.repository.entity.*; import com.nflg.wms.repository.service.*; +import com.nflg.wms.shipment.pojo.dto.MaterialCodeForwardImportDTO; import com.nflg.wms.shipment.service.BasdeSerialNumberControllerService; import com.nflg.wms.shipment.util.KeyUtil; import com.nflg.wms.starter.BaseController; @@ -28,6 +30,7 @@ import org.springframework.http.MediaType; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import org.ttzero.excel.entity.ListSheet; import org.ttzero.excel.entity.TemplateSheet; import org.ttzero.excel.entity.Workbook; import org.ttzero.excel.reader.ExcelReader; @@ -498,6 +501,47 @@ public class MaterialCodeController extends BaseController { return ApiResult.success(info); } + /** + * 代发物料-导出 + */ + @GetMapping("exportForward") + public void exportForward(HttpServletResponse response, @RequestParam Long id) throws IOException { + WmsShipmentMaterialCode materialCode = shipmentMaterialCodeService.getById(id); + VUtil.trueThrowBusinessError(Objects.isNull(materialCode)).throwMessage("清单不存在"); + List list = materialCodeForwardService.lambdaQuery() + .eq(WmsShipmentMaterialCodeForward::getMaterialCodeId, id) + .list(); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("代发物料-" + materialCode.getDeviceNo() + ".xlsx", StandardCharsets.UTF_8)); + new Workbook() + .addSheet(new ListSheet<>(Convert.toList(MaterialCodeForwardImportDTO.class, list))) + .writeTo(response.getOutputStream()); + } + + /** + * 代发物料-导入 + * @param id 清单ID + */ + @PostMapping("importForward") + public ApiResult importForward(@RequestParam("file") MultipartFile file, @RequestParam Long id) throws IOException { + List list = EecExcelUtil.readTo(file.getInputStream(), MaterialCodeForwardImportDTO.class); + list.removeIf(it -> StrUtil.isBlank(it.getMaterialName()) + || Objects.isNull(it.getNum()) + || StrUtil.isBlank(it.getBoxNo())); + if (CollectionUtil.isNotEmpty(list)) { + materialCodeForwardService.saveBatch( + list.stream() + .map(it -> Convert.convert(WmsShipmentMaterialCodeForward.class, it) + .setMaterialCodeId(id) + .setCreateBy(UserUtil.getUserName()) + .setCreateTime(LocalDateTime.now()) + ) + .toList() + ); + } + return ApiResult.success(); + } + /** * 代发物料-添加 */ diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/PackagingCodeController.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/PackagingCodeController.java index 18b91534..655fa0dc 100644 --- a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/PackagingCodeController.java +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/PackagingCodeController.java @@ -17,6 +17,7 @@ import com.nflg.wms.repository.entity.WmsShipmentMaterialCodeItemQr; import com.nflg.wms.repository.entity.WmsShipmentPackagingCode; import com.nflg.wms.repository.entity.WmsShipmentPackagingCodeItem; import com.nflg.wms.repository.service.*; +import com.nflg.wms.shipment.service.BasdeSerialNumberControllerService; import com.nflg.wms.shipment.util.KeyUtil; import com.nflg.wms.starter.BaseController; import jakarta.annotation.Resource; @@ -54,6 +55,9 @@ public class PackagingCodeController extends BaseController { @Resource private IDictionaryItemService dictionaryItemService; + @Resource + private BasdeSerialNumberControllerService serialNumberControllerService; + /** * 新增包装码 */ @@ -62,7 +66,7 @@ public class PackagingCodeController extends BaseController { List datas = new ArrayList<>(); IntStream.range(0, count).forEach(i -> { WmsShipmentPackagingCode packagingCode = new WmsShipmentPackagingCode(); - packagingCode.setNo(KeyUtil.next()); + packagingCode.setNo(serialNumberControllerService.generateSerialNumber(28,"",3)); packagingCode.setCreateBy(UserUtil.getUserName()); packagingCode.setCreateTime(LocalDateTime.now()); datas.add(packagingCode); diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/MaterialCodeForwardImportDTO.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/MaterialCodeForwardImportDTO.java new file mode 100644 index 00000000..4c8439b8 --- /dev/null +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/MaterialCodeForwardImportDTO.java @@ -0,0 +1,38 @@ +package com.nflg.wms.shipment.pojo.dto; + +import lombok.Data; +import org.ttzero.excel.annotation.ExcelColumn; + +import java.math.BigDecimal; + +@Data +public class MaterialCodeForwardImportDTO { + + /** + * 物料名称 + */ + @ExcelColumn("物料名称*") + private String materialName; + + /** + * 应发数量 + */ + @ExcelColumn("应发数量*") + private BigDecimal num; + + /** + * 装箱号 + */ + @ExcelColumn("装箱号*") + private String boxNo; + + /** + * 单位 + */ + private String unit; + + /** + * 备注 + */ + private String remark; +} diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/service/BasdeSerialNumberControllerService.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/service/BasdeSerialNumberControllerService.java index 1b18bbcb..e2d5bc46 100644 --- a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/service/BasdeSerialNumberControllerService.java +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/service/BasdeSerialNumberControllerService.java @@ -22,29 +22,30 @@ public class BasdeSerialNumberControllerService { @Resource private IBasdeSerialNumberService basdeSerialNumberService; + public String generateSerialNumber(Integer businessType) { + return generateSerialNumber(businessType, LocalDate.now().format(DATE_FORMATTER), 4); + } + @Retryable( maxAttempts = MAX_RETRY, // 最大重试次数(包括第一次调用) backoff = @Backoff(delay = 1000) // 重试间隔1秒 ) - public String generateSerialNumber(Integer businessType) { - String currentDate = LocalDate.now().format(DATE_FORMATTER); - + public String generateSerialNumber(Integer businessType, String middle, Integer length) { BasdeSerialNumber serialNumber = basdeSerialNumberService.lambdaQuery() .eq(BasdeSerialNumber::getBusinessType, businessType) .one(); - if (Objects.isNull(serialNumber)) { return null; } int nextSerial = 0; - if (StrUtil.equals(currentDate, serialNumber.getCurrentDateStr())) { + if (StrUtil.equals(middle, serialNumber.getCurrentDateStr())) { nextSerial = serialNumber.getMaxSerial(); } nextSerial = nextSerial + 1; serialNumber.setMaxSerial(nextSerial); - serialNumber.setCurrentDateStr(currentDate); + serialNumber.setCurrentDateStr(middle); basdeSerialNumberService.updateById(serialNumber); // 格式化为4位数字,不足补零 - return serialNumber.getBusinessPrefixNumber() + currentDate + String.format("%04d", nextSerial); + return serialNumber.getBusinessPrefixNumber() + middle + String.format("%0" + length + "d", nextSerial); } } diff --git a/nflg-wms-shipment/src/main/resources/template/发货清单模版.xlsx b/nflg-wms-shipment/src/main/resources/template/发货清单模版.xlsx index 8659068cfc1c2b9d3882b08b19439386851d78db..b646b7451d3d4eda634eb0893f61be5d1a125364 100644 GIT binary patch delta 2681 zcmbVOX*d*W8=lFYB{axE#vsHDMq%t^lE%Jf?=Z6OS!Ze}L*s5a}O32PsgOH^K zO$f;{c4bS4Fy@f&eBbxu`}Mtl-uHUm`?{a!zMtpELvxvPc~$^q`2^4cS(8eD5G*Kh zm1Uw}hGI%hH8mK!*;^^fZU(L23gfLG!&c?p|JLtOp5m2#+Eyxu8ms@HT{lhKi+D2%B-6C4RbA5qh5=X@X+25DN3`YtAgAfG(Pb)QhN0$+T;s%^e^&#lLvICaM;6;*a}$xhSkJ-PtKMvt}^d_*k!Oy zEMgv@sf+HRu)A4O$k%6#$sAjX>=ComG}>{#lDTJrcQaLBbhx^Tnm%##2NDwNs{P+@tuK+ zm}nE7M-N>nX8CPNdl64pxOW+4P+dlqhV5>HMysRo#XxRM<+37d%`L7ZFj#ytQDN)b zdeNv|Db-`+&o=nZxEpo`G4>T6nPMEtw~r-Xof3NA*EmoRBR66GtwD#*i1MD8e03*; z{GjR@b@qC*>svvNguO-z!$!<)!V%xo^&M@~(pXA+v=jNmGAEzmQ4>5oJ}lG3zNe`n zKK{V`;{1kR_6b+8$ox-;(`?jzbluis(J~EOplR|pGAVDXUmNRom%0dX=@VS`X~@QP zMUv+~iQRCIT*&cyBP`syNukCjj!(%%xTR2kYB+gOF}YRt!pXZiE0cnAlx}-EFT5=j zZ`@tjk`U;it^Ijvm%Tx>m^vQEbwhRdgBaK1HI8NX)!%dxOCI22;LiHF*lbKIeZr$d z1=%DrOZNA;igmy0VbO85tCd+x)1mR~qv9eZ9QvbiNg5g-_c?-ZM9Ce+caHlclL!vN z`V94F*V|QrK<;7Nr(&@tlc^DAKl>LEhPSjQtworQFwX&*2K<>M$l`)UsGxBodzr@g zxw&?H0RBoXzEkOy1+(wI=_g72`)HH0WS2`lmJI+(v~NagX$di@4^t9A2|{~hK` zldKQt$P8AGy(e2fHSwVMuf(^VaOXstY)*=b+J)v33BZ|quK+Kt>!x#+6RR@MIfgkU zV};*B9j#bBK7D4EV;+%63&WXC`;Dv3&+SLxn%e;M&pYQu1%DT!j!Ww&gYAe0L@^m0 z{aCp}Ghb@F!se1EO$?`u(L}GO4!BQ4i#iQOUim5y@GI73d+V%?}b1rWr@ZtHMg1|7ekPSgu?P7g1c-LP60AaICkF#e253x8y3qhVKXGSr9<-Z zc=_Y#G7oW2ju7P6ZUH_yLS?I*16O!ZKEAAFdq_a7Q8WfEb;uVnL%@TO_NAas3koX% zACp&6ZdqNZms$8vDtTjqdzlRr($LuwOd|~TkMd6wPIdmGbe1JtL2ftyN@jIaL820G ziFM{nv$UmhzVa8zbuKgyxag9bP~CJi1!HT46+mY zl;SJ6{?tot)QG2H)ea(=Cfy<68D1bOeP_iY%Wpv28vlf|K*!VR7nyzfU_v1X8CfPz zh#LBS_0zYM+NJ4ab@BT=&B_T?IB-qvFxbLl|QsiSlyTwmd0z}A^Xed zByu6%OWWSCLx2T-UoZ3jjGx8MS-7lmtn@;!_$)&TzbEn5O3&n({JhJ35h8D?k00T; z@}I&mIGvsX6dDnbz&rS{t9#vu9R0Y}=K|4X~k%R>DB;CW@qpm(LO^$v(Hl&|Q& zQ;}f6;aZz%-IvgOZP?qUeJY#=K1rWZW|2ts`{1)$>6}55?d4Cy!vFZ82zxj{xzW;k zQgvZ%vwvzo;IX*M^f>4H?D@5bK^LXzu@P2R3t0@MS|=xD&z-67dB*lEYpwul->3ej zSM@!iWp1rMZK5>Bn`9y#IbVPiy}S>u!Gux=M@|!w(-0r13f6nznrm^G_rRQMu~KxD zRY3|XHHnScky8qwljR2`9@|!bT8AbwZDStS>+wvs=M7DN@h?YogW1+3E-o`6;>=Gu za?SwupA9>L*`|I+*1-u}p#bb_-`E4haM92)M4awudZuV7uc{R$=X0#3-aCCB1pC42Ty-Q9HCTLk0-z18%ktSpQsn?28xy+Qktn$u!I7fL>g_x%^{6akYE d`S*?^2>_e|933D4eDD}1)xhLgd(Ixl{sx!mit28ID5 zw^vzbi$1nnz8QoUebw`J;9)_eM9A!pXEpfzqnH-WLH+)&d{fC{stW(*HtFHVyhD0k zL3f>{{Y~XUOPdOokvM7I%*WnE8!WVIA%{#idV}R}I3Y}jpXOw6q#Q30NQ~Wex2sD_pn2N#p*D!t=QH*IGJu ztVp{pmhH_9vUQIWr4c6)9SGhWQy7varHfbLIen;>ZjZ8DI)e z*A%$3Dm)RP5_-N-UQ1WzRiUiy3^+Xgr6gsnF+;@P#oatPY9^NGm1Tz=+ZwdwkpgVb zn`5#uyX&7b>8mfr^6|BQ;Me(w`fr98axetOWJ{cvXH>euZ{ z4(zjw(GR>gcZ0*LQ*-3*)=+<@t3DVXr?;yQ9MD}oT2%V0bnPW}0%p_3vyJy-cMRzg z_%VqEv)EkBN$0)wH@DX!bQuAbQ*Gg+F(LV^zQNfKC$FN1Hr=^OSe9LB?JqGFI?`U*Lrw3?&Hs?Nf zr}7(Zy$-cBx(MHukBQUSqW~{b_Qg=D%aoUgWy@K*0kKp|o^9Xlprw?Btpa*cRMIl4 zd~xqGHJ7qbF%Vp9VY=~s;UH&k=i5xYLP6*DgEU5H+gqUO{PM{yz$}~5vcJG09A7}* z94U=f({h;Y3SDEGL=WXmYWKaCBU95P-K5wdv@!Dx%`Hv67*ysm^XCpa7JQkKObDZ+j z>P8xk%o^m_52ZCN=*A1N&xdMA-Gs;zk!Xp|Z&-4G(?ZrLUZ197+l) zmjr73GYpRP#Cl$_26{dFI=G_0U7at3D@fcvB}bm|61~rLg5Xc-?@dV%M01~H7Q3a! z)(V2gRt1g+y7e?Xx&WCTnYpO@ZA(D#GWX7KZ%21WZ{gjSsJJW@$YM!uXsBN>{}F|v z_D{5AZwgFN-J(_;!39^`QD^f8!3A3n)GF4c&t~c^ZDoW3%BQ^fyIt=;eMEnP-(%?3 zc_d)HVE3{O`O(qOd@}Fek^AX)#rnE%ia>bM1B+?XiMY&3E$w_a(Q+43$5y{%Jd14^ zua77VxFuS!t!r_KWJ{9Buy)vSc6!2)xb4qzliRo$9i`8GAsua2&-Cjf2Db(eyi zDZHO2IghUr;PRM*j{Z(ld*0JBDc{fWx5G}d+vJg-Dw+wH!}4iPp&@1h+>2CMxeyH?EX?t0WuMA!ks6h6V~RhPhXbP{ zMoK?zuDBZUTLxbf;R+n;He!#wU|RcSDHE%jNlC{T-74rDdpuFBmu>f#T!tXA z$o3u*_5sSOR_%Dt&E>yNP=Z89%uf6NS$qS_R2wMnqXVA|2u_*(rd|+LVqz}FAO%Bh z+4*IpzgSV8^$FX!G0dFc(p}r!Gh2nK5gk+f;68+}cSy|+kV*f;ns=B?mH?*d$!ph8 zc8E=w3_7urbW9dReAYrTtNo%L)&pZ~>!c8xG4U1(B>8To;*?q3Q9ws3X)89Ue*#Me zPhU3t#f2U5UosO6qI|Y7Lhrymr|zoj%cdWpuqKknu{J$HK#z)0{vaaLeGBO$Z$?6Y zWb>!aGz^BfktRcq^&fwL^24FDvTDa}YQBq6x6%nOwfN)4*&p5VQB7J(=xg+i`2=WU z>JRy_c*rhY@o>UZ?wLSVVy=rpip#|8VVX-N2-&CwV?g;M5Tw%7TTkV>X;_nm^;o0P z{)h|IdjA+K&!bc~qaLj~=S&>~D)0e)=4Z9WC^fvlmm?nIn$`vq)-H^@{`6g;Sh9Om ztO4y^4ldUtFQ1E;)rs_fka`f$nb`QoFoJr}dS>X5nIu`4%za$~j3RHH)?>+00D;JZ zNGRC~Aqs9K`yj~w{{DfHc1%!avMRF>*$;V|oyY3}QAH&8NSe|>jkK_C&(p9>6< RKH5x>8&C+g-qXit{{m}O`t1M! diff --git a/nflg-wms-shipment/src/main/resources/template/装箱清单模版.xlsx b/nflg-wms-shipment/src/main/resources/template/装箱清单模版.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8df884a3cfc0e1569f61006f45dd7268eba92eba GIT binary patch literal 12043 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 Iqj~20KkZC*L;wH) literal 0 HcmV?d00001