wangliang 3 жил өмнө
parent
commit
0ee1e877a4

+ 2 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TSAuthMapper.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.business.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.qmth.distributed.print.business.entity.TSAuth;
+import com.qmth.teachcloud.common.base.CustomBaseMapper;
 
 /**
  * <p>
@@ -11,6 +12,6 @@ import com.qmth.distributed.print.business.entity.TSAuth;
  * @author wangliang
  * @since 2022-04-26
  */
-public interface TSAuthMapper extends BaseMapper<TSAuth> {
+public interface TSAuthMapper extends CustomBaseMapper<TSAuth> {
 
 }

+ 6 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/AuthInfoServiceImpl.java

@@ -7,6 +7,7 @@ import com.qmth.boot.core.solar.model.OrgInfo;
 import com.qmth.boot.core.solar.service.SolarService;
 import com.qmth.distributed.print.business.entity.TSAuth;
 import com.qmth.distributed.print.business.enums.AuthEnum;
+import com.qmth.distributed.print.business.mapper.TSAuthMapper;
 import com.qmth.distributed.print.business.service.AuthInfoService;
 import com.qmth.distributed.print.business.service.TSAuthService;
 import com.qmth.teachcloud.common.bean.dto.AuthOrgInfoDto;
@@ -40,6 +41,9 @@ public class AuthInfoServiceImpl implements AuthInfoService {
     @Resource
     TSAuthService tsAuthService;
 
+    @Resource
+    TSAuthMapper tsAuthMapper;
+
     @Resource
     CommonCacheService commonCacheService;
 
@@ -117,7 +121,7 @@ public class AuthInfoServiceImpl implements AuthInfoService {
      * @param authEnum
      */
     @Transactional
-    protected void saveAuthInfo(AppInfo appInfo, AuthEnum authEnum, byte[] file) {
+    public void saveAuthInfo(AppInfo appInfo, AuthEnum authEnum, byte[] file) {
         List<OrgInfo> orgInfoList = solarService.getOrgList();
         List<TSAuth> tsAuthList = null;
         Set<Long> orgIdsSet = null;
@@ -142,7 +146,7 @@ public class AuthInfoServiceImpl implements AuthInfoService {
             QueryWrapper<TSAuth> tsAuthQueryWrapper = new QueryWrapper<>();
             tsAuthQueryWrapper.lambda().in(TSAuth::getSchoolId, orgIdsSet);
             tsAuthService.remove(tsAuthQueryWrapper);
-            tsAuthService.saveOrUpdateBatch(tsAuthList);
+            tsAuthMapper.insertBatch(tsAuthList);
         }
     }
 }

+ 5 - 1
distributed-print/src/main/java/com/qmth/distributed/print/DistributedPrintApplication.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print;
 
 import com.qmth.boot.core.security.service.CustomizeAuthorizationService;
 import com.qmth.distributed.print.auth.DistributedPrintAuthenticationService;
+import com.qmth.teachcloud.common.base.CustomizedSqlInjector;
 import com.qmth.teachcloud.common.threadPool.MyThreadPool;
 import org.activiti.spring.boot.SecurityAutoConfiguration;
 import org.mybatis.spring.annotation.MapperScan;
@@ -13,7 +14,6 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.task.TaskExecutor;
 import org.springframework.scheduling.annotation.EnableAsync;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 import javax.annotation.Resource;
@@ -48,4 +48,8 @@ public class DistributedPrintApplication {
         return new MyThreadPool();
     }
 
+    @Bean
+    public CustomizedSqlInjector customizedSqlInjector() {
+        return new CustomizedSqlInjector();
+    }
 }

+ 44 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/base/CustomBaseMapper.java

@@ -0,0 +1,44 @@
+package com.qmth.teachcloud.common.base;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+/**
+ * @Description: 自定义mapper
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/5/11
+ */
+public interface CustomBaseMapper<T> extends BaseMapper<T> {
+
+    /**
+     * 自定义批量插入
+     * 如果要自动填充,@Param(xx) xx参数名必须是 list/collection/array 3个的其中之一
+     *
+     * @param list
+     * @return
+     */
+    int insertBatch(@Param("collection") Collection<? extends Serializable> list);
+
+    /**
+     * 自定义批量更新
+     * 如果要自动填充,@Param(xx) xx参数名必须是 list/collection/array 3个的其中之一
+     *
+     * @param list
+     * @return
+     */
+    int updateBatch(@Param("collection") Collection<? extends Serializable> list);
+
+    /**
+     * 自定义批量新增或更新
+     * 如果要自动填充,@Param(xx) xx参数名必须是 list/collection/array 3个的其中之一
+     *
+     * @param list
+     * @return
+     */
+    int insertOrUpdateBath(@Param("collection") Collection<? extends Serializable> list);
+}

+ 32 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/base/CustomizedSqlInjector.java

@@ -0,0 +1,32 @@
+package com.qmth.teachcloud.common.base;
+
+import com.baomidou.mybatisplus.core.injector.AbstractMethod;
+import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
+import com.qmth.teachcloud.common.base.method.InsertBatch;
+import com.qmth.teachcloud.common.base.method.InsertOrUpdateBath;
+import com.qmth.teachcloud.common.base.method.UpdateBatch;
+
+import java.util.List;
+
+/**
+ * @Description: 自定义批量sql插入、更新
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/5/11
+ */
+public class CustomizedSqlInjector extends DefaultSqlInjector {
+
+    /**
+     * 如果只需增加方法,保留mybatis plus自带方法,
+     * 可以先获取super.getMethodList(),再添加add
+     */
+    @Override
+    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
+        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
+        methodList.add(new InsertBatch());
+        methodList.add(new UpdateBatch());
+        methodList.add(new InsertOrUpdateBath());
+        return methodList;
+    }
+}

+ 63 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/base/method/InsertBatch.java

@@ -0,0 +1,63 @@
+package com.qmth.teachcloud.common.base.method;
+
+import com.baomidou.mybatisplus.core.injector.AbstractMethod;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import org.apache.ibatis.executor.keygen.NoKeyGenerator;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @Description: 自定义批量插入
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/5/11
+ */
+public class InsertBatch extends AbstractMethod {
+    private final static Logger log = LoggerFactory.getLogger(InsertBatch.class);
+
+    /**
+     * insert into user(id, name, age) values (1, "a", 17), (2, "b", 18);
+     * <script>
+     * insert into user(id, name, age) values
+     * <foreach collection="collection" item="item" index="index" open="(" separator="),(" close=")">
+     * #{item.id}, #{item.name}, #{item.age}
+     * </foreach>
+     * </script>
+     */
+    @Override
+    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
+        final String sql = "<script>insert into %s %s values %s</script>";
+        final String fieldSql = prepareFieldSql(tableInfo);
+        final String valueSql = prepareValuesSql(tableInfo);
+        final String sqlResult = String.format(sql, tableInfo.getTableName(), fieldSql, valueSql);
+        log.debug("sqlResult----->{}", sqlResult);
+        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
+        // 第三个参数必须和RootMapper的自定义方法名一致
+        return this.addInsertMappedStatement(mapperClass, modelClass, "insertBatch", sqlSource, new NoKeyGenerator(), null, null);
+    }
+
+    private String prepareFieldSql(TableInfo tableInfo) {
+        StringBuilder fieldSql = new StringBuilder();
+        fieldSql.append(tableInfo.getKeyColumn()).append(",");
+        tableInfo.getFieldList().forEach(x -> {
+            fieldSql.append(x.getColumn()).append(",");
+        });
+        fieldSql.delete(fieldSql.length() - 1, fieldSql.length());
+        fieldSql.insert(0, "(");
+        fieldSql.append(")");
+        return fieldSql.toString();
+    }
+
+    private String prepareValuesSql(TableInfo tableInfo) {
+        final StringBuilder valueSql = new StringBuilder();
+        valueSql.append("<foreach collection=\"collection\" item=\"item\" index=\"index\" open=\"(\" separator=\"),(\" close=\")\">");
+        valueSql.append("#{item.").append(tableInfo.getKeyProperty()).append("},");
+        tableInfo.getFieldList().forEach(x -> valueSql.append("#{item.").append(x.getProperty()).append("},"));
+        valueSql.delete(valueSql.length() - 1, valueSql.length());
+        valueSql.append("</foreach>");
+        return valueSql.toString();
+    }
+}

+ 85 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/base/method/InsertOrUpdateBath.java

@@ -0,0 +1,85 @@
+package com.qmth.teachcloud.common.base.method;
+
+import com.baomidou.mybatisplus.core.injector.AbstractMethod;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import org.apache.ibatis.executor.keygen.NoKeyGenerator;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.StringUtils;
+
+/**
+ * @Description: 自定义插入或更新
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/5/11
+ */
+public class InsertOrUpdateBath extends AbstractMethod {
+    private final static Logger log = LoggerFactory.getLogger(InsertOrUpdateBath.class);
+
+    @Override
+    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
+        final String sql = "<script>insert into %s %s values %s ON DUPLICATE KEY UPDATE %s</script>";
+        final String tableName = tableInfo.getTableName();
+        final String filedSql = prepareFieldSql(tableInfo);
+        final String modelValuesSql = prepareModelValuesSql(tableInfo);
+        final String duplicateKeySql = prepareDuplicateKeySql(tableInfo);
+        final String sqlResult = String.format(sql, tableName, filedSql, modelValuesSql, duplicateKeySql);
+        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
+        return this.addInsertMappedStatement(mapperClass, modelClass, "insertOrUpdateBath", sqlSource, new NoKeyGenerator(), null, null);
+    }
+
+    /**
+     * 准备ON DUPLICATE KEY UPDATE sql
+     *
+     * @param tableInfo
+     * @return
+     */
+    private String prepareDuplicateKeySql(TableInfo tableInfo) {
+        final StringBuilder duplicateKeySql = new StringBuilder();
+        if (!StringUtils.isEmpty(tableInfo.getKeyColumn())) {
+            duplicateKeySql.append(tableInfo.getKeyColumn()).append("=values(").append(tableInfo.getKeyColumn()).append("),");
+        }
+
+        tableInfo.getFieldList().forEach(x -> {
+            duplicateKeySql.append(x.getColumn())
+                    .append("=values(")
+                    .append(x.getColumn())
+                    .append("),");
+        });
+        duplicateKeySql.delete(duplicateKeySql.length() - 1, duplicateKeySql.length());
+        return duplicateKeySql.toString();
+    }
+
+    /**
+     * 准备属性名
+     *
+     * @param tableInfo
+     * @return
+     */
+    private String prepareFieldSql(TableInfo tableInfo) {
+        StringBuilder fieldSql = new StringBuilder();
+        fieldSql.append(tableInfo.getKeyColumn()).append(",");
+        tableInfo.getFieldList().forEach(x -> {
+            fieldSql.append(x.getColumn()).append(",");
+        });
+        fieldSql.delete(fieldSql.length() - 1, fieldSql.length());
+        fieldSql.insert(0, "(");
+        fieldSql.append(")");
+        return fieldSql.toString();
+    }
+
+    private String prepareModelValuesSql(TableInfo tableInfo) {
+        final StringBuilder valueSql = new StringBuilder();
+        valueSql.append("<foreach collection=\"collection\" item=\"item\" index=\"index\" open=\"(\" separator=\"),(\" close=\")\">");
+        if (!StringUtils.isEmpty(tableInfo.getKeyProperty())) {
+            valueSql.append("#{item.").append(tableInfo.getKeyProperty()).append("},");
+        }
+        tableInfo.getFieldList().forEach(x -> valueSql.append("#{item.").append(x.getProperty()).append("},"));
+        valueSql.delete(valueSql.length() - 1, valueSql.length());
+        valueSql.append("</foreach>");
+        return valueSql.toString();
+    }
+}

+ 30 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/base/method/UpdateBatch.java

@@ -0,0 +1,30 @@
+package com.qmth.teachcloud.common.base.method;
+
+import com.baomidou.mybatisplus.core.injector.AbstractMethod;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @Description: 自定义更新
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/5/11
+ */
+public class UpdateBatch extends AbstractMethod {
+    private final static Logger log = LoggerFactory.getLogger(UpdateBatch.class);
+
+    @Override
+    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
+        String sql = "<script>\n<foreach collection=\"collection\" item=\"item\" separator=\";\">\nupdate %s %s where %s=#{%s} %s\n</foreach>\n</script>";
+        String additional = tableInfo.isWithVersion() ? tableInfo.getVersionFieldInfo().getVersionOli("item", "item.") : "" + tableInfo.getLogicDeleteSql(true, true);
+        String setSql = sqlSet(tableInfo.isWithLogicDelete(), false, tableInfo, false, "item", "item.");
+        String sqlResult = String.format(sql, tableInfo.getTableName(), setSql, tableInfo.getKeyColumn(), "item." + tableInfo.getKeyProperty(), additional);
+        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
+        // 第三个参数必须和RootMapper的自定义方法名一致
+        return this.addUpdateMappedStatement(mapperClass, modelClass, "updateBatch", sqlSource);
+    }
+}

+ 31 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/HttpUtil.java

@@ -3,6 +3,7 @@ package com.qmth.teachcloud.common.util;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import org.apache.commons.io.FileUtils;
+import org.apache.http.Consts;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.HttpClient;
@@ -15,6 +16,7 @@ import org.apache.http.impl.client.HttpClients;
 import org.apache.http.message.BasicHeader;
 import org.apache.http.message.BasicNameValuePair;
 import org.apache.http.protocol.HTTP;
+import org.apache.http.util.EntityUtils;
 import org.apache.tomcat.util.http.fileupload.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -94,6 +96,35 @@ public class HttpUtil {
         return getRespString(post);
     }
 
+    /**
+     * get 请求
+     *
+     * @param url
+     * @param params
+     * @param secret
+     * @param timestamp
+     * @return
+     */
+    public static String get(String url, Map<String, Object> params, String secret, Long timestamp) throws IOException {
+        // 构建请求参数
+        List<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>();
+        if (params != null) {
+            for (String key : params.keySet()) {
+                pairs.add(new BasicNameValuePair(key, String.valueOf(params.get(key))));
+            }
+        }
+        String str = EntityUtils.toString(new UrlEncodedFormEntity(pairs, Consts.UTF_8));//转换为键值对
+        HttpGet get = new HttpGet(url + "?" + str);
+        if (Objects.nonNull(secret)) {
+            get.setHeader(SystemConstant.HEADER_AUTHORIZATION, secret);
+        }
+        if (Objects.nonNull(timestamp)) {
+            get.setHeader(SystemConstant.HEADER_TIME, String.valueOf(timestamp));
+        }
+        // 执行请求,获取响应
+        return getRespString(get);
+    }
+
     /**
      * 获取响应信息
      *