Ver Fonte

Merge remote-tracking branch 'origin/master'

xiexiang há 1 ano atrás
pai
commit
5cace63253

+ 11 - 0
src/main/java/cn/cslg/pas/common/dto/MergePersonQueryDTO.java

@@ -1,5 +1,6 @@
 package cn.cslg.pas.common.dto;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.util.Date;
@@ -10,16 +11,26 @@ public class MergePersonQueryDTO {
 
     private Integer id;
 
+    private Integer projectId;
+
+    private Integer type;
+
     private String name;
 
     private String abbreviation;
 
+    private String province;
+
     private String country;
 
     private String address;
 
     private String remark;
 
+    @JsonFormat(
+            pattern = "yyyy-MM-dd",
+            timezone = "GMT+8"
+    )
     private Date createTime;
 
     private List<String> mergedName;

+ 3 - 0
src/main/java/cn/cslg/pas/common/dto/PatentColumnDTO.java

@@ -372,4 +372,7 @@ public class PatentColumnDTO {
      * 法律事件
      */
     private List<LegalEvent> legalEvents;
+
+    //外部专利的原始申请号
+    private String rowApplicationNo;
 }

+ 11 - 0
src/main/java/cn/cslg/pas/common/dto/QueryExternalFamilyDTO.java

@@ -0,0 +1,11 @@
+package cn.cslg.pas.common.dto;
+
+import lombok.Data;
+
+@Data
+public class QueryExternalFamilyDTO {
+
+    private String familyinfo;
+
+    private String familycount;
+}

+ 13 - 0
src/main/java/cn/cslg/pas/common/vo/QueryExternalFamilyVO.java

@@ -0,0 +1,13 @@
+package cn.cslg.pas.common.vo;
+
+import lombok.Data;
+
+@Data
+public class QueryExternalFamilyVO {
+
+    private String patentNo;
+
+    private Integer pageNum;
+
+    private Integer pageSize;
+}

+ 1 - 1
src/main/java/cn/cslg/pas/common/vo/business/MergePersonIdVO.java

@@ -3,7 +3,7 @@ package cn.cslg.pas.common.vo.business;
 import lombok.Data;
 
 @Data
-public class MergePersonIdVO {
+public class   MergePersonIdVO {
 
     private Integer id;
 

+ 17 - 0
src/main/java/cn/cslg/pas/common/vo/business/MergedNameVO.java

@@ -0,0 +1,17 @@
+package cn.cslg.pas.common.vo.business;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class MergedNameVO {
+
+    private String name;
+
+    private Integer projectId;
+
+    private String delName;
+
+    private Integer type;
+}

+ 15 - 7
src/main/java/cn/cslg/pas/controller/PatentController.java

@@ -1,25 +1,21 @@
 package cn.cslg.pas.controller;
 
 import cn.cslg.pas.common.core.base.Constants;
-import cn.cslg.pas.common.dto.GetAllPersonDTO;
+import cn.cslg.pas.common.dto.MergePersonQueryDTO;
 import cn.cslg.pas.common.dto.PatentColumnDTO;
-import cn.cslg.pas.common.dto.PatentDetailDTO;
 import cn.cslg.pas.common.dto.PatentExport.PatentExportParams;
 import cn.cslg.pas.common.dto.PatentExport.TaskParams;
 import cn.cslg.pas.common.dto.PatentKinDTO;
 import cn.cslg.pas.common.dto.business.EsCountDTO;
 import cn.cslg.pas.common.dto.business.SelectClaimDTO;
 import cn.cslg.pas.common.model.cronModel.Records;
-import cn.cslg.pas.common.model.request.QueryRequest;
 import cn.cslg.pas.common.model.request.StringRequest;
 import cn.cslg.pas.common.utils.*;
 import cn.cslg.pas.common.utils.Response;
 import cn.cslg.pas.common.vo.business.*;
-import cn.cslg.pas.common.vo.PatentPageMessageVO;
 import cn.cslg.pas.common.vo.PatentWithIdVO;
 import cn.cslg.pas.common.vo.StarPatentVO;
 import cn.cslg.pas.common.vo.business.EsAllCountVO;
-import cn.cslg.pas.common.vo.business.EsCountVO;
 import cn.cslg.pas.common.vo.business.PatentKinVO;
 import cn.cslg.pas.common.vo.business.PatentNoVO;
 import cn.cslg.pas.common.vo.es.EsCustomFieldBatchVO;
@@ -38,7 +34,6 @@ import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.InputStreamResource;
 import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
@@ -47,7 +42,6 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
-import java.util.Collections;
 import java.util.List;
 
 @RequestMapping(Constants.API_XiaoSHI + "/patent")
@@ -166,6 +160,13 @@ public class PatentController {
         return Response.success(records);
     }
 
+    @Operation(summary = "合并人员详情")
+    @PostMapping("/selectMergePersonDetail")
+    public Response selectMergePersonDetail(@RequestBody MergePersonIdVO vo) {
+        MergePersonQueryDTO dto = mergePersonService.selectMergePersonDetail(vo);
+        return Response.success(dto);
+    }
+
     @Operation(summary = "获取所有发明人/权利人/申请人")
     @PostMapping("/getMergePerson")
     public Response getMergePerson(@RequestBody GetAllPersonVO vo) throws Exception {
@@ -173,6 +174,13 @@ public class PatentController {
         return Response.success(records);
     }
 
+    @Operation(summary = "发明人/权利人/申请人合并后的名称移除")
+    @PostMapping("/delMergedName")
+    public Response delMergedName(@RequestBody MergedNameVO vo) throws Exception {
+        Integer id = mergePersonService.delMergedName(vo);
+        return Response.success(id);
+    }
+
     @Operation(summary = "发明人/权利人/申请人合并记录删除")
     @PostMapping("/delMergePerson")
     public Response delMergePerson(@RequestBody MergePersonIdVO vo) throws Exception {

+ 21 - 4
src/main/java/cn/cslg/pas/controller/outApi/PatentStarController.java

@@ -6,7 +6,9 @@ import cn.cslg.pas.common.dto.PatentStarListDTO;
 import cn.cslg.pas.common.dto.business.SelectClaimDTO;
 import cn.cslg.pas.common.model.cronModel.Records;
 import cn.cslg.pas.common.utils.Response;
+import cn.cslg.pas.common.vo.QueryExternalFamilyVO;
 import cn.cslg.pas.common.vo.business.PatentNoVO;
+import cn.cslg.pas.domain.es.Text;
 import cn.cslg.pas.service.common.PatentStarApiService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -16,6 +18,7 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
+import java.util.List;
 import java.util.Map;
 
 @Tag(name = "专利之星接口服务类")
@@ -95,16 +98,30 @@ public class PatentStarController {
     }
 
     @Operation(summary = "根据专利号查询外部权利要求")
-    @GetMapping("/queryExternalClaim")
-    public Response queryExternalClaim(String patentNo) throws Exception {
-        SelectClaimDTO dto = patentStarApiService.selectClaim(patentNo);
+    @PostMapping("/queryExternalClaim")
+    public Response queryExternalClaim(@RequestBody QueryExternalFamilyVO vo) throws Exception {
+        SelectClaimDTO dto = patentStarApiService.selectClaim(vo);
         return Response.success(dto);
     }
 
     @Operation(summary = "查询外部专利详情")
     @PostMapping("/queryExternalDetail")
-    public Response queryExternalDetail(@RequestBody PatentNoVO vo) throws Exception {
+    public Response queryExternalDetail(@RequestBody QueryExternalFamilyVO vo) throws Exception {
         PatentColumnDTO dto = patentStarApiService.queryExternalDetail(vo);
         return Response.success(dto);
     }
+
+    @Operation(summary = "查询外部专利同族专利")
+    @PostMapping("/queryExternalFamily")
+    public Response queryExternalFamily(@RequestBody QueryExternalFamilyVO vo) throws IOException {
+        Records records = patentStarApiService.queryExternalFamily(vo);
+        return Response.success(records);
+    }
+
+    @GetMapping("/getCnFullText")
+    @Operation(summary = "获得中国专利说明书全文文本")
+    public Response getCnFullText(String appNo) throws IOException {
+        List<Text> fullText = patentStarApiService.getCnFullText(appNo);
+        return Response.success(fullText);
+    }
 }

+ 131 - 21
src/main/java/cn/cslg/pas/service/business/MergePersonService.java

@@ -11,10 +11,7 @@ import cn.cslg.pas.common.utils.LoginUtils;
 import cn.cslg.pas.common.utils.parseQueryToTree.expressManager;
 import cn.cslg.pas.common.utils.parseQueryToTree.operateNode;
 import cn.cslg.pas.common.utils.parseQueryToTree.treeNode;
-import cn.cslg.pas.common.vo.business.GetAllPersonVO;
-import cn.cslg.pas.common.vo.business.MergePersonIdVO;
-import cn.cslg.pas.common.vo.business.MergePersonQueryVO;
-import cn.cslg.pas.common.vo.business.MergePersonVO;
+import cn.cslg.pas.common.vo.business.*;
 import cn.cslg.pas.domain.BaseEntity;
 import cn.cslg.pas.domain.business.FollowUp;
 import cn.cslg.pas.domain.business.MergePerson;
@@ -81,7 +78,7 @@ public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePers
     private EsService esService;
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
-    public Integer mergePerson(MergePersonVO vo) throws IOException {
+    public Integer mergePerson(MergePersonVO vo) throws Exception {
         Integer type = vo.getType();
         List<String> mergedNames = vo.getMergedName();
         //获取登陆人信息 用于设置创建人
@@ -91,6 +88,15 @@ public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePers
         } catch (Exception e) {
             throw new UnLoginException("未登录");
         }
+        //判断是否名称重复
+        LambdaQueryWrapper<MergePerson> wrapper = new LambdaQueryWrapper<MergePerson>()
+                .eq(MergePerson::getProjectId, vo.getProjectId())
+                .eq(MergePerson::getName, vo.getName());
+        List<MergePerson> list = mergePersonMapper.selectList(wrapper);
+        if (list.size() > 1) {
+            throw new Exception("合并名称不可重复");
+        }
+
         MergePerson person = new MergePerson();
         BeanUtils.copyProperties(vo, person);
         person.setMergedName(JSONArray.toJSONString(mergedNames));
@@ -105,13 +111,16 @@ public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePers
         List<Query> queries = new ArrayList<>();
         if (type == 0) {
             for (String mergedName : mergedNames) {
-                Query q = QueryBuilders.term(i -> i.field("applicant.name").value(mergedName));
-                Query query = QueryBuilders.nested(i -> i.path("applicant").query(q));
-                queries.add(query);
+                Query q1 = QueryBuilders.term(i -> i.field("applicant.name.key").value(mergedName));
+                Query query1 = QueryBuilders.nested(i -> i.path("applicant").query(q1));
+                Query q2 = QueryBuilders.term(i -> i.field("right_holder.name.key").value(mergedName));
+                Query query2 = QueryBuilders.nested(i -> i.path("right_holder").query(q2));
+                queries.add(query1);
+                queries.add(query2);
             }
         } else {
             for (String mergedName : mergedNames) {
-                Query q = QueryBuilders.term(i -> i.field("inventor.name").value(mergedName));
+                Query q = QueryBuilders.term(i -> i.field("inventor.name.key").value(mergedName));
                 Query query = QueryBuilders.nested(i -> i.path("inventor").query(q));
                 queries.add(query);
             }
@@ -138,7 +147,6 @@ public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePers
             for (String id : map.keySet()) {
                 Patent patent = map.get(id);
                 List<PatentMergePerson> mergeApplicants = patent.getMergeApplicant();
-                List<String> Names = mergeApplicants.stream().map(PatentMergePerson::getName).collect(Collectors.toList());
                 mergePersonList.addAll(mergeApplicants);
                 patent.setMergeApplicant(mergePersonList);
                 patent.setMergeRightHolder(mergePersonList);
@@ -149,7 +157,7 @@ public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePers
     }
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
-    public Integer updateMergePerson(MergePersonVO vo) throws IOException {
+    public Integer updateMergePerson(MergePersonVO vo) throws Exception {
         //获取登陆人信息 用于设置创建人
         PersonnelVO personnelVO = new PersonnelVO();
         Integer type = vo.getType();
@@ -158,9 +166,19 @@ public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePers
         } catch (Exception e) {
             throw new UnLoginException("未登录");
         }
+        //判断是否名称重复
+        LambdaQueryWrapper<MergePerson> wrapper = new LambdaQueryWrapper<MergePerson>()
+                .eq(MergePerson::getProjectId, vo.getProjectId())
+                .eq(MergePerson::getName, vo.getName());
+        List<MergePerson> list = mergePersonMapper.selectList(wrapper);
+        if (list.size() > 1) {
+            throw new Exception("合并名称不可重复");
+        }
+        //获取老专利
         MergePerson person = this.getById(vo.getId());
         String mergedName = person.getMergedName();
         String name = person.getName();
+
         if (ObjectUtil.isNotEmpty(person)) {
             BeanUtils.copyProperties(vo, person);
             person.setMergedName(JSONArray.toJSONString(vo.getMergedName()));
@@ -176,13 +194,16 @@ public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePers
             List<Query> queries = new ArrayList<>();
             if (type == 0) {
                 for (String merged : mergedNames) {
-                    Query q = QueryBuilders.term(i -> i.field("applicant.name").value(merged));
-                    Query query = QueryBuilders.nested(i -> i.path("applicant").query(q));
-                    queries.add(query);
+                    Query q1 = QueryBuilders.term(i -> i.field("applicant.name.key").value(merged));
+                    Query query1 = QueryBuilders.nested(i -> i.path("applicant").query(q1));
+                    Query q2 = QueryBuilders.term(i -> i.field("right_holder.name.key").value(merged));
+                    Query query2 = QueryBuilders.nested(i -> i.path("right_holder").query(q2));
+                    queries.add(query1);
+                    queries.add(query2);
                 }
             } else {
                 for (String merged : mergedNames) {
-                    Query q = QueryBuilders.term(i -> i.field("inventor.name").value(merged));
+                    Query q = QueryBuilders.term(i -> i.field("inventor.name.key").value(merged));
                     Query query = QueryBuilders.nested(i -> i.path("inventor").query(q));
                     queries.add(query);
                 }
@@ -231,9 +252,12 @@ public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePers
         for (MergePerson person : record.getRecords()) {
             MergePersonQueryDTO dto = new MergePersonQueryDTO();
             dto.setId(person.getId());
+            dto.setProjectId(person.getProjectId());
+            dto.setType(person.getType());
             dto.setName(person.getName());
             dto.setAddress(person.getAddress());
             dto.setCountry(person.getCountry());
+            dto.setProvince(person.getProvince());
             dto.setRemark(person.getRemark());
             dto.setAbbreviation(person.getAbbreviation());
             dto.setCreateTime(person.getCreateTime());
@@ -249,6 +273,17 @@ public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePers
         return records;
     }
 
+    public MergePersonQueryDTO selectMergePersonDetail(MergePersonIdVO vo) {
+        MergePersonQueryDTO dto = new MergePersonQueryDTO();
+        MergePerson person = mergePersonMapper.selectById(vo.getId());
+        if (ObjectUtil.isNotEmpty(person)) {
+            BeanUtils.copyProperties(person, dto);
+            List<String> names = JSONArray.parseArray(person.getMergedName(), String.class);
+            dto.setMergedName(names);
+        }
+        return dto;
+    }
+
     public Records getMergePerson(GetAllPersonVO vo) throws Exception {
         Integer projectId = vo.getProjectId();
         Integer taskId = vo.getTaskId();
@@ -258,7 +293,7 @@ public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePers
         String searchCondition = "";
         if (type == 0 && StringUtils.isNotEmpty(vo.getName())) {
             searchCondition = searchCondition + "PA = " + vo.getName();
-        } else if (type == 2 && StringUtils.isNotEmpty(vo.getName())){
+        } else if (type == 2 && StringUtils.isNotEmpty(vo.getName())) {
             searchCondition = searchCondition + "IN = " + vo.getName();
         }
         if (taskId != null) {
@@ -369,21 +404,96 @@ public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePers
         return records;
     }
 
+
+    public Integer delMergedName(MergedNameVO vo) throws IOException {
+        Integer type = vo.getType();
+        String delName = vo.getDelName();
+        String name = vo.getName();
+        Integer projectId = vo.getProjectId();
+        MergePerson mergePerson = mergePersonMapper.selectOne(new LambdaQueryWrapper<MergePerson>()
+                .eq(MergePerson::getMergedName, name)
+                .eq(MergePerson::getProjectId, projectId));
+        if (ObjectUtil.isNotEmpty(mergePerson)) {
+            Integer personId = mergePerson.getId();
+            String mergedName = mergePerson.getMergedName();
+            List<String> list = JSONArray.parseArray(mergedName, String.class);
+            list.remove(delName);
+            MergePerson person = mergePersonMapper.selectById(personId);
+            person.setMergedName(JSONArray.toJSONString(list));
+            person.updateById();
+
+            SearchRequest.Builder builder = new SearchRequest.Builder();
+            //设置查询索引
+            builder.index("patent");
+            List<Query> queries = new ArrayList<>();
+            List<Query> mustQueries = new ArrayList<>();
+            if (type == 0) {
+                Query q1 = QueryBuilders.term(i -> i.field("applicant.name.key").value(delName));
+                Query query1 = QueryBuilders.nested(i -> i.path("applicant").query(q1));
+                Query q2 = QueryBuilders.term(i -> i.field("right_holder.name.key").value(delName));
+                Query query2 = QueryBuilders.nested(i -> i.path("right_holder").query(q2));
+                queries.add(query1);
+                queries.add(query2);
+                Query q3 = QueryBuilders.term(i -> i.field("merge_applicant.name.raw").value(name));
+                Query query3 = QueryBuilders.nested(i -> i.path("merge_applicant").query(q3));
+                Query q4 = QueryBuilders.term(i -> i.field("merge_right_holder.name.raw").value(name));
+                Query query4 = QueryBuilders.nested(i -> i.path("merge_right_holder").query(q4));
+                mustQueries.add(query3);
+                mustQueries.add(query4);
+            } else {
+                Query q = QueryBuilders.term(i -> i.field("inventor.name.key").value(delName));
+                Query query = QueryBuilders.nested(i -> i.path("inventor").query(q));
+                queries.add(query);
+                Query q1 = QueryBuilders.term(i -> i.field("merge_inventor.name.raw").value(name));
+                Query query1 = QueryBuilders.nested(i -> i.path("merge_inventor").query(q1));
+                queries.add(query1);
+            }
+            Query query = QueryBuilders.bool(i -> i.must(mustQueries).should(queries));
+            builder.query(query);
+            SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+            List<Hit<Patent>> hits = response.hits().hits();
+            Map<String, Patent> map = new HashMap<>();
+            for (Hit<Patent> hit : hits) {
+                String id = hit.id();
+                map.put(id, hit.source());
+            }
+
+            if (!CollectionUtils.isEmpty(map)) {
+                for (String id : map.keySet()) {
+                    Patent patent = map.get(id);
+                    esService.delMergePerson(patent, id, type, mergePerson.getName());
+                }
+            }
+        }
+        return mergePerson.getId();
+    }
+
     public Integer delMergePerson(MergePersonIdVO vo) throws IOException {
         Integer type = vo.getType();
         MergePerson mergePerson = mergePersonMapper.selectById(vo.getId());
+        String name = mergePerson.getName();
         if (ObjectUtil.isNotEmpty(mergePerson)) {
             LambdaQueryWrapper<MergePerson> wrapper = new LambdaQueryWrapper<MergePerson>()
                     .eq(BaseEntity::getId, vo.getId());
             this.remove(wrapper);
 
-            //todo 删掉相关合并的名称
             SearchRequest.Builder builder = new SearchRequest.Builder();
             //设置查询索引
             builder.index("patent");
-
-            Query q = QueryBuilders.term(i -> i.field("merge_applicant.name").value(mergePerson.getName()));
-            Query query = QueryBuilders.nested(i -> i.path("merge_applicant").query(q));
+            List<Query> queries = new ArrayList<>();
+            if (type == 0) {
+                Query q1 = QueryBuilders.term(i -> i.field("merge_applicant.name.raw").value(name));
+                Query query1 = QueryBuilders.nested(i -> i.path("merge_applicant").query(q1));
+                Query q2 = QueryBuilders.term(i -> i.field("merge_right_holder.name.raw").value(name));
+                Query query2 = QueryBuilders.nested(i -> i.path("merge_right_holder").query(q2));
+                queries.add(query1);
+                queries.add(query2);
+            } else {
+                Query q = QueryBuilders.term(i -> i.field("merge_inventor.name.raw").value(name));
+                Query query3 = QueryBuilders.nested(i -> i.path("merge_inventor").query(q));
+                queries.add(query3);
+            }
+            Query query = QueryBuilders.bool(i -> i.must(queries));
             builder.query(query);
             SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
             List<Hit<Patent>> hits = response.hits().hits();
@@ -396,7 +506,7 @@ public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePers
             if (!CollectionUtils.isEmpty(map)) {
                 for (String id : map.keySet()) {
                     Patent patent = map.get(id);
-                    esService.delMergePerson(patent, id, type,mergePerson.getName());
+                    esService.delMergePerson(patent, id, type, mergePerson.getName());
                 }
             }
         }

+ 117 - 5
src/main/java/cn/cslg/pas/service/common/PatentStarApiService.java

@@ -2,15 +2,18 @@ package cn.cslg.pas.service.common;
 
 import cn.cslg.pas.common.config.XDns;
 
+import cn.cslg.pas.common.core.IgnoreDTDEntityResolver;
 import cn.cslg.pas.common.dto.PatentColumnDTO;
 import cn.cslg.pas.common.dto.PatentStarDTO;
 import cn.cslg.pas.common.dto.PatentStarListDTO;
+import cn.cslg.pas.common.dto.QueryExternalFamilyDTO;
 import cn.cslg.pas.common.dto.business.SelectClaimDTO;
 import cn.cslg.pas.common.model.cronModel.PersonnelVO;
 import cn.cslg.pas.common.model.cronModel.Records;
 import cn.cslg.pas.common.model.importTaskModel.PatentApplicant;
 import cn.cslg.pas.common.utils.*;
 import cn.cslg.pas.common.vo.ContentVO;
+import cn.cslg.pas.common.vo.QueryExternalFamilyVO;
 import cn.cslg.pas.common.vo.StarPatentVO;
 import cn.cslg.pas.common.vo.business.PatentNoVO;
 import cn.cslg.pas.domain.WebLoginConfig;
@@ -32,6 +35,11 @@ import okhttp3.FormBody;
 import okhttp3.OkHttpClient;
 import okhttp3.Request;
 import okhttp3.Response;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.XPath;
+import org.dom4j.io.SAXReader;
 import org.joda.time.DateTime;
 import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
@@ -42,6 +50,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
 import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
@@ -492,6 +502,40 @@ public class PatentStarApiService {
         return "{}";
     }
 
+    //获取说明书文本
+    public String getFullText(String str) throws DocumentException {
+        SAXReader reader = new SAXReader();
+        reader.setEntityResolver(new IgnoreDTDEntityResolver());
+        Reader stringReader = new StringReader(str);
+        Document document = reader.read(stringReader);
+        XPath xpath = document.createXPath("//description//p");
+        List<Element> elements = (List<Element>) xpath.selectNodes(document);
+        if (elements.size() == 0) {
+            xpath = document.createXPath("//business:Description//base:Paragraphs");
+            elements = (List<Element>) xpath.selectNodes(document);
+        }
+        List<String> reStrs = new ArrayList<>();
+        Integer count = 1;
+        for (Element item : elements) {
+            String claim = item.getText().replaceAll("<br/>", "");
+            if (!claim.trim().equals("技术领域")
+                    && !claim.trim().equals("发明内容")
+                    && !claim.trim().equals("附图说明")
+                    && !claim.trim().equals("具体实施方式")
+                    && !claim.trim().equals("背景技术")) {
+                String formattedNum = String.format("%04d", count);
+                claim = "[" + formattedNum + "]" + claim;
+                count++;
+            }
+            reStrs.add(claim);
+        }
+        String reStr = "";
+        if (reStrs.size() != 0) {
+            reStr = StringUtils.join(reStrs, "\r\n");
+        }
+        return reStr;
+    }
+
     /**
      * @param patentNo
      * @return
@@ -805,7 +849,6 @@ public class PatentStarApiService {
                         patentColumnDTO.setPatentNo(patentColumnDTO.getAppNo());
                     }
                 }
-
             }
 
             //装载申请日
@@ -832,6 +875,12 @@ public class PatentStarApiService {
             //获取摘要附图
             String pictureApi = this.getPictureApi(item.getRowApplicationNo());
             patentColumnDTO.setPictureGuid(pictureApi);
+            //获取外部专利原始申请号
+            patentColumnDTO.setRowApplicationNo(item.getRowApplicationNo());
+            //获取法律状态
+            String cnLegalApi = this.getCnLegalApi(item.getRowApplicationNo());
+            patentColumnDTO.setLegalStatus(Arrays.asList(cnLegalApi));
+            //获取被引用次数
             //装载公开日
             if (item.getPublicDate() != null && !item.getPublicDate().trim().equals("")) {
                 patentColumnDTO.setPublicDate(DateUtils.strToDate(item.getPublicDate()));
@@ -875,13 +924,13 @@ public class PatentStarApiService {
 
     /**
      * 根据专利号查询外部权利要求
-     * @param patentNo
+     * @param vo
      * @return
      * @throws IOException
      */
-    public SelectClaimDTO selectClaim(String patentNo) throws IOException {
+    public SelectClaimDTO selectClaim(QueryExternalFamilyVO vo) throws IOException {
         PatentStarListDTO patentStarListDTO = new PatentStarListDTO();
-        String condition = "AN=" + patentNo;
+        String condition = "AN=" + vo.getPatentNo();
         patentStarListDTO.setCurrentQuery(condition);
         patentStarListDTO.setDBType("CN");
         patentStarListDTO.setOrderBy("AD");
@@ -907,7 +956,7 @@ public class PatentStarApiService {
      * @return
      * @throws IOException
      */
-    public PatentColumnDTO queryExternalDetail(PatentNoVO vo) throws IOException {
+    public PatentColumnDTO queryExternalDetail(QueryExternalFamilyVO vo) throws IOException {
         PatentStarListDTO patentStarListDTO = new PatentStarListDTO();
         String condition = "AN=" + vo.getPatentNo();
         patentStarListDTO.setCurrentQuery(condition);
@@ -929,4 +978,67 @@ public class PatentStarApiService {
         return dto;
     }
 
+    /**
+     * 查询外部专利同族专利
+     * @param vo
+     * @return
+     * @throws IOException
+     */
+    public Records queryExternalFamily(QueryExternalFamilyVO vo) throws IOException {
+        Records records = new Records();
+        String family = this.getFamilyByPubNoApi(vo.getPatentNo());
+        QueryExternalFamilyDTO familyDTO = JSONObject.parseObject(family, QueryExternalFamilyDTO.class);
+        String familyInfos = familyDTO.getFamilyinfo();
+        List<String> publicNos = Arrays.asList(familyInfos.split(";"));
+        String pubNo = "";
+        if (!CollectionUtils.isEmpty(publicNos)) {
+            int count = publicNos.size() - 1;
+            for (int i = 0; i < publicNos.size(); i++) {
+                String s = publicNos.get(i);
+                if (i == count) {
+                    pubNo = pubNo + s;
+                } else {
+                    pubNo = pubNo + s + " " + "OR" + " ";
+                }
+            }
+        }
+        if (StringUtils.isNotEmpty(pubNo)) {
+            PatentStarListDTO patentStarListDTO = new PatentStarListDTO();
+            String condition = "PN="  + "(" + pubNo + ")";
+            patentStarListDTO.setCurrentQuery(condition);
+            patentStarListDTO.setDBType("CN");
+            patentStarListDTO.setOrderBy("AD");
+            patentStarListDTO.setOrderByType("DESC");
+            patentStarListDTO.setPageNum(vo.getPageNum());
+            patentStarListDTO.setRowCount(vo.getPageSize());
+            records = this.patentStarSearchLocal(patentStarListDTO);
+        }
+        return records;
+    }
+
+    /**
+     * 获取公开说明书
+     * @param appNo
+     * @return
+     */
+    public List<Text> getCnFullText(String appNo) {
+        List<Text> pubTextList = new ArrayList<>();
+        //获取公开说明书
+        String cnFullXmlApi = null;
+        try {
+            cnFullXmlApi = this.getCnFullXmlApi(appNo);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        try {
+            String fullText = this.getFullText(cnFullXmlApi);
+            Text pubText = new Text();
+            pubText.setTextContent(fullText);
+            pubText.setIfOrigin(true);
+            pubTextList.add(pubText);
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        return pubTextList;
+    }
 }