|
|
@@ -0,0 +1,213 @@
|
|
|
+package vip.xiaonuo.coldchain.modular.alarmuser;
|
|
|
+
|
|
|
+import jakarta.annotation.Resource;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.ibatis.session.SqlSession;
|
|
|
+import org.apache.ibatis.session.SqlSessionFactory;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|
|
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
|
|
|
+import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
+import org.springframework.jdbc.core.RowMapper;
|
|
|
+import org.springframework.scheduling.annotation.Scheduled;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import vip.xiaonuo.coldchain.modular.alarmuser.entity.AlarmUser;
|
|
|
+import vip.xiaonuo.coldchain.modular.alarmuser.service.AlarmUserService;
|
|
|
+import vip.xiaonuo.sys.modular.user.entity.SysUser;
|
|
|
+import vip.xiaonuo.sys.modular.user.service.SysUserService;
|
|
|
+
|
|
|
+import java.sql.ResultSet;
|
|
|
+import java.sql.SQLException;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Component
|
|
|
+@ConditionalOnProperty(name = "private.flag", havingValue = "true")
|
|
|
+@Slf4j
|
|
|
+public class AlarmUserScheduled {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private JdbcTemplate jdbcTemplate;
|
|
|
+ @Resource
|
|
|
+ private SysUserService sysUserService;
|
|
|
+ @Resource
|
|
|
+ private AlarmUserService alarmUserService;
|
|
|
+
|
|
|
+ @Scheduled(cron = "${private.cron}")
|
|
|
+ @Transactional
|
|
|
+ public void alarmUser() {
|
|
|
+ log.info("开始执行数据同步任务");
|
|
|
+ long startTime = System.currentTimeMillis();
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 同步sys_user数据
|
|
|
+ syncSysUserData();
|
|
|
+
|
|
|
+ // 同步alarm_user数据
|
|
|
+ syncAlarmUserData();
|
|
|
+
|
|
|
+ long costTime = System.currentTimeMillis() - startTime;
|
|
|
+ log.info("数据同步任务完成,耗时: {}ms", costTime);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("数据同步任务执行失败", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步sys_user数据
|
|
|
+ */
|
|
|
+ private void syncSysUserData() {
|
|
|
+ try {
|
|
|
+ // 获取公网的sysUser
|
|
|
+ List<SysUser> publicSysUserList = getPublicSysUserList();
|
|
|
+ // 获取本地的sysUser
|
|
|
+ List<SysUser> privateSysUserList = sysUserService.list();
|
|
|
+
|
|
|
+ log.info("SysUser同步 - 公网: {}条, 本地: {}条",
|
|
|
+ publicSysUserList.size(), privateSysUserList.size());
|
|
|
+
|
|
|
+ // 差异对比,对本地sysUser进行更新,只增不减
|
|
|
+ List<SysUser> newSysUsers = extractNewSysUsers(publicSysUserList, privateSysUserList);
|
|
|
+
|
|
|
+ if (!newSysUsers.isEmpty()) {
|
|
|
+ sysUserService.saveBatch(newSysUsers);
|
|
|
+ log.info("SysUser同步 - 成功新增 {} 条数据", newSysUsers.size());
|
|
|
+ } else {
|
|
|
+ log.info("SysUser同步 - 没有新数据需要同步");
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("SysUser数据同步失败", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步alarm_user数据
|
|
|
+ */
|
|
|
+ private void syncAlarmUserData() {
|
|
|
+ try {
|
|
|
+ // 获取公网的alarmUser
|
|
|
+ List<AlarmUser> publicAlarmUserList = getPublicAlarmUserList();
|
|
|
+ // 获取本地的alarmUser
|
|
|
+ List<AlarmUser> privateAlarmUserList = alarmUserService.list();
|
|
|
+
|
|
|
+ log.info("AlarmUser同步 - 公网: {}条, 本地: {}条",
|
|
|
+ publicAlarmUserList.size(), privateAlarmUserList.size());
|
|
|
+
|
|
|
+ // 差异对比,对本地alarmUser进行更新,只增不减
|
|
|
+ List<AlarmUser> newAlarmUsers = extractNewAlarmUsers(publicAlarmUserList, privateAlarmUserList);
|
|
|
+
|
|
|
+ if (!newAlarmUsers.isEmpty()) {
|
|
|
+ alarmUserService.saveBatch(newAlarmUsers);
|
|
|
+ log.info("AlarmUser同步 - 成功新增 {} 条数据", newAlarmUsers.size());
|
|
|
+ } else {
|
|
|
+ log.info("AlarmUser同步 - 没有新数据需要同步");
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("AlarmUser数据同步失败", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 使用JdbcTemplate获取公网sys_user数据
|
|
|
+ */
|
|
|
+ public List<SysUser> getPublicSysUserList() {
|
|
|
+ String sql = "SELECT * FROM sys_user_public WHERE DELETE_FLAG = 'NOT_DELETE'";
|
|
|
+ try {
|
|
|
+ // 方式1:使用BeanPropertyRowMapper(字段名匹配时)
|
|
|
+ return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(SysUser.class));
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("BeanPropertyRowMapper映射失败,尝试手动映射: {}", e.getMessage());
|
|
|
+ return new ArrayList<>();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 使用JdbcTemplate获取公网alarm_user数据
|
|
|
+ */
|
|
|
+ public List<AlarmUser> getPublicAlarmUserList() {
|
|
|
+ String sql = "SELECT * FROM alarm_user_public WHERE DELETE_FLAG = 'NOT_DELETE'";
|
|
|
+ try {
|
|
|
+ return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(AlarmUser.class));
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("BeanPropertyRowMapper映射失败,尝试手动映射: {}", e.getMessage());
|
|
|
+ return new ArrayList<>();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 提取新的SysUser(公网有但本地没有的)
|
|
|
+ */
|
|
|
+ private List<SysUser> extractNewSysUsers(List<SysUser> publicUsers, List<SysUser> privateUsers) {
|
|
|
+ if (publicUsers == null || publicUsers.isEmpty()) {
|
|
|
+ return new ArrayList<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 提取本地用户的ID集合
|
|
|
+ Set<String> privateUserIds = privateUsers.stream()
|
|
|
+ .map(SysUser::getId)
|
|
|
+ .filter(id -> id != null && !id.trim().isEmpty())
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ // 过滤出公网用户中ID不在本地用户ID集合中的用户
|
|
|
+ return publicUsers.stream()
|
|
|
+ .filter(user -> user.getId() != null && !user.getId().trim().isEmpty())
|
|
|
+ .filter(user -> !privateUserIds.contains(user.getId()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 提取新的AlarmUser(公网有但本地没有的)
|
|
|
+ */
|
|
|
+ private List<AlarmUser> extractNewAlarmUsers(List<AlarmUser> publicUsers, List<AlarmUser> privateUsers) {
|
|
|
+ if (publicUsers == null || publicUsers.isEmpty()) {
|
|
|
+ return new ArrayList<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 提取本地用户的ID集合
|
|
|
+ Set<String> privateUserIds = privateUsers.stream()
|
|
|
+ .map(AlarmUser::getId)
|
|
|
+ .filter(id -> id != null && !id.trim().isEmpty())
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ // 过滤出公网用户中ID不在本地用户ID集合中的用户
|
|
|
+ return publicUsers.stream()
|
|
|
+ .filter(user -> user.getId() != null && !user.getId().trim().isEmpty())
|
|
|
+ .filter(user -> !privateUserIds.contains(user.getId()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 增强版的数据获取方法(带分页,适合大数据量)
|
|
|
+ */
|
|
|
+ public List<SysUser> getPublicSysUserListWithPagination(int pageSize, int pageNum) {
|
|
|
+ int offset = (pageNum - 1) * pageSize;
|
|
|
+ String sql = "SELECT * FROM sys_user_public LIMIT ? OFFSET ?";
|
|
|
+
|
|
|
+ try {
|
|
|
+ return jdbcTemplate.query(sql, new Object[]{pageSize, offset}, new BeanPropertyRowMapper<>(SysUser.class));
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("分页查询公网sys_user数据失败", e);
|
|
|
+ return new ArrayList<>();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取数据总数(用于分页)
|
|
|
+ */
|
|
|
+ public int getPublicSysUserCount() {
|
|
|
+ String sql = "SELECT COUNT(*) FROM sys_user_public";
|
|
|
+
|
|
|
+ try {
|
|
|
+ return jdbcTemplate.queryForObject(sql, Integer.class);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("获取公网sys_user数据总数失败", e);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|