Commit a60a1072 by 高鹏

Merge branch 'feat-riddle' into 'master'

猜谜语

See merge request rays/pcloud-book!138
parents a1670ff6 6a3d5438
...@@ -22,5 +22,13 @@ public class RiddleConstant { ...@@ -22,5 +22,13 @@ public class RiddleConstant {
*/ */
public static final String JOB_NAME_RIDDLE_EXPIRE = "judgeRiddleTime"; public static final String JOB_NAME_RIDDLE_EXPIRE = "judgeRiddleTime";
/**
* 每个谜语后的规则提示
*/
public static final String rule_notice = "敲重点!如果答错了,我是不会回复的哦。";
/**
* 关键词说明
*/
public static final String introduce = "猜谜语,简单有趣的小游戏。连续答对5题,所有群成员可获得精美礼券";
} }
package com.pcloud.book.riddle.enums;
/**
* @描述:点击记录
* @作者:zhuyajie
* @创建时间:16:39 2019/8/29
* @版本:1.0
*/
public enum RiddleClickTypeEnum {
/**
* 点击链接
*/
link(1),
/**
* 许愿
*/
wish(2),
/**
* 立即使用
*/
use(3);
private Integer code;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
RiddleClickTypeEnum(Integer code) {
this.code = code;
}
}
...@@ -19,7 +19,11 @@ public enum RiddleRecordStatusEnum { ...@@ -19,7 +19,11 @@ public enum RiddleRecordStatusEnum {
/** /**
*进行中 *进行中
*/ */
underway(2); underway(2),
/**
* 通关结束
*/
over(3);
private Integer code; private Integer code;
...@@ -34,4 +38,6 @@ public enum RiddleRecordStatusEnum { ...@@ -34,4 +38,6 @@ public enum RiddleRecordStatusEnum {
RiddleRecordStatusEnum(Integer code) { RiddleRecordStatusEnum(Integer code) {
this.code = code; this.code = code;
} }
public static final Integer[] GAME_END = {end.code, over.code};
} }
package com.pcloud.book.riddle.biz; package com.pcloud.book.riddle.biz;
import com.pcloud.book.riddle.dto.CouponClickDTO;
import com.pcloud.book.riddle.dto.GroupRedisDTO; import com.pcloud.book.riddle.dto.GroupRedisDTO;
import com.pcloud.book.riddle.dto.GroupRiddleDTO; import com.pcloud.book.riddle.dto.GroupRiddleDTO;
import com.pcloud.book.riddle.entity.RiddleClickRecord;
import com.pcloud.common.page.PageBeanNew; import com.pcloud.common.page.PageBeanNew;
import com.pcloud.wechatgroup.message.dto.SendTextDTO; import com.pcloud.wechatgroup.message.dto.SendTextDTO;
...@@ -67,4 +69,26 @@ public interface RiddleRecordBiz { ...@@ -67,4 +69,26 @@ public interface RiddleRecordBiz {
* @param groupRedisDTO * @param groupRedisDTO
*/ */
public void sendIncorrectMessage(GroupRedisDTO groupRedisDTO); public void sendIncorrectMessage(GroupRedisDTO groupRedisDTO);
/**
* 发送优惠券链接
* @param wxGroupId
* @param wxId
* @param ip
*/
public void sendCouponLink(String wxId, String wxGroupId, String ip);
/**
* 礼券点击记录埋点
* @param riddleClickRecord
*/
void addClickTrack(RiddleClickRecord riddleClickRecord);
/**
* 优惠券剩余领取次数
* @param wxGroupId
* @param wechatUserId
* @return
*/
CouponClickDTO getGroupWishCount(String wxGroupId, Long wechatUserId);
} }
package com.pcloud.book.riddle.biz.impl; package com.pcloud.book.riddle.biz.impl;
import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr; import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr;
import com.pcloud.book.group.biz.BookGroupClassifyBiz;
import com.pcloud.book.group.biz.GroupQrcodeBiz; import com.pcloud.book.group.biz.GroupQrcodeBiz;
import com.pcloud.book.group.dao.GroupQrcodeDao; import com.pcloud.book.group.dao.GroupQrcodeDao;
import com.pcloud.book.group.dto.GroupClassifyQrcodeDTO;
import com.pcloud.book.group.entity.GroupQrcode; import com.pcloud.book.group.entity.GroupQrcode;
import com.pcloud.book.keywords.dao.BookKeywordDao;
import com.pcloud.book.keywords.dto.ReplyKeywordDTO;
import com.pcloud.book.riddle.biz.RiddleRecordBiz; import com.pcloud.book.riddle.biz.RiddleRecordBiz;
import com.pcloud.book.riddle.constants.RiddleConstant; import com.pcloud.book.riddle.constants.RiddleConstant;
import com.pcloud.book.riddle.dao.RiddleClickRecordDao;
import com.pcloud.book.riddle.dao.RiddleDao; import com.pcloud.book.riddle.dao.RiddleDao;
import com.pcloud.book.riddle.dao.RiddleRecordDao; import com.pcloud.book.riddle.dao.RiddleRecordDao;
import com.pcloud.book.riddle.dao.RiddleReplyDao; import com.pcloud.book.riddle.dao.RiddleReplyDao;
import com.pcloud.book.riddle.dto.CouponClickDTO;
import com.pcloud.book.riddle.dto.GroupRedisDTO; import com.pcloud.book.riddle.dto.GroupRedisDTO;
import com.pcloud.book.riddle.dto.GroupRiddleDTO; import com.pcloud.book.riddle.dto.GroupRiddleDTO;
import com.pcloud.book.riddle.dto.UserRankingDTO;
import com.pcloud.book.riddle.entity.Riddle; import com.pcloud.book.riddle.entity.Riddle;
import com.pcloud.book.riddle.entity.RiddleClickRecord;
import com.pcloud.book.riddle.entity.RiddleRecord; import com.pcloud.book.riddle.entity.RiddleRecord;
import com.pcloud.book.riddle.enums.RiddleClickTypeEnum;
import com.pcloud.book.riddle.enums.RiddleRecordStatusEnum; import com.pcloud.book.riddle.enums.RiddleRecordStatusEnum;
import com.pcloud.book.riddle.enums.RiddleReplyTypeEnum; import com.pcloud.book.riddle.enums.RiddleReplyTypeEnum;
import com.pcloud.book.riddle.redis.RiddleRedis;
import com.pcloud.common.core.aspect.ParamLog; import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.page.PageBeanNew; import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.utils.ListUtils; import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.httpclient.UrlUtils;
import com.pcloud.common.utils.string.StringUtil; import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.facade.quartz.entity.CallBackParam; import com.pcloud.facade.quartz.entity.CallBackParam;
import com.pcloud.facade.quartz.entity.ScheduleJob; import com.pcloud.facade.quartz.entity.ScheduleJob;
...@@ -33,12 +35,17 @@ import com.sdk.wxgroup.SendMessageTypeEnum; ...@@ -33,12 +35,17 @@ import com.sdk.wxgroup.SendMessageTypeEnum;
import com.sdk.wxgroup.SendTextMessageVO; import com.sdk.wxgroup.SendTextMessageVO;
import com.sdk.wxgroup.WxGroupSDK; import com.sdk.wxgroup.WxGroupSDK;
import org.apache.commons.lang3.ArrayUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.net.URLEncoder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -56,7 +63,10 @@ import java.util.TimerTask; ...@@ -56,7 +63,10 @@ import java.util.TimerTask;
public class RiddleRecordBizImpl implements RiddleRecordBiz { public class RiddleRecordBizImpl implements RiddleRecordBiz {
private static final Logger logger = LoggerFactory.getLogger(RiddleRecordBizImpl.class); private static final Logger logger = LoggerFactory.getLogger(RiddleRecordBizImpl.class);
@Value("${wechat.group.link.prefix}")
private String wechatGroupLinkPrefix;
@Value("${system.env}")
private String envStr;
@Autowired @Autowired
private RiddleDao riddleDao; private RiddleDao riddleDao;
@Autowired @Autowired
...@@ -64,19 +74,15 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -64,19 +74,15 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
@Autowired @Autowired
private RiddleReplyDao riddleReplyDao; private RiddleReplyDao riddleReplyDao;
@Autowired @Autowired
private BookGroupClassifyBiz bookGroupClassifyBiz;
@Autowired
private BookKeywordDao bookKeywordDao;
@Autowired
private WechatGroupConsr wechatGroupConsr; private WechatGroupConsr wechatGroupConsr;
@Autowired @Autowired
private RiddleRedis riddleRedis;
@Autowired
private GroupQrcodeBiz groupQrcodeBiz; private GroupQrcodeBiz groupQrcodeBiz;
@Autowired @Autowired
private GroupQrcodeDao groupQrcodeDao; private GroupQrcodeDao groupQrcodeDao;
@Autowired @Autowired
private ScheduleService scheduleService; private ScheduleService scheduleService;
@Autowired
private RiddleClickRecordDao riddleClickRecordDao;
@Override @Override
...@@ -101,40 +107,16 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -101,40 +107,16 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
} }
} }
//历史记录 //历史记录
RiddleRecord riddleRecord = riddleRecordDao.getLastRecordByWxGroupId(wxGroupId); RiddleRecord riddleRecord = riddleRecordDao.getLastRecordByWxGroupId(wxGroupId, null);
//1该群猜谜语没有记录或已结束 //1该群猜谜语没有记录或已结束
if (null == riddleRecord || (null != riddleRecord && RiddleRecordStatusEnum.end.getCode().equals(riddleRecord.getStatus()))) { if (null == riddleRecord || (null != riddleRecord && ArrayUtils.contains(RiddleRecordStatusEnum.GAME_END, riddleRecord.getStatus()))) {
Riddle currentRiddle = null;
Integer finishCount = 0;
if (null != riddleRecord) {
currentRiddle = riddleDao.getById(riddleRecord.getRiddleId());
finishCount = riddleRecord.getFinishCount() == null ? 0 : riddleRecord.getFinishCount();
Integer correctCount = riddleRecordDao.getCorrectCountByGroup(wxGroupId, finishCount);
if (correctCount == 180) {//结束前答对180道,通关次数+1
currentRiddle = null;
finishCount = finishCount + 1;
}
}
//1.1关键词“猜谜语” ,游戏开启,计时 //1.1关键词“猜谜语” ,游戏开启,计时
if (textContent.equals("猜谜语")) { if (textContent.equals("猜谜语")) {
startGame(currentRiddle, wxGroupId, wxId, ip, finishCount); startGame(riddleRecord, wxGroupId, wxId, ip);
} }
} }
//2猜谜语进行中 //2猜谜语进行中
else if (null != riddleRecord && !RiddleRecordStatusEnum.end.getCode().equals(riddleRecord.getStatus())) { else if (null != riddleRecord && !RiddleRecordStatusEnum.end.getCode().equals(riddleRecord.getStatus())) {
//2.1是关键词,不处理
/*Boolean keyWord = false;
GroupClassifyQrcodeDTO classifyQrcodeInfo = bookGroupClassifyBiz.getClassifyQrcodeInfo(wxGroupId);
if (null != classifyQrcodeInfo) {
ReplyKeywordDTO replyKeywordDTO = bookKeywordDao.getKeywordId(classifyQrcodeInfo.getClassifyId(), classifyQrcodeInfo.getBookGroupId(), textContent);
if (null != replyKeywordDTO) {
keyWord = true;
}
}
if (keyWord) {
logger.info("该条信息为关键词,不处理,textContent=" + textContent);
return;
}*/
Integer finishCount = riddleRecord.getFinishCount() == null ? 0 : riddleRecord.getFinishCount(); Integer finishCount = riddleRecord.getFinishCount() == null ? 0 : riddleRecord.getFinishCount();
Long riddleId = riddleRecord.getRiddleId(); Long riddleId = riddleRecord.getRiddleId();
Riddle riddle = riddleDao.getById(riddleId); Riddle riddle = riddleDao.getById(riddleId);
...@@ -147,23 +129,23 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -147,23 +129,23 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
insertRecord.setWxGroupId(wxGroupId); insertRecord.setWxGroupId(wxGroupId);
insertRecord.setWxUserId(wxUserId); insertRecord.setWxUserId(wxUserId);
insertRecord.setFinishCount(finishCount); insertRecord.setFinishCount(finishCount);
//2.2包含“结束”、“不想玩”,结束游戏 //2.1包含“结束”、“不想玩”,结束游戏
if (textContent.contains("结束") || textContent.contains("不想玩") || textContent.contains("不玩了")) { if (textContent.contains("结束") || textContent.contains("不想玩") || textContent.contains("不玩了")) {
endGame(insertRecord, wxGroupId, wxId, ip, riddle.getGrade(), finishCount); endGame(insertRecord, wxGroupId, wxId, ip, riddle.getGrade(), finishCount);
return; return;
} }
//2.3中途参与,上一条答对了发送下一题,否则发送当前题目 //2.2中途参与,上一条答对了发送下一题,否则发送当前题目
if (textContent.equals("猜谜语")) { if (textContent.equals("猜谜语")) {
midwayIn(riddle, riddleRecord.getCorrect(), wxGroupId, wxId, ip, wxUserId, finishCount); midwayIn(riddle, riddleRecord.getCorrect(), wxGroupId, wxId, ip, wxUserId, finishCount);
return; return;
} }
//2.4不知道、提示、答案、正确答案,给提示语 //2.3不知道、提示、答案、正确答案,给提示语
if (textContent.contains("不知道") || textContent.contains("提示") || textContent.contains("答案") || textContent.contains("正确答案")) { if (textContent.contains("不知道") || textContent.contains("提示") || textContent.contains("答案") || textContent.contains("正确答案")) {
String before = "思考是件有趣的事哦,再想想吧。友情提示:可以问问其他人或者上网查询正确答案哦。"; String before = "思考是件有趣的事哦,再想想吧。友情提示:可以问问其他人或者上网查询正确答案哦。";
sendWeixinTextMessage(wxId, wxGroupId, before, ip, wxUserId); sendWeixinTextMessage(wxId, wxGroupId, before, ip, wxUserId);
return; return;
} }
//2.5判断答题对错 //2.4判断答题对错
judgeCorrcet(textContent, riddle, insertRecord, wxGroupId, wxId, ip, wxUserId, finishCount); judgeCorrcet(textContent, riddle, insertRecord, wxGroupId, wxId, ip, wxUserId, finishCount);
} }
} }
...@@ -195,7 +177,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -195,7 +177,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
sendTextMessageVO.setAtId(wxUserId); sendTextMessageVO.setAtId(wxUserId);
GroupUserDTO groupUser = wechatGroupConsr.getWxUserInfoByWxUserId(wxUserId); GroupUserDTO groupUser = wechatGroupConsr.getWxUserInfoByWxUserId(wxUserId);
if (null != groupUser && !StringUtil.isEmpty(groupUser.getNickName())) { if (null != groupUser && !StringUtil.isEmpty(groupUser.getNickName())) {
content = "@" + groupUser.getNickName() + "" + content; content = "@" + groupUser.getNickName() + "" + content;
} }
} }
sendTextMessageVO.setContent(content); sendTextMessageVO.setContent(content);
...@@ -212,7 +194,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -212,7 +194,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
if (StringUtil.isEmpty(beforeContent)) { if (StringUtil.isEmpty(beforeContent)) {
beforeContent = "接下来请听下一题:"; beforeContent = "接下来请听下一题:";
} }
String sendText = beforeContent + riddle.getRiddleContent(); String sendText = beforeContent + riddle.getRiddleContent()+ "\n" + RiddleConstant.rule_notice;
sendWeixinTextMessage(wxId, wxGroupId, sendText, ip, wxUserId); sendWeixinTextMessage(wxId, wxGroupId, sendText, ip, wxUserId);
//添加记录 //添加记录
RiddleRecord insertRecord = new RiddleRecord(); RiddleRecord insertRecord = new RiddleRecord();
...@@ -243,7 +225,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -243,7 +225,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
riddleDTO.setUserNum(participateCountDTO.getUserNum() == 0 ? 0 : participateCountDTO.getUserNum()); riddleDTO.setUserNum(participateCountDTO.getUserNum() == 0 ? 0 : participateCountDTO.getUserNum());
riddleDTO.setParticipateCount(participateCountDTO.getParticipateCount() == 0 ? 0 : participateCountDTO.getParticipateCount()); riddleDTO.setParticipateCount(participateCountDTO.getParticipateCount() == 0 ? 0 : participateCountDTO.getParticipateCount());
} }
RiddleRecord riddleRecord = riddleRecordDao.getLastRecordByWxGroupId(riddleDTO.getWxGroupId()); RiddleRecord riddleRecord = riddleRecordDao.getLastRecordByWxGroupId(riddleDTO.getWxGroupId(), null);
if (null != riddleRecord) { if (null != riddleRecord) {
Riddle riddle = riddleDao.getById(riddleRecord.getRiddleId()); Riddle riddle = riddleDao.getById(riddleRecord.getRiddleId());
riddleDTO.setGrade(riddle.getGrade()); riddleDTO.setGrade(riddle.getGrade());
...@@ -263,19 +245,37 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -263,19 +245,37 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
/** /**
* 开启游戏 * 开启游戏
*/ */
public void startGame(Riddle currentRiddle, String wxGroupId, String wxId, String ip, Integer finishCount) { public void startGame(RiddleRecord riddleRecord, String wxGroupId, String wxId, String ip) {
Riddle currentRiddle = null;//要发送的题目
Integer finishCount = 0;//通关次数
Integer correctCount = 0;//答对题数
if (null != riddleRecord) {
finishCount = riddleRecord.getFinishCount() == null ? 0 : riddleRecord.getFinishCount();
//结束取当前题
currentRiddle = riddleDao.getById(riddleRecord.getRiddleId());
if (RiddleRecordStatusEnum.over.getCode().equals(riddleRecord.getStatus())) {//通关结束取下一题
Riddle nextRiddle = riddleDao.getRiddleByGradeAndSeq(currentRiddle.getGrade(), currentRiddle.getSeq());
if (null == nextRiddle && currentRiddle.getGrade() < 3) {//从下一关第一题开始
nextRiddle = riddleDao.getRiddleByGradeAndSeq(currentRiddle.getGrade() + 1, 0);
}
currentRiddle = nextRiddle;
}
correctCount = riddleRecordDao.getCorrectCountByGroup(wxGroupId, finishCount);
Integer total = riddleDao.getCount();
if (correctCount.equals(total)) {//结束前答对所有题,通关次数+1
currentRiddle = null;
finishCount = finishCount + 1;
correctCount = 0;
}
}
//发送规则 //发送规则
String reply = getRandomReply(RiddleReplyTypeEnum.rule.getCode()); String reply = getRandomReply(RiddleReplyTypeEnum.rule.getCode());
Integer correctCount = riddleRecordDao.getCorrectCountByGroup(wxGroupId, finishCount); Integer ranking = riddleRecordDao.getGroupRanking(wxGroupId);
if (null != currentRiddle) { reply = reply + "\n" + "目前本群总共猜对" + correctCount + "题,群排名第" + ranking + "名,大家加油。";
reply = reply + "\n" + "目前处于第" + currentRiddle.getGrade() + "关,已猜对" + correctCount + "题,大家加油。";
} else {
reply = reply + "\n" + "目前处于第1关,已猜对0题,大家加油。";
}
sendWeixinTextMessage(wxId, wxGroupId, reply, ip, null); sendWeixinTextMessage(wxId, wxGroupId, reply, ip, null);
//发送题目,保存该题目 //发送题目,保存该题目
if (null != currentRiddle) {//发送上次题目 if (null != currentRiddle) {//发送上次题目
String content = "请听题:" + currentRiddle.getRiddleContent(); String content = "请听题:" + currentRiddle.getRiddleContent() + "\n" + RiddleConstant.rule_notice;
sendWeixinTextMessage(wxId, wxGroupId, content, ip, null); sendWeixinTextMessage(wxId, wxGroupId, content, ip, null);
RiddleRecord insertRecord = new RiddleRecord(); RiddleRecord insertRecord = new RiddleRecord();
insertRecord.setRiddleId(currentRiddle.getId()); insertRecord.setRiddleId(currentRiddle.getId());
...@@ -290,10 +290,9 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -290,10 +290,9 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
} else {//从第一题开始 } else {//从第一题开始
sendNextRiddle(1, 0, wxGroupId, wxId, ip, RiddleRecordStatusEnum.begin, "请听题:", null, finishCount); sendNextRiddle(1, 0, wxGroupId, wxId, ip, RiddleRecordStatusEnum.begin, "请听题:", null, finishCount);
} }
//开始5分钟/10s计时 //开始5分钟计时
deleteJob(wxGroupId); deleteJob(wxGroupId);
addEndQuartzJob(wxGroupId, wxId, ip, wxId); addEndQuartzJob(wxGroupId, wxId, ip, wxId);
riddleRedis.addUnderwayGroup(wxGroupId, wxId, ip);
} }
/** /**
...@@ -301,7 +300,8 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -301,7 +300,8 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
*/ */
public void endGame(RiddleRecord insertRecord, String wxGroupId, String wxId, String ip, Integer grade, Integer finishCount) { public void endGame(RiddleRecord insertRecord, String wxGroupId, String wxId, String ip, Integer grade, Integer finishCount) {
Integer correctCount = riddleRecordDao.getCorrectCountByGroup(wxGroupId, finishCount); Integer correctCount = riddleRecordDao.getCorrectCountByGroup(wxGroupId, finishCount);
String text = "好嘞,再见,爱你们哦。目前本群猜对谜语数" + correctCount + "道,处于第" + grade + "关,大家加油。"; Integer ranking = riddleRecordDao.getGroupRanking(wxGroupId);
String text = "好嘞,再见,爱你们哦。目前本群总共猜对" + correctCount + "题,群排名第" + ranking + "名,大家加油。";
//发送结束语 //发送结束语
sendWeixinTextMessage(wxId, wxGroupId, text, ip, null); sendWeixinTextMessage(wxId, wxGroupId, text, ip, null);
//保存结束记录 //保存结束记录
...@@ -310,7 +310,6 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -310,7 +310,6 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
insertRecord.setCorrect(null); insertRecord.setCorrect(null);
riddleRecordDao.insert(insertRecord); riddleRecordDao.insert(insertRecord);
deleteJob(wxGroupId); deleteJob(wxGroupId);
riddleRedis.deleteUnderwayGroup(wxGroupId);
} }
/** /**
...@@ -324,11 +323,12 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -324,11 +323,12 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
if (riddle.getGrade() < 3) {//从下一关第一题开始 if (riddle.getGrade() < 3) {//从下一关第一题开始
sendNextRiddle(riddle.getGrade() + 1, 0, wxGroupId, wxId, ip, RiddleRecordStatusEnum.underway, beforeContent, wxUserId, finishCount); sendNextRiddle(riddle.getGrade() + 1, 0, wxGroupId, wxId, ip, RiddleRecordStatusEnum.underway, beforeContent, wxUserId, finishCount);
} else {//3关都答完,从头开始 } else {//3关都答完,从头开始
sendNextRiddle(1, 0, wxGroupId, wxId, ip, RiddleRecordStatusEnum.begin, beforeContent, wxUserId, finishCount + 1); sendNextRiddle(1, 0, wxGroupId, wxId, ip, RiddleRecordStatusEnum.underway, beforeContent, wxUserId, finishCount + 1);
} }
} }
} else { } else {//发送当前题
sendWeixinTextMessage(wxId, wxGroupId, beforeContent + riddle.getRiddleContent(), ip, wxUserId); String content = beforeContent + riddle.getRiddleContent() + "\n" + RiddleConstant.rule_notice;
sendWeixinTextMessage(wxId, wxGroupId, content, ip, wxUserId);
} }
deleteJob(wxGroupId); deleteJob(wxGroupId);
addEndQuartzJob(wxGroupId, wxId, ip, wxId); addEndQuartzJob(wxGroupId, wxId, ip, wxId);
...@@ -343,24 +343,45 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -343,24 +343,45 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
return; return;
} }
if (textContent.equals(riddle.getAnswer()) || textContent.equals(riddle.getOtherAnswer())) {//答对 if (textContent.equals(riddle.getAnswer()) || textContent.equals(riddle.getOtherAnswer())) {//答对
//答对文案
String beforeContent = getRandomReply(RiddleReplyTypeEnum.correct.getCode());
//保存答题记录 //保存答题记录
insertRecord.setMessageContent(textContent); insertRecord.setMessageContent(textContent);
insertRecord.setCorrect(true); insertRecord.setCorrect(true);
insertRecord.setStatus(RiddleRecordStatusEnum.underway.getCode()); insertRecord.setStatus(RiddleRecordStatusEnum.underway.getCode());
riddleRecordDao.insert(insertRecord); riddleRecordDao.insert(insertRecord);
//游戏开始的记录
RiddleRecord riddleRecord = riddleRecordDao.getLastRecordByWxGroupId(wxGroupId, RiddleRecordStatusEnum.begin.getCode());
Integer correctCount = riddleRecordDao.getCorrectCountByTime(wxGroupId, riddleRecord.getCreateTime());
//连续答对5题发送成绩单及优惠券并结束游戏
if (correctCount != 0 && correctCount % 5 == 0) {
Integer count = riddleRecordDao.getCorrectCountByGroup(wxGroupId, finishCount);
sendResult(wxId, wxGroupId, ip, count, insertRecord, riddleRecord.getCreateTime(), wxUserId);
sendCouponLink(wxId, wxGroupId, ip);
} else {
//发送下一题 //发送下一题
Boolean sendNext = sendNextRiddle(riddle.getGrade(), riddle.getSeq(), wxGroupId, wxId, ip, RiddleRecordStatusEnum.underway, beforeContent, wxUserId, finishCount); String correctContent = getRandomReply(RiddleReplyTypeEnum.correct.getCode());
Boolean sendNext = sendNextRiddle(riddle.getGrade(), riddle.getSeq(), wxGroupId, wxId, ip, RiddleRecordStatusEnum.underway, correctContent, wxUserId, finishCount);
if (!sendNext) {//本关没有下一题 if (!sendNext) {//本关没有下一题
if (riddle.getGrade() < 3) {//从下一关第一题开始 if (riddle.getGrade() < 3) {//从下一关第一题开始
sendNextRiddle(riddle.getGrade() + 1, 0, wxGroupId, wxId, ip, RiddleRecordStatusEnum.underway, beforeContent, wxUserId, finishCount); sendNextRiddle(riddle.getGrade() + 1, 0, wxGroupId, wxId, ip, RiddleRecordStatusEnum.underway, correctContent, wxUserId, finishCount);
} else {//3关都答完 } else {//3关都答完
sendWeixinTextMessage(wxId, wxGroupId, getRandomReply(RiddleReplyTypeEnum.finish_end.getCode()), ip, wxUserId); String content = getRandomReply(RiddleReplyTypeEnum.finish_end.getCode()) + "\n\n回复关键词“猜谜语”,可重新开始游戏。";
sendWeixinTextMessage(wxId, wxGroupId, content, ip, wxUserId);
sendCouponLink(wxId, wxGroupId, ip);
//结束游戏
RiddleRecord insert = new RiddleRecord();
BeanUtils.copyProperties(insertRecord, insert);
insert.setMessageContent(content);
insert.setStatus(RiddleRecordStatusEnum.over.getCode());
insert.setCorrect(null);
insert.setWxUserId(wxId);
riddleRecordDao.insert(insert);
} }
} }
deleteJob(wxGroupId); deleteJob(wxGroupId);
addEndQuartzJob(wxGroupId, wxId, ip, wxUserId); addEndQuartzJob(wxGroupId, wxId, ip, wxUserId);
}
} else if (riddle.getAnswer().contains(textContent) || textContent.contains(riddle.getAnswer())//部分答对 } else if (riddle.getAnswer().contains(textContent) || textContent.contains(riddle.getAnswer())//部分答对
|| (!StringUtil.isEmpty(riddle.getOtherAnswer()) && textContent.contains(riddle.getOtherAnswer()))) { || (!StringUtil.isEmpty(riddle.getOtherAnswer()) && textContent.contains(riddle.getOtherAnswer()))) {
//保存答题记录 //保存答题记录
...@@ -370,6 +391,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -370,6 +391,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
riddleRecordDao.insert(insertRecord); riddleRecordDao.insert(insertRecord);
//发送部分答对文案 //发送部分答对文案
String beforeContent = getRandomReply(RiddleReplyTypeEnum.partly_correct.getCode()); String beforeContent = getRandomReply(RiddleReplyTypeEnum.partly_correct.getCode());
beforeContent = beforeContent + "谜底是" + riddle.getAnswer().length() + "个字哦。";
sendWeixinTextMessage(wxId, wxGroupId, beforeContent, ip, null); sendWeixinTextMessage(wxId, wxGroupId, beforeContent, ip, null);
} else {//答错 } else {//答错
...@@ -390,7 +412,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -390,7 +412,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
* 自动结束 * 自动结束
*/ */
public void autoEnd(String wxGroupId, String wxId, String ip, String wxUserId) { public void autoEnd(String wxGroupId, String wxId, String ip, String wxUserId) {
RiddleRecord riddleRecord = riddleRecordDao.getLastRecordByWxGroupId(wxGroupId); RiddleRecord riddleRecord = riddleRecordDao.getLastRecordByWxGroupId(wxGroupId, null);
if (null == riddleRecord) { if (null == riddleRecord) {
logger.info("微信群=" + wxGroupId + "没有猜谜语游戏记录"); logger.info("微信群=" + wxGroupId + "没有猜谜语游戏记录");
return; return;
...@@ -401,11 +423,13 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -401,11 +423,13 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
logger.info("谜语=" + riddleId + "不存在"); logger.info("谜语=" + riddleId + "不存在");
return; return;
} }
Integer grade = riddle.getGrade();
Integer correctCount = riddleRecordDao.getCorrectCountByGroup(wxGroupId, riddleRecord.getFinishCount()); Integer correctCount = riddleRecordDao.getCorrectCountByGroup(wxGroupId, riddleRecord.getFinishCount());
Integer ranking = riddleRecordDao.getGroupRanking(wxGroupId);
String reply = getRandomReply(RiddleReplyTypeEnum.no_reply_end.getCode()); String reply = getRandomReply(RiddleReplyTypeEnum.no_reply_end.getCode());
String text = reply + "目前本群猜对谜语数" + correctCount + "道,处于第" + grade + "关。" String text = reply + "目前本群总共猜对" + correctCount + "题,群排名第" + ranking + "名,大家加油。";
+ "\n" + "大家想玩记得回复关键词“猜谜语”,我等你们哦。"; if (!text.contains("关键词")) {
text = text + "想玩记得回复关键词“猜谜语”就可以召唤我啦。";
}
//发送结束语 //发送结束语
sendWeixinTextMessage(wxId, wxGroupId, text, ip, null); sendWeixinTextMessage(wxId, wxGroupId, text, ip, null);
//保存结束记录 //保存结束记录
...@@ -418,7 +442,6 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -418,7 +442,6 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
record.setCorrect(null); record.setCorrect(null);
record.setFinishCount(riddleRecord.getFinishCount()); record.setFinishCount(riddleRecord.getFinishCount());
riddleRecordDao.insert(record); riddleRecordDao.insert(record);
riddleRedis.deleteUnderwayGroup(wxGroupId);
} }
...@@ -474,7 +497,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -474,7 +497,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
return; return;
} }
String wxGroupId = groupRedisDTO.getWxGroupId(); String wxGroupId = groupRedisDTO.getWxGroupId();
RiddleRecord record = riddleRecordDao.getLastRecordByWxGroupId(wxGroupId); RiddleRecord record = riddleRecordDao.getLastRecordByWxGroupId(wxGroupId, null);
if (null == record) { if (null == record) {
return; return;
} }
...@@ -496,6 +519,86 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -496,6 +519,86 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
} }
} }
@Override
public void sendCouponLink(String wxId, String wxGroupId, String ip) {
try {
Thread.sleep(1000);
}catch (InterruptedException e){
logger.error("线程休眠失败");
}
String link = "https://wechat666." + getDomain(envStr) + "/groupGuessing/guessing?wxGroupId=" + wxGroupId;
link = UrlUtils.getShortUrl4Own(wechatGroupLinkPrefix + "/link?url=" + URLEncoder.encode(link));
String content = "优惠券领取链接(@所有人均可领取哦):\n" + link;
sendWeixinTextMessage(wxId, wxGroupId, content, ip, null);
}
private String getDomain(String envStr) {
String domain = "5rs.me";
switch (envStr) {
case "dev":
domain = "chubanyun.me";
break;
case "test":
domain = "raysgo.com";
break;
case "uat":
domain = "raysyun.com";
break;
case "pro":
domain = "5rs.me";
break;
}
return domain;
}
/**
* 发送成绩单并结束游戏
* @param wxId
* @param wxGroupId
* @param ip
* @param correctCount
*/
@ParamLog("发送用户成绩单")
private void sendResult(String wxId, String wxGroupId, String ip, Integer correctCount, RiddleRecord record, Date startTime, String wxUserId) {
Integer total = riddleDao.getCount();
String reply;
if (correctCount.equals(total)) {//答对所有题
reply = getRandomReply(RiddleReplyTypeEnum.finish_end.getCode()) + "\n\n回复关键词“猜谜语”,可重新开始游戏。";
sendWeixinTextMessage(wxId, wxGroupId, reply, ip, wxUserId);
} else {
String correctContent = "给你点赞,答对本轮游戏最后一题,现在发成绩单咯,下一轮游戏我们不见不散哦。";
sendWeixinTextMessage(wxId, wxGroupId, correctContent, ip, wxUserId);
Integer ranking = riddleRecordDao.getGroupRanking(wxGroupId);
String before = "目前本群总共猜对" + correctCount + "题,群排名第" + ranking + "名,大家加油。\n" +
"--------------------------------\n本轮成绩如下:\n";
List<UserRankingDTO> rankingDTOS = riddleRecordDao.getUserRanking(wxGroupId, startTime);
if (ListUtils.isEmpty(rankingDTOS)) {
logger.error("查询用户排名失败");
return;
}
String content = "";
for (int i = 0; i < rankingDTOS.size(); i++) {
UserRankingDTO rankingDTO = rankingDTOS.get(i);
GroupUserDTO groupUser = wechatGroupConsr.getWxUserInfoByWxUserId(rankingDTO.getWxUserId());
int rank = i + 1;
if (rank == 1) {
content = "第1名:" + rankingDTO.getCount() + "分,@" + groupUser.getNickName() + ",恭喜成为本轮的谜语达人。【鼓掌】【鼓掌】【鼓掌】";
} else {
content = content + "\n第" + rank + "名," + rankingDTO.getCount() + "分,@" + groupUser.getNickName();
}
}
reply = before + content + "\n\n回复关键词“猜谜语”可继续游戏哦。";
sendWeixinTextMessage(wxId, wxGroupId, reply, ip, null);
}
//结束游戏
RiddleRecord insertRecord = new RiddleRecord();
BeanUtils.copyProperties(record, insertRecord);
insertRecord.setMessageContent(reply);
insertRecord.setStatus(RiddleRecordStatusEnum.over.getCode());
insertRecord.setCorrect(null);
insertRecord.setWxUserId(wxId);
riddleRecordDao.insert(insertRecord);
deleteJob(wxGroupId);
}
/** /**
* 10s后发送答错文案 * 10s后发送答错文案
...@@ -517,4 +620,29 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz { ...@@ -517,4 +620,29 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
} }
} }
@Override
public void addClickTrack(RiddleClickRecord riddleClickRecord) {
if (RiddleClickTypeEnum.wish.getCode().equals(riddleClickRecord.getClickType())) {
Integer totalCount = riddleRecordDao.getOverTime(riddleClickRecord.getWxGroupId());
Integer useCount = riddleClickRecordDao.getCountByType(riddleClickRecord.getWxGroupId(), riddleClickRecord.getWechatUserId(), RiddleClickTypeEnum.wish.getCode());
if (useCount >= totalCount) {
throw new BookBizException(BookBizException.ERROR, "抽奖次数已使用完");
}
}
riddleClickRecordDao.insert(riddleClickRecord);
}
@Override
public CouponClickDTO getGroupWishCount(String wxGroupId, Long wechatUserId) {
Integer totalCount = riddleRecordDao.getOverTime(wxGroupId);
Integer useCount = riddleClickRecordDao.getCountByType(wxGroupId, wechatUserId, RiddleClickTypeEnum.wish.getCode());
Integer remainCount = 0;
if (useCount < totalCount) {
remainCount = totalCount - useCount;
}
CouponClickDTO dto = new CouponClickDTO();
dto.setTotalCount(totalCount);
dto.setRemainCount(remainCount);
return dto;
}
} }
package com.pcloud.book.riddle.dao;
import com.pcloud.book.riddle.entity.RiddleClickRecord;
import com.pcloud.common.core.dao.BaseDao;
/**
* @描述:点击记录
* @作者:zhuyajie
* @创建时间:18:27 2019/8/29
* @版本:1.0
*/
public interface RiddleClickRecordDao extends BaseDao<RiddleClickRecord> {
/**
* 根据类型查使用次数
* @param wxGroupId
* @param wechatUserId
* @param code
* @return
*/
Integer getCountByType(String wxGroupId, Long wechatUserId, Integer code);
}
...@@ -19,4 +19,10 @@ public interface RiddleDao extends BaseDao<Riddle> { ...@@ -19,4 +19,10 @@ public interface RiddleDao extends BaseDao<Riddle> {
* @return * @return
*/ */
Riddle getRiddleByGradeAndSeq(Integer grade, Integer seq); Riddle getRiddleByGradeAndSeq(Integer grade, Integer seq);
/**
* 获取所有题目数量
* @return
*/
Integer getCount();
} }
package com.pcloud.book.riddle.dao; package com.pcloud.book.riddle.dao;
import com.pcloud.book.riddle.dto.GroupRiddleDTO; import com.pcloud.book.riddle.dto.GroupRiddleDTO;
import com.pcloud.book.riddle.dto.UserRankingDTO;
import com.pcloud.book.riddle.entity.RiddleRecord; import com.pcloud.book.riddle.entity.RiddleRecord;
import com.pcloud.common.core.dao.BaseDao; import com.pcloud.common.core.dao.BaseDao;
import java.util.Date;
import java.util.List;
/** /**
* @描述:猜谜记录 * @描述:猜谜记录
* @作者:zhuyajie * @作者:zhuyajie
...@@ -16,9 +20,10 @@ public interface RiddleRecordDao extends BaseDao<RiddleRecord> { ...@@ -16,9 +20,10 @@ public interface RiddleRecordDao extends BaseDao<RiddleRecord> {
/** /**
* 获取上一条猜谜记录 * 获取上一条猜谜记录
* @param wxGroupId * @param wxGroupId
* @param status 状态
* @return * @return
*/ */
RiddleRecord getLastRecordByWxGroupId(String wxGroupId); RiddleRecord getLastRecordByWxGroupId(String wxGroupId, Integer status);
/** /**
* 获得答对题目数量 * 获得答对题目数量
...@@ -33,4 +38,39 @@ public interface RiddleRecordDao extends BaseDao<RiddleRecord> { ...@@ -33,4 +38,39 @@ public interface RiddleRecordDao extends BaseDao<RiddleRecord> {
* @return * @return
*/ */
public GroupRiddleDTO getParticipateCount(String wxGroupId); public GroupRiddleDTO getParticipateCount(String wxGroupId);
/**
* 获得群排名
* @param wxGroupId
* @return
*/
public Integer getGroupRanking(String wxGroupId);
/**
* 获得用户答题排名
* @param wxGroupId
* @return
*/
public List<UserRankingDTO> getUserRanking(String wxGroupId, Date createTime);
/**
* 根据时间查答对题数
* @param wxGroupId
* @param createTime
* @return
*/
public Integer getCorrectCountByTime(String wxGroupId, Date createTime);
/**
* 连答对5题过关次数
* @param wxGroupId
* @return
*/
public Integer getOverTime(String wxGroupId);
/**
* 获得答对过题目群数
* @return
*/
public Integer getCorrectGroupCount();
} }
package com.pcloud.book.riddle.dao.impl;
import com.pcloud.book.riddle.dao.RiddleClickRecordDao;
import com.pcloud.book.riddle.entity.RiddleClickRecord;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
* @描述:点击记录
* @作者:zhuyajie
* @创建时间:18:27 2019/8/29
* @版本:1.0
*/
@Component("riddleClickRecordDao")
public class RiddleClickRecordDaoImpl extends BaseDaoImpl<RiddleClickRecord> implements RiddleClickRecordDao {
@Override
public Integer getCountByType(String wxGroupId, Long wechatUserId, Integer code) {
Map<String, Object> map = new HashMap<>();
map.put("wxGroupId", wxGroupId);
map.put("wechatUserId", wechatUserId);
map.put("type", code);
return getSessionTemplate().selectOne(getStatement("getCountByType"), map);
}
}
...@@ -26,4 +26,9 @@ public class RiddleDaoImpl extends BaseDaoImpl<Riddle> implements RiddleDao { ...@@ -26,4 +26,9 @@ public class RiddleDaoImpl extends BaseDaoImpl<Riddle> implements RiddleDao {
map.put("seq",seq); map.put("seq",seq);
return getSessionTemplate().selectOne(getStatement("getRiddleByGradeAndSeq"),map); return getSessionTemplate().selectOne(getStatement("getRiddleByGradeAndSeq"),map);
} }
@Override
public Integer getCount() {
return getSessionTemplate().selectOne(getStatement("getCount"));
}
} }
...@@ -2,12 +2,15 @@ package com.pcloud.book.riddle.dao.impl; ...@@ -2,12 +2,15 @@ package com.pcloud.book.riddle.dao.impl;
import com.pcloud.book.riddle.dao.RiddleRecordDao; import com.pcloud.book.riddle.dao.RiddleRecordDao;
import com.pcloud.book.riddle.dto.GroupRiddleDTO; import com.pcloud.book.riddle.dto.GroupRiddleDTO;
import com.pcloud.book.riddle.dto.UserRankingDTO;
import com.pcloud.book.riddle.entity.RiddleRecord; import com.pcloud.book.riddle.entity.RiddleRecord;
import com.pcloud.common.core.dao.BaseDaoImpl; import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
...@@ -21,8 +24,11 @@ public class RiddleRecordDaoImpl extends BaseDaoImpl<RiddleRecord> implements Ri ...@@ -21,8 +24,11 @@ public class RiddleRecordDaoImpl extends BaseDaoImpl<RiddleRecord> implements Ri
@Override @Override
public RiddleRecord getLastRecordByWxGroupId(String wxGroupId) { public RiddleRecord getLastRecordByWxGroupId(String wxGroupId, Integer status) {
return getSessionTemplate().selectOne(getStatement("getLastRecordByWxGroupId"), wxGroupId); Map<String, Object> map = new HashMap<>();
map.put("wxGroupId", wxGroupId);
map.put("status", status);
return getSessionTemplate().selectOne(getStatement("getLastRecordByWxGroupId"), map);
} }
@Override @Override
...@@ -37,4 +43,39 @@ public class RiddleRecordDaoImpl extends BaseDaoImpl<RiddleRecord> implements Ri ...@@ -37,4 +43,39 @@ public class RiddleRecordDaoImpl extends BaseDaoImpl<RiddleRecord> implements Ri
public GroupRiddleDTO getParticipateCount(String wxGroupId) { public GroupRiddleDTO getParticipateCount(String wxGroupId) {
return getSessionTemplate().selectOne(getStatement("getParticipateCount"), wxGroupId); return getSessionTemplate().selectOne(getStatement("getParticipateCount"), wxGroupId);
} }
@Override
public Integer getGroupRanking(String wxGroupId) {
Integer ranking = getSessionTemplate().selectOne(getStatement("getGroupRanking"), wxGroupId);
if (null == ranking) {
ranking = getCorrectGroupCount() + 1;
}
return ranking;
}
@Override
public List<UserRankingDTO> getUserRanking(String wxGroupId, Date createTime) {
Map<String, Object> map = new HashMap<>();
map.put("wxGroupId", wxGroupId);
map.put("createTime", createTime);
return getSessionTemplate().selectList(getStatement("getUserRanking"),map);
}
@Override
public Integer getCorrectCountByTime(String wxGroupId, Date createTime) {
Map<String, Object> map = new HashMap<>();
map.put("wxGroupId", wxGroupId);
map.put("createTime", createTime);
return getSessionTemplate().selectOne(getStatement("getCorrectCountByTime"), map);
}
@Override
public Integer getOverTime(String wxGroupId) {
return getSessionTemplate().selectOne(getStatement("getOverTime"), wxGroupId);
}
@Override
public Integer getCorrectGroupCount() {
return getSessionTemplate().selectOne(getStatement("getCorrectGroupCount"));
}
} }
package com.pcloud.book.riddle.dto;
import com.pcloud.common.dto.BaseDto;
/**
* @描述:优惠券领取次数
* @作者:zhuyajie
* @创建时间:14:38 2019/8/30
* @版本:1.0
*/
public class CouponClickDTO extends BaseDto {
/**
* 总次数
*/
private Integer totalCount;
/**
* 剩余次数
*/
private Integer remainCount;
public Integer getTotalCount() {
return totalCount;
}
public void setTotalCount(Integer totalCount) {
this.totalCount = totalCount;
}
public Integer getRemainCount() {
return remainCount;
}
public void setRemainCount(Integer remainCount) {
this.remainCount = remainCount;
}
@Override
public String toString() {
return "CouponClickDTO{" +
"totalCount=" + totalCount +
", remainCount=" + remainCount +
'}';
}
}
package com.pcloud.book.riddle.dto;
import com.pcloud.common.dto.BaseDto;
/**
* @描述:答题排名
* @作者:zhuyajie
* @创建时间:9:52 2019/8/29
* @版本:1.0
*/
public class UserRankingDTO extends BaseDto {
/**
* 数量
*/
private Integer count;
/**
* 用户id
*/
private String wxUserId;
public Integer getCount() {
return count;
}
public void setCount(Integer count) {
this.count = count;
}
public String getWxUserId() {
return wxUserId;
}
public void setWxUserId(String wxUserId) {
this.wxUserId = wxUserId;
}
@Override
public String toString() {
return "UserRankingDTO{" +
"count=" + count +
", wxUserId='" + wxUserId + '\'' +
'}';
}
}
package com.pcloud.book.riddle.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.pcloud.common.entity.BaseEntity;
import java.util.Date;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* 点击记录
*/
@ApiModel("猜谜语-埋点")
public class RiddleClickRecord extends BaseEntity{
@ApiModelProperty("微信群id")
private String wxGroupId;
@ApiModelProperty("微信用户id")
private Long wechatUserId;
@ApiModelProperty("点击类型(1点击链接2许愿3奖品立即使用)")
private Integer clickType;
@JsonFormat(
pattern = "yyyy-MM-dd HH:mm:ss",
timezone = "GMT+8"
)
@ApiModelProperty("创建时间")
private Date createTime;
public String getWxGroupId() {
return wxGroupId;
}
public void setWxGroupId(String wxGroupId) {
this.wxGroupId = wxGroupId == null ? null : wxGroupId.trim();
}
public Long getWechatUserId() {
return wechatUserId;
}
public void setWechatUserId(Long wechatUserId) {
this.wechatUserId = wechatUserId;
}
public Integer getClickType() {
return clickType;
}
public void setClickType(Integer clickType) {
this.clickType = clickType;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return "RiddleClickRecord{" +
"wxGroupId='" + wxGroupId + '\'' +
", wechatUserId=" + wechatUserId +
", clickType=" + clickType +
", createTime=" + createTime +
'}';
}
}
\ No newline at end of file
...@@ -2,15 +2,20 @@ package com.pcloud.book.riddle.facade; ...@@ -2,15 +2,20 @@ package com.pcloud.book.riddle.facade;
import com.pcloud.book.base.exception.BookBizException; import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.riddle.biz.RiddleRecordBiz; import com.pcloud.book.riddle.biz.RiddleRecordBiz;
import com.pcloud.book.riddle.dto.CouponClickDTO;
import com.pcloud.book.riddle.dto.GroupRiddleDTO; import com.pcloud.book.riddle.dto.GroupRiddleDTO;
import com.pcloud.book.riddle.dto.RiddleOpenDTO; import com.pcloud.book.riddle.dto.RiddleOpenDTO;
import com.pcloud.book.riddle.entity.RiddleClickRecord;
import com.pcloud.common.dto.ResponseDto; import com.pcloud.common.dto.ResponseDto;
import com.pcloud.common.page.PageBeanNew; import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.permission.PermissionException; import com.pcloud.common.permission.PermissionException;
import com.pcloud.common.utils.SessionUtil; import com.pcloud.common.utils.SessionUtil;
import com.pcloud.common.utils.cookie.Cookie;
import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.wechatgroup.message.dto.SendTextDTO; import com.pcloud.wechatgroup.message.dto.SendTextDTO;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
...@@ -39,14 +44,14 @@ public class RiddleFacade { ...@@ -39,14 +44,14 @@ public class RiddleFacade {
@Autowired @Autowired
private RiddleRecordBiz riddleRecordBiz; private RiddleRecordBiz riddleRecordBiz;
@ApiOperation("发送信息") @ApiOperation(value = "发送信息", httpMethod = "POST")
@PostMapping("sendText") @PostMapping("sendText")
public ResponseDto<?> sendText(@RequestBody @ApiParam SendTextDTO sendTextDTO){ public ResponseDto<?> sendText(@RequestBody @ApiParam SendTextDTO sendTextDTO){
riddleRecordBiz.riddleProcess(sendTextDTO); riddleRecordBiz.riddleProcess(sendTextDTO);
return new ResponseDto<>(); return new ResponseDto<>();
} }
@ApiOperation("猜谜语详情列表") @ApiOperation(value = "猜谜语详情列表",httpMethod = "GET")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "name", value = "name", required = false, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "name", value = "name", required = false, dataType = "string", paramType = "query"),
@ApiImplicitParam(name = "currentPage", value = "当前页", required = true, dataType = "int", paramType = "query"), @ApiImplicitParam(name = "currentPage", value = "当前页", required = true, dataType = "int", paramType = "query"),
...@@ -64,7 +69,7 @@ public class RiddleFacade { ...@@ -64,7 +69,7 @@ public class RiddleFacade {
return new ResponseDto<>(pageBean); return new ResponseDto<>(pageBean);
} }
@ApiOperation("更新猜谜语状态") @ApiOperation(value = "更新猜谜语状态",httpMethod = "POST")
@PostMapping("updateRiddleOpenStatus") @PostMapping("updateRiddleOpenStatus")
public ResponseDto<?> updateRiddleOpenStatus(@RequestHeader("token") String token, @RequestBody @ApiParam RiddleOpenDTO riddleOpenDTO) throws PermissionException { public ResponseDto<?> updateRiddleOpenStatus(@RequestHeader("token") String token, @RequestBody @ApiParam RiddleOpenDTO riddleOpenDTO) throws PermissionException {
SessionUtil.getToken4Redis(token); SessionUtil.getToken4Redis(token);
...@@ -79,4 +84,32 @@ public class RiddleFacade { ...@@ -79,4 +84,32 @@ public class RiddleFacade {
riddleRecordBiz.updateRiddleOpenStatus(qrcodeId, status); riddleRecordBiz.updateRiddleOpenStatus(qrcodeId, status);
return new ResponseDto<>(); return new ResponseDto<>();
} }
@ApiOperation(value = "添加点击记录",httpMethod = "POST")
@PostMapping("addClickTrack")
public ResponseDto<?> addClickTrack(@CookieValue("userInfo") String userInfo, @RequestBody @ApiParam RiddleClickRecord riddleClickRecord){
if (null == riddleClickRecord){
throw new BookBizException(BookBizException.PARAM_IS_NULL,"参数为空");
}
if (StringUtil.isEmpty(riddleClickRecord.getWxGroupId()) || null == riddleClickRecord.getClickType()){
throw new BookBizException(BookBizException.PARAM_IS_NULL,"参数缺失");
}
Long wechatUserId = Cookie.getId(userInfo,Cookie._WECHAT_USER_ID);
riddleClickRecord.setWechatUserId(wechatUserId);
riddleRecordBiz.addClickTrack(riddleClickRecord);
return new ResponseDto<>();
}
@ApiOperation(value = "群猜谜语优惠券许愿次数", httpMethod = "GET")
@ApiImplicitParam(name = "wxGroupId", value = "wxGroupId", required = false, dataType = "string", paramType = "query")
@GetMapping("getGroupWishCount4Wechat")
public ResponseDto<CouponClickDTO> getGroupWishCount4Wechat(
@CookieValue("userInfo") String userInfo, @RequestParam(value = "wxGroupId", required = false) String wxGroupId) {
if (StringUtil.isEmpty(wxGroupId)) {
throw new BookBizException(BookBizException.PARAM_IS_NULL,"缺少群id");
}
Long wechatUserId = Cookie.getId(userInfo, Cookie._WECHAT_USER_ID);
CouponClickDTO dto = riddleRecordBiz.getGroupWishCount(wxGroupId,wechatUserId);
return new ResponseDto<>(dto);
}
} }
...@@ -51,7 +51,7 @@ public class RiddleRedis { ...@@ -51,7 +51,7 @@ public class RiddleRedis {
* 添加答题中的群 * 添加答题中的群
* @param wxGroupId * @param wxGroupId
*/ */
public void addUnderwayGroup(String wxGroupId, String wxId, String ip) { /*public void addUnderwayGroup(String wxGroupId, String wxId, String ip) {
GroupRedisDTO dto = new GroupRedisDTO(); GroupRedisDTO dto = new GroupRedisDTO();
dto.setWxGroupId(wxGroupId); dto.setWxGroupId(wxGroupId);
dto.setWxId(wxId); dto.setWxId(wxId);
...@@ -66,13 +66,13 @@ public class RiddleRedis { ...@@ -66,13 +66,13 @@ public class RiddleRedis {
} }
} }
JedisClusterUtils.setJsonList(underway_group, list); JedisClusterUtils.setJsonList(underway_group, list);
} }*/
/** /**
* 获取答题中的群 * 获取答题中的群
* @return * @return
*/ */
public List<GroupRedisDTO> getUnderwayGroup() { /* public List<GroupRedisDTO> getUnderwayGroup() {
List<GroupRedisDTO> list = JedisClusterUtils.getJsonList(underway_group, GroupRedisDTO.class); List<GroupRedisDTO> list = JedisClusterUtils.getJsonList(underway_group, GroupRedisDTO.class);
if (ListUtils.isEmpty(list)) { if (ListUtils.isEmpty(list)) {
list = new ArrayList<>(); list = new ArrayList<>();
...@@ -85,12 +85,12 @@ public class RiddleRedis { ...@@ -85,12 +85,12 @@ public class RiddleRedis {
} }
return list; return list;
} }
*/
/** /**
* 删除答题中的群 * 删除答题中的群
* @param wxGroupId * @param wxGroupId
*/ */
public void deleteUnderwayGroup(String wxGroupId) { /*public void deleteUnderwayGroup(String wxGroupId) {
List<GroupRedisDTO> list = getUnderwayGroup(); List<GroupRedisDTO> list = getUnderwayGroup();
if (!ListUtils.isEmpty(list)) { if (!ListUtils.isEmpty(list)) {
for (int i = 0; i < list.size() && null != list; i++) { for (int i = 0; i < list.size() && null != list; i++) {
...@@ -109,6 +109,6 @@ public class RiddleRedis { ...@@ -109,6 +109,6 @@ public class RiddleRedis {
list.add(dto); list.add(dto);
} }
JedisClusterUtils.setJsonList(underway_group, list); JedisClusterUtils.setJsonList(underway_group, list);
} }*/
} }
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.pcloud.book.riddle.dao.impl.RiddleClickRecordDaoImpl" >
<resultMap id="BaseResultMap" type="com.pcloud.book.riddle.entity.RiddleClickRecord" >
<id column="id" property="id" jdbcType="BIGINT" />
<result column="wx_group_id" property="wxGroupId" jdbcType="VARCHAR" />
<result column="wechat_user_id" property="wechatUserId" jdbcType="BIGINT" />
<result column="click_type" property="clickType" jdbcType="INTEGER" />
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="Base_Column_List" >
id, wx_group_id, wechat_user_id, click_type, create_time
</sql>
<insert id="insert" parameterType="com.pcloud.book.riddle.entity.RiddleClickRecord" useGeneratedKeys="true" keyProperty="id">
insert into riddle_click_record (wx_group_id, wechat_user_id,
click_type, create_time)
values (#{wxGroupId,jdbcType=VARCHAR}, #{wechatUserId,jdbcType=BIGINT},
#{clickType,jdbcType=INTEGER}, NOW())
</insert>
<select id="getCountByType" parameterType="map" resultType="integer">
SELECT
COUNT(1)
FROM
riddle_click_record
WHERE
wx_group_id = #{wxGroupId}
AND wechat_user_id = #{wechatUserId}
AND click_type = #{type}
</select>
</mapper>
\ No newline at end of file
...@@ -33,5 +33,11 @@ ...@@ -33,5 +33,11 @@
WHERE id = #{id} WHERE id = #{id}
</select> </select>
<select id="getCount" resultType="integer">
SELECT
COUNT(1)
FROM
riddle
</select>
</mapper> </mapper>
\ No newline at end of file
...@@ -19,19 +19,22 @@ ...@@ -19,19 +19,22 @@
<insert id="insert" parameterType="com.pcloud.book.riddle.entity.RiddleRecord" useGeneratedKeys="true" keyProperty="id"> <insert id="insert" parameterType="com.pcloud.book.riddle.entity.RiddleRecord" useGeneratedKeys="true" keyProperty="id">
insert into riddle_record (id, riddle_id, message_content, insert into riddle_record (riddle_id, message_content,
wx_group_id, wx_user_id, correct, status, wx_group_id, wx_user_id, correct, status,
create_time, finish_count) create_time, finish_count)
values (#{id,jdbcType=BIGINT}, #{riddleId,jdbcType=BIGINT}, #{messageContent,jdbcType=VARCHAR}, values (#{riddleId,jdbcType=BIGINT}, #{messageContent,jdbcType=VARCHAR},
#{wxGroupId,jdbcType=VARCHAR}, #{wxUserId,jdbcType=VARCHAR}, #{correct,jdbcType=BIT}, #{status}, #{wxGroupId,jdbcType=VARCHAR}, #{wxUserId,jdbcType=VARCHAR}, #{correct,jdbcType=BIT}, #{status},
NOW(), #{finishCount}) NOW(), #{finishCount})
</insert> </insert>
<select id="getLastRecordByWxGroupId" resultMap="BaseResultMap" parameterType="String"> <select id="getLastRecordByWxGroupId" resultMap="BaseResultMap" parameterType="map">
SELECT SELECT
<include refid="Base_Column_List"/> <include refid="Base_Column_List"/>
FROM riddle_record FROM riddle_record
WHERE wx_group_id = #{wxGroupId} WHERE wx_group_id = #{wxGroupId}
<if test="status != null">
AND `status`= #{status}
</if>
ORDER BY ORDER BY
create_time DESC, id DESC create_time DESC, id DESC
LIMIT 1 LIMIT 1
...@@ -39,13 +42,15 @@ ...@@ -39,13 +42,15 @@
<select id="getCorrectCountByGroup" parameterType="map" resultType="Integer"> <select id="getCorrectCountByGroup" parameterType="map" resultType="Integer">
SELECT SELECT
COUNT(DISTINCT riddle_id) COUNT(DISTINCT riddle_id,finish_count)
FROM FROM
riddle_record riddle_record
WHERE WHERE
wx_group_id = #{wxGroupId} wx_group_id = #{wxGroupId}
AND finish_count = #{finishCount}
AND correct = 1 AND correct = 1
<if test="finishCount != null">
AND finish_count = #{finishCount}
</if>
</select> </select>
<select id="getParticipateCount" parameterType="String" resultType="com.pcloud.book.riddle.dto.GroupRiddleDTO"> <select id="getParticipateCount" parameterType="String" resultType="com.pcloud.book.riddle.dto.GroupRiddleDTO">
...@@ -59,4 +64,79 @@ ...@@ -59,4 +64,79 @@
AND correct IS NOT NULL AND correct IS NOT NULL
</select> </select>
<select id="getGroupRanking" parameterType="string" resultType="integer">
SELECT
b.rownum
FROM
(
SELECT
t.wx_group_id,
@rownum := @rownum + 1 AS rownum
FROM
(SELECT @rownum := 0) r,
(
SELECT
wx_group_id
FROM
riddle_record
WHERE
correct = 1
GROUP BY
wx_group_id
ORDER BY
COUNT(DISTINCT riddle_id,finish_count) DESC,
create_time DESC
) AS t
) AS b
WHERE
b.wx_group_id = #{wxGroupId}
</select>
<select id="getUserRanking" parameterType="map" resultType="com.pcloud.book.riddle.dto.UserRankingDTO">
SELECT
COUNT(DISTINCT riddle_id,finish_count) count,
wx_user_id wxUserId
FROM
riddle_record
WHERE
wx_group_id = #{wxGroupId}
AND correct = 1
AND create_time > #{createTime}
GROUP BY
wx_user_id
ORDER BY
COUNT(DISTINCT riddle_id,finish_count) DESC
</select>
<select id="getCorrectCountByTime" resultType="integer" parameterType="map">
SELECT
COUNT(DISTINCT riddle_id,finish_count)
FROM
riddle_record
WHERE
wx_group_id = #{wxGroupId}
AND correct = 1
AND create_time > #{createTime}
</select>
<!--连答对5题过关次数-->
<select id="getOverTime" resultType="integer" parameterType="string">
SELECT
COUNT(1)
FROM
riddle_record
WHERE
wx_group_id = #{wxGroupId}
AND `status` = 3
</select>
<select id="getCorrectGroupCount" resultType="integer">
SELECT
COUNT(DISTINCT wx_group_id)
FROM
riddle_record
WHERE
correct = 1
</select>
</mapper> </mapper>
\ No newline at end of file
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