Selaa lähdekoodia

Merge branch 'master' of http://47.108.172.52:3000/dayou/productivity-platform

GouGengquan 8 kuukautta sitten
vanhempi
commit
395e734495
24 muutettua tiedostoa jossa 654 lisäystä ja 73 poistoa
  1. 17 0
      biz-base/src/main/java/com/dayou/controller/FileUploadController.java
  2. 53 0
      biz-base/src/main/java/com/dayou/controller/HouseGuarantyDocController.java
  3. 3 3
      biz-base/src/main/resources/application-local.yaml
  4. 46 20
      biz-base/src/test/java/com/dayou/AddressParser.java
  5. 24 25
      biz-base/src/test/java/com/dayou/FreeMarkTest.java
  6. 10 0
      common/src/main/java/com/dayou/config/FileNetConfig.java
  7. 44 0
      common/src/main/java/com/dayou/constants/HouseGuarantyDoc.java
  8. 15 0
      common/src/main/java/com/dayou/utils/AddressUtil.java
  9. 33 0
      common/src/main/java/com/dayou/utils/EasyExcelUtil.java
  10. 26 0
      common/src/main/java/com/dayou/utils/FileNetUtil.java
  11. 43 13
      common/src/main/java/com/dayou/utils/HouseDocumentUtil.java
  12. 28 3
      common/src/main/java/com/dayou/utils/JsonUtil.java
  13. 29 8
      common/src/main/java/com/dayou/utils/table/WordTableHelper.java
  14. 15 0
      dao/src/main/java/com/dayou/mapper/HouseGuarantyProcessMapper.java
  15. 6 0
      dao/src/main/resources/mapper/HouseGuarantyProcess.xml
  16. 4 0
      domain/src/main/java/com/dayou/doc/house/ConsignorLetterDO.java
  17. 18 0
      domain/src/main/java/com/dayou/entity/HouseGuarantyProcess.java
  18. 1 0
      domain/src/main/java/com/dayou/enums/HouseTargetTableColumn.java
  19. 4 0
      service/pom.xml
  20. 15 0
      service/src/main/java/com/dayou/service/HouseGuarantyProcessService.java
  21. 27 0
      service/src/main/java/com/dayou/service/HouseGuarantyService.java
  22. 13 0
      service/src/main/java/com/dayou/service/impl/HouseGuarantyProcessServiceImpl.java
  23. 167 0
      service/src/main/java/com/dayou/service/impl/HouseGuarantyServiceImpl.java
  24. 13 1
      sql/update_sql.sql

+ 17 - 0
biz-base/src/main/java/com/dayou/controller/FileUploadController.java

@@ -18,6 +18,8 @@ import org.springframework.web.multipart.MultipartFile;
 import java.util.Map;
 import java.util.Objects;
 
+import static com.dayou.constants.HouseGuarantyDoc.COLLECT1_XLSX;
+
 @RestController
 @RequestMapping("/file")
 @Slf4j
@@ -58,4 +60,19 @@ public class FileUploadController {
         }
     }
 
+    /**
+     * 房地产报告-表单1(估价结果一览表、基本信息)
+     * @param file
+     * @return
+     */
+    @PostMapping("/house/guaranty/target")
+    public Result<Map<String, String>> updateCollect(MultipartFile file){
+        // 判断文件类型
+        if (Objects.equals(file.getContentType(), "application/vnd.ms-excel") || Objects.equals(file.getContentType(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) {
+            return Result.build(FileNetUtil.upload(file, fileNetConfig.getBaseDir(), fileNetConfig.getHouseGuarantyPath(), COLLECT1_XLSX));
+        }else {
+            return Result.build(Status.PARAM_ERROR, "请上传xls或xlsx类型的excel文档!");
+        }
+    }
+
 }

+ 53 - 0
biz-base/src/main/java/com/dayou/controller/HouseGuarantyDocController.java

@@ -0,0 +1,53 @@
+package com.dayou.controller;
+
+
+import com.dayou.result.Result;
+import com.dayou.service.HouseGuarantyService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * 房地产抵押类报告
+ */
+@RestController
+@RequestMapping("house/guaranty")
+@Slf4j
+public class HouseGuarantyDocController {
+
+    @Autowired
+    private HouseGuarantyService houseGuarantyService;
+
+    /**
+     * 生成估价结果一览表的word文件
+     * @param html
+     * @param homePath
+     * @return
+     */
+    @PostMapping("/targetTable")
+    public Result<String> genTargetsTableWord(String html,String homePath){
+        return Result.build(houseGuarantyService.createTableWord(html,homePath));
+    }
+
+    /**
+     * 解析表单1
+     * @param id
+     * @return
+     */
+    @GetMapping("/collect1/{id}")
+    public Result<Boolean> analysisCollect1(@PathVariable("id") Long id){
+        return Result.build(houseGuarantyService.analysisCollect1(id));
+    }
+
+    /**
+     * 生成致委托人函word
+     * @param id
+     * @return
+     */
+    @GetMapping("/consignor/{id}")
+    public Result<String> genConsignorLetter(@PathVariable("id") Long id){
+        return Result.build(houseGuarantyService.genConsignorLetter(id));
+    }
+
+}

+ 3 - 3
biz-base/src/main/resources/application-local.yaml

@@ -64,15 +64,15 @@ sa-token:
 # oa系统的api url
 oa-api-url: localhost:8088/api/
 
-tableSavePath: E:\test\word\
-
 file-net:
   # 基础配置
-  base-dir: E:\productivity-platform-files\
+  base-dir: /Users/wuwei/opt/temp/
   max-file-size: 102400
   # 资产业务配置
   asset-template-report-path: assets\templates\report\
   asset-template-calculate-path: assets\templates\calculate\
   asset-output-report-path: assets\output\report\
   asset-output-calculate-path: assets\output\calculate\
+  house-guaranty-path: house/guaranty
+  house-guaranty-template-path: house/guaranty/temp/
 

+ 46 - 20
biz-base/src/test/java/com/dayou/AddressParser.java

@@ -10,6 +10,7 @@ import com.dayou.utils.CollectionUtil;
 import com.dayou.utils.HouseDocumentUtil;
 
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import static com.dayou.enums.HouseTargetTableColumn.LOCATION;
@@ -35,38 +36,63 @@ public class AddressParser {
 //                "高新区新乐中街280号1栋-1层局部(共计142套)",
 //                "青羊区草堂路3号6栋1-3楼B1号",
 //                "武侯区晋阳街道晋阳村领秀别墅1栋1-3楼1号",
-//                "武侯区人民南路四段21号3栋3单元5层03号",
-//                "武侯区人民南路四段21号3栋3单元7层03号",
-                "武侯区双凤五路412号1层",
-                "武侯区双凤五路450号1层",
-                "武侯区双凤五路470号1层",
-                "武侯区金江路216号1层",
-                "武侯区武兴路989号2层",
-                "都江堰市玉堂镇青城水街北段255号",
-                "都江堰市玉堂镇青城水街北段257号",
-                "都江堰市玉堂镇青城水街北段259号",
-//                "南充市阆中市缓缓路23号"
+                "武侯区人民南路四段21号3栋3单元5层03号",
+                "武侯区人民南路四段21号3栋3单元7层03号",
+                "青羊区人民南路四段21号3栋3单元7层03号",
+//                "武侯区双凤五路412号1层",
+//                "武侯区双凤五路450号1层",
+//                "武侯区双凤五路470号1层",
+//                "武侯区金江路216号1层",
+//                "青羊区武兴路989号2层",
+//                "都江堰市玉堂镇青城水街北段255号",
+//                "都江堰市玉堂镇青城水街北段257号",
+//                "都江堰市玉堂镇青城水街北段259号",
+////                "南充市阆中市缓缓路23号"
 //                "武侯区双凤五路412号1层",
 //                "武侯区双凤五路450号1层",
 //                "武侯区双凤五路470号1层",
 //                "武侯区金江路216号1层",
 //                "武侯区武兴路989号2层"
-
+//                "武侯区人民南路四段",
+//                "武侯区晋阳街道晋阳村",
+//                "高新区新乐中街",
+//                "高新区高棚东路",
+//                "青羊区草堂路"
+//                "成都市武侯区",
+//                "成都市青羊区",
+//                "成都市成华区",
+//                "成都市双流区",
+//                "成都市新都区",
+//                "成都市都江堰市"
         };
         List<String> list = Arrays.asList(addresses);
         try {
             List<Address> lists = new ArrayList<>();
-            list.stream().forEach(x -> {
-                Address parsedAddress = AddressUtil.parseAddress(x);
-                lists.add(parsedAddress);
-            });
-            String s = CollectionUtil.formatSplitAndRemoveMiddle(mergeAddress(lists));
+            for (String address : list) {
+                lists.add(AddressUtil.parseAddress(address));
+            }
+            Map<List<Object>, List<Address>> collect = lists.stream().collect(Collectors.groupingBy(compositeKey, Collectors.toList()));
+
+            if (collect.size()>5){
+                AddressUtil.ignoreToRoad(lists);
+            }
+            String s ;
+            if (lists.size()>8){
+                lists = lists.subList(0, 8);
+                s = CollectionUtil.formatSplitAndRemoveMiddle(mergeAddress(lists)) + "等" + lists.size() + "处";
+            }else {
+                s = CollectionUtil.formatSplitAndRemoveMiddle(mergeAddress(lists)) + ",共计"+ lists.size() + "处";
+            }
             System.out.println(s);
-        } catch (Exception e) {
-            System.err.println(e.getMessage());
+
+        }catch (Exception e){
+            e.printStackTrace();
         }
-    }
 
+    }
 
+    static Function<Address, List<Object>> compositeKey = address ->
+            Arrays.asList(address.getProvince(), address.getCity(), address.getDistrict(), address.getTown(),
+                    address.getCommunity(), address.getRoad());
 
 }

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 24 - 25
biz-base/src/test/java/com/dayou/FreeMarkTest.java


+ 10 - 0
common/src/main/java/com/dayou/config/FileNetConfig.java

@@ -39,4 +39,14 @@ public class FileNetConfig {
      */
     private int maxFileSize;
 
+    /**
+     * 房地产抵押文件目录
+     */
+    private String houseGuarantyPath;
+
+    /**
+     * 房地产抵押模版文件目录
+     */
+    private String houseGuarantyTemplatePath;
+
 }

+ 44 - 0
common/src/main/java/com/dayou/constants/HouseGuarantyDoc.java

@@ -0,0 +1,44 @@
+package com.dayou.constants;
+
+/**
+ * 房地产抵押报告常量类
+ */
+public class HouseGuarantyDoc {
+
+    /**
+     * 表单1
+     */
+    public static final String COLLECT1_XLSX = "collect1.xlsx";
+
+    /**
+     * 估价结果一览表sheet转的json文件
+     */
+    public static final String COLLECT1_JSON = "target_table.json";
+
+    /**
+     * 估价对象json文件
+     */
+    public static final String TARGETS_JSON = "target.json";
+
+    /**
+     * 估价结果一览表sheet中文名
+     */
+    public static final String TARGETS_TABLE_ZH = "估价结果一览表";
+
+    /**
+     * 基本信息sheet中文名
+     */
+    public static final String BASE_INFO_ZH = "基本信息";
+
+    /**
+     * 致委托人函模版
+     */
+    public static final String CONSIGNOR_LETTER_TEMPLATE = "consignor_letter.docx";
+
+    /**
+     * 估价结果一览表table word
+     */
+    public static final String TARGETS_DOCX = "targets_table.docx";
+
+
+}

+ 15 - 0
common/src/main/java/com/dayou/utils/AddressUtil.java

@@ -90,4 +90,19 @@ public class AddressUtil {
         }
         return input.replaceFirst(Pattern.quote(prefix), "").trim();
     }
+
+    /**
+     * 忽略路以下的单位
+     * @param addresses
+     * @return
+     */
+    public static void ignoreToRoad(List<Address> addresses){
+        addresses.stream().forEach(x->{
+            x.setRoadNumber("");
+            x.setBuilding("");
+            x.setFloor("");
+            x.setUnit("");
+            x.setRoom("");
+        });
+    }
 }

+ 33 - 0
common/src/main/java/com/dayou/utils/EasyExcelUtil.java

@@ -1,5 +1,6 @@
 package com.dayou.utils;
 
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.ExcelWriter;
 import com.alibaba.excel.write.metadata.WriteSheet;
@@ -14,6 +15,7 @@ import java.nio.file.Paths;
 import java.util.HashMap;
 import java.util.Map;
 
+
 public class EasyExcelUtil {
 
     /**
@@ -142,4 +144,35 @@ public class EasyExcelUtil {
         }
     }
 
+    /**
+     * 房地产基本信息sheet表单 固定解析函数
+     * @param wb
+     * @param sheetName
+     * @return
+     */
+    public static Map<String ,String> getExcelCellValue(Workbook wb, String sheetName) {
+        Map<String,String> valueMap = new HashMap<>();
+        Sheet sheet = wb.getSheet(sheetName);// 获取指定名称Sheet的内容
+        int lastRowNum = sheet.getLastRowNum();
+        Row rowKey = null;
+        Row rowValue = null;
+        Cell cellKey = null;
+        Cell cellValue = null;
+        for (int rowNum = sheet.getFirstRowNum(); rowNum <= lastRowNum/2; rowNum+=2) {
+            rowKey = sheet.getRow(rowNum);
+            rowValue = sheet.getRow(rowNum+1);
+            int lastColNum = rowKey.getLastCellNum();
+            for (int colNum = 0; colNum <= lastColNum; colNum++) {
+                cellKey = rowKey.getCell(colNum);
+                cellValue = rowValue.getCell(colNum);
+                if (cellKey != null && StrUtil.isNotBlank(cellKey.toString())
+                    && cellValue != null) {
+                    String attr = cellKey.getHyperlink().getAddress();
+                        valueMap.put(attr, cellValue.toString());
+                }
+            }
+        }
+        return valueMap;
+    }
+
 }

+ 26 - 0
common/src/main/java/com/dayou/utils/FileNetUtil.java

@@ -1,5 +1,6 @@
 package com.dayou.utils;
 
+import cn.hutool.core.date.DateUtil;
 import com.dayou.exception.BusinessException;
 import org.springframework.util.FileCopyUtils;
 import org.springframework.web.multipart.MultipartFile;
@@ -8,6 +9,7 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -18,6 +20,19 @@ import java.net.URL;
 public class FileNetUtil {
 
     /**
+     * 上传文件到服务器本地磁盘(按日期目录存储)
+     * @param multiFile
+     * @param baseDir
+     * @param uploadPath
+     * @param uploadFileName
+     * @return
+     */
+    public static Map<String,String> upload(MultipartFile multiFile, String baseDir, String uploadPath, String uploadFileName){
+        uploadPath += createDateFolder();
+        return uploadToServer(multiFile,baseDir,uploadPath,uploadFileName);
+    }
+
+    /**
      * 上传文件到服务器本地磁盘
      *
      * @param multiFile      文件
@@ -101,4 +116,15 @@ public class FileNetUtil {
         }
     }
 
+    public static String createDateFolder() {
+        Date now = new Date();
+        String year = DateUtil.format(now, "yyyy");
+        String month = DateUtil.format(now, "MM");
+        String day = DateUtil.format(new Date(), "dd");
+        String time = String.valueOf(System.currentTimeMillis());
+        String spliter = "/";
+        String index = spliter + year + spliter + month + spliter + day + spliter + time + spliter;
+        return index;
+    }
+
 }

+ 43 - 13
common/src/main/java/com/dayou/utils/HouseDocumentUtil.java

@@ -9,6 +9,7 @@ import com.dayou.exception.ErrorCode;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import static com.dayou.enums.HouseTargetTableColumn.*;
@@ -31,10 +32,13 @@ public class HouseDocumentUtil {
             Set<String> columns = jsonObject.keySet();
             for (int i = 0; i < jsonArray.size(); i++){
                 JSONObject item  = (JSONObject) jsonArray.get(i);
-                if (item.get(LOCATION.getZhName())!=null
-                    && item.get(HouseTargetTableColumn.CERTIFICATE_NO.getZhName())!=null){
+                if (!item.isNull(LOCATION.getZhName()) &&
+                        item.get(LOCATION.getZhName())!=null &&
+                        !item.isNull(CERTIFICATE_NO.getZhName())
+                    && item.get(CERTIFICATE_NO.getZhName())!=null){
                     for (String key : columns){
-                        if (item.get(key)==null || item.get(key)==""){
+                        if ((item.isNull(key) || item.get(key)==null || item.get(key)=="")
+                                && !key.equals(ACT_ADDRESS.getZhName())){
                             JSONObject lastItem  = (JSONObject) jsonArray.get(i-1);
                             item.set(key, lastItem.get(key));
                         }
@@ -52,8 +56,35 @@ public class HouseDocumentUtil {
      * @return
      */
     public static String getProjectName(JSONArray array){
-        List<Object> addresses = array.stream().map(obj -> ((JSONObject) obj).get(LOCATION.getZhName()))
-                .collect(Collectors.toList());
+        List<Object> addresses = JsonUtil.collectByKeyToList(array, LOCATION.getZhName());
+        List<Address> addressList = AddressUtil.parseAddress(addresses);
+
+        Map<List<Object>, List<Address>> collect = addressList.stream().collect(Collectors.groupingBy(compositeKey, Collectors.toList()));
+        //当地址大于6个时,忽略road以下信息
+        if (collect.size()>5){
+            AddressUtil.ignoreToRoad(addressList);
+        }
+        String result = "";
+        if (collect.size()>8){
+            addressList = addressList.subList(0, 8);
+            result =  CollectionUtil.formatSplitAndRemoveMiddle(mergeAddress(addressList)) + "等"+addressList.size();
+        }else {
+            result =  CollectionUtil.formatSplitAndRemoveMiddle(mergeAddress(addressList)) + ",共计"+ addressList.size();
+        }
+        return result +"处估价对象" + getUseTo(array) +"用房地产抵押价值评估";
+    }
+
+    static Function<Address, List<Object>> compositeKey = address ->
+            Arrays.asList(address.getProvince(), address.getCity(), address.getDistrict(), address.getTown(),
+                    address.getCommunity(), address.getRoad());
+
+    /**
+     * 格式化地址
+     * @param array
+     * @return
+     */
+    public static String getAddress(JSONArray array){
+        List<Object> addresses = JsonUtil.collectByKeyToList(array, LOCATION.getZhName());
         List<Address> addressList = AddressUtil.parseAddress(addresses);
         return CollectionUtil.formatSplitAndRemoveMiddle(mergeAddress(addressList));
     }
@@ -83,13 +114,13 @@ public class HouseDocumentUtil {
     /**
      * 格式化实勘地址
      * @param targets
-     * @param actAddress
      * @return
      */
-    public static String getActAddress(JSONArray targets,String actAddress){
+    public static String getActAddress(JSONArray targets){
         StringBuilder sb = new StringBuilder("【");
+        String actAddress = (String) ((JSONObject) targets.get(0)).get(ACT_ADDRESS.getZhName());
         if (StrUtil.isNotBlank(actAddress)){
-            sb.append("实勘地址").append(actAddress).append("(未见其余门牌号);");
+            sb.append("实勘地址").append(actAddress).append("(未见其余门牌号);");
         }
 
         List<Object> acreage = JsonUtil.collectByKeyToList(targets, ACREAGE.getZhName());
@@ -120,12 +151,11 @@ public class HouseDocumentUtil {
     /**
      * 格式化估价对象描述
      * @param targets    估价对象
-     * @param actAddress 实勘地址
      * @return
      */
-    public static String getTargetDescription(JSONArray targets,String actAddress){
+    public static String getTargetDescription(JSONArray targets){
         //单个估价对象里面可能有多个子对象
-        String address = getProjectName(targets);
+        String address = getAddress(targets);
         //实勘地址
         //权利人
         String ownShipUser = getOwnShipUser(targets);
@@ -134,7 +164,7 @@ public class HouseDocumentUtil {
         //编号
         String id = (String) ((JSONObject) targets.get(0)).get(ID.getZhName());
         //实勘描述
-        String actDesc = getActAddress(targets, actAddress);
+        String actDesc = getActAddress(targets);
         //格式化 todo 段落模版从DB中获取
         String template ;
         if (StrUtil.isNotBlank(ownShipUser)){
@@ -246,7 +276,7 @@ public class HouseDocumentUtil {
                 int index3 = 0;
                 for (Map.Entry<String,List<Address>> entry3 : collect3.entrySet()){
                     if (collect3.size()>1 && index3!=0){
-                        stringBuilder.append("");
+                        stringBuilder.append("");
                     }
                     String district = entry3.getKey();
                     stringBuilder.append(district);

+ 28 - 3
common/src/main/java/com/dayou/utils/JsonUtil.java

@@ -2,6 +2,7 @@ package com.dayou.utils;
 
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -9,18 +10,31 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import static com.dayou.enums.HouseTargetTableColumn.ACREAGE;
-
 /**
  * JSON工具类
  */
 public class JsonUtil {
 
+
+    /**
+     * 从JSONObject文件读取json数组
+     * @param filePath
+     * @param key 值为json数组的key
+     * @return
+     * @throws IOException
+     */
+    public static JSONArray file2JsonArray(String filePath,String key) throws IOException {
+        String jsonStr = new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
+        JSONObject jsonObject = JSONUtil.parseObj(jsonStr);
+        return new JSONArray(jsonObject.get(key));
+    }
+
     /**
-     * 从JSON文件读取json数组
+     * 从JSONArray文件读取json数组
      * @param filePath
      * @return
      * @throws IOException
@@ -66,4 +80,15 @@ public class JsonUtil {
                 .filter(x->x!=null && !x.equals("/")).collect(Collectors.toSet());
 
     }
+
+    /**
+     * groupBy
+     * @param jsonArray
+     * @param key
+     * @return
+     */
+    public static Map<Object, List<Object>> groupBy(JSONArray jsonArray, String key){
+        Map<Object, List<Object>> collect = jsonArray.stream().collect(Collectors.groupingBy(obj -> ((JSONObject) obj).get(key)));
+        return collect;
+    }
 }

+ 29 - 8
common/src/main/java/com/dayou/utils/table/WordTableHelper.java

@@ -1,6 +1,7 @@
 package com.dayou.utils.table;
 
 import cn.hutool.core.util.StrUtil;
+import com.dayou.exception.ErrorCode;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
@@ -11,14 +12,13 @@ import org.springframework.stereotype.Component;
 import java.util.HashMap;
 import java.util.Map;
 
+import static com.dayou.constants.HouseGuarantyDoc.TARGETS_DOCX;
 import static com.dayou.constants.TableHTML.*;
+import static com.dayou.enums.HouseTargetTableColumn.ACT_ADDRESS;
 
 @Component
 public class WordTableHelper {
 
-    @Value("${tableSavePath}")
-    private String tableSavePath;
-
     private final String FTL_TEMPLATE_DIR = "/ftl";
 
     private final String FTL_TEMPLATE = "wordTableTemplate.ftl";
@@ -29,30 +29,31 @@ public class WordTableHelper {
      * @param html excel表格解析后的html代码
      * @return 生成的word表格的存储路径
      */
-    public String createTableWord(String html){
+    public String createTableWord(String html,String path){
 
         try {
             if (StrUtil.isNotBlank(html)){
                 RichObject richObject = new RichObject();
-                richObject.setHtml(htmlTableFormat(html));
+                richObject.setHtml(html);
                 RichHtmlHandler richHtmlHandler = WordGeneratorWithFreemarker.createRichHtmlHandler(richObject);
-
                 Map<String,String> data = new HashMap<>();
                 data.put("table", richHtmlHandler.getHandledDocBodyBlock());
-                String tablePath = tableSavePath + System.currentTimeMillis()+".docx";
+                String tablePath = path + TARGETS_DOCX;
                 String templatePath = Class.class.getResource(FTL_TEMPLATE_DIR).getPath();
                 templatePath = java.net.URLDecoder.decode(templatePath,"utf-8");
                 WordGeneratorWithFreemarker.createDoc(templatePath,FTL_TEMPLATE,data,tablePath);
                 return tablePath;
             }
         } catch (Exception e) {
-            throw new RuntimeException(e);
+            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"生成表格WORD失败");
         }
         return null;
     }
 
     public String htmlTableFormat(String srcHtml){
         Document document = Jsoup.parse(srcHtml);
+        removeActAddressCol(document);
+
         Elements table = document.getElementsByTag("table");
         table.attr("style",TABLE_STYLE);
         Elements td = document.select("table td");
@@ -65,4 +66,24 @@ public class WordTableHelper {
         }
         return document.body().html();
     }
+
+    /**
+     * 删除实勘地址列
+     * @param document
+     */
+    public void removeActAddressCol(Document document){
+        Element table = document.select("table").first();
+        Elements rows = table.select("tr");
+        Elements cols = rows.get(0).select("td");
+        int lastCol = cols.size()-1;
+        String text = cols.get(lastCol).text();
+        if (ACT_ADDRESS.getZhName().equals(text)){
+            for (Element row : rows) {
+                Elements cells = row.select("td");
+                int removeIndex = row.select("td").size() - 1;
+                cells.get(removeIndex).remove();
+            }
+        }
+
+    }
 }

+ 15 - 0
dao/src/main/java/com/dayou/mapper/HouseGuarantyProcessMapper.java

@@ -0,0 +1,15 @@
+package com.dayou.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dayou.entity.HouseGuarantyProcess;
+
+/**
+ * <p>
+ * 房地产抵押过程表 Mapper 接口
+ * </p>
+ *
+ * @author mybatis-plus-generator
+ * @since 2024-11-07
+ */
+public interface HouseGuarantyProcessMapper extends BaseMapper<HouseGuarantyProcess> {
+}

+ 6 - 0
dao/src/main/resources/mapper/HouseGuarantyProcess.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dayou.mapper.HouseGuarantyProcessMapper">
+
+
+</mapper>

+ 4 - 0
domain/src/main/java/com/dayou/doc/house/ConsignorLetterDO.java

@@ -34,4 +34,8 @@ public class ConsignorLetterDO {
 
     private String blank;
 
+    private String valueTiming;
+
+    private String methods;
+
 }

+ 18 - 0
domain/src/main/java/com/dayou/entity/HouseGuarantyProcess.java

@@ -0,0 +1,18 @@
+package com.dayou.entity;
+
+import com.dayou.common.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class HouseGuarantyProcess extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID=1L;
+
+    private String home;
+
+    private String targetsHtml;
+}

+ 1 - 0
domain/src/main/java/com/dayou/enums/HouseTargetTableColumn.java

@@ -23,6 +23,7 @@ public enum HouseTargetTableColumn {
     AMOUNT("AMOUNT","总价(万元)"),
     LAND_CERTIFICATE_NO("LAND_CERTIFICATE_NO","国有土地使用证号"),
     LAND_TYPE("LAND_TYPE","地类(用途)"),
+    ACT_ADDRESS("ACT_ADDRESS","实勘地址")
 
     ;
 

+ 4 - 0
service/pom.xml

@@ -40,6 +40,10 @@
             <groupId>commons-fileupload</groupId>
             <artifactId>commons-fileupload</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.aspose</groupId>
+            <artifactId>aspose-cells</artifactId>
+        </dependency>
     </dependencies>
     <dependencyManagement>
         <dependencies>

+ 15 - 0
service/src/main/java/com/dayou/service/HouseGuarantyProcessService.java

@@ -0,0 +1,15 @@
+package com.dayou.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dayou.entity.HouseGuarantyProcess;
+
+/**
+ * <p>
+ * 房地产抵押过程表 服务类
+ * </p>
+ *
+ * @author mybatis-plus-generator
+ * @since 2024-11-07
+ */
+public interface HouseGuarantyProcessService extends IService<HouseGuarantyProcess> {
+}

+ 27 - 0
service/src/main/java/com/dayou/service/HouseGuarantyService.java

@@ -0,0 +1,27 @@
+package com.dayou.service;
+
+
+public interface HouseGuarantyService {
+
+
+    /**
+     * 创建估价结果一览表word文件
+     * @param html
+     * @return
+     */
+    String createTableWord(String html,String homePath);
+
+    /**
+     * 解析表单1
+     * @param id
+     * @return
+     */
+    Boolean analysisCollect1(Long id);
+
+    /**
+     * 生成致委托人函
+     * @param id
+     * @return
+     */
+    String genConsignorLetter(Long id);
+}

+ 13 - 0
service/src/main/java/com/dayou/service/impl/HouseGuarantyProcessServiceImpl.java

@@ -0,0 +1,13 @@
+package com.dayou.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dayou.entity.HouseGuarantyProcess;
+import com.dayou.mapper.HouseGuarantyProcessMapper;
+import com.dayou.service.HouseGuarantyProcessService;
+import com.dayou.service.HouseGuarantyService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class HouseGuarantyProcessServiceImpl extends ServiceImpl<HouseGuarantyProcessMapper, HouseGuarantyProcess> implements HouseGuarantyProcessService {
+
+}

+ 167 - 0
service/src/main/java/com/dayou/service/impl/HouseGuarantyServiceImpl.java

@@ -0,0 +1,167 @@
+package com.dayou.service.impl;
+
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import com.alibaba.fastjson2.JSON;
+import com.aspose.cells.SaveFormat;
+import com.aspose.cells.Workbook;
+import com.aspose.words.Document;
+import com.aspose.words.DocumentBuilder;
+import com.aspose.words.Paragraph;
+import com.dayou.config.FileNetConfig;
+import com.dayou.doc.house.ConsignorLetterDO;
+import com.dayou.entity.HouseGuarantyProcess;
+import com.dayou.exception.ErrorCode;
+import com.dayou.service.HouseGuarantyProcessService;
+import com.dayou.service.HouseGuarantyService;
+import com.dayou.utils.AsposeWordUtil;
+import com.dayou.utils.EasyExcelUtil;
+import com.dayou.utils.HouseDocumentUtil;
+import com.dayou.utils.JsonUtil;
+import com.dayou.utils.table.WordTableHelper;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import static com.dayou.constants.HouseGuarantyDoc.*;
+import static com.dayou.enums.HouseTargetTableColumn.ID;
+
+@Service
+public class HouseGuarantyServiceImpl implements HouseGuarantyService {
+
+
+    @Autowired
+    private WordTableHelper wordTableHelper;
+
+    @Autowired
+    private HouseGuarantyProcessService houseGuarantyProcessService;
+
+    @Autowired
+    private FileNetConfig fileNetConfig;
+
+    @Override
+    public String createTableWord(String html,String homePath) {
+        html = wordTableHelper.htmlTableFormat(html);
+        HouseGuarantyProcess hgp = new HouseGuarantyProcess();
+        hgp.setHome(homePath);
+        hgp.setTargetsHtml(html);
+        houseGuarantyProcessService.save(hgp);
+        return wordTableHelper.createTableWord(html, fileNetConfig.getBaseDir() + homePath);
+    }
+
+    @Override
+    public Boolean analysisCollect1(Long id) {
+        HouseGuarantyProcess process = houseGuarantyProcessService.getById(id);
+        String home = fileNetConfig.getBaseDir() + process.getHome();
+        try {
+            Workbook workbook = new Workbook( home + COLLECT1_XLSX);
+            workbook.save(home+ COLLECT1_JSON, SaveFormat.JSON);
+            JSONArray array = JsonUtil.file2JsonArray(home + COLLECT1_JSON, TARGETS_TABLE_ZH);
+            //解析估价对象json
+            JSONArray xArray = HouseDocumentUtil.houseTargetsFormat(array);
+            //纯估价对象
+            JsonUtil.jsonArray2File(xArray,home + TARGETS_JSON);
+            return Boolean.TRUE;
+        } catch (Exception e) {
+            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"Json文件读取错误");
+            return Boolean.FALSE;
+        }
+    }
+
+    @Override
+    public String genConsignorLetter(Long id) {
+        HouseGuarantyProcess process = houseGuarantyProcessService.getById(id);
+        String home = fileNetConfig.getBaseDir() + process.getHome();
+        try {
+            // 读取估价对象地址
+            JSONArray array = JsonUtil.file2JsonArray(home + TARGETS_JSON);
+
+            //读取基本信息
+            XSSFWorkbook workbook = new XSSFWorkbook(home + COLLECT1_XLSX);
+            Map<String, String> valueMap = EasyExcelUtil.getExcelCellValue(workbook, BASE_INFO_ZH);
+            ConsignorLetterDO clDO = JSON.parseObject(JSON.toJSONString(valueMap), ConsignorLetterDO.class);
+            clDO.setProjectName(HouseDocumentUtil.getProjectName(array));
+            Map<Object, List<Object>> collect = array.stream().collect(Collectors.groupingBy(x -> ((JSONObject) x).get(ID.getZhName())));
+            String actDesc = "";
+            int index = 1;
+            int mapSize = collect.size();
+            for (Map.Entry<Object, List<Object>> entry : collect.entrySet()) {
+                List<Object> value = entry.getValue();
+                JSONArray xArray = new JSONArray(value);
+                String actAddress = HouseDocumentUtil.getTargetDescription(xArray);
+                //添加换行符
+                if (index != mapSize){
+                    actAddress +=  "\n";
+                }
+                actDesc += actAddress;
+                index ++;
+            }
+            clDO.setActDesc(actDesc);
+            String ownShipUser = HouseDocumentUtil.getOwnShipUser(array);
+
+            if (!"".equals(ownShipUser) && !ownShipUser.contains(clDO.getConsignor())){
+                clDO.setBlank("");
+                clDO.setOwnship("不动产权利人:");
+                clDO.setOwnshipUser(ownShipUser);
+            }
+            byte[] tmplWordByte = Files.readAllBytes(Paths.get(fileNetConfig.getBaseDir()
+                    + fileNetConfig.getHouseGuarantyTemplatePath() + CONSIGNOR_LETTER_TEMPLATE));
+            byte[] resultWordByte = AsposeWordUtil.fillWordDataByDomain(tmplWordByte, clDO);
+            String consignorLetterName = home + System.currentTimeMillis() + ".docx";
+            File resultFile = new File(consignorLetterName);
+            FileOutputStream fos = new FileOutputStream(resultFile);
+            fos.write(resultWordByte);
+            fos.close();
+            insetTargetTableWord(consignorLetterName,home + TARGETS_DOCX);
+            return consignorLetterName;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 插入估价结果一览表word文件
+     * @param mainWordPath
+     * @param tableWordPath
+     * @throws Exception
+     */
+    private void insetTargetTableWord(String mainWordPath,String tableWordPath)  throws Exception{
+        // 主word文件
+        Document mainDoc = new Document(mainWordPath);
+
+        //删除空白行
+        DocumentBuilder builder = new DocumentBuilder(mainDoc);
+        builder.moveToMergeField("blank");
+        Paragraph currentParagraph2 = builder.getCurrentParagraph();
+        if (currentParagraph2.getParentNode() != null){
+            currentParagraph2.remove();
+        }
+        builder.moveToMergeField("ownship");
+        Paragraph currentParagraph = builder.getCurrentParagraph();
+        if (currentParagraph.getParentNode() != null){
+            currentParagraph.remove();
+        }
+        builder.moveToMergeField("ownshipUser");
+        Paragraph currentParagraph1 = builder.getCurrentParagraph();
+        if (currentParagraph1.getParentNode() != null){
+            currentParagraph1.remove();
+        }
+
+        // 需要插入的word文件
+        Document subDoc = new Document(tableWordPath);
+
+        mainDoc = AsposeWordUtil.insertDocumentAfterBookMark(mainDoc, subDoc, "targetTable", false);
+        // 保存文件
+        mainDoc.save(mainWordPath);
+    }
+}

+ 13 - 1
sql/update_sql.sql

@@ -184,4 +184,16 @@ ALTER TABLE tmpl_asset_report ADD COLUMN has_section BIT(1) NOT NULL DEFAULT 0 C
  */
 ALTER TABLE tmpl_asset_calculate_section ADD COLUMN section_name VARCHAR(50) NOT NULL COMMENT '测算表段落模板名称';
 ALTER TABLE tmpl_asset_calculate_section ADD COLUMN tmpl_code VARCHAR(50) NOT NULL COMMENT '模板code';
-ALTER TABLE tmpl_asset_calculate ADD COLUMN tmpl_code VARCHAR(50) NOT NULL COMMENT '模板code';
+ALTER TABLE tmpl_asset_calculate ADD COLUMN tmpl_code VARCHAR(50) NOT NULL COMMENT '模板code';
+
+
+DROP TABLE IF EXISTS `house_guaranty_process`;
+CREATE TABLE `house_guaranty_process-platform`  (
+                                                   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键id',
+                                                   `home` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'docHome',
+                                                   `targets_html` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '估价结果一览表代码',
+                                                   `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+                                                   `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+                                                   `delete_status` bit(1) NOT NULL DEFAULT b'0' COMMENT '删除状态',
+                                                   PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '房地产抵押过程表' ROW_FORMAT = Dynamic;