diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/MaterialbaseController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/MaterialbaseController.java index 6072e1f..a2f6e12 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/MaterialbaseController.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/MaterialbaseController.java @@ -57,6 +57,10 @@ public class MaterialbaseController { return new ResponseEntity<>(HttpStatus.CREATED); } + /** + * 数据初始化 + */ + @PostMapping("/excelImport") public ResponseEntity excelImport(@RequestParam("file") MultipartFile file, HttpServletRequest request, HttpServletResponse response) { RedissonUtils.lock(() -> { diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/MdPbStoragevehicleinfo.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/MdPbStoragevehicleinfo.java index 9d91065..59daf29 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/MdPbStoragevehicleinfo.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/MdPbStoragevehicleinfo.java @@ -1,5 +1,6 @@ package org.nl.wms.basedata_manage.service.dao; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -129,4 +130,16 @@ public class MdPbStoragevehicleinfo implements Serializable { */ private String ext_id; + /** + * 外部标识 + */ + @TableField(exist = false) + private String vehicle_code; + /** + * 外部标识 + */ + @TableField(exist = false) + private BigDecimal num; + + } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/SectattrMapper.xml b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/SectattrMapper.xml index f247ea3..f0a4aae 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/SectattrMapper.xml +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/SectattrMapper.xml @@ -16,6 +16,6 @@ sect.sect_code LIKE CONCAT('%', #{params.stor_code}, '%') - ORDER BY sect.update_time Desc + ORDER BY sect.create_time diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/MdMeMaterialbaseServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/MdMeMaterialbaseServiceImpl.java index bae4f19..3d1f426 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/MdMeMaterialbaseServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/MdMeMaterialbaseServiceImpl.java @@ -115,7 +115,7 @@ public class MdMeMaterialbaseServiceImpl extends ServiceImpl result = this.baseMapper.selectPage(new Page<>(page.getPage() + 1, page.getSize()), @@ -262,9 +262,9 @@ public class MdMeMaterialbaseServiceImpl extends ServiceImpl insertList = new ArrayList<>(); for (int i = 1; i < read.size(); i++) { List list = read.get(i); - //仓位 String m1 = String.valueOf(list.get(0)); String m2 = String.valueOf(list.get(1)); String m3 = String.valueOf(list.get(2)); String m4 = String.valueOf(list.get(3)); String m5 = String.valueOf(list.get(4)); + String m6 = String.valueOf(list.get(5)); + String m7 =null; + if (ObjectUtil.isNotEmpty(list.get(6))) { + m7 = String.valueOf(list.get(6)); + } SchBasePoint dao = new SchBasePoint(); dao.setPoint_code(m1); dao.setPoint_name(m2); @@ -768,6 +773,8 @@ public class MdMeMaterialbaseServiceImpl extends ServiceImpl queryAll(Map whereJson, PageQuery page) { // 查询条件 LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda(); - String search = MapUtil.getStr(whereJson, "vehicle_code"); + String search = MapUtil.getStr(whereJson, "storagevehicle_code"); String storagevehicle_type = MapUtil.getStr(whereJson, "storagevehicle_type"); - if (ObjectUtil.isNotEmpty(search)) { queryWrapper.likeRight(MdPbStoragevehicleinfo::getStoragevehicle_code, search) .or(item -> item.likeRight(MdPbStoragevehicleinfo::getStoragevehicle_name, search)); @@ -50,7 +51,6 @@ public class MdPbStoragevehicleinfoServiceImpl extends ServiceImpl(page.getPage() + 1, page.getSize()), queryWrapper ); @@ -59,24 +59,78 @@ public class MdPbStoragevehicleinfoServiceImpl extends ServiceImpl().lambda() - .eq(MdPbStoragevehicleinfo::getStoragevehicle_code, dto.getStoragevehicle_code()) - ); - if (ObjectUtil.isNotEmpty(mdPbStoragevehicleinfo)) { - throw new BadRequestException("当前载具编码已存在【"+dto.getStoragevehicle_code()+"】"); + // 提取载具编码中的数字部分并进行批量创建 + String storagevehicleCode = dto.getStoragevehicle_code(); + BigDecimal occupystructQty = dto.getNum(); + // 验证占仓位数是否在合理范围内 + if (ObjectUtil.isEmpty(occupystructQty) || occupystructQty.compareTo(BigDecimal.ZERO) <= 0) { + throw new BadRequestException("占仓位数必须大于0"); } - - // 新增 - dto.setStoragevehicle_id(IdUtil.getStringId()); - dto.setCreate_id(SecurityUtils.getCurrentUserId()); - dto.setCreate_name(SecurityUtils.getCurrentNickName()); - dto.setCreate_time(DateUtil.now()); - dto.setUpdate_optid(SecurityUtils.getCurrentUserId()); - dto.setUpdate_optname(SecurityUtils.getCurrentNickName()); - dto.setUpdate_time(DateUtil.now()); - this.save(dto); + if (occupystructQty.compareTo(new BigDecimal(500)) > 0) { + throw new BadRequestException("占仓位数最大为500"); + } + // 提取载具编码中的最后一个数字 + String prefix = ""; + int lastNumber = 0; + int numberLength = 0; + // 从后往前提取数字部分 + for (int i = storagevehicleCode.length() - 1; i >= 0; i--) { + char c = storagevehicleCode.charAt(i); + if (Character.isDigit(c)) { + numberLength++; + } else { + prefix = storagevehicleCode.substring(0, i + 1); + lastNumber = Integer.parseInt(storagevehicleCode.substring(i + 1)); + break; + } + } + // 如果整个字符串都是数字 + if (numberLength == storagevehicleCode.length()) { + prefix = ""; + lastNumber = Integer.parseInt(storagevehicleCode); + } + // 格式化数字的模板(保持原有的位数) + String numberFormat = "%0" + numberLength + "d"; + // 批量创建载具 + List batchList = new ArrayList<>(); + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + for (int i = 0; i < occupystructQty.intValue(); i++) { + int currentNumber = lastNumber + i; + String newCode = prefix + String.format(numberFormat, currentNumber); + // 检查新生成的编码是否已存在,如果存在则跳过 + MdPbStoragevehicleinfo existingVehicle = this.baseMapper.selectOne( + new QueryWrapper().lambda() + .eq(MdPbStoragevehicleinfo::getStoragevehicle_code, newCode) + ); + if (ObjectUtil.isNotEmpty(existingVehicle)) { + continue; + } + // 创建新的载具对象 + MdPbStoragevehicleinfo newVehicle = new MdPbStoragevehicleinfo(); + newVehicle.setStoragevehicle_id(IdUtil.getStringId()); + newVehicle.setStoragevehicle_code(newCode); + newVehicle.setStoragevehicle_name(dto.getStoragevehicle_name()); + newVehicle.setStoragevehicle_type(dto.getStoragevehicle_type()); + newVehicle.setOccupystruct_qty(dto.getOccupystruct_qty()); + newVehicle.setOverstruct_type(dto.getOverstruct_type()); + newVehicle.setVehicle_width(dto.getVehicle_width()); + newVehicle.setVehicle_long(dto.getVehicle_long()); + newVehicle.setVehicle_height(dto.getVehicle_height()); + newVehicle.setWeigth(dto.getWeigth()); + newVehicle.setIs_used(dto.getIs_used()); + newVehicle.setIs_delete("0"); + newVehicle.setCreate_id(currentUserId); + newVehicle.setCreate_name(nickName); + newVehicle.setCreate_time(now); + newVehicle.setUpdate_optid(currentUserId); + newVehicle.setUpdate_optname(nickName); + newVehicle.setUpdate_time(now); + batchList.add(newVehicle); + } + // 批量保存 + this.saveBatch(batchList); } @Override diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/SectattrServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/SectattrServiceImpl.java index 3f0d641..dbc1c32 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/SectattrServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/SectattrServiceImpl.java @@ -270,9 +270,7 @@ public class SectattrServiceImpl extends ServiceImpl i @Override @Transactional(rollbackFor = Exception.class) public void changeActive(JSONObject json) { - String stor_id = json.getString("stor_id"); - BsrealStorattr bsrealStorattr = iBsrealStorattrService.list(new LambdaQueryWrapper<>(BsrealStorattr.class) .eq(BsrealStorattr::getStor_id,stor_id) .eq(BsrealStorattr::getIs_used,BaseDataEnum.IS_YES_NOT.code("是"))) diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/gateway/service/impl/GateWayServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/gateway/service/impl/GateWayServiceImpl.java index e432fc6..074b9bc 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/gateway/service/impl/GateWayServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/gateway/service/impl/GateWayServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -21,6 +22,7 @@ import org.nl.wms.gateway.dto.InteracteDto; import org.nl.wms.gateway.dto.RcsResponse; import org.nl.wms.gateway.service.IGateWayService; import org.nl.wms.pda.ios_manage.service.impl.PdaIosInServiceImpl; +import org.nl.wms.sch_manage.enums.StatusEnum; import org.nl.wms.sch_manage.enums.TaskStatus; import org.nl.wms.sch_manage.service.ISchBasePointService; import org.nl.wms.sch_manage.service.ISchBaseTaskService; @@ -184,6 +186,12 @@ public class GateWayServiceImpl implements IGateWayService { try { if (tryLock) { SchBaseTask taskObj = iSchBaseTaskService.getByCode(orderId); + if (taskObj == null) { + RcsResponse.requestOk(); + } + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode()) || taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + RcsResponse.requestOk(); + } // rcs反馈的任务类型 String rcsTaskStatus = param.getStatus().toString(); ResultAcsStatus rcsStatusEnum = ResultAcsStatus.fromCode(rcsTaskStatus); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosInServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosInServiceImpl.java index 38aaaa5..356f37e 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosInServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosInServiceImpl.java @@ -276,6 +276,10 @@ public class PdaIosInServiceImpl implements PdaIosInService { if ((!vehicleDao.getStoragevehicle_code().contains("T") && dataArray.size() > 1) || ObjectUtils.isEmpty(dataArray)) { throw new BadRequestException("请检查是否选中物料或一个载具只能存放一个物料。"); } + //tofix 临时处理方案,后续要移除 + if (vehicleDao.getStoragevehicle_code().contains("T")&& dataArray.size() > 1) { + throw new BadRequestException("暂不支持混料组盘!"); + } //校验qty boolean qtyIsEmpty = dataArray.stream() .anyMatch(r -> { @@ -442,7 +446,7 @@ public class PdaIosInServiceImpl implements PdaIosInService { } String regionCode = MapUtil.getStr(whereJson, "region"); if (ObjectUtil.isNotEmpty(regionCode)) { - queryWrapper.eq(MdMeMaterialbase::getExt_id, regionCode); + queryWrapper.apply("FIND_IN_SET({0}, ext_id)", regionCode); } queryWrapper.orderByDesc(MdMeMaterialbase::getUpdate_time); Page mapPage = mdMeMaterialbaseMapper.selectPage(new Page<>(pageQuery.getPage(), pageQuery.getSize()), @@ -468,7 +472,7 @@ public class PdaIosInServiceImpl implements PdaIosInService { IPage regionList = iSchBaseRegionService.queryAll(whereJson, pageQuery); List selectList = new ArrayList<>(); String regionCode = "YZHJ01"; - String regionName = "预装线货架区"; + String regionName = "3F-预装线货架区"; if (ObjectUtil.isNotEmpty(whereJson.getString("storagevehicle_code"))) { List taskList = iSchBaseTaskService.list(new LambdaQueryWrapper().eq(SchBaseTask::getVehicle_code, whereJson.getString("storagevehicle_code")).lt(SchBaseTask::getTask_status, TaskStatus.UNFINISHED.getCode()).orderByDesc(SchBaseTask::getCreate_time).last("LIMIT 50")); if (ObjectUtil.isNotEmpty(taskList)) { diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosOutServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosOutServiceImpl.java index 4174f86..a4ff96b 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosOutServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosOutServiceImpl.java @@ -503,7 +503,7 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { } String regionCode = MapUtil.getStr(whereJson, "region"); if (ObjectUtil.isNotEmpty(regionCode)) { - queryWrapper.eq(MdMeMaterialbase::getExt_id, regionCode); + queryWrapper.apply("FIND_IN_SET({0}, ext_id)", regionCode); } queryWrapper.orderByDesc(MdMeMaterialbase::getUpdate_time); Page mapPage = mdMeMaterialbaseMapper.selectPage(new Page<>(pageQuery.getPage(), pageQuery.getSize()), @@ -857,6 +857,7 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { String regionCode = whereJson.getString("region_code"); String vehicleCode = whereJson.getString("storagevehicle_code"); String isCheckIvt = whereJson.getString("isCheckIvt"); + boolean isEmptyVehicle = false; //校验起点 SchBasePoint point = iSchBasePointService.getOne( new LambdaQueryWrapper() @@ -872,36 +873,25 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { if (StringUtils.isBlank(regionCode) && StringUtils.isBlank(pointCode2)) { throw new BadRequestException("目标站点或区域请二选一!"); } - //库存校验 - if (whereJson.getString("isCheckIvt").equals(BaseDataEnum.IS_YES_NOT.code("是")) & !startPointCode.contains("A")) { - SchBasePoint vehiclePoint = iSchBasePointService.getOne( - new LambdaQueryWrapper() - .eq(SchBasePoint::getVehicle_code, vehicleCode) - ); - if (ObjectUtil.isEmpty(vehiclePoint)) { - throw new BadRequestException("该点位不存在物料信息,请检查组盘信息"); - - } - //自动解绑/绑定 - iSchBasePointService.update(new SchBasePoint(), new LambdaUpdateWrapper<>(SchBasePoint.class) - .set(SchBasePoint::getVehicle_code, null) - .set(SchBasePoint::getIng_task_code, null) - .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) - .eq(SchBasePoint::getPoint_code, vehiclePoint.getPoint_code()) - ); - iSchBasePointService.update(new SchBasePoint(), new LambdaUpdateWrapper<>(SchBasePoint.class) - .set(SchBasePoint::getVehicle_code, vehicleCode) - .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货")) - .eq(SchBasePoint::getPoint_code, startPointCode) - ); - SpringContextHolder.getBean(SysNoticeServiceImpl.class).createNotice(DateUtil.now() + ",手持端操作通知:生成点对点任务,站点:" + vehiclePoint.getPoint_code() + "强制解绑载具:" + vehicleCode+",重新绑定到站点:"+startPointCode, "操作信息", NoticeTypeEnum.NOTIFICATION.getCode()); + //站点组盘校验 + SchBasePoint vehiclePoint = iSchBasePointService.getOne( + new LambdaQueryWrapper() + .eq(SchBasePoint::getVehicle_code, vehicleCode) + ); + if (vehiclePoint == null) { + isEmptyVehicle = true; } - //只有空载具才会自动回原来区域 - int has = iMdPbGroupplateService.count(new LambdaUpdateWrapper() - .eq(GroupPlate::getStoragevehicle_code, vehicleCode) - .lt(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库"))); - if (has > 0) { - isCheckIvt = "0"; + //tofix 临时处理方案,后续要移除 + if ("1F-XHQY01".equals(point.getRegion_code()) || "1F-XHQY01".equals(regionCode)) { + throw new BadRequestException("暂不支持一楼业务!"); + } + //非5线都需要组盘校验,且自动绑定其他站点的物料组盘信息 + if (isCheckIvt.equals(BaseDataEnum.IS_YES_NOT.code("是")) && !point.getRegion_code().equals(StatusEnum.REGION_INFO.code("商用线5号线"))) { + if (vehiclePoint == null) { + throw new BadRequestException("该点位不存在物料信息,请检查组盘信息"); + } + //重新绑定载具到新点位 + changePointVehicle(startPointCode, vehicleCode, vehiclePoint); } //终点为站点 if (StringUtils.isNotBlank(pointCode2)) { @@ -917,65 +907,30 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { } endPointCode = pointCode2; } else { - if ("1".equals(isCheckIvt)) { - //终点为区域 - List taskList = iSchBaseTaskService.list(new LambdaQueryWrapper().eq(SchBaseTask::getVehicle_code, vehicleCode).lt(SchBaseTask::getTask_status, TaskStatus.UNFINISHED.getCode()).orderByDesc(SchBaseTask::getCreate_time).last("LIMIT 50")); - if (ObjectUtil.isNotEmpty(taskList)) { - //去除相同区域转运 - taskList = taskList.stream() - .filter(task -> { - String pointCodeStart = task.getPoint_code1(); - String pointCodeEnd = task.getPoint_code2(); - return StringUtils.isNotBlank(pointCodeStart) && - StringUtils.isNotBlank(pointCodeEnd) && - pointCodeStart.charAt(0) != pointCodeEnd.charAt(0); - }) - .collect(Collectors.toList()); - //提取与起点相同的终点任务的区域 - taskList = taskList.stream() - .filter(task -> { - String pointCodeStart = point.getPoint_code(); - String pointCodeEnd = task.getPoint_code2(); - return StringUtils.isNotBlank(pointCodeStart) && - StringUtils.isNotBlank(pointCodeEnd) && - pointCodeStart.charAt(0) == pointCodeEnd.charAt(0); - }) - .collect(Collectors.toList()); - //获取区域 - if (ObjectUtil.isNotEmpty(taskList)) { - List schBasePointList = iSchBasePointService.list(new LambdaQueryWrapper().eq(SchBasePoint::getPoint_code, taskList.get(0).getPoint_code1()).eq(SchBasePoint::getIs_used, true)); - regionCode = schBasePointList.get(0).getRegion_code(); - } - } + //终点为区域 + //只有空载具才符合自动回空载具 + int has = iMdPbGroupplateService.count(new LambdaUpdateWrapper() + .eq(GroupPlate::getStoragevehicle_code, vehicleCode) + .lt(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库"))); + if (has > 0) { + //有组盘信息,不是空载具 + isCheckIvt = "0"; + } + //默认开启物料校验,可以根据组盘信息是否出库与上一次区域,自动回空 + if (isCheckIvt.equals(BaseDataEnum.IS_YES_NOT.code("是"))) { + //获取该托盘最后一个区域 + regionCode = getLastRegionCode(regionCode, vehicleCode, point.getPoint_code()); + } + //69线物料分区逻辑,根据物料重新分配区域 + if (regionCode.contains("LJX")) { + //根据组盘物料获取区域 + regionCode = queryRegionByMaterial(regionCode,vehicleCode); } //获取终点 - endPointCode = iSchBasePointService.getPointCode(regionCode); + endPointCode = iSchBasePointService.getPointCode(regionCode, isEmptyVehicle); + //特殊区域无空位分配到入线边仓分配库位 if (StringUtils.isBlank(endPointCode)) { - //无空位分配到入线边仓分配库位 - if (regionCode.equals(StatusEnum.REGION_INFO.code("预装线货架区")) || regionCode.equals(StatusEnum.REGION_INFO.code("TGCK01")) || regionCode.equals(StatusEnum.REGION_INFO.code("两器仓"))) { - JSONArray dataArray = new JSONArray(); - JSONObject item = new JSONObject(); - item.put("material_id", StatusEnum.VEHICLE_TYPE.code("空货架")); - item.put("qty", 1); - dataArray.add(item); - whereJson.put("data", dataArray); - whereJson.put("stor_code", StatusEnum.STORE_INFO.code("料架线边库")); - whereJson.put("sect_code", "XB01"); - whereJson.put("material_id", StatusEnum.VEHICLE_TYPE.code("空货架")); - whereJson.put("qty", 1); - whereJson.put("site_code", startPointCode); - whereJson.put("vehicle_code", vehicleCode); - whereJson.put("is_auto_confirm", startPointCode); - //组盘 - SpringContextHolder.getBean(PdaIosInServiceImpl.class).groupPlate(whereJson); - //生成空载具入库任务 - whereJson.put("config_code", IOSConstant.VEHICLE_IN_TASK); - //入库分配 - SpringContextHolder.getBean(PdaIosInServiceImpl.class).divStructNoBills(whereJson); - return PdaResponse.requestOk(); - } else { - throw new BadRequestException("该区域暂无空闲货位,请及时取走该区域的物料!"); - } + return getPdaResponse(whereJson, startPointCode, regionCode, vehicleCode); } } //生成转运任务 @@ -998,5 +953,123 @@ public class PdaIosOutServiceImpl implements PdaIosOutService { return PdaResponse.requestOk(); } + private void changePointVehicle(String startPointCode, String vehicleCode, SchBasePoint vehiclePoint) { + //自动解绑/绑定 + iSchBasePointService.update(new SchBasePoint(), new LambdaUpdateWrapper<>(SchBasePoint.class) + .set(SchBasePoint::getVehicle_code, null) + .set(SchBasePoint::getIng_task_code, null) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) + .eq(SchBasePoint::getPoint_code, vehiclePoint.getPoint_code()) + ); + iSchBasePointService.update(new SchBasePoint(), new LambdaUpdateWrapper<>(SchBasePoint.class) + .set(SchBasePoint::getVehicle_code, vehicleCode) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货")) + .eq(SchBasePoint::getPoint_code, startPointCode) + ); + SpringContextHolder.getBean(SysNoticeServiceImpl.class).createNotice(DateUtil.now() + ",手持端操作通知:生成点对点任务,站点:" + vehiclePoint.getPoint_code() + "强制解绑载具:" + vehicleCode + ",重新绑定到站点:" + startPointCode, "操作信息", NoticeTypeEnum.NOTIFICATION.getCode()); + } + + /** + * 69线物料分区逻辑,根据物料重新分配区域 + */ + private String queryRegionByMaterial(String defaultRegionCode, String vehicleCode) { + // 1. 查询载具下未出库的组盘信息 + List groupPlateList = iMdPbGroupplateService.list( + new LambdaQueryWrapper() + .eq(GroupPlate::getStoragevehicle_code, vehicleCode) + .lt(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库")) + ); + if (CollectionUtils.isEmpty(groupPlateList)) { + return defaultRegionCode; + } + // 2. 取第一个组盘的物料ID + String materialId = groupPlateList.get(0).getMaterial_id(); + if (StringUtils.isBlank(materialId)) { + return defaultRegionCode; + } + // 3. 查询物料信息 + MdMeMaterialbase material = iMdMeMaterialbaseService.getOne( + new LambdaQueryWrapper() + .eq(MdMeMaterialbase::getMaterial_id, materialId) + ); + if (material == null || StringUtils.isBlank(material.getExt_id())) { + return defaultRegionCode; + } + // 4. 获取有效区域列表(trim后过滤空串) + String[] allowedRegions = material.getExt_id().split(","); + List regionList = Arrays.stream(allowedRegions) + .map(String::trim) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toList()); + if (regionList.isEmpty()) { + return defaultRegionCode; + } + // 5. 优先返回匹配 defaultRegionCode 的区域(来自列表),否则返回第一个区域 + return regionList.stream() + .filter(r -> r.contains(defaultRegionCode.substring(0,3))) + .findFirst() + .orElse(defaultRegionCode); + } + + + private PdaResponse getPdaResponse(JSONObject whereJson, String startPointCode, String regionCode, String vehicleCode) { + if (regionCode.equals(StatusEnum.REGION_INFO.code("预装线货架区")) || regionCode.equals(StatusEnum.REGION_INFO.code("TGCK01")) || regionCode.equals(StatusEnum.REGION_INFO.code("两器仓"))) { + JSONArray dataArray = new JSONArray(); + JSONObject item = new JSONObject(); + item.put("material_id", StatusEnum.VEHICLE_TYPE.code("空货架")); + item.put("qty", 1); + dataArray.add(item); + whereJson.put("data", dataArray); + whereJson.put("stor_code", StatusEnum.STORE_INFO.code("料架线边库")); + whereJson.put("sect_code", "XB01"); + whereJson.put("material_id", StatusEnum.VEHICLE_TYPE.code("空货架")); + whereJson.put("qty", 1); + whereJson.put("site_code", startPointCode); + whereJson.put("vehicle_code", vehicleCode); + whereJson.put("is_auto_confirm", startPointCode); + //组盘 + SpringContextHolder.getBean(PdaIosInServiceImpl.class).groupPlate(whereJson); + //生成空载具入库任务 + whereJson.put("config_code", IOSConstant.VEHICLE_IN_TASK); + //入库分配 + SpringContextHolder.getBean(PdaIosInServiceImpl.class).divStructNoBills(whereJson); + return PdaResponse.requestOk(); + } else { + throw new BadRequestException("该区域暂无空闲货位,请及时取走该区域的物料!"); + } + } + + private String getLastRegionCode(String regionCode, String vehicleCode, String pointCode) { + //终点为区域 + List taskList = iSchBaseTaskService.list(new LambdaQueryWrapper().eq(SchBaseTask::getVehicle_code, vehicleCode).lt(SchBaseTask::getTask_status, TaskStatus.UNFINISHED.getCode()).orderByDesc(SchBaseTask::getCreate_time).last("LIMIT 50")); + if (ObjectUtil.isNotEmpty(taskList)) { + //去除相同区域转运 + taskList = taskList.stream() + .filter(task -> { + String pointCodeStart = task.getPoint_code1(); + String pointCodeEnd = task.getPoint_code2(); + return StringUtils.isNotBlank(pointCodeStart) && + StringUtils.isNotBlank(pointCodeEnd) && + pointCodeStart.charAt(0) != pointCodeEnd.charAt(0); + }) + .collect(Collectors.toList()); + //提取与起点相同的终点任务的区域 + taskList = taskList.stream() + .filter(task -> { + String pointCodeEnd = task.getPoint_code2(); + return StringUtils.isNotBlank(pointCode) && + StringUtils.isNotBlank(pointCodeEnd) && + pointCode.charAt(0) == pointCodeEnd.charAt(0); + }) + .collect(Collectors.toList()); + //获取区域 + if (ObjectUtil.isNotEmpty(taskList)) { + List schBasePointList = iSchBasePointService.list(new LambdaQueryWrapper().eq(SchBasePoint::getPoint_code, taskList.get(0).getPoint_code1()).eq(SchBasePoint::getIs_used, true)); + regionCode = schBasePointList.get(0).getRegion_code(); + } + } + return regionCode; + } + } \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java index 572c575..75d3e67 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java @@ -66,7 +66,7 @@ public interface ISchBasePointService extends IService { /** * 获取区域可用入库点位 */ - String getPointCode(String regionCode); + String getPointCode(String regionCode,boolean isEmptyVehicle); /** diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/SchBasePoint.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/SchBasePoint.java index a0051a1..fd945c8 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/SchBasePoint.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/SchBasePoint.java @@ -42,7 +42,7 @@ public class SchBasePoint implements Serializable { private String can_material_type; - + // 允许的载具类型,0空载具1托盘2料箱3货架 private String can_vehicle_type; diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.xml b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.xml index cb3ce47..d37cbda 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.xml +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.xml @@ -49,7 +49,7 @@ ) gro ON p.vehicle_code = gro.storagevehicle_code AND gro.rn = 1 LEFT JOIN md_me_materialbase mater ON mater.material_id = gro.material_id - + p.workshop_code = #{whereJson.workshop_code} 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 4862a06..75eaaa3 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 @@ -235,10 +235,11 @@ public class SchBasePointServiceImpl extends ServiceImpl pointList; if (regionCode.equals(StatusEnum.REGION_INFO.code("CTU出库点"))) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().eq(SchBasePoint::getIs_used, true); @@ -251,12 +252,38 @@ public class SchBasePointServiceImpl extends ServiceImpl StatusEnum.VEHICLE_TYPE.code("空载具").equals(r.getCan_vehicle_type())) .findFirst() - .orElseThrow(() -> new BadRequestException("该区域暂无空闲货位,请及时取走该区域的物料!")) + .orElseThrow(() -> new BadRequestException("货位已满,无空闲货位,请及时取走该区域的物料!")) + .getPoint_code(); + } else if (isEmptyVehicle) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().eq(SchBasePoint::getIs_used, true); + queryWrapper.eq(SchBasePoint::getRegion_code, regionCode).eq(SchBasePoint::getCan_vehicle_type, StatusEnum.VEHICLE_TYPE.code("空载具")); + int count = this.count(queryWrapper); + //有规定放空载具的区域 + if (count > 0) { + pointCode = pointList.stream() + .filter(r -> StatusEnum.VEHICLE_TYPE.code("空载具").equals(r.getCan_vehicle_type())) + .findFirst() + .orElseThrow(() -> new BadRequestException("货位已满,无空闲货位,请及时取走该区域的物料!")) + .getPoint_code(); + } else { + pointCode = pointList.stream() + .findFirst() + .orElseThrow(() -> new BadRequestException("货位已满,无空闲货位,请及时取走该区域的物料!")) + .getPoint_code(); + } + } else { + pointCode = pointList.stream() + .filter(r -> !StatusEnum.VEHICLE_TYPE.code("空载具").equals(r.getCan_vehicle_type())) + .findFirst() + .orElseThrow(() -> new BadRequestException("货位已满,无空闲货位,请及时取走该区域的物料!")) .getPoint_code(); } // else if ((regionCode.equals(StatusEnum.REGION_INFO.code("预装托盘暂存区")))) { @@ -287,13 +314,6 @@ public class SchBasePointServiceImpl extends ServiceImpl new BadRequestException("该区域暂无空闲货位,请及时取走该区域的物料!")) - .getPoint_code(); - } return pointCode; } 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 805797c..fd38190 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 @@ -96,6 +96,7 @@ public abstract class AbstractTask { .eq(GroupPlate::getStoragevehicle_code, task.getVehicle_code()) .lt(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库"))); if (CollectionUtils.isEmpty(groupPlateList)) { + task.setExt_group_data("此任务为空载具搬运"); return; } // 确定用于构建扩展信息的 GroupPlate 记录 @@ -110,6 +111,7 @@ public abstract class AbstractTask { } MdMeMaterialbase material = iMdMeMaterialbaseService.getById(targetPlate.getMaterial_id()); if (material == null) { + task.setExt_group_data("此任务为空载具搬运"); return; } // 获取数量 diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java index c1fddf7..001144a 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java @@ -1007,7 +1007,7 @@ public class OutBillServiceImpl extends ServiceImpl List taskList = iSchBaseTaskService.list(new LambdaQueryWrapper().eq(SchBaseTask::getVehicle_code, ioStorInvDis.getStoragevehicle_code()).lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode())); if (ObjectUtil.isEmpty(taskList)) { //获取终点 - String pointCode = iSchBasePointService.getPointCode(regionCode); + String pointCode = iSchBasePointService.getPointCode(regionCode,false); //创建任务 JSONObject task_form = new JSONObject(); task_form.put("task_type", "STOutTask"); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/util/UpdateIvtUtils.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/util/UpdateIvtUtils.java index 2d4a67a..f902143 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/util/UpdateIvtUtils.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/util/UpdateIvtUtils.java @@ -395,6 +395,10 @@ public class UpdateIvtUtils { public Sectattr checkVehicleType(String sectId, String vehicleCode) { //查询载具 MdPbStoragevehicleinfo mdPbStoragevehicleinfo = iMdPbStoragevehicleinfoService.getOne(new QueryWrapper().lambda().eq(MdPbStoragevehicleinfo::getStoragevehicle_code, vehicleCode)); + if (ObjectUtil.isEmpty(mdPbStoragevehicleinfo)) { + log.error("载具【" + vehicleCode + "】不存在!"); + throw new BadRequestException("载具【" + vehicleCode + "】不存在!"); + } String vehicleType = mdPbStoragevehicleinfo.getStoragevehicle_type(); // 查询库区 Sectattr sectDao = iSectattrService.getById(sectId); diff --git a/nladmin-ui/package.json b/nladmin-ui/package.json index 6123943..edbf39d 100644 --- a/nladmin-ui/package.json +++ b/nladmin-ui/package.json @@ -5,9 +5,8 @@ "author": "Zheng Jie", "license": "Apache-2.0", "scripts": { - "dev": "vue-cli-service serve", - "dev1": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve", - "dev_mac": "export NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve", + "dev": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve", + "build": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build", "build:prod": "vue-cli-service build", "build:stage": "vue-cli-service build --mode staging", "preview": "node build/index.js --preview", diff --git a/nladmin-ui/src/views/wms/basedata/storagevehicleinfo/index.vue b/nladmin-ui/src/views/wms/basedata/storagevehicleinfo/index.vue index 6ee103d..2b0e202 100644 --- a/nladmin-ui/src/views/wms/basedata/storagevehicleinfo/index.vue +++ b/nladmin-ui/src/views/wms/basedata/storagevehicleinfo/index.vue @@ -31,7 +31,7 @@ - + - - 打印 - + + + + + + + + + + - - + + - + - + - + - + - +