Browse Source

国内专利

licailing 5 years ago
parent
commit
54b9bc0e1d
26 changed files with 1520 additions and 9 deletions
  1. 4 0
      src/main/java/com/izouma/uwip/domain/Attachment.java
  2. 2 0
      src/main/java/com/izouma/uwip/domain/CountryPatent.java
  3. 3 0
      src/main/java/com/izouma/uwip/domain/DomesticPatent.java
  4. 6 0
      src/main/java/com/izouma/uwip/domain/LogoPatent.java
  5. 2 2
      src/main/java/com/izouma/uwip/domain/Patent.java
  6. 226 0
      src/main/java/com/izouma/uwip/dto/DomesticPatentDTO.java
  7. 151 0
      src/main/java/com/izouma/uwip/dto/DomesticPatentVO.java
  8. 26 0
      src/main/java/com/izouma/uwip/repo/DomesticPatentRepo.java
  9. 16 0
      src/main/java/com/izouma/uwip/repo/PatentRepo.java
  10. 4 2
      src/main/java/com/izouma/uwip/service/AttachmentService.java
  11. 20 0
      src/main/java/com/izouma/uwip/service/DomesticPatentService.java
  12. 20 0
      src/main/java/com/izouma/uwip/service/PatentService.java
  13. 19 2
      src/main/java/com/izouma/uwip/web/AttachmentController.java
  14. 60 0
      src/main/java/com/izouma/uwip/web/DomesticPatentController.java
  15. 13 1
      src/main/java/com/izouma/uwip/web/LogoPatentController.java
  16. 60 0
      src/main/java/com/izouma/uwip/web/PatentController.java
  17. 0 0
      src/main/resources/genjson/DomesticPatent.json
  18. 0 0
      src/main/resources/genjson/Patent.json
  19. 1 1
      src/main/vue/src/components/logoPatent/AttachmentList.vue
  20. 34 0
      src/main/vue/src/router.js
  21. 193 0
      src/main/vue/src/views/DomesticPatentEdit.vue
  22. 212 0
      src/main/vue/src/views/DomesticPatentList.vue
  23. 223 0
      src/main/vue/src/views/PatentEdit.vue
  24. 207 0
      src/main/vue/src/views/PatentList.vue
  25. 17 0
      src/test/java/com/izouma/uwip/repo/DomesticPatentRepoTest.java
  26. 1 1
      src/test/java/com/izouma/uwip/service/AttachmentServiceTest.java

+ 4 - 0
src/main/java/com/izouma/uwip/domain/Attachment.java

@@ -9,6 +9,7 @@ import lombok.NoArgsConstructor;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.Transient;
 
 @AllArgsConstructor
 @Data
@@ -39,4 +40,7 @@ public class Attachment extends BaseEntity {
 
     @ApiModelProperty(value = "版本")
     private int version;
+
+    @Transient
+    private String nickname;
 }

+ 2 - 0
src/main/java/com/izouma/uwip/domain/CountryPatent.java

@@ -9,6 +9,7 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
 import java.math.BigDecimal;
@@ -17,6 +18,7 @@ import java.time.LocalDate;
 @AllArgsConstructor
 @Data
 @Builder
+//@Entity
 @NoArgsConstructor
 @ApiModel(value = "国家申请")
 public class CountryPatent extends BaseEntity {

+ 3 - 0
src/main/java/com/izouma/uwip/domain/DomesticPatent.java

@@ -8,6 +8,7 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
 import java.math.BigDecimal;
@@ -16,9 +17,11 @@ import java.time.LocalDate;
 @AllArgsConstructor
 @Data
 @Builder
+@Entity
 @NoArgsConstructor
 @ApiModel(value = "国内申请")
 public class DomesticPatent extends BaseEntity {
+    private Long patentId;
 
     @Enumerated(EnumType.STRING)
     @ApiModelProperty(value = "流程")

+ 6 - 0
src/main/java/com/izouma/uwip/domain/LogoPatent.java

@@ -98,4 +98,10 @@ public class LogoPatent extends BaseEntity {
     @Transient
     public List<AttachmentDTO> attachments;
 
+    @Transient
+    private String clientPartner;
+
+    @Transient
+    private String supplierPartner;
+
 }

+ 2 - 2
src/main/java/com/izouma/uwip/domain/Patent.java

@@ -9,6 +9,7 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
 import java.time.LocalDate;
@@ -17,6 +18,7 @@ import java.time.LocalDate;
 @Data
 @Builder
 @NoArgsConstructor
+@Entity
 @ApiModel(value = "专利申请")
 public class Patent extends BaseEntity {
 //    private String workflow;
@@ -90,6 +92,4 @@ public class Patent extends BaseEntity {
     @ApiModelProperty(value = "申请日")
     private LocalDate applyDate;
 
-
-
 }

+ 226 - 0
src/main/java/com/izouma/uwip/dto/DomesticPatentDTO.java

@@ -0,0 +1,226 @@
+package com.izouma.uwip.dto;
+
+import com.izouma.uwip.enums.ApplyStatus;
+import com.izouma.uwip.enums.DomesticWorkflow;
+import com.izouma.uwip.enums.PatentType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@ApiModel(value = "国内申请")
+public interface DomesticPatentDTO {
+
+//    @ApiModelProperty(value = "流程")
+//    private DomesticWorkflow workflow;
+//
+//    @ApiModelProperty(value = "申请人统一社会信用代码")
+//    private String applicantUscc;
+//
+//    @ApiModelProperty(value = "第一发明人身份证")
+//    private String inventorIdno;
+//
+//    @ApiModelProperty(value = "是否请求费减")
+//    private boolean deduction;
+//
+//    @ApiModelProperty(value = "是否请求实质审查")
+//    private boolean essentialReview;
+//
+//    @ApiModelProperty(value = "是否申请提前公开")
+//    private boolean publicInAdvance;
+//
+//    @ApiModelProperty(value = "是否申请红章受理通知书")
+//    private boolean chapterAcceptanceNotice;
+//
+//    @ApiModelProperty(value = "是否申请红章缴费通知书")
+//    private boolean chapterPaymentNotice;
+//
+//    @ApiModelProperty(value = "是否决定答复")
+//    private Boolean decideReply;
+//
+//    /*
+//    true 客户准备
+//    false 律师准备
+//     */
+//    @ApiModelProperty(value = "准备答复意见")
+//    private Boolean isClientReady;
+//
+//    @ApiModelProperty(value = "是否通过答复")
+//    private Boolean replyPassed;
+//
+//    @ApiModelProperty(value = "办登通知日")
+//    private LocalDate registerNotice;
+//
+//    @ApiModelProperty(value = "办登截止日")
+//    private LocalDate registerEndDate;
+//
+//    @ApiModelProperty(value = "费用备注")
+//    private String feeRemark;
+//
+//    @ApiModelProperty(value = "是否已缴费")
+//    private Boolean payment;
+//
+//    @ApiModelProperty(value = "年费")
+//    private BigDecimal AnnualFee;
+//
+//    @ApiModelProperty(value = "年费支付期限")
+//    private LocalDate feePaymentPeriod;
+//
+//    @ApiModelProperty(value = "账单")
+//    private String bill;
+//
+//    @ApiModelProperty(value = "专利名称")
+//    private String name;
+//
+//    private ApplyStatus status;
+//
+//    @ApiModelProperty(value = "专利类型")
+//    private PatentType type;
+//
+//    /*
+//    客户编码(由客户经理填写)+年份+案件类型+连接符+案件阶段[+国家]+序列号
+//     */
+//    @ApiModelProperty(value = "寰球案号")
+//    private String uwNo;
+//
+//    @ApiModelProperty(value = "客户id")
+//    private Long clientPartnerId;
+//
+//    @ApiModelProperty(value = "供应商")
+//    private Long supplierPartnerId;
+//
+//    @ApiModelProperty(value = "供应商案号")
+//    private String supplierNo;
+//
+//    @ApiModelProperty(value = "供应商提交期限")
+//    private LocalDate supplierSubmitPeriod;
+//
+//    @ApiModelProperty(value = "申请人名称")
+//    private String applicantName;
+//
+//    @ApiModelProperty(value = "申请人英文名称")
+//    private String applicantEnName;
+//
+//    @ApiModelProperty(value = "申请人地址")
+//    private String applicantAddress;
+//
+//    @ApiModelProperty(value = "申请人英文地址")
+//    private String applicantEnAddress;
+//
+//    @ApiModelProperty(value = "发明人名称")
+//    private String inventorName;
+//
+//    @ApiModelProperty(value = "发明人英文名称")
+//    private String inventorEnName;
+//
+//    @ApiModelProperty(value = "优先权号")
+//    private String priorityNo;
+//
+//    @ApiModelProperty(value = "优先权日")
+//    private LocalDate priorityDate;
+//
+//    @ApiModelProperty(value = "优先权国别")
+//    private String priorityCountry;
+//
+//    @ApiModelProperty(value = "提交期限/内部期限")
+//    private LocalDate submitPeriod;
+//
+//    /*
+//    =优先权日+30个月
+//     */
+//    @ApiModelProperty(value = "官方期限")
+//    private LocalDate officialPeriod;
+
+    Long getDid();
+
+    Long getPatentId();
+
+    DomesticWorkflow getWorkflow();
+
+    String getApplicantUscc();
+
+    String getInventorIdno();
+
+    boolean isDeduction();
+
+    boolean isEssentialReview();
+
+    boolean isPublicInAdvance();
+
+    boolean isChapterAcceptanceNotice();
+
+    boolean isChapterPaymentNotice();
+
+    Boolean getDecideReply();
+
+    Boolean getClientReady();
+
+    Boolean getReplyPassed();
+
+    LocalDate getRegisterNotice();
+
+    LocalDate getRegisterEndDate();
+
+    String getFeeRemark();
+
+    Boolean getPayment();
+
+    BigDecimal getAnnualFee();
+
+    LocalDate getFeePaymentPeriod();
+
+    String getBill();
+
+    String getName();
+
+    ApplyStatus getStatus();
+
+    PatentType getType();
+
+    String getUwNo();
+
+    Long getClientPartnerId();
+
+    Long getSupplierPartnerId();
+
+    String getSupplierNo();
+
+    LocalDate getSupplierSubmitPeriod();
+
+    String getApplicantName();
+
+    String getApplicantEnName();
+
+    String getApplicantAddress();
+
+    String getApplicantEnAddress();
+
+    String getInventorName();
+
+    String getInventorEnName();
+
+    String getPriorityNo();
+
+    LocalDate getPriorityDate();
+
+    String getPriorityCountry();
+
+    LocalDate getSubmitPeriod();
+
+    LocalDate getOfficialPeriod();
+
+    String getApplyNo();
+
+    LocalDate getApplyDate();
+
+//    @ApiModelProperty(value = "申请号")
+//    private String applyNo;
+//
+//    @ApiModelProperty(value = "申请日")
+//    private LocalDate applyDate;
+}

+ 151 - 0
src/main/java/com/izouma/uwip/dto/DomesticPatentVO.java

@@ -0,0 +1,151 @@
+package com.izouma.uwip.dto;
+
+import com.izouma.uwip.enums.ApplyStatus;
+import com.izouma.uwip.enums.DomesticWorkflow;
+import com.izouma.uwip.enums.PatentType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@AllArgsConstructor
+@Data
+@Builder
+@NoArgsConstructor
+@ApiModel(value = "国内申请")
+public class DomesticPatentVO {
+    private Long did;
+
+    private Long patentId;
+
+    @ApiModelProperty(value = "流程")
+    private DomesticWorkflow workflow;
+
+    @ApiModelProperty(value = "申请人统一社会信用代码")
+    private String applicantUscc;
+
+    @ApiModelProperty(value = "第一发明人身份证")
+    private String inventorIdno;
+
+    @ApiModelProperty(value = "是否请求费减")
+    private boolean deduction;
+
+    @ApiModelProperty(value = "是否请求实质审查")
+    private boolean essentialReview;
+
+    @ApiModelProperty(value = "是否申请提前公开")
+    private boolean publicInAdvance;
+
+    @ApiModelProperty(value = "是否申请红章受理通知书")
+    private boolean chapterAcceptanceNotice;
+
+    @ApiModelProperty(value = "是否申请红章缴费通知书")
+    private boolean chapterPaymentNotice;
+
+    @ApiModelProperty(value = "是否决定答复")
+    private Boolean decideReply;
+
+    /*
+    true 客户准备
+    false 律师准备
+     */
+    @ApiModelProperty(value = "准备答复意见")
+    private Boolean isClientReady;
+
+    @ApiModelProperty(value = "是否通过答复")
+    private Boolean replyPassed;
+
+    @ApiModelProperty(value = "办登通知日")
+    private LocalDate registerNotice;
+
+    @ApiModelProperty(value = "办登截止日")
+    private LocalDate registerEndDate;
+
+    @ApiModelProperty(value = "费用备注")
+    private String feeRemark;
+
+    @ApiModelProperty(value = "是否已缴费")
+    private Boolean payment;
+
+    @ApiModelProperty(value = "年费")
+    private BigDecimal AnnualFee;
+
+    @ApiModelProperty(value = "年费支付期限")
+    private LocalDate feePaymentPeriod;
+
+    @ApiModelProperty(value = "账单")
+    private String bill;
+
+    @ApiModelProperty(value = "专利名称")
+    private String name;
+
+    private ApplyStatus status;
+
+    @ApiModelProperty(value = "专利类型")
+    private PatentType type;
+
+    /*
+    客户编码(由客户经理填写)+年份+案件类型+连接符+案件阶段[+国家]+序列号
+     */
+    @ApiModelProperty(value = "寰球案号")
+    private String uwNo;
+
+    @ApiModelProperty(value = "客户id")
+    private Long clientPartnerId;
+
+    @ApiModelProperty(value = "供应商")
+    private Long supplierPartnerId;
+
+    @ApiModelProperty(value = "供应商案号")
+    private String supplierNo;
+
+    @ApiModelProperty(value = "供应商提交期限")
+    private LocalDate supplierSubmitPeriod;
+
+    @ApiModelProperty(value = "申请人名称")
+    private String applicantName;
+
+    @ApiModelProperty(value = "申请人英文名称")
+    private String applicantEnName;
+
+    @ApiModelProperty(value = "申请人地址")
+    private String applicantAddress;
+
+    @ApiModelProperty(value = "申请人英文地址")
+    private String applicantEnAddress;
+
+    @ApiModelProperty(value = "发明人名称")
+    private String inventorName;
+
+    @ApiModelProperty(value = "发明人英文名称")
+    private String inventorEnName;
+
+    @ApiModelProperty(value = "优先权号")
+    private String priorityNo;
+
+    @ApiModelProperty(value = "优先权日")
+    private LocalDate priorityDate;
+
+    @ApiModelProperty(value = "优先权国别")
+    private String priorityCountry;
+
+    @ApiModelProperty(value = "提交期限/内部期限")
+    private LocalDate submitPeriod;
+
+    /*
+    =优先权日+30个月
+     */
+    @ApiModelProperty(value = "官方期限")
+    private LocalDate officialPeriod;
+
+    @ApiModelProperty(value = "申请号")
+    private String applyNo;
+
+    @ApiModelProperty(value = "申请日")
+    private LocalDate applyDate;
+}

+ 26 - 0
src/main/java/com/izouma/uwip/repo/DomesticPatentRepo.java

@@ -0,0 +1,26 @@
+package com.izouma.uwip.repo;
+
+import com.izouma.uwip.domain.DomesticPatent;
+import com.izouma.uwip.dto.DomesticPatentDTO;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+public interface DomesticPatentRepo extends JpaRepository<DomesticPatent, Long>, JpaSpecificationExecutor<DomesticPatent> {
+    @Query("update DomesticPatent t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    @Query(nativeQuery = true, value = "select d.*,p.id as patentId," +
+            "applicant_address, applicant_en_address, applicant_en_name, applicant_name, apply_date, apply_no, " +
+            "client_partner_id, inventor_en_name, inventor_name, name, official_period, priority_country, priority_date, " +
+            "priority_no, status, submit_period, supplier_no, supplier_partner_id, supplier_submit_period, type, uw_no " +
+            "from domestic_patent d left join patent p on d.patent_id = p.id " +
+            "where d.id = ?1")
+    List<DomesticPatentDTO> findDomesticDTO(Long id);
+}

+ 16 - 0
src/main/java/com/izouma/uwip/repo/PatentRepo.java

@@ -0,0 +1,16 @@
+package com.izouma.uwip.repo;
+
+import com.izouma.uwip.domain.Patent;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface PatentRepo extends JpaRepository<Patent, Long>, JpaSpecificationExecutor<Patent> {
+    @Query("update Patent t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 4 - 2
src/main/java/com/izouma/uwip/service/AttachmentService.java

@@ -10,6 +10,7 @@ import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
@@ -39,7 +40,8 @@ public class AttachmentService {
             e.printStackTrace();
         }
         if (size > 1024) {
-            return size / 1024 + "KB";
+            BigDecimal bigDecimal = new BigDecimal(size / 1024);
+            return bigDecimal.setScale(2,BigDecimal.ROUND_UP) + "KB";
         }
         return size + "B";
     }
@@ -57,7 +59,7 @@ public class AttachmentService {
                     .url(dto.getUrl())
                     .remark(dto.getRemark())
                     .size(getSize(dto.getUrl()))
-                    .version(attachmentRepo.findVersion("%" + dto.getAttachmentName() + "%", patentId))
+                    .version(attachmentRepo.findVersion(dto.getAttachmentName(), patentId))
                     .build();
             attachmentRepo.save(build);
         });

+ 20 - 0
src/main/java/com/izouma/uwip/service/DomesticPatentService.java

@@ -0,0 +1,20 @@
+package com.izouma.uwip.service;
+
+import com.izouma.uwip.domain.DomesticPatent;
+import com.izouma.uwip.dto.PageQuery;
+import com.izouma.uwip.repo.DomesticPatentRepo;
+import com.izouma.uwip.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class DomesticPatentService {
+
+    private final DomesticPatentRepo domesticPatentRepo;
+
+    public Page<DomesticPatent> all(PageQuery pageQuery) {
+        return domesticPatentRepo.findAll(JpaUtils.toSpecification(pageQuery, DomesticPatent.class), JpaUtils.toPageRequest(pageQuery));
+    }
+}

+ 20 - 0
src/main/java/com/izouma/uwip/service/PatentService.java

@@ -0,0 +1,20 @@
+package com.izouma.uwip.service;
+
+import com.izouma.uwip.domain.Patent;
+import com.izouma.uwip.dto.PageQuery;
+import com.izouma.uwip.repo.PatentRepo;
+import com.izouma.uwip.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class PatentService {
+
+    private final PatentRepo patentRepo;
+
+    public Page<Patent> all(PageQuery pageQuery) {
+        return patentRepo.findAll(JpaUtils.toSpecification(pageQuery, Patent.class), JpaUtils.toPageRequest(pageQuery));
+    }
+}

+ 19 - 2
src/main/java/com/izouma/uwip/web/AttachmentController.java

@@ -1,5 +1,8 @@
 package com.izouma.uwip.web;
+
 import com.izouma.uwip.domain.Attachment;
+import com.izouma.uwip.domain.User;
+import com.izouma.uwip.repo.UserRepo;
 import com.izouma.uwip.service.AttachmentService;
 import com.izouma.uwip.dto.PageQuery;
 import com.izouma.uwip.exception.BusinessException;
@@ -14,13 +17,16 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/attachment")
 @AllArgsConstructor
 public class AttachmentController extends BaseController {
     private AttachmentService attachmentService;
-    private AttachmentRepo attachmentRepo;
+    private AttachmentRepo    attachmentRepo;
+    private UserRepo          userRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -30,6 +36,9 @@ public class AttachmentController extends BaseController {
             ObjUtils.merge(orig, record);
             return attachmentRepo.save(orig);
         }
+        record.setAttachmentName(record.getAttachmentName().trim());
+        record.setVersion(attachmentRepo.findVersion(record.getAttachmentName(), record.getPatentId()));
+        record.setSize(attachmentService.getSize(record.getUrl()));
         return attachmentRepo.save(record);
     }
 
@@ -37,7 +46,15 @@ public class AttachmentController extends BaseController {
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/all")
     public Page<Attachment> all(@RequestBody PageQuery pageQuery) {
-        return attachmentService.all(pageQuery);
+        pageQuery.setSort("createdAt,desc");
+        Map<Long, String> userMap = userRepo.findAll()
+                .stream()
+                .collect(Collectors.toMap(User::getId, User::getNickname));
+        return attachmentService.all(pageQuery)
+                .map(attachment -> {
+                    attachment.setNickname(userMap.get(attachment.getUserId()));
+                    return attachment;
+                });
     }
 
     @GetMapping("/get/{id}")

+ 60 - 0
src/main/java/com/izouma/uwip/web/DomesticPatentController.java

@@ -0,0 +1,60 @@
+package com.izouma.uwip.web;
+import com.izouma.uwip.domain.DomesticPatent;
+import com.izouma.uwip.service.DomesticPatentService;
+import com.izouma.uwip.dto.PageQuery;
+import com.izouma.uwip.exception.BusinessException;
+import com.izouma.uwip.repo.DomesticPatentRepo;
+import com.izouma.uwip.utils.ObjUtils;
+import com.izouma.uwip.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/domesticPatent")
+@AllArgsConstructor
+public class DomesticPatentController extends BaseController {
+    private final DomesticPatentService domesticPatentService;
+    private final DomesticPatentRepo domesticPatentRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public DomesticPatent save(@RequestBody DomesticPatent record) {
+        if (record.getId() != null) {
+            DomesticPatent orig = domesticPatentRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return domesticPatentRepo.save(orig);
+        }
+        return domesticPatentRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<DomesticPatent> all(@RequestBody PageQuery pageQuery) {
+        return domesticPatentService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public DomesticPatent get(@PathVariable Long id) {
+        return domesticPatentRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        domesticPatentRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<DomesticPatent> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 13 - 1
src/main/java/com/izouma/uwip/web/LogoPatentController.java

@@ -1,6 +1,8 @@
 package com.izouma.uwip.web;
 
 import com.izouma.uwip.domain.LogoPatent;
+import com.izouma.uwip.domain.Partner;
+import com.izouma.uwip.repo.PartnerRepo;
 import com.izouma.uwip.service.LogoPatentService;
 import com.izouma.uwip.dto.PageQuery;
 import com.izouma.uwip.exception.BusinessException;
@@ -15,6 +17,8 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/logoPatent")
@@ -22,6 +26,7 @@ import java.util.List;
 public class LogoPatentController extends BaseController {
     private LogoPatentService logoPatentService;
     private LogoPatentRepo    logoPatentRepo;
+    private PartnerRepo       partnerRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -35,7 +40,14 @@ public class LogoPatentController extends BaseController {
     @PostMapping("/all")
     public Page<LogoPatent> all(@RequestBody PageQuery pageQuery) {
         pageQuery.setSort("createdAt,desc");
-        return logoPatentService.all(pageQuery);
+        Map<Long, String> partnerMap = partnerRepo.findAll()
+                .stream()
+                .collect(Collectors.toMap(Partner::getId, Partner::getName));
+        return logoPatentService.all(pageQuery).map(logoPatent -> {
+            logoPatent.setClientPartner(partnerMap.get(logoPatent.getClientPartnerId()));
+            logoPatent.setSupplierPartner(partnerMap.get(logoPatent.getSupplierPartnerId()));
+            return logoPatent;
+        });
     }
 
     @GetMapping("/get/{id}")

+ 60 - 0
src/main/java/com/izouma/uwip/web/PatentController.java

@@ -0,0 +1,60 @@
+package com.izouma.uwip.web;
+import com.izouma.uwip.domain.Patent;
+import com.izouma.uwip.service.PatentService;
+import com.izouma.uwip.dto.PageQuery;
+import com.izouma.uwip.exception.BusinessException;
+import com.izouma.uwip.repo.PatentRepo;
+import com.izouma.uwip.utils.ObjUtils;
+import com.izouma.uwip.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/patent")
+@AllArgsConstructor
+public class PatentController extends BaseController {
+    private final PatentService patentService;
+    private final PatentRepo patentRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public Patent save(@RequestBody Patent record) {
+        if (record.getId() != null) {
+            Patent orig = patentRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return patentRepo.save(orig);
+        }
+        return patentRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<Patent> all(@RequestBody PageQuery pageQuery) {
+        return patentService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public Patent get(@PathVariable Long id) {
+        return patentRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        patentRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<Patent> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

File diff suppressed because it is too large
+ 0 - 0
src/main/resources/genjson/DomesticPatent.json


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/genjson/Patent.json


+ 1 - 1
src/main/vue/src/components/logoPatent/AttachmentList.vue

@@ -20,7 +20,7 @@
             <el-table-column prop="remark" show-overflow-tooltip label="备注"> </el-table-column>
             <el-table-column prop="size" label="大小"> </el-table-column>
             <el-table-column prop="createdAt" show-overflow-tooltip label="上传时间"></el-table-column>
-            <el-table-column prop="userId" label="上传人" width="100px"> </el-table-column>
+            <el-table-column prop="nickname" label="上传人" width="100px"> </el-table-column>
             <el-table-column prop="version" label="版本" width="80px"> </el-table-column>
             <el-table-column label="操作" align="center" fixed="right">
                 <template slot-scope="{ row }">

+ 34 - 0
src/main/vue/src/router.js

@@ -214,6 +214,40 @@ const router = new Router({
                     meta: {
                         title: '附件列表'
                     }
+                },
+                {
+                    path: '/patentEdit',
+                    name: 'PatentEdit',
+                    component: () => import(/* webpackChunkName: "patentEdit" */ '@/views/PatentEdit.vue'),
+                    meta: {
+                        title: '专利编辑'
+                    }
+                },
+                {
+                    path: '/patentList',
+                    name: 'PatentList',
+                    component: () => import(/* webpackChunkName: "patentList" */ '@/views/PatentList.vue'),
+                    meta: {
+                        title: '专利'
+                    }
+                },
+                {
+                    path: '/domesticPatentEdit',
+                    name: 'DomesticPatentEdit',
+                    component: () =>
+                        import(/* webpackChunkName: "domesticPatentEdit" */ '@/views/DomesticPatentEdit.vue'),
+                    meta: {
+                        title: '国内专利申请编辑'
+                    }
+                },
+                {
+                    path: '/domesticPatentList',
+                    name: 'DomesticPatentList',
+                    component: () =>
+                        import(/* webpackChunkName: "domesticPatentList" */ '@/views/DomesticPatentList.vue'),
+                    meta: {
+                        title: '国内专利申请'
+                    }
                 }
                 /**INSERT_LOCATION**/
             ]

+ 193 - 0
src/main/vue/src/views/DomesticPatentEdit.vue

@@ -0,0 +1,193 @@
+<template>
+    <div class="edit-view">
+        <page-title>
+            <el-button @click="$router.go(-1)">取消</el-button>
+            <el-button @click="del" :loading="$store.state.fetchingData" type="danger" v-if="formData.id">
+                删除
+            </el-button>
+            <el-button @click="onSave" :loading="$store.state.fetchingData" type="primary">保存</el-button>
+        </page-title>
+        <div class="edit-view__content-wrapper">
+            <div class="edit-view__content-section">
+                <divider />
+                <el-form
+                    :model="formData"
+                    :rules="rules"
+                    ref="form"
+                    label-width="178px"
+                    label-position="right"
+                    size="small"
+                    style="max-width: 500px;"
+                >
+                    <el-form-item prop="workflow" label="流程">
+                        <el-select v-model="formData.workflow" clearable filterable placeholder="请选择">
+                            <el-option
+                                v-for="item in workflowOptions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item prop="applicantUscc" label="申请人统一社会信用代码">
+                        <el-input v-model="formData.applicantUscc"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="inventorIdno" label="第一发明人身份证">
+                        <el-input v-model="formData.inventorIdno"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="deduction" label="是否请求费减">
+                        <el-input v-model="formData.deduction"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="essentialReview" label="是否请求实质审查">
+                        <el-input v-model="formData.essentialReview"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="publicInAdvance" label="是否申请提前公开">
+                        <el-input v-model="formData.publicInAdvance"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="chapterAcceptanceNotice" label="是否申请红章受理通知书">
+                        <el-input v-model="formData.chapterAcceptanceNotice"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="chapterPaymentNotice" label="是否申请红章缴费通知书">
+                        <el-input v-model="formData.chapterPaymentNotice"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="decideReply" label="是否决定答复">
+                        <el-switch v-model="formData.decideReply"></el-switch>
+                    </el-form-item>
+                    <el-form-item prop="isClientReady" label="准备答复意见">
+                        <el-switch v-model="formData.isClientReady"></el-switch>
+                    </el-form-item>
+                    <el-form-item prop="replyPassed" label="是否通过答复">
+                        <el-switch v-model="formData.replyPassed"></el-switch>
+                    </el-form-item>
+                    <el-form-item prop="registerNotice" label="办登通知日">
+                        <el-date-picker
+                            v-model="formData.registerNotice"
+                            type="date"
+                            value-format="yyyy-MM-dd"
+                            placeholder="选择日期"
+                        >
+                        </el-date-picker>
+                    </el-form-item>
+                    <el-form-item prop="registerEndDate" label="办登截止日">
+                        <el-date-picker
+                            v-model="formData.registerEndDate"
+                            type="date"
+                            value-format="yyyy-MM-dd"
+                            placeholder="选择日期"
+                        >
+                        </el-date-picker>
+                    </el-form-item>
+                    <el-form-item prop="feeRemark" label="费用备注">
+                        <el-input v-model="formData.feeRemark"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="payment" label="是否已缴费">
+                        <el-switch v-model="formData.payment"></el-switch>
+                    </el-form-item>
+                    <el-form-item prop="AnnualFee" label="年费">
+                        <el-input-number type="number" v-model="formData.AnnualFee"></el-input-number>
+                    </el-form-item>
+                    <el-form-item prop="feePaymentPeriod" label="年费支付期限">
+                        <el-date-picker
+                            v-model="formData.feePaymentPeriod"
+                            type="date"
+                            value-format="yyyy-MM-dd"
+                            placeholder="选择日期"
+                        >
+                        </el-date-picker>
+                    </el-form-item>
+                    <el-form-item prop="bill" label="账单">
+                        <el-input v-model="formData.bill"></el-input>
+                    </el-form-item>
+                    <el-form-item class="form-submit">
+                        <el-button @click="onSave" :loading="saving" size="default" type="primary">保存 </el-button>
+                        <el-button @click="onDelete" :loading="saving" size="default" type="danger" v-if="formData.id"
+                            >删除
+                        </el-button>
+                        <el-button @click="$router.go(-1)" size="default">取消</el-button>
+                    </el-form-item>
+                </el-form>
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+export default {
+    name: 'DomesticPatentEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('domesticPatent/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {},
+            workflowOptions: [
+                { label: '待添加供应商', value: 'ADD_SUPPLIERS' },
+                { label: '待提交供应商材料', value: 'SUPPLIER_MATERIALS' },
+                { label: '待维护案件', value: 'MAINTAIN_CASE' },
+                { label: '待审查', value: 'PENDING_REVIEW' },
+                { label: '待办登', value: 'PENDING_REGISTER' },
+                { label: '办理登记', value: 'REGISTER' },
+                { label: '待维护年费信息', value: 'ANNUAL_FEE' },
+                { label: '已完成', value: 'COMPLETED' }
+            ]
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+
+            this.saving = true;
+            this.$http
+                .post('/domesticPatent/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        },
+        onDelete() {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/domesticPatent/del/${this.formData.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error((e || {}).error || '删除失败');
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 212 - 0
src/main/vue/src/views/DomesticPatentList.vue

@@ -0,0 +1,212 @@
+<template>
+    <div class="list-view">
+        <page-title>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" :loading="downloading" class="filter-item">
+                新增
+            </el-button>
+            <el-button @click="download" icon="el-icon-upload2" :loading="downloading" class="filter-item">
+                导出
+            </el-button>
+        </page-title>
+        <div class="filters-container">
+            <el-input
+                placeholder="搜索..."
+                v-model="search"
+                clearable
+                class="filter-item search"
+                @keyup.enter.native="getData"
+            >
+                <el-button @click="getData" slot="append" icon="el-icon-search"> </el-button>
+            </el-input>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="workflow" label="流程" :formatter="workflowFormatter"> </el-table-column>
+            <el-table-column prop="applicantUscc" label="申请人统一社会信用代码"> </el-table-column>
+            <el-table-column prop="inventorIdno" label="第一发明人身份证"> </el-table-column>
+            <el-table-column prop="deduction" label="是否请求费减"> </el-table-column>
+            <el-table-column prop="essentialReview" label="是否请求实质审查"> </el-table-column>
+            <el-table-column prop="publicInAdvance" label="是否申请提前公开"> </el-table-column>
+            <el-table-column prop="chapterAcceptanceNotice" label="是否申请红章受理通知书"> </el-table-column>
+            <el-table-column prop="chapterPaymentNotice" label="是否申请红章缴费通知书"> </el-table-column>
+            <el-table-column prop="decideReply" label="是否决定答复">
+                <template slot-scope="{ row }">
+                    <el-tag :type="row.decideReply ? '' : 'info'">{{ row.decideReply }}</el-tag>
+                </template>
+            </el-table-column>
+            <el-table-column prop="isClientReady" label="准备答复意见">
+                <template slot-scope="{ row }">
+                    <el-tag :type="row.isClientReady ? '' : 'info'">{{ row.isClientReady }}</el-tag>
+                </template>
+            </el-table-column>
+            <el-table-column prop="replyPassed" label="是否通过答复">
+                <template slot-scope="{ row }">
+                    <el-tag :type="row.replyPassed ? '' : 'info'">{{ row.replyPassed }}</el-tag>
+                </template>
+            </el-table-column>
+            <el-table-column prop="registerNotice" label="办登通知日"> </el-table-column>
+            <el-table-column prop="registerEndDate" label="办登截止日"> </el-table-column>
+            <el-table-column prop="feeRemark" label="费用备注"> </el-table-column>
+            <el-table-column prop="payment" label="是否已缴费">
+                <template slot-scope="{ row }">
+                    <el-tag :type="row.payment ? '' : 'info'">{{ row.payment }}</el-tag>
+                </template>
+            </el-table-column>
+            <el-table-column prop="AnnualFee" label="年费"> </el-table-column>
+            <el-table-column prop="feePaymentPeriod" label="年费支付期限"> </el-table-column>
+            <el-table-column prop="bill" label="账单"> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+    name: 'DomesticPatentList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/domesticPatent/all',
+            downloading: false,
+            workflowOptions: [
+                { label: '待添加供应商', value: 'ADD_SUPPLIERS' },
+                { label: '待提交供应商材料', value: 'SUPPLIER_MATERIALS' },
+                { label: '待维护案件', value: 'MAINTAIN_CASE' },
+                { label: '待审查', value: 'PENDING_REVIEW' },
+                { label: '待办登', value: 'PENDING_REGISTER' },
+                { label: '办理登记', value: 'REGISTER' },
+                { label: '待维护年费信息', value: 'ANNUAL_FEE' },
+                { label: '已完成', value: 'COMPLETED' }
+            ]
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        workflowFormatter(row, column, cellValue, index) {
+            let selectedOption = this.workflowOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        beforeGetData() {
+            return { search: this.search };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/domesticPatentEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/domesticPatentEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/domesticPatent/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000 }
+                })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/domesticPatent/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 223 - 0
src/main/vue/src/views/PatentEdit.vue

@@ -0,0 +1,223 @@
+<template>
+    <div class="edit-view">
+        <page-title>
+            <el-button @click="$router.go(-1)">取消</el-button>
+            <el-button @click="del" :loading="$store.state.fetchingData" type="danger" v-if="formData.id">
+                删除
+            </el-button>
+            <el-button @click="onSave" :loading="$store.state.fetchingData" type="primary">保存</el-button>
+        </page-title>
+        <div class="edit-view__content-wrapper">
+            <div class="edit-view__content-section">
+                <divider />
+                <el-form
+                    :model="formData"
+                    :rules="rules"
+                    ref="form"
+                    label-width="142px"
+                    label-position="right"
+                    size="small"
+                    style="max-width: 500px;"
+                >
+                    <el-form-item prop="name" label="专利名称">
+                        <el-input v-model="formData.name"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="status" label="状态">
+                        <el-select v-model="formData.status" clearable filterable placeholder="请选择">
+                            <el-option
+                                v-for="item in statusOptions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item prop="type" label="专利类型">
+                        <el-select v-model="formData.type" clearable filterable placeholder="请选择">
+                            <el-option
+                                v-for="item in typeOptions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item prop="uwNo" label="寰球案号">
+                        <el-input v-model="formData.uwNo"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="clientPartnerId" label="客户id">
+                        <el-input-number type="number" v-model="formData.clientPartnerId"></el-input-number>
+                    </el-form-item>
+                    <el-form-item prop="supplierPartnerId" label="供应商">
+                        <el-input-number type="number" v-model="formData.supplierPartnerId"></el-input-number>
+                    </el-form-item>
+                    <el-form-item prop="supplierNo" label="供应商案号">
+                        <el-input v-model="formData.supplierNo"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="supplierSubmitPeriod" label="供应商提交期限">
+                        <el-date-picker
+                            v-model="formData.supplierSubmitPeriod"
+                            type="date"
+                            value-format="yyyy-MM-dd"
+                            placeholder="选择日期"
+                        >
+                        </el-date-picker>
+                    </el-form-item>
+                    <el-form-item prop="applicantName" label="申请人名称">
+                        <el-input v-model="formData.applicantName"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="applicantEnName" label="申请人英文名称">
+                        <el-input v-model="formData.applicantEnName"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="applicantAddress" label="申请人地址">
+                        <el-input v-model="formData.applicantAddress"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="applicantEnAddress" label="申请人英文地址">
+                        <el-input v-model="formData.applicantEnAddress"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="inventorName" label="发明人名称">
+                        <el-input v-model="formData.inventorName"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="inventorEnName" label="发明人英文名称">
+                        <el-input v-model="formData.inventorEnName"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="priorityNo" label="优先权号">
+                        <el-input v-model="formData.priorityNo"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="priorityDate" label="优先权日">
+                        <el-date-picker
+                            v-model="formData.priorityDate"
+                            type="date"
+                            value-format="yyyy-MM-dd"
+                            placeholder="选择日期"
+                        >
+                        </el-date-picker>
+                    </el-form-item>
+                    <el-form-item prop="priorityCountry" label="优先权国别">
+                        <el-input v-model="formData.priorityCountry"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="submitPeriod" label="提交期限/内部期限">
+                        <el-date-picker
+                            v-model="formData.submitPeriod"
+                            type="date"
+                            value-format="yyyy-MM-dd"
+                            placeholder="选择日期"
+                        >
+                        </el-date-picker>
+                    </el-form-item>
+                    <el-form-item prop="officialPeriod" label="官方期限">
+                        <el-date-picker
+                            v-model="formData.officialPeriod"
+                            type="date"
+                            value-format="yyyy-MM-dd"
+                            placeholder="选择日期"
+                        >
+                        </el-date-picker>
+                    </el-form-item>
+                    <el-form-item prop="applyNo" label="申请号">
+                        <el-input v-model="formData.applyNo"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="applyDate" label="申请日">
+                        <el-date-picker
+                            v-model="formData.applyDate"
+                            type="date"
+                            value-format="yyyy-MM-dd"
+                            placeholder="选择日期"
+                        >
+                        </el-date-picker>
+                    </el-form-item>
+                    <el-form-item class="form-submit">
+                        <el-button @click="onSave" :loading="saving" size="default" type="primary">保存 </el-button>
+                        <el-button @click="onDelete" :loading="saving" size="default" type="danger" v-if="formData.id"
+                            >删除
+                        </el-button>
+                        <el-button @click="$router.go(-1)" size="default">取消</el-button>
+                    </el-form-item>
+                </el-form>
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+export default {
+    name: 'PatentEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('patent/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {},
+            statusOptions: [
+                { label: '申请阶段', value: 'APPLY_STAGE' },
+                { label: '审查阶段', value: 'REVIEW_STAGE' },
+                { label: '授权阶段', value: 'GRANT_STAGE' },
+                { label: '已完成', value: 'COMPLETED' }
+            ],
+            typeOptions: [
+                { label: '发明专利', value: 'INVENTION_PATENT' },
+                { label: '实用新型专利', value: 'UTILITY_MODEL_PATENT' },
+                { label: '外观设计专利', value: 'APPEARANCE_DESIGN_PATENT' }
+            ]
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+
+            this.saving = true;
+            this.$http
+                .post('/patent/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        },
+        onDelete() {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/patent/del/${this.formData.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error((e || {}).error || '删除失败');
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 207 - 0
src/main/vue/src/views/PatentList.vue

@@ -0,0 +1,207 @@
+<template>
+    <div class="list-view">
+        <page-title>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" :loading="downloading" class="filter-item">
+                新增
+            </el-button>
+            <el-button @click="download" icon="el-icon-upload2" :loading="downloading" class="filter-item">
+                导出
+            </el-button>
+        </page-title>
+        <div class="filters-container">
+            <el-input
+                placeholder="搜索..."
+                v-model="search"
+                clearable
+                class="filter-item search"
+                @keyup.enter.native="getData"
+            >
+                <el-button @click="getData" slot="append" icon="el-icon-search"> </el-button>
+            </el-input>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="name" label="专利名称"> </el-table-column>
+            <el-table-column prop="status" label="状态" :formatter="statusFormatter"> </el-table-column>
+            <el-table-column prop="type" label="专利类型" :formatter="typeFormatter"> </el-table-column>
+            <el-table-column prop="uwNo" label="寰球案号"> </el-table-column>
+            <el-table-column prop="clientPartnerId" label="客户id"> </el-table-column>
+            <el-table-column prop="supplierPartnerId" label="供应商"> </el-table-column>
+            <el-table-column prop="supplierNo" label="供应商案号"> </el-table-column>
+            <el-table-column prop="supplierSubmitPeriod" label="供应商提交期限"> </el-table-column>
+            <el-table-column prop="applicantName" label="申请人名称"> </el-table-column>
+            <el-table-column prop="applicantEnName" label="申请人英文名称"> </el-table-column>
+            <el-table-column prop="applicantAddress" label="申请人地址"> </el-table-column>
+            <el-table-column prop="applicantEnAddress" label="申请人英文地址"> </el-table-column>
+            <el-table-column prop="inventorName" label="发明人名称"> </el-table-column>
+            <el-table-column prop="inventorEnName" label="发明人英文名称"> </el-table-column>
+            <el-table-column prop="priorityNo" label="优先权号"> </el-table-column>
+            <el-table-column prop="priorityDate" label="优先权日"> </el-table-column>
+            <el-table-column prop="priorityCountry" label="优先权国别"> </el-table-column>
+            <el-table-column prop="submitPeriod" label="提交期限/内部期限"> </el-table-column>
+            <el-table-column prop="officialPeriod" label="官方期限"> </el-table-column>
+            <el-table-column prop="applyNo" label="申请号"> </el-table-column>
+            <el-table-column prop="applyDate" label="申请日"> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+    name: 'PatentList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/patent/all',
+            downloading: false,
+            statusOptions: [
+                { label: '申请阶段', value: 'APPLY_STAGE' },
+                { label: '审查阶段', value: 'REVIEW_STAGE' },
+                { label: '授权阶段', value: 'GRANT_STAGE' },
+                { label: '已完成', value: 'COMPLETED' }
+            ],
+            typeOptions: [
+                { label: '发明专利', value: 'INVENTION_PATENT' },
+                { label: '实用新型专利', value: 'UTILITY_MODEL_PATENT' },
+                { label: '外观设计专利', value: 'APPEARANCE_DESIGN_PATENT' }
+            ]
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        statusFormatter(row, column, cellValue, index) {
+            let selectedOption = this.statusOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        typeFormatter(row, column, cellValue, index) {
+            let selectedOption = this.typeOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        beforeGetData() {
+            return { search: this.search };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/patentEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/patentEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/patent/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000 }
+                })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/patent/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 17 - 0
src/test/java/com/izouma/uwip/repo/DomesticPatentRepoTest.java

@@ -0,0 +1,17 @@
+package com.izouma.uwip.repo;
+
+
+import com.izouma.uwip.ApplicationTests;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class DomesticPatentRepoTest extends ApplicationTests {
+    @Autowired
+    private DomesticPatentRepo domesticPatentRepo;
+
+    @Test
+    public void test() {
+        System.out.println(domesticPatentRepo.findDomesticDTO(126L));
+    }
+
+}

+ 1 - 1
src/test/java/com/izouma/uwip/service/AttachmentServiceTest.java

@@ -11,6 +11,6 @@ public class AttachmentServiceTest extends ApplicationTests {
 
     @Test
     public void getSize() {
-        System.out.println(attachmentService.getSize("https://uwip.oss-cn-hangzhou.aliyuncs.com/text/2021-03-26-17-33-03dWOZjMVd.txt"));
+        System.out.println(attachmentService.getSize("https://uwip.oss-cn-hangzhou.aliyuncs.com/image/2021-03-31-14-14-22JKyYhaqj.png"));
     }
 }

Some files were not shown because too many files changed in this diff