aix
2024-08-17 39081183f7cc171aefc435f33b077d3ce41fd2ea
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
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;
    }
}