package com.ruoyi.ams.xuankuang.service; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.ruoyi.ams.asn.domain.WmsDocAsnDetails; import com.ruoyi.ams.asn.domain.WmsDocAsnHeader; import com.ruoyi.ams.asn.service.IWmsDocAsnDetailsService; import com.ruoyi.ams.asn.service.IWmsDocAsnHeaderService; import com.ruoyi.ams.inv.domain.InvLotAtt; import com.ruoyi.ams.inv.domain.InvLotLocId; import com.ruoyi.ams.inv.service.IInvLotLocIdService; import com.ruoyi.ams.order.domain.WmsDocOrderDetails; import com.ruoyi.ams.order.domain.WmsDocOrderHeader; import com.ruoyi.ams.order.mapper.WmsDocOrderHeaderMapper; import com.ruoyi.ams.order.service.IWmsDocOrderDetailsService; import com.ruoyi.ams.order.service.IWmsDocOrderHeaderService; import com.ruoyi.ams.task.domain.WcsTask; import com.ruoyi.ams.task.service.IWcsTaskService; import com.ruoyi.base.constant.Constant; import com.ruoyi.base.domain.BaseLocationInfo; import com.ruoyi.base.service.IBaseLocationInfoService; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.Date; import java.util.List; /** * @author JWK * @version 1.0 * @date 2023/4/4 10:48 */ @Slf4j @Service public class WcsTaskSubService { @Autowired private IWcsTaskService iWcsTaskService; @Autowired private IBaseLocationInfoService iBaseLocationInfoService; @Autowired private IInvLotLocIdService invLotLocIdService; @Autowired private IWmsDocAsnDetailsService iWmsDocAsnDetailsService; @Autowired private IWmsDocAsnHeaderService iWmsDocAsnHeaderService; @Autowired private IWmsDocOrderDetailsService iWmsDocOrderDetailsService; @Autowired private IWmsDocOrderHeaderService iWmsDocOrderHeaderService; @Autowired private WcsToWmsApiService wcsToWmsApiService; @Autowired private WmsDocOrderHeaderMapper wmsDocOrderHeaderMapper; @Autowired WmsDocAsnSubService wmsDocAsnSubService; /** * 新增wcsTask,兼容老的四向车立体库任务 * @param locationFrom * @param locationTo * @param asnNo * @param palletNo * @return */ public AjaxResult addWcsTask(String locationFrom, String locationTo , String asnNo, String palletNo, String wcsNo) { return addWcsTask(IdWorker.getIdStr(), locationFrom, locationTo, asnNo, palletNo, wcsNo, 10L, "立体库任务"); } /** * 增加wcsTask,桶装入库的时候封装用 * @param taskNo * @param locationFrom * @param locationTo * @param asnNo * @param palletNo * @param state * @param remake * @return */ public AjaxResult addWcsTask(String taskNo, String locationFrom, String locationTo , String asnNo, String palletNo, Long state, String remake) { return addWcsTask(taskNo, locationFrom, locationTo, asnNo, palletNo, StringUtils.EMPTY, state, remake); } /** * 增加一个wcs任务 * * @return */ public AjaxResult addWcsTask(String taskNo, String locationFrom, String locationTo , String asnNo, String palletNo, String wcsNo, Long state, String remake) { BaseLocationInfo baseLocationInfoFrom = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(locationFrom, 1l); BaseLocationInfo baseLocationInfoTo = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(locationTo, 1l); WcsTask wcsTask = new WcsTask(); wcsTask.setTaskNo(taskNo); wcsTask.setState(state); wcsTask.setTaskType(Constant.TASK_TYPE.FORWARD.getValue()); wcsTask.setBusinessType("01"); wcsTask.setAreaFrom(baseLocationInfoFrom.getZoneId().toString()); wcsTask.setLocationFrom(baseLocationInfoFrom.getId().toString()); wcsTask.setAreaTo(baseLocationInfoTo.getZoneId().toString()); wcsTask.setLocationTo(baseLocationInfoTo.getId().toString()); wcsTask.setCreateTime(new Date()); wcsTask.setCreateBy("Wcs"); wcsTask.setShopId(Constant.WAREHOUSE_ID.toString()); wcsTask.setPriority(10L); wcsTask.setExt1(asnNo); wcsTask.setExt2(palletNo); wcsTask.setExt3(wcsNo); wcsTask.setRemark(remake); if (iWcsTaskService.insertWcsTask(wcsTask) > 0) { iBaseLocationInfoService.lockLocationStockStatus(Long.valueOf(wcsTask.getLocationFrom()) , Long.valueOf(wcsTask.getLocationTo()) , Constant.WAREHOUSE_ID, "Wcs"); return AjaxResult.success("任务增加成功!", taskNo); } return AjaxResult.error("任务增加失败"); } /** * 增加四向车出库任务 * * @return */ public AjaxResult addWcsOutTask(String locationFrom, String locationTo , String orderNo , String palletNo , String wcsNo) { BaseLocationInfo baseLocationInfoFrom = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(locationFrom, 1l); BaseLocationInfo baseLocationInfoTo = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(locationTo, 1l); String taskNo = generateTaskNo(); WcsTask wcsTask = new WcsTask(); wcsTask.setTaskNo(taskNo); wcsTask.setState(10L); wcsTask.setTaskType(Constant.TASK_TYPE.FORWARD.getValue()); wcsTask.setBusinessType("01"); wcsTask.setAreaFrom(baseLocationInfoFrom.getZoneId().toString()); wcsTask.setLocationFrom(baseLocationInfoFrom.getId().toString()); wcsTask.setAreaTo(baseLocationInfoTo.getZoneId().toString()); wcsTask.setLocationTo(baseLocationInfoTo.getId().toString()); wcsTask.setCreateTime(new Date()); wcsTask.setCreateBy("Wcs"); wcsTask.setShopId(Constant.WAREHOUSE_ID.toString()); wcsTask.setPriority(10L); wcsTask.setExt1(orderNo); wcsTask.setExt2(palletNo); wcsTask.setExt3(wcsNo); wcsTask.setRemark("立体库任务"); int i = iWcsTaskService.insertWcsTask(wcsTask); if (i > 0) { iBaseLocationInfoService.lockLocationStockStatus(Long.valueOf(wcsTask.getLocationFrom()) , Long.valueOf(wcsTask.getLocationTo()) , Constant.WAREHOUSE_ID, "Wcs"); return AjaxResult.success("任务增加成功!", taskNo); } return AjaxResult.error("任务增加失败"); } /** * 增加越库任务 * * @return */ public AjaxResult addCrossDatabaseTasks(String asnNo) { String taskNo = generateTaskNo(); WcsTask wcsTask = new WcsTask(); wcsTask.setTaskNo(taskNo); wcsTask.setState(10L); wcsTask.setTaskType(Constant.TASK_TYPE.FORWARD.getValue()); wcsTask.setBusinessType("01"); wcsTask.setCreateTime(new Date()); wcsTask.setCreateBy("Wcs"); wcsTask.setShopId(Constant.WAREHOUSE_ID.toString()); wcsTask.setPriority(10L); wcsTask.setExt1(asnNo); wcsTask.setRemark("立体库任务"); int i = iWcsTaskService.insertWcsTask(wcsTask); if (i > 0) { return AjaxResult.success(taskNo.toString()); } return AjaxResult.error("任务增加失败"); } /** * wcs任务反馈 * * @param taskNo * @param state * @param carNo */ @Transactional public void callBack(String taskNo, Integer state, Integer carNo) { String updateBy = "Wcs"; log.info("wcs回传------------->" + taskNo + "," + state); WcsTask wcsTask = iWcsTaskService.selectWcsTaskByTaskNo(taskNo); if (wcsTask == null) { log.info("agv回传没有任务记录------------->"); return; } if (state > 1 && state != 7) { wcsTask.setAgvNo(carNo + ""); } if (wcsTask.getState() == 2 || wcsTask.getState() == 7) { log.info("已完成的任务无需反馈"); return; } try { switch (state) { case 1: wcsTask.setStartTime(new Date()); break; case 2://完成 if (wcsTask.getState() == 2) { log.info("不能重复放货," + taskNo); return; } wcsTask.setEndTime(new Date()); //越库任务完成后反馈 if (wcsTask.getExt2().equals("") && wcsTask.getExt1().startsWith("ASN")){ completeTheCallbackYueKu(wcsTask); break; } //入库完成后反馈 if (wcsTask.getExt1().startsWith("ASN")) { // 解锁库位 iBaseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom()) , Long.parseLong(wcsTask.getLocationTo()) , Constant.WAREHOUSE_ID, updateBy); // 将起始点库存移动到终点库位 iWcsTaskService.moveStartingPointToDestination(wcsTask); // 修改入库单收货数量 completeTheCallback(wcsTask); }//agv入库完成后反馈,回调wcs卸货完成 else if (wcsTask.getLocationTo().equals("100733") && wcsTask.getExt1()==null){ // 解锁库位 iBaseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom()) , Long.parseLong(wcsTask.getLocationTo()) , Constant.WAREHOUSE_ID, updateBy); // 将起始点库存移动到终点库位 iWcsTaskService.moveStartingPointToDestination(wcsTask); wcsToWmsApiService.agvCallbackWCSBeforeUnloadingIsCompleted(); } //出库完成后反馈 if (wcsTask.getExt1().startsWith("SO")) { // 解锁库位 iBaseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom()) , Long.parseLong(wcsTask.getLocationTo()) , Constant.WAREHOUSE_ID, updateBy); // 将起始点库存移动到终点库位 iWcsTaskService.moveStartingPointToDestinationout(wcsTask); invLotLocIdService.adjLocationIsEmpty(wcsTask.getLocationFrom(), Constant.WAREHOUSE_ID, "Wcs"); // 修改出库单收货数量 completeTheCallbackOut(wcsTask); }//空托任务反馈和移库反馈 else if (wcsTask.getExt1().equals("")){ // 解锁库位 iBaseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom()) , Long.parseLong(wcsTask.getLocationTo()) , Constant.WAREHOUSE_ID, updateBy); iWcsTaskService.moveStartingPointToDestinationout(wcsTask); if (!wcsTask.getExt3().equals("")){ invLotLocIdService.adjLocationIsEmpty(wcsTask.getLocationFrom(), Constant.WAREHOUSE_ID, "Wcs"); } }//agv出库完成后反馈回调取货完成 else if (wcsTask.getExt5()!=null){ // 解锁库位 iBaseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom()) , Long.parseLong(wcsTask.getLocationTo()) , Constant.WAREHOUSE_ID, updateBy); iWcsTaskService.moveStartingPointToDestinationout(wcsTask); wmsDocAsnSubService.wmsAgvCallbackOuttask(wcsTask.getExt5()); } break; case 4: if (wcsTask.getState() == 4) { log.info("不能重复取货," + taskNo); return; } // // 解锁起始库位 // iBaseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom()) // , Constant.WAREHOUSE_ID, updateBy); // // 将起始点库存移动到终点位 // iWcsTaskService.moveStartingPointToDestination(wcsTask); break; case 7://取消 wcsTask.setEndTime(new Date()); // 解锁终点和起始库位 iBaseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom()), Long.parseLong(wcsTask.getLocationTo()) , Constant.WAREHOUSE_ID, updateBy); // 取消任务删除中间缓存库存 // cancelTaskDelMiddleCache(wcsTask); break; default: break; } } catch (Exception e) { log.info(wcsTask.getTaskNo() + "-----" + "回调状态:" + state + "异常", e); wcsTask.setRemark("回调状态:" + state + "异常"); throw new RuntimeException(); } wcsTask.setState(state.longValue()); wcsTask.setUpdateDate(new Date()); iWcsTaskService.updateWcsTask(wcsTask); } /** * 任务完成后回调 * * @param wcsTask * @return */ public AjaxResult completeTheCallback(WcsTask wcsTask) { boolean con = true; boolean con1 = true; String palletNo = wcsTask.getExt2(); String asnNo = wcsTask.getExt1(); WmsDocAsnDetails wmsDocAsnDetails = iWmsDocAsnDetailsService.selectWmsDocAsnDetailsByAsnNoLineNo(asnNo, "1"); BigDecimal expectedQty = wmsDocAsnDetails.getExpectedQty(); BigDecimal receivedQty = wmsDocAsnDetails.getReceivedQty(); BigDecimal canQty = expectedQty.subtract(receivedQty); InvLotAtt invLotAtt = new InvLotAtt(); invLotAtt.setLotatt07(palletNo); invLotAtt.setLotatt08(asnNo); List invLotLocIds = invLotLocIdService.queryInvByInvLotatt(invLotAtt); for (InvLotLocId invLotLocId : invLotLocIds) { BigDecimal qty = invLotLocId.getQty(); if (qty.compareTo(canQty) == 1) { continue; } else if (qty.compareTo(canQty) == 0) { wmsDocAsnDetails.setReceivedQty(expectedQty); int i = iWmsDocAsnDetailsService.updateWmsDocAsnDetails(wmsDocAsnDetails); if (i > 0) { wmsDocAsnDetails.setLineStatus(Constant.ASN_STS.STS40.getValue()); iWmsDocAsnDetailsService.updateWmsDocAsnDetails(wmsDocAsnDetails); } else { con = false; continue; } } else if (qty.compareTo(canQty) == -1) { wmsDocAsnDetails.setReceivedQty(receivedQty.add(qty)); int i = iWmsDocAsnDetailsService.updateWmsDocAsnDetails(wmsDocAsnDetails); if (i > 0) { wmsDocAsnDetails.setLineStatus(Constant.ASN_STS.STS30.getValue()); iWmsDocAsnDetailsService.updateWmsDocAsnDetails(wmsDocAsnDetails); con1 = false; } } } if (con == true) { WmsDocAsnHeader wmsDocAsnHeader = iWmsDocAsnHeaderService.selectWmsDocAsnHeaderByAsnNo(asnNo); // 修改 单头40 wmsDocAsnHeader.setAsnStatus(Constant.ASN_STS.STS40.getValue()); iWmsDocAsnHeaderService.updateWmsDocAsnHeader(wmsDocAsnHeader); } if (con1 == false) { WmsDocAsnHeader wmsDocAsnHeader = iWmsDocAsnHeaderService.selectWmsDocAsnHeaderByAsnNo(asnNo); // 修改 单头30 wmsDocAsnHeader.setAsnStatus(Constant.ASN_STS.STS30.getValue()); iWmsDocAsnHeaderService.updateWmsDocAsnHeader(wmsDocAsnHeader); } return AjaxResult.success(""); } /** * 出库完成任务回调 * * @param wcsTask * @return */ public AjaxResult completeTheCallbackOut(WcsTask wcsTask) { boolean con = true; boolean con1 = true; String palletNo = wcsTask.getExt2(); String orderNo = wcsTask.getExt1(); List list = iWmsDocOrderDetailsService.selectWmsDocOrderDetailsByOrderNo(orderNo); BigDecimal qtyOrderedEach = list.get(0).getQtyOrderedEach(); BigDecimal allocatedEach = list.get(0).getQtyAllocated(); String sku = list.get(0).getSku(); BigDecimal canQty = qtyOrderedEach.subtract(allocatedEach); InvLotAtt invLotAtt = new InvLotAtt(); invLotAtt.setLotatt07(palletNo); List invLotLocIds = invLotLocIdService.queryInvByInvLotatt(invLotAtt); for (InvLotLocId invLotLocId : invLotLocIds) { BigDecimal qty = invLotLocId.getQty(); if (qty.compareTo(canQty) >= 0) { list.get(0).setQtyAllocatedEach(qtyOrderedEach); list.get(0).setQtyAllocated(qtyOrderedEach); list.get(0).setQtyPicked(qtyOrderedEach); int i = iWmsDocOrderDetailsService.updateWmsDocOrderDetails(list.get(0)); if (i > 0) { list.get(0).setLineStatus(Constant.ASN_STS.STS40.getValue()); iWmsDocOrderDetailsService.updateWmsDocOrderDetails(list.get(0)); } else { con = false; continue; } } else if (qty.compareTo(canQty) < 0) { list.get(0).setQtyAllocatedEach(allocatedEach.add(qty)); list.get(0).setQtyAllocated(allocatedEach.add(qty)); list.get(0).setQtyPicked(allocatedEach.add(qty)); int i = iWmsDocOrderDetailsService.updateWmsDocOrderDetails(list.get(0)); if (i > 0) { list.get(0).setLineStatus(Constant.ASN_STS.STS30.getValue()); iWmsDocOrderDetailsService.updateWmsDocOrderDetails(list.get(0)); con1 = false; con = false; } } } if (con == true) { WmsDocOrderHeader wmsDocOrderHeader = iWmsDocOrderHeaderService.selectWmsDocOrderHeaderByOrderNo(orderNo); // 修改 单头40 wmsDocOrderHeader.setOrderStatus(Constant.ORDER_STS.STS40.getValue()); int i = iWmsDocOrderHeaderService.updateWmsDocOrderHeader(wmsDocOrderHeader); if (i >0) { if (sku.equals("Na2CO3")){ wcsToWmsApiService.turnOffTheUnpacker(); } if (sku.equals("C5H10OS2")){ wcsToWmsApiService.turnOffTheUnpacker1(); } if (sku.equals("(NaPO3)6")){ wcsToWmsApiService.turnOffTheUnpacker2(); } if (sku.equals("(NH4)2SO4")){ wcsToWmsApiService.turnOffTheUnpacker3(); } if (sku.equals("CH3CH2OCS2Na")){ wcsToWmsApiService.turnOffTheUnpacker4(); } }; } if (con1 == false) { WmsDocOrderHeader wmsDocOrderHeader = iWmsDocOrderHeaderService.selectWmsDocOrderHeaderByOrderNo(orderNo); // 修改 单头30 wmsDocOrderHeader.setOrderStatus(Constant.ORDER_STS.STS30.getValue()); iWmsDocOrderHeaderService.updateWmsDocOrderHeader(wmsDocOrderHeader); } return AjaxResult.success(""); } /** * 越库完成后回调 * * @param wcsTask * @return */ public AjaxResult completeTheCallbackYueKu(WcsTask wcsTask) { String asnNo = wcsTask.getExt1(); WmsDocAsnDetails wmsDocAsnDetails = iWmsDocAsnDetailsService.selectWmsDocAsnDetailsByAsnNoLineNo(asnNo, "1"); String sku = wmsDocAsnDetails.getSku(); //修改 入库单明细40 wmsDocAsnDetails.setLineStatus(Constant.ASN_STS.STS40.getValue()); wmsDocAsnDetails.setReceivedQty(wmsDocAsnDetails.getExpectedQty()); wmsDocAsnDetails.setReceivedQtyEach(wmsDocAsnDetails.getExpectedQty()); iWmsDocAsnDetailsService.updateWmsDocAsnDetails(wmsDocAsnDetails); // 修改 入库单单头40 WmsDocAsnHeader wmsDocAsnHeader = iWmsDocAsnHeaderService.selectWmsDocAsnHeaderByAsnNo(asnNo); wmsDocAsnHeader.setAsnStatus(Constant.ASN_STS.STS40.getValue()); iWmsDocAsnHeaderService.updateWmsDocAsnHeader(wmsDocAsnHeader); //查询对应的出库单 WmsDocOrderHeader wmsDocOrderHeader = new WmsDocOrderHeader(); wmsDocOrderHeader.setSoReference2(asnNo); List wmsDocOrderHeaders = wmsDocOrderHeaderMapper.selectWmsDocOrderHeaderList2(wmsDocOrderHeader); String orderNo = wmsDocOrderHeaders.get(0).getOrderNo(); //修改 出库单明细40 List list = iWmsDocOrderDetailsService.selectWmsDocOrderDetailsByOrderNo(orderNo); list.get(0).setLineStatus(Constant.ASN_STS.STS40.getValue()); list.get(0).setQtyAllocated(list.get(0).getQtyOrdered()); list.get(0).setQtyAllocatedEach(list.get(0).getQtyOrdered()); iWmsDocOrderDetailsService.updateWmsDocOrderDetails(list.get(0)); //修改 出库单单头40 WmsDocOrderHeader wmsDocOrderHeader1 = iWmsDocOrderHeaderService.selectWmsDocOrderHeaderByOrderNo(orderNo); wmsDocOrderHeader1.setOrderStatus(Constant.ORDER_STS.STS40.getValue()); int i = iWmsDocOrderHeaderService.updateWmsDocOrderHeader(wmsDocOrderHeader1); if (i >0) { if (sku.equals("Na2CO3")){ wcsToWmsApiService.turnOffTheUnpacker(); } if (sku.equals("C5H10OS2")){ wcsToWmsApiService.turnOffTheUnpacker1(); } if (sku.equals("(NaPO3)6")){ wcsToWmsApiService.turnOffTheUnpacker2(); } if (sku.equals("(NH4)2SO4")){ wcsToWmsApiService.turnOffTheUnpacker3(); } if (sku.equals("CH3CH2OCS2Na")){ wcsToWmsApiService.turnOffTheUnpacker4(); } }; return AjaxResult.success(""); } /** * 生成唯一任务号 * * @return */ public synchronized String generateTaskNo() { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } return System.currentTimeMillis() + ""; } }