Browse Source

Merge branch 'master' of http://192.168.20.122:3000/root/MemberCenter_DW.git

Lgx 5 years ago
parent
commit
db45d77b99

+ 32 - 14
member-services/src/main/java/com/liangjian/dataplatform/member/service/impl/WeixinUserInfoQueryService.java

@@ -2,6 +2,7 @@ package com.liangjian.dataplatform.member.service.impl;
 
 import com.liangjian.dataplatform.member.dao.elasticsearch.UserPointLogRepository;
 import com.liangjian.dataplatform.member.dao.secondary.WeixinUserInfoRepository;
+import com.liangjian.dataplatform.member.entity.genernator.SnowflakeIdWorker;
 import com.liangjian.dataplatform.member.entity.po.elasticsearch.UserPointLog;
 import com.liangjian.dataplatform.member.entity.po.secondary.WeixinUserInfo;
 import com.liangjian.dataplatform.member.entity.pojo.BirdGirdFilter;
@@ -63,30 +64,47 @@ public class WeixinUserInfoQueryService implements IWeixinUserInfoQueryService,
 
     @Override
     @Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    public synchronized boolean update(UserPointLog log) {
+    public boolean update(UserPointLog log) {
         log.setId(null);
         log.setCrtDate(new Date());
         log.setLastUpdate(new Date());
+
+        boolean success = false;
         try {
-            Optional<WeixinUserInfo> opt = weixinUserInfoRepository.queryBySecretPhone(log.getSecretPhone());
-            if(!opt.isPresent()) {
-                throw new Exception("can't find user by secretPhone :" + log.getSecretPhone());
+            //使用乐观锁
+            for (int i = 0; i < 5 && !success; i++) {
+                Optional<WeixinUserInfo> opt = weixinUserInfoRepository.queryBySecretPhone(log.getSecretPhone());
+                if(!opt.isPresent()) {
+                    throw new Exception("can't find user by secretPhone :" + log.getSecretPhone());
+                }
+                WeixinUserInfo userInfo = opt.get();
+                userInfo.setPointUpdateDate(new Date());
+                Long version = userInfo.getVersion();
+                log.setOrigin(userInfo.getPoint());
+                Integer point = null;
+                if(log.isIncrease()) {
+                    point = userInfo.getPoint() + log.getValue();
+                } else {
+                    point = userInfo.getPoint() - log.getValue();
+                }
+
+                //weixinUserInfoRepository.save(userInfo);
+                int res = weixinUserInfoRepository.updateWeiUser(point, userInfo.getId(), version);
+                success = res == 1;
             }
-            WeixinUserInfo userInfo = opt.get();
-            userInfo.setPointUpdateDate(new Date());
-            if(log.isIncrease()) {
-                userInfo.setPoint(userInfo.getPoint() + log.getValue());
+            if(success) {
+                Long workId = Long.valueOf(System.getenv("workerid"));
+                Long datacenterId = Long.valueOf(System.getenv("datacenterid"));
+                SnowflakeIdWorker worker = new SnowflakeIdWorker(workId,datacenterId);
+                log.setId(worker.nextId().toString());
+                userPointLogRepository.save(log);
+                return true;
             } else {
-                userInfo.setPoint(userInfo.getPoint() - log.getValue());
+                return false;
             }
-
-            weixinUserInfoRepository.save(userInfo);
-            userPointLogRepository.save(log);
-            return true;
         } catch (Exception ex) {
             ex.printStackTrace();
             return false;
         }
     }
-
 }

+ 15 - 8
member-weixin-service/src/main/java/com/liangjian/dataplatform/member/interceptor/WeixinInterceptor.java

@@ -54,15 +54,22 @@ public class WeixinInterceptor implements HandlerInterceptor {
             }
         }
 
-        //放进threadlocal里
-        WeixinJwtTokenGetter.UserInfo.set(tokenObject);
+        //重新获取并放进threadlocal里
+        Optional<WeixinUserInfo> userOpt = iWeixinUserInfoService.findByOpenid(tokenObject.getObject().getOpenid());
+        userOpt.ifPresent(user -> {
+            JwtTokenObject<WeixinUserInfo> newTokenObject = new JwtTokenObject<>();
+            newTokenObject.setRemark(tokenObject.getRemark());
+            newTokenObject.setSignTime(System.currentTimeMillis());
+            newTokenObject.setObject(userOpt.get());
+            WeixinJwtTokenGetter.UserInfo.set(newTokenObject);
 
-        //重新签发
-        String newToken = iWeixinUserInfoService.encodeJwt(tokenObject.getObject(), tokenObject.getRemark())
-                .orElseGet(() -> {
-                    throw new RuntimeException("发生未知错误");
-                });
-        response.addHeader("jwt", newToken);
+            //重新签发
+            String newToken = iWeixinUserInfoService.encodeJwt(user, tokenObject.getRemark())
+                    .orElseGet(() -> {
+                        throw new RuntimeException("发生未知错误");
+                    });
+            response.addHeader("jwt", newToken);
+        });
         return true;
     }