Index: ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/util/TousseTournoverDaysStatisticsReportHelper.java =================================================================== diff -u --- ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/util/TousseTournoverDaysStatisticsReportHelper.java (revision 0) +++ ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/util/TousseTournoverDaysStatisticsReportHelper.java (revision 36271) @@ -0,0 +1,224 @@ +package com.forgon.disinfectsystem.jasperreports.util; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.ResultSetExtractor; +import org.springframework.stereotype.Component; + +import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.disinfectsystem.entity.basedatamanager.expirationdateinfo.ExpirationDateInfo; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; +import com.forgon.disinfectsystem.jasperreports.javabeansource.TousseTournoverDaysStatisticsReportVo; +import com.forgon.systemsetting.model.HttpOption; +import com.forgon.tools.MathTools; +import com.forgon.tools.util.SqlUtils; + +/** + * 器械包周转天数统计报表 + * XJJQZYY-118 + * + */ +@Component +public class TousseTournoverDaysStatisticsReportHelper { + @Autowired + private DateQueryAdapter dateQueryAdapter; + @Autowired + private JdbcTemplate jdbcTemplate; + + /** + * 获取器械包周转天数统计报表数据 + * @param requestParameters 请求参数 + * @param parametMap 报表参数 + * @return + */ + public List getTousseTournoverDaysStatisticsReportData(Map requestParameters, Map parametMap){ + String startYear = requestParameters.get("startYear"); + String endYear = requestParameters.get("endYear"); + parametMap.put("amountFormat", "#0.00"); + parametMap.put("title", "器械包周转天数统计报表"); + if(startYear.equals(endYear)){ + parametMap.put("dateStr", startYear+"年"); + }else{ + parametMap.put("dateStr", startYear+ "年至" + startYear + "年"); + } + String startDate = requestParameters.get("startYear") + "-01-01 00:00:00"; + String endDate = Integer.parseInt(requestParameters.get("endYear")) + 1 + "-01-01 00:00:00" ; + String sql = getSql(startDate, endDate, requestParameters.get("packageTypes"),requestParameters.get("orgUnitCoding")); + return jdbcTemplate.query(sql, new ResultSetExtractor>() { + + @Override + public List extractData( + ResultSet rs) throws SQLException, DataAccessException { + List vos = new ArrayList(); + Map packageTypeMap = null; + boolean first = false; + Map> dateMap = new HashMap>(); + Map validDateMap = null; + while(rs.next()){ + if(!first){ + packageTypeMap = new HashMap(); + validDateMap = new HashMap(); + setPackageTypeMap(packageTypeMap,validDateMap); + first = true; + } + String dateStr = rs.getString("dateStr"); + Map tousseTournoverDaysStatisticsReportVoMap = null; + if(dateMap.containsKey(dateStr)){ + tousseTournoverDaysStatisticsReportVoMap = dateMap.get(dateStr); + }else{ + tousseTournoverDaysStatisticsReportVoMap = new HashMap(); + dateMap.put(dateStr, tousseTournoverDaysStatisticsReportVoMap); + } + String packageType = rs.getString("packageType"); + if(StringUtils.isBlank(packageType) && !"".equals(packageType)){ + packageType = ""; + } + String validDate = null; + if(MapUtils.isEmpty(packageTypeMap) || !packageTypeMap.containsKey(packageType)){ + validDate = ""; + }else{ + validDate = packageTypeMap.get(packageType); + } + Long amount = rs.getLong("amount"); + Long subday = rs.getLong("subday"); + TousseTournoverDaysStatisticsReportVo vo = null; + if(tousseTournoverDaysStatisticsReportVoMap.containsKey(validDate)){ + vo = tousseTournoverDaysStatisticsReportVoMap.get(validDate); + vo.setAmount(MathTools.add(vo.getAmount(), amount).longValue()); + vo.setSubDays(MathTools.add(vo.getSubDays(), subday).longValue()); + }else{ + vo = new TousseTournoverDaysStatisticsReportVo(); + vo.setAmount(amount); + vo.setSubDays(subday); + vo.setColumnTitle(dateStr); + vo.setColumnName("包数"); + if(validDateMap != null){ + vo.setSequence(validDateMap.get(packageType)); + } + vo.setValidDateStr(validDate); + tousseTournoverDaysStatisticsReportVoMap.put(validDate, vo); + } + } + if(dateMap.size() > 0){ + for (Map tousseTournoverDaysStatisticsReportVoMap : dateMap.values()) { + for (TousseTournoverDaysStatisticsReportVo vo : tousseTournoverDaysStatisticsReportVoMap.values()) { + if(vo.getAmount() == null || vo.getAmount() == 0L){ + vo.setAverageDays(0.00d); + }else{ + vo.setAverageDays(1.00 * vo.getSubDays() / vo.getAmount()); + } + vos.add(vo); + vos.add(vo.getDayBean()); + } + } + } + return vos; + } + }); + } + /** + * 获取包装类型对应的有效期 和 排序号 + * @param packageTypeMap 包装类型对应的有效期 + * @param validDateMap 包装类型对应的排序号 + */ + private void setPackageTypeMap(Map packageTypeMap, Map validDateMap){ + StringBuffer sbf = new StringBuffer(); + sbf.append("select ho.optionText,ed.validDate,ed.validDateUnit,ed.warningDate from "); + sbf.append(HttpOption.class.getSimpleName()); + sbf.append(" ho join "); + sbf.append(ExpirationDateInfo.class.getSimpleName()); + sbf.append(" ed on ho.optionText=ed.packageType where ho.optionListId='"); + sbf.append(HttpOption.SYSTEMSETTING_PACKAGING_TYPE); + sbf.append("' order by ed.validDate , ed.validDateUnit"); + jdbcTemplate.query(sbf.toString(), new ResultSetExtractor(){ + + @Override + public Integer extractData(ResultSet rs) + throws SQLException, DataAccessException { + int i = 0; + while(rs.next()){ + String optionText = rs.getString("optionText"); + packageTypeMap.put(optionText, rs.getInt("validDate") + rs.getString("validDateUnit")); + validDateMap.put(optionText, i++); + } + return i; + } + + }); + } + /** + * 构建查询语句 + * @param startDate + * @param endDate + * @param packageTypes 包装类型 + * @param orgUnitCoding 供应室编码 + * @return + */ + private String getSql(String startDate, String endDate, String packageTypes, String orgUnitCoding){ + StringBuffer sbf = new StringBuffer(); + sbf.append("select year(sendTime) dateStr,count(*) amount,sum(subday) subday,packageType from (select 1 amount,DATEDIFF(day, endDate,i.sendTime) subday,i.sendTime, td.packageType from "); + sbf.append(TousseInstance.class.getSimpleName()); + sbf.append(" ti join "); + sbf.append(TousseDefinition.class.getSimpleName()); + sbf.append(" td on td.id=ti.tousseDefinition_id join "); + sbf.append(Invoice.class.getSimpleName()); + sbf.append(" i on i.id=ti.invoice_id left join "); + sbf.append(SterilizationRecord.class.getSimpleName()); + sbf.append(" sr on sr.id=ti.sterilizationRecord_id "); + sbf.append(" where sr.endDate is not null and ti.invoice2_id is null and i.orgUnitCoding='"); + sbf.append(orgUnitCoding); + sbf.append("' union all select 1 amount ,DATEDIFF(day, endDate,i.sendTime) subday,i.sendTime,td.packageType from "); + sbf.append(TousseInstance.class.getSimpleName()); + sbf.append(" ti join "); + sbf.append(TousseDefinition.class.getSimpleName()); + sbf.append(" td on td.id=ti.tousseDefinition_id join "); + sbf.append(Invoice.class.getSimpleName()); + sbf.append(" i on i.id=ti.invoice2_id "); + sbf.append(" left join "); + sbf.append(SterilizationRecord.class.getSimpleName()); + sbf.append(" sr on sr.id=ti.sterilizationRecord_id where sr.endDate is not null and i.orgUnitCoding='"); + sbf.append(orgUnitCoding); + sbf.append("') temp1 where sendTime between "); + sbf.append(dateQueryAdapter.dateAdapter(startDate)); + sbf.append(" and "); + sbf.append(dateQueryAdapter.dateAdapter(endDate)); + /*sbf.append("select year(sendTime) dateStr,count(*) amount,sum(subday) subday,packageType from (" + + "select 1 amount,DATEDIFF(day, endDate,i.sendTime) subday,i.sendTime, td.packageType " + + "from TousseInstance ti join TousseDefinition td on td.id=ti.tousseDefinition_id " + //+ "join TousseDefinition tdc on tdc.id=td.ancestorID " + + "join Invoice i on i.id=ti.invoice_id " + + "left join SterilizationRecord sr on sr.id=ti.sterilizationRecord_id " + + "where sr.endDate is not null and ti.invoice2_id is null and i.orgUnitCoding='"+ orgUnitCoding +"' " + + "union all select 1 amount ,DATEDIFF(day, endDate,i.sendTime) subday,i.sendTime,td.packageType " + + "from TousseInstance ti " + + "join TousseDefinition td on td.id=ti.tousseDefinition_id " + //+ "join TousseDefinition tdc on tdc.id=td.ancestorID " + + "join Invoice i on i.id=ti.invoice2_id " + + "left join SterilizationRecord sr on sr.id=ti.sterilizationRecord_id " + + "where sr.endDate is not null and i.orgUnitCoding='"+ orgUnitCoding +"') temp1 " + + "where sendTime " + + " between " + dateQueryAdapter.dateAdapter(startDate) + " and " + dateQueryAdapter.dateAdapter(endDate) + //+ "order by year(sendTime),packageType" + );*/ + if(StringUtils.isNotBlank(packageTypes)){ + sbf.append(" and "); + sbf.append(SqlUtils.getStringFieldInLargeCollectionsPredicate("packageType", SqlUtils.splitStringToSet(packageTypes, ","))); + } + sbf.append(" group by packageType ,year(sendTime) "); + System.out.println(sbf.toString()); + return sbf.toString(); + } +} Index: ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/action/JasperreportsAction.java =================================================================== diff -u -r36253 -r36271 --- ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/action/JasperreportsAction.java (.../JasperreportsAction.java) (revision 36253) +++ ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/action/JasperreportsAction.java (.../JasperreportsAction.java) (revision 36271) @@ -102,6 +102,7 @@ import com.forgon.disinfectsystem.jasperreports.service.WorkQualityCollectionReport; import com.forgon.disinfectsystem.jasperreports.util.InstrumentRepairReportHelper; import com.forgon.disinfectsystem.jasperreports.util.MonthReportHelper; +import com.forgon.disinfectsystem.jasperreports.util.TousseTournoverDaysStatisticsReportHelper; import com.forgon.disinfectsystem.jasperreports.util.WorkloadAndIncomeStatisticsReportHelper; import com.forgon.disinfectsystem.recyclingrecord.service.RecyclingItemManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionManager; @@ -161,6 +162,11 @@ private WorkloadAndIncomeStatisticsReportHelper workloadAndIncomeStatisticsReportHelper; + private TousseTournoverDaysStatisticsReportHelper tousseTournoverDaysStatisticsReportHelper; + public void setTousseTournoverDaysStatisticsReportHelper( + TousseTournoverDaysStatisticsReportHelper tousseTournoverDaysStatisticsReportHelper) { + this.tousseTournoverDaysStatisticsReportHelper = tousseTournoverDaysStatisticsReportHelper; + } public void setWorkloadAndIncomeStatisticsReportHelper( WorkloadAndIncomeStatisticsReportHelper workloadAndIncomeStatisticsReportHelper) { this.workloadAndIncomeStatisticsReportHelper = workloadAndIncomeStatisticsReportHelper; @@ -472,7 +478,7 @@ * @return */ private boolean canCalcframeWidth(String reportName){ - String canCalcStr = "cssdWorkloadReportForTangshanWorkersHospital,deviceMaintenanceCus,sterilizationAreaWorkLoad,supplyRoomQualityQuota,departSatisfyDetailReport,operatingRoomInstrumentSetUsageAndApportionmentExpenseReport,formInstanceReport,QualityMonitoring,sterilizingStoveUseCount,tousseDeliverStatistics,deviceMaintenance,apparatusInfusionisType,monthReport,yearWorkloadReport2,statisticalWorkload,washWorkloadReprot,materialTypeWorkloadReport,packingUnqualifieReport,sterilizationWorkloadReport"; + String canCalcStr = "tousseTournoverDaysStatisticsReport,cssdWorkloadReportForTangshanWorkersHospital,deviceMaintenanceCus,sterilizationAreaWorkLoad,supplyRoomQualityQuota,departSatisfyDetailReport,operatingRoomInstrumentSetUsageAndApportionmentExpenseReport,formInstanceReport,QualityMonitoring,sterilizingStoveUseCount,tousseDeliverStatistics,deviceMaintenance,apparatusInfusionisType,monthReport,yearWorkloadReport2,statisticalWorkload,washWorkloadReprot,materialTypeWorkloadReport,packingUnqualifieReport,sterilizationWorkloadReport"; if(canCalcStr.indexOf(reportName) != -1){ return true; } @@ -864,6 +870,8 @@ String endDay = StrutsParamUtils.getPraramValue("endDay", ""); String departCoding = StrutsParamUtils.getPraramValue("departCoding", ""); return jasperReportManager.getSignGoodsSource(startDay, endDay, departCoding); + } else if("tousseTournoverDaysStatisticsReport".equals(reportName)){ + return tousseTournoverDaysStatisticsReportHelper.getTousseTournoverDaysStatisticsReportData(requestParameters, parametMap); }else if (reportName.equals("deviceMonitoring")) {// 设备监测报表 String startDay = StrutsParamUtils.getPraramValue("startDay", ""); String endDay = StrutsParamUtils.getPraramValue("endDay", ""); Index: ssts-web/src/main/webapp/jasperRtp/tousseTournoverDaysStatisticsReport.jasper =================================================================== diff -u Binary files differ Index: ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/javabeansource/TousseTournoverDaysStatisticsReportVo.java =================================================================== diff -u --- ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/javabeansource/TousseTournoverDaysStatisticsReportVo.java (revision 0) +++ ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/javabeansource/TousseTournoverDaysStatisticsReportVo.java (revision 36271) @@ -0,0 +1,115 @@ +package com.forgon.disinfectsystem.jasperreports.javabeansource; + +/** + * 器械包周转天数统计报表vo + * + */ +public class TousseTournoverDaysStatisticsReportVo implements Cloneable{ + + private String rowNum; + /** + * 有效期 + */ + private String validDateStr; + + private String columnNum; + + private String columnTitle; + + private String columnName; + + private Double averageDays; + + private Long subDays; + private Long amount; + /** + * 序号用于报表排序 + */ + private Integer sequence = 5000; + + public String getRowNum() { + return rowNum; + } + + public void setRowNum(String rowNum) { + this.rowNum = rowNum; + } + + public String getColumnNum() { + return columnNum; + } + + public void setColumnNum(String columnNum) { + this.columnNum = columnNum; + } + + public String getColumnTitle() { + return columnTitle; + } + + public void setColumnTitle(String columnTitle) { + this.columnTitle = columnTitle; + } + + public String getColumnName() { + return columnName; + } + + public void setColumnName(String columnName) { + this.columnName = columnName; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Integer getSequence() { + return sequence; + } + + public void setSequence(Integer sequence) { + this.sequence = sequence; + } + + public String getValidDateStr() { + return validDateStr; + } + + public void setValidDateStr(String validDateStr) { + this.validDateStr = validDateStr; + } + + public Double getAverageDays() { + return averageDays; + } + + public void setAverageDays(Double averageDays) { + this.averageDays = averageDays; + } + + public Long getSubDays() { + return subDays; + } + + public void setSubDays(Long subDays) { + this.subDays = subDays; + } + public TousseTournoverDaysStatisticsReportVo getDayBean(){ + TousseTournoverDaysStatisticsReportVo vo = null; + try { + vo = this.clone(); + } catch (CloneNotSupportedException e) { + vo = new TousseTournoverDaysStatisticsReportVo(); + } + vo.setColumnName("周转天数"); + return vo; + } + @Override + protected TousseTournoverDaysStatisticsReportVo clone() throws CloneNotSupportedException { + return (TousseTournoverDaysStatisticsReportVo)super.clone(); + } +} Index: ssts-web/src/main/webapp/jasperRtp/tousseTournoverDaysStatisticsReport.jrxml =================================================================== diff -u --- ssts-web/src/main/webapp/jasperRtp/tousseTournoverDaysStatisticsReport.jrxml (revision 0) +++ ssts-web/src/main/webapp/jasperRtp/tousseTournoverDaysStatisticsReport.jrxml (revision 36271) @@ -0,0 +1,316 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <band height="64" splitType="Stretch"> + <textField> + <reportElement uuid="14137749-263e-4143-a8dd-482900def002" x="0" y="0" width="159" height="34"/> + <textElement textAlignment="Center" verticalAlignment="Middle"> + <font size="14" isBold="true"/> + </textElement> + <textFieldExpression><![CDATA[$P{title}]]></textFieldExpression> + </textField> + <textField> + <reportElement uuid="14137749-263e-4143-a8dd-482900def002" x="0" y="34" width="159" height="30"/> + <textElement textAlignment="Center" verticalAlignment="Top"> + <font size="12" isBold="false"/> + </textElement> + <textFieldExpression><![CDATA[$P{dateStr}]]></textFieldExpression> + </textField> + </band> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +