Просмотр исходного кода

feature: 同步功能完善
1.教职工、培训班学员、研究生人员根据租户Id进行处理

luo.yibo@datuai.com 1 год назад
Родитель
Сommit
be6151a8f9
73 измененных файлов с 2837 добавлено и 539 удалено
  1. 4 0
      ruoyi-api/ruoyi-api-hotel/src/main/java/org/dromara/hotel/api/domain/bo/RemoteGuestBo.java
  2. 8 0
      ruoyi-api/ruoyi-api-hotel/src/main/java/org/dromara/hotel/api/service/RemoteGuestService.java
  3. 41 0
      ruoyi-api/ruoyi-api-sync/src/main/java/org/dromara/sync/api/RemoteKafkaSyncService.java
  4. 6 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java
  5. 1 1
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java
  6. 21 5
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/card/CardNoBusiness.java
  7. 12 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/CardApiController.java
  8. 4 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/bo/KfGuestBo.java
  9. 18 2
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/dubbo/RemoteGuestServiceImpl.java
  10. 2 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/IKfGuestService.java
  11. 31 13
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/impl/KfGuestServiceImpl.java
  12. 11 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java
  13. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java
  14. 59 40
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
  15. 0 152
      ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/dept/SyncRemoteDeptService.java
  16. 0 30
      ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/dept/strategy/ISyncDeptStrategy.java
  17. 0 49
      ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/dept/strategy/SyncDeptStrategyContent.java
  18. 0 32
      ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/user/strategy/ISyncUserStrategy.java
  19. 0 47
      ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/user/strategy/SyncUserStrategyContent.java
  20. 2 2
      ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/util/TrainUtils.java
  21. 0 2
      ruoyi-server/ruoyi-server-base/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  22. 12 20
      ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/event/kafka/impl/cloud/TeacherEventStrategyImpl.java
  23. 28 29
      ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/event/kafka/impl/cloud/TrainEventStrategyImpl.java
  24. 108 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/business/card/CardBusiness.java
  25. 2 2
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/business/full/SyncGraduateService.java
  26. 2 2
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/business/full/SyncHrService.java
  27. 2 2
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/business/full/SyncTrainService.java
  28. 47 1
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/business/kafka/SyncKafkaService.java
  29. 63 63
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/business/user/SyncUserBusiness.java
  30. 11 18
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/controller/SyncTest.java
  31. 56 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/SysPost.java
  32. 2 3
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/SysUser.java
  33. 143 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/UserAccount.java
  34. 72 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/UserBag.java
  35. 102 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/UserCard.java
  36. 59 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/bo/SysPostBo.java
  37. 2 3
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/bo/SysUserBo.java
  38. 158 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/bo/UserAccountBo.java
  39. 75 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/bo/UserBagBo.java
  40. 106 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/bo/UserCardBo.java
  41. 4 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/bo/UserDeptBo.java
  42. 80 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/vo/SysPostVo.java
  43. 222 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/vo/UserAccountVo.java
  44. 78 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/vo/UserBagVo.java
  45. 160 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/vo/UserCardVo.java
  46. 58 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/vo/UserDeptVo.java
  47. 46 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/dubbo/RemoteKafkaSyncServiceImpl.java
  48. 14 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/mapper/SysPostMapper.java
  49. 19 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/mapper/SysUserMapper.java
  50. 15 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/mapper/UserAccountMapper.java
  51. 15 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/mapper/UserBagMapper.java
  52. 15 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/mapper/UserCardMapper.java
  53. 15 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/mapper/UserDeptMapper.java
  54. 17 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/IPostService.java
  55. 29 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/IUserAccountService.java
  56. 47 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/IUserBagService.java
  57. 28 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/IUserCardService.java
  58. 17 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/IUserDeptService.java
  59. 22 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/IUserService.java
  60. 32 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/impl/PostServiceImpl.java
  61. 93 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/impl/UserAccountServiceImpl.java
  62. 112 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/impl/UserBagServiceImpl.java
  63. 74 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/impl/UserCardServiceImpl.java
  64. 52 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/impl/UserDeptServiceImpl.java
  65. 134 0
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/impl/UserServiceImpl.java
  66. 6 6
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/strategy/user/impl/SyncGraduateStrategyImpl.java
  67. 6 6
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/strategy/user/impl/SyncTeacherStrategyImpl.java
  68. 9 9
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/strategy/user/impl/SyncTraineeStrategyImpl.java
  69. 21 0
      ruoyi-server/ruoyi-server-sync/src/main/resources/mapper/SysUserMapper.xml
  70. 39 0
      ruoyi-server/ruoyi-server-sync/src/main/resources/mapper/UserAccountMapper.xml
  71. 25 0
      ruoyi-server/ruoyi-server-sync/src/main/resources/mapper/UserBagMapper.xml
  72. 32 0
      ruoyi-server/ruoyi-server-sync/src/main/resources/mapper/UserCardMapper.xml
  73. 25 0
      ruoyi-server/ruoyi-server-sync/src/main/resources/mapper/UserDeptMapper.xml

+ 4 - 0
ruoyi-api/ruoyi-api-hotel/src/main/java/org/dromara/hotel/api/domain/bo/RemoteGuestBo.java

@@ -64,4 +64,8 @@ public class RemoteGuestBo implements Serializable {
      * 更新者
      */
     private Long updateBy;
+    /**
+     * 租户Id
+     */
+    private String tenantId;
 }

+ 8 - 0
ruoyi-api/ruoyi-api-hotel/src/main/java/org/dromara/hotel/api/service/RemoteGuestService.java

@@ -37,6 +37,14 @@ public interface RemoteGuestService {
      */
     R<RemoteGuestVo> selectGuestByOtherId(String otherId);
 
+    /**
+     * 查询客人信息
+     *
+     * @param otherId 唯一标识
+     * @return 客人信息
+     */
+    R<RemoteGuestVo> selectGuestByOtherId(String otherId,String tenantId);
+
     /**
      * 删除客人
      * @param userId 客人Id

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

@@ -13,32 +13,73 @@ import cn.hutool.json.JSONObject;
 public interface RemoteKafkaSyncService {
     /**
      * kafka教职工部门同步
+     *
      * @param data 部门数据
      */
     void syncTeacherDept(JSONObject data);
 
     /**
      * kafka教职工部门删除
+     *
      * @param data 部门数据
      */
     void syncDelTeacherDept(JSONObject data);
 
     /**
      * kafka 培训班对应部门同步
+     *
      * @param data 培训班数据
      */
     void syncTrainClass(JSONObject data);
 
     /**
      * kafka 培训班对应部门删除
+     *
      * @param data 培训班数据
      */
     void syncDelTrainClass(JSONObject data);
+
     /**
      * kafka 研究生班级对应部门同步
+     *
      * @param data 研究生班级
      */
     void syncGraduateClass(JSONObject data);
 
+    /**
+     * kafka教职工同步
+     *
+     * @param data 教职工数据
+     */
+    void syncTeacher(JSONObject data);
+
+    /**
+     * kafka教职工删除
+     *
+     * @param data 教职工数据
+     */
+    void syncDelTeacher(JSONObject data);
+
+    /**
+     * kafka 培训班学员对应人员同步
+     *
+     * @param data 培训班人员数据
+     */
+    void syncTrainee(JSONObject data);
+
+    /**
+     * kafka 培训班学员对应人员删除
+     *
+     * @param data 培训班学员数据
+     */
+    void syncDelTrainee(JSONObject data);
+
+    /**
+     * kafka 研究生对应人员同步
+     *
+     * @param data 研究生班级
+     */
+    void syncGraduate(JSONObject data);
+
 
 }

+ 6 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java

@@ -139,6 +139,12 @@ public interface RemoteUserService {
      * @return 用户信息
      */
     RemoteUserVo selectUserVoByOtherId(String otherId);
+    /**
+     * 根据第三方标识查询用户信息
+     * @param otherId 第三方标识
+     * @return 用户信息
+     */
+    RemoteUserVo selectUserVoByOtherId(String otherId,String tenantId);
 
     /**
      * 增加新人员

+ 1 - 1
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java

@@ -124,7 +124,7 @@ public interface CacheNames {
     /**
      * 卡流水号
      */
-    String CARD_NO = "card_no";
+    String CARD_NO = GlobalConstants.GLOBAL_REDIS_KEY + "card_no#30d";
     /**
      * 一卡通账户
      */

+ 21 - 5
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/card/CardNoBusiness.java

@@ -1,8 +1,11 @@
 package org.dromara.backstage.business.card;
 
+import cn.hutool.core.util.ObjectUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.backstage.cardCenter.service.IPtCardService;
+import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.redis.utils.RedisUtils;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
@@ -25,25 +28,38 @@ import java.util.concurrent.LinkedBlockingQueue;
 @Service
 @Slf4j
 public class CardNoBusiness implements CommandLineRunner {
-    private final IPtCardService ptCardService;
-
     private static final LinkedBlockingQueue<Integer> concurrentLinkedQueue = new LinkedBlockingQueue<>();
+    private final IPtCardService ptCardService;
 
     @Scheduled(cron = "0 0 1 * * ?")
     public void setCardNo() {
+        String redisKey = CacheNames.CARD_NO;
+        if (ObjectUtil.isNotEmpty(RedisUtils.getCacheObject(redisKey))) {
+            RedisUtils.deleteObject(redisKey);
+        }
         synchronized (concurrentLinkedQueue) {
             concurrentLinkedQueue.clear();
             long maxCardNo = 100;
             Long dbCardNo = ptCardService.getMaxCardNo();
             maxCardNo = maxCardNo > dbCardNo ? maxCardNo : dbCardNo;
-            for (long i = maxCardNo+1; i < maxCardNo+10000; i++) {
+            for (long i = maxCardNo + 1; i < maxCardNo + 10000; i++) {
                 concurrentLinkedQueue.add(Math.toIntExact(i));
             }
+            RedisUtils.setCacheObject(redisKey, concurrentLinkedQueue);
         }
     }
+
     public Long getCardNo() {
-        synchronized (concurrentLinkedQueue) {
-            return Long.valueOf(Objects.requireNonNull(concurrentLinkedQueue.poll()));
+        String key = CacheNames.CARD_NO;
+        if (RedisUtils.getCacheObject(key) != null) {
+            LinkedBlockingQueue<Integer> concurrentLinkedQueue = RedisUtils.getCacheObject(key);
+            Integer cardNo = concurrentLinkedQueue.poll();
+            RedisUtils.setCacheObject(key, concurrentLinkedQueue);
+            return Long.parseLong(cardNo.toString());
+        } else {
+            synchronized (concurrentLinkedQueue) {
+                return Long.valueOf(Objects.requireNonNull(concurrentLinkedQueue.poll()));
+            }
         }
     }
 

+ 12 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/CardApiController.java

@@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.ObjectUtil;
 import lombok.RequiredArgsConstructor;
 import org.dromara.backstage.business.card.CardBusiness;
+import org.dromara.backstage.business.card.CardNoBusiness;
 import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
 import org.dromara.backstage.cardCenter.service.IPtCardService;
 import org.dromara.backstage.domain.convert.YcVoConvert;
@@ -51,6 +52,7 @@ import static org.dromara.common.message.kafka.constant.MessageEventTypeConstant
 @RequestMapping("/card")
 public class CardApiController extends BaseController {
     private final CardBusiness cardBusiness;
+    private final CardNoBusiness cardNoBusiness;
     private final IPtCardService cardService;
     private final DefaultConfig defaultConfig;
 
@@ -153,6 +155,16 @@ public class CardApiController extends BaseController {
             return ReturnResult.failure(ResultCodeEnum.DATA_IS_WRONG, result.getMsg());
         }
     }
+
+    @RequestMapping("/api/v1/initNo")
+    public void createCardNo(){
+        cardNoBusiness.setCardNo();
+    }
+    @RequestMapping("/api/v1/getNo")
+    public Long getCardNo(){
+        return cardNoBusiness.getCardNo();
+    }
+
     private PtCardBo getInitInfo(Map<String, Object> initParam) {
         String defaultTenantId = defaultConfig.getTenantId();
         PtCardBo bo = new PtCardBo();

+ 4 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/bo/KfGuestBo.java

@@ -61,5 +61,9 @@ public class KfGuestBo extends BaseEntity {
      * 数据来源
      */
     private String dataSource;
+    /**
+     * 租户Id
+     */
+    private String tenantId;
 
 }

+ 18 - 2
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/dubbo/RemoteGuestServiceImpl.java

@@ -49,7 +49,7 @@ public class RemoteGuestServiceImpl implements RemoteGuestService {
             }
             return R.fail("增加客人信息失败");
         }catch (Exception e){
-            log.error("增加客人信息失败-{}-{}", JsonUtils.toJsonString(remoteBo),e);
+            log.error("增加客人信息失败-{}", JsonUtils.toJsonString(remoteBo),e);
             return R.fail("增加客人信息失败");
         }
     }
@@ -66,7 +66,7 @@ public class RemoteGuestServiceImpl implements RemoteGuestService {
             if (bo != null) {
                 bo.setUpdateBy(remoteBo.getUpdateBy());
             }
-            boolean flag = kfGuestService.updateByBo(bo);
+            boolean flag = kfGuestService.syncUpdateByBo(bo);
             if(flag){
                 return R.ok("修改客人信息成功");
             }
@@ -97,6 +97,22 @@ public class RemoteGuestServiceImpl implements RemoteGuestService {
             return R.fail("获取客人信息失败");
         }
     }
+
+    @Override
+    public R<RemoteGuestVo> selectGuestByOtherId(String otherId, String tenantId) {
+        try {
+            KfGuestBo bo = new KfGuestBo().setOtherId(otherId).setTenantId(tenantId);
+            KfGuestVo vo = kfGuestService.selectGuestByBo(bo);
+            if (ObjectUtil.isNotEmpty(vo)) {
+                return R.ok(MapstructUtils.convert(vo, RemoteGuestVo.class));
+            }
+            return R.fail("无此客人信息");
+        } catch (Exception e){
+            log.error("获取指定客人信息失败-{}", JsonUtils.toJsonString(otherId));
+            return R.fail("获取客人信息失败");
+        }
+    }
+
     /**
      * 删除客人
      * @param userId 客人Id

+ 2 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/IKfGuestService.java

@@ -69,6 +69,8 @@ public interface IKfGuestService {
      */
     Boolean updateByBo(KfGuestBo bo);
 
+    Boolean syncUpdateByBo(KfGuestBo bo);
+
     /**
      * 校验并批量删除客人管理信息
      *

+ 31 - 13
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/impl/KfGuestServiceImpl.java

@@ -12,6 +12,7 @@ import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.hotel.domain.KfGuest;
 import org.dromara.hotel.domain.bo.KfGuestBo;
 import org.dromara.hotel.domain.bo.KfGuestTeamRBo;
@@ -97,6 +98,7 @@ public class KfGuestServiceImpl implements IKfGuestService {
         lqw.eq(StringUtils.isNotBlank(bo.getIdCard()), KfGuest::getIdCard, bo.getIdCard());
         lqw.eq(StringUtils.isNotBlank(bo.getPhone()), KfGuest::getPhone, bo.getPhone());
         lqw.eq(StringUtils.isNotBlank(bo.getOtherId()), KfGuest::getOtherId, bo.getOtherId());
+        lqw.eq(StringUtils.isNotBlank(bo.getTenantId()), KfGuest::getTenantId, bo.getTenantId());
         lqw.orderByDesc(KfGuest::getCreateTime);
         return lqw;
     }
@@ -135,32 +137,35 @@ public class KfGuestServiceImpl implements IKfGuestService {
     public R<String> insertBatch(List<KfGuest> guests) {
         String filterGuest = "操作成功";
         if (ObjectUtil.isNotEmpty(guests)) {
-            //1.根据手机号或者身份证查询是否已存在
+            // 1.根据手机号或者身份证查询是否已存在
             List<KfGuest> kfGuestList = baseMapper.selectList(new LambdaQueryWrapper<KfGuest>()
-                    .in(KfGuest::getIdCard, guests.stream().map(KfGuest::getIdCard).toList())
-                    .or()
-                    .in(KfGuest::getPhone, guests.stream().map(KfGuest::getPhone).toList()));
+                                                                  .in(KfGuest::getIdCard, guests.stream().map(KfGuest::getIdCard).toList())
+                                                                  .or()
+                                                                  .in(KfGuest::getPhone, guests.stream().map(KfGuest::getPhone).toList()));
             if (ObjectUtil.isNotEmpty(kfGuestList)) {
                 filterGuest = filterExistGuest(guests, kfGuestList);
             }
-            //新增不存在的客人
+            // 新增不存在的客人
             baseMapper.insertBatch(guests);
         }
         return R.ok(filterGuest);
     }
 
-    /** 过滤掉已存在的客人数据*/
+    /**
+     * 过滤掉已存在的客人数据
+     */
 
     private boolean shouldRemoveGuest(KfGuest bo, Map<String, KfGuest> idCardMap, Map<String, KfGuest> phoneMap) {
         return (StringUtils.isNotBlank(bo.getIdCard()) && idCardMap.containsKey(bo.getIdCard())) ||
-            (StringUtils.isNotBlank(bo.getPhone()) && phoneMap.containsKey(bo.getPhone()));
+                   (StringUtils.isNotBlank(bo.getPhone()) && phoneMap.containsKey(bo.getPhone()));
     }
-    private  String filterExistGuest(List<KfGuest> guests, List<KfGuest> existGuestList) {
+
+    private String filterExistGuest(List<KfGuest> guests, List<KfGuest> existGuestList) {
         // 将 existGuestList 转换为 Map,以便快速查找
         Map<String, KfGuest> idCardMap = existGuestList.stream().filter(guest -> guest.getIdCard() != null)
-            .collect(Collectors.toMap(KfGuest::getIdCard, guest -> guest));
+                                             .collect(Collectors.toMap(KfGuest::getIdCard, guest -> guest));
         Map<String, KfGuest> phoneMap = existGuestList.stream().filter(guest -> guest.getPhone() != null)
-            .collect(Collectors.toMap(KfGuest::getPhone, guest -> guest));
+                                            .collect(Collectors.toMap(KfGuest::getPhone, guest -> guest));
         StringBuilder result = new StringBuilder("客人身份证号或手机号与其他客人重复:[");
         Iterator<KfGuest> iterator = guests.iterator();
         while (iterator.hasNext()) {
@@ -174,6 +179,7 @@ public class KfGuestServiceImpl implements IKfGuestService {
         result.append("]");
         return result.toString();
     }
+
     /**
      * 修改客人管理
      *
@@ -190,6 +196,16 @@ public class KfGuestServiceImpl implements IKfGuestService {
         return baseMapper.updateById(update) > 0;
     }
 
+    @Override
+    public Boolean syncUpdateByBo(KfGuestBo bo) {
+        KfGuest update = MapstructUtils.convert(bo, KfGuest.class);
+        /*if (update != null) {
+            validEntityBeforeSave(update);
+        }*/
+        insertGuestTeam(bo);
+        return TenantHelper.ignore(() -> baseMapper.updateById(update) > 0);
+    }
+
     /**
      * 保存前的数据校验
      */
@@ -227,12 +243,14 @@ public class KfGuestServiceImpl implements IKfGuestService {
     @Override
     public KfGuestVo selectGuestByBo(KfGuestBo bo) {
         LambdaQueryWrapper<KfGuest> lqw = this.buildQueryWrapper(bo);
-        return baseMapper.selectVoOne(lqw, KfGuestVo.class);
+        return TenantHelper.ignore(() -> baseMapper.selectVoOne(lqw, KfGuestVo.class));
     }
+
     /**
      * 删除客人
-     * @param userId 客人Id
-     * @param deptId 团客Id
+     *
+     * @param userId     客人Id
+     * @param deptId     团客Id
      * @param operatorId 操作员Id
      * @return 删除结果
      */

+ 11 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java

@@ -325,6 +325,17 @@ public class RemoteUserServiceImpl implements RemoteUserService {
         SysUserVo vo = userService.selectUserVoByOtherId(otherId);
         return BeanUtil.copyProperties(vo, RemoteUserVo.class);
     }
+    /**
+     * 根据第三方标识查询用户信息
+     *
+     * @param otherId 第三方标识
+     * @return 用户信息
+     */
+    @Override
+    public RemoteUserVo selectUserVoByOtherId(String otherId,String tenantId) {
+        SysUserVo vo = userService.selectUserVoByOtherId(otherId,tenantId);
+        return BeanUtil.copyProperties(vo, RemoteUserVo.class);
+    }
 
     /**
      * 增加新人员

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java

@@ -281,6 +281,12 @@ public interface ISysUserService {
      * @return 用户信息
      */
     SysUserVo selectUserVoByOtherId(String otherId);
+    /**
+     * 根据第三方标识查询用户信息
+     * @param otherId 第三方标识
+     * @return 用户信息
+     */
+    SysUserVo selectUserVoByOtherId(String otherId,String tenantId);
 
     /**
      * 根据账号查询用户信息

+ 59 - 40
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

@@ -36,6 +36,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.helper.DataBaseHelper;
 import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.system.domain.SysDept;
 import org.dromara.system.domain.SysUser;
 import org.dromara.system.domain.SysUserRole;
@@ -113,11 +114,11 @@ public class SysUserServiceImpl implements ISysUserService {
             .eq(StringUtils.isNotBlank(user.getStatus()), "status", user.getStatus())
             .like(StringUtils.isNotBlank(user.getPhone()), "phone", user.getPhone())
             .between(params.get("beginTime") != null && params.get("endTime") != null,
-                "create_time", params.get("beginTime"), params.get("endTime"))
+                     "create_time", params.get("beginTime"), params.get("endTime"))
             .and(ObjectUtil.isNotNull(user.getDeptId()), w -> {
                 List<SysDept> deptList = deptMapper.selectList(new LambdaQueryWrapper<SysDept>()
-                    .select(SysDept::getDeptId)
-                    .apply(DataBaseHelper.findInSet(user.getDeptId(), "ancestors")));
+                                                                   .select(SysDept::getDeptId)
+                                                                   .apply(DataBaseHelper.findInSet(user.getDeptId(), "ancestors")));
                 List<Long> ids = StreamUtils.toList(deptList, SysDept::getDeptId);
                 ids.add(user.getDeptId());
                 w.in("dept_id", ids);
@@ -231,10 +232,10 @@ public class SysUserServiceImpl implements ISysUserService {
     @Override
     public List<SysUserVo> selectUserByIds(List<Long> userIds, Long deptId) {
         return baseMapper.selectUserList(new LambdaQueryWrapper<SysUser>()
-            .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName)
-            .eq(SysUser::getStatus, UserConstants.USER_NORMAL)
-            .eq(ObjectUtil.isNotNull(deptId), SysUser::getDeptId, deptId)
-            .in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds));
+                                             .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName)
+                                             .eq(SysUser::getStatus, UserConstants.USER_NORMAL)
+                                             .eq(ObjectUtil.isNotNull(deptId), SysUser::getDeptId, deptId)
+                                             .in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds));
     }
 
     /**
@@ -276,8 +277,8 @@ public class SysUserServiceImpl implements ISysUserService {
     @Override
     public boolean checkUserNameUnique(SysUserBo user) {
         boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysUser>()
-            .eq(SysUser::getUserName, user.getUserName())
-            .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId()));
+                                              .eq(SysUser::getUserName, user.getUserName())
+                                              .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId()));
         return exist;
     }
 
@@ -289,8 +290,8 @@ public class SysUserServiceImpl implements ISysUserService {
     @Override
     public boolean checkPhoneUnique(SysUserBo user) {
         return baseMapper.exists(new LambdaQueryWrapper<SysUser>()
-            .eq(SysUser::getPhone, user.getPhone())
-            .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId()));
+                                     .eq(SysUser::getPhone, user.getPhone())
+                                     .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId()));
     }
 
     /**
@@ -301,8 +302,8 @@ public class SysUserServiceImpl implements ISysUserService {
     @Override
     public boolean checkEmailUnique(SysUserBo user) {
         boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysUser>()
-            .eq(SysUser::getEmail, user.getEmail())
-            .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId()));
+                                              .eq(SysUser::getEmail, user.getEmail())
+                                              .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId()));
         return exist;
     }
 
@@ -314,8 +315,8 @@ public class SysUserServiceImpl implements ISysUserService {
     @Override
     public boolean checkUserNumbUnique(SysUserBo user) {
         return baseMapper.exists(new LambdaQueryWrapper<SysUser>()
-            .eq(SysUser::getUserNumb, user.getUserNumb())
-            .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId()));
+                                     .eq(SysUser::getUserNumb, user.getUserNumb())
+                                     .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId()));
     }
 
     /**
@@ -470,9 +471,9 @@ public class SysUserServiceImpl implements ISysUserService {
     @Override
     public int updateUserStatus(Long userId, String status) {
         return baseMapper.update(null,
-            new LambdaUpdateWrapper<SysUser>()
-                .set(SysUser::getStatus, status)
-                .eq(SysUser::getUserId, userId));
+                                 new LambdaUpdateWrapper<SysUser>()
+                                     .set(SysUser::getStatus, status)
+                                     .eq(SysUser::getUserId, userId));
     }
 
     /**
@@ -485,12 +486,12 @@ public class SysUserServiceImpl implements ISysUserService {
     @Override
     public int updateUserProfile(SysUserBo user) {
         return baseMapper.update(null,
-            new LambdaUpdateWrapper<SysUser>()
-                .set(ObjectUtil.isNotNull(user.getNickName()), SysUser::getNickName, user.getNickName())
-                .set(SysUser::getPhone, user.getPhone())
-                .set(SysUser::getEmail, user.getEmail())
-                .set(SysUser::getSex, user.getSex())
-                .eq(SysUser::getUserId, user.getUserId()));
+                                 new LambdaUpdateWrapper<SysUser>()
+                                     .set(ObjectUtil.isNotNull(user.getNickName()), SysUser::getNickName, user.getNickName())
+                                     .set(SysUser::getPhone, user.getPhone())
+                                     .set(SysUser::getEmail, user.getEmail())
+                                     .set(SysUser::getSex, user.getSex())
+                                     .eq(SysUser::getUserId, user.getUserId()));
     }
 
     /**
@@ -503,9 +504,9 @@ public class SysUserServiceImpl implements ISysUserService {
     @Override
     public boolean updateUserAvatar(Long userId, Long avatar) {
         return baseMapper.update(null,
-            new LambdaUpdateWrapper<SysUser>()
-                .set(SysUser::getAvatar, avatar)
-                .eq(SysUser::getUserId, userId)) > 0;
+                                 new LambdaUpdateWrapper<SysUser>()
+                                     .set(SysUser::getAvatar, avatar)
+                                     .eq(SysUser::getUserId, userId)) > 0;
     }
 
     /**
@@ -518,9 +519,9 @@ public class SysUserServiceImpl implements ISysUserService {
     @Override
     public int resetUserPwd(Long userId, String password) {
         return baseMapper.update(null,
-            new LambdaUpdateWrapper<SysUser>()
-                .set(SysUser::getPassword, password)
-                .eq(SysUser::getUserId, userId));
+                                 new LambdaUpdateWrapper<SysUser>()
+                                     .set(SysUser::getPassword, password)
+                                     .eq(SysUser::getUserId, userId));
     }
 
     /**
@@ -652,7 +653,7 @@ public class SysUserServiceImpl implements ISysUserService {
     @Override
     public String selectUserNameById(Long userId) {
         SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper<SysUser>()
-            .select(SysUser::getUserName).eq(SysUser::getUserId, userId));
+                                                   .select(SysUser::getUserName).eq(SysUser::getUserId, userId));
         return ObjectUtil.isNull(sysUser) ? null : sysUser.getUserName();
     }
 
@@ -666,7 +667,7 @@ public class SysUserServiceImpl implements ISysUserService {
     @Cacheable(cacheNames = CacheNames.SYS_NICKNAME, key = "#userId")
     public String selectNicknameById(Long userId) {
         SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper<SysUser>()
-            .select(SysUser::getNickName).eq(SysUser::getUserId, userId));
+                                                   .select(SysUser::getNickName).eq(SysUser::getUserId, userId));
         return ObjectUtil.isNull(sysUser) ? null : sysUser.getNickName();
     }
 
@@ -691,7 +692,7 @@ public class SysUserServiceImpl implements ISysUserService {
     @Override
     public String selectPhonenumberById(Long userId) {
         SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper<SysUser>()
-            .select(SysUser::getPhone).eq(SysUser::getUserId, userId));
+                                                   .select(SysUser::getPhone).eq(SysUser::getUserId, userId));
         return ObjectUtil.isNull(sysUser) ? null : sysUser.getPhone();
     }
 
@@ -704,7 +705,7 @@ public class SysUserServiceImpl implements ISysUserService {
     @Override
     public String selectEmailById(Long userId) {
         SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper<SysUser>()
-            .select(SysUser::getEmail).eq(SysUser::getUserId, userId));
+                                                   .select(SysUser::getEmail).eq(SysUser::getUserId, userId));
         return ObjectUtil.isNull(sysUser) ? null : sysUser.getEmail();
     }
 
@@ -726,6 +727,21 @@ public class SysUserServiceImpl implements ISysUserService {
         return sysUser.get(0);
     }
 
+    @Override
+    public SysUserVo selectUserVoByOtherId(String otherId, String tenantId) {
+        List<SysUserVo> userVos = TenantHelper.ignore(
+            () -> baseMapper.selectUserList(new LambdaQueryWrapper<SysUser>()
+                                                .eq(SysUser::getTenantId, tenantId)
+                                                .eq(SysUser::getOtherId, otherId)));
+        if (CollUtil.isEmpty(userVos)) {
+            return null;
+        }
+        if (userVos.size() > 1) {
+            throw new ServiceException("根据otherId查询到多个用户!");
+        }
+        return userVos.get(0);
+    }
+
     /**
      * 根据账号查询用户信息
      *
@@ -735,11 +751,13 @@ public class SysUserServiceImpl implements ISysUserService {
     @Override
     public SysUserVo selectUserVoByUserName(String userName) {
         return baseMapper.selectVoOne(new LambdaQueryWrapper<SysUser>()
-            .eq(SysUser::getUserName, userName));
+                                          .eq(SysUser::getUserName, userName));
     }
+
     /**
      * 删除指定部门下的人员信息
-     * @param deptId 部门Id
+     *
+     * @param deptId     部门Id
      * @param operatorId 操作员Id
      * @return 删除结果
      */
@@ -755,6 +773,7 @@ public class SysUserServiceImpl implements ISysUserService {
                                                .eq(SysUser::getDeptId, deptId);
         return baseMapper.update(null, luw);
     }
+
     /**
      * 根据第三方Id删除人员信息
      *
@@ -771,7 +790,7 @@ public class SysUserServiceImpl implements ISysUserService {
             return false;
         }
         // 删除部门下的人员部门对应关系
-        count = userDeptService.delByUserAndDeptId(userId,deptId, operatorId);
+        count = userDeptService.delByUserAndDeptId(userId, deptId, operatorId);
         if (count < 0) {
             return false;
         }
@@ -779,10 +798,10 @@ public class SysUserServiceImpl implements ISysUserService {
         LambdaUpdateWrapper<SysUser> luw = new LambdaUpdateWrapper<SysUser>().set(SysUser::getDelFlag, DefaultConstants.DELETED)
                                                .set(SysUser::getUpdateBy, operatorId)
                                                .eq(SysUser::getDeptId, deptId)
-                                               .eq(SysUser::getUserId,userId);
+                                               .eq(SysUser::getUserId, userId);
         count = baseMapper.update(null, luw);
 
-        return count>=0;
+        return count >= 0;
     }
 
     private void insertUserDept(SysUserBo bo, List<UserDeptBo> userDeptBoList) {
@@ -800,7 +819,7 @@ public class SysUserServiceImpl implements ISysUserService {
         if (CollectionUtil.isNotEmpty(userDeptBoList)) {
             // 排除主部门
             List<UserDeptBo> userDeptList = userDeptBoList.stream()
-                .filter(p -> ObjectUtil.notEqual(bo.getDeptId(), p.getDeptId())).toList();
+                                                .filter(p -> ObjectUtil.notEqual(bo.getDeptId(), p.getDeptId())).toList();
             if (CollectionUtil.isNotEmpty(userDeptList)) {
                 userDeptList.forEach(userDeptBo -> {
                     userDeptBo.setUserId(bo.getUserId());

+ 0 - 152
ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/dept/SyncRemoteDeptService.java

@@ -1,152 +0,0 @@
-package org.dromara.server.base.service.dept;
-
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.dubbo.config.annotation.DubboReference;
-import org.dromara.common.core.domain.R;
-import org.dromara.common.core.domain.model.ErrorInfo;
-import org.dromara.hotel.api.domain.bo.RemoteTeamBo;
-import org.dromara.hotel.api.domain.vo.RemoteTeamVo;
-import org.dromara.hotel.api.service.RemoteTeamService;
-import org.dromara.system.api.RemoteDeptService;
-import org.dromara.system.api.domain.bo.RemoteDeptBo;
-import org.dromara.system.api.domain.vo.RemoteDeptVo;
-import org.springframework.stereotype.Service;
-
-/**
- * name: SyncRemoteDeptService
- * package: org.dromara.service.sync.dept.service
- * description: 部门同步处理服务,将同步过来的部门信息转换成可入库的业务模型以及调用远程服务更新部门数据
- * date: 2024-10-17 23:09:01 23:09
- *
- * @author luoyibo
- * @version 0.1
- * @since JDK 1.8
- */
-@Service
-@Slf4j
-@RequiredArgsConstructor
-public class SyncRemoteDeptService {
-
-    @DubboReference
-    private final RemoteDeptService remoteDeptService;
-    @DubboReference
-    private final RemoteTeamService remoteTeamService;
-
-    /**
-     * 根据第三方对接的唯一标识符查询对应的部门信息
-     *
-     * @param otherId  第三方对接的唯一标识符
-     * @param tenantId 租户Id
-     * @return 部门信息
-     */
-    public RemoteDeptVo selectDeptByOtherId(String otherId, String tenantId) {
-        return remoteDeptService.selectDeptByOtherId(otherId, tenantId);
-    }
-
-    /**
-     * 根据第三方对接的唯一标识符查询对应的(包含已删除的)部门信息
-     *
-     * @param otherId  第三方对接的唯一标识符
-     * @param tenantId 租户Id
-     * @return 部门信息
-     */
-    public RemoteDeptVo selectAllDeptByOtherId(String otherId, String tenantId) {
-        return remoteDeptService.selectVoAllByOtherId(otherId, tenantId);
-    }
-
-    /**
-     * 根据父节点Id和名称查询部门
-     *
-     * @param parentId 父节点
-     * @param deptName 名称
-     * @return 部门信息
-     */
-    public RemoteDeptVo selectDeptByParentIdAndName(Long parentId, String deptName) {
-        return remoteDeptService.selectDeptByParentIdAndName(parentId, deptName);
-    }
-
-    /**
-     * 增加新部门
-     *
-     * @param remoteDeptBo 部门业务模型
-     * @return 增加结果
-     */
-    public R<Object> insertDept(RemoteDeptBo remoteDeptBo) {
-        return remoteDeptService.insertDept(remoteDeptBo);
-    }
-
-    /**
-     * 修改部门
-     *
-     * @param remoteDeptBo 部门业务模型
-     * @return 增加结果
-     */
-    public R<Object> updateDept(RemoteDeptBo remoteDeptBo) {
-        return remoteDeptService.updateDept(remoteDeptBo);
-    }
-
-    /**
-     * 根据第三方对接的唯一标识符删除部门
-     *
-     * @param otherId 第三方对接后的唯一标识符
-     * @return 删除结果
-     */
-    public R<Object> deleteDeptByOtherId(String otherId) {
-        return remoteDeptService.deleteDeptByOtherId(otherId);
-    }
-    /**
-     * 根据第三方对接的唯一标识符删除部门
-     *
-     * @param otherId 第三方对接后的唯一标识符
-     * @param operatorId 操作员Id
-     * @return 删除结果
-     */
-    public R<Object> deleteDeptByOtherId(String otherId,Long operatorId) {
-        return remoteDeptService.deleteDeptByOtherId(otherId,operatorId);
-    }
-
-    /**
-     * 查询团客信息
-     * @param otherId 唯一标识
-     * @param tenantId 租户Id
-     * @return 团客信息
-     */
-    public R<RemoteTeamVo> selectTeamByOtherId(String otherId, String tenantId) {
-        RemoteTeamBo remoteBo = new RemoteTeamBo().setOtherId(otherId).setTenantId(tenantId);
-
-        return remoteTeamService.selectTeamByBo(remoteBo);
-    }
-
-    /**
-     * 修改团客信息
-     * @param remoteTeamBo 团客业务对象
-     * @return 修改结果
-     */
-    public R<ErrorInfo> updateRemoteTeam(RemoteTeamBo remoteTeamBo) {
-        return remoteTeamService.updateTeamByBo(remoteTeamBo);
-    }
-
-    /**
-     * 增加团客信息
-     * @param remoteTeamBo 团客业务对象
-     * @return 增加结果
-     */
-    public R<ErrorInfo> insertRemoteTeam(RemoteTeamBo remoteTeamBo) {
-        return remoteTeamService.insertTeamByBo(remoteTeamBo);
-    }
-
-    /**
-     * 根据第三方Id删除团客信息
-     * @param otherId 第三方Id
-     * @param operatorId 操作员Id
-     * @return 操作结果
-     */
-    public R<Object> deleteTeamByOtherId(String otherId, Long operatorId){
-        return remoteTeamService.deleteTeamByOtherId(otherId, operatorId);
-    }
-    public Boolean deleteTeamByOtherId(String otherId, Long operatorId, String tenantId){
-        return remoteTeamService.deleteTeamByOtherId(otherId, operatorId,tenantId);
-    }
-
-}

+ 0 - 30
ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/dept/strategy/ISyncDeptStrategy.java

@@ -1,30 +0,0 @@
-package org.dromara.server.base.service.dept.strategy;
-
-import org.dromara.server.common.domain.bo.ResourceDept;
-
-import java.util.List;
-
-/**
- * name: IDoDeptStrategy
- * package: org.dromara.server.base.dept.service.strategy
- * description: 部门同步写入策略
- * date: 2024-10-18 14:17:38 14:17
- *
- * @author luoyibo
- * @version 0.1
- * @since JDK 1.8
- */
-public interface ISyncDeptStrategy {
-    /**
-     * 处理部门的部门数据
-     *
-     * @param deptList 部门数据
-     */
-    void syncDept(List<ResourceDept> deptList);
-
-    /**
-     * 同步删除部门数据
-     * @param deptList 部门列表
-     */
-    void syncDelDept(List<ResourceDept> deptList);
-}

+ 0 - 49
ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/dept/strategy/SyncDeptStrategyContent.java

@@ -1,49 +0,0 @@
-package org.dromara.server.base.service.dept.strategy;
-
-import org.dromara.server.common.domain.bo.ResourceDept;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * name: SyncDeptStrategyContent
- * package: org.dromara.server.base.dept.service.strategy.impl
- * description: 部门同步处理策略上下文
- * date: 2024-10-18 14:51:26 14:51
- *
- * @author luoyibo
- * @version 0.1
- * @since JDK 1.8
- */
-@Service
-public class SyncDeptStrategyContent {
-    private final Map<String, ISyncDeptStrategy> strategyMap = new ConcurrentHashMap<>();
-
-    @Autowired
-    public SyncDeptStrategyContent(Map<String, ISyncDeptStrategy> strategyMap) {
-        this.strategyMap.putAll(strategyMap);
-    }
-
-    /**
-     * 同步处理入口
-     * @param deptList 部门数据
-     * @param syncResource 数据来源
-     */
-    public void syncDept(List<ResourceDept> deptList ,String syncResource){
-        strategyMap.get(syncResource).syncDept(deptList);
-    }
-
-    /**
-     * 同步删除部门处理入口
-     * @param deptList 部门列表
-     * @param syncResource 数据来源
-     */
-    public void syncDelDept(List<ResourceDept> deptList ,String syncResource){
-        strategyMap.get(syncResource).syncDelDept(deptList);
-    }
-
-
-}

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

@@ -1,32 +0,0 @@
-package org.dromara.server.base.service.user.strategy;
-
-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);
-}

+ 0 - 47
ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/user/strategy/SyncUserStrategyContent.java

@@ -1,47 +0,0 @@
-package org.dromara.server.base.service.user.strategy;
-
-import org.dromara.server.common.domain.bo.ResourcePerson;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * name: SyncDeptStrategyContent
- * package: org.dromara.server.base.dept.service.strategy.impl
- * description: 人员同步处理策略上下文
- * date: 2024-10-18 14:51:26 14:51
- *
- * @author luoyibo
- * @version 0.1
- * @since JDK 1.8
- */
-@Service
-public class SyncUserStrategyContent {
-    private final Map<String, ISyncUserStrategy> strategyMap = new ConcurrentHashMap<>();
-
-    @Autowired
-    public SyncUserStrategyContent(Map<String, ISyncUserStrategy> strategyMap) {
-        this.strategyMap.putAll(strategyMap);
-    }
-
-    /**
-     * 同步处理入口
-     * @param personList 人员数据
-     * @param syncResource 数据来源
-     */
-    public boolean syncUser(List<ResourcePerson> personList , String syncResource){
-        return strategyMap.get(syncResource).syncUser(personList);
-    }
-
-    /**
-     * 同步删除处理入口
-     * @param personList 人员数据
-     * @param syncResource 数据来源
-     */
-    public boolean syncDelUser(List<ResourcePerson> personList , String syncResource){
-        return strategyMap.get(syncResource).syncDelUser(personList);
-    }
-}

+ 2 - 2
ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/util/TrainUtils.java

@@ -105,8 +105,8 @@ public class TrainUtils {
         person.setCategory(DefaultConstants.CATEGORY_TRAINEE);
         person.setOperatorId(DefaultConstants.KAFKA_SYNC_ADMIN);
         person.setPostCode(DefaultConstants.TRAINEE_CODE);
-        if (ObjectUtil.isNotEmpty(data.get("tenantId"))) {
-            person.setTenantId(data.get("tenantId").toString());
+        if (ObjectUtil.isNotEmpty(stuObj.get("tenantId"))) {
+            person.setTenantId(stuObj.get("tenantId").toString());
         } else {
             person.setTenantId(defaultConfig.getTenantId());
         }

+ 0 - 2
ruoyi-server/ruoyi-server-base/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -1,8 +1,6 @@
 org.dromara.server.base.service.dept.SyncRemoteDeptService
 org.dromara.server.base.service.user.SyncRemoteUserService
 org.dromara.server.base.service.user.strategy.SyncUserStrategyContent
-org.dromara.server.base.service.user.strategy.impl.SyncGraduateStrategyImpl
-org.dromara.server.base.service.user.strategy.impl.SyncTraineeStrategyImpl
 org.dromara.server.base.service.yktOperation.SyncRemotePtParameterService
 org.dromara.server.base.service.yktOperation.SyncRemotePtMealTypeService
 org.dromara.server.base.service.yktOperation.SyncRemotePtRoomService

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

@@ -6,18 +6,10 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.common.message.kafka.constant.EventSenderConstants;
 import org.dromara.common.message.kafka.constant.EventTypeConstants;
-import org.dromara.server.base.service.dept.strategy.SyncDeptStrategyContent;
-import org.dromara.server.base.service.user.strategy.SyncUserStrategyContent;
-import org.dromara.server.base.util.TeacherUtils;
-import org.dromara.server.common.constant.SyncResourceConstants;
-import org.dromara.server.common.domain.bo.ResourceDept;
-import org.dromara.server.common.domain.bo.ResourcePerson;
 import org.dromara.server.mq.event.kafka.IYktEventStrategy;
 import org.dromara.sync.api.RemoteKafkaSyncService;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-
 /**
  * @ClassName TeacherEventStrategyImpl
  * @Description 教职工消息处理策略
@@ -30,9 +22,6 @@ import java.util.List;
 @RequiredArgsConstructor
 @Service(EventSenderConstants.HR)
 public class TeacherEventStrategyImpl implements IYktEventStrategy {
-    private final SyncDeptStrategyContent syncDeptStrategyContent;
-    private final SyncUserStrategyContent syncUserStrategyContent;
-
     @DubboReference
     private final RemoteKafkaSyncService remoteKafkaSyncService;
 
@@ -58,19 +47,22 @@ public class TeacherEventStrategyImpl implements IYktEventStrategy {
                 //syncDeptStrategyContent.syncDelDept(resourceDeptlist, SyncResourceConstants.HR_DEPT);
             }
             case EventTypeConstants.TEACHER_ADD -> {
-                List<ResourcePerson> resourcePersonList = TeacherUtils.getSyncTeacher(JSONUtil.parseObj(msg));
-                log.info("[处理业务中台->云端人员增加请求]-[人员信息:{}]", JSONUtil.toJsonStr(resourcePersonList));
-                syncUserStrategyContent.syncUser(resourcePersonList, SyncResourceConstants.TEACHER);
+                // List<ResourcePerson> resourcePersonList = TeacherUtils.getSyncTeacher(JSONUtil.parseObj(msg));
+                log.info("[处理业务中台->云端人员增加请求]-[人员信息:{}]", JSONUtil.parseObj(msg));
+                remoteKafkaSyncService.syncTeacher(JSONUtil.parseObj(msg));
+                // syncUserStrategyContent.syncUser(resourcePersonList, SyncResourceConstants.TEACHER);
             }
             case EventTypeConstants.TEACHER_EDIT -> {
-                List<ResourcePerson> resourcePersonList = TeacherUtils.getSyncTeacher(JSONUtil.parseObj(msg));
-                log.info("[处理业务中台->云端人员修改请求]-[人员信息:{}]", JSONUtil.toJsonStr(resourcePersonList));
-                syncUserStrategyContent.syncUser(resourcePersonList, SyncResourceConstants.TEACHER);
+                // List<ResourcePerson> resourcePersonList = TeacherUtils.getSyncTeacher(JSONUtil.parseObj(msg));
+                log.info("[处理业务中台->云端人员修改请求]-[人员信息:{}]", JSONUtil.parseObj(msg));
+                remoteKafkaSyncService.syncTeacher(JSONUtil.parseObj(msg));
+                // syncUserStrategyContent.syncUser(resourcePersonList, SyncResourceConstants.TEACHER);
             }
             case EventTypeConstants.TEACHER_DEL -> {
-                List<ResourcePerson> resourcePersonList = TeacherUtils.getSyncDeleteTeahcer(JSONUtil.parseObj(msg));
-                log.info("[处理业务中台->云端人员删除请求]-[人员信息:{}]", JSONUtil.toJsonStr(resourcePersonList));
-                syncUserStrategyContent.syncDelUser(resourcePersonList, SyncResourceConstants.TEACHER);
+                // List<ResourcePerson> resourcePersonList = TeacherUtils.getSyncDeleteTeahcer(JSONUtil.parseObj(msg));
+                log.info("[处理业务中台->云端人员删除请求]-[人员信息:{}]", JSONUtil.parseObj(msg));
+                remoteKafkaSyncService.syncDelTeacher(JSONUtil.parseObj(msg));
+                // syncUserStrategyContent.syncDelUser(resourcePersonList, SyncResourceConstants.TEACHER);
             }
         }
     }

+ 28 - 29
ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/event/kafka/impl/cloud/TrainEventStrategyImpl.java

@@ -3,19 +3,13 @@ package org.dromara.server.mq.event.kafka.impl.cloud;
 import cn.hutool.json.JSONUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.common.message.kafka.constant.EventSenderConstants;
 import org.dromara.common.message.kafka.constant.EventTypeConstants;
-import org.dromara.server.base.service.dept.strategy.SyncDeptStrategyContent;
-import org.dromara.server.base.service.user.strategy.SyncUserStrategyContent;
-import org.dromara.server.base.util.TrainUtils;
-import org.dromara.server.common.constant.SyncResourceConstants;
-import org.dromara.server.common.domain.bo.ResourceDept;
-import org.dromara.server.common.domain.bo.ResourcePerson;
 import org.dromara.server.mq.event.kafka.IYktEventStrategy;
+import org.dromara.sync.api.RemoteKafkaSyncService;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-
 /**
  * @ClassName TrainEventStrategyImpl
  * @Description 培训消息处理策略
@@ -28,41 +22,46 @@ import java.util.List;
 @RequiredArgsConstructor
 @Service(EventSenderConstants.TRAIN)
 public class TrainEventStrategyImpl implements IYktEventStrategy {
-    private final SyncDeptStrategyContent syncDeptStrategyContent;
-    private final SyncUserStrategyContent syncUserStrategyContent;
-
+    @DubboReference
+    private final RemoteKafkaSyncService remoteKafkaSyncService;
     @Override
     public void doMsgHandle(String eventType, Object msg) throws Exception {
         switch (eventType) {
             case EventTypeConstants.TRAIN_CLASS_ADD -> {
-                List<ResourceDept> resourceDeptlist = TrainUtils.getSycClass(JSONUtil.parseObj(msg));
-                log.info("[处理教务系统->云端班级增加请求]-[班级信息:{}]", JSONUtil.toJsonStr(resourceDeptlist));
-                syncDeptStrategyContent.syncDept(resourceDeptlist, SyncResourceConstants.TRAIN_CLASS);
+                // List<ResourceDept> resourceDeptlist = TrainUtils.getSycClass(JSONUtil.parseObj(msg));
+                log.info("[处理教务系统->云端班级增加请求]-[班级信息:{}]", JSONUtil.toJsonStr(msg));
+                remoteKafkaSyncService.syncTrainClass(JSONUtil.parseObj(msg));
+                // syncDeptStrategyContent.syncDept(resourceDeptlist, SyncResourceConstants.TRAIN_CLASS);
             }
             case EventTypeConstants.TRAIN_CLASS_EDIT -> {
-                List<ResourceDept> resourceDeptlist = TrainUtils.getSycClass(JSONUtil.parseObj(msg));
-                log.info("[处理教务系统->云端班级修改请求]-[班级信息:{}]", JSONUtil.toJsonStr(resourceDeptlist));
-                syncDeptStrategyContent.syncDept(resourceDeptlist, SyncResourceConstants.TRAIN_CLASS);
+                // List<ResourceDept> resourceDeptlist = TrainUtils.getSycClass(JSONUtil.parseObj(msg));
+                log.info("[处理教务系统->云端班级修改请求]-[班级信息:{}]", JSONUtil.toJsonStr(msg));
+                remoteKafkaSyncService.syncTrainClass(JSONUtil.parseObj(msg));
+                // syncDeptStrategyContent.syncDept(resourceDeptlist, SyncResourceConstants.TRAIN_CLASS);
             }
             case EventTypeConstants.TRAIN_CLASS_DEL -> {
-                List<ResourceDept> resourceDeptlist = TrainUtils.getSycDeleteClass(JSONUtil.parseObj(msg));
-                log.info("[处理教务系统->云端班级删除请求]-[部门信息:{}]", JSONUtil.toJsonStr(resourceDeptlist));
-                syncDeptStrategyContent.syncDelDept(resourceDeptlist, SyncResourceConstants.TRAIN_CLASS);
+                // List<ResourceDept> resourceDeptlist = TrainUtils.getSycDeleteClass(JSONUtil.parseObj(msg));
+                log.info("[处理教务系统->云端班级删除请求]-[部门信息:{}]", JSONUtil.toJsonStr(msg));
+                remoteKafkaSyncService.syncDelTrainClass(JSONUtil.parseObj(msg));
+                // syncDeptStrategyContent.syncDelDept(resourceDeptlist, SyncResourceConstants.TRAIN_CLASS);
             }
             case EventTypeConstants.TRAINEE_ADD -> {
-                List<ResourcePerson> resourcePersonList = TrainUtils.getSyncTrainee(JSONUtil.parseObj(msg));
-                log.info("[处理教务系统->云端学员增加请求]-[学员信息:{}]", JSONUtil.toJsonStr(resourcePersonList));
-                syncUserStrategyContent.syncUser(resourcePersonList, SyncResourceConstants.TRAINEE);
+                // List<ResourcePerson> resourcePersonList = TrainUtils.getSyncTrainee(JSONUtil.parseObj(msg));
+                log.info("[处理教务系统->云端学员增加请求]-[学员信息:{}]", JSONUtil.toJsonStr(msg));
+                remoteKafkaSyncService.syncTrainee(JSONUtil.parseObj(msg));
+                // syncUserStrategyContent.syncUser(resourcePersonList, SyncResourceConstants.TRAINEE);
             }
             case EventTypeConstants.TRAINEE_EDIT -> {
-                List<ResourcePerson> resourcePersonList = TrainUtils.getSyncTrainee(JSONUtil.parseObj(msg));
-                log.info("[处理教务系统->云端学员修改请求]-[学员信息:{}]", JSONUtil.toJsonStr(resourcePersonList));
-                syncUserStrategyContent.syncUser(resourcePersonList, SyncResourceConstants.TRAINEE);
+                // List<ResourcePerson> resourcePersonList = TrainUtils.getSyncTrainee(JSONUtil.parseObj(msg));
+                log.info("[处理教务系统->云端学员修改请求]-[学员信息:{}]", JSONUtil.toJsonStr(msg));
+                remoteKafkaSyncService.syncTrainee(JSONUtil.parseObj(msg));
+                // syncUserStrategyContent.syncUser(resourcePersonList, SyncResourceConstants.TRAINEE);
             }
             case EventTypeConstants.TRAINEE_DEL -> {
-                List<ResourcePerson> resourcePersonList = TrainUtils.getSyncDeleteTrainee(JSONUtil.parseObj(msg));
-                log.info("[处理教务系统->云端学员删除请求]-[学员信息:{}]", JSONUtil.toJsonStr(resourcePersonList));
-                syncUserStrategyContent.syncDelUser(resourcePersonList, SyncResourceConstants.TRAINEE);
+                // List<ResourcePerson> resourcePersonList = TrainUtils.getSyncDeleteTrainee(JSONUtil.parseObj(msg));
+                log.info("[处理教务系统->云端学员删除请求]-[学员信息:{}]", JSONUtil.toJsonStr(msg));
+                remoteKafkaSyncService.syncDelTrainee(JSONUtil.parseObj(msg));
+                // syncUserStrategyContent.syncDelUser(resourcePersonList, SyncResourceConstants.TRAINEE);
             }
         }
     }

+ 108 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/business/card/CardBusiness.java

@@ -0,0 +1,108 @@
+package org.dromara.server.sync.business.card;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.enums.CardStatusEnum;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.server.sync.domain.bo.UserBagBo;
+import org.dromara.server.sync.domain.bo.UserCardBo;
+import org.dromara.server.sync.domain.vo.UserBagVo;
+import org.dromara.server.sync.service.IUserBagService;
+import org.dromara.server.sync.service.IUserCardService;
+import org.springframework.stereotype.Service;
+
+import java.text.MessageFormat;
+import java.util.List;
+import java.util.concurrent.LinkedBlockingQueue;
+
+/**
+ * @ClassName CardBusiness
+ * @Description TODO
+ * @Author luoyibo
+ * @Date 2025-02-07 10:17
+ * @Version 1.0
+ * @since jdk17
+ */
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class CardBusiness {
+    // private final IUserAccountService userAccountService;
+    private final IUserCardService userCardService;
+    private final IUserBagService userBagService;
+
+
+    public Long getNewCardNo() {
+        String key = CacheNames.CARD_NO;
+        LinkedBlockingQueue<Integer> concurrentLinkedQueue = RedisUtils.getCacheObject(key);
+        Integer cardNo = concurrentLinkedQueue.poll();
+        RedisUtils.setCacheObject(key, concurrentLinkedQueue);
+        return Long.parseLong(cardNo.toString());
+    }
+
+    public R<String> openVirtualCard(UserCardBo cardBo) {
+        String resultMsg;
+        // 验证是否存在开通虚拟卡的账户
+        // UserAccountVo userAccountVo = userAccountService.queryById(cardBo.getUserId());
+        // if (userAccountVo == null) {
+        //     resultMsg = MessageFormat.format("[开通虚拟卡]-[失败]-[无此账户,账户Id:{0}]", cardBo.getUserId());
+        //     log.info(resultMsg);
+        //     return R.fail(resultMsg);
+        // }
+        // if (Integer.parseInt(userAccountVo.getAccountStatus()) != UserAccountStatusEnum.IS_OPEN.code()) {
+        //     resultMsg = MessageFormat.format("[开通虚拟卡]-[失败]-[此账户尚未开户,账户Id:{0}]", cardBo.getUserId());
+        //     log.info(resultMsg);
+        //     return R.fail(resultMsg);
+        // }
+        // 检查当前账户是否存在正常、挂失或冻结的卡片,如果有这些卡片,表明账户是发过卡的,无须再开通虚拟卡
+        Boolean hasCard = userCardService.selectCardByUserId(cardBo.getUserId().toString());
+        if (!hasCard) {
+            // 没有卡片,开通虚拟卡
+            UserCardBo addBo = BeanUtil.copyProperties(cardBo, UserCardBo.class);
+            addBo.setMainCard("Y");
+            addBo.setStatus(CardStatusEnum.NORMAL.code().toString());
+            if (addBo.getCardNo() == null) {
+                addBo.setCardNo(getNewCardNo());
+            }
+            addBo.setFactoryId(0L);
+            addBo.setChangeTime(DateUtil.date());
+
+            if (userCardService.insertByBo(addBo)) {
+                //--------- 设置 流水号和主键id set 到 cardBo
+                cardBo.setCardId(addBo.getCardId());
+                cardBo.setCardNo(addBo.getCardNo());
+                // 写卡片表成功,检查一下是否还需要初始化钱包表
+                UserBagBo bagBo = new UserBagBo();
+                bagBo.setUserId(cardBo.getUserId());
+                List<UserBagVo> bagVos = userBagService.queryList(bagBo);
+                if (bagVos == null || bagVos.isEmpty()) {
+                    // 如果没有钱包数据,初始化钱包数据
+                    if (userBagService.initAccountBag(cardBo.getUserId())) {
+                        resultMsg = MessageFormat.format("[开通虚拟卡]-[成功]-[开卡账户Id:{0}]", cardBo.getUserId());
+                        return R.ok(resultMsg);
+                    } else {
+                        resultMsg = MessageFormat.format("[开通虚拟卡]-[失败]-[写钱包数据表失败,账户Id:{0}]", cardBo.getUserId());
+                        log.info(resultMsg);
+                        return R.fail(resultMsg);
+                    }
+                } else {
+                    // 已有钱包数据,不需要再初始化钱包,直接返回成功
+                    resultMsg = MessageFormat.format("[开通虚拟卡]-[成功]-[开卡账户Id:{0}]", cardBo.getUserId());
+                    return R.ok(resultMsg);
+                }
+            } else {
+                resultMsg = MessageFormat.format("[开通虚拟卡]-[失败]-[写卡片数据表失败,账户Id:{0}]", cardBo.getUserId());
+                log.info(resultMsg);
+                return R.fail(resultMsg);
+            }
+        } else {
+            // 已开过卡了,无须再开虚拟卡,直接返回成功
+            resultMsg = MessageFormat.format("[开通虚拟卡]-[成功]-[账户已有卡片,开卡账户Id:{0}]", cardBo.getUserId());
+            return R.ok(resultMsg);
+        }
+    }
+}

+ 2 - 2
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/business/full/SyncGraduateService.java

@@ -11,12 +11,12 @@ import org.dromara.common.core.config.DefaultConfig;
 import org.dromara.common.core.constant.DefaultConstants;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.SpringUtils;
-import org.dromara.server.base.service.dept.strategy.ISyncDeptStrategy;
-import org.dromara.server.base.service.user.strategy.ISyncUserStrategy;
 import org.dromara.server.common.constant.SyncResourceConstants;
 import org.dromara.server.common.domain.bo.ResourceDept;
 import org.dromara.server.common.domain.bo.ResourcePerson;
 import org.dromara.server.common.domain.bo.SyncFullDataBo;
+import org.dromara.server.sync.strategy.dept.ISyncDeptStrategy;
+import org.dromara.server.sync.strategy.user.ISyncUserStrategy;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
 

+ 2 - 2
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/business/full/SyncHrService.java

@@ -10,12 +10,12 @@ import org.dromara.common.core.config.DefaultConfig;
 import org.dromara.common.core.constant.DefaultConstants;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.SpringUtils;
-import org.dromara.server.sync.strategy.dept.ISyncDeptStrategy;
-import org.dromara.server.base.service.user.strategy.ISyncUserStrategy;
 import org.dromara.server.common.constant.SyncResourceConstants;
 import org.dromara.server.common.domain.bo.ResourceDept;
 import org.dromara.server.common.domain.bo.ResourcePerson;
 import org.dromara.server.common.domain.bo.SyncFullDataBo;
+import org.dromara.server.sync.strategy.dept.ISyncDeptStrategy;
+import org.dromara.server.sync.strategy.user.ISyncUserStrategy;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
 

+ 2 - 2
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/business/full/SyncTrainService.java

@@ -12,13 +12,13 @@ import org.dromara.common.core.constant.DefaultConstants;
 import org.dromara.common.core.enums.TraineeStatusEnum;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.SpringUtils;
-import org.dromara.server.base.service.dept.strategy.ISyncDeptStrategy;
-import org.dromara.server.base.service.user.strategy.ISyncUserStrategy;
 import org.dromara.server.common.constant.SyncResourceConstants;
 import org.dromara.server.common.domain.bo.ResourceDept;
 import org.dromara.server.common.domain.bo.ResourcePerson;
 import org.dromara.server.common.domain.bo.ResourcePersonDept;
 import org.dromara.server.common.domain.bo.SyncFullDataBo;
+import org.dromara.server.sync.strategy.dept.ISyncDeptStrategy;
+import org.dromara.server.sync.strategy.user.ISyncUserStrategy;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
 

+ 47 - 1
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/business/kafka/SyncKafkaService.java

@@ -9,7 +9,9 @@ import org.dromara.server.base.util.TeacherUtils;
 import org.dromara.server.base.util.TrainUtils;
 import org.dromara.server.common.constant.SyncResourceConstants;
 import org.dromara.server.common.domain.bo.ResourceDept;
+import org.dromara.server.common.domain.bo.ResourcePerson;
 import org.dromara.server.sync.strategy.dept.ISyncDeptStrategy;
+import org.dromara.server.sync.strategy.user.ISyncUserStrategy;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -76,5 +78,49 @@ public class SyncKafkaService {
         ISyncDeptStrategy syncDeptStrategy = SpringUtils.getBean(SyncResourceConstants.GRADUATE_CLASS, ISyncDeptStrategy.class);
         syncDeptStrategy.syncDept(resourceDeptlist);
     }
-
+    /**
+     * kafka教职工同步
+     * @param data 同步数据
+     */
+    public void syncTeacher(JSONObject data) {
+        List<ResourcePerson> resourcePersonlist = TeacherUtils.getSyncTeacher(data);
+        ISyncUserStrategy syncUserStrategy = SpringUtils.getBean(SyncResourceConstants.TEACHER, ISyncUserStrategy.class);
+        syncUserStrategy.syncUser(resourcePersonlist);
+    }
+    /**
+     * kafka教职工删除
+     * @param data 同步数据
+     */
+    public void syncDelTeacher(JSONObject data) {
+        List<ResourcePerson> resourcePersonlist = TeacherUtils.getSyncTeacher(data);
+        ISyncUserStrategy syncUserStrategy = SpringUtils.getBean(SyncResourceConstants.TEACHER, ISyncUserStrategy.class);
+        syncUserStrategy.syncDelUser(resourcePersonlist);
+    }
+    /**
+     * kafka培训学员同步
+     * @param data 同步数据
+     */
+    public void syncTrainee(JSONObject data) {
+        List<ResourcePerson> resourcePersonlist = TrainUtils.getSyncTrainee(data);
+        ISyncUserStrategy syncUserStrategy = SpringUtils.getBean(SyncResourceConstants.TRAINEE, ISyncUserStrategy.class);
+        syncUserStrategy.syncUser(resourcePersonlist);
+    }
+    /**
+     * kafka培训学员删除
+     * @param data 同步数据
+     */
+    public void syncDelTrainee(JSONObject data) {
+        List<ResourcePerson> resourcePersonlist = TrainUtils.getSyncTrainee(data);
+        ISyncUserStrategy syncUserStrategy = SpringUtils.getBean(SyncResourceConstants.TRAINEE, ISyncUserStrategy.class);
+        syncUserStrategy.syncDelUser(resourcePersonlist);
+    }
+    /**
+     * kafka研究生同步
+     * @param data 同步数据
+     */
+    public void syncGraduate(JSONObject data) {
+        List<ResourcePerson> resourcePersonlist = GraduateUtils.getSyncGraduate(data);
+        ISyncUserStrategy syncUserStrategy = SpringUtils.getBean(SyncResourceConstants.GRADUATE, ISyncUserStrategy.class);
+        syncUserStrategy.syncUser(resourcePersonlist);
+    }
 }

+ 63 - 63
ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/user/SyncRemoteUserService.java → ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/business/user/SyncUserBusiness.java

@@ -1,4 +1,4 @@
-package org.dromara.server.base.service.user;
+package org.dromara.server.sync.business.user;
 
 import cn.dev33.satoken.secure.BCrypt;
 import cn.hutool.core.bean.BeanUtil;
@@ -23,14 +23,17 @@ import org.dromara.hotel.api.service.RemoteTeamService;
 import org.dromara.server.base.util.EncryptorUtil;
 import org.dromara.server.common.domain.bo.ResourcePerson;
 import org.dromara.server.common.domain.bo.ResourcePersonDept;
+import org.dromara.server.sync.domain.bo.SysUserBo;
+import org.dromara.server.sync.domain.bo.UserDeptBo;
+import org.dromara.server.sync.domain.vo.SysDeptVo;
+import org.dromara.server.sync.domain.vo.SysPostVo;
+import org.dromara.server.sync.domain.vo.SysUserVo;
+import org.dromara.server.sync.service.IDeptService;
+import org.dromara.server.sync.service.IPostService;
+import org.dromara.server.sync.service.IUserService;
 import org.dromara.system.api.RemoteDeptService;
 import org.dromara.system.api.RemotePostService;
 import org.dromara.system.api.RemoteUserService;
-import org.dromara.system.api.domain.bo.RemoteUserBo;
-import org.dromara.system.api.domain.bo.RemoteUserDeptBo;
-import org.dromara.system.api.domain.vo.RemoteDeptVo;
-import org.dromara.system.api.domain.vo.RemotePostVo;
-import org.dromara.system.api.domain.vo.RemoteUserVo;
 import org.springframework.stereotype.Service;
 
 import java.time.Duration;
@@ -51,7 +54,7 @@ import java.util.List;
 @Service
 @Slf4j
 @RequiredArgsConstructor
-public class SyncRemoteUserService {
+public class SyncUserBusiness {
     @DubboReference
     private final RemoteUserService remoteUserService;
     @DubboReference
@@ -63,27 +66,35 @@ public class SyncRemoteUserService {
     @DubboReference
     private final RemoteTeamService remoteTeamService;
 
+    private final IDeptService deptService;
+    private final IUserService userService;
+    private final IPostService postService;
+
     /**
      * 单个人员同步处理
      *
      * @param person 人员
      * @return 结果
      */
-    public R<RemoteUserVo> syncPeron(ResourcePerson person) {
+    public R<SysUserVo> syncPeron(ResourcePerson person) {
         try {
             String otherId = person.getUserId();
+            String tenantId = person.getTenantId();
             // 获取人员在一卡通系统中的数据
-            RemoteUserVo remoteUserVo = remoteUserService.selectUserVoByOtherId(otherId);
+            SysUserVo userVo = userService.selectByOtherId(otherId, tenantId);
             // 组装入库的人员业务对象
-            R<RemoteUserBo> result = setUserInfo(person, remoteUserVo);
+            R<SysUserBo> result = setUserInfo(person, userVo);
+            Boolean syncResult;
             if (result.getCode() == R.SUCCESS) {
-                if (ObjectUtil.isEmpty(remoteUserVo)) {
+                if (ObjectUtil.isEmpty(userVo)) {
                     // 不存在此人员,增加
-                    return remoteUserService.insertUser(result.getData());
+                    syncResult = userService.insertUser(result.getData());
                 } else {
                     // 存在此人员,修改
-                    return remoteUserService.updateUser(result.getData());
+                    syncResult = userService.updateUser(result.getData());
                 }
+
+                return syncResult ? R.ok() : R.fail();
             }
             return R.fail(result.getMsg());
         } catch (Exception e) {
@@ -101,28 +112,17 @@ public class SyncRemoteUserService {
     public R<ErrorInfo> syncDelPeron(ResourcePerson person) {
         try {
             String otherId = person.getUserId();
-            String otherDeptId = person.getDeptId();
+            String tenantId = person.getTenantId();
             Long operatorId = person.getOperatorId();
 
-            RemoteUserVo remoteUserVo = remoteUserService.selectUserVoByOtherId(otherId);
-            if (ObjectUtil.isEmpty(remoteUserVo)) {
+            SysUserVo userVo = userService.selectByOtherId(otherId, tenantId);
+            if (ObjectUtil.isEmpty(userVo)) {
                 log.warn("[不存在对应的人员Id]-[{}]", otherId);
                 return R.ok();
             }
-            if (ObjectUtil.isNotEmpty(otherDeptId)) {
-                RemoteDeptVo remoteDeptVo = remoteDeptService.selectDeptByOtherId(otherDeptId, person.getTenantId());
-                if (ObjectUtil.isEmpty(remoteUserVo)) {
-                    log.warn("[不存在对应的部门Id]-[{}]", otherDeptId);
-                    return R.ok();
-                }
-                // 删除人员
-                if (remoteUserService.delByUserAndDeptId(remoteUserVo.getUserId(), remoteDeptVo.getDeptId(), operatorId)) {
-                    return R.ok();
-                }
-            } else {
-                if (remoteUserService.delByUserId(remoteUserVo.getUserId(),operatorId)) {
-                    return R.ok();
-                }
+
+            if (userService.deleteById(userVo.getUserId().toString(), operatorId)) {
+                return R.ok();
             }
             return R.fail();
         } catch (Exception e) {
@@ -137,11 +137,11 @@ public class SyncRemoteUserService {
      * @param tenantId 租户
      * @return 岗位清单
      */
-    public List<RemotePostVo> selectPostVoByTenantId(String tenantId) {
+    public List<SysPostVo> selectPostVoByTenantId(String tenantId) {
         String cacheKey = tenantId + "_post:";
-        List<RemotePostVo> postVos = RedisUtils.getCacheObject(cacheKey);
+        List<SysPostVo> postVos = RedisUtils.getCacheObject(cacheKey);
         if (ObjectUtil.isEmpty(postVos)) {
-            postVos = remotePostService.selectPostVo(tenantId);
+            postVos = postService.selectByTenantId(tenantId);
             RedisUtils.setCacheObject(cacheKey, postVos, Duration.ofHours(4));
         }
         return postVos;
@@ -150,21 +150,21 @@ public class SyncRemoteUserService {
     /**
      * 组装入库的人员业务对象
      *
-     * @param person       源人员信息
-     * @param remoteUserVo 一卡通对应信息
+     * @param person 源人员信息
+     * @param userVo 一卡通对应信息
      * @return 组装结果
      */
-    private R<RemoteUserBo> setUserInfo(ResourcePerson person, RemoteUserVo remoteUserVo) {
+    private R<SysUserBo> setUserInfo(ResourcePerson person, SysUserVo userVo) {
         String tenantId = person.getTenantId();
         // 获取人员对应的部门信息
-        RemoteDeptVo remoteDeptVo = remoteDeptService.selectDeptByOtherId(person.getDeptId(), tenantId);
-        if (remoteDeptVo == null) {
+        SysDeptVo deptVo = deptService.selectByOtherId(person.getDeptId(), tenantId);
+        if (deptVo == null) {
             return R.fail("没有找到对应的部门信息");
         }
-        RemoteUserBo remoteUserBo;
-        if (ObjectUtil.isEmpty(remoteUserVo)) {
+        SysUserBo remoteUserBo;
+        if (ObjectUtil.isEmpty(userVo)) {
             String userName = getUserName(person);
-            remoteUserBo = new RemoteUserBo();
+            remoteUserBo = new SysUserBo();
             remoteUserBo.setUserType("sys_user");
             remoteUserBo.setPassword(BCrypt.hashpw(DefaultConstants.LOGIN_PASSWORD));
             remoteUserBo.setUserName(userName);
@@ -172,7 +172,7 @@ public class SyncRemoteUserService {
             remoteUserBo.setRoleIds(getUserRole(person));
             remoteUserBo.setCreateBy(person.getOperatorId());
         } else {
-            remoteUserBo = BeanUtil.copyProperties(remoteUserVo, RemoteUserBo.class);
+            remoteUserBo = BeanUtil.copyProperties(userVo, SysUserBo.class);
             remoteUserBo.setUpdateBy(person.getOperatorId());
         }
 
@@ -184,17 +184,17 @@ public class SyncRemoteUserService {
         remoteUserBo.setRemark(person.getRemark());
         remoteUserBo.setUserState(person.getUserState());
         remoteUserBo.setPhone(person.getPhone());
-        remoteUserBo.setDeptId(remoteDeptVo.getDeptId());
+        remoteUserBo.setDeptId(deptVo.getDeptId());
         remoteUserBo.setPostId(getUserPostId(person.getPostCode(), tenantId));
         remoteUserBo.setCardType(getUserCardType(person));
-        remoteUserBo.setLifespan(getUserLifespan(person, remoteDeptVo));
+        remoteUserBo.setLifespan(getUserLifespan(person, deptVo));
         remoteUserBo.setTenantId(tenantId);
         // 身份证
         String idNumber = person.getIdNumber();
         if (StrUtil.isNotEmpty(idNumber)) {
             remoteUserBo.setIdNumber(getUserIdNumber(idNumber));
         }
-        remoteUserBo.setUserDeptList(getUserDept(person));
+        remoteUserBo.setUserDeptBoList(getUserDept(person));
         return R.ok(remoteUserBo);
     }
 
@@ -239,15 +239,15 @@ public class SyncRemoteUserService {
      * 如果同步的有有效基体则返回此有效期,否则再检查人员所在的部门是否有结束日期,如有则返回结束日期,否则返回
      * 默认2050-12-31 23:59:59
      *
-     * @param person       源人员信息
-     * @param remoteDeptVo 所在部门信息
+     * @param person 源人员信息
+     * @param deptVo 所在部门信息
      * @return 有效期
      */
-    private Date getUserLifespan(ResourcePerson person, RemoteDeptVo remoteDeptVo) {
+    private Date getUserLifespan(ResourcePerson person, SysDeptVo deptVo) {
         if (ObjectUtil.isNotEmpty(person.getLifespan())) {
             return person.getLifespan();
         }
-        Date endDate = remoteDeptVo.getEndDate();
+        Date endDate = deptVo.getEndDate();
         if (ObjectUtil.isEmpty(endDate)) {
             return DateUtil.parse("2050-12-31 23:59:59");
         } else {
@@ -273,9 +273,9 @@ public class SyncRemoteUserService {
      * @return 岗位Id
      */
     private Long getUserPostId(String postCode, String tenantId) {
-        List<RemotePostVo> postVos = selectPostVoByTenantId(tenantId);
+        List<SysPostVo> postVos = selectPostVoByTenantId(tenantId);
         List<Long> postIds = postVos.stream().filter(post -> postCode.equals(post.getPostCode()))
-                                 .map(RemotePostVo::getPostId).toList();
+                                 .map(SysPostVo::getPostId).toList();
         if (postIds.isEmpty()) {
             return DefaultConstants.POST_ID;
         }
@@ -345,17 +345,17 @@ public class SyncRemoteUserService {
      * @param person 源人员
      * @return 人员部门
      */
-    private List<RemoteUserDeptBo> getUserDept(ResourcePerson person) {
+    private List<UserDeptBo> getUserDept(ResourcePerson person) {
         List<ResourcePersonDept> resourcePersonDeptList = person.getUserDeptList();
         if (CollectionUtil.isEmpty(resourcePersonDeptList)) {
             return null;
         }
-        List<RemoteUserDeptBo> remoteUserDeptBos = new ArrayList<>();
+        List<UserDeptBo> remoteUserDeptBos = new ArrayList<>();
         resourcePersonDeptList.forEach(resourcePersonDept -> {
-            RemoteUserDeptBo remoteUserDeptBo = new RemoteUserDeptBo();
-            RemoteDeptVo remoteDeptVo = remoteDeptService.selectDeptByOtherId(resourcePersonDept.getDeptId(), person.getTenantId());
-            if (ObjectUtil.isNotEmpty(remoteDeptVo)) {
-                remoteUserDeptBo.setDeptId(remoteDeptVo.getDeptId());
+            UserDeptBo remoteUserDeptBo = new UserDeptBo();
+            SysDeptVo deptVo = deptService.selectByOtherId(resourcePersonDept.getDeptId(), person.getTenantId());
+            if (ObjectUtil.isNotEmpty(deptVo)) {
+                remoteUserDeptBo.setDeptId(deptVo.getDeptId());
                 remoteUserDeptBo.setPostId(getUserPostId(resourcePersonDept.getPostCode(), person.getTenantId()));
                 remoteUserDeptBo.setMainDept(resourcePersonDept.getMainDept());
                 remoteUserDeptBo.setDelFlag(resourcePersonDept.getDelFlag());
@@ -377,8 +377,9 @@ public class SyncRemoteUserService {
      */
     public R<ErrorInfo> syncGuest(ResourcePerson person) {
         String otherId = person.getUserId();
+        String tenantId = person.getTenantId();
         try {
-            R<RemoteGuestVo> result = remoteGuestService.selectGuestByOtherId(otherId);
+            R<RemoteGuestVo> result = remoteGuestService.selectGuestByOtherId(otherId,tenantId);
             R<RemoteGuestBo> getBo = setGuestInfo(person, result.getData());
             if (R.isSuccess(getBo)) {
                 if (R.isSuccess(result)) {
@@ -386,8 +387,6 @@ public class SyncRemoteUserService {
                 } else {
                     return remoteGuestService.insertGuestByBo(getBo.getData());
                 }
-
-
             }
             return R.fail(getBo.getMsg());
         } catch (Exception e) {
@@ -395,6 +394,7 @@ public class SyncRemoteUserService {
             return R.fail(e.getMessage());
         }
     }
+
     /**
      * 同步删除客人信息
      *
@@ -418,7 +418,7 @@ public class SyncRemoteUserService {
                 return R.ok();
             }
             // 删除客人
-            if(remoteGuestService.delByUserAndDeptId(result.getData().getId(), getTeamResult.getData().getId(), operatorId)){
+            if (remoteGuestService.delByUserAndDeptId(result.getData().getId(), getTeamResult.getData().getId(), operatorId)) {
                 return R.ok();
             }
             return R.fail();
@@ -450,6 +450,7 @@ public class SyncRemoteUserService {
         remoteGuestBo.setRemark(person.getRemark());
         remoteGuestBo.setTeamId(getGuestTeamId(person));
         remoteGuestBo.setOtherId(person.getUserId());
+        remoteGuestBo.setTenantId(person.getTenantId());
         String idNumber = person.getIdNumber();
         if (StrUtil.isNotEmpty(idNumber)) {
             remoteGuestBo.setIdCard(getUserIdNumber(idNumber));
@@ -466,8 +467,7 @@ public class SyncRemoteUserService {
     private Long getGuestTeamId(ResourcePerson person) {
         if (CollectionUtil.isNotEmpty(person.getUserDeptList())) {
             String deptId = person.getUserDeptList().get(0).getDeptId();
-            RemoteTeamBo remoteTeamBo = new RemoteTeamBo().setOtherId(deptId).setTenantId(person.getTenantId());
-            RemoteTeamVo remoteTeamVo = remoteTeamService.selectTeamByBo(remoteTeamBo).getData();
+            RemoteTeamVo remoteTeamVo = remoteTeamService.selectTeamByOtherId(deptId,person.getTenantId()).getData();
             if (ObjectUtil.isNotEmpty(remoteTeamVo)) {
                 return remoteTeamVo.getId();
             }

+ 11 - 18
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/controller/SyncTest.java

@@ -4,17 +4,11 @@ import cn.hutool.json.JSONUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.domain.R;
-import org.dromara.server.base.service.user.strategy.SyncUserStrategyContent;
 import org.dromara.server.base.util.EncryptorUtil;
-import org.dromara.server.base.util.GraduateUtils;
-import org.dromara.server.base.util.TrainUtils;
-import org.dromara.server.common.constant.SyncResourceConstants;
-import org.dromara.server.common.domain.bo.ResourcePerson;
 import org.dromara.server.sync.business.kafka.SyncKafkaService;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -31,7 +25,6 @@ import java.util.Map;
 @RequiredArgsConstructor
 @RequestMapping("/test")
 public class SyncTest {
-    private final SyncUserStrategyContent syncUserStrategyContent;
     private final SyncKafkaService syncKafkaService;
 
     /**
@@ -68,10 +61,10 @@ public class SyncTest {
      */
     @GetMapping("/sync/trainee")
     public R<Void> syncTrainee(@RequestBody Map<String, Object> data) {
-        List<ResourcePerson> resourcePersonList = TrainUtils.getSyncTrainee(JSONUtil.parseObj(data));
-        log.info("[教务同步测试->学员同步]-[学员信息:{}]", JSONUtil.toJsonStr(resourcePersonList));
-        syncUserStrategyContent.syncUser(resourcePersonList, SyncResourceConstants.TRAINEE);
-
+        // List<ResourcePerson> resourcePersonList = TrainUtils.getSyncTrainee(JSONUtil.parseObj(data));
+        // log.info("[教务同步测试->学员同步]-[学员信息:{}]", JSONUtil.toJsonStr(resourcePersonList));
+        // syncUserStrategyContent.syncUser(resourcePersonList, SyncResourceConstants.TRAINEE);
+        syncKafkaService.syncTrainee(JSONUtil.parseObj(data));
         return R.ok();
     }
 
@@ -82,8 +75,8 @@ public class SyncTest {
      */
     @GetMapping("/sync/trainee/del")
     public R<Void> syncDelTrainee(@RequestBody Map<String, Object> data) {
-        List<ResourcePerson> resourcePersonList = TrainUtils.getSyncDeleteTrainee(JSONUtil.parseObj(data));
-        syncUserStrategyContent.syncDelUser(resourcePersonList, SyncResourceConstants.TRAINEE);
+        // List<ResourcePerson> resourcePersonList = TrainUtils.getSyncDeleteTrainee(JSONUtil.parseObj(data));
+        // syncUserStrategyContent.syncDelUser(resourcePersonList, SyncResourceConstants.TRAINEE);
 
         return R.ok();
     }
@@ -110,10 +103,10 @@ public class SyncTest {
      */
     @GetMapping("/sync/graduate")
     public R<Void> syncGraduate(@RequestBody Map<String, Object> data) {
-        List<ResourcePerson> resourcePersonList = GraduateUtils.getSyncGraduate(JSONUtil.parseObj(data));
-        log.info("[研究生同步测试->研究生同步]-[研究生信息:{}]", JSONUtil.toJsonStr(resourcePersonList));
-        syncUserStrategyContent.syncUser(resourcePersonList, SyncResourceConstants.GRADUATE);
-
+        // List<ResourcePerson> resourcePersonList = GraduateUtils.getSyncGraduate(JSONUtil.parseObj(data));
+        // log.info("[研究生同步测试->研究生同步]-[研究生信息:{}]", JSONUtil.toJsonStr(resourcePersonList));
+        // syncUserStrategyContent.syncUser(resourcePersonList, SyncResourceConstants.GRADUATE);
+        syncKafkaService.syncGraduate(JSONUtil.parseObj(data));
         return R.ok();
     }
 
@@ -139,7 +132,7 @@ public class SyncTest {
      */
     @GetMapping("/sync/teacher")
     public R<Void> syncTeacher(@RequestBody Map<String, Object> data) {
-        //syncKafkaService.sync
+        syncKafkaService.syncTeacher(JSONUtil.parseObj(data));
         // List<ResourcePerson> resourcePersonList = TeacherUtils.getSyncTeacher(JSONUtil.parseObj(data));
         // log.info("[业中同步测试->人员同步]-[人员信息:{}]", JSONUtil.toJsonStr(resourcePersonList));
         // syncUserStrategyContent.syncUser(resourcePersonList, SyncResourceConstants.TEACHER);

+ 56 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/SysPost.java

@@ -0,0 +1,56 @@
+package org.dromara.server.sync.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+/**
+ * 岗位表 t_sys_post
+ *
+ * @author Lion Li
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_sys_post")
+public class SysPost extends TenantEntity {
+
+    /**
+     * 岗位序号
+     */
+    @TableId(value = "post_id")
+    private Long postId;
+
+    /**
+     * 岗位编码
+     */
+    private String postCode;
+
+    /**
+     * 岗位名称
+     */
+    private String postName;
+
+    /**
+     * 岗位排序
+     */
+    private Integer postSort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 是否系统数据(Y是 N否)
+     */
+    private String sysData;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 2 - 3
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/SysUser.java

@@ -7,7 +7,6 @@ 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;
@@ -155,12 +154,12 @@ public class SysUser extends TenantEntity {
     /**
      * 账户卡片类型
      */
-    //private Long cardType;
+    private Long cardType;
 
     /**
      * 账户有效期
      */
-    //private Date lifespan;
+    private Date lifespan;
 
     /**
      * 64位2进制数据,某位的数据1代表具备某个属性

+ 143 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/UserAccount.java

@@ -0,0 +1,143 @@
+package org.dromara.server.sync.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.encrypt.annotation.EncryptField;
+import org.dromara.common.encrypt.enumd.AlgorithmType;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 一卡通账户对象 t_pt_userAccount
+ *
+ * @author LionLi
+ * @date 2024-08-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_pt_userAccount")
+public class UserAccount extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 账户Id,主键
+     */
+    @TableId(value = "user_id")
+    private Long userId;
+
+    /**
+     * 岗位Id
+     */
+    private Long postId;
+
+    /**
+     * 部门Id
+     */
+    private Long deptId;
+
+    /**
+     * 账户名/登录账号
+     */
+    private String userName;
+
+
+    /**
+     * 账户编号/工号
+     */
+    private String userNumb;
+
+    /**
+     * 账户姓名
+     */
+    private String realName;
+
+    /**
+     * 账户性别,见sys_user_sex字典类型
+     */
+    private String sex;
+
+    /**
+     * 账户类型(0=内部账户 1=老师 2=学生 3=家长  4=其他人员)
+     */
+    private String category;
+
+    /**
+     * 手机号码
+     */
+    @EncryptField(algorithm = AlgorithmType.BASE64)
+    private String phone;
+
+    /**
+     * 身份证号
+     */
+    @EncryptField(algorithm = AlgorithmType.BASE64)
+    private String idNumber;
+
+    /**
+     * 一卡通账户状态(0-未开户  1-已开户  -1已销户)
+     */
+    private String accountStatus;
+
+    /**
+     * 账户是否被冻结,见sys_yes_no字典类型
+     */
+    private String freezeStatus;
+
+    /**
+     * 消费密码
+     */
+    @EncryptField(algorithm = AlgorithmType.BASE64)
+    private String consumePwd;
+
+    /**
+     * 账户流水号
+     */
+    private Long userNo;
+
+    /**
+     * 账户卡片类型
+     */
+    private Long cardType;
+
+    /**
+     * 账户有效期
+     */
+    private Date lifespan;
+
+    /**
+     * 64位2进制数据,某位的数据1代表具备某个属性
+     */
+    private Long userAttr;
+
+    /**
+     * 人脸照片地址
+     */
+    private String photo;
+
+    /**
+     * 唯一身份标识,第三方统一身份认证ID
+     */
+    private String otherId;
+
+    /**
+     * 第三方人员状态 (on-在职,quit-离校,退休-retire,die-去世,register-报到中,failure-不报到)
+     */
+    private String userState;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 账户状态,见sys_normal_disable字典类型
+     */
+    private String status;
+
+}

+ 72 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/UserBag.java

@@ -0,0 +1,72 @@
+package org.dromara.server.sync.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+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.math.BigDecimal;
+
+/**
+ * 账户钱包对象 t_pt_bag
+ *
+ * @author LionLi
+ * @date 2024-08-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_pt_bag")
+public class UserBag extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 钱包Id,主键
+     */
+    @TableId(value = "bag_id")
+    private Long bagId;
+
+    /**
+     * 所属账户Id
+     */
+    private Long userId;
+
+    /**
+     * 钱包代码,见CARDBAGTYPE数据字典类别
+     */
+    private String bagCode;
+
+    /**
+     * 钱包余额
+     */
+    private BigDecimal balance;
+
+    /**
+     * 钱包加密余额
+     */
+    private String encryptBalance;
+
+    /**
+     * 消费总金额
+     */
+    private BigDecimal consumeTotal;
+
+    /**
+     * 消费总次数
+     */
+    private Long consumeCount;
+
+    /**
+     * 充值总金额
+     */
+    private BigDecimal rechargeTotal;
+
+    /**
+     * 充值总次数
+     */
+    private Long rechargeCount;
+
+}

+ 102 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/UserCard.java

@@ -0,0 +1,102 @@
+package org.dromara.server.sync.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+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.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 账户卡片对象 t_pt_card
+ *
+ * @author LionLi
+ * @date 2024-08-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_pt_card")
+public class UserCard extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 卡片Id,主键
+     */
+    @TableId(value = "card_id")
+    private Long cardId;
+
+    /**
+     * 所属账户Id
+     */
+    private Long userId;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 卡片类型
+     */
+    private Long cardType;
+
+    /**
+     * 卡片有效期
+     */
+    private Date lifespan;
+
+    /**
+     * 物理卡号
+     */
+    private Long factoryId;
+
+    /**
+     * 是否主卡,见sys_yes_no字典类别
+     */
+    private String mainCard;
+
+    /**
+     * 卡片状态,见KZT字典类别
+     */
+    private String status;
+
+    /**
+     * 卡状态变更时间
+     */
+    private Date changeTime;
+
+    /**
+     * 当日消费金额
+     */
+    private BigDecimal dayTotal;
+
+    /**
+     * 当日消费次数
+     */
+    private Long dayCount;
+
+    /**
+     * 当餐交易金额
+     */
+    private BigDecimal mealTotal;
+
+    /**
+     * 当餐消费次数
+     */
+    private Long mealCount;
+
+    /**
+     * 最后交易时间
+     */
+    private Date lastPay;
+
+    /**
+     * 最后交易餐类,对应营业时段的编号
+     */
+    private Long lastMeal;
+}

+ 59 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/bo/SysPostBo.java

@@ -0,0 +1,59 @@
+package org.dromara.server.sync.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.sync.domain.SysPost;
+
+/**
+ * 岗位信息业务对象 t_sys_post
+ *
+ * @author Michelle.Chung
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysPost.class, reverseConvertGenerate = false)
+public class SysPostBo extends BaseEntity {
+
+    /**
+     * 岗位ID
+     */
+    private Long postId;
+
+    /**
+     * 岗位编码
+     */
+    private String postCode;
+
+    /**
+     * 岗位名称
+     */
+    private String postName;
+
+    /**
+     * 显示顺序
+     */
+    private Integer postSort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 是否系统数据(Y是 N否)
+     */
+    private String sysData;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 租户ID
+     */
+    private String tenantId;
+}

+ 2 - 3
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/bo/SysUserBo.java

@@ -7,7 +7,6 @@ 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;
@@ -130,12 +129,12 @@ public class SysUserBo extends TenantEntity {
     /**
      * 账户卡片类型
      */
-    //private Long cardType;
+    private Long cardType;
 
     /**
      * 账户有效期
      */
-    //private Date lifespan;
+    private Date lifespan;
 
     /**
      * 身份证号

+ 158 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/bo/UserAccountBo.java

@@ -0,0 +1,158 @@
+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 lombok.experimental.Accessors;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+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.UserAccount;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 一卡通账户业务对象 t_pt_userAccount
+ *
+ * @author LionLi
+ * @date 2024-08-05
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = UserAccount.class, reverseConvertGenerate = false)
+public class UserAccountBo extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 7820605694495403719L;
+    /**
+     * 账户Id,主键
+     */
+    @NotNull(message = "账户Id,主键不能为空", groups = { EditGroup.class })
+    private Long userId;
+
+    /**
+     * 岗位Id
+     */
+    @NotNull(message = "岗位Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long postId;
+
+    /**
+     * 部门Id
+     */
+    @NotNull(message = "部门Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long deptId;
+
+    /**
+     * 账户名/登录账号
+     */
+    @NotBlank(message = "账户名/登录账号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String userName;
+
+    /**
+     * 账户编号/工号
+     */
+    @NotBlank(message = "账户编号/工号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String userNumb;
+
+    /**
+     * 账户姓名
+     */
+    @NotBlank(message = "账户姓名不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String realName;
+
+    /**
+     * 账户性别,见sys_user_sex字典类型
+     */
+    @NotBlank(message = "账户性别,见sys_user_sex字典类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String sex;
+
+    /**
+     * 账户类型(0=内部账户 1=老师 2=学生 3=家长  4=其他人员)
+     */
+    @NotBlank(message = "账户类型(0=内部账户 1=老师 2=学生 3=家长  4=其他人员)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String category;
+
+    /**
+     * 手机号码
+     */
+    @NotBlank(message = "手机号码不能为空", groups = { AddGroup.class, EditGroup.class })
+    @EncryptField(algorithm = AlgorithmType.BASE64)
+    private String phone;
+
+    /**
+     * 身份证号
+     */
+    private String idNumber;
+
+    /**
+     * 一卡通账户状态(0-未开户  1-已开户  -1已销户)
+     */
+    @NotBlank(message = "一卡通账户状态(0-未开户  1-已开户  -1已销户)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String accountStatus;
+
+    /**
+     * 账户是否被冻结,见sys_yes_no字典类型
+     */
+    @NotBlank(message = "账户是否被冻结,见sys_yes_no字典类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String freezeStatus;
+
+    /**
+     * 消费密码
+     */
+    @NotBlank(message = "消费密码不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String consumePwd;
+
+    /**
+     * 账户流水号
+     */
+    @NotNull(message = "账户流水号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long userNo;
+
+    /**
+     * 账户卡片类型
+     */
+    @NotNull(message = "账户卡片类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long cardType;
+
+    /**
+     * 账户有效期
+     */
+    @NotNull(message = "账户有效期不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date lifespan;
+
+    /**
+     * 人脸照片地址
+     */
+    private String photo;
+
+    /**
+     * 唯一身份标识,第三方统一身份认证ID
+     */
+    private String otherId;
+
+    /**
+     * 第三方人员状态
+     */
+    private String userState;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 账户状态,见sys_normal_disable字典类型
+     */
+    private String status;
+
+    /**
+     * 账户类型(sys_user一卡通账户)
+     */
+    private String userType;
+}

+ 75 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/bo/UserBagBo.java

@@ -0,0 +1,75 @@
+package org.dromara.server.sync.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.sync.domain.UserBag;
+
+import java.math.BigDecimal;
+
+/**
+ * 账户钱包业务对象 t_pt_bag
+ *
+ * @author LionLi
+ * @date 2024-08-06
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = UserBag.class, reverseConvertGenerate = false)
+public class UserBagBo extends BaseEntity {
+
+    //region 这是钱包数据库对应的数据
+    /**
+     * 钱包Id,主键
+     */
+    private Long bagId;
+
+    /**
+     * 所属账户Id
+     */
+    private Long userId;
+
+    /**
+     * 钱包代码,见CARDBAGTYPE数据字典类别
+     */
+    private String bagCode;
+
+    /**
+     * 钱包余额
+     */
+    private BigDecimal balance;
+
+    /**
+     * 钱包加密余额
+     */
+    private String encryptBalance;
+
+    /**
+     * 消费总金额
+     */
+    private BigDecimal consumeTotal;
+
+    /**
+     * 消费总次数
+     */
+    private Long consumeCount;
+
+    /**
+     * 充值总金额
+     */
+    private BigDecimal rechargeTotal;
+
+
+    /**
+     * 充值总次数
+     */
+    private Long rechargeCount;
+    /**
+     * 租户Id
+     */
+    private String tenantId;
+    //endregion
+}

+ 106 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/bo/UserCardBo.java

@@ -0,0 +1,106 @@
+package org.dromara.server.sync.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.sync.domain.UserCard;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 账户卡片业务对象 t_pt_card
+ *
+ * @author LionLi
+ * @date 2024-08-06
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = UserCard.class, reverseConvertGenerate = false)
+public class UserCardBo extends BaseEntity {
+
+    /**
+     * 卡片Id,主键
+     */
+    private Long cardId;
+
+    /**
+     * 所属账户Id
+     */
+
+    private Long userId;
+    /**
+     * 卡片类型
+     */
+
+    private Long cardType;
+
+    /**
+     * 卡片有效期
+     */
+
+    private Date lifespan;
+    /*
+      卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 物理卡号
+     */
+    private Long factoryId;
+
+    /**
+     * 是否主卡,见sys_yes_no字典类别
+     */
+    private String mainCard;
+
+    /**
+     * 卡片状态,见KZT字典类别
+     */
+    private String status;
+
+    /**
+     * 卡状态变更时间
+     */
+    private Date changeTime;
+
+    /**
+     * 当日消费金额
+     */
+    private BigDecimal dayTotal;
+
+    /**
+     * 当日消费次数
+     */
+    private Long dayCount;
+
+    /**
+     * 当餐交易金额
+     */
+    private BigDecimal mealTotal;
+
+    /**
+     * 当餐消费次数
+     */
+    private Long mealCount;
+
+    /**
+     * 最后交易时间
+     */
+    private Date lastPay;
+
+    /**
+     * 最后交易餐类,对应营业时段的编号
+     */
+    private Long lastMeal;
+
+    /**
+     * 租户Id
+     */
+    private String tenantId;
+
+}

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

@@ -73,5 +73,9 @@ public class UserDeptBo extends BaseEntity {
      */
     private Date payDate;
 
+    /**
+     * 租户Id
+     */
+    private String tenantId;
 
 }

+ 80 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/vo/SysPostVo.java

@@ -0,0 +1,80 @@
+package org.dromara.server.sync.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.sync.domain.SysPost;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 岗位信息视图对象 t_sys_post
+ *
+ * @author Michelle.Chung
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysPost.class)
+public class SysPostVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 岗位ID
+     */
+    private Long postId;
+
+    /**
+     * 岗位编码
+     */
+    private String postCode;
+
+    /**
+     * 岗位名称
+     */
+    private String postName;
+
+    /**
+     * 显示顺序
+     */
+    private Integer postSort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 是否系统数据(Y是 N否)
+     */
+    private String sysData;
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 创建者
+     */
+    private Long createBy;
+
+    /**
+     * 更新者
+     */
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+}

+ 222 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/vo/UserAccountVo.java

@@ -0,0 +1,222 @@
+package org.dromara.server.sync.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.server.sync.domain.UserAccount;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 一卡通账户视图对象 t_pt_userAccount
+ *
+ * @author LionLi
+ * @date 2024-08-05
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = UserAccount.class)
+public class UserAccountVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 账户Id,主键
+     */
+    private Long userId;
+
+    /**
+     * 岗位Id
+     */
+    private Long postId;
+
+    /**
+     * 部门Id
+     */
+    private Long deptId;
+
+    /**
+     * 账户名/登录账号
+     */
+    private String userName;
+
+    /**
+     * 登录密码
+     */
+    private String password;
+
+    /**
+     * 账户编号/工号
+     */
+    private String userNumb;
+
+    /**
+     * 账户姓名
+     */
+    private String realName;
+
+    /**
+     * 账户性别,见sys_user_sex字典类型
+     */
+    private String sex;
+
+    /**
+     * 账户类型(0=内部账户 1=老师 2=学生 3=家长  4=其他人员)
+     */
+    private String category;
+
+    /**
+     * 账户邮箱
+     */
+    private String email;
+
+    /**
+     * 通信地址
+     */
+    private String address;
+
+    /**
+     * 手机号码
+     */
+//    @Sensitive(strategy= SensitiveStrategy.PHONE)
+    private String phone;
+
+    /**
+     * 头像地址
+     */
+    private Long avatar;
+
+    /**
+     * 身份证号
+     */
+    private String idNumber;
+
+    /**
+     * 一卡通账户状态(0-未开户  1-已开户  -1已销户)
+     */
+    private String accountStatus;
+
+    /**
+     * 账户是否被冻结,见sys_yes_no字典类型
+     */
+    private String freezeStatus;
+
+    /**
+     * 消费密码
+     */
+    private String consumePwd;
+
+    /**
+     * 账户流水号
+     */
+    private Long userNo;
+
+    /**
+     * 账户卡片类型
+     */
+    private Long cardType;
+
+    /**
+     * 账户有效期
+     */
+    private Date lifespan;
+
+    /**
+     * 人脸照片地址
+     */
+    private String photo;
+
+    /**
+     * 唯一身份标识,第三方统一身份认证ID
+     */
+    private String otherId;
+
+    /**
+     * 第三方人员状态
+     */
+    @ExcelProperty(value = "第三方人员状态")
+    private String userState;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 账户状态,见sys_normal_disable字典类型
+     */
+    @ExcelProperty(value = "账户状态,见sys_normal_disable字典类型")
+    private String status;
+
+    /**
+     * 部门名
+     */
+    @Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "deptId")
+    private String deptName;
+
+    /**
+     * 卡类名
+     */
+    @Translation(type = TransConstant.CARD_TYPE_ID_TO_NAME, mapper = "cardType")
+    private String cardTypeName;
+
+    /**
+     * 账户余额
+     */
+    @Translation(type = TransConstant.USER_ID_TO_BALANCE, mapper = "userId")
+    private String accountBalance;
+
+    /**
+     * 账户发卡信息
+     */
+    @Translation(type = TransConstant.USER_ID_TO_CARD_INFO, mapper = "userId")
+    private String accountCard;
+
+    /**
+     * 部门唯一身份标识,第三方统一身份认证ID
+     */
+    private String otherDeptId;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 创建者
+     */
+    private Long createBy;
+
+    /**
+     * 更新者
+     */
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 租户编号
+     */
+    private String tenantId;
+
+    /**
+     * 微信二维码使用
+     */
+    //卡流水号
+    private Long cardNo;
+    //商户名称
+    private String customerName;
+    //商户编号
+    private String customerNo;
+}

+ 78 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/vo/UserBagVo.java

@@ -0,0 +1,78 @@
+package org.dromara.server.sync.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import org.dromara.server.sync.domain.UserBag;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+
+/**
+ * 账户钱包视图对象 t_pt_bag
+ *
+ * @author LionLi
+ * @date 2024-08-06
+ */
+@Data
+@Accessors(chain = true)
+@ExcelIgnoreUnannotated
+@AutoMapper(target = UserBag.class)
+public class UserBagVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 钱包Id,主键
+     */
+    private Long bagId;
+
+    /**
+     * 所属账户Id
+     */
+    private Long userId;
+
+    /**
+     * 钱包代码,见CARDBAGTYPE数据字典类别
+     */
+    private String bagCode;
+
+    /**
+     * 钱包余额
+     */
+    private BigDecimal balance;
+
+    /**
+     * 钱包加密余额
+     */
+    private String encryptBalance;
+
+    /**
+     * 消费总金额
+     */
+    private BigDecimal consumeTotal;
+
+    /**
+     * 消费总次数
+     */
+    private Long consumeCount;
+
+    /**
+     * 充值总金额
+     */
+    private BigDecimal rechargeTotal;
+
+    /**
+     * 充值总次数
+     */
+    private Long rechargeCount;
+
+    /**
+     * 钱包名称
+     */
+    private String bagName;
+}

+ 160 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/vo/UserCardVo.java

@@ -0,0 +1,160 @@
+package org.dromara.server.sync.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.server.sync.domain.UserCard;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * 账户卡片视图对象 t_pt_card
+ *
+ * @author LionLi
+ * @date 2024-08-06
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = UserCard.class)
+public class UserCardVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 卡片Id,主键
+     */
+    private Long cardId;
+
+    /**
+     * 所属账户Id
+     */
+    private Long userId;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+
+    /**
+     * 卡片类型
+     */
+    private Long cardType;
+
+    /**
+     * 卡片有效期
+     */
+    private Date lifespan;
+
+    /**
+     * 物理卡号
+     */
+    private Long factoryId;
+
+    /**
+     * 是否主卡,见sys_yes_no字典类别
+     */
+    private String mainCard;
+
+    /**
+     * 卡片状态,见KZT字典类别
+     */
+    private String status;
+
+    /**
+     * 卡状态变更时间
+     */
+    private Date changeTime;
+
+    /**
+     * 当日消费金额
+     */
+    private BigDecimal dayTotal;
+
+    /**
+     * 当日消费次数
+     */
+    private Long dayCount;
+
+    /**
+     * 当餐交易金额
+     */
+    private BigDecimal mealTotal;
+
+    /**
+     * 当餐消费次数
+     */
+    private Long mealCount;
+
+    /**
+     * 最后交易时间
+     */
+    private Date lastPay;
+
+    /**
+     * 最后交易餐类,对应营业时段的编号
+     */
+    private Long lastMeal;
+
+    /**
+     * 租户Id
+     */
+    private String tenantId;
+
+    /**
+     * 创建者
+     */
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    //region 根据卡片类型关联到的卡片押金、工本费等信息
+    /**
+     * 卡片类型名称
+     */
+    @Translation(type = TransConstant.CARD_TYPE_ID_TO_NAME, mapper = "cardType")
+    private String cardTypeName;
+
+    /**
+     * 管理费
+     */
+    private BigDecimal commissionCharge;
+
+    /**
+     * 押金
+     */
+    private BigDecimal deposit;
+
+    /**
+     * 工本费
+     */
+    private BigDecimal productCost;
+
+    /**
+     * 折旧费
+     */
+    private BigDecimal depreciation;
+    //endregion
+
+
+
+}

+ 58 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/domain/vo/UserDeptVo.java

@@ -0,0 +1,58 @@
+package org.dromara.server.sync.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.sync.domain.UserDept;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 用户部门视图对象 t_user_dept
+ *
+ * @author LionLi
+ * @date 2024-09-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = UserDept.class)
+public class UserDeptVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户部门Id,主键
+     */
+    private Long userDeptId;
+
+    /**
+     * 是否主部门,见sys_yes_no字典类别
+     */
+    private String mainDept;
+
+    /**
+     * 报到状态,见sys_yes_no字典类别,学员报到专用
+     */
+    private String checkStatus;
+
+    /**
+     * 报到时间,学员报到专用
+     */
+    private Date checkDate;
+
+    /**
+     * 缴费状态,见sys_yes_no字典类别,学员报到专用
+     */
+    private String payStatus;
+
+    /**
+     * 缴费时间,学员报到专用
+     */
+    private Date payDate;
+
+
+}

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

@@ -71,4 +71,50 @@ public class RemoteKafkaSyncServiceImpl implements RemoteKafkaSyncService {
     public void syncGraduateClass(JSONObject data) {
         syncKafkaService.SyncGraduateClass(data);
     }
+
+    /**
+     * kafka教职工同步
+     *
+     * @param data 教职工数据
+     */
+    @Override
+    public void syncTeacher(JSONObject data) {
+        syncKafkaService.syncTeacher(data);
+    }
+    /**
+     * kafka教职工删除
+     *
+     * @param data 教职工数据
+     */
+    @Override
+    public void syncDelTeacher(JSONObject data) {
+        syncKafkaService.syncDelTeacher(data);
+    }
+    /**
+     * kafka 培训班学员对应人员同步
+     *
+     * @param data 培训班人员数据
+     */
+    @Override
+    public void syncTrainee(JSONObject data) {
+        syncKafkaService.syncTrainee(data);
+    }
+    /**
+     * kafka 培训班学员对应人员删除
+     *
+     * @param data 培训班学员数据
+     */
+    @Override
+    public void syncDelTrainee(JSONObject data) {
+        syncKafkaService.syncDelTrainee(data);
+    }
+    /**
+     * kafka 研究生对应人员同步
+     *
+     * @param data 研究生班级
+     */
+    @Override
+    public void syncGraduate(JSONObject data) {
+        syncKafkaService.syncGraduate(data);
+    }
 }

+ 14 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/mapper/SysPostMapper.java

@@ -0,0 +1,14 @@
+package org.dromara.server.sync.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.sync.domain.SysPost;
+import org.dromara.server.sync.domain.vo.SysPostVo;
+
+/**
+ * 岗位信息 数据层
+ *
+ * @author Lion Li
+ */
+public interface SysPostMapper extends BaseMapperPlus<SysPost, SysPostVo> {
+
+}

+ 19 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/mapper/SysUserMapper.java

@@ -0,0 +1,19 @@
+package org.dromara.server.sync.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.sync.domain.SysUser;
+import org.dromara.server.sync.domain.vo.SysUserVo;
+
+/**
+ * 用户表 数据层
+ *
+ * @author Lion Li
+ */
+public interface SysUserMapper extends BaseMapperPlus<SysUser, SysUserVo> {
+
+    int delUserDeptByUserId(@Param("delFlag") String delFlag,@Param("operatorId") String operatorId,@Param("updateTime") String updateTime,@Param("userId") String userId);
+
+    int delUserRoleByUserId(@Param("userId") String userId);
+
+}

+ 15 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/mapper/UserAccountMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.server.sync.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.sync.domain.UserAccount;
+import org.dromara.server.sync.domain.vo.UserAccountVo;
+
+/**
+ * 一卡通账户Mapper接口
+ *
+ * @author LionLi
+ * @date 2024-08-05
+ */
+public interface UserAccountMapper extends BaseMapperPlus<UserAccount, UserAccountVo> {
+
+}

+ 15 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/mapper/UserBagMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.server.sync.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.sync.domain.UserBag;
+import org.dromara.server.sync.domain.vo.UserBagVo;
+
+/**
+ * 账户钱包Mapper接口
+ *
+ * @author LionLi
+ * @date 2024-08-06
+ */
+public interface UserBagMapper extends BaseMapperPlus<UserBag, UserBagVo> {
+
+}

+ 15 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/mapper/UserCardMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.server.sync.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.sync.domain.UserCard;
+import org.dromara.server.sync.domain.vo.UserCardVo;
+
+/**
+ * 账户卡片Mapper接口
+ *
+ * @author LionLi
+ * @date 2024-08-06
+ */
+public interface UserCardMapper extends BaseMapperPlus<UserCard, UserCardVo> {
+
+}

+ 15 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/mapper/UserDeptMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.server.sync.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.sync.domain.UserDept;
+import org.dromara.server.sync.domain.vo.UserDeptVo;
+
+/**
+ * 用户部门Mapper接口
+ *
+ * @author LionLi
+ * @date 2024-09-11
+ */
+public interface UserDeptMapper extends BaseMapperPlus<UserDept, UserDeptVo> {
+
+}

+ 17 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/IPostService.java

@@ -0,0 +1,17 @@
+package org.dromara.server.sync.service;
+
+import org.dromara.server.sync.domain.vo.SysPostVo;
+
+import java.util.List;
+
+/**
+ * @ClassName IUserService
+ * @Description 用户服务接口
+ * @Author luoyibo
+ * @Date 2025-02-06 15:01
+ * @Version 1.0
+ * @since jdk17
+ */
+public interface IPostService {
+    List<SysPostVo> selectByTenantId(String tenantId);
+}

+ 29 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/IUserAccountService.java

@@ -0,0 +1,29 @@
+package org.dromara.server.sync.service;
+
+import org.dromara.server.sync.domain.bo.UserAccountBo;
+import org.dromara.server.sync.domain.vo.UserAccountVo;
+
+/**
+ * 一卡通账户Service接口
+ *
+ * @author LionLi
+ * @date 2024-08-05
+ */
+public interface IUserAccountService {
+
+    /**
+     * 查询一卡通账户
+     *
+     * @param userId 主键
+     * @return 一卡通账户
+     */
+    UserAccountVo queryById(Long userId);
+
+    /**
+     * 用户账户处理
+     * @param bo 账户业务对象
+     * @return 处理结果
+     */
+    Boolean doUserAccount(UserAccountBo bo);
+
+}

+ 47 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/IUserBagService.java

@@ -0,0 +1,47 @@
+package org.dromara.server.sync.service;
+
+import org.dromara.server.sync.domain.bo.UserBagBo;
+import org.dromara.server.sync.domain.vo.UserBagVo;
+
+import java.util.List;
+
+/**
+ * 账户钱包Service接口
+ *
+ * @author LionLi
+ * @date 2024-08-06
+ */
+public interface IUserBagService {
+    /**
+     * 查询符合条件的账户钱包列表
+     *
+     * @param bo 查询条件
+     * @return 账户钱包列表
+     */
+    List<UserBagVo> queryList(UserBagBo bo);
+
+    /**
+     * 新增账户钱包
+     *
+     * @param bo 账户钱包
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(UserBagBo bo);
+    /**
+     * 初始化账户钱包
+     *
+     * @param userId 账户Id
+     * @return 是否初始化成功
+     */
+    Boolean initAccountBag(Long userId);
+
+    /**
+     * 初始化账户钱包
+     * @param userId 账户Id
+     * @param tenantId 租户Id
+     * @return 是否初始化成功
+     */
+    Boolean initAccountBag(Long userId,String tenantId);
+
+
+}

+ 28 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/IUserCardService.java

@@ -0,0 +1,28 @@
+package org.dromara.server.sync.service;
+
+import org.dromara.server.sync.domain.bo.UserCardBo;
+
+/**
+ * 账户卡片Service接口
+ *
+ * @author LionLi
+ * @date 2024-08-06
+ */
+public interface IUserCardService {
+
+    /**
+     * 查询用户的卡片持有情况
+     * 卡状态=1、2、7的卡片
+     * @param userId 用户Id
+     * @return true:已发卡 false:未发卡
+     */
+    Boolean selectCardByUserId(String userId);
+
+    /**
+     * 新增账户卡片
+     *
+     * @param bo 账户卡片
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(UserCardBo bo);
+}

+ 17 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/IUserDeptService.java

@@ -0,0 +1,17 @@
+package org.dromara.server.sync.service;
+
+import org.dromara.server.sync.domain.bo.UserDeptBo;
+
+/**
+ * 用户部门Service接口
+ *
+ * @author LionLi
+ * @date 2024-09-11
+ */
+public interface IUserDeptService {
+    void updateMainDeptByUserId(Long userId);
+
+    void setUserDeptPost(UserDeptBo bo);
+
+
+}

+ 22 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/IUserService.java

@@ -0,0 +1,22 @@
+package org.dromara.server.sync.service;
+
+import org.dromara.server.sync.domain.bo.SysUserBo;
+import org.dromara.server.sync.domain.vo.SysUserVo;
+
+/**
+ * @ClassName IUserService
+ * @Description 用户服务接口
+ * @Author luoyibo
+ * @Date 2025-02-06 15:01
+ * @Version 1.0
+ * @since jdk17
+ */
+public interface IUserService {
+    SysUserVo selectByOtherId(String otherId, String tenantId);
+
+    Boolean insertUser(SysUserBo bo);
+
+    Boolean updateUser(SysUserBo bo);
+
+    Boolean deleteById(String userId, Long operatorId);
+}

+ 32 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/impl/PostServiceImpl.java

@@ -0,0 +1,32 @@
+package org.dromara.server.sync.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.tenant.helper.TenantHelper;
+import org.dromara.server.sync.domain.SysPost;
+import org.dromara.server.sync.domain.vo.SysPostVo;
+import org.dromara.server.sync.mapper.SysPostMapper;
+import org.dromara.server.sync.service.IPostService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @ClassName DeptServiceImpl
+ * @Description 部门服务接口实现
+ * @Author luoyibo
+ * @Date 2025-01-23 21:33
+ * @Version 1.0
+ * @since jdk17
+ */
+@Service
+@RequiredArgsConstructor
+public class PostServiceImpl implements IPostService {
+    private final SysPostMapper baseMapper;
+
+    @Override
+    public List<SysPostVo> selectByTenantId(String tenantId) {
+        return TenantHelper.ignore(() -> baseMapper.selectVoList(new LambdaQueryWrapper<SysPost>()
+                                                                     .eq(SysPost::getTenantId, tenantId)));
+    }
+}

+ 93 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/impl/UserAccountServiceImpl.java

@@ -0,0 +1,93 @@
+package org.dromara.server.sync.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.utils.MapstructUtils;
+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.server.sync.business.card.CardBusiness;
+import org.dromara.server.sync.domain.UserAccount;
+import org.dromara.server.sync.domain.bo.UserAccountBo;
+import org.dromara.server.sync.domain.bo.UserCardBo;
+import org.dromara.server.sync.domain.vo.UserAccountVo;
+import org.dromara.server.sync.mapper.UserAccountMapper;
+import org.dromara.server.sync.mq.PushKafkaData;
+import org.dromara.server.sync.service.IUserAccountService;
+import org.dromara.server.sync.service.IUserBagService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 一卡通账户Service业务层处理
+ *
+ * @author LionLi
+ * @date 2024-08-05
+ */
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class UserAccountServiceImpl implements IUserAccountService {
+    private final PushKafkaData kafkaNormalProducer;
+    private final UserAccountMapper baseMapper;
+    private final IUserBagService bagService;
+    private final CardBusiness cardBusiness;
+
+    /**
+     * 查询一卡通账户
+     *
+     * @param userId 主键
+     * @return 一卡通账户
+     */
+    @Override
+    public UserAccountVo queryById(Long userId) {
+        return baseMapper.selectVoById(userId);
+    }
+    /**
+     * 用户账户处理
+     * @param bo 账户业务对象
+     * @return 处理结果
+     */
+    @Override
+    public Boolean doUserAccount(UserAccountBo bo) {
+        UserAccount entity = MapstructUtils.convert(bo, UserAccount.class);
+        UserAccountVo vo = baseMapper.selectVoById(bo.getUserId());
+        int rows;
+        if(ObjectUtil.isEmpty(vo)){
+            // 当前没有一卡通账户,先增加账户信息
+             rows = baseMapper.insert(entity);
+            if (rows != 1) {
+                return false;
+            }
+            if(ObjectUtil.isNotEmpty(entity)){
+                Boolean result = bagService.initAccountBag(bo.getUserId(),bo.getTenantId());
+                if(!result){
+                    return false;
+                }
+                // 钱包表初始化成功,同时发虚拟卡
+                UserCardBo cardBo = BeanUtil.copyProperties(bo, UserCardBo.class);
+                R<String> rs = cardBusiness.openVirtualCard(cardBo);
+                if (R.isSuccess(rs)) {
+                    return true;
+                } else {
+                    log.error(rs.getMsg());
+                    return false;
+                }
+            }
+        } else{
+            // 已有账户,更新
+            rows = baseMapper.updateById(entity);
+            if(rows != 1){
+                return false;
+            }
+            if(ObjectUtil.notEqual(bo.getCardType(),vo.getCardType())||ObjectUtil.notEqual(bo.getLifespan(),vo.getLifespan())){
+                // 如果卡类或有效期变了,需要同步更新主卡的卡类与有效期
+            }
+        }
+        vo = baseMapper.selectVoById(bo.getUserId());
+        kafkaNormalProducer.sendKafkaMessage(KafkaTopicConstants.SYNC_DATA_TOPIC, EventTypeConstants.ACCOUNT, EventSenderEnum.BACKSTAGE.code(), vo);
+        return true;
+    }
+}

+ 112 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/impl/UserBagServiceImpl.java

@@ -0,0 +1,112 @@
+package org.dromara.server.sync.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.server.sync.domain.UserBag;
+import org.dromara.server.sync.domain.bo.UserBagBo;
+import org.dromara.server.sync.domain.vo.UserBagVo;
+import org.dromara.server.sync.mapper.UserBagMapper;
+import org.dromara.server.sync.service.IUserBagService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 账户钱包Service业务层处理
+ *
+ * @author LionLi
+ * @date 2024-08-06
+ */
+@RequiredArgsConstructor
+@Service
+public class UserBagServiceImpl implements IUserBagService {
+    private final UserBagMapper baseMapper;
+    /**
+     * 查询符合条件的账户钱包列表
+     *
+     * @param bo 查询条件
+     * @return 账户钱包列表
+     */
+    @Override
+    public List<UserBagVo> queryList(UserBagBo bo) {
+        LambdaQueryWrapper<UserBag> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    @Override
+    public Boolean insertByBo(UserBagBo bo) {
+        UserBag add = MapstructUtils.convert(bo, UserBag.class);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            if (add != null) {
+                bo.setBagId(add.getBagId());
+            }
+        }
+        return flag;
+    }
+
+    /**
+     * 初始化账户钱包
+     *
+     * @param userId 账户Id
+     * @return 是否初始化成功
+     */
+    @Override
+    public Boolean initAccountBag(Long userId) {
+        UserBagBo bo = new UserBagBo();
+        bo.setUserId(userId);
+        List<UserBagVo> listVo = SpringUtils.getAopProxy(this).queryList(bo);
+        if (listVo.isEmpty()) {
+            //没有钱包,初始化
+            for (int i = 1; i < 7; i++) {
+                UserBag entity = new UserBag();
+                entity.setUserId(userId);
+                entity.setBagCode(String.valueOf(i));
+                baseMapper.insert(entity);
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public Boolean initAccountBag(Long userId, String tenantId) {
+        UserBagBo bo = new UserBagBo();
+        bo.setUserId(userId);
+        List<UserBagVo> listVo = SpringUtils.getAopProxy(this).queryList(bo);
+        if (listVo.isEmpty()) {
+            //没有钱包,初始化
+            for (int i = 1; i < 7; i++) {
+                UserBag entity = new UserBag();
+                entity.setUserId(userId);
+                entity.setBagCode(String.valueOf(i));
+                entity.setTenantId(tenantId);
+                baseMapper.insert(entity);
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 查询条件构建
+     * @param bo 钱包业务对象
+     * @return 查询条件
+     */
+    private LambdaQueryWrapper<UserBag> buildQueryWrapper(UserBagBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<UserBag> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getUserId() != null, UserBag::getUserId, bo.getUserId());
+        lqw.eq(StringUtils.isNotBlank(bo.getBagCode()), UserBag::getBagCode, bo.getBagCode());
+        lqw.eq(bo.getBalance() != null, UserBag::getBalance, bo.getBalance());
+        lqw.eq(bo.getConsumeTotal() != null, UserBag::getConsumeTotal, bo.getConsumeTotal());
+        lqw.eq(bo.getConsumeCount() != null, UserBag::getConsumeCount, bo.getConsumeCount());
+        lqw.eq(bo.getRechargeTotal() != null, UserBag::getRechargeTotal, bo.getRechargeTotal());
+        lqw.eq(bo.getRechargeCount() != null, UserBag::getRechargeCount, bo.getRechargeCount());
+        return lqw;
+    }
+
+}

+ 74 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/impl/UserCardServiceImpl.java

@@ -0,0 +1,74 @@
+package org.dromara.server.sync.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.utils.MapstructUtils;
+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.server.sync.domain.UserCard;
+import org.dromara.server.sync.domain.bo.UserCardBo;
+import org.dromara.server.sync.domain.vo.UserCardVo;
+import org.dromara.server.sync.mapper.UserCardMapper;
+import org.dromara.server.sync.mq.PushKafkaData;
+import org.dromara.server.sync.service.IUserCardService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 账户卡片Service业务层处理
+ *
+ * @author LionLi
+ * @date 2024-08-06
+ */
+@RequiredArgsConstructor
+@Service
+public class UserCardServiceImpl implements IUserCardService {
+    private final UserCardMapper baseMapper;
+    private final PushKafkaData kafkaNormalProducer;
+
+    /**
+     * 查询用户的卡片持有情况
+     * 卡状态=1、2、7的卡片
+     *
+     * @param userId 用户Id
+     * @return true:已发卡 false:未发卡
+     */
+    @Override
+    public Boolean selectCardByUserId(String userId) {
+        LambdaQueryWrapper<UserCard> lqw = new LambdaQueryWrapper<>();
+        lqw.eq(UserCard::getUserId, userId);
+        lqw.in(UserCard::getStatus, "1", "2", "7");
+
+        List<UserCardVo> listVo = baseMapper.selectVoList(lqw, UserCardVo.class);
+        return CollectionUtil.isNotEmpty(listVo);
+    }
+
+    /**
+     * 新增账户卡片
+     *
+     * @param bo 账户卡片
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(UserCardBo bo) {
+        if (ObjUtil.isEmpty(bo.getLastPay())) {
+            bo.setLastPay(DateUtil.offsetDay(DateUtil.date(), -1));
+        }
+        bo.setLastMeal(0L);
+        UserCard add = MapstructUtils.convert(bo, UserCard.class);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            if (add != null) {
+                bo.setCardId(add.getCardId());
+            }
+        }
+        UserCardVo vo = baseMapper.selectVoById(bo.getCardId());
+        kafkaNormalProducer.sendKafkaMessage(KafkaTopicConstants.SYNC_DATA_TOPIC, EventTypeConstants.CARD, EventSenderEnum.BACKSTAGE.code(), vo);
+        return flag;
+    }
+}

+ 52 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/impl/UserDeptServiceImpl.java

@@ -0,0 +1,52 @@
+package org.dromara.server.sync.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.server.sync.domain.UserDept;
+import org.dromara.server.sync.domain.bo.UserDeptBo;
+import org.dromara.server.sync.domain.vo.UserDeptVo;
+import org.dromara.server.sync.mapper.UserDeptMapper;
+import org.dromara.server.sync.service.IUserDeptService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 用户部门Service业务层处理
+ *
+ * @author LionLi
+ * @date 2024-09-11
+ */
+@RequiredArgsConstructor
+@Service
+public class UserDeptServiceImpl implements IUserDeptService {
+    private final UserDeptMapper baseMapper;
+
+    @Override
+    public void updateMainDeptByUserId(Long userId) {
+        LambdaUpdateWrapper<UserDept> luw = new LambdaUpdateWrapper<>();
+        luw.set(UserDept::getMainDept, 'N');
+        luw.eq(UserDept::getUserId, userId);
+        baseMapper.update(null, luw);
+    }
+
+    @Override
+    public void setUserDeptPost(UserDeptBo bo) {
+        UserDept entity = MapstructUtils.convert(bo, UserDept.class);
+        LambdaQueryWrapper<UserDept> lqw = new LambdaQueryWrapper<UserDept>()
+                                               .eq(UserDept::getUserId, bo.getUserId())
+                                               .eq(UserDept::getPostId, bo.getPostId())
+                                               .eq(UserDept::getDeptId, bo.getDeptId());
+
+        UserDeptVo vo = baseMapper.selectVoOne(lqw);
+        if (ObjectUtil.isEmpty(vo)) {
+            baseMapper.insert(entity);
+        } else {
+            if (entity != null) {
+                entity.setUserDeptId(vo.getUserDeptId());
+            }
+            baseMapper.updateById(entity);
+        }
+    }
+}

+ 134 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/impl/UserServiceImpl.java

@@ -0,0 +1,134 @@
+package org.dromara.server.sync.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.constant.DefaultConstants;
+import org.dromara.common.core.enums.UserAccountStatusEnum;
+import org.dromara.common.core.utils.MapstructUtils;
+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.SysUser;
+import org.dromara.server.sync.domain.bo.SysUserBo;
+import org.dromara.server.sync.domain.bo.UserAccountBo;
+import org.dromara.server.sync.domain.bo.UserDeptBo;
+import org.dromara.server.sync.domain.vo.SysUserVo;
+import org.dromara.server.sync.mapper.SysUserMapper;
+import org.dromara.server.sync.mq.PushKafkaData;
+import org.dromara.server.sync.service.IUserAccountService;
+import org.dromara.server.sync.service.IUserDeptService;
+import org.dromara.server.sync.service.IUserService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @ClassName DeptServiceImpl
+ * @Description 部门服务接口实现
+ * @Author luoyibo
+ * @Date 2025-01-23 21:33
+ * @Version 1.0
+ * @since jdk17
+ */
+@Service
+@RequiredArgsConstructor
+public class UserServiceImpl implements IUserService {
+    private final SysUserMapper baseMapper;
+    private final IUserDeptService userDeptService;
+    private final IUserAccountService userAccountService;
+    private final PushKafkaData kafkaNormalProducer;
+
+    @Override
+    public SysUserVo selectByOtherId(String otherId, String tenantId) {
+        return TenantHelper.ignore(
+            () -> baseMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getOtherId, otherId).eq(SysUser::getTenantId, tenantId)));
+    }
+
+    @Override
+    public Boolean insertUser(SysUserBo bo) {
+        SysUser sysUser = MapstructUtils.convert(bo, SysUser.class);
+        int rows = baseMapper.insert(sysUser);
+        if (sysUser != null) {
+            bo.setUserId(sysUser.getUserId());
+        }
+        // 新增用户岗位关联
+        insertUserDept(bo, bo.getUserDeptBoList());
+        if (rows > 0) {
+            UserAccountBo userAccountBo = BeanUtil.copyProperties(bo, UserAccountBo.class);
+            userAccountBo.setAccountStatus(UserAccountStatusEnum.IS_OPEN.code().toString());
+            Boolean result = userAccountService.doUserAccount(userAccountBo);
+        }
+        SysUserVo vo = TenantHelper.ignore(()->baseMapper.selectVoById(bo.getUserId()));
+        kafkaNormalProducer.sendKafkaMessage(KafkaTopicConstants.SYNC_DATA_TOPIC, EventTypeConstants.USER, EventSenderEnum.SYSTEM.code(), vo);
+        return rows > 0;
+    }
+
+    @Override
+    public Boolean updateUser(SysUserBo bo) {
+
+        // 新增用户部门岗位管理
+        insertUserDept(bo, bo.getUserDeptBoList());
+
+        SysUser sysUser = MapstructUtils.convert(bo, SysUser.class);
+        int rows = TenantHelper.ignore(() -> baseMapper.updateById(sysUser));
+        if (rows > 0) {
+            UserAccountBo userAccountBo = BeanUtil.copyProperties(bo, UserAccountBo.class);
+            userAccountBo.setAccountStatus(UserAccountStatusEnum.IS_OPEN.code().toString());
+            Boolean result = userAccountService.doUserAccount(userAccountBo);
+        }
+        SysUserVo vo = TenantHelper.ignore(()->baseMapper.selectVoById(bo.getUserId()));
+        kafkaNormalProducer.sendKafkaMessage(KafkaTopicConstants.SYNC_DATA_TOPIC, EventTypeConstants.USER, EventSenderEnum.SYSTEM.code(), vo);
+        return rows > 0;
+    }
+
+    @Override
+    public Boolean deleteById(String userId, Long operatorId) {
+        // 删除人员角色关系
+        baseMapper.delUserRoleByUserId(userId);
+        // 删除人员部门对应关系
+        baseMapper.delUserDeptByUserId(DefaultConstants.DELETED, operatorId.toString(), DateUtil.formatDate(new Date()), userId);
+        // 删除人员
+        return TenantHelper.ignore(() -> baseMapper.update(null, new LambdaUpdateWrapper<SysUser>()
+                                                                     .set(SysUser::getDelFlag, DefaultConstants.DELETED)
+                                                                     .set(SysUser::getUpdateBy, operatorId)
+                                                                     .set(SysUser::getUpdateTime, DateUtil.date())
+                                                                     .eq(SysUser::getUserId, userId)) > 0);
+    }
+
+    private void insertUserDept(SysUserBo bo, List<UserDeptBo> userDeptBoList) {
+        // 将已有的人员部门关系设置成非主部门
+        userDeptService.updateMainDeptByUserId(bo.getUserId());
+        // 设置当前部门为主部门
+        UserDeptBo justUserDeptBo = new UserDeptBo();
+        justUserDeptBo.setUserId(bo.getUserId());
+        justUserDeptBo.setDeptId(bo.getDeptId());
+        justUserDeptBo.setPostId(bo.getPostId());
+        justUserDeptBo.setUpdateBy(bo.getUpdateBy());
+        justUserDeptBo.setTenantId(bo.getTenantId());
+        justUserDeptBo.setMainDept("Y");
+
+        userDeptService.setUserDeptPost(justUserDeptBo);
+        // 如果有多部门,设置多部门
+        if (CollectionUtil.isNotEmpty(userDeptBoList)) {
+            // 排除主部门
+            List<UserDeptBo> userDeptList = userDeptBoList.stream()
+                                                .filter(p -> ObjectUtil.notEqual(bo.getDeptId(), p.getDeptId())).toList();
+            if (CollectionUtil.isNotEmpty(userDeptList)) {
+                userDeptList.forEach(userDeptBo -> {
+                    userDeptBo.setUserId(bo.getUserId());
+                    userDeptBo.setMainDept("N");
+                    userDeptBo.setUpdateBy(bo.getUpdateBy());
+                    userDeptBo.setTenantId(bo.getTenantId());
+                    userDeptService.setUserDeptPost(userDeptBo);
+                });
+            }
+        }
+    }
+}

+ 6 - 6
ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/user/strategy/impl/SyncGraduateStrategyImpl.java → ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/strategy/user/impl/SyncGraduateStrategyImpl.java

@@ -1,14 +1,14 @@
-package org.dromara.server.base.service.user.strategy.impl;
+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.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.dromara.server.sync.business.user.SyncUserBusiness;
+import org.dromara.server.sync.domain.vo.SysUserVo;
+import org.dromara.server.sync.strategy.user.ISyncUserStrategy;
 import org.springframework.stereotype.Service;
 
 import java.text.MessageFormat;
@@ -29,14 +29,14 @@ import java.util.List;
 @RequiredArgsConstructor
 @Service(SyncResourceConstants.GRADUATE)
 public class SyncGraduateStrategyImpl implements ISyncUserStrategy {
-    private final SyncRemoteUserService syncUserService;
+    private final SyncUserBusiness syncUserBusiness;
 
     @Override
     public boolean syncUser(List<ResourcePerson> persons) {
         List<String> syncMessage = new ArrayList<>();
 
         persons.forEach(person -> {
-            R<RemoteUserVo> result = syncUserService.syncPeron(person);
+            R<SysUserVo> result = syncUserBusiness.syncPeron(person);
             if (result.getCode() == R.SUCCESS) {
                 syncMessage.add(MessageFormat.format("[同步研究生成功]-[{0}]", JsonUtils.toJsonString(person)));
             } else {

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

@@ -5,11 +5,11 @@ 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.dromara.server.sync.business.user.SyncUserBusiness;
+import org.dromara.server.sync.domain.vo.SysUserVo;
+import org.dromara.server.sync.strategy.user.ISyncUserStrategy;
 import org.springframework.stereotype.Service;
 
 import java.text.MessageFormat;
@@ -30,14 +30,14 @@ import java.util.List;
 @RequiredArgsConstructor
 @Service(SyncResourceConstants.TEACHER)
 public class SyncTeacherStrategyImpl implements ISyncUserStrategy {
-    private final SyncRemoteUserService syncUserService;
+    private final SyncUserBusiness syncUserBusiness;
 
     @Override
     public boolean syncUser(List<ResourcePerson> persons) {
         List<String> syncMessage = new ArrayList<>();
 
         persons.forEach(person -> {
-            R<RemoteUserVo> result = syncUserService.syncPeron(person);
+            R<SysUserVo> result = syncUserBusiness.syncPeron(person);
             if (result.getCode() == R.SUCCESS) {
                 syncMessage.add(MessageFormat.format("[同步教职工成功]-[{0}]", JsonUtils.toJsonString(person)));
             } else {
@@ -52,7 +52,7 @@ public class SyncTeacherStrategyImpl implements ISyncUserStrategy {
     public boolean syncDelUser(List<ResourcePerson> persons) {
         List<String> syncDelMessage = new ArrayList<>();
         persons.forEach(person -> {
-            R<ErrorInfo> result = syncUserService.syncDelPeron(person);
+            R<ErrorInfo> result = syncUserBusiness.syncDelPeron(person);
             if (R.isSuccess(result)) {
                 syncDelMessage.add(MessageFormat.format("[同步删除教职工成功]-[{0}]", JsonUtils.toJsonString(person)));
             } else {

+ 9 - 9
ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/user/strategy/impl/SyncTraineeStrategyImpl.java → ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/strategy/user/impl/SyncTraineeStrategyImpl.java

@@ -1,15 +1,15 @@
-package org.dromara.server.base.service.user.strategy.impl;
+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.dromara.server.sync.business.user.SyncUserBusiness;
+import org.dromara.server.sync.domain.vo.SysUserVo;
+import org.dromara.server.sync.strategy.user.ISyncUserStrategy;
 import org.springframework.stereotype.Service;
 
 import java.text.MessageFormat;
@@ -30,7 +30,7 @@ import java.util.List;
 @RequiredArgsConstructor
 @Service(SyncResourceConstants.TRAINEE)
 public class SyncTraineeStrategyImpl implements ISyncUserStrategy {
-    private final SyncRemoteUserService syncUserService;
+    private final SyncUserBusiness syncUserBusiness;
 
     /**
      * 同步人员(增加、修改)
@@ -42,14 +42,14 @@ public class SyncTraineeStrategyImpl implements ISyncUserStrategy {
         List<String> syncMessage = new ArrayList<>();
         List<String> syncGuestMessage = new ArrayList<>();
         persons.forEach(person -> {
-            R<RemoteUserVo> result = syncUserService.syncPeron(person);
+            R<SysUserVo> result = syncUserBusiness.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()));
             }
 
-            R<ErrorInfo> resultGuest = syncUserService.syncGuest(person);
+            R<ErrorInfo> resultGuest = syncUserBusiness.syncGuest(person);
             if (R.isSuccess(resultGuest)) {
                 syncGuestMessage.add(MessageFormat.format("[同步团客人员成功]-[{0}]", JsonUtils.toJsonString(person)));
             } else {
@@ -71,14 +71,14 @@ public class SyncTraineeStrategyImpl implements ISyncUserStrategy {
         List<String> syncDelMessage = new ArrayList<>();
         List<String> syncDelGuestMessage = new ArrayList<>();
         persons.forEach(person -> {
-            R<ErrorInfo> result = syncUserService.syncDelPeron(person);
+            R<ErrorInfo> result = syncUserBusiness.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()));
             }
 
-            result = syncUserService.syncDeleteGuest(person);
+            result = syncUserBusiness.syncDeleteGuest(person);
             if (R.isSuccess(result)) {
                 syncDelGuestMessage.add(MessageFormat.format("[同步删除客人成功]-[{0}]", JsonUtils.toJsonString(person)));
             } else {

+ 21 - 0
ruoyi-server/ruoyi-server-sync/src/main/resources/mapper/SysUserMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.server.sync.mapper.SysUserMapper">
+    <resultMap type="org.dromara.server.sync.domain.vo.SysUserVo" id="SysDeptResult">
+    </resultMap>
+    <update id="delUserDeptByUserId">
+        UPDATE t_user_dept
+        SET del_flag=#{delFlag},
+            update_by=#{operatorId},
+            update_by=#{updateTime},
+            main_dept='N'
+        WHERE user_id = #{userId};
+    </update>
+    <delete id="delUserRoleByUserId">
+        delete
+        from sys_user_role
+        where user_id = #{userId};
+    </delete>
+</mapper>

+ 39 - 0
ruoyi-server/ruoyi-server-sync/src/main/resources/mapper/UserAccountMapper.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.server.sync.mapper.UserAccountMapper">
+
+    <resultMap type="org.dromara.server.sync.domain.UserAccount" id="UserAccountResult">
+        <result property="userId" column="user_id"/>
+        <result property="tenantId" column="tenant_id"/>
+        <result property="postId" column="post_id"/>
+        <result property="deptId" column="dept_id"/>
+        <result property="userName" column="user_name"/>
+        <result property="userNumb" column="user_numb"/>
+        <result property="realName" column="real_name"/>
+        <result property="sex" column="sex"/>
+        <result property="category" column="category"/>
+        <result property="phone" column="phone"/>
+        <result property="idNumber" column="id_number"/>
+        <result property="accountStatus" column="account_status"/>
+        <result property="freezeStatus" column="freeze_status"/>
+        <result property="consumePwd" column="consume_pwd"/>
+        <result property="userNo" column="user_no"/>
+        <result property="cardType" column="card_type"/>
+        <result property="lifespan" column="lifespan"/>
+        <result property="userAttr" column="user_attr"/>
+        <result property="photo" column="photo"/>
+        <result property="otherId" column="other_id"/>
+        <result property="userState" column="user_state"/>
+        <result property="remark" column="remark"/>
+        <result property="status" column="status"/>
+        <result property="delFlag" column="del_flag"/>
+        <result property="createDept" column="create_dept"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+</mapper>

+ 25 - 0
ruoyi-server/ruoyi-server-sync/src/main/resources/mapper/UserBagMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.server.sync.mapper.UserBagMapper">
+
+    <resultMap type="org.dromara.server.sync.domain.UserBag" id="UserBagResult">
+            <result property="bagId"    column="bag_id"    />
+            <result property="tenantId"    column="tenant_id"    />
+            <result property="userId"    column="user_id"    />
+            <result property="bagCode"    column="bag_code"    />
+            <result property="balance"    column="balance"    />
+            <result property="encryptBalance"    column="encrypt_balance"    />
+            <result property="consumeTotal"    column="consume_total"    />
+            <result property="consumeCount"    column="consume_count"    />
+            <result property="rechargeTotal"    column="recharge_total"    />
+            <result property="rechargeCount"    column="recharge_count"    />
+            <result property="delFlag"    column="del_flag"    />
+            <result property="createDept"    column="create_dept"    />
+            <result property="createBy"    column="create_by"    />
+            <result property="createTime"    column="create_time"    />
+            <result property="updateBy"    column="update_by"    />
+            <result property="updateTime"    column="update_time"    />
+    </resultMap>
+</mapper>

+ 32 - 0
ruoyi-server/ruoyi-server-sync/src/main/resources/mapper/UserCardMapper.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.server.sync.mapper.UserCardMapper">
+
+    <resultMap type="org.dromara.server.sync.domain.UserCard" id="UserCardResult">
+            <result property="cardId"    column="card_id"    />
+            <result property="tenantId"    column="tenant_id"    />
+            <result property="userId"    column="user_id"    />
+            <result property="cardNo"    column="card_no"    />
+            <result property="cardType"    column="card_type"    />
+            <result property="lifespan"    column="lifespan"    />
+            <result property="factoryId"    column="factory_id"    />
+            <result property="mainCard"    column="main_card"    />
+            <result property="status"    column="status"    />
+            <result property="changeTime"    column="change_time"    />
+            <result property="dayTotal"    column="day_total"    />
+            <result property="dayCount"    column="day_count"    />
+            <result property="mealTotal"    column="meal_total"    />
+            <result property="mealCount"    column="meal_count"    />
+            <result property="lastPay"    column="last_pay"    />
+            <result property="lastMeal"    column="last_meal"    />
+            <result property="delFlag"    column="del_flag"    />
+            <result property="createDept"    column="create_dept"    />
+            <result property="createBy"    column="create_by"    />
+            <result property="createTime"    column="create_time"    />
+            <result property="updateBy"    column="update_by"    />
+            <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+</mapper>

+ 25 - 0
ruoyi-server/ruoyi-server-sync/src/main/resources/mapper/UserDeptMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.server.sync.mapper.UserDeptMapper">
+
+    <resultMap type="org.dromara.server.sync.domain.UserDept" id="UserDeptResult">
+            <result property="userDeptId"    column="user_dept_id"    />
+            <result property="tenantId"    column="tenant_id"    />
+            <result property="userId"    column="user_id"    />
+            <result property="deptId"    column="dept_id"    />
+            <result property="postId"    column="post_id"    />
+            <result property="mainDept"    column="main_dept"    />
+            <result property="checkStatus"    column="check_status"    />
+            <result property="checkDate"    column="check_date"    />
+            <result property="payStatus"    column="pay_status"    />
+            <result property="payDate"    column="pay_date"    />
+            <result property="delFlag"    column="del_flag"    />
+            <result property="createDept"    column="create_dept"    />
+            <result property="createBy"    column="create_by"    />
+            <result property="createTime"    column="create_time"    />
+            <result property="updateBy"    column="update_by"    />
+            <result property="updateTime"    column="update_time"    />
+    </resultMap>
+</mapper>