提交 05d9a191 authored 作者: 黄承天's avatar 黄承天

fix(user):修正一些错误

上级 14fd8bf7
......@@ -6,7 +6,7 @@ import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
* 增量数据对象
* @author c
* @since 2022-03-21
*/
......@@ -18,8 +18,8 @@ public class Change {
private String type;
private String table;
private String entity;
private String key;
private String id;
}
package org.matrix.remote.service;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j;
import org.matrix.local.mapper.KsProjectMapper;
import org.matrix.local.mapper.KsUserMapper;
import org.matrix.local.mapper.KsUserProjectMapper;
import org.matrix.remote.entity.ZtProject;
import org.matrix.remote.entity.ZtUser;
import org.matrix.remote.entity.ZtUserView;
import org.matrix.remote.mapper.ChangeMapper;
import org.matrix.remote.mapper.ZtProjectMapper;
import org.matrix.remote.mapper.ZtUserMapper;
import org.matrix.remote.mapper.ZtUserViewMapper;
......@@ -19,9 +21,12 @@ import java.util.List;
/**
* 禅道数据全量同步工具
*/
@Slf4j
@Service
public class DataAllCollector {
@Autowired
private ChangeMapper changeMapper;
@Autowired
private ZtUserMapper ztUserMapper;
@Autowired
......@@ -45,6 +50,9 @@ public class DataAllCollector {
* 执行一次全量同步
*/
public void execute() {
log.info("全量同步禅道用户项目数据...");
//清空增量记录
changeMapper.delete(Wrappers.lambdaQuery());
//用户数据
collectUser();
saveUser();
......@@ -54,6 +62,7 @@ public class DataAllCollector {
//用户项目关系数据
collectUserView();
saveUserProject();
log.info("同步结束....");
}
//------------------------------------private-------------------------------------
......
......@@ -20,7 +20,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
import static java.util.Objects.nonNull;
......@@ -52,19 +51,25 @@ public class DataTriggerCollector {
* 执行一次增量同步
*/
public void execute() {
boolean hasChanges = changeMapper.selectCount(Wrappers.lambdaQuery()) > 0;
Long count = changeMapper.selectCount(Wrappers.lambdaQuery());
boolean hasChanges = count > 0;
if (hasChanges) {
List<Change> changes = changeMapper.selectList(Wrappers.lambdaQuery());
changes.forEach(this::handle);
}
changeMapper.delete(Wrappers.lambdaQuery());
}
//----------------------------------------private-----------------------------------------
/**
* 增量数据同步处理
* @param change 增量数据
*/
private void handle(Change change) {
String table = change.getTable();
log.info("发现数据变更 数据类型:{} 操作类型:{} 主键:{}", change.getTable(), change.getType(), change.getKey());
switch (table) {
String entity = change.getEntity();
log.info("发现数据变更 数据类型:{} 操作类型:{} 主键:{}", change.getEntity(), change.getType(), change.getId());
switch (entity) {
case "user":
handleUser(change);
return;
......@@ -76,11 +81,10 @@ public class DataTriggerCollector {
return;
default:
}
changeMapper.delete(Wrappers.lambdaQuery(change));
}
private void handleUser(Change change) {
Integer id = Integer.valueOf(change.getKey());
Integer id = Integer.valueOf(change.getId());
ZtUser ztUser = ztUserMapper.selectById(id);
String type = change.getType();
switch (type) {
......@@ -104,7 +108,7 @@ public class DataTriggerCollector {
}
private void handleProject(Change change) {
Integer id = Integer.valueOf(change.getKey());
Integer id = Integer.valueOf(change.getId());
ZtProject ztProject = ztProjectMapper.selectById(id);
String type = change.getType();
switch (type) {
......@@ -128,7 +132,7 @@ public class DataTriggerCollector {
}
private void handleUserView(Change change) {
String account = change.getKey();
String account = change.getId();
ZtUserView ztUserView = ztUserViewMapper.selectOne(Wrappers.<ZtUserView>lambdaQuery().eq(ZtUserView::getAccount, account));
String type = change.getType();
switch (type) {
......
......@@ -4,15 +4,11 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.matrix.local.entity.Project;
import org.matrix.local.entity.User;
import org.matrix.local.entity.UserProject;
import org.matrix.local.mapper.KsProjectMapper;
import org.matrix.local.mapper.KsUserMapper;
import org.matrix.local.mapper.KsUserProjectMapper;
import org.matrix.remote.entity.ZtProject;
import org.matrix.remote.entity.ZtUser;
import org.matrix.remote.entity.ZtUserView;
import org.matrix.remote.mapper.ZtProjectMapper;
import org.matrix.remote.mapper.ZtUserMapper;
import org.matrix.remote.mapper.ZtUserViewMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -24,21 +20,16 @@ import java.util.stream.Collectors;
import static java.util.Objects.nonNull;
/**
* 数据类型转换器
*/
@Service
public class TransHelper {
@Autowired
private ZtUserMapper ztUserMapper;
@Autowired
private ZtUserViewMapper ztUserViewMapper;
@Autowired
private ZtProjectMapper ztProjectMapper;
@Autowired
private KsUserMapper ksUserMapper;
@Autowired
private KsProjectMapper ksProjectMapper;
@Autowired
private KsUserProjectMapper ksUserProjectMapper;
public User user(ZtUser ztUser) {
return new User(Long.valueOf(ztUser.getId()), ztUser.getRealname(), ztUser.getAccount(), ztUser.getPassword());
......@@ -48,7 +39,7 @@ public class TransHelper {
return new Project(Long.valueOf(ztProject.getId()), ztProject.getName());
}
public List<UserProject> userProjects(ZtUserView ztUserView) {
List<UserProject> userProjects(ZtUserView ztUserView) {
User user = ksUserMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getAccount, ztUserView.getAccount()));
if (nonNull(user)) {
Long userId = user.getId();
......@@ -64,8 +55,9 @@ public class TransHelper {
}
}
//private---------------------------------------------------------------------------
public Long findProjectId(ZtProject ztProject) {
private Long findProjectId(ZtProject ztProject) {
if (nonNull(ztProject.getProject()) && ztProject.getProject() > 0) {
return Long.valueOf(ztProject.getProject());
} else {
......@@ -73,7 +65,7 @@ public class TransHelper {
}
}
public List<String> toList(String content) {
private List<String> toList(String content) {
List<String> result = Arrays.stream(content.split(",")).collect(Collectors.toList());
result.remove(0);
return result;
......
......@@ -8,11 +8,11 @@ import org.springframework.stereotype.Service;
/**
* 用于增量同步的初始化操作
* 1.对需要监听数据的表进行添加触发器
* 2.与创建记录数据变化的表
* 2.与创建记录数据变化的增量表
* <p>
* 触发器的内容是对增量表里插入该条数据变化的关键内容
* 此后可通过读取该增量表来进行增量同步
* <p>
* 触发器的内容是对记录用的表里插入该条数据变化的大致内容
* 此后可通过读取该表来进行增量同步
*
* PS:选择性使用
*/
@SuppressWarnings("SqlNoDataSourceInspection")
......@@ -26,19 +26,19 @@ public class TriggerInitial {
/**
* 创建数据变化
* 创建增量数据
* 该表有3个字段
* type:该条变化数据的操作类型(INSERT、UPDATE、DELETE)
* table:该条变化数据属于哪个表
* key:该条变化数据的主键值(可以根据该主键值在原表查出具体数据再做同步更新、删除操作则只需指定主键值
* entity:该条增量数据属于哪个表
* key:该条变化数据的唯一标识(一般为主键值 可以根据该标识在原表查出具体数据再做同步更新、删除操作则只需指定标识
*/
public void createChangeTable() {
String dropChangeTableSQL = "DROP TABLE IF EXISTS `zentao`.`kt_change`;\n";
jdbcTemplate.execute(dropChangeTableSQL);
String createChangeTableSQL = "CREATE TABLE `zentao`.`kt_change` (\n" +
" `type` VARCHAR(11) NULL,\n" +
" `table` VARCHAR(255) NULL,\n" +
" `data_key` VARCHAR(255) NULL);\n";
" `entity` VARCHAR(255) NULL,\n" +
" `id` VARCHAR(255) NULL);\n";
jdbcTemplate.execute(createChangeTableSQL);
}
......@@ -49,21 +49,24 @@ public class TriggerInitial {
String dropInsertTrigger = "DROP TRIGGER IF EXISTS `zentao`.`zt_user_AFTER_INSERT`;\n";
String createInsertTrigger = "CREATE TRIGGER `zentao`.`zt_user_AFTER_INSERT` AFTER INSERT ON `zt_user` FOR EACH ROW\n" +
"BEGIN\n" +
"insert into `zentao`.`kt_change` (`type`,`table`, `content`) values ('insert','user',new.id);\n" +
"insert into `zentao`.`kt_change` (`type`,`entity`, `id`) values ('insert','user',new.id);\n" +
"END;";
jdbcTemplate.execute(dropInsertTrigger);
jdbcTemplate.execute(createInsertTrigger);
String dropUpdateTrigger = "DROP TRIGGER IF EXISTS `zentao`.`zt_user_AFTER_UPDATE`;\n";
String createUpdateTrigger = "CREATE TRIGGER `zentao`.`zt_user_AFTER_UPDATE` AFTER UPDATE ON `zt_user` FOR EACH ROW\n" +
"BEGIN\n" +
"insert into `zentao`.`kt_change` (`type`,`table`, `key`) values ('update','user',new.id);\n" +
"IF(new.account != old.account or new.password != old.password or new.realname != old.realname)\n" +
"THEN\n" +
"insert into `zentao`.`kt_change` (`type`,`entity`, `id`) values ('update','user',new.id);\n" +
"END IF;\n" +
"END;";
jdbcTemplate.execute(dropUpdateTrigger);
jdbcTemplate.execute(createUpdateTrigger);
String dropDeleteTrigger = "DROP TRIGGER IF EXISTS `zentao`.`zt_user_AFTER_DELETE`;\n";
String createDeleteTrigger = "CREATE TRIGGER `zentao`.`zt_user_AFTER_DELETE` AFTER DELETE ON `zt_user` FOR EACH ROW\n" +
"BEGIN\n" +
"insert into `zentao`.`kt_change` (`type`,`table`, `key`) values ('delete','user',old.id);\n" +
"insert into `zentao`.`kt_change` (`type`,`entity`, `id`) values ('delete','user',old.id);\n" +
"END;";
jdbcTemplate.execute(dropDeleteTrigger);
jdbcTemplate.execute(createDeleteTrigger);
......@@ -76,21 +79,24 @@ public class TriggerInitial {
String dropInsertTrigger = "DROP TRIGGER IF EXISTS `zentao`.`zt_project_AFTER_INSERT`;\n";
String createInsertTrigger = "CREATE TRIGGER `zentao`.`zt_project_AFTER_INSERT` AFTER INSERT ON `zt_project` FOR EACH ROW\n" +
"BEGIN\n" +
"insert into `zentao`.`kt_change` (`type`,`table`, `content`) values ('insert','project',new.id);\n" +
"insert into `zentao`.`kt_change` (`type`,`entity`, `id`) values ('insert','project',new.id);\n" +
"END;";
jdbcTemplate.execute(dropInsertTrigger);
jdbcTemplate.execute(createInsertTrigger);
String dropUpdateTrigger = "DROP TRIGGER IF EXISTS `zentao`.`zt_project_AFTER_UPDATE`;\n";
String createUpdateTrigger = "CREATE TRIGGER `zentao`.`zt_project_AFTER_UPDATE` AFTER UPDATE ON `zt_project` FOR EACH ROW\n" +
"BEGIN\n" +
"insert into `zentao`.`kt_change` (`type`,`table`, `key`) values ('update','project',new.id);\n" +
"IF(new.name != old.name)\n" +
"THEN\n" +
"insert into `zentao`.`kt_change` (`type`,`entity`, `id`) values ('update','project',new.id);\n" +
"END IF;\n" +
"END;";
jdbcTemplate.execute(dropUpdateTrigger);
jdbcTemplate.execute(createUpdateTrigger);
String dropDeleteTrigger = "DROP TRIGGER IF EXISTS `zentao`.`zt_project_AFTER_DELETE`;\n";
String createDeleteTrigger = "CREATE TRIGGER `zentao`.`zt_project_AFTER_DELETE` AFTER DELETE ON `zt_project` FOR EACH ROW\n" +
"BEGIN\n" +
"insert into `zentao`.`kt_change` (`type`,`table`, `key`) values ('delete','project',old.id);\n" +
"insert into `zentao`.`kt_change` (`type`,`entity`, `id`) values ('delete','project',old.id);\n" +
"END;";
jdbcTemplate.execute(dropDeleteTrigger);
jdbcTemplate.execute(createDeleteTrigger);
......@@ -103,21 +109,21 @@ public class TriggerInitial {
String dropInsertTrigger = "DROP TRIGGER IF EXISTS `zentao`.`zt_userview_AFTER_INSERT`;\n";
String createInsertTrigger = "CREATE TRIGGER `zentao`.`zt_userview_AFTER_INSERT` AFTER INSERT ON `zt_userview` FOR EACH ROW\n" +
"BEGIN\n" +
"insert into `zentao`.`kt_change` (`type`,`table`, `content`) values ('insert','userview',new.account);\n" +
"insert into `zentao`.`kt_change` (`type`,`entity`, `id`) values ('insert','userview',new.account);\n" +
"END;";
jdbcTemplate.execute(dropInsertTrigger);
jdbcTemplate.execute(createInsertTrigger);
String dropUpdateTrigger = "DROP TRIGGER IF EXISTS `zentao`.`zt_userview_AFTER_UPDATE`;\n";
String createUpdateTrigger = "CREATE TRIGGER `zentao`.`zt_userview_AFTER_UPDATE` AFTER UPDATE ON `zt_userview` FOR EACH ROW\n" +
"BEGIN\n" +
"insert into `zentao`.`kt_change` (`type`,`table`, `key`) values ('update','userview',new.account);\n" +
"insert into `zentao`.`kt_change` (`type`,`entity`, `id`) values ('update','userview',new.account);\n" +
"END;";
jdbcTemplate.execute(dropUpdateTrigger);
jdbcTemplate.execute(createUpdateTrigger);
String dropDeleteTrigger = "DROP TRIGGER IF EXISTS `zentao`.`zt_userview_AFTER_DELETE`;\n";
String createDeleteTrigger = "CREATE TRIGGER `zentao`.`zt_userview_AFTER_DELETE` AFTER DELETE ON `zt_userview` FOR EACH ROW\n" +
"BEGIN\n" +
"insert into `zentao`.`kt_change` (`type`,`table`, `key`) values ('delete','userview',old.account);\n" +
"insert into `zentao`.`kt_change` (`type`,`entity`, `id`) values ('delete','userview',old.account);\n" +
"END;";
jdbcTemplate.execute(dropDeleteTrigger);
jdbcTemplate.execute(createDeleteTrigger);
......
......@@ -2,6 +2,7 @@ package org.matrix.remote.task;
import lombok.extern.slf4j.Slf4j;
import org.matrix.remote.service.DataAllCollector;
import org.matrix.remote.service.DataTriggerCollector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.scheduling.annotation.Scheduled;
......@@ -14,23 +15,36 @@ import org.springframework.stereotype.Component;
@Component
public class DataCollectorTask implements CommandLineRunner {
@Autowired
private DataAllCollector dataAllCollector;
@Autowired
private DataTriggerCollector dataTriggerCollector;
/**
* 同步禅道取的用户和项目数据
* 全量同步禅道取的用户和项目数据
* 每小时收集一次
*/
@Scheduled(cron = "0 0 */1 * * ?")
public void collect() {
log.info("同步禅道用户项目数据...");
// @Scheduled(cron = "0 0 */1 * * ?")
public void allCollect() {
dataAllCollector.execute();
log.info("同步结束....");
}
/**
* 增量同步禅道取的用户和项目数据
* 每分钟收集一次
*/
@Scheduled(cron = "0 */1 * * * ?")
public void triggerCollect() {
dataTriggerCollector.execute();
}
/**
* 在项目刚启动时进行一次全量同步
* 后续则轮询进行增量同步
*/
@Override
public void run(String... args) {
allCollect();
}
}
......@@ -20,7 +20,10 @@ class KtZentaoApplicationTests {
@Test
void test() {
triggerInitial.createChangeTable();
triggerInitial.createUserTrigger();
triggerInitial.createProjectTrigger();
triggerInitial.createUserViewTrigger();
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论