Explorar el Código

试车word导入

wangming hace 7 meses
padre
commit
e0464ddd2d

+ 18 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxCommissionCheckService.java

@@ -4,7 +4,10 @@ import com.rongwei.bsentity.domain.ZhcxCommissionCheckDo;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.rongwei.bsentity.dto.CheckDetailDTO;
 import com.rongwei.bsentity.dto.CommissionCheckDTO;
+import com.rongwei.bsentity.dto.commission.ImportProjectCheckBO;
+import com.rongwei.bsentity.dto.commission.ImportProjectCheckDto;
 import com.rongwei.rwcommon.base.R;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import java.util.Map;
@@ -52,4 +55,19 @@ public interface ZhcxCommissionCheckService extends IService<ZhcxCommissionCheck
      * @return
      */
     int wordExportStandard(Map<String, Object> map, HttpServletResponse response) throws Exception;
+
+    /**
+     * 导入明细
+     *
+     * @param importDto
+     */
+    ImportProjectCheckBO importCheckDetail(ImportProjectCheckDto importDto, MultipartFile file);
+
+    /**
+     * 导入明细并保存
+     *
+     * @param importDto
+     * @param file
+     */
+    void saveImportCheckDetail(ImportProjectCheckDto importDto, MultipartFile file);
 }

+ 88 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxCommissionCheckServiceImpl.java

@@ -5,12 +5,14 @@ import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.aspose.words.*;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.rongwei.bscommon.sys.dao.ZhcxCommissionCheckBaseInfoDetailDao;
 import com.rongwei.bscommon.sys.dao.ZhcxCommissionCheckBaseInfoTreeDao;
 import com.rongwei.bscommon.sys.dao.ZhcxCommissionCheckDetailDao;
 import com.rongwei.bscommon.sys.feign.CXCommonFeginClient;
 import com.rongwei.bscommon.sys.service.*;
 import com.rongwei.bscommon.sys.utils.ExceptionUtils;
+import com.rongwei.bscommon.sys.utils.ImportCommissionHelp;
 import com.rongwei.bsentity.domain.*;
 import com.rongwei.bscommon.sys.dao.ZhcxCommissionCheckDao;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -18,10 +20,16 @@ import com.rongwei.bsentity.domain.ZhcxCommissionCheckParameterSetDetalDo;
 import com.rongwei.bsentity.domain.ZhcxCommissionCheckParameterSetDo;
 import com.rongwei.bsentity.dto.CheckDetailDTO;
 import com.rongwei.bsentity.dto.CommissionCheckDTO;
+import com.rongwei.bsentity.dto.commission.ImportProjectCheckBO;
+import com.rongwei.bsentity.dto.commission.ImportProjectCheckDto;
+import com.rongwei.bsentity.dto.commission.ParseDocBO;
 import com.rongwei.bsentity.vo.FormDataCheckVO;
 import com.rongwei.bsentity.vo.ZhcxCommissionCheckDetailStandardWordVO;
 import com.rongwei.bsentity.vo.ZhcxCommissionCheckDetailWordVO;
+import com.rongwei.rwadmincommon.system.domain.SysDictDo;
+import com.rongwei.rwadmincommon.system.service.SysDictService;
 import com.rongwei.rwcommon.base.R;
+import com.rongwei.rwcommon.base.exception.CustomException;
 import com.rongwei.rwcommon.utils.DateUtils;
 import com.rongwei.rwcommon.utils.SecurityUtil;
 import com.rongwei.rwcommon.utils.StringUtils;
@@ -34,9 +42,11 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ClassPathResource;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import com.rongwei.rwcommoncomponent.excel.aspose.ExcelExportUtil;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.PostConstruct;
 import javax.servlet.http.HttpServletResponse;
@@ -86,6 +96,9 @@ public class ZhcxCommissionCheckServiceImpl extends ServiceImpl<ZhcxCommissionCh
     @Autowired
     private ZhcxCommissionCheckDetailTreeService zhcxCommissionCheckDetailTreeService;
 
+    @Autowired
+    private ZhcxCommissionCheckDetailService zhcxCommissionCheckDetailService;
+
     @Autowired
     private ZhcxCommissionCheckBaseInfoDetailDao zhcxCommissionCheckBaseInfoDetailDao;
 
@@ -97,6 +110,9 @@ public class ZhcxCommissionCheckServiceImpl extends ServiceImpl<ZhcxCommissionCh
 
     private static CXCommonFeginClient commonFeginClient;
 
+    @Autowired
+    private SysDictService sysDictService;
+
     @PostConstruct
     public void info() {
         commonFeginClient = autoCommonFeginClient;
@@ -1352,4 +1368,76 @@ public class ZhcxCommissionCheckServiceImpl extends ServiceImpl<ZhcxCommissionCh
         }
         return 3;
     }
+
+    /**
+     * 导入明细
+     *
+     * @param importDto
+     */
+    @Transactional
+    @Override
+    public ImportProjectCheckBO importCheckDetail(ImportProjectCheckDto importDto, MultipartFile file) {
+
+        final ZhcxProjectManageDo project = zhcxProjectManageService.getById(importDto.getProjectId());
+        final Document doc = multipartFile2Doc(file);
+        List<SysDictDo> list = sysDictService.getDictsByType("test_address");
+        Map<String, SysDictDo> dictMap = new HashMap<>(list.size());
+        list.stream().forEach(item -> dictMap.put(item.getName(), item));
+
+        final ParseDocBO docBO = ParseDocBO.builder()
+                .id(importDto.getId())
+                .dictMap(dictMap)
+                .build();
+
+        //解析word文档
+        return ImportCommissionHelp.parseDoc(doc, project, docBO);
+    }
+
+    /**
+     * 导入明细并保存
+     *
+     * @param importDto
+     * @param file
+     */
+    @Transactional
+    @Override
+    public void saveImportCheckDetail(ImportProjectCheckDto importDto, MultipartFile file) {
+
+        final ZhcxCommissionCheckDo commissionCheckDo = getById(importDto.getId());
+        importDto.setProjectId(commissionCheckDo.getProjectid());
+
+        //删除树
+        final LambdaQueryWrapper<ZhcxCommissionCheckDetailTreeDo> removeTreeWrapper = Wrappers.lambdaQuery();
+        removeTreeWrapper.eq(ZhcxCommissionCheckDetailTreeDo::getBaseinfoid, commissionCheckDo.getProjectcode());
+        zhcxCommissionCheckDetailTreeService.remove(removeTreeWrapper);
+
+        //删除明细
+        final LambdaQueryWrapper<ZhcxCommissionCheckDetailDo> removeDetailWrapper = Wrappers.lambdaQuery();
+        removeTreeWrapper.eq(ZhcxCommissionCheckDetailTreeDo::getPid, importDto.getId());
+        zhcxCommissionCheckDetailService.remove(removeDetailWrapper);
+
+        final ImportProjectCheckBO importCheckDetail = importCheckDetail(importDto, file);
+
+        if(ObjectUtil.isNotEmpty(importCheckDetail.getTreeList())) {
+            zhcxCommissionCheckDetailTreeService.saveBatch(importCheckDetail.getTreeList());
+        }
+
+        if(ObjectUtil.isNotEmpty(importCheckDetail.getDetailList())) {
+            zhcxCommissionCheckDetailService.saveBatch(importCheckDetail.getDetailList());
+        }
+    }
+
+    /**
+     * 上传文件转换成
+     *
+     * @param file
+     * @return
+     */
+    private Document multipartFile2Doc(MultipartFile file) {
+        try {
+            return new Document(file.getInputStream());
+        } catch (Exception e) {
+            throw new CustomException("文件获取失败");
+        }
+    }
 }

+ 225 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/utils/ImportCommissionHelp.java

@@ -0,0 +1,225 @@
+package com.rongwei.bscommon.sys.utils;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.aspose.words.*;
+import com.rongwei.bsentity.domain.ZhcxCommissionCheckDetailDo;
+import com.rongwei.bsentity.domain.ZhcxCommissionCheckDetailTreeDo;
+import com.rongwei.bsentity.domain.ZhcxProjectManageDo;
+import com.rongwei.bsentity.dto.commission.ImportProjectCheckBO;
+import com.rongwei.bsentity.dto.commission.ParseDocBO;
+import com.rongwei.rwcommon.utils.SecurityUtil;
+
+import java.util.*;
+import java.util.List;
+
+public class ImportCommissionHelp {
+
+    /**
+     * 解析word
+     *
+     * @param doc
+     * @param project
+     * @return
+     */
+    public static ImportProjectCheckBO parseDoc(Document doc, ZhcxProjectManageDo project, ParseDocBO importDto) {
+        List<ZhcxCommissionCheckDetailDo> detailList = new ArrayList<>();
+        //树的一维结构
+        List<ZhcxCommissionCheckDetailTreeDo> treeList = new ArrayList<>();
+        Map<String, ZhcxCommissionCheckDetailTreeDo> treeMap = new HashMap<>();
+
+        for (Section section : doc.getSections()) {
+            // 遍历节的主体
+            Body body = section.getBody();
+
+            final NodeCollection childNodes = body.getChildNodes();
+            for(int m = 0, n = childNodes.getCount(); m < n; m++) {
+                Node node = childNodes.get(m);
+
+                if(node.getNodeType() == 5) { //表格
+                    Table table = (Table) node;
+                    //table转换成json结构
+                    final List<JSONObject> treeDetailList = ImportCommissionHelp.table2Json(table);
+                    final ZhcxCommissionCheckDetailTreeDo treeDo = treeList.get(treeList.size() - 1);
+                    for(JSONObject rowJson : treeDetailList) {
+                        ZhcxCommissionCheckDetailDo detail = new ZhcxCommissionCheckDetailDo();
+                        detail.setId(SecurityUtil.getUUID());
+                        detail.setDeleted("0");
+                        detail.setPid(importDto.getId());
+                        detail.setChapterno(rowJson.getString("NO."));
+                        detail.setClassification(rowJson.getString("模式1"));
+                        detail.setClassificationtwo(rowJson.getString("模式2"));
+                        detail.setChtestcontent(rowJson.getString("测试内容中文"));
+                        detail.setEntestcontent(rowJson.getString("测试内容英文"));
+                        detail.setTestmethod(rowJson.getString("标准测试方法"));
+                        String testAddress = rowJson.getString("测试地点");
+                        if(ObjectUtil.isEmpty(testAddress) || ObjectUtil.isEmpty(importDto.getDictMap().get(testAddress))) {
+                            testAddress = "10";
+                        } else {
+                            testAddress = importDto.getDictMap().get(testAddress).getValue();
+                        }
+                        detail.setTestaddress(testAddress);
+                        if(ObjectUtil.isNotEmpty(treeDo.getFullpid())) {
+                            detail.setTreefullid(treeDo.getFullpid().concat(",").concat(treeDo.getId()));
+                        } else {
+                            detail.setTreefullid(",".concat(treeDo.getId()));
+                        }
+
+                        if(treeDo.getLevel() == 1) {
+                            detail.setOnelevelclassification(treeDo.getId());
+                        } else if(treeDo.getLevel() == 2) {
+                            String[] fullpids = treeDo.getFullpid().split(",");
+                            detail.setOnelevelclassification(fullpids[1]);
+                            detail.setSecondlevelclassification(treeDo.getId());
+                        } else if(treeDo.getLevel() == 3) {
+                            String[] fullpids = treeDo.getFullpid().split(",");
+                            detail.setOnelevelclassification(fullpids[1]);
+                            detail.setSecondlevelclassification(fullpids[2]);
+                            detail.setThreelevelclassification(treeDo.getId());
+                        } else if(treeDo.getLevel() == 4) {
+                            String[] fullpids = treeDo.getFullpid().split(",");
+                            detail.setOnelevelclassification(fullpids[1]);
+                            detail.setSecondlevelclassification(fullpids[2]);
+                            detail.setThreelevelclassification(fullpids[3]);
+                            detail.setFouronelevelclassification(treeDo.getId());
+                        }
+
+                        detailList.add(detail);
+                    }
+
+                } else if(node.getNodeType() == 8) { //段落
+                    Paragraph paragraph = (Paragraph) node;
+                    if(!paragraph.getParagraphFormat().isHeading()) { //标题
+                        continue;
+                    }
+
+                    //树结构中添加元素
+                    final ZhcxCommissionCheckDetailTreeDo detailTree = ImportCommissionHelp.getDetailTree(paragraph, project, treeList);
+                    treeList.add(detailTree);
+                    treeMap.put(detailTree.getId(), detailTree);
+                }
+            }
+        }
+
+        return ImportProjectCheckBO.builder()
+                .detailList(detailList)
+                .treeList(treeList)
+                .build();
+    }
+
+    /**
+     * 设置树结构
+     *
+     * @param paragraph
+     * @param project
+     * @param treeList
+     */
+    public static ZhcxCommissionCheckDetailTreeDo getDetailTree(Paragraph paragraph, ZhcxProjectManageDo project, List<ZhcxCommissionCheckDetailTreeDo> treeList) {
+        //当前标题等级
+        int currentLevelNumber = paragraph.getListFormat().getListLevelNumber();
+        String cellVal = getNodeText(paragraph);
+
+        ZhcxCommissionCheckDetailTreeDo treeDo = new ZhcxCommissionCheckDetailTreeDo();
+        treeDo.setId(SecurityUtil.getUUID());
+        treeDo.setDeleted("0");
+        treeDo.setName(cellVal);
+        treeDo.setBaseinfoid(project.getProjectCode());
+        treeDo.setLevel(currentLevelNumber + 1);
+
+        if(currentLevelNumber == 0) { //第一层节点
+            treeDo.setPid("-1");
+        } else {
+            final ZhcxCommissionCheckDetailTreeDo parentTree = ImportCommissionHelp.getParentTree(treeList, currentLevelNumber + 1);
+            final String fullpid = parentTree.getFullpid();
+            StringBuilder fullPidSb = new StringBuilder();
+            if(ObjectUtil.isNotEmpty(fullpid)) {
+                fullPidSb.append(parentTree.getFullpid());
+            }
+            fullPidSb.append(",");
+            fullPidSb.append(parentTree.getId());
+
+            treeDo.setFullpid(fullPidSb.toString());
+            treeDo.setPid(parentTree.getId());
+        }
+
+        return treeDo;
+    }
+
+    /**
+     * aspose转json列表
+     *
+     * @param table
+     * @return
+     */
+    public static List<JSONObject> table2Json(Table table) {
+
+        if(ObjectUtil.isEmpty(table)) {
+            return Collections.emptyList();
+        }
+
+        List<JSONObject> treeDetailList = new ArrayList<>();
+        List<String> titleList = new ArrayList<>();
+        int rowIdx = -1; //行数
+        for (Row row : table) {
+            rowIdx++;
+            // 遍历行的每个单元格
+            int colIdx = -1; //列数
+            JSONObject rowValueObj = new JSONObject();
+            for (Cell cell : row) {
+                colIdx++;
+                String cellVal = getNodeText(cell);
+                if(rowIdx == 0) {//标题行
+                    titleList.add(cellVal);
+                } else {
+                    rowValueObj.put(titleList.get(colIdx), cellVal);
+                }
+            }
+            if(rowIdx == 0) {
+                continue;
+            }
+            treeDetailList.add(rowValueObj);
+        }
+
+        return treeDetailList;
+    }
+
+
+    /**
+     * 由于导入是一级一级加入,父级目录有可能是上一个元素或者上上个元素,需要循环往前找
+     *
+     * @param treeList
+     * @param level
+     * @return
+     */
+    public static ZhcxCommissionCheckDetailTreeDo getParentTree(List<ZhcxCommissionCheckDetailTreeDo> treeList, int level) {
+        int treeSize  = treeList.size();
+        ZhcxCommissionCheckDetailTreeDo treeDo;
+        while (true) {
+            treeDo = treeList.get(treeSize - 1);
+            if(ObjectUtil.isNull(treeDo)) {//找不到前面一个元素,结束循环
+                break;
+            }
+            if(treeDo.getLevel() < level) {
+                break;
+            }
+            treeSize--;
+        }
+        return treeDo;
+    }
+
+    /**
+     * 获取文本
+     *
+     * @param node
+     * @return
+     */
+    public static String getNodeText(Node node) {
+        final String text = node.getText();
+        if(ObjectUtil.isEmpty(text)) {
+            return null;
+        }
+
+        return StrUtil.trim(text.replace("\u0007", ""));
+    }
+}

+ 20 - 0
business-entity/src/main/java/com/rongwei/bsentity/dto/commission/ImportProjectCheckBO.java

@@ -0,0 +1,20 @@
+package com.rongwei.bsentity.dto.commission;
+
+import com.rongwei.bsentity.domain.ZhcxCommissionCheckDetailDo;
+import com.rongwei.bsentity.domain.ZhcxCommissionCheckDetailTreeDo;
+import lombok.*;
+
+import java.util.List;
+
+@Setter
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class ImportProjectCheckBO {
+
+    //左侧树
+    private List<ZhcxCommissionCheckDetailTreeDo> treeList;
+    //右侧列表
+    private List<ZhcxCommissionCheckDetailDo> detailList;
+}

+ 21 - 0
business-entity/src/main/java/com/rongwei/bsentity/dto/commission/ImportProjectCheckDto.java

@@ -0,0 +1,21 @@
+package com.rongwei.bsentity.dto.commission;
+
+import lombok.*;
+
+@Setter
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class ImportProjectCheckDto {
+
+    /**
+     * 检查id
+     */
+    private String id;
+
+    /**
+     * 项目id
+     */
+    private String projectId;
+}

+ 18 - 0
business-entity/src/main/java/com/rongwei/bsentity/dto/commission/ParseDocBO.java

@@ -0,0 +1,18 @@
+package com.rongwei.bsentity.dto.commission;
+
+import com.rongwei.rwadmincommon.system.domain.SysDictDo;
+import lombok.*;
+
+import java.util.Map;
+
+@Setter
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class ParseDocBO {
+
+    private String id;
+
+    private Map<String, SysDictDo> dictMap;
+}

+ 9 - 0
business-server/src/main/java/com/rongwei/bsserver/controller/ZhcxCommissionCheckController.java

@@ -4,12 +4,14 @@ package com.rongwei.bsserver.controller;
 import com.rongwei.bscommon.sys.service.ZhcxCommissionCheckService;
 import com.rongwei.bsentity.dto.CheckDetailDTO;
 import com.rongwei.bsentity.dto.CommissionCheckDTO;
+import com.rongwei.bsentity.dto.commission.ImportProjectCheckDto;
 import com.rongwei.rwcommon.base.R;
 import com.rongwei.rwcommon.base.exception.CustomException;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import java.util.Map;
@@ -91,5 +93,12 @@ public class ZhcxCommissionCheckController {
             }
         }
     }
+
+    @PostMapping("wordImport")
+    @ApiOperation("试车word导入")
+    public R wordImport(ImportProjectCheckDto importDto, MultipartFile file) {
+        commissionCheckService.saveImportCheckDetail(importDto, file);
+        return R.ok();
+    }
 }