记得上下班打卡 | git大法好,push需谨慎

Commit adfbea63 authored by 胡佳晨's avatar 胡佳晨

Merge branch 'dev_maoDeng' into pre

# Conflicts:
#	liquidnet-bus-service/liquidnet-service-sweet/src/main/java/com/liquidnet/service/sweet/handler/TextMsgHandler.java
parents 1e31b6cb 7bf45d5c
......@@ -63,4 +63,11 @@ public class SweetConstant {
//2022草莓音乐节活动海报相关
public final static String REDIS_KEY_SWEET_STRAWBERRY_POSTER = "sweet:strawberry:poster";
//猫登活动-触发活动
public final static String REDIS_KEY_SWEET_WECHAT_MAODENG_OPEN_POSTER = "sweet:maoDeng:open:openId";
//猫登活动整体
public final static String REDIS_KEY_SWEET_WECHAT_MAODENG_POSTER = "sweet:maoDeng:naneAndImg:openId";
//猫登活动整体
public final static String REDIS_KEY_SWEET_WECHAT_MAODENG_POSTER_TRANSFER = "sweet:maoDeng:naneAndImg:openId:transfer";
}
package com.liquidnet.service.sweet.vo;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class SweetMaoDengVo implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
/**
* 用户id
*/
private String userId;
/**
* 用户id
*/
private String maoId;
/**
* 消息
*/
private String textMsg;
/**
* 图片url
*/
private String picUrl;
/**
* 生成图url
*/
private String imgUrl;
/**
* 创建时间
*/
private LocalDateTime createdAt;
private static final SweetMaoDengVo obj = new SweetMaoDengVo();
public static SweetMaoDengVo getNew() {
try {
return (SweetMaoDengVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new SweetMaoDengVo();
}
}
}
......@@ -5,6 +5,8 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.math.BigInteger;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
/**
......@@ -98,4 +100,28 @@ public class FilesUtils {
}
}
public static File inputStreamToFile(String url, String name){
try {
HttpURLConnection httpUrl = (HttpURLConnection) new URL(url).openConnection();
httpUrl.connect();
InputStream ins = httpUrl.getInputStream();
File file = new File(System.getProperty("java.io.tmpdir") + File.separator + name);
if (file.exists()) {
return file;
}
OutputStream os = new FileOutputStream(file);
int bytesRead;
int len = 8192;
byte[] buffer = new byte[len];
while ((bytesRead = ins.read(buffer, 0, len)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
return file;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
......@@ -86,6 +86,7 @@ public class MQConst {
SWEET_ANTIGENIC_QUESTION("sweet:stream:rk.antigenicQuestion", "group.antigenicQuestion", "防疫答题"),
SWEET_INTEGRAL_ACTIVITY_DRAW("sweet:stream:rk.integralActivityDraw", "group.integralActivityDraw", "积分抽奖"),
SWEET_POSTER("sweet:stream:rk.userLikeMusician", "group.userLikeMusician", "用户喜欢的音乐人"),
SWEET_WECHAT_MAODENG_TEXT_INSERT("sweet:stream:rk.textAndImgInsert", "group.sweetMaoDengInsert", "猫登天空"),
;
......
......@@ -32,11 +32,11 @@ liquidnet:
disable: false
redis:
kylin:
dbs: 0,16
database: 15
host: 39.107.71.112
port: 6379
password: 3Xa%8p
dbs: 0,256
database: 255
host: r-2ze7002ckw5u75fgukpd.redis.rds.aliyuncs.com
port: 6380
password: PO@B!Iud32
dragon:
dbs: 0,16
database: 15
......@@ -44,11 +44,11 @@ liquidnet:
port: 6379
password: 3Xa%8p
sweet:
dbs: 0,16
database: 15
host: 39.107.71.112
port: 6379
password: 3Xa%8p
dbs: 0,256
database: 255
host: r-2ze7002ckw5u75fgukpd.redis.rds.aliyuncs.com
port: 6380
password: PO@B!Iud32
adam:
dbs: 0,16
database: 15
......@@ -132,6 +132,9 @@ liquidnet:
modernsky:
appid: wx6bf7999941a06d15
secret: a12012b31307a539719dbe4d137ca45a
test:
appid: wxc7edcfdcb28e21f6
secret: 554c17cea13dffa05c290e7e722665ac
applet:
zhengzai:
appid: wx4732efeaa2b08086
......
......@@ -135,6 +135,9 @@ liquidnet:
modernsky:
appid: wx6bf7999941a06d15
secret: a12012b31307a539719dbe4d137ca45a
test:
appid: wxc7edcfdcb28e21f6
secret: 554c17cea13dffa05c290e7e722665ac
applet:
zhengzai:
appid: wx4732efeaa2b08086
......
package com.liquidnet.service.consumer.sweet.config;
import com.liquidnet.service.consumer.sweet.receiver.ConsumerSweetMaoDengReceiver;
import lombok.var;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.stream.Consumer;
import org.springframework.data.redis.connection.stream.MapRecord;
import org.springframework.data.redis.connection.stream.ReadOffset;
import org.springframework.data.redis.connection.stream.StreamOffset;
import org.springframework.data.redis.stream.StreamMessageListenerContainer;
import org.springframework.data.redis.stream.Subscription;
import java.time.Duration;
import static com.liquidnet.service.base.constant.MQConst.SweetQueue.SWEET_WECHAT_MAODENG_TEXT_INSERT;
@Configuration
public class ConsumerSweetMaoDengConfig {
@Autowired
ConsumerSweetMaoDengReceiver consumerSweetMaoDengReceiver;
private StreamMessageListenerContainer<String, MapRecord<String, String, String>> buildStreamMessageListenerContainer(RedisConnectionFactory factory) {
var options = StreamMessageListenerContainer
.StreamMessageListenerContainerOptions
.builder()
.pollTimeout(Duration.ofMillis(1))
.build();
return StreamMessageListenerContainer.create(factory, options);
}
/*
*猫登天空
* */
private Subscription receiveSqlMaoDeng(StreamMessageListenerContainer<String, MapRecord<String, String, String>> listenerContainer, int t) {
return listenerContainer.receiveAutoAck(
Consumer.from(SWEET_WECHAT_MAODENG_TEXT_INSERT.getGroup(), SWEET_WECHAT_MAODENG_TEXT_INSERT.name() + t),
StreamOffset.create(SWEET_WECHAT_MAODENG_TEXT_INSERT.getKey(), ReadOffset.lastConsumed()), consumerSweetMaoDengReceiver
);
}
@Bean
public Subscription subscriptionSqlMaoDeng(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveSqlMaoDeng(listenerContainer, 1);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionSqlMaoDeng2(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveSqlMaoDeng(listenerContainer, 1);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionSqlMaoDeng3(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveSqlMaoDeng(listenerContainer, 1);
listenerContainer.start();
return subscription;
}
}
package com.liquidnet.service.consumer.sweet.receiver;
import com.liquidnet.service.base.constant.MQConst;
import org.springframework.stereotype.Component;
@Component
public class ConsumerSweetMaoDengReceiver extends AbstractSqlRedisReceiver{
@Override
protected String getRedisStreamKey() {
return MQConst.SweetQueue.SWEET_WECHAT_MAODENG_TEXT_INSERT.getKey();
}
@Override
protected String getRedisStreamGroup() {
return MQConst.SweetQueue.SWEET_WECHAT_MAODENG_TEXT_INSERT.getGroup();
}
}
......@@ -136,4 +136,57 @@ public class AlOssController {
return ResponseDto.success(uploadVo);
}
@PostMapping("/uploadUrl")
@ApiOperation("阿里云上传URL")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", dataType = "String", name = "pathName", value = "归类的文件夹名称 比如banner上传就传 banner 返回的地址就会是bnanner/XXX", defaultValue = "other"),
@ApiImplicitParam(type = "form", dataType = "String", name = "picUrl", value = "picUrl", required = false),
})
public ResponseDto<UploadVo> upload(
@RequestParam(defaultValue = "0", required = false) String pathName,
@RequestParam(defaultValue = "0", required = false) String picUrl
) {
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
File fileNew = FilesUtils.inputStreamToFile(picUrl, System.currentTimeMillis() + ".png");
// file md5
String fileMD5 = FilesUtils.getFileMD5(fileNew);
List<PlatformOssFiles> platformOssFiles = platformOssFilesMapper.selectList(
Wrappers.lambdaQuery(PlatformOssFiles.class)
.eq(PlatformOssFiles::getMd5str, fileMD5)
);
UploadVo uploadVo = new UploadVo();
if (CollectionUtils.isEmpty(platformOssFiles)) {
String filename = pathName;
//这里文件名用了uuid 防止重复,可以根据自己的需要来写
String uploadName = UUID.randomUUID() + filename.substring(filename.lastIndexOf("."));// 078a77e0-cf80-481b-824c-5935247cff15.jpeg
uploadName = uploadName.replace("-", "");// 078a77e0cf80481b824c5935247cff15.jpeg
String uploadpath = pathName.replaceAll(".jepg", "") + "/" + DateUtil.format(LocalDateTime.now(), DateUtil.Formatter.yyyy_MM_dd2) + "/" + uploadName;
String buckName = "img-zhengzai-tv";
PutObjectRequest putObjectRequest = new PutObjectRequest(buckName, uploadpath, fileNew);
ossClient.putObject(putObjectRequest);
ossClient.shutdown();
// 入库
PlatformOssFiles platformOssFilesDate = new PlatformOssFiles();
String ossFilesId = IDGenerator.nextSnowId();
platformOssFilesDate.setOssFilesId(ossFilesId);
platformOssFilesDate.setOssPath(uploadpath);
platformOssFilesDate.setFileName(filename);
platformOssFilesDate.setMd5str(fileMD5);
platformOssFilesDate.setCreatedAt(DateUtil.getNowTime());
platformOssFilesMapper.insert(platformOssFilesDate);
BeanUtils.copyProperties(platformOssFilesDate, uploadVo);
} else {
PlatformOssFiles platformOssFilesOne = platformOssFiles.get(0);
BeanUtils.copyProperties(platformOssFilesOne, uploadVo);
}
FilesUtils.delteTempFile(fileNew); // 删除临时文件
return ResponseDto.success(uploadVo);
}
}
-- 猫登天空活动表
DROP TABLE IF EXISTS `sweet_wechat_maodeng`;
CREATE TABLE `sweet_wechat_maodeng` (
`mid` int UNSIGNED NOT NULL AUTO_INCREMENT,
`mao_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '微信openId',
`text_msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '猫名字',
`pic_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '图片url',
`img_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '生成的图',
`created_at` datetime NULL DEFAULT NULL,
PRIMARY KEY (`mid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 38 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC;
SET FOREIGN_KEY_CHECKS = 1;
\ No newline at end of file
......@@ -39,4 +39,8 @@ XGROUP CREATE sweet:stream:rk.integralActivityDraw group.integralActivityDraw 0
-- 2021草莓海报活动 --
XADD sweet:stream:rk.userLikeMusician * 0 0
XGROUP CREATE sweet:stream:rk.userLikeMusician group.userLikeMusician 0
\ No newline at end of file
XGROUP CREATE sweet:stream:rk.userLikeMusician group.userLikeMusician 0
-- 猫登天空 --
XADD sweet:stream:rk.textAndImgInsert * 0 0
XGROUP CREATE sweet:stream:rk.textAndImgInsert group.sweetMaoDengInsert 0
\ No newline at end of file
......@@ -25,6 +25,12 @@ public class WechatMpConfigure {
private static String appidModernsky;
private static String secretModernsky;
private static String appidTest;
private static String secretTest;
private static String appidActivity;
private static String secretActivity;
@Value("${liquidnet.wechat.service.zhengzai.appid}")
public void setAppidZhengzai(String appidZhengzai) { WechatMpConfigure.appidZhengzai = appidZhengzai; }
@Value("${liquidnet.wechat.service.zhengzai.secret}")
......@@ -49,11 +55,33 @@ public class WechatMpConfigure {
WechatMpConfigure.secretModernsky = secretModernsky;
}
@Value("${liquidnet.wechat.service.test.appid}")
public void setAppidTest(String appidTest) {
WechatMpConfigure.appidTest = appidTest;
}
@Value("${liquidnet.wechat.service.test.secret}")
public void setSecretTest(String secretTest) {
WechatMpConfigure.secretTest = secretTest;
}
@Value("${liquidnet.wechat.service.zhengzaiActivity.appid}")
public void setAppidActivity(String appidActivity) {
WechatMpConfigure.appidActivity = appidActivity;
}
@Value("${liquidnet.wechat.service.zhengzaiActivity.secret}")
public void setSecretActivity(String secretActivity) {
WechatMpConfigure.secretActivity = secretActivity;
}
private WxMpService wxMpZhengzaiService;
private WxMpService wxMpModernskyService;
private WxMpService wxMpTestService;
private WxMpService wxMpActivityService;
private WxMpMessageRouter wxMpZhengzaiMessageRouter;
private WxMpMessageRouter wxMpModernskyMessageRouter;
private WxMpMessageRouter wxMpTestMessageRouter;
private WxMpMessageRouter wxMpActivityMessageRouter;
private WxMessageInMemoryDuplicateChecker wxMessageInMemoryDuplicateChecker;
@Autowired
......@@ -67,6 +95,8 @@ public class WechatMpConfigure {
private StrawberryPosterHandler posterHandler;
@Autowired
private TextMsgHandler textMsgHandler;
@Autowired
private MaoDengImageHandler maodengImageHandler;
@PostConstruct
public void init() {
......@@ -94,9 +124,33 @@ public class WechatMpConfigure {
this.setWxMpConfigStorage(wxMpDefaultConfig);
}
};
wxMpTestService = new WxMpServiceImpl() {
{
RedisTemplateWxRedisOps redisTemplateWxRedisOps = new RedisTemplateWxRedisOps(stringRedisTemplate);
WxMpRedisConfigImpl wxMpDefaultConfig = new WxMpRedisConfigImpl(redisTemplateWxRedisOps, "sweet:accessToken:service:test");
wxMpDefaultConfig.setAppId(appidTest);
wxMpDefaultConfig.setSecret(secretTest);
this.setWxMpConfigStorage(wxMpDefaultConfig);
}
};
wxMpActivityService = new WxMpServiceImpl() {
{
RedisTemplateWxRedisOps redisTemplateWxRedisOps = new RedisTemplateWxRedisOps(stringRedisTemplate);
WxMpRedisConfigImpl wxMpDefaultConfig = new WxMpRedisConfigImpl(redisTemplateWxRedisOps, "sweet:accessToken:service:Activity");
wxMpDefaultConfig.setAppId(appidActivity);
wxMpDefaultConfig.setSecret(secretActivity);
this.setWxMpConfigStorage(wxMpDefaultConfig);
}
};
wxMpZhengzaiMessageRouter = new WxMpMessageRouter(wxMpZhengzaiService);
wxMpModernskyMessageRouter = new WxMpMessageRouter(wxMpModernskyService);
wxMpTestMessageRouter = new WxMpMessageRouter(wxMpTestService);
wxMpActivityMessageRouter = new WxMpMessageRouter(wxMpActivityService);
wxMessageInMemoryDuplicateChecker = new WxMessageInMemoryDuplicateChecker();
}
......@@ -107,6 +161,10 @@ public class WechatMpConfigure {
return wxMpZhengzaiService;
case 2:
return wxMpModernskyService;
case 3:
return wxMpTestService;
case 4:
return wxMpActivityService;
}
return null;
}
......@@ -117,6 +175,10 @@ public class WechatMpConfigure {
return wxMpZhengzaiMessageRouter;
case 2:
return wxMpModernskyMessageRouter;
case 3:
return wxMpTestMessageRouter;
case 4:
return wxMpActivityMessageRouter;
}
return null;
}
......@@ -150,6 +212,11 @@ public class WechatMpConfigure {
.handler(textMsgHandler)
.end();
// 猫登活动 图片
router.rule().async(false).msgType(WxConsts.XmlMsgType.IMAGE)
.handler(maodengImageHandler)
.end();
return router;
}
}
package com.liquidnet.service.sweet.controller;
import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.sweet.service.impl.SweetWechatMaoDengServiceImpl;
import com.liquidnet.service.sweet.utils.QueueUtils;
import com.liquidnet.service.sweet.utils.WechatUsersRedisUtils;
import com.liquidnet.service.sweet.vo.SweetMaoDengVo;
import com.liquidnet.service.sweet.vo.SweetWechatUsersVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Api(tags = "活动-猫登活动")
@RestController
@RequestMapping("/wechatMaoDeng")
@Slf4j
public class SweetWechatMaoDengController {
@Autowired
private WechatUsersRedisUtils redisUtils;
@Autowired
QueueUtils queueUtils;
@Autowired
private SweetWechatMaoDengServiceImpl sweetWechatMaoDengService;
@GetMapping("/backData")
@ApiOperation("返回文字图片")
public ResponseDto<SweetMaoDengVo> backDatas(String userId, String maoId) {
SweetWechatUsersVo wechatUsers = redisUtils.getSweetWechatUsersOfUnionId(userId, 1);
if (null == wechatUsers) {
return ResponseDto.failure("获取信息失败");
}
SweetMaoDengVo sweetMaoDeng = redisUtils.getSweetMaoDeng(wechatUsers.getOpenId());
if (sweetMaoDeng != null) {
String textMsg = sweetMaoDeng.getTextMsg();
String image = sweetMaoDeng.getPicUrl();
if (StringUtil.isEmpty(textMsg) && StringUtil.isEmpty(image)) {
return ResponseDto.failure("90081", "获取信息失败");
}
return ResponseDto.success(sweetMaoDeng);
}
return ResponseDto.failure("获取信息失败");
}
@PostMapping("/backData")
@ApiOperation("存生成的图")
@ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "String", name = "userId", value = "userId"),
@ApiImplicitParam(type = "query", dataType = "String", name = "imgUrl", value = "imgUrl"),
})
public ResponseDto addBuilderImg(@RequestParam(value = "userId", required = false) String userId,
@RequestParam(value = "imgUrl", required = false) String imgUrl,
@RequestParam(value = "maoId", required = false) String maoId) {
return sweetWechatMaoDengService.addBuilderImg(userId, imgUrl, maoId);
}
}
package com.liquidnet.service.sweet.handler;
import com.fasterxml.jackson.core.type.TypeReference;
import com.liquidnet.common.third.shumei.util.ShumeiUtil;
import com.liquidnet.commons.lang.util.*;
import com.liquidnet.service.adam.dto.vo.AdamUserInfoVo;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.kylin.dto.vo.basicServices.UploadVo;
import com.liquidnet.service.sweet.config.WechatMaConfigure;
import com.liquidnet.service.sweet.utils.QueueUtils;
import com.liquidnet.service.sweet.utils.WechatUsersRedisUtils;
import com.liquidnet.service.sweet.vo.SweetMaoDengVo;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.session.WxSessionManager;
import me.chanjar.weixin.mp.api.WxMpMessageHandler;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTextMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.time.LocalDateTime;
import java.util.LinkedList;
import java.util.Map;
@Component
@Slf4j
public class MaoDengImageHandler implements WxMpMessageHandler {
@Value("${liquidnet.service.platform.url}")
private String platformUrl;
@Autowired
private WechatUsersRedisUtils redisUtils;
@Autowired
private ShumeiUtil shumeiUtil;
@Autowired
WechatMaConfigure maConfigure;
@Autowired
QueueUtils queueUtils;
@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> map, WxMpService wxMpService, WxSessionManager wxSessionManager) throws WxErrorException {
String fromUser = wxMessage.getFromUser();//用户id
String picUrl = wxMessage.getPicUrl().replace("http", "https");//图片urlmao
//猫登天空活动开启
if (StringUtil.isNotEmpty(redisUtils.getSweetMaoDengOpen(fromUser))) {
//图片非法判断
if (!shumeiUtil.checkImage(fromUser, picUrl)) {
//图片非法 提示,发送文本消息
WxMpXmlOutTextMessage build = WxMpXmlOutMessage.TEXT().content("图片无法识别,吸猫上瘾的你一定还有其他的“猫片”,重新发一张吧!")
.fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser())
.build();
return build;
}
SweetMaoDengVo sweetMaoDengVo = SweetMaoDengVo.getNew();
sweetMaoDengVo.setUserId(fromUser);
try {
if (picUrl != null && !picUrl.equals("")) {
log.debug("[OLD PIC] = " + picUrl);
MultiValueMap<String, String> params = new LinkedMultiValueMap();
params.add("pathName", IDGenerator.nextTimeId().concat(".jpeg"));
params.add("picUrl", picUrl);
String returnData = HttpUtil.post(platformUrl.concat("/platform/basicServices/alOss/uploadUrl"), params);
ResponseDto<UploadVo> dto = JsonUtils.fromJson(returnData, new TypeReference<ResponseDto<UploadVo>>() {
});
picUrl = "https://img.zhengzai.tv/".concat(dto.getData().getOssPath());
log.debug("[NEW PIC] = " + picUrl);
}
} catch (Exception e) {
e.getMessage();
}
sweetMaoDengVo.setPicUrl(picUrl);
//活动已开启 持久化 redis
SweetMaoDengVo sweetMaoDeng = redisUtils.getSweetMaoDengTransfer(fromUser);
String textMsg = null;
if (sweetMaoDeng != null) {
textMsg = sweetMaoDeng.getTextMsg();
sweetMaoDengVo.setTextMsg(textMsg);
}
String maoId = IDGenerator.nextSnowId();
redisUtils.setSweetMaoDeng(sweetMaoDengVo);
if (StringUtil.isNotEmpty(textMsg) && StringUtil.isNotEmpty(picUrl)) {
//redis队列入库
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlsDataA = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("sweet_wechat_maodeng.insert"));
sqlsDataA.add(new Object[]{maoId, fromUser, textMsg, picUrl, "", LocalDateTime.now()});
queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_WECHAT_MAODENG_TEXT_INSERT.getKey(), SqlMapping.gets(sqls, sqlsDataA));
}
WxMpXmlOutTextMessage build = WxMpXmlOutMessage.TEXT().content("成了!点击上方小程序卡片查看猫咪的隐藏音乐技能。")
.fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser())
.build();
// 发送活动小程序卡片
WxMpKefuMessage message = WxMpKefuMessage.MINIPROGRAMPAGE()
.appId(maConfigure.getWxMaAppid(4))
.pagePath("pages/webview?query=catActivity&maoId=" + maoId) //小程序路径
.thumbMediaId("ov08q51In7bXX6tXv7Few-ud2-J-hyXnDC5NCNSfc_4") // 正在
// .thumbMediaId("ttUDFdcsOTnGFPBt5xp-vaYe_hS9Jae5C_YUboXmb4c") //test
// .thumbMediaId("OFjnPjluDGoHH1KOAdxQ_iMyWpBe_c48V40LlN6VmAQ") //图片地址
.title("在猫登天空,每一只猫咪都有自己的隐藏音乐技能!")
.toUser(wxMessage.getFromUser())
.build();
wxMpService.getKefuService().sendKefuMessage(message);
return build;
}
return null;
}
}
package com.liquidnet.service.sweet.handler;
import com.liquidnet.common.third.shumei.util.ShumeiUtil;
import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.common.third.shumei.util.ShumeiUtil;
import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.sweet.config.WechatMaConfigure;
import com.liquidnet.service.sweet.constant.SweetConstant;
import com.liquidnet.service.sweet.utils.WechatUsersRedisUtils;
import com.liquidnet.service.sweet.vo.SweetMaoDengVo;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.session.WxSessionManager;
......@@ -39,6 +44,9 @@ public class TextMsgHandler implements WxMpMessageHandler {
@Autowired
private ShumeiUtil shumeiUtil;
@Autowired
private RedisUtil redisUtil;
@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService,
WxSessionManager sessionManager) throws WxErrorException {
......@@ -47,9 +55,12 @@ public class TextMsgHandler implements WxMpMessageHandler {
// 2021草莓音乐节海报活动
if (StringUtil.trim(content).equals("白日梦")) {
redisUtils.delSweetMaoDengOpen(openId);
redisUtils.setStrawberryPosterClick(wxMessage.getFromUser(), 10 * 60);
return WxMpXmlOutMessage.TEXT().content("参与活动之前,请先告诉我你的昵称!(直接在对话框输入即可\uD83D\uDC47,9个字以内)")
return WxMpXmlOutMessage.TEXT().content("你梦中的草莓音乐节会有怎样的阵容?\n" +
"不如做一次白日梦,挑选你心水的草莓阵容!\n" +
"参与活动之前,请先告诉我你的昵称!(直接在对话框输入即可\uD83D\uDC47,9个字以内)")
.fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser())
.build();
} else if (redisUtils.getStrawberryPosterClick(openId)) {
......@@ -77,6 +88,7 @@ public class TextMsgHandler implements WxMpMessageHandler {
.appId(maConfigure.getWxMaAppid(4))
.pagePath("/pages/webview?query=strawberryMusic&voteWhere=2&nickname=".concat(content))
// .thumbMediaId("ov08q51In7bXX6tXv7Few8cBjTW0osSV_t9FCLg8Q1Q") // 正在
// .thumbMediaId("ttUDFdcsOTnGFPBt5xp-vaYe_hS9Jae5C_YUboXmb4c") // test
.thumbMediaId("OFjnPjluDGoHH1KOAdxQ_vfMiIKRu2Eo9QFhI5TOtHE") // 摩登
.title("做一场白日梦,挑选你心水的草莓阵容!")
.toUser(openId)
......@@ -85,6 +97,55 @@ public class TextMsgHandler implements WxMpMessageHandler {
}
if (content.equals("猫登天空")) {
redisUtils.delStrawberryPosterClick(openId);
redisUtils.setSweetMaoDengOpen(openId, 10 * 60);
WxMpXmlOutTextMessage build = WxMpXmlOutMessage.TEXT().content("没想到吧,你的喵星人主子在玩耍逗喵棒之外,也有一个隐秘的音乐人分身呢!\n" +
"看看TA到底是怎样一只音乐喵!\n" +
"参与活动之前,请先告诉我们猫咪的名字!(直接在对话框输入即可👇,9个汉字或18个英文字符以内)\n")
.fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser())
.build();
return build;
} else if (StringUtil.isNotEmpty(redisUtils.getSweetMaoDengOpen(openId))) { //是否参加了活动
//敏感词判断
if (!shumeiUtil.checkText(openId, content)) {
//文字敏感 提示,发送文本消息
WxMpXmlOutTextMessage build = WxMpXmlOutMessage.TEXT().content("无法识别,TA是不是还有别的名字呢!(请勿使用表情等特殊字符)")
.fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser())
.build();
return build;
}
if (content.length() > 8) {
return WxMpXmlOutMessage.TEXT().content("昵称要9个字以内~")
.fromUser(wxMessage.getToUser()).toUser(openId)
.build();
}
if (!shumeiUtil.checkText(openId, content)) {
return WxMpXmlOutMessage.TEXT().content("无法识别,换个昵称吧!(请勿使用表情等特殊字符)")
.fromUser(wxMessage.getToUser()).toUser(openId)
.build();
}
SweetMaoDengVo sweetMaoDengVo = SweetMaoDengVo.getNew();
sweetMaoDengVo.setUserId(openId);
sweetMaoDengVo.setTextMsg(content);
SweetMaoDengVo sweetMaoDeng = redisUtils.getSweetMaoDengTransfer(openId);
if (sweetMaoDeng != null) {
String picUrl = sweetMaoDeng.getPicUrl();
sweetMaoDengVo.setPicUrl(picUrl);
}
//获取过期时间
long expire = redisUtil.getExpire(SweetConstant.REDIS_KEY_SWEET_WECHAT_MAODENG_OPEN_POSTER + openId);
redisUtils.setSweetMaoDengTransfer(sweetMaoDengVo, expire);
WxMpXmlOutTextMessage build = WxMpXmlOutMessage.TEXT().content("再发给我们一张猫咪的可爱照片吧!")
.fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser())
.build();
return build;
}
return null;
}
}
}
\ No newline at end of file
package com.liquidnet.service.sweet.service.impl;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.sweet.config.WechatMaConfigure;
import com.liquidnet.service.sweet.utils.QueueUtils;
import com.liquidnet.service.sweet.utils.WechatUsersRedisUtils;
import com.liquidnet.service.sweet.vo.SweetMaoDengVo;
import com.liquidnet.service.sweet.vo.SweetWechatUsersVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.LinkedList;
@Service
@Slf4j
public class SweetWechatMaoDengServiceImpl {
@Autowired
private WechatUsersRedisUtils redisUtils;
@Autowired
QueueUtils queueUtils;
@Autowired
WechatMaConfigure maConfigure;
public ResponseDto addBuilderImg(String userId, String imgUrl, String maoId) {
LocalDateTime localDateTime = LocalDateTime.now(); //生成创建时间
try {
SweetWechatUsersVo wechatUsers = redisUtils.getSweetWechatUsersOfUnionId(userId, 1);
if (null == wechatUsers) {
return ResponseDto.failure("请求失败");
}
SweetMaoDengVo sweetMaoDeng = redisUtils.getSweetMaoDeng(wechatUsers.getOpenId());
if (sweetMaoDeng != null) {
sweetMaoDeng.setImgUrl(imgUrl);
}
String textMsg = sweetMaoDeng.getTextMsg();
String picUrl = sweetMaoDeng.getPicUrl();
sweetMaoDeng.setCreatedAt(localDateTime);
redisUtils.setSweetMaoDeng(sweetMaoDeng);
if (StringUtil.isNotEmpty(textMsg) && StringUtil.isNotEmpty(picUrl)) {
//redis队列入库
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlsDataA = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("sweet_wechat_maodeng.img.update"));
sqlsDataA.add(new Object[]{imgUrl, userId, maoId});
queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_WECHAT_MAODENG_TEXT_INSERT.getKey(), SqlMapping.gets(sqls, sqlsDataA));
return ResponseDto.failure("请求成功");
}
return ResponseDto.failure("请求失败");
} catch (Exception e) {
e.printStackTrace();
log.error("[ERROR] = {}", e);
return ResponseDto.failure("请求失败");
}
}
}
......@@ -3,6 +3,7 @@ package com.liquidnet.service.sweet.utils;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.service.sweet.constant.SweetConstant;
import com.liquidnet.service.sweet.vo.SweetAppletUsersVo;
import com.liquidnet.service.sweet.vo.SweetMaoDengVo;
import com.liquidnet.service.sweet.vo.SweetWechatUsersVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -26,6 +27,7 @@ public class WechatUsersRedisUtils {
return sweetWechatUsersVo;
}
}
public SweetWechatUsersVo getSweetWechatUsersOfOpenId(String openId, Integer type) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_WECHAT_USERS_OPENID.concat(openId)
.concat(SweetConstant.REDIS_KEY_SWEET_WECHAT_USERS_TYPE).concat(String.valueOf(type));
......@@ -37,6 +39,7 @@ public class WechatUsersRedisUtils {
return sweetWechatUsersVo;
}
}
public void setSweetWechatUsers(SweetWechatUsersVo sweetWechatUsersVo) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_WECHAT_USERS_UNIONID.concat(sweetWechatUsersVo.getUnionId())
.concat(SweetConstant.REDIS_KEY_SWEET_WECHAT_USERS_TYPE).concat(String.valueOf(sweetWechatUsersVo.getType()));
......@@ -46,6 +49,7 @@ public class WechatUsersRedisUtils {
.concat(SweetConstant.REDIS_KEY_SWEET_WECHAT_USERS_TYPE).concat(String.valueOf(sweetWechatUsersVo.getType()));
redisUtil.set(redisKeyOpenId, sweetWechatUsersVo);
}
public void delSweetWechatUsers(String unionId, String openId, Integer type) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_WECHAT_USERS_UNIONID.concat(unionId)
.concat(SweetConstant.REDIS_KEY_SWEET_WECHAT_USERS_TYPE).concat(String.valueOf(type));
......@@ -66,6 +70,7 @@ public class WechatUsersRedisUtils {
return sweetAppletUsersVo;
}
}
public SweetAppletUsersVo getSweetAppletUsersOfUnionId(String unionId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_APPLET_USERS_UNIONID.concat(unionId);
Object obj = redisUtil.get(redisKey);
......@@ -76,6 +81,7 @@ public class WechatUsersRedisUtils {
return sweetAppletUsersVo;
}
}
public void setSweetAppletUsers(SweetAppletUsersVo sweetAppletUsersVo) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_APPLET_USERS_PHONE.concat(sweetAppletUsersVo.getPurePhoneNumber());
redisUtil.set(redisKey, sweetAppletUsersVo);
......@@ -88,13 +94,86 @@ public class WechatUsersRedisUtils {
String redisKey = SweetConstant.REDIS_KEY_SWEET_STRAWBERRY_POSTER_CLICK.concat(openId);
redisUtil.set(redisKey, 1, time);
}
public void delStrawberryPosterClick(String openId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_STRAWBERRY_POSTER_CLICK.concat(openId);
redisUtil.del(redisKey);
}
public boolean getStrawberryPosterClick(String openId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_STRAWBERRY_POSTER_CLICK.concat(openId);
Object obj = redisUtil.get(redisKey);
if(null == obj) {
if (null == obj) {
return false;
} else {
return true;
}
}
/* public SweetMaoDengVo getSweetMaoDengText(String userId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_WECHAT_MAODENG_POSTER.concat(userId);
Object obj = redisUtil.get(redisKey);
if (null == obj) {
return null;
} else {
SweetMaoDengVo sweetMaoDengVo = (SweetMaoDengVo) obj;
return sweetMaoDengVo;
}
}*/
public String getSweetMaoDengOpen(String fromUser) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_WECHAT_MAODENG_OPEN_POSTER.concat(fromUser);
String obj = (String) redisUtil.get(redisKey);
if (null == obj) {
return null;
} else {
return obj;
}
}
//整体取
public SweetMaoDengVo getSweetMaoDeng(String userId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_WECHAT_MAODENG_POSTER.concat(":" + userId);
SweetMaoDengVo obj = (SweetMaoDengVo) redisUtil.get(redisKey);
if (null == obj) {
return null;
} else {
return obj;
}
}
//整体存
public void setSweetMaoDeng(SweetMaoDengVo sweetMaoDengVo) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_WECHAT_MAODENG_POSTER.concat(":" + sweetMaoDengVo.getUserId());
redisUtil.set(redisKey, sweetMaoDengVo);
}
//开启猫登天空活动
public void setSweetMaoDengOpen(String fromUser, long time) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_WECHAT_MAODENG_OPEN_POSTER.concat(fromUser);
redisUtil.set(redisKey, "1", time);
}
public void delSweetMaoDengOpen(String fromUser) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_WECHAT_MAODENG_OPEN_POSTER.concat(fromUser);
redisUtil.del(redisKey);
}
//临时数据中转
public void setSweetMaoDengTransfer(SweetMaoDengVo sweetMaoDengVo, long expire) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_WECHAT_MAODENG_POSTER_TRANSFER.concat(":" + sweetMaoDengVo.getUserId());
redisUtil.set(redisKey, sweetMaoDengVo, expire);
}
//临时数据中转
public SweetMaoDengVo getSweetMaoDengTransfer(String fromUser) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_WECHAT_MAODENG_POSTER_TRANSFER.concat(":" + fromUser);
SweetMaoDengVo obj = (SweetMaoDengVo) redisUtil.get(redisKey);
if (null == obj) {
return null;
} else {
return obj;
}
}
}
......@@ -56,4 +56,17 @@ sweet_wechat_users.delete=DELETE FROM sweet_wechat_users WHERE union_id = ? and
#---------------------------音乐节活动海报--------------------------------
sweet_strawberry_poster_user=INSERT INTO sweet_strawberry_poster(open_id,poster_id,union_id,nickname,city_name,city_code,custom_text,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?)
sweet_strawberry_poster_Musician=INSERT INTO sweet_strawberry_poster_lineup(lineup_id,poster_id,lineup_num,musician_name,created_at,updated_at) VALUES (?,?,?,?,?,?)
\ No newline at end of file
sweet_strawberry_poster_Musician=INSERT INTO sweet_strawberry_poster_lineup(lineup_id,poster_id,lineup_num,musician_name,created_at,updated_at) VALUES (?,?,?,?,?,?)
#---------------------------猫登天空--------------------------------
sweet_wechat_maodeng.insert=INSERT INTO sweet_wechat_maodeng(mao_id,user_id,text_msg,pic_url,img_url,created_at) VALUES (?,?,?,?,?,?)
sweet_wechat_maodeng.text.update=UPDATE sweet_wechat_maodeng SET text_msg=? WHERE user_id=? AND mao_id=?
sweet_wechat_maodeng.img.update=UPDATE sweet_wechat_maodeng SET img_url=? WHERE user_id=? AND mao_id=?
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment