Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentinstance/service/InstrumentInstanceManagerImpl.java =================================================================== diff -u -r35267 -r35287 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentinstance/service/InstrumentInstanceManagerImpl.java (.../InstrumentInstanceManagerImpl.java) (revision 35267) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentinstance/service/InstrumentInstanceManagerImpl.java (.../InstrumentInstanceManagerImpl.java) (revision 35287) @@ -27,6 +27,7 @@ import org.springframework.jdbc.core.JdbcTemplate; import com.forgon.Constants; +import com.forgon.databaseadapter.service.DateQueryAdapter; import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.model.BarcodeDevice; import com.forgon.directory.model.OrgUnit; @@ -62,6 +63,7 @@ import com.forgon.exception.SystemException; import com.forgon.tools.MathTools; import com.forgon.tools.Tools; +import com.forgon.tools.date.DateTools; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.db.InitDbConnection; import com.forgon.tools.hibernate.BasePoManagerImpl; @@ -79,6 +81,12 @@ private WareHouseManager wareHouseManager; + private DateQueryAdapter dateQueryAdapter; + + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + this.dateQueryAdapter = dateQueryAdapter; + } + public void setDbConnection(InitDbConnection dbConnection) { this.dbConnection = dbConnection; } @@ -1363,7 +1371,7 @@ throw new SystemException("器械实例无效"); } - String sql = String.format("select md.id materialDefinitionId, md.name materialDefinitionName, md.specification, md.inventorySerialNumber, " + String sql = String.format("select ii.id instrumentInstanceId, md.id materialDefinitionId, md.name materialDefinitionName, md.specification, md.inventorySerialNumber, " + "ii.udi, ii.instrumentBarcode, ii.productionDate, ii.productionSerialNumber, ii.registUser, " + "mei.cost materialEntryCost, me.time materialEntryTime, me.operator materialEntryUser " + "from InstrumentInstance ii " @@ -1378,6 +1386,7 @@ rs = objectDao.executeSql(sql); while(rs.next()){ vo = new InstrumentInstanceVo(); + vo.setId(rs.getLong("instrumentInstanceId")); vo.setMaterialDefinitionId(rs.getLong("materialDefinitionId")); vo.setMaterialDefinitionName(rs.getString("materialDefinitionName")); vo.setSpecification(rs.getString("specification")); @@ -1411,7 +1420,7 @@ averageCost = MathTools.div(vo.getMaterialEntryCost(), useAmount).doubleValue(); } vo.setAverageCost(String.format("%.4f", averageCost)); - //月使用率 + //月使用率:月使用率 = (月使用次数/工作天系数) String monthUseRate = getInstrumentInstanceVoMonthUseRate(vo); vo.setMonthUseRate(monthUseRate); } @@ -1421,7 +1430,7 @@ /** * 计算每个月该器械的使用频率; - * 根据使用次数和工作天系数计算,公式为:月使用率 = (使用次数/工作天系数)*100%; + * 根据使用次数和工作天系数计算,公式为:月使用率 = (月使用次数/工作天系数)*100%; * 工作天系数默认为22天,代表每个月有22天是工作天,需要支持配置 * @param instrumentInstanceVo * @return @@ -1438,12 +1447,45 @@ || supplyRoomConfig.getInstrumentUseRateWorkingDay() <= 0){ return ""; } - double useRate = MathTools.div(instrumentInstanceVo.getUseAmount(), supplyRoomConfig.getInstrumentUseRateWorkingDay(), 4).doubleValue(); - String useRateStr = useRate * 100 + "%"; + //月使用次数计算按照每个自然月的周期内的使用次数来统计; + Integer monthUseAmount = getInstrumentInstanceVoMonthUseAmount(instrumentInstanceVo.getId()); + //月使用率 = (月使用次数/工作天系数)使用率的的小数点保留到后2位,超出后按照“四舍五入”原则计算; + double useRate = MathTools.div(monthUseAmount*100, supplyRoomConfig.getInstrumentUseRateWorkingDay(), 2).doubleValue(); + String useRateStr = useRate + "%"; return useRateStr; } /** + * 月使用次数计算按照每个自然月的周期内的使用次数来统计; + * @param instrumentInstanceId + * @return + */ + private Integer getInstrumentInstanceVoMonthUseAmount(Long instrumentInstanceId) { + if(!DatabaseUtil.isPoIdValid(instrumentInstanceId)){ + return 0; + } + + //当前月开始时间 + String firstDayOfMonth = DateTools.getFirstDayOfMonth() + " 00:00:00"; + //当前时间 + String currentDay = DateTools.getCurrentDayByFormat(DateTools.COMMON_DATE_HMS); + + //发货时间查询条件 + String sendTimeSql = dateQueryAdapter.dateAreaSql("i.sendTime", firstDayOfMonth, currentDay); + + String sql = String.format("select count(ici.id) from %s ici " + + "join %s i on ici.invoiceId = i.id " + + "where ici.instrumentInstanceId = %s and %s ", + InstrumentCycleInstance.class.getSimpleName(), + Invoice.class.getSimpleName(), + instrumentInstanceId, + sendTimeSql + ); + + return objectDao.countBySql(sql); + } + + /** * 从入库时间开始算起,截止到当天的天数; * @param instrumentInstance * @return