From a0834a4ee752c7ecb6ecb270b81235cb889515f9 Mon Sep 17 00:00:00 2001 From: gongbaoxiong <751575283@qq.com> Date: Tue, 28 Apr 2026 20:11:17 +0800 Subject: [PATCH] =?UTF-8?q?add:=E5=A2=9E=E5=8A=A0=E7=8E=B0=E5=9C=BA?= =?UTF-8?q?=E5=BC=80=E4=BC=9A=E7=A1=AE=E5=AE=9A=E5=90=8E=E7=9A=846?= =?UTF-8?q?=E4=B8=AA=E6=96=B0=E5=A2=9E=E9=9C=80=E6=B1=82=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/StructattrServiceImpl.java | 46 ++-- .../service/impl/SchBasePointServiceImpl.java | 6 +- .../sch_manage/service/util/AbstractTask.java | 1 + .../wms/sch_manage/service/util/AutoTask.java | 106 ++++++++- .../service/impl/InBillServiceImpl.java | 95 ++++---- .../service/impl/OutBillServiceImpl.java | 12 +- .../service/dao/StIvtCheckdtl.java | 1 + .../wbwms/controller/WmsToIWmscontroller.java | 17 ++ .../wms/wbwms/service/WmsToIWmsService.java | 4 + .../service/impl/WmsToIWmsServiceImpl.java | 225 +++++++++++++----- 10 files changed, 378 insertions(+), 135 deletions(-) diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java index 432e10e..792db92 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java @@ -98,6 +98,9 @@ public class StructattrServiceImpl extends ServiceImpl wrapper.like(Structattr::getStruct_code, search) .or() - .like(Structattr::getStruct_code, search).or() - .like(Structattr::getStruct_name, search) + .like(Structattr::getStruct_name, search).or() + .like(Structattr::getStoragevehicle_code, search) ); } } @@ -320,14 +323,18 @@ public class StructattrServiceImpl extends ServiceImpl list = this.list( new QueryWrapper().lambda() .eq(Structattr::getStruct_code, struct_code) + .eq(Structattr::getIs_used, BaseDataEnum.IS_YES_NOT.code("是")) ); - if (ObjectUtil.isEmpty(one)) { - throw new BadRequestException("此仓位编码不存在【"+struct_code+"】"); + if (ObjectUtil.isEmpty(list)) { + throw new BadRequestException("此仓位编码不存在或未启用【" + struct_code + "】"); } - return one; + if (list.size() > 1) { + throw new BadRequestException("此仓位编码存在多个,请检查!【" + struct_code + "】"); + } + return list.get(0); } @@ -399,7 +406,8 @@ public class StructattrServiceImpl extends ServiceImpl strategy = one.getStrategy(); Map decisionerMap = SpringContextHolder.getBeansOfType(Decisioner.class); QueryWrapper query = new QueryWrapper<>(); - //一楼车辆特殊分配 + //分配规则:一楼车辆特殊分配H1AD01、H1AVB01开头 width =1 专门放蝴蝶龙托盘, + // 起点是H1开头的,stor_type =1 ,是专门放超托的托盘; if ("firstfloorBC".equals(param.getStor_code())) { if ("3".equals(param.getSuitable_car())) { query.eq("is_used", true) @@ -407,9 +415,7 @@ public class StructattrServiceImpl extends ServiceImpl wrapper.isNull("storagevehicle_code") - .or() - .eq("storagevehicle_code", " ")); + .isNull("storagevehicle_code"); } else if ("2".equals(param.getSuitable_car())) { query.eq("is_used", true) .eq("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")) @@ -417,21 +423,17 @@ public class StructattrServiceImpl extends ServiceImpl wrapper.isNull("storagevehicle_code") - .or() - .eq("storagevehicle_code", " ")); + .isNull("storagevehicle_code"); } else if ("1".equals(param.getSuitable_car())) { query.eq("is_used", true) .eq("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")) .eq("sect_code", param.getSect_code()) .eq("layer_num", maxLayerNum) .isNull("stor_type") - .and(wrapper -> wrapper.isNull("storagevehicle_code") - .or() - .eq("storagevehicle_code", " ")); + .isNull("storagevehicle_code"); } } else { - //特殊物料优先放3层 + //2楼特殊物料优先放3层 if ("2FCP3C".equals(param.getStoragevehicle_type())) { query.eq("layer_num", maxLayerNum); } else { @@ -440,21 +442,17 @@ public class StructattrServiceImpl extends ServiceImpl wrapper.isNull("storagevehicle_code") - .or() - .eq("storagevehicle_code", " ")); + .isNull("storagevehicle_code"); } List list = this.list(query); - if ("BCPCTZB".equals(param.getStoragevehicle_type())) { + if ("BCPCTZB".equals(param.getStoragevehicle_type()) || "DJQCT".equals(param.getStoragevehicle_type())) { list = structattrMapper.getctnextcode(); } if ("2FCP3C".equals(param.getStoragevehicle_type()) && ObjectUtil.isEmpty(list)) { query.eq("is_used", true) .eq("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")) .eq("sect_code", param.getSect_code()) - .and(wrapper -> wrapper.isNull("storagevehicle_code") - .or() - .eq("storagevehicle_code", " ")); + .isNull("storagevehicle_code"); list = this.list(query); } for (String decisionerType : strategy) { diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java index c78ab90..9fda7d6 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java @@ -17,6 +17,7 @@ import org.apache.commons.lang3.StringUtils; import org.nl.common.domain.query.PageQuery; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.SecurityUtils; +import org.nl.wms.basedata_manage.enums.BaseDataEnum; import org.nl.wms.sch_manage.enums.PointStatusEnum; import org.nl.wms.sch_manage.enums.StatusEnum; import org.nl.wms.sch_manage.service.ISchBasePointService; @@ -28,7 +29,6 @@ import org.nl.wms.sch_manage.service.dao.mapper.SchBaseRegionMapper; import org.nl.wms.sch_manage.service.dao.mapper.SchBaseTaskMapper; import org.nl.wms.sch_manage.service.dto.SchBasePointQuery; import org.nl.wms.sch_manage.service.util.PointUtils; -import org.nl.wms.warehouse_manage.service.dao.GroupPlate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -180,10 +180,10 @@ public class SchBasePointServiceImpl extends ServiceImpl().lambda() - .eq(SchBasePoint::getPoint_code, point_code) + .eq(SchBasePoint::getPoint_code, point_code).eq(SchBasePoint::getIs_used, BaseDataEnum.IS_YES_NOT.code("是")) ); if (ObjectUtil.isEmpty(one)) { - throw new BadRequestException("点位编码为【"+point_code+"】的不存在!"); + throw new BadRequestException("点位编码为【" + point_code + "】的不存在或未启用!"); } return one; } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AbstractTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AbstractTask.java index 9cdd124..f041381 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AbstractTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AbstractTask.java @@ -90,6 +90,7 @@ public abstract class AbstractTask { public AcsResponse sendTaskOne(String task_id) { List taskDtoList = new ArrayList<>(); taskDtoList.add(this.sendAcsParam(task_id)); + //return AcsResponse.requestOk(); return this.renotifyAcs(taskDtoList); } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AutoTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AutoTask.java index 31f5add..7b898dd 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AutoTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/AutoTask.java @@ -1,6 +1,7 @@ package org.nl.wms.sch_manage.service.util; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; @@ -16,14 +17,20 @@ import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.sql.Time; +import java.util.Comparator; import java.util.List; +import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; @Slf4j @Component @RequiredArgsConstructor public class AutoTask { - + private static final ScheduledExecutorService DELAY_EXECUTOR = Executors.newSingleThreadScheduledExecutor(); /** * 任务服务 */ @@ -53,22 +60,107 @@ public class AutoTask { } } + /** + * 定时下发任务 + */ +// private void sendTask() { +// List taskList = taskService.list(new LambdaQueryWrapper() +// .eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO) +// .eq(SchBaseTask::getTask_status, TaskStatus.CREATE.getCode())); +// if (ObjectUtil.isEmpty(taskList)) { +// return; +// } +// // 找出需要间隔的任务列表 +// List delayTaskList = taskList.stream() +// .filter(r -> "STInTask".equals(r.getConfig_code())) +// .collect(Collectors.toList()); +// List immediatelyTaskList = new ArrayList<>(taskList); +// immediatelyTaskList.removeAll(delayTaskList); +// //优先发送正常的任务列表 +// if (ObjectUtil.isNotEmpty(immediatelyTaskList)) { +// // 整理下发acs参数 +// for (SchBaseTask taskDao : immediatelyTaskList) { +// //任务优先级 +// taskDao.setPriority(StringUtils.isBlank(taskDao.getPriority()) ? "1" : taskDao.getPriority()); +// AbstractTask task = taskFactory.getTask(taskDao.getConfig_code()); +// task.sendTaskOne(taskDao.getTask_id()); +// } +// } +// //间隔3秒发一个任务 +// if (ObjectUtil.isNotEmpty(delayTaskList)) { +// DELAY_EXECUTOR.execute(() -> { +// try { +// for (SchBaseTask taskDao : delayTaskList) { +// //间隔3秒发一个任务 +// Thread.sleep(2000); +// //任务优先级 +// taskDao.setPriority(StringUtils.isBlank(taskDao.getPriority()) ? "1" : taskDao.getPriority()); +// AbstractTask task = taskFactory.getTask(taskDao.getConfig_code()); +// task.sendTaskOne(taskDao.getTask_id()); +// } +// } catch (InterruptedException e) { +// Thread.currentThread().interrupt(); +// log.error("延迟任务被中断", e); +// } catch (Exception e) { +// log.error("延迟下发任务执行失败", e); +// } +// }); +// } +// } + /** * 定时下发任务 */ private void sendTask() { + // 1. 查询待发送的任务 List taskList = taskService.list(new LambdaQueryWrapper() .eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO) .eq(SchBaseTask::getTask_status, TaskStatus.CREATE.getCode())); if (ObjectUtil.isEmpty(taskList)) { return; } - // 整理下发acs参数 - for (SchBaseTask taskDao : taskList) { - //任务优先级 - taskDao.setPriority(StringUtils.isBlank(taskDao.getPriority()) ? "0" : taskDao.getPriority()); - AbstractTask task = taskFactory.getTask(taskDao.getConfig_code()); - task.sendTaskOne(taskDao.getTask_id()); + // 2. 统一设置默认优先级并分组 + Map> partitioned = taskList.stream() + .peek(task -> { + if (StringUtils.isBlank(task.getPriority())) { + task.setPriority("1"); + } + }) + .collect(Collectors.partitioningBy(r -> "STInTask".equals(r.getConfig_code()))); + List immediatelyTaskList = partitioned.get(false); + List delayTaskList = partitioned.get(true); + // 3. 立即下发任务 + if (ObjectUtil.isNotEmpty(immediatelyTaskList)) { + //log.info("开始下发立即任务, 数量: {}", immediatelyTaskList.size()); + for (SchBaseTask task : immediatelyTaskList) { + try { + AbstractTask taskExecutor = taskFactory.getTask(task.getConfig_code()); + taskExecutor.sendTaskOne(task.getTask_id()); + // log.info("任务下发成功: taskId={}, configCode={}", task.getTask_id(), task.getConfig_code()); + } catch (Exception e) { + log.error("任务下发失败: taskId={}, configCode={}", task.getTask_id(), task.getConfig_code(), e); + } + } + //log.info("立即任务下发完成"); + } + // 4. 延迟下发任务(间隔 7 秒,异步执行) + if (ObjectUtil.isNotEmpty(delayTaskList)) { + delayTaskList.sort(Comparator.comparing(SchBaseTask::getTask_code)); + //log.info("开始调度延迟任务, 数量: {}, 间隔: 7秒", delayTaskList.size()); + long delaySeconds = 0; + for (SchBaseTask task : delayTaskList) { + DELAY_EXECUTOR.schedule(() -> { + try { + AbstractTask taskExecutor = taskFactory.getTask(task.getConfig_code()); + taskExecutor.sendTaskOne(task.getTask_id()); + log.info("延迟任务下发成功: taskCode={}, configCode={}", task.getTask_code(), task.getConfig_code()); + } catch (Exception e) { + log.error("延迟任务下发失败: taskId={}, configCode={}", task.getTask_id(), task.getConfig_code(), e); + } + }, delaySeconds, TimeUnit.SECONDS); + delaySeconds += 7; + } + //log.info("延迟任务已全部提交调度"); } } } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java index 3c7790a..2f540fe 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java @@ -326,11 +326,12 @@ public class InBillServiceImpl extends ServiceImpl i ioStorInvDtl.put("plan_qty", row.get("qty")); Double qty = new Double(String.valueOf(row.get("qty"))); total_qty = total_qty.add(new BigDecimal(qty)); - - //判断该载具编号是否已经存在库内 - Structattr structattr = iStructattrService.getOne(new LambdaQueryWrapper<>(Structattr.class).eq(Structattr::getStoragevehicle_code, whereJson.get("storagevehicle_code"))); - if (ObjectUtil.isNotEmpty(structattr)) { - throw new BadRequestException("载具编码:" + row.get("storagevehicle_code") + "已存在库内,请对数据进行核实!"); + if (!Boolean.parseBoolean((String) whereJson.get("notStructCheck"))) { + //判断该载具编号是否已经存在库内 + Structattr structattr = iStructattrService.getOne(new LambdaQueryWrapper<>(Structattr.class).eq(Structattr::getStoragevehicle_code, whereJson.get("storagevehicle_code"))); + if (ObjectUtil.isNotEmpty(structattr)) { + throw new BadRequestException("载具编码:" + row.get("storagevehicle_code") + "已存在库内,请对数据进行核实!"); + } } IOStorInvDtl invDtl = ioStorInvDtl.toJavaObject(IOStorInvDtl.class); ioStorInvDtlMapper.insert(invDtl); @@ -467,6 +468,7 @@ public class InBillServiceImpl extends ServiceImpl i return ioStorInvMapper.getIODtl(whereJson); } + //默认分配,废弃 @Override @Transactional(rollbackFor = Exception.class) public void divStruct(JSONObject param) { @@ -494,31 +496,31 @@ public class InBillServiceImpl extends ServiceImpl i //是否自动分配仓位 // Boolean checked = mst.getBoolean("checked"); // if (ObjectUtil.isNotEmpty(checked) && checked) { - //根据载具进行分配货位 - List maters = new ArrayList<>(); - for (IOStorInvDis dis : disList) { - StrategyMater mater = new StrategyMater(); - mater.setPcsn(dis.getPcsn()); - mater.setMaterial_code(dis.getMaterial_code()); - mater.setMaterial_id(dis.getMaterial_id()); - mater.setQty(dis.getPlan_qty()); - maters.add(mater); - } - List structattrs = iStructattrService.inBoundSectDiv( - StrategyStructParam.builder() - .ioType(param.getString("ioType")) - .sect_code(param.getString("sect_code")) - .stor_code(param.getString("stor_code")) - .storagevehicle_code(param.getString("storagevehicle_code")) - .strategyMaters(maters) - .build()); - Structattr struct = structattrs.get(0); - sect_id = struct.getSect_id(); - sect_code = struct.getSect_code(); - sect_name = struct.getSect_name(); - struct_id = struct.getStruct_id(); - struct_code = struct.getStruct_code(); - struct_name = struct.getStruct_name(); + //根据载具进行分配货位 + List maters = new ArrayList<>(); + for (IOStorInvDis dis : disList) { + StrategyMater mater = new StrategyMater(); + mater.setPcsn(dis.getPcsn()); + mater.setMaterial_code(dis.getMaterial_code()); + mater.setMaterial_id(dis.getMaterial_id()); + mater.setQty(dis.getPlan_qty()); + maters.add(mater); + } + List structattrs = iStructattrService.inBoundSectDiv( + StrategyStructParam.builder() + .ioType(param.getString("ioType")) + .sect_code(param.getString("sect_code")) + .stor_code(param.getString("stor_code")) + .storagevehicle_code(param.getString("storagevehicle_code")) + .strategyMaters(maters) + .build()); + Structattr struct = structattrs.get(0); + sect_id = struct.getSect_id(); + sect_code = struct.getSect_code(); + sect_name = struct.getSect_name(); + struct_id = struct.getStruct_id(); + struct_code = struct.getStruct_code(); + struct_name = struct.getStruct_name(); // } // else { // Structattr structattr = iStructattrService.findById(map.getString("struct_id")); @@ -594,9 +596,13 @@ public class InBillServiceImpl extends ServiceImpl i JSONObject mst = JSONObject.parseObject(JSON.toJSONString(param)); String iostorinvId = param.getString("iostorinv_id"); String storagevehicleCode = param.getString("storagevehicle_code"); - String storagevehicle_stype=param.getString("storagevehicle_type"); - MdPbStoragevehicletype mdPbStoragevehicletype=iMdPbStoragevehicletypeService.getByCode(storagevehicle_stype); - String suitable_car=mdPbStoragevehicletype.getSuitable_car(); + String storagevehicle_stype = param.getString("storagevehicle_type"); + MdPbStoragevehicletype mdPbStoragevehicletype = iMdPbStoragevehicletypeService.getByCode(storagevehicle_stype); + //处理不同库区,一楼半成品特殊区域待检区 + if ("DJQHDL".equals(storagevehicle_stype) || "DJQMZB".equals(storagevehicle_stype) || "DJQCT".equals(storagevehicle_stype)) { + param.put("sect_code", "1BCDJQ"); + } + String suitable_car = mdPbStoragevehicletype.getSuitable_car(); //判断该分配明细是否已经分配货位 List disList = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<>(IOStorInvDis.class) .eq(IOStorInvDis::getIostorinv_id, iostorinvId) @@ -974,11 +980,16 @@ public class InBillServiceImpl extends ServiceImpl i //获取出入库单标识 String iostorinv_id = item1.getIostorinv_id(); IOStorInv ioStorInv = ioStorInvMapper.selectOne(new LambdaQueryWrapper().eq(IOStorInv::getIostorinv_id, iostorinv_id)); - //获取单据编号 - String bill_code = ioStorInv.getBill_code(); - String source_name = ioStorInv.getSource_name(); //acs完成任务状态为5,PC端完成为0 - if ("5".equals(task.getTask_status()) || "0".equals(task.getTask_status())) { + if (!"1".equals(task.getTask_status())) { + //转库解锁原库位 + if (ObjectUtil.isNotEmpty(iStructattrService.getOne(new LambdaQueryWrapper().eq(Structattr::getStruct_code, task.getPoint_code1())))) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.set(Structattr::getStoragevehicle_code, null) + .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + .eq(Structattr::getStruct_code, task.getPoint_code1()); + iStructattrService.update(wrapper); + } //解锁库位 JSONObject finish_map = new JSONObject(); finish_map.put("struct_code", structCode); @@ -1009,6 +1020,9 @@ public class InBillServiceImpl extends ServiceImpl i invDtl.setIostorinvdtl_id(dtl_id); invDtl.setReal_qty(dtlMap.get(dtl_id)); invDtl.setBill_status(IOSEnum.BILL_STATUS.code("完成")); + if (!"5".equals(task.getTask_status())) { + invDtl.setRemark("该任务为PC端手动强制完成:" + now); + } ioStorInvDtlMapper.updateById(invDtl); } // 查看明细是否全部完成 @@ -1029,6 +1043,7 @@ public class InBillServiceImpl extends ServiceImpl i } } //回传给wms + String source_name = ioStorInv.getSource_name(); TOWMSMSG towmsmsg = new TOWMSMSG(); towmsmsg.setType(task.getConfig_code().contains("In") ? "0" : "1"); towmsmsg.setBill_code(source_name); @@ -1082,9 +1097,9 @@ public class InBillServiceImpl extends ServiceImpl i String structCode = ioStorInvDis.get(0).getStruct_code(); IOStorInvDis item1 = ioStorInvDis.get(0); //获取出入库单标识 - String iostorinv_id=item1.getIostorinv_id(); - IOStorInv ioStorInv=ioStorInvMapper.selectOne(new LambdaQueryWrapper().eq(IOStorInv::getIostorinv_id,iostorinv_id)); - String source_name=ioStorInv.getSource_name(); + String iostorinv_id = item1.getIostorinv_id(); + IOStorInv ioStorInv = ioStorInvMapper.selectOne(new LambdaQueryWrapper().eq(IOStorInv::getIostorinv_id, iostorinv_id)); + String source_name = ioStorInv.getSource_name(); TOWMSMSG towmsmsg=new TOWMSMSG(); towmsmsg.setType("0"); towmsmsg.setBill_code(source_name); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/OutBillServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/OutBillServiceImpl.java index a76a396..754cd15 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/OutBillServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/OutBillServiceImpl.java @@ -1486,15 +1486,15 @@ public class OutBillServiceImpl extends ServiceImpl i ); // 完成当前任务对应的所有分配明细 for (IOStorInvDis ioStorInvDis : disList) { - ioStorInvDisMapper.update(ioStorInvDis,new LambdaUpdateWrapper<>(IOStorInvDis.class) - .set(IOStorInvDis::getWork_status,IOSEnum.INBILL_DIS_STATUS.code("完成")) - .eq(IOStorInvDis::getIostorinvdis_id,ioStorInvDis.getIostorinvdis_id())); + ioStorInvDisMapper.update(ioStorInvDis, new LambdaUpdateWrapper<>(IOStorInvDis.class) + .set(IOStorInvDis::getWork_status, IOSEnum.INBILL_DIS_STATUS.code("完成")) + .eq(IOStorInvDis::getIostorinvdis_id, ioStorInvDis.getIostorinvdis_id())); } IOStorInvDis item = disList.get(0); //获取出入库单标识 - String iostorinv_id=item.getIostorinv_id(); - IOStorInv ioStorInv=ioStorInvMapper.selectOne(new LambdaQueryWrapper().eq(IOStorInv::getIostorinv_id,iostorinv_id)); - String source_name=ioStorInv.getSource_name(); + String iostorinv_id = item.getIostorinv_id(); + IOStorInv ioStorInv = ioStorInvMapper.selectOne(new LambdaQueryWrapper().eq(IOStorInv::getIostorinv_id, iostorinv_id)); + String source_name = ioStorInv.getSource_name(); TOWMSMSG towmsmsg=new TOWMSMSG(); towmsmsg.setType("1"); towmsmsg.setBill_code(source_name); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/service/dao/StIvtCheckdtl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/service/dao/StIvtCheckdtl.java index a62f967..fcf60e9 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/service/dao/StIvtCheckdtl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/service/dao/StIvtCheckdtl.java @@ -37,6 +37,7 @@ public class StIvtCheckdtl implements Serializable { /** * 任务标识 */ + private String task_id; /** diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/wbwms/controller/WmsToIWmscontroller.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/wbwms/controller/WmsToIWmscontroller.java index b534adf..867fad3 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/wbwms/controller/WmsToIWmscontroller.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/wbwms/controller/WmsToIWmscontroller.java @@ -58,6 +58,23 @@ public class WmsToIWmscontroller { public ResponseEntity outBillTask(@RequestBody JSONObject param) { return new ResponseEntity<>(wmsToIWmsService.outBillTask(param), HttpStatus.OK); } + @PostMapping("/OutCheck") + @Log("查询点位信息") + @SaIgnore + public ResponseEntity outCheck(@RequestBody JSONObject param) { + return new ResponseEntity<>(wmsToIWmsService.outCheck(param), HttpStatus.OK); + } + @PostMapping("/inventory") + @Log("盘点信息") + @SaIgnore + public ResponseEntity inventory(@RequestBody JSONObject param) { + return new ResponseEntity<>(wmsToIWmsService.inventory(param), HttpStatus.OK); + } + + + + + @PostMapping("/move") @Log("WMS移库任务推送") @SaIgnore diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/wbwms/service/WmsToIWmsService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/wbwms/service/WmsToIWmsService.java index 1c32681..d7b6506 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/wbwms/service/WmsToIWmsService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/wbwms/service/WmsToIWmsService.java @@ -11,6 +11,10 @@ public interface WmsToIWmsService { WmstoIWmsResponse groupTask (JSONObject param); WmstoIWmsResponse groupCheck(JSONObject param); WmstoIWmsResponse outBillTask (JSONObject param); + + WmstoIWmsResponse outCheck (JSONObject param); + WmstoIWmsResponse inventory (JSONObject param); + WmstoIWmsResponse moveTask(JSONObject param); WmstoIWmsResponse checkBillTask(JSONObject param); } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/wbwms/service/impl/WmsToIWmsServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/wbwms/service/impl/WmsToIWmsServiceImpl.java index 87780e3..3f0fcef 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/wbwms/service/impl/WmsToIWmsServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/wbwms/service/impl/WmsToIWmsServiceImpl.java @@ -1,7 +1,6 @@ package org.nl.wms.wbwms.service.impl; import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -9,7 +8,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.http.protocol.HTTP; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.CodeUtil; import org.nl.common.utils.IdUtil; @@ -21,7 +19,6 @@ import org.nl.wms.basedata_manage.service.IStructattrService; import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleinfo; import org.nl.wms.basedata_manage.service.dao.Structattr; import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleinfoMapper; -import org.nl.wms.basedata_manage.service.dao.mapper.StructattrMapper; import org.nl.wms.sch_manage.enums.PointStatusEnum; import org.nl.wms.sch_manage.service.ISchBasePointService; import org.nl.wms.sch_manage.service.dao.SchBasePoint; @@ -29,11 +26,10 @@ import org.nl.wms.sch_manage.service.dao.mapper.SchBasePointMapper; import org.nl.wms.sch_manage.service.util.tasks.CheckInTask; import org.nl.wms.sch_manage.service.util.tasks.CheckOutTask; import org.nl.wms.sch_manage.service.util.tasks.MoveTask; -import org.nl.wms.sch_manage.service.util.tasks.StInTask; +import org.nl.wms.warehouse_manage.enums.IOSConstant; import org.nl.wms.warehouse_manage.enums.IOSEnum; import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService; import org.nl.wms.warehouse_manage.inAndOut.service.IOutBillService; -import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDis; import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper; import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService; import org.nl.wms.warehouse_manage.service.IStIvtCheckmstService; @@ -57,9 +53,9 @@ import java.util.List; @Slf4j @Service public class WmsToIWmsServiceImpl implements WmsToIWmsService { - @Autowired - private IStructattrService iStructattrService; - @Autowired + @Autowired + private IStructattrService iStructattrService; + @Autowired private ISchBasePointService iSchBasePointService; @Autowired private IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService; @@ -69,8 +65,6 @@ public class WmsToIWmsServiceImpl implements WmsToIWmsService { private IOStorInvDisMapper ioStorInvDisMapper; @Resource private SchBasePointMapper schBasePointMapper; - @Resource - private StructattrMapper structattrMapper; @Autowired IInBillService iInBillService; @Autowired @@ -132,40 +126,53 @@ public class WmsToIWmsServiceImpl implements WmsToIWmsService { @Transactional public WmstoIWmsResponse groupTask(JSONObject parm) { log.info("WMS入库请求参数参数为:-------------------" + parm.toString()); - if(StringUtils.isBlank(parm.getString("point_code"))){ + if (StringUtils.isBlank(parm.getString("point_code"))) { throw new BadRequestException("未传入地面入库点"); } - if(!ObjectUtil.isNotEmpty(iSchBasePointService.getByCode(parm.getString("point_code")))){ - throw new BadRequestException("传入的地面入库点不存在"); - } - if(StringUtils.isBlank(parm.getString("storagevehicle_code"))){ + if (StringUtils.isBlank(parm.getString("storagevehicle_code"))) { throw new BadRequestException("未传入载具码"); } - String point_code=parm.getString("point_code"); - String storagevehicle_code=parm.getString("storagevehicle_code"); + String storagevehicle_code = parm.getString("storagevehicle_code"); + SchBasePoint one = iSchBasePointService.getOne( + new QueryWrapper().lambda() + .eq(SchBasePoint::getPoint_code, parm.getString("point_code")).eq(SchBasePoint::getIs_used, BaseDataEnum.IS_YES_NOT.code("是")) + ); + //起点校验 + if (ObjectUtil.isEmpty(one)) { + if (ObjectUtil.isNotEmpty(iStructattrService.getByCode(parm.getString("point_code")))) { + Structattr structattr = iStructattrService.getByCode(parm.getString("point_code")); + if (!storagevehicle_code.equals(structattr.getStoragevehicle_code())) { + throw new BadRequestException("该仓位存放托盘与所传托盘的编码不对" + "传入的托盘号:" + storagevehicle_code + ",现在存放的托盘号:" + structattr.getStoragevehicle_code()); + } + if (!"0".equals(structattr.getLock_type())) { + throw new BadRequestException("传入仓位有正在执行的任务,无法生成,请检查仓位管理的仓位信息!"); + } + parm.put("notStructCheck", "true"); + } + } WmstoIWmsResponse result = new WmstoIWmsResponse(); - //生成载具信息 - iMdPbStoragevehicleinfoService.create(parm); - //生成组盘记录 - groupController.createSingle(parm); - //新增入库表 - String iostorinv_id = iInBillService.insertDtl1(parm); - //入库分配货位 - parm.put("iostorinv_id",iostorinv_id); - String point_code1=iInBillService.divStruct1(parm); - parm.put("struct_code",point_code1); - //判断是否已经分配好货位 - iInBillService.divPoint1(parm); + //生成载具信息 + iMdPbStoragevehicleinfoService.create(parm); + //生成组盘记录 + groupController.createSingle(parm); + //新增入库表 + String iostorinv_id = iInBillService.insertDtl1(parm); + //入库分配货位 + parm.put("iostorinv_id", iostorinv_id); + String point_code1 = iInBillService.divStruct1(parm); + parm.put("struct_code", point_code1); + //判断是否已经分配好货位 + iInBillService.divPoint1(parm); result.setCode(String.valueOf(HttpStatus.OK.value())); result.setMsg("入库任务生成成功"); result.setTotalElements(0); - JSONObject data=new JSONObject(); - data.put("bill_code",iostorinv_id); - data.put("urnin_struct_code",point_code1); - data.put("bill_code",parm.getString("bill_code")); - result.setData(data); + JSONObject data = new JSONObject(); + data.put("bill_code", iostorinv_id); + data.put("urnin_struct_code", point_code1); + data.put("bill_code", parm.getString("bill_code")); + result.setData(data); log.info("WMS入库返回参数为:-------------------" + result.toString()); - return result; + return result; } @Override @Transactional @@ -183,12 +190,12 @@ public class WmsToIWmsServiceImpl implements WmsToIWmsService { String car_type=null; String car_width="685"; if("1".equals(parm.getString("task_type"))){ - List regionCode = structattrMapper.selectList(new LambdaQueryWrapper() + List regionCode = iStructattrService.list(new LambdaQueryWrapper() .eq(Structattr::getSect_code, "1BCDJQ") - .eq(Structattr::getIs_used,true) - .eq(Structattr::getLock_type,IOSEnum.LOCK_TYPE.code("未锁定")) + .eq(Structattr::getIs_used, true) + .eq(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) .isNull(Structattr::getStoragevehicle_code)); - String pointCode=regionCode.get(0).getStruct_code(); + String pointCode = regionCode.get(0).getStruct_code(); if(StringUtils.isBlank(pointCode)){ throw new BadRequestException("待检区域无库存"); } @@ -235,24 +242,132 @@ public class WmsToIWmsServiceImpl implements WmsToIWmsService { return result; } + + @Override + public WmstoIWmsResponse inventory(JSONObject parm) { + log.info("WMS发起盘点请求,参数为:-------------------" + parm.toString()); + JSONArray tableData = parm.getJSONArray("tableData"); + String storageCode = tableData.getJSONObject(0).getString("storage_code"); + //盘点数量 + String qty = tableData.getJSONObject(0).getString("plan_qty"); + String structCode = parm.getString("turnout_struct_code"); + if (StringUtils.isBlank(storageCode) || StringUtils.isBlank(structCode)) { + throw new BadRequestException("未传入载具或仓位信息!"); + } + Structattr struct = iStructattrService.getByCode(structCode); + if (!storageCode.equals(struct.getStoragevehicle_code())) { + throw new BadRequestException("该仓位存放托盘与所传托盘的编码不对" + "传入的托盘号:" + storageCode + ",现在存放的托盘号:" + struct.getStoragevehicle_code()); + } + if (!"0".equals(struct.getLock_type())) { + throw new BadRequestException("传入仓位被锁定或有任务,需要检查仓位或任务列表,暂不能盘点!" + structCode); + } + GroupPlate groupPlate = iMdPbGroupplateService.getByCode(storageCode); + String oldQty = groupPlate.getQty().toString(); + BigDecimal newQty = new BigDecimal(qty); + BigDecimal oldQtyDecimal = groupPlate.getQty(); + if (newQty.compareTo(oldQtyDecimal) == 0) { + WmstoIWmsResponse result = new WmstoIWmsResponse(); + result.setCode(String.valueOf(HttpStatus.OK.value())); + result.setMsg("盘点数量与当前库存一致,无需调整!"); + result.setTotalElements(0); + JSONObject data = new JSONObject(); + result.setData(data); + log.info("WMS执行盘点操作:-------------------" + "仓位:" + structCode + ",托盘:" + storageCode + ",当前数量:" + oldQty + ",盘点数量:" + qty + ",无需调整"); + return result; + } + List updateIvtList = new ArrayList<>(); + JSONObject jsonIvt = new JSONObject(); + if (newQty.compareTo(BigDecimal.ZERO) == 0) { + jsonIvt.put("type", IOSConstant.UPDATE_IVT_TYPE_SUB_CANUSE_IVT); + jsonIvt.put("change_qty", groupPlate.getQty()); + groupPlate.setStatus(IOSEnum.GROUP_PLATE_STATUS.code("出库")); + } else { + jsonIvt.put("type", IOSConstant.UPDATE_IVT_TYPE_ADD_CANUSE_IVT); + BigDecimal changeQty = newQty.subtract(groupPlate.getQty()); + jsonIvt.put("change_qty", changeQty.abs()); + } + jsonIvt.put("storagevehicle_code", storageCode); + jsonIvt.put("material_id", groupPlate.getMaterial_id()); + jsonIvt.put("pcsn", groupPlate.getPcsn()); + jsonIvt.put("qty_unit_id", groupPlate.getQty_unit_id()); + jsonIvt.put("qty_unit_name", groupPlate.getQty_unit_name()); + jsonIvt.put("remark", "盘点调整,仓位:" + structCode + ",原数量:" + oldQty + ",调整后数量:" + qty); + updateIvtList.add(jsonIvt); + iMdPbGroupplateService.updateIvt(updateIvtList); + if (newQty.compareTo(BigDecimal.ZERO) == 0) { + groupPlate.setQty(BigDecimal.ZERO); + groupPlate.setRemark("盘点调整,仓位:" + structCode + ",原数量:" + oldQty + ",调整后数量:" + qty); + iMdPbGroupplateService.update(groupPlate); + } + WmstoIWmsResponse result = new WmstoIWmsResponse(); + result.setCode(String.valueOf(HttpStatus.OK.value())); + result.setMsg("盘点操作执行成功!"); + result.setTotalElements(0); + JSONObject data = new JSONObject(); + result.setData(data); + log.info("WMS执行盘点操作::-------------------" + "盘点调整,仓位:" + structCode + ",托盘:" + storageCode + ",变更前数量:" + oldQty + ",变更后数量:" + qty); + return result; + } + + + @Override + public WmstoIWmsResponse outCheck(JSONObject parm) { + log.info("WMS查询点位状态请求参数为:-------------------" + parm.toString()); + String pointCode = parm.getString("point_code"); + if (StringUtils.isBlank(pointCode)) { + throw new BadRequestException("未传点位区域!"); + } + String regionCode; + String canMaterialType; + switch (pointCode) { + case "InFloor1": + regionCode = "RKQ"; + canMaterialType = "1"; + break; + case "Floor1": + regionCode = "CKQ"; + canMaterialType = "1"; + break; + case "InFloor2": + regionCode = "RKQ"; + canMaterialType = "2"; + break; + case "Floor2": + regionCode = "CKQ"; + canMaterialType = "2"; + break; + default: + throw new BadRequestException("不支持的该区域类型查询:" + pointCode); + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SchBasePoint::getRegion_code, regionCode) + .eq(SchBasePoint::getCan_material_type, canMaterialType) + .eq(SchBasePoint::getIs_used, BaseDataEnum.IS_YES_NOT.code("是")) + .orderByAsc(SchBasePoint::getPoint_code); + + List list = iSchBasePointService.list(queryWrapper); + JSONArray dataList = new JSONArray(); + if (CollectionUtils.isNotEmpty(list)) { + for (SchBasePoint point : list) { + JSONObject pointData = new JSONObject(); + pointData.put("point_code", point.getPoint_code()); + pointData.put("status", point.getPoint_status().equals(IOSEnum.POINT_STATUS.code("空位")) ? "0" : "1"); + dataList.add(pointData); + } + } + WmstoIWmsResponse result = new WmstoIWmsResponse(); + result.setCode(String.valueOf(HttpStatus.OK.value())); + result.setMsg("查询成功"); + result.setTotalElements(dataList.size()); + JSONObject responseData = new JSONObject(); + responseData.put("data", dataList); + result.setData(responseData); + return result; + } + @Override @Transactional public WmstoIWmsResponse outBillTask(JSONObject parm) { -// log.info("WMS出库请求参数参数为:-------------------" + parm.toString()); -// WmstoIWmsResponse result = new WmstoIWmsResponse(); -// JSONArray tableData = parm.getJSONArray("tableData"); -// String storage_code=tableData.getJSONObject(0).getString("storage_code"); -// String turnout_struct_code=tableData.getJSONObject(0).getString("turnout_struct_code"); -// Structattr structattr=iStructattrService.getByCode(turnout_struct_code); -// if(ObjectUtil.isEmpty(structattr)){ -// throw new BadRequestException("wms上不存在该点位"); -// } -// if(!storage_code.equals(structattr.getStoragevehicle_code())){ -// throw new BadRequestException("该点位存放托盘与所传托盘的编码不对"); -// } -// if(!structattr.getLock_type().equals("0")){ -// throw new BadRequestException("传入点位有任务"); -// } log.info("WMS 出库请求参数参数为:-------------------" + parm.toString()); WmstoIWmsResponse result = new WmstoIWmsResponse(); JSONArray tableData = parm.getJSONArray("tableData"); @@ -280,7 +395,7 @@ public class WmsToIWmsServiceImpl implements WmsToIWmsService { throw new BadRequestException("wms上不存在该点位:" + turnout_struct_code); } if (!storage_code.equals(structattr.getStoragevehicle_code())) { - throw new BadRequestException("该点位存放托盘与所传托盘的编码不对:" + turnout_struct_code); + throw new BadRequestException("该仓位存放托盘与所传托盘的编码不对" + "传入的托盘号:" + storage_code + ",现在存放的托盘号:" + structattr.getStoragevehicle_code()); } if (!"0".equals(structattr.getLock_type())) { throw new BadRequestException("传入点位有任务:" + turnout_struct_code);