zhouhao 6 лет назад
Родитель
Сommit
078de7b563
10 измененных файлов с 376 добавлено и 2 удалено
  1. 39 0
      hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/MybatisDaoAutoConfiguration.java
  2. 46 0
      hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/mapper/AbstractSqlTermCustomer.java
  3. 13 0
      hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/mapper/SqlTermCustomer.java
  4. 57 0
      hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/mapper/TreeStructureSqlTermCustomer.java
  5. 1 1
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-api/src/main/java/org/hswebframework/web/service/organizational/event/ClearPersonCacheEvent.java
  6. 79 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/terms/CustomSqlTermConfiguration.java
  7. 44 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/terms/InServiceTreeInSqlTerm.java
  8. 44 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/terms/PersonInPositionSqlTerm.java
  9. 52 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/terms/UserInPositionSqlTerm.java
  10. 1 1
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/organizational/OrganizationalMapper.xml

+ 39 - 0
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/MybatisDaoAutoConfiguration.java

@@ -18,13 +18,22 @@
 
 package org.hswebframework.web.dao.mybatis;
 
+import org.hswebframework.ezorm.rdb.render.dialect.Dialect;
 import org.hswebframework.web.dao.Dao;
+import org.hswebframework.web.dao.mybatis.mapper.SqlTermCustomer;
 import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanPostProcessor;
 import org.springframework.boot.autoconfigure.AutoConfigureAfter;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
 @Configuration
 @ComponentScan("org.hswebframework.web.dao.mybatis")
 @MapperScan(value = "org.hswebframework.web.dao", markerInterface = Dao.class)
@@ -32,5 +41,35 @@ import org.springframework.context.annotation.Configuration;
 @EnableConfigurationProperties(MybatisProperties.class)
 public class MybatisDaoAutoConfiguration {
 
+    @Bean
+    public BeanPostProcessor SqlTermCustomerRegister() {
+
+        List<Dialect> dialects = Arrays.asList(
+                Dialect.H2
+                , Dialect.MYSQL
+                , Dialect.ORACLE
+                , Dialect.MSSQL);
+
+        return new BeanPostProcessor() {
+            @Override
+            public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
+                return bean;
+            }
 
+            @Override
+            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+                if (bean instanceof SqlTermCustomer) {
+                    SqlTermCustomer customer = ((SqlTermCustomer) bean);
+                    if (customer.forDialect() != null) {
+                        for (Dialect dialect : customer.forDialect()) {
+                            dialect.setTermTypeMapper(customer.getTermType(), customer);
+                        }
+                    } else {
+                        dialects.forEach(dialect -> dialect.setTermTypeMapper(customer.getTermType(), customer));
+                    }
+                }
+                return bean;
+            }
+        };
+    }
 }

+ 46 - 0
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/mapper/AbstractSqlTermCustomer.java

@@ -0,0 +1,46 @@
+package org.hswebframework.web.dao.mybatis.mapper;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.hswebframework.ezorm.rdb.meta.RDBColumnMetaData;
+import org.hswebframework.ezorm.rdb.render.SqlAppender;
+import org.hswebframework.ezorm.rdb.render.dialect.Dialect;
+
+import java.util.List;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+@AllArgsConstructor
+public abstract class AbstractSqlTermCustomer implements SqlTermCustomer {
+
+    @Getter
+    protected final String termType;
+
+    @Override
+    public Dialect[] forDialect() {
+        return null;
+    }
+
+    protected String createColumnName(RDBColumnMetaData column, String tableAlias) {
+        return column.getTableMetaData().getDatabaseMetaData().getDialect().buildColumnName(tableAlias, column.getName());
+    }
+
+    protected void appendCondition(List<Object> values, String wherePrefix, SqlAppender appender) {
+        int len = values.size();
+        if (len == 1) {
+            appender.add("=#{", wherePrefix, ".value[0]}");
+        } else {
+            appender.add("in(");
+            for (int i = 0; i < len; i++) {
+                if (i > 0) {
+                    appender.add(",");
+                }
+                appender.add("#{", wherePrefix, ".value[" + i + "]}");
+            }
+            appender.add(")");
+        }
+
+    }
+}

+ 13 - 0
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/mapper/SqlTermCustomer.java

@@ -0,0 +1,13 @@
+package org.hswebframework.web.dao.mybatis.mapper;
+
+import org.hswebframework.ezorm.rdb.render.dialect.Dialect;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+public interface SqlTermCustomer extends Dialect.TermTypeMapper {
+    String getTermType();
+
+    Dialect[] forDialect();
+}

+ 57 - 0
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/mapper/TreeStructureSqlTermCustomer.java

@@ -0,0 +1,57 @@
+package org.hswebframework.web.dao.mybatis.mapper;
+
+import org.hswebframework.ezorm.core.param.Term;
+import org.hswebframework.ezorm.rdb.meta.RDBColumnMetaData;
+import org.hswebframework.ezorm.rdb.render.SqlAppender;
+import org.hswebframework.ezorm.rdb.render.dialect.term.BoostTermTypeMapper;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+public abstract class TreeStructureSqlTermCustomer extends AbstractSqlTermCustomer {
+    boolean not = false;
+
+    public TreeStructureSqlTermCustomer(String termType, boolean not) {
+        super(termType);
+        this.not = not;
+    }
+
+    protected abstract String getTableName();
+
+    protected abstract List<String> getTreePathByTerm(List<Object> termValue);
+
+    @Override
+    public SqlAppender accept(String wherePrefix, Term term, RDBColumnMetaData column, String tableAlias) {
+        List<Object> value = BoostTermTypeMapper.convertList(column, term.getValue());
+        List<String> paths = getTreePathByTerm(value)
+                .stream()
+                .map(path -> path.concat("%"))
+                .collect(Collectors.toList());
+
+        term.setValue(paths);
+        SqlAppender termCondition = new SqlAppender();
+
+        termCondition.add(not ? "not " : "", "exists(select 1 from ", getTableName(), " tmp where tmp.u_id = ", createColumnName(column, tableAlias));
+        int len = paths.size();
+
+        if (len > 0) {
+            termCondition.add("and (");
+        }
+        for (int i = 0; i < len; i++) {
+            if (i > 0) {
+                termCondition.addSpc("and");
+            }
+            termCondition.add("tmp.path like #{", wherePrefix, ".value[", i, "]}");
+        }
+        if (len > 0) {
+            termCondition.addSpc(")");
+        }
+        termCondition.add(")");
+
+        return termCondition;
+    }
+}

+ 1 - 1
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-api/src/main/java/org/hswebframework/web/service/organizational/event/ClearPersonCacheEvent.java

@@ -2,7 +2,7 @@ package org.hswebframework.web.service.organizational.event;
 
 /**
  * @author zhouhao
- * @since 1.0
+ * @since 3.0
  */
 public class ClearPersonCacheEvent {
 

+ 79 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/terms/CustomSqlTermConfiguration.java

@@ -0,0 +1,79 @@
+package org.hswebframework.web.service.organizational.simple.terms;
+
+import org.hswebframework.web.service.organizational.DepartmentService;
+import org.hswebframework.web.service.organizational.DistrictService;
+import org.hswebframework.web.service.organizational.OrganizationalService;
+import org.hswebframework.web.service.organizational.PositionService;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+@Configuration
+public class CustomSqlTermConfiguration {
+
+    @Bean
+    public InServiceTreeInSqlTerm<String> distInSqlTerm(DistrictService districtService) {
+        return new InServiceTreeInSqlTerm<>(districtService, "dist", "s_district", false);
+    }
+
+    @Bean
+    public InServiceTreeInSqlTerm<String> distNotInSqlTerm(DistrictService districtService) {
+        return new InServiceTreeInSqlTerm<>(districtService, "dist", "s_district", true);
+    }
+
+
+    @Bean
+    public InServiceTreeInSqlTerm<String> orgInSqlTerm(OrganizationalService organizationalService) {
+        return new InServiceTreeInSqlTerm<>(organizationalService, "org", "s_organization", false);
+    }
+
+    @Bean
+    public InServiceTreeInSqlTerm<String> orgNotInSqlTerm(OrganizationalService organizationalService) {
+        return new InServiceTreeInSqlTerm<>(organizationalService, "org", "s_organization", true);
+    }
+
+    @Bean
+    public InServiceTreeInSqlTerm<String> departmentInSqlTerm(DepartmentService departmentService) {
+        return new InServiceTreeInSqlTerm<>(departmentService, "dept", "s_department", false);
+    }
+
+    @Bean
+    public InServiceTreeInSqlTerm<String> departmentNotInSqlTerm(DepartmentService departmentService) {
+        return new InServiceTreeInSqlTerm<>(departmentService, "dept", "s_department", true);
+    }
+
+    @Bean
+    public InServiceTreeInSqlTerm<String> positionInSqlTerm(PositionService positionService) {
+        return new InServiceTreeInSqlTerm<>(positionService, "pos", "s_position", false);
+    }
+
+    @Bean
+    public InServiceTreeInSqlTerm<String> positionNotInSqlTerm(PositionService positionService) {
+        return new InServiceTreeInSqlTerm<>(positionService, "pos", "s_position", true);
+    }
+
+    @Bean
+    public PersonInPositionSqlTerm personInPositionSqlTerm() {
+        return new PersonInPositionSqlTerm(false);
+    }
+
+    @Bean
+    public PersonInPositionSqlTerm personNotInPositionSqlTerm() {
+        return new PersonInPositionSqlTerm(true);
+    }
+
+    @Bean
+    public UserInPositionSqlTerm userInPositionSqlTerm() {
+        return new UserInPositionSqlTerm(false);
+    }
+
+    @Bean
+    public UserInPositionSqlTerm userNotInPositionSqlTerm() {
+        return new UserInPositionSqlTerm(true);
+    }
+
+
+}

+ 44 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/terms/InServiceTreeInSqlTerm.java

@@ -0,0 +1,44 @@
+package org.hswebframework.web.service.organizational.simple.terms;
+
+import org.hswebframework.web.commons.entity.TreeSupportEntity;
+import org.hswebframework.web.dao.mybatis.mapper.TreeStructureSqlTermCustomer;
+import org.hswebframework.web.service.QueryService;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+public class InServiceTreeInSqlTerm<PK> extends TreeStructureSqlTermCustomer {
+
+    private QueryService<? extends TreeSupportEntity<PK>, PK> treeService;
+
+    private String tableName;
+
+    public InServiceTreeInSqlTerm(QueryService<? extends TreeSupportEntity<PK>, PK> service, String prefix, String tableName, boolean not) {
+        super(prefix + "-child-" + (not ? "not-" : "") + "in", not);
+        this.treeService = service;
+        this.tableName = tableName;
+    }
+
+    @Override
+    protected String getTableName() {
+        return tableName;
+    }
+
+    @Override
+    protected List<String> getTreePathByTerm(List<Object> termValue) {
+
+        List<PK> idList = ((List) termValue);
+
+        return treeService.selectByPk(idList)
+                .stream()
+                .map(TreeSupportEntity::getPath)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+
+    }
+}

+ 44 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/terms/PersonInPositionSqlTerm.java

@@ -0,0 +1,44 @@
+package org.hswebframework.web.service.organizational.simple.terms;
+
+import org.hswebframework.ezorm.core.param.Term;
+import org.hswebframework.ezorm.rdb.meta.RDBColumnMetaData;
+import org.hswebframework.ezorm.rdb.render.SqlAppender;
+import org.hswebframework.ezorm.rdb.render.dialect.term.BoostTermTypeMapper;
+import org.hswebframework.web.dao.mybatis.mapper.AbstractSqlTermCustomer;
+
+import java.util.List;
+
+
+/**
+ * 查询岗位中的人员
+ *
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+public class PersonInPositionSqlTerm extends AbstractSqlTermCustomer {
+
+    private boolean not;
+
+    public PersonInPositionSqlTerm(boolean not) {
+        super("person-" + (not ? "not-" : "") + "in-position");
+        this.not = not;
+    }
+
+    @Override
+    public SqlAppender accept(String wherePrefix, Term term, RDBColumnMetaData column, String tableAlias) {
+        SqlAppender appender = new SqlAppender();
+        //exists(select 1 from s_person_position tmp where tmp.person_id = t.owner_id and position_id =?)
+        appender.add(not ? "not " : "", "exists(select 1 from s_person_position tmp where tmp.person_id =", createColumnName(column, tableAlias));
+
+        List<Object> positionIdList = BoostTermTypeMapper.convertList(column, term.getValue());
+        if (!positionIdList.isEmpty()) {
+            appender.add(" and tmp.position_id");
+            appendCondition(positionIdList, wherePrefix, appender);
+            term.setValue(positionIdList);
+        }
+
+        appender.add(")");
+
+        return appender;
+    }
+}

+ 52 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/terms/UserInPositionSqlTerm.java

@@ -0,0 +1,52 @@
+package org.hswebframework.web.service.organizational.simple.terms;
+
+import org.hswebframework.ezorm.core.param.Term;
+import org.hswebframework.ezorm.rdb.meta.RDBColumnMetaData;
+import org.hswebframework.ezorm.rdb.render.SqlAppender;
+import org.hswebframework.ezorm.rdb.render.dialect.term.BoostTermTypeMapper;
+import org.hswebframework.web.dao.mybatis.mapper.AbstractSqlTermCustomer;
+
+import java.util.List;
+
+
+/**
+ * 查询岗位中的用户
+ *
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+public class UserInPositionSqlTerm extends AbstractSqlTermCustomer {
+
+    private boolean not;
+
+    public UserInPositionSqlTerm(boolean not) {
+        super("user-" + (not ? "not-" : "") + "in-position");
+        this.not = not;
+    }
+
+    @Override
+    public SqlAppender accept(String wherePrefix, Term term, RDBColumnMetaData column, String tableAlias) {
+        SqlAppender appender = new SqlAppender();
+        //exists(
+        // select 1 from s_person_position tmp,s_person u
+        // where
+        // u.u_id=tmp.person_id
+        // and {column}=u.user_id
+        // and position_id =?
+        // )
+        appender.addSpc(not ? "not" : "", "exists(select 1 from s_person_position tmp,s_person u"
+                , "where u.u_id=tmp.person_id"
+                , "and", createColumnName(column, tableAlias), "=u.user_id");
+
+        List<Object> positionIdList = BoostTermTypeMapper.convertList(column, term.getValue());
+        if (!positionIdList.isEmpty()) {
+            appender.addSpc("and tmp.position_id");
+            appendCondition(positionIdList, wherePrefix, appender);
+            term.setValue(positionIdList);
+        }
+
+        appender.add(")");
+
+        return appender;
+    }
+}

+ 1 - 1
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/organizational/OrganizationalMapper.xml

@@ -45,7 +45,7 @@
     </insert>
 
     <delete id="deleteByPk" parameterType="String">
-        delete from S_ORGANIZATION where u_id =#{id}
+        delete from s_organization where u_id =#{id}
     </delete>
 
     <delete id="delete" parameterType="org.hswebframework.web.commons.entity.Entity">