添加数据同步代码

This commit is contained in:
hzj
2024-01-10 10:40:02 +08:00
parent 4702c266a4
commit ff80efa279
8 changed files with 94 additions and 51 deletions

View File

@@ -57,9 +57,12 @@ public enum ServiceTypeEnum {
* @return * @return
*/ */
public static List<String> getExecutableTypes() { public static List<String> getExecutableTypes() {
return Arrays.stream(ServiceTypeEnum.values()).map(ServiceTypeEnum::name).collect(Collectors.toList()); return Arrays.stream(ServiceTypeEnum.values()).map(tmep->{
return tmep.code;
}).collect(Collectors.toList());
} }
/** /**
* 通过code获取枚举值 * 通过code获取枚举值
* @param code * @param code

View File

@@ -9,7 +9,9 @@ import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Objects;
/** /**
* *
@@ -34,22 +36,14 @@ public class JobDetail {
* 起始时间 * 起始时间
*/ */
@JsonFormat( @JsonFormat(
pattern = "yyyy-MM-dd HH:mm:ss" pattern = "yyyy-MM-dd"
) )
@MppMultiId(value = "START_TIME") @MppMultiId(value = "EXCUTE_DATE")
private LocalDateTime startTime; private LocalDate excuteDate;
/** /**
* 截止时间 * 状态0-执行中、1-成功、2-失败,3未执行
*/
@JsonFormat(
pattern = "yyyy-MM-dd HH:mm:ss"
)
@MppMultiId(value = "END_TIME")
private LocalDateTime endTime;
/**
* 状态0-执行中、1-成功、2-失败)
*/ */
@TableField(value = "STATE") @TableField(value = "STATE")
private Integer state; private Integer state;
@@ -65,5 +59,17 @@ public class JobDetail {
@TableField(value = "UPDATE_TIME") @TableField(value = "UPDATE_TIME")
private LocalDateTime updateTime; private LocalDateTime updateTime;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
JobDetail jobDetail = (JobDetail) o;
return Objects.equals(tableName, jobDetail.tableName) && Objects.equals(excuteDate, jobDetail.excuteDate);
}
} }

View File

@@ -5,8 +5,7 @@
<!--@mbg.generated--> <!--@mbg.generated-->
<!--@Table JOB_DETAIL--> <!--@Table JOB_DETAIL-->
<id column="TABLE_NAME" jdbcType="VARCHAR" property="tableName" /> <id column="TABLE_NAME" jdbcType="VARCHAR" property="tableName" />
<id column="START_TIME" jdbcType="TIMESTAMP" property="startTime" /> <id column="EXCUTE_DATE" jdbcType="TIMESTAMP" property="excuteDate" />
<id column="END_TIME" jdbcType="TIMESTAMP" property="endTime" />
<id column="STATE" jdbcType="DECIMAL" property="state" /> <id column="STATE" jdbcType="DECIMAL" property="state" />
<result column="ROW_COUNT" jdbcType="DECIMAL" property="rowCount" /> <result column="ROW_COUNT" jdbcType="DECIMAL" property="rowCount" />
<result column="UPDATE_TIME" jdbcType="TIMESTAMP" property="updateTime" /> <result column="UPDATE_TIME" jdbcType="TIMESTAMP" property="updateTime" />
@@ -19,7 +18,7 @@
<select id="query" resultMap="BaseResultMap"> <select id="query" resultMap="BaseResultMap">
select * from ( select row_.*, rownum rownum_ from ( select * from ( select row_.*, rownum rownum_ from (
select * from JOB_DETAIL a where 1=1 select * from JOB_DETAIL a where 1=1
and a.START_TIME between #{jobQueryParam.startTime,jdbcType=DATE} and #{jobQueryParam.endTime,jdbcType=DATE} and a.EXCUTE_DATE between #{jobQueryParam.startTime,jdbcType=DATE} and #{jobQueryParam.endTime,jdbcType=DATE}
<if test="jobQueryParam.states!=null and jobQueryParam.states.size()!=0"> <if test="jobQueryParam.states!=null and jobQueryParam.states.size()!=0">
AND a.STATE IN AND a.STATE IN
<foreach collection="jobQueryParam.states" item="item" open="(" close=")" separator=","> <foreach collection="jobQueryParam.states" item="item" open="(" close=")" separator=",">
@@ -32,7 +31,7 @@
#{item} #{item}
</foreach> </foreach>
</if> </if>
order by a.START_TIME desc order by a.EXCUTE_DATE desc
) row_ ) row_
where rownum &lt;= #{jobQueryParam.currentPage} * #{jobQueryParam.pageSize} ) where rownum_ &gt; (#{jobQueryParam.currentPage} - 1) * #{jobQueryParam.pageSize} where rownum &lt;= #{jobQueryParam.currentPage} * #{jobQueryParam.pageSize} ) where rownum_ &gt; (#{jobQueryParam.currentPage} - 1) * #{jobQueryParam.pageSize}
</select> </select>

View File

@@ -1,8 +1,9 @@
package com.njcn.oracle.service; package com.njcn.oracle.service;
import com.njcn.oracle.bo.param.MigrationParam;
import com.njcn.oracle.mybatis.service.IReplenishMybatisService; import com.njcn.oracle.mybatis.service.IReplenishMybatisService;
import java.time.LocalDate;
/** /**
* Description: * Description:
* Date: 2024/1/8 16:16【需求编号】 * Date: 2024/1/8 16:16【需求编号】
@@ -11,5 +12,5 @@ import com.njcn.oracle.mybatis.service.IReplenishMybatisService;
* @version V1.0.0 * @version V1.0.0
*/ */
public interface DataSyncService { public interface DataSyncService {
void dataSync(IReplenishMybatisService executor, String temp, MigrationParam migration); void dataSync(IReplenishMybatisService executor, String temp, LocalDate migration);
} }

View File

@@ -1,6 +1,8 @@
package com.njcn.oracle.service.impl; package com.njcn.oracle.service.impl;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.njcn.oracle.bo.param.MigrationParam; import com.njcn.oracle.bo.param.MigrationParam;
import com.njcn.oracle.bo.po.JobDetail; import com.njcn.oracle.bo.po.JobDetail;
import com.njcn.oracle.mybatis.service.IReplenishMybatisService; import com.njcn.oracle.mybatis.service.IReplenishMybatisService;
@@ -10,8 +12,8 @@ import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@@ -29,16 +31,21 @@ public class DataSyncServiceImpl implements DataSyncService {
@Override @Override
@Async @Async
public void dataSync(IReplenishMybatisService executor, String temp, MigrationParam migration) { public void dataSync(IReplenishMybatisService executor, String temp, LocalDate date) {
LocalDateTime localDateTime = date.atStartOfDay();
LocalDateTime tempStartTime = LocalDateTimeUtil.beginOfDay(localDateTime);
LocalDateTime tempEndTime = LocalDateTimeUtil.endOfDay(localDateTime);
MigrationParam migration = new MigrationParam();
migration.setStartTime(tempStartTime);
migration.setEndTime(tempEndTime);
List list = executor.queryData(migration); List list = executor.queryData(migration);
JobDetail jobDetail = new JobDetail(); JobDetail jobDetail = new JobDetail();
jobDetail.setTableName(temp); jobDetail.setTableName(temp);
jobDetail.setStartTime(migration.getStartTime()); jobDetail.setExcuteDate(date);
jobDetail.setEndTime(migration.getEndTime());
JobDetail select = jobDetailService.select(jobDetail); JobDetail select = jobDetailService.select(jobDetail);
if (Objects.nonNull(select)){ if (Objects.nonNull(select)){

View File

@@ -7,10 +7,16 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.jeffreyning.mybatisplus.service.MppServiceImpl; import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
import com.njcn.oracle.bo.param.JobQueryParam; import com.njcn.oracle.bo.param.JobQueryParam;
import com.njcn.oracle.bo.param.ServiceTypeEnum; import com.njcn.oracle.bo.param.ServiceTypeEnum;
import com.njcn.oracle.util.LocalDateUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.oracle.mybatis.mapper.JobDetailMapper; import com.njcn.oracle.mybatis.mapper.JobDetailMapper;
import com.njcn.oracle.bo.po.JobDetail; import com.njcn.oracle.bo.po.JobDetail;
@@ -33,8 +39,7 @@ public class JobDetailServiceImpl extends MppServiceImpl<JobDetailMapper, JobDet
@Override @Override
public JobDetail select(JobDetail jobDetail) { public JobDetail select(JobDetail jobDetail) {
JobDetail jobDetail1 = this.lambdaQuery().eq(JobDetail::getTableName,jobDetail.getTableName()). JobDetail jobDetail1 = this.lambdaQuery().eq(JobDetail::getTableName,jobDetail.getTableName()).
eq(JobDetail::getStartTime,jobDetail.getStartTime()). eq(JobDetail::getExcuteDate,jobDetail.getExcuteDate()).one();
eq(JobDetail::getEndTime,jobDetail.getEndTime()).one();
return jobDetail1; return jobDetail1;
} }
@@ -42,16 +47,41 @@ public class JobDetailServiceImpl extends MppServiceImpl<JobDetailMapper, JobDet
public IPage<JobDetail> selectByParam(JobQueryParam jobQueryParam) { public IPage<JobDetail> selectByParam(JobQueryParam jobQueryParam) {
IPage<JobDetail> page = new Page<>(jobQueryParam.getCurrentPage(), jobQueryParam.getPageSize()); IPage<JobDetail> page = new Page<>(jobQueryParam.getCurrentPage(), jobQueryParam.getPageSize());
QueryWrapper<JobDetail> queryWrapper = new QueryWrapper<>(); QueryWrapper<JobDetail> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().between(JobDetail::getStartTime, jobQueryParam.getStartTime(), jobQueryParam.getEndTime()). queryWrapper.lambda().between(JobDetail::getExcuteDate, jobQueryParam.getStartTime(), jobQueryParam.getEndTime()).
in(!CollectionUtils.isEmpty(jobQueryParam.getStates()), JobDetail::getState, jobQueryParam.getStates()). in(!CollectionUtils.isEmpty(jobQueryParam.getStates()), JobDetail::getState, jobQueryParam.getStates()).
in(!CollectionUtils.isEmpty(jobQueryParam.getTableNames()), JobDetail::getTableName, jobQueryParam.getTableNames()).orderByDesc(JobDetail::getStartTime); in(!CollectionUtils.isEmpty(jobQueryParam.getTableNames()), JobDetail::getTableName, jobQueryParam.getTableNames());
Integer integer = this.getBaseMapper().selectCount(queryWrapper); List<JobDetail> jobDetails = this.getBaseMapper().selectList(queryWrapper);
List<String> tableNames = new ArrayList<>();
if(CollectionUtils.isEmpty(jobQueryParam.getTableNames())){
tableNames = ServiceTypeEnum.getExecutableTypes();
}else {
tableNames = jobQueryParam.getTableNames();
}
List<LocalDate> dateList = LocalDateUtil.getDateList(jobQueryParam.getStartTime(), jobQueryParam.getEndTime());
List<String> finalTableNames = tableNames;
dateList.stream().forEach(localDate -> {
finalTableNames.stream().forEach(temp->{
JobDetail jobDetail = new JobDetail();
jobDetail.setTableName(temp);
jobDetail.setExcuteDate(localDate);
if (jobDetails.contains(jobDetail)){
return;
}
jobDetail.setTableName_CN(ServiceTypeEnum.getValueByCode(temp));
jobDetail.setState(3);
jobDetails.add(jobDetail);
});
});
List<JobDetail> jobDetailIPage = this.getBaseMapper().query(jobQueryParam); List<JobDetail> jobDetailIPage= jobDetails.stream().sorted(Comparator.comparing(JobDetail::getExcuteDate).reversed()).
skip((jobQueryParam.getCurrentPage() - 1) * jobQueryParam.getPageSize()).
limit(jobQueryParam.getPageSize()).collect(Collectors.toList());
jobDetailIPage.stream().forEach(temp->temp.setTableName_CN(ServiceTypeEnum.getValueByCode(temp.getTableName()))); jobDetailIPage.stream().forEach(temp->temp.setTableName_CN(ServiceTypeEnum.getValueByCode(temp.getTableName())));
page.setRecords(jobDetailIPage); page.setRecords(jobDetailIPage);
page.setTotal(Long.parseLong(integer+"")); page.setTotal(Long.parseLong(jobDetails.size()+""));
return page; return page;
} }
@@ -59,8 +89,7 @@ public class JobDetailServiceImpl extends MppServiceImpl<JobDetailMapper, JobDet
public boolean jobRemove(JobDetail jobDetail) { public boolean jobRemove(JobDetail jobDetail) {
QueryWrapper<JobDetail> queryWrapper = new QueryWrapper<>(); QueryWrapper<JobDetail> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(JobDetail::getTableName,jobDetail.getTableName()). queryWrapper.lambda().eq(JobDetail::getTableName,jobDetail.getTableName()).
eq(JobDetail::getStartTime,jobDetail.getStartTime()). eq(JobDetail::getExcuteDate,jobDetail.getExcuteDate());
eq(JobDetail::getEndTime,jobDetail.getEndTime());
boolean remove = this.remove(queryWrapper); boolean remove = this.remove(queryWrapper);
return remove; return remove;
} }

View File

@@ -64,20 +64,10 @@ public class DataSyncController {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
List<LocalDate> dateList = LocalDateUtil.getDateList(dataAsynParam.getStartTime(), dataAsynParam.getEndTime()); List<LocalDate> dateList = LocalDateUtil.getDateList(dataAsynParam.getStartTime(), dataAsynParam.getEndTime());
LocalDateTime startTime = LocalDateTimeUtil.beginOfDay(dataAsynParam.getStartTime().atStartOfDay());
LocalDateTime endTime = LocalDateTimeUtil.endOfDay(dataAsynParam.getEndTime().atStartOfDay());
IReplenishMybatisService finalExecutor = executor; IReplenishMybatisService finalExecutor = executor;
dateList.forEach(date->{ dateList.forEach(date->{
LocalDateTime localDateTime = date.atStartOfDay();
LocalDateTime tempStartTime = LocalDateTimeUtil.beginOfDay(localDateTime);
LocalDateTime tempEndTime = LocalDateTimeUtil.endOfDay(localDateTime);
tempStartTime =LocalDateTimeUtil.parse(tempStartTime.format(formatter),DatePattern.NORM_DATETIME_PATTERN); dataSyncService.dataSync(finalExecutor,temp,date);
tempEndTime =LocalDateTimeUtil.parse(tempEndTime.format(formatter),DatePattern.NORM_DATETIME_PATTERN);
MigrationParam migration = new MigrationParam();
migration.setStartTime(tempStartTime);
migration.setEndTime(tempEndTime);
dataSyncService.dataSync(finalExecutor,temp,migration);
}); });

View File

@@ -70,6 +70,7 @@
<el-option label="执行中" value="0"></el-option> <el-option label="执行中" value="0"></el-option>
<el-option label="成功" value="1"></el-option> <el-option label="成功" value="1"></el-option>
<el-option label="失败" value="2"></el-option> <el-option label="失败" value="2"></el-option>
<el-option label="未执行" value="3"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@@ -80,8 +81,8 @@
<el-table :data="tableData" style="width: 100%; height: calc(100vh - 120px)" stripe align="center" v-loading="formInline.loading"> <el-table :data="tableData" style="width: 100%; height: calc(100vh - 120px)" stripe align="center" v-loading="formInline.loading">
<el-table-column prop="tableName" label="指标名"></el-table-column> <el-table-column prop="tableName" label="指标名"></el-table-column>
<el-table-column prop="tableName_CN" label="表名"></el-table-column> <el-table-column prop="tableName_CN" label="表名"></el-table-column>
<el-table-column prop="startTime" label="日期(年月日)"> <el-table-column prop="excuteDate" label="日期(年月日)">
<template #default="scope"> {{scope.row.startTime&&scope.row.startTime.split(' ')[0]}} </template> <!-- <template #default="scope"> {{scope.row.startTime&&scope.row.startTime.split(' ')[0]}} </template>-->
</el-table-column> </el-table-column>
<el-table-column prop="rowCount" label="条目数"></el-table-column> <el-table-column prop="rowCount" label="条目数"></el-table-column>
<el-table-column prop="updateTime" label="执行时间"></el-table-column> <el-table-column prop="updateTime" label="执行时间"></el-table-column>
@@ -90,6 +91,7 @@
<el-tag effect="dark" type="danger" v-if="scope.row.state === 2">失败</el-tag> <el-tag effect="dark" type="danger" v-if="scope.row.state === 2">失败</el-tag>
<el-tag effect="dark" type="primary" v-else-if="scope.row.state === 0">执行中</el-tag> <el-tag effect="dark" type="primary" v-else-if="scope.row.state === 0">执行中</el-tag>
<el-tag effect="dark" type="success" v-else-if="scope.row.state === 1">成功</el-tag> <el-tag effect="dark" type="success" v-else-if="scope.row.state === 1">成功</el-tag>
<el-tag effect="dark" type="danger" v-else-if="scope.row.state === 3">未执行</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="name" label="操作"> <el-table-column prop="name" label="操作">
@@ -99,7 +101,7 @@
<el-button type="danger" text v-if="scope.row.state === 1">删除</el-button> <el-button type="danger" text v-if="scope.row.state === 1">删除</el-button>
</template> </template>
</el-popconfirm> </el-popconfirm>
<el-button type="primary" text v-if="scope.row.state === 2" @click="move(scope.row)">迁移</el-button> <el-button type="primary" text v-if="scope.row.state === 2 || scope.row.state === 3" @click="move(scope.row)">迁移</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -198,6 +200,13 @@
}) })
.then((res) => { .then((res) => {
console.log(res) console.log(res)
res.records.forEach(item=>{
for(let key in item){
if(!item[key] && item[key] !== 0){
item[key] = '/'
}
}
})
tableData.value = res.records tableData.value = res.records
formInline.total = res.total formInline.total = res.total
}) })
@@ -222,8 +231,8 @@
if (row) { if (row) {
obj = { obj = {
tableNames: [row.tableName], tableNames: [row.tableName],
startTime: row.startTime.split(' ')[0], startTime: row.excuteDate,
endTime: row.startTime.split(' ')[0], endTime: row.excuteDate,
} }
} }
fetch('/data/dataSync', { fetch('/data/dataSync', {
@@ -253,8 +262,7 @@
}, },
body: JSON.stringify({ body: JSON.stringify({
tableName: row.tableName, tableName: row.tableName,
startTime: row.startTime, excuteDate: row.excuteDate,
endTime: row.endTime,
}), }),
}) })
.then((res) => { .then((res) => {