Эх сурвалжийг харах

定时任务--每小时更新50张表中的阿里云地址,只限于m_table_info中的表细腻些

LHB 3 сар өмнө
parent
commit
dbaf93fb21

+ 37 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TableInfoMapper.java

@@ -16,12 +16,15 @@
  */
 package org.springblade.manager.mapper;
 
+import org.apache.ibatis.annotations.Param;
 import org.springblade.manager.entity.TableInfo;
+import org.springblade.manager.entity.WbsFormElement;
 import org.springblade.manager.vo.TableInfoVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 实体主表信息 Mapper 接口
@@ -44,4 +47,38 @@ public interface TableInfoMapper extends BaseMapper<TableInfo> {
 
     TableInfo selectByTabEnName(String tabName);
 
+    /**
+     * 获取未更新过表中阿里云地址的表名
+     * @return
+     */
+    List<TableInfo> selectListByAliyunUrlState();
+
+    /**
+     * 查询指定表指定列是否包含指定数据
+     * @param tabEnName 表名
+     * @param fields 字段集合
+     * @return
+     */
+    List<String> countTableFields(@Param("tableName") String tabEnName,
+                                  @Param("fields") List<String> fields,
+                                  @Param("url") String url);
+
+    /**
+     * 替换阿里云地址
+     * @param tableName 表名
+     * @param errorUrl 阿里云地址
+     * @param correctUrl 正确地址
+     * @param fields 替换的字段集合
+     * @return
+     */
+    Integer updateALiYunUrl(@Param("tableName")String tableName,
+                            @Param("errorUrl") String errorUrl,
+                            @Param("correctUrl")String correctUrl,
+                            @Param("fields")List<String> fields);
+
+    /**
+     * 添加更新成功的表记录
+     * @param ids
+     */
+    void insertAliyun(@Param("ids") List<Long> ids);
 }

+ 25 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TableInfoMapper.xml

@@ -18,6 +18,20 @@
         <result column="table_owner" property="tableOwner"/>
         <result column="fill_rate" property="fillRate"/>
     </resultMap>
+    <insert id="insertAliyun">
+        insert into m_table_info_aliyun values
+        <foreach collection="ids" item="id" separator=",">
+            (#{id})
+        </foreach>
+    </insert>
+    <update id="updateALiYunUrl">
+        update ${tableName}
+        <set>
+            <foreach collection="fields" item="field" separator=",">
+                ${field} = REPLACE(${field},#{errorUrl},#{correctUrl})
+            </foreach>
+        </set>
+    </update>
 
 
     <select id="selectTableInfoPage" resultMap="tableInfoResultMap">
@@ -39,5 +53,16 @@
     <select id="selectByTabEnName" resultMap="tableInfoResultMap">
         select * from m_table_info where is_deleted = 0 and tab_ch_name=#{tabName}
     </select>
+    <select id="selectListByAliyunUrlState" resultType="org.springblade.manager.entity.TableInfo">
+        select a.id,a.tab_en_name from m_table_info a left JOIN m_table_info_aliyun b on a.id = b.id
+        where b.id is null and a.is_deleted = 0 limit 50;
+    </select>
+    <select id="countTableFields" resultType="java.lang.String">
+        select a.`key` from (
+            <foreach collection="fields" item="field" separator="UNION ALL">
+                select #{field} as `key`,count(0) count from ${tableName} where ${field} like concat(#{url},'%')
+            </foreach>
+        ) a where a.count > 0
+    </select>
 
 </mapper>

+ 58 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/TableInfoServiceImpl.java

@@ -16,13 +16,26 @@
  */
 package org.springblade.manager.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.manager.entity.TableInfo;
+import org.springblade.manager.entity.WbsFormElement;
+import org.springblade.manager.mapper.WbsFormElementMapper;
 import org.springblade.manager.vo.TableInfoVO;
 import org.springblade.manager.mapper.TableInfoMapper;
 import org.springblade.manager.service.ITableInfoService;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.PostConstruct;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * 实体主表信息 服务实现类
@@ -38,4 +51,49 @@ public class TableInfoServiceImpl extends BaseServiceImpl<TableInfoMapper, Table
         return page.setRecords(baseMapper.selectTableInfoPage(page, tableInfo));
     }
 
+    @Autowired
+    private WbsFormElementMapper wbsFormElementMapper;
+
+    /**
+     * 每小时执行一次
+     * 替换动态表中的阿里云地址
+     */
+    @Scheduled(cron = "0 0 * * * ?")
+    @Transactional
+    public void aliyunUrlReplace() {
+        System.out.println("执行阿里云地址替换-----------------------------开始");
+
+        String aliyunUrlOne = "https://blade-oss-chongqing.oss-cn-shenzhen.aliyuncs.com//upload";
+        String aliyunUrlTwo = "https://blade-oss-chongqing.oss-cn-shenzhen.aliyuncs.com/upload";
+        String correctUrl = "https://xinan1.zos.ctyun.cn/blade-oss-chongqing/upload";
+
+
+        List<TableInfo> tableInfos = baseMapper.selectListByAliyunUrlState();
+        if(CollectionUtil.isNotEmpty(tableInfos)){
+            for (TableInfo tableInfo : tableInfos) {
+                //获取字段
+                List<WbsFormElement> wbsFormElements = wbsFormElementMapper.selectList(new QueryWrapper<WbsFormElement>().lambda().eq(WbsFormElement::getFId, tableInfo.getId()));
+
+                if (CollectionUtil.isNotEmpty(wbsFormElements)) {
+                    List<String> fields = wbsFormElements.stream().map(WbsFormElement::getEKey).collect(Collectors.toList());
+                    //存在字段
+                    List<String> countTableFields = baseMapper.countTableFields(tableInfo.getTabEnName(), fields, aliyunUrlOne);
+                    if (CollectionUtil.isNotEmpty(countTableFields)) {
+                        //替换
+                        baseMapper.updateALiYunUrl(tableInfo.getTabEnName(), aliyunUrlOne, correctUrl, countTableFields);
+                    }
+                    //排查第二种类型的阿里云地址
+                    List<String> fieldsTwo = baseMapper.countTableFields(tableInfo.getTabEnName(), fields, aliyunUrlTwo);
+                    if(CollectionUtil.isNotEmpty(fieldsTwo)){
+                        //替换
+                        baseMapper.updateALiYunUrl(tableInfo.getTabEnName(), aliyunUrlTwo, correctUrl, fieldsTwo);
+                    }
+                }
+            }
+
+            //更新成功 把当前表的数据
+            baseMapper.insertAliyun(tableInfos.stream().map(TableInfo::getId).collect(Collectors.toList()));
+        }
+        System.out.println("执行阿里云地址替换-----------------------------结束");
+    }
 }