Browse Source

回访问卷代码提交

huangwenjie 7 years ago
parent
commit
92f3a445ea

+ 58 - 0
common/common-entity/src/main/java/com/yihu/wlyy/entity/common/SystemProperties.java

@ -0,0 +1,58 @@
package com.yihu.wlyy.entity.common;
import com.yihu.wlyy.entity.IdEntity;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
 * @author huangwenjie
 * @date 2018/1/28 23:40
 */
@Entity
@Table(name = "system_properties")
public class SystemProperties extends IdEntity {
	//工程类型-0:wlyy,1:wlyy_service
	private Integer client;
	
	//参数key
	private String key;
	
	//参数值
	private String value;
	
	//0为有效,1为删除状态
	private Integer isdel;
	
	public Integer getClient() {
		return client;
	}
	
	public void setClient(Integer client) {
		this.client = client;
	}
	
	public String getKey() {
		return key;
	}
	
	public void setKey(String key) {
		this.key = key;
	}
	
	public String getValue() {
		return value;
	}
	
	public void setValue(String value) {
		this.value = value;
	}
	
	public Integer getIsdel() {
		return isdel;
	}
	
	public void setIsdel(Integer isdel) {
		this.isdel = isdel;
	}
}

+ 14 - 0
patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/config/SystemConfig.java

@ -0,0 +1,14 @@
package com.yihu.wlyy.config;
import java.util.HashMap;
import java.util.Map;
/**
 * 缓存system_properties表的参数
 * @author huangwenjie
 * @date 2018/1/28 23:33
 */
public class SystemConfig {
	//从system_properties表中取到的系统参数集,key参数key,value参数值
	public static Map<String,String> sysPropertiesSets = new HashMap<>();
}

+ 24 - 0
patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/repository/common/SystemPropertiesDao.java

@ -0,0 +1,24 @@
package com.yihu.wlyy.repository.common;
import com.yihu.wlyy.entity.common.SystemProperties;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
/**
 * 数据库系统参数表
 *@author huangwenjie
 *@date 2018/1/28 23:43
 */
public interface SystemPropertiesDao extends
        PagingAndSortingRepository<SystemProperties, Long>,
        JpaSpecificationExecutor<SystemProperties> {
    @Query("select a from SystemProperties a where a.client = ?1 and a.isdel = 0 ")
    List<SystemProperties> findSystemPropertiesByClientAndSpaValue(Integer client);
}

+ 6 - 0
patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/repository/questionnaire/QuestionnaireWinningDao.java

@ -3,8 +3,11 @@ package com.yihu.wlyy.repository.questionnaire;
import com.yihu.wlyy.entity.questionnaire.QuestionnaireWinning;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
/**
 * 调查问卷中奖纪录
 * @author huangwenjie
@ -13,4 +16,7 @@ import org.springframework.data.repository.PagingAndSortingRepository;
public interface QuestionnaireWinningDao extends
		PagingAndSortingRepository<QuestionnaireWinning, Long>,
		JpaSpecificationExecutor<QuestionnaireWinning> {
	
	@Query("select p from QuestionnaireWinning p where (p.userIdcard=?1 or p.userOpenid=?2) and del = 0 ")
	List<QuestionnaireWinning> findByUserIdcardAndUserOpenid(String idcard,String openid);
}

+ 39 - 0
patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/service/common/InitiSysProService.java

@ -0,0 +1,39 @@
package com.yihu.wlyy.service.common;
import com.yihu.wlyy.config.SystemConfig;
import com.yihu.wlyy.entity.common.SystemProperties;
import com.yihu.wlyy.repository.common.SystemPropertiesDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service("InitiSysProService")
public class InitiSysProService {
	
	@Autowired
	private SystemPropertiesDao systemPropertiesDao;
	
	
	/**
	 * 重新执行系统参数初始化
	 */
	public void startInitiSysProperties() throws Exception{
		if(!SystemConfig.sysPropertiesSets.isEmpty()){
			SystemConfig.sysPropertiesSets.clear();
		}
		Map<String,String> sysPropertiesSets = new HashMap<>();
		List<SystemProperties> sysvalueList = systemPropertiesDao.findSystemPropertiesByClientAndSpaValue(1);
		if(!sysvalueList.isEmpty()){
			for (SystemProperties systemProperties : sysvalueList) {
				System.out.println("key:"+systemProperties.getKey());
				System.out.println("value:"+systemProperties.getValue());
				sysPropertiesSets.put(systemProperties.getKey(),systemProperties.getValue());
			}
			SystemConfig.sysPropertiesSets = sysPropertiesSets;
		}
	}
}

+ 72 - 2
patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/service/questionnaire/QuestionnaireService.java

@ -2,16 +2,28 @@ package com.yihu.wlyy.service.questionnaire;
import com.yihu.es.entity.HealthEduArticleES;
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.QuestionnaireUsers;
import com.yihu.wlyy.entity.questionnaire.QuestionnaireWinning;
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.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
/**
 * 回访问卷调查业务逻辑类
 * @author huangwenjie
@ -29,7 +41,6 @@ public class QuestionnaireService extends BaseService {
	private String esType;
	@Value("${es.index.QuestionnaireWinning}")
	private String esIndex;
	
	@Autowired
	private QuestionnaireWinningDao questionnaireWinningDao;
	
@ -41,8 +52,67 @@ public class QuestionnaireService extends BaseService {
	 * @throws Exception
	 */
	public QuestionnaireWinningESDO getQuestionnaireWinningESDOByIdcardAndOpenid(String idcard,String openid) throws Exception{
		String sql = "SELECT * FROM " + esType + "  where userIdcard= '" + idcard + "' or userOpenid = '"+openid+"' ";
		//中奖纪录
		String sql = "SELECT * FROM " + esType + "  where del = 0 and ( userIdcard= '" + idcard + "' or userOpenid = '"+openid+"' ) ";
		QuestionnaireWinningESDO result = (QuestionnaireWinningESDO)elasticsearchUtil.excuteOneObject(sql, HealthEduArticleES.class, esIndex, esType);
		return result;
	}
	
	/**
	 * 回访问卷抽奖
	 * @param questionnaireUsers
	 * @return
	 * @throws Exception
	 */
	public QuestionnaireWinningESDO questionnaireLottery(QuestionnaireUsers questionnaireUsers)throws Exception{
		
		if(StringUtils.isBlank(questionnaireUsers.getIdcard()) || !"undefined".equals(questionnaireUsers.getIdcard())){
			throw new Exception("身份证号为空或者异常:"+questionnaireUsers.getIdcard());
		}
		
		if(StringUtils.isBlank(questionnaireUsers.getOpenid()) || !"undefined".equals(questionnaireUsers.getOpenid())){
			throw new Exception("openid为空或者异常:"+questionnaireUsers.getIdcard());
		}
		
		//@todo 判断奖品池的奖品是否已经发完
		boolean canLottery = true;
		
		if(canLottery){
		//未发完,可继续抽奖
			
			//获取设置的中奖概率
			String awardProbability = SystemConfig.sysPropertiesSets.get("winning_pr");
			//抽奖
			LotteryItem lotteryItem = LotteryUtils.isWinning(new Double(awardProbability));
			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.setCreate_time(new Date());
			questionnaireWinning.setUpdate_time(new Date());
			if("YES".equals(lotteryItem.getAwardName())){
				List<QuestionnaireWinning> winningList = questionnaireWinningDao.findByUserIdcardAndUserOpenid(questionnaireUsers.getIdcard(),questionnaireUsers.getOpenid());
				if(winningList.isEmpty()){
				
				}else{
					questionnaireWinning = winningList.get(0);
					
				}
				
			}else{
			}
		}
		
		
		
		
		return null;
	}
}

+ 156 - 0
patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/util/random/LotteryUtils.java

@ -0,0 +1,156 @@
package com.yihu.wlyy.util.random;
import com.yihu.wlyy.util.random.dto.Lottery;
import com.yihu.wlyy.util.random.dto.LotteryItem;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
 * 抽奖工具类
 * 算法原理:
 *          计算出抽奖活动一组数字,根据抽奖奖品的概率计算出每个奖品所在的数字区间。Random随机数落在了哪个奖品的数字区间,则用户中这个区间对应的奖品。
 * 中奖概率:
 *          奖品A[0,24]->中奖概率0.25的中奖数字区间
 *          奖品B[25,49]->中奖概率0.25的中奖数字区间
 *          奖品C[49,99]->中奖概率0.5的中奖数字区间
 *          可设置奖品C为未中奖,如果抽中奖品C,则未中奖
 * @author huangwenjie
 * @date 2018/1/28 21:34
 */
public class LotteryUtils {
	private static final Random random = new Random();
	private static final Integer MAXSOPE = 100000000;
	
	public static void calAwardProbability(Lottery lottery, List<LotteryItem> lotteryItemList) {
		Integer codeScope = 1;
		for (LotteryItem item : lotteryItemList) {
			Integer nowScope = 1;
			Double awardProbability = item.getAwardProbability();
			while (true) {
				Double test = awardProbability * nowScope;
				// 概率的精确度,调整到小数点后10位,概率太小等于不中奖,跳出
				if (test < 0.0000000001) {
					break;
				}
				if ((test >= 1L && (test - test.longValue()) < 0.0001D) || nowScope >= MAXSOPE) {
					if (nowScope > codeScope) {
						// 设置中奖范围
						codeScope = nowScope;
					}
					break;
				} else {
					// 中奖数字范围以10倍进行增长
					nowScope = nowScope * 10;
				}
			}
		}
		Integer winningStartCode = 0;
		Integer winningEndCode = winningStartCode;
		
		for (LotteryItem item : lotteryItemList) {
			Integer codeNum = (int) (item.getAwardProbability() * codeScope); // 获得其四舍五入的整数值
			// 无人中奖时,将中奖的起始范围设置在随机数的范围之外
			if (codeNum == 0) {
				item.setAwardStartCode(codeScope + 1);
				item.setAwardEndCode(codeScope + 1);
			} else {
				item.setAwardStartCode(winningEndCode);
				item.setAwardEndCode(winningEndCode + codeNum - 1);
				winningEndCode = winningEndCode + codeNum;
			}
		}
		// 设置用户的中奖随机码信息
		lottery.setWinningStartCode(winningStartCode);
		lottery.setWinningEndCode(winningEndCode);
		lottery.setCodeScope(codeScope);
	}
	
	public static LotteryItem beginLottery(Lottery lottery, List<LotteryItem> lotteryItemList) {
		// 确定活动是否有效,如果活动无效则,直接抽奖失败
		Integer randomCode = random.nextInt(lottery.getCodeScope());
		if (randomCode >= lottery.getWinningStartCode() && randomCode <= lottery.getWinningEndCode()) {
			for (LotteryItem item : lotteryItemList) {
				if (randomCode >= item.getAwardStartCode() && randomCode <= item.getAwardEndCode()) {
					item.setAwardCode(randomCode);
					return item;
				}
			}
		}
		return null;
	}
	
	
	/**
	 * demo
	 * @param args
	 */
	public static void main(String[] args) {
		List<LotteryItem> lotteryItemList = new ArrayList<LotteryItem>();
		LotteryItem awardItem1 = new LotteryItem();
		awardItem1.setAwardName("红包10元");
		awardItem1.setAwardProbability(0.25D);
		lotteryItemList.add(awardItem1);
		LotteryItem awardItem2 = new LotteryItem();
		awardItem2.setAwardName("红包20元");
		awardItem2.setAwardProbability(0.25D);
		lotteryItemList.add(awardItem2);
		LotteryItem awardItem3 = new LotteryItem();
		awardItem3.setAwardName("谢谢参与");
		awardItem3.setAwardProbability(0.5D);
		lotteryItemList.add(awardItem3);
		Lottery lottery = new Lottery();
		LotteryUtils.calAwardProbability(lottery, lotteryItemList);
		System.out.println("抽奖活动中奖数字范围:["+lottery.getWinningStartCode()+","+lottery.getWinningEndCode()+")");
		LotteryUtils.beginLottery(lottery, lotteryItemList);
		for (LotteryItem item : lotteryItemList) {
			System.out.println(item.getAwardName()+" 中奖数字范围:["+item.getAwardStartCode()+","+item.getAwardEndCode()+"]");
		}
		System.out.println("以下是模拟的抽奖中奖结果:");
		LotteryItem award1 = LotteryUtils.beginLottery(lottery, lotteryItemList);
		System.out.println("抽中的数字是:"+award1.getAwardCode()+",恭喜中奖:"+award1.getAwardName()+",数字落点["+award1.getAwardStartCode()+","+award1.getAwardEndCode()+"]");
		LotteryItem award2 = LotteryUtils.beginLottery(lottery, lotteryItemList);
		System.out.println("抽中的数字是:"+award2.getAwardCode()+",恭喜中奖:"+award2.getAwardName()+",数字落点["+award2.getAwardStartCode()+","+award2.getAwardEndCode()+"]");
		LotteryItem award3 = LotteryUtils.beginLottery(lottery, lotteryItemList);
		System.out.println("抽中的数字是:"+award3.getAwardCode()+",恭喜中奖:"+award3.getAwardName()+",数字落点["+award3.getAwardStartCode()+","+award3.getAwardEndCode()+"]");
		LotteryItem award4 = LotteryUtils.beginLottery(lottery, lotteryItemList);
		System.out.println("抽中的数字是:"+award4.getAwardCode()+",恭喜中奖:"+award4.getAwardName()+",数字落点["+award4.getAwardStartCode()+","+award4.getAwardEndCode()+"]");
		
	}
	
	/**
	 * 抽奖
	 * @param awardProbability 中奖概率
	 * @return
	 */
	public static LotteryItem isWinning(Double awardProbability){
		
		List<LotteryItem> lotteryItemList = new ArrayList<LotteryItem>();
		LotteryItem awardItem1 = new LotteryItem();
		awardItem1.setAwardName("YES");
		awardItem1.setAwardProbability(awardProbability);
		lotteryItemList.add(awardItem1);
		
		LotteryItem awardItem2 = new LotteryItem();
		awardItem2.setAwardName("NO");
		awardItem2.setAwardProbability(1-awardProbability);
		lotteryItemList.add(awardItem2);
		Lottery lottery = new Lottery();
		LotteryUtils.calAwardProbability(lottery, lotteryItemList);
		System.out.println("抽奖活动中奖数字范围:["+lottery.getWinningStartCode()+","+lottery.getWinningEndCode()+")");
		LotteryUtils.beginLottery(lottery, lotteryItemList);
		for (LotteryItem item : lotteryItemList) {
			System.out.println(item.getAwardName()+" 中奖数字范围:["+item.getAwardStartCode()+","+item.getAwardEndCode()+"]");
		}
		
		LotteryItem award = LotteryUtils.beginLottery(lottery, lotteryItemList);
		System.out.println("抽中的数字是:"+award.getAwardCode()+",是否中奖:"+award.getAwardName()+",数字落点["+award.getAwardStartCode()+","+award.getAwardEndCode()+"]");
		
		return award;
	}
}

+ 46 - 0
patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/util/random/dto/Lottery.java

@ -0,0 +1,46 @@
package com.yihu.wlyy.util.random.dto;
/**
 * 抽奖信息对象
 * @author huangwenjie
 * @date 2018/1/28 21:33
 */
public class Lottery {
	/**
	 * 中奖数字范围起点(通常0作为起点)
	 */
	private Integer winningStartCode;
	/**
	 * 当前概率计算出的中奖数字范围终点
	 */
	private Integer winningEndCode;
	
	/**
	 * 中奖的数字范围
	 */
	private Integer codeScope;
	
	public Integer getWinningStartCode() {
		return winningStartCode;
	}
	
	public void setWinningStartCode(Integer winningStartCode) {
		this.winningStartCode = winningStartCode;
	}
	
	public Integer getWinningEndCode() {
		return winningEndCode;
	}
	
	public void setWinningEndCode(Integer winningEndCode) {
		this.winningEndCode = winningEndCode;
	}
	
	public Integer getCodeScope() {
		return codeScope;
	}
	
	public void setCodeScope(Integer codeScope) {
		this.codeScope = codeScope;
	}
}

+ 71 - 0
patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/util/random/dto/LotteryItem.java

@ -0,0 +1,71 @@
package com.yihu.wlyy.util.random.dto;
/**
 * 抽奖奖品对象
 * @author huangwenjie
 * @date 2018/1/28 21:32
 */
public class LotteryItem {
	/**
	 * 奖品名称
	 */
	private String awardName;
	
	/**
	 * 中奖几率
	 */
	private Double awardProbability;
	/**
	 * 奖品中奖数字范围起点
	 */
	private Integer awardStartCode;
	/**
	 * 奖品中奖数字范围终点
	 */
	private Integer awardEndCode;
	
	/**
	 * 中奖数字,实际应用可不定义。
	 * 此处定义是为了理解
	 */
	private Integer awardCode;
	
	public String getAwardName() {
		return awardName;
	}
	
	public void setAwardName(String awardName) {
		this.awardName = awardName;
	}
	public Double getAwardProbability() {
		return awardProbability;
	}
	
	public void setAwardProbability(Double awardProbability) {
		this.awardProbability = awardProbability;
	}
	
	public Integer getAwardStartCode() {
		return awardStartCode;
	}
	
	public void setAwardStartCode(Integer awardStartCode) {
		this.awardStartCode = awardStartCode;
	}
	
	public Integer getAwardEndCode() {
		return awardEndCode;
	}
	
	public void setAwardEndCode(Integer awardEndCode) {
		this.awardEndCode = awardEndCode;
	}
	
	public Integer getAwardCode() {
		return awardCode;
	}
	
	public void setAwardCode(Integer awardCode) {
		this.awardCode = awardCode;
	}
}

+ 45 - 0
patient-co/patient-co-wlyy/src/main/java/com/yihu/wlyy/util/test/Prize.java

@ -0,0 +1,45 @@
package com.yihu.wlyy.util.test;
/**
 * @author huangwenjie
 * @date 2018/1/28 21:06
 */
public class Prize {
	
	private int id;//奖品id
	private String prize_name;//奖品名称
	private int prize_amount;//奖品(剩余)数量
	private int prize_weight;//奖品权重
	
	public int getId() {
		return id;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	
	public String getPrize_name() {
		return prize_name;
	}
	
	public void setPrize_name(String prize_name) {
		this.prize_name = prize_name;
	}
	
	public int getPrize_amount() {
		return prize_amount;
	}
	
	public void setPrize_amount(int prize_amount) {
		this.prize_amount = prize_amount;
	}
	
	public int getPrize_weight() {
		return prize_weight;
	}
	
	public void setPrize_weight(int prize_weight) {
		this.prize_weight = prize_weight;
	}
}