|
@ -1,28 +1,31 @@
|
|
|
package com.yihu.wlyy.service.questionnaire;
|
|
|
|
|
|
import com.yihu.es.entity.HealthEduArticleES;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.yihu.es.entity.QuestionnaireWinningESDO;
|
|
|
import com.yihu.wlyy.config.SystemConfig;
|
|
|
import com.yihu.wlyy.config.es.ElasticFactory;
|
|
|
import com.yihu.wlyy.entity.questionnaire.QuestionnairePrize;
|
|
|
import com.yihu.wlyy.entity.questionnaire.QuestionnaireUsers;
|
|
|
import com.yihu.wlyy.entity.questionnaire.QuestionnaireWinning;
|
|
|
import com.yihu.wlyy.repository.questionnaire.QuestionnairePrizeDao;
|
|
|
import com.yihu.wlyy.repository.questionnaire.QuestionnaireWinningDao;
|
|
|
import com.yihu.wlyy.service.BaseService;
|
|
|
import com.yihu.wlyy.util.ElasticsearchUtil;
|
|
|
import com.yihu.wlyy.util.random.LotteryUtils;
|
|
|
import com.yihu.wlyy.util.random.dto.Lottery;
|
|
|
import com.yihu.wlyy.util.random.dto.LotteryItem;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.data.domain.Page;
|
|
|
import org.springframework.data.domain.PageRequest;
|
|
|
import org.springframework.data.domain.Pageable;
|
|
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.UUID;
|
|
|
import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* 回访问卷调查业务逻辑类
|
|
@ -33,6 +36,7 @@ import java.util.UUID;
|
|
|
public class QuestionnaireService extends BaseService {
|
|
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(QuestionnaireService.class);
|
|
|
static Object obj = new Object();
|
|
|
@Autowired
|
|
|
private ElasticFactory elasticFactory;
|
|
|
@Autowired
|
|
@ -43,6 +47,10 @@ public class QuestionnaireService extends BaseService {
|
|
|
private String esIndex;
|
|
|
@Autowired
|
|
|
private QuestionnaireWinningDao questionnaireWinningDao;
|
|
|
@Autowired
|
|
|
private QuestionnairePrizeDao questionnairePrizeDao;
|
|
|
@Autowired
|
|
|
private StringRedisTemplate redisTemplate;
|
|
|
|
|
|
/**
|
|
|
* 根据身份证和openid从ES查询中奖结果
|
|
@ -77,6 +85,9 @@ public class QuestionnaireService extends BaseService {
|
|
|
*/
|
|
|
public List<QuestionnaireWinningESDO> questionnaireLottery(QuestionnaireUsers questionnaireUsers)throws Exception{
|
|
|
|
|
|
List<QuestionnaireWinningESDO> result = new ArrayList<>();
|
|
|
QuestionnaireWinningESDO one = new QuestionnaireWinningESDO();
|
|
|
|
|
|
if(StringUtils.isBlank(questionnaireUsers.getIdcard()) || !"undefined".equals(questionnaireUsers.getIdcard())){
|
|
|
throw new Exception("身份证号为空或者异常:"+questionnaireUsers.getIdcard());
|
|
|
}
|
|
@ -85,9 +96,23 @@ public class QuestionnaireService extends BaseService {
|
|
|
throw new Exception("openid为空或者异常:"+questionnaireUsers.getIdcard());
|
|
|
}
|
|
|
|
|
|
//@todo 判断奖品池的奖品是否已经发完
|
|
|
// 从redis获取剩余奖品数量
|
|
|
// 判断奖品池的奖品是否已经发完
|
|
|
Integer prizeCount = gerPrizeCountFromRedis();
|
|
|
boolean canLottery = true;
|
|
|
if(0 == prizeCount){
|
|
|
canLottery = false;
|
|
|
}
|
|
|
|
|
|
QuestionnaireWinning questionnaireWinning = new QuestionnaireWinning();
|
|
|
questionnaireWinning.setCode(UUID.randomUUID().toString());
|
|
|
questionnaireWinning.setCreateTime(new Date());
|
|
|
questionnaireWinning.setUpdateTime(new Date());
|
|
|
questionnaireWinning.setDel(0);
|
|
|
questionnaireWinning.setUserCode(questionnaireUsers.getCode());
|
|
|
questionnaireWinning.setUserIdcard(questionnaireUsers.getIdcard());
|
|
|
questionnaireWinning.setUserName(questionnaireUsers.getName());
|
|
|
questionnaireWinning.setUserOpenid(questionnaireUsers.getOpenid());
|
|
|
if(canLottery){
|
|
|
//未发完,可继续抽奖
|
|
|
|
|
@ -96,38 +121,146 @@ public class QuestionnaireService extends BaseService {
|
|
|
//抽奖
|
|
|
LotteryItem lotteryItem = LotteryUtils.isWinning(new Double(awardProbability));
|
|
|
|
|
|
|
|
|
//中奖
|
|
|
if("YES".equals(lotteryItem.getAwardName())){
|
|
|
List<QuestionnaireWinning> winningList = questionnaireWinningDao.findByUserIdcardAndUserOpenid(questionnaireUsers.getIdcard(),questionnaireUsers.getOpenid());
|
|
|
if(winningList.isEmpty()){
|
|
|
|
|
|
//从redis奖品池捞取一个奖品
|
|
|
QuestionnairePrize questionnairePrize = getQuestionnairePrizeFromRedis();
|
|
|
try {
|
|
|
questionnaireWinning.setWinning(1);
|
|
|
questionnaireWinning.setPrizeType(questionnairePrize.getType());
|
|
|
questionnaireWinning.setPrizeName(questionnairePrize.getPrizeName());
|
|
|
questionnaireWinning.setPrizeCode(questionnairePrize.getPrizeCode());
|
|
|
questionnaireWinning.setAddress(questionnairePrize.getAddress());
|
|
|
questionnaireWinning.setValidity(questionnairePrize.getValidity());
|
|
|
questionnaireWinningDao.save(questionnaireWinning);
|
|
|
//@todo 将中奖信息缓存到ES
|
|
|
}catch (Exception e){
|
|
|
//@todo 处理奖品相关逻辑业务时,如果报错,则将奖品重新放回奖品池
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
|
|
|
}else{
|
|
|
// return winningList;
|
|
|
for (QuestionnaireWinning obj:winningList) {
|
|
|
QuestionnaireWinningESDO a = doToESDO(obj);
|
|
|
result.add(a);
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
}else{
|
|
|
//未中奖
|
|
|
questionnaireWinning.setWinning(0);//未中奖
|
|
|
|
|
|
}
|
|
|
}else{
|
|
|
questionnaireWinning.setWinning(0);//未中奖
|
|
|
}
|
|
|
one = doToESDO(questionnaireWinning);
|
|
|
result.add(one);
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
//中奖对象转成ES对象
|
|
|
private QuestionnaireWinningESDO doToESDO(QuestionnaireWinning questionnaireWinning){
|
|
|
QuestionnaireWinningESDO questionnaireWinningESDO = new QuestionnaireWinningESDO();
|
|
|
questionnaireWinningESDO.setCode(questionnaireWinning.getCode());
|
|
|
questionnaireWinningESDO.setAddress(questionnaireWinning.getCode());
|
|
|
questionnaireWinningESDO.setCreate_time(questionnaireWinning.getCreateTime());
|
|
|
questionnaireWinningESDO.setUpdate_time(questionnaireWinning.getUpdateTime());
|
|
|
questionnaireWinningESDO.setDel(questionnaireWinning.getDel());
|
|
|
questionnaireWinningESDO.setPrizeCode(questionnaireWinning.getPrizeCode());
|
|
|
questionnaireWinningESDO.setPrizeName(questionnaireWinning.getPrizeName());
|
|
|
questionnaireWinningESDO.setPrizeType(questionnaireWinning.getPrizeType());
|
|
|
questionnaireWinningESDO.setUserCode(questionnaireWinning.getUserCode());
|
|
|
questionnaireWinningESDO.setUserIdcard(questionnaireWinning.getUserIdcard());
|
|
|
questionnaireWinningESDO.setUserOpenid(questionnaireWinning.getUserOpenid());
|
|
|
questionnaireWinningESDO.setWinning(questionnaireWinning.getWinning());
|
|
|
questionnaireWinningESDO.setValidity(questionnaireWinning.getValidity());
|
|
|
return questionnaireWinningESDO;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 从redis奖品池捞取一个奖品
|
|
|
* @return
|
|
|
*/
|
|
|
public QuestionnairePrize getQuestionnairePrizeFromRedis(){
|
|
|
try {
|
|
|
synchronized (obj) {
|
|
|
QuestionnairePrize questionnairePrize = new QuestionnairePrize();
|
|
|
Set<String> exists = redisTemplate.opsForSet().members("questionnaire:prize:code");
|
|
|
if(exists.size() > 0){
|
|
|
String prizeCode = "questionnaire:prize:code:";
|
|
|
String key = "questionnaire:prize:code:";
|
|
|
String prizeJsonStr = "";
|
|
|
for (String code :exists) {
|
|
|
if(StringUtils.isNotBlank(code)){
|
|
|
prizeCode = prizeCode + code;
|
|
|
questionnairePrize.setCode(code);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
prizeJsonStr = redisTemplate.opsForValue().get(prizeCode);
|
|
|
// JSONObject jsonObject = JSONObject.parseObject(prizeJsonStr);
|
|
|
// questionnairePrize.setUsed(jsonObject.getInteger("used"));
|
|
|
// questionnairePrize.setAddress(jsonObject.getString("address"));
|
|
|
// questionnairePrize.setDel(jsonObject.getInteger("del"));
|
|
|
// questionnairePrize.setPrizeCode(jsonObject.getString("prizeCode"));
|
|
|
// questionnairePrize.setPrizeName(jsonObject.getString("prizeName"));
|
|
|
// questionnairePrize.setType(jsonObject.getInteger("type"));
|
|
|
// questionnairePrize.setValidity(jsonObject.getDate("validity"));
|
|
|
// questionnairePrize.setCreateTime(jsonObject.getDate("createTime"));
|
|
|
// questionnairePrize.setUpdateTime(jsonObject.getDate("updateTime"));
|
|
|
questionnairePrize = JSON.parseObject(prizeJsonStr,QuestionnairePrize.class);
|
|
|
|
|
|
//捞取完之后,从redis缓存中删掉
|
|
|
redisTemplate.delete(prizeCode);
|
|
|
return questionnairePrize;
|
|
|
|
|
|
}else{
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
}catch (Exception e){
|
|
|
e.printStackTrace();
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 从奖品数据库捞取指定数量的奖品,缓存到redis奖品池
|
|
|
* @param count
|
|
|
*/
|
|
|
public void getQuestionnairePrizeToRedis(Integer count)throws Exception{
|
|
|
|
|
|
//从数据库取出规定数量的奖品
|
|
|
Pageable pageable = new PageRequest(0, count);
|
|
|
Page<QuestionnairePrize> questionnairePrizes = questionnairePrizeDao.getQuestionnairePrizeByCount(pageable);
|
|
|
List<QuestionnairePrize> datas = questionnairePrizes.getContent();
|
|
|
|
|
|
// QuestionnaireWinning questionnaireWinning = new QuestionnaireWinning();
|
|
|
// questionnaireWinning.setCode(UUID.randomUUID().toString());
|
|
|
// questionnaireWinning.setDel(0);
|
|
|
// questionnaireWinning.setPrizeType(1);
|
|
|
// questionnaireWinning.setUserCode(questionnaireUsers.getCode());
|
|
|
// questionnaireWinning.setUserIdcard(questionnaireUsers.getIdcard());
|
|
|
// questionnaireWinning.setUserName(questionnaireUsers.getName());
|
|
|
// questionnaireWinning.setUserOpenid(questionnaireUsers.getOpenid());
|
|
|
// questionnaireWinning.setCreateTime(new Date());
|
|
|
// questionnaireWinning.setUpdateTime(new Date());
|
|
|
|
|
|
|
|
|
//将数据存储到redis
|
|
|
for (QuestionnairePrize questionnairePrize:datas) {
|
|
|
String prizejson = JSON.toJSONString(questionnairePrize);
|
|
|
redisTemplate.opsForValue().set("questionnaire:prize:code:" + questionnairePrize.getCode(), prizejson);
|
|
|
questionnairePrize.setUsed(1);
|
|
|
}
|
|
|
|
|
|
//将捞取的奖品状态改成已使用
|
|
|
questionnairePrizeDao.save(datas);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 从redis获取剩余奖品数量
|
|
|
* @return
|
|
|
*/
|
|
|
public Integer gerPrizeCountFromRedis(){
|
|
|
|
|
|
Set<String> exists = redisTemplate.opsForSet().members("questionnaire:prize:code");
|
|
|
|
|
|
return null;
|
|
|
if(exists != null && !exists.isEmpty()){
|
|
|
return exists.size();
|
|
|
}else{
|
|
|
return 0;
|
|
|
}
|
|
|
}
|
|
|
}
|