Commit 6a3d5438 by 朱亚洁

猜谜语

parent e0a3d720
......@@ -22,5 +22,13 @@ public class RiddleConstant {
*/
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 {
/**
*进行中
*/
underway(2);
underway(2),
/**
* 通关结束
*/
over(3);
private Integer code;
......@@ -34,4 +38,6 @@ public enum RiddleRecordStatusEnum {
RiddleRecordStatusEnum(Integer code) {
this.code = code;
}
public static final Integer[] GAME_END = {end.code, over.code};
}
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.GroupRiddleDTO;
import com.pcloud.book.riddle.entity.RiddleClickRecord;
import com.pcloud.common.page.PageBeanNew;
import com.pcloud.wechatgroup.message.dto.SendTextDTO;
......@@ -67,4 +69,26 @@ public interface RiddleRecordBiz {
* @param 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;
import com.pcloud.book.base.exception.BookBizException;
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.dao.GroupQrcodeDao;
import com.pcloud.book.group.dto.GroupClassifyQrcodeDTO;
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.constants.RiddleConstant;
import com.pcloud.book.riddle.dao.RiddleClickRecordDao;
import com.pcloud.book.riddle.dao.RiddleDao;
import com.pcloud.book.riddle.dao.RiddleRecordDao;
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.GroupRiddleDTO;
import com.pcloud.book.riddle.dto.UserRankingDTO;
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.enums.RiddleClickTypeEnum;
import com.pcloud.book.riddle.enums.RiddleRecordStatusEnum;
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.page.PageBeanNew;
import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.httpclient.UrlUtils;
import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.facade.quartz.entity.CallBackParam;
import com.pcloud.facade.quartz.entity.ScheduleJob;
......@@ -33,12 +35,17 @@ import com.sdk.wxgroup.SendMessageTypeEnum;
import com.sdk.wxgroup.SendTextMessageVO;
import com.sdk.wxgroup.WxGroupSDK;
import org.apache.commons.lang3.ArrayUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -56,7 +63,10 @@ import java.util.TimerTask;
public class RiddleRecordBizImpl implements RiddleRecordBiz {
private static final Logger logger = LoggerFactory.getLogger(RiddleRecordBizImpl.class);
@Value("${wechat.group.link.prefix}")
private String wechatGroupLinkPrefix;
@Value("${system.env}")
private String envStr;
@Autowired
private RiddleDao riddleDao;
@Autowired
......@@ -64,19 +74,15 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
@Autowired
private RiddleReplyDao riddleReplyDao;
@Autowired
private BookGroupClassifyBiz bookGroupClassifyBiz;
@Autowired
private BookKeywordDao bookKeywordDao;
@Autowired
private WechatGroupConsr wechatGroupConsr;
@Autowired
private RiddleRedis riddleRedis;
@Autowired
private GroupQrcodeBiz groupQrcodeBiz;
@Autowired
private GroupQrcodeDao groupQrcodeDao;
@Autowired
private ScheduleService scheduleService;
@Autowired
private RiddleClickRecordDao riddleClickRecordDao;
@Override
......@@ -101,40 +107,16 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
}
}
//历史记录
RiddleRecord riddleRecord = riddleRecordDao.getLastRecordByWxGroupId(wxGroupId);
RiddleRecord riddleRecord = riddleRecordDao.getLastRecordByWxGroupId(wxGroupId, null);
//1该群猜谜语没有记录或已结束
if (null == riddleRecord || (null != riddleRecord && RiddleRecordStatusEnum.end.getCode().equals(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;
}
}
if (null == riddleRecord || (null != riddleRecord && ArrayUtils.contains(RiddleRecordStatusEnum.GAME_END, riddleRecord.getStatus()))) {
//1.1关键词“猜谜语” ,游戏开启,计时
if (textContent.equals("猜谜语")) {
startGame(currentRiddle, wxGroupId, wxId, ip, finishCount);
startGame(riddleRecord, wxGroupId, wxId, ip);
}
}
//2猜谜语进行中
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();
Long riddleId = riddleRecord.getRiddleId();
Riddle riddle = riddleDao.getById(riddleId);
......@@ -147,23 +129,23 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
insertRecord.setWxGroupId(wxGroupId);
insertRecord.setWxUserId(wxUserId);
insertRecord.setFinishCount(finishCount);
//2.2包含“结束”、“不想玩”,结束游戏
//2.1包含“结束”、“不想玩”,结束游戏
if (textContent.contains("结束") || textContent.contains("不想玩") || textContent.contains("不玩了")) {
endGame(insertRecord, wxGroupId, wxId, ip, riddle.getGrade(), finishCount);
return;
}
//2.3中途参与,上一条答对了发送下一题,否则发送当前题目
//2.2中途参与,上一条答对了发送下一题,否则发送当前题目
if (textContent.equals("猜谜语")) {
midwayIn(riddle, riddleRecord.getCorrect(), wxGroupId, wxId, ip, wxUserId, finishCount);
return;
}
//2.4不知道、提示、答案、正确答案,给提示语
//2.3不知道、提示、答案、正确答案,给提示语
if (textContent.contains("不知道") || textContent.contains("提示") || textContent.contains("答案") || textContent.contains("正确答案")) {
String before = "思考是件有趣的事哦,再想想吧。友情提示:可以问问其他人或者上网查询正确答案哦。";
sendWeixinTextMessage(wxId, wxGroupId, before, ip, wxUserId);
return;
}
//2.5判断答题对错
//2.4判断答题对错
judgeCorrcet(textContent, riddle, insertRecord, wxGroupId, wxId, ip, wxUserId, finishCount);
}
}
......@@ -195,7 +177,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
sendTextMessageVO.setAtId(wxUserId);
GroupUserDTO groupUser = wechatGroupConsr.getWxUserInfoByWxUserId(wxUserId);
if (null != groupUser && !StringUtil.isEmpty(groupUser.getNickName())) {
content = "@" + groupUser.getNickName() + "" + content;
content = "@" + groupUser.getNickName() + "" + content;
}
}
sendTextMessageVO.setContent(content);
......@@ -212,7 +194,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
if (StringUtil.isEmpty(beforeContent)) {
beforeContent = "接下来请听下一题:";
}
String sendText = beforeContent + riddle.getRiddleContent();
String sendText = beforeContent + riddle.getRiddleContent()+ "\n" + RiddleConstant.rule_notice;
sendWeixinTextMessage(wxId, wxGroupId, sendText, ip, wxUserId);
//添加记录
RiddleRecord insertRecord = new RiddleRecord();
......@@ -243,7 +225,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
riddleDTO.setUserNum(participateCountDTO.getUserNum() == 0 ? 0 : participateCountDTO.getUserNum());
riddleDTO.setParticipateCount(participateCountDTO.getParticipateCount() == 0 ? 0 : participateCountDTO.getParticipateCount());
}
RiddleRecord riddleRecord = riddleRecordDao.getLastRecordByWxGroupId(riddleDTO.getWxGroupId());
RiddleRecord riddleRecord = riddleRecordDao.getLastRecordByWxGroupId(riddleDTO.getWxGroupId(), null);
if (null != riddleRecord) {
Riddle riddle = riddleDao.getById(riddleRecord.getRiddleId());
riddleDTO.setGrade(riddle.getGrade());
......@@ -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());
Integer correctCount = riddleRecordDao.getCorrectCountByGroup(wxGroupId, finishCount);
if (null != currentRiddle) {
reply = reply + "\n" + "目前处于第" + currentRiddle.getGrade() + "关,已猜对" + correctCount + "题,大家加油。";
} else {
reply = reply + "\n" + "目前处于第1关,已猜对0题,大家加油。";
}
Integer ranking = riddleRecordDao.getGroupRanking(wxGroupId);
reply = reply + "\n" + "目前本群总共猜对" + correctCount + "题,群排名第" + ranking + "名,大家加油。";
sendWeixinTextMessage(wxId, wxGroupId, reply, ip, null);
//发送题目,保存该题目
if (null != currentRiddle) {//发送上次题目
String content = "请听题:" + currentRiddle.getRiddleContent();
String content = "请听题:" + currentRiddle.getRiddleContent() + "\n" + RiddleConstant.rule_notice;
sendWeixinTextMessage(wxId, wxGroupId, content, ip, null);
RiddleRecord insertRecord = new RiddleRecord();
insertRecord.setRiddleId(currentRiddle.getId());
......@@ -290,10 +290,9 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
} else {//从第一题开始
sendNextRiddle(1, 0, wxGroupId, wxId, ip, RiddleRecordStatusEnum.begin, "请听题:", null, finishCount);
}
//开始5分钟/10s计时
//开始5分钟计时
deleteJob(wxGroupId);
addEndQuartzJob(wxGroupId, wxId, ip, wxId);
riddleRedis.addUnderwayGroup(wxGroupId, wxId, ip);
}
/**
......@@ -301,7 +300,8 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
*/
public void endGame(RiddleRecord insertRecord, String wxGroupId, String wxId, String ip, Integer grade, Integer 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);
//保存结束记录
......@@ -310,7 +310,6 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
insertRecord.setCorrect(null);
riddleRecordDao.insert(insertRecord);
deleteJob(wxGroupId);
riddleRedis.deleteUnderwayGroup(wxGroupId);
}
/**
......@@ -324,11 +323,12 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
if (riddle.getGrade() < 3) {//从下一关第一题开始
sendNextRiddle(riddle.getGrade() + 1, 0, wxGroupId, wxId, ip, RiddleRecordStatusEnum.underway, beforeContent, wxUserId, finishCount);
} 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 {
sendWeixinTextMessage(wxId, wxGroupId, beforeContent + riddle.getRiddleContent(), ip, wxUserId);
} else {//发送当前题
String content = beforeContent + riddle.getRiddleContent() + "\n" + RiddleConstant.rule_notice;
sendWeixinTextMessage(wxId, wxGroupId, content, ip, wxUserId);
}
deleteJob(wxGroupId);
addEndQuartzJob(wxGroupId, wxId, ip, wxId);
......@@ -343,24 +343,45 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
return;
}
if (textContent.equals(riddle.getAnswer()) || textContent.equals(riddle.getOtherAnswer())) {//答对
//答对文案
String beforeContent = getRandomReply(RiddleReplyTypeEnum.correct.getCode());
//保存答题记录
insertRecord.setMessageContent(textContent);
insertRecord.setCorrect(true);
insertRecord.setStatus(RiddleRecordStatusEnum.underway.getCode());
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 (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关都答完
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);
addEndQuartzJob(wxGroupId, wxId, ip, wxUserId);
}
} else if (riddle.getAnswer().contains(textContent) || textContent.contains(riddle.getAnswer())//部分答对
|| (!StringUtil.isEmpty(riddle.getOtherAnswer()) && textContent.contains(riddle.getOtherAnswer()))) {
//保存答题记录
......@@ -370,6 +391,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
riddleRecordDao.insert(insertRecord);
//发送部分答对文案
String beforeContent = getRandomReply(RiddleReplyTypeEnum.partly_correct.getCode());
beforeContent = beforeContent + "谜底是" + riddle.getAnswer().length() + "个字哦。";
sendWeixinTextMessage(wxId, wxGroupId, beforeContent, ip, null);
} else {//答错
......@@ -390,7 +412,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
* 自动结束
*/
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) {
logger.info("微信群=" + wxGroupId + "没有猜谜语游戏记录");
return;
......@@ -401,11 +423,13 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
logger.info("谜语=" + riddleId + "不存在");
return;
}
Integer grade = riddle.getGrade();
Integer correctCount = riddleRecordDao.getCorrectCountByGroup(wxGroupId, riddleRecord.getFinishCount());
Integer ranking = riddleRecordDao.getGroupRanking(wxGroupId);
String reply = getRandomReply(RiddleReplyTypeEnum.no_reply_end.getCode());
String text = reply + "目前本群猜对谜语数" + correctCount + "道,处于第" + grade + "关。"
+ "\n" + "大家想玩记得回复关键词“猜谜语”,我等你们哦。";
String text = reply + "目前本群总共猜对" + correctCount + "题,群排名第" + ranking + "名,大家加油。";
if (!text.contains("关键词")) {
text = text + "想玩记得回复关键词“猜谜语”就可以召唤我啦。";
}
//发送结束语
sendWeixinTextMessage(wxId, wxGroupId, text, ip, null);
//保存结束记录
......@@ -418,7 +442,6 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
record.setCorrect(null);
record.setFinishCount(riddleRecord.getFinishCount());
riddleRecordDao.insert(record);
riddleRedis.deleteUnderwayGroup(wxGroupId);
}
......@@ -474,7 +497,7 @@ public class RiddleRecordBizImpl implements RiddleRecordBiz {
return;
}
String wxGroupId = groupRedisDTO.getWxGroupId();
RiddleRecord record = riddleRecordDao.getLastRecordByWxGroupId(wxGroupId);
RiddleRecord record = riddleRecordDao.getLastRecordByWxGroupId(wxGroupId, null);
if (null == record) {
return;
}
......@@ -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后发送答错文案
......@@ -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> {
* @return
*/
Riddle getRiddleByGradeAndSeq(Integer grade, Integer seq);
/**
* 获取所有题目数量
* @return
*/
Integer getCount();
}
package com.pcloud.book.riddle.dao;
import com.pcloud.book.riddle.dto.GroupRiddleDTO;
import com.pcloud.book.riddle.dto.UserRankingDTO;
import com.pcloud.book.riddle.entity.RiddleRecord;
import com.pcloud.common.core.dao.BaseDao;
import java.util.Date;
import java.util.List;
/**
* @描述:猜谜记录
* @作者:zhuyajie
......@@ -16,9 +20,10 @@ public interface RiddleRecordDao extends BaseDao<RiddleRecord> {
/**
* 获取上一条猜谜记录
* @param wxGroupId
* @param status 状态
* @return
*/
RiddleRecord getLastRecordByWxGroupId(String wxGroupId);
RiddleRecord getLastRecordByWxGroupId(String wxGroupId, Integer status);
/**
* 获得答对题目数量
......@@ -33,4 +38,39 @@ public interface RiddleRecordDao extends BaseDao<RiddleRecord> {
* @return
*/
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 {
map.put("seq",seq);
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;
import com.pcloud.book.riddle.dao.RiddleRecordDao;
import com.pcloud.book.riddle.dto.GroupRiddleDTO;
import com.pcloud.book.riddle.dto.UserRankingDTO;
import com.pcloud.book.riddle.entity.RiddleRecord;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
......@@ -21,8 +24,11 @@ public class RiddleRecordDaoImpl extends BaseDaoImpl<RiddleRecord> implements Ri
@Override
public RiddleRecord getLastRecordByWxGroupId(String wxGroupId) {
return getSessionTemplate().selectOne(getStatement("getLastRecordByWxGroupId"), wxGroupId);
public RiddleRecord getLastRecordByWxGroupId(String wxGroupId, Integer status) {
Map<String, Object> map = new HashMap<>();
map.put("wxGroupId", wxGroupId);
map.put("status", status);
return getSessionTemplate().selectOne(getStatement("getLastRecordByWxGroupId"), map);
}
@Override
......@@ -37,4 +43,39 @@ public class RiddleRecordDaoImpl extends BaseDaoImpl<RiddleRecord> implements Ri
public GroupRiddleDTO getParticipateCount(String 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;
import com.pcloud.book.base.exception.BookBizException;
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.RiddleOpenDTO;
import com.pcloud.book.riddle.entity.RiddleClickRecord;
import com.pcloud.common.dto.ResponseDto;
import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.permission.PermissionException;
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 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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
......@@ -39,14 +44,14 @@ public class RiddleFacade {
@Autowired
private RiddleRecordBiz riddleRecordBiz;
@ApiOperation("发送信息")
@ApiOperation(value = "发送信息", httpMethod = "POST")
@PostMapping("sendText")
public ResponseDto<?> sendText(@RequestBody @ApiParam SendTextDTO sendTextDTO){
riddleRecordBiz.riddleProcess(sendTextDTO);
return new ResponseDto<>();
}
@ApiOperation("猜谜语详情列表")
@ApiOperation(value = "猜谜语详情列表",httpMethod = "GET")
@ApiImplicitParams({
@ApiImplicitParam(name = "name", value = "name", required = false, dataType = "string", paramType = "query"),
@ApiImplicitParam(name = "currentPage", value = "当前页", required = true, dataType = "int", paramType = "query"),
......@@ -64,7 +69,7 @@ public class RiddleFacade {
return new ResponseDto<>(pageBean);
}
@ApiOperation("更新猜谜语状态")
@ApiOperation(value = "更新猜谜语状态",httpMethod = "POST")
@PostMapping("updateRiddleOpenStatus")
public ResponseDto<?> updateRiddleOpenStatus(@RequestHeader("token") String token, @RequestBody @ApiParam RiddleOpenDTO riddleOpenDTO) throws PermissionException {
SessionUtil.getToken4Redis(token);
......@@ -79,4 +84,32 @@ public class RiddleFacade {
riddleRecordBiz.updateRiddleOpenStatus(qrcodeId, status);
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 {
* 添加答题中的群
* @param wxGroupId
*/
public void addUnderwayGroup(String wxGroupId, String wxId, String ip) {
/*public void addUnderwayGroup(String wxGroupId, String wxId, String ip) {
GroupRedisDTO dto = new GroupRedisDTO();
dto.setWxGroupId(wxGroupId);
dto.setWxId(wxId);
......@@ -66,13 +66,13 @@ public class RiddleRedis {
}
}
JedisClusterUtils.setJsonList(underway_group, list);
}
}*/
/**
* 获取答题中的群
* @return
*/
public List<GroupRedisDTO> getUnderwayGroup() {
/* public List<GroupRedisDTO> getUnderwayGroup() {
List<GroupRedisDTO> list = JedisClusterUtils.getJsonList(underway_group, GroupRedisDTO.class);
if (ListUtils.isEmpty(list)) {
list = new ArrayList<>();
......@@ -85,12 +85,12 @@ public class RiddleRedis {
}
return list;
}
*/
/**
* 删除答题中的群
* @param wxGroupId
*/
public void deleteUnderwayGroup(String wxGroupId) {
/*public void deleteUnderwayGroup(String wxGroupId) {
List<GroupRedisDTO> list = getUnderwayGroup();
if (!ListUtils.isEmpty(list)) {
for (int i = 0; i < list.size() && null != list; i++) {
......@@ -109,6 +109,6 @@ public class RiddleRedis {
list.add(dto);
}
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 @@
WHERE id = #{id}
</select>
<select id="getCount" resultType="integer">
SELECT
COUNT(1)
FROM
riddle
</select>
</mapper>
\ No newline at end of file
......@@ -19,19 +19,22 @@
<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,
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},
NOW(), #{finishCount})
</insert>
<select id="getLastRecordByWxGroupId" resultMap="BaseResultMap" parameterType="String">
<select id="getLastRecordByWxGroupId" resultMap="BaseResultMap" parameterType="map">
SELECT
<include refid="Base_Column_List"/>
FROM riddle_record
WHERE wx_group_id = #{wxGroupId}
<if test="status != null">
AND `status`= #{status}
</if>
ORDER BY
create_time DESC, id DESC
LIMIT 1
......@@ -39,13 +42,15 @@
<select id="getCorrectCountByGroup" parameterType="map" resultType="Integer">
SELECT
COUNT(DISTINCT riddle_id)
COUNT(DISTINCT riddle_id,finish_count)
FROM
riddle_record
WHERE
wx_group_id = #{wxGroupId}
AND finish_count = #{finishCount}
AND correct = 1
<if test="finishCount != null">
AND finish_count = #{finishCount}
</if>
</select>
<select id="getParticipateCount" parameterType="String" resultType="com.pcloud.book.riddle.dto.GroupRiddleDTO">
......@@ -59,4 +64,79 @@
AND correct IS NOT NULL
</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>
\ 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