package cn.com.goldenwater.dcproj.service.impl; import cn.com.goldenwater.core.service.AbstractCrudService; import cn.com.goldenwater.dcproj.dao.ChkSafeProdLedgerDao; import cn.com.goldenwater.dcproj.dao.ChkSafeSelsProjDao; import cn.com.goldenwater.dcproj.dao.OlBisInspOrgDao; import cn.com.goldenwater.dcproj.model.ChkSafeProdLedger; import cn.com.goldenwater.dcproj.model.ChkSafeSelsProj; import cn.com.goldenwater.dcproj.model.OlBisInspOrg; import cn.com.goldenwater.dcproj.param.ChkSafeSelsProjParam; import cn.com.goldenwater.dcproj.service.ChkSafeProdLedgerService; import cn.com.goldenwater.dcproj.utils.AdLevelUtil; import cn.com.goldenwater.dcproj.utils.expExcel.ExcelExport; import cn.com.goldenwater.dcproj.utils.expExcel.ExportAbstract; import cn.com.goldenwater.dcproj.utils.expExcel.ExportUtil; import cn.com.goldenwater.id.util.UuidUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import io.swagger.annotations.ApiModelProperty; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletResponse; import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.math.BigDecimal; import java.math.RoundingMode; import java.net.URLEncoder; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @Service @Transactional public class ChkSafeProdLedgerServiceImpl extends AbstractCrudService implements ChkSafeProdLedgerService { private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private ChkSafeProdLedgerDao chkSafeProdLedgerDao; @Value("${export.templatePath}") private String templatePath; @Autowired private ChkSafeSelsProjDao chkSafeSelsProjDao; @Autowired private OlBisInspOrgDao olBisInspOrgDao; /** * 导出模板 * 水务行业安全大检查情况表 */ private String templateName = "chkSafeProdLedgerExport.xls"; public ChkSafeProdLedgerServiceImpl(ChkSafeProdLedgerDao chkSafeProdLedgerDao) { super(chkSafeProdLedgerDao); this.chkSafeProdLedgerDao = chkSafeProdLedgerDao; } @Override public int insert(ChkSafeProdLedger chkSafeProdLedger) { String uuid = UuidUtil.uuid(); // 生成uuid chkSafeProdLedger.setId(uuid); chkSafeProdLedger.setIntm(new Date()); chkSafeProdLedger.setUptm(chkSafeProdLedger.getIntm()); chkSafeProdLedger.setDataStat("0"); chkSafeProdLedger.setChkSubmitDttm(chkSafeProdLedger.getIntm()); try { LocalDateTime localDateTime = convertDateToLocalDateTime(chkSafeProdLedger.getIntm()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d"); chkSafeProdLedger.setChkMnth(sdf.parse(String.format("%d-%d-1",localDateTime.getYear(),localDateTime.getMonthValue()))); } catch (ParseException e) { } chkSafeProdLedger.setFillRepoStat("1"); return this.chkSafeProdLedgerDao.insert(chkSafeProdLedger); } @Override public int update(ChkSafeProdLedger chkSafeProdLedger) { chkSafeProdLedger.setUptm(new Date()); return this.chkSafeProdLedgerDao.update(chkSafeProdLedger); } @Override public int batchReportByIds(String[] ids){ return this.chkSafeProdLedgerDao.batchReportByIds(ids , new Date()); } @Override public int insertBatchFile(List safeProdLedgerList){ return this.chkSafeProdLedgerDao.insertBatchFile(safeProdLedgerList); } @Override public PageInfo> findSummaryPage(ChkSafeProdLedger param){ // 市级汇总 param.setFillRepoStat("2"); param.setDataStat("0"); param.setAdCode(null); PageHelper.startPage(param); List> list = findSummaryList(param); PageInfo> pageInfo = new PageInfo(list); return pageInfo; } /** * 导出统计表 * @param chkSafeProdLedger * @param response */ @Override public void export(ChkSafeProdLedger chkSafeProdLedger, HttpServletResponse response){ // 查询导出的数据 List chkSafeProdLedgerList = findList(chkSafeProdLedger); List columns = new ArrayList() {{ if("2".equals(chkSafeProdLedger.getFillRepoStat())){ // 市级 导出 显示 行政区 add("adName"); } add("chkProjType"); add("chkDttm"); add("leadDep"); add("leadDepRespPers"); add("chkOrg"); add("chkOrgRespPers"); add("chkOrgRespPersMobi"); add("chkResult"); add("chkDgerPblm"); add("chkHandSugg"); add("chkHandEdtm"); add("chkRectImplInfo"); add("chkRectImplInfoDesc"); add("chkAcceTm"); add("chkAccePers"); add("chkFillUnit"); add("chkSubmitDept"); if(!"2".equals(chkSafeProdLedger.getFillRepoStat())){ // 区县导出显示 上报状态 add("fillRepoStat"); } }}; exportExcel(chkSafeProdLedgerList, response, "成都市安全生产监督检查台账列表", columns, ChkSafeProdLedger.class); } public void exportExcel(List result, HttpServletResponse response, String fileName, List list, Class cla) { if (list == null || list.size() == 0) { ExportUtil.exportExcel(result, response, fileName); return; } List> mapList = new ArrayList<>(); result.forEach(worker -> mapList.add(transBean2Map(worker))); ExportAbstract export = new ExcelExport(); if (StringUtils.isBlank(fileName)) { fileName = "结果列表"; } export.setFileName(fileName); export.setExport_ps_export(true); export.setExport_ps_type(ExportAbstract.XLS); export.setExport_bzip(false); export.setTitle(fileName); ArrayList cols = new ArrayList(); Field[] fields = cla.getDeclaredFields(); Class clazz = cla.getSuperclass(); if (clazz != null && clazz != Objects.class) { fields = ArrayUtils.addAll(fields, clazz.getDeclaredFields()); } for (String name : list) { for (Field field : fields) { if (name.equals(field.getName()) && field.getAnnotation(ApiModelProperty.class) != null) { field.setAccessible(true); cols.add(field.getName() + "[" + ExportUtil.fileFormat(field.getAnnotation(ApiModelProperty.class).value()) + "]"); break; } } } if (cols.size() < 1) { cols.add("name[名称]"); cols.add("code[编码]"); } export.setCols(cols); export.setGroupable(false); // 设置视图指标 export.setLevel(1); export.setLocksize(0); try { export.Export(response); // 导出表头 export.ExportHeadForCustom(response); export.ContinueExport(mapList); export.EndExport(); } catch (Exception e) { e.printStackTrace(); } } private Map transBean2Map(Object obj) { if (obj == null) { return null; } Map map = new HashMap(); try { BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); ChkSafeSelsProjParam chkSafeSelsProjParam = new ChkSafeSelsProjParam(); chkSafeSelsProjParam.setUseScope("2"); chkSafeSelsProjParam.setDataStat("0"); List projTypeList = this.chkSafeSelsProjDao.findLedgerRootList(); String key=""; for (PropertyDescriptor property : propertyDescriptors) { key = property.getName(); // 过滤class属性 if (!"class".equals(key)) { // 得到property对应的getter方法 Method getter = property.getReadMethod(); Object value = getter.invoke(obj); map.put(key, value); if("chkProjType".equals(key)){ if(null != value && StringUtils.isNotBlank(value.toString())){ map.put(key, formatProjType(value.toString(),projTypeList)); } }else if("chkResult".equals(key)){ if(null != value && StringUtils.isNotBlank(value.toString())){ map.put(key, formatChkResult(value.toString())); } }else if("chkRectImplInfo".equals(key)){ if(null != value && StringUtils.isNotBlank(value.toString())){ map.put(key, formatChkRectImplInfo(value.toString())); } }else if("chkMnth".equals(key)){ if(null != value && StringUtils.isNotBlank(value.toString())){ LocalDateTime localDateTime = convertDateToLocalDateTime((Date)value); if(null != localDateTime){ String dateStr = String.format("%d年%d月",localDateTime.getYear(),localDateTime.getMonthValue()); map.put(key, dateStr); } } }else if("chkDttm".equals(key)){ if(null != value && StringUtils.isNotBlank(value.toString())){ LocalDateTime localDateTime = convertDateToLocalDateTime((Date)value); if(null != localDateTime){ String dateStr = String.format("%d年%d月%d日",localDateTime.getYear(),localDateTime.getMonthValue(),localDateTime.getDayOfMonth()); map.put(key, dateStr); } } }else if("chkHandEdtm".equals(key)){ if(null != value && StringUtils.isNotBlank(value.toString())){ LocalDateTime localDateTime = convertDateToLocalDateTime((Date)value); if(null != localDateTime){ String dateStr = String.format("%d年%d月%d日",localDateTime.getYear(),localDateTime.getMonthValue(),localDateTime.getDayOfMonth()); map.put(key, dateStr); } } }else if("chkAcceTm".equals(key)){ if(null != value && StringUtils.isNotBlank(value.toString())){ LocalDateTime localDateTime = convertDateToLocalDateTime((Date)value); if(null != localDateTime){ String dateStr = String.format("%d年%d月%d日",localDateTime.getYear(),localDateTime.getMonthValue(),localDateTime.getDayOfMonth()); map.put(key, dateStr); } } }else if("chkSubmitDttm".equals(key)){ if(null != value && StringUtils.isNotBlank(value.toString())){ LocalDateTime localDateTime = convertDateToLocalDateTime((Date)value); if(null != localDateTime){ String dateStr = String.format("%d年%d月%d日",localDateTime.getYear(),localDateTime.getMonthValue(),localDateTime.getDayOfMonth()); map.put(key, dateStr); } } }else if("fillRepoStat".equals(key)){ if(null != value && StringUtils.isNotBlank(value.toString())){ map.put(key, "2".equals(value.toString())?"已上报":"未上报"); } } } } } catch (Exception e) { System.out.println("transBean2Map Error " + e); } return map; } private String formatProjType(String projType , List projList){ try { if(cn.com.goldenwater.dcproj.utils.StringUtils.isBlank(projType)){ return null; } String formatStr = projList.stream().filter(f->projType.equals(f.getId())).map(m->m.getProjType()).collect(Collectors.joining()); return formatStr; } catch (Exception e) { return null; } } private String formatChkRectImplInfo(String chkRectImplInfo){ switch (chkRectImplInfo){ case "0": chkRectImplInfo = "未整改"; break; case "1": chkRectImplInfo = "正在整改"; break; case "2": chkRectImplInfo = "完成整改"; break; default: break; } return chkRectImplInfo; } private String formatChkResult(String chkResult){ switch (chkResult){ case "0": chkResult = "无隐患"; break; case "1": chkResult = "有隐患"; break; default: break; } return chkResult; } private LocalDateTime convertDateToLocalDateTime(Date date){ Calendar calendar = Calendar.getInstance(); calendar.setTime(date); LocalDateTime localDateTime = LocalDateTime.of(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH)+1, calendar.get(Calendar.DAY_OF_MONTH),0,0,0); return localDateTime; } /** * 导出 市级汇总 成都市水务行业安全大检查情况统计 * * @param safeProdLedger 筛选查询参数 * @param response */ @Override public void exportSummary(ChkSafeProdLedger safeProdLedger, HttpServletResponse response) { logger.debug("ChkSafeStatList 导出"); // 读取导出模板 String fileName = templatePath + File.separator + templateName ; File file = new File(fileName); if(file.exists()){ // 模板存在 try { FileInputStream inputStream = new FileInputStream(file); Workbook workbook = WorkbookFactory.create(inputStream); exportFile(workbook, safeProdLedger); writeToResponse(response, workbook, "成都市安全生产监督检查台账汇总.xls"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }else { logger.error("导出模板不存在"); } } @Override public List> findSummaryList(ChkSafeProdLedger param){ List> list = this.chkSafeProdLedgerDao.summaryList(param); if(null != list && list.size()>0){ List dateList = list.stream().map(m->(Date)m.get("chkMnth")).collect(Collectors.toList()); param.setChkMnthList(dateList); // 从总数中拆分出 市级、市县区级 String curOrgId = param.getOrgId(); OlBisInspOrg inspOrg = olBisInspOrgDao.get(curOrgId); String province = inspOrg.getRlcode(); List bisInspOrgListAll = olBisInspOrgDao.getByPid(curOrgId,province); // 获取 市级的 行政区划代码列表 String cityCodes = bisInspOrgListAll.stream().filter(f->f.getAdCode().startsWith("51019")).map(m-> AdLevelUtil.getAddvcd(m.getAdCode())).collect(Collectors.joining(",")); param.setAdCode(cityCodes); List> cityList = this.chkSafeProdLedgerDao.summaryList(param); // 获取 县级的 行政区划代码列表 String countyCodes = bisInspOrgListAll.stream().filter(f->!f.getAdCode().startsWith("51019")).map(m->AdLevelUtil.getAddvcd(m.getAdCode())).collect(Collectors.joining(",")); param.setAdCode(countyCodes); List> countyList = this.chkSafeProdLedgerDao.summaryList(param); for(int i=0;i totalMap = list.get(i); Date itemDate = (Date)totalMap.get("chkMnth"); logger.info("totalMap:"+totalMap.toString()); // 算出总数百分比 if("0".equals(totalMap.get("pblmNum").toString())){ totalMap.put("percent","0"); }else{ totalMap.put("percent",new BigDecimal(totalMap.get("rectDoNum").toString()).multiply(new BigDecimal(100)).divide(new BigDecimal(totalMap.get("pblmNum").toString()), 2, RoundingMode.HALF_UP).toString().concat("%")); } Map cityMap = cityList.stream().filter(f->itemDate.compareTo((Date)f.get("chkMnth")) == 0).findFirst().orElse(null); Map countyMap = countyList.stream().filter(f->itemDate.compareTo((Date)f.get("chkMnth")) == 0).findFirst().orElse(null); if(null == cityMap){ totalMap.put("cityChkNum","0"); totalMap.put("cityPblmNum","0"); totalMap.put("cityRectNotNum","0"); totalMap.put("cityRectDoNum","0"); totalMap.put("cityPercent","0"); }else{ totalMap.put("cityChkNum",cityMap.get("chkNum")); Object pblmNum = cityMap.get("pblmNum"); totalMap.put("cityPblmNum",pblmNum); totalMap.put("cityRectNotNum",cityMap.get("rectNotNum")); Object rectDoNum = cityMap.get("rectDoNum"); totalMap.put("cityRectDoNum",rectDoNum); if("0".equals(pblmNum.toString())){ totalMap.put("cityPercent",0); }else { totalMap.put("cityPercent",new BigDecimal(rectDoNum.toString()).multiply(new BigDecimal(100)).divide(new BigDecimal(pblmNum.toString()), 2, RoundingMode.HALF_UP).toString().concat("%")); } } if(null == countyMap){ totalMap.put("countyChkNum","0"); totalMap.put("countyPblmNum","0"); totalMap.put("countyRectNotNum","0"); totalMap.put("countyRectDoNum","0"); totalMap.put("countyPercent","0"); }else { totalMap.put("countyChkNum",countyMap.get("chkNum")); Object pblmNum = countyMap.get("pblmNum"); totalMap.put("countyPblmNum",pblmNum); totalMap.put("countyRectNotNum",countyMap.get("rectNotNum")); Object rectDoNum = countyMap.get("rectDoNum"); totalMap.put("countyRectDoNum",rectDoNum); if("0".equals(pblmNum.toString())){ totalMap.put("countyPercent",0); }else { totalMap.put("countyPercent",new BigDecimal(rectDoNum.toString()).multiply(new BigDecimal(100)).divide(new BigDecimal(pblmNum.toString()), 2, RoundingMode.HALF_UP).toString().concat("%")); } } } } return list; } /** * 把数据写入excel * @param xssfWorkbook * @param safeProdLedger */ private void exportFile(Workbook xssfWorkbook,ChkSafeProdLedger safeProdLedger){ // 查询统计数据 总数 safeProdLedger.setAdCode(null); List> resultList = findSummaryList(safeProdLedger); // 获取模板表格 Sheet sheet = xssfWorkbook.getSheetAt(0); // 设置 表格数据 if(null != resultList && resultList.size()>0){ // 把查询结果 写入到模板中 for (int i=0;i totalMap){ setCellValue(sheet,3+rowNum,0,String.valueOf(rowNum+1) ); String chkDttm = String.valueOf(totalMap.get("chkMnth")); if(chkDttm.contains("-")){ String[] chkDttmArray = chkDttm.split("-"); setCellValue(sheet,3+rowNum,1,String.format("%s年%d月", chkDttmArray[0],Integer.parseInt(chkDttmArray[1]))); }else{ return ; } // 市级 setCellValue(sheet,3+rowNum,2,String.valueOf(totalMap.get("cityChkNum")) ); setCellValue(sheet,3+rowNum,3,String.valueOf(totalMap.get("cityPblmNum")) ); setCellValue(sheet,3+rowNum,4,String.valueOf(totalMap.get("cityRectDoNum")) ); setCellValue(sheet,3+rowNum,5,String.valueOf(totalMap.get("cityRectNotNum")) ); setCellValue(sheet,3+rowNum,6,String.valueOf(totalMap.get("cityPercent")) ); // 县级 setCellValue(sheet,3+rowNum,7,String.valueOf(totalMap.get("countyChkNum")) ); setCellValue(sheet,3+rowNum,8,String.valueOf(totalMap.get("countyPblmNum")) ); setCellValue(sheet,3+rowNum,9,String.valueOf(totalMap.get("countyRectDoNum")) ); setCellValue(sheet,3+rowNum,10,String.valueOf(totalMap.get("countyRectNotNum")) ); setCellValue(sheet,3+rowNum,11,String.valueOf(totalMap.get("countyPercent")) ); // 总数 setCellValue(sheet,3+rowNum,12,String.valueOf(totalMap.get("chkNum")) ); setCellValue(sheet,3+rowNum,13,String.valueOf(totalMap.get("pblmNum")) ); setCellValue(sheet,3+rowNum,14,String.valueOf(totalMap.get("rectDoNum")) ); setCellValue(sheet,3+rowNum,15,String.valueOf(totalMap.get("rectNotNum")) ); setCellValue(sheet,3+rowNum,16,String.valueOf(totalMap.get("percent")) ); } /** * 设置 单元格的值 * @param sheet * @param rownum * @param cellnum * @param value */ private void setCellValue(Sheet sheet, int rownum, int cellnum, String value) { Cell cell = sheet.getRow(rownum).getCell(cellnum); cell.setCellValue(value); } private void writeToResponse(HttpServletResponse response, Workbook workbook, String name) throws IOException { // 修改模板内容导出新模板 response.setContentType("application/x-msdownload"); String fileNameURL = URLEncoder.encode(name, "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileNameURL + ";filename*=utf-8''" + fileNameURL); OutputStream out = response.getOutputStream(); workbook.write(out); out.flush(); out.close(); } }