From c89e1cec7a10b7e253e97360171e9e3333183be0 Mon Sep 17 00:00:00 2001 From: Lenovo Date: Sun, 27 Sep 2026 15:23:50 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8E=B0=E5=9C=BA=E8=BF=90=E8=A1=8C=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/api/service/impl/ApiErpService.java | 9 +- .../ruoyi/api/service/impl/ApiWcsService.java | 8 +- .../controller/BasCargoSpaceController.java | 6 +- .../java/com/ruoyi/common/CargoSpaceCode.java | 7 +- .../job/service/impl/MydoJobServiceImpl.java | 10 +- .../impl/InStockinDetailServiceImpl.java | 3 +- .../stockout/mapper/OutStockoutMapper.java | 8 + .../stockout/service/IOutStockoutService.java | 24 ++ .../service/impl/OutStockoutServiceImpl.java | 229 +++++++++++++++++- .../pda/controller/PdaStockoutController.java | 44 ++-- .../pda/service/impl/PdaServiceImpl.java | 2 - .../ruoyi/scheduleTask/MydoJobHandler.java | 2 +- .../ruoyi/scheduleTask/RequestWcsHandler.java | 2 +- .../mapper/out/OutStockoutMapper.xml | 6 + ruoyi-ui/src/views/bas/cargospace/index.vue | 4 +- 15 files changed, 326 insertions(+), 38 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiErpService.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiErpService.java index 901ba05..1fbd52d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiErpService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiErpService.java @@ -247,7 +247,14 @@ public class ApiErpService implements IApiErpService { log.info("【ERP出库单明细】{}", JSONUtil.toJsonStr(detail)); } - return AjaxResult.success("操作成功,下发erp出库单据号:" + docNo); + log.info("【ERP推送出库】操作成功,下发出库单据号:{}", docNo); + +// outStockoutService.autoAssignOutStockout(stockoutId); + outStockoutService.autoAssignOutStockoutByErpBill(docNo); + + log.info("【ERP推送出库】出库单据已经执行自动分配, 单据号:{}", docNo); + + return AjaxResult.success("操作成功,erp下发出库单据号:" + docNo); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiWcsService.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiWcsService.java index 3e6607f..7371eaf 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiWcsService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiWcsService.java @@ -34,7 +34,6 @@ import com.ruoyi.out.stockoutdetail.domain.OutStockoutDetail; import com.ruoyi.out.stockoutdetail.service.IOutStockoutDetailService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -299,7 +298,7 @@ public class ApiWcsService implements IApiWcsService { cargoParam = new BasCargoSpace().builder().theType(type).cargoAreaId(wcsStockinReiceive.getCargoAreaId()).build(); }else if (type == 2){ //1500*1200 高货位510H - 只能放指定层高的货位 - cargoParam = new BasCargoSpace().builder().theType(type).cargoAreaId(wcsStockinReiceive.getCargoAreaId()).theHeight(wcsStockinReiceive.getHeight()).build(); + cargoParam = new BasCargoSpace().builder().theType(type).cargoAreaId(wcsStockinReiceive.getCargoAreaId()).build(); }else{ //1500*1350 通用货位510H - 货区3任意层数 cargoParam = new BasCargoSpace().builder().theType(type).cargoAreaId(wcsStockinReiceive.getCargoAreaId()).build(); @@ -433,6 +432,11 @@ public class ApiWcsService implements IApiWcsService { return AjaxResult.error("找不到该货位信息"); } + if (!cargoSpace.getLocked().equals(CargoSpaceCode.CARGOSPACE_LOCKED_NORMAL)){ + log.warn("【操作失败】当前货位已经锁定或禁用,不能执行<指定货位出库>该操作,货位号:", cargoSpaceId); + return AjaxResult.error("当前货位已经锁定或禁用,不能执行<指定货位出库>该操作"); + } + // if (!cargoSpace.getStatus().equals(CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED)){ // log.warn("【操作失败】该货位已被其它任务预占用,请等待任务执行完成后重试,货位号:", cargoSpaceId); // return AjaxResult.error("该货位已被其它任务预占用,请等待任务执行完成后重试"); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/controller/BasCargoSpaceController.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/controller/BasCargoSpaceController.java index cc31b31..b64bab5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/controller/BasCargoSpaceController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/controller/BasCargoSpaceController.java @@ -1,6 +1,8 @@ package com.ruoyi.bas.cargospace.controller; import java.util.List; + +import com.ruoyi.common.CargoSpaceCode; import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; @@ -42,7 +44,9 @@ public class BasCargoSpaceController extends BaseController public TableDataInfo list(BasCargoSpace basCargoSpace) { startPage(); - List list = basCargoSpaceService.selectBasCargoSpaceList(basCargoSpace); + List list = basCargoSpaceService.selectBasCargoSpaceList(basCargoSpace).stream() + .filter(a -> !a.getLocked().equals(CargoSpaceCode.CARGOSPACE_LOCKED_BANED)) + .toList(); return getDataTable(list); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/CargoSpaceCode.java b/ruoyi-admin/src/main/java/com/ruoyi/common/CargoSpaceCode.java index d767f0f..83e2a9c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/common/CargoSpaceCode.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/CargoSpaceCode.java @@ -22,10 +22,13 @@ public class CargoSpaceCode { /** 货位锁定状态 - 锁定 */ - public static final String CARGOSPACE_LOCKED = "Y"; + public static final String CARGOSPACE_LOCKED_LOCK = "Y"; /** 货位锁定状态 - 未锁定 */ - public static final String CARGOSPACE_UNLOCKED = "N"; + public static final String CARGOSPACE_LOCKED_NORMAL = "N"; + + /** 货位锁定状态 - 禁用 */ + public static final String CARGOSPACE_LOCKED_BANED = "B"; /** 货位对应托盘类型 - 类型1 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/job/service/impl/MydoJobServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/in/job/service/impl/MydoJobServiceImpl.java index a8428f4..c638f00 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/job/service/impl/MydoJobServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/job/service/impl/MydoJobServiceImpl.java @@ -591,8 +591,14 @@ public class MydoJobServiceImpl implements IMydoJobService log.info("【账务处理-手动出库】更新货位状态,作业号:{},货位编号:{},托盘号:{}", jobId, cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode()); //--------------------处理任务表和子任务表-------------------- - //1.更新任务主表状态 + //1.更新任务主表状态并移除作业 mydoJob.setStatus(TaskStatusEnum.AUTO_FINISHED.getCode()); + updateMydoJob(mydoJob); + deleteMydoJobByJobId(jobId); + + //2.并移除所有子作业 + mydoJobDetailService.insertMydoJobDetailsForJobFinish(jobId); + mydoJobDetailService.deleteMydoJobDetailsByJobId(jobId); log.info("【账务处理-手动出库】出库完成,等待确认,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode()); @@ -783,6 +789,8 @@ public class MydoJobServiceImpl implements IMydoJobService } + //>>>>>>>>>>>>>>>>>>>>>>>空托出库<<<<<<<<<<<<<<<<<<<<<<<< + //>>>>>>>>>>>>>>>>>>>>>>>空托出库<<<<<<<<<<<<<<<<<<<<<<<< //>>>>>>>>>>>>>>>>>>>>>>>空托出库<<<<<<<<<<<<<<<<<<<<<<<< if (type == TaskType.TASKTYPE_STOCKOUT_EMPTY_TRAY){ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/service/impl/InStockinDetailServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/service/impl/InStockinDetailServiceImpl.java index db1cdd6..7f1f2e2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/service/impl/InStockinDetailServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/service/impl/InStockinDetailServiceImpl.java @@ -2,6 +2,7 @@ package com.ruoyi.in.stockindetail.service.impl; import java.util.List; +import com.ruoyi.common.Utils.DecimalUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.in.stockindetail.mapper.InStockinDetailMapper; @@ -172,7 +173,7 @@ public class InStockinDetailServiceImpl implements IInStockinDetailService //核对每条明细的计划数量和分配数量 - 更新分配状态 for(InStockinDetail detail : details){ - if(detail.getQuantity().equals(detail.getAssignNum())){ + if(DecimalUtil.eq(detail.getQuantity(), detail.getAssignNum())){ detail.setStatus(1); updateInStockinDetail(detail); }else{ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/mapper/OutStockoutMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/mapper/OutStockoutMapper.java index 37373fd..f11f3a5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/mapper/OutStockoutMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/mapper/OutStockoutMapper.java @@ -20,6 +20,14 @@ public interface OutStockoutMapper */ public OutStockout selectOutStockoutByStockoutId(String stockoutId); + /** + * 查询出库单据主信息 + * + * @param erpBill mes下发单号 + * @return 出库单据主信息 + */ + public OutStockout selectOutStockoutByErpBill(String erpBill); + /** * 查询出库单据主信息列表 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/service/IOutStockoutService.java b/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/service/IOutStockoutService.java index f4d20d0..53df25c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/service/IOutStockoutService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/service/IOutStockoutService.java @@ -22,6 +22,14 @@ public interface IOutStockoutService */ public OutStockout selectOutStockoutByStockoutId(String stockoutId); + /** + * 查询出库单据主信息 + * + * @param erpBill erp出库单号 + * @return 出库单据主信息 + */ + public OutStockout selectOutStockoutByErpBill(String erpBill); + /** * 查询出库单据主信息列表 * @@ -94,6 +102,22 @@ public interface IOutStockoutService */ public AjaxResult autoAssignOutStockout(String stockoutId); + /** + * 自动分配出库单据 + * + * @param erpBill mes/erp单据 + * @return 结果 + */ + public AjaxResult autoAssignOutStockoutByErpBill(String erpBill); + + /** + * 自动分配出库单据 + * + * @param erpBill 出库单据主键 + * @return 结果 + */ +// public AjaxResult autoAssignOutStockout(String erpBill); + /** * 手动分配出库单据 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/service/impl/OutStockoutServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/service/impl/OutStockoutServiceImpl.java index 3b42557..25b70b5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/service/impl/OutStockoutServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/service/impl/OutStockoutServiceImpl.java @@ -84,6 +84,15 @@ public class OutStockoutServiceImpl implements IOutStockoutService return outStockoutMapper.selectOutStockoutByStockoutId(stockoutId); } + /** + * 查询出库单据主信息 + */ + @Override + public OutStockout selectOutStockoutByErpBill(String erpBill) + { + return outStockoutMapper.selectOutStockoutByErpBill(erpBill); + } + /** * 查询出库单据主信息列表 */ @@ -213,7 +222,7 @@ public class OutStockoutServiceImpl implements IOutStockoutService { OutStockout outStockout = selectOutStockoutByStockoutId(stockoutId); if (!outStockout.getStatus().equals(StockStatusEnum.RUNNING.getCode())){ - log.warn("【出库分配】操作失败,非<执行>状态的单据不能进行分配操作,请先审核完成后点击<执行>操作,单据号:{}", stockoutId); + log.warn("【出库分配】操作失败,非<执行>状态的单据不能进行分配操作,请先审核完成后点击<执行>操作,wms单据号:{},erp单据号:{}", stockoutId, outStockout.getErpBill()); return AjaxResult.error("非【执行】状态的单据不能进行分配操作"); } @@ -222,7 +231,223 @@ public class OutStockoutServiceImpl implements IOutStockoutService new OutStockoutDetail().builder().stockoutId(stockoutId).allotNum(BigDecimal.valueOf(0)).build() ); if (details.isEmpty()){ - log.warn("【出库单据分配】分配失败,该单据号的子单明细没有可分配的物料,请检查单据状态,单据号:{}", stockoutId); + log.warn("【出库单据分配】分配失败,该单据号的子单明细没有可分配的物料,请检查单据状态,wms单据号:{},erp单据号:{}", stockoutId, outStockout.getErpBill()); + return AjaxResult.error("操作异常,该单据号的子单明细没有可分配的物料,请检查单据状态"); + } + + int num = 1; + + //>>>>>>>>>>>>>>>>>>>>>>分配物料<<<<<<<<<<<<<<<<<<<<<<<<< + //>>>>>>>>>>>>>>>>>>>>>>分配物料<<<<<<<<<<<<<<<<<<<<<<<<< + //>>>>>>>>>>>>>>>>>>>>>>分配物料<<<<<<<<<<<<<<<<<<<<<<<<< + for (OutStockoutDetail detail : details) { + + //>>>辊号(物料)校验 + if (ObjUtil.isNull(basStockService.selectBasStockByRollerNumber(detail.getRollerNumber()))){ + log.warn("【出库分配异常】找不到该版辊的库存信息,辊号:{}", detail.getRollerNumber()); + continue; + } + +//1.获取子单明细辊号对应的库存,拿到出库板棍的托盘号用于生成主作业 + BasStock stock = basStockService.selectBasStockByRollerNumber(detail.getRollerNumber()); + + //>>>获取出库货位 - 如果是<双伸货位>且对应<单伸货位有货>的情况则触发【移库作业】 + BasCargoSpace cargoCurrent = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(stock.getCargoSpaceId()); + + //【移库判断】如果双伸位,则需要额外判断其对应的单伸货位状态和库存 + if (cargoCurrent.getIssDouble().equals(CargoSpaceCode.CARGOSPACE_ISDOUBLE_Y)){ + //【移库判断-1】此处获取出库双伸货位对应的外侧单伸货位号进行移库 + BasCargoSpace cargoSingle = basCargoSpaceService.selectAnotherBasCargoSpaceBySameGroup(cargoCurrent); + //【移库判断-2】如果单伸位有货,触发移库作业 + if (cargoSingle.getStatus().equals(CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED)){ + String moveJobId = basJobIdService.getId(JobIdType.MYDOJOB_MOVE); + String moveTaskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKOUT); + BasCargoSpace targetCargo = basCargoSpaceService.selectBasCargoSpaceForStockin( + new BasCargoSpace().builder().theType(cargoCurrent.getTheType()).roadwayId(cargoCurrent.getRoadwayId()).build() + ); + + //生成并推送移库 + MydoJob moveJob = new MydoJob().builder() + .jobId(moveJobId) + .taskNo(moveTaskNo) + .status(TaskStatusEnum.READY.getCode()) + .inOrOut(TaskType.TASKTYPE_PICK_STOCK_MOVE) + .executionPhase("0") + .trayCode(cargoSingle.getTrayCode()) + .trayType(cargoSingle.getTheType()) + .roadwayId(cargoSingle.getRoadwayId()) + .cargoSpaceId(cargoSingle.getCargoSpaceId()) + .targetCargoSpaceId(targetCargo.getCargoSpaceId()) + .priority(0) + .build(); + + log.info("【出库分配】出库双伸货位外侧有货,生成移库作业,作业号:{},移库货位:{},目标货位:{}", moveJobId, cargoSingle.getCargoSpaceId(), targetCargo.getCargoSpaceId()); + + //推送移库 + AjaxResult ajaxResult; + + /*-----------------推送wcs移库任务----------------- */ + HashMap paramMap = new HashMap<>(); + paramMap.put("reqCode", UUID.randomUUID().toString());//请求码 + paramMap.put("jobId", moveJob.getJobId());//容器编号 + paramMap.put("trayCode", moveJob.getTrayCode().trim());//容器编号 + paramMap.put("cargoSpaceId", moveJob.getCargoSpaceId());//货位 + paramMap.put("targetCargoSpaceId", moveJob.getTargetCargoSpaceId());//目标货位 + paramMap.put("inOrOut", moveJob.getInOrOut());//任务类型 + paramMap.put("priority", 0);//任务优先级 + + ajaxResult = apiWcsService.sendMoveMydoJob(paramMap); + log.info( + "【出库分配-移库】推送wcs移库作业,作业号:{},托盘条码:{},移库货位:{},目标货位:{}", moveJob.getJobId(), moveJob.getTrayCode(), moveJob.getCargoSpaceId(), moveJob.getTargetCargoSpaceId() + ); + if (ajaxResult.isSuccess()){ + //生成托盘主作业 + mydoJobService.insertMydoJob(moveJob); + + //生成主任务后子任务明细重新计数 + num = 1; + + log.info( + "【出库分配-移库】推送成功,作业号:{},托盘条码:{},移库货位:{},目标货位:{}", moveJob.getJobId(), moveJob.getTrayCode(), moveJob.getCargoSpaceId(), moveJob.getTargetCargoSpaceId() + ); + + //更新库存表货位【占用】状态 + stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED); + basStockService.updateBasStock(stock); + + //更新货位表【预占用】状态 + basCargoSpaceService.updateBasCargoSpaceStatus(cargoSingle.getCargoSpaceId(),cargoSingle.getTrayCode(),CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKOUT); + basCargoSpaceService.updateBasCargoSpaceStatus(targetCargo.getCargoSpaceId(),cargoSingle.getTrayCode(),CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKIN); + + } + + } + + }//执行完移库判断 + +//2.生成辊号库存对应托盘的出库作业 + MydoJob mydoJob = mydoJobService.selectMydoJobByTrayCode(stock.getTrayCode()); + + if (ObjUtil.isNull(mydoJob)){ + + String jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKOUT); + String taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKOUT); + //判断出库类型,用于确定完成后是否生成回流任务 + //---1.遍历子单明细的辊号集合是否包含出库托盘库存的辊号集合 + //---2.如果全部匹配,则任务类型为整托出库,否则为拣选出库 + int taskType = TaskType.TASKTYPE_STOCKOUT_PICKING; + //匹配出库版辊确认是【整托出库】还是【拣选出库】 + List detailRollerNumbers = outStockoutDetailService.selectOutStockoutDetailRollerNumberList(detail.getStockoutId());//【子单所有辊号集合】 + List stockRollerNumbers = basStockService.selectBasStockRollerNumberList(stock.getTrayCode());//【库存托盘辊号集合】 + if (detailRollerNumbers.containsAll(stockRollerNumbers)){ + taskType = TaskType.TASKTYPE_STOCKOUT; + } + + mydoJob = new MydoJob().builder() + .jobId(jobId) + .taskNo(taskNo) + .status(TaskStatusEnum.READY.getCode()) + .inOrOut(taskType) + .executionPhase("0") + .trayCode(cargoCurrent.getTrayCode()) + .trayType(cargoCurrent.getTheType()) + .roadwayId(cargoCurrent.getRoadwayId()) + .cargoSpaceId(cargoCurrent.getCargoSpaceId()) + .cargoSpaceName(cargoCurrent.getThePlatoon() + "排" + cargoCurrent.getTheColumn() + "列" + cargoCurrent.getTheFloor() + "层") + .priority(10) + .build(); + + //生成托盘主作业 + mydoJobService.insertMydoJob(mydoJob); + num = 1; + log.info("【出库分配】生成出库作业,作业号:{},托盘号:{}", mydoJob.getJobId(), stock.getTrayCode()); +// +// //>>>>>>>>>>>>>>>>>>>>>> 推送出库 <<<<<<<<<<<<<<<<<<<<<<< +// //>>>>>>>>>>>>>>>>>>>>>> 推送出库 <<<<<<<<<<<<<<<<<<<<<<< +// //>>>>>>>>>>>>>>>>>>>>>> 推送出库 <<<<<<<<<<<<<<<<<<<<<<< +// AjaxResult ajaxResult; +// /*-----------------推送wcs任务----------------- */ +// HashMap paramMap = new HashMap<>(); +// paramMap.put("reqCode", UUID.randomUUID().toString());//请求码 +// paramMap.put("jobId", mydoJob.getJobId());//作业号 +// paramMap.put("taskNo", mydoJob.getTaskNo());//任务号 +// paramMap.put("trayCode", mydoJob.getTrayCode());//容器编号 +// paramMap.put("cargoSpaceId", mydoJob.getCargoSpaceId());//货位 +// paramMap.put("inOrOut", mydoJob.getInOrOut());//任务类型 +// +// ajaxResult = apiWcsService.sendOutMydoJob(paramMap); +// +// log.info("【推送出库】推送wcs出库作业,作业号:{},托盘条码:{},分配货位:{}", mydoJob.getJobId(), mydoJob.getTrayCode(), mydoJob.getCargoSpaceId()); +// +// if (ajaxResult.isSuccess()){ +// +// //生成主任务后子任务明细重新计数 +// num = 1; +// +// log.info("【推送出库】生成并推送wcs作业成功,作业号:{},托盘条码:{},分配货位:{}", mydoJob.getJobId(), mydoJob.getTrayCode(), mydoJob.getCargoSpaceId()); +// +// //更新货位【预占用】 +// cargoCurrent.setStatus(CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKOUT); +// basCargoSpaceService.updateBasCargoSpace(cargoCurrent); +// +// } + + } + + //若主任务已经存在,则补充一条子作业 + mydoJobDetailService.insertMydoJobDetail( + new MydoJobDetail().builder() + .jobId(mydoJob.getJobId()) + .jobDetailId(mydoJob.getJobId() + "-" + num++) + .inOrOutId(detail.getStockoutId()) + .inOrOutDId(detail.getStockoutDetailId()) + .stockinId(stock.getStockinId()) + .stockinDetailId(stock.getStockinDetailId()) + .productId(detail.getProductId()) + .productName(stock.getProductName()) + .lotNo(detail.getLotNo()) + .stockQuantity(stock.getQuantity()) + .outQuantity(BigDecimal.ZERO) + .trayType(cargoCurrent.getTheType()) + .status(0) + .inDate(stock.getInDate()) + .rollerNumber(stock.getRollerNumber()) + .build() + ); + + //更新库存明细【占用】 + stock.setStockStatus(BasStockStatusEnum.OCCUPIED.getCode());//库存状态 + stock.setOutQuantity(detail.getQuantity());//出库数量 + basStockService.updateBasStock(stock); + + //生成子作业后更新子单【分配数量】 + detail.setAllotNum(BigDecimal.valueOf(1)); + outStockoutDetailService.updateOutStockoutDetail(detail); + + log.info("【出库分配】生成子作业,作业号:{},辊号:{}", mydoJob.getJobId(), stock.getRollerNumber()); + + } + + log.info("【出库单据分配】分配成功,单据号:{}", details.get(0).getStockoutId()); + + return AjaxResult.success(); + } + + @Override + public AjaxResult autoAssignOutStockoutByErpBill(String erpBill) + { + OutStockout outStockout = selectOutStockoutByErpBill(erpBill); + if (!outStockout.getStatus().equals(StockStatusEnum.RUNNING.getCode())){ + log.warn("【出库分配】操作失败,非<执行>状态的单据不能进行分配操作,请先审核完成后点击<执行>操作,wms单据号:{},erp单据号:{}", outStockout.getStockoutId(), erpBill); + return AjaxResult.error("非【执行】状态的单据不能进行分配操作"); + } + + //校验>>>出库单据明细 + List details = outStockoutDetailService.selectOutStockoutDetailList( + new OutStockoutDetail().builder().stockoutId(outStockout.getStockoutId()).allotNum(BigDecimal.valueOf(0)).build() + ); + if (details.isEmpty()){ + log.warn("【出库单据分配】分配失败,该单据号的子单明细没有可分配的物料,请检查单据状态,wms单据号:{},erp单据号:{}", outStockout.getStockoutId(), erpBill); return AjaxResult.error("操作异常,该单据号的子单明细没有可分配的物料,请检查单据状态"); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/pda/controller/PdaStockoutController.java b/ruoyi-admin/src/main/java/com/ruoyi/pda/controller/PdaStockoutController.java index 1f9fa14..d692fdb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/pda/controller/PdaStockoutController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/pda/controller/PdaStockoutController.java @@ -121,28 +121,6 @@ public class PdaStockoutController extends BaseController { } - /** - * 【手动指定出库】出库确认 - 托盘号查询 - 仅查询托盘上出库单中包含的版辊信息 - * @param trayCode 托盘号 - * @return - */ - @GetMapping("/getManualStockoutInfoByTrayCode") - @PreAuthorize("@ss.hasPermi('out:bound:task:info')") - public AjaxResult getManualStockoutInfoByTrayCode(String trayCode) { - try { - MydoJob job = mydoJobService.selectMydoJobByTrayCode(trayCode); - List info = pdaService.getStockoutInfoByTrayCode(trayCode); - if(ObjUtil.isNull(job) || info.isEmpty() || job.getInOrOut() != TaskType.TASKTYPE_STOCKOUT_MANUAL){ - return AjaxResult.error("找不到当前<手动>出库作业明细,请检查作业状态"); - }else{ - return AjaxResult.success(info); - } - } catch (RuntimeException e) { - return AjaxResult.error(e.getMessage()); - } - } - - /** * 呼叫空托出库 * @param params 货位区域,托盘类型 @@ -203,6 +181,28 @@ public class PdaStockoutController extends BaseController { } + /** + * 【手动指定出库】出库确认 - 托盘号查询 - 仅查询托盘上出库单中包含的版辊信息 + * @param trayCode 托盘号 + * @return + */ + @GetMapping("/getManualStockoutInfoByTrayCode") + @PreAuthorize("@ss.hasPermi('out:bound:task:info')") + public AjaxResult getManualStockoutInfoByTrayCode(String trayCode) { + try { + MydoJob job = mydoJobService.selectMydoJobByTrayCode(trayCode); + List info = pdaService.getStockoutInfoByTrayCode(trayCode); + if(ObjUtil.isNull(job) || info.isEmpty() || job.getInOrOut() != TaskType.TASKTYPE_STOCKOUT_MANUAL){ + return AjaxResult.error("找不到当前<手动>出库作业明细,请检查作业状态"); + }else{ + return AjaxResult.success(info); + } + } catch (RuntimeException e) { + return AjaxResult.error(e.getMessage()); + } + } + + /** * 出库确认 - 一键确认 - 托盘统一更新出库数量 * @param trayCode diff --git a/ruoyi-admin/src/main/java/com/ruoyi/pda/service/impl/PdaServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/pda/service/impl/PdaServiceImpl.java index d23d0e9..2080e2d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/pda/service/impl/PdaServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/pda/service/impl/PdaServiceImpl.java @@ -215,7 +215,6 @@ public class PdaServiceImpl implements IPdaService { //>>>扣减子单的【扫码数量】 detail.setScanNum(BigDecimal.valueOf(1)); - detail.setStatus(1); inStockinDetailService.updateInStockinDetail(detail); log.info("【绑定信息】<常规入库>绑定信息,生成绑定信息,更新子单扫码数量,辊号:{},托盘号:{}",bindTrayMsg.getRollerNumber(), bindTrayMsg.getTrayCode()); @@ -336,7 +335,6 @@ public class PdaServiceImpl implements IPdaService { //>>>扣减子单的【扫码数量】 detail.setScanNum(BigDecimal.valueOf(1)); - detail.setStatus(1); inStockinDetailService.updateInStockinDetail(detail); log.info("【绑定信息】<常规入库>操作成功,生成绑定信息,更新子单已扫码数量,辊号:{},托盘号:{}",item.getRollerNumber(), bindTrayMsg.getTrayCode()); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/scheduleTask/MydoJobHandler.java b/ruoyi-admin/src/main/java/com/ruoyi/scheduleTask/MydoJobHandler.java index b15326a..712495e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/scheduleTask/MydoJobHandler.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/scheduleTask/MydoJobHandler.java @@ -774,9 +774,9 @@ public class MydoJobHandler { outStockoutDetailService.updateOutStockoutDetail(outStockoutDetail); } - basStockService.deleteBasStockByRollerNumber(mydoJobDetail.getRollerNumber()); } + basStockService.deleteBasStockByTrayCode(mydoJob.getTrayCode()); basStockInfoService.deleteBasStockInfoByTrayCode(mydoJob.getTrayCode()); basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), "", CargoSpaceCode.CARGOSPACE_STATUS_AVAILABLE); log.info("【账务处理-出库】任务完成,移除托盘库存,更新货位和库存信息,作业号:{},托盘号:{}", mydoJob.getJobId(), mydoJob.getTrayCode()); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/scheduleTask/RequestWcsHandler.java b/ruoyi-admin/src/main/java/com/ruoyi/scheduleTask/RequestWcsHandler.java index 3b721d8..107a2e0 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/scheduleTask/RequestWcsHandler.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/scheduleTask/RequestWcsHandler.java @@ -241,7 +241,7 @@ public class RequestWcsHandler { /** - * 手动操作 - 推送wcs指定货位出库 + * 手动出库操作 - 推送wcs指定货位出库 */ @Scheduled(fixedRate = TIMEINTERVAL_2000) public void stockoutMydoJobForManual(){ diff --git a/ruoyi-admin/src/main/resources/mapper/out/OutStockoutMapper.xml b/ruoyi-admin/src/main/resources/mapper/out/OutStockoutMapper.xml index 0d49975..530b19a 100644 --- a/ruoyi-admin/src/main/resources/mapper/out/OutStockoutMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/out/OutStockoutMapper.xml @@ -53,6 +53,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where stockout_id = #{stockoutId} + + +