Ver código fonte

feature: 同步服务完善
1.全量教职双向同步

luoyb 1 ano atrás
pai
commit
18468b268c

+ 6 - 16
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteUserBo.java

@@ -1,15 +1,14 @@
 package org.dromara.system.api.domain.bo;
 
 
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.dromara.common.core.constant.UserConstants;
 import org.dromara.common.core.xss.Xss;
 
-import jakarta.validation.constraints.Email;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.Size;
-
 import java.io.Serial;
 import java.io.Serializable;
 import java.util.Date;
@@ -146,14 +145,14 @@ public class RemoteUserBo implements Serializable {
      */
     private Long cardType;
 
-        /**
+    /**
      * 创建者
      */
-    private Long createdBy;
+    private Long createBy;
     /**
      * 更新者
      */
-    private Long updatedBy;
+    private Long updateBy;
 
     /**
      * 账户有效期
@@ -180,15 +179,6 @@ public class RemoteUserBo implements Serializable {
      * 创建时间
      */
     private Date createTime;
-    /**
-     * 创建者
-     */
-    private Long createBy;
-
-    /**
-     * 更新者
-     */
-    private Long updateBy;
 
     /**
      * 更新时间

+ 5 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CloudMqEventConstants.java

@@ -36,4 +36,9 @@ public interface CloudMqEventConstants {
      * 一卡通账户数据
      */
     String ACCOUNT = SENDER + "00004";
+
+    /**
+     * 一卡通账户数据
+     */
+    String CARD = SENDER + "00005";
 }

+ 2 - 2
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/CloudMqEventEnum.java

@@ -12,8 +12,8 @@ public enum CloudMqEventEnum {
     CONSUME("00000001","消费信息"),
     DEPT("00000002","部门信息"),
     USER("00000003","用户信息"),
-    ACCOUNT("00000004","账户信息");
-
+    ACCOUNT("00000004","账户信息"),
+    CARD("00000005","卡片信息");
     private final String code;
     private final String name;
 

+ 30 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/accouunt/UserAccountBusiness.java

@@ -14,20 +14,27 @@ package org.dromara.backstage.business.accouunt;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.backstage.api.RemotePtParameterService;
 import org.dromara.backstage.business.card.CardBusiness;
 import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
 import org.dromara.backstage.cardCenter.service.IPtCardService;
 import org.dromara.backstage.domain.vo.account.AccountInfoVo;
 import org.dromara.backstage.domain.vo.card.PtCardVo;
+import org.dromara.backstage.mq.KafkaNormalProducer;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
 import org.dromara.backstage.payment.domain.bo.PtUserAccountBo;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
 import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
 import org.dromara.backstage.payment.service.IPtBagService;
 import org.dromara.backstage.payment.service.IPtUserAccountService;
+import org.dromara.common.core.constant.CloudMqEventConstants;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.message.kafka.domain.KafkaHeader;
+import org.dromara.common.message.kafka.domain.KafkaMessage;
 import org.springframework.stereotype.Service;
 
 import java.text.MessageFormat;
@@ -41,6 +48,10 @@ public class UserAccountBusiness {
     private final IPtBagService bagService;
     private final IPtCardService cardService;
     private final CardBusiness cardBusiness;
+    private final KafkaNormalProducer kafkaNormalProducer;
+
+    @DubboReference
+    private final RemotePtParameterService remotePtParameterService;
 
     /**
      * 开通一卡通账户
@@ -60,8 +71,10 @@ public class UserAccountBusiness {
             //--------- 设置 流水号和主键id set 到 cardBo
             bo.setCardId(cardBo.getCardId());
             bo.setCardNo(cardBo.getCardNo());
+            sendCloudConsume(ptUserAccountService.queryById(bo.getUserId()));
             return rs;
         }
+
         return R.fail(MessageFormat.format("[一卡通开户]-[失败]-[写账户表失败,开户Id:{0}]", bo.getUserId()));
     }
 
@@ -91,4 +104,21 @@ public class UserAccountBusiness {
         accountInfoVo.setAccountBase(ptUserAccountVo);
         return R.ok(accountInfoVo);
     }
+
+    private void sendCloudConsume(PtUserAccountVo vo) {
+        String pushData = remotePtParameterService.getPtParameterByKey("PUSH_MQ_DATA");
+        if (ObjectUtil.isNotEmpty(pushData) && ObjectUtil.equals(pushData, "1")) {
+            KafkaMessage<PtUserAccountVo> message = new KafkaMessage<>();
+            KafkaHeader header = message.getHeader();
+            header.setTimestamp(System.currentTimeMillis());
+            header.setEventId(CloudMqEventConstants.ACCOUNT);
+            header.setEventType(CloudMqEventConstants.ACCOUNT);
+            header.setSender(CloudMqEventConstants.SENDER);
+
+            message.setHeader(header);
+            message.setBody(vo);
+
+            kafkaNormalProducer.sendKafkaMessage(CloudMqEventConstants.ACCOUNT, message);
+        }
+    }
 }

+ 48 - 5
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtCardServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -11,6 +12,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.esotericsoftware.minlog.Log;
 import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.backstage.api.RemotePtParameterService;
 import org.dromara.backstage.basics.domain.vo.PtCardtypeVo;
 import org.dromara.backstage.basics.service.IPtCardtypeService;
 import org.dromara.backstage.basics.service.IPtParameterService;
@@ -19,14 +22,19 @@ import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
 import org.dromara.backstage.cardCenter.mapper.PtCardMapper;
 import org.dromara.backstage.cardCenter.service.IPtCardService;
 import org.dromara.backstage.domain.vo.card.PtCardVo;
+import org.dromara.backstage.mq.KafkaNormalProducer;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
 import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.core.constant.CloudMqEventConstants;
 import org.dromara.common.core.constant.Constants;
 import org.dromara.common.core.constant.DefaultConstants;
 import org.dromara.common.core.enums.CardOpenEnum;
 import org.dromara.common.core.enums.CardStatusEnum;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.message.kafka.domain.KafkaHeader;
+import org.dromara.common.message.kafka.domain.KafkaMessage;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.redis.utils.RedisUtils;
@@ -47,10 +55,13 @@ import java.util.*;
 @RequiredArgsConstructor
 @Service
 public class PtCardServiceImpl implements IPtCardService {
-
     private final PtCardMapper baseMapper;
     private final IPtParameterService parameterService;
     private final IPtCardtypeService cardTypeService;
+    private final KafkaNormalProducer kafkaNormalProducer;
+
+    @DubboReference
+    private final RemotePtParameterService remotePtParameterService;
 
     /**
      * 查询账户卡片
@@ -128,6 +139,10 @@ public class PtCardServiceImpl implements IPtCardService {
      */
     @Override
     public Boolean insertByBo(PtCardBo bo) {
+        if(ObjUtil.isEmpty(bo.getLastPay())){
+            bo.setLastPay(DateUtil.offsetDay(DateUtil.date(), -1));
+        }
+        bo.setLastMeal(0L);
         PtCard add = MapstructUtils.convert(bo, PtCard.class);
         validEntityBeforeSave(add);
         boolean flag = baseMapper.insert(add) > 0;
@@ -136,6 +151,7 @@ public class PtCardServiceImpl implements IPtCardService {
                 bo.setCardId(add.getCardId());
             }
         }
+        sendCloudConsume(baseMapper.selectVoById(bo.getCardId()));
         return flag;
     }
 
@@ -149,14 +165,16 @@ public class PtCardServiceImpl implements IPtCardService {
     public Boolean updateByBo(PtCardBo bo) {
         PtCard update = MapstructUtils.convert(bo, PtCard.class);
         validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
+        int count =  baseMapper.updateById(update) ;
+        sendCloudConsume(baseMapper.selectVoById(bo.getCardId()));
+        return count>0;
     }
 
     /**
      * 保存前的数据校验
      */
     private void validEntityBeforeSave(PtCard entity) {
-        //TODO 做一些数据校验,如唯一约束
+
     }
 
     /**
@@ -171,6 +189,9 @@ public class PtCardServiceImpl implements IPtCardService {
         if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
+        //ids.forEach(id->{
+        //    sendCloudConsume(baseMapper.selectVoById(id));
+        //});
         return baseMapper.deleteByIds(ids) > 0;
     }
 
@@ -191,6 +212,7 @@ public class PtCardServiceImpl implements IPtCardService {
                 .set(PtCard::getChangeTime, DateUtil.date())
                 .eq(PtCard::getStatus, '1')
                 .eq(PtCard::getUserId, userId));
+            //sendCloudConsume(baseMapper.selectVoById(userId));
         }
         return userIds.length;
     }
@@ -206,11 +228,13 @@ public class PtCardServiceImpl implements IPtCardService {
      */
     @Override
     public int resetCardType(Long[] userIds, String cardType) {
-        Arrays.stream(userIds).forEach(userId -> baseMapper.update(null, new LambdaUpdateWrapper<PtCard>()
+        Arrays.stream(userIds).forEach(userId -> {baseMapper.update(null, new LambdaUpdateWrapper<PtCard>()
             .set(PtCard::getCardType, cardType)
             .set(PtCard::getChangeTime, DateUtil.date())
             .eq(PtCard::getStatus, '1')
-            .eq(PtCard::getUserId, userId)));
+            .eq(PtCard::getUserId, userId));
+        //sendCloudConsume(baseMapper.selectVoById(userId));
+        });
         return userIds.length;
     }
 
@@ -247,6 +271,7 @@ public class PtCardServiceImpl implements IPtCardService {
      */
     @Override
     public boolean lockCard(Long cardId) {
+        //sendCloudConsume(baseMapper.selectVoById(cardId));
         return baseMapper.update(null, new LambdaUpdateWrapper<PtCard>()
             .set(PtCard::getStatus, '2')
             .set(PtCard::getChangeTime, DateUtil.date())
@@ -262,6 +287,7 @@ public class PtCardServiceImpl implements IPtCardService {
      */
     @Override
     public boolean unlockCard(Long cardId) {
+        //sendCloudConsume(baseMapper.selectVoById(cardId));
         return baseMapper.update(null, new LambdaUpdateWrapper<PtCard>()
             .set(PtCard::getStatus, '1')
             .set(PtCard::getChangeTime, DateUtil.date())
@@ -511,4 +537,21 @@ public class PtCardServiceImpl implements IPtCardService {
 
         return true;
     }
+
+    private void sendCloudConsume(PtCardVo vo) {
+        String pushData = remotePtParameterService.getPtParameterByKey("PUSH_MQ_DATA");
+        if (ObjectUtil.isNotEmpty(pushData) && ObjectUtil.equals(pushData, "1")) {
+            KafkaMessage<PtCardVo> message = new KafkaMessage<>();
+            KafkaHeader header = message.getHeader();
+            header.setTimestamp(System.currentTimeMillis());
+            header.setEventId(CloudMqEventConstants.CARD);
+            header.setEventType(CloudMqEventConstants.CARD);
+            header.setSender(CloudMqEventConstants.SENDER);
+
+            message.setHeader(header);
+            message.setBody(vo);
+
+            kafkaNormalProducer.sendKafkaMessage(CloudMqEventConstants.CARD, message);
+        }
+    }
 }

+ 19 - 35
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/mq/KafkaNormalProducer.java

@@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.kafka.clients.producer.ProducerRecord;
 import org.dromara.backstage.basics.domain.bo.SendMessageRecordBo;
 import org.dromara.backstage.basics.service.ISendMessageRecordService;
+import org.dromara.common.core.enums.CloudMqEventEnum;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.message.kafka.constant.KafkaTopicConstants;
 import org.dromara.common.message.kafka.domain.KafkaHeader;
@@ -67,45 +68,28 @@ public class KafkaNormalProducer {
         }
     }
 
-
     public void sendKafkaMessage(String topic, Long createBy, KafkaMessage<?> data) {
         this.sendKafkaMessage(topic, createBy, data, true);
-        //try {
-        //String jsonMessage = JSON.toJSONString(data);
-            /*KafkaMessage kafkaMessage = JsonUtils.parseObject(jsonMessage, KafkaMessage.class);
-            Object body = kafkaMessage.getBody();
-            if(body instanceof String){
-                System.err.println("body is String");
-            }else if(body instanceof Long[] r){
-                System.err.println("body is Long[]");
-                for (Long aLong : r) {
-                    System.out.println(aLong);
-                }
-            }else if(body instanceof String[]){
-                System.err.println("body is String[]");
-            }else if(body instanceof List<?> r){
-                System.err.println("body is other");
+    }
 
-            }*/
-        //    ProducerRecord<String, String> record = new ProducerRecord<>(topic, "YKT-SYNC-Message", jsonMessage);
-        //    log.info("发送同步数据到kafka消息系统, data: " + jsonMessage);
-        //    CompletableFuture<SendResult<String, String>> send = kafkaTemplate.send(record);
-        //    send.whenComplete((result, ex) -> {
-        //        if (ex != null) {
-        //            log.error("同步数据发送到kafka消息系统异常,data: " + jsonMessage, ex);
-        //
-        //            // 异常信息入库
-        //            insertRecord("F", createBy, data);
-        //        } else {
-        //            log.info("同步数据发送到kafka消息系统成功,data: " + jsonMessage);
-        //            insertRecord("S", createBy, data);
-        //        }
-        //    });
-        //} catch (Exception e) {
-        //    log.error("同步数据发送到kafka消息系统异常,data: {}", data, e);
-        //    insertRecord("F", createBy, data);
-        //}
+    public void sendKafkaMessage(String topic, KafkaMessage<?> data) {
+        String jsonMessage = JSON.toJSONString(data);
+        String eventId = data.getHeader().getEventId();
+        try {
+            ProducerRecord<String, String> record;
+            record = new ProducerRecord<>(topic, jsonMessage);
 
+            CompletableFuture<SendResult<String, String>> send = kafkaTemplate.send(record);
+            send.whenComplete((result, ex) -> {
+                if (ex != null) {
+                    log.error("[后台管理]-[{}]-[发送到kafka消息系统异常]-[{}]", CloudMqEventEnum.getMessage(eventId), data, ex);
+                } else {
+                    log.info("[后台管理]-[{}]-[发送到kafka消息系统成功]-[{}]", CloudMqEventEnum.getMessage(eventId), data);
+                }
+            });
+        } catch (Exception e) {
+            log.error("[后台管理]-[{}]-[发送到kafka消息系统异常]-[{}]", CloudMqEventEnum.getMessage(eventId), data, e);
+        }
     }
 
     //记录入库

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

@@ -337,7 +337,7 @@ public class RemoteUserServiceImpl implements RemoteUserService {
         String message = "增加人员入库失败";
         try {
             SysUserBo bo = BeanUtil.copyProperties(remoteUserBo, SysUserBo.class);
-            bo.setCreateBy(remoteUserBo.getCreatedBy());
+            bo.setCreateBy(remoteUserBo.getCreateBy());
             List<UserDeptBo> userDeptBoList = new ArrayList<>();
             if(ObjectUtil.isNotEmpty(remoteUserBo.getUserDeptList())){
                 remoteUserBo.getUserDeptList().forEach(remoteUserDeptBo -> {
@@ -363,7 +363,7 @@ public class RemoteUserServiceImpl implements RemoteUserService {
         String message = "[修改人员入库失败]";
         //try {
         SysUserBo bo = BeanUtil.copyProperties(remoteUserBo, SysUserBo.class);
-        bo.setUpdateBy(remoteUserBo.getUpdatedBy());
+        bo.setUpdateBy(remoteUserBo.getUpdateBy());
         setUserDept(bo, remoteUserBo);
         return userService.updateUser(bo) > 0 ? R.ok() : R.fail(message);
         //} catch (Exception e) {

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

@@ -374,7 +374,7 @@ public class SysUserServiceImpl implements ISysUserService {
                     user.setCardId(data.getCardId());
                     user.setCardNo(data.getCardNo());
                     user.setUserNo(data.getUserNo());
-                    return rows;
+                    //return rows;
                 } else {
                     throw new UserException(result.getMsg());
                 }

+ 2 - 2
ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/user/SyncRemoteUserService.java

@@ -134,10 +134,10 @@ public class SyncRemoteUserService {
             remoteUserBo.setUserName(userName);
             remoteUserBo.setUserNumb(userName);
             remoteUserBo.setRoleIds(getUserRole(person));
-            remoteUserBo.setCreatedBy(person.getOperatorId());
+            remoteUserBo.setCreateBy(person.getOperatorId());
         } else {
             remoteUserBo = BeanUtil.copyProperties(remoteUserVo, RemoteUserBo.class);
-            remoteUserBo.setUpdatedBy(person.getOperatorId());
+            remoteUserBo.setUpdateBy(person.getOperatorId());
         }
 
         remoteUserBo.setRealName(person.getRealName());

+ 1 - 0
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/SyncHrService.java

@@ -101,6 +101,7 @@ public class SyncHrService {
          person.setRemark("");
          person.setUserState("on");
          person.setTenantId(defaultConfig.getTenantId());
+         person.setOperatorId(DefaultConstants.FULL_SYNC_ADMIN);
          resourcePersonList.add(person);
          syncUserStrategyContent.syncUser(resourcePersonList, SyncResourceConstants.TEACHER);
          return true;