diff --git a/src/main/java/com/gaotao/modules/autoWareHourceHaian/controller/HaiAnPdaAutoWarehouseController.java b/src/main/java/com/gaotao/modules/autoWareHourceHaian/controller/HaiAnPdaAutoWarehouseController.java index ec09e781..d60b04c2 100644 --- a/src/main/java/com/gaotao/modules/autoWareHourceHaian/controller/HaiAnPdaAutoWarehouseController.java +++ b/src/main/java/com/gaotao/modules/autoWareHourceHaian/controller/HaiAnPdaAutoWarehouseController.java @@ -622,7 +622,7 @@ public class HaiAnPdaAutoWarehouseController { /** * @author rqrq - * @Description 栈板特殊修改按区域查询全部地面站点,立库区域不使用本接口 - rqrq + * @Description 栈板特殊修改按区域查询所在位置。立库返回固定的4个手工分拣位,其它区域返回地面站点 - rqrq */ @PostMapping("/listStationsForSpecialEdit") public R listStationsForSpecialEdit(@RequestBody HaiAnPdaRequest params) { diff --git a/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/HaiAnPdaAutoWarehouseService.java b/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/HaiAnPdaAutoWarehouseService.java index 7895b7cd..e568872a 100644 --- a/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/HaiAnPdaAutoWarehouseService.java +++ b/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/HaiAnPdaAutoWarehouseService.java @@ -351,7 +351,7 @@ public interface HaiAnPdaAutoWarehouseService { /** * @author rqrq - * @Description 栈板特殊修改按区域查全部地面站点。立库区域拒绝,其它区域合并空闲、已装载、运输中、空载,供所在位置下拉 - rqrq + * @Description 栈板特殊修改按区域查所在位置。立库固定返回手工分拣4个工位,不查WCS;其它区域合并空闲、已装载、运输中、空载 - rqrq */ List listStationsForSpecialEdit(HaiAnPdaRequest request); diff --git a/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnPdaAutoWarehouseServiceImpl.java b/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnPdaAutoWarehouseServiceImpl.java index 905554f9..c8145e41 100644 --- a/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnPdaAutoWarehouseServiceImpl.java +++ b/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnPdaAutoWarehouseServiceImpl.java @@ -4160,7 +4160,7 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe /** * @author rqrq - * @Description 标记立库区域。A01所在位置用手输,其它区域改成站点下拉;比较忽略大小写,空编码不算立库 - rqrq + * @Description 标记立库区域。A01位置下拉改走固定分拣位,是否在货架仍只对立库开放;比较忽略大小写,空编码不算立库 - rqrq */ private void markStockArea(List areas) { for (HaiAnAreaOption area : areas) { @@ -4174,7 +4174,7 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe /** * @author rqrq - * @Description 栈板特殊修改查询区域全部地面站点。立库不走站点下拉;其它区域按四种状态合并,避免只剩空闲点导致当前占用站点选不中 - rqrq + * @Description 栈板特殊修改查询所在位置。立库不查WCS,固定返回手工分拣4个工位;其它区域按四种状态合并,避免只剩空闲点导致当前占用站点选不中 - rqrq */ @Override public List listStationsForSpecialEdit(HaiAnPdaRequest request) { @@ -4184,8 +4184,12 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe if (!StringUtils.hasText(areaId)) { throw new RuntimeException("所在区域不能为空"); } + // 立库位置不依赖地面点位接口。区域仍须属于当前工厂,避免把别的工厂A01分拣位写进来 - rqrq if (HaiAnAreaStaticData.STOCK_AREA.equalsIgnoreCase(areaId)) { - throw new RuntimeException("立库区域请直接输入所在位置"); + if (haiAnPdaAutoWarehouseMapper.getHaianArea(site, areaId) == null) { + throw new RuntimeException("所在区域不存在:" + areaId); + } + return buildStockAreaSortStations(); } // 区域必须属于当前工厂,并取出下级区域码再问地面点位 - rqrq HaiAnAreaOption area = haiAnPdaAutoWarehouseMapper.getHaianArea(site, areaId); @@ -4198,6 +4202,28 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe return queryAllGroundLocations(site, area.getWcsAreaCode().trim()); } + /** + * @author rqrq + * @Description 立库特殊修改的位置候选。固定手工分拣4个工位,顺序与站点常量一致,不查WCS,也不把被分拣位、自动分拣位混进来 - rqrq + */ + private List buildStockAreaSortStations() { + List rows = new ArrayList(); + for (String station : HaiAnStationStaticData.MANUAL_SORT_STATIONS) { + if (!StringUtils.hasText(station)) { + continue; + } + String locationCode = station.trim(); + HaiAnStationRow row = new HaiAnStationRow(); + row.setStationId(locationCode); + row.setStationCode(locationCode); + row.setLocationCode(locationCode); + row.setStationName(locationCode); + row.setStationArea(HaiAnAreaStaticData.STOCK_AREA); + rows.add(row); + } + return rows; + } + /** * @author rqrq * @Description 按空闲、已装载、运输中、空载四次查询地面点位并去重。某一种状态失败不丢已查到的站点;四种都失败时,联调模式回退静态点,真实模式抛错 - rqrq diff --git a/src/main/java/com/gaotao/modules/notify/service/impl/IssureNotifyServiceImpl.java b/src/main/java/com/gaotao/modules/notify/service/impl/IssureNotifyServiceImpl.java index eb28d174..f0f4749b 100644 --- a/src/main/java/com/gaotao/modules/notify/service/impl/IssureNotifyServiceImpl.java +++ b/src/main/java/com/gaotao/modules/notify/service/impl/IssureNotifyServiceImpl.java @@ -1253,48 +1253,44 @@ public class IssureNotifyServiceImpl implements IssureNotifyService { throw new RuntimeException("文件格式不正确,只支持.xls和.xlsx格式的Excel文件"); } - // 2. 读取Excel数据 - rqrq - List> excelDataList = ExcelUtil.readExcelToMapList(file); - if (excelDataList.isEmpty()) { - throw new RuntimeException("Excel文件中没有有效数据"); - } - - // 3. 遍历每行数据,查询是否在立库和可用库存 - rqrq + // 2. 用老导入同一套POI读取。跳过表头,空行跳过;不再走ExcelUtil,避免运行时缺少该类 - rqrq List resultList = new ArrayList<>(); - for (int i = 0; i < excelDataList.size(); i++) { - Map rowData = excelDataList.get(i); - int rowIndex = i + 2; // Excel行号(考虑表头) + try (InputStream is = file.getInputStream(); Workbook workbook = WorkbookFactory.create(is)) { + Sheet sheet = workbook.getSheetAt(0); + int lastRowNum = sheet.getLastRowNum(); + for (int i = 1; i <= lastRowNum; i++) { + Row row = sheet.getRow(i); + if (row == null) { + continue; + } + int rowIndex = i + 1; + // 列顺序与原报废模板一致:A物料号、B批次号、C数量。取值走老方法,后续校验仍按新逻辑 - rqrq + String partNo = StringUtils.trim(getStringCellValue(row, 0)); + String batchNoRaw = StringUtils.trim(getStringCellValue(row, 1)); + String qtyRaw = StringUtils.trim(getStringCellValue(row, 2)); + if (StringUtils.isBlank(partNo) && StringUtils.isBlank(batchNoRaw) && StringUtils.isBlank(qtyRaw)) { + continue; + } - BaoFeiImportResultVo vo = new BaoFeiImportResultVo(); + BaoFeiImportResultVo vo = new BaoFeiImportResultVo(); + if (StringUtils.isBlank(partNo)) { + throw new RuntimeException("第" + rowIndex + "行的物料号不能为空"); + } + vo.setPartNo(partNo); - // 第一列:物料号(A列,索引0)- rqrq - Object partNoObj = rowData.get("0"); - if (partNoObj == null || StringUtils.isBlank(partNoObj.toString())) { - throw new RuntimeException("第" + rowIndex + "行的物料号不能为空"); - } - String partNo = partNoObj.toString().trim(); - vo.setPartNo(partNo); - - // 第二列:批次号(B列,索引1)- rqrq - Object batchNoObj = rowData.get("1"); - String batchNo = null; - if (batchNoObj != null && StringUtils.isNotBlank(batchNoObj.toString())) { - batchNo = batchNoObj.toString().trim(); - } - vo.setBatchNo(batchNo); + String batchNo = StringUtils.isNotBlank(batchNoRaw) ? batchNoRaw : null; + vo.setBatchNo(batchNo); - // 第三列:数量(C列,索引2)- rqrq - Object qtyObj = rowData.get("2"); - BigDecimal remark = BigDecimal.ZERO; - if (qtyObj != null && StringUtils.isNotBlank(qtyObj.toString())) { - try { - remark = new BigDecimal(qtyObj.toString().trim()); - } catch (NumberFormatException e) { - // 数量格式错误,设为0 - remark = BigDecimal.ZERO; + BigDecimal remark = BigDecimal.ZERO; + if (StringUtils.isNotBlank(qtyRaw)) { + try { + remark = new BigDecimal(qtyRaw); + } catch (NumberFormatException e) { + // 数量格式错误,设为0,和原来报废导入一致 - rqrq + remark = BigDecimal.ZERO; + } } - } - vo.setRemark(remark); + vo.setRemark(remark); // 4. 查询是否在立库 - rqrq String isInWh = issureNotifyMapper.getPartIsInWh(site, partNo); @@ -1328,7 +1324,15 @@ public class IssureNotifyServiceImpl implements IssureNotifyService { // 6. 设置申请数量为可用库存 - rqrq vo.setApplyQty(availableQty); - resultList.add(vo); + resultList.add(vo); + } + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new RuntimeException("读取Excel文件失败: " + e.getMessage(), e); + } + if (resultList.isEmpty()) { + throw new RuntimeException("Excel文件中没有有效数据"); } System.out.println("报废Excel处理完成,共" + resultList.size() + "条数据 - rqrq");