Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/common/CssdUtils.java =================================================================== diff -u -r40945 -r41258 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/common/CssdUtils.java (.../CssdUtils.java) (revision 40945) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/common/CssdUtils.java (.../CssdUtils.java) (revision 41258) @@ -158,7 +158,7 @@ String sp = null; int startIndex = materialName.lastIndexOf("["); int endIndex = materialName.lastIndexOf("]"); - if (startIndex != -1 && endIndex != -1 && startIndex < endIndex) { + if (startIndex != -1 && endIndex != -1 && startIndex < endIndex && materialName.endsWith("]")) { name = materialName.substring(0, startIndex); sp = materialName.substring(startIndex + 1, materialName.length() - 1); Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/LaoKenThirdPartyTousseReceiveRecordManagerImpl.java =================================================================== diff -u -r40649 -r41258 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/LaoKenThirdPartyTousseReceiveRecordManagerImpl.java (.../LaoKenThirdPartyTousseReceiveRecordManagerImpl.java) (revision 40649) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/LaoKenThirdPartyTousseReceiveRecordManagerImpl.java (.../LaoKenThirdPartyTousseReceiveRecordManagerImpl.java) (revision 41258) @@ -1264,10 +1264,10 @@ } JSONArray materialArray = new JSONArray(); for (MaterialInstanceVo materialInstanceVo : materialInstanceVos) { - String itemName = materialInstanceVo.getMaterialName(); - MaterialDefinition md = materialDefinitionMap.get(itemName); + String showName = materialInstanceVo.getShowName(); + MaterialDefinition md = materialDefinitionMap.get(showName); if(md == null){ - throw new RuntimeException(String.format("不存在名称为%s的材料定义!", itemName)); + throw new RuntimeException(String.format("不存在名称为%s的材料定义!", showName)); } JSONObject json = new JSONObject(); json.put("name", md.getShowName()); @@ -1284,8 +1284,8 @@ /** * 创建包内材料、材料类别 * 根据材料名称关联查询材料定义: - * 如果存在同名且规格为空的材料定义,就判断是否需要修改是否为植入物、材料定义的类别,并记录材料定义的修改记录; - * 如果不存同名且规格为空的材料定义,就创建新的材料定义,并记录材料定义的创建记录; + * 如果存在同名同规格的材料定义,就判断是否需要修改是否为植入物、材料定义的类别,并记录材料定义的修改记录; + * 如果不存同名同规格的材料定义,就创建新的材料定义,并记录材料定义的创建记录; * @param thirdPartyTousseReceiveRecordVo */ private Map buildMaterialDefinition(ThirdPartyTousseReceiveRecordVo thirdPartyTousseReceiveRecordVo) { @@ -1313,18 +1313,26 @@ && !typeNameList.contains(materialInstanceVo.getItemTypeName())){ typeNameList.add(materialInstanceVo.getItemTypeName()); } + //【第三方器械包管理】当接收的器械包的包内材料名称(字段ItemName)包含[]符号时拆分为名称(材料定义id)+规格分开保存GZSLWQGSKY-20 + String itemName = materialInstanceVo.getItemName(); + JSONObject materialobj = CssdUtils.getGoodsNameAndSp(itemName); + String goodsName = materialobj.optString("materialName"); + String specification = materialobj.optString("specification"); + materialInstanceVo.setMaterialName(goodsName); //GZSLWQGSKY-3 第三方器械包接收创建材料定义时,材料名称后增加(组件器械id) - materialInstanceVo.setMaterialName(materialInstanceVo.getItemName()); - if(StringUtils.isNotBlank(materialInstanceVo.getItemName()) && materialInstanceVo.getItemDefinitionId() != null){ - materialInstanceVo.setMaterialName(materialInstanceVo.getItemName() + "(" + materialInstanceVo.getItemDefinitionId() + ")"); + if(StringUtils.isNotBlank(goodsName) && materialInstanceVo.getItemDefinitionId() != null){ + materialInstanceVo.setMaterialName(goodsName + "(" + materialInstanceVo.getItemDefinitionId() + ")"); } + materialInstanceVo.setSpecification(specification); } } //材料类型 saveMaterialTypeHttpOption(typeNameList); - //只查询规格为空的材料定义 + //材料名称-材料定义map Map nameMaterialDefinitionMap = getNameMaterialDefinitionMap(thirdPartyTousseInstances); + //第三方id-材料定义map + Map thirdPartyIdMaterialDefinitionMap = getThirdPartyDefinitionIdMaterialDefinitionMap(thirdPartyTousseInstances); //新建材料定义的日志 List saveLogs = new ArrayList(); @@ -1333,13 +1341,21 @@ for (ThirdPartyTousseInstanceVo thirdPartyTousseInstanceVo : thirdPartyTousseInstances) { List materialInstanceVos = thirdPartyTousseInstanceVo.getMaterialInstanceVos(); for (MaterialInstanceVo materialInstanceVo : materialInstanceVos) { - MaterialDefinition materialDefinition = getDBMaterialDefinition(thirdPartyTousseInstanceVo, materialInstanceVo, nameMaterialDefinitionMap); + MaterialDefinition materialDefinition = getDBMaterialDefinition(thirdPartyTousseInstanceVo, materialInstanceVo, thirdPartyIdMaterialDefinitionMap, nameMaterialDefinitionMap); String goodsName = materialInstanceVo.getMaterialName(); + //前端页面由=有加限制,后端代码也保持一致 + if(StringUtils.contains(goodsName, "[") || StringUtils.contains(goodsName, "'")){ + throw new RuntimeException("物品名称不能包含特殊字符!"); + } + String specification = materialInstanceVo.getSpecification(); + if(StringUtils.contains(specification, "[") || StringUtils.contains(specification, "'")){ + throw new RuntimeException("物品规格都不能包含特殊字符!"); + } String isImplant = getIsImplant(materialInstanceVo.getItemTypeId()); if(materialDefinition == null){ materialDefinition = new MaterialDefinition(); materialDefinition.setName(goodsName); - materialDefinition.setSpecification(null); + materialDefinition.setSpecification(specification); materialDefinition.setSpelling(GB2Alpha.string2Alpha(goodsName)); materialDefinition.setWbCode(GB2WB.getWBCode(goodsName)); materialDefinition.setType(materialInstanceVo.getItemTypeName()); @@ -1354,16 +1370,21 @@ materialDefinition.setChineseMedicineInstr(Constants.STR_NO); materialDefinition.setDetachable(Constants.STR_NO); //新建材料定义的日志 - String saveLog = String.format("第三方器械包接收后创建材料定义,名称为“%s”,组件器械ID为“%s”。", goodsName, materialInstanceVo.getItemDefinitionId()); + String saveLog = String.format("第三方器械包接收后创建材料定义,名称为“%s”,组件器械ID为“%s”。", materialInstanceVo.getShowName(), materialInstanceVo.getItemDefinitionId()); saveLogs.add(saveLog); }else{ //修改材料定义的日志 StringBuffer modifyContent = new StringBuffer(""); //名称 if(!StringUtils.equals(goodsName, materialDefinition.getName())){ - materialDefinition.setName(goodsName); modifyContent.append("name属性修改前=").append(materialDefinition.getName()).append(",修改后=").append(goodsName).append(";"); + materialDefinition.setName(goodsName); } + //规格 + if(!StringUtils.equals(specification, materialDefinition.getSpecification())){ + modifyContent.append("specification属性修改前=").append(materialDefinition.getSpecification()).append(",修改后=").append(specification).append(";"); + materialDefinition.setSpecification(specification); + } //是否植入物 if(!StringUtils.equals(isImplant, materialDefinition.getIsImplant())){ modifyContent.append("isImplant属性修改前=").append(materialDefinition.getIsImplant()).append(",修改后=").append(isImplant).append(";"); @@ -1375,12 +1396,12 @@ materialDefinition.setType(materialInstanceVo.getItemTypeName()); } if(StringUtils.isNotBlank(modifyContent.toString())){ - updateLogs.add(modifyContent.toString()); + updateLogs.add("第三方器械包接收后修改材料定义:" + modifyContent.toString()); } } materialDefinition.setThirdPartyDefinitionId(materialInstanceVo.getItemDefinitionId()); materialDefinitionManager.save(materialDefinition); - nameMaterialDefinitionMap.put(materialDefinition.getName(), materialDefinition); + nameMaterialDefinitionMap.put(materialDefinition.getShowName(), materialDefinition); } } appLogManager.batchSaveLog(AcegiHelper.getLoginUser(), Log.MODEL_MATERIALDEFINITION, Log.TYPE_ADD, saveLogs); @@ -1390,19 +1411,30 @@ /** * 先根据第三方材料定义id匹配,匹配不到再根据材料名称匹配 - * @param thirdPartyDefinitionIdMaterialDefinitionMap - * @param nameMaterialDefinitionMap - * @return + * @param thirdPartyTousseInstanceVo 第三方器械包实例vo + * @param materialInstanceVo 材料实例 + * @param thirdPartyIdMaterialDefinitionMap 第三方材料定义id-材料定义map + * @param nameMaterialDefinitionMap 材料名称-材料定义map + * @return 材料定义 */ private MaterialDefinition getDBMaterialDefinition(ThirdPartyTousseInstanceVo thirdPartyTousseInstanceVo, MaterialInstanceVo materialInstanceVo, - Map nameMaterialDefinitionMap) { + Map thirdPartyIdMaterialDefinitionMap, Map nameMaterialDefinitionMap) { MaterialDefinition dbMaterialDefinition = null; + + if(MapUtils.isNotEmpty(thirdPartyIdMaterialDefinitionMap)){ + dbMaterialDefinition = thirdPartyIdMaterialDefinitionMap.get(materialInstanceVo.getItemDefinitionId()); + if(dbMaterialDefinition != null){ + return dbMaterialDefinition; + } + } + if(MapUtils.isNotEmpty(nameMaterialDefinitionMap)){ - dbMaterialDefinition = nameMaterialDefinitionMap.get(materialInstanceVo.getMaterialName()); + dbMaterialDefinition = nameMaterialDefinitionMap.get(materialInstanceVo.getShowName()); if(dbMaterialDefinition != null){ Long thirdPartyDefinitionId = dbMaterialDefinition.getThirdPartyDefinitionId(); if(DatabaseUtil.isPoIdValid(thirdPartyDefinitionId) && !thirdPartyDefinitionId.equals(materialInstanceVo.getItemDefinitionId())){ - throw new SystemException(String.format("%s(%s)接收失败,已经存在名称为%s,但组件器械id不一致的材料定义!", thirdPartyTousseInstanceVo.getTousseName(), thirdPartyTousseInstanceVo.getBarcode(), materialInstanceVo.getMaterialName())); + //多个第三方器械材料名称不能重复,不允许保存 + throw new SystemException(String.format("%s(%s)接收失败,已经存在名称为%s,但组件器械id不一致的材料定义!", thirdPartyTousseInstanceVo.getTousseName(), thirdPartyTousseInstanceVo.getBarcode(), materialInstanceVo.getShowName())); } } } @@ -1420,7 +1452,7 @@ if(CollectionUtils.isEmpty(thirdPartyTousseInstances)){ return nameMaterialDefinitionMap; } - List materialNameList = new ArrayList(); + List materialDefinitionList = new ArrayList(); for (ThirdPartyTousseInstanceVo thirdPartyTousseInstanceVo : thirdPartyTousseInstances) { List materialInstanceVos = thirdPartyTousseInstanceVo.getMaterialInstanceVos(); if(CollectionUtils.isEmpty(materialInstanceVos)){ @@ -1432,25 +1464,22 @@ if(StringUtils.isBlank(materialInstanceVo.getMaterialName())){ throw new SystemException(String.format("%s(%s)接收失败,材料名称不能为空!", thirdPartyTousseInstanceVo.getTousseName(), thirdPartyTousseInstanceVo.getBarcode())); } - if(voMaterialNameList.contains(materialInstanceVo.getMaterialName())){ + if(voMaterialNameList.contains(materialInstanceVo.getShowName())){ throw new SystemException(String.format("%s(%s)接收失败,器械的包内材料存在同名材料!", thirdPartyTousseInstanceVo.getTousseName(), thirdPartyTousseInstanceVo.getBarcode())); } - if(!materialNameList.contains(materialInstanceVo.getMaterialName())){ - materialNameList.add(materialInstanceVo.getMaterialName()); + voMaterialNameList.add(materialInstanceVo.getShowName()); + + MaterialDefinition materialDefinition = materialDefinitionManager.getMaterialDefinitionByName(materialInstanceVo.getMaterialName(), materialInstanceVo.getSpecification()); + if(materialDefinition != null){ + materialDefinitionList.add(materialDefinition); } - voMaterialNameList.add(materialInstanceVo.getMaterialName()); } } - if(CollectionUtils.isEmpty(materialNameList)){ - return nameMaterialDefinitionMap; - } - - List materialDefinitionList = materialDefinitionManager.getCollection("name", materialNameList); if(CollectionUtils.isNotEmpty(materialDefinitionList)){ for (MaterialDefinition materialDefinition : materialDefinitionList) { if(StringUtils.isBlank(materialDefinition.getSpecification())){ - nameMaterialDefinitionMap.put(materialDefinition.getName(), materialDefinition); + nameMaterialDefinitionMap.put(materialDefinition.getShowName(), materialDefinition); } } } @@ -1583,7 +1612,7 @@ repBuffer.append(" 'ItemTypeId': 147,"); repBuffer.append(" 'ProducedDate': '2024/12/30 22:55',"); repBuffer.append(" 'SterilizeDate': '2024/12/30 20:14',"); - repBuffer.append(" 'SubTurnaroundID': '2025021700_02',"); + repBuffer.append(" 'SubTurnaroundID': '2025021700_21',"); //第三方器械包条码 repBuffer.append(" 'TurnaroundID': '2025021700',"); repBuffer.append(" 'ValidUseBeforeDate': '2025/06/28 20:14',"); @@ -1592,15 +1621,15 @@ repBuffer.append(" 'ItemBaseTypeName': '可重复使用组件',"); //第三方材料定义id repBuffer.append(" 'ItemDefinitionId': 20011550,"); - repBuffer.append(" 'ItemName': '骨膜剥离子 ',"); + repBuffer.append(" 'ItemName': '骨膜剥离子 [规格1]',"); repBuffer.append(" 'ItemTypeId': 110,"); repBuffer.append(" 'ItemTypeName': '器械',"); repBuffer.append(" 'OrderIndex': 1,"); repBuffer.append(" 'Qty': 1"); repBuffer.append(" }],"); repBuffer.append(" 'Customer': '中山市口腔医院',"); - repBuffer.append(" 'DeliverPoint': '口腔种植修复中心ZO4',"); - repBuffer.append(" 'DeliverPointId': 477,"); + repBuffer.append(" 'DeliverPoint': '聚焦刀护理单元',"); + repBuffer.append(" 'DeliverPointId': 4009H,"); repBuffer.append(" 'Events': [{"); repBuffer.append(" 'Date': '2024/12/30 15:36',"); repBuffer.append(" 'EventName': '清洗',"); Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/vo/MaterialInstanceVo.java =================================================================== diff -u -r39517 -r41258 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/vo/MaterialInstanceVo.java (.../MaterialInstanceVo.java) (revision 39517) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/vo/MaterialInstanceVo.java (.../MaterialInstanceVo.java) (revision 41258) @@ -1,5 +1,7 @@ package com.forgon.disinfectsystem.tousse.toussedefinition.vo; +import org.apache.commons.lang.StringUtils; + /** * 材料明细vo */ @@ -11,7 +13,7 @@ private Long itemDefinitionId; /** - * 组件器械名称 + * 组件器械名称,如果带规格,则为:名称[规格] */ private String itemName; @@ -21,6 +23,11 @@ private String materialName; /** + * 材料规格,从itemName拆分而来 + */ + private String specification; + + /** * 组件器械类型ID */ private Long itemTypeId; @@ -83,6 +90,14 @@ this.materialName = materialName; } + public String getSpecification() { + return specification; + } + + public void setSpecification(String specification) { + this.specification = specification; + } + public Integer getOrderIndex() { return orderIndex; } @@ -98,5 +113,12 @@ public void setQty(Integer qty) { this.qty = qty; } + + public String getShowName() { + if(StringUtils.isBlank(specification)){ + return materialName; + } + return String.format("%s[%s]", materialName, specification); + } }