diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/controller/ToWmsApiController.java b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/ToWmsApiController.java index 1ec6c83..3481f3f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/controller/ToWmsApiController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/ToWmsApiController.java @@ -29,7 +29,7 @@ public class ToWmsApiController { private IRequestLogService requestLogService; /** - * 入库请求生成作业 + * 请求生成入库作业 */ @PostMapping("/requestEnterByTrayCode") public AjaxResult requestEnterByTrayCode(@RequestBody RequestEnter requestEnter) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToErpServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToErpServiceImpl.java index 2bc0e98..2c8a1e1 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToErpServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToErpServiceImpl.java @@ -458,7 +458,7 @@ public class ToErpServiceImpl implements IToErpService { * 入库单据 -> 请求入库单列表 * @return */ - @Scheduled(fixedDelay = 60_000) + @Scheduled(fixedDelay = 600_000) public AjaxResult getErpStockinList(){ ErpStockinParam erpStockinParam = new ErpStockinParam(); @@ -468,22 +468,31 @@ public class ToErpServiceImpl implements IToErpService { if (num > 0){ //当前时间 DateTime dateNow = DateUtil.date(); - String dateStart = dateNow.offset(DateField.SECOND, -60).toString(); - String dateEnd = DateUtil.date().toString(); + String dateStart = dateNow.offset(DateField.SECOND, -60).toString();//开始时间 + String dateEnd = DateUtil.date().toString();//当前时间 //todo 请求筛选时间似乎时分秒条件无效,只能筛选年月日条件 //todo 请求筛选时间似乎时分秒条件无效,只能筛选年月日条件 // erpStockinParam.setDate3Start(dateStart);//请求筛选:开始时间 // erpStockinParam.setDate3End(dateEnd);//请求筛选:结束时间 } - //测试 + //测试参数 - 无主题筛选 - 默认关键字【冷】 erpStockinParam.setTitle(""); -// erpStockinParam.setNeedList(0); + //测试参数 - 入库状态(0=全部, 1=待入库, 2=已入库, 3=已取消...) 默认 - 1 + //erpStockinParam.setComplete1(1); + //测试参数 - 无请求明细【0】 + //erpStockinParam.setNeedList(0); + +//=================================================================== 主单 ===================================================================== try { log.info(">>>>>>>>>>>>>>>>>>>> 开始更新入库单据 >>>>>>>>>>>>>>>>>>>>"); //------获取请求响应 String response = getResponse(getStockinListUrl, erpStockinParam, "更新入库单据"); + if (response == null) { + log.info("请求异常:响应信息为空!检查请求内容!"); + return null; + } //------处理响应信息 ErpStockinResponse res = JSONUtil.toBean(response, ErpStockinResponse.class); @@ -526,7 +535,7 @@ public class ToErpServiceImpl implements IToErpService { //------更新wms主单 AddStockinByErpStockin(erpInStockin); -//======================================================================================================================================== +//=================================================================== 明细 ===================================================================== //------根据主单【kuinlist】字段获取子单信息 if (erpStockinParam.getNeedList() == 1) { @@ -555,8 +564,8 @@ public class ToErpServiceImpl implements IToErpService { erpInStockinDetail.setSpare2(Convert.toStr(details.get(2)));//产品型号 - product_id //自动分配货位区域 - String cargoSpace = getCargoSpaceByProductInfo(Convert.toStr(details.get(2))); - erpInStockinDetail.setWarehousePositionID(cargoSpace);//货位 +// String cargoSpace = getCargoSpaceByProductInfo(Convert.toStr(details.get(2))); +// erpInStockinDetail.setWarehousePositionID(cargoSpace);//货位 //关联主单 erpInStockinDetail.setKuin(erpInStockin.getKuin());//入库id @@ -589,6 +598,7 @@ public class ToErpServiceImpl implements IToErpService { } + /** * 生成入库单据 -> 获取请求响应 * @param url 请求地址 @@ -615,13 +625,15 @@ public class ToErpServiceImpl implements IToErpService { requestLog.setRequestUrl(url); requestLog.setRequestMethod("POST"); requestLog.setRequestBody(JSONUtil.toJsonStr(param)); - requestLog.setIsSuccessful(""); + requestLog.setResponseBody(JSONUtil.toJsonStr(response)); + requestLog.setIsSuccessful("1"); requestLogService.insertRequestLog(requestLog); return response; } catch (Exception e) { log.error("请求异常:" + e.getMessage()); } + return null; } @@ -635,7 +647,7 @@ public class ToErpServiceImpl implements IToErpService { try { inStockin.setStockinGuid(erpInStockin.getStockinGuid());//guid inStockin.setStockinId(erpInStockin.getKuin());//入库单据id - inStockin.setStatus(erpInStockin.getComplete1());//入库状态(区别erpInStockin.getStatus() - 审批状态) + inStockin.setStatus(erpInStockin.getComplete1());//入库状态(区别审批状态 - erpInStockin.getStatus()) inStockin.setCreateDate(DateUtil.now());//生成时间 inStockin.setErpBill(erpInStockin.getRkbh());//入库编号 RK_2025082107 inStockin.setInType(erpInStockin.getSort1());//入库类别 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToWmsServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToWmsServiceImpl.java index b072293..11330cb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToWmsServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToWmsServiceImpl.java @@ -23,20 +23,28 @@ import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.device.agv.service.IAgvContainerTaskService; import com.ruoyi.in.erp.service.ITransferBillCallbackService; import com.ruoyi.in.stockin.service.IInStockinService; +import com.ruoyi.in.stockindetail.domain.InStockinDetail; import com.ruoyi.in.stockindetail.service.IInStockinDetailService; import com.ruoyi.job.mydojob.domain.MydoJob; import com.ruoyi.job.mydojob.service.IMydoJobService; import com.ruoyi.job.mydojobdetail.domain.MydoJobDetail; import com.ruoyi.job.mydojobdetail.service.IMydoJobDetailService; import com.ruoyi.out.outStockout.service.IOutStockoutService; +import com.ruoyi.pda.trayMsg.domain.TrayMsg; +import com.ruoyi.pda.trayMsg.service.ITrayMsgService; +import com.ruoyi.stock.stock.domain.BasStock; +import com.ruoyi.stock.stock.service.IBasStockService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; +import java.util.stream.Collectors; /** * 作业统计 Service 实现 @@ -77,13 +85,141 @@ public class ToWmsServiceImpl implements IToWmsService { @Autowired private IBasRoadwayService basRoadwayService; + //条码绑定 + @Autowired + private ITrayMsgService trayMsgService; + + //库存 + @Autowired + private IBasStockService basStockService; + + @Override @Transactional(rollbackFor = Exception.class) public AjaxResult requestEnterByTrayCode(RequestEnter requestEnter) { + + //校验 - 条码空 + if (StrUtil.isEmpty(requestEnter.getTrayCode())) { + return AjaxResult.error("托盘条码不能为空"); + } + + //校验 - 条码已经有作业 + if (ObjUtil.isNotNull(mydoJobService.selectMydoJobByTrayCode(requestEnter.getTrayCode()))) { + return AjaxResult.error("已存在该条码的入库作业:" + requestEnter.getTrayCode()); + } + + //入库分配 20251210 + //根据已绑定条码获取子单物料号 + TrayMsg msg = new TrayMsg(); + msg.setTrayCode(requestEnter.getTrayCode()); + List list = trayMsgService.selectTrayMsgList(msg); + + //校验 - 条码未绑定子单 + if (!CollUtil.isNotEmpty(list)) { + log.info("未找到该托盘【" + requestEnter.getTrayCode() + "】绑定的子单据,请检查绑定列表"); + return AjaxResult.error("该托盘未绑定子单据:" + requestEnter.getTrayCode()); + } + + //获取绑定的子单信息 + InStockinDetail inStockinDetail = inStockinDetailService.selectInStockinDetailByStockinDetailId(list.get(0).getStockinDetailId()); + + //获取货位 + String cargoSpaceId = getCargoSpaceByProductInfo(inStockinDetail.getProductId()); + + //是否有符合条件的货位 + if (!StringUtils.isNotBlank(cargoSpaceId)) { + return AjaxResult.error("无符合条件的货位用于分配,请检查库存区占用情况,物料号:" + inStockinDetail.getProductId()); + } + + //返回入库作业参数 + MydoJob mydoJob = new MydoJob(); + HashMap map = new HashMap<>(); + map.put("v_param", "RK"); + mydoJobService.getInJobId(map);//存储过程【util_serial_job】生成作业号 + mydoJob.setJobId(map.get("v_serial")); + mydoJob.setCargoSpaceId(cargoSpaceId); + mydoJob.setInOrOut("1"); + mydoJob.setTrayCode(requestEnter.getTrayCode()); + + +// HashMap result = new HashMap<>(); +// result.put("cargoSpaceId",cargoSpaceId); + + return AjaxResult.success(mydoJob); + } + + /** + * requestEnterByTrayCode -> 入库货位分配 + * 入库任务请求根据托盘码 -> 向子单明细分配入库货位 + * 获取库存物料号 -> 货位id -> 存储区组group -> 状态:未占用 -> 按规则获取货位 + * @param productId 物料号 + * @return + */ + public String getCargoSpaceByProductInfo(String productId){ + +//>>>>>>>>>>>>>>获取物料库存信息 -> 有库存 -> 货位(cargospace) -> 存储区组(groupCodingNo) -> 根据groupCoding(由高到低) -> 获取状态1的货位分配 +//>>>>>>>>>>>>>>获取物料库存信息 -> 无库存 -> 遍历存储区组(groupCodingNo) -> 查找全部货位空的区组 -> 根据groupCoding(由高到低) -> 获取状态1的货位分配 + + try { + //获取物料的货位集合 - 首先查找已经存放该物料的存储区 + List stocks = basStockService.selectBasStockListByProductId(productId); + + //如果集合空 - 寻找未被占用的存储区组放货 + if (stocks.size() == 0) { + for (int i = 1; i <= 45; i++) { + BasCargoSpace cargospace = new BasCargoSpace(); + + //存储区 + String groupCodingNo = String.format("%03d", i); + cargospace.setGroupCodingNo(groupCodingNo); + + //获取【groupCodingNo】所有货位 + List cargoSpaces = basCargoSpaceService.selectBasCargoSpaceList(cargospace); + + //判断是否全部未占用,即某存储区全部为空位 - 避免物料混放 + boolean isAllEmpty = cargoSpaces.stream().allMatch(c -> "1".equals(c.getStatus())); + + //区域未占用 - 则分配最内侧货位 + if (isAllEmpty && cargoSpaces.size() > 0) { + cargoSpaces.sort(Comparator.comparing(BasCargoSpace::getGroupCoding).reversed()); + return cargoSpaces.get(0).getCargoSpaceId(); + } + } + + } + + //如果物料已经存放在多个货位(区域) - 去重 + List stocksNew = stocks.stream().distinct().collect(Collectors.toList()); + + //查询对应货位的区域在【BasCargoSpace】是否有空位 - 在groupCodingNo的分组中是否仍然有状态【1】的货位 + for (BasStock stock : stocksNew){ + //获取每种物料的存放货位信息 + BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(stock.getCargoSpaceId()); + + //获取每种物料的存放货位信息 - 存储区 + String group = cargoSpace.getGroupCodingNo(); + + //获取该存储区组的所有货位 + List cargoSpaces = basCargoSpaceService.selectBasCargoSpaceListByGroupCodingNo(group); + + //在集合中获取状态为【1】的货位 + for (BasCargoSpace cs : cargoSpaces){ + //货位状态:1(未占用) -> 返回该货位结果 + if ("1".equals(cs.getStatus())){ + return cs.getCargoSpaceId(); + } + } + + } + }catch(Exception e){ + log.error("入库子单获取目标货位失败,异常信息:" + e.getMessage()); + } + return null; } + @Override public AjaxResult selectMydoJobByEntranceId(RequestEnter requestEnter) { MydoJob param = new MydoJob(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/mydojob/mapper/MydoJobMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/job/mydojob/mapper/MydoJobMapper.java index 3c3e1ea..72b7ef7 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/job/mydojob/mapper/MydoJobMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/mydojob/mapper/MydoJobMapper.java @@ -43,6 +43,8 @@ public interface MydoJobMapper */ public int insertMydoJob(MydoJob mydoJob); + public void getInJobId(HashMap map); + /** * 修改任务表 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/mydojob/service/IMydoJobService.java b/ruoyi-admin/src/main/java/com/ruoyi/job/mydojob/service/IMydoJobService.java index ab5745c..db0d9f6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/job/mydojob/service/IMydoJobService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/mydojob/service/IMydoJobService.java @@ -3,6 +3,7 @@ package com.ruoyi.job.mydojob.service; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.job.mydojob.domain.MydoJob; +import java.util.HashMap; import java.util.List; /** @@ -36,6 +37,8 @@ public interface IMydoJobService */ public List selectMydoJobListApi(MydoJob mydoJob); + public void getInJobId(HashMap map); + /** * 新增任务表 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/mydojob/service/impl/MydoJobServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/job/mydojob/service/impl/MydoJobServiceImpl.java index 95525ad..1eee767 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/job/mydojob/service/impl/MydoJobServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/mydojob/service/impl/MydoJobServiceImpl.java @@ -118,6 +118,11 @@ public class MydoJobServiceImpl implements IMydoJobService { return mydoJobMapper.selectMydoJobList(mydoJob); } + @Override + public void getInJobId(HashMap map){ + mydoJobMapper.getInJobId(map); + } + /** * 新增任务表 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/pda/trayMsg/service/impl/TrayMsgServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/pda/trayMsg/service/impl/TrayMsgServiceImpl.java index 3848984..7af9c9e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/pda/trayMsg/service/impl/TrayMsgServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/pda/trayMsg/service/impl/TrayMsgServiceImpl.java @@ -40,7 +40,7 @@ public class TrayMsgServiceImpl implements ITrayMsgService * @return trayMsg */ @Override - @DataScope(warehouseAlias = "w") +// @DataScope(warehouseAlias = "w") public List selectTrayMsgList(TrayMsg trayMsg) { return trayMsgMapper.selectTrayMsgList(trayMsg); diff --git a/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml b/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml index 326c81d..28f42bc 100644 --- a/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml @@ -106,7 +106,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where mj.job_id = #{jobId} - + + + insert into mydo_job job_id,