Index: ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/service/JasperReportManager.java =================================================================== diff -u -r35797 -r35798 --- ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/service/JasperReportManager.java (.../JasperReportManager.java) (revision 35797) +++ ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/service/JasperReportManager.java (.../JasperReportManager.java) (revision 35798) @@ -1086,12 +1086,6 @@ */ public List getSciProjectAccountingReportData(String startDate, String endDate, String invoicePlanDepartCoding, String projCode, String projName); /** - * 获取表单最新定义的信息 宽度 显示方式等 - * @param formName 表单名称 - * @return - */ - public Map getFormDefinitionOrderInfo(String formName); - /** * 获取获取质量监测报表数据,用于前端做成table显示 * @return */ Index: ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/service/JasperReportManagerImpl.java =================================================================== diff -u -r35797 -r35798 --- ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/service/JasperReportManagerImpl.java (.../JasperReportManagerImpl.java) (revision 35797) +++ ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/service/JasperReportManagerImpl.java (.../JasperReportManagerImpl.java) (revision 35798) @@ -176,6 +176,7 @@ import com.forgon.disinfectsystem.jasperreports.service.dataindex.WorkQualityCollectionDataIndex; import com.forgon.disinfectsystem.jasperreports.util.CssdWorkloadReportForTangshanWorkersHospitalHelper; import com.forgon.disinfectsystem.jasperreports.util.CssdWorkloadReportHelper; +import com.forgon.disinfectsystem.jasperreports.util.DepartSatisfyReportHelper; import com.forgon.disinfectsystem.jasperreports.util.DepartmentMonthDetailHelper; import com.forgon.disinfectsystem.jasperreports.util.DeviceMaintenanceCusDataSourceHelper; import com.forgon.disinfectsystem.jasperreports.util.EighteenQuotaBeanHelper; @@ -348,6 +349,8 @@ private FormDefinitionHelper formDefinitionHelper; @Autowired private SupplyRoomQualityQuotaHelper supplyRoomQualityQuotaHelper; + @Autowired + private DepartSatisfyReportHelper departSatisfyReportHelper; public void setPackingManager(PackingManager packingManager) { this.packingManager = packingManager; } @@ -421,153 +424,10 @@ @Override public List getSatisfyDetailDataSource(String startDay, String endDay, String formDefinitionName, String departCoding) throws SQLException, ParseException { - List departSatisfyDetailReportBeans = new ArrayList(); - - out:if (StringUtils.isNotBlank(startDay) && StringUtils.isNotBlank(endDay)) { - startDay = startDay + " 00:00:00"; - endDay = endDay + " 23:59:59"; - Map map = getAllSuveryDepart(startDay,endDay); - if(MapUtils.isEmpty(map)){ - break out; - } - String sql = "where po.satisfactionSurveyTemplateId in " - + "(select ti.id from SatisfactionSurveyTemplate ti where ti.name = '" - + formDefinitionName - + "') and po.surveyDate>=" - + dateQueryAdapter.dateAdapter(startDay) - + " and po.surveyDate <= " - + dateQueryAdapter.dateAdapter(endDay); - if(StringUtils.isNotBlank(departCoding)){ - sql += " and po.departCoding='"+ departCoding +"' "; - } - sql += " order by po.depart,po.surveyDate"; - @SuppressWarnings("unchecked") - List list = objectDao.findBySql( - SatisfactionSurveyTable.class.getName(), sql); - if (CollectionUtils.isNotEmpty(list)) { - int orderNum = 1; - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - Set formInstanceIds = new HashSet(); - for (SatisfactionSurveyTable satisfactionSurveyTable : list) { - if(DatabaseUtil.isPoIdValid(satisfactionSurveyTable.getFormInstance_id())){ - formInstanceIds.add(satisfactionSurveyTable.getFormInstance_id()); - } - } - Map formInstanceMap = new HashMap(); - if(CollectionUtils.isNotEmpty(formInstanceIds)){ - sql = "select fdi.name,fii.answer,fi.id from " - + FormInstance.class.getSimpleName() - +" fi join " - + FormInstanceItem.class.getSimpleName() - + " fii on fii.formInstance_id=fi.id join " - + FormDefinitionItem.class.getSimpleName() - + " fdi on fdi.id=fii.formDefinitionItem_id where " - + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("fi.id", formInstanceIds); - ResultSet rs = objectDao.executeSql(sql); - try { - while(rs.next()){ - String name = rs.getString("name"); - String answer = rs.getString("answer"); - if(StringUtils.isNotBlank(answer) && answer.endsWith(";")){ - answer = answer.substring(0, answer.length() - 1); - } - long id = rs.getLong("id"); - JSONObject obj = formInstanceMap.get(id); - if(obj == null){ - obj = new JSONObject(); - } - obj.put(name, answer); - formInstanceMap.put(id, obj); - } - } catch (SQLException e) { - e.printStackTrace(); - }finally { - DatabaseUtil.closeResultSetAndStatement(rs); - } - } - //要获取最新的属性 - Map formDefinitionItemNameMap = getFormDefinitionOrderInfo(formDefinitionName); - for (SatisfactionSurveyTable satisfactionSurveyTable : list) { - setDepartSatisfyDetailReportBean(formDefinitionItemNameMap, formInstanceMap, sdf, orderNum, satisfactionSurveyTable, departSatisfyDetailReportBeans); - orderNum++; - } - } - } - return departSatisfyDetailReportBeans; + return departSatisfyReportHelper.getSatisfyDetailDataSource(startDay, endDay, formDefinitionName, departCoding); } + /** - * 设置满意度调查明细报表bean - * @param mapObj - * @param sdf - * @param orderNum - * @param satisfactionSurveyTable - * @param departSatisfyDetailReportBeans - */ - private void setDepartSatisfyDetailReportBean(Map formDefinitionItemNameMap ,Map mapObj, SimpleDateFormat sdf, int orderNum , SatisfactionSurveyTable satisfactionSurveyTable, List departSatisfyDetailReportBeans){ - List parentItems = satisfactionSurveyTable.getAnswerItem(); - DepartSatisfyDetailReportBean bean0 = new DepartSatisfyDetailReportBean(); - bean0.setOrderNum(orderNum); - bean0.setColumnName("评价时间"); - bean0.setColumnSequence(2); - bean0.setValue(sdf.format(satisfactionSurveyTable.getSurveyDate())); - departSatisfyDetailReportBeans.add(bean0); - - DepartSatisfyDetailReportBean bean = new DepartSatisfyDetailReportBean(); - bean.setOrderNum(orderNum); - bean.setColumnName("评价科室"); - bean.setColumnSequence(3); - bean.setValue(satisfactionSurveyTable.getDepart()); - departSatisfyDetailReportBeans.add(bean); - if(CollectionUtils.isNotEmpty(parentItems)){ - int sequ = 100; - for (SatisfactionSurveyTableItem parentItem : parentItems) { - List sonItems = parentItem.getChildren(); - if(CollectionUtils.isNotEmpty(sonItems)){ - sequ++; - for (SatisfactionSurveyTableItem sonItem : sonItems) { - DepartSatisfyDetailReportBean bean1 = new DepartSatisfyDetailReportBean(); - bean1.setValue(sonItem.getSatisfaction().getValue()); - bean1.setColumnName(sonItem.getContent()); - bean1.setColumnSequence(sequ); - bean1.setOrderNum(orderNum); - departSatisfyDetailReportBeans.add(bean1); - sequ++; - } - }else{ - sequ++; - DepartSatisfyDetailReportBean bean1 = new DepartSatisfyDetailReportBean(); - bean1.setValue(parentItem.getSatisfaction().getValue()); - bean1.setColumnName(parentItem.getContent()); - bean1.setColumnSequence(sequ); - bean1.setOrderNum(orderNum); - departSatisfyDetailReportBeans.add(bean1); - sequ++; - } - sequ += 100; - } - Long formInstance_id = satisfactionSurveyTable.getFormInstance_id(); - if(DatabaseUtil.isPoIdValid(formInstance_id) && MapUtils.isNotEmpty(mapObj)){ - sequ = 5000; - JSONObject formInstanceObj = mapObj.get(formInstance_id); - for (String formDefinitionItemName : formDefinitionItemNameMap.keySet()) { - DepartSatisfyDetailReportBean formInstanceBean = new DepartSatisfyDetailReportBean(); - formInstanceBean.setValue(formInstanceObj.optString(formDefinitionItemName)); - formInstanceBean.setColumnName(formDefinitionItemName); - formInstanceBean.setColumnSequence(sequ); - formInstanceBean.setOrderNum(orderNum); - departSatisfyDetailReportBeans.add(formInstanceBean); - sequ++; - } - } - } - DepartSatisfyDetailReportBean bean8 = new DepartSatisfyDetailReportBean(); - bean8.setOrderNum(orderNum); - bean8.setColumnName("评价人"); - bean8.setColumnSequence(6000); - bean8.setValue(satisfactionSurveyTable.getUserName()); - departSatisfyDetailReportBeans.add(bean8); - } - /** * 获取器械包月份图形报表数据源 * * @param month @@ -16530,39 +16390,6 @@ return sciProjectAccountingVos; } @Override - public Map getFormDefinitionOrderInfo(String formName){ - StringBuilder sbf = new StringBuilder(300); - sbf.append("select fdi.name,fdi.displayFormat,fdi.width from ") - .append(FormDefinition.class.getSimpleName()) - .append(" fd join ") - .append(FormDefinitionItem.class.getSimpleName()) - .append(" fdi on fd.id=fdi.formDefinition_id ") - .append(" where fd.version=(select max(version) from FormDefinition where formName='") - .append(formName) - .append("') and formName='") - .append(formName) - .append("' order by fdi.orderNumber "); - ResultSet rs = null; - Map formDefinitionItemNameMap = new LinkedHashMap(); - try { - rs = objectDao.executeSql(sbf.toString()); - while(rs.next()){ - String formDefinitionItemName = rs.getString("name"); - String displayFormat = rs.getString("displayFormat"); - Integer width = ConvertNumber.getNumberIntValue(rs.getObject("width"), null); - FormDefinitionItem formDefinitionItem = new FormDefinitionItem(); - formDefinitionItem.setDisplayFormat(displayFormat); - formDefinitionItem.setWidth(width); - formDefinitionItemNameMap.put(formDefinitionItemName, formDefinitionItem); - } - } catch (Exception e) { - e.printStackTrace(); - } finally{ - DatabaseUtil.closeResultSetAndStatement(rs); - } - return formDefinitionItemNameMap; - } - @Override public JSONObject queryFormDefinitionDynamicColumnInfo(String formName, String modeType, Map voMap) { StringBuilder sbf = new StringBuilder(500); String startDate = StrutsParamUtils.getPraramValue("startDate", ""); @@ -17879,468 +17706,8 @@ } @Override public List getSatisfyDataSource(Map parametMap) throws SQLException, ParseException { - List supplyRoomConfigs = supplyRoomConfigManager - .getSupplyRoomList(SupplyRoomConfig.SUPPLYROOM_TYPE_APPLY); - String startDay = StrutsParamUtils.getPraramValue("startTime", ""); - String endDay = StrutsParamUtils.getPraramValue("endTime", ""); - Long satisfactionSurveyTemplateId = StrutsParamUtils.getPraramLongValue("satisfactionSurveyTemplateId", 0L); - String summaryType = StrutsParamUtils.getPraramValue("summaryType", ""); - List infos = new ArrayList(); - String summaryOfHospital = "全院汇总"; - String hospitalName = "全院"; - Set satisfactionSurveyTemplateIds = new HashSet(); - out:if (StringUtils.isNotBlank(startDay) && StringUtils.isNotBlank(endDay)) { - startDay = startDay + "-01 00:00:00"; - endDay = getMonthEndDate(endDay); - Map map = getAllSuveryDepart(startDay,endDay); - if(MapUtils.isEmpty(map)){ - break out; - } - Set orgCodeSet = map.keySet(); - int departCount = 0; - if(summaryOfHospital.equals(summaryType)){ - orgCodeSet = new HashSet(); - orgCodeSet.add(summaryOfHospital); - String countSql = "select count(distinct departCoding) from " + SatisfactionSurveyTable.class.getSimpleName() - + " po where po.satisfactionSurveyTemplateId in " - + "(select ti.id from SatisfactionSurveyTemplate ti where ti.entryDate >= " - + dateQueryAdapter.dateAdapter(startDay) - + " and ti.entryDate <= " - + dateQueryAdapter.dateAdapter(endDay) + ")"; - if(DatabaseUtil.isPoIdValid(satisfactionSurveyTemplateId)){ - countSql += " and po.satisfactionSurveyTemplateId=" + satisfactionSurveyTemplateId; - } - departCount = objectDao.countBySql(countSql); - } - Map totalScores = new HashMap(); - for (String orgCoding : orgCodeSet) { - String sql = "where po.satisfactionSurveyTemplateId in " - + "(select ti.id from SatisfactionSurveyTemplate ti where ti.entryDate >= " - + dateQueryAdapter.dateAdapter(startDay) - + " and ti.entryDate <= " - + dateQueryAdapter.dateAdapter(endDay) + ")"; - if(DatabaseUtil.isPoIdValid(satisfactionSurveyTemplateId)){ - sql += " and po.satisfactionSurveyTemplateId=" + satisfactionSurveyTemplateId; - } - if(!summaryOfHospital.equals(summaryType)){ - sql += " and po.departCoding='"+ orgCoding +"'"; - } - @SuppressWarnings("unchecked") - List list = objectDao.findBySql( - SatisfactionSurveyTable.class.getName(), sql); - if (!list.isEmpty() && list.size() != 0) { - SatisfyInfo info = new SatisfyInfo(); - if(summaryOfHospital.equals(summaryType)){ - info.setDepartName(hospitalName); - }else{ - for (SupplyRoomConfig config : supplyRoomConfigs) { - if (StringUtils.equals(orgCoding, - config.getOrgUnitCoding())) { - info.setSequenceNum(config.getSequence()); - break; - } - } - info.setDepartName(map.get(orgCoding)); - departCount++; - } - generateSatisfyItems(info, list, totalScores, - satisfactionSurveyTemplateIds); - infos.add(info); - } - } - parametMap.put("departCount", departCount); - Double absSatisfyTotal = null; - Double ratherSatisfyTotal = null; - Double basicSatisfyTotal = null; - Double notRatherSatisfyTotal = null; - Double noSatisfyTotal = null; - Double mylTotal = null; - for(Entry entry : totalScores.entrySet()){ - String satisfactionMode = entry.getKey(); - if (StringUtils.equals("absSatisfy", satisfactionMode)) { - absSatisfyTotal = entry.getValue().multiply(new BigDecimal("100")) - .divide(totalScores.get("total"), 2, - BigDecimal.ROUND_HALF_EVEN).doubleValue(); - } else if (StringUtils - .equals("ratherSatisfy", satisfactionMode)) { - ratherSatisfyTotal = entry.getValue().multiply(new BigDecimal("100")) - .divide(totalScores.get("total"), 2, - BigDecimal.ROUND_HALF_EVEN).doubleValue(); - } else if (StringUtils.equals("basicSatisfy", satisfactionMode)) { - basicSatisfyTotal = entry.getValue().multiply(new BigDecimal("100")) - .divide(totalScores.get("total"), 2, - BigDecimal.ROUND_HALF_EVEN).doubleValue(); - } else if (StringUtils.equals("notRatherSatisfy", - satisfactionMode)) { - notRatherSatisfyTotal = entry.getValue().multiply(new BigDecimal("100")) - .divide(totalScores.get("total"), 2, - BigDecimal.ROUND_HALF_EVEN).doubleValue(); - } else if (StringUtils.equals("noSatisfy", satisfactionMode)) { - noSatisfyTotal = entry.getValue().multiply(new BigDecimal("100")) - .divide(totalScores.get("total"), 2, - BigDecimal.ROUND_HALF_EVEN).doubleValue(); - mylTotal = totalScores - .get("absSatisfy") - .multiply(new BigDecimal("5")) - .add(totalScores.get("ratherSatisfy").multiply( - new BigDecimal("4"))) - .add(totalScores.get("basicSatisfy").multiply( - new BigDecimal("3"))) - .add(totalScores.get("notRatherSatisfy").multiply( - new BigDecimal("2"))) - .add(totalScores.get("noSatisfy").multiply( - new BigDecimal("1"))) - .multiply(new BigDecimal("100")) - .divide(totalScores.get("total").multiply( - new BigDecimal("5")), 2, - BigDecimal.ROUND_HALF_EVEN).doubleValue(); - - } - } - String totalSummary = null; - for (Long id : satisfactionSurveyTemplateIds) { - SatisfactionSurveyTemplate template = (SatisfactionSurveyTemplate) objectDao - .getByProperty( - SatisfactionSurveyTemplate.class.getName(), - "id", id); - if (StringUtils.isNotBlank(template.getSummary())) { - if (StringUtils.isBlank(totalSummary)) { - totalSummary = template.getSummary(); - } else { - totalSummary += ";" + template.getSummary(); - } - } - } - for (SatisfyInfo info : infos) { - info.setAvg_abs(absSatisfyTotal); - info.setAvg_rather(ratherSatisfyTotal); - info.setAvg_basic(basicSatisfyTotal); - info.setAvg_notrather(notRatherSatisfyTotal); - info.setAvg_no(noSatisfyTotal); - info.setAvg_myl(mylTotal); - info.setTotalSummary(totalSummary); - } - } - - Collections.sort(infos, new Comparator() { - @Override - public int compare(SatisfyInfo b1, SatisfyInfo b2) { - if(b1.getSequenceNum() == null ){ //序号为空比较项排前 - return 1; - }else if(b2.getSequenceNum() == null){ //比较项序号为空排后 - return -1; - } - return b1.getSequenceNum().compareTo(b2.getSequenceNum()); - } - }); - return infos; + return departSatisfyReportHelper.getSatisfyDataSource(parametMap); } - /** - * 获取某个月的开始日期下一个月的第一天 2012-01-01 2012-02-01 - * - * @param month - * @return - */ - public String getMonthEndDate(String month) { - if (StringUtils.isNotBlank(month)) { - Date date = null; - try { - date = new SimpleDateFormat("yyyy-MM").parse(month); - } catch (ParseException e) { - e.printStackTrace(); - } - Calendar calendar = Calendar.getInstance(); - calendar.setTime(date); - calendar.add(Calendar.DAY_OF_MONTH, - calendar.getActualMaximum(Calendar.DAY_OF_MONTH) - 1); - return new SimpleDateFormat("yyyy-MM-dd").format(calendar - .getTime()) + " 23:59:59"; - } - return null; - } - // 该方法得到所有填写调查表的科室(科室之间可能有重复,因为一份调查表可以由同一科室的多个人填写) - /** - * key--departCode,value--departName - * - * @return - * @throws SQLException - * 2014-5-28 - */ - private Map getAllSuveryDepart(String startDay, String endDay) throws SQLException { - Map map = new HashMap(); - String daySql = " where satisfactionSurveyTemplateId in " - + "(select ti.id from SatisfactionSurveyTemplate ti where ti.entryDate >= " - + dateQueryAdapter.dateAdapter(startDay) - + " and ti.entryDate <= " - + dateQueryAdapter.dateAdapter(endDay) + ")"; - String sql = " select distinct departcoding,DEPART from satisfactionsurveytable" - + daySql - + " order by departCoding"; - ResultSet rs = objectDao.executeSql(sql); - try { - while (rs.next()) { - if (map.containsKey(rs.getString(1))) { - continue; - } - map.put(rs.getString(1), rs.getString(2)); - } - } catch (Exception e) { - throw e; - }finally { - DatabaseUtil.closeResultSetAndStatement(rs); - } - return map; - } - private void generateSatisfyItems(SatisfyInfo info, - List tables, - Map totalScores, - Set satisfactionSurveyTemplateIds) throws SQLException { - /** - * key:content,value.key:分数(5,4,3,2,1),value.value:分值(0,1) - */ - // map中包含map,其中包括3个字符串,第一个是调查项,第二个是满意的程度,第三个是个数和总数的字符串中间用分号区分 - // eg:1.您对消毒供应护士的工作态度是否满意--满意--1;10 - Map> itemMap = extractSatisfactionSurveySourceMap( - info, tables, satisfactionSurveyTemplateIds); - List items = new ArrayList(); - for(Entry> entry : itemMap.entrySet()){ - SatisfyItem satisfyItem = new SatisfyItem(); - satisfyItem.setContent(entry.getKey()); - Map scoreMap = entry.getValue(); - BigDecimal scoreOfTheContent = new BigDecimal("0"); - BigDecimal totalScore = null; - for(Entry entry2 : scoreMap.entrySet()){ - String satisfactionMode = entry2.getKey(); - String score = entry2.getValue(); - String[] scoreArr = score.split(";"); - if (StringUtils.equals(satisfactionMode, "absSatisfy")) { - satisfyItem.setAbsSatisfy_percent(BigDecimal - .valueOf( - Long.valueOf(scoreArr[0])) - .divide(BigDecimal.valueOf(Long.valueOf(scoreArr[1])), 2, - RoundingMode.HALF_UP) - .multiply(BigDecimal.valueOf(100)).doubleValue()); - scoreOfTheContent = scoreOfTheContent.add(BigDecimal - .valueOf( - Long.valueOf(scoreArr[0])).multiply( - new BigDecimal("5"))); - totalScore = BigDecimal.valueOf( - Long.valueOf(scoreArr[1])).multiply(new BigDecimal("5")); - BigDecimal absSatisfyTotal = null; - if (totalScores.get("absSatisfy") != null) { - absSatisfyTotal = totalScores.get("absSatisfy").add( - new BigDecimal(scoreArr[0])); - } else { - absSatisfyTotal = new BigDecimal(scoreArr[0]); - } - totalScores.put("absSatisfy", absSatisfyTotal); - - BigDecimal total = null; - if (totalScores.get("total") != null) { - total = totalScores.get("total").add( - new BigDecimal(scoreArr[1])); - } else { - total = new BigDecimal(scoreArr[1]); - } - totalScores.put("total", total); - } else if (StringUtils - .equals(satisfactionMode, "ratherSatisfy")) { - satisfyItem.setRatherSatisfy_percent(BigDecimal - .valueOf( - Long.valueOf(scoreArr[0])) - .divide(BigDecimal.valueOf(Long.valueOf(scoreArr[1])), 2, - RoundingMode.HALF_UP) - .multiply(BigDecimal.valueOf(100)).doubleValue()); - scoreOfTheContent = scoreOfTheContent.add(BigDecimal - .valueOf( - Long.valueOf(scoreArr[0])).multiply( - new BigDecimal("4"))); - BigDecimal ratherSatisfyTotal = null; - if (totalScores.get("ratherSatisfy") != null) { - ratherSatisfyTotal = totalScores.get("ratherSatisfy") - .add(new BigDecimal(scoreArr[0])); - } else { - ratherSatisfyTotal = new BigDecimal(scoreArr[0]); - } - totalScores.put("ratherSatisfy", ratherSatisfyTotal); - } else if (StringUtils.equals(satisfactionMode, "basicSatisfy")) { - satisfyItem.setBasicSatisfy_percent(BigDecimal - .valueOf( - Long.valueOf(scoreArr[0])) - .divide(BigDecimal.valueOf(Long.valueOf(scoreArr[1])), 2, - RoundingMode.HALF_UP) - .multiply(BigDecimal.valueOf(100)).doubleValue()); - scoreOfTheContent = scoreOfTheContent.add(BigDecimal - .valueOf( - Long.valueOf(scoreArr[0])).multiply( - new BigDecimal("3"))); - - BigDecimal basicSatisfyTotal = null; - if (totalScores.get("basicSatisfy") != null) { - basicSatisfyTotal = totalScores.get("basicSatisfy") - .add(new BigDecimal(scoreArr[0])); - } else { - basicSatisfyTotal = new BigDecimal(scoreArr[0]); - } - totalScores.put("basicSatisfy", basicSatisfyTotal); - } else if (StringUtils.equals(satisfactionMode, - "notRatherSatisfy")) { - satisfyItem.setNotRatherSatisfy_percent(BigDecimal - .valueOf( - Long.valueOf(scoreArr[0])) - .divide(BigDecimal.valueOf(Long.valueOf(scoreArr[1])), 2, - RoundingMode.HALF_UP) - .multiply(BigDecimal.valueOf(100)).doubleValue()); - scoreOfTheContent = scoreOfTheContent.add(BigDecimal - .valueOf( - Long.valueOf(scoreArr[0])).multiply( - new BigDecimal("2"))); - - BigDecimal notRatherSatisfyTotal = null; - if (totalScores.get("notRatherSatisfy") != null) { - notRatherSatisfyTotal = totalScores.get( - "notRatherSatisfy").add( - new BigDecimal(scoreArr[0])); - } else { - notRatherSatisfyTotal = new BigDecimal(scoreArr[0]); - } - totalScores.put("notRatherSatisfy", notRatherSatisfyTotal); - } else if (StringUtils.equals(satisfactionMode, "noSatisfy")) { - satisfyItem.setNoSatisfy_percent(BigDecimal - .valueOf( - Long.valueOf(scoreArr[0])) - .divide(BigDecimal.valueOf(Long.valueOf(scoreArr[1])), 2, - RoundingMode.HALF_UP) - .multiply(BigDecimal.valueOf(100)).doubleValue()); - scoreOfTheContent = scoreOfTheContent.add(BigDecimal - .valueOf( - Long.valueOf(scoreArr[0])).multiply( - new BigDecimal("1"))); - - BigDecimal noSatisfyTotal = null; - if (totalScores.get("noSatisfy") != null) { - noSatisfyTotal = totalScores.get("noSatisfy").add( - new BigDecimal(scoreArr[0])); - } else { - noSatisfyTotal = new BigDecimal(scoreArr[0]); - } - totalScores.put("noSatisfy", noSatisfyTotal); - } - } - satisfyItem.setMyl(scoreOfTheContent - .multiply(new BigDecimal("100")) - .divide(totalScore, 2, BigDecimal.ROUND_HALF_EVEN) - .doubleValue()); - items.add(satisfyItem); - } - info.setSatisfyItems(items); - } - - private Map> extractSatisfactionSurveySourceMap( - SatisfyInfo info, List tables, - Set satisfactionSurveyTemplateIds) { - Map> itemMap = new LinkedHashMap>(); - String summary = null; - for (SatisfactionSurveyTable table : tables) { - if (StringUtils.isNotBlank(table.getRemark())) { - if (summary == null) { - summary = table.getRemark(); - } else { - summary += ";" + table.getRemark(); - } - } - satisfactionSurveyTemplateIds.add(table - .getSatisfactionSurveyTemplateId()); - Collections.sort(table.getAnswerItem(), - new Comparator() { - @Override - public int compare(SatisfactionSurveyTableItem b1, - SatisfactionSurveyTableItem b2) { - return b1.getSequenceNumber().compareTo( - b2.getSequenceNumber()); - } - }); - for (SatisfactionSurveyTableItem answerItem : table.getAnswerItem()) { - List answerItems = getAnswerItems(answerItem); - for (SatisfactionSurveyTableItem item : answerItems) { - Map scores = null; - if (itemMap.get(item.getContent()) == null) { - scores = new HashMap(); - scores.put("absSatisfy", item.getAbsSatisfy() + ";1"); - scores.put("ratherSatisfy", item.getRatherSatisfy() - + ";1"); - scores.put("basicSatisfy", item.getBasicSatisfy() - + ";1"); - scores.put("notRatherSatisfy", - item.getNotRatherSatisfy() + ";1"); - scores.put("noSatisfy", item.getNoSatisfy() + ";1"); - itemMap.put(item.getContent(), scores); - } else { - scores = itemMap.get(item.getContent()); - Integer absSatisfyCount = Integer.valueOf(scores.get( - "absSatisfy").split(";")[0]); - Integer ratherSatisfyCount = Integer.valueOf(scores - .get("ratherSatisfy").split(";")[0]); - Integer basicSatisfyCount = Integer.valueOf(scores.get( - "basicSatisfy").split(";")[0]); - Integer notRatherSatisfyCount = Integer.valueOf(scores - .get("notRatherSatisfy").split(";")[0]); - Integer noSatisfyCount = Integer.valueOf(scores.get( - "noSatisfy").split(";")[0]); - Integer totalCount = Integer.valueOf(scores.get( - "noSatisfy").split(";")[1]); - scores.put("absSatisfy", - (absSatisfyCount + item.getAbsSatisfy()) + ";" - + (totalCount + 1)); - scores.put("ratherSatisfy", - (ratherSatisfyCount + item.getRatherSatisfy()) - + ";" + (totalCount + 1)); - scores.put("basicSatisfy", - (basicSatisfyCount + item.getBasicSatisfy()) - + ";" + (totalCount + 1)); - scores.put( - "notRatherSatisfy", - (notRatherSatisfyCount + item - .getNotRatherSatisfy()) - + ";" - + (totalCount + 1)); - scores.put("noSatisfy", - (noSatisfyCount + item.getNoSatisfy()) + ";" - + (totalCount + 1)); - } - } - } - } - info.setSummary(summary); - return itemMap; - } - /** - * 因为满意度调查项是多层的自关联结构,并且只有没有子项的项才能打分,所以要通过 递归调用拿到最后面那一层的项 - * - * @param item - * @return - */ - private List getAnswerItems( - SatisfactionSurveyTableItem item) { - List itemList = null; - if (item.getChildren() == null || item.getChildren().size() == 0) { - if(itemList == null){ - itemList = new ArrayList(); - } - itemList.add(item); - } else { - for (SatisfactionSurveyTableItem answerItem : item.getChildren()) { - List list = getAnswerItems(answerItem); - if(CollectionUtils.isNotEmpty(list)){ - if(itemList == null){ - itemList = new ArrayList(); - } - itemList.addAll(list); - } - } - } - return itemList; - } @Override public List foreignTousseSupplierStatisticsReportDate( Index: ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/util/DepartSatisfyReportHelper.java =================================================================== diff -u --- ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/util/DepartSatisfyReportHelper.java (revision 0) +++ ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/util/DepartSatisfyReportHelper.java (revision 35798) @@ -0,0 +1,707 @@ +package com.forgon.disinfectsystem.jasperreports.util; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.Map.Entry; + +import net.sf.json.JSONObject; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager; +import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; +import com.forgon.disinfectsystem.entity.customform.formdefinition.FormDefinition; +import com.forgon.disinfectsystem.entity.customform.formdefinition.FormDefinitionItem; +import com.forgon.disinfectsystem.entity.customform.forminstance.FormInstance; +import com.forgon.disinfectsystem.entity.customform.forminstance.FormInstanceItem; +import com.forgon.disinfectsystem.entity.satisfactionsurvey.SatisfactionSurveyTable; +import com.forgon.disinfectsystem.entity.satisfactionsurvey.SatisfactionSurveyTableItem; +import com.forgon.disinfectsystem.entity.satisfactionsurvey.SatisfactionSurveyTemplate; +import com.forgon.disinfectsystem.jasperreports.javabeansource.DepartSatisfyDetailReportBean; +import com.forgon.disinfectsystem.jasperreports.javabeansource.SatisfyInfo; +import com.forgon.disinfectsystem.jasperreports.javabeansource.SatisfyItem; +import com.forgon.tools.StrutsParamUtils; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.format.ConvertNumber; +import com.forgon.tools.util.SqlUtils; +/** + * 满意度调查报表 包括明细和汇总 + */ +@Component +public class DepartSatisfyReportHelper extends ReportHelper{ + @Autowired + private SupplyRoomConfigManager supplyRoomConfigManager; + public List getSatisfyDetailDataSource(String startDay, String endDay, String formDefinitionName, String departCoding) + throws SQLException, ParseException { + List departSatisfyDetailReportBeans = new ArrayList(); + + out:if (StringUtils.isNotBlank(startDay) && StringUtils.isNotBlank(endDay)) { + startDay = startDay + " 00:00:00"; + endDay = endDay + " 23:59:59"; + Map map = getAllSuveryDepart(startDay,endDay); + if(MapUtils.isEmpty(map)){ + break out; + } + String sql = "where po.satisfactionSurveyTemplateId in " + + "(select ti.id from SatisfactionSurveyTemplate ti where ti.name = '" + + formDefinitionName + + "') and po.surveyDate>=" + + dateQueryAdapter.dateAdapter(startDay) + + " and po.surveyDate <= " + + dateQueryAdapter.dateAdapter(endDay); + if(StringUtils.isNotBlank(departCoding)){ + sql += " and po.departCoding='"+ departCoding +"' "; + } + sql += " order by po.depart,po.surveyDate"; + @SuppressWarnings("unchecked") + List list = objectDao.findBySql( + SatisfactionSurveyTable.class.getName(), sql); + if (CollectionUtils.isNotEmpty(list)) { + int orderNum = 1; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + Set formInstanceIds = new HashSet(); + for (SatisfactionSurveyTable satisfactionSurveyTable : list) { + if(DatabaseUtil.isPoIdValid(satisfactionSurveyTable.getFormInstance_id())){ + formInstanceIds.add(satisfactionSurveyTable.getFormInstance_id()); + } + } + Map formInstanceMap = new HashMap(); + if(CollectionUtils.isNotEmpty(formInstanceIds)){ + sql = "select fdi.name,fii.answer,fi.id from " + + FormInstance.class.getSimpleName() + +" fi join " + + FormInstanceItem.class.getSimpleName() + + " fii on fii.formInstance_id=fi.id join " + + FormDefinitionItem.class.getSimpleName() + + " fdi on fdi.id=fii.formDefinitionItem_id where " + + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("fi.id", formInstanceIds); + ResultSet rs = objectDao.executeSql(sql); + try { + while(rs.next()){ + String name = rs.getString("name"); + String answer = rs.getString("answer"); + if(StringUtils.isNotBlank(answer) && answer.endsWith(";")){ + answer = answer.substring(0, answer.length() - 1); + } + long id = rs.getLong("id"); + JSONObject obj = formInstanceMap.get(id); + if(obj == null){ + obj = new JSONObject(); + } + obj.put(name, answer); + formInstanceMap.put(id, obj); + } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + } + //要获取最新的属性 + Map formDefinitionItemNameMap = getFormDefinitionOrderInfo(formDefinitionName); + for (SatisfactionSurveyTable satisfactionSurveyTable : list) { + setDepartSatisfyDetailReportBean(formDefinitionItemNameMap, formInstanceMap, sdf, orderNum, satisfactionSurveyTable, departSatisfyDetailReportBeans); + orderNum++; + } + } + } + return departSatisfyDetailReportBeans; + } + /** + * 获取表单最新定义的信息 宽度 显示方式等 + * @param formName 表单名称 + * @return + */ + private Map getFormDefinitionOrderInfo(String formName){ + StringBuilder sbf = new StringBuilder(300); + sbf.append("select fdi.name,fdi.displayFormat,fdi.width from ") + .append(FormDefinition.class.getSimpleName()) + .append(" fd join ") + .append(FormDefinitionItem.class.getSimpleName()) + .append(" fdi on fd.id=fdi.formDefinition_id ") + .append(" where fd.version=(select max(version) from FormDefinition where formName='") + .append(formName) + .append("') and formName='") + .append(formName) + .append("' order by fdi.orderNumber "); + ResultSet rs = null; + Map formDefinitionItemNameMap = new LinkedHashMap(); + try { + rs = objectDao.executeSql(sbf.toString()); + while(rs.next()){ + String formDefinitionItemName = rs.getString("name"); + String displayFormat = rs.getString("displayFormat"); + Integer width = ConvertNumber.getNumberIntValue(rs.getObject("width"), null); + FormDefinitionItem formDefinitionItem = new FormDefinitionItem(); + formDefinitionItem.setDisplayFormat(displayFormat); + formDefinitionItem.setWidth(width); + formDefinitionItemNameMap.put(formDefinitionItemName, formDefinitionItem); + } + } catch (Exception e) { + e.printStackTrace(); + } finally{ + DatabaseUtil.closeResultSetAndStatement(rs); + } + return formDefinitionItemNameMap; + } + /** + * 设置满意度调查明细报表bean + * @param mapObj + * @param sdf + * @param orderNum + * @param satisfactionSurveyTable + * @param departSatisfyDetailReportBeans + */ + private void setDepartSatisfyDetailReportBean(Map formDefinitionItemNameMap ,Map mapObj, SimpleDateFormat sdf, int orderNum , SatisfactionSurveyTable satisfactionSurveyTable, List departSatisfyDetailReportBeans){ + List parentItems = satisfactionSurveyTable.getAnswerItem(); + DepartSatisfyDetailReportBean bean0 = new DepartSatisfyDetailReportBean(); + bean0.setOrderNum(orderNum); + bean0.setColumnName("评价时间"); + bean0.setColumnSequence(2); + bean0.setValue(sdf.format(satisfactionSurveyTable.getSurveyDate())); + departSatisfyDetailReportBeans.add(bean0); + + DepartSatisfyDetailReportBean bean = new DepartSatisfyDetailReportBean(); + bean.setOrderNum(orderNum); + bean.setColumnName("评价科室"); + bean.setColumnSequence(3); + bean.setValue(satisfactionSurveyTable.getDepart()); + departSatisfyDetailReportBeans.add(bean); + if(CollectionUtils.isNotEmpty(parentItems)){ + int sequ = 100; + for (SatisfactionSurveyTableItem parentItem : parentItems) { + List sonItems = parentItem.getChildren(); + if(CollectionUtils.isNotEmpty(sonItems)){ + sequ++; + for (SatisfactionSurveyTableItem sonItem : sonItems) { + DepartSatisfyDetailReportBean bean1 = new DepartSatisfyDetailReportBean(); + bean1.setValue(sonItem.getSatisfaction().getValue()); + bean1.setColumnName(sonItem.getContent()); + bean1.setColumnSequence(sequ); + bean1.setOrderNum(orderNum); + departSatisfyDetailReportBeans.add(bean1); + sequ++; + } + }else{ + sequ++; + DepartSatisfyDetailReportBean bean1 = new DepartSatisfyDetailReportBean(); + bean1.setValue(parentItem.getSatisfaction().getValue()); + bean1.setColumnName(parentItem.getContent()); + bean1.setColumnSequence(sequ); + bean1.setOrderNum(orderNum); + departSatisfyDetailReportBeans.add(bean1); + sequ++; + } + sequ += 100; + } + Long formInstance_id = satisfactionSurveyTable.getFormInstance_id(); + if(DatabaseUtil.isPoIdValid(formInstance_id) && MapUtils.isNotEmpty(mapObj)){ + sequ = 5000; + JSONObject formInstanceObj = mapObj.get(formInstance_id); + for (String formDefinitionItemName : formDefinitionItemNameMap.keySet()) { + DepartSatisfyDetailReportBean formInstanceBean = new DepartSatisfyDetailReportBean(); + formInstanceBean.setValue(formInstanceObj.optString(formDefinitionItemName)); + formInstanceBean.setColumnName(formDefinitionItemName); + formInstanceBean.setColumnSequence(sequ); + formInstanceBean.setOrderNum(orderNum); + departSatisfyDetailReportBeans.add(formInstanceBean); + sequ++; + } + } + } + DepartSatisfyDetailReportBean bean8 = new DepartSatisfyDetailReportBean(); + bean8.setOrderNum(orderNum); + bean8.setColumnName("评价人"); + bean8.setColumnSequence(6000); + bean8.setValue(satisfactionSurveyTable.getUserName()); + departSatisfyDetailReportBeans.add(bean8); + } + /** + * 获取满意度调查汇总报表数据 + * @param parametMap 参数map + * @return + * @throws SQLException + * @throws ParseException + */ + public List getSatisfyDataSource(Map parametMap) throws SQLException, ParseException { + List supplyRoomConfigs = supplyRoomConfigManager + .getSupplyRoomList(SupplyRoomConfig.SUPPLYROOM_TYPE_APPLY); + String startDay = StrutsParamUtils.getPraramValue("startTime", ""); + String endDay = StrutsParamUtils.getPraramValue("endTime", ""); + Long satisfactionSurveyTemplateId = StrutsParamUtils.getPraramLongValue("satisfactionSurveyTemplateId", 0L); + String summaryType = StrutsParamUtils.getPraramValue("summaryType", ""); + List infos = new ArrayList(); + String summaryOfHospital = "全院汇总"; + String hospitalName = "全院"; + Set satisfactionSurveyTemplateIds = new HashSet(); + out:if (StringUtils.isNotBlank(startDay) && StringUtils.isNotBlank(endDay)) { + startDay = startDay + "-01 00:00:00"; + endDay = getMonthEndDate(endDay); + Map map = getAllSuveryDepart(startDay,endDay); + if(MapUtils.isEmpty(map)){ + break out; + } + Set orgCodeSet = map.keySet(); + int departCount = 0; + if(summaryOfHospital.equals(summaryType)){ + orgCodeSet = new HashSet(); + orgCodeSet.add(summaryOfHospital); + String countSql = "select count(distinct departCoding) from " + SatisfactionSurveyTable.class.getSimpleName() + + " po where po.satisfactionSurveyTemplateId in " + + "(select ti.id from SatisfactionSurveyTemplate ti where ti.entryDate >= " + + dateQueryAdapter.dateAdapter(startDay) + + " and ti.entryDate <= " + + dateQueryAdapter.dateAdapter(endDay) + ")"; + if(DatabaseUtil.isPoIdValid(satisfactionSurveyTemplateId)){ + countSql += " and po.satisfactionSurveyTemplateId=" + satisfactionSurveyTemplateId; + } + departCount = objectDao.countBySql(countSql); + } + Map totalScores = new HashMap(); + for (String orgCoding : orgCodeSet) { + String sql = "where po.satisfactionSurveyTemplateId in " + + "(select ti.id from SatisfactionSurveyTemplate ti where ti.entryDate >= " + + dateQueryAdapter.dateAdapter(startDay) + + " and ti.entryDate <= " + + dateQueryAdapter.dateAdapter(endDay) + ")"; + if(DatabaseUtil.isPoIdValid(satisfactionSurveyTemplateId)){ + sql += " and po.satisfactionSurveyTemplateId=" + satisfactionSurveyTemplateId; + } + if(!summaryOfHospital.equals(summaryType)){ + sql += " and po.departCoding='"+ orgCoding +"'"; + } + @SuppressWarnings("unchecked") + List list = objectDao.findBySql( + SatisfactionSurveyTable.class.getName(), sql); + if (!list.isEmpty() && list.size() != 0) { + SatisfyInfo info = new SatisfyInfo(); + if(summaryOfHospital.equals(summaryType)){ + info.setDepartName(hospitalName); + }else{ + for (SupplyRoomConfig config : supplyRoomConfigs) { + if (StringUtils.equals(orgCoding, + config.getOrgUnitCoding())) { + info.setSequenceNum(config.getSequence()); + break; + } + } + info.setDepartName(map.get(orgCoding)); + departCount++; + } + generateSatisfyItems(info, list, totalScores, + satisfactionSurveyTemplateIds); + infos.add(info); + } + } + parametMap.put("departCount", departCount); + Double absSatisfyTotal = null; + Double ratherSatisfyTotal = null; + Double basicSatisfyTotal = null; + Double notRatherSatisfyTotal = null; + Double noSatisfyTotal = null; + Double mylTotal = null; + for(Entry entry : totalScores.entrySet()){ + String satisfactionMode = entry.getKey(); + if (StringUtils.equals("absSatisfy", satisfactionMode)) { + absSatisfyTotal = entry.getValue().multiply(new BigDecimal("100")) + .divide(totalScores.get("total"), 2, + BigDecimal.ROUND_HALF_EVEN).doubleValue(); + } else if (StringUtils + .equals("ratherSatisfy", satisfactionMode)) { + ratherSatisfyTotal = entry.getValue().multiply(new BigDecimal("100")) + .divide(totalScores.get("total"), 2, + BigDecimal.ROUND_HALF_EVEN).doubleValue(); + } else if (StringUtils.equals("basicSatisfy", satisfactionMode)) { + basicSatisfyTotal = entry.getValue().multiply(new BigDecimal("100")) + .divide(totalScores.get("total"), 2, + BigDecimal.ROUND_HALF_EVEN).doubleValue(); + } else if (StringUtils.equals("notRatherSatisfy", + satisfactionMode)) { + notRatherSatisfyTotal = entry.getValue().multiply(new BigDecimal("100")) + .divide(totalScores.get("total"), 2, + BigDecimal.ROUND_HALF_EVEN).doubleValue(); + } else if (StringUtils.equals("noSatisfy", satisfactionMode)) { + noSatisfyTotal = entry.getValue().multiply(new BigDecimal("100")) + .divide(totalScores.get("total"), 2, + BigDecimal.ROUND_HALF_EVEN).doubleValue(); + mylTotal = totalScores + .get("absSatisfy") + .multiply(new BigDecimal("5")) + .add(totalScores.get("ratherSatisfy").multiply( + new BigDecimal("4"))) + .add(totalScores.get("basicSatisfy").multiply( + new BigDecimal("3"))) + .add(totalScores.get("notRatherSatisfy").multiply( + new BigDecimal("2"))) + .add(totalScores.get("noSatisfy").multiply( + new BigDecimal("1"))) + .multiply(new BigDecimal("100")) + .divide(totalScores.get("total").multiply( + new BigDecimal("5")), 2, + BigDecimal.ROUND_HALF_EVEN).doubleValue(); + + } + } + String totalSummary = null; + for (Long id : satisfactionSurveyTemplateIds) { + SatisfactionSurveyTemplate template = (SatisfactionSurveyTemplate) objectDao + .getByProperty( + SatisfactionSurveyTemplate.class.getName(), + "id", id); + if (StringUtils.isNotBlank(template.getSummary())) { + if (StringUtils.isBlank(totalSummary)) { + totalSummary = template.getSummary(); + } else { + totalSummary += ";" + template.getSummary(); + } + } + } + for (SatisfyInfo info : infos) { + info.setAvg_abs(absSatisfyTotal); + info.setAvg_rather(ratherSatisfyTotal); + info.setAvg_basic(basicSatisfyTotal); + info.setAvg_notrather(notRatherSatisfyTotal); + info.setAvg_no(noSatisfyTotal); + info.setAvg_myl(mylTotal); + info.setTotalSummary(totalSummary); + } + } + + Collections.sort(infos, new Comparator() { + @Override + public int compare(SatisfyInfo b1, SatisfyInfo b2) { + if(b1.getSequenceNum() == null ){ //序号为空比较项排前 + return 1; + }else if(b2.getSequenceNum() == null){ //比较项序号为空排后 + return -1; + } + return b1.getSequenceNum().compareTo(b2.getSequenceNum()); + } + }); + return infos; + } + /** + * 获取某个月的开始日期下一个月的第一天 2012-01-01 2012-02-01 + * + * @param month + * @return + */ + private String getMonthEndDate(String month) { + if (StringUtils.isNotBlank(month)) { + Date date = null; + try { + date = new SimpleDateFormat("yyyy-MM").parse(month); + } catch (ParseException e) { + e.printStackTrace(); + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.DAY_OF_MONTH, + calendar.getActualMaximum(Calendar.DAY_OF_MONTH) - 1); + return new SimpleDateFormat("yyyy-MM-dd").format(calendar + .getTime()) + " 23:59:59"; + } + return null; + } + // 该方法得到所有填写调查表的科室(科室之间可能有重复,因为一份调查表可以由同一科室的多个人填写) + /** + * key--departCode,value--departName + * + * @return + * @throws SQLException + * 2014-5-28 + */ + private Map getAllSuveryDepart(String startDay, String endDay) throws SQLException { + Map map = new HashMap(); + String daySql = " where satisfactionSurveyTemplateId in " + + "(select ti.id from SatisfactionSurveyTemplate ti where ti.entryDate >= " + + dateQueryAdapter.dateAdapter(startDay) + + " and ti.entryDate <= " + + dateQueryAdapter.dateAdapter(endDay) + ")"; + String sql = " select distinct departcoding,DEPART from satisfactionsurveytable" + + daySql + + " order by departCoding"; + ResultSet rs = objectDao.executeSql(sql); + try { + while (rs.next()) { + if (map.containsKey(rs.getString(1))) { + continue; + } + map.put(rs.getString(1), rs.getString(2)); + } + } catch (Exception e) { + throw e; + }finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + return map; + } + private void generateSatisfyItems(SatisfyInfo info, + List tables, + Map totalScores, + Set satisfactionSurveyTemplateIds) throws SQLException { + /** + * key:content,value.key:分数(5,4,3,2,1),value.value:分值(0,1) + */ + // map中包含map,其中包括3个字符串,第一个是调查项,第二个是满意的程度,第三个是个数和总数的字符串中间用分号区分 + // eg:1.您对消毒供应护士的工作态度是否满意--满意--1;10 + Map> itemMap = extractSatisfactionSurveySourceMap( + info, tables, satisfactionSurveyTemplateIds); + List items = new ArrayList(); + for(Entry> entry : itemMap.entrySet()){ + SatisfyItem satisfyItem = new SatisfyItem(); + satisfyItem.setContent(entry.getKey()); + Map scoreMap = entry.getValue(); + BigDecimal scoreOfTheContent = new BigDecimal("0"); + BigDecimal totalScore = null; + for(Entry entry2 : scoreMap.entrySet()){ + String satisfactionMode = entry2.getKey(); + String score = entry2.getValue(); + String[] scoreArr = score.split(";"); + if (StringUtils.equals(satisfactionMode, "absSatisfy")) { + satisfyItem.setAbsSatisfy_percent(BigDecimal + .valueOf( + Long.valueOf(scoreArr[0])) + .divide(BigDecimal.valueOf(Long.valueOf(scoreArr[1])), 2, + RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)).doubleValue()); + scoreOfTheContent = scoreOfTheContent.add(BigDecimal + .valueOf( + Long.valueOf(scoreArr[0])).multiply( + new BigDecimal("5"))); + totalScore = BigDecimal.valueOf( + Long.valueOf(scoreArr[1])).multiply(new BigDecimal("5")); + BigDecimal absSatisfyTotal = null; + if (totalScores.get("absSatisfy") != null) { + absSatisfyTotal = totalScores.get("absSatisfy").add( + new BigDecimal(scoreArr[0])); + } else { + absSatisfyTotal = new BigDecimal(scoreArr[0]); + } + totalScores.put("absSatisfy", absSatisfyTotal); + + BigDecimal total = null; + if (totalScores.get("total") != null) { + total = totalScores.get("total").add( + new BigDecimal(scoreArr[1])); + } else { + total = new BigDecimal(scoreArr[1]); + } + totalScores.put("total", total); + } else if (StringUtils + .equals(satisfactionMode, "ratherSatisfy")) { + satisfyItem.setRatherSatisfy_percent(BigDecimal + .valueOf( + Long.valueOf(scoreArr[0])) + .divide(BigDecimal.valueOf(Long.valueOf(scoreArr[1])), 2, + RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)).doubleValue()); + scoreOfTheContent = scoreOfTheContent.add(BigDecimal + .valueOf( + Long.valueOf(scoreArr[0])).multiply( + new BigDecimal("4"))); + BigDecimal ratherSatisfyTotal = null; + if (totalScores.get("ratherSatisfy") != null) { + ratherSatisfyTotal = totalScores.get("ratherSatisfy") + .add(new BigDecimal(scoreArr[0])); + } else { + ratherSatisfyTotal = new BigDecimal(scoreArr[0]); + } + totalScores.put("ratherSatisfy", ratherSatisfyTotal); + } else if (StringUtils.equals(satisfactionMode, "basicSatisfy")) { + satisfyItem.setBasicSatisfy_percent(BigDecimal + .valueOf( + Long.valueOf(scoreArr[0])) + .divide(BigDecimal.valueOf(Long.valueOf(scoreArr[1])), 2, + RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)).doubleValue()); + scoreOfTheContent = scoreOfTheContent.add(BigDecimal + .valueOf( + Long.valueOf(scoreArr[0])).multiply( + new BigDecimal("3"))); + + BigDecimal basicSatisfyTotal = null; + if (totalScores.get("basicSatisfy") != null) { + basicSatisfyTotal = totalScores.get("basicSatisfy") + .add(new BigDecimal(scoreArr[0])); + } else { + basicSatisfyTotal = new BigDecimal(scoreArr[0]); + } + totalScores.put("basicSatisfy", basicSatisfyTotal); + } else if (StringUtils.equals(satisfactionMode, + "notRatherSatisfy")) { + satisfyItem.setNotRatherSatisfy_percent(BigDecimal + .valueOf( + Long.valueOf(scoreArr[0])) + .divide(BigDecimal.valueOf(Long.valueOf(scoreArr[1])), 2, + RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)).doubleValue()); + scoreOfTheContent = scoreOfTheContent.add(BigDecimal + .valueOf( + Long.valueOf(scoreArr[0])).multiply( + new BigDecimal("2"))); + + BigDecimal notRatherSatisfyTotal = null; + if (totalScores.get("notRatherSatisfy") != null) { + notRatherSatisfyTotal = totalScores.get( + "notRatherSatisfy").add( + new BigDecimal(scoreArr[0])); + } else { + notRatherSatisfyTotal = new BigDecimal(scoreArr[0]); + } + totalScores.put("notRatherSatisfy", notRatherSatisfyTotal); + } else if (StringUtils.equals(satisfactionMode, "noSatisfy")) { + satisfyItem.setNoSatisfy_percent(BigDecimal + .valueOf( + Long.valueOf(scoreArr[0])) + .divide(BigDecimal.valueOf(Long.valueOf(scoreArr[1])), 2, + RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)).doubleValue()); + scoreOfTheContent = scoreOfTheContent.add(BigDecimal + .valueOf( + Long.valueOf(scoreArr[0])).multiply( + new BigDecimal("1"))); + + BigDecimal noSatisfyTotal = null; + if (totalScores.get("noSatisfy") != null) { + noSatisfyTotal = totalScores.get("noSatisfy").add( + new BigDecimal(scoreArr[0])); + } else { + noSatisfyTotal = new BigDecimal(scoreArr[0]); + } + totalScores.put("noSatisfy", noSatisfyTotal); + } + } + satisfyItem.setMyl(scoreOfTheContent + .multiply(new BigDecimal("100")) + .divide(totalScore, 2, BigDecimal.ROUND_HALF_EVEN) + .doubleValue()); + items.add(satisfyItem); + } + info.setSatisfyItems(items); + } + private Map> extractSatisfactionSurveySourceMap( + SatisfyInfo info, List tables, + Set satisfactionSurveyTemplateIds) { + Map> itemMap = new LinkedHashMap>(); + String summary = null; + for (SatisfactionSurveyTable table : tables) { + if (StringUtils.isNotBlank(table.getRemark())) { + if (summary == null) { + summary = table.getRemark(); + } else { + summary += ";" + table.getRemark(); + } + } + satisfactionSurveyTemplateIds.add(table + .getSatisfactionSurveyTemplateId()); + Collections.sort(table.getAnswerItem(), + new Comparator() { + @Override + public int compare(SatisfactionSurveyTableItem b1, + SatisfactionSurveyTableItem b2) { + return b1.getSequenceNumber().compareTo( + b2.getSequenceNumber()); + } + }); + for (SatisfactionSurveyTableItem answerItem : table.getAnswerItem()) { + List answerItems = getAnswerItems(answerItem); + for (SatisfactionSurveyTableItem item : answerItems) { + Map scores = null; + if (itemMap.get(item.getContent()) == null) { + scores = new HashMap(); + scores.put("absSatisfy", item.getAbsSatisfy() + ";1"); + scores.put("ratherSatisfy", item.getRatherSatisfy() + + ";1"); + scores.put("basicSatisfy", item.getBasicSatisfy() + + ";1"); + scores.put("notRatherSatisfy", + item.getNotRatherSatisfy() + ";1"); + scores.put("noSatisfy", item.getNoSatisfy() + ";1"); + itemMap.put(item.getContent(), scores); + } else { + scores = itemMap.get(item.getContent()); + Integer absSatisfyCount = Integer.valueOf(scores.get( + "absSatisfy").split(";")[0]); + Integer ratherSatisfyCount = Integer.valueOf(scores + .get("ratherSatisfy").split(";")[0]); + Integer basicSatisfyCount = Integer.valueOf(scores.get( + "basicSatisfy").split(";")[0]); + Integer notRatherSatisfyCount = Integer.valueOf(scores + .get("notRatherSatisfy").split(";")[0]); + Integer noSatisfyCount = Integer.valueOf(scores.get( + "noSatisfy").split(";")[0]); + Integer totalCount = Integer.valueOf(scores.get( + "noSatisfy").split(";")[1]); + scores.put("absSatisfy", + (absSatisfyCount + item.getAbsSatisfy()) + ";" + + (totalCount + 1)); + scores.put("ratherSatisfy", + (ratherSatisfyCount + item.getRatherSatisfy()) + + ";" + (totalCount + 1)); + scores.put("basicSatisfy", + (basicSatisfyCount + item.getBasicSatisfy()) + + ";" + (totalCount + 1)); + scores.put( + "notRatherSatisfy", + (notRatherSatisfyCount + item + .getNotRatherSatisfy()) + + ";" + + (totalCount + 1)); + scores.put("noSatisfy", + (noSatisfyCount + item.getNoSatisfy()) + ";" + + (totalCount + 1)); + } + } + } + } + info.setSummary(summary); + return itemMap; + } + /** + * 因为满意度调查项是多层的自关联结构,并且只有没有子项的项才能打分,所以要通过 递归调用拿到最后面那一层的项 + * + * @param item + * @return + */ + private List getAnswerItems( + SatisfactionSurveyTableItem item) { + List itemList = null; + if (item.getChildren() == null || item.getChildren().size() == 0) { + if(itemList == null){ + itemList = new ArrayList(); + } + itemList.add(item); + } else { + for (SatisfactionSurveyTableItem answerItem : item.getChildren()) { + List list = getAnswerItems(answerItem); + if(CollectionUtils.isNotEmpty(list)){ + if(itemList == null){ + itemList = new ArrayList(); + } + itemList.addAll(list); + } + } + } + return itemList; + } +}