package cn.gistack.sm.sjztmd.word.util;
|
|
import cn.gistack.alerts.sms.vo.SmsResultVO;
|
import cn.gistack.sm.intelligentCall.vo.CallTaskResultVO;
|
import cn.gistack.sm.sjztmd.entity.YwFloodReportInfo;
|
import cn.gistack.sm.sjztmd.util.MyDateUtils;
|
import cn.gistack.sm.sjztmd.word.vo.*;
|
import com.deepoove.poi.XWPFTemplate;
|
import com.deepoove.poi.data.NumbericRenderData;
|
import org.springblade.core.tool.utils.StringUtil;
|
|
import java.io.*;
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* @PROJECT_NAME: skjcmanager
|
* @DESCRIPTION:
|
* @USER: aix
|
* @DATE: 2023/11/23 9:53
|
*/
|
public class WordUtil {
|
|
public static byte[] compileTemplateAndRenderData(TbWordVO tbWordVO, Map<String, Object> tableMap) throws Exception {
|
InputStream inputStream = WordUtil.class.getClassLoader().getResourceAsStream("word/doc/skcgmb.docx");
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
XWPFTemplate template = XWPFTemplate.compile(inputStream).render(createParams(tbWordVO, tableMap));
|
template.write(outputStream);
|
outputStream.flush();
|
outputStream.close();
|
return outputStream.toByteArray();
|
}
|
|
/**
|
* 去除小数位为0的
|
* @param num
|
* @return
|
*/
|
public static String removeTrailingZero(String num) {
|
// 检查是否包含小数点
|
if (num.contains(".")) {
|
// 分割整数和小数部分
|
String[] parts = num.split("\\.");
|
if (parts.length == 2) {
|
// 去除小数部分末尾的0,并检查是否仅剩下小数点(例如"123.")
|
String decimalPart = parts[1].replaceAll("0+$", "").replaceAll("^\\.$", "");
|
// 如果小数部分处理后为空,则返回整数部分;否则拼接整数和小数部分
|
return decimalPart.isEmpty() ? parts[0] : parts[0] + "." + decimalPart;
|
}
|
}
|
// 如果不包含小数点或处理失败,则返回原字符串
|
return num;
|
}
|
|
/**
|
* 根据水库id获取数据
|
*
|
* @return
|
*/
|
private static Map<String, Object> createParams(TbWordVO tbWordVO, Map<String, Object> tableMap) {
|
Map<String, Object> params = new HashMap<>();
|
params.put("水库名称", tbWordVO.getResName());
|
params.put("市", tbWordVO.getCityName());
|
params.put("县", tbWordVO.getCountyName());
|
params.put("镇", tbWordVO.getTownName());
|
params.put("河流名称", tbWordVO.getLocRvName());
|
params.put("水库功能", tbWordVO.getResFuncText());
|
params.put("调节性能", tbWordVO.getAdjustPropText());
|
params.put("水库坝址以上控制流域面积", removeTrailingZero(tbWordVO.getConArea()));
|
params.put("流域多年平均降雨量", removeTrailingZero(tbWordVO.getMoyearRainAvg()));
|
params.put("多年平均年径流量", removeTrailingZero(tbWordVO.getMoyearFlAvg()));
|
params.put("设计洪水标准", tbWordVO.getDesFlSta());
|
params.put("校核洪水标准", tbWordVO.getChecFlSta());
|
params.put("总库容", removeTrailingZero(tbWordVO.getTotalCap()));
|
params.put("水文特征", tbWordVO.getHydrologicalCharacteristics());
|
params.put("工程等别", tbWordVO.getEngGrad());
|
params.put("挡水建筑物泄洪建筑物正常溢洪道", tbWordVO.getBuildingText());
|
params.put("主坝信息", tbWordVO.getMainDamInfo());
|
params.put("挡水建筑物泄洪建筑物正常溢洪道等详情", tbWordVO.getBuildingInfo());
|
params.put("输水建筑物输水道形式", StringUtil.isNotBlank(tbWordVO.getAqueductType())?tbWordVO.getAqueductType().trim():"");//若有两个以上输水建筑物,则描述设计流量较大的,若只有一个输水建筑物则去掉“主要”
|
params.put("断面尺寸", tbWordVO.getSection());
|
params.put("进口底槛高程", tbWordVO.getThresholdElevation());
|
params.put("设计流量", tbWordVO.getDesignFlow());
|
params.put("电站信息", tbWordVO.getPowerStationInfo());
|
params.put("保护城市", tbWordVO.getProtectCity());
|
params.put("保护人口保护耕地", tbWordVO.getProtectPersonLand());
|
params.put("保护铁路", tbWordVO.getProtectThings());//铁路、公路、管线、企业几个依次罗列,超过三个列出第二个后为“XX等”,后面不需罗列
|
params.put("经济效益", tbWordVO.getEconomicBenefit());//若既有灌溉又有供水,则有“此外,”,无灌溉有供水直接介绍供水
|
params.put("工程始建时间", tbWordVO.getStartTime());
|
params.put("下闸蓄水时间", tbWordVO.getWaterStorageTm());
|
// 鉴定时间 > 除险加固
|
params.put("安全鉴定和除险加固", tbWordVO.getSafetyMonitorText());
|
// 鉴定时间 < 除险加固
|
//params.put("安全鉴定和除险加固","2012年9月,水库进行安全鉴定,鉴定结果为“三类坝”(加一个双引号),工程主要存在问题为坝顶及心墙顶欠高,大坝渗透系数偏大,溢洪道过流能力不足、边墙高度不足等(加一个“等”)。
|
// 针对水库安全鉴定发现的问题,水库除险加固工程于2019年11月动工,2022年6月蓄水验收。");
|
params.put("管理单位名称", tbWordVO.getMUnitName());
|
params.put("管理单位性质", tbWordVO.getMUnitNature());
|
params.put("主管部门", tbWordVO.getCUnitName());// 水库基本信息表,不是填报表
|
params.put("管理单位职工人数", tbWordVO.getMUnitPersonNumber());
|
params.put("主管部门责任人", tbWordVO.getCompetentDepartmentInfo()); // 责任人信息表,不是填报表
|
params.put("行政主管单位", tbWordVO.getAdministrativeUnit());
|
params.put("行政责任人职务手机号码", tbWordVO.getAdministrativeInfo()); // 责任人信息表,不是填报表
|
|
|
params.putAll(tableMap);
|
|
return params;
|
}
|
|
|
public static byte[] GetOverInfo(List<TotalInfo> totalList, List<DzkInfo> dzkList, List<OverDetail> overDetailList, List<SzInfo> szInfoList, List<SmsResultVO> dxyjList, List<CallTaskResultVO> whtjList, YwFloodReportInfo ywFloodReportInfo) throws Exception {
|
InputStream inputStream = WordUtil.class.getClassLoader().getResourceAsStream("word/doc/overFloodTemplate.docx");
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
OverWord overWord = new OverWord(totalList, dzkList, overDetailList, szInfoList, dxyjList, whtjList, null);
|
XWPFTemplate template = XWPFTemplate.compile(inputStream).render(createOverWordParam(overWord, ywFloodReportInfo));
|
template.write(outputStream);
|
outputStream.flush();
|
outputStream.close();
|
return outputStream.toByteArray();
|
}
|
|
/**
|
* @param totalList 全省水库超汛
|
* @param dzkList 大中库超汛
|
* @param overDetailList 超汛明细
|
* @param szInfoList 省直超汛
|
* @param totalOverList 超正常
|
* @param totalOver10List 超正常10cm
|
* @return
|
*/
|
public static byte[] GetNotInSeasonOverInfo(List<TotalInfo> totalList, List<DzkInfo> dzkList, List<OverDetail> overDetailList, List<SzInfo> szInfoList, List<TotalInfo> totalOverList, List<TotalInfo> totalOver10List) throws Exception {
|
InputStream inputStream = WordUtil.class.getClassLoader().getResourceAsStream("word/doc/inFloodSeason_overFloodTemplate.docx");
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
OverWord overWord = new OverWord(totalList, dzkList, overDetailList, szInfoList, totalOverList, totalOver10List);
|
XWPFTemplate template = XWPFTemplate.compile(inputStream).render(createOverWordParam(overWord));
|
template.write(outputStream);
|
outputStream.flush();
|
outputStream.close();
|
return outputStream.toByteArray();
|
}
|
|
private static Map<String, Object> createOverWordParam(OverWord overWord) {
|
Map<String, Object> params = new HashMap<>();
|
|
params.put("时间", overWord.getTm());
|
params.put("全省水库超汛限", overWord.getTotalInfo());
|
params.put("小型水库详情", overWord.getOverSmallInfo());
|
String dxStr = StringUtil.isNotBlank(overWord.getOverBigInfo()) ? "超汛限的水库的大型水库有:" : "";
|
params.put("超汛限的水库的大型水库有", dxStr);
|
params.put("大型水库详情", overWord.getOverBigInfo());
|
String zxStr = StringUtil.isNotBlank(overWord.getOverMidInfo()) ? "超汛限的水库的中型水库有:" : "";
|
params.put("超汛限的水库的中型水库有", zxStr);
|
params.put("中型水库详情", overWord.getOverMidInfo());
|
params.put("省直水库详情", overWord.getProvinceInfo());
|
params.put("短信预警和外呼抽查", overWord.getSmsResultInfo());
|
params.put("重点水库详情", overWord.getZdInfo());
|
//不在汛期内
|
if (!MyDateUtils.isTodayInFloodSeason()) {
|
params.put("全省水库超正常", overWord.getTotalOverNormalInfo());
|
params.put("全省水库超正常十厘米以上", overWord.getTotalOverNormal10Info());
|
params.put("超正常小型水库详情", overWord.getOverNormalSmallInfo());
|
params.put("超正常大型水库详情", overWord.getOverNormalBigInfo());
|
params.put("超正常中型水库详情", overWord.getOverNormalMidInfo());
|
}
|
|
return params;
|
}
|
|
private static Map<String, Object> createOverWordParam(OverWord overWord, YwFloodReportInfo info) {
|
Map<String, Object> params = new HashMap<>();
|
|
params.put("时间", overWord.getTm());
|
params.put("全省水库超汛限", overWord.getTotalInfo());
|
params.put("小型水库详情", overWord.getOverSmallInfo());
|
String dxStr = StringUtil.isNotBlank(overWord.getOverBigInfo()) ? "超汛限的水库的大型水库有:" : "";
|
params.put("超汛限的水库的大型水库有", dxStr);
|
params.put("大型水库详情", overWord.getOverBigInfo());
|
String zxStr = StringUtil.isNotBlank(overWord.getOverMidInfo()) ? "超汛限的水库的中型水库有:" : "";
|
params.put("超汛限的水库的中型水库有", zxStr);
|
params.put("中型水库详情", overWord.getOverMidInfo());
|
params.put("省直水库详情", overWord.getProvinceInfo());
|
params.put("短信预警和外呼抽查", overWord.getSmsResultInfo());
|
params.put("重点水库详情", overWord.getZdInfo());
|
//不在汛期内
|
if (!MyDateUtils.isTodayInFloodSeason()) {
|
params.put("全省水库超正常", overWord.getTotalOverNormalInfo());
|
params.put("全省水库超正常十厘米以上", overWord.getTotalOverNormal10Info());
|
params.put("超正常小型水库详情", overWord.getOverNormalSmallInfo());
|
params.put("超正常大型水库详情", overWord.getOverNormalBigInfo());
|
params.put("超正常中型水库详情", overWord.getOverNormalMidInfo());
|
}
|
|
//昨日报汛
|
params.put("昨日全省水库超汛限", info.getTotalInfo().replace("今日", "昨日"));
|
params.put("昨日超汛限的小型水库有", info.getOversmallInfo());
|
|
return params;
|
}
|
|
private static byte[] GenerateWord(String templatePath, Object object) throws Exception {
|
InputStream inputStream = WordUtil.class.getClassLoader().getResourceAsStream(templatePath);
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
XWPFTemplate template = XWPFTemplate.compile(inputStream).render(object);
|
template.write(outputStream);
|
outputStream.flush();
|
outputStream.close();
|
return outputStream.toByteArray();
|
}
|
|
|
public static OverWord GetOverInfo(List<TotalInfo> totalList) {
|
|
OverWord overWord = new OverWord(totalList);
|
return overWord;
|
}
|
}
|