diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/controller/WisController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/controller/WisController.java new file mode 100644 index 0000000..081a54f --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/controller/WisController.java @@ -0,0 +1,42 @@ +package org.jeecg.modules.wms.api.wms.controller; + +import javax.annotation.Resource; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.modules.wms.api.wms.entity.WmsEntity; +import org.jeecg.modules.wms.api.wms.service.WmsService; +import org.jeecg.modules.wms.framework.controller.HuahengBaseController; +import org.jeecg.utils.support.ApiLogger; +import org.springframework.web.bind.annotation.*; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; + +/** + * @author 游杰 + */ +@RestController +@RequestMapping("/api/wms") +@Api(tags = "WMS接口") +public class WisController extends HuahengBaseController { + + @Resource + private WmsService wmsService; + + @AutoLog(value = "下发WMS任务") + @PostMapping("/sendWmsTask") + @ResponseBody + @ApiOperation("下发WMS任务") + @ApiLogger(apiName = "下发WMS任务", from = "WMS") + public Result sendWmsTask(@RequestBody WmsEntity wmsEntity) { + Result result = handleMultiProcess("sendWmsTask", new MultiProcessListener() { + @Override + public Result<?> doProcess() { + Result result = wmsService.sendWmsTask(wmsEntity); + return result; + } + }); + return result; + } +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/entity/WmsEntity.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/entity/WmsEntity.java new file mode 100644 index 0000000..abf367b --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/entity/WmsEntity.java @@ -0,0 +1,18 @@ +package org.jeecg.modules.wms.api.wms.entity; + +import java.util.List; + +import lombok.Data; + +@Data +public class WmsEntity { + + private String taskNo; + private int taskType; + private String containerCode; + private String remark; + private String warehouseCode; + private String toPort; + private List<WmsInventory> wmsInventoryList; + +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/entity/WmsInventory.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/entity/WmsInventory.java new file mode 100644 index 0000000..c820ca0 --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/entity/WmsInventory.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.wms.api.wms.entity; + +import java.math.BigDecimal; + +import lombok.Data; + +@Data +public class WmsInventory { + + private String materialCode; + private String batch; + private BigDecimal qty; + private String inventoryStatus; + +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsService.java new file mode 100644 index 0000000..71131bd --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsService.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.wms.api.wms.service; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.wms.api.wms.entity.WmsEntity; + +/** + * @author 游杰 + */ +public interface WmsService { + + /** + * 取消WCS任务 + */ + Result sendWmsTask(WmsEntity wmsEntity); + + Result createReceiptTask(WmsEntity wmsEntity); + + Result createShipmentTask(WmsEntity wmsEntity); +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsServiceImpl.java new file mode 100644 index 0000000..897caae --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsServiceImpl.java @@ -0,0 +1,197 @@ +package org.jeecg.modules.wms.api.wms.service; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Resource; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.modules.wms.api.erp.entity.*; +import org.jeecg.modules.wms.api.erp.service.IErpService; +import org.jeecg.modules.wms.api.wms.entity.WmsEntity; +import org.jeecg.modules.wms.api.wms.entity.WmsInventory; +import org.jeecg.modules.wms.framework.service.IHuahengMultiHandlerService; +import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerHeader; +import org.jeecg.modules.wms.receipt.receiptContainerHeader.service.IReceiptContainerHeaderService; +import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptDetail; +import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptHeader; +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.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.service.ITaskHeaderService; +import org.jeecg.utils.StringUtils; +import org.jeecg.utils.constant.QuantityConstant; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author 游杰 + */ +@Slf4j +@Service +public class WmsServiceImpl implements WmsService { + + @Resource + private ITaskHeaderService taskHeaderService; + @Resource + private IReceiptContainerHeaderService receiptContainerHeaderService; + @Resource + private WmsService wmsService; + @Resource + private IErpService erpService; + @Resource + private IReceiveService receiveService; + @Resource + private IReceiptHeaderService receiptHeaderService; + @Resource + private IReceiptDetailService receiptDetailService; + @Resource + private IHuahengMultiHandlerService huahengMultiHandlerService; + @Resource + private IShipmentHeaderService shipmentHeaderService; + @Resource + private IShipmentDetailService shipmentDetailService; + @Resource + private IShipmentCombinationService shipmentCombinationService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Result sendWmsTask(WmsEntity wmsEntity) { + int taskType = wmsEntity.getTaskType(); + Result result = null; + switch (taskType) { + case QuantityConstant.TASK_TYPE_WHOLERECEIPT: + case QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT: + result = wmsService.createReceiptTask(wmsEntity); + break; + case QuantityConstant.TASK_TYPE_WHOLESHIPMENT: + case QuantityConstant.TASK_TYPE_SORTINGSHIPMENT: + break; + + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result createReceiptTask(WmsEntity wmsEntity) { + String warehouseCode = wmsEntity.getWarehouseCode(); + String remark = wmsEntity.getRemark(); + String toPort = wmsEntity.getToPort(); + String containerCode = wmsEntity.getContainerCode(); + String referCode = wmsEntity.getTaskNo(); + List<WmsInventory> wmsInventoryList = wmsEntity.getWmsInventoryList(); + List<Receive> receiveList = new ArrayList<>(); + if (wmsInventoryList == null) { + return Result.error("WMS下发入库任务失败,库存为空"); + } + ErpReceipt erpReceipt = new ErpReceipt(); + ErpReceiptHeader erpReceiptHeader = new ErpReceiptHeader(); + List<ErpReceiptDetail> erpReceiptDetailList = new ArrayList<>(); + erpReceiptHeader.setCompanyCode(QuantityConstant.DEFAULT_COMPANY); + erpReceiptHeader.setReceiptType(QuantityConstant.RECEIPT_BILL_TYPE_YCLR); + erpReceiptHeader.setReferCode(referCode); + erpReceiptHeader.setWarehouseCode(warehouseCode); + erpReceiptHeader.setRemark(remark); + for (WmsInventory wmsInventory : wmsInventoryList) { + ErpReceiptDetail erpReceiptDetail = new ErpReceiptDetail(); + erpReceiptDetail.setMaterialCode(wmsInventory.getMaterialCode()); + erpReceiptDetail.setBatch(wmsInventory.getBatch()); + erpReceiptDetail.setInventoryStatus(wmsInventory.getInventoryStatus()); + erpReceiptDetail.setQty(wmsInventory.getQty()); + erpReceiptDetailList.add(erpReceiptDetail); + } + erpReceipt.setReceiptHeader(erpReceiptHeader); + erpReceipt.setReceiptDetailList(erpReceiptDetailList); + Result result = erpService.receipt(erpReceipt); + ReceiptHeader receiptHeader = receiptHeaderService.getReceiptHeaderByReferCode(referCode, warehouseCode); + if (receiptHeader == null) { + return Result.error("WMS下发入库任务失败,没有找到匹配的入库单, 上游单号:" + referCode); + } + List<ReceiptDetail> receiptDetailList = receiptDetailService.selectByMainId(String.valueOf(receiptHeader.getId())); + if (receiptDetailList == null || receiptDetailList.size() == 0) { + return Result.error("WMS下发入库任务失败,没有找到匹配的入库单详情, 上游单号:" + referCode); + } + for (ReceiptDetail receiptDetail : receiptDetailList) { + Receive receive = new Receive(); + receive.setId(receiptDetail.getId()); + receive.setContainerCode(containerCode); + receive.setMaterialCode(receiptDetail.getMaterialCode()); + receive.setMaterialName(receiptDetail.getMaterialName()); + receive.setMaterialSpec(receiptDetail.getMaterialSpec()); + receive.setMaterialUnit(receiptDetail.getMaterialUnit()); + receive.setInventoryStatus(receiptDetail.getInventoryStatus()); + receive.setQty(receiptDetail.getQty()); + receive.setTaskQty(receiptDetail.getQty()); + receiveList.add(receive); + } + result = receiveService.receiving(receiveList, warehouseCode); + if (!result.isSuccess()) { + throw new JeecgBootException(result.getMessage()); + } + ReceiptContainerHeader receiptContainerHeader = receiptContainerHeaderService.getUnCompleteReceiptContainerByCode(containerCode, warehouseCode); + if (receiptContainerHeader == null) { + throw new JeecgBootException("WMS下发入库任务失败"); + } + receiptContainerHeader.setToPort(toPort); + boolean success = receiptContainerHeaderService.updateById(receiptContainerHeader); + if (!success) { + throw new JeecgBootException("MES下发入库信息,更新入库组盘头失败"); + } + return huahengMultiHandlerService.createReceiptTask(receiptContainerHeader, warehouseCode); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result createShipmentTask(WmsEntity wmsEntity) { + String warehouseCode = wmsEntity.getWarehouseCode(); + String remark = wmsEntity.getRemark(); + String toPort = wmsEntity.getToPort(); + String referCode = wmsEntity.getTaskNo(); + List<WmsInventory> wmsInventoryList = wmsEntity.getWmsInventoryList(); + if (wmsInventoryList == null) { + return Result.error("WMS下发出库任务失败,库存为空"); + } + 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); + } + + ErpShipment erpShipment = new ErpShipment(); + ErpShipmentHeader erpShipmentHeader = new ErpShipmentHeader(); + List<ErpShipmentDetail> erpShipmentDetailList = new ArrayList<>(); + erpShipmentHeader.setShipmentType(QuantityConstant.SHIPMENT_BILL_TYPE_SCC); + erpShipmentHeader.setCompanyCode(QuantityConstant.DEFAULT_COMPANY); + erpShipmentHeader.setReferCode(referCode); + erpShipmentHeader.setRemark(remark); + erpShipmentHeader.setWarehouseCode(warehouseCode); + for (ShipmentDetail shipmentDetail : shipmentDetailList) { + ErpShipmentDetail erpShipmentDetail = new ErpShipmentDetail(); + erpShipmentDetail.setMaterialCode(shipmentDetail.getMaterialCode()); + erpShipmentDetail.setBatch(shipmentDetail.getBatch()); + } + Result result = shipmentCombinationService.autoCombination(shipmentCode, warehouseCode); + if (!result.isSuccess()) { + throw new JeecgBootException("MES下发出库信息," + result.getMessage()); + } + return null; + } + +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java index 75bb0c8..00fce92 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java @@ -1705,7 +1705,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea ReceiptHeader receiptHeader = new ReceiptHeader(); receiptHeader.setWarehouseCode(taskHeader.getWarehouseCode()); receiptHeader.setCompanyCode(taskHeader.getCompanyCode()); - receiptHeader.setType(QuantityConstant.RECEIPT_BILL_TYPE_OR); + receiptHeader.setType(QuantityConstant.RECEIPT_BILL_TYPE_QTR); receiptHeader.setRemark("盘盈 单号" + cycleCountDetail.getCycleCountHeadCode()); Result result = receiptHeaderService.saveReceiptHeader(receiptHeader); if (result.getCode() != 200) { @@ -1768,7 +1768,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea ShipmentHeader shipmentHeader = new ShipmentHeader(); shipmentHeader.setWarehouseCode(taskHeader.getWarehouseCode()); shipmentHeader.setCompanyCode(taskHeader.getCompanyCode()); - shipmentHeader.setType(QuantityConstant.SHIPMENT_BILL_TYPE_OS); + shipmentHeader.setType(QuantityConstant.SHIPMENT_BILL_TYPE_QTC); shipmentHeader.setRemark("盘亏 单号" + cycleCountDetail.getCycleCountHeadCode()); Result result = shipmentHeaderService.saveShipmentHeader(shipmentHeader); if (result.getCode() != 200) { diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java index b311387..699e298 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java @@ -20,9 +20,9 @@ package org.jeecg.utils.constant; * @author ricard */ public class QuantityConstant { - + // 1、入库单状态 - + // 新建 public static final Integer RECEIPT_HEADER_BUILD = 0; @@ -374,7 +374,7 @@ public class QuantityConstant { // WCS库位信息查询 public static final String ADDRESS_WCS_LOCATION_INFO = "WCS_LOCATION_INFO"; - + public static final String ADDRESS_WCS_TAKS_INFOS = "WCS_TASK_INFOS"; // WCS任务下发 public static final String ADDRESS_WCS_TASK_ASSIGN = "WCS_TASK_ASSIGN"; @@ -434,10 +434,10 @@ public class QuantityConstant { public static final int STATION_PICK_AND_OUT = 4; public static final String EMPTY_STRING = ""; - + public static final String STATUS_CONTAINER_EMPTY = "empty"; public static final String STATUS_CONTAINER_LOCK = "lock"; - + public static final String STATUS_CONTAINER_FILL_EMPTY = "empty"; public static final String STATUS_CONTAINER_FILL_SOME = "some"; public static final String STATUS_CONTAINER_FILL_FULL = "full"; @@ -509,17 +509,8 @@ public class QuantityConstant { // 任务有异常,已经处理了异常。 public static final int EXCEPTION_TASK_HANDLE = 2; - public static final String RECEIPT_TYPE_PRODUCTON = "SC"; // 生产入库单 - public static final String RECEIPT_TYPE_DIRECT_TRANSGER = "JS"; // 直接调拨单 - public static final String RECEIPT_TYPE_SALE = "SP"; // 销售出库单 - public static final String RECEIPT_TYPE_RETURN_GOOD = "SR"; // 退货出库单 - public static final String RECEIPT_TYPE_HP = "HP"; // 合盘出库单 - public static final String SHIPMENT_TYPE_DELIVERY = "DN"; // 发货通知单 - public static final String SHIPMENT_TYPE_BH = "BH"; // 补货通知单 - public static final String SHIPMENT_TYPE_OTHER = "QTCKD01_SYS"; // 补货通知单 - public static final String DEFAULT_WAREHOUSE = "CS0001"; - public static final String DEFAULT_COMPANY = "JY"; + public static final String DEFAULT_COMPANY = "CSHH"; public static final char DOT = '.'; public static final String _CH_ = "_CH_"; public static final String _PKMX_ = "_PKMX_"; @@ -531,10 +522,20 @@ public class QuantityConstant { public static final String BILL_TYPE_SHIPMENT_OTHER = "SO"; /* 入库单据类型 */ - public static final String RECEIPT_BILL_TYPE_OR = "QTR";// 其他入库单 + public static final String RECEIPT_BILL_TYPE_SCR = "SCR"; // 生产入库单 + public static final String RECEIPT_BILL_TYPE_DBR = "DBR"; // 调拨入库单 + public static final String RECEIPT_BILL_TYPE_CPR = "CPR"; // 成品入库单 + public static final String RECEIPT_BILL_TYPE_BCPR = "BCPR"; // 半成品入库单 + public static final String RECEIPT_BILL_TYPE_YCLR = "YCLR"; // 原材料入库单 + public static final String RECEIPT_BILL_TYPE_QTR = "QTR"; // 其他入库单 /* 出库单据类型 */ - public static final String SHIPMENT_BILL_TYPE_OS = "QTC";// 其他出库单 + public static final String SHIPMENT_BILL_TYPE_SCC = "SCC";// 生产出库单 + public static final String SHIPMENT_BILL_TYPE_DBC = "DBC";// 调拨出库单 + public static final String SHIPMENT_BILL_TYPE_CPC = "CPC";// 成品出库单 + public static final String SHIPMENT_BILL_TYPE_BCPC = "BCPC";// 半成品出库单 + public static final String SHIPMENT_BILL_TYPE_YCLC = "YCLC";// 原材料出库单 + public static final String SHIPMENT_BILL_TYPE_QTC = "QTC";// 其它出库单 /* 盘点单据类型 */ public static final String SHIPMENT_BILL_TYPE_PD = "PD";// 盘点单 @@ -551,51 +552,6 @@ public class QuantityConstant { public static final int HTTP_OK = 200; - public static final String EER_TABLE_OTHERSHIPMENT = "STK_MisDelivery"; - /* 直接调拨单回传 */ - public static final String SAL_DELIVERYNOTICE = "SAL_DELIVERYNOTICE"; - public static final String DoNothing_PushTransferRin = "DoNothing_PushTransferRin"; - - /* 销售退货单回传 */ - public static final String SAL_RETURNNOTICE = "SAL_RETURNNOTICE"; - public static final String DoNothingPushOut = "DoNothingPushOut"; - - /* 生产入库单回传 */ - public static final String SP_InStock = "SP_InStock"; - /* 其他入库单回传 */ - public static final String STK_MISCELLANEOUS = "STK_MISCELLANEOUS"; - /* 默认立库 (PRO) */ - public static final String DEFAULT_STOCK = "CK003"; - /* 默认 仓位 (PRO) */ - public static final String DEFAULT_STOCKLOC = "1101T"; - /* 默认 仓位内码 (PRO) */ - public static final String DEFAULT_STOCKLOCID = "100003"; - /* 默认本位币 (PRO) */ - public static final String DEFAULT_BASECURRID = "PRE001"; - /* 默认 库存方向 */ - public static final String DEFAULT_STOCKDIRECT = "GENERAL"; - /* 默认 仓管员 */ - public static final String DEFAULT_STOCKER = "102.YG2021054"; - /* 默认货主类型 (PRO) */ - public static final String DEFAULT_OWNERTYPE = "BD_OwnerOrg"; - /* 默认库存状态 可用 */ - public static final String DEFAULT_STOCKSTATUS = "KCZT01_SYS"; - /* 默认库存状态 报废 */ - public static final String STOCKSTATUS_BF = "KCZT07_SYS"; - /* 默认 保管者类型 */ - public static final String DEFAULT_KEEPER = "BD_KeeperOrg"; - /* 默认 生产车间 */ - public static final String DEFAULT_WORKSHOP = "BM000346"; - /* 默认 物料辅助属性 */ - public static final String MATERIAL_COLOUR = "colour"; - public static final String MATERIAL_LEVEL = "level"; - - public static String ryTask_warehouse_code = "CS0001"; - - public static final int STACK_HUI_ZI = 1; // 回字型 - public static final int STACK_GONG_ZI = 2; // 工子型 - public static final int STACK_PING_FANG = 3; // 平放托 -// public static final String URL = "http://erptest.gani.com.cn/K3Cloud/"; public static final String URL = "http://erptest.gani.com.cn/K3Cloud/"; // pro