|
@@ -31,6 +31,8 @@ import org.springblade.land.vo.TableDataVO;
|
|
|
import org.springblade.manager.entity.WbsFormElement;
|
|
|
import org.springblade.manager.entity.WbsTreePrivate;
|
|
|
import org.springblade.resource.feign.NewIOSSClient;
|
|
|
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
|
|
|
+import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
@@ -50,6 +52,7 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
|
|
|
private final IAgreementLinkTableService linkTableService;
|
|
|
private final NewIOSSClient newIOSSClient;
|
|
|
private final IRegionTreeInfoService treeInfoService;
|
|
|
+ private final JdbcTemplate jdbcTemplate;
|
|
|
|
|
|
/**
|
|
|
* 新增或修改结算协议
|
|
@@ -134,8 +137,9 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
|
|
|
//生成补偿费发放统计表
|
|
|
buildPdf3(linkTables.get(2),ids);
|
|
|
//生成补偿费明细表
|
|
|
-// buildPdf4();
|
|
|
+ buildPdf4(linkTables.get(3),ids,info.getStage());
|
|
|
//生成补偿资金数量分配表
|
|
|
+// buildPdf5(linkTables.get(4),ids);
|
|
|
//生成面积统计明细表
|
|
|
//合并PDF
|
|
|
// try {
|
|
@@ -145,6 +149,263 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
|
|
|
// }
|
|
|
}
|
|
|
|
|
|
+// private void buildPdf5(AgreementLinkTable linkTable, List<Long> ids) {
|
|
|
+//
|
|
|
+// }
|
|
|
+
|
|
|
+ private void buildPdf4(AgreementLinkTable linkTable, List<Long> ids,String stage) {
|
|
|
+ try {
|
|
|
+ //周期格式
|
|
|
+ stage = stage.substring(1,stage.length()-1);
|
|
|
+ //获取项目名称
|
|
|
+ String projectName = jdbcTemplate.queryForObject("select project_name from m_project_info where id = " + linkTable.getProjectId(), new BeanPropertyRowMapper<>(String.class));
|
|
|
+ List<WbsFormElement> list = baseMapper.getTableElement(linkTable.getTableId());
|
|
|
+ Map<String, Object> DataInfo = new HashMap<>();
|
|
|
+ //获取所有的补偿协议映射表中的发放表
|
|
|
+ List<AgreementLinkTable> assignTable = baseMapper.getAllAssignTable(ids, "发放表");
|
|
|
+ List<Long> longs = assignTable.stream().map(l -> l.getTableDataId()).collect(Collectors.toList());
|
|
|
+ //获取发放表的配置
|
|
|
+ List<WbsFormElement> dataElements = baseMapper.getTableElement(assignTable.get(0).getTableId());
|
|
|
+ if (dataElements == null || dataElements.size() == 0){
|
|
|
+ compensationInfoService.getBussPdfInfo(linkTable.getId(), DataInfo);
|
|
|
+ }
|
|
|
+ Map<String, Integer> dataMap = dataElements.stream().collect(Collectors.toMap(WbsFormElement::getEKey, WbsFormElement::getDynamicDict));
|
|
|
+ //获取所有补偿费发放表中的数据
|
|
|
+ List<TableDataVO> dataVOS = compensationInfoMapper.getBussDataInfoByDataIds(longs);
|
|
|
+ dataVOS = dataVOS.stream().filter(l -> dataMap.get(l.getDictKey()) != null).collect(Collectors.toList());
|
|
|
+ if (dataVOS.size() == 0){
|
|
|
+ compensationInfoService.getBussPdfInfo(linkTable.getId(), DataInfo);
|
|
|
+ }
|
|
|
+ dataVOS.stream().forEach(l->l.setDictValue(dataMap.get(l.getDictKey())));
|
|
|
+ Map<Integer, List<TableDataVO>> listMap = dataVOS.stream().collect(Collectors.groupingBy(TableDataVO::getDictValue));
|
|
|
+
|
|
|
+ if (list != null && list.size() > 0) {
|
|
|
+ //字典为key,位置为value
|
|
|
+ Map<Integer, String> elementMap = list.stream().collect(Collectors.toMap(WbsFormElement::getDynamicDict, WbsFormElement::getEKey));
|
|
|
+ //位置为key,字典为value
|
|
|
+ Map<String, Integer> overMap = list.stream().collect(Collectors.toMap(WbsFormElement::getEKey, WbsFormElement::getDynamicDict));
|
|
|
+ //解析html获取所以实际的key
|
|
|
+ Document doc = Jsoup.parse(new File(linkTable.getHtmlUrl()), "utf-8");
|
|
|
+// Document doc = Jsoup.parse(new File("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1704076903561822208.html"), "utf-8");
|
|
|
+ Element table = doc.select("table").first();
|
|
|
+ //此表key重复,直接获取所有
|
|
|
+ List<TableDataVO> allKey = table.getElementsByAttribute("id").stream().map(l -> {
|
|
|
+ TableDataVO vo = new TableDataVO();
|
|
|
+ String s = l.attr("id");
|
|
|
+ vo.setTabKey(s);
|
|
|
+ if (s.contains("__")) {
|
|
|
+ String[] s1 = s.split("__");
|
|
|
+ vo.setDictKey(s1[0]);
|
|
|
+ String[] s2 = s1[1].split("_");
|
|
|
+ vo.setDictRow(Integer.parseInt(s2[0]));
|
|
|
+ }
|
|
|
+ return vo;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ allKey = allKey.stream().filter(l -> overMap.get(l.getDictKey()) != null).collect(Collectors.toList());
|
|
|
+ if (allKey.size() == 0){
|
|
|
+ compensationInfoService.getBussPdfInfo(linkTable.getId(), DataInfo);
|
|
|
+ }
|
|
|
+ allKey.stream().forEach(l->l.setDictValue(overMap.get(l.getDictKey())));
|
|
|
+ Map<Integer, List<TableDataVO>> listMap2 = allKey.stream().collect(Collectors.groupingBy(TableDataVO::getDictValue));
|
|
|
+
|
|
|
+ //确定长度的key的字典,因为其他字段可能为空,姓名不为空,所以通过姓名获取数据长度
|
|
|
+// List<Integer> batchKey = Arrays.asList(80);
|
|
|
+ Integer nameDict = 80;
|
|
|
+ //非必填重复key的字典
|
|
|
+ List<Integer> batchKey2 = Arrays.asList(82, 400, 85, 86);
|
|
|
+ //统计补偿总和
|
|
|
+ BigDecimal big = new BigDecimal(0);
|
|
|
+ //土地总和
|
|
|
+ BigDecimal big2 = new BigDecimal(0);
|
|
|
+ //青苗及地上总和
|
|
|
+ BigDecimal big3 = new BigDecimal(0);
|
|
|
+ //时段奖总和
|
|
|
+ BigDecimal big4 = new BigDecimal(0);
|
|
|
+ //当前数据有多少行
|
|
|
+ Integer rows = 0;
|
|
|
+ //当前数据的第一行
|
|
|
+ Integer oneRows = 0;
|
|
|
+ //生成结算表有多少行,用于跨页后复制表单
|
|
|
+ Integer oneTableRows = 0;
|
|
|
+ //判断每一张表有多少行,合并表时用于填充统计
|
|
|
+ Map<Long,Integer> tableRows = new LinkedHashMap<>();
|
|
|
+ //先设置姓名,查看一共有多少条数据
|
|
|
+ if (listMap.get(nameDict) != null && listMap.get(nameDict).size() > 0) {
|
|
|
+ List<TableDataVO> voList = listMap.get(nameDict);
|
|
|
+ //重置数据顺序,先按表单分组,再按照行顺序重新装入集合
|
|
|
+ Map<Long, List<TableDataVO>> map = voList.stream().collect(Collectors.groupingBy(TableDataVO::getPKeyId));
|
|
|
+ List<Long> collect = map.keySet().stream().sorted().collect(Collectors.toList());
|
|
|
+ List<Object> data = new ArrayList<>();
|
|
|
+ for (Long aLong : collect) {
|
|
|
+ List<TableDataVO> vos = map.get(aLong);
|
|
|
+ tableRows.put(aLong, vos.size());
|
|
|
+ vos = vos.stream().sorted(Comparator.comparing(TableDataVO::getDictRow)).collect(Collectors.toList());
|
|
|
+ oneRows = vos.get(0).getDictRow();
|
|
|
+ data.addAll(vos.stream().map(l -> l.getTabVal()).collect(Collectors.toList()));
|
|
|
+ }
|
|
|
+ rows = data.size();
|
|
|
+ //取出位置集合
|
|
|
+ List<TableDataVO> voList2 = listMap2.get(nameDict);
|
|
|
+ List<String> keys = new ArrayList<>();
|
|
|
+ voList2 = voList2.stream().sorted(Comparator.comparing(TableDataVO::getDictRow)).collect(Collectors.toList());
|
|
|
+ keys.addAll(voList2.stream().map(l -> l.getTabKey()).collect(Collectors.toList()));
|
|
|
+ //设置单表总行数
|
|
|
+ oneTableRows = keys.size();
|
|
|
+ //!!暂时没判断多页,到时候要分隔集合
|
|
|
+ for (int i = 0; i < data.size(); i++) {
|
|
|
+ DataInfo.put(keys.get(i), data.get(i));
|
|
|
+ }
|
|
|
+ elementMap.remove(nameDict);
|
|
|
+ }else {
|
|
|
+ compensationInfoService.getBussPdfInfo(linkTable.getId(), DataInfo);
|
|
|
+ }
|
|
|
+ for (Integer dict : elementMap.keySet()) {
|
|
|
+ if (batchKey2.contains(dict)) {
|
|
|
+ if (dict.equals(400)) {
|
|
|
+ //单独处理青苗+地面
|
|
|
+ //取出83(青苗)数据集合
|
|
|
+ List<TableDataVO> voList = listMap.get(83);
|
|
|
+ //重置数据顺序,先按表单分组,再按照行顺序重新装入集合
|
|
|
+ Map<Long, List<TableDataVO>> map = voList.stream().collect(Collectors.groupingBy(TableDataVO::getPKeyId));
|
|
|
+ //取出84(地面)数据集合
|
|
|
+ List<TableDataVO> voList2 = listMap.get(84);
|
|
|
+ //重置数据顺序,先按表单分组,再按照行顺序重新装入集合
|
|
|
+ Map<Long, List<TableDataVO>> map2 = voList2.stream().collect(Collectors.groupingBy(TableDataVO::getPKeyId));
|
|
|
+ //根据总行数和起始位置,生成青苗+地面的集合
|
|
|
+ List<Object> values = new ArrayList<>();
|
|
|
+ for (Long aLong : tableRows.keySet()) {
|
|
|
+ Integer ro = tableRows.get(aLong);
|
|
|
+ //获取当前表青苗集合,并且按照行转换为map
|
|
|
+ List<TableDataVO> vos = map.get(aLong);
|
|
|
+ //因为可能整张表都没填写,所以为null
|
|
|
+ if (vos == null) {
|
|
|
+ vos = new ArrayList<>();
|
|
|
+ }
|
|
|
+ Map<Integer, BigDecimal> map3 = vos.stream().collect(Collectors.groupingBy(TableDataVO::getDictRow,
|
|
|
+ Collectors.mapping(l -> new BigDecimal(l.getTabVal()), Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
|
|
|
+ //获取当前表地面集合
|
|
|
+ List<TableDataVO> vos2 = map2.get(aLong);
|
|
|
+ if (vos2 == null) {
|
|
|
+ vos2 = new ArrayList<>();
|
|
|
+ }
|
|
|
+ Map<Integer, BigDecimal> map4 = vos2.stream().collect(Collectors.groupingBy(TableDataVO::getDictRow,
|
|
|
+ Collectors.mapping(l -> new BigDecimal(l.getTabVal()), Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
|
|
|
+ for (int i = oneRows; i < (oneRows + ro); i++) {
|
|
|
+ BigDecimal value = new BigDecimal(0);
|
|
|
+ if (map3.get(i) != null) {
|
|
|
+ value = value.add(map3.get(i));
|
|
|
+ }
|
|
|
+ if (map4.get(i) != null) {
|
|
|
+ value = value.add(map4.get(i));
|
|
|
+ }
|
|
|
+ values.add(value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //取出位置集合
|
|
|
+ List<TableDataVO> voList3 = listMap2.get(dict);
|
|
|
+ List<String> keys = new ArrayList<>();
|
|
|
+ keys.addAll(voList3.stream().sorted(Comparator.comparing(TableDataVO::getDictRow)).map(l -> l.getTabKey()).collect(Collectors.toList()));
|
|
|
+ //重置key位置,按照行从小到大
|
|
|
+ //!!暂时没判断多页,到时候要分隔集合
|
|
|
+ for (int i = 0; i < rows; i++) {
|
|
|
+ DataInfo.put(keys.get(i), values.get(i));
|
|
|
+ //如果是合计的就要添加进总合计
|
|
|
+ big3 = big3.add(new BigDecimal(values.get(i) + ""));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //取出数据
|
|
|
+ List<TableDataVO> voList = listMap.get(dict);
|
|
|
+ //重置数据顺序,先按表单分组,再按照行顺序重新装入集合
|
|
|
+ Map<Long, List<TableDataVO>> map = voList.stream().collect(Collectors.groupingBy(TableDataVO::getPKeyId));
|
|
|
+ //根据总行数和起始位置,生成青苗+地面的集合
|
|
|
+ List<Object> values = new ArrayList<>();
|
|
|
+ for (Long aLong : tableRows.keySet()) {
|
|
|
+ Integer ro = tableRows.get(aLong);
|
|
|
+ //获取当前表青苗集合,并且按照行转换为map
|
|
|
+ List<TableDataVO> vos = map.get(aLong);
|
|
|
+ Map<Integer, BigDecimal> map3 = vos.stream().collect(Collectors.groupingBy(TableDataVO::getDictRow,
|
|
|
+ Collectors.mapping(l -> new BigDecimal(l.getTabVal()), Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
|
|
|
+ for (int i = oneRows; i < (oneRows + ro); i++) {
|
|
|
+ BigDecimal value = new BigDecimal(0);
|
|
|
+ if (map3.get(i) != null) {
|
|
|
+ value = value.add(map3.get(i));
|
|
|
+ }
|
|
|
+ values.add(value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //取出位置集合
|
|
|
+ List<TableDataVO> voList3 = listMap2.get(dict);
|
|
|
+ List<String> keys = new ArrayList<>();
|
|
|
+ keys.addAll(voList3.stream().sorted(Comparator.comparing(TableDataVO::getDictRow)).map(l -> l.getTabKey()).collect(Collectors.toList()));
|
|
|
+ //重置key位置,按照行从小到大
|
|
|
+ //!!暂时没判断多页,到时候要分隔集合
|
|
|
+ for (int i = 0; i < rows; i++) {
|
|
|
+ DataInfo.put(keys.get(i), values.get(i));
|
|
|
+ //如果是合计的就要添加进总合计
|
|
|
+ if (dict == 82) {
|
|
|
+ //土地
|
|
|
+ big2 = big2.add(new BigDecimal(values.get(i) + ""));
|
|
|
+ }
|
|
|
+ if (dict == 85) {
|
|
|
+ //时段
|
|
|
+ big4 = big4.add(new BigDecimal(values.get(i) + ""));
|
|
|
+ }
|
|
|
+ //如果是合计的就要添加进总合计
|
|
|
+ if (dict == 86) {
|
|
|
+ big = big.add(new BigDecimal(values.get(i) + ""));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+// elementMap.remove(dict);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (Integer dict : elementMap.keySet()) {
|
|
|
+ if (!batchKey2.contains(dict)) {
|
|
|
+ TableDataVO vo = listMap2.get(dict).get(0);
|
|
|
+ switch (dict) {
|
|
|
+ case 197:
|
|
|
+ //项目名称
|
|
|
+ DataInfo.put(vo.getTabKey(),projectName);
|
|
|
+ break;
|
|
|
+ case 198:
|
|
|
+ //当天日期
|
|
|
+ DataInfo.put(vo.getTabKey(),LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")));
|
|
|
+ break;
|
|
|
+ case 199:
|
|
|
+ //周期
|
|
|
+ DataInfo.put(vo.getTabKey(),stage);
|
|
|
+ break;
|
|
|
+ case 301:
|
|
|
+ //合计补偿总计
|
|
|
+ DataInfo.put(vo.getTabKey(), big);
|
|
|
+ break;
|
|
|
+ case 401:
|
|
|
+ //制表人
|
|
|
+ DataInfo.put(vo.getTabKey(), "王文");
|
|
|
+ break;
|
|
|
+ case 402:
|
|
|
+ //总计土地
|
|
|
+ DataInfo.put(vo.getTabKey(), big2);
|
|
|
+ break;
|
|
|
+ case 403:
|
|
|
+ //总计青苗及地上
|
|
|
+ DataInfo.put(vo.getTabKey(), big3);
|
|
|
+ break;
|
|
|
+ case 404:
|
|
|
+ //总计时段奖
|
|
|
+ DataInfo.put(vo.getTabKey(), big4);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ compensationInfoService.getBussPdfInfo(linkTable.getId(), DataInfo);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new ServiceException("补偿费明细表生成失败:"+e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private void buildPdf3(AgreementLinkTable linkTable,List<Long> ids) {
|
|
|
try {
|
|
|
List<WbsFormElement> list = baseMapper.getTableElement(linkTable.getTableId());
|
|
@@ -196,7 +457,7 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
|
|
|
allKey.stream().forEach(l->l.setDictValue(overMap.get(l.getDictKey())));
|
|
|
Map<Integer, List<TableDataVO>> listMap2 = allKey.stream().collect(Collectors.groupingBy(TableDataVO::getDictValue));
|
|
|
//重复key的字典
|
|
|
- List<Integer> batchKey = Arrays.asList(4, 5, 10, 11);
|
|
|
+ List<Integer> batchKey = Arrays.asList(80, 81, 86, 87);
|
|
|
//统计补偿总和
|
|
|
BigDecimal big = new BigDecimal(0);
|
|
|
for (Integer dict : elementMap.keySet()) {
|
|
@@ -219,7 +480,8 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
|
|
|
//!!暂时没判断多页,到时候要分隔集合
|
|
|
for (int i = 0; i < data.size(); i++) {
|
|
|
DataInfo.put(keys.get(i), data.get(i));
|
|
|
- if (dict == 5) {
|
|
|
+ //如果是合计的就要添加进总合计
|
|
|
+ if (dict == 86) {
|
|
|
big = big.add(new BigDecimal(data.get(i) + ""));
|
|
|
}
|
|
|
}
|