diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/BoxSearchQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/BoxSearchQO.java index 85fb7cfb..0fb30782 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/BoxSearchQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/BoxSearchQO.java @@ -36,9 +36,9 @@ public class BoxSearchQO extends SearchBaseQO{ private String deviceNo; /** - * 发车状态,0:未发车;1:已发车 + * 状态,0:未装货;1:已装货;2:已装车;3:已发车;4:已卸车 */ - private Integer carStatus; + private Integer boxStatus; /** * 客户名称 diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/DeliverAddQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/DeliverAddQO.java index 318a943d..b950ec62 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/DeliverAddQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/DeliverAddQO.java @@ -2,8 +2,10 @@ package com.nflg.wms.common.pojo.qo; import jakarta.validation.constraints.NotBlank; import lombok.Data; +import lombok.experimental.Accessors; @Data +@Accessors(chain = true) public class DeliverAddQO { /** diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/DeliveryUnloadQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/DeliveryUnloadQO.java index 5bcd5437..a2b14a33 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/DeliveryUnloadQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/DeliveryUnloadQO.java @@ -1,6 +1,5 @@ package com.nflg.wms.common.pojo.qo; -import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -20,9 +19,9 @@ public class DeliveryUnloadQO { */ private List boxIdsForAdd; - /** - * 要删除的包装箱id列表 - */ - @NotEmpty - private List boxIdsForDel; +// /** +// * 要删除的包装箱id列表 +// */ +// @NotEmpty +// private List boxIdsForDel; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialCodeSearchQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialCodeSearchQO.java index 5911484c..3076370b 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialCodeSearchQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialCodeSearchQO.java @@ -30,10 +30,10 @@ public class MaterialCodeSearchQO extends SearchBaseQO { /** * 下单开始日期 */ - private LocalDate orderStartDate; + private String orderStartDate; /** * 下单结束日期 */ - private LocalDate orderEndDate; + private String orderEndDate; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/BoxVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/BoxVO.java index 9a16ef8c..1f1692d2 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/BoxVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/BoxVO.java @@ -38,9 +38,9 @@ public class BoxVO { private String driverPhone; /** - * 发车状态,0:未发车;1:已发车 + * 状态,0:未装货;1:已装货;2:已装车;3:已发车;4:已卸车 */ - private Integer carStatus; + private Integer boxStatus; /** * 装箱人 diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentPackagingCodeVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentPackagingCodeVO.java index 7b447da5..124c97e5 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentPackagingCodeVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentPackagingCodeVO.java @@ -53,5 +53,10 @@ public class ShipmentPackagingCodeVO { * 最后更新时间 */ private LocalDateTime updateTime; + + /** + * 二维码 + */ + private String qrCode; } 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 780302c3..6774c01d 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 @@ -1,8 +1,11 @@ package com.nflg.wms.repository.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.nflg.wms.common.pojo.vo.ShipmentPackagingCodeVO; import com.nflg.wms.repository.entity.WmsShipmentDelivery; +import java.util.List; + /** *

* Mapper 接口 @@ -14,4 +17,6 @@ import com.nflg.wms.repository.entity.WmsShipmentDelivery; public interface WmsShipmentDeliveryMapper extends BaseMapper { WmsShipmentDelivery getByPackagingCodeId(Long id); + + List getBoxByPlateNumber(String plateNumber); } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsShipmentMaterialCodeItemQrMapper.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsShipmentMaterialCodeItemQrMapper.java index c697db2f..117e210f 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsShipmentMaterialCodeItemQrMapper.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsShipmentMaterialCodeItemQrMapper.java @@ -2,9 +2,10 @@ package com.nflg.wms.repository.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO; -import com.nflg.wms.repository.entity.WmsShipmentMaterialCodeItem; import com.nflg.wms.repository.entity.WmsShipmentMaterialCodeItemQr; +import java.util.List; + /** *

* Mapper 接口 @@ -16,4 +17,8 @@ import com.nflg.wms.repository.entity.WmsShipmentMaterialCodeItemQr; public interface WmsShipmentMaterialCodeItemQrMapper extends BaseMapper { ShipmentMaterialCodeQRVO getInfoByQRCode(String code); + + List getListVOByItemIds(List ids); + + List getListVOByCodeIds(List ids); } 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 cc85d26a..68b183d6 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 @@ -1,6 +1,7 @@ package com.nflg.wms.repository.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +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; @@ -24,11 +25,11 @@ public interface WmsShipmentPackagingCodeMapper extends BaseMapper searchInCar(BoxSearchQO qo, Page objectPage); + IPage searchInCar(BoxSearchQO qo, Page objectPage); List searchForUnload(String code); List getForInstall(Long id); - PageData getItemsVOById(ShipmentSiteStockItemQO qo, Page objectPage); + IPage 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 3b4a9d78..c53c634f 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 @@ -1,6 +1,7 @@ package com.nflg.wms.repository.service; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeItemVO; +import com.nflg.wms.common.pojo.vo.ShipmentPackagingCodeVO; import com.nflg.wms.repository.entity.WmsShipmentDelivery; import com.baomidou.mybatisplus.extension.service.IService; @@ -17,4 +18,6 @@ import java.util.List; public interface IWmsShipmentDeliveryService extends IService { WmsShipmentDelivery getByPackagingCodeId(Long id); + + List getBoxByPlateNumber(String plateNumber); } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsShipmentMaterialCodeItemQrService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsShipmentMaterialCodeItemQrService.java index 654dd87c..16aae7de 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsShipmentMaterialCodeItemQrService.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsShipmentMaterialCodeItemQrService.java @@ -1,9 +1,11 @@ package com.nflg.wms.repository.service; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO; -import com.nflg.wms.repository.entity.WmsShipmentMaterialCodeItem; import com.nflg.wms.repository.entity.WmsShipmentMaterialCodeItemQr; import com.baomidou.mybatisplus.extension.service.IService; +import jakarta.validation.constraints.NotEmpty; + +import java.util.List; /** *

@@ -16,4 +18,8 @@ import com.baomidou.mybatisplus.extension.service.IService; public interface IWmsShipmentMaterialCodeItemQrService extends IService { ShipmentMaterialCodeQRVO getInfoByQRCode(String code); + + List getListVOByItemIds(List ids); + + List getListVOByCodeIds(List ids); } 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 e4ac5ef5..4f8f72ff 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 @@ -1,5 +1,6 @@ package com.nflg.wms.repository.service; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.qo.BoxSearchQO; import com.nflg.wms.common.pojo.qo.ShipmentSiteStockItemQO; @@ -28,11 +29,11 @@ public interface IWmsShipmentPackagingCodeService extends IService searchInCar(BoxSearchQO qo); + IPage searchInCar(BoxSearchQO qo); List searchForUnload(String code); List getForInstall(Long id); - PageData getItemsVOById(ShipmentSiteStockItemQO qo); + IPage 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 83a8e545..738185d4 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 @@ -1,11 +1,14 @@ package com.nflg.wms.repository.service.impl; +import com.nflg.wms.common.pojo.vo.ShipmentPackagingCodeVO; import com.nflg.wms.repository.entity.WmsShipmentDelivery; import com.nflg.wms.repository.mapper.WmsShipmentDeliveryMapper; import com.nflg.wms.repository.service.IWmsShipmentDeliveryService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import java.util.List; + /** *

* 服务实现类 @@ -21,4 +24,9 @@ public class WmsShipmentDeliveryServiceImpl extends ServiceImpl getBoxByPlateNumber(String plateNumber) { + return baseMapper.getBoxByPlateNumber(plateNumber); + } } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentMaterialCodeItemQrServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentMaterialCodeItemQrServiceImpl.java index 28f29737..cd48a864 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentMaterialCodeItemQrServiceImpl.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentMaterialCodeItemQrServiceImpl.java @@ -7,6 +7,8 @@ import com.nflg.wms.repository.service.IWmsShipmentMaterialCodeItemQrService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import java.util.List; + /** *

* 服务实现类 @@ -22,4 +24,14 @@ public class WmsShipmentMaterialCodeItemQrServiceImpl extends ServiceImpl getListVOByItemIds(List ids) { + return baseMapper.getListVOByItemIds(ids); + } + + @Override + public List getListVOByCodeIds(List ids) { + return baseMapper.getListVOByCodeIds(ids); + } } 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 b02c76fa..e9dffd42 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 @@ -41,7 +41,7 @@ public class WmsShipmentPackagingCodeServiceImpl extends ServiceImpl searchInCar(BoxSearchQO qo) { + public IPage searchInCar(BoxSearchQO qo) { return baseMapper.searchInCar(qo,new Page<>(qo.getPage(), qo.getPageSize())); } @@ -56,7 +56,7 @@ public class WmsShipmentPackagingCodeServiceImpl extends ServiceImpl getItemsVOById(ShipmentSiteStockItemQO qo) { + public IPage 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 2f2c1659..ec9d5d1d 100644 --- a/nflg-wms-repository/src/main/resources/mapper/WmsShipmentDeliveryMapper.xml +++ b/nflg-wms-repository/src/main/resources/mapper/WmsShipmentDeliveryMapper.xml @@ -8,4 +8,13 @@ INNER JOIN wms_shipment_delivery_item di ON d."id"=di.delivery_id WHERE di.packaging_code_id=#{id} + + diff --git a/nflg-wms-repository/src/main/resources/mapper/WmsShipmentMaterialCodeItemQrMapper.xml b/nflg-wms-repository/src/main/resources/mapper/WmsShipmentMaterialCodeItemQrMapper.xml index 9b59dc50..b579e906 100644 --- a/nflg-wms-repository/src/main/resources/mapper/WmsShipmentMaterialCodeItemQrMapper.xml +++ b/nflg-wms-repository/src/main/resources/mapper/WmsShipmentMaterialCodeItemQrMapper.xml @@ -3,9 +3,32 @@ + + + + diff --git a/nflg-wms-repository/src/main/resources/mapper/WmsShipmentPackagingCodeMapper.xml b/nflg-wms-repository/src/main/resources/mapper/WmsShipmentPackagingCodeMapper.xml index 585a6828..af7b3d06 100644 --- a/nflg-wms-repository/src/main/resources/mapper/WmsShipmentPackagingCodeMapper.xml +++ b/nflg-wms-repository/src/main/resources/mapper/WmsShipmentPackagingCodeMapper.xml @@ -4,7 +4,7 @@ UPDATE wms_shipment_packaging_code - SET status=CASE WHEN EXISTS(SELECT * FROM wms_shipment_packaging_code_item WHERE packaging_code_id=wms_shipment_packaging_code."id") THEN 1 ELSE 0 END + SET status=CASE WHEN EXISTS(SELECT id FROM wms_shipment_packaging_code_item WHERE packaging_code_id=wms_shipment_packaging_code."id") THEN 1 ELSE 0 END where id = #{packagingCodeId} @@ -20,13 +20,13 @@ diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/DeliveryController.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/DeliveryController.java index ede3c70d..99a4b699 100644 --- a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/DeliveryController.java +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/DeliveryController.java @@ -6,14 +6,21 @@ import cn.hutool.core.util.StrUtil; 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.dto.BomMaterialDTO; import com.nflg.wms.common.pojo.qo.*; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeItemVO; +import com.nflg.wms.common.pojo.vo.ShipmentPackagingCodeVO; 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.CrmDeliveryDTO; +import com.nflg.wms.shipment.pojo.dto.DeliveryExportDTO; +import com.nflg.wms.shipment.pojo.qo.DeliverySearchFromCRMQO; import com.nflg.wms.shipment.service.BasdeSerialNumberControllerService; +import com.nflg.wms.shipment.service.CRMService; import com.nflg.wms.starter.BaseController; +import com.nflg.wms.starter.service.BomMaterialService; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; @@ -23,6 +30,8 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; +import org.ttzero.excel.entity.ListSheet; import org.ttzero.excel.entity.TemplateSheet; import org.ttzero.excel.entity.Workbook; @@ -30,9 +39,11 @@ import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; +import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; /** * 发货单 @@ -53,9 +64,35 @@ public class DeliveryController extends BaseController { @Resource private IWmsShipmentPackagingCodeService packagingCodeService; - public ApiResult searchFromCRM() { - //TODO:从CRM查询发货单列表 - return ApiResult.success(); + @Resource + private CRMService crmService; + + @Resource + private BomMaterialService bomMaterialService; + + /** + * 从CRM查询发货单 + */ + @PostMapping("searchFromCRM") + public ApiResult> searchFromCRM(@RequestBody DeliverySearchFromCRMQO qo) { + List datas = crmService.getDeliverys(qo); + List materials = bomMaterialService.getList(datas.stream().map(CrmDeliveryDTO::getProductNumber__c).collect(Collectors.toSet())); + return ApiResult.success( + datas.stream().map(d -> new DeliverAddQO() + .setSoNo(d.getOrderNumber()) + .setContractNo(d.getContractCode__c()) + .setCustomerName(d.getAccount().getName()) + .setDeviceNo(d.getMachineNumber2__c()) + .setMaterialNo(d.getProductNumber__c()) + .setMaterialDrawingNo( + materials.stream() + .filter(m -> StrUtil.equals(m.getMaterialNo(), d.getProductNumber__c())) + .findFirst() + .map(BomMaterialDTO::getDrawingNo) + .orElse("") + ) + ).toList() + ); } /** @@ -120,10 +157,49 @@ public class DeliveryController extends BaseController { } /** - * 导出清单 + * 根据id列表导出发货单 */ - @GetMapping("exportTOExcel") - public void exportTOExcel(HttpServletResponse response, @RequestParam Long id) throws IOException { + @PostMapping("exportToExcelById") + public void exportItemToExcel(HttpServletResponse response, @RequestBody @NotEmpty List ids) throws IOException { + List deliveries = deliveryService.listByIds(ids); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(deliveries)).throwMessage("没有需要导出的数据"); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("发货单.xlsx", StandardCharsets.UTF_8)); + new Workbook() + .addSheet(new ListSheet<>(Convert.toList(DeliveryExportDTO.class, deliveries))) + .writeTo(response.getOutputStream()); + } + + /** + * 根据查询条件导出发货单 + */ + @PostMapping("exportToExcelBySearch") + public void exportToExcelBySearch(HttpServletResponse response, @RequestBody DeliverySearchQO qo) throws IOException { + List deliveries = deliveryService.lambdaQuery() + .eq(Objects.nonNull(qo.getCarStatus()), WmsShipmentDelivery::getCarStatus, qo.getCarStatus()) + .like(StrUtil.isNotBlank(qo.getNo()), WmsShipmentDelivery::getNo, qo.getNo()) + .like(StrUtil.isNotBlank(qo.getCustomerName()), WmsShipmentDelivery::getCustomerName, qo.getCustomerName()) + .like(StrUtil.isNotBlank(qo.getContractNo()), WmsShipmentDelivery::getContractNo, qo.getContractNo()) + .like(StrUtil.isNotBlank(qo.getSoNo()), WmsShipmentDelivery::getSoNo, qo.getSoNo()) + .like(StrUtil.isNotBlank(qo.getMaterialDrawingNo()), WmsShipmentDelivery::getMaterialDrawingNo, qo.getMaterialDrawingNo()) + .like(StrUtil.isNotBlank(qo.getMaterialNo()), WmsShipmentDelivery::getMaterialNo, qo.getMaterialNo()) + .like(StrUtil.isNotBlank(qo.getDeviceNo()), WmsShipmentDelivery::getDeviceNo, qo.getDeviceNo()) + .like(StrUtil.isNotBlank(qo.getCustomerName()), WmsShipmentDelivery::getCustomerName, qo.getCustomerName()) + .like(StrUtil.isNotBlank(qo.getPlateNumber()), WmsShipmentDelivery::getPlateNumber, qo.getPlateNumber()) + .list(); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(deliveries)).throwMessage("没有需要导出的数据"); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("发货单.xlsx", StandardCharsets.UTF_8)); + new Workbook() + .addSheet(new ListSheet<>(Convert.toList(DeliveryExportDTO.class, deliveries))) + .writeTo(response.getOutputStream()); + } + + /** + * 根据发货单导出子项 + */ + @GetMapping("exportItemToExcel") + public void exportItemToExcel(HttpServletResponse response, @RequestParam Long id) throws IOException { WmsShipmentDelivery delivery = deliveryService.getById(id); VUtil.trueThrowBusinessError(Objects.isNull(delivery)).throwMessage("清单不存在"); AtomicInteger index = new AtomicInteger(1); @@ -184,7 +260,7 @@ public class DeliveryController extends BaseController { .in(WmsShipmentDelivery::getId, deliveries) .update(); List boxIds = deliveryItemService.lambdaQuery() - .eq(WmsShipmentDeliveryItem::getDeliveryId, deliveries) + .in(WmsShipmentDeliveryItem::getDeliveryId, deliveries) .list() .stream() .map(WmsShipmentDeliveryItem::getPackagingCodeId) @@ -251,6 +327,45 @@ public class DeliveryController extends BaseController { return ApiResult.success(); } + /** + * 根据车牌号查询已装车的箱子(PDA使用) + */ + @GetMapping("getBoxByPlateNumber") + public ApiResult> getBoxByPlateNumber(@RequestParam String plateNumber) { + return ApiResult.success(deliveryService.getBoxByPlateNumber(plateNumber)); + } + + /** + * 卸车-删除包装箱(PDA使用) + * @param id 包装箱ID + */ + @Transactional + @PostMapping("unloadDel") + public ApiResult unloadDel(@RequestBody Long id) { + WmsShipmentDelivery delivery = deliveryService.getByPackagingCodeId(id); + VUtil.trueThrowBusinessError(Objects.isNull(delivery)).throwMessage("发货单不存在"); + VUtil.trueThrowBusinessError(delivery.getCarStatus() != 0).throwMessage("发货单已发车"); + deliveryItemService.lambdaUpdate() + .in(WmsShipmentDeliveryItem::getPackagingCodeId, id) + .remove(); + packagingCodeService.lambdaUpdate() + .set(WmsShipmentPackagingCode::getStatus, 1) + .in(WmsShipmentPackagingCode::getId, id) + .update(); + if (!deliveryItemService.lambdaQuery() + .eq(WmsShipmentDeliveryItem::getDeliveryId, delivery.getId()) + .exists()){ + deliveryService.lambdaUpdate() + .set(WmsShipmentDelivery::getBoxStatus, 0) + .set(WmsShipmentDelivery::getUpdateBy, UserUtil.getUserName()) + .set(WmsShipmentDelivery::getUpdateTime, LocalDateTime.now()) + .eq(WmsShipmentDelivery::getBoxStatus, 1) + .eq(WmsShipmentDelivery::getId, delivery.getId()) + .update(); + } + return ApiResult.success(); + } + /** * 卸车(PDA使用) */ @@ -290,16 +405,16 @@ public class DeliveryController extends BaseController { .update(); } } - if (CollectionUtil.isNotEmpty(qo.getBoxIdsForDel())) { - deliveryItemService.lambdaUpdate() - .eq(WmsShipmentDeliveryItem::getDeliveryId, qo.getId()) - .in(WmsShipmentDeliveryItem::getPackagingCodeId, qo.getBoxIdsForDel()) - .remove(); - packagingCodeService.lambdaUpdate() - .set(WmsShipmentPackagingCode::getStatus, 1) - .in(WmsShipmentPackagingCode::getId, qo.getBoxIdsForDel()) - .update(); - } +// if (CollectionUtil.isNotEmpty(qo.getBoxIdsForDel())) { +// deliveryItemService.lambdaUpdate() +// .eq(WmsShipmentDeliveryItem::getDeliveryId, qo.getId()) +// .in(WmsShipmentDeliveryItem::getPackagingCodeId, qo.getBoxIdsForDel()) +// .remove(); +// packagingCodeService.lambdaUpdate() +// .set(WmsShipmentPackagingCode::getStatus, 1) +// .in(WmsShipmentPackagingCode::getId, qo.getBoxIdsForDel()) +// .update(); +// } return ApiResult.success(); } } \ No newline at end of file diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/H5Controller.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/H5Controller.java index dc51d869..c10e51e9 100644 --- a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/H5Controller.java +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/H5Controller.java @@ -200,7 +200,7 @@ public class H5Controller extends BaseController { }); it.setUsedNum(it.getUsedNum().add(qr.getNum())); qr.setStatus(5); - qrCodes.remove(qrCode); + iterator.remove(); records.add(new WmsShipmentSiteStockMaterialItemRecord() .setMaterialItemId(item.getId()) .setMaterialNo(item.getMaterialNo()) 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 73219b1d..be9399e0 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 @@ -5,6 +5,8 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.nflg.wms.common.constant.STATE; +import com.nflg.wms.common.exception.NflgException; import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.qo.*; @@ -17,7 +19,10 @@ 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.HtmlToImageUtil; import com.nflg.wms.shipment.util.KeyUtil; +import com.nflg.wms.shipment.util.QRCodeUtil; +import com.nflg.wms.shipment.util.ThymeleafUtil; import com.nflg.wms.starter.BaseController; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; @@ -26,7 +31,9 @@ import jakarta.validation.constraints.NotEmpty; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.ClassPathResource; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -35,6 +42,7 @@ import org.ttzero.excel.entity.TemplateSheet; import org.ttzero.excel.entity.Workbook; import org.ttzero.excel.reader.ExcelReader; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; @@ -44,6 +52,8 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** * 物料码(物料清单) @@ -54,23 +64,26 @@ import java.util.stream.Collectors; public class MaterialCodeController extends BaseController { @Resource - private IWmsShipmentMaterialCodeService shipmentMaterialCodeService; + private IWmsShipmentMaterialCodeService materialCodeService; @Resource - private IWmsShipmentMaterialCodeItemService shipmentMaterialCodeItemService; + private IWmsShipmentMaterialCodeItemService materialCodeItemService; @Resource - private IWmsShipmentMaterialCodeItemQrService shipmentMaterialCodeItemQrService; + private IWmsShipmentMaterialCodeItemQrService materialCodeItemQrService; @Resource private IWmsShipmentMaterialCodeForwardService materialCodeForwardService; @Resource - private IWmsShipmentPackagingCodeService shipmentPackagingCodeService; + private IWmsShipmentPackagingCodeService packagingCodeService; @Resource private BasdeSerialNumberControllerService serialNumberControllerService; + @Resource + private IWmsShipmentMaterialService materialService; + /** * 清单-新增 */ @@ -80,7 +93,7 @@ public class MaterialCodeController extends BaseController { materialCode.setNo(serialNumberControllerService.generateSerialNumber(27)); materialCode.setCreateBy(UserUtil.getUserName()); materialCode.setCreateTime(LocalDateTime.now()); - shipmentMaterialCodeService.save(materialCode); + materialCodeService.save(materialCode); return ApiResult.success(); } @@ -89,13 +102,13 @@ public class MaterialCodeController extends BaseController { */ @PostMapping("update") public ApiResult update(@Valid @RequestBody ShipmentMaterialCodeUpdateQO qo) { - WmsShipmentMaterialCode old = shipmentMaterialCodeService.getById(qo.getId()); + WmsShipmentMaterialCode old = materialCodeService.getById(qo.getId()); VUtil.trueThrowBusinessError(Objects.isNull(old)).throwMessage("清单不存在"); VUtil.trueThrowBusinessError(old.getStatus() >= 2).throwMessage("清单已完成,不能修改"); WmsShipmentMaterialCode materialCode = Convert.convert(WmsShipmentMaterialCode.class, qo); materialCode.setUpdateBy(UserUtil.getUserName()); materialCode.setUpdateTime(LocalDateTime.now()); - shipmentMaterialCodeService.updateById(materialCode); + materialCodeService.updateById(materialCode); return ApiResult.success(); } @@ -104,7 +117,7 @@ public class MaterialCodeController extends BaseController { */ @PostMapping("delete") public ApiResult delete(@RequestBody @NotEmpty List ids) { - shipmentMaterialCodeService.lambdaUpdate() + materialCodeService.lambdaUpdate() .eq(WmsShipmentMaterialCode::getStatus, 0) .in(WmsShipmentMaterialCode::getId, ids) .remove(); @@ -117,7 +130,7 @@ public class MaterialCodeController extends BaseController { @PostMapping("search") public ApiResult> search(@Valid @RequestBody MaterialCodeSearchQO request) { return ApiResult.success( - shipmentMaterialCodeService.lambdaQuery() + materialCodeService.lambdaQuery() .ge(Objects.nonNull(request.getOrderStartDate()), WmsShipmentMaterialCode::getOrderDate, request.getOrderStartDate()) .le(Objects.nonNull(request.getOrderEndDate()), WmsShipmentMaterialCode::getOrderDate, request.getOrderEndDate()) .ge(Objects.nonNull(request.getStartDate()), WmsShipmentMaterialCode::getCreateTime, request.getStartDate()) @@ -149,9 +162,9 @@ public class MaterialCodeController extends BaseController { */ @GetMapping("exportTOExcel") public void exportTOExcel(HttpServletResponse response, @RequestParam Long id) throws IOException { - WmsShipmentMaterialCode materialCode = shipmentMaterialCodeService.getById(id); + WmsShipmentMaterialCode materialCode = materialCodeService.getById(id); VUtil.trueThrowBusinessError(Objects.isNull(materialCode)).throwMessage("清单不存在"); - List list = shipmentMaterialCodeItemService.getByCodeId(id); + List list = materialCodeItemService.getByCodeId(id); for (int i = 0; i < list.size(); i++) { list.get(i).setIndex(i + 1); } @@ -231,9 +244,9 @@ public class MaterialCodeController extends BaseController { // .collect(Collectors.toSet()); // VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(repeats)) // .throwMessage("以下物料重复:" + StrUtil.join(",", repeats)); - shipmentMaterialCodeService.save(materialCode); - shipmentMaterialCodeItemService.saveBatch(items); - shipmentMaterialCodeItemQrService.saveBatch(qrs); + materialCodeService.save(materialCode); + materialCodeItemService.saveBatch(items); + materialCodeItemQrService.saveBatch(qrs); } return ApiResult.success(); } @@ -244,7 +257,7 @@ public class MaterialCodeController extends BaseController { @Transactional @PostMapping("item/add") public ApiResult addItem(@Valid @RequestBody MaterialCodeItemAddQO qo) { - VUtil.trueThrowBusinessError(shipmentMaterialCodeItemService.lambdaQuery() + VUtil.trueThrowBusinessError(materialCodeItemService.lambdaQuery() .eq(WmsShipmentMaterialCodeItem::getMaterialCodeId, qo.getMaterialCodeId()) .eq(WmsShipmentMaterialCodeItem::getProductionOrderNumber, qo.getProductionOrderNumber()) .eq(WmsShipmentMaterialCodeItem::getMaterialNo, qo.getMaterialNo()) @@ -266,7 +279,7 @@ public class MaterialCodeController extends BaseController { item.setPackingLeft(item.getPackingNum()); int count = decimalValue.compareTo(BigDecimal.ZERO) > 0 ? result.intValue() + 1 : result.intValue(); for (int i = 1; i <= item.getPackingNum(); i++) { - shipmentMaterialCodeItemQrService.save(new WmsShipmentMaterialCodeItemQr() + materialCodeItemQrService.save(new WmsShipmentMaterialCodeItemQr() .setItemId(item.getId()) .setNo(KeyUtil.next()) .setNum(i == count && decimalValue.compareTo(BigDecimal.ZERO) > 0 ? decimalValue : item.getMinPackagingNum()) @@ -274,8 +287,8 @@ public class MaterialCodeController extends BaseController { .setCreateTime(LocalDateTime.now()) ); } - shipmentMaterialCodeItemService.save(item); - shipmentMaterialCodeService.lambdaUpdate() + materialCodeItemService.save(item); + materialCodeService.lambdaUpdate() .set(WmsShipmentMaterialCode::getStatus, 1) .eq(WmsShipmentMaterialCode::getId, qo.getMaterialCodeId()) .eq(WmsShipmentMaterialCode::getStatus, 2) @@ -289,7 +302,7 @@ public class MaterialCodeController extends BaseController { @Transactional @PostMapping("item/update") public ApiResult updateItem(@Valid @RequestBody MaterialCodeItemUpdateQO qo) { - WmsShipmentMaterialCodeItem item = shipmentMaterialCodeItemService.getById(qo.getId()); + WmsShipmentMaterialCodeItem item = materialCodeItemService.getById(qo.getId()); VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("清单明细不存在"); if (Objects.isNull(qo.getMinPackagingNum())) { qo.setMinPackagingNum(qo.getNum()); @@ -303,8 +316,8 @@ public class MaterialCodeController extends BaseController { item = Convert.convert(WmsShipmentMaterialCodeItem.class, qo); item.setUpdateBy(UserUtil.getUserName()); item.setUpdateTime(LocalDateTime.now()); - shipmentMaterialCodeItemService.updateById(item); - shipmentMaterialCodeItemQrService.lambdaUpdate() + materialCodeItemService.updateById(item); + materialCodeItemQrService.lambdaUpdate() .eq(WmsShipmentMaterialCodeItemQr::getItemId, item.getId()) .remove(); BigDecimal result = item.getNum().divide(item.getMinPackagingNum(), 3, RoundingMode.HALF_UP); @@ -313,7 +326,7 @@ public class MaterialCodeController extends BaseController { item.setPackingLeft(item.getPackingNum()); int count = decimalValue.compareTo(BigDecimal.ZERO) > 0 ? result.intValue() + 1 : result.intValue(); for (int i = 1; i <= item.getPackingNum(); i++) { - shipmentMaterialCodeItemQrService.save(new WmsShipmentMaterialCodeItemQr() + materialCodeItemQrService.save(new WmsShipmentMaterialCodeItemQr() .setItemId(item.getId()) .setNo(KeyUtil.next()) .setNum(i == count && decimalValue.compareTo(BigDecimal.ZERO) > 0 ? decimalValue : item.getMinPackagingNum()) @@ -330,7 +343,7 @@ public class MaterialCodeController extends BaseController { @Transactional @PostMapping("item/delete") public ApiResult deleteItem(@RequestBody @NotEmpty List ids) { - Set deleteIds = shipmentMaterialCodeItemService.lambdaQuery() + Set deleteIds = materialCodeItemService.lambdaQuery() .select(WmsShipmentMaterialCodeItem::getId) .eq(WmsShipmentMaterialCodeItem::getStatus, 0) .in(WmsShipmentMaterialCodeItem::getId, ids) @@ -339,10 +352,10 @@ public class MaterialCodeController extends BaseController { .map(WmsShipmentMaterialCodeItem::getId) .collect(Collectors.toSet()); if (CollectionUtil.isNotEmpty(deleteIds)) { - shipmentMaterialCodeItemService.lambdaUpdate() + materialCodeItemService.lambdaUpdate() .in(WmsShipmentMaterialCodeItem::getId, deleteIds) .remove(); - shipmentMaterialCodeItemQrService.lambdaUpdate() + materialCodeItemQrService.lambdaUpdate() .in(WmsShipmentMaterialCodeItemQr::getItemId, deleteIds) .remove(); } @@ -358,9 +371,9 @@ public class MaterialCodeController extends BaseController { @Transactional @PostMapping("item/importFromExcel") public ApiResult importItemFromExcel(@RequestParam Long materialCodeId, @RequestParam Boolean cover, @RequestParam("file") MultipartFile file) throws IOException { - WmsShipmentMaterialCode materialCode = shipmentMaterialCodeService.getById(materialCodeId); + WmsShipmentMaterialCode materialCode = materialCodeService.getById(materialCodeId); VUtil.trueThrowBusinessError(Objects.isNull(materialCode)).throwMessage("清单不存在"); - List dbItems = shipmentMaterialCodeItemService.lambdaQuery() + List dbItems = materialCodeItemService.lambdaQuery() .select(WmsShipmentMaterialCodeItem::getId, WmsShipmentMaterialCodeItem::getMaterialNo, WmsShipmentMaterialCodeItem::getStatus) .eq(WmsShipmentMaterialCodeItem::getMaterialCodeId, materialCodeId) .list(); @@ -423,11 +436,11 @@ public class MaterialCodeController extends BaseController { item.setUpdateBy(UserUtil.getUserName()); item.setUpdateTime(LocalDateTime.now()); itemsForUpdate.add(item); - List iqrs = shipmentMaterialCodeItemQrService.lambdaQuery() + List iqrs = materialCodeItemQrService.lambdaQuery() .eq(WmsShipmentMaterialCodeItemQr::getItemId, item.getId()) .list(); if (iqrs.size() > 1) { - shipmentMaterialCodeItemQrService.lambdaUpdate() + materialCodeItemQrService.lambdaUpdate() .eq(WmsShipmentMaterialCodeItemQr::getItemId, item.getId()) .remove(); } @@ -456,21 +469,21 @@ public class MaterialCodeController extends BaseController { VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(repeats)) .throwMessage("以下物料重复:" + StrUtil.join(",", repeats)); if (CollectionUtil.isNotEmpty(itemsForAdd)) { - shipmentMaterialCodeItemService.saveBatch(itemsForAdd); - shipmentMaterialCodeService.lambdaUpdate() + materialCodeItemService.saveBatch(itemsForAdd); + materialCodeService.lambdaUpdate() .set(WmsShipmentMaterialCode::getStatus, 1) .eq(WmsShipmentMaterialCode::getId, materialCodeId) .eq(WmsShipmentMaterialCode::getStatus, 2) .update(); } if (CollectionUtil.isNotEmpty(itemsForUpdate)) { - shipmentMaterialCodeItemService.updateBatchById(itemsForUpdate); + materialCodeItemService.updateBatchById(itemsForUpdate); } if (CollectionUtil.isNotEmpty(qrsForAdd)) { - shipmentMaterialCodeItemQrService.saveBatch(qrsForAdd); + materialCodeItemQrService.saveBatch(qrsForAdd); } if (CollectionUtil.isNotEmpty(qrsForUpdate)) { - shipmentMaterialCodeItemQrService.updateBatchById(qrsForUpdate); + materialCodeItemQrService.updateBatchById(qrsForUpdate); } } return ApiResult.success(); @@ -481,7 +494,7 @@ public class MaterialCodeController extends BaseController { */ @PostMapping("getList") public ApiResult> getList(@Valid @RequestBody MaterialCodeItemQO qo) { - return ApiResult.success(shipmentMaterialCodeItemService.lambdaQuery() + return ApiResult.success(materialCodeItemService.lambdaQuery() .eq(WmsShipmentMaterialCodeItem::getMaterialCodeId, qo.getMaterialCodeId()) .orderByAsc(WmsShipmentMaterialCodeItem::getStatus) .orderByDesc(WmsShipmentMaterialCodeItem::getId) @@ -495,7 +508,7 @@ public class MaterialCodeController extends BaseController { */ @GetMapping("getInfoByQRCode") public ApiResult getInfoByQRCode(@RequestParam String code) { - ShipmentMaterialCodeQRVO info = shipmentMaterialCodeItemQrService.getInfoByQRCode(code); + ShipmentMaterialCodeQRVO info = materialCodeItemQrService.getInfoByQRCode(code); VUtil.trueThrowBusinessError(Objects.isNull(info)).throwMessage("二维码无效"); VUtil.trueThrowBusinessError(info.getStatus() != 0).throwMessage("该物料已装箱了"); return ApiResult.success(info); @@ -506,7 +519,7 @@ public class MaterialCodeController extends BaseController { */ @GetMapping("exportForward") public void exportForward(HttpServletResponse response, @RequestParam Long id) throws IOException { - WmsShipmentMaterialCode materialCode = shipmentMaterialCodeService.getById(id); + WmsShipmentMaterialCode materialCode = materialCodeService.getById(id); VUtil.trueThrowBusinessError(Objects.isNull(materialCode)).throwMessage("清单不存在"); List list = materialCodeForwardService.lambdaQuery() .eq(WmsShipmentMaterialCodeForward::getMaterialCodeId, id) @@ -518,6 +531,59 @@ public class MaterialCodeController extends BaseController { .writeTo(response.getOutputStream()); } + /** + * 根据清单导出标签图片ZIP(用于直连打印机打印) + * @param ids 清单id列表 + */ + @PostMapping("exportItemImageZip1") + public ResponseEntity exportItemImageZip1(@RequestBody @NotEmpty List ids) throws Exception { + List datas = materialCodeItemQrService.getListVOByCodeIds(ids); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(datas)).throwMessage("没有需要导出的数据"); + return exportItemZip(datas); + } + + /** + * 根据清单项导出标签图片ZIP(用于直连打印机打印) + * @param ids 清单明细id列表 + */ + @PostMapping("exportItemImageZip") + public ResponseEntity exportItemImageZip(@RequestBody @NotEmpty List ids) throws Exception { + List datas = materialCodeItemQrService.getListVOByItemIds(ids); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(datas)).throwMessage("没有需要导出的数据"); + return exportItemZip(datas); + } + + private ResponseEntity exportItemZip(List datas) throws Exception{ + Map iamges = materialService.lambdaQuery() + .select(WmsShipmentMaterial::getNo, WmsShipmentMaterial::getImage) + .in(WmsShipmentMaterial::getNo, datas.stream().map(ShipmentMaterialCodeQRVO::getMaterialNo).collect(Collectors.toSet())) + .list() + .stream() + .collect(Collectors.toMap(WmsShipmentMaterial::getNo, WmsShipmentMaterial::getImage)); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (ZipOutputStream zos = new ZipOutputStream(baos)) { + for (ShipmentMaterialCodeQRVO it : datas) { + Map ext = new HashMap<>(); + ext.put("qrCode", QRCodeUtil.generateQRCodeBase64(it.getNo(), 200, 200)); + ext.put("lst", iamges.get(it.getMaterialNo())); + Map variables = new HashMap<>(); + variables.put("ext", ext); + variables.put("info", it); + String html = ThymeleafUtil.generator("/template/label/", "material", ".html", variables); + ZipEntry entry = new ZipEntry(it.getNo() + ".png"); + zos.putNextEntry(entry); + byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 1200); + zos.write(imageBytes, 0, imageBytes.length); + zos.closeEntry(); + } + } + byte[] zipBytes = baos.toByteArray(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.valueOf("application/zip")); + headers.setContentLength(zipBytes.length); + return new ResponseEntity<>(zipBytes, headers, HttpStatus.OK); + } + /** * 代发物料-导入 * @param id 清单ID @@ -606,7 +672,7 @@ public class MaterialCodeController extends BaseController { */ @PostMapping("packForward") public ApiResult packForward(@Valid @RequestBody MaterialCodeForwardPackQO qo) { - WmsShipmentPackagingCode info = shipmentPackagingCodeService.getById(qo.getPackagingCodeId()); + WmsShipmentPackagingCode info = packagingCodeService.getById(qo.getPackagingCodeId()); VUtil.trueThrowBusinessError(Objects.isNull(info)).throwMessage("包装箱不存在"); VUtil.trueThrowBusinessError(info.getStatus() > 1).throwMessage("包装箱已装车"); materialCodeForwardService.lambdaUpdate() 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 36a66b53..c0d349e3 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 @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; 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.dto.DeliverNormalOrderItemDTO; import com.nflg.wms.common.pojo.qo.*; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO; import com.nflg.wms.common.pojo.vo.ShipmentPackagingCodeVO; @@ -18,21 +19,28 @@ 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.HtmlToImageUtil; import com.nflg.wms.shipment.util.KeyUtil; +import com.nflg.wms.shipment.util.QRCodeUtil; +import com.nflg.wms.shipment.util.ThymeleafUtil; import com.nflg.wms.starter.BaseController; import jakarta.annotation.Resource; import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; +import java.io.ByteArrayOutputStream; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** * 包装码 @@ -215,6 +223,7 @@ public class PackagingCodeController extends BaseController { /** * 拆箱-删除物料(PDA使用) */ + @Transactional @PostMapping("unpackDel") public ApiResult unpackDel(@RequestBody Long id) { WmsShipmentPackagingCodeItem item = packagingCodeItemService.lambdaQuery() @@ -238,6 +247,7 @@ public class PackagingCodeController extends BaseController { .in(WmsShipmentMaterialCodeItemQr::getId, item.getMaterialCodeItemQrId()) .update(); materialCodeItemService.updatePackingNum(Collections.singleton(qr.getItemId())); + packagingCodeService.updateStatus(item.getPackagingCodeId()); } } return ApiResult.success(); @@ -313,4 +323,30 @@ public class PackagingCodeController extends BaseController { packagingCodeService.updateStatus(qo.getPackagingCodeId()); return ApiResult.success(); } + + /** + * 导出标签图片ZIP(用于直连打印机打印) + */ + @PostMapping("exportItemImageZip") + public ResponseEntity exportItemImageZip(@RequestBody @NotEmpty List list) throws Exception { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (ZipOutputStream zos = new ZipOutputStream(baos)) { + for (ShipmentPackagingCodeVO it : list) { + it.setQrCode(QRCodeUtil.generateQRCodeBase64(it.getNo(), 100, 100)); + Map variables = new HashMap<>(); + variables.put("info", it); + String html = ThymeleafUtil.generator("/template/label/", "packaging", ".html", variables); + ZipEntry entry = new ZipEntry(it.getNo() + ".png"); + zos.putNextEntry(entry); + byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 600); + zos.write(imageBytes, 0, imageBytes.length); + zos.closeEntry(); + } + } + byte[] zipBytes = baos.toByteArray(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.valueOf("application/zip")); + headers.setContentLength(zipBytes.length); + return new ResponseEntity<>(zipBytes, headers, HttpStatus.OK); + } } diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/CrmAccountDTO.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/CrmAccountDTO.java new file mode 100644 index 00000000..02478a1c --- /dev/null +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/CrmAccountDTO.java @@ -0,0 +1,11 @@ +package com.nflg.wms.shipment.pojo.dto; + +import lombok.Data; + +@Data +public class CrmAccountDTO { + + public String Id; + + public String Name; +} diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/CrmDeliveryDTO.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/CrmDeliveryDTO.java new file mode 100644 index 00000000..81789440 --- /dev/null +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/CrmDeliveryDTO.java @@ -0,0 +1,34 @@ +package com.nflg.wms.shipment.pojo.dto; + +import lombok.Data; + +@Data +public class CrmDeliveryDTO +{ + /** + * SAP订单号 + */ + public String SAPOrder__c; + + public String OrderNumber; + + /** + * 物料编码 + */ + public String ProductNumber__c; + + /** + * 机台编号 + */ + public String MachineNumber2__c; + + /** + * 合同编号 + */ + public String ContractCode__c; + + /** + * 客户 + */ + public CrmAccountDTO Account; +} diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/CrmGetTokenResultDTO.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/CrmGetTokenResultDTO.java new file mode 100644 index 00000000..3a2ae57b --- /dev/null +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/CrmGetTokenResultDTO.java @@ -0,0 +1,15 @@ +package com.nflg.wms.shipment.pojo.dto; + +import lombok.Data; + +@Data +public class CrmGetTokenResultDTO { + + private String access_token; + + private String token_type; + + private String signature; + + private String instance_url; +} diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/CrmResultDTO.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/CrmResultDTO.java new file mode 100644 index 00000000..fb232106 --- /dev/null +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/CrmResultDTO.java @@ -0,0 +1,15 @@ +package com.nflg.wms.shipment.pojo.dto; + +import lombok.Data; + +@Data +public class CrmResultDTO { + + public Boolean success; + + public String code; + + public String errorMessage; + + public T jsonData; +} diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/DeliveryExportDTO.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/DeliveryExportDTO.java new file mode 100644 index 00000000..775fa181 --- /dev/null +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/dto/DeliveryExportDTO.java @@ -0,0 +1,132 @@ +package com.nflg.wms.shipment.pojo.dto; + +import lombok.Data; +import org.ttzero.excel.annotation.ExcelColumn; + +import java.time.LocalDateTime; + +@Data +public class DeliveryExportDTO { + + /** + * 发货单单号 + */ + @ExcelColumn("发货单单号") + private String no; + + /** + * 销售订单号 + */ + @ExcelColumn("销售订单号") + private String soNo; + + /** + * 设备料号 + */ + @ExcelColumn("设备料号") + private String materialNo; + + /** + * 设备图号 + */ + @ExcelColumn("设备图号") + private String materialDrawingNo; + + /** + * 机台编号 + */ + @ExcelColumn("机台编号") + private String deviceNo; + + /** + * 客户名称 + */ + @ExcelColumn("客户名称") + private String customerName; + + /** + * 车牌号 + */ + @ExcelColumn("车牌号") + private String plateNumber; + + /** + * 司机姓名 + */ + @ExcelColumn("司机姓名") + private String driverName; + + /** + * 司机电话 + */ + @ExcelColumn("司机电话") + private String driverPhone; + + /** + * 合同编号 + */ + @ExcelColumn("合同编号") + private String contractNo; + + /** + * 装箱状态,0:未装箱;1:已装箱 + */ + private Integer boxStatus; + + @ExcelColumn("装箱状态") + private String boxStatusText; + + public String getBoxStatusText() { + if (boxStatus == 0) { + return "未装箱"; + } else { + return "已装箱"; + } + } + + /** + * 发车状态,0:未发车;1:已发车 + */ + private Integer carStatus; + + @ExcelColumn("发车状态") + private String carStatusText; + + public String getCarStatusText() { + if (carStatus == 0) { + return "未发车"; + } else { + return "已发车"; + } + } + + /** + * 发车时间 + */ + @ExcelColumn(value = "发车时间", format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime carDate; + + /** + * 创建人 + */ + @ExcelColumn("创建人") + private String createBy; + + /** + * 创建时间 + */ + @ExcelColumn(value = "创建时间", format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** + * 最后更新人 + */ + @ExcelColumn("最后更新人") + private String updateBy; + + /** + * 最后更新时间 + */ + @ExcelColumn(value = "最后更新时间", format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; +} diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/qo/DeliverySearchFromCRMQO.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/qo/DeliverySearchFromCRMQO.java new file mode 100644 index 00000000..32b4de0d --- /dev/null +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/qo/DeliverySearchFromCRMQO.java @@ -0,0 +1,27 @@ +package com.nflg.wms.shipment.pojo.qo; + +import lombok.Data; + +@Data +public class DeliverySearchFromCRMQO { + + /** + * 订单号 + */ + public String orderNumber; + + /** + * 机台编号 + */ + public String machineNumber; + + /** + * 物料编码 + */ + public String productNumber; + + /** + * 客户名称 + */ + public String accountName; +} diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/service/CRMService.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/service/CRMService.java new file mode 100644 index 00000000..6a11d232 --- /dev/null +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/service/CRMService.java @@ -0,0 +1,93 @@ +package com.nflg.wms.shipment.service; + +import cn.hutool.cache.CacheUtil; +import cn.hutool.cache.impl.TimedCache; +import cn.hutool.core.util.StrUtil; +import com.nflg.wms.common.util.VUtil; +import com.nflg.wms.shipment.pojo.dto.CrmDeliveryDTO; +import com.nflg.wms.shipment.pojo.dto.CrmGetTokenResultDTO; +import com.nflg.wms.shipment.pojo.dto.CrmResultDTO; +import com.nflg.wms.shipment.pojo.qo.DeliverySearchFromCRMQO; +import jakarta.annotation.Resource; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Component +@RefreshScope +public class CRMService { + + @Value("${crm.client_id}") + private String clientId; + + @Value("${crm.username}") + private String username; + + @Value("${crm.password}") + private String password; + + @Value("${crm.client_secret}") + private String clientSecret; + + @Value("${crm.token.url}") + private String tokenUrl; + + @Value("${crm.delivery.url}") + private String DeliveryUrl; + + @Resource + private RestTemplate restTemplate; + + private static final String TOKEN_KEY = "CRM_TOKEN"; + + TimedCache crmTokenCache = CacheUtil.newTimedCache(50 * 60 * 1000); + + private String getToken() { + String token = crmTokenCache.get(TOKEN_KEY); + if (StrUtil.isBlank(token)) { + MultiValueMap paramMp = new LinkedMultiValueMap<>(); + paramMp.add("grant_type", "password"); + paramMp.add("client_id", clientId); + paramMp.add("username", username); + paramMp.add("password", password); + paramMp.add("client_secret", clientSecret); +// HttpHeaders headers = new HttpHeaders(); +// headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); +// HttpEntity> request = new HttpEntity<>(paramMp, headers); + CrmGetTokenResultDTO resultDTO = restTemplate.postForObject(tokenUrl, paramMp, CrmGetTokenResultDTO.class); + token = resultDTO.getAccess_token(); + crmTokenCache.put(TOKEN_KEY, token); + } + return token; + } + + public List getDeliverys(DeliverySearchFromCRMQO qo) { + Map paramMp = new HashMap<>(); + paramMp.put("OrderNumber", qo.getOrderNumber()); + paramMp.put("MachineNumber2", qo.getMachineNumber()); + paramMp.put("ProductNumber", qo.getProductNumber()); + paramMp.put("AccountName", qo.getAccountName()); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.add("authorization", "Bearer " + getToken()); + HttpEntity> request = new HttpEntity<>(paramMp, headers); + ResponseEntity>> response = restTemplate.exchange( + DeliveryUrl, + HttpMethod.POST, + request, + new ParameterizedTypeReference<>() {} + ); + VUtil.trueThrowBusinessError(!response.getBody().getSuccess()) + .throwMessage("CRM返回错误:"+response.getBody().getErrorMessage()); + return response.getBody().getJsonData(); + } +} diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/util/HtmlToImageUtil.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/util/HtmlToImageUtil.java new file mode 100644 index 00000000..c455bf50 --- /dev/null +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/util/HtmlToImageUtil.java @@ -0,0 +1,68 @@ +package com.nflg.wms.shipment.util; + +import cn.hutool.core.io.FileUtil; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Slf4j +public class HtmlToImageUtil { + + /** + * 将HTML内容转换为PNG图片 + * @param htmlContent HTML内容 + * @param width 图片宽度 + * @return PNG图片字节数组 + * @throws Exception 转换异常 + */ + public static byte[] convertToPng(String htmlContent, int width) throws Exception { + Path inputHtmlPath = null, outputImgPath = null; + try { + Path tempDir = Paths.get(System.getProperty("java.io.tmpdir"), "wkhtml"); + if (!Files.exists(tempDir)) { + Files.createDirectories(tempDir); + } + long t = System.currentTimeMillis(); + inputHtmlPath = tempDir.resolve("input_" + t + ".html"); + outputImgPath = tempDir.resolve("output_" + t + ".png"); + Files.write(inputHtmlPath, htmlContent.getBytes()); + List command = new ArrayList<>(); + command.add("wkhtmltoimage"); + // 可选参数:设置宽度 (例如 1200px) + command.add("--width"); + command.add(String.valueOf(width)); + // 可选参数:指定图片类型 (例如 PNG) + command.add("--format"); + command.add("png"); + //质量 + command.add("--quality"); + command.add("100"); + // 输入文件路径 + command.add(inputHtmlPath.toAbsolutePath().toString()); + // 输出文件路径 + command.add(outputImgPath.toAbsolutePath().toString()); + ProcessBuilder builder = new ProcessBuilder(command); + Process process = builder.start(); + int exitCode = process.waitFor(); + if (exitCode != 0) { + // 读取错误流,帮助调试 + String error = new String(process.getErrorStream().readAllBytes()); + throw new IOException("html转换图片失败,退出码: " + exitCode + ", 错误信息: " + error); + } + return FileUtil.readBytes(outputImgPath); + } finally { + if (Objects.nonNull(inputHtmlPath)) { + Files.deleteIfExists(inputHtmlPath); + } + if (Objects.nonNull(outputImgPath)) { + Files.deleteIfExists(outputImgPath); + } + } + } +} diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/util/QRCodeUtil.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/util/QRCodeUtil.java new file mode 100644 index 00000000..1660cdce --- /dev/null +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/util/QRCodeUtil.java @@ -0,0 +1,41 @@ +package com.nflg.wms.shipment.util; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; + +import java.io.ByteArrayOutputStream; +import java.util.Base64; +import java.util.Hashtable; + +public class QRCodeUtil { + + public static byte[] generateQRCode(String text, int width, int height) throws Exception { + // 配置二维码参数 + Hashtable hints = new Hashtable<>(); + hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); + hints.put(EncodeHintType.MARGIN, 0); + + // 生成二维码矩阵 + BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints); + + // 将二维码矩阵转换为字节数组 + try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) { + MatrixToImageWriter.writeToStream(bitMatrix, "PNG", byteArrayOutputStream); + return byteArrayOutputStream.toByteArray(); + } + } + + public static String generateQRCodeBase64(String text, int width, int height) { + try { + return "data:image/png;base64," + Base64.getEncoder().encodeToString(generateQRCode(text, width, height)); + } catch (Exception ignored) { + return null; + } + } + +} diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/util/ThymeleafUtil.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/util/ThymeleafUtil.java new file mode 100644 index 00000000..4b0a6083 --- /dev/null +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/util/ThymeleafUtil.java @@ -0,0 +1,22 @@ +package com.nflg.wms.shipment.util; + +import org.thymeleaf.context.Context; +import org.thymeleaf.spring6.SpringTemplateEngine; +import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver; + +import java.util.Map; + +public class ThymeleafUtil { + + public static String generator(String prefix,String template,String suffix, Map variables){ + ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver(); + resolver.setPrefix(prefix); + resolver.setSuffix(suffix); + SpringTemplateEngine engine = new SpringTemplateEngine(); + engine.setTemplateResolver(resolver); + engine.setEnableSpringELCompiler(true); + Context context = new Context(); + context.setVariables(variables); + return engine.process(template, context); + } +} diff --git a/nflg-wms-shipment/src/main/resources/template/label/material.html b/nflg-wms-shipment/src/main/resources/template/label/material.html new file mode 100644 index 00000000..16559d61 --- /dev/null +++ b/nflg-wms-shipment/src/main/resources/template/label/material.html @@ -0,0 +1,91 @@ + + + + + 包装码 + + + + + + + + + + + + + + + + + + + + + +
+ +
0PC7B724KV6FM
+
+ 机台编号 + + 26LBZ4000L001 + + 客户名称 + + 北京市京联鑫路用材料有限公司 +
+ 物料编码 + + 3100006701 + + 数量 + + 10 +
+ +
+ + \ No newline at end of file diff --git a/nflg-wms-shipment/src/main/resources/template/label/packaging.html b/nflg-wms-shipment/src/main/resources/template/label/packaging.html new file mode 100644 index 00000000..293c01d8 --- /dev/null +++ b/nflg-wms-shipment/src/main/resources/template/label/packaging.html @@ -0,0 +1,63 @@ + + + + + 包装码 + + + + + + + + + +
+ +
NFLG-QZ-002
+
+
包装名称: NFLG-QZ-002 测试包装名称
+
包装类型: 托盘
+
+ + \ No newline at end of file