package com.lf.server.service.sys; import com.lf.server.entity.all.RedisCacheKey; import com.lf.server.entity.all.StaticData; import com.lf.server.entity.ctrl.CoordinateEntity; import com.lf.server.entity.ctrl.CountEntity; import com.lf.server.entity.data.DownloadEntity; import com.lf.server.entity.sys.AttachEntity; import com.lf.server.entity.sys.ReportEntity; import com.lf.server.entity.sys.UserEntity; import com.lf.server.helper.*; import com.lf.server.mapper.sys.ReportMapper; import com.lf.server.service.all.RedisService; import com.lf.server.service.data.DownloadService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.lang.reflect.Method; import java.util.*; /** * 报告模板 * * @author WWW * @date 2024-03-06 */ @Service @SuppressWarnings("ALL") public class ReportService implements ReportMapper { @Value("${sys.turfServer}") private String turfServer; @Resource ReportMapper reportMapper; @Resource AttachService attachService; @Resource PathHelper pathHelper; @Resource DownloadService downloadService; @Resource RedisService redisService; private final static Log log = LogFactory.getLog(ReportService.class); @Override public Integer selectCount(String name, String code) { name = StringHelper.getLikeUpperStr(name); return reportMapper.selectCount(name, code); } @Override public List selectByPage(String name, String code, Integer limit, Integer offset) { name = StringHelper.getLikeUpperStr(name); return reportMapper.selectByPage(name, code, limit, offset); } @Override public List selectAll() { return reportMapper.selectAll(); } @Override public ReportEntity selectById(int id) { return reportMapper.selectById(id); } @Override public Integer insert(ReportEntity entity) { return reportMapper.insert(entity); } @Override public Integer inserts(List list) { return reportMapper.inserts(list); } @Override public Integer delete(int id) { return reportMapper.delete(id); } @Override public Integer deletes(List ids) { return reportMapper.deletes(ids); } @Override public Integer update(ReportEntity entity) { return reportMapper.update(entity); } @Override public Integer updates(List list) { return reportMapper.updates(list); } @Override public List countSizes() { return reportMapper.countSizes(); } @Override public List countSizesByType() { return reportMapper.countSizesByType(); } @Override public List countServices() { return reportMapper.countServices(); } @Override public List countOperates() { return reportMapper.countOperates(); } @Override public List countSizesByPrj() { return reportMapper.countSizesByPrj(); } @Override public List countExplorationPoints() { String key = RedisCacheKey.dataCountKey("countExplorationPoints"); List list = redisService.getListByKey(key); if (null == list) { list = reportMapper.countExplorationPoints(); countExplorationArea(list); redisService.saveListByKey(key, list, StaticData.I2); } return list; } @Override public List selectExplorationPoints(String code) { return reportMapper.selectExplorationPoints(StringHelper.getRightLike(code)); } @Override public List countDemAreaByPrj() { return reportMapper.countDemAreaByPrj(); } @Override public List countMptAreaByPrj() { return reportMapper.countMptAreaByPrj(); } @Override public List countOsgbAreaByPrj() { return reportMapper.countOsgbAreaByPrj(); } @Override public List countLasAreaByPrj() { return reportMapper.countLasAreaByPrj(); } @Override public List countSurveyWorksiteByPrj() { return reportMapper.countSurveyWorksiteByPrj(); } @Override public List countExplorationReportByPrj() { return reportMapper.countExplorationReportByPrj(); } @Override public List countCollapseByPrj() { return reportMapper.countCollapseByPrj(); } @Override public List countDebrisFlowByPrj() { return reportMapper.countDebrisFlowByPrj(); } @Override public List countGroundCollapseByPrj() { return reportMapper.countGroundCollapseByPrj(); } @Override public List countHighSteepSlopeByPrj() { return reportMapper.countHighSteepSlopeByPrj(); } @Override public List countLandSlideByPrj() { return reportMapper.countLandSlideByPrj(); } @Override public List countUnstableSlopeByPrj() { return reportMapper.countUnstableSlopeByPrj(); } @Override public List countWaterDamageByPrj() { return reportMapper.countWaterDamageByPrj(); } @Override public List countDlgAreaByPrj() { return reportMapper.countDlgAreaByPrj(); } @Override public List countDomAreaByPrj() { return reportMapper.countDomAreaByPrj(); } @Override public List countLineLength() { return reportMapper.countLineLength(); } @Override public List countExplorationPointByPrj() { return reportMapper.countExplorationPointByPrj(); } @Override public List countGeoModelAreaByPrj() { return reportMapper.countGeoModelAreaByPrj(); } @Override public List countGeologicHazardByPrj() { return reportMapper.countGeologicHazardByPrj(); } /** * 统计钻孔点面积 */ private void countExplorationArea(List list) { if (null == list) { return; } for (CountEntity ce : list) { if (0 == ce.getCount()) { continue; } double area = calcPolygonArea(ce.getM3()); ce.setArea(area); } } /** * 计算多边形面积 */ private double calcPolygonArea(String code) { try { String url = turfServer + "/Call/CalcArea?code=" + code; String str = RestHelper.get(url); if (StringHelper.isEmpty(str)) { return 0d; } return Double.parseDouble(str); } catch (Exception ex) { log.error(ex.getMessage(), ex); return 0d; } } /** * 调用JS方法 * */ private double callJsFn(String str) { String staticPath = PathHelper.getStaticPath(); Object obj = JsHelper.callJsFn(staticPath + "js/turf.min.6.5.js", "pointsToPolygon", str); if (null == obj) { return 0d; } return (double) obj; } /** * 创建报告 */ public void createReport(UserEntity ue, ReportEntity re, HttpServletResponse res) throws Exception { AttachEntity ae = attachService.selectByGuid(re.getGuid()); if (null == ae) { return; } String source = pathHelper.getConfig().getUploadPath() + File.separator + ae.getPath(); String targetName = StringHelper.YMDHMS2_FORMAT.format(new Date()) + FileHelper.getExtension(ae.getName()); String target = pathHelper.getDownloadFullPath() + File.separator + targetName; File sourceFile = new File(source); if (!sourceFile.exists() || sourceFile.isDirectory()) { return; } generateReport(source, target, re); File targetFile = new File(target); if (!targetFile.exists() || sourceFile.isDirectory()) { return; } DownloadEntity de = getDownloadEntity(ue, target); int rows = downloadService.insert(de); if (rows > 0) { WebHelper.download(target, targetName, res); } } /** * 生成报告 */ private void generateReport(String source, String target, ReportEntity re) { if (StaticData.S1.equals(re.getType())) { createWord(source, target, re); } else { createExcel(source, target, re); } } /** * 生成Word */ private void createWord(String source, String target, ReportEntity re) { List list = selectListByMethodName(re); list = processListData(list); Map> map = new HashMap<>(1); map.put("data", list); List addList = new ArrayList<>(); for (CountEntity ce : list) { switch (re.getCode()) { case "countSizesByType": case "countSizesByPrj": addList.add(new String[]{"" + ce.getNo(), ce.getM1(), "" + ce.getCount(), ce.getM2()}); break; case "countSizes": addList.add(new String[]{"" + ce.getNo(), ce.getM1(), ce.getM2()}); break; case "countOperates": addList.add(new String[]{"" + ce.getNo(), ce.getM1(), ce.getM2(), "" + ce.getCount()}); break; case "countExplorationPoints": addList.add(new String[]{"" + ce.getNo(), ce.getM1(), "" + ce.getCount(), ce.getM2(), ce.getM3()}); break; case "countDemAreaByPrj": case "countMptAreaByPrj": case "countOsgbAreaByPrj": case "countLasAreaByPrj": case "countDlgAreaByPrj": case "countDomAreaByPrj": case "countGeoModelAreaByPrj": addList.add(new String[]{"" + ce.getNo(), ce.getM1(), ce.getM3()}); break; case "countLineLength": addList.add(new String[]{"" + ce.getNo(), ce.getM1(), "" + ce.getLen()}); break; default: addList.add(new String[]{"" + ce.getNo(), ce.getM1(), "" + ce.getCount()}); break; } } WordHelper.generateWord(source, target, null, addList); } /** * 生成Excel */ private void createExcel(String source, String target, ReportEntity re) { List list = selectListByMethodName(re); list = processListData(list); Map> map = new HashMap<>(1); map.put("data", list); ExcelHelper.writeToTemplate(source, target, map); } /** * 处理列表数据 */ private List processListData(List list) { if (null == list || list.isEmpty()) { return null; } int rows = 1; long allCount = 0; Double allSize = 0d, allArea = 0d, allLen = 0d; for (CountEntity ce : list) { ce.setNo(rows++); if (StringUtils.isEmpty(ce.getM2())) { ce.setM2(FileHelper.getSizes(ce.getSizes())); } ce.setM3(FileHelper.getSquareMeter(ce.getArea())); allCount += ce.getCount(); allSize += ce.getSizes(); allArea += ce.getArea(); allLen += ce.getLen(); } if (list.size() > 0) { CountEntity ce = new CountEntity(); ce.setNo(rows); ce.setM1("总计"); ce.setCount(allCount); if (StringUtils.isEmpty(list.get(0).getM2())) { ce.setM2(FileHelper.getSizes(allSize)); } ce.setM3(FileHelper.getSquareMeter(allArea)); ce.setLen(allLen); list.add(ce); } return list; } /** * 根据方法名称查询数据列表 */ private List selectListByMethodName(ReportEntity re) { List list = null; try { Method method = ReportService.class.getDeclaredMethod(re.getCode()); Object obj = method.invoke(this); if (obj instanceof List) { list = (List) obj; } } catch (Exception ex) { log.error(ex.getMessage(), ex); } if (null == list || list.isEmpty()) { return list; } for (CountEntity ce : list) { if (null == ce.getCount()) { ce.setCount(0L); } if (null == ce.getSizes()) { ce.setSizes(0d); } if (null == ce.getArea()) { ce.setArea(0d); } if (null == ce.getLen()) { ce.setLen(0d); } } return list; } /** * 获取下载实体类 */ private DownloadEntity getDownloadEntity(UserEntity ue, String file) { DownloadEntity de = new DownloadEntity(); de.setName(FileHelper.getFileName(file)); // 1-Shp文件,2-专题图,3-元数据,4-业务数据,5-管道分析,6-统计报告,7-附件文件,8-瓦片文件 de.setType(6); de.setSizes(FileHelper.sizeToMb(new File(file).length())); de.setDepid(ue.getDepid()); de.setDcount(1); de.setPwd(null); de.setUrl(FileHelper.getRelativePath(file)); de.setDescr("统计报告"); de.setGuid(FileHelper.getFileMd5(file)); de.setCreateUser(ue.getId()); // de.setGeom(null) return de; } }