Browse Source

结算协议第四张表

qianxb 1 year ago
parent
commit
b7cc384439

+ 265 - 3
blade-service/blade-land/src/main/java/org/springblade/land/service/impl/ClearingAgreementInfoServiceImpl.java

@@ -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) + ""));
                             }
                         }

+ 5 - 1
blade-service/blade-land/src/main/java/org/springblade/land/service/impl/CompensationInfoServiceImpl.java

@@ -344,7 +344,8 @@ public class CompensationInfoServiceImpl extends BaseServiceImpl<CompensationInf
                             //当前统计值
                             try {
                                 if (dict.equals(80)) {
-                                    str.add(StringUtils.join(vos.stream().map(l -> l.getTabVal()).collect(Collectors.toList()), "、") + "、");
+                                    List<String> list = vos.stream().sorted(Comparator.comparing(TableDataVO::getDictRow)).map(l -> l.getTabVal()).collect(Collectors.toList());
+                                    str.addAll(list);
                                 } else if (dict.equals(82)) {
                                     b1 = b1.add(vos.stream().map(l -> new BigDecimal(l.getTabVal())).reduce(BigDecimal.valueOf(0), BigDecimal::add));
                                 } else if (dict.equals(83)) {
@@ -640,6 +641,9 @@ public class CompensationInfoServiceImpl extends BaseServiceImpl<CompensationInf
                 for(String key : tableInfo.keySet()){
                     if(key.contains("key")&&key.contains("__")){
                         Long id = SnowFlakeUtil.getId();
+                        if (StringUtils.isBlank(tableInfo.getString(key))){
+                            continue;
+                        }
                         list.add(new Object[]{id,linkTable.getTableDataId(),key,tableInfo.getString(key)});
 
                         Elements datas = doc.getElementsByAttributeValue("keyname", key);