diff --git a/.gitignore b/.gitignore index 42113d9..af02312 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,7 @@ target/ build/ !**/src/main/**/build/ !**/src/test/**/build/ +!**/src/main/resources/static/ ### VS Code ### .vscode/ diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/controller/MesController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/controller/MesController.java index f68e666..b2f7d82 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/controller/MesController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/controller/MesController.java @@ -11,6 +11,7 @@ import org.jeecg.modules.wms.api.erp.entity.ErpShipment; import org.jeecg.modules.wms.api.erp.entity.InventoryQueryParam; import org.jeecg.modules.wms.api.erp.service.IErpService; import org.jeecg.modules.wms.api.mes.entity.MesReceiptMaterial; +import org.jeecg.modules.wms.api.mes.entity.MesShipmentMaterial; import org.jeecg.modules.wms.api.mes.servuce.IMesService; import org.jeecg.modules.wms.framework.aspectj.lang.annotation.ApiLogger; import org.jeecg.modules.wms.framework.controller.HuahengBaseController; @@ -89,9 +90,9 @@ public class MesController extends HuahengBaseController { @PostMapping("/shipmentMaterial") @ResponseBody @ApiLogger(apiName = "物料出库", from="MES") - public Result shipmentMaterial(@RequestBody MesReceiptMaterial mesReceiptMaterial, HttpServletRequest req) { + public Result shipmentMaterial(@RequestBody MesShipmentMaterial mesShipmentMaterial, HttpServletRequest req) { String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(req); - Result result = mesService.shipmentMaterial(mesReceiptMaterial, warehouseCode); + Result result = mesService.shipmentMaterial(mesShipmentMaterial, warehouseCode); return result; } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/entity/MaterialInfo.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/entity/MaterialInfo.java index 0859f71..9e69654 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/entity/MaterialInfo.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/entity/MaterialInfo.java @@ -1,13 +1,20 @@ package org.jeecg.modules.wms.api.mes.entity; import lombok.Data; +import org.jetbrains.annotations.NotNull; import java.math.BigDecimal; @Data -public class MaterialInfo { +public class MaterialInfo implements Comparable<MaterialInfo>{ private String materialCode; private BigDecimal qty; + private int sequence; + + @Override + public int compareTo(@NotNull MaterialInfo o) { + return getSequence() - o.getSequence(); + } } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/entity/MesShipmentDetail.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/entity/MesShipmentDetail.java new file mode 100644 index 0000000..f971040 --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/entity/MesShipmentDetail.java @@ -0,0 +1,23 @@ +package org.jeecg.modules.wms.api.mes.entity; + +import lombok.Data; +import org.jeecg.modules.wms.shipment.shipmentHeader.entity.ShipmentDetail; + +import java.math.BigDecimal; + +/** + * @author 游杰 + */ +@Data +public class MesShipmentDetail { + + /** + * 出库单详情 + */ + private ShipmentDetail shipmentDetail; + + /** + * 出库数量 + */ + private BigDecimal shipQty; +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/entity/MesShipmentMaterial.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/entity/MesShipmentMaterial.java new file mode 100644 index 0000000..be8a6c2 --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/entity/MesShipmentMaterial.java @@ -0,0 +1,16 @@ +package org.jeecg.modules.wms.api.mes.entity; + +import lombok.Data; + +import java.util.List; + +/** + * @author 游杰 + */ +@Data +public class MesShipmentMaterial { + + private String referCode; + private String toPort; + private List<MaterialInfo> materialInfoList; +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/servuce/IMesService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/servuce/IMesService.java index da90436..9841785 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/servuce/IMesService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/servuce/IMesService.java @@ -2,6 +2,7 @@ package org.jeecg.modules.wms.api.mes.servuce; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.wms.api.mes.entity.MesReceiptMaterial; +import org.jeecg.modules.wms.api.mes.entity.MesShipmentMaterial; import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; /** @@ -11,7 +12,7 @@ public interface IMesService { public Result receiptMaterial(MesReceiptMaterial mesReceiptMaterial, String warehouseCode); - public Result shipmentMaterial(MesReceiptMaterial mesMaterial, String warehouseCode); + public Result shipmentMaterial(MesShipmentMaterial mesShipmentMaterial, String warehouseCode); public Result backMesReceipt(TaskHeader taskHeader); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/servuce/impl/MesServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/servuce/impl/MesServiceImpl.java index f22e57c..1e633e0 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/servuce/impl/MesServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/servuce/impl/MesServiceImpl.java @@ -1,9 +1,12 @@ package org.jeecg.modules.wms.api.mes.servuce.impl; import com.aliyun.oss.ServiceException; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.wms.api.mes.entity.MaterialInfo; import org.jeecg.modules.wms.api.mes.entity.MesReceiptMaterial; +import org.jeecg.modules.wms.api.mes.entity.MesShipmentDetail; +import org.jeecg.modules.wms.api.mes.entity.MesShipmentMaterial; import org.jeecg.modules.wms.api.mes.servuce.IMesService; import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerHeader; import org.jeecg.modules.wms.receipt.receiptContainerHeader.service.IReceiptContainerHeaderService; @@ -13,13 +16,26 @@ import org.jeecg.modules.wms.receipt.receiptHeader.service.IReceiptDetailService import org.jeecg.modules.wms.receipt.receiptHeader.service.IReceiptHeaderService; import org.jeecg.modules.wms.receipt.receiving.domain.Receive; import org.jeecg.modules.wms.receipt.receiving.service.IReceiveService; +import org.jeecg.modules.wms.shipment.shipmentCombination.service.IShipmentCombinationService; +import org.jeecg.modules.wms.shipment.shipmentContainerHeader.entity.ShipmentContainerDetail; +import org.jeecg.modules.wms.shipment.shipmentContainerHeader.entity.ShipmentContainerHeader; +import org.jeecg.modules.wms.shipment.shipmentContainerHeader.service.IShipmentContainerDetailService; +import org.jeecg.modules.wms.shipment.shipmentContainerHeader.service.IShipmentContainerHeaderService; +import org.jeecg.modules.wms.shipment.shipmentHeader.entity.ShipmentDetail; +import org.jeecg.modules.wms.shipment.shipmentHeader.entity.ShipmentHeader; +import org.jeecg.modules.wms.shipment.shipmentHeader.service.IShipmentDetailService; +import org.jeecg.modules.wms.shipment.shipmentHeader.service.IShipmentHeaderService; import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; +import org.jeecg.utils.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.lang.ref.WeakReference; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; /** * @author 游杰 @@ -35,6 +51,16 @@ public class MesServiceImpl implements IMesService { private IReceiveService receiveService; @Resource private IReceiptContainerHeaderService receiptContainerHeaderService; + @Resource + private IShipmentHeaderService shipmentHeaderService; + @Resource + private IShipmentDetailService shipmentDetailService; + @Resource + private IShipmentCombinationService shipmentCombinationService; + @Resource + private IShipmentContainerDetailService shipmentContainerDetailService; + @Resource + private IShipmentContainerHeaderService shipmentContainerHeaderService; /** * 要求入库单详情 必须是不重样的 @@ -48,7 +74,13 @@ public class MesServiceImpl implements IMesService { String toPort = mesReceiptMaterial.getToPort(); List<MaterialInfo> materialInfoList = mesReceiptMaterial.getMaterialInfoList(); ReceiptHeader receiptHeader = receiptHeaderService.getReceiptHeaderByReferCode(referCode, warehouseCode); + if(receiptHeader == null) { + return Result.error("MES下发入库信息,没有找到匹配的入库单, 上游单号:" + referCode); + } List<ReceiptDetail> receiptDetailList = receiptDetailService.selectByMainId(String.valueOf(receiptHeader.getId())); + if(receiptDetailList == null || receiptDetailList.size() == 0) { + return Result.error("MES下发入库信息,没有找到匹配的入库单详情, 上游单号:" + referCode); + } for (ReceiptDetail receiptDetail : receiptDetailList) { String materialCode = receiptDetail.getMaterialCode(); BigDecimal taskQty = BigDecimal.ZERO; @@ -86,18 +118,90 @@ public class MesServiceImpl implements IMesService { receiptContainerHeader.setToPort(toPort); boolean success = receiptContainerHeaderService.updateById(receiptContainerHeader); if(!success) { - throw new ServiceException("更新入库组盘头失败"); + throw new ServiceException("MES下发入库信息,更新入库组盘头失败"); } return receiptContainerHeaderService.createReceiptTask(receiptContainerHeader, warehouseCode); } @Override - public Result shipmentMaterial(MesReceiptMaterial mesMaterial, String warehouseCode) { - return null; + public Result shipmentMaterial(MesShipmentMaterial mesShipmentMaterial, String warehouseCode) { + String referCode = mesShipmentMaterial.getReferCode(); + String toPort = mesShipmentMaterial.getToPort(); + List<MaterialInfo> materialInfoList = mesShipmentMaterial.getMaterialInfoList(); + ShipmentHeader shipmentHeader = shipmentHeaderService.getShipmentHeaderByReferCode(referCode, warehouseCode); + if(shipmentHeader == null) { + return Result.error("MES下发出库信息,没有找到匹配的出库单, 上游单号:" + referCode); + } + String shipmentCode = shipmentHeader.getCode(); + if(StringUtils.isEmpty(shipmentCode)) { + return Result.error("MES下发出库信息,出库单号为空"); + } + List<ShipmentDetail> shipmentDetailList = shipmentDetailService.selectByMainId(String.valueOf(shipmentHeader.getId())); + if(shipmentDetailList == null || shipmentDetailList.size() == 0) { + return Result.error("MES下发出库信息,没有找到匹配的出库单详情, 上游单号:" + referCode); + } + List<MesShipmentDetail> mesShipmentDetailList = new ArrayList<>(); + Collections.sort(materialInfoList); + for (ShipmentDetail shipmentDetail : shipmentDetailList) { + String materialCode = shipmentDetail.getMaterialCode(); + BigDecimal shipQty = BigDecimal.ZERO; + boolean hav = false; + for (MaterialInfo materialInfo : materialInfoList) { + if(materialInfo.getMaterialCode().equals(materialCode)) { + hav = true; + shipQty = materialInfo.getQty(); + break; + } + } + if(hav) { + MesShipmentDetail mesShipmentDetail = new MesShipmentDetail(); + mesShipmentDetail.setShipmentDetail(shipmentDetail); + mesShipmentDetail.setShipQty(shipQty); + mesShipmentDetailList.add(mesShipmentDetail); + } + } + for(MesShipmentDetail mesShipmentDetail : mesShipmentDetailList) { + ShipmentDetail shipmentDetail = mesShipmentDetail.getShipmentDetail(); + BigDecimal shipQty = mesShipmentDetail.getShipQty(); + Result result = shipmentCombinationService.autoCombination(shipmentDetail, shipQty); + if(!result.isSuccess()) { + throw new ServiceException("MES下发出库信息," + result.getMessage()); + } + } + List<ShipmentContainerDetail> shipmentContainerDetailList = + shipmentContainerDetailService.getShipmentContainerDetailListByShipmentCode(shipmentCode); + if(shipmentContainerDetailList == null) { + throw new ServiceException("MES下发出库信息, 没有找到出库配盘详情"); + } + List<Integer> shipmentContainerIdList = shipmentContainerDetailList.stream().map(ShipmentContainerDetail::getShipmentContainerId) + .distinct().collect(Collectors.toList()); + long shipmentOrder = System.currentTimeMillis(); + int sequenceNumber = shipmentContainerIdList.size(); + int sequence = 0; + for(int shipmentContainerId : shipmentContainerIdList) { + sequence++; + ShipmentContainerHeader shipmentContainerHeader = shipmentContainerHeaderService.getById(shipmentContainerId); + if(shipmentContainerHeader == null) { + throw new ServiceException("MES下发出库信息,没有找到出库表头:" + shipmentContainerId); + } + shipmentContainerHeader.setToPort(toPort); + boolean success = shipmentContainerHeaderService.updateById(shipmentContainerHeader); + if(!success) { + throw new ServiceException("MES下发出库信息,更新出库组盘头失败"); + } + Result result = shipmentCombinationService.createShipmentTask(shipmentContainerHeader, warehouseCode, + shipmentOrder, sequence, sequenceNumber); + if(!result.isSuccess()) { + throw new ServiceException(result.getMessage()); + } + + } + return Result.OK("MES下发出库信息成功"); } @Override public Result backMesReceipt(TaskHeader taskHeader) { + return null; } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/controller/ShipmentCombinationController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/controller/ShipmentCombinationController.java index c3de906..330d979 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/controller/ShipmentCombinationController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/controller/ShipmentCombinationController.java @@ -123,7 +123,7 @@ public class ShipmentCombinationController { @ResponseBody public Result createShipmentTask(@RequestBody ShipmentContainerHeader shipmentContainerHeader, HttpServletRequest req) { String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(req); - return shipmentCombinationService.createShipmentTask(shipmentContainerHeader, warehouseCode); + return shipmentCombinationService.createShipmentTask(shipmentContainerHeader, warehouseCode, 0 ,0 ,0); } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/IShipmentCombinationService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/IShipmentCombinationService.java index 579f288..6f1ad9d 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/IShipmentCombinationService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/IShipmentCombinationService.java @@ -8,6 +8,7 @@ import org.jeecg.modules.wms.shipment.shipmentCombination.entity.CombinationMode import org.jeecg.modules.wms.shipment.shipmentContainerHeader.entity.ShipmentContainerHeader; import org.jeecg.modules.wms.shipment.shipmentHeader.entity.ShipmentDetail; +import java.math.BigDecimal; import java.util.List; /** @@ -19,11 +20,12 @@ public interface IShipmentCombinationService { public Result autoCombination(String shipmentCode, String warehouseCode); - public Result autoCombination(ShipmentDetail shipmentDetail); + public Result autoCombination(ShipmentDetail shipmentDetail, BigDecimal shipQty); public Result combination(CombinationModel combinationModel); - public Result createShipmentTask(ShipmentContainerHeader shipmentContainerHeader, String warehouseCode); + public Result createShipmentTask(ShipmentContainerHeader shipmentContainerHeader, String warehouseCode, + long shipmentOrder, int sequence, int sequenceNumber); public Result getInventoryFromShipmentDetail(Integer shipmentDetailId); } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/impl/ShipmentCombinationServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/impl/ShipmentCombinationServiceImpl.java index d76ac8f..3cddb26 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/impl/ShipmentCombinationServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/impl/ShipmentCombinationServiceImpl.java @@ -133,7 +133,7 @@ public class ShipmentCombinationServiceImpl implements IShipmentCombinationServi if(shipmentDetail.getTaskQty().compareTo(shipmentDetail.getQty()) < 0) { over = false; } - Result result = autoCombination(shipmentDetail); + Result result = autoCombination(shipmentDetail, null); if(!result.isSuccess()) { throw new ServiceException(result.getMessage()); } @@ -146,13 +146,16 @@ public class ShipmentCombinationServiceImpl implements IShipmentCombinationServi @Override @Transactional(rollbackFor = ServiceException.class) - public Result autoCombination(ShipmentDetail shipmentDetail) { + public Result autoCombination(ShipmentDetail shipmentDetail, BigDecimal shipQty) { //出库数量 BigDecimal shipmentQty = shipmentDetail.getQty().subtract(shipmentDetail.getTaskQty()); //判断是否还有需要出库的物料,如果没有就跳过该物料 if (shipmentQty.compareTo(BigDecimal.ZERO) <= 0) { return Result.OK("出库数量必须大于0"); } + if(shipQty != null) { + shipmentQty = shipQty; + } List<InventoryDetail> inventoryList = getInventorys(shipmentDetail); //去除已锁的库存 ArrayList<InventoryDetail> removeInventoryList = new ArrayList<>(); @@ -414,7 +417,8 @@ public class ShipmentCombinationServiceImpl implements IShipmentCombinationServi @Override @Transactional(rollbackFor = ServiceException.class) - public Result createShipmentTask(ShipmentContainerHeader shipmentContainerHeader, String warehouseCode) { + public Result createShipmentTask(ShipmentContainerHeader shipmentContainerHeader, String warehouseCode, + long shipmentOrder, int sequence, int sequenceNumber) { Integer preTaskNo = 0; if (shipmentContainerHeader == null) { return Result.error("生成出库任务时, 出库组盘头" + "未找到,操作中止"); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentContainerHeader/service/IShipmentContainerDetailService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentContainerHeader/service/IShipmentContainerDetailService.java index 7e27919..b4ff944 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentContainerHeader/service/IShipmentContainerDetailService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentContainerHeader/service/IShipmentContainerDetailService.java @@ -15,4 +15,6 @@ public interface IShipmentContainerDetailService extends IService<ShipmentContai public List<ShipmentContainerDetail> selectByMainId(String mainId); public List<ShipmentContainerDetail> getShipmentContainerDetailListByHeaderId(int shipmentContainerHeaderId); + + public List<ShipmentContainerDetail> getShipmentContainerDetailListByShipmentCode(String shipmentCode); } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentContainerHeader/service/impl/ShipmentContainerDetailServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentContainerHeader/service/impl/ShipmentContainerDetailServiceImpl.java index 4078667..2441bf1 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentContainerHeader/service/impl/ShipmentContainerDetailServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentContainerHeader/service/impl/ShipmentContainerDetailServiceImpl.java @@ -34,4 +34,12 @@ public class ShipmentContainerDetailServiceImpl extends ServiceImpl<ShipmentCont List<ShipmentContainerDetail> shipmentContainerDetailList = list(shipmentContainerDetailLambdaQueryWrapper); return shipmentContainerDetailList; } + + @Override + public List<ShipmentContainerDetail> getShipmentContainerDetailListByShipmentCode(String shipmentCode) { + LambdaQueryWrapper<ShipmentContainerDetail> shipmentContainerDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); + shipmentContainerDetailLambdaQueryWrapper.eq(ShipmentContainerDetail::getShipmentCode, shipmentCode); + List<ShipmentContainerDetail> shipmentContainerDetailList = list(shipmentContainerDetailLambdaQueryWrapper); + return shipmentContainerDetailList; + } }