Przeglądaj źródła

Merge branch 'dev' of licailing/uwip into master

panhui 4 lat temu
rodzic
commit
44471a4882
54 zmienionych plików z 3142 dodań i 418 usunięć
  1. 5 3
      src/main/java/com/izouma/uwip/domain/DomesticPatent.java
  2. 19 0
      src/main/java/com/izouma/uwip/domain/Fee.java
  3. 1 2
      src/main/java/com/izouma/uwip/domain/Handle.java
  4. 3 0
      src/main/java/com/izouma/uwip/domain/LogoPatent.java
  5. 15 4
      src/main/java/com/izouma/uwip/domain/Patent.java
  6. 5 1
      src/main/java/com/izouma/uwip/dto/DomesticPatentDTO.java
  7. 4 0
      src/main/java/com/izouma/uwip/enums/ApplyStatus.java
  8. 14 0
      src/main/java/com/izouma/uwip/enums/DomesticWorkflow.java
  9. 1 1
      src/main/java/com/izouma/uwip/repo/PatentRepo.java
  10. 71 4
      src/main/java/com/izouma/uwip/service/DomesticPatentService.java
  11. 1 4
      src/main/java/com/izouma/uwip/service/LogoPatentService.java
  12. 1 2
      src/main/java/com/izouma/uwip/service/PartnerService.java
  13. 161 4
      src/main/java/com/izouma/uwip/utils/JpaUtils.java
  14. 27 0
      src/main/java/com/izouma/uwip/utils/ObjUtils.java
  15. 5 0
      src/main/java/com/izouma/uwip/web/DomesticPatentController.java
  16. 25 3
      src/main/java/com/izouma/uwip/web/FeeController.java
  17. 18 0
      src/main/java/com/izouma/uwip/web/LogoPatentController.java
  18. 1 0
      src/main/vue/public/index.html
  19. 1 1
      src/main/vue/src/components/AttachmentAdd.vue
  20. 2 2
      src/main/vue/src/components/AttachmentList.vue
  21. 8 5
      src/main/vue/src/components/AttachmentUpload.vue
  22. 65 4
      src/main/vue/src/components/Divider.vue
  23. 5 1
      src/main/vue/src/components/PageTitle.vue
  24. 14 2
      src/main/vue/src/components/SysMenu.vue
  25. 111 0
      src/main/vue/src/components/domesticPatent/AddSupplierNo.vue
  26. 110 0
      src/main/vue/src/components/domesticPatent/BackSupplier.vue
  27. 326 0
      src/main/vue/src/components/domesticPatent/BaseInfo.vue
  28. 75 0
      src/main/vue/src/components/domesticPatent/MaintainCase.vue
  29. 97 0
      src/main/vue/src/components/domesticPatent/Register.vue
  30. 103 0
      src/main/vue/src/components/domesticPatent/Reply.vue
  31. 86 0
      src/main/vue/src/components/domesticPatent/ReplyBack.vue
  32. 79 0
      src/main/vue/src/components/domesticPatent/ReplyResult.vue
  33. 72 0
      src/main/vue/src/components/domesticPatent/replySubmissions.vue
  34. 141 0
      src/main/vue/src/components/fee/BackBill.vue
  35. 43 15
      src/main/vue/src/components/fee/FeeAdd.vue
  36. 77 20
      src/main/vue/src/components/fee/FeeList.vue
  37. 142 0
      src/main/vue/src/components/fee/Pay.vue
  38. 1 1
      src/main/vue/src/components/logoPatent/Payment.vue
  39. 101 0
      src/main/vue/src/mixins/domesticPatent.js
  40. 43 5
      src/main/vue/src/mixins/logoPatent.js
  41. 1 1
      src/main/vue/src/mixins/pageableTable.js
  42. 11 2
      src/main/vue/src/router.js
  43. 16 0
      src/main/vue/src/styles/app.less
  44. 21 12
      src/main/vue/src/styles/element_theme/index.css
  45. 229 0
      src/main/vue/src/views/DomesticPatentAdd.vue
  46. 242 250
      src/main/vue/src/views/DomesticPatentEdit.vue
  47. 315 0
      src/main/vue/src/views/DomesticPatentEdit1.vue
  48. 78 47
      src/main/vue/src/views/DomesticPatentList.vue
  49. 1 1
      src/main/vue/src/views/LogoPatentAdd.vue
  50. 9 7
      src/main/vue/src/views/LogoPatentEdit.vue
  51. 66 5
      src/main/vue/src/views/LogoPatentList.vue
  52. 30 8
      src/main/vue/src/views/Menus.vue
  53. 43 0
      src/test/java/com/izouma/uwip/service/DomesticPatentServiceTest.java
  54. 1 1
      src/test/java/com/izouma/uwip/web/LogoPatentControllerTest.java

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

@@ -10,9 +10,7 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
+import javax.persistence.*;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 
@@ -84,6 +82,10 @@ public class DomesticPatent extends BaseEntity {
     @ApiModelProperty(value = "账单")
     private String bill;
 
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "patentId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+    private Patent patent;
+
     public DomesticPatent(DomesticPatentDTO vo) {
         BeanUtil.copyProperties(vo, this);
     }

+ 19 - 0
src/main/java/com/izouma/uwip/domain/Fee.java

@@ -9,6 +9,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import javax.persistence.Entity;
+import javax.persistence.Transient;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 
@@ -22,9 +23,15 @@ public class Fee extends BaseEntity {
     @ApiModelProperty(value = "专利id")
     private Long patentId;
 
+    /*
+    Maintenance 表里
+     */
     @ApiModelProperty(value = "官费类型")
     private String feeType;
 
+    /*
+    Maintenance 表里
+     */
     @ApiModelProperty(value = "费用名称")
     private String feeName;
 
@@ -56,6 +63,9 @@ public class Fee extends BaseEntity {
     @ApiModelProperty(value = "支付期限")
     private LocalDate paymentDeadline;
 
+    @ApiModelProperty(value = "账单")
+    private String bill;
+
     @ApiModelProperty(value = "支付日期")
     private LocalDate paymentDate;
 
@@ -75,4 +85,13 @@ public class Fee extends BaseEntity {
     private String invoiceRemark;
 
     private Long userId;
+
+    @Transient
+    private String patentPartner;
+
+    @Transient
+    private String payPartner;
+
+    @Transient
+    private String currency;
 }

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

@@ -1,6 +1,5 @@
 package com.izouma.uwip.domain;
 
-import com.izouma.uwip.enums.LogoWorkflow;
 import io.swagger.annotations.ApiModel;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -19,6 +18,6 @@ public class Handle {
 
     private LocalDateTime checkAt;
 
-    private LogoWorkflow logoWorkflow;
+    private String workflow;
 
 }

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

@@ -104,4 +104,7 @@ public class LogoPatent extends BaseEntity {
     @Transient
     private String supplierPartner;
 
+    @Transient
+    @ApiModelProperty(value = "操作")
+    private String operate;
 }

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

@@ -1,5 +1,8 @@
 package com.izouma.uwip.domain;
 
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.izouma.uwip.annotations.Searchable;
+import com.izouma.uwip.converter.HandleListConverter;
 import com.izouma.uwip.enums.ApplyStatus;
 import com.izouma.uwip.enums.PatentType;
 import io.swagger.annotations.ApiModel;
@@ -9,10 +12,10 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
+import javax.persistence.*;
 import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
 
 @AllArgsConstructor
 @Data
@@ -20,13 +23,16 @@ import java.time.LocalDate;
 @NoArgsConstructor
 @Entity
 @ApiModel(value = "专利申请")
+@JsonIgnoreProperties(value = {"hibernateLazyInitializer"}, ignoreUnknown = true)
 public class Patent extends BaseEntity {
 //    private String workflow;
 
+    @Searchable
     @ApiModelProperty(value = "专利名称")
     private String name;
 
-    private ApplyStatus status;
+    @Enumerated(EnumType.STRING)
+    private ApplyStatus applyStatus;
 
     @ApiModelProperty(value = "专利类型")
     @Enumerated(EnumType.STRING)
@@ -35,6 +41,7 @@ public class Patent extends BaseEntity {
     /*
     客户编码(由客户经理填写)+年份+案件类型+连接符+案件阶段[+国家]+序列号
      */
+    @Searchable
     @ApiModelProperty(value = "寰球案号")
     private String uwNo;
 
@@ -93,4 +100,8 @@ public class Patent extends BaseEntity {
     private LocalDate applyDate;
 
     private int sort;
+
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = HandleListConverter.class)
+    private List<Handle> handle = new ArrayList<>();
 }

+ 5 - 1
src/main/java/com/izouma/uwip/dto/DomesticPatentDTO.java

@@ -2,6 +2,7 @@ package com.izouma.uwip.dto;
 
 import cn.hutool.core.bean.BeanUtil;
 import com.izouma.uwip.domain.DomesticPatent;
+import com.izouma.uwip.domain.Handle;
 import com.izouma.uwip.domain.Patent;
 import com.izouma.uwip.enums.ApplyStatus;
 import com.izouma.uwip.enums.DomesticWorkflow;
@@ -15,6 +16,7 @@ import lombok.NoArgsConstructor;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.util.ArrayList;
 import java.util.List;
 
 @AllArgsConstructor
@@ -88,7 +90,7 @@ public class DomesticPatentDTO {
     @ApiModelProperty(value = "专利名称")
     private String name;
 
-    private ApplyStatus status;
+    private ApplyStatus applyStatus;
 
     @ApiModelProperty(value = "专利类型")
     private PatentType type;
@@ -155,6 +157,8 @@ public class DomesticPatentDTO {
 
     public List<AttachmentDTO> attachments;
 
+    private List<Handle> handle = new ArrayList<>();
+
     public DomesticPatentDTO(DomesticPatent dPatent, Patent patent){
         BeanUtil.copyProperties(dPatent,this);
         BeanUtil.copyProperties(patent,this);

+ 4 - 0
src/main/java/com/izouma/uwip/enums/ApplyStatus.java

@@ -2,6 +2,10 @@ package com.izouma.uwip.enums;
 
 public enum ApplyStatus {
     APPLY_STAGE("申请阶段"),
+    SUBSTANTIVE_STAGE("实审阶段"),
+    /*
+    审查/复审
+     */
     REVIEW_STAGE("审查阶段"),
     GRANT_STAGE("授权阶段"),
     COMPLETED("已完成")

+ 14 - 0
src/main/java/com/izouma/uwip/enums/DomesticWorkflow.java

@@ -9,8 +9,22 @@ public enum DomesticWorkflow {
     ADD_SUPPLIERS("待添加供应商",2),
     SUPPLIER_MATERIALS("待提交供应商材料",2),
     MAINTAIN_CASE("待维护案件",1),
+    REPLY_TO_NOTICE("上传答复通知",2),
+    /*
+    是否答复
+     */
     PENDING_REVIEW("待审查",1),
+    NO_REPLY("不答复终止",1),
+    REPLY_SUBMISSIONS("上传答复意见书",1),
+    REPLY_RESULT("上传答复结果",2),
+    /*
+    授权办登通知日
+    */
     PENDING_REGISTER("待办登",1),
+    /*
+    是否缴费
+     */
+    PAYMENT_REGISTER("补充办登信息",1),
     REGISTER("办理登记",2),
     ANNUAL_FEE("待维护年费信息",1),
     COMPLETED("已完成",1),

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

@@ -14,6 +14,6 @@ public interface PatentRepo extends JpaRepository<Patent, Long>, JpaSpecificatio
     @Transactional
     void softDelete(Long id);
 
-    @Query(nativeQuery = true, value = "select ifnull(max(sort + 1),1) from  patent where del = true")
+    @Query(nativeQuery = true, value = "select ifnull(max(sort + 1),1) from  patent where del = false")
     int findMax();
 }

+ 71 - 4
src/main/java/com/izouma/uwip/service/DomesticPatentService.java

@@ -1,13 +1,14 @@
 package com.izouma.uwip.service;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.izouma.uwip.domain.DomesticPatent;
+import com.izouma.uwip.domain.Handle;
 import com.izouma.uwip.domain.Patent;
 import com.izouma.uwip.dto.DomesticPatentDTO;
 import com.izouma.uwip.dto.PageQuery;
-import com.izouma.uwip.enums.CaseStage;
-import com.izouma.uwip.enums.CaseType;
-import com.izouma.uwip.enums.PatentType;
+import com.izouma.uwip.enums.*;
 import com.izouma.uwip.exception.BusinessException;
 import com.izouma.uwip.repo.DomesticPatentRepo;
 import com.izouma.uwip.repo.PatentRepo;
@@ -17,6 +18,12 @@ import lombok.AllArgsConstructor;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
+import javax.persistence.criteria.Path;
+import javax.persistence.criteria.Predicate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 
 @Service
 @AllArgsConstructor
@@ -42,7 +49,16 @@ public class DomesticPatentService {
             Patent orig1 = patentRepo.findById(record.getPatentId()).orElseThrow(new BusinessException("无记录"));
             Patent patent = new Patent();
             BeanUtil.copyProperties(record, patent);
-            ObjUtils.merge(orig1, patent);
+            ObjUtils.mergePatent(orig1, patent);
+
+            orig1.getHandle().add(Handle.builder()
+                    .workflow(record.getWorkflow().toString())
+                    .userId(userId)
+                    .checkAt(LocalDateTime.now())
+                    .build());
+            if (ObjectUtil.isNull(record.getApplyStatus()) || !ApplyStatus.COMPLETED.equals(record.getApplyStatus())) {
+                orig1.setApplyStatus(this.getApplyStatus(record.getWorkflow()));
+            }
             patentRepo.save(orig1);
 
             // 保存附件
@@ -61,6 +77,7 @@ public class DomesticPatentService {
         PatentType type = patent.getType();
         patent.setUwNo(partnerService.getUwNo(patent.getClientPartnerId(), CaseType.valueOf(type.name()), CaseStage.DOMESTIC, patent
                 .getSort()));
+        patent.setApplyStatus(ApplyStatus.APPLY_STAGE);
         patent = patentRepo.save(patent);
 
         DomesticPatent dPatent = new DomesticPatent(record);
@@ -73,4 +90,54 @@ public class DomesticPatentService {
         }
         return dPatent;
     }
+
+    public ApplyStatus getApplyStatus(DomesticWorkflow workflow) {
+        switch (workflow) {
+            case ADD_SUPPLIERS://待添加供应商
+            case SUPPLIER_MATERIALS://供应商反馈文件
+            case MAINTAIN_CASE://申请号/申请日
+            case REPLY_TO_NOTICE://官方期限/内部期限
+            case PENDING_REVIEW://是否答复 待审查
+                return ApplyStatus.APPLY_STAGE;//申请阶段
+            case REPLY_SUBMISSIONS://答复意见书
+                return ApplyStatus.SUBSTANTIVE_STAGE;// 实审阶段
+            case REPLY_RESULT://答复结果
+                return ApplyStatus.REVIEW_STAGE;//复查阶段
+            case PENDING_REGISTER://办登通知日
+            case PAYMENT_REGISTER://是否缴费
+            case REGISTER://办登登记
+            case ANNUAL_FEE://维护费用
+                return ApplyStatus.GRANT_STAGE;//授权阶段
+            default://不答复终止
+                return ApplyStatus.COMPLETED;
+        }
+    }
+
+    public Page<DomesticPatent> allDTO(PageQuery pageQuery) {
+       return domesticPatentRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
+            List<Predicate> and = new ArrayList<>();
+            Path<Object> patent = root.get("patent");
+            if (StrUtil.isNotBlank(pageQuery.getSearch())) {
+                List<Predicate> or = new ArrayList<>();
+                or.add(criteriaBuilder.like(patent.get("name"), "%" + pageQuery.getSearch() + "%"));
+                or.add(criteriaBuilder.like(patent.get("uwNo"), "%" + pageQuery.getSearch() + "%"));
+                and.add(criteriaBuilder.or(or.toArray(new Predicate[0])));
+            }
+            Map<String, Object> query = pageQuery.getQuery();
+            query.keySet().forEach(key -> {
+                if (JpaUtils.isExistField(key, DomesticPatent.class)) {
+                    Predicate predicate = JpaUtils.getPredicate(key, query.get(key), DomesticPatent.class, root, criteriaBuilder,false);
+                    if (ObjectUtil.isNotNull(predicate)){
+                        and.add(predicate);
+                    }
+                } else {
+                    Predicate predicate = JpaUtils.getPredicate(key, query.get(key), Patent.class, root, criteriaBuilder,true);
+                    if (ObjectUtil.isNotNull(predicate)){
+                        and.add(predicate);
+                    }
+                }
+            });
+            return criteriaBuilder.and(and.toArray(new Predicate[0]));
+        }),JpaUtils.toPageRequest(pageQuery));
+    }
 }

+ 1 - 4
src/main/java/com/izouma/uwip/service/LogoPatentService.java

@@ -3,12 +3,10 @@ package com.izouma.uwip.service;
 import cn.hutool.core.util.ObjectUtil;
 import com.izouma.uwip.domain.Handle;
 import com.izouma.uwip.domain.LogoPatent;
-import com.izouma.uwip.domain.Partner;
 import com.izouma.uwip.dto.PageQuery;
 import com.izouma.uwip.enums.*;
 import com.izouma.uwip.exception.BusinessException;
 import com.izouma.uwip.repo.LogoPatentRepo;
-import com.izouma.uwip.repo.PartnerRepo;
 import com.izouma.uwip.utils.JpaUtils;
 import com.izouma.uwip.utils.ObjUtils;
 import lombok.AllArgsConstructor;
@@ -16,7 +14,6 @@ import org.apache.commons.collections.CollectionUtils;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
-import java.time.LocalDate;
 import java.time.LocalDateTime;
 
 @Service
@@ -33,7 +30,7 @@ public class LogoPatentService {
 
     public Handle saveHandle(LogoWorkflow workflow, Long userId) {
         return Handle.builder()
-                .logoWorkflow(workflow)
+                .workflow(workflow.toString())
                 .userId(userId)
                 .checkAt(LocalDateTime.now())
                 .build();

+ 1 - 2
src/main/java/com/izouma/uwip/service/PartnerService.java

@@ -1,6 +1,5 @@
 package com.izouma.uwip.service;
 
-import com.izouma.uwip.domain.LogoPatent;
 import com.izouma.uwip.domain.Partner;
 import com.izouma.uwip.dto.PageQuery;
 import com.izouma.uwip.enums.CaseStage;
@@ -18,7 +17,7 @@ import java.time.LocalDate;
 @AllArgsConstructor
 public class PartnerService {
 
-    private PartnerRepo partnerRepo;
+    private final PartnerRepo partnerRepo;
 
     public Page<Partner> all(PageQuery pageQuery) {
         return partnerRepo.findAll(JpaUtils.toSpecification(pageQuery, Partner.class), JpaUtils.toPageRequest(pageQuery));

+ 161 - 4
src/main/java/com/izouma/uwip/utils/JpaUtils.java

@@ -8,10 +8,7 @@ import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
 
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
+import javax.persistence.criteria.*;
 import java.lang.reflect.Field;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -162,6 +159,166 @@ public class JpaUtils {
         return and;
     }
 
+    public static Predicate getPredicate(String property, Object value, Class<?> queryClass, Root<?> root,
+                                         CriteriaBuilder criteriaBuilder, boolean isPatent) {
+        if (value == null) {
+            return null;
+        }
+        if (String.class.equals(value.getClass())) {
+            if (StringUtils.isEmpty((String) value)) {
+                return null;
+            }
+        }
+        Field field = getDeclaredField(queryClass, property);
+        if (field == null) return null;
+
+        Class fieldType = field.getType();
+        if (Enum.class.isAssignableFrom(fieldType)) {
+            if (value instanceof Collection) {
+                if (!((Collection) value).isEmpty()) {
+                    List list = new ArrayList();
+                    for (Object o : ((Collection) value)) {
+                        list.add(Enum.valueOf(fieldType, String.valueOf(o)));
+                    }
+                    if (isPatent) {
+                        return root.get("patent").get(property).in(list);
+                    }
+                    return root.get(property).in(list);
+                }
+            } else if (value instanceof String && StringUtils.isNotEmpty((String) value)) {
+                if (((String) value).contains(",")) {
+                    String[] arr = ((String) value).split(",");
+                    List list = new ArrayList();
+                    for (String s : arr) {
+                        list.add(Enum.valueOf(fieldType, s));
+                    }
+                    if (isPatent) {
+                        return root.get("patent").get(property).in(list);
+                    }
+                    return root.get(property).in(list);
+                } else {
+                    if (isPatent) {
+                        return criteriaBuilder.and(criteriaBuilder
+                                .equal(root.get("patent")
+                                        .get(property), Enum.valueOf(fieldType, String.valueOf(value))));
+                    }
+                    return criteriaBuilder.and(criteriaBuilder
+                            .equal(root.get(property), Enum.valueOf(fieldType, String.valueOf(value))));
+                }
+            }
+        } else if (LocalDateTime.class == fieldType) {
+            if (value instanceof List) {
+                List list = (List) value;
+                if (list.size() == 1) {
+                    LocalDateTime start = DateTimeUtils
+                            .toLocalDateTime((String) list.get(0), "yyyy-MM-dd HH:mm:ss");
+                    if (isPatent) {
+                        return criteriaBuilder.greaterThanOrEqualTo(root.get("patent")
+                                .get(property), start);
+                    }
+                    return criteriaBuilder.greaterThanOrEqualTo(root.get(property), start);
+                } else if (list.size() == 2) {
+                    LocalDateTime end = DateTimeUtils
+                            .toLocalDateTime((String) list.get(1), "yyyy-MM-dd HH:mm:ss");
+                    if (isPatent) {
+                        return criteriaBuilder.lessThanOrEqualTo(root.get("patent").get(property), end);
+                    }
+                    return criteriaBuilder.lessThanOrEqualTo(root.get(property), end);
+                }
+            } else if (value instanceof String && Pattern
+                    .matches("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$", (String) value)) {
+                String[] arr = ((String) value).split(",");
+                List<Predicate> and = new ArrayList<>();
+                LocalDateTime start = DateTimeUtils.toLocalDateTime(arr[0], "yyyy-MM-dd HH:mm:ss");
+                if (isPatent) {
+                    and.add(criteriaBuilder.greaterThanOrEqualTo(root.get("patent")
+                            .get(property), start));
+                }
+                and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
+                LocalDateTime end = DateTimeUtils.toLocalDateTime(arr[1], "yyyy-MM-dd HH:mm:ss");
+                if (isPatent) {
+                    and.add(criteriaBuilder.lessThanOrEqualTo(root.get("patent").get(property), end));
+                }
+                and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
+                return criteriaBuilder.and(and.toArray(new Predicate[0]));
+            } else {
+                if (isPatent) {
+                    return criteriaBuilder.and(criteriaBuilder.equal(root.get("patent")
+                            .get(property), DateTimeUtils
+                            .toLocalDateTime((String) value, "yyyy-MM-dd HH:mm:ss")));
+                }
+                return criteriaBuilder.and(criteriaBuilder.equal(root.get(property), DateTimeUtils
+                        .toLocalDateTime((String) value, "yyyy-MM-dd HH:mm:ss")));
+            }
+        } else if (LocalDate.class == fieldType) {
+            if (value instanceof List) {
+                List list = (List) value;
+                if (list.size() == 1) {
+                    LocalDate start = DateTimeUtils
+                            .toLocalDate((String) list.get(0), "yyyy-MM-dd");
+                    if (isPatent) {
+                        return criteriaBuilder.greaterThanOrEqualTo(root.get("patent")
+                                .get(property), start);
+                    }
+                    return criteriaBuilder.greaterThanOrEqualTo(root.get(property), start);
+                } else if (list.size() == 2) {
+                    LocalDate end = DateTimeUtils
+                            .toLocalDate((String) list.get(1), "yyyy-MM-dd");
+                    if (isPatent) {
+                        return criteriaBuilder.lessThanOrEqualTo(root.get("patent").get(property), end);
+                    }
+                    return criteriaBuilder.lessThanOrEqualTo(root.get(property), end);
+                }
+            } else if (value instanceof String && Pattern
+                    .matches("^\\d{4}-\\d{2}-\\d{2},\\d{4}-\\d{2}-\\d{2}$", (String) value)) {
+                String[] arr = ((String) value).split(",");
+                List<Predicate> and = new ArrayList<>();
+                LocalDate start = DateTimeUtils.toLocalDate(arr[0], "yyyy-MM-dd");
+                if (isPatent) {
+                    and.add(criteriaBuilder.greaterThanOrEqualTo(root.get("patent").get(property), start));
+                }
+                and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
+                LocalDate end = DateTimeUtils.toLocalDate(arr[1], "yyyy-MM-dd");
+                if (isPatent) {
+                    and.add(criteriaBuilder.lessThanOrEqualTo(root.get("patent").get(property), end));
+                }
+                and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
+                return criteriaBuilder.and(and.toArray(new Predicate[0]));
+            } else {
+                if (isPatent) {
+                    return criteriaBuilder.and(criteriaBuilder.equal(root.get("patent")
+                            .get(property), DateTimeUtils
+                            .toLocalDateTime((String) value, "yyyy-MM-dd")));
+                }
+                return criteriaBuilder.and(criteriaBuilder.equal(root.get(property), DateTimeUtils
+                        .toLocalDateTime((String) value, "yyyy-MM-dd")));
+            }
+        } else {
+            if (isPatent) {
+                return criteriaBuilder.and(criteriaBuilder.equal(root.get("patent").get(property), value));
+            }
+            return criteriaBuilder.and(criteriaBuilder.equal(root.get(property), value));
+        }
+        return null;
+    }
+
+    public static Boolean isExistField(String field, Class<?> clazz) {
+        if (clazz == null || clazz == Object.class || StringUtils.isEmpty(field)) {
+            return null;
+        }
+        //获取这个类的所有属性
+        Field[] fields = clazz.getDeclaredFields();
+        boolean flag = false;
+        //循环遍历所有的fields
+        for (int i = 0; i < fields.length; i++) {
+            if (fields[i].getName().equals(field)) {
+                flag = true;
+                break;
+            }
+        }
+        return flag;
+    }
+
     private static Field getDeclaredField(Class<?> clazz, String property) {
         String className = clazz.getName();
         while (clazz != null && clazz != Object.class) {

+ 27 - 0
src/main/java/com/izouma/uwip/utils/ObjUtils.java

@@ -1,6 +1,7 @@
 package com.izouma.uwip.utils;
 
 
+import com.izouma.uwip.domain.Patent;
 import org.apache.commons.beanutils.BeanUtilsBean;
 
 import java.lang.reflect.Field;
@@ -22,6 +23,32 @@ public class ObjUtils {
         }
     }
 
+    public static void mergePatent(Object dst, Object src) {
+        Objects.requireNonNull(src);
+        Objects.requireNonNull(dst);
+        if (!dst.getClass().equals(src.getClass())) {
+            if (dst instanceof Patent && src instanceof Patent) {
+                BeanUtilsBean notNull = new NullAwareBeanUtilsBean();
+                try {
+                    notNull.copyProperties(dst, src);
+                } catch (IllegalAccessException | InvocationTargetException e) {
+                    e.printStackTrace();
+                }
+            } else {
+                throw new RuntimeException("cannot merge different class");
+            }
+        } else {
+            BeanUtilsBean notNull = new NullAwareBeanUtilsBean();
+            try {
+                notNull.copyProperties(dst, src);
+            } catch (IllegalAccessException | InvocationTargetException e) {
+                e.printStackTrace();
+            }
+        }
+
+
+    }
+
     public static String[] getFields(Class clazz) {
         Field[] fields = clazz.getDeclaredFields();
         String[] fieldNames = new String[fields.length];

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

@@ -47,6 +47,11 @@ public class DomesticPatentController extends BaseController {
         return domesticPatentService.all(pageQuery);
     }
 
+    @PostMapping("/allDTO")
+    public Page<DomesticPatent> allDTO(@RequestBody PageQuery pageQuery) {
+        return domesticPatentService.allDTO(pageQuery);
+    }
+
     @GetMapping("/get/{id}")
     public DomesticPatent get(@PathVariable Long id) {
         return domesticPatentRepo.findById(id).orElseThrow(new BusinessException("无记录"));

+ 25 - 3
src/main/java/com/izouma/uwip/web/FeeController.java

@@ -1,5 +1,10 @@
 package com.izouma.uwip.web;
+
 import com.izouma.uwip.domain.Fee;
+import com.izouma.uwip.domain.Maintenance;
+import com.izouma.uwip.domain.Partner;
+import com.izouma.uwip.repo.MaintenanceRepo;
+import com.izouma.uwip.repo.PartnerRepo;
 import com.izouma.uwip.service.FeeService;
 import com.izouma.uwip.dto.PageQuery;
 import com.izouma.uwip.exception.BusinessException;
@@ -14,13 +19,17 @@ 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("/fee")
 @AllArgsConstructor
 public class FeeController extends BaseController {
-    private FeeService feeService;
-    private FeeRepo feeRepo;
+    private final FeeService      feeService;
+    private final FeeRepo         feeRepo;
+    private final PartnerRepo     partnerRepo;
+    private final MaintenanceRepo maintenanceRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -37,7 +46,20 @@ public class FeeController extends BaseController {
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/all")
     public Page<Fee> all(@RequestBody PageQuery pageQuery) {
-        return feeService.all(pageQuery);
+        pageQuery.setSort("createdAt,desc");
+        List<Partner> partners = partnerRepo.findAll();
+        Map<Long, String> partnerMap = partners
+                .stream()
+                .collect(Collectors.toMap(Partner::getId, Partner::getName));
+        Map<Long, String> currency = maintenanceRepo.findAllByFlag("currency")
+                .stream()
+                .collect(Collectors.toMap(Maintenance::getId, Maintenance::getName));
+        return feeService.all(pageQuery).map(fee -> {
+            fee.setPatentPartner(partnerMap.get(fee.getPatentPartnerId()));
+            fee.setPayPartner(partnerMap.get(fee.getPayPartnerId()));
+            fee.setCurrency(currency.get(fee.getCurrencyMaintenanceId()));
+            return fee;
+        });
     }
 
     @GetMapping("/get/{id}")

+ 18 - 0
src/main/java/com/izouma/uwip/web/LogoPatentController.java

@@ -1,8 +1,12 @@
 package com.izouma.uwip.web;
 
+import cn.hutool.core.collection.CollUtil;
+import com.izouma.uwip.domain.Handle;
 import com.izouma.uwip.domain.LogoPatent;
 import com.izouma.uwip.domain.Partner;
+import com.izouma.uwip.domain.User;
 import com.izouma.uwip.repo.PartnerRepo;
+import com.izouma.uwip.repo.UserRepo;
 import com.izouma.uwip.service.LogoPatentService;
 import com.izouma.uwip.dto.PageQuery;
 import com.izouma.uwip.exception.BusinessException;
@@ -27,6 +31,7 @@ public class LogoPatentController extends BaseController {
     private LogoPatentService logoPatentService;
     private LogoPatentRepo    logoPatentRepo;
     private PartnerRepo       partnerRepo;
+    private UserRepo          userRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -44,9 +49,22 @@ public class LogoPatentController extends BaseController {
         Map<Long, String> partnerMap = partners
                 .stream()
                 .collect(Collectors.toMap(Partner::getId, Partner::getName));
+        Map<Long, String> userMap = userRepo.findAll()
+                .stream()
+                .collect(Collectors.toMap(User::getId, User::getNickname));
         return logoPatentService.all(pageQuery).map(logoPatent -> {
             logoPatent.setClientPartner(partnerMap.get(logoPatent.getClientPartnerId()));
             logoPatent.setSupplierPartner(partnerMap.get(logoPatent.getSupplierPartnerId()));
+            logoPatent.setOperate(userMap.get(logoPatent.getUserId()));
+
+            List<Handle> handles = logoPatent.getHandle()
+                    .stream()
+                    .filter(handle -> handle.getWorkflow().equals(logoPatent.getLogoWorkflow().toString()))
+                    .limit(1)
+                    .collect(Collectors.toList());
+            if (CollUtil.isNotEmpty(handles)) {
+                logoPatent.setOperate(userMap.get(handles.get(0).getUserId()));
+            }
             return logoPatent;
         });
     }

+ 1 - 0
src/main/vue/public/index.html

@@ -7,6 +7,7 @@
         <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
         <script src="<%= BASE_URL %>fontawesome-v5.13.0.js"></script>
         <link rel="stylesheet" href="https://at.alicdn.com/t/font_2428217_x5heb96sw9.css" />
+        <link rel="stylesheet" href="https://at.alicdn.com/t/font_2470793_i5zw8ybpk58.css" />
         <title>管理后台</title>
         <style>
             @font-face {

+ 1 - 1
src/main/vue/src/components/logoPatent/AttachmentAdd.vue → src/main/vue/src/components/AttachmentAdd.vue

@@ -70,7 +70,7 @@ export default {
         submit() {
             let data = { ...this.form };
             data.userId = this.$store.state.userInfo.id;
-            data.patentId = this.info.id;
+            data.patentId = this.info.patentId || this.info.id;
             data.version = 1;
             if (this.fileSize) {
                 data.size = this.fileSize + 'KB';

+ 2 - 2
src/main/vue/src/components/logoPatent/AttachmentList.vue → src/main/vue/src/components/AttachmentList.vue

@@ -46,7 +46,7 @@ export default {
     name: 'AttachmentList',
     mixins: [pageableTable],
     props: {
-        logoPatentInfo: {
+        info: {
             type: Object,
             default: () => {
                 return {};
@@ -79,7 +79,7 @@ export default {
         beforeGetData() {
             return {
                 query: {
-                    patentId: this.logoPatentInfo.id
+                    patentId: this.info.patentId || this.info.id
                 }
             };
         },

+ 8 - 5
src/main/vue/src/components/AttachmentUpload.vue

@@ -46,7 +46,7 @@
                     class="upload-progress"
                 ></el-progress>
             </div>
-            <el-image style="width: 0; height: 0;" :src="previewUrl" :preview-src-list="[previewUrl]" ref="preview">
+            <el-image style="width: 0; height: 0" :src="previewUrl" :preview-src-list="[previewUrl]" ref="preview">
             </el-image>
         </el-upload>
         <el-input
@@ -250,14 +250,17 @@ export default {
 .file-upload {
     line-height: 28px;
     padding-top: 5px;
+
+    .el-button {
+        min-width: 80px;
+    }
 }
 .file-remark {
     margin-top: 14px;
     line-height: 28px;
 }
-</style>
-<style lang="less">
-.file-remark {
+
+/deep/ .file-remark {
     input {
         padding: 0 30px 0 8px;
 
@@ -265,7 +268,7 @@ export default {
         border-width: 0;
     }
 }
-.file-upload {
+/deep/ .file-upload {
     .el-upload {
         line-height: 28px;
     }

+ 65 - 4
src/main/vue/src/components/Divider.vue

@@ -1,11 +1,37 @@
 <template>
-    <div class="page-divider">
-        <slot> 基本信息</slot>
+    <div class="page-divider" :class="{ topLine, showMore }">
+        <div class="top-line" v-if="topLine"></div>
+        <div class="main"><slot> 基本信息</slot></div>
+
+        <el-button type="text" @click="changeShow" v-if="collapse">
+            {{ showMore ? '折叠' : '展开' }}
+            <i class="el-icon-arrow-up btn-icon" :class="{ down: !showMore }"></i>
+        </el-button>
     </div>
 </template>
 
 <script>
-export default {};
+export default {
+    props: {
+        collapse: {
+            type: Boolean,
+            default: false
+        },
+        topLine: {
+            type: Boolean,
+            default: false
+        },
+        showMore: {
+            type: Boolean,
+            default: true
+        }
+    },
+    methods: {
+        changeShow() {
+            this.$emit('update:showMore', !this.showMore);
+        }
+    }
+};
 </script>
 
 <style lang="less" scoped>
@@ -17,7 +43,7 @@ export default {};
     padding: 16px 0;
     position: relative;
     border-bottom: 1px solid #f2f3f5;
-    margin-bottom: 20px;
+    display: flex;
 
     &::before {
         content: '';
@@ -28,5 +54,40 @@ export default {};
         left: -20px;
         top: 20px;
     }
+    &.topLine {
+        padding-top: 21px;
+        &::before {
+            top: 25px;
+        }
+    }
+
+    &.showMore {
+        margin-bottom: 20px;
+    }
+    .top-line {
+        height: 5px;
+        background-color: #f2f3f5;
+        position: absolute;
+        top: 0;
+        left: -20px;
+        right: -20px;
+    }
+
+    .main {
+        flex-grow: 1;
+    }
+
+    .el-button {
+        color: #949699;
+        padding: 4px 0;
+    }
+}
+
+.btn-icon {
+    transition: transform ease-in-out 0.3s;
+
+    &.down {
+        transform: rotate(180deg);
+    }
 }
 </style>

+ 5 - 1
src/main/vue/src/components/PageTitle.vue

@@ -1,7 +1,11 @@
 <template>
     <div class="page-title">
         <div class="navigation">
-            <div class="title">{{ name || $route.meta.title || $route.name }}</div>
+            <div class="title">
+                <slot name="title">
+                    {{ name || $route.meta.title || $route.name }}
+                </slot>
+            </div>
             <el-breadcrumb separator="/">
                 <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
                 <el-breadcrumb-item v-for="(item, index) in showMenus" :key="index" :to="{ path: item.path }">

+ 14 - 2
src/main/vue/src/components/SysMenu.vue

@@ -1,11 +1,11 @@
 <template>
     <el-menu-item v-if="isLeaf" :index="'' + menu.id" :route="{ path: menu.path }">
-        <i class="fa-fw " :class="menu.icon" v-if="menu.icon"></i>
+        <i class="menuIcon" :class="menu.icon" v-if="menu.icon"></i>
         <span slot="title">{{ menu.name }}</span>
     </el-menu-item>
     <el-submenu v-else :index="'' + menu.id">
         <template slot="title">
-            <i class="fa-fw" :class="menu.icon" v-if="menu.icon"></i>
+            <i class="menuIcon" :class="menu.icon" v-if="menu.icon"></i>
             <span slot="title">{{ menu.name }}</span>
         </template>
         <sys-menu v-for="item in menu.children" :menu="item" :key="item.id"></sys-menu>
@@ -35,3 +35,15 @@ export default {
     }
 };
 </script>
+<style lang="less" scoped>
+/deep/ .menuIcon {
+    font-size: 20px;
+    width: 20px;
+    color: #fff;
+    margin-right: 10px;
+
+    &.svg-inline--fa {
+        font-size: 18px;
+    }
+}
+</style>

+ 111 - 0
src/main/vue/src/components/domesticPatent/AddSupplierNo.vue

@@ -0,0 +1,111 @@
+<template>
+    <el-dialog title="添加供应商" :visible.sync="show" center width="600px">
+        <el-form
+            hide-required-asterisk
+            :model="form"
+            :rules="rules"
+            ref="form"
+            label-width="140px"
+            style="padding-right: 130px"
+        >
+            <el-form-item prop="supplierPartnerId" label="供应商">
+                <el-select v-model="form.supplierPartnerId" clearable filterable placeholder="请选择">
+                    <el-option
+                        v-for="item in supplierPartnerIdOptions"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                    >
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="supplierNo" label="供应商案号">
+                <el-input v-model="form.supplierNo" placeholder="请输入"></el-input>
+            </el-form-item>
+            <el-form-item prop="supplierSubmitPeriod" label="指定提交期限">
+                <el-date-picker
+                    v-model="form.supplierSubmitPeriod"
+                    type="date"
+                    value-format="yyyy-MM-dd"
+                    placeholder="选择日期"
+                >
+                </el-date-picker>
+            </el-form-item>
+
+            <el-form-item>
+                <el-button style="width: 150px" size="normal" type="primary" @click="onSubmit">提交</el-button>
+                <el-button style="width: 120px" size="normal" @click="show = false">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </el-dialog>
+</template>
+
+<script>
+import logoPatent from '@/mixins/logoPatent';
+export default {
+    mixins: [logoPatent],
+    props: {
+        info: {}
+    },
+    data() {
+        return {
+            form: {},
+            show: false,
+            rules: {
+                supplierPartnerId: { required: true, message: '请选择供应商', trigger: 'change' },
+                supplierNo: { required: true, message: '请输入供应商案号', trigger: 'blur' },
+                supplierSubmitPeriod: { required: true, message: '请选择制定提交期限', trigger: 'change' }
+            },
+            supplierPartnerIdOptions: []
+        };
+    },
+    created() {
+        this.$http
+            .post('/partner/all', { size: 1000, query: { del: false, type: 'SUPPLIER' } }, { body: 'json' })
+            .then(res => {
+                if (res.content.length > 0) {
+                    this.supplierPartnerIdOptions = res.content.map(item => {
+                        return {
+                            label: item.name,
+                            value: item.id
+                        };
+                    });
+                }
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
+    },
+    methods: {
+        onSubmit() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let info = { ...this.info };
+            info.supplierPartnerId = this.form.supplierPartnerId;
+            info.supplierNo = this.form.supplierNo;
+            info.supplierSubmitPeriod = this.form.supplierSubmitPeriod;
+
+            info.workflow = 'SUPPLIER_MATERIALS';
+
+            this.$emit('submit', info);
+            this.show = false;
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.el-select {
+    width: 100%;
+}
+.el-date-editor.el-input {
+    width: 100%;
+}
+</style>

+ 110 - 0
src/main/vue/src/components/domesticPatent/BackSupplier.vue

@@ -0,0 +1,110 @@
+<template>
+    <el-dialog title="上传供应商反馈文件" :visible.sync="show" center width="600px">
+        <el-form
+            hide-required-asterisk
+            :model="form"
+            :rules="rules"
+            ref="form"
+            label-width="140px"
+            style="padding-right: 130px"
+        >
+            <el-form-item label="专利提交稿" prop="attachment1">
+                <attachment-upload
+                    v-model="form.attachment1"
+                    :fileSize.sync="form.attachment1.size"
+                ></attachment-upload>
+            </el-form-item>
+
+            <el-form-item label="电子申请回执" prop="attachment2">
+                <attachment-upload
+                    v-model="form.attachment2"
+                    :fileSize.sync="form.attachment2.size"
+                ></attachment-upload>
+            </el-form-item>
+            <el-form-item prop="attachment3" label="供应商请款单">
+                <attachment-upload
+                    v-model="form.attachment3"
+                    :fileSize.sync="form.attachment3.size"
+                ></attachment-upload>
+            </el-form-item>
+
+            <el-form-item>
+                <el-button style="width: 150px" size="normal" type="primary" @click="onSubmit">提交</el-button>
+                <el-button style="width: 120px" size="normal" @click="show = false">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </el-dialog>
+</template>
+
+<script>
+import logoPatent from '@/mixins/logoPatent';
+export default {
+    mixins: [logoPatent],
+    props: {
+        info: {}
+    },
+    data() {
+        return {
+            form: {
+                attachment1: { attachmentName: '专利提交稿', fileName: '', url: '', remark: '', size: '' },
+                attachment2: { attachmentName: '电子申请回执', fileName: '', url: '', remark: '', size: '' },
+                attachment3: { attachmentName: '供应商请款单', fileName: '', url: '', remark: '', size: '' }
+            },
+            show: false,
+            rules: {
+                attachment1: {
+                    validator: (rule, value, callback) => {
+                        if (!value.url) {
+                            callback(new Error('请上传专利提交稿'));
+                        } else {
+                            callback();
+                        }
+                    },
+                    trigger: 'change'
+                },
+                attachment2: {
+                    validator: (rule, value, callback) => {
+                        if (!value.url) {
+                            callback(new Error('请上传电子申请回执'));
+                        } else {
+                            callback();
+                        }
+                    },
+                    trigger: 'change'
+                },
+                attachment3: {
+                    validator: (rule, value, callback) => {
+                        if (!value.url) {
+                            callback(new Error('请上传供应商请款单'));
+                        } else {
+                            callback();
+                        }
+                    },
+                    trigger: 'change'
+                }
+            }
+        };
+    },
+    methods: {
+        onSubmit() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let info = { ...this.info };
+
+            this.$emit('uploadAttement', this.form.attachment1);
+            this.$emit('uploadAttement', this.form.attachment2);
+            this.$emit('uploadAttement', this.form.attachment3);
+            info.workflow = 'MAINTAIN_CASE';
+            this.$emit('submit', info);
+            this.show = false;
+        }
+    }
+};
+</script>

+ 326 - 0
src/main/vue/src/components/domesticPatent/BaseInfo.vue

@@ -0,0 +1,326 @@
+<template>
+    <div class="edit-view__content-wrapper">
+        <div class="edit-view__content-section" :class="{ bottomPad: otherShow }">
+            <divider collapse :showMore.sync="baseShow" />
+            <el-form
+                :model="formData"
+                :rules="rules"
+                ref="form"
+                label-width="200px"
+                label-position="right"
+                size="small"
+                style="width: 100%"
+                inline
+                center
+            >
+                <div class="base-item" v-show="baseShow">
+                    <el-form-item prop="name" label="专利名称">
+                        <el-input v-model="formData.name" style="width: 600px" @change="submit"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="applyStatus" label="案件状态">
+                        <el-select v-model="formData.applyStatus" disabled 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" disabledÎ></el-input>
+                    </el-form-item>
+                    <el-form-item prop="clientPartnerId" label="客户">
+                        <el-select
+                            style="width: 200px"
+                            v-model="formData.clientPartnerId"
+                            clearable
+                            filterable
+                            placeholder="请选择"
+                        >
+                            <el-option
+                                v-for="item in clientPartnerIdOptions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+
+                    <el-form-item prop="supplierNo" label="供应商案号">
+                        <el-input v-model="formData.supplierNo"></el-input>
+                    </el-form-item>
+
+                    <el-form-item prop="supplierPartnerId" label="供应商">
+                        <el-select
+                            style="width: 200px"
+                            v-model="formData.supplierPartnerId"
+                            clearable
+                            filterable
+                            placeholder="请选择"
+                        >
+                            <el-option
+                                v-for="item in supplierPartnerIdOptions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </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 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="officialPeriod" label="官方期限">
+                        <el-date-picker
+                            v-model="formData.officialPeriod"
+                            type="date"
+                            value-format="yyyy-MM-dd"
+                            placeholder="选择日期"
+                        >
+                        </el-date-picker>
+                    </el-form-item>
+                </div>
+
+                <divider collapse topLine :showMore.sync="personShow">申请人及发明人 </divider>
+                <div class="base-item" v-show="personShow">
+                    <el-form-item prop="applicantName" label="申请人名称">
+                        <el-input v-model="formData.applicantName" placeholder="请输入"></el-input>
+                    </el-form-item>
+
+                    <el-form-item prop="applicantUscc" label="申请人统一社会信用代码">
+                        <el-input v-model="formData.applicantUscc" placeholder="请输入"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="applicantAddress" label="申请人地址">
+                        <el-input
+                            style="width: 600px"
+                            placeholder="请输入"
+                            v-model="formData.applicantAddress"
+                        ></el-input>
+                    </el-form-item>
+                    <el-form-item prop="inventorName" label="发明人姓名">
+                        <el-input v-model="formData.inventorName" placeholder="请输入"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="inventorIdno" label="第一发明人身份证号码">
+                        <el-input v-model="formData.inventorIdno" placeholder="请输入"></el-input>
+                    </el-form-item>
+                </div>
+                <divider collapse topLine :showMore.sync="otherShow">其他信息 </divider>
+                <div class="base-item" v-show="otherShow">
+                    <el-form-item prop="deduction" label="是否请求费减">
+                        <el-select v-model="formData.deduction">
+                            <el-option
+                                v-for="(item, index) in boolOptions"
+                                :key="index"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item prop="essentialReview" label="是否请求实质审查">
+                        <el-select v-model="formData.essentialReview">
+                            <el-option
+                                v-for="(item, index) in boolOptions"
+                                :key="index"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+
+                    <el-form-item prop="publicInAdvance" label="是否申请提前公开">
+                        <el-select v-model="formData.publicInAdvance">
+                            <el-option
+                                v-for="(item, index) in boolOptions"
+                                :key="index"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+
+                    <el-form-item prop="chapterAcceptanceNotice" label="是否申请红章受理通知书">
+                        <el-select v-model="formData.chapterAcceptanceNotice">
+                            <el-option
+                                v-for="(item, index) in boolOptions"
+                                :key="index"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+
+                    <el-form-item prop="chapterPaymentNotice" label="是否申请红章缴费通知书">
+                        <el-select v-model="formData.chapterPaymentNotice">
+                            <el-option
+                                v-for="(item, index) in boolOptions"
+                                :key="index"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                </div>
+            </el-form>
+        </div>
+    </div>
+</template>
+<script>
+import domesticPatent from '@/mixins/domesticPatent';
+
+export default {
+    name: 'DomesticPatentEdit',
+    mixins: [domesticPatent],
+    created() {
+        this.$http
+            .post('/partner/all', { size: 1000, query: { del: false } }, { body: 'json' })
+            .then(res => {
+                if (res.content.length > 0) {
+                    this.clientPartnerIdOptions = res.content
+                        .filter(item => {
+                            return item.type === 'CLIENT';
+                        })
+                        .map(item => {
+                            return {
+                                label: item.name,
+                                value: item.id
+                            };
+                        });
+                    this.supplierPartnerIdOptions = res.content
+                        .filter(item => {
+                            return item.type === 'SUPPLIER';
+                        })
+                        .map(item => {
+                            return {
+                                label: item.name,
+                                value: item.id
+                            };
+                        });
+                }
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
+    },
+    props: {
+        info: {
+            type: Object,
+            default: () => {
+                return {};
+            }
+        }
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {},
+            clientPartnerIdOptions: [],
+            supplierPartnerIdOptions: [],
+            personShow: true,
+            baseShow: true,
+            otherShow: true,
+            boolOptions: [
+                {
+                    label: '是',
+                    value: true
+                },
+                {
+                    label: '否',
+                    value: false
+                }
+            ]
+        };
+    },
+    methods: {
+        init() {
+            this.formData = { ...this.info };
+        },
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+
+            this.$emit('submit', data);
+        },
+        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>
+.base-item {
+    width: 800px;
+    padding-right: 200px;
+    margin: 0 auto;
+}
+
+.edit-view .edit-view__content-wrapper .edit-view__content-section {
+    padding-bottom: 0px;
+    &.bottomPad {
+        padding-bottom: 20px;
+    }
+}
+</style>

+ 75 - 0
src/main/vue/src/components/domesticPatent/MaintainCase.vue

@@ -0,0 +1,75 @@
+<template>
+    <el-dialog title="维护案件信息" :visible.sync="show" center width="600px">
+        <el-form
+            hide-required-asterisk
+            :model="form"
+            :rules="rules"
+            ref="form"
+            label-width="140px"
+            style="padding-right: 130px"
+        >
+            <el-form-item prop="applyNo" label="国内专利申请号">
+                <el-input v-model="form.applyNo" placeholder="请输入"></el-input>
+            </el-form-item>
+            <el-form-item prop="applyDate" label="国内专利申请日">
+                <el-date-picker v-model="form.applyDate" type="date" value-format="yyyy-MM-dd" placeholder="选择日期">
+                </el-date-picker>
+            </el-form-item>
+
+            <el-form-item>
+                <el-button style="width: 150px" size="normal" type="primary" @click="onSubmit">提交</el-button>
+                <el-button style="width: 120px" size="normal" @click="show = false">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </el-dialog>
+</template>
+
+<script>
+import logoPatent from '@/mixins/logoPatent';
+export default {
+    mixins: [logoPatent],
+    props: {
+        info: {}
+    },
+    data() {
+        return {
+            form: {},
+            show: false,
+            rules: {
+                applyNo: { required: true, message: '请输入国内专利申请号', trigger: 'blur' },
+                applyDate: { required: true, message: '请选择国内专利申请日', trigger: 'change' }
+            },
+            supplierPartnerIdOptions: []
+        };
+    },
+    methods: {
+        onSubmit() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let info = { ...this.info };
+            info.applyNo = this.form.applyNo;
+            info.applyDate = this.form.applyDate;
+
+            info.workflow = 'REPLY_TO_NOTICE';
+
+            this.$emit('submit', info);
+            this.show = false;
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.el-select {
+    width: 100%;
+}
+.el-date-editor.el-input {
+    width: 100%;
+}
+</style>

+ 97 - 0
src/main/vue/src/components/domesticPatent/Register.vue

@@ -0,0 +1,97 @@
+<template>
+    <el-dialog title="补充办登信息" :visible.sync="show" center width="600px">
+        <el-form
+            hide-required-asterisk
+            :model="form"
+            :rules="rules"
+            ref="form"
+            label-width="140px"
+            style="padding-right: 130px"
+        >
+            <el-form-item prop="registerNotice" label="授权办登通知日">
+                <el-date-picker
+                    v-model="form.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="form.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="form.feeRemark"></el-input>
+            </el-form-item>
+            <el-form-item label="登记通知书" prop="attachment1">
+                <attachment-upload
+                    v-model="form.attachment1"
+                    :fileSize.sync="form.attachment1.size"
+                ></attachment-upload>
+            </el-form-item>
+
+            <el-form-item>
+                <el-button style="width: 150px" size="normal" type="primary" @click="onSubmit">提交</el-button>
+                <el-button style="width: 120px" size="normal" @click="show = false">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </el-dialog>
+</template>
+
+<script>
+import logoPatent from '@/mixins/logoPatent';
+export default {
+    mixins: [logoPatent],
+    props: {
+        info: {}
+    },
+    data() {
+        return {
+            form: {
+                attachment1: { attachmentName: '登记通知书', fileName: '', url: '', remark: '', size: '' }
+            },
+            show: false,
+            rules: {
+                attachment1: {
+                    validator: (rule, value, callback) => {
+                        if (!value.url) {
+                            callback(new Error('请上传登记通知书'));
+                        } else {
+                            callback();
+                        }
+                    },
+                    trigger: 'change'
+                },
+                registerNotice: { required: true, message: '请选择授权办登通知日', trigger: 'change' },
+                registerEndDate: { required: true, message: '请选择办登截止日期', trigger: 'change' },
+                feeRemark: { required: true, message: '请输入费用备注', trigger: 'blur' }
+            }
+        };
+    },
+    methods: {
+        onSubmit() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let info = { ...this.info };
+            this.$emit('uploadAttement', this.form.attachment1);
+            info.workflow = 'REPLY_RESULT';
+            this.$emit('submit', info);
+            this.show = false;
+        }
+    }
+};
+</script>

+ 103 - 0
src/main/vue/src/components/domesticPatent/Reply.vue

@@ -0,0 +1,103 @@
+<template>
+    <el-dialog title="上传答复通知" :visible.sync="show" center width="600px">
+        <el-form
+            hide-required-asterisk
+            :model="form"
+            :rules="rules"
+            ref="form"
+            label-width="140px"
+            style="padding-right: 130px"
+        >
+            <el-form-item prop="officialPeriod" label="官方期限">
+                <el-date-picker
+                    v-model="form.officialPeriod"
+                    type="date"
+                    value-format="yyyy-MM-dd"
+                    placeholder="选择日期"
+                >
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item prop="submitPeriod" label="内部期限">
+                <el-date-picker
+                    v-model="form.submitPeriod"
+                    type="date"
+                    value-format="yyyy-MM-dd"
+                    placeholder="选择日期"
+                >
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item label="通知书官文" prop="attachment1">
+                <attachment-upload
+                    v-model="form.attachment1"
+                    :fileSize.sync="form.attachment1.size"
+                ></attachment-upload>
+            </el-form-item>
+
+            <el-form-item>
+                <el-button style="width: 150px" size="normal" type="primary" @click="onSubmit">提交</el-button>
+                <el-button style="width: 120px" size="normal" @click="show = false">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </el-dialog>
+</template>
+
+<script>
+import logoPatent from '@/mixins/logoPatent';
+export default {
+    mixins: [logoPatent],
+    props: {
+        info: {}
+    },
+    data() {
+        return {
+            form: {
+                attachment1: { attachmentName: '通知书官文', fileName: '', url: '', remark: '', size: '' }
+            },
+            show: false,
+            rules: {
+                attachment1: {
+                    validator: (rule, value, callback) => {
+                        if (!value.url) {
+                            callback(new Error('请上传通知书官文'));
+                        } else {
+                            callback();
+                        }
+                    },
+                    trigger: 'change'
+                },
+                officialPeriod: { required: true, message: '请选择官方期限', trigger: 'change' },
+                submitPeriod: { required: true, message: '请选择内部期限', trigger: 'change' }
+            }
+        };
+    },
+    methods: {
+        onSubmit() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let info = { ...this.info };
+
+            this.$emit('uploadAttement', this.form.attachment1);
+            info.officialPeriod = this.form.officialPeriod;
+            info.submitPeriod = this.form.submitPeriod;
+            info.workflow = 'PENDING_REVIEW';
+            this.$emit('submit', info);
+            this.show = false;
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.el-select {
+    width: 100%;
+}
+.el-date-editor.el-input {
+    width: 100%;
+}
+</style>

+ 86 - 0
src/main/vue/src/components/domesticPatent/ReplyBack.vue

@@ -0,0 +1,86 @@
+<template>
+    <el-dialog title="确定答复意向" :visible.sync="show" center width="600px">
+        <el-form
+            hide-required-asterisk
+            :model="form"
+            :rules="rules"
+            ref="form"
+            label-width="140px"
+            style="padding-right: 130px"
+        >
+            <el-form-item label="是否决定答复" prop="decideReply">
+                <el-radio-group v-model="form.decideReply">
+                    <el-radio :label="true"> 是 </el-radio>
+                    <el-radio :label="false"> 否 </el-radio>
+                </el-radio-group>
+                <div class="el-form-tips" v-if="!form.decideReply">注:放弃答复后,案件立即终止,请谨慎操作</div>
+            </el-form-item>
+            <el-form-item label="准备答复意见" prop="isClientReady" v-if="form.decideReply">
+                <el-radio-group v-model="form.isClientReady">
+                    <el-radio :label="true"> 客户准备 </el-radio>
+                    <el-radio :label="false"> 律师准备 </el-radio>
+                </el-radio-group>
+            </el-form-item>
+
+            <el-form-item>
+                <el-button style="width: 150px" size="normal" type="primary" @click="onSubmit">提交</el-button>
+                <el-button style="width: 120px" size="normal" @click="show = false">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </el-dialog>
+</template>
+
+<script>
+import logoPatent from '@/mixins/logoPatent';
+export default {
+    mixins: [logoPatent],
+    props: {
+        info: {}
+    },
+    data() {
+        return {
+            form: {
+                decideReply: true
+            },
+            show: false,
+            rules: {
+                isClientReady: { required: true, message: '请选择准备答复意见', trigger: 'change' }
+            }
+        };
+    },
+    methods: {
+        onSubmit() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let info = { ...this.info };
+
+            info.decideReply = this.form.decideReply;
+
+            if (info.decideReply) {
+                info.isClientReady = this.form.isClientReady;
+                info.workflow = 'REPLY_SUBMISSIONS';
+            } else {
+                info.workflow = 'NO_REPLY';
+            }
+
+            this.$emit('submit', info);
+            this.show = false;
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.el-form-tips {
+    font-size: 12px;
+    color: #d75e41;
+    line-height: 17px;
+    margin-top: 18px;
+}
+</style>

+ 79 - 0
src/main/vue/src/components/domesticPatent/ReplyResult.vue

@@ -0,0 +1,79 @@
+<template>
+    <el-dialog title="确定答复结果" :visible.sync="show" center width="600px">
+        <el-form
+            hide-required-asterisk
+            :model="form"
+            :rules="rules"
+            ref="form"
+            label-width="140px"
+            style="padding-right: 130px"
+        >
+            <el-form-item label="是否通过答复" prop="replyPassed">
+                <el-radio-group v-model="form.replyPassed">
+                    <el-radio :label="true"> 是 </el-radio>
+                    <el-radio :label="false"> 否 </el-radio>
+                </el-radio-group>
+                <div class="el-form-tips" v-if="!form.replyPassed">
+                    注:选择没有通过则需要重新进行答复补正,请谨慎操作
+                </div>
+            </el-form-item>
+
+            <el-form-item>
+                <el-button style="width: 150px" size="normal" type="primary" @click="onSubmit">提交</el-button>
+                <el-button style="width: 120px" size="normal" @click="show = false">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </el-dialog>
+</template>
+
+<script>
+import logoPatent from '@/mixins/logoPatent';
+export default {
+    mixins: [logoPatent],
+    props: {
+        info: {}
+    },
+    data() {
+        return {
+            form: {
+                replyPassed: true
+            },
+            show: false
+        };
+    },
+    methods: {
+        onSubmit() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let info = { ...this.info };
+
+            info.replyPassed = this.form.replyPassed;
+
+            if (info.replyPassed) {
+                info.workflow = 'PENDING_REGISTER';
+            } else {
+                info.workflow = 'REPLY_TO_NOTICE';
+                //否回答复通知
+            }
+
+            this.$emit('submit', info);
+            this.show = false;
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.el-form-tips {
+    font-size: 12px;
+    color: #d75e41;
+    line-height: 17px;
+    margin-top: 18px;
+}
+</style>

+ 72 - 0
src/main/vue/src/components/domesticPatent/replySubmissions.vue

@@ -0,0 +1,72 @@
+<template>
+    <el-dialog title="上传答复意见书" :visible.sync="show" center width="600px">
+        <el-form
+            hide-required-asterisk
+            :model="form"
+            :rules="rules"
+            ref="form"
+            label-width="140px"
+            style="padding-right: 130px"
+        >
+            <el-form-item label="答复意见书" prop="attachment1">
+                <attachment-upload
+                    v-model="form.attachment1"
+                    :fileSize.sync="form.attachment1.size"
+                ></attachment-upload>
+            </el-form-item>
+
+            <el-form-item>
+                <el-button style="width: 150px" size="normal" type="primary" @click="onSubmit">提交</el-button>
+                <el-button style="width: 120px" size="normal" @click="show = false">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </el-dialog>
+</template>
+
+<script>
+import logoPatent from '@/mixins/logoPatent';
+export default {
+    mixins: [logoPatent],
+    props: {
+        info: {}
+    },
+    data() {
+        return {
+            form: {
+                attachment1: { attachmentName: '答复意见书', fileName: '', url: '', remark: '', size: '' }
+            },
+            show: false,
+            rules: {
+                attachment1: {
+                    validator: (rule, value, callback) => {
+                        if (!value.url) {
+                            callback(new Error('请上传答复意见书'));
+                        } else {
+                            callback();
+                        }
+                    },
+                    trigger: 'change'
+                }
+            }
+        };
+    },
+    methods: {
+        onSubmit() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let info = { ...this.info };
+            this.$emit('uploadAttement', this.form.attachment1);
+            info.workflow = 'REPLY_RESULT';
+            this.$emit('submit', info);
+            this.show = false;
+        }
+    }
+};
+</script>

+ 141 - 0
src/main/vue/src/components/fee/BackBill.vue

@@ -0,0 +1,141 @@
+<template>
+    <el-dialog title="发票回传" :visible.sync="show" center width="600px">
+        <el-form
+            hide-required-asterisk
+            :model="form"
+            :rules="rules"
+            ref="form"
+            label-width="140px"
+            style="padding-right: 130px;"
+            class="fee"
+        >
+            <el-form-item prop="invoiceReturn" label="是否有发票回传">
+                <el-radio-group v-model="form.invoiceReturn">
+                    <el-radio :label="true">
+                        是
+                    </el-radio>
+                    <el-radio :label="false">
+                        否
+                    </el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="发票图片" prop="invoice" v-if="form.invoiceReturn">
+                <attachment-upload v-model="form.invoice"></attachment-upload>
+            </el-form-item>
+
+            <el-form-item>
+                <el-button style="width: 150px;" size="normal" type="primary" @click="onSave">提交</el-button>
+                <el-button style="width: 120px;" size="normal" @click="show = false">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </el-dialog>
+</template>
+<script>
+export default {
+    name: 'FeeEdit',
+    props: {
+        info: {
+            type: Object,
+            default: () => {
+                return {};
+            }
+        }
+    },
+    created() {},
+    data() {
+        return {
+            show: false,
+            saving: false,
+            form: {
+                invoice: { fileName: '', url: '', remark: '', size: '' }
+            },
+            rules: {
+                invoiceReturn: { required: true, message: '请选择是否回传发票', trigger: 'change' },
+                invoice: {
+                    validator: (rule, value, callback) => {
+                        if (!value.url) {
+                            callback(new Error('请上传发票图片'));
+                        } else {
+                            callback();
+                        }
+                    },
+                    trigger: 'change'
+                }
+            },
+            feeMaintenanceIdOptions: [],
+            statusOptions: [
+                { label: '已支付', value: 'PAID' },
+                { label: '未支付', value: 'UNPAID' }
+            ],
+            patentPartnerIdOptions: [],
+            payPartnerIdOptions: [],
+            currencyMaintenanceIdOptions: []
+        };
+    },
+    computed: {
+        feeList() {
+            if (this.form.feeType) {
+                let feeType = [...this.feeMaintenanceIdOptions].find(item => {
+                    return item.value === this.form.feeType;
+                }) || { children: [] };
+                console.log(feeType);
+                console.log([...this.feeMaintenanceIdOptions]);
+                return feeType.children.map(item => {
+                    return {
+                        label: item.name,
+                        value: item.name
+                    };
+                });
+            } else {
+                return [];
+            }
+        }
+    },
+    methods: {
+        init() {
+            this.$nextTick(() => {
+                this.form = {
+                    ...this.info,
+                    invoice: { fileName: '', url: '', remark: '', size: '' },
+                    invoiceReturn: true
+                };
+                this.show = true;
+            });
+        },
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.form };
+            delete data.invoice;
+            data.invoiceImg = this.form.invoice.url;
+            data.invoiceRemark = this.form.invoice.remark;
+            this.saving = true;
+            this.$http
+                .post('/fee/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('成功');
+                    this.$emit('refreash');
+                    this.show = false;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        }
+    }
+};
+</script>
+<style lang="less">
+.fee.el-form .el-select {
+    width: 100%;
+}
+</style>

+ 43 - 15
src/main/vue/src/components/fee/FeeAdd.vue

@@ -87,11 +87,11 @@
                 >
                 </el-date-picker>
             </el-form-item>
-            <el-form-item prop="remark" label="账单">
-                <el-input v-model="form.remark"></el-input>
+            <el-form-item prop="bill" label="账单">
+                <el-input v-model="form.bill"></el-input>
             </el-form-item>
-            <el-form-item label="账单图片" prop="bill">
-                <attachment-upload v-model="form.bill"></attachment-upload>
+            <el-form-item label="账单图片" prop="billInfo">
+                <attachment-upload v-model="form.billInfo"></attachment-upload>
             </el-form-item>
 
             <el-form-item>
@@ -105,7 +105,7 @@
 export default {
     name: 'FeeEdit',
     props: {
-        logoPatentInfo: {
+        info: {
             type: Object,
             default: () => {
                 return {};
@@ -171,12 +171,37 @@ export default {
             show: false,
             saving: false,
             form: {
-                bill: { fileName: '', url: '', remark: '', size: '' },
-                currencyMaintenanceId: '人民币',
+                billInfo: { fileName: '', url: '', remark: '', size: '' },
+                currencyMaintenanceId: 35,
                 patentPartnerId: '',
                 payPartnerId: ''
             },
-            rules: {},
+            rules: {
+                feeName: {
+                    validator: (rule, value, callback) => {
+                        if (!value) {
+                            callback(new Error('请选择费用名称'));
+                        } else {
+                            callback();
+                        }
+                    },
+                    trigger: 'change'
+                },
+                payPartnerId: { required: true, message: '请选择支付对象', trigger: 'blur' },
+                amount: { required: true, message: '请输入支付金额', trigger: 'blur' },
+                paymentDeadline: { required: true, message: '请选择支付期限', trigger: 'blur' },
+                bill: { required: true, message: '请输入账单', trigger: 'blur' },
+                billInfo: {
+                    validator: (rule, value, callback) => {
+                        if (!value.url) {
+                            callback(new Error('请上传账单图片'));
+                        } else {
+                            callback();
+                        }
+                    },
+                    trigger: 'change'
+                }
+            },
             feeMaintenanceIdOptions: [],
             statusOptions: [
                 { label: '已支付', value: 'PAID' },
@@ -210,8 +235,8 @@ export default {
         init() {
             if (this.isLogoPatent) {
                 this.$nextTick(() => {
-                    this.form.patentPartnerId = this.logoPatentInfo.clientPartnerId;
-                    this.form.payPartnerId = this.logoPatentInfo.supplierPartnerId;
+                    this.form.patentPartnerId = this.info.clientPartnerId;
+                    this.form.payPartnerId = this.info.supplierPartnerId;
                     this.show = true;
                 });
             }
@@ -227,17 +252,20 @@ export default {
         },
         submit() {
             let data = { ...this.form };
-            delete data.bill;
-            data.billImg = this.form.bill.url;
-            data.billRemark = this.form.bill.remark;
-
+            delete data.billInfo;
+            data.billImg = this.form.billInfo.url;
+            data.billRemark = this.form.billInfo.remark;
+            data.status = 'UNPAID';
+            data.userId = this.$store.state.userInfo.id;
+            data.patentId = this.info.patentId || this.info.id;
             this.saving = true;
             this.$http
                 .post('/fee/save', data, { body: 'json' })
                 .then(res => {
                     this.saving = false;
                     this.$message.success('成功');
-                    this.$router.go(-1);
+                    this.$emit('refreash');
+                    this.show = false;
                 })
                 .catch(e => {
                     console.log(e);

+ 77 - 20
src/main/vue/src/components/fee/FeeList.vue

@@ -24,9 +24,9 @@
             <el-table-column prop="payPartnerId" label="支付对象" min-width="120px"> </el-table-column>
             <el-table-column prop="amount" label="金额" min-width="120px"> </el-table-column>
             <el-table-column prop="currencyMaintenanceId" label="币种" min-width="100px"> </el-table-column>
-            <el-table-column prop="paymentDeadline" label="支付期限" min-width="80px"> </el-table-column>
-            <el-table-column prop="remark" label="账单"> </el-table-column>
-            <el-table-column prop="billImg" label="账单图片">
+            <el-table-column prop="paymentDeadline" label="支付期限" min-width="100px"> </el-table-column>
+            <el-table-column prop="bill" label="账单" min-width="100px"> </el-table-column>
+            <el-table-column prop="billImg" label="账单图片" min-width="100px">
                 <template slot-scope="{ row }">
                     <el-image
                         style="width: 36px; height: 36px;"
@@ -36,39 +36,85 @@
                     ></el-image>
                 </template>
             </el-table-column>
-            <el-table-column prop="paymentDate" label="支付日期" min-width="80px">
+            <el-table-column prop="paymentDate" label="支付日期" min-width="100px">
                 <template slot-scope="{ row }">
                     <span v-if="row.status === 'UNPAID'" class="warning">未支付</span>
 
                     <span v-else>{{ row.paymentDate }}</span>
                 </template>
             </el-table-column>
-            <el-table-column prop="invoiceReturn" label="是否发票回传">
+            <el-table-column prop="paymentImg" label="付款图片" min-width="100px">
                 <template slot-scope="{ row }">
-                    <el-tag v-if="row.invoiceReturn" :type="row.invoiceReturn ? '' : 'info'">{{
-                        row.invoiceReturn
+                    <span v-if="row.status === 'UNPAID'" class="warning">未支付</span>
+
+                    <el-image
+                        v-else
+                        style="width: 36px; height: 36px;"
+                        :src="row.paymentImg"
+                        fit="cover"
+                        :preview-src-list="[row.paymentImg]"
+                    ></el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="invoiceReturn" label="是否发票回传" min-width="120px">
+                <template slot-scope="{ row }">
+                    <span v-if="!row.invoiceReturn && row.invoiceReturn !== false" class="warning">未操作</span>
+                    <el-tag v-else :type="row.invoiceReturn ? '' : 'info'">{{
+                        row.invoiceReturn ? '是' : '否'
                     }}</el-tag>
                 </template>
             </el-table-column>
+            <el-table-column prop="paymentImg" label="发票图片" min-width="100px">
+                <template slot-scope="{ row }">
+                    <span v-if="!row.invoiceReturn" class="warning">未回传</span>
+
+                    <el-image
+                        v-else
+                        style="width: 36px; height: 36px;"
+                        :src="row.invoiceImg"
+                        fit="cover"
+                        :preview-src-list="[row.invoiceImg]"
+                    ></el-image>
+                </template>
+            </el-table-column>
             <!-- <el-table-column prop="userId" label="userId"> </el-table-column> -->
             <el-table-column label="操作" align="center" fixed="right" min-width="150px">
-                <template>
-                    <el-button class="" type="primary" size="mini" plain>支付费用</el-button>
-                    <el-button type="danger" size="mini" plain>编辑</el-button>
+                <template slot-scope="{ row }">
+                    <div class="table-btn-list">
+                        <el-button v-if="row.status === 'UNPAID'" @click="payRow(row)" type="primary" size="mini" plain>
+                            支付费用
+                        </el-button>
+                        <el-button
+                            v-else-if="!row.invoiceReturn && row.invoiceReturn !== false"
+                            @click="returnRow(row)"
+                            type="primary"
+                            size="mini"
+                            plain
+                        >
+                            发票回传
+                        </el-button>
+                        <el-button type="danger" size="mini" plain>编辑</el-button>
+                    </div>
                 </template>
             </el-table-column>
         </el-table>
+
+        <pay ref="pay" @refreash="getData" :info="editPayInfo"></pay>
+
+        <back-bill ref="backBill" @refreash="getData" :info="editPayInfo"></back-bill>
     </div>
 </template>
 <script>
 import { mapState } from 'vuex';
 import pageableTable from '@/mixins/pageableTable';
+import Pay from './Pay.vue';
+import BackBill from './BackBill.vue';
 
 export default {
     name: 'FeeList',
     mixins: [pageableTable],
     props: {
-        logoPatentInfo: {
+        info: {
             type: Object,
             default: () => {
                 return {};
@@ -85,7 +131,8 @@ export default {
                 { label: '已支付', value: 'PAID' },
                 { label: '未支付', value: 'UNPAID' }
             ],
-            pageSize: 100
+            pageSize: 100,
+            editPayInfo: {}
         };
     },
     computed: {
@@ -112,7 +159,7 @@ export default {
         beforeGetData() {
             return {
                 query: {
-                    patentId: this.logoPatentInfo.id
+                    patentId: this.info.patentId || this.info.id
                 }
             };
         },
@@ -125,14 +172,16 @@ export default {
         addRow() {
             this.$refs.feeAdd.show = true;
         },
-        editRow(row) {
-            this.$router.push({
-                path: '/feeEdit',
-                query: {
-                    id: row.id
-                }
-            });
+        payRow(row) {
+            console.log(row);
+            this.editPayInfo = row;
+            this.$refs.pay.init();
         },
+        returnRow(row) {
+            this.editPayInfo = row;
+            this.$refs.backBill.init();
+        },
+        editRow(row) {},
         download() {
             this.downloading = true;
             this.$axios
@@ -181,6 +230,10 @@ export default {
                     }
                 });
         }
+    },
+    components: {
+        Pay,
+        BackBill
     }
 };
 </script>
@@ -189,4 +242,8 @@ export default {
     flex-grow: 1;
     padding: 20px 0;
 }
+.warning {
+    color: @prim;
+    font-size: 12px;
+}
 </style>

+ 142 - 0
src/main/vue/src/components/fee/Pay.vue

@@ -0,0 +1,142 @@
+<template>
+    <el-dialog title="支付费用" :visible.sync="show" center width="600px">
+        <el-form
+            hide-required-asterisk
+            :model="form"
+            :rules="rules"
+            ref="form"
+            label-width="140px"
+            style="padding-right: 130px;"
+            class="fee"
+        >
+            <el-form-item prop="paymentDate" label="支付日期">
+                <el-date-picker
+                    v-model="form.paymentDate"
+                    type="date"
+                    value-format="yyyy-MM-dd"
+                    placeholder="选择日期"
+                    style="width: 100%;"
+                >
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item prop="remark" label="备注">
+                <el-input v-model="form.remark"></el-input>
+            </el-form-item>
+            <el-form-item label="付款图片" prop="payment">
+                <attachment-upload v-model="form.payment"></attachment-upload>
+            </el-form-item>
+
+            <el-form-item>
+                <el-button style="width: 150px;" size="normal" type="primary" @click="onSave">提交</el-button>
+                <el-button style="width: 120px;" size="normal" @click="show = false">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </el-dialog>
+</template>
+<script>
+export default {
+    name: 'FeeEdit',
+    props: {
+        info: {
+            type: Object,
+            default: () => {
+                return {};
+            }
+        }
+    },
+    created() {},
+    data() {
+        return {
+            show: false,
+            saving: false,
+            form: {
+                payment: { fileName: '', url: '', remark: '', size: '' }
+            },
+            rules: {
+                paymentDate: { required: true, message: '请选择支付日期', trigger: 'blur' },
+                remark: { required: true, message: '请输入备注', trigger: 'blur' },
+                payment: {
+                    validator: (rule, value, callback) => {
+                        if (!value.url) {
+                            callback(new Error('请上传付款图片'));
+                        } else {
+                            callback();
+                        }
+                    },
+                    trigger: 'change'
+                }
+            },
+            feeMaintenanceIdOptions: [],
+            statusOptions: [
+                { label: '已支付', value: 'PAID' },
+                { label: '未支付', value: 'UNPAID' }
+            ],
+            patentPartnerIdOptions: [],
+            payPartnerIdOptions: [],
+            currencyMaintenanceIdOptions: []
+        };
+    },
+    computed: {
+        feeList() {
+            if (this.form.feeType) {
+                let feeType = [...this.feeMaintenanceIdOptions].find(item => {
+                    return item.value === this.form.feeType;
+                }) || { children: [] };
+                console.log(feeType);
+                console.log([...this.feeMaintenanceIdOptions]);
+                return feeType.children.map(item => {
+                    return {
+                        label: item.name,
+                        value: item.name
+                    };
+                });
+            } else {
+                return [];
+            }
+        }
+    },
+    methods: {
+        init() {
+            this.$nextTick(() => {
+                this.form = { ...this.info, payment: { fileName: '', url: '', remark: '', size: '' } };
+                this.show = true;
+            });
+        },
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.form };
+            delete data.payment;
+            data.paymentImg = this.form.payment.url;
+            data.paymentRemark = this.form.payment.remark;
+            data.status = 'PAID';
+            this.saving = true;
+            this.$http
+                .post('/fee/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('成功');
+                    this.$emit('refreash');
+                    this.show = false;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        }
+    }
+};
+</script>
+<style lang="less">
+.fee.el-form .el-select {
+    width: 100%;
+}
+</style>

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

@@ -1,5 +1,5 @@
 <template>
-    <el-dialog title="缴费信息" :visible.sync="show" center width="600px">
+    <el-dialog title="确定答复意向" :visible.sync="show" center width="600px">
         <el-form
             hide-required-asterisk
             :model="form"

+ 101 - 0
src/main/vue/src/mixins/domesticPatent.js

@@ -0,0 +1,101 @@
+export default {
+    data() {
+        return {
+            statusOptions: [
+                {
+                    label: '申请阶段',
+                    value: 'APPLY_STAGE',
+                    type: '',
+                    workflows: [
+                        { label: '待添加供应商', value: 'ADD_SUPPLIERS' },
+                        { label: '待提交供应商材料', value: 'SUPPLIER_MATERIALS' },
+                        { label: '待维护案件', value: 'MAINTAIN_CASE' },
+                        { label: '待上传答复通知', value: 'REPLY_TO_NOTICE' }
+                    ]
+                },
+                {
+                    label: '实审阶段',
+                    value: 'SUBSTANTIVE_STAGE',
+                    type: 'warning',
+                    workflows: [
+                        { label: '待审查', value: 'PENDING_REVIEW' },
+                        { label: '不答复终止', value: 'NO_REPLY' },
+                        { label: '上传答复意见书', value: 'REPLY_SUBMISSIONS' }
+                    ]
+                },
+                {
+                    label: '复审阶段',
+                    value: 'REVIEW_STAGE',
+                    type: 'warning',
+                    workflows: [{ label: '上传答复结果', value: 'REPLY_RESULT' }]
+                },
+                {
+                    label: '授权阶段',
+                    value: 'GRANT_STAGE',
+                    type: 'info',
+                    workflows: [
+                        { label: '待办登', value: 'PENDING_REGISTER' },
+                        { label: '补充办登信息', value: 'PAYMENT_REGISTER' },
+                        { label: '办理登记', value: 'REGISTER' },
+                        { label: '待维护年费信息', value: 'ANNUAL_FEE' }
+                    ]
+                },
+                {
+                    label: '已完成',
+                    value: 'COMPLETED',
+                    type: 'end',
+                    workflows: [{ label: '已完成', value: 'COMPLETED' }]
+                }
+            ],
+            workflowOptions: [
+                { label: '待添加供应商', value: 'ADD_SUPPLIERS' },
+                { label: '待提交供应商材料', value: 'SUPPLIER_MATERIALS' },
+                { label: '待维护案件', value: 'MAINTAIN_CASE' },
+                { label: '待上传答复通知', value: 'REPLY_TO_NOTICE' },
+                { label: '待审查', value: 'PENDING_REVIEW' },
+                { label: '不答复终止', value: 'NO_REPLY' },
+                { label: '上传答复意见书', value: 'REPLY_SUBMISSIONS' },
+                { label: '上传答复结果', value: 'REPLY_RESULT' },
+                { label: '待办登', value: 'PENDING_REGISTER' },
+                { label: '补充办登信息', value: 'PAYMENT_REGISTER' },
+                { label: '办理登记', value: 'REGISTER' },
+                { label: '待维护年费信息', value: 'ANNUAL_FEE' }
+            ],
+            typeOptions: [
+                { label: '发明专利', value: 'INVENTION' },
+                { label: '实用新型专利', value: 'UTILITY_MODEL' },
+                { label: '外观设计专利', value: 'APPEARANCE_DESIGN' }
+            ]
+        };
+    },
+    methods: {
+        applyStatusFormatter(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 '';
+        },
+        statusFormatter(row, column, cellValue, index) {
+            let selectedOption = this.statusOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        workflowFormatter(row, column, cellValue, index) {
+            let selectedOption = this.workflowOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        }
+    }
+};

+ 43 - 5
src/main/vue/src/mixins/logoPatent.js

@@ -2,10 +2,48 @@ export default {
     data() {
         return {
             applyStatusOptions: [
-                { label: '申请阶段', value: 'APPLY_STAGE' },
-                { label: '审查阶段', value: 'REVIEW_STAGE' },
-                { label: '授权阶段', value: 'GRANT_STAGE' },
-                { label: '已完成', value: 'COMPLETED' }
+                {
+                    label: '申请阶段',
+                    value: 'APPLY_STAGE',
+                    type: '',
+                    workflows: [
+                        { label: '是否决定签约', value: 'IS_CONTRACT' },
+                        { label: '待维护案件', value: 'TO_BE_MAINTAINED' }
+                    ]
+                },
+                {
+                    label: '审查阶段',
+                    value: 'REVIEW_STAGE',
+                    type: 'warning',
+                    workflows: [
+                        { label: '待受理', value: 'PENDING' },
+                        { label: '不签约终止', value: 'NOT_CONTRACT' }
+                    ]
+                },
+                {
+                    label: '授权阶段',
+                    value: 'GRANT_STAGE',
+                    type: 'info',
+                    workflows: [
+                        { label: '待缴费', value: 'PENDING_PAYMENT' },
+                        { label: '回文补正', value: 'PALINDROME_CORRECTION' },
+                        { label: '未缴费终止', value: 'UNPAID' },
+                        { label: '待审查', value: 'PENDING_REVIEW' },
+                        { label: '驳回处理', value: 'DISMISS' },
+                        { label: '待上传复审材料', value: 'REVIEW_MATERIALS' },
+                        { label: '不复审终止', value: 'NO_REVIEW' },
+                        { label: '复审缴费', value: 'REVIEW_PAYMENT' },
+                        { label: '复审审查', value: 'REVIEW' },
+                        { label: '公告初审', value: 'ANNOUNCEMENTS' },
+                        { label: '证件办理', value: 'HANDLE' }
+                    ]
+                },
+                {
+                    label: '已完成',
+                    value: 'COMPLETED',
+                    type: 'end',
+                    workflows: []
+                }
             ],
             logoWorkflowOptions: [
                 { label: '是否决定签约', value: 'IS_CONTRACT' },
@@ -62,7 +100,7 @@ export default {
             }
             return '';
         },
-        logoWorkflowFormatter(row, column, cellValue, index) {
+        workflowFormatter(row, column, cellValue, index) {
             let selectedOption = this.logoWorkflowOptions.find(i => i.value === cellValue);
             if (selectedOption) {
                 return selectedOption.label;

+ 1 - 1
src/main/vue/src/mixins/pageableTable.js

@@ -7,7 +7,7 @@ export default {
             totalElements: 0,
             tableData: [],
             sort: {},
-            sortStr: '',
+            sortStr: 'id,desc',
             tableHeight: 200,
             tableLoading: false
         };

+ 11 - 2
src/main/vue/src/router.js

@@ -172,7 +172,7 @@ const router = new Router({
                     name: 'logoPatentEdit',
                     component: () => import(/* webpackChunkName: "logoPatentEdit" */ '@/views/LogoPatentEdit.vue'),
                     meta: {
-                        title: '商标申请编辑'
+                        title: '商标详情'
                     }
                 },
                 {
@@ -237,7 +237,16 @@ const router = new Router({
                     component: () =>
                         import(/* webpackChunkName: "domesticPatentEdit" */ '@/views/DomesticPatentEdit.vue'),
                     meta: {
-                        title: '国内专利申请编辑'
+                        title: '专利详情'
+                    }
+                },
+                {
+                    path: '/domesticPatentAdd',
+                    name: 'DomesticPatentAdd',
+                    component: () =>
+                        import(/* webpackChunkName: "domesticPatentEdit" */ '@/views/DomesticPatentAdd.vue'),
+                    meta: {
+                        title: '新增国内申请专利'
                     }
                 },
                 {

+ 16 - 0
src/main/vue/src/styles/app.less

@@ -500,3 +500,19 @@ li {
         z-index: 20;
     }
 }
+
+.table-btn-list {
+    display: flex;
+    justify-content: flex-end;
+}
+
+.filters-left {
+    flex-grow: 1;
+    .filters-item + .filters-item {
+        margin-left: 10px;
+    }
+}
+.filters-container {
+    display: flex;
+    flex-direction: row-reverse;
+}

+ 21 - 12
src/main/vue/src/styles/element_theme/index.css

@@ -1842,7 +1842,7 @@
 }
 .el-radio-button:first-child .el-radio-button__inner {
     border-left: 1px solid #dcdfe6;
-    border-radius: 4px 0 0 4px;
+    border-radius: 0;
     -webkit-box-shadow: none !important;
     box-shadow: none !important;
 }
@@ -1872,11 +1872,11 @@
     background-color: #f2f6fc;
 }
 .el-radio-button:last-child .el-radio-button__inner {
-    border-radius: 0 4px 4px 0;
+    border-radius: 0;
 }
 .el-popover,
 .el-radio-button:first-child:last-child .el-radio-button__inner {
-    border-radius: 4px;
+    border-radius: 0px;
 }
 .el-radio-button--medium .el-radio-button__inner {
     padding: 10px 20px;
@@ -9522,17 +9522,17 @@
     border-left-color: #fff;
 }
 .el-tag {
-    background-color: #fbf7ec;
-    border-color: #f7eed9;
+    background-color: #369DD112;
+    border-color: #369DD112;
     display: inline-block;
     height: 32px;
     padding: 0 10px;
     line-height: 30px;
     font-size: 12px;
-    color: #d7ab41;
+    color: #369DD1;
     border-width: 1px;
     border-style: solid;
-    border-radius: 4px;
+    /* border-radius: 4px; */
     box-sizing: border-box;
     white-space: nowrap;
 }
@@ -9546,6 +9546,11 @@
     color: #fff;
     background-color: #d7ab41;
 }
+.el-tag.el-tag--end {
+    background-color: #8C7F6720;
+    border-color: #8C7F6720;
+    color: #8C7F67;
+}
 .el-tag.el-tag--info {
     background-color: #f4f4f5;
     border-color: #e9e9eb;
@@ -9577,9 +9582,9 @@
     background-color: #67c23a;
 }
 .el-tag.el-tag--warning {
-    background-color: #fdf6ec;
-    border-color: #faecd8;
-    color: #e6a23c;
+    background-color: #EE8F2420;
+    border-color: #EE8F2420;
+    color: #EE8F24;
 }
 .el-tag.el-tag--warning.is-hit {
     border-color: #e6a23c;
@@ -9781,9 +9786,13 @@
     transform: scale(0.8);
 }
 .el-tag--small {
-    height: 24px;
-    padding: 0 8px;
+    height: 22px;
+    padding: 0 4px;
     line-height: 22px;
+    font-size: 12px;
+    border-width: 0px;
+    min-width: 56px;
+    text-align: center;
 }
 .el-tag--small .el-icon-close {
     -webkit-transform: scale(0.8);

+ 229 - 0
src/main/vue/src/views/DomesticPatentAdd.vue

@@ -0,0 +1,229 @@
+<template>
+    <div class="edit-view">
+        <page-title> </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="width: 578px;"
+                    hide-required-asterisk
+                >
+                    <el-form-item prop="name" label="专利名称">
+                        <el-input style="width: 300px;" v-model="formData.name" placeholder="请输入"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="type" label="专利类型">
+                        <el-radio-group v-model="formData.type">
+                            <el-radio :label="item.value" v-for="(item, index) in typeOptions" :key="index">
+                                {{ item.label }}
+                            </el-radio>
+                        </el-radio-group>
+                    </el-form-item>
+                    <el-form-item prop="clientPartnerId" label="选择客户">
+                        <el-select
+                            style="width: 300px;"
+                            v-model="formData.clientPartnerId"
+                            clearable
+                            filterable
+                            placeholder="请选择"
+                        >
+                            <el-option
+                                v-for="item in clientPartnerIdOptions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item prop="applicantName" label="申请人名称">
+                        <el-input
+                            style="width: 300px;"
+                            v-model="formData.applicantName"
+                            placeholder="请输入中文名称"
+                        ></el-input>
+                    </el-form-item>
+                    <el-form-item prop="applicantAddress" label="申请人地址">
+                        <el-input
+                            style="width: 300px;"
+                            v-model="formData.applicantAddress"
+                            placeholder="请输入中文地址"
+                        ></el-input>
+                    </el-form-item>
+                    <el-form-item prop="applicantUscc" label="申请人统一社会信用代码">
+                        <el-input
+                            style="width: 300px;"
+                            v-model="formData.applicantUscc"
+                            placeholder="请输入"
+                        ></el-input>
+                    </el-form-item>
+                    <el-form-item prop="inventorName" label="发明人姓名">
+                        <el-input style="width: 300px;" v-model="formData.inventorName" placeholder="请输入"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="inventorIdno" label="第一发明人身份证号码">
+                        <el-input style="width: 300px;" v-model="formData.inventorIdno" placeholder="请输入"></el-input>
+                    </el-form-item>
+
+                    <el-form-item prop="deduction" label="是否请求费减">
+                        <el-radio-group v-model="formData.deduction">
+                            <el-radio :label="true">是</el-radio>
+                            <el-radio :label="false">否</el-radio>
+                        </el-radio-group>
+                    </el-form-item>
+                    <el-form-item prop="essentialReview" label="是否请求实质审查">
+                        <el-radio-group v-model="formData.essentialReview">
+                            <el-radio :label="true">是</el-radio>
+                            <el-radio :label="false">否</el-radio>
+                        </el-radio-group>
+                    </el-form-item>
+
+                    <el-form-item prop="publicInAdvance" label="是否申请提前公开">
+                        <el-radio-group v-model="formData.publicInAdvance">
+                            <el-radio :label="true">是</el-radio>
+                            <el-radio :label="false">否</el-radio>
+                        </el-radio-group>
+                    </el-form-item>
+                    <el-form-item prop="chapterAcceptanceNotice" label="是否申请红章受理通知书">
+                        <el-radio-group v-model="formData.chapterAcceptanceNotice">
+                            <el-radio :label="true">是</el-radio>
+                            <el-radio :label="false">否</el-radio>
+                        </el-radio-group>
+                    </el-form-item>
+                    <el-form-item prop="chapterPaymentNotice" label="是否申请红章缴费通知书">
+                        <el-radio-group v-model="formData.chapterPaymentNotice">
+                            <el-radio :label="true">是</el-radio>
+                            <el-radio :label="false">否</el-radio>
+                        </el-radio-group>
+                    </el-form-item>
+
+                    <el-form-item class="form-submit">
+                        <el-button @click="onSave" :loading="saving" size="default" type="primary">确认 </el-button>
+
+                        <el-button @click="$router.go(-1)" size="default">取消</el-button>
+                    </el-form-item>
+                </el-form>
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+import domesticPatent from '@/mixins/domesticPatent';
+import { format } from 'date-fns';
+export default {
+    name: 'DomesticPatentEdit',
+    mixins: [domesticPatent],
+    created() {
+        this.$http
+            .post('/partner/all', { size: 1000, query: { del: false, type: 'CLIENT' } }, { body: 'json' })
+            .then(res => {
+                if (res.content.length > 0) {
+                    res.content.forEach(item => {
+                        this.clientPartnerIdOptions.push({
+                            label: item.name,
+                            value: item.id
+                        });
+                    });
+                }
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {
+                deduction: false,
+                essentialReview: false,
+                publicInAdvance: false,
+                chapterAcceptanceNotice: false,
+                chapterPaymentNotice: false
+            },
+            rules: {
+                name: { required: true, message: '请输入专利名称', trigger: 'blur' },
+                type: { required: true, message: '请选择专利类型', trigger: 'change' },
+                clientPartnerId: { required: true, message: '请选择选择客户', trigger: 'change' },
+                applicantName: { required: true, message: '请输入申请人名称', trigger: 'blur' },
+                applicantAddress: { required: true, message: '请输入申请人地址', trigger: 'blur' },
+                applicantUscc: { required: true, message: '请输入申请人统一社会信用代码', trigger: 'blur' },
+                inventorName: { required: true, message: '请输入发明人姓名', trigger: 'blur' },
+                inventorIdno: { required: true, message: '请输入第一发明人身份证号码', trigger: 'blur' }
+            },
+            clientPartnerIdOptions: [],
+            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' }
+            ],
+            statusOptions: [
+                { label: '申请阶段', value: 'APPLY_STAGE' },
+                { label: '审查阶段', value: 'REVIEW_STAGE' },
+                { label: '授权阶段', value: 'GRANT_STAGE' },
+                { label: '已完成', value: 'COMPLETED' }
+            ],
+            typeOptions: [
+                { label: '发明专利', value: 'INVENTION' },
+                { label: '实用新型专利', value: 'UTILITY_MODEL' },
+                { label: '外观设计专利', value: 'APPEARANCE_DESIGN' }
+            ]
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+            data.applyDate = format(new Date(), 'yyyy-MM-dd');
+            data.workflow = 'ADD_SUPPLIERS';
+            this.saving = true;
+            this.$http
+                .post('/domesticPatent/saveDTO', 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>

+ 242 - 250
src/main/vue/src/views/DomesticPatentEdit.vue

@@ -1,241 +1,101 @@
 <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>
+            <template slot="title"> 专利详情:{{ formData.name }} </template>
         </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-switch v-model="formData.deduction"></el-switch>
-                    </el-form-item>
-                    <el-form-item prop="essentialReview" label="是否请求实质审查">
-                        <el-switch v-model="formData.essentialReview"></el-switch>
-                    </el-form-item>
-                    <el-form-item prop="publicInAdvance" label="是否申请提前公开">
-                        <el-switch v-model="formData.publicInAdvance"></el-switch>
-                    </el-form-item>
-                    <el-form-item prop="chapterAcceptanceNotice" label="是否申请红章受理通知书">
-                        <el-switch v-model="formData.chapterAcceptanceNotice"></el-switch>
-                    </el-form-item>
-                    <el-form-item prop="chapterPaymentNotice" label="是否申请红章缴费通知书">
-                        <el-switch v-model="formData.chapterPaymentNotice"></el-switch>
-                    </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-tabs class="edit-tabs" v-model="activeName" @tab-click="tabClick">
+            <div class="right-btns">
+                <!-- <el-button type="primary" size="small">新增答复</el-button> -->
+                <el-button type="primary" size="small" @click="$refs.feeAdd.init()">新增费用</el-button>
+                <el-button type="primary" size="small" @click="$refs.attachmentAdd.show = true">新增附件</el-button>
+                <!-- <el-button type="primary" size="small">分案/接续流程</el-button> -->
+            </div>
+            <div class="tips" v-if="nowStatus && formData.applyStatus !== 'COMPLETED'">
+                <div class="tips-text">
+                    <span class="name">当前流程节点</span>
+                    <span class="val">{{ nowStatus }}</span>
+                </div>
+
+                <div class="tips-text">
+                    <span class="name">处理人</span>
+                    <span class="val">{{ user }}</span>
+                </div>
 
-                    <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>
+                <div class="tips-text">
+                    <span class="name">处理截止日期</span>
+                    <span class="val">无</span>
+                </div>
 
-                    <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>
+                <el-button @click="action" type="text" size="small">立即处理</el-button>
             </div>
-        </div>
+            <el-tab-pane label="基本信息" name="first">
+                <base-info ref="base" :info.sync="formData" @submit="submit"></base-info>
+            </el-tab-pane>
+            <el-tab-pane label="附件列表" name="second">
+                <attachment-list ref="attachmentList" :info="formData"></attachment-list>
+            </el-tab-pane>
+            <el-tab-pane label="费用信息" name="third">
+                <fee-list ref="feeList" :info="formData"></fee-list>
+            </el-tab-pane>
+            <!-- <el-tab-pane label="流程信息" name="fourth"></el-tab-pane> -->
+        </el-tabs>
+        <attachment-add ref="attachmentAdd" :info="formData" @refreash="init"></attachment-add>
+        <fee-add ref="feeAdd" isLogoPatent :info="formData" @refreash="init"></fee-add>
+
+        <add-supplier-no
+            ref="addSupplierNo"
+            :info="formData"
+            @submit="submit"
+            @uploadAttement="uploadAttement"
+        ></add-supplier-no>
+        <back-supplier ref="backSupplier" :info="formData" @submit="submit" @uploadAttement="uploadAttement">
+        </back-supplier>
+        <maintain-case
+            ref="maintainCase"
+            :info="formData"
+            @submit="submit"
+            @uploadAttement="uploadAttement"
+        ></maintain-case>
+        <reply ref="reply" :info="formData" @submit="submit" @uploadAttement="uploadAttement"></reply>
+        <reply-back ref="replyBack" :info="formData" @submit="submit" @uploadAttement="uploadAttement"></reply-back>
+        <reply-submissions
+            ref="replySubmissions"
+            :info="formData"
+            @submit="submit"
+            @uploadAttement="uploadAttement"
+        ></reply-submissions>
+
+        <reply-result
+            ref="replyResult"
+            :info="formData"
+            @submit="submit"
+            @uploadAttement="uploadAttement"
+        ></reply-result>
+
+        <register ref="register" :info="formData" @submit="submit" @uploadAttement="uploadAttement"></register>
     </div>
 </template>
 <script>
+import BaseInfo from '../components/domesticPatent/BaseInfo.vue';
+import attachmentList from '../components/AttachmentList.vue';
+import domesticPatent from '@/mixins/domesticPatent';
+import AttachmentAdd from '../components/AttachmentAdd.vue';
+import FeeList from '../components/fee/FeeList.vue';
+import FeeAdd from '../components/fee/FeeAdd.vue';
+import AddSupplierNo from '../components/domesticPatent/AddSupplierNo.vue';
+import BackSupplier from '../components/domesticPatent/BackSupplier.vue';
+import MaintainCase from '../components/domesticPatent/MaintainCase.vue';
+import Reply from '../components/domesticPatent/Reply.vue';
+import ReplyBack from '../components/domesticPatent/ReplyBack.vue';
+import ReplySubmissions from '../components/domesticPatent/replySubmissions.vue';
+import ReplyResult from '../components/domesticPatent/ReplyResult.vue';
+import Register from '../components/domesticPatent/Register.vue';
 export default {
     name: 'DomesticPatentEdit',
+    mixins: [domesticPatent],
     created() {
         if (this.$route.query.id) {
-            this.$http
-                .get('domesticPatent/getDTO/' + this.$route.query.id)
-                .then(res => {
-                    this.formData = res;
-                })
-                .catch(e => {
-                    console.log(e);
-                    this.$message.error(e.error);
-                });
+            this.getInfo();
         }
     },
     data() {
@@ -243,30 +103,60 @@ export default {
             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' }
-            ],
-            statusOptions: [
-                { label: '申请阶段', value: 'APPLY_STAGE' },
-                { label: '审查阶段', value: 'REVIEW_STAGE' },
-                { label: '授权阶段', value: 'GRANT_STAGE' },
-                { label: '已完成', value: 'COMPLETED' }
-            ],
-            typeOptions: [
-                { label: '发明专利', value: 'INVENTION' },
-                { label: '实用新型专利', value: 'UTILITY_MODEL' },
-                { label: '外观设计专利', value: 'APPEARANCE_DESIGN' }
-            ]
+            clientPartnerIdOptions: [],
+            supplierPartnerIdOptions: [],
+            activeName: 'first'
         };
     },
+    computed: {
+        nowStatus() {
+            return this.workflowFormatter('', '', this.formData.workflow);
+        },
+        user() {
+            if (this.formData.workflow === 'PENDING_REVIEW') {
+                return '客户经理';
+            } else if (this.formData.workflow === 'REPLY_SUBMISSIONS') {
+                if (this.formData.isClientReady) {
+                    return '客户经理';
+                } else {
+                    return '项目经理';
+                }
+            } else if (this.formData.workflow) {
+                return '项目经理';
+            } else {
+                return '';
+            }
+        }
+    },
     methods: {
+        getInfo() {
+            this.$http
+                .get('domesticPatent/getDTO/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                    this.$nextTick(() => {
+                        this.init();
+                    });
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        },
+        init() {
+            if (this.activeName === 'first') {
+                this.$refs.base.init();
+            } else if (this.activeName === 'second') {
+                this.$refs.attachmentList.init();
+            } else if (this.activeName === 'third') {
+                this.$refs.feeList.init();
+            }
+        },
+        tabClick(tab) {
+            this.$nextTick(() => {
+                this.init();
+            });
+        },
         onSave() {
             this.$refs.form.validate(valid => {
                 if (valid) {
@@ -276,16 +166,15 @@ export default {
                 }
             });
         },
-        submit() {
-            let data = { ...this.formData };
-
+        submit(info) {
+            let data = { ...info };
             this.saving = true;
             this.$http
                 .post('/domesticPatent/saveDTO', data, { body: 'json' })
                 .then(res => {
                     this.saving = false;
                     this.$message.success('成功');
-                    this.$router.go(-1);
+                    this.getInfo();
                 })
                 .catch(e => {
                     console.log(e);
@@ -308,8 +197,111 @@ export default {
                         this.$message.error((e || {}).error || '删除失败');
                     }
                 });
+        },
+        uploadAttement(info) {
+            let data = { ...info };
+            if (!data.url) {
+                return;
+            }
+            data.patentId = this.formData.patentId;
+            data.userId = this.$store.state.userInfo.id;
+            data.version = 1;
+            if (data.size) {
+                data.size += 'KB';
+            }
+            this.$http.post('/attachment/save', data, { body: 'json' });
+        },
+        action() {
+            if (this.formData.workflow === 'ADD_SUPPLIERS') {
+                this.$refs.addSupplierNo.show = true;
+            } else if (this.formData.workflow === 'SUPPLIER_MATERIALS') {
+                this.$refs.backSupplier.show = true;
+            } else if (this.formData.workflow === 'MAINTAIN_CASE') {
+                this.$refs.maintainCase.show = true;
+            } else if (this.formData.workflow === 'REPLY_TO_NOTICE') {
+                this.$refs.reply.show = true;
+            } else if (this.formData.workflow === 'PENDING_REVIEW') {
+                this.$refs.replyBack.show = true;
+            } else if (this.formData.workflow === 'REPLY_SUBMISSIONS') {
+                this.$refs.replySubmissions.show = true;
+            } else if (this.formData.workflow === 'REPLY_RESULT') {
+                this.$refs.replyResult.show = true;
+            } else if (this.formData.workflow === 'PENDING_REGISTER') {
+                this.$refs.register.show = true;
+            }
         }
+    },
+    components: {
+        BaseInfo,
+        attachmentList,
+        AttachmentAdd,
+        FeeList,
+        FeeAdd,
+        AddSupplierNo,
+        BackSupplier,
+        MaintainCase,
+        Reply,
+        ReplyBack,
+        ReplySubmissions,
+        ReplyResult,
+        Register
     }
 };
 </script>
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+.edit-tabs {
+    position: relative;
+
+    .right-btns {
+        position: absolute;
+        right: 20px;
+        top: -44px;
+        .el-button {
+            min-width: 100px;
+        }
+    }
+}
+
+.tips {
+    .flex();
+    height: 40px;
+    background: tint(@warn, 68%);
+    border: 1px solid @warn;
+    margin: 20px 20px 0;
+    padding: 0 20px;
+    position: relative;
+
+    .tips-text {
+        margin-right: 60px;
+        .name {
+            font-size: 12px;
+            color: #5e6166;
+            line-height: 22px;
+        }
+
+        .val {
+            font-size: 12px;
+            font-weight: bold;
+            color: @warn;
+            line-height: 22px;
+            margin-left: 10px;
+        }
+    }
+
+    .el-button {
+        position: absolute;
+        right: 20px;
+    }
+}
+</style>
+<style lang="less">
+.el-dialog {
+    .el-form {
+        .el-form-item {
+            &:last-child {
+                margin-top: 70px;
+            }
+        }
+    }
+}
+</style>

+ 315 - 0
src/main/vue/src/views/DomesticPatentEdit1.vue

@@ -0,0 +1,315 @@
+<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-switch v-model="formData.deduction"></el-switch>
+                    </el-form-item>
+                    <el-form-item prop="essentialReview" label="是否请求实质审查">
+                        <el-switch v-model="formData.essentialReview"></el-switch>
+                    </el-form-item>
+                    <el-form-item prop="publicInAdvance" label="是否申请提前公开">
+                        <el-switch v-model="formData.publicInAdvance"></el-switch>
+                    </el-form-item>
+                    <el-form-item prop="chapterAcceptanceNotice" label="是否申请红章受理通知书">
+                        <el-switch v-model="formData.chapterAcceptanceNotice"></el-switch>
+                    </el-form-item>
+                    <el-form-item prop="chapterPaymentNotice" label="是否申请红章缴费通知书">
+                        <el-switch v-model="formData.chapterPaymentNotice"></el-switch>
+                    </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 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: 'DomesticPatentEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('domesticPatent/getDTO/' + 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' }
+            ],
+            statusOptions: [
+                { label: '申请阶段', value: 'APPLY_STAGE' },
+                { label: '审查阶段', value: 'REVIEW_STAGE' },
+                { label: '授权阶段', value: 'GRANT_STAGE' },
+                { label: '已完成', value: 'COMPLETED' }
+            ],
+            typeOptions: [
+                { label: '发明专利', value: 'INVENTION' },
+                { label: '实用新型专利', value: 'UTILITY_MODEL' },
+                { label: '外观设计专利', value: 'APPEARANCE_DESIGN' }
+            ]
+        };
+    },
+    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/saveDTO', 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>

+ 78 - 47
src/main/vue/src/views/DomesticPatentList.vue

@@ -18,6 +18,31 @@
             >
                 <el-button @click="getData" slot="append" icon="el-icon-search"> </el-button>
             </el-input>
+            <div class="filters-left">
+                <el-radio-group class="filters-item" v-model="applyStatus" size="mini" @change="refreash">
+                    <el-radio-button v-for="(item, index) in statusOptions" :key="index" :label="item.value">
+                        {{ item.label }}
+                    </el-radio-button>
+                </el-radio-group>
+
+                <el-select
+                    size="mini"
+                    class="filters-item"
+                    v-model="logoWorkflow"
+                    placeholder="筛选节点流程"
+                    clearable
+                    filterable
+                    @change="refreash"
+                >
+                    <el-option
+                        v-for="item in selectLogoWorkflowOptions"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                    >
+                    </el-option>
+                </el-select>
+            </div>
         </div>
         <el-table
             :data="tableData"
@@ -29,46 +54,32 @@
             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="是否决定答复">
+            <el-table-column align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="patent" label="案件状态">
                 <template slot-scope="{ row }">
-                    <el-tag :type="row.decideReply ? '' : 'info'">{{ row.decideReply }}</el-tag>
+                    <el-tag
+                        v-if="row.patent && row.patent.applyStatus"
+                        :type="applyStatusFormatter(row.patent.applyStatus).type"
+                        >{{ applyStatusFormatter(row.patent.applyStatus).label }}</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 prop="patent.uwNo" min-width="140" label="寰球案号"> </el-table-column>
+            <el-table-column prop="patent.name" min-width="160" label="专利名称"> </el-table-column>
+            <el-table-column prop="workflow" min-width="120" label="当前流程" :formatter="workflowFormatter">
             </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 prop="patent.applyDate" min-width="100" label="申请日" :formatter="dateFormatter">
             </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 prop="patent.type" min-width="100" label="专利类型" :formatter="typeFormatter">
             </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">
+            <el-table-column prop="patent.applyNo" min-width="120" label="国内申请号"> </el-table-column>
+            <el-table-column prop="patent.applicantName" min-width="140" label="申请人"> </el-table-column>
+            <el-table-column prop="applicantUscc" min-width="160" label="申请人统一社会信用代码"> </el-table-column>
+            <el-table-column prop="patent.inventorName" min-width="120" label="发明人姓名"> </el-table-column>
+            <el-table-column prop="inventorIdno" min-width="120" label="第一发明人身份证"> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="80">
                 <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>
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>查看详情</el-button>
                 </template>
             </el-table-column>
         </el-table>
@@ -98,34 +109,44 @@
 <script>
 import { mapState } from 'vuex';
 import pageableTable from '@/mixins/pageableTable';
+import domesticPatent from '@/mixins/domesticPatent';
 
 export default {
     name: 'DomesticPatentList',
-    mixins: [pageableTable],
+    mixins: [pageableTable, domesticPatent],
     data() {
         return {
             multipleMode: false,
             search: '',
-            url: '/domesticPatent/all',
+            url: '/domesticPatent/allDTO',
             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' }
-            ]
+            applyStatus: 'APPLY_STAGE',
+            logoWorkflow: ''
         };
     },
     computed: {
         selection() {
             return this.$refs.table.selection.map(i => i.id);
+        },
+        selectLogoWorkflowOptions() {
+            if (this.applyStatus) {
+                return [...this.statusOptions].find(item => {
+                    return item.value === this.applyStatus;
+                })?.workflows;
+            } else {
+                return this.workflowOptions;
+            }
         }
     },
     methods: {
+        applyStatusFormatter(status) {
+            let selectedOption = this.statusOptions.find(i => i.value === status);
+            if (selectedOption) {
+                return selectedOption;
+            } else {
+                return null;
+            }
+        },
         workflowFormatter(row, column, cellValue, index) {
             let selectedOption = this.workflowOptions.find(i => i.value === cellValue);
             if (selectedOption) {
@@ -134,7 +155,13 @@ export default {
             return '';
         },
         beforeGetData() {
-            return { search: this.search };
+            return {
+                search: this.search,
+                query: {
+                    applyStatus: this.applyStatus,
+                    workflow: this.logoWorkflow
+                }
+            };
         },
         toggleMultipleMode(multipleMode) {
             this.multipleMode = multipleMode;
@@ -144,7 +171,7 @@ export default {
         },
         addRow() {
             this.$router.push({
-                path: '/domesticPatentEdit',
+                path: '/domesticPatentAdd',
                 query: {
                     ...this.$route.query
                 }
@@ -205,6 +232,10 @@ export default {
                         this.$message.error(e.error);
                     }
                 });
+        },
+        refreash() {
+            this.page = 1;
+            this.getData();
         }
     }
 };

+ 1 - 1
src/main/vue/src/views/LogoPatentAdd.vue

@@ -39,7 +39,7 @@
                         </attachment-upload>
                     </el-form-item>
                     <el-form-item class="form-submit">
-                        <el-button @click="onSave" :loading="saving" size="default" type="primary">保存 </el-button>
+                        <el-button @click="onSave" :loading="saving" size="default" type="primary">确认 </el-button>
                         <el-button @click="$router.go(-1)" size="default">取消</el-button>
                     </el-form-item>
                 </el-form>

+ 9 - 7
src/main/vue/src/views/LogoPatentEdit.vue

@@ -1,6 +1,8 @@
 <template>
     <div class="edit-view">
-        <page-title></page-title>
+        <page-title>
+            <template slot="title"> 商标详情:{{ formData.name }} </template>
+        </page-title>
         <el-tabs class="edit-tabs" v-model="activeName" @tab-click="tabClick">
             <div class="right-btns">
                 <!-- <el-button type="primary" size="small">新增答复</el-button> -->
@@ -30,10 +32,10 @@
                 <base-info ref="base" :info.sync="formData" @submit="submit"></base-info>
             </el-tab-pane>
             <el-tab-pane label="附件列表" name="second">
-                <attachment-list ref="attachmentList" :logoPatentInfo="formData"></attachment-list>
+                <attachment-list ref="attachmentList" :info="formData"></attachment-list>
             </el-tab-pane>
             <el-tab-pane label="费用信息" name="third">
-                <fee-list ref="feeList" :logoPatentInfo="formData"></fee-list>
+                <fee-list ref="feeList" :info="formData"></fee-list>
             </el-tab-pane>
             <!-- <el-tab-pane label="流程信息" name="fourth"></el-tab-pane> -->
         </el-tabs>
@@ -66,15 +68,15 @@
         <review-se-s ref="reviewSeS" :info="formData" @submit="submit" @uploadAttement="uploadAttement"></review-se-s>
 
         <review-se-t ref="reviewSeT" :info="formData" @submit="submit" @uploadAttement="uploadAttement"></review-se-t>
-        <fee-add ref="feeAdd" isLogoPatent :logoPatentInfo="formData" @refreash="init"></fee-add>
+        <fee-add ref="feeAdd" isLogoPatent :info="formData" @refreash="init"></fee-add>
     </div>
 </template>
 <script>
 import BaseInfo from '../components/logoPatent/BaseInfo.vue';
 import Signed from '../components/logoPatent/Signed.vue';
-import attachmentList from '../components/logoPatent/AttachmentList.vue';
+import attachmentList from '../components/AttachmentList.vue';
 import logoPatent from '@/mixins/logoPatent';
-import AttachmentAdd from '../components/logoPatent/AttachmentAdd.vue';
+import AttachmentAdd from '../components/AttachmentAdd.vue';
 import Maintenance from '../components/logoPatent/Maintenance.vue';
 import Accept from '../components/logoPatent/Accept.vue';
 import Review from '../components/logoPatent/Review.vue';
@@ -108,7 +110,7 @@ export default {
     },
     computed: {
         nowStatus() {
-            return this.logoWorkflowFormatter('', '', this.formData.logoWorkflow);
+            return this.workflowFormatter('', '', this.formData.logoWorkflow);
         },
         user() {
             if (this.formData.logoWorkflow === 'IS_CONTRACT') {

+ 66 - 5
src/main/vue/src/views/LogoPatentList.vue

@@ -18,6 +18,32 @@
             >
                 <el-button @click="getData" slot="append" icon="el-icon-search"> </el-button>
             </el-input>
+
+            <div class="filters-left">
+                <el-radio-group class="filters-item" v-model="applyStatus" size="mini" @change="refreash">
+                    <el-radio-button v-for="(item, index) in applyStatusOptions" :key="index" :label="item.value">
+                        {{ item.label }}
+                    </el-radio-button>
+                </el-radio-group>
+
+                <el-select
+                    size="mini"
+                    class="filters-item"
+                    v-model="logoWorkflow"
+                    placeholder="筛选节点流程"
+                    clearable
+                    filterable
+                    @change="refreash"
+                >
+                    <el-option
+                        v-for="item in selectLogoWorkflowOptions"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                    >
+                    </el-option>
+                </el-select>
+            </div>
         </div>
         <el-table
             :data="tableData"
@@ -29,11 +55,17 @@
             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="applyStatus" label="案件状态" :formatter="applyStatusFormatter"> </el-table-column>
+            <el-table-column align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="applyStatus" label="案件状态">
+                <template slot-scope="{ row }">
+                    <el-tag v-if="row.applyStatus" :type="applyStatusFormatter(row.applyStatus).type">{{
+                        applyStatusFormatter(row.applyStatus).label
+                    }}</el-tag>
+                </template>
+            </el-table-column>
             <el-table-column prop="uwNo" label="寰球案号"> </el-table-column>
             <el-table-column prop="name" label="专利名称"> </el-table-column>
-            <el-table-column prop="logoWorkflow" label="当前流程" :formatter="logoWorkflowFormatter"> </el-table-column>
+            <el-table-column prop="logoWorkflow" label="当前流程" :formatter="workflowFormatter"> </el-table-column>
             <el-table-column prop="userId" label="创建申请人"> </el-table-column>
             <el-table-column prop="createdAt" label="商标申请日"> </el-table-column>
             <el-table-column prop="clientPartner" label="客户"> </el-table-column>
@@ -74,17 +106,42 @@ export default {
             multipleMode: false,
             search: '',
             url: '/logoPatent/all',
-            downloading: false
+            downloading: false,
+            applyStatus: 'APPLY_STAGE',
+            logoWorkflow: ''
         };
     },
     computed: {
         selection() {
             return this.$refs.table.selection.map(i => i.id);
+        },
+        selectLogoWorkflowOptions() {
+            if (this.applyStatus) {
+                return [...this.applyStatusOptions].find(item => {
+                    return item.value === this.applyStatus;
+                })?.workflows;
+            } else {
+                return this.logoWorkflowOptions;
+            }
         }
     },
     methods: {
+        applyStatusFormatter(status) {
+            let selectedOption = this.applyStatusOptions.find(i => i.value === status);
+            if (selectedOption) {
+                return selectedOption;
+            } else {
+                return null;
+            }
+        },
         beforeGetData() {
-            return { search: this.search };
+            return {
+                search: this.search,
+                query: {
+                    applyStatus: this.applyStatus,
+                    logoWorkflow: this.logoWorkflow
+                }
+            };
         },
         toggleMultipleMode(multipleMode) {
             this.multipleMode = multipleMode;
@@ -155,6 +212,10 @@ export default {
                         this.$message.error(e.error);
                     }
                 });
+        },
+        refreash() {
+            this.page = 1;
+            this.getData();
         }
     }
 };

+ 30 - 8
src/main/vue/src/views/Menus.vue

@@ -25,7 +25,7 @@
             <transition name="el-fade-in">
                 <el-col :span="12" v-if="dialogVisible">
                     <div class="menu-tree">
-                        <div style="font-weight:bold;padding:10px 0">{{ menu.id ? '编辑菜单' : '新增菜单' }}</div>
+                        <div style="font-weight: bold; padding: 10px 0;">{{ menu.id ? '编辑菜单' : '新增菜单' }}</div>
                         <el-form :model="menu" ref="form" label-position="top">
                             <el-form-item
                                 label="菜单名"
@@ -48,10 +48,9 @@
                                     ></template
                                 >
                                 <el-input v-model="icon">
-                                    <template slot="append"
-                                        ><span ref="iconContainer" style="font-size: 18px;"
-                                            ><i class="fas fa-"></i></span
-                                    ></template>
+                                    <template slot="append">
+                                        <span ref="iconContainer" style="font-size: 18px;"><i></i></span>
+                                    </template>
                                 </el-input>
                             </el-form-item>
                             <el-form-item prop="category" label="分类" v-if="menu.root">
@@ -65,7 +64,7 @@
                                     allow-create
                                     default-first-option
                                     placeholder="请输入子页面地址"
-                                    style="width:100%"
+                                    style="width: 100%;"
                                 >
                                 </el-select>
                             </el-form-item>
@@ -75,7 +74,7 @@
                                     clearable
                                     multiple
                                     value-key="name"
-                                    style="width:100%"
+                                    style="width: 100%;"
                                 >
                                     <el-option
                                         v-for="item in authorities"
@@ -127,6 +126,20 @@ export default {
             authorities: []
         };
     },
+    computed: {
+        iconName() {
+            if (this.icon) {
+                const icon = this.icon;
+                if (icon.indexOf('iconfont ') != -1) {
+                    return icon;
+                } else {
+                    return '';
+                }
+            } else {
+                return '';
+            }
+        }
+    },
     methods: {
         addRootMenu() {
             this.menu = {
@@ -387,8 +400,17 @@ export default {
             );
         },
         showIcon(val) {
+            console.log(val);
             if (!this.$refs.iconContainer) return;
-            if (FontAwesome.icon({ prefix: 'fas', iconName: val })) {
+
+            if (val.indexOf('iconfont ') !== -1) {
+                console.log(val.indexOf('iconfont '));
+                this.$refs.iconContainer.innerHTML = '';
+                let i = document.createElement('i');
+                i.className = val;
+                this.$refs.iconContainer.append(i);
+                this.menu.icon = val;
+            } else if (FontAwesome.icon({ prefix: 'fas', iconName: val })) {
                 this.$refs.iconContainer.innerHTML = '';
                 let i = document.createElement('i');
                 i.className = 'fas fa-' + val;

+ 43 - 0
src/test/java/com/izouma/uwip/service/DomesticPatentServiceTest.java

@@ -1,12 +1,22 @@
 package com.izouma.uwip.service;
 
 
+import com.alibaba.fastjson.JSONObject;
 import com.izouma.uwip.ApplicationTests;
+import com.izouma.uwip.domain.DomesticPatent;
+import com.izouma.uwip.domain.Patent;
+import com.izouma.uwip.dto.DomesticPatentDTO;
+import com.izouma.uwip.dto.PageQuery;
+import com.izouma.uwip.enums.ApplyStatus;
 import com.izouma.uwip.enums.CaseType;
+import com.izouma.uwip.enums.DomesticWorkflow;
 import com.izouma.uwip.enums.PatentType;
+import com.izouma.uwip.utils.JpaUtils;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.util.Map;
+
 public class DomesticPatentServiceTest extends ApplicationTests {
     @Autowired
     private DomesticPatentService domesticPatentService;
@@ -17,4 +27,37 @@ public class DomesticPatentServiceTest extends ApplicationTests {
         System.out.println(CaseType.valueOf(name));
     }
 
+    @Test
+    public void test1() {
+        PageQuery pageQuery = new PageQuery();
+//        pageQuery.setSearch("123");
+        Map<String, Object> query = pageQuery.getQuery();
+        query.put("applyStatus", "APPLY_STAGE");
+        query.put("workflow", "MAINTAIN_CASE");
+        domesticPatentService.allDTO(pageQuery).forEach(dp -> System.out.println(dp.getId() + "----->"));
+    }
+
+    @Test
+    public void test2() {
+        System.out.println(JpaUtils.isExistField("workflow", DomesticPatent.class));
+    }
+
+    @Test
+    public void test3() {
+        DomesticPatentDTO dto = JSONObject.parseObject("{\"did\":217,\"patentId\":216,\"workflow\":\"ADD_SUPPLIERS\"," +
+                "\"applicantUscc\":\"111\",\"inventorIdno\":\"111\",\"deduction\":false," +
+                "\"essentialReview\":false,\"publicInAdvance\":false,\"chapterAcceptanceNotice\":false," +
+                "\"chapterPaymentNotice\":false,\"decideReply\":null,\"isClientReady\":null," +
+                "\"replyPassed\":null,\"registerNotice\":null,\"registerEndDate\":null,\"feeRemark\":null," +
+                "\"payment\":null,\"annualFee\":null,\"feePaymentPeriod\":null,\"bill\":null,\"name\":\"12232\"," +
+                "\"applyStatus\":\"APPLY_STAGE\",\"type\":\"INVENTION\",\"uwNo\":\"CE211——1001\"," +
+                "\"clientPartnerId\":168,\"supplierPartnerId\":null,\"supplierNo\":null," +
+                "\"supplierSubmitPeriod\":null,\"applicantName\":\"111\",\"applicantEnName\":null," +
+                "\"applicantAddress\":\"111\",\"applicantEnAddress\":null,\"inventorName\":\"111\"," +
+                "\"inventorEnName\":null,\"priorityNo\":null,\"priorityDate\":null,\"priorityCountry\":null," +
+                "\"submitPeriod\":null,\"officialPeriod\":null,\"applyNo\":null,\"applyDate\":\"2021-04-12\"," +
+                "\"attachments\":null,\"handle\":[]}", DomesticPatentDTO.class);
+        domesticPatentService.saveDTO(dto, 1L);
+    }
+
 }

+ 1 - 1
src/test/java/com/izouma/uwip/web/LogoPatentControllerTest.java

@@ -13,6 +13,6 @@ public class LogoPatentControllerTest extends ApplicationTests {
 
     @Test
     public void all() {
-        logoPatentController.all(new PageQuery());
+        logoPatentController.all(new PageQuery()).getContent().forEach(System.out::println);
     }
 }