feat: 增加应用管理的领域逻辑
diff --git a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/entity/Application.java b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/entity/Application.java
new file mode 100644
index 0000000..b68fd38
--- /dev/null
+++ b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/entity/Application.java
@@ -0,0 +1,69 @@
+package com.supwisdom.institute.backend.base.domain.entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import com.supwisdom.institute.backend.common.framework.entity.ABaseEntity;
+
+@Entity
+@Table(name = "TB_BASE_APPLICATION")
+public class Application extends ABaseEntity {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -1874484930838884168L;
+
+  /**
+   * 代码
+   */
+  @Column(name = "CODE")
+  @Getter
+  @Setter
+  private String code;
+
+  /**
+   * 名称
+   */
+  @Column(name = "NAME")
+  @Getter
+  @Setter
+  private String name;
+
+  /**
+   * 备注
+   */
+  @Column(name = "MEMO")
+  @Getter
+  @Setter
+  private String memo;
+
+  /**
+   * 状态(1 启用,0 停用)
+   */
+  @Column(name = "STATUS")
+  @Getter
+  @Setter
+  private String status;
+
+  /**
+   * 系统访问地址
+   */
+  @Column(name = "URL", nullable = true)
+  @Getter
+  @Setter
+  private String url;
+
+  /**
+   * SPI接口地址前缀
+   */
+  @Column(name = "SPI_URL_PREFIX", nullable = true)
+  @Getter
+  @Setter
+  private String spiUrlPrefix;
+
+}
diff --git a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/repo/ApplicationRepository.java b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/repo/ApplicationRepository.java
new file mode 100644
index 0000000..3e1b6ea
--- /dev/null
+++ b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/repo/ApplicationRepository.java
@@ -0,0 +1,76 @@
+package com.supwisdom.institute.backend.base.domain.repo;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.StringUtils;
+
+import com.supwisdom.institute.backend.base.domain.entity.Application;
+import com.supwisdom.institute.backend.common.framework.repo.BaseJpaRepository;
+import com.supwisdom.institute.backend.common.util.MapBeanUtils;
+
+@Repository
+public interface ApplicationRepository extends BaseJpaRepository<Application> {
+  
+  @Override
+  public default Specification<Application> convertToSpec(Map<String, Object> mapBean) {
+    
+    Specification<Application> spec = new Specification<Application>() {
+
+      /**
+       * 
+       */
+      private static final long serialVersionUID = -263282246904382286L;
+
+      @Override
+      public Predicate toPredicate(Root<Application> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+        List<Predicate> predicates = new ArrayList<>();
+        
+        if (mapBean != null) {
+
+          if (MapBeanUtils.getBoolean(mapBean, "deleted") != null) {
+            predicates.add(criteriaBuilder.equal(root.get("deleted"), MapBeanUtils.getBoolean(mapBean, "deleted")));
+          }
+
+          if (!StringUtils.isEmpty(MapBeanUtils.getString(mapBean, "code"))) {
+            predicates.add(criteriaBuilder.like(root.get("code"), "%" + MapBeanUtils.getString(mapBean, "code") + "%"));
+          }
+          if (!StringUtils.isEmpty(MapBeanUtils.getString(mapBean, "name"))) {
+            predicates.add(criteriaBuilder.like(root.get("name"), "%" + MapBeanUtils.getString(mapBean, "name") + "%"));
+          }
+          
+          if (!StringUtils.isEmpty(MapBeanUtils.getString(mapBean, "status"))) {
+            predicates.add(criteriaBuilder.equal(root.get("status"), MapBeanUtils.getString(mapBean, "status")));
+          }
+
+          if (!StringUtils.isEmpty(MapBeanUtils.getString(mapBean, "url"))) {
+            predicates.add(criteriaBuilder.like(root.get("url"), "%" + MapBeanUtils.getString(mapBean, "url") + "%"));
+          }
+          
+          List<Predicate> predicatesKeyword = new ArrayList<>();
+          if (!StringUtils.isEmpty(MapBeanUtils.getString(mapBean, "keyword"))) {
+            predicatesKeyword.add(criteriaBuilder.like(root.get("code"), "%" + MapBeanUtils.getString(mapBean, "keyword") + "%"));
+            predicatesKeyword.add(criteriaBuilder.like(root.get("name"), "%" + MapBeanUtils.getString(mapBean, "keyword") + "%"));
+            predicatesKeyword.add(criteriaBuilder.like(root.get("memo"), "%" + MapBeanUtils.getString(mapBean, "keyword") + "%"));
+            
+            predicates.add(criteriaBuilder.or(predicatesKeyword.toArray(new Predicate[predicatesKeyword.size()])));
+          }
+        }
+        
+        return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
+      }
+      
+    };
+    
+    return spec;
+  }
+
+}
diff --git a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/service/ApplicationService.java b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/service/ApplicationService.java
new file mode 100644
index 0000000..7e2fa96
--- /dev/null
+++ b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/service/ApplicationService.java
@@ -0,0 +1,32 @@
+package com.supwisdom.institute.backend.base.domain.service;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.supwisdom.institute.backend.base.domain.entity.Application;
+import com.supwisdom.institute.backend.base.domain.repo.ApplicationRepository;
+import com.supwisdom.institute.backend.common.framework.service.ABaseService;
+
+@Service
+public class ApplicationService extends ABaseService<Application, ApplicationRepository> {
+
+  @Override
+  public ApplicationRepository getRepo() {
+    return applicationRepository;
+  }
+
+  @Autowired
+  private ApplicationRepository applicationRepository;
+
+  
+  public void deleteBatch(List<String> ids) {
+    
+    ids.stream().forEach(id -> {
+      this.deleteById(id);
+    });
+  }
+
+  
+}