diff --git a/src/main/java/com/ccsens/braintraining/api/RaffleController.java b/src/main/java/com/ccsens/braintraining/api/RaffleController.java index ba99365..9401c89 100644 --- a/src/main/java/com/ccsens/braintraining/api/RaffleController.java +++ b/src/main/java/com/ccsens/braintraining/api/RaffleController.java @@ -47,13 +47,13 @@ public class RaffleController { @Login @ApiOperation(value = "中奖信息") @RequestMapping(value = "/prizeRecord", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) - public JsonResponse prizeRecord(@ApiParam @Validated @RequestBody QueryDto params) { + public JsonResponse> prizeRecord(@ApiParam @Validated @RequestBody QueryDto params) { log.info("中奖信息查询:{}", params); PageInfo records = raffleService.prizeRecord(params.getParam(), params.getUserId()); log.info("中奖信息结束:{}"); return JsonResponse.newInstance().ok(records); } -// @MustLogin + @MustLogin @ApiOperation(value = "抽奖") @RequestMapping(value = "/draw", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) public JsonResponse draw(@ApiParam @Validated @RequestBody QueryDto params) { @@ -62,4 +62,34 @@ public class RaffleController { log.info("{}抽奖:{}结束:{}", params.getUserId(), params.getParam().getActiveId(), prize); return JsonResponse.newInstance().ok(prize); } + + @MustLogin + @ApiOperation(value = "查询用户的中奖纪录") + @RequestMapping(value = "/selfPrize", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse> selfPrize(@ApiParam @Validated @RequestBody QueryDto params) { + log.info("查询用户的中奖纪录:{}", params); + PageInfo prizes = raffleService.queryUserPrize(params.getParam(), params.getUserId()); + log.info("查询用户的中奖纪录结束:{}", prizes); + return JsonResponse.newInstance().ok(prizes); + } + + @MustLogin + @ApiOperation(value = "检查任务的完成情况") + @RequestMapping(value = "/checkTask", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse checkTask(@ApiParam @Validated @RequestBody QueryDto params) { + log.info("检查任务的完成情况:{}", params); + RaffleVo.CheckTask prizes = raffleService.checkTask(params.getParam(), params.getUserId(), params.getToken(), params.getDeviceId()); + log.info("检查任务的完成情况结束:{}", prizes); + return JsonResponse.newInstance().ok(prizes); + } + + @MustLogin + @ApiOperation(value = "完成任务") + @RequestMapping(value = "/doTask", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse doTask(@ApiParam @Validated @RequestBody QueryDto params) { + log.info("完成任务:{}", params); + RaffleVo.DoTask prizes = raffleService.doTask(params.getParam(), params.getUserId()); + log.info("完成任务结束:{}", prizes); + return JsonResponse.newInstance().ok(prizes); + } } diff --git a/src/main/java/com/ccsens/braintraining/aspect/MustLoginAspect.java b/src/main/java/com/ccsens/braintraining/aspect/MustLoginAspect.java index 6f026ad..2363289 100644 --- a/src/main/java/com/ccsens/braintraining/aspect/MustLoginAspect.java +++ b/src/main/java/com/ccsens/braintraining/aspect/MustLoginAspect.java @@ -67,7 +67,8 @@ public class MustLoginAspect { RequestContextHolder.getRequestAttributes()).getRequest(); // 获取token final String authHeader = request.getHeader(WebConstant.HEADER_KEY_TOKEN); - log.info("token:{}", authHeader); + final String deviceId = request.getHeader(BrainTrainingConstant.User.DEVICE_ID); + log.info("token:{}, deviceId:{}", authHeader, deviceId); if ( mustLoginAnnotation != null && StrUtil.isEmpty(authHeader)) { throw new BaseException(CodeEnum.NOT_LOGIN); } @@ -94,7 +95,8 @@ public class MustLoginAspect { dto.setAvatarUrl(bean.getAvatarUrl()); dto.setPhone(bean.getPhone()); dto.setAuthType(bean.getAuthType()); - dto.setToken(WebConstant.HEADER_KEY_TOKEN_PREFIX + authHeader); + dto.setToken(authHeader); + dto.setDeviceId(deviceId); // 判断该userId是否已经存储 saveUser(bean); } diff --git a/src/main/java/com/ccsens/braintraining/bean/dto/RaffleDto.java b/src/main/java/com/ccsens/braintraining/bean/dto/RaffleDto.java index 673557a..aa852b6 100644 --- a/src/main/java/com/ccsens/braintraining/bean/dto/RaffleDto.java +++ b/src/main/java/com/ccsens/braintraining/bean/dto/RaffleDto.java @@ -28,6 +28,14 @@ public class RaffleDto { @NotNull(message="请输入抽奖活动信息") @ApiModelProperty("抽奖ID") private Long activeId; + } + + @Data + @ApiModel("中奖纪录列表-请求") + public static class RecordList { + @NotNull(message="请输入抽奖活动信息") + @ApiModelProperty("抽奖ID") + private Long activeId; @Min(1) @ApiModelProperty("页码") private int pageNum = 1; @@ -38,11 +46,8 @@ public class RaffleDto { } @Data - @ApiModel("中奖纪录列表-请求") - public static class RecordList { - @NotNull(message="请输入抽奖活动信息") - @ApiModelProperty("抽奖ID") - private Long activeId; + @ApiModel("用户中奖纪录列表-请求") + public static class SelfPrize { @Min(1) @ApiModelProperty("页码") private int pageNum = 1; @@ -51,4 +56,10 @@ public class RaffleDto { @ApiModelProperty("每页多少条") private int pageSize = 20; } + @Data + @ApiModel("用户做任务-请求") + public static class DoTask { + @ApiModelProperty("任务ID") + private Long taskId; + } } diff --git a/src/main/java/com/ccsens/braintraining/bean/dto/TallDto.java b/src/main/java/com/ccsens/braintraining/bean/dto/TallDto.java new file mode 100644 index 0000000..cd1777e --- /dev/null +++ b/src/main/java/com/ccsens/braintraining/bean/dto/TallDto.java @@ -0,0 +1,20 @@ +package com.ccsens.braintraining.bean.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @description: + * @author: whj + * @time: 2022/3/17 15:49 + */ +public class TallDto { + + @Data + @ApiModel("根据公众号id判断用户是否关注该公众号-请求") + public static class Tencent{ + @ApiModelProperty("公众号ID") + private String appId; + } +} diff --git a/src/main/java/com/ccsens/braintraining/bean/vo/RaffleVo.java b/src/main/java/com/ccsens/braintraining/bean/vo/RaffleVo.java index 8a1aeb4..5a430f7 100644 --- a/src/main/java/com/ccsens/braintraining/bean/vo/RaffleVo.java +++ b/src/main/java/com/ccsens/braintraining/bean/vo/RaffleVo.java @@ -1,10 +1,12 @@ package com.ccsens.braintraining.bean.vo; import cn.hutool.core.util.StrUtil; +import com.ccsens.braintraining.bean.po.RaffleActive; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.Date; import java.util.List; /** @@ -35,6 +37,8 @@ public class RaffleVo { private Long startTime; @ApiModelProperty("结束时间") private Long endTime; + @ApiModelProperty("用户剩余抽奖次数") + private Integer prizeTimes; } @Data @ApiModel("抽奖活动-奖品-响应") @@ -59,8 +63,12 @@ public class RaffleVo { private Byte type; @ApiModelProperty("完成状态 0:未完成 1:已完成 2:以前完成") private Byte finishStatus; + @ApiModelProperty("参数") + private String param; } + + @Data @ApiModel("中奖纪录") public static class PrizeRecord { @@ -96,5 +104,33 @@ public class RaffleVo { private Integer remain; } + @Data + @ApiModel("抽奖活动-奖品-响应") + public static class PrizeTime { + @ApiModelProperty("奖品ID") + private Long prizeId; + @ApiModelProperty("奖品名称") + private String name; + @ApiModelProperty("奖品图标") + private String icon; + @ApiModelProperty("中奖时间") + private Date time; + } + + @Data + @ApiModel("用户做任务-响应") + public static class DoTask { + @ApiModelProperty("增加的次数") + private Integer addTimes; + @ApiModelProperty("总抽奖次数") + private Long totalTimes; + } + + @Data + @ApiModel("检查任务的完成情况-返回") + public static class CheckTask { + @ApiModelProperty("完成状态 -1:活动已结束 0:未完成 1:已完成 2:以前完成") + private Byte finishStatus; + } } diff --git a/src/main/java/com/ccsens/braintraining/bean/vo/TallVo.java b/src/main/java/com/ccsens/braintraining/bean/vo/TallVo.java new file mode 100644 index 0000000..746febc --- /dev/null +++ b/src/main/java/com/ccsens/braintraining/bean/vo/TallVo.java @@ -0,0 +1,21 @@ +package com.ccsens.braintraining.bean.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @description: + * @author: whj + * @time: 2022/3/17 18:54 + */ +public class TallVo { + @Data + @ApiModel("用户是否关注公众号") + public static class UserOfficial{ + @ApiModelProperty("用户id") + private Long userId; + @ApiModelProperty("是否关注公众号 0未关注 1已关注") + private byte status; + } +} diff --git a/src/main/java/com/ccsens/braintraining/persist/dao/RaffleDao.java b/src/main/java/com/ccsens/braintraining/persist/dao/RaffleDao.java index 066d283..4ee41c3 100644 --- a/src/main/java/com/ccsens/braintraining/persist/dao/RaffleDao.java +++ b/src/main/java/com/ccsens/braintraining/persist/dao/RaffleDao.java @@ -1,5 +1,7 @@ package com.ccsens.braintraining.persist.dao; +import com.ccsens.braintraining.bean.po.RaffleActive; +import com.ccsens.braintraining.bean.po.RaffleTask; import com.ccsens.braintraining.bean.vo.RaffleVo; import org.apache.ibatis.annotations.Param; @@ -45,4 +47,26 @@ public interface RaffleDao { * @param prizeId 奖品ID */ void decreasePrize(@Param("prizeId") Long prizeId); + + /** + * 查询用户的中奖纪录 + * @param userId 用户ID + * @return 中奖纪录 + */ + List queryUserPrize(@Param("userId") Long userId); + + /** + * 查询任务关联的、正在进行的活动 + * @param taskId 任务ID + * @return 活动 + */ + RaffleTask getRunningTask(@Param("taskId") Long taskId); + + /** + * 查询关注公众号的次数 + * @param taskId + * @param userId + * @return + */ + Integer countSubscribe(@Param("taskId") Long taskId, @Param("userId")Long userId); } diff --git a/src/main/java/com/ccsens/braintraining/service/IRaffleService.java b/src/main/java/com/ccsens/braintraining/service/IRaffleService.java index a0d66fa..54862f4 100644 --- a/src/main/java/com/ccsens/braintraining/service/IRaffleService.java +++ b/src/main/java/com/ccsens/braintraining/service/IRaffleService.java @@ -32,4 +32,30 @@ public interface IRaffleService { * @return 奖品 */ RaffleVo.Prize draw(RaffleDto.ActiveId param, Long userId); + + /** + * 查询用户的中奖纪录 + * @param param 分页 + * @param userId 用户ID + * @return 中奖纪录 + */ + PageInfo queryUserPrize(RaffleDto.SelfPrize param, Long userId); + + /** + * 用户执行任务增加抽奖次数 + * @param param 任务 + * @param userId 用户 + * @return 成功与否 + */ + RaffleVo.DoTask doTask(RaffleDto.DoTask param, Long userId); + + /** + * 检查用户关于任务的完成情况 + * @param param 任务 + * @param userId 用户 + * @param token token + * @param deviceId 设备ID + * @return 完成情况 + */ + RaffleVo.CheckTask checkTask(RaffleDto.DoTask param, Long userId, String token, String deviceId); } diff --git a/src/main/java/com/ccsens/braintraining/service/RaffleService.java b/src/main/java/com/ccsens/braintraining/service/RaffleService.java index f113fe6..b005834 100644 --- a/src/main/java/com/ccsens/braintraining/service/RaffleService.java +++ b/src/main/java/com/ccsens/braintraining/service/RaffleService.java @@ -1,27 +1,37 @@ package com.ccsens.braintraining.service; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; import com.ccsens.braintraining.bean.dto.RaffleDto; -import com.ccsens.braintraining.bean.po.RaffleActive; -import com.ccsens.braintraining.bean.po.RaffleRecord; +import com.ccsens.braintraining.bean.dto.TallDto; +import com.ccsens.braintraining.bean.po.*; import com.ccsens.braintraining.bean.vo.RaffleVo; +import com.ccsens.braintraining.bean.vo.TallVo; import com.ccsens.braintraining.persist.dao.RaffleDao; import com.ccsens.braintraining.persist.mapper.RaffleActiveMapper; import com.ccsens.braintraining.persist.mapper.RaffleRecordMapper; +import com.ccsens.braintraining.persist.mapper.RaffleTaskParamMapper; +import com.ccsens.braintraining.persist.mapper.RaffleTimesMapper; import com.ccsens.braintraining.util.BrainTrainingCodeError; +import com.ccsens.braintraining.util.BrainTrainingConstant; +import com.ccsens.util.bean.dto.QueryDto; import com.ccsens.util.exception.BaseException; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.List; -import java.util.Random; +import java.util.*; /** * @description: @@ -33,6 +43,8 @@ import java.util.Random; @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public class RaffleService implements IRaffleService { + @Value("${url.subscriptWx}") + private String subscriptWxUrl; @Resource private Snowflake snowflake; @Resource @@ -41,10 +53,22 @@ public class RaffleService implements IRaffleService { private RaffleActiveMapper raffleActiveMapper; @Resource private RaffleRecordMapper raffleRecordMapper; + @Resource + private RaffleTimesMapper raffleTimesMapper; + @Resource + private RaffleTaskParamMapper raffleTaskParamMapper; + + + @Override public RaffleVo.Active active(RaffleDto.Equipment param, Long userId) { - return raffleDao.queryActiveNow(param.getEquipmentId(), userId); + RaffleVo.Active active = raffleDao.queryActiveNow(param.getEquipmentId(), userId); + if (active != null) { + Integer remainTimes = raffleDao.countTimes(active.getActive().getActiveId(), userId); + active.getActive().setPrizeTimes(remainTimes); + } + return active; } @Override @@ -103,9 +127,112 @@ public class RaffleService implements IRaffleService { record.setPrizeId(prize.getPrizeId()); record.setUserId(userId); raffleRecordMapper.insertSelective(record); - // 设置最小 + // 设置奖品剩余数-1 raffleDao.decreasePrize(prize.getPrizeId()); return prize; } } + + @Override + public PageInfo queryUserPrize(RaffleDto.SelfPrize param, Long userId) { + PageHelper.startPage(param.getPageNum(), param.getPageSize()); + List records = raffleDao.queryUserPrize(userId); + return new PageInfo(records); + } + + @Override + public RaffleVo.DoTask doTask(RaffleDto.DoTask param, Long userId) { + + // 判断 + + return null; + } + + @Override + public RaffleVo.CheckTask checkTask(RaffleDto.DoTask param, Long userId, String token, String deviceId) { + RaffleVo.CheckTask checkTask = new RaffleVo.CheckTask(); + // 判断活动是否是当前的活动 + RaffleTask task = raffleDao.getRunningTask(param.getTaskId()); + log.info("活动:{}", task); + if (task == null) { + checkTask.setFinishStatus(BrainTrainingConstant.Raffle.TASK_FINISH_END); + return checkTask; + } + // 判断是否已经有记录 + List raffleTimes = null; + RaffleTimesExample timesExample = new RaffleTimesExample(); + timesExample.createCriteria().andTaskIdEqualTo(param.getTaskId()) + .andUserIdEqualTo(userId).andFinishTypeGreaterThan(BrainTrainingConstant.Raffle.TASK_FINISH_NO); + switch (task.getPeriod()) { + case BrainTrainingConstant.Raffle.TASK_PERIOD_ALL: + raffleTimes = raffleTimesMapper.selectByExample(timesExample); + break; + case BrainTrainingConstant.Raffle.TASK_PERIOD_EVERY_DAY: + timesExample.createCriteria().andCreatedAtGreaterThanOrEqualTo(DateUtil.beginOfDay(new Date())); + raffleTimes = raffleTimesMapper.selectByExample(timesExample); + break; + default: + throw new BaseException(BrainTrainingCodeError.SETTING_ERROR); + + } + // 执行的次数大于任务最大的执行次数,则不能再做 + if (raffleTimes.size() >= task.getRunTimes()) { + checkTask.setFinishStatus(raffleTimes.get(0).getFinishType()); + return checkTask; + } + // 判断是否以前做过了 + if (task.getType() == BrainTrainingConstant.Raffle.TASK_TYPE_SUBSCRIBE) { + // 关注公众号 + // 查询记录中有没有关注的是同一个公众号的 + Integer recordTimes = raffleDao.countSubscribe(param.getTaskId(), userId); + if (recordTimes != null && recordTimes > 0) { + checkTask.setFinishStatus(BrainTrainingConstant.Raffle.TASK_FINISH_BEFORE); + return checkTask; + } + // 查询该用户是否已经关注了 + // 查询公众号appId + RaffleTaskParamExample paramExample = new RaffleTaskParamExample(); + paramExample.createCriteria().andTaskIdEqualTo(param.getTaskId()).andKeyWordEqualTo(BrainTrainingConstant.Raffle.TASK_PARAM_APP_ID); + paramExample.setOrderByClause("id desc limit 1"); + List params = raffleTaskParamMapper.selectByExample(paramExample); + if (CollectionUtil.isEmpty(params)) { + throw new BaseException(BrainTrainingCodeError.SETTING_ERROR); + } + String appId = params.get(0).getKeyValue(); + byte status = pageSubscript(token, deviceId, appId); + + + } else if (task.getType() == BrainTrainingConstant.Raffle.TASK_TYPE_PERFECT) { + // TODO 查询详情表 + } + + + + checkTask.setFinishStatus(BrainTrainingConstant.Raffle.TASK_FINISH_NO); + return checkTask; + } + + private byte pageSubscript(String token, String deviceId, String appId) { + TallDto.Tencent tencent = new TallDto.Tencent(); + tencent.setAppId(appId); + QueryDto dto = new QueryDto<>(); + dto.setParam(tencent); + log.info("调用判断接口, dto:{}, token:{}", dto, token); + Map tokenMap = new HashMap<>(); + tokenMap.put(BrainTrainingConstant.User.AUTHORIZATION, token); + tokenMap.put(BrainTrainingConstant.User.DEVICE_ID, deviceId); + HttpResponse execute = HttpUtil.createPost(subscriptWxUrl).addHeaders(tokenMap).body(JSONObject.toJSONString(dto)).execute(); + log.info("http:{}", HttpUtil.createPost(subscriptWxUrl).addHeaders(tokenMap).body(JSONObject.toJSONString(dto))); + log.info("调用判断用户是否关注公众号接口的结果:{}", execute); + if (execute == null || StrUtil.isEmpty(execute.body()) || execute.body().contains(" + @@ -47,7 +48,8 @@ t.NAME AS taskName, t.icon AS taskIcon, t.type, - IF( t2.id IS NULL, 0, t2.finish_type + 1 ) AS finishStatus + IF( t2.id IS NULL, 0, t2.finish_type ) AS finishStatus, + param.param FROM (select * from t_raffle_active WHERE equipment_id = #{equipmentId} AND start_time <= UNIX_TIMESTAMP(now()) * 1000 AND end_time >= UNIX_TIMESTAMP(now()) * 1000 AND rec_status = 0 order by id desc limit 1) a LEFT JOIN t_raffle_prize p ON a.id = p.active_id @@ -61,6 +63,24 @@ AND t2.id is null AND t2.rec_status = 0 + LEFT JOIN (SELECT + t.id, + concat( '{', word, '}' ) AS param + FROM + ( + SELECT + t.id, + GROUP_CONCAT( + concat( '"', key_word, '":"', key_value, '"' )) AS word + FROM + t_raffle_task_param p, + t_raffle_task t + WHERE + p.task_id = t.id + AND t.active_id = 1 + AND t.rec_status = 0 + AND p.rec_status = 0 + GROUP BY t.id ) t) param on t.id = param.id + + + \ No newline at end of file