Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentrepair/service/InstrumentRepairManagerImpl.java =================================================================== diff -u -r41074 -r41572 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentrepair/service/InstrumentRepairManagerImpl.java (.../InstrumentRepairManagerImpl.java) (revision 41074) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentrepair/service/InstrumentRepairManagerImpl.java (.../InstrumentRepairManagerImpl.java) (revision 41572) @@ -105,6 +105,12 @@ instrumentRepairGoodsList = new Gson().fromJson(tousseMaterialInfos, new TypeToken>(){}.getType()); if(CollectionUtils.isNotEmpty(instrumentRepairGoodsList)){ for (InstrumentRepairGoods instrumentRepairGoods : instrumentRepairGoodsList) { + if(!DatabaseUtil.isPoIdValid(instrumentRepairGoods.getDeviceTypeHttpOptionId())){ + instrumentRepairGoods.setDeviceTypeHttpOptionId(null); + } + if(!DatabaseUtil.isPoIdValid(instrumentRepairGoods.getFaultLocationHttpOptionId())){ + instrumentRepairGoods.setFaultLocationHttpOptionId(null); + } instrumentRepairGoods.setInstrumentRepair(instrumentRepair); } } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/action/MaterialDefinitionAction.java =================================================================== diff -u -r39008 -r41572 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/action/MaterialDefinitionAction.java (.../MaterialDefinitionAction.java) (revision 39008) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/action/MaterialDefinitionAction.java (.../MaterialDefinitionAction.java) (revision 41572) @@ -764,6 +764,8 @@ } String tousseDefinitionId = StrutsParamUtils.getPraramValue( "tousseDefinitionId", ""); + String queryInstrumentBarcode = StrutsParamUtils.getPraramValue( + "queryInstrumentBarcode", ""); String selectType = StrutsParamUtils .getPraramValue("selectType", "all"); //是否需要盘点 @@ -775,7 +777,15 @@ } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } - if (StringUtils.isBlank(tousseDefinitionId)) { + if ("true".equals(queryInstrumentBarcode)){ + try { + jsonStr = materialInstanceManager + .getMdAndInstrumentInstanceDataIncludeForeignMD( + tousseDefinitionId, spell, selectType); + } catch (SQLException e) { + e.printStackTrace(); + } + }else if(StringUtils.isBlank(tousseDefinitionId)) { jsonStr = materialDefinitionManager .searchMaterialDefinitionAndForeignMDAndDiposableGoods(spell, selectType,canInventory).toString(); Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialinstance/service/MaterialInstanceManagerImpl.java =================================================================== diff -u -r38748 -r41572 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialinstance/service/MaterialInstanceManagerImpl.java (.../MaterialInstanceManagerImpl.java) (revision 38748) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialinstance/service/MaterialInstanceManagerImpl.java (.../MaterialInstanceManagerImpl.java) (revision 41572) @@ -4,28 +4,36 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import net.sf.json.JSONObject; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Predicate; import org.apache.commons.lang.StringUtils; +import com.forgon.directory.model.BarcodeDevice; import com.forgon.disinfectsystem.common.CssdUtils; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.basedatamanager.instrumentinstance.InstrumentInstance; import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.idcarddefinition.IDCardDefinition; +import com.forgon.disinfectsystem.entity.idcardinstance.IDCardInstance; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.db.InitDbConnection; import com.forgon.tools.hibernate.BasePoManagerImpl; +import com.forgon.tools.util.SqlUtils; public class MaterialInstanceManagerImpl extends BasePoManagerImpl implements MaterialInstanceManager { @@ -97,8 +105,153 @@ map.put("data", mapList); return JSONObject.fromObject(map).toString(); } + @Override + public String getMdAndInstrumentInstanceDataIncludeForeignMD( + String tousseDefinitionId, String simpleSpell, String selectType) throws SQLException { + List> mapList = new ArrayList>(); + if ("all".equals(selectType) || "material".equals(selectType)) { + mapList.addAll(searchMaterialInstanceOrDiposableGoodsInstance( + tousseDefinitionId, simpleSpell, true));// 再生材料 + } + if ("all".equals(selectType) || "diposable".equals(selectType)) { + mapList.addAll(searchMaterialInstanceOrDiposableGoodsInstance( + tousseDefinitionId, simpleSpell, false));// 一次性材料 + } + + Map map = new HashMap(); + //批量获取条码数据 + List> processedList = processDataWithBarcodes(mapList, tousseDefinitionId); + map.put("data", processedList); + map.put("totalCount", processedList.size()); + return JSONObject.fromObject(map).toString(); + } /** + * 批量处理数据并关联条码 + * @param mapList 原列表 + * @param tousseDefinitionId 包定义id + * @return + */ + private List> processDataWithBarcodes(List> mapList, + String tousseDefinitionId) { + if (CollectionUtils.isEmpty(mapList) || !DatabaseUtil.isPoIdValid(tousseDefinitionId)) { + return mapList != null ? mapList : new ArrayList<>(); + } + + List> newMapList = new ArrayList<>(); + + // 批量获取所有需要的条码数据 + Map> barcodesCache = batchFetchBarcodes(mapList, tousseDefinitionId); + + // 处理每条数据 如果一种材料有数量5 其他查到3个条码 那么需要4条数据 3条有条码的 1条没有条码的 + for (Map temp : mapList) { + temp.remove("id");//去掉id这个键 前端用返回数据是下拉框 id可能一样是 会被控件排重 + Long materialDefinitionId = extractMaterialDefinitionId(temp); + if (materialDefinitionId == null) { + newMapList.add(new HashMap<>(temp)); + continue; + } + + List barcodes = barcodesCache.get(materialDefinitionId); + if (CollectionUtils.isEmpty(barcodes)) { + newMapList.add(new HashMap<>(temp)); + continue; + } + + // 根据条码数量处理数据 + processItemWithBarcodes(temp, barcodes, newMapList); + } + + return newMapList; + } + + /** + * 提取materialDefinitionId + */ + private Long extractMaterialDefinitionId(Map item) { + Object materialDefinitionIdObj = item.get("materialDefintionId"); // 注意:原代码是"materialDefintionId",可能是拼写错误 + if (materialDefinitionIdObj instanceof Number) { + return ((Number) materialDefinitionIdObj).longValue(); + } + return null; + } + + /** + * 批量获取条码数据(优化性能,减少数据库查询次数) + */ + private Map> batchFetchBarcodes(List> mapList, + String tousseDefinitionId) { + Set materialDefinitionIds = mapList.stream() + .map(this::extractMaterialDefinitionId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + if (materialDefinitionIds.isEmpty()) { + return Collections.emptyMap(); + } + + // 构建IN查询 + String sql = buildBatchBarcodeSql(materialDefinitionIds, tousseDefinitionId); + + Map> result = new HashMap<>(); + try (ResultSet rs = objectDao.executeSql(sql)) { + while (rs.next()) { + Long materialDefinitionId = rs.getLong("materialDefinitionId"); + String instrumentBarcode = rs.getString("instrumentBarcode"); + + if (StringUtils.isNotBlank(instrumentBarcode)) { + result.computeIfAbsent(materialDefinitionId, k -> new ArrayList<>()) + .add(instrumentBarcode); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + return result; + } + + /** + * 构建批量查询SQL + */ + private String buildBatchBarcodeSql(Set materialDefinitionIds, String tousseDefinitionId) { + return "SELECT ii.materialDefinitionId, ii.instrumentBarcode " + + "FROM " + InstrumentInstance.class.getSimpleName() + " ii " + + "JOIN " + IDCardInstance.class.getSimpleName() + " ici ON ici.id = ii.idCardInstanceId " + + "JOIN " + BarcodeDevice.class.getSimpleName() + " bd ON bd.id = ici.id " + + "JOIN " + IDCardDefinition.class.getSimpleName() + " icd ON icd.id = ici.idCardDefinitionID " + + "JOIN " + TousseDefinition.class.getSimpleName() + " td ON td.id = icd.tousseDefinitionID " + + "WHERE ii.instrumentBarcode IS NOT NULL " + + "AND icd.tousseDefinitionID = " + tousseDefinitionId + + SqlUtils.getInLongListSql("ii.materialDefinitionId", materialDefinitionIds) + + "ORDER BY ii.instrumentBarcode ASC"; + } + + /** + * 处理单个item的条码数据 + */ + private void processItemWithBarcodes(Map item, + List barcodes, + List> resultList) { + String name = (String) item.get("name"); + int count = ((Number) item.get("count")).intValue(); + + // 如果count大于条码数量,添加一个无条码的记录 + if (count > barcodes.size()) { + Map newItem = new HashMap<>(item); + newItem.put("nameAndBarcode", name); + resultList.add(newItem); + } + + // 为每个条码创建一条记录 + for (String barcode : barcodes) { + Map newItem = new HashMap<>(item); + newItem.put("nameAndBarcode", String.format("%s(%s)", name, barcode)); + newItem.put("instrumentBarcode", barcode); + resultList.add(newItem); + } + } + /** * 重载 searchMaterialInstanceByTousseDefinitionIdAndSpell( String * tousseDefinitionId, String simpleSpell) 方法 根据拼音码、五笔码获取再生材料或一次性材料 */ @@ -160,6 +313,7 @@ materialDefintionId = md.getId(); } temp.put("id", materialDefintionId); + temp.put("materialDefintionId", materialDefintionId); temp.put("materialInstanceId", materialInstance.getId()); temp.put("name", materialName); temp.put("count", materialInstance.getCount()); Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialinstance/service/MaterialInstanceManager.java =================================================================== diff -u -r29886 -r41572 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialinstance/service/MaterialInstanceManager.java (.../MaterialInstanceManager.java) (revision 29886) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialinstance/service/MaterialInstanceManager.java (.../MaterialInstanceManager.java) (revision 41572) @@ -31,7 +31,16 @@ public String searchMaterialInstanceByTousseDefinitionIdAndSpell( String tousseDefinitionId, String simpleSpell, String selectType , String canInventory) throws SQLException; - + /** + * 搜索材料数据 包含器械条码 + * 例如如果有药杯3个 有两个器械条码 会返回3个药杯数据 两个名称为药杯(器械条码) + * @param tousseDefinitionId + * @param simpleSpell + * @param selectType + * @return + * @throws SQLException + */ + public String getMdAndInstrumentInstanceDataIncludeForeignMD(String tousseDefinitionId, String simpleSpell, String selectType) throws SQLException; public JSONObject searchMaterialInstanceOrDiposableGoodsInstanceByTousseDefinitionIdAndSpell( String tousseDefinitionId, String simpleSpell, boolean isSeachMaterialInstance) throws SQLException;