Index: ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/service/JasperReportManagerImpl.java =================================================================== diff -u -r35925 -r35927 --- ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/service/JasperReportManagerImpl.java (.../JasperReportManagerImpl.java) (revision 35925) +++ ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/service/JasperReportManagerImpl.java (.../JasperReportManagerImpl.java) (revision 35927) @@ -2841,175 +2841,13 @@ @Override public List getTousseOverLoadData( Map params) { - String startDay = params.get("startDay"); - String endDay = params.get("endDay"); - String sterilizerName = params.get("sterilizerName"); - String sterilizationType = params.get("sterilizationType"); - String sortType = params.get("sortType"); - String where = " 1=1 "; - if(StringTools.isEmpty(sterilizerName) || StringTools.isEmpty(sterilizationType)){ - where = " 1=0 "; - } - Date startDate = ForgonDateUtils.safelyParseDate(startDay, Constants.SIMPLEDATEFORMAT_YYYYMMDDHHMM); - Date endDate = ForgonDateUtils.safelyParseDate(endDay, Constants.SIMPLEDATEFORMAT_YYYYMMDDHHMM); - startDay = ForgonDateUtils.safelyFormatDate(startDate, Constants.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS, ""); - endDay = ForgonDateUtils.safelyFormatDate(endDate, Constants.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS, ""); - GoodsOption option = goodsOptionManager.getGoodsOption(GoodsOption.MODEL_TOUSSEOVERLOAD, AcegiHelper.getCurrentOrgUnitCode()); - if(option != null){ - String v = option.getValue(); - if(StringTools.isNotBlank(v)){ - String[] array = v.split(";"); - String vString = StringTools.join(array, "','"); - vString = "'" + vString + "'"; - where += " and ti.tousseName in (" + vString + ")"; - } - } - - String sterileStartTime = SqlUtils.getSubStringSql(dbConnection, "ti.sterileStartTime", 0, 10); - String frequencyFiled = " cast(ti.sterileFrequency as decimal(10,0)) "; - String sql = "select sterilingType,"+frequencyFiled+" sterileFrequency,"+sterileStartTime+" sterileStartTime,tousseName,count(*) tousseCount from " - + TousseInstance.class.getSimpleName() + " ti join " + TousseDefinition.class.getSimpleName() + " td on td.id = ti.tousseDefinition_id " - + " where ti.sterilizerName='" + sterilizerName + "' and ti.sterilingType='" + sterilizationType + "'" - + " and td.tousseType in ('" + TousseDefinition.PACKAGE_TYPE_INSIDE + "','" - + TousseDefinition.PACKAGE_TYPE_DRESSING + "','" + TousseDefinition.PACKAGE_TYPE_FOREIGNPROXY + "')" - + " and (" + dateQueryAdapter.strDateAreasql("ti.sterileStartTime", startDay, endDay, false) - + " or " + dateQueryAdapter.strDateAreasql("ti.sterileEndTime", startDay, endDay, false) - + " ) and " + where - + " group by ti.sterilingType,ti.sterileFrequency,"+sterileStartTime+",ti.tousseName" - + " order by " + sterileStartTime + "," + frequencyFiled; - - logger.debug("sql:" + sql); - ResultSet rs = null; - try { - rs = objectDao.executeSql(sql); - List details = new ArrayList<>(); - List allTousseName = new ArrayList<>(); //所有器械包 - while(rs.next()){ - String freq = rs.getString("sterileFrequency"); - int frequency = 1; - try{ - frequency = Integer.parseInt(freq); - }catch(NumberFormatException e){} - TousseOverLoadBean bean = new TousseOverLoadBean(); - bean.setDate(rs.getString("sterileStartTime")); - bean.setSterileProgram(rs.getString("sterilingType")); - bean.setFrequency(frequency); - bean.setTousseName(rs.getString("tousseName")); - bean.setTousseCount(rs.getInt("tousseCount")); - String find = CollectionUtils.find(allTousseName, new Predicate(){ - @Override - public boolean evaluate(String object) { - return StringTools.equals(object, bean.getTousseName()); - }}); - if(find == null){ - allTousseName.add(bean.getTousseName()); - } - - TousseOverLoadDetail findDetail = CollectionUtils.find(details, new Predicate(){ - @Override - public boolean evaluate(TousseOverLoadDetail object) { - return StringTools.equals(object.getRowKey(), bean.rowKey()); - }}); - - if(findDetail == null){ - findDetail = new TousseOverLoadDetail(); - findDetail.setRowKey(bean.rowKey()); - details.add(findDetail); - } - findDetail.add(bean); - } - if(details.isEmpty()){ - return null; - } - Map combinationCodeCountMap = new HashMap<>(); //行组合编号的出现次数 - Map tousseCountCode = new HashMap<>(); //器械包名及数量的字符串与行组合编号的对应 - - //计算组合编号及组合编号出现的次数 - for(TousseOverLoadDetail detail : details){ - List rowBeans = detail.getRowBeans(); - String tousseCountCodeKey = rowBeansSpecialString( - allTousseName, rowBeans); - String code = tousseCountCode.get(tousseCountCodeKey); - if(code == null){ - code = (tousseCountCode.size() + 1) + ""; - tousseCountCode.put(tousseCountCodeKey, code); - } - combinationCodeCountMap.put(code,MathTools.add(combinationCodeCountMap.get(code),1).intValue()); - detail.setCode(code); - } - //设置组合编号及组合编号出现的次数,还有行号 - int index = 1; - for(TousseOverLoadDetail detail : details){ - List rowBeans = detail.getRowBeans(); - String code = detail.getCode(); - Integer count = combinationCodeCountMap.get(code); - detail.setCodeCount(count == null?0:count); - for(TousseOverLoadBean bean : rowBeans){ - bean.setCombinationCode(code); - bean.setCombinationCodeCount(combinationCodeCountMap.get(code).toString()); - bean.setRowNum(index); - } - ++index; - } - if("组合次数降序".equals(sortType)){ - Collections.sort(details, new Comparator(){ - @Override - public int compare(TousseOverLoadDetail o1, - TousseOverLoadDetail o2) { - if(o1.getCodeCount() < o2.getCodeCount()){ - return 1; - }else if(o1.getCodeCount() > o2.getCodeCount()){ - return -1; - } - return 0; - }}); - //重新设置序号 - index = 1; - for(TousseOverLoadDetail detail : details){ - List rowBeans = detail.getRowBeans(); - for(TousseOverLoadBean bean : rowBeans){ - bean.setRowNum(index); - } - ++index; - } - } - List beans = new ArrayList<>(); - for(TousseOverLoadDetail detail : details){ - beans.addAll(detail.getRowBeans()); - } - return beans; - } catch (SQLException e) { - e.printStackTrace(); - } finally { - DatabaseUtil.closeResultSetAndStatement(rs); - } - return null; + return reportHelper1.getTousseOverLoadData(params); } @Override public List getTousseMorrwoSendData( Map params) { return tousseMorrowSendReportHelper.getTousseMorrwoSendData(params); } - - private String rowBeansSpecialString(List allTousseName, - List rowBeans) { - StringBuffer tousseCountCodeKeySbf = new StringBuffer(); - for(String tousseName : allTousseName){ - TousseOverLoadBean find = CollectionUtils.find(rowBeans, new Predicate(){ - @Override - public boolean evaluate(TousseOverLoadBean object) { - return StringTools.equals(tousseName, object.getTousseName()); - } - }); - int amount = 0; - if(find != null){ - amount = find.getTousseCount(); //一定不为null - } - tousseCountCodeKeySbf.append(tousseName); - tousseCountCodeKeySbf.append(amount); - } - return tousseCountCodeKeySbf.toString(); - } @Override public List getNurseWorkloadData( Map params) { Index: ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/util/ReportHelper1.java =================================================================== diff -u -r35925 -r35927 --- ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/util/ReportHelper1.java (.../ReportHelper1.java) (revision 35925) +++ ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/util/ReportHelper1.java (.../ReportHelper1.java) (revision 35927) @@ -5,39 +5,57 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.Predicate; import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.forgon.Constants; import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.disinfectsystem.basedatamanager.reportoption.GoodsOptionManager; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; import com.forgon.disinfectsystem.entity.basedatamanager.reportoption.GoodsOption; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.jasperreports.javabeansource.ApparatusInfusionisType; +import com.forgon.disinfectsystem.jasperreports.javabeansource.TousseOverLoadBean; +import com.forgon.disinfectsystem.jasperreports.service.TousseOverLoadDetail; import com.forgon.tools.MathTools; import com.forgon.tools.SqlBuilder; import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.db.InitDbConnection; import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.string.StringTools; +import com.forgon.tools.util.ForgonDateUtils; import com.forgon.tools.util.SqlUtils; /** * 一些小报表(超过500行建议换一个文件) * 各类型输液器报表 + * 器械包实际负载组合统计报表 */ @Component public class ReportHelper1 { + private Logger logger = Logger.getLogger(this.getClass()); @Autowired private GoodsOptionManager goodsOptionManager; @Autowired private ObjectDao objectDao; @Autowired private DateQueryAdapter dateQueryAdapter; + @Autowired + private InitDbConnection dbConnection; /** * 各类型输液器报表 * @param startDay @@ -163,5 +181,174 @@ } return map; } + /** + * 获取器械包实际负载组合统计报表的数据 + * @param params 参数 + * @return + */ + public List getTousseOverLoadData( + Map params) { + String startDay = params.get("startDay"); + String endDay = params.get("endDay"); + String sterilizerName = params.get("sterilizerName"); + String sterilizationType = params.get("sterilizationType"); + String sortType = params.get("sortType"); + String where = " 1=1 "; + if(StringTools.isEmpty(sterilizerName) || StringTools.isEmpty(sterilizationType)){ + where = " 1=0 "; + } + Date startDate = ForgonDateUtils.safelyParseDate(startDay, Constants.SIMPLEDATEFORMAT_YYYYMMDDHHMM); + Date endDate = ForgonDateUtils.safelyParseDate(endDay, Constants.SIMPLEDATEFORMAT_YYYYMMDDHHMM); + startDay = ForgonDateUtils.safelyFormatDate(startDate, Constants.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS, ""); + endDay = ForgonDateUtils.safelyFormatDate(endDate, Constants.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS, ""); + GoodsOption option = goodsOptionManager.getGoodsOption(GoodsOption.MODEL_TOUSSEOVERLOAD, AcegiHelper.getCurrentOrgUnitCode()); + if(option != null){ + String v = option.getValue(); + if(StringTools.isNotBlank(v)){ + String[] array = v.split(";"); + String vString = StringTools.join(array, "','"); + vString = "'" + vString + "'"; + where += " and ti.tousseName in (" + vString + ")"; + } + } + + String sterileStartTime = SqlUtils.getSubStringSql(dbConnection, "ti.sterileStartTime", 0, 10); + String frequencyFiled = " cast(ti.sterileFrequency as decimal(10,0)) "; + String sql = "select sterilingType,"+frequencyFiled+" sterileFrequency,"+sterileStartTime+" sterileStartTime,tousseName,count(*) tousseCount from " + + TousseInstance.class.getSimpleName() + " ti join " + TousseDefinition.class.getSimpleName() + " td on td.id = ti.tousseDefinition_id " + + " where ti.sterilizerName='" + sterilizerName + "' and ti.sterilingType='" + sterilizationType + "'" + + " and td.tousseType in ('" + TousseDefinition.PACKAGE_TYPE_INSIDE + "','" + + TousseDefinition.PACKAGE_TYPE_DRESSING + "','" + TousseDefinition.PACKAGE_TYPE_FOREIGNPROXY + "')" + + " and (" + dateQueryAdapter.strDateAreasql("ti.sterileStartTime", startDay, endDay, false) + + " or " + dateQueryAdapter.strDateAreasql("ti.sterileEndTime", startDay, endDay, false) + + " ) and " + where + + " group by ti.sterilingType,ti.sterileFrequency,"+sterileStartTime+",ti.tousseName" + + " order by " + sterileStartTime + "," + frequencyFiled; + logger.debug("sql:" + sql); + ResultSet rs = null; + try { + rs = objectDao.executeSql(sql); + List details = new ArrayList<>(); + List allTousseName = new ArrayList<>(); //所有器械包 + while(rs.next()){ + String freq = rs.getString("sterileFrequency"); + int frequency = 1; + try{ + frequency = Integer.parseInt(freq); + }catch(NumberFormatException e){} + TousseOverLoadBean bean = new TousseOverLoadBean(); + bean.setDate(rs.getString("sterileStartTime")); + bean.setSterileProgram(rs.getString("sterilingType")); + bean.setFrequency(frequency); + bean.setTousseName(rs.getString("tousseName")); + bean.setTousseCount(rs.getInt("tousseCount")); + String find = CollectionUtils.find(allTousseName, new Predicate(){ + @Override + public boolean evaluate(String object) { + return StringTools.equals(object, bean.getTousseName()); + }}); + if(find == null){ + allTousseName.add(bean.getTousseName()); + } + + TousseOverLoadDetail findDetail = CollectionUtils.find(details, new Predicate(){ + @Override + public boolean evaluate(TousseOverLoadDetail object) { + return StringTools.equals(object.getRowKey(), bean.rowKey()); + }}); + + if(findDetail == null){ + findDetail = new TousseOverLoadDetail(); + findDetail.setRowKey(bean.rowKey()); + details.add(findDetail); + } + findDetail.add(bean); + } + if(details.isEmpty()){ + return null; + } + Map combinationCodeCountMap = new HashMap<>(); //行组合编号的出现次数 + Map tousseCountCode = new HashMap<>(); //器械包名及数量的字符串与行组合编号的对应 + + //计算组合编号及组合编号出现的次数 + for(TousseOverLoadDetail detail : details){ + List rowBeans = detail.getRowBeans(); + String tousseCountCodeKey = rowBeansSpecialString( + allTousseName, rowBeans); + String code = tousseCountCode.get(tousseCountCodeKey); + if(code == null){ + code = (tousseCountCode.size() + 1) + ""; + tousseCountCode.put(tousseCountCodeKey, code); + } + combinationCodeCountMap.put(code,MathTools.add(combinationCodeCountMap.get(code),1).intValue()); + detail.setCode(code); + } + //设置组合编号及组合编号出现的次数,还有行号 + int index = 1; + for(TousseOverLoadDetail detail : details){ + List rowBeans = detail.getRowBeans(); + String code = detail.getCode(); + Integer count = combinationCodeCountMap.get(code); + detail.setCodeCount(count == null?0:count); + for(TousseOverLoadBean bean : rowBeans){ + bean.setCombinationCode(code); + bean.setCombinationCodeCount(combinationCodeCountMap.get(code).toString()); + bean.setRowNum(index); + } + ++index; + } + if("组合次数降序".equals(sortType)){ + Collections.sort(details, new Comparator(){ + @Override + public int compare(TousseOverLoadDetail o1, + TousseOverLoadDetail o2) { + if(o1.getCodeCount() < o2.getCodeCount()){ + return 1; + }else if(o1.getCodeCount() > o2.getCodeCount()){ + return -1; + } + return 0; + }}); + //重新设置序号 + index = 1; + for(TousseOverLoadDetail detail : details){ + List rowBeans = detail.getRowBeans(); + for(TousseOverLoadBean bean : rowBeans){ + bean.setRowNum(index); + } + ++index; + } + } + List beans = new ArrayList<>(); + for(TousseOverLoadDetail detail : details){ + beans.addAll(detail.getRowBeans()); + } + return beans; + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + return null; + } + private String rowBeansSpecialString(List allTousseName, + List rowBeans) { + StringBuffer tousseCountCodeKeySbf = new StringBuffer(); + for(String tousseName : allTousseName){ + TousseOverLoadBean find = CollectionUtils.find(rowBeans, new Predicate(){ + @Override + public boolean evaluate(TousseOverLoadBean object) { + return StringTools.equals(tousseName, object.getTousseName()); + } + }); + int amount = 0; + if(find != null){ + amount = find.getTousseCount(); //一定不为null + } + tousseCountCodeKeySbf.append(tousseName); + tousseCountCodeKeySbf.append(amount); + } + return tousseCountCodeKeySbf.toString(); + } }