package com.javaweb.hydrology.service.impl; import java.io.File; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.naming.directory.DirContext; import javax.xml.ws.Holder; import com.javaweb.common.utils.DateUtils; import com.javaweb.common.utils.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import com.javaweb.hydrology.mapper.HydrologyDataMapper; import com.javaweb.hydrology.mapper.HydrologyHoleInfoMapper; import com.javaweb.hydrology.domain.HydrologyData; import com.javaweb.hydrology.domain.HydrologyHoleInfo; import com.javaweb.hydrology.domain.HydrologyOriginData; import com.javaweb.hydrology.service.IHydrologyHoleInfoService; import com.javaweb.hydrology.vo.HydrologyDataVo; import com.sun.mail.handlers.image_gif; import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; import com.javaweb.common.config.Global; import com.javaweb.common.core.domain.AjaxResult; import com.javaweb.common.core.text.Convert; /** * 水文钻孔Service业务层处理 * * @author zmk * @date 2022-09-01 */ @Service public class HydrologyHoleInfoServiceImpl implements IHydrologyHoleInfoService { @Autowired private HydrologyHoleInfoMapper hydrologyHoleInfoMapper; @Autowired private HydrologyDataMapper dataMapper; private String fileSaveDir = Global.getProfile() + "\\hydrology\\"; protected final Logger logger = LoggerFactory.getLogger(HydrologyHoleInfoServiceImpl.class); /** * 查询水文钻孔 * * @param id 水文钻孔ID * @return 水文钻孔 */ @Override public HydrologyHoleInfo selectHydrologyHoleInfoById(Long id) { return hydrologyHoleInfoMapper.selectHydrologyHoleInfoById(id); } /** * 查询水文钻孔列表 * * @param hydrologyHoleInfo 水文钻孔 * @return 水文钻孔 */ @Override public List selectHydrologyHoleInfoList(HydrologyHoleInfo hydrologyHoleInfo) { return hydrologyHoleInfoMapper.selectHydrologyHoleInfoList(hydrologyHoleInfo); } /** * 新增水文钻孔 * * @param hydrologyHoleInfo 水文钻孔 * @return 结果 */ @Override public int insertHydrologyHoleInfo(HydrologyHoleInfo hydrologyHoleInfo) { hydrologyHoleInfo.setCreateTime(DateUtils.getNowDate()); return hydrologyHoleInfoMapper.insertHydrologyHoleInfo(hydrologyHoleInfo); } /** * 修改水文钻孔 * * @param hydrologyHoleInfo 水文钻孔 * @return 结果 */ @Override public int updateHydrologyHoleInfo(HydrologyHoleInfo hydrologyHoleInfo) { return hydrologyHoleInfoMapper.updateHydrologyHoleInfo(hydrologyHoleInfo); } /** * 删除水文钻孔对象 * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deleteHydrologyHoleInfoByIds(String ids) { return hydrologyHoleInfoMapper.deleteHydrologyHoleInfoByIds(Convert.toStrArray(ids)); } /** * 删除水文钻孔信息 * * @param id 水文钻孔ID * @return 结果 */ @Override public int deleteHydrologyHoleInfoById(Long id) { return hydrologyHoleInfoMapper.deleteHydrologyHoleInfoById(id); } /** * 导入钻孔 */ @Override public String importHydrologyInfo(MultipartFile file) { StringBuffer sBuffer =new StringBuffer(); String dest = saveExcel(file); //读取钻孔列表 List holeList = readHoleInfo(dest); if(holeList!=null){ sBuffer.append("本次导入钻孔:"+holeList.size() +"个"); } for(HydrologyHoleInfo entity : holeList){ //删除重复数据 hydrologyHoleInfoMapper.deleteHydrologyHoleInfoByNum(entity.getHoleNum()); insertHydrologyHoleInfo(entity); } List dataList = readOriginData(dest); if(dataList!=null){ sBuffer.append("
"); sBuffer.append("本次导入水位信息:"+dataList.size() +"条"); } //原始表格转化为数据库存储的结构 List datas = transferOriginData(dataList); for(HydrologyData data : datas){ dataMapper.deleteHydrologyDataByEntity(data); data.setCreateTime(DateUtils.getNowDate()); dataMapper.insertHydrologyData(data); } return sBuffer.toString(); } /** * 转化数据类型 * @param dataList * @return */ private List transferOriginData(List dataList){ List list =new ArrayList(); for(HydrologyOriginData originData : dataList){ String holeNum = originData.getHoleNum(); String year= originData.getYear(); String layer ="1"; if(!StringUtils.isEmpty(originData.getLayer())){ layer= originData.getLayer(); } list.add(new HydrologyData(holeNum, year, year + "-01", layer, originData.getMonth1())); list.add(new HydrologyData(holeNum, year, year + "-02", layer, originData.getMonth2())); list.add(new HydrologyData(holeNum, year, year + "-03", layer, originData.getMonth3())); list.add(new HydrologyData(holeNum, year, year + "-04", layer, originData.getMonth4())); list.add(new HydrologyData(holeNum, year, year + "-05", layer, originData.getMonth5())); list.add(new HydrologyData(holeNum, year, year + "-06", layer, originData.getMonth6())); list.add(new HydrologyData(holeNum, year, year + "-07", layer, originData.getMonth7())); list.add(new HydrologyData(holeNum, year, year + "-08", layer, originData.getMonth8())); list.add(new HydrologyData(holeNum, year, year + "-09", layer, originData.getMonth9())); list.add(new HydrologyData(holeNum, year, year + "-10", layer, originData.getMonth10())); list.add(new HydrologyData(holeNum, year, year + "-11", layer, originData.getMonth11())); list.add(new HydrologyData(holeNum, year, year + "-12", layer, originData.getMonth12())); } return list; } /** * 保存表格返回路徑 * @return */ private String saveExcel(MultipartFile file){ String filename = file.getOriginalFilename(); File dir = new File(fileSaveDir); if(!dir.exists()){ dir.mkdir(); } String addr= fileSaveDir + filename; try{ File dest = new File(addr); file.transferTo(dest); }catch(Exception e){ logger.debug(e.toString()); return null; } return addr; } /** * 读取钻孔数据 * @param file * @return */ private List readHoleInfo(String filepath){ ExcelReader reader = ExcelUtil.getReader(filepath, 0); reader.addHeaderAlias("经度", "lng"); reader.addHeaderAlias("纬度", "lat"); reader.addHeaderAlias("井号", "holeNum"); reader.addHeaderAlias("区县", "district"); reader.addHeaderAlias("孔位", "address"); reader.addHeaderAlias("孔深(m)", "holeDepth"); reader.addHeaderAlias("孔口标高", "elevation"); reader.addHeaderAlias("成井时间", "wellDate"); reader.addHeaderAlias("滤水管埋深", "pipeDepth"); reader.addHeaderAlias("仪器类型", "machineType"); reader.addHeaderAlias("备注", "remark"); List list = reader.readAll(HydrologyHoleInfo.class); return list; } /** * 读取实际数据 * @param filepath * @return */ private List readOriginData(String filepath){ ExcelReader reader = ExcelUtil.getReader(filepath, 1); reader.addHeaderAlias("孔号", "holeNum"); reader.addHeaderAlias("年", "year"); reader.addHeaderAlias("层", "layer"); reader.addHeaderAlias("一月", "month1"); reader.addHeaderAlias("二月", "month2"); reader.addHeaderAlias("三月", "month3"); reader.addHeaderAlias("四月", "month4"); reader.addHeaderAlias("五月", "month5"); reader.addHeaderAlias("六月", "month6"); reader.addHeaderAlias("七月", "month7"); reader.addHeaderAlias("八月", "month8"); reader.addHeaderAlias("九月", "month9"); reader.addHeaderAlias("十月", "month10"); reader.addHeaderAlias("十一月", "month11"); reader.addHeaderAlias("十二月", "month12"); List list = reader.readAll(HydrologyOriginData.class); return list; } private Integer defaultYears = 3;//默认查询 N 年份 /** * 图表数据 * @param holeNum * @return */ public AjaxResult hydrologyChart(String holeNum){ AjaxResult result = AjaxResult.success(); try{ //地下水基础数据 HydrologyHoleInfo holeInfo = new HydrologyHoleInfo(); holeInfo.setHoleNum(holeNum); List holes = hydrologyHoleInfoMapper.selectHydrologyHoleInfoList(holeInfo); //地下水数据 HydrologyData hydrologyData =new HydrologyData(); hydrologyData.setHoleNum(holeNum); String startYear = startYears();//起始年份 List datas = dataMapper.selectHydrologyDataListByNum(holeNum,startYear); HydrologyDataVo maxdata = dataMapper.selectMaxData(holeNum); HydrologyDataVo mindata = dataMapper.selectMinData(holeNum); Map map =new HashMap<>(); map.put("hole_info", holes.get(0)); map.put("hole_data", datas); map.put("years", years(startYear)); map.put("maxdata", maxdata); map.put("mindata", mindata); result.put("result", map); }catch(Exception exception){ return AjaxResult.error("查询错误"); } return result; } private List years(String startYear){ int yInteger = Integer.valueOf(startYear)+1; List list =new ArrayList<>(); for(int i = yInteger ;i< yInteger+ defaultYears ;i++){ list.add(String.valueOf(i)); } return list; } private String startYears(){ if(defaultYears==0){ return "1900"; } Calendar calendar =Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int start = year - defaultYears - 1 ; return String.valueOf(start); } }