Commit bbd5cd3e by 朱亚洁

猜谜语

parent cbc4a913
package com.pcloud.book.riddle;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.Map;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* @描述:猜谜语接口
* @作者:zhuyajie
* @创建时间:16:24 2019/8/5
* @版本:1.0
*/
@FeignClient(value = "pcloud-service-book", qualifier = "riddleServiceCloud", path = "book/v1.0/riddleService")
@Api(description = "猜谜语接口")
public interface RiddleService {
@ApiOperation(value = "定时器调用游戏结束接口", httpMethod = "POST")
@RequestMapping(value = "/riddleEndQuartz", method = RequestMethod.POST)
public void riddleEndQuartz(@RequestBody Map<String, Object> map);
}
package com.pcloud.book.riddle.constants;
/**
* @描述:猜谜语常量
* @作者:zhuyajie
* @创建时间:17:36 2019/7/29
* @版本:1.0
*/
public class RiddleConstant {
/**
* 10s
*/
public static Integer expire_seconds = 12;
/**
* 定时器类型名称
*/
public static final String JOB_GROUP_RIDDLE = "riddle";
/**
* 到期定时器方法名
*/
public static final String JOB_NAME_RIDDLE_EXPIRE = "judgeRiddleTime";
}
package com.pcloud.book.riddle.enums;
/**
* @描述:猜谜进度状态
* @作者:zhuyajie
* @创建时间:10:14 2019/7/25
* @版本:1.0
*/
public enum RiddleRecordStatusEnum {
/**
* 开始
*/
begin(0),
/**
*结束
*/
end(1),
/**
*进行中
*/
underway(2);
private Integer code;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
RiddleRecordStatusEnum(Integer code) {
this.code = code;
}
}
package com.pcloud.book.riddle.enums;
/**
* @描述:回复文案类型
* @作者:zhuyajie
* @创建时间:16:56 2019/7/24
* @版本:1.0
*/
public enum RiddleReplyTypeEnum {
/**
* 游戏规则
*/
rule("rule"),
/**
* 无人回复的结束语
*/
no_reply_end("no_reply_end"),
/**
* 答完全部题结束语
*/
finish_end("finish_end"),
/**
* 中途回复关键词
*/
midway_in("midway_in"),
/**
* 答对
*/
correct("correct"),
/**
* 答错
*/
incorrect("incorrect"),
/**
* 部分正确
*/
partly_correct("partly_correct");
private String code;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
RiddleReplyTypeEnum(String code) {
this.code = code;
}
}
......@@ -2,12 +2,14 @@ package com.pcloud.book.consumer.wechatgroup;
import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.dto.ResponseDto;
import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.ResponseHandleUtil;
import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.wechatgroup.group.dto.GroupMemberStatisDTO;
import com.pcloud.wechatgroup.group.dto.GroupRobotDTO;
import com.pcloud.wechatgroup.group.dto.GroupUserDTO;
import com.pcloud.wechatgroup.group.dto.RobotReplyDTO;
import com.pcloud.wechatgroup.group.service.GroupMemberService;
import com.pcloud.wechatgroup.message.dto.GroupChatCountDTO;
......@@ -15,6 +17,7 @@ import com.pcloud.wechatgroup.message.service.MessageService;
import com.pcloud.wechatgroup.monitor.service.MonitorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
......@@ -267,4 +270,16 @@ public class WechatGroupConsr {
}
return map;
}
@ParamLog("根据用户微信ID获取用户信息")
public GroupUserDTO getWxUserInfoByWxUserId(String wxUserId) {
GroupUserDTO dto = new GroupUserDTO();
try {
dto = ResponseHandleUtil.parseResponse(groupMemberService.getWxUserInfoByWxId(wxUserId), GroupUserDTO.class);
} catch (Exception e) {
log.error("根据用户微信ID获取用户信息.[getWxUserInfoByWxId]:" + e.getMessage(), e);
}
return dto;
}
}
......@@ -10,6 +10,7 @@ import com.pcloud.book.group.vo.GroupQrcodeBookVO;
import com.pcloud.book.group.vo.ListGroupQrcodeResponseVO;
import com.pcloud.book.group.vo.ListQrcodeByClassifyParamVO;
import com.pcloud.book.group.vo.UpdateGroupQrcodeRequestVO;
import com.pcloud.book.riddle.dto.GroupRiddleDTO;
import com.pcloud.common.page.PageBeanNew;
import java.util.List;
......@@ -130,4 +131,14 @@ public interface GroupQrcodeBiz {
* @return
*/
PageBeanNew<GroupQrcodeBookVO> listQrcodeByAdviser(Integer currentPage, Integer numPerPage, String name, Long adviserId);
/**
* 猜谜语列表
* @param partyId
* @param currentPage
* @param numPerPage
* @param name
* @return
*/
PageBeanNew<GroupRiddleDTO> listPageRiddle(Long partyId, Integer currentPage, Integer numPerPage, String name);
}
......@@ -47,7 +47,7 @@ import com.pcloud.common.utils.cache.redis.JedisClusterUtils;
import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.usercenter.party.adviser.dto.AdviserBaseInfoDto;
import com.sdk.wxgroup.WxGroupSDK;
import com.pcloud.book.riddle.dto.GroupRiddleDTO;
import org.apache.commons.collections4.MapUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -491,5 +491,47 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
return pageBeanNew;
}
@Override
public PageBeanNew<GroupRiddleDTO> listPageRiddle(Long partyId, Integer currentPage, Integer numPerPage, String name) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("partyId", partyId);
paramMap.put("name", name);
PageBeanNew<GroupRiddleDTO> pageBeanNew = groupQrcodeDao.listPageNew(new PageParam(currentPage, numPerPage), paramMap, "listPageRiddle");
if (null == pageBeanNew || ListUtils.isEmpty(pageBeanNew.getRecordList())) {
return new PageBeanNew<>(currentPage, numPerPage, 0, new ArrayList<>());
}
//标签
Map<Long, String> labelMap = new HashMap<>();
List<Long> labelIds = new ArrayList<>();
List<Long> proLabels = pageBeanNew.getRecordList().stream().filter(s -> s.getProLabelId() != null).map(GroupRiddleDTO::getProLabelId).distinct().collect(Collectors.toList());
List<Long> depLabels = pageBeanNew.getRecordList().stream().filter(s -> s.getDepLabelId() != null).map(GroupRiddleDTO::getDepLabelId).distinct().collect(Collectors.toList());
List<Long> purLabels = pageBeanNew.getRecordList().stream().filter(s -> s.getPurLabelId() != null).map(GroupRiddleDTO::getPurLabelId).distinct().collect(Collectors.toList());
if (!ListUtils.isEmpty(proLabels)) {
labelIds.addAll(proLabels);
}
if (!ListUtils.isEmpty(depLabels)) {
labelIds.addAll(depLabels);
}
if (!ListUtils.isEmpty(purLabels)) {
labelIds.addAll(purLabels);
}
if (!ListUtils.isEmpty(labelIds)) {
labelMap = labelConsr.getLabelName(labelIds);
}
if (!MapUtils.isEmpty(labelMap)) {
for (GroupRiddleDTO riddleDTO : pageBeanNew.getRecordList()) {
if (null != riddleDTO.getProLabelId() && labelMap.containsKey(riddleDTO.getProLabelId())) {
riddleDTO.setProLabelName(labelMap.get(riddleDTO.getProLabelId()));
}
if (null != riddleDTO.getDepLabelId() && labelMap.containsKey(riddleDTO.getDepLabelId())) {
riddleDTO.setDepLabelName(labelMap.get(riddleDTO.getDepLabelId()));
}
if (null != riddleDTO.getPurLabelId() && labelMap.containsKey(riddleDTO.getPurLabelId())) {
riddleDTO.setPurLabelName(labelMap.get(riddleDTO.getPurLabelId()));
}
}
}
return pageBeanNew;
}
}
......@@ -196,4 +196,12 @@ public interface GroupQrcodeDao extends BaseDao<GroupQrcode> {
* 根据分类id集合查询
*/
List<GroupQrcodeFoAdDTO> GroupQrcodeFoAdDTOSByClassifyIds(List<Long> classifyIds);
/**
* 修改猜谜语开启状态
* @param qrcodeId
* @param status
*/
void updateRiddleOpenStatus(Long qrcodeId, Boolean status);
}
......@@ -188,4 +188,13 @@ public class GroupQrcodeDaoImpl extends BaseDaoImpl<GroupQrcode> implements Grou
public List<GroupQrcodeFoAdDTO> GroupQrcodeFoAdDTOSByClassifyIds(List<Long> classifyIds) {
return this.getSqlSession().selectList(this.getStatement("GroupQrcodeFoAdDTOSByClassifyIds"), classifyIds);
}
@Override
public void updateRiddleOpenStatus(Long qrcodeId, Boolean status) {
Map<String, Object> map = new HashMap<>();
map.put("qrcodeId", qrcodeId);
map.put("status", status);
getSessionTemplate().update(getStatement("updateRiddleOpenStatus"), map);
}
}
......@@ -80,6 +80,10 @@ public class GroupQrcode extends BaseEntity {
* 修改用户
*/
private Long updateUser;
/**
* 猜谜语是否开启
*/
private Boolean riddleOpen;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
......@@ -231,6 +235,14 @@ public class GroupQrcode extends BaseEntity {
this.qrcodeState = qrcodeState;
}
public Boolean getRiddleOpen() {
return riddleOpen;
}
public void setRiddleOpen(Boolean riddleOpen) {
this.riddleOpen = riddleOpen;
}
@Override
public String toString() {
return "GroupQrcode{" +
......@@ -243,12 +255,15 @@ public class GroupQrcode extends BaseEntity {
", weixinGroupId='" + weixinGroupId + '\'' +
", qrcodeUrl='" + qrcodeUrl + '\'' +
", useState=" + useState +
", qrcodeState=" + qrcodeState +
", changeNameState=" + changeNameState +
", isDelete=" + isDelete +
", createUser=" + createUser +
", updateUser=" + updateUser +
", riddleOpen=" + riddleOpen +
", createTime=" + createTime +
", updateTime=" + updateTime +
", qrcodeHeadUrl='" + qrcodeHeadUrl + '\'' +
'}';
}
}
......@@ -2,10 +2,7 @@ package com.pcloud.book.group.service.impl;
import com.pcloud.book.group.biz.BookGroupClassifyBiz;
import com.pcloud.book.group.biz.GroupQrcodeBiz;
import com.pcloud.book.group.dto.GroupClassifyQrcodeDTO;
import com.pcloud.book.group.dto.GroupQrcodeBaseDTO;
import com.pcloud.book.group.dto.GroupQrcodeInfo4Advertising;
import com.pcloud.book.group.dto.ProAssocGroupAndUserNumberDTO;
import com.pcloud.book.group.dto.*;
import com.pcloud.book.group.service.BookGroupClassifyService;
import com.pcloud.common.dto.ResponseDto;
import com.pcloud.common.utils.ResponseHandleUtil;
......
......@@ -6,6 +6,7 @@ import com.pcloud.book.clock.dto.BookClockInfoDTO;
import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr;
import com.pcloud.book.keywords.biz.BookKeywordBiz;
import com.pcloud.book.mq.config.MQTopicConumer;
import com.pcloud.book.riddle.biz.RiddleRecordBiz;
import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.utils.ListUtils;
......@@ -18,9 +19,7 @@ import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
/**
......@@ -33,7 +32,6 @@ import lombok.extern.slf4j.Slf4j;
public class WxGroupSendTextListener {
private static final Logger LOGGER = LoggerFactory.getLogger(WxGroupSendTextListener.class);
@Autowired
private BookKeywordBiz bookKeywordBiz;
@Autowired
......@@ -42,6 +40,8 @@ public class WxGroupSendTextListener {
private BookClockKeywordBiz bookClockKeywordBiz;
@Autowired
private BookClockCheck bookClockCheck;
@Autowired
private RiddleRecordBiz riddleRecordBiz;
/**
* 接收微信用户进群消息
......@@ -64,9 +64,12 @@ public class WxGroupSendTextListener {
bookKeywordBiz.sendKeywordMessage(sendTextDTO.getTextContent().trim(), sendTextDTO.getWechatGroupId(), wechatUserId, sendTextDTO.getWxId(), sendTextDTO.getIp());
log.info("[接收用户发送文本消息] 总耗时:{}ms ", System.currentTimeMillis() - l);
}
//猜谜语
riddleRecordBiz.riddleProcess(sendTextDTO);
}
} catch (Exception e) {
LOGGER.error("接收用户发送文本消息失败" + e.getMessage(), e);
}
}
}
package com.pcloud.book.riddle.biz;
import com.pcloud.book.riddle.dto.GroupRedisDTO;
import com.pcloud.book.riddle.dto.GroupRiddleDTO;
import com.pcloud.common.page.PageBeanNew;
import com.pcloud.wechatgroup.message.dto.SendTextDTO;
/**
* @描述:猜谜过程
* @作者:zhuyajie
* @创建时间:18:20 2019/7/24
* @版本:1.0
*/
public interface RiddleRecordBiz {
/**
* 猜谜过程
* @param sendTextDTO
*/
public void riddleProcess(SendTextDTO sendTextDTO);
/**
* 猜谜语详情列表
* @param partyId
* @param currentPage
* @param numPerPage
* @param name
* @return
*/
PageBeanNew<GroupRiddleDTO> listPage(Long partyId, Integer currentPage, Integer numPerPage, String name);
/**
* 修改猜谜语开启状态
* @param qrcodeId
* @param status
*/
void updateRiddleOpenStatus(Long qrcodeId, Boolean status);
/**
* 自动结束
* @param wxGroupId
* @param wxId
* @param ip
* @param wxUserId
*/
public void autoEnd(String wxGroupId, String wxId, String ip, String wxUserId);
/**
* 根据类型查回复语
* @param type
* @return
*/
public String getRandomReply(String type);
/**
* 发文本消息
* @param wxId
* @param wxGroupId
* @param content
* @param ip
* @param wxUserId
*/
public void sendWeixinTextMessage(String wxId, String wxGroupId, String content, String ip, String wxUserId);
/**
* 发送答错文案
* @param groupRedisDTO
*/
public void sendIncorrectMessage(GroupRedisDTO groupRedisDTO);
}
package com.pcloud.book.riddle.dao;
import com.pcloud.book.riddle.entity.Riddle;
import com.pcloud.common.core.dao.BaseDao;
/**
* @描述:
* @作者:zhuyajie
* @创建时间:16:47 2019/7/24
* @版本:1.0
*/
public interface RiddleDao extends BaseDao<Riddle> {
/**
* 根据等级和序号查下一个谜面
* @param grade
* @param seq
* @return
*/
Riddle getRiddleByGradeAndSeq(Integer grade, Integer seq);
}
package com.pcloud.book.riddle.dao;
import com.pcloud.book.riddle.dto.GroupRiddleDTO;
import com.pcloud.book.riddle.entity.RiddleRecord;
import com.pcloud.common.core.dao.BaseDao;
/**
* @描述:猜谜记录
* @作者:zhuyajie
* @创建时间:18:18 2019/7/24
* @版本:1.0
*/
public interface RiddleRecordDao extends BaseDao<RiddleRecord> {
/**
* 获取上一条猜谜记录
* @param wxGroupId
* @return
*/
RiddleRecord getLastRecordByWxGroupId(String wxGroupId);
/**
* 获得答对题目数量
* @param wxGroupId
* @return
*/
Integer getCorrectCountByGroup(String wxGroupId, Integer finishCount);
/**
* 获取参与次数、人数
* @param wxGroupId
* @return
*/
public GroupRiddleDTO getParticipateCount(String wxGroupId);
}
package com.pcloud.book.riddle.dao;
import com.pcloud.book.riddle.entity.RiddleReply;
import com.pcloud.common.core.dao.BaseDao;
import java.util.List;
/**
* @描述:回复文案
* @作者:zhuyajie
* @创建时间:16:58 2019/7/24
* @版本:1.0
*/
public interface RiddleReplyDao extends BaseDao<RiddleReply> {
/**
* 根据类型获取回复语
* @param code
* @return
*/
List<String> getReplyByType(String code);
}
package com.pcloud.book.riddle.dao.impl;
import com.pcloud.book.riddle.dao.RiddleDao;
import com.pcloud.book.riddle.entity.Riddle;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
* @描述:
* @作者:zhuyajie
* @创建时间:16:47 2019/7/24
* @版本:1.0
*/
@Component("riddleDao")
public class RiddleDaoImpl extends BaseDaoImpl<Riddle> implements RiddleDao {
@Override
public Riddle getRiddleByGradeAndSeq(Integer grade, Integer seq) {
Map<String,Object> map = new HashMap<>();
map.put("grade",grade);
map.put("seq",seq);
return getSessionTemplate().selectOne(getStatement("getRiddleByGradeAndSeq"),map);
}
}
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.entity.RiddleRecord;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
* @描述:猜谜记录
* @作者:zhuyajie
* @创建时间:18:19 2019/7/24
* @版本:1.0
*/
@Component("riddleRecordDao")
public class RiddleRecordDaoImpl extends BaseDaoImpl<RiddleRecord> implements RiddleRecordDao {
@Override
public RiddleRecord getLastRecordByWxGroupId(String wxGroupId) {
return getSessionTemplate().selectOne(getStatement("getLastRecordByWxGroupId"), wxGroupId);
}
@Override
public Integer getCorrectCountByGroup(String wxGroupId, Integer finishCount) {
Map<String, Object> map = new HashMap<>();
map.put("wxGroupId", wxGroupId);
map.put("finishCount", finishCount);
return getSessionTemplate().selectOne(getStatement("getCorrectCountByGroup"), map);
}
@Override
public GroupRiddleDTO getParticipateCount(String wxGroupId) {
return getSessionTemplate().selectOne(getStatement("getParticipateCount"), wxGroupId);
}
}
package com.pcloud.book.riddle.dao.impl;
import com.pcloud.book.riddle.dao.RiddleReplyDao;
import com.pcloud.book.riddle.entity.RiddleReply;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @描述:回复文案
* @作者:zhuyajie
* @创建时间:16:58 2019/7/24
* @版本:1.0
*/
@Component("riddleReplyDao")
public class RiddleReplyDaoImpl extends BaseDaoImpl<RiddleReply> implements RiddleReplyDao {
@Override
public List<String> getReplyByType(String code) {
return getSessionTemplate().selectList(getStatement("getReplyByType"),code);
}
}
package com.pcloud.book.riddle.dto;
/**
* @描述:
* @作者:zhuyajie
* @创建时间:11:58 2019/8/8
* @版本:1.0
*/
public class GroupRedisDTO {
private String wxGroupId;
private String wxId;
private String ip;
public String getWxGroupId() {
return wxGroupId;
}
public void setWxGroupId(String wxGroupId) {
this.wxGroupId = wxGroupId;
}
public String getWxId() {
return wxId;
}
public void setWxId(String wxId) {
this.wxId = wxId;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
@Override
public String toString() {
return "GroupRedisDTO{" +
"wxGroupId='" + wxGroupId + '\'' +
", wxId='" + wxId + '\'' +
", ip='" + ip + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
GroupRedisDTO dto = (GroupRedisDTO) o;
return wxGroupId.equals(dto.wxGroupId);
}
}
package com.pcloud.book.riddle.dto;
import com.pcloud.common.dto.BaseDto;
/**
* @描述:编辑端猜谜语详情
* @作者:zhuyajie
* @创建时间:20:48 2019/7/31
* @版本:1.0
*/
public class GroupRiddleDTO extends BaseDto{
/**
* 微信群名称
*/
private String groupName;
/**
* 群二维码id
*/
private Long groupQrcodeId;
/**
* 微信群id
*/
private String wxGroupId;
/**
* 群分类
*/
private String classify;
/**
*社群码名称
*/
private String groupQrcodeName;
/**
* 图书名
*/
private String bookName;
/**
* 专业标签ID
*/
private Long proLabelId;
/**
* 专业标签名称
*/
private String proLabelName;
/**
* 深度标签ID
*/
private Long depLabelId;
/**
* 深度标签名称
*/
private String depLabelName;
/**
* 目的标签ID
*/
private Long purLabelId;
/**
* 目的标签名称
*/
private String purLabelName;
/**
* 关卡等级
*/
private Integer grade;
/**
* 猜中题数
*/
private Integer correctCount;
/**
* 参与人数
*/
private Integer userNum;
/**
* 参与次数
*/
private Integer participateCount;
/**
* 开启状态
*/
private Boolean riddleOpen;
/**
* 通关次数
*/
private Integer finishCount;
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
public Long getGroupQrcodeId() {
return groupQrcodeId;
}
public void setGroupQrcodeId(Long groupQrcodeId) {
this.groupQrcodeId = groupQrcodeId;
}
public String getWxGroupId() {
return wxGroupId;
}
public void setWxGroupId(String wxGroupId) {
this.wxGroupId = wxGroupId;
}
public String getClassify() {
return classify;
}
public void setClassify(String classify) {
this.classify = classify;
}
public String getGroupQrcodeName() {
return groupQrcodeName;
}
public void setGroupQrcodeName(String groupQrcodeName) {
this.groupQrcodeName = groupQrcodeName;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public Long getProLabelId() {
return proLabelId;
}
public void setProLabelId(Long proLabelId) {
this.proLabelId = proLabelId;
}
public String getProLabelName() {
return proLabelName;
}
public void setProLabelName(String proLabelName) {
this.proLabelName = proLabelName;
}
public Long getDepLabelId() {
return depLabelId;
}
public void setDepLabelId(Long depLabelId) {
this.depLabelId = depLabelId;
}
public String getDepLabelName() {
return depLabelName;
}
public void setDepLabelName(String depLabelName) {
this.depLabelName = depLabelName;
}
public Long getPurLabelId() {
return purLabelId;
}
public void setPurLabelId(Long purLabelId) {
this.purLabelId = purLabelId;
}
public String getPurLabelName() {
return purLabelName;
}
public void setPurLabelName(String purLabelName) {
this.purLabelName = purLabelName;
}
public Integer getGrade() {
return grade;
}
public void setGrade(Integer grade) {
this.grade = grade;
}
public Integer getCorrectCount() {
return correctCount;
}
public void setCorrectCount(Integer correctCount) {
this.correctCount = correctCount;
}
public Integer getUserNum() {
return userNum;
}
public void setUserNum(Integer userNum) {
this.userNum = userNum;
}
public Integer getParticipateCount() {
return participateCount;
}
public void setParticipateCount(Integer participateCount) {
this.participateCount = participateCount;
}
public Boolean getRiddleOpen() {
return riddleOpen;
}
public void setRiddleOpen(Boolean riddleOpen) {
this.riddleOpen = riddleOpen;
}
public Integer getFinishCount() {
return finishCount;
}
public void setFinishCount(Integer finishCount) {
this.finishCount = finishCount;
}
@Override
public String toString() {
return "GroupRiddleDTO{" +
"groupName='" + groupName + '\'' +
", groupQrcodeId=" + groupQrcodeId +
", wxGroupId='" + wxGroupId + '\'' +
", classify='" + classify + '\'' +
", groupQrcodeName='" + groupQrcodeName + '\'' +
", bookName='" + bookName + '\'' +
", proLabelId=" + proLabelId +
", proLabelName='" + proLabelName + '\'' +
", depLabelId=" + depLabelId +
", depLabelName='" + depLabelName + '\'' +
", purLabelId=" + purLabelId +
", purLabelName='" + purLabelName + '\'' +
", grade=" + grade +
", correctCount=" + correctCount +
", userNum=" + userNum +
", participateCount=" + participateCount +
", riddleOpen=" + riddleOpen +
'}';
}
}
package com.pcloud.book.riddle.dto;
import com.pcloud.common.dto.BaseDto;
/**
* @描述:猜谜语开启状态
* @作者:zhuyajie
* @创建时间:21:51 2019/7/31
* @版本:1.0
*/
public class RiddleOpenDTO extends BaseDto{
/**
* 群id
*/
private Long groupQrcodeId;
/**
* 开启状态
*/
private Boolean status;
public Long getGroupQrcodeId() {
return groupQrcodeId;
}
public void setGroupQrcodeId(Long groupQrcodeId) {
this.groupQrcodeId = groupQrcodeId;
}
public Boolean getStatus() {
return status;
}
public void setStatus(Boolean status) {
this.status = status;
}
@Override
public String toString() {
return "RiddleOpenDTO{" +
"groupQrcodeId=" + groupQrcodeId +
", status=" + status +
'}';
}
}
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 Riddle extends BaseEntity{
@ApiModelProperty("谜面")
private String riddleContent;
@ApiModelProperty("谜底")
private String answer;
@ApiModelProperty("备选谜底")
private String otherAnswer;
@ApiModelProperty("等级")
private Integer grade;
@ApiModelProperty("序号")
private Integer seq;
@JsonFormat(
pattern = "yyyy-MM-dd HH:mm:ss",
timezone = "GMT+8"
)
@ApiModelProperty("创建时间")
private Date createTime;
public String getRiddleContent() {
return riddleContent;
}
public void setRiddleContent(String riddleContent) {
this.riddleContent = riddleContent == null ? null : riddleContent.trim();
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer == null ? null : answer.trim();
}
public String getOtherAnswer() {
return otherAnswer;
}
public void setOtherAnswer(String otherAnswer) {
this.otherAnswer = otherAnswer;
}
public Integer getGrade() {
return grade;
}
public void setGrade(Integer grade) {
this.grade = grade;
}
public Integer getSeq() {
return seq;
}
public void setSeq(Integer seq) {
this.seq = seq;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return "Riddle{" +
"riddleContent='" + riddleContent + '\'' +
", answer='" + answer + '\'' +
", otherAnswer='" + otherAnswer + '\'' +
", grade=" + grade +
", seq=" + seq +
", createTime=" + createTime +
'}';
}
}
\ No newline at end of file
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 RiddleRecord extends BaseEntity{
@ApiModelProperty("谜语id")
private Long riddleId;
@ApiModelProperty("消息内容")
private String messageContent;
@ApiModelProperty("微信群")
private String wxGroupId;
@ApiModelProperty("微信用户")
private String wxUserId;
@ApiModelProperty("是否正确")
private Boolean correct;
@ApiModelProperty("进度状态")
private Integer status;
@JsonFormat(
pattern = "yyyy-MM-dd HH:mm:ss",
timezone = "GMT+8"
)
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("通关次数")
private Integer finishCount;
public Long getRiddleId() {
return riddleId;
}
public void setRiddleId(Long riddleId) {
this.riddleId = riddleId;
}
public String getMessageContent() {
return messageContent;
}
public void setMessageContent(String messageContent) {
this.messageContent = messageContent;
}
public String getWxGroupId() {
return wxGroupId;
}
public void setWxGroupId(String wxGroupId) {
this.wxGroupId = wxGroupId == null ? null : wxGroupId.trim();
}
public String getWxUserId() {
return wxUserId;
}
public void setWxUserId(String wxUserId) {
this.wxUserId = wxUserId == null ? null : wxUserId.trim();
}
public Boolean getCorrect() {
return correct;
}
public void setCorrect(Boolean correct) {
this.correct = correct;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Integer getFinishCount() {
return finishCount;
}
public void setFinishCount(Integer finishCount) {
this.finishCount = finishCount;
}
}
\ No newline at end of file
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 RiddleReply extends BaseEntity{
@ApiModelProperty("文案内容")
private String content;
@ApiModelProperty("文案类型")
private String type;
@JsonFormat(
pattern = "yyyy-MM-dd HH:mm:ss",
timezone = "GMT+8"
)
@ApiModelProperty("创建时间")
private Date createTime;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content == null ? null : content.trim();
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type == null ? null : type.trim();
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return "RiddleReply{" +
"content='" + content + '\'' +
", type='" + type + '\'' +
", createTime=" + createTime +
'}';
}
}
\ No newline at end of file
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.GroupRiddleDTO;
import com.pcloud.book.riddle.dto.RiddleOpenDTO;
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.wechatgroup.message.dto.SendTextDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
/**
* @描述:猜谜语外部接口
* @作者:zhuyajie
* @创建时间:17:53 2019/7/26
* @版本:1.0
*/
@Api(description = "猜谜语外部接口")
@RequestMapping(value = "/riddle")
@RestController("riddleFacade")
public class RiddleFacade {
@Autowired
private RiddleRecordBiz riddleRecordBiz;
@ApiOperation("发送信息")
@PostMapping("sendText")
public ResponseDto<?> sendText(@RequestBody @ApiParam SendTextDTO sendTextDTO){
riddleRecordBiz.riddleProcess(sendTextDTO);
return new ResponseDto<>();
}
@ApiOperation("猜谜语详情列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "name", value = "name", required = false, dataType = "string", paramType = "query"),
@ApiImplicitParam(name = "currentPage", value = "当前页", required = true, dataType = "int", paramType = "query"),
@ApiImplicitParam(name = "numPerPage", value = "每页条数", required = true, dataType = "int", paramType = "query"),
})
@GetMapping("listPage")
public ResponseDto<PageBeanNew<GroupRiddleDTO>> listPage(
@RequestHeader("token") String token, @RequestParam(value = "name", required = false) String name,
@RequestParam("currentPage") Integer currentPage, @RequestParam("numPerPage") Integer numPerPage) throws PermissionException {
Long partyId = (Long) SessionUtil.getVlaue(token, SessionUtil.PARTY_ID);
if (null == numPerPage || null == currentPage) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "分页参数缺失");
}
PageBeanNew<GroupRiddleDTO> pageBean = riddleRecordBiz.listPage(partyId, currentPage, numPerPage, name);
return new ResponseDto<>(pageBean);
}
@ApiOperation("更新猜谜语状态")
@PostMapping("updateRiddleOpenStatus")
public ResponseDto<?> updateRiddleOpenStatus(@RequestHeader("token") String token, @RequestBody @ApiParam RiddleOpenDTO riddleOpenDTO) throws PermissionException {
SessionUtil.getToken4Redis(token);
if (null == riddleOpenDTO) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "参数缺失");
}
Long qrcodeId = riddleOpenDTO.getGroupQrcodeId();
Boolean status = riddleOpenDTO.getStatus();
if (null == qrcodeId || null == status) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "参数缺失");
}
riddleRecordBiz.updateRiddleOpenStatus(qrcodeId, status);
return new ResponseDto<>();
}
}
package com.pcloud.book.riddle.redis;
import com.pcloud.book.riddle.constants.RiddleConstant;
import com.pcloud.book.riddle.dto.GroupRedisDTO;
import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.cache.redis.JedisClusterUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* @描述:猜谜语缓存
* @作者:zhuyajie
* @创建时间:10:55 2019/7/30
* @版本:1.0
*/
@Component("riddleRedis")
public class RiddleRedis {
private static final Logger logger = LoggerFactory.getLogger(RiddleRedis.class);
public static final String prefix = "BOOK_RIDDLE";
public static final String wait_time = prefix + "_wait_time";//到时间回复信息
public static final String underway_group = prefix+"_underway_group";//答题中的群
/**
* 添加等待时间
* @param wxGroupId
* @param value
*/
public void addWaitTime(String wxGroupId, String value) {
String key = wait_time + wxGroupId;
JedisClusterUtils.set(key, value);
JedisClusterUtils.expire(key, RiddleConstant.expire_seconds);
}
/**
* 获取等待时间
* @param wxGroupId
* @return
*/
public String getWaitTime(String wxGroupId) {
String key = wait_time + wxGroupId;
return JedisClusterUtils.get(key);
}
/**
* 添加答题中的群
* @param wxGroupId
*/
public void addUnderwayGroup(String wxGroupId, String wxId, String ip) {
GroupRedisDTO dto = new GroupRedisDTO();
dto.setWxGroupId(wxGroupId);
dto.setWxId(wxId);
dto.setIp(ip);
List<GroupRedisDTO> list = getUnderwayGroup();
if (ListUtils.isEmpty(list)) {
list = new ArrayList<>();
list.add(dto);
} else {
if (!list.contains(dto)) {
list.add(dto);
}
}
JedisClusterUtils.setJsonList(underway_group, list);
}
/**
* 获取答题中的群
* @return
*/
public List<GroupRedisDTO> getUnderwayGroup() {
List<GroupRedisDTO> list = JedisClusterUtils.getJsonList(underway_group, GroupRedisDTO.class);
if (ListUtils.isEmpty(list)) {
list = new ArrayList<>();
GroupRedisDTO dto = new GroupRedisDTO();
dto.setWxGroupId("1");
dto.setWxId("1");
dto.setIp("1");
list.add(dto);
JedisClusterUtils.setJsonList(underway_group, list);
}
return list;
}
/**
* 删除答题中的群
* @param wxGroupId
*/
public void deleteUnderwayGroup(String wxGroupId) {
List<GroupRedisDTO> list = getUnderwayGroup();
if (!ListUtils.isEmpty(list)) {
for (int i = 0; i < list.size() && null != list; i++) {
GroupRedisDTO dto = list.get(i);
if (null != dto && dto.getWxGroupId().equals(wxGroupId)) {
list.remove(dto);
}
}
}
if (ListUtils.isEmpty(list)) {
list = new ArrayList<>();
GroupRedisDTO dto = new GroupRedisDTO();
dto.setWxGroupId("1");
dto.setWxId("1");
dto.setIp("1");
list.add(dto);
}
JedisClusterUtils.setJsonList(underway_group, list);
}
}
package com.pcloud.book.riddle.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.pcloud.book.riddle.RiddleService;
import com.pcloud.book.riddle.biz.RiddleRecordBiz;
import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.utils.string.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
/**
* @描述:猜谜语
* @作者:zhuyajie
* @创建时间:16:26 2019/8/5
* @版本:1.0
*/
@RestController("riddleService")
@RequestMapping("riddleService")
public class RiddleServiceImpl implements RiddleService {
@Autowired
private RiddleRecordBiz riddleRecordBiz;
@RequestMapping(value = "/riddleEndQuartz", method = RequestMethod.POST)
@Override
@ParamLog("定时器调用游戏结束接口")
public void riddleEndQuartz(@RequestBody Map<String, Object> map) {
String wxGroupId = JSON.parseObject(JSON.toJSONString(map.get("wxGroupId")), new TypeReference<String>() {});
String wxId = JSON.parseObject(JSON.toJSONString(map.get("wxId")), new TypeReference<String>() {});
String ip = JSON.parseObject(JSON.toJSONString(map.get("ip")), new TypeReference<String>() {});
String wxUserId = JSON.parseObject(JSON.toJSONString(map.get("wxUserId")), new TypeReference<String>() {});
if (StringUtil.isEmpty(wxGroupId)) {
return;
}
riddleRecordBiz.autoEnd(wxGroupId, wxId, ip, wxUserId);
}
}
......@@ -18,11 +18,12 @@
<result column="update_user" property="updateUser" jdbcType="BIGINT"/>
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
<result column="is_delete" property="isDelete" jdbcType="BIT"/>
<result column="riddle_open" property="riddleOpen" jdbcType="BIT"/>
</resultMap>
<sql id="Base_Column_List">
id,classify_id,group_name,group_seq,user_number,weixin_qrcode_id,weixin_group_id,qrcode_url,use_state,qrcode_state,
create_user,create_time,update_time,is_delete
create_user,create_time,update_time,is_delete,riddle_open
</sql>
<update id="updateGroupQrcode" parameterType="map" >
......@@ -498,4 +499,46 @@
#{item}
</foreach>
</select>
<select id="listPageRiddle" parameterType="map" resultType="com.pcloud.book.riddle.dto.GroupRiddleDTO">
SELECT
q.group_name AS groupName,
q.id AS groupQrcodeId,
q.weixin_group_id AS wxGroupId,
c.classify AS classify,
g.group_qrcode_name AS groupQrcodeName,
b.BOOK_NAME AS bookName,
g.pro_label_id AS proLabelId,
g.dep_label_id AS depLabelId,
g.pur_label_id AS purLabelId,
q.riddle_open AS riddleOpen
FROM
book_group_qrcode q
LEFT JOIN book_group_classify c ON q.classify_id = c.id
LEFT JOIN book_group g ON c.book_group_id = g.id
LEFT JOIN book b ON g.book_id = b.BOOK_ID
LEFT JOIN book_adviser a ON g.book_id = a.BOOK_ID
WHERE
a.ADVISER_ID = #{partyId}
AND a.IS_DELETE = 0
AND g.is_delete = 0
AND c.is_delete = 0
AND q.is_delete = 0
<if test="name != null">
AND (
q.group_name LIKE CONCAT('%', #{name}, '%')
OR c.classify LIKE CONCAT('%', #{name}, '%')
OR g.group_qrcode_name LIKE CONCAT('%', #{name}, '%')
OR b.BOOK_NAME LIKE CONCAT('%', #{name}, '%')
)
</if>
</select>
<update id="updateRiddleOpenStatus" parameterType="map">
UPDATE book_group_qrcode
SET riddle_open = #{status}
WHERE
id = #{qrcodeId}
</update>
</mapper>
\ No newline at end of file
<?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.RiddleDaoImpl" >
<resultMap id="BaseResultMap" type="com.pcloud.book.riddle.entity.Riddle" >
<id column="id" property="id" jdbcType="BIGINT" />
<result column="riddle_content" property="riddleContent" jdbcType="VARCHAR" />
<result column="answer" property="answer" jdbcType="VARCHAR" />
<result column="other_answer" property="otherAnswer" jdbcType="VARCHAR" />
<result column="grade" property="grade" jdbcType="TINYINT" />
<result column="seq" property="seq" jdbcType="TINYINT" />
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="Base_Column_List" >
id, riddle_content, answer, other_answer, grade, seq, create_time
</sql>
<select id="getRiddleByGradeAndSeq" resultMap="BaseResultMap" parameterType="map">
SELECT
<include refid="Base_Column_List"/>
FROM
riddle
WHERE
grade = #{grade}
AND seq > #{seq}
LIMIT 1
</select>
<select id="getById" parameterType="Long" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM riddle
WHERE id = #{id}
</select>
</mapper>
\ No newline at end of file
<?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.RiddleRecordDaoImpl" >
<resultMap id="BaseResultMap" type="com.pcloud.book.riddle.entity.RiddleRecord" >
<id column="id" property="id" jdbcType="BIGINT" />
<result column="riddle_id" property="riddleId" jdbcType="BIGINT" />
<result column="message_content" property="messageContent" jdbcType="VARCHAR" />
<result column="wx_group_id" property="wxGroupId" jdbcType="VARCHAR" />
<result column="wx_user_id" property="wxUserId" jdbcType="VARCHAR" />
<result column="correct" property="correct" jdbcType="BIT" />
<result column="status" property="status" jdbcType="TINYINT" />
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
<result column="finish_count" property="finishCount" jdbcType="INTEGER" />
</resultMap>
<sql id="Base_Column_List" >
id, riddle_id, message_content, wx_group_id, wx_user_id, correct, status, create_time, finish_count
</sql>
<insert id="insert" parameterType="com.pcloud.book.riddle.entity.RiddleRecord" useGeneratedKeys="true" keyProperty="id">
insert into riddle_record (id, 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},
#{wxGroupId,jdbcType=VARCHAR}, #{wxUserId,jdbcType=VARCHAR}, #{correct,jdbcType=BIT}, #{status},
NOW(), #{finishCount})
</insert>
<select id="getLastRecordByWxGroupId" resultMap="BaseResultMap" parameterType="String">
SELECT
<include refid="Base_Column_List"/>
FROM riddle_record
WHERE wx_group_id = #{wxGroupId}
ORDER BY
create_time DESC, id DESC
LIMIT 1
</select>
<select id="getCorrectCountByGroup" parameterType="map" resultType="Integer">
SELECT
COUNT(DISTINCT riddle_id)
FROM
riddle_record
WHERE
wx_group_id = #{wxGroupId}
AND finish_count = #{finishCount}
AND correct = 1
</select>
<select id="getParticipateCount" parameterType="String" resultType="com.pcloud.book.riddle.dto.GroupRiddleDTO">
SELECT
COUNT(DISTINCT wx_user_id) userNum,
COUNT(1) participateCount
FROM
riddle_record
WHERE
wx_group_id = #{wxGroupId}
AND correct IS NOT NULL
</select>
</mapper>
\ No newline at end of file
<?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.RiddleReplyDaoImpl" >
<resultMap id="BaseResultMap" type="com.pcloud.book.riddle.entity.RiddleReply" >
<id column="id" property="id" jdbcType="BIGINT" />
<result column="content" property="content" jdbcType="VARCHAR" />
<result column="type" property="type" jdbcType="VARCHAR" />
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="Base_Column_List" >
id, content, type, create_time
</sql>
<select id="getReplyByType" parameterType="String" resultType="String">
SELECT
content
FROM
riddle_reply
WHERE
type = #{type}
</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