Index: ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/tousse/service/IDCardInstanceBindInstrumentManagerImpl.java =================================================================== diff -u -r34702 -r34709 --- ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/tousse/service/IDCardInstanceBindInstrumentManagerImpl.java (.../IDCardInstanceBindInstrumentManagerImpl.java) (revision 34702) +++ ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/tousse/service/IDCardInstanceBindInstrumentManagerImpl.java (.../IDCardInstanceBindInstrumentManagerImpl.java) (revision 34709) @@ -97,21 +97,25 @@ throw new SystemException("器械实例已经绑定其它标识牌实例"); } + //查询标识牌材料数量明细 + Map materialAmountMap = getIDCardInstanceMaterialAmountMap(iDCardInstance); //判断标识牌实例关联的器械包定义是否包含器械实例对应的材料定义 - String sql = String.format("select count(*) from %s ici " - + "join %s icd on icd.id = ici.idCardDefinitionID " - + "join %s td on td.id = icd.tousseDefinitionID " - + "join %s mi on mi.tousse_id = td.id " - + "where ici.id = %s and mi.materialDefinition_id = %s ", - IDCardInstance.class.getSimpleName(), - IDCardDefinition.class.getSimpleName(), - TousseDefinition.class.getSimpleName(), - MaterialInstance.class.getSimpleName(), - iDCardInstance.getId(), instrumentInstance.getMaterialDefinitionId()); - if(objectDao.countBySql(sql) <= 0){ + if(MapUtils.isEmpty(materialAmountMap) + || materialAmountMap.get(instrumentInstance.getMaterialDefinitionId()) == null + || materialAmountMap.get(instrumentInstance.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(), + instrumentInstance.getMaterialDefinitionId()); + int bindInstrumentInstanceCount = objectDao.countBySql(instrumentInstanceCountSql); + if(bindInstrumentInstanceCount >= materialAmountMap.get(instrumentInstance.getMaterialDefinitionId())){ + throw new SystemException("器械实例不能绑定标识牌,绑定数量超过器械包实际材料数量"); + } + //保存绑定日志 saveIDCardInstanceBindLog(iDCardInstance, instrumentInstance, IDCardInstanceBindLog.operateTypeEnum.MANUAL.getValue(), bindOperateType); @@ -133,6 +137,40 @@ } /** + * 查询标识牌材料数量明细 + * @param iDCardInstance + * @return + */ + private Map getIDCardInstanceMaterialAmountMap( + IDCardInstance iDCardInstance) { + Map materialAmountMap = new HashMap(); + if(iDCardInstance == null || !DatabaseUtil.isPoIdValid(iDCardInstance.getId())){ + return materialAmountMap; + } + String sql = String.format("select mi.materialDefinition_id, mi.count " + + "from %s mi " + + "join %s icd on icd.tousseDefinitionID = mi.tousse_id " + + "where icd.id = %s", + MaterialInstance.class.getSimpleName(), + IDCardDefinition.class.getSimpleName(), + iDCardInstance.getIdCardDefinitionID()); + ResultSet rs = null; + try { + rs = objectDao.executeSql(sql); + while(rs.next()){ + Long materialDefinition_id = rs.getLong("materialDefinition_id"); + Integer count = rs.getInt("count"); + materialAmountMap.put(materialDefinition_id, count); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + return materialAmountMap; + } + + /** * 保存绑定日志 * @param iDCardInstance * @param instrumentInstance