Browse Source

增加用户刷新机制

gaohp 1 year ago
parent
commit
078006bacb
12 changed files with 213 additions and 4 deletions
  1. 1 0
      feifan-module-sale/feifan-module-sale-api/src/main/java/cn/newfeifan/mall/module/enums/ErrorCodeConstants.java
  2. 29 0
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/controller/admin/shop/ShopController.java
  3. 9 0
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/dal/redis/ShopMessage.java
  4. 2 1
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/merchant/MerchantService.java
  5. 39 1
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/merchant/MerchantServiceImpl.java
  6. 13 0
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/shop/ShopService.java
  7. 43 1
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/shop/ShopServiceImpl.java
  8. 10 0
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java
  9. 17 0
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/mq/consumer/login/LoginSendMessage.java
  10. 17 0
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/mq/message/login/LoginSendMessage.java
  11. 28 0
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/mq/producer/login/LoginProducer.java
  12. 5 1
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/service/oauth2/OAuth2TokenServiceImpl.java

+ 1 - 0
feifan-module-sale/feifan-module-sale-api/src/main/java/cn/newfeifan/mall/module/enums/ErrorCodeConstants.java

@@ -12,5 +12,6 @@ public interface ErrorCodeConstants {
     ErrorCode SHOP_STATUS_NOT_EXISTS = new ErrorCode(1_002_029_000 , "店铺状态不存在");
     ErrorCode MERCHANT_NOT_EXISTS = new ErrorCode(1_002_029_001, "商户不存在");
     ErrorCode SHOP_NOT_EXISTS = new ErrorCode(1_002_029_002, "店铺不存在不存在");
+    ErrorCode NO_BANDING = new ErrorCode(1_002_029_002, "未绑定");
 
 }

+ 29 - 0
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/controller/admin/shop/ShopController.java

@@ -8,6 +8,7 @@ import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopPageReqVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopRespVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopSaveReqVO;
 import cn.newfeifan.mall.sale.dal.dataobject.merchant.MerchantDO;
+import cn.newfeifan.mall.sale.dal.redis.ShopMessage;
 import cn.newfeifan.mall.sale.service.merchant.MerchantService;
 import cn.newfeifan.mall.sale.service.shop.ShopService;
 import org.springframework.web.bind.annotation.*;
@@ -39,6 +40,7 @@ import cn.newfeifan.mall.framework.excel.core.util.ExcelUtils;
 import cn.newfeifan.mall.framework.operatelog.core.annotations.OperateLog;
 
 import static cn.newfeifan.mall.framework.operatelog.core.enums.OperateTypeEnum.*;
+import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 import static cn.newfeifan.mall.module.enums.ErrorCodeConstants.MERCHANT_NOT_EXISTS;
 
 import cn.newfeifan.mall.sale.dal.dataobject.shop.ShopDO;
@@ -149,4 +151,31 @@ public class ShopController {
                 BeanUtils.toBean(list, ShopRespVO.class));
     }
 
+    @PutMapping("/change_shop")
+    @Operation(summary = "切换店铺")
+    @PreAuthorize("@ss.hasPermission('sale:merchant:query')")
+    public CommonResult<Boolean> changeShop(@RequestParam("shopId") Long shopId) {
+        shopService.changeShop(getLoginUserId(),shopId);
+        return success(true);
+    }
+
+
+    @PutMapping("/get_current_shop")
+    @Operation(summary = "获取当前店铺ID")
+    @PreAuthorize("@ss.hasPermission('sale:merchant:query')")
+    public CommonResult<ShopMessage> getCurrentShop() {
+        return success(shopService.getCurrentShop(getLoginUserId()));
+    }
+
+    @GetMapping("/getAllShopByUserId")
+    @Operation(summary = "获取当前用户下的所有店铺")
+    @Parameter(name = "merId", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('sale:merchant:query')")
+    public CommonResult<List<ShopRespVO>> getAllShopByUserId() {
+        // 获取所有店铺
+        List<ShopRespVO> shops = shopService.getAllShopByUserId(getLoginUserId());
+        return success(shops);
+    }
+
+
 }

+ 9 - 0
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/dal/redis/ShopMessage.java

@@ -0,0 +1,9 @@
+package cn.newfeifan.mall.sale.dal.redis;
+
+import lombok.Data;
+
+@Data
+public class ShopMessage {
+    private Long shopId;
+    private Long merId;
+}

+ 2 - 1
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/merchant/MerchantService.java

@@ -1,6 +1,7 @@
 package cn.newfeifan.mall.sale.service.merchant;
 
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.module.system.mq.message.login.LoginSendMessage;
 import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantPageReqVO;
 import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantRespVO;
 import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantSaveReqVO;
@@ -57,5 +58,5 @@ public interface MerchantService {
     PageResult<MerchantDO> getMerchantPage(MerchantPageReqVO pageReqVO);
 
     List<MerchantRespVO> salesVolume(Map<Long, MerchantRespVO> map);
-
+    void doSendMail(LoginSendMessage message);
 }

+ 39 - 1
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/merchant/MerchantServiceImpl.java

@@ -1,18 +1,24 @@
 package cn.newfeifan.mall.sale.service.merchant;
 
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
 import cn.newfeifan.mall.module.product.service.sku.ProductSkuService;
+import cn.newfeifan.mall.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
 import cn.newfeifan.mall.module.system.dal.dataobject.user.AdminUserDO;
 import cn.newfeifan.mall.module.system.dal.mysql.user.AdminUserMapper;
+import cn.newfeifan.mall.module.system.mq.message.login.LoginSendMessage;
 import cn.newfeifan.mall.module.system.service.user.AdminUserService;
 import cn.newfeifan.mall.module.trade.service.order.TradeOrderQueryService;
 import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantPageReqVO;
 import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantRespVO;
 import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantSaveReqVO;
+import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopRespVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopSaveReqVO;
 import cn.newfeifan.mall.sale.dal.dataobject.merchant.MerchantDO;
 import cn.newfeifan.mall.sale.dal.mysql.merchant.MerchantMapper;
+import cn.newfeifan.mall.sale.dal.redis.ShopMessage;
 import cn.newfeifan.mall.sale.service.shop.ShopService;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -27,6 +33,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -52,6 +59,8 @@ public class MerchantServiceImpl implements MerchantService {
 
     @Resource
     private ShopService shopService;
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -129,5 +138,34 @@ public class MerchantServiceImpl implements MerchantService {
         }
         return new ArrayList<>(map.values());
     }
-
+    @Override
+    public void doSendMail(LoginSendMessage message) {
+
+        // 查询用户的商户信息,并且缓存到redis中
+        OAuth2AccessTokenDO oAuth2AccessTokenDO = message.getOAuth2AccessTokenDO();
+        ShopMessage shopMessage = JsonUtils.parseObject(stringRedisTemplate.opsForValue().get("shop:" + message.getOAuth2AccessTokenDO().getUserId()), ShopMessage.class);
+        if (shopMessage != null) {
+            // 刷新时间
+            stringRedisTemplate.opsForValue().set("shop:" + oAuth2AccessTokenDO.getUserId(), JsonUtils.toJsonString(shopMessage), 3600 * 24, TimeUnit.SECONDS);
+        } else {
+            // 查询数据库
+            AdminUserDO adminUserDO = userMapper.selectById(message.getOAuth2AccessTokenDO().getUserId());
+            if (adminUserDO.getShopId() != null) {
+                ShopMessage addRedis = new ShopMessage().setShopId(adminUserDO.getShopId()).setMerId(adminUserDO.getMerchantId());
+                stringRedisTemplate.opsForValue().set("shop:" + oAuth2AccessTokenDO.getUserId(), JsonUtils.toJsonString(addRedis), 3600 * 24, TimeUnit.SECONDS);
+            } else {
+                // 获取随机店铺
+                List<ShopRespVO> merchantAllShop = shopService.getMerchantAllShop(adminUserDO.getMerchantId());
+                oAuth2AccessTokenDO.setMerchantId(adminUserDO.getMerchantId());
+                Long shopId = null;
+                if (merchantAllShop.size() > 0) {
+                    shopId = merchantAllShop.get(0).getId();
+                    oAuth2AccessTokenDO.setShopId(shopId);
+                }
+                //存储redis
+                ShopMessage addRedis = new ShopMessage().setShopId(shopId).setMerId(adminUserDO.getMerchantId());
+                stringRedisTemplate.opsForValue().set("shop:" + oAuth2AccessTokenDO.getUserId(), JsonUtils.toJsonString(addRedis), 3600 * 24, TimeUnit.SECONDS);
+            }
+        }
+    }
 }

+ 13 - 0
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/shop/ShopService.java

@@ -10,6 +10,7 @@ import cn.newfeifan.mall.sale.dal.dataobject.merchant.MerchantDO;
 import cn.newfeifan.mall.sale.dal.dataobject.shop.ShopDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopPageReqVO;
+import cn.newfeifan.mall.sale.dal.redis.ShopMessage;
 
 import java.util.List;
 
@@ -90,4 +91,16 @@ public interface ShopService {
      */
     List<UserRespVO> getAllUser(List<Long> shopIds);
 
+    /**
+     * 刷新
+     *
+     * @param trim
+     * @param loginUserId
+     * @param shopId
+     */
+    void changeShop(Long loginUserId, Long shopId);
+
+    ShopMessage getCurrentShop(Long loginUserId);
+
+    List<ShopRespVO> getAllShopByUserId(Long loginUserId);
 }

+ 43 - 1
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/shop/ShopServiceImpl.java

@@ -1,7 +1,11 @@
 package cn.newfeifan.mall.sale.service.shop;
 
+import cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil;
+import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
 import cn.newfeifan.mall.module.system.controller.admin.user.vo.user.UserRespVO;
 import cn.newfeifan.mall.module.system.dal.dataobject.user.AdminUserDO;
+import cn.newfeifan.mall.module.system.dal.mysql.user.AdminUserMapper;
+import cn.newfeifan.mall.module.system.dal.redis.oauth2.OAuth2AccessTokenRedisDAO;
 import cn.newfeifan.mall.module.system.service.user.AdminUserService;
 import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantSaveReqVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopPageReqVO;
@@ -9,6 +13,8 @@ import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopRespVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopSaveReqVO;
 import cn.newfeifan.mall.sale.dal.dataobject.merchant.MerchantDO;
 import cn.newfeifan.mall.sale.dal.mysql.shop.ShopMapper;
+import cn.newfeifan.mall.sale.dal.redis.ShopMessage;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -20,9 +26,11 @@ import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.module.enums.ErrorCodeConstants.NO_BANDING;
 import static cn.newfeifan.mall.module.enums.ErrorCodeConstants.SHOP_NOT_EXISTS;
 
 /**
@@ -36,7 +44,8 @@ public class ShopServiceImpl implements ShopService {
 
     @Resource
     private ShopMapper shopMapper;
-
+    @Resource
+    private AdminUserMapper userMapper;
     @Override
     public Long createShop(ShopSaveReqVO createReqVO) {
         // 插入
@@ -119,4 +128,37 @@ public class ShopServiceImpl implements ShopService {
         return BeanUtils.toBean(userRespVO, UserRespVO.class);
     }
 
+
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+    @Resource
+    private OAuth2AccessTokenRedisDAO oauth2AccessTokenRedisDAO;
+
+    @Override
+    public void changeShop(Long loginUserId, Long shopId) {
+
+        AdminUserDO adminUserDO = userMapper.selectById(loginUserId);
+        ShopMessage shopMessage = new ShopMessage().setShopId(shopId).setMerId(adminUserDO.getMerchantId());
+        // 存储到redis中
+        stringRedisTemplate.opsForValue().set("shop:" + loginUserId, JsonUtils.toJsonString(shopMessage), 3600 * 24, TimeUnit.SECONDS);
+        // 更新到数据库中
+        AdminUserDO updateAdminUser = new AdminUserDO().setShopId(shopId).setId(adminUserDO.getId());
+        userMapper.updateById(updateAdminUser);
+    }
+
+    @Override
+    public ShopMessage getCurrentShop(Long loginUserId) {
+        return JsonUtils.parseObject(stringRedisTemplate.opsForValue().get("shop:" + loginUserId), ShopMessage.class);
+
+    }
+
+    @Override
+    public List<ShopRespVO> getAllShopByUserId(Long loginUserId) {
+        AdminUserDO adminUserDO = userMapper.selectById(loginUserId);
+        if (adminUserDO.getMerchantId() == null){
+            throw ServiceExceptionUtil.exception(NO_BANDING);
+        }
+        return getMerchantAllShop(adminUserDO.getMerchantId());
+    }
+
 }

+ 10 - 0
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java

@@ -66,4 +66,14 @@ public class OAuth2AccessTokenDO extends TenantBaseDO {
      */
     private LocalDateTime expiresTime;
 
+    /**
+     * 当前用户商户
+     */
+    private Long shopId;
+
+    /**
+     * 当期用户店铺
+     */
+    private Long merchantId;
+
 }

+ 17 - 0
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/mq/consumer/login/LoginSendMessage.java

@@ -0,0 +1,17 @@
+package cn.newfeifan.mall.module.system.mq.consumer.login;
+
+import cn.newfeifan.mall.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class LoginSendMessage {
+
+    /**
+     * 当前登录信息
+     */
+    @NotNull(message = "当前登录信息")
+    private OAuth2AccessTokenDO oAuth2AccessTokenDO;
+
+}

+ 17 - 0
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/mq/message/login/LoginSendMessage.java

@@ -0,0 +1,17 @@
+package cn.newfeifan.mall.module.system.mq.message.login;
+
+import cn.newfeifan.mall.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class LoginSendMessage {
+
+    /**
+     * 当前登录信息
+     */
+    @NotNull(message = "当前登录信息")
+    private OAuth2AccessTokenDO oAuth2AccessTokenDO;
+
+}

+ 28 - 0
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/mq/producer/login/LoginProducer.java

@@ -0,0 +1,28 @@
+package cn.newfeifan.mall.module.system.mq.producer.login;
+
+import cn.newfeifan.mall.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
+import cn.newfeifan.mall.module.system.mq.message.login.LoginSendMessage;
+import cn.newfeifan.mall.module.system.mq.message.mail.MailSendMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@Component
+public class LoginProducer {
+    @Resource
+    private ApplicationContext applicationContext;
+
+    /**
+     * 发送 {@link MailSendMessage} 消息
+     *
+     * @param oAuth2AccessTokenDO 当前登录信息
+     */
+    public void sendLoginMessage(OAuth2AccessTokenDO oAuth2AccessTokenDO) {
+        LoginSendMessage message = new LoginSendMessage()
+                .setOAuth2AccessTokenDO(oAuth2AccessTokenDO);
+        applicationContext.publishEvent(message);
+    }
+}

+ 5 - 1
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/service/oauth2/OAuth2TokenServiceImpl.java

@@ -14,6 +14,7 @@ import cn.newfeifan.mall.module.system.dal.dataobject.oauth2.OAuth2RefreshTokenD
 import cn.newfeifan.mall.module.system.dal.mysql.oauth2.OAuth2AccessTokenMapper;
 import cn.newfeifan.mall.module.system.dal.mysql.oauth2.OAuth2RefreshTokenMapper;
 import cn.newfeifan.mall.module.system.dal.redis.oauth2.OAuth2AccessTokenRedisDAO;
+import cn.newfeifan.mall.module.system.mq.producer.login.LoginProducer;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -32,7 +33,8 @@ import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils
  */
 @Service
 public class OAuth2TokenServiceImpl implements OAuth2TokenService {
-
+    @Resource
+    private LoginProducer loginProducer;
     @Resource
     private OAuth2AccessTokenMapper oauth2AccessTokenMapper;
     @Resource
@@ -143,6 +145,8 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
         oauth2AccessTokenMapper.insert(accessTokenDO);
         // 记录到 Redis 中
         oauth2AccessTokenRedisDAO.set(accessTokenDO);
+        // 发送消息, 更新用户的商户更店铺信息
+        loginProducer.sendLoginMessage(accessTokenDO);
         return accessTokenDO;
     }