1.添加批量修改会员分组功能
Showing
11 changed files
with
109 additions
and
31 deletions
... | @@ -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 | } |
596 | if (Objects.nonNull(activityCode)) { | ||
594 | wechatSubscribeRecord.setEntityCode(activityCode.toString()); | 597 | wechatSubscribeRecord.setEntityCode(activityCode.toString()); |
595 | wechatSubscribeRecord.setSourceType(2); | 598 | } |
596 | wechatSubscribeRecord.setEntityType(2); | 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> | ... | ... |
-
Please register or sign in to post a comment