Index: ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/tousse/service/IDCardInstanceBindInstrumentManagerImpl.java =================================================================== diff -u -r37872 -r37880 --- ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/tousse/service/IDCardInstanceBindInstrumentManagerImpl.java (.../IDCardInstanceBindInstrumentManagerImpl.java) (revision 37872) +++ ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/tousse/service/IDCardInstanceBindInstrumentManagerImpl.java (.../IDCardInstanceBindInstrumentManagerImpl.java) (revision 37880) @@ -44,6 +44,7 @@ import com.forgon.tools.db.InitDbConnection; import com.forgon.tools.hibernate.BasePoManagerImpl; import com.forgon.tools.json.JSONUtil; +import com.forgon.tools.util.ConfigUtils; import com.forgon.tools.util.SqlUtils; public class IDCardInstanceBindInstrumentManagerImpl extends BasePoManagerImpl implements IDCardInstanceBindInstrumentManager { @@ -125,51 +126,59 @@ throw new SystemException("器械实例已经绑定其它标识牌实例"); } + //开启这个配置项后,允许添加、替换非当前材料定义的器械实例GYEY-813 + boolean enableAllowedChangesInstrumentOfInstrumentConfig = + ConfigUtils.getSystemSetConfigByNameBool("enableAllowedChangesInstrumentOfInstrumentConfig"); + if(enableAllowedChangesInstrumentOfInstrumentConfig){ + //被替换的材料定义id + Long replaceMaterialDefinitionId = returnReplaceMaterialDefinitionId(bindOperateType, bindInstrumentInstance, replaceMaterialDefinitionIdWhenAdd, replaceInstrumentInstanceId); + //绑定了非当前材料的器械实例时,需要更新包定义的材料明细 + if(!bindInstrumentInstance.getMaterialDefinitionId().equals(replaceMaterialDefinitionId)){ + //不开启配置项时,只能添加包定义材料列表中存在的材料器械实例,绑定的器械实例数量不能大于包定义材料数量 + if(!DatabaseUtil.isPoIdValid(replaceMaterialDefinitionId)){ + throw new SystemException("被替换的材料定义id无效"); + } + + //更新包定义的材料明细 + TousseDefinition tousseDefinition = iDCardInstance.getIDCardDefinition(objectDao).getTousseDefinition(objectDao); + List IDCardDefinitions = tousseDefinition.getIDCardDefinitions(objectDao); + if(CollectionUtils.isEmpty(IDCardDefinitions)){ + throw new SystemException("该包定义没有绑定标识牌。"); + } + if(IDCardDefinitions.size() > 1){ + throw new SystemException("该包定义已经创建多个标识牌,不能更换其他种类材料,如需更换请创建新的包定义。"); + } + //新增材料后,包定义的材料明细 + String materialInstanceStr = buildMaterialDefinitionConfigResult(tousseDefinition, replaceMaterialDefinitionId, bindInstrumentInstance.getMaterialDefinitionId()); + //保存包定义 + JSONObject materialItemsLog = tousseDefinitionManager.saveTousseDefinition(tousseDefinition, materialInstanceStr, tousseDefinition.getAncestorID(), TousseDefinition.UPDATE_MATERIAL_DISPOSABLE_MODE_BOTH); + //保存日志 + if(!materialItemsLog.isEmpty()){ + StringBuffer log = new StringBuffer(String.format("器械包名称:%s,%s", + tousseDefinition.getName(),JSONUtil.optString(materialItemsLog,"materialItemsLog",""))); + log.append(JSONUtil.optString(materialItemsLog,"materialItemsLog","")); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_TOUSSEDEFINITION, Log.TYPE_UPDATE, log.toString()); + } + } + } + //查询标识牌材料数量明细 Map materialAmountMap = getIDCardInstanceMaterialAmountMap(iDCardInstance); //判断标识牌实例关联的器械包定义是否包含器械实例对应的材料定义 - if(MapUtils.isEmpty(materialAmountMap)){ - throw new SystemException("器械实例不能绑定标识牌实例,器械包定义材料明细为空"); + if(MapUtils.isEmpty(materialAmountMap) + || materialAmountMap.get(bindInstrumentInstance.getMaterialDefinitionId()) == null + || materialAmountMap.get(bindInstrumentInstance.getMaterialDefinitionId()) == 0){ + throw new SystemException("器械实例不能绑定标识牌实例,器械包定义不包含当前材料"); } - //当前材料的器械实例数量 + //查询标识牌当前材料已经绑定的器械实例数量 String instrumentInstanceCountSql = String.format("select count(*) from %s ii where ii.idCardInstanceId = %s and ii.materialDefinitionId = %s", InstrumentInstance.class.getSimpleName(), iDCardInstance.getId(), bindInstrumentInstance.getMaterialDefinitionId()); int bindInstrumentInstanceCount = objectDao.countBySql(instrumentInstanceCountSql); - - //更新包定义的材料明细 - //绑定了不存在包定义材料明细中的材料器械实例,或者绑定数量大于材料数量 - Integer materialAmount = materialAmountMap.get(bindInstrumentInstance.getMaterialDefinitionId()); - if(materialAmount == null - || (bindInstrumentInstanceCount + 1) > materialAmount){ - //被替换的材料定义id - Long replaceInstrumentInstanceMaterialDefId = returnReplaceInstrumentInstanceMaterialDefId(bindOperateType, bindInstrumentInstance, replaceMaterialDefinitionIdWhenAdd, replaceInstrumentInstanceId); - if(!DatabaseUtil.isPoIdValid(replaceInstrumentInstanceMaterialDefId)){ - throw new SystemException("被替换的材料定义id无效"); - } - - //更新包定义的材料明细 - TousseDefinition tousseDefinition = iDCardInstance.getIDCardDefinition(objectDao).getTousseDefinition(objectDao); - List IDCardDefinitions = tousseDefinition.getIDCardDefinitions(objectDao); - if(CollectionUtils.isEmpty(IDCardDefinitions)){ - throw new SystemException("该包定义没有绑定标识牌。"); - } - if(IDCardDefinitions.size() > 1){ - throw new SystemException("该包定义已经创建多个标识牌,不能更换其他种类材料,如需更换请创建新的包定义。"); - } - //新增材料后,包定义的材料明细 - String materialInstanceStr = buildMaterialDefinitionConfigResult(tousseDefinition, replaceInstrumentInstanceMaterialDefId, bindInstrumentInstance.getMaterialDefinitionId()); - //保存包定义 - JSONObject materialItemsLog = tousseDefinitionManager.saveTousseDefinition(tousseDefinition, materialInstanceStr, tousseDefinition.getAncestorID(), TousseDefinition.UPDATE_MATERIAL_DISPOSABLE_MODE_BOTH); - //保存日志 - if(!materialItemsLog.isEmpty()){ - StringBuffer log = new StringBuffer(String.format("器械包名称:%s,%s", - tousseDefinition.getName(),JSONUtil.optString(materialItemsLog,"materialItemsLog",""))); - log.append(JSONUtil.optString(materialItemsLog,"materialItemsLog","")); - appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_TOUSSEDEFINITION, Log.TYPE_UPDATE, log.toString()); - } + if(bindInstrumentInstanceCount >= materialAmountMap.get(bindInstrumentInstance.getMaterialDefinitionId())){ + throw new SystemException("器械实例不能绑定标识牌,绑定数量超过器械包实际材料数量"); } //保存绑定日志 @@ -200,7 +209,7 @@ * @param replaceInstrumentInstanceId "替换添加"时,被替换的器械实例ID * @return */ - private Long returnReplaceInstrumentInstanceMaterialDefId(String bindOperateType, InstrumentInstance bindInstrumentInstance, + private Long returnReplaceMaterialDefinitionId(String bindOperateType, InstrumentInstance bindInstrumentInstance, Long replaceMaterialDefinitionIdWhenAdd, Long replaceInstrumentInstanceId) { Long replaceInstrumentInstanceMaterialDefId = null; @@ -209,15 +218,11 @@ if(!DatabaseUtil.isPoIdValid(replaceMaterialDefinitionIdWhenAdd)){ throw new SystemException("添加替换材料时,被替换的材料定义id不能为空"); } - if(replaceMaterialDefinitionIdWhenAdd.equals(bindInstrumentInstance.getMaterialDefinitionId())){ - throw new SystemException("添加的器械为同一种材料,不需要替换"); - } replaceInstrumentInstanceMaterialDefId = replaceMaterialDefinitionIdWhenAdd; }else if(StringUtils.equals(bindOperateType, IDCardInstanceBindInstrument.bindOperateTypeEnum.REPLACEADD.getValue())){ //替换添加 if(!DatabaseUtil.isPoIdValid(replaceInstrumentInstanceId)){ - //非替换操作时,不允许绑定器械包定义材料列表中不存在的器械实例 - throw new SystemException("器械实例不能绑定标识牌实例,器械包定义不包含当前材料"); + throw new SystemException("被替换的器械实例id不能为空"); } InstrumentInstance oldInstrumentInstance = instrumentInstanceManager.get(replaceInstrumentInstanceId); if(oldInstrumentInstance == null){