Index: ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/instrumentrepairreport/handler/InstrumentRepairBarChartReportHandler.java =================================================================== diff -u --- ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/instrumentrepairreport/handler/InstrumentRepairBarChartReportHandler.java (revision 0) +++ ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/instrumentrepairreport/handler/InstrumentRepairBarChartReportHandler.java (revision 41564) @@ -0,0 +1,147 @@ +package com.forgon.disinfectsystem.jasperreports.instrumentrepairreport.handler; + +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.forgon.Constants; +import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.disinfectsystem.jasperreports.ReportsConstant; +import com.forgon.disinfectsystem.jasperreports.service.JasperReportsHandler; +import com.forgon.tools.StrutsParamUtils; +import com.forgon.tools.db.InitDbConnection; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.util.SqlUtils; +@Service +public class InstrumentRepairBarChartReportHandler implements JasperReportsHandler{ + @Autowired + private InitDbConnection dbConnection; + @Autowired + private DateQueryAdapter dateQueryAdapter; + @Autowired + private ObjectDao objectDao; + @Override + public boolean support(String reportName) { + return ReportsConstant.REPORT_INSTRUMENT_REPAIR_BAR_CHART.equals(reportName); + } + + @Override + public List handle(String jasperReportName, String reportName, + Map requestParameters, + Map parameterMap) { + String startTime = StrutsParamUtils.getPraramValue("startTime", ""); + String endTime = StrutsParamUtils.getPraramValue("endTime", ""); + startTime = "2025-08"; + endTime = "2025-10"; + if(StringUtils.isBlank(startTime) || StringUtils.isBlank(endTime)){ + return null; + } + startTime += "-01 00:00:00"; + endTime += "-01 00:00:00"; + String repairStatus = requestParameters.get("repairStatus"); + String registrantName = requestParameters.get("registrantName"); + String materialName = requestParameters.get("materialName"); + String tousseName = requestParameters.get("tousseName"); + String instrumentBarcode = requestParameters.get("instrumentBarcode"); + String idCardInstanceBarcode = requestParameters.get("idCardInstanceBarcode"); + String deviceTypeHttpOptionId = requestParameters.get("deviceTypeHttpOptionId"); + String faultLocationHttpOptionId = requestParameters.get("faultLocationHttpOptionId"); + String reviewStatus = requestParameters.get("reviewStatus"); + String materialNameSQL = null; + if(StringUtils.isNotBlank(materialName)){ + if(materialName.contains("[") && materialName.contains("]") && materialName.lastIndexOf("]") > materialName.indexOf("[")){ + String showNameSql = dbConnection.concatSql("md.name", "'['", "md.specification", "']'"); + materialNameSQL = " and " + showNameSql + " = '" + materialName + "'"; + }else{ + materialNameSQL = " and md.name = '" + materialName + "'"; + } + }else{ + materialNameSQL = StringUtils.EMPTY; + } + String repairStatusSql = SqlUtils.getWhereSqlByfilterFieldAndStringValueAndSeparator("i.repairStatus", repairStatus, ","); + String registrantNameSql = SqlUtils.getWhereSqlByfilterFieldAndStringValue("i.registrantName", registrantName); + String reviewStatusSql = SqlUtils.getWhereSqlByfilterFieldAndStringValue("i.reviewStatus", reviewStatus); + String tousseNameSql = SqlUtils.getWhereSqlByfilterFieldAndStringValue("td.name", tousseName); + String faultLocationHttpOptionIdSql = SqlUtils.getInLongListSql("g.faultLocationHttpOptionId", SqlUtils.splitLongToSet(faultLocationHttpOptionId, Constants.IDS_SEPARATOR, false)); + String deviceTypeHttpOptionIdSql = SqlUtils.getInLongListSql("g.deviceTypeHttpOptionId", SqlUtils.splitLongToSet(deviceTypeHttpOptionId, Constants.IDS_SEPARATOR, false)); + String instrumentBarcodeSql = (StringUtils.isNotBlank(instrumentBarcode)?" and g.instrumentBarcode='"+ instrumentBarcode +"' ":StringUtils.EMPTY); + String idCardInstanceBarcodeSql = (StringUtils.isNotBlank(idCardInstanceBarcode)?" and g.idCardInstanceBarcode='"+ idCardInstanceBarcode +"' ":StringUtils.EMPTY); + String betweenSql = String.format(" i.registerDateTime between %s and %s ", dateQueryAdapter.dateAdapter(startTime),dateQueryAdapter.dateAdapter(endTime)); + String generalQueryConditions = betweenSql + materialNameSQL + repairStatusSql + registrantNameSql + reviewStatusSql + tousseNameSql + instrumentBarcodeSql + idCardInstanceBarcodeSql; + + String ymSql = dateQueryAdapter.dateToVarchar2("i.registerDateTime"); + Map> faultLocationMap = null; + if(StringUtils.isBlank(deviceTypeHttpOptionId)){ + String faultLocationSql = createFaultLocationSql(generalQueryConditions + faultLocationHttpOptionIdSql, ymSql); + faultLocationMap = buildOptionTextMap(faultLocationSql); + } + Map> deviceTypeMap = null; + if(StringUtils.isBlank(faultLocationHttpOptionId)){ + String deviceTypeSql = createDeviceTypeSql(generalQueryConditions + deviceTypeHttpOptionIdSql, ymSql); + deviceTypeMap = buildOptionTextMap(deviceTypeSql); + } + parameterMap.put("title", "器械维修记录报表" + startTime + "至" + endTime); + parameterMap.put("faultLocationMap", faultLocationMap); + parameterMap.put("deviceTypeMap", deviceTypeMap); + System.out.println(JSONObject.fromObject(parameterMap)); + return new JSONArray(); + } + private Map> buildOptionTextMap(String sql) { + Map> resultMap = new HashMap<>(); + try (ResultSet rs = objectDao.executeSql(sql)){ + while (rs.next()) { + String yearMonth = rs.getString("yyyymm"); + String deviceType = rs.getString("optionText"); + int amount = rs.getInt("amount"); + + resultMap + .computeIfAbsent(yearMonth, k -> new HashMap<>()) + .put(deviceType, amount); + } + } catch (Exception e) { + e.printStackTrace(); + } + return resultMap; + } + private String createDeviceTypeSql(String generalQueryConditions, String ymSql){ + String sql = "select sum(g.amount) amount " + + ",deviceTypeho.optionText ,"+ ymSql +" yyyymm " + + "from " + + "InstrumentRepair" + + " i join " + + "InstrumentRepairGoods" + + " g on i.id=g.instrumentRepair_ID join " + + "HttpOption" + + " deviceTypeho on deviceTypeho.id=g.deviceTypeHttpOptionId " + + "left join TousseDefinition td on td.id=g.toussedefinitionId " + + "left join MaterialDefinition md on md.id=g.materialDefinitionID where " + + generalQueryConditions + + "group by "+ ymSql +",deviceTypeho.optionText"; + return sql; + } + private String createFaultLocationSql(String generalQueryConditions, String ymSql){ + String sql = "select sum(g.amount) amount " + + ",faultLocationho.optionText,"+ ymSql +" yyyymm " + + "from " + + "InstrumentRepair" + + " i join " + + "InstrumentRepairGoods" + + " g on i.id=g.instrumentRepair_ID join " + + "HttpOption" + + " faultLocationho on faultLocationho.id=g.faultLocationHttpOptionId " + + "left join TousseDefinition td on td.id=g.toussedefinitionId " + + "left join MaterialDefinition md on md.id=g.materialDefinitionID where " + + generalQueryConditions + + "group by "+ ymSql +",faultLocationho.optionText"; + return sql; + } +} Index: ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/ReportsConstant.java =================================================================== diff -u -r41193 -r41564 --- ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/ReportsConstant.java (.../ReportsConstant.java) (revision 41193) +++ ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/ReportsConstant.java (.../ReportsConstant.java) (revision 41564) @@ -12,4 +12,10 @@ * 未录入使用记录的器械包统计报表 */ public static final String REPORT_NAME_UN_USE_TOUSSE_INSTANCE = "unUseTousseInstance"; + + /** + * 器械维修记录报表柱状图 + */ + public static final String REPORT_INSTRUMENT_REPAIR_BAR_CHART = "instrumentRepairBarChartReport"; + }