| | |
| | | throw new CoolException("请至少输入一个查询条件:物料编码、ASN单号、跟踪码、批次或票号"); |
| | | } |
| | | |
| | | // 如果扫描物料编码且ASN单号为空,直接从物料信息表获取,不查询收货区 |
| | | if (!Cools.isEmpty(matnrCode) && Cools.isEmpty(asnCode) && Cools.isEmpty(code) |
| | | && Cools.isEmpty(batch) && Objects.isNull(fieldIndex)) { |
| | | logger.info("=== 从物料信息表查询物料信息(不查询收货区) ==="); |
| | | logger.info("查询参数 - matnrCode: {}", matnrCode); |
| | | |
| | | Matnr matnr = matnrMapper.selectOne(new LambdaQueryWrapper<Matnr>() |
| | | .eq(Matnr::getCode, matnrCode) |
| | | .eq(Matnr::getDeleted, 0) |
| | | .last("LIMIT 1")); |
| | | |
| | | if (matnr == null) { |
| | | logger.warn("物料信息表中未找到物料编码: {}", matnrCode); |
| | | return R.ok(new ArrayList<>()); |
| | | } |
| | | |
| | | // 构造一个虚拟的 WarehouseAreasItem 对象返回物料信息 |
| | | WarehouseAreasItem item = new WarehouseAreasItem(); |
| | | item.setMatnrId(matnr.getId()); |
| | | item.setMatnrCode(matnr.getCode()); |
| | | item.setMaktx(matnr.getName()); |
| | | item.setStockUnit(matnr.getStockUnit()); |
| | | item.setUnit(matnr.getUnit()); |
| | | item.setAnfme(0.0); // 数量设为0,因为不是从收货区查询的 |
| | | item.setWorkQty(0.0); |
| | | item.setQty(0.0); |
| | | |
| | | // 设置扩展字段 |
| | | Map<String, String> fields = FieldsUtils.getFields(matnr.getFieldsIndex()); |
| | | item.setExtendFields(fields); |
| | | |
| | | List<WarehouseAreasItem> resultList = new ArrayList<>(); |
| | | resultList.add(item); |
| | | |
| | | logger.info("从物料信息表返回 1 条物料数据"); |
| | | return R.ok(resultList); |
| | | } |
| | | |
| | | //TODO 后续需根据策略配置,获取组拖数据。如:混装,按批次混装等 |
| | | LambdaQueryWrapper<WarehouseAreasItem> queryWrapper = new LambdaQueryWrapper<>(); |
| | | |
| | | // 构建OR查询条件组 |
| | | // 统计有效条件数量 |
| | | int conditionCount = 0; |
| | | if (!Cools.isEmpty(code)) conditionCount++; |
| | | if (!Cools.isEmpty(batch)) conditionCount++; |
| | | if (!Objects.isNull(fieldIndex)) conditionCount++; |
| | | if (!Cools.isEmpty(matnrCode)) conditionCount++; |
| | | if (!Cools.isEmpty(asnCode)) conditionCount++; |
| | | |
| | | // 如果只有一个条件,直接使用eq;如果有多个条件,使用and包裹or条件组 |
| | | if (conditionCount == 1) { |
| | | // 单个条件,直接查询 |
| | | // 如果有ASN单号,则只查询该单号下的物料(ASN单号作为必须条件) |
| | | if (!Cools.isEmpty(asnCode)) { |
| | | // ASN单号作为必须条件 |
| | | queryWrapper.eq(WarehouseAreasItem::getAsnCode, asnCode); |
| | | |
| | | // 如果同时有物料编码,则查询该ASN单号下的该物料 |
| | | if (!Cools.isEmpty(matnrCode)) { |
| | | queryWrapper.eq(WarehouseAreasItem::getMatnrCode, matnrCode); |
| | | } |
| | | |
| | | // 如果同时有批次,则查询该ASN单号下的该批次 |
| | | if (!Cools.isEmpty(batch)) { |
| | | queryWrapper.eq(WarehouseAreasItem::getSplrBatch, batch); |
| | | } |
| | | |
| | | // 如果同时有票号,则查询该ASN单号下的该票号 |
| | | if (!Objects.isNull(fieldIndex)) { |
| | | queryWrapper.eq(WarehouseAreasItem::getFieldsIndex, fieldIndex); |
| | | } |
| | | |
| | | // 如果同时有跟踪码,则查询该ASN单号下的该跟踪码 |
| | | if (!Cools.isEmpty(code)) { |
| | | queryWrapper.eq(WarehouseAreasItem::getTrackCode, code); |
| | | } else if (!Cools.isEmpty(batch)) { |
| | | queryWrapper.eq(WarehouseAreasItem::getSplrBatch, batch); |
| | | } else if (!Objects.isNull(fieldIndex)) { |
| | | queryWrapper.eq(WarehouseAreasItem::getFieldsIndex, fieldIndex); |
| | | } else if (!Cools.isEmpty(matnrCode)) { |
| | | queryWrapper.eq(WarehouseAreasItem::getMatnrCode, matnrCode); |
| | | } else if (!Cools.isEmpty(asnCode)) { |
| | | queryWrapper.eq(WarehouseAreasItem::getAsnCode, asnCode); |
| | | } |
| | | } else { |
| | | // 多个条件,使用OR连接 |
| | | queryWrapper.and(wrapper -> { |
| | | boolean first = true; |
| | | // 没有ASN单号时,可以扫描任意物料组托,使用OR连接多个条件 |
| | | // 统计有效条件数量 |
| | | int conditionCount = 0; |
| | | if (!Cools.isEmpty(code)) conditionCount++; |
| | | if (!Cools.isEmpty(batch)) conditionCount++; |
| | | if (!Objects.isNull(fieldIndex)) conditionCount++; |
| | | if (!Cools.isEmpty(matnrCode)) conditionCount++; |
| | | |
| | | // 如果只有一个条件,直接使用eq |
| | | if (conditionCount == 1) { |
| | | if (!Cools.isEmpty(code)) { |
| | | wrapper.eq(WarehouseAreasItem::getTrackCode, code); |
| | | first = false; |
| | | queryWrapper.eq(WarehouseAreasItem::getTrackCode, code); |
| | | } else if (!Cools.isEmpty(batch)) { |
| | | queryWrapper.eq(WarehouseAreasItem::getSplrBatch, batch); |
| | | } else if (!Objects.isNull(fieldIndex)) { |
| | | queryWrapper.eq(WarehouseAreasItem::getFieldsIndex, fieldIndex); |
| | | } else if (!Cools.isEmpty(matnrCode)) { |
| | | queryWrapper.eq(WarehouseAreasItem::getMatnrCode, matnrCode); |
| | | } |
| | | if (!Cools.isEmpty(batch)) { |
| | | if (!first) wrapper.or(); |
| | | wrapper.eq(WarehouseAreasItem::getSplrBatch, batch); |
| | | first = false; |
| | | } |
| | | if (!Objects.isNull(fieldIndex)) { |
| | | if (!first) wrapper.or(); |
| | | wrapper.eq(WarehouseAreasItem::getFieldsIndex, fieldIndex); |
| | | first = false; |
| | | } |
| | | if (!Cools.isEmpty(matnrCode)) { |
| | | if (!first) wrapper.or(); |
| | | wrapper.eq(WarehouseAreasItem::getMatnrCode, matnrCode); |
| | | first = false; |
| | | } |
| | | if (!Cools.isEmpty(asnCode)) { |
| | | if (!first) wrapper.or(); |
| | | wrapper.eq(WarehouseAreasItem::getAsnCode, asnCode); |
| | | } |
| | | }); |
| | | } else if (conditionCount > 1) { |
| | | // 多个条件,使用OR连接 |
| | | queryWrapper.and(wrapper -> { |
| | | boolean first = true; |
| | | if (!Cools.isEmpty(code)) { |
| | | wrapper.eq(WarehouseAreasItem::getTrackCode, code); |
| | | first = false; |
| | | } |
| | | if (!Cools.isEmpty(batch)) { |
| | | if (!first) wrapper.or(); |
| | | wrapper.eq(WarehouseAreasItem::getSplrBatch, batch); |
| | | first = false; |
| | | } |
| | | if (!Objects.isNull(fieldIndex)) { |
| | | if (!first) wrapper.or(); |
| | | wrapper.eq(WarehouseAreasItem::getFieldsIndex, fieldIndex); |
| | | first = false; |
| | | } |
| | | if (!Cools.isEmpty(matnrCode)) { |
| | | if (!first) wrapper.or(); |
| | | wrapper.eq(WarehouseAreasItem::getMatnrCode, matnrCode); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | |
| | | // 打印查询参数到控制台 |
| | |
| | | logger.warn("数据库查询结果为空,可能原因:1.物料编码不匹配 2.物料未收货至收货区 3.数据已被删除"); |
| | | } |
| | | |
| | | // 如果扫描物料编码加载物料并且ASN单号为空时,从物料信息表获取物料信息并更新 |
| | | if (!Cools.isEmpty(matnrCode) && Cools.isEmpty(asnCode) && !list.isEmpty()) { |
| | | // 收集所有唯一的物料编码 |
| | | Set<String> matnrCodes = list.stream() |
| | | .map(WarehouseAreasItem::getMatnrCode) |
| | | .filter(matCode -> !Cools.isEmpty(matCode)) |
| | | .collect(Collectors.toSet()); |
| | | |
| | | // 批量查询物料信息 |
| | | if (!matnrCodes.isEmpty()) { |
| | | Map<String, Matnr> matnrMap = new HashMap<>(); |
| | | for (String matCode : matnrCodes) { |
| | | Matnr matnr = matnrMapper.selectOne(new LambdaQueryWrapper<Matnr>() |
| | | .eq(Matnr::getCode, matCode) |
| | | .eq(Matnr::getDeleted, 0) |
| | | .last("LIMIT 1")); |
| | | if (matnr != null) { |
| | | matnrMap.put(matCode, matnr); |
| | | } |
| | | } |
| | | |
| | | // 更新列表中的物料信息 |
| | | list.forEach(item -> { |
| | | String itemMatnrCode = item.getMatnrCode(); |
| | | if (!Cools.isEmpty(itemMatnrCode) && matnrMap.containsKey(itemMatnrCode)) { |
| | | Matnr matnr = matnrMap.get(itemMatnrCode); |
| | | // 从物料信息表更新物料名称 |
| | | if (!Cools.isEmpty(matnr.getName())) { |
| | | item.setMaktx(matnr.getName()); |
| | | } |
| | | // 从物料信息表更新库存单位 |
| | | if (!Cools.isEmpty(matnr.getStockUnit())) { |
| | | item.setStockUnit(matnr.getStockUnit()); |
| | | } |
| | | // 从物料信息表更新单位 |
| | | if (!Cools.isEmpty(matnr.getUnit())) { |
| | | item.setUnit(matnr.getUnit()); |
| | | } |
| | | logger.debug("已从物料信息表更新物料信息 - matnrCode: {}, name: {}, stockUnit: {}", |
| | | itemMatnrCode, matnr.getName(), matnr.getStockUnit()); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | |
| | | list.forEach(item -> { |
| | | Map<String, String> fields = FieldsUtils.getFields(item.getFieldsIndex()); |
| | | item.setExtendFields(fields); |