Selaa lähdekoodia

Merge branch 'dev' of huangwenjie/patient-co-management into dev

huangwenjie 7 vuotta sitten
vanhempi
commit
297d9057a7

+ 4 - 0
patient-co/patient-co-wlyy/doc/技术文档/es/回访问卷新增索引.txt

@ -31,6 +31,10 @@ POST http://172.19.103.68:9200/wlyy_questionnaire_winning/wlyy_questionnaire_win
                "type": "string",
                "type": "string",
                "index": "not_analyzed"
                "index": "not_analyzed"
            },
            },
            "prizeName": {
                "type": "string",
                "index": "not_analyzed"
            },
            "address": {
            "address": {
                "type": "string",
                "type": "string",
                "index": "not_analyzed"
                "index": "not_analyzed"

+ 20 - 0
patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/repository/questionnaire/QuestionnairePrizeDao.java

@ -0,0 +1,20 @@
package com.yihu.wlyy.repository.questionnaire;
import com.yihu.wlyy.entity.questionnaire.QuestionnairePrize;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * @author huangwenjie
 * @date 2018/1/30 00:38
 */
public interface QuestionnairePrizeDao  extends
		PagingAndSortingRepository<QuestionnairePrize, Long>,
		JpaSpecificationExecutor<QuestionnairePrize> {
	
	@Query("select q from QuestionnairePrize q where q.used = 0")
	Page<QuestionnairePrize> getQuestionnairePrizeByCount(Pageable pageable);
}

+ 185 - 25
patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/service/questionnaire/QuestionnaireService.java

@ -1,28 +1,32 @@
package com.yihu.wlyy.service.questionnaire;
package com.yihu.wlyy.service.questionnaire;
import com.yihu.es.entity.HealthEduArticleES;
import com.alibaba.fastjson.JSON;
import com.yihu.es.entity.QuestionnaireWinningESDO;
import com.yihu.es.entity.QuestionnaireWinningESDO;
import com.yihu.wlyy.config.SystemConfig;
import com.yihu.wlyy.config.SystemConfig;
import com.yihu.wlyy.config.es.ElasticFactory;
import com.yihu.wlyy.config.es.ElasticFactory;
import com.yihu.wlyy.config.es.ElastricSearchSave;
import com.yihu.wlyy.entity.questionnaire.QuestionnairePrize;
import com.yihu.wlyy.entity.questionnaire.QuestionnaireUsers;
import com.yihu.wlyy.entity.questionnaire.QuestionnaireUsers;
import com.yihu.wlyy.entity.questionnaire.QuestionnaireWinning;
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.repository.questionnaire.QuestionnaireWinningDao;
import com.yihu.wlyy.service.BaseService;
import com.yihu.wlyy.service.BaseService;
import com.yihu.wlyy.util.ElasticsearchUtil;
import com.yihu.wlyy.util.ElasticsearchUtil;
import com.yihu.wlyy.util.random.LotteryUtils;
import com.yihu.wlyy.util.random.LotteryUtils;
import com.yihu.wlyy.util.random.dto.Lottery;
import com.yihu.wlyy.util.random.dto.LotteryItem;
import com.yihu.wlyy.util.random.dto.LotteryItem;
import io.searchbox.client.JestClient;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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 org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.*;
/**
/**
 * 回访问卷调查业务逻辑类
 * 回访问卷调查业务逻辑类
@ -33,16 +37,24 @@ import java.util.UUID;
public class QuestionnaireService extends BaseService {
public class QuestionnaireService extends BaseService {
	
	
	private static final Logger logger = LoggerFactory.getLogger(QuestionnaireService.class);
	private static final Logger logger = LoggerFactory.getLogger(QuestionnaireService.class);
	static Object obj = new Object();
	@Autowired
	@Autowired
	private ElasticFactory elasticFactory;
	private ElasticFactory elasticFactory;
	@Autowired
	@Autowired
	private ElasticsearchUtil elasticsearchUtil;
	private ElasticsearchUtil elasticsearchUtil;
	@Autowired
	private ElastricSearchSave elastricSearchSave;
	@Value("${es.type.QuestionnaireWinning}")
	@Value("${es.type.QuestionnaireWinning}")
	private String esType;
	private String esType;
	@Value("${es.index.QuestionnaireWinning}")
	@Value("${es.index.QuestionnaireWinning}")
	private String esIndex;
	private String esIndex;
	@Autowired
	@Autowired
	private QuestionnaireWinningDao questionnaireWinningDao;
	private QuestionnaireWinningDao questionnaireWinningDao;
	@Autowired
	private QuestionnairePrizeDao questionnairePrizeDao;
	@Autowired
	private StringRedisTemplate redisTemplate;
	
	
	/**
	/**
	 * 根据身份证和openid从ES查询中奖结果
	 * 根据身份证和openid从ES查询中奖结果
@ -77,6 +89,9 @@ public class QuestionnaireService extends BaseService {
	 */
	 */
	public List<QuestionnaireWinningESDO> questionnaireLottery(QuestionnaireUsers questionnaireUsers)throws Exception{
	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())){
		if(StringUtils.isBlank(questionnaireUsers.getIdcard()) || !"undefined".equals(questionnaireUsers.getIdcard())){
			throw new Exception("身份证号为空或者异常:"+questionnaireUsers.getIdcard());
			throw new Exception("身份证号为空或者异常:"+questionnaireUsers.getIdcard());
		}
		}
@ -85,9 +100,23 @@ public class QuestionnaireService extends BaseService {
			throw new Exception("openid为空或者异常:"+questionnaireUsers.getIdcard());
			throw new Exception("openid为空或者异常:"+questionnaireUsers.getIdcard());
		}
		}
		
		
		//@todo 判断奖品池的奖品是否已经发完
		// 从redis获取剩余奖品数量
		// 判断奖品池的奖品是否已经发完
		Integer prizeCount = gerPrizeCountFromRedis();
		boolean canLottery = true;
		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){
		if(canLottery){
		//未发完,可继续抽奖
		//未发完,可继续抽奖
			
			
@ -96,38 +125,169 @@ public class QuestionnaireService extends BaseService {
			//抽奖
			//抽奖
			LotteryItem lotteryItem = LotteryUtils.isWinning(new Double(awardProbability));
			LotteryItem lotteryItem = LotteryUtils.isWinning(new Double(awardProbability));
			
			//中奖
			//中奖
			if("YES".equals(lotteryItem.getAwardName())){
			if("YES".equals(lotteryItem.getAwardName())){
				List<QuestionnaireWinning> winningList = questionnaireWinningDao.findByUserIdcardAndUserOpenid(questionnaireUsers.getIdcard(),questionnaireUsers.getOpenid());
				List<QuestionnaireWinning> winningList = questionnaireWinningDao.findByUserIdcardAndUserOpenid(questionnaireUsers.getIdcard(),questionnaireUsers.getOpenid());
				if(winningList.isEmpty()){
				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());
						questionnaireWinning = questionnaireWinningDao.save(questionnaireWinning);
						one = doToESDO(questionnaireWinning);
						result.add(one);
						//将中奖信息缓存到ES
						esQuestionnaireWinningESData(result);
						return result;
					}catch (Exception e){
						//@todo 处理奖品相关逻辑业务时,如果报错,则将奖品重新放回奖品池
					    e.printStackTrace();
					}
				}else{
				}else{
//					return winningList;
					for (QuestionnaireWinning obj:winningList) {
						QuestionnaireWinningESDO a = doToESDO(obj);
						result.add(a);
					}
					return result;
				}
				}
				
			}else{
			}else{
			//未中奖
				questionnaireWinning.setWinning(0);//未中奖
			}
			}
		}else{
			questionnaireWinning.setWinning(0);//未中奖
		}
		}
		one = doToESDO(questionnaireWinning);
		result.add(one);
		return result;
	}
	
	//中奖对象转成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;
		}
	}
	
	/**
	 * 保存数据到ES
	 */
	public void esQuestionnaireWinningESData(List<QuestionnaireWinningESDO> data) throws Exception {
		JestClient jestClient = null;
		try {
			jestClient = elasticFactory.getJestClient();
			elastricSearchSave.save(data,esIndex,esType);
			jestClient.shutdownClient();
		}catch (Exception e){
			logger.error(" save error :" + e.getMessage());
			e.printStackTrace();
		} finally {
			if (jestClient != null) {
				jestClient.shutdownClient();
			}
		}
	}
	}
}
}