Commit b6b0161f b6b0161f43d63f59505ca8cdf4b2216dbd8c2154 by xianghan

1.添加批量修改会员分组功能

1 parent 6fa8615f
...@@ -11,6 +11,7 @@ import org.springframework.data.repository.query.Param; ...@@ -11,6 +11,7 @@ import org.springframework.data.repository.query.Param;
11 import java.time.LocalDateTime; 11 import java.time.LocalDateTime;
12 import java.util.List; 12 import java.util.List;
13 import java.util.Optional; 13 import java.util.Optional;
14 import java.util.Set;
14 15
15 /** 16 /**
16 * @author XiangHan 17 * @author XiangHan
...@@ -64,4 +65,8 @@ public interface MemberRepository extends JpaRepository<Member, Long>, JpaSpecif ...@@ -64,4 +65,8 @@ public interface MemberRepository extends JpaRepository<Member, Long>, JpaSpecif
64 65
65 @Query(value = "SELECT IFNULL(`exp`,0) AS exp FROM uc_member WHERE `id` = ?1 ", nativeQuery = true) 66 @Query(value = "SELECT IFNULL(`exp`,0) AS exp FROM uc_member WHERE `id` = ?1 ", nativeQuery = true)
66 Long findExpByMemberId(Long memberId); 67 Long findExpByMemberId(Long memberId);
68
69 @Modifying
70 @Query(value = "UPDATE `uc_member` SET `groups` = ?1, `update_time` = now() WHERE `code` IN ?2 ", nativeQuery = true)
71 Integer doUpdateGroupsBatch(String groups, Set<String> codes);
67 } 72 }
......
...@@ -18,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -18,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
18 import org.springframework.validation.annotation.Validated; 18 import org.springframework.validation.annotation.Validated;
19 import org.springframework.web.bind.annotation.*; 19 import org.springframework.web.bind.annotation.*;
20 20
21 import java.util.List;
21 import java.util.Objects; 22 import java.util.Objects;
22 23
23 /** 24 /**
...@@ -57,6 +58,17 @@ public class MemberController { ...@@ -57,6 +58,17 @@ public class MemberController {
57 return ResultInfo.success(); 58 return ResultInfo.success();
58 } 59 }
59 60
61
62 @RequestMapping(value = "/doUpdateGroupsBatch")
63 @AnonymousAccess
64 @ApiOperation("批量手动修改会员分组")
65 public ResultInfo doUpdateGroupsBatch(@Validated(value = {UpdateGroup.class}) @RequestBody List<Member> resources) {
66 log.info("doUpdateGroupsBatch ==>> param ==>> {}",resources);
67 Integer count = this.memberOperationService.doUpdateGroupsBatch(resources);
68 return ResultInfo.success(count);
69 }
70
71
60 @PutMapping(value = "/update") 72 @PutMapping(value = "/update")
61 @ApiOperation("修改会员信息") 73 @ApiOperation("修改会员信息")
62 @AnonymousAccess 74 @AnonymousAccess
......
...@@ -135,4 +135,10 @@ public interface MemberService { ...@@ -135,4 +135,10 @@ public interface MemberService {
135 */ 135 */
136 Long findExpByMemberId(Long memberId); 136 Long findExpByMemberId(Long memberId);
137 137
138 /**
139 *
140 * @param resources
141 * @return
142 */
143 Integer doUpdateGroupsBatch(List<Member> resources);
138 } 144 }
......
...@@ -28,7 +28,9 @@ import org.springframework.stereotype.Service; ...@@ -28,7 +28,9 @@ import org.springframework.stereotype.Service;
28 import org.springframework.transaction.annotation.Propagation; 28 import org.springframework.transaction.annotation.Propagation;
29 import org.springframework.transaction.annotation.Transactional; 29 import org.springframework.transaction.annotation.Transactional;
30 30
31 import javax.validation.constraints.NotNull;
31 import java.util.*; 32 import java.util.*;
33 import java.util.stream.Collectors;
32 34
33 /** 35 /**
34 * @author XiangHan 36 * @author XiangHan
...@@ -214,6 +216,13 @@ public class MemberServiceImpl implements MemberService { ...@@ -214,6 +216,13 @@ public class MemberServiceImpl implements MemberService {
214 return this.memberRepository.findExpByMemberId(memberId); 216 return this.memberRepository.findExpByMemberId(memberId);
215 } 217 }
216 218
219 @Override
220 @Transactional(rollbackFor = Exception.class)
221 public Integer doUpdateGroupsBatch(List<Member> resources) {
222 Set<String> codes = resources.stream().map(t -> t.getCode()).collect(Collectors.toSet());
223 return this.memberRepository.doUpdateGroupsBatch( resources.get(0).getGroups(), codes);
224 }
225
217 226
218 @Override 227 @Override
219 @Transactional(rollbackFor = Exception.class) 228 @Transactional(rollbackFor = Exception.class)
......
...@@ -28,5 +28,5 @@ public class SubscribeBean extends WeiXinUserBean { ...@@ -28,5 +28,5 @@ public class SubscribeBean extends WeiXinUserBean {
28 private String nickname; 28 private String nickname;
29 private String headimgurl; 29 private String headimgurl;
30 30
31 private String sourceInfo; 31 private JSONObject sourceInfo;
32 } 32 }
......
1 package com.topdraw.business.process.domian.weixin;
2
3 /**
4 * @author :
5 * @description:
6 * @function :
7 * @date :Created in 2022/7/4 16:36
8 * @version: :
9 * @modified By:
10 * @since : modified in 2022/7/4 16:36
11 */
12 public interface SubscribeSourceTypeConstant {
13
14 int type1 = 1;
15 int type2 = 2;
16
17 }
...@@ -345,33 +345,34 @@ public class UserOperationController { ...@@ -345,33 +345,34 @@ public class UserOperationController {
345 } 345 }
346 346
347 // 大屏账户信息 347 // 大屏账户信息
348 JSONObject iptvUserInfo = null; 348 JSONObject redisInfo = null;
349 // 缓存的大屏信息,使用unionid即可 349 // 缓存的大屏信息,使用unionid即可
350 String content = (String) this.redisUtils.get(RedisKeyUtil.genSeSuSubscribeKey(unionId)); 350 String content = (String) this.redisUtils.get(RedisKeyUtil.genSeSuSubscribeKey(unionId));
351 log.info("获取redis中存储的数据,[subscribe#{}]", content);
351 if (StringUtils.isNotBlank(content)) { 352 if (StringUtils.isNotBlank(content)) {
352 // 大屏信息 353 // 大屏信息
353 iptvUserInfo = JSONObject.parseObject(content); 354 redisInfo = JSONObject.parseObject(content);
354 } 355 }
355 356
356 // 用户自己搜索关注就没有大屏信息,否则表示扫码关注 357 // 用户自己搜索关注就没有大屏信息,否则表示扫码关注
357 if (Objects.nonNull(iptvUserInfo)) { 358 if (Objects.nonNull(redisInfo)) {
358 359
359 subscribeBean.setIptvUserInfo(iptvUserInfo); 360 subscribeBean.setIptvUserInfo(redisInfo);
360 Object sourceInfo1 = iptvUserInfo.get("sourceInfo"); 361 // 关注来源信息
361 if (Objects.nonNull(sourceInfo1)) { 362 JSONObject sourceInfo = JSONObject.parseObject(redisInfo.get("sourceInfo").toString(), JSONObject.class);
362 String sourceInfo = sourceInfo1.toString(); 363 log.info("关注来源信息,[subscribe#{}]", sourceInfo);
363 if (StringUtils.isNotBlank(sourceInfo)) 364 if (Objects.nonNull(sourceInfo)) {
364 subscribeBean.setSourceInfo(sourceInfo); 365 subscribeBean.setSourceInfo(sourceInfo);
365 } 366 }
366 367
367 String nickname = iptvUserInfo.get("nickname").toString(); 368 String nickname = redisInfo.get("nickname").toString();
368 if (StringUtils.isNotBlank(nickname)) { 369 if (StringUtils.isNotBlank(nickname)) {
369 String nicknameDecode = URLDecoder.decode(nickname, "UTF-8"); 370 String nicknameDecode = URLDecoder.decode(nickname, "UTF-8");
370 String nicknameEncode = Base64Util.encode(nicknameDecode); 371 String nicknameEncode = Base64Util.encode(nicknameDecode);
371 subscribeBean.setNickname(nicknameEncode); 372 subscribeBean.setNickname(nicknameEncode);
372 } 373 }
373 374
374 String headimgurl = iptvUserInfo.get("headimgurl").toString(); 375 String headimgurl = redisInfo.get("headimgurl").toString();
375 log.info("parseSubscribe ==>> headimgurl ==>> {}", headimgurl); 376 log.info("parseSubscribe ==>> headimgurl ==>> {}", headimgurl);
376 if (StringUtils.isNotBlank(headimgurl)) { 377 if (StringUtils.isNotBlank(headimgurl)) {
377 String headimgurlDecode = URLDecoder.decode(headimgurl, "UTF-8"); 378 String headimgurlDecode = URLDecoder.decode(headimgurl, "UTF-8");
......
...@@ -554,7 +554,7 @@ public class UserOperationServiceImpl implements UserOperationService { ...@@ -554,7 +554,7 @@ public class UserOperationServiceImpl implements UserOperationService {
554 } 554 }
555 555
556 // 保存关注记录 556 // 保存关注记录
557 String sourceInfo = resources.getSourceInfo(); 557 JSONObject sourceInfo = resources.getSourceInfo();
558 this.saveWechatSubscribeRecord(memberDTO, sourceInfo, 1); 558 this.saveWechatSubscribeRecord(memberDTO, sourceInfo, 1);
559 559
560 return true; 560 return true;
...@@ -567,33 +567,38 @@ public class UserOperationServiceImpl implements UserOperationService { ...@@ -567,33 +567,38 @@ public class UserOperationServiceImpl implements UserOperationService {
567 * @param subscribe 关注状态 567 * @param subscribe 关注状态
568 * @param sourceInfo 来源描述 568 * @param sourceInfo 来源描述
569 */ 569 */
570 private void saveWechatSubscribeRecord(MemberDTO memberDTO, String sourceInfo, int subscribe) { 570 private void saveWechatSubscribeRecord(MemberDTO memberDTO, JSONObject sourceInfo, int subscribe) {
571 571
572 WechatSubscribeRecord wechatSubscribeRecord = new WechatSubscribeRecord(); 572 WechatSubscribeRecord wechatSubscribeRecord = new WechatSubscribeRecord();
573 wechatSubscribeRecord.setCode(IdWorker.generatorString()); 573 wechatSubscribeRecord.setCode(IdWorker.generatorString());
574 wechatSubscribeRecord.setMemberId(memberDTO.getId()); 574 wechatSubscribeRecord.setMemberId(memberDTO.getId());
575 wechatSubscribeRecord.setOperationFlag(subscribe); 575 wechatSubscribeRecord.setOperationFlag(subscribe);
576 if (StringUtils.isBlank(sourceInfo)) { 576 if (Objects.isNull(sourceInfo)) {
577
577 wechatSubscribeRecord.setEntityType(3); 578 wechatSubscribeRecord.setEntityType(3);
579
578 } else { 580 } else {
579 JSONObject jsonObject = JSONObject.parseObject(sourceInfo, JSONObject.class); 581
580 Object activityId = jsonObject.get("activityId"); 582 Object activityId = sourceInfo.get("sourceId");
581 Object activityCode = jsonObject.get("activityCode"); 583 Object activityCode = sourceInfo.get("sourceCode");
582 Object entityType = jsonObject.get("entityType"); 584 Object entityType = sourceInfo.get("sourceType");
583 if (Objects.nonNull(entityType)) { 585 if (Objects.nonNull(entityType)) {
584 String s = entityType.toString(); 586 Integer s = Integer.parseInt(entityType.toString());
585 switch (s) { 587 switch (s) {
586 case "1": 588 case SubscribeSourceTypeConstant.type1:
587 wechatSubscribeRecord.setSourceType(1); 589 wechatSubscribeRecord.setSourceType(SubscribeSourceTypeConstant.type1);
588 wechatSubscribeRecord.setEntityType(1); 590 wechatSubscribeRecord.setEntityType(SubscribeSourceTypeConstant.type1);
589 break; 591 break;
590 case "2": 592 case SubscribeSourceTypeConstant.type2:
591 if (Objects.nonNull(activityId)) 593 if (Objects.nonNull(activityId)) {
592 wechatSubscribeRecord.setEntityId(Long.valueOf(activityId.toString())); 594 wechatSubscribeRecord.setEntityId(Long.valueOf(activityId.toString()));
593 if (Objects.nonNull(activityCode)) 595 }
594 wechatSubscribeRecord.setEntityCode(activityCode.toString()); 596 if (Objects.nonNull(activityCode)) {
595 wechatSubscribeRecord.setSourceType(2); 597 wechatSubscribeRecord.setEntityCode(activityCode.toString());
596 wechatSubscribeRecord.setEntityType(2); 598 }
599
600 wechatSubscribeRecord.setSourceType(SubscribeSourceTypeConstant.type2);
601 wechatSubscribeRecord.setEntityType(SubscribeSourceTypeConstant.type2);
597 break; 602 break;
598 default: 603 default:
599 wechatSubscribeRecord.setSourceType(3); 604 wechatSubscribeRecord.setSourceType(3);
...@@ -602,10 +607,12 @@ public class UserOperationServiceImpl implements UserOperationService { ...@@ -602,10 +607,12 @@ public class UserOperationServiceImpl implements UserOperationService {
602 } 607 }
603 } 608 }
604 609
605 wechatSubscribeRecord.setSourceInfo(sourceInfo); 610 wechatSubscribeRecord.setSourceInfo(JSONObject.toJSONString(sourceInfo));
611
606 } 612 }
607 613
608 this.wechatSubscribeRecordService.create(wechatSubscribeRecord); 614 this.wechatSubscribeRecordService.create(wechatSubscribeRecord);
615
609 } 616 }
610 617
611 618
...@@ -655,7 +662,7 @@ public class UserOperationServiceImpl implements UserOperationService { ...@@ -655,7 +662,7 @@ public class UserOperationServiceImpl implements UserOperationService {
655 } 662 }
656 663
657 // 关注记录 664 // 关注记录
658 this.saveWechatSubscribeRecord(memberDTO, "",2); 665 this.saveWechatSubscribeRecord(memberDTO, null,2);
659 666
660 // 同步至iptv 667 // 同步至iptv
661 ((UserOperationServiceImpl)AopContext.currentProxy()).asyncUnsubscribe(new MemberAndWeixinUserDTO(memberDTO, userWeixinDTO)); 668 ((UserOperationServiceImpl)AopContext.currentProxy()).asyncUnsubscribe(new MemberAndWeixinUserDTO(memberDTO, userWeixinDTO));
......
...@@ -25,7 +25,9 @@ import org.springframework.cache.annotation.CachePut; ...@@ -25,7 +25,9 @@ import org.springframework.cache.annotation.CachePut;
25 import org.springframework.stereotype.Service; 25 import org.springframework.stereotype.Service;
26 import org.springframework.util.Assert; 26 import org.springframework.util.Assert;
27 27
28 import javax.validation.constraints.NotNull;
28 import java.sql.Timestamp; 29 import java.sql.Timestamp;
30 import java.util.List;
29 import java.util.Objects; 31 import java.util.Objects;
30 32
31 @Service 33 @Service
...@@ -45,9 +47,10 @@ public class MemberOperationServiceImpl implements MemberOperationService { ...@@ -45,9 +47,10 @@ public class MemberOperationServiceImpl implements MemberOperationService {
45 47
46 @AsyncMqSend 48 @AsyncMqSend
47 public void asyncUpdateMemberVipAndVipExpireTime(MemberDTO memberDTO) {} 49 public void asyncUpdateMemberVipAndVipExpireTime(MemberDTO memberDTO) {}
48
49 @AsyncMqSend 50 @AsyncMqSend
50 public void asyncCreateMemberVipHistory(MemberVipHistoryDTO memberVipHistoryDTO) {} 51 public void asyncCreateMemberVipHistory(MemberVipHistoryDTO memberVipHistoryDTO) {}
52 @AsyncMqSend
53 public void asyncDoUpdateGroupsBatch(List<Member> resources) {}
51 54
52 55
53 @AsyncMqSend 56 @AsyncMqSend
...@@ -138,6 +141,18 @@ public class MemberOperationServiceImpl implements MemberOperationService { ...@@ -138,6 +141,18 @@ public class MemberOperationServiceImpl implements MemberOperationService {
138 return memberDTO_; 141 return memberDTO_;
139 } 142 }
140 143
144 @Override
145 public Integer doUpdateGroupsBatch(List<Member> resources) {
146 Integer count = this.memberService.doUpdateGroupsBatch(resources);
147 if (count > 0) {
148 ((MemberOperationServiceImpl) AopContext.currentProxy()).asyncDoUpdateGroupsBatch(resources);
149 }
150
151 return count;
152 }
153
154
155
141 156
142 @Override 157 @Override
143 public MemberProfileDTO getMemberProfileAndCheckVip(Long memberId, String appId) { 158 public MemberProfileDTO getMemberProfileAndCheckVip(Long memberId, String appId) {
......
...@@ -7,6 +7,8 @@ import com.topdraw.business.module.member.viphistory.domain.MemberVipHistory; ...@@ -7,6 +7,8 @@ import com.topdraw.business.module.member.viphistory.domain.MemberVipHistory;
7 import com.topdraw.business.process.domian.member.MemberOperationBean; 7 import com.topdraw.business.process.domian.member.MemberOperationBean;
8 import com.topdraw.business.process.domian.weixin.BuyVipBean; 8 import com.topdraw.business.process.domian.weixin.BuyVipBean;
9 9
10 import java.util.List;
11
10 public interface MemberOperationService { 12 public interface MemberOperationService {
11 13
12 /** 14 /**
...@@ -72,4 +74,8 @@ public interface MemberOperationService { ...@@ -72,4 +74,8 @@ public interface MemberOperationService {
72 * @param resources 74 * @param resources
73 */ 75 */
74 MemberDTO doUpdateVipByMemberCode(MemberOperationBean resources); 76 MemberDTO doUpdateVipByMemberCode(MemberOperationBean resources);
77
78
79 Integer doUpdateGroupsBatch(List<Member> resources);
80
75 } 81 }
......
...@@ -64,7 +64,7 @@ ...@@ -64,7 +64,7 @@
64 64
65 65
66 <!--监控sql日志输出 --> 66 <!--监控sql日志输出 -->
67 <logger name="jdbc.sqlonly" level="OFF" additivity="false"> 67 <logger name="jdbc.sqlonly" level="INFO" additivity="false">
68 <appender-ref ref="console" /> 68 <appender-ref ref="console" />
69 <appender-ref ref="info" /> 69 <appender-ref ref="info" />
70 </logger> 70 </logger>
......