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

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	ruoyi-api/ruoyi-api-sync/src/main/java/org/dromara/sync/api/RemoteKafkaSyncService.java
#	ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/event/kafka/impl/cloud/TeacherEventStrategyImpl.java
#	ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/business/kafka/SyncKafkaService.java
#	ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/dubbo/RemoteKafkaSyncServiceImpl.java
#	ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/IDeptService.java
#	ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/impl/DeptServiceImpl.java
#	ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/strategy/dept/impl/HrDeptStrategyImpl.java
luo.yibo@datuai.com 1 жил өмнө
parent
commit
24b18f5d7c
18 өөрчлөгдсөн 936 нэмэгдсэн , 24 устгасан
  1. 3 0
      ruoyi-api/ruoyi-api-sync/src/main/java/org/dromara/sync/api/RemoteKafkaSyncService.java
  2. 10 5
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java
  3. 1 1
      ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/util/TeacherUtils.java
  4. 1 1
      ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/consumer/KafkaCloudConsumer.java
  5. 8 6
      ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/event/kafka/impl/cloud/TeacherEventStrategyImpl.java
  6. 5 2
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/business/kafka/SyncKafkaService.java
  7. 195 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/SysUser.java
  8. 73 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/UserDept.java
  9. 199 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/bo/SysUserBo.java
  10. 77 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/bo/UserDeptBo.java
  11. 197 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/vo/SysUserVo.java
  12. 5 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/dubbo/RemoteKafkaSyncServiceImpl.java
  13. 24 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/mq/PushKafkaData.java
  14. 2 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/IDeptService.java
  15. 26 3
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/impl/DeptServiceImpl.java
  16. 12 6
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/strategy/dept/impl/HrDeptStrategyImpl.java
  17. 32 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/strategy/user/ISyncUserStrategy.java
  18. 66 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/strategy/user/impl/SyncTeacherStrategyImpl.java

+ 3 - 0
ruoyi-api/ruoyi-api-sync/src/main/java/org/dromara/sync/api/RemoteKafkaSyncService.java

@@ -12,4 +12,7 @@ import cn.hutool.json.JSONObject;
  */
 public interface RemoteKafkaSyncService {
     void syncTeacherDept(JSONObject data);
+
+    void syncDelTeacherDept(JSONObject data);
+
 }

+ 10 - 5
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java

@@ -264,12 +264,17 @@ public class SysDeptServiceImpl implements ISysDeptService {
                 throw new ServiceException("部门停用,不允许新增");
             }
         }
-        if (bo.getOrderNum() == null || bo.getOrderNum() == 0) {
-            int orderNum = this.getMaxLevelOrderNumb(info.getDeptId());
-            bo.setOrderNum(orderNum + 1);
-        }
+        //if (bo.getOrderNum() == null || bo.getOrderNum() == 0) {
+        //    int orderNum = this.getMaxLevelOrderNumb(info.getDeptId());
+        //    bo.setOrderNum(orderNum + 1);
+        //}
         SysDept dept = MapstructUtils.convert(bo, SysDept.class);
-        dept.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + dept.getParentId());
+        if (ObjectUtil.isNotEmpty(info)) {
+            dept.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + dept.getParentId());
+        } else {
+            dept.setAncestors(dept.getParentId().toString());
+        }
+
         int count = baseMapper.insert(dept);
         if (count > 0) {
             bo.setDeptId(dept.getDeptId());

+ 1 - 1
ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/util/TeacherUtils.java

@@ -98,7 +98,7 @@ public class TeacherUtils {
     public static List<ResourceDept> getSycDeleteDept(JSONObject data) {
         List<ResourceDept> resourceDeptlist = new ArrayList<>();
         ResourceDept dept = new ResourceDept();
-        dept.setDept_id(data.get("id").toString());
+        dept.setDept_id(data.get("dept_id").toString());
         dept.setOperatorId(DefaultConstants.KAFKA_SYNC_ADMIN);
         if (ObjectUtil.isNotEmpty(data.get("tenantId"))) {
             dept.setTenantId(data.get("tenantId").toString());

+ 1 - 1
ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/consumer/KafkaCloudConsumer.java

@@ -43,7 +43,7 @@ public class KafkaCloudConsumer {
         KafkaMessage<?> receiveMsg = JSONUtil.toBean(record.value(), KafkaMessage.class);
         String sender = receiveMsg.getHeader().getSender();
         //在eventBus主题中,sender=005是由本系统发出,无需业务处理
-        if (ObjUtil.notEqual(sender, "005")) {
+        if (ObjUtil.notEqual(sender, "005") && ObjUtil.notEqual(sender, "006")) {
             doMessageHandle(receiveMsg);
         }
     }

+ 8 - 6
ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/event/kafka/impl/cloud/TeacherEventStrategyImpl.java

@@ -46,14 +46,16 @@ public class TeacherEventStrategyImpl implements IYktEventStrategy {
                 // syncDeptStrategyContent.syncDept(resourceDeptlist, SyncResourceConstants.HR_DEPT);
             }
             case EventTypeConstants.DEPT_EDIT -> {
-                List<ResourceDept> resourceDeptlist = TeacherUtils.getSyncDept(JSONUtil.parseObj(msg));
-                log.info("[处理业务中台->云端部门修改请求]-[部门信息:{}]", JSONUtil.toJsonStr(resourceDeptlist));
-                syncDeptStrategyContent.syncDept(resourceDeptlist, SyncResourceConstants.HR_DEPT);
+                //List<ResourceDept> resourceDeptlist = TeacherUtils.getSyncDept(JSONUtil.parseObj(msg));
+                log.info("[处理业务中台->云端部门修改请求]-[部门信息:{}]", JSONUtil.toJsonStr(msg));
+                remoteKafkaSyncService.syncTeacherDept(JSONUtil.parseObj(msg));
+                //syncDeptStrategyContent.syncDept(resourceDeptlist, SyncResourceConstants.HR_DEPT);
             }
             case EventTypeConstants.DEPT_DEL -> {
-                List<ResourceDept> resourceDeptlist = TeacherUtils.getSycDeleteDept(JSONUtil.parseObj(msg));
-                log.info("[处理业务中台->云端部门删除请求]-[部门信息:{}]", JSONUtil.toJsonStr(resourceDeptlist));
-                syncDeptStrategyContent.syncDelDept(resourceDeptlist, SyncResourceConstants.HR_DEPT);
+                //List<ResourceDept> resourceDeptlist = TeacherUtils.getSycDeleteDept(JSONUtil.parseObj(msg));
+                log.info("[处理业务中台->云端部门删除请求]-[部门信息:{}]", JSONUtil.toJsonStr(msg));
+                remoteKafkaSyncService.syncDelTeacherDept(JSONUtil.parseObj(msg));
+                //syncDeptStrategyContent.syncDelDept(resourceDeptlist, SyncResourceConstants.HR_DEPT);
             }
             case EventTypeConstants.TEACHER_ADD -> {
                 List<ResourcePerson> resourcePersonList = TeacherUtils.getSyncTeacher(JSONUtil.parseObj(msg));

+ 5 - 2
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/business/kafka/SyncKafkaService.java

@@ -27,9 +27,12 @@ public class SyncKafkaService {
 
     public void syncTeacherDept(JSONObject data) {
         List<ResourceDept> resourceDeptlist = TeacherUtils.getSyncDept(data);
-        log.info("[业中同步测试->部门同步]-[部门信息:{}]", JSONUtil.toJsonStr(resourceDeptlist));
         ISyncDeptStrategy syncDeptStrategy = SpringUtils.getBean(SyncResourceConstants.HR_DEPT, ISyncDeptStrategy.class);
         syncDeptStrategy.syncDept(resourceDeptlist);
     }
-
+    public void syncDelTeacherDept(JSONObject data){
+        List<ResourceDept> resourceDeptlist = TeacherUtils.getSycDeleteDept(data);
+        ISyncDeptStrategy syncDeptStrategy = SpringUtils.getBean(SyncResourceConstants.HR_DEPT, ISyncDeptStrategy.class);
+        syncDeptStrategy.syncDelDept(resourceDeptlist);
+    }
 }

+ 195 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/SysUser.java

@@ -0,0 +1,195 @@
+package org.dromara.server.sync.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.dromara.common.core.constant.UserConstants;
+import org.dromara.common.encrypt.annotation.EncryptField;
+import org.dromara.common.encrypt.enumd.AlgorithmType;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.util.Date;
+
+/**
+ * 用户对象 t_sys_user
+ *
+ * @author Lion Li
+ */
+
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_sys_user")
+public class SysUser extends TenantEntity {
+    /**
+     * 用户ID
+     */
+    @TableId(value = "user_id")
+    private Long userId;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 岗位Id
+     */
+    private Long postId;
+
+    /**
+     * 用户账号
+     */
+    private String userName;
+    /**
+     * 学/工号
+     */
+    private String userNumb;
+
+    /**
+     * 用户昵称
+     */
+    private String nickName;
+
+    /**
+     * 用户姓名
+     */
+    private String realName;
+
+    /**
+     * 通信地址
+     */
+    private String address;
+
+    /**
+     * 身份证号
+     */
+    @EncryptField(algorithm = AlgorithmType.BASE64)
+    private String idNumber;
+
+    /**
+     * 用户类型(sys_user系统用户)
+     */
+    private String userType;
+
+    /**
+     * 用户身份(0=内部用户 1=老师 2=学生 3=家长  4=其他人员)
+     */
+    private String category;
+    /**
+     * 用户邮箱
+     */
+    private String email;
+
+    /**
+     * 手机号码
+     */
+    @EncryptField(algorithm = AlgorithmType.BASE64)
+    private String phone;
+
+    /**
+     * 用户性别
+     */
+    private String sex;
+
+    /**
+     * 用户头像
+     */
+    private Long avatar;
+
+    /**
+     * 密码
+     */
+    @TableField(
+        insertStrategy = FieldStrategy.NOT_EMPTY,
+        updateStrategy = FieldStrategy.NOT_EMPTY,
+        whereStrategy = FieldStrategy.NOT_EMPTY
+    )
+    private String password;
+
+    /**
+     * 帐号状态(0正常 1停用)
+     */
+    private String status;
+
+
+    /**
+     * 最后登录IP
+     */
+    private String loginIp;
+
+    /**
+     * 最后登录时间
+     */
+    private Date loginDate;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 一卡通账户状态(0-未开户  1-已开户  -1已销户)
+     */
+    //private String accountStatus;
+
+    /**
+     * 账户是否被冻结,见sys_yes_no字典类型
+     */
+    //private String freezeStatus;
+
+    /**
+     * 消费密码
+     */
+    //private String consumePwd;
+
+    /**
+     * 账户流水号
+     */
+    //private Long userNo;
+
+    /**
+     * 账户卡片类型
+     */
+    //private Long cardType;
+
+    /**
+     * 账户有效期
+     */
+    //private Date lifespan;
+
+    /**
+     * 64位2进制数据,某位的数据1代表具备某个属性
+     */
+    private Long userAttr;
+
+    /**
+     * 人脸照片地址
+     */
+    private String photo;
+
+    /**
+     * 人员编制,对应 ZXXBZLB 字典类型
+     */
+    private String formation;
+
+    /**
+     * 是否隐藏,见sys_yes_no字典类型,内置的系统账号是需要隐藏的
+     */
+    private String hidden;
+
+    /**
+     * 唯一身份标识,第三方统一身份认证ID
+     */
+    private String otherId;
+
+    /**
+     * 第三方人员状态
+     */
+    private String userState;
+
+}

+ 73 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/UserDept.java

@@ -0,0 +1,73 @@
+package org.dromara.server.sync.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 用户部门对象 t_user_dept
+ *
+ * @author LionLi
+ * @date 2024-09-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_user_dept")
+public class UserDept extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户部门Id,主键
+     */
+    @TableId(value = "user_dept_id")
+    private Long userDeptId;
+
+    /**
+     * 用户Id
+     */
+    private Long userId;
+
+    /**
+     * 部门Id
+     */
+    private Long deptId;
+
+    /**
+     * 岗位Id
+     */
+    private Long postId;
+
+    /**
+     * 是否主部门,见sys_yes_no字典类别
+     */
+    private String mainDept;
+
+    /**
+     * 报到状态,见sys_yes_no字典类别,学员报到专用
+     */
+    private String checkStatus;
+
+    /**
+     * 报到时间,学员报到专用
+     */
+    private Date checkDate;
+
+    /**
+     * 缴费状态,见sys_yes_no字典类别,学员报到专用
+     */
+    private String payStatus;
+
+    /**
+     * 缴费时间,学员报到专用
+     */
+    private Date payDate;
+
+}

+ 199 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/bo/SysUserBo.java

@@ -0,0 +1,199 @@
+package org.dromara.server.sync.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.dromara.common.core.constant.UserConstants;
+import org.dromara.common.core.xss.Xss;
+import org.dromara.common.encrypt.annotation.EncryptField;
+import org.dromara.common.encrypt.enumd.AlgorithmType;
+import org.dromara.common.tenant.core.TenantEntity;
+import org.dromara.server.sync.domain.SysUser;
+
+import java.io.Serial;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 用户信息业务对象 sys_user
+ *
+ * @author Michelle.Chung
+ */
+
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysUser.class, reverseConvertGenerate = false)
+public class SysUserBo extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 3998379076407791877L;
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+    /**
+     * 岗位Id
+     */
+    private Long postId;
+    /**
+     * 用户账号
+     */
+    @Xss(message = "用户账号不能包含脚本字符")
+    @NotBlank(message = "用户账号不能为空")
+    @Size(min = 0, max = 30, message = "用户账号长度不能超过{max}个字符")
+    private String userName;
+
+    /**
+     * 学/工号
+     */
+    @Xss(message = "学/工号不能包含脚本字符")
+    @NotBlank(message = "学/工号不能为空")
+    @Size(min = 0, max = 30, message = "学/工号长度不能超过{max}个字符")
+    private String userNumb;
+    /**
+     * 用户昵称
+     */
+    private String nickName;
+    /**
+     * 用户姓名
+     */
+    private String realName;
+    /**
+     * 用户类型(sys_user系统用户)
+     */
+    private String userType;
+
+    /**
+     * 用户身份(0=内部用户 1=老师 2=学生 3=家长  4=其他人员)
+     */
+    private String category;
+    /**
+    /**
+     * 用户邮箱
+     */
+    @Email(message = "邮箱格式不正确")
+    @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符")
+    private String email;
+
+    /**
+     * 手机号码
+     */
+    @EncryptField(algorithm = AlgorithmType.BASE64)
+    private String phone;
+
+    /**
+     * 用户性别(0男 1女 2未知)
+     */
+    private String sex;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 帐号状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 角色组
+     */
+    @Size(min = 1, message = "用户角色不能为空")
+    private Long[] roleIds;
+
+    /**
+     * 岗位组
+     */
+    //private Long[] postIds;
+
+    /**
+     * 数据权限 当前角色ID
+     */
+    private Long roleId;
+
+    /**
+     * 账户卡片类型
+     */
+    //private Long cardType;
+
+    /**
+     * 账户有效期
+     */
+    //private Date lifespan;
+
+    /**
+     * 身份证号
+     */
+    private String idNumber;
+
+    /**
+     * 第三方统一标识Id
+     */
+    private String otherId;
+    /**
+     * 第三方人员状态
+     */
+    private String userState;
+    /*
+    人员所属部门
+     */
+    List<UserDeptBo> userDeptBoList;
+    /**
+     * 排除不查询的用户(工作流用)
+     */
+    private String excludeUserIds;
+
+    private Long cardId;
+    /**
+     * 卡流水号
+     */
+    //private Long cardNo;
+
+    /**
+     * 用户流水号
+     */
+    //private Long userNo;
+    /**
+     * 创建时间
+     */
+    //private Date createTime;
+    /**
+     * 创建者
+     */
+    //private Long createBy;
+
+    /**
+     * 更新者
+     */
+    //private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    //private Date updateTime;
+
+    //public SysUserBo(Long userId) {
+    //    this.userId = userId;
+    //}
+
+    //public boolean isSuperAdmin() {
+    //    return UserConstants.SUPER_ADMIN_ID.equals(this.userId);
+    //}
+
+}

+ 77 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/bo/UserDeptBo.java

@@ -0,0 +1,77 @@
+package org.dromara.server.sync.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.sync.domain.UserDept;
+
+import java.util.Date;
+
+/**
+ * 用户部门业务对象 t_user_dept
+ *
+ * @author LionLi
+ * @date 2024-09-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = UserDept.class, reverseConvertGenerate = false)
+public class UserDeptBo extends BaseEntity {
+
+    /**
+     * 用户部门Id,主键
+     */
+    @NotNull(message = "用户部门Id,主键不能为空", groups = { EditGroup.class })
+    private Long userDeptId;
+
+    /**
+     * 用户Id
+     */
+    @NotNull(message = "用户Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long userId;
+
+    /**
+     * 部门Id
+     */
+    @NotNull(message = "部门Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long deptId;
+
+    /**
+     * 岗位Id
+     */
+    @NotNull(message = "岗位Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long postId;
+
+    /**
+     * 是否主部门,见sys_yes_no字典类别
+     */
+    @NotBlank(message = "是否主部门不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String mainDept;
+
+    /**
+     * 报到状态,见sys_yes_no字典类别,学员报到专用
+     */
+    private String checkStatus;
+
+    /**
+     * 报到时间,学员报到专用
+     */
+    private Date checkDate;
+
+    /**
+     * 缴费状态,见sys_yes_no字典类别,学员报到专用
+     */
+    private String payStatus;
+
+    /**
+     * 缴费时间,学员报到专用
+     */
+    private Date payDate;
+
+
+}

+ 197 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/vo/SysUserVo.java

@@ -0,0 +1,197 @@
+package org.dromara.server.sync.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.common.encrypt.annotation.EncryptField;
+import org.dromara.common.encrypt.enumd.AlgorithmType;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.server.sync.domain.SysUser;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 用户信息视图对象 sys_user
+ *
+ * @author Michelle.Chung
+ */
+@Data
+@AutoMapper(target = SysUser.class)
+public class SysUserVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 岗位Id
+     */
+    private Long postId;
+
+    /**
+     * 用户账号
+     */
+    private String userName;
+    /**
+     * 学/工号
+     */
+    private String userNumb;
+
+    /**
+     * 用户昵称
+     */
+    private String nickName;
+
+    /**
+     * 用户姓名
+     */
+    private String realName;
+
+    /**
+     * 通信地址
+     */
+    private String address;
+
+    /**
+     * 身份证号
+     */
+    private String idNumber;
+
+    /**
+     * 用户类型(sys_user系统用户)
+     */
+    private String userType;
+
+    /**
+     * 用户身份(0=内部用户 1=老师 2=学生 3=家长  4=其他人员)
+     */
+    private String category;
+    /**
+     * 用户邮箱
+     */
+    private String email;
+
+    /**
+     * 手机号码
+     */
+    private String phone;
+
+    /**
+     * 用户性别
+     */
+    private String sex;
+
+    /**
+     * 用户头像
+     */
+    private Long avatar;
+
+    /**
+     * 密码
+     */
+    @TableField(
+        insertStrategy = FieldStrategy.NOT_EMPTY,
+        updateStrategy = FieldStrategy.NOT_EMPTY,
+        whereStrategy = FieldStrategy.NOT_EMPTY
+    )
+    private String password;
+
+    /**
+     * 帐号状态(0正常 1停用)
+     */
+    private String status;
+
+
+    /**
+     * 最后登录IP
+     */
+    private String loginIp;
+
+    /**
+     * 最后登录时间
+     */
+    private Date loginDate;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 一卡通账户状态(0-未开户  1-已开户  -1已销户)
+     */
+    //private String accountStatus;
+
+    /**
+     * 账户是否被冻结,见sys_yes_no字典类型
+     */
+    //private String freezeStatus;
+
+    /**
+     * 消费密码
+     */
+    //private String consumePwd;
+
+    /**
+     * 账户流水号
+     */
+    //private Long userNo;
+
+    /**
+     * 账户卡片类型
+     */
+    //private Long cardType;
+
+    /**
+     * 账户有效期
+     */
+    //private Date lifespan;
+
+    /**
+     * 64位2进制数据,某位的数据1代表具备某个属性
+     */
+    private Long userAttr;
+
+    /**
+     * 人脸照片地址
+     */
+    private String photo;
+
+    /**
+     * 人员编制,对应 ZXXBZLB 字典类型
+     */
+    private String formation;
+
+    /**
+     * 是否隐藏,见sys_yes_no字典类型,内置的系统账号是需要隐藏的
+     */
+    private String hidden;
+
+    /**
+     * 唯一身份标识,第三方统一身份认证ID
+     */
+    private String otherId;
+
+    /**
+     * 第三方人员状态
+     */
+    private String userState;
+}

+ 5 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/dubbo/RemoteKafkaSyncServiceImpl.java

@@ -25,4 +25,9 @@ public class RemoteKafkaSyncServiceImpl implements RemoteKafkaSyncService {
     public void syncTeacherDept(JSONObject data) {
         syncKafkaService.syncTeacherDept(data);
     }
+
+    @Override
+    public void syncDelTeacherDept(JSONObject data) {
+        syncKafkaService.syncDelTeacherDept(data);
+    }
 }

+ 24 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/mq/PushKafkaData.java

@@ -0,0 +1,24 @@
+package org.dromara.server.sync.mq;
+
+import cn.hutool.core.util.ObjectUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.config.DefaultConfig;
+import org.dromara.common.core.constant.DefaultConstants;
+import org.dromara.common.message.kafka.producer.KafkaCommonProducer;
+import org.springframework.stereotype.Service;
+
+@RequiredArgsConstructor
+@Slf4j
+@Service
+public class PushKafkaData {
+    private final KafkaCommonProducer kafkaNormalProducer;
+    private final DefaultConfig defaultConfig;
+
+    public void sendKafkaMessage(String topic, String eventType, String sender, Object data){
+        String pushData = defaultConfig.getLocationFlag();
+        if (ObjectUtil.isNotEmpty(pushData) && ObjectUtil.equals(pushData, DefaultConstants.CLOUD_FLAG)) {
+            kafkaNormalProducer.sendKafkaMessage(topic, eventType, sender, data);
+        }
+    }
+}

+ 2 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/IDeptService.java

@@ -25,4 +25,6 @@ public interface IDeptService {
     Boolean insertDept(SysDeptBo bo);
 
     Boolean updateDept(SysDeptBo bo);
+
+    Boolean deleteByOtherId(String otherId, String tenantId);
 }

+ 26 - 3
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/impl/DeptServiceImpl.java

@@ -7,11 +7,15 @@ import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.message.kafka.constant.EventTypeConstants;
+import org.dromara.common.message.kafka.constant.KafkaTopicConstants;
+import org.dromara.common.message.kafka.enums.EventSenderEnum;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.server.sync.domain.SysDept;
 import org.dromara.server.sync.domain.bo.SysDeptBo;
 import org.dromara.server.sync.domain.vo.SysDeptVo;
 import org.dromara.server.sync.mapper.SysDeptMapper;
+import org.dromara.server.sync.mq.PushKafkaData;
 import org.dromara.server.sync.service.IDeptService;
 import org.springframework.stereotype.Service;
 
@@ -29,12 +33,12 @@ import java.util.Objects;
 @RequiredArgsConstructor
 public class DeptServiceImpl implements IDeptService {
     private final SysDeptMapper deptMapper;
+    private final PushKafkaData kafkaNormalProducer;
 
     @Override
     public SysDeptVo selectByOtherId(String otherId, String tenantId) {
         return TenantHelper.ignore(
             () -> deptMapper.selectVoOne(new LambdaQueryWrapper<SysDept>().eq(SysDept::getOtherId, otherId).eq(SysDept::getTenantId, tenantId)));
-
     }
 
     @Override
@@ -54,6 +58,9 @@ public class DeptServiceImpl implements IDeptService {
             () -> deptMapper.insert(entity));
         if (iCount > 0) {
             bo.setDeptId(entity.getDeptId());
+            SysDeptVo vo = TenantHelper.ignore(
+                () -> deptMapper.selectVoById(bo.getDeptId()));
+            kafkaNormalProducer.sendKafkaMessage(KafkaTopicConstants.SYNC_DATA_TOPIC, EventTypeConstants.DEPT, EventSenderEnum.SYSTEM.code(), vo);
         }
         return iCount > 0;
     }
@@ -69,7 +76,11 @@ public class DeptServiceImpl implements IDeptService {
         }
         int iCount = TenantHelper.ignore(
             () -> deptMapper.updateById(entity));
-
+        if (iCount > 0) {
+            SysDeptVo vo = TenantHelper.ignore(
+                () -> deptMapper.selectVoById(bo.getDeptId()));
+            kafkaNormalProducer.sendKafkaMessage(KafkaTopicConstants.SYNC_DATA_TOPIC, EventTypeConstants.DEPT, EventSenderEnum.SYSTEM.code(), vo);
+        }
         return iCount > 0;
     }
 
@@ -93,6 +104,18 @@ public class DeptServiceImpl implements IDeptService {
         return R.fail();
     }
 
+    @Override
+    public Boolean deleteByOtherId(String otherId, String tenantId) {
+        // TODO 2025-01-24 10:41:56 luoyibo 删除前的校验
+        int iCount = TenantHelper.ignore(
+            () -> deptMapper.delete(new LambdaQueryWrapper<SysDept>().eq(SysDept::getOtherId, otherId).eq(SysDept::getTenantId, tenantId)));
+        if (iCount > 0) {
+            SysDeptVo vo = TenantHelper.ignore(
+                () -> deptMapper.selectVoOne(new LambdaQueryWrapper<SysDept>().eq(SysDept::getOtherId, otherId).eq(SysDept::getTenantId, tenantId)));
+            kafkaNormalProducer.sendKafkaMessage(KafkaTopicConstants.SYNC_DATA_TOPIC, EventTypeConstants.DEPT, EventSenderEnum.SYSTEM.code(), vo);
+        }
+        return iCount > 0;
+    }
 
     private String getAncestors(Long parentId) {
         if (ObjectUtil.equals(parentId, 0L)) {
@@ -110,7 +133,7 @@ public class DeptServiceImpl implements IDeptService {
         qw.eq("parent_id", deptId);
         qw.lt("order_num", 999);
 
-        SysDept dept = TenantHelper.ignore(()->deptMapper.selectOne(qw));
+        SysDept dept = TenantHelper.ignore(() -> deptMapper.selectOne(qw));
         if (dept == null) {
             return 1;
         }

+ 12 - 6
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/strategy/dept/impl/HrDeptStrategyImpl.java

@@ -35,7 +35,6 @@ import java.util.List;
 @RequiredArgsConstructor
 @Service(SyncResourceConstants.HR_DEPT)
 public class HrDeptStrategyImpl implements ISyncDeptStrategy {
-    private final SyncRemoteDeptService syncRemoteDeptService;
     private final IDeptService deptService;
 
     @Override
@@ -56,12 +55,19 @@ public class HrDeptStrategyImpl implements ISyncDeptStrategy {
     public void syncDelDept(List<ResourceDept> deptList) {
         List<String> syncDelMessage = new ArrayList<>();
         deptList.forEach(resourceDept -> {
-            R<Object> result = syncRemoteDeptService.deleteDeptByOtherId(resourceDept.getDept_id());
+            String otherId = resourceDept.getDept_id();
+            String tenantId = resourceDept.getTenantId();
+            try {
+                Boolean result = deptService.deleteByOtherId(otherId, tenantId);
 
-            if (result.getCode() == R.SUCCESS) {
-                syncDelMessage.add(MessageFormat.format("[同步删除部门成功]-[{0}]", JsonUtils.toJsonString(resourceDept)));
-            } else {
-                syncDelMessage.add(MessageFormat.format("[同步删除部门失败]-[{0}]-[{1}]", JsonUtils.toJsonString(resourceDept), result.getMsg()));
+                if (result) {
+                    syncDelMessage.add(MessageFormat.format("[同步删除部门成功]-[{0}]", JsonUtils.toJsonString(resourceDept)));
+                } else {
+                    syncDelMessage.add(MessageFormat.format("[同步删除部门失败]-[{0}]", JsonUtils.toJsonString(resourceDept)));
+                }
+            } catch (Exception e) {
+                log.error("[同步删除部门失败]-[{}]", JsonUtils.toJsonString(resourceDept), e);
+                syncDelMessage.add(MessageFormat.format("[同步删除部门失败]-[{0}]", JsonUtils.toJsonString(resourceDept)));
             }
         });
         syncDelMessage.forEach(System.out::println);

+ 32 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/strategy/user/ISyncUserStrategy.java

@@ -0,0 +1,32 @@
+package org.dromara.server.sync.strategy.user;
+
+import org.dromara.server.common.domain.bo.ResourcePerson;
+
+import java.util.List;
+
+/**
+ * name: ISyncUserStrategy
+ * package: org.dromara.server.base.user.service.strategy
+ * description: 人员同步写入策略
+ * date: 2024-10-23 11:13:28 11:13
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public interface ISyncUserStrategy {
+
+    /**
+     * 人员同步处理
+     * @param persons 源人员列表
+     * @return 同步结果
+     */
+    boolean syncUser(List<ResourcePerson> persons);
+
+    /**
+     * 人员同步删除处理
+     * @param persons 源人员列表
+     * @return 同步结果
+     */
+    boolean syncDelUser(List<ResourcePerson> persons);
+}

+ 66 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/strategy/user/impl/SyncTeacherStrategyImpl.java

@@ -0,0 +1,66 @@
+package org.dromara.server.sync.strategy.user.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.domain.model.ErrorInfo;
+import org.dromara.common.json.utils.JsonUtils;
+import org.dromara.server.base.service.user.SyncRemoteUserService;
+import org.dromara.server.base.service.user.strategy.ISyncUserStrategy;
+import org.dromara.server.common.constant.SyncResourceConstants;
+import org.dromara.server.common.domain.bo.ResourcePerson;
+import org.dromara.system.api.domain.vo.RemoteUserVo;
+import org.springframework.stereotype.Service;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * name: SyncTeacherStrategyImpl
+ * package: org.dromara.server.base.dept.service.strategy.impl
+ * description: 教职工同步处理策略
+ * date: 2024-10-18 14:40:23 14:40
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service(SyncResourceConstants.TEACHER)
+public class SyncTeacherStrategyImpl implements ISyncUserStrategy {
+    private final SyncRemoteUserService syncUserService;
+
+    @Override
+    public boolean syncUser(List<ResourcePerson> persons) {
+        List<String> syncMessage = new ArrayList<>();
+
+        persons.forEach(person -> {
+            R<RemoteUserVo> result = syncUserService.syncPeron(person);
+            if (result.getCode() == R.SUCCESS) {
+                syncMessage.add(MessageFormat.format("[同步教职工成功]-[{0}]", JsonUtils.toJsonString(person)));
+            } else {
+                syncMessage.add(MessageFormat.format("[同步教职工失败]-[{0}]-[{1}]", JsonUtils.toJsonString(person), result.getMsg()));
+            }
+        });
+        syncMessage.forEach(log::info);
+        return true;
+    }
+
+    @Override
+    public boolean syncDelUser(List<ResourcePerson> persons) {
+        List<String> syncDelMessage = new ArrayList<>();
+        persons.forEach(person -> {
+            R<ErrorInfo> result = syncUserService.syncDelPeron(person);
+            if (R.isSuccess(result)) {
+                syncDelMessage.add(MessageFormat.format("[同步删除教职工成功]-[{0}]", JsonUtils.toJsonString(person)));
+            } else {
+                syncDelMessage.add(MessageFormat.format("[同步删除教职工失败]-[{0}]-[{1}]", JsonUtils.toJsonString(person), result.getMsg()));
+            }
+
+        });
+        syncDelMessage.forEach(System.out::println);
+        return true;
+    }
+}