|  | @ -0,0 +1,154 @@
 | 
	
		
			
				|  |  | package com.yihu.jw.evaluate.score.service;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import com.alibaba.fastjson.JSONObject;
 | 
	
		
			
				|  |  | import com.yihu.jw.entity.base.score.BaseEvaluateScoreDO;
 | 
	
		
			
				|  |  | import com.yihu.jw.evaluate.score.dao.BaseEvaluateScoreDao;
 | 
	
		
			
				|  |  | import com.yihu.jw.util.date.DateUtil;
 | 
	
		
			
				|  |  | import com.yihu.mysql.query.BaseJpaService;
 | 
	
		
			
				|  |  | import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  | import org.springframework.jdbc.core.JdbcTemplate;
 | 
	
		
			
				|  |  | import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  | import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import java.text.DecimalFormat;
 | 
	
		
			
				|  |  | import java.text.NumberFormat;
 | 
	
		
			
				|  |  | import java.util.HashMap;
 | 
	
		
			
				|  |  | import java.util.List;
 | 
	
		
			
				|  |  | import java.util.Map;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | /**
 | 
	
		
			
				|  |  |  * @author zmk
 | 
	
		
			
				|  |  |  * @vsrsion 1.0
 | 
	
		
			
				|  |  |  * Created at 2019/12/6
 | 
	
		
			
				|  |  |  */
 | 
	
		
			
				|  |  | @Service
 | 
	
		
			
				|  |  | @Transactional
 | 
	
		
			
				|  |  | public class BaseEvaluateScoreService extends BaseJpaService<BaseEvaluateScoreDO, BaseEvaluateScoreDao> {
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private BaseEvaluateScoreDao baseEvaluateScoreDao;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private JdbcTemplate jdbcTemplate;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 计算总评分,周同比,日环比
 | 
	
		
			
				|  |  |      * @param area
 | 
	
		
			
				|  |  |      * @param level
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public Map<String, Object> getScoreAndPercentage(String area, int level){
 | 
	
		
			
				|  |  |         HashMap<String, Object> map = new HashMap<>();
 | 
	
		
			
				|  |  |         //今日凌晨、当前时间
 | 
	
		
			
				|  |  |         String startTime = DateUtil.getStringDateShort()+" 00:00:00";
 | 
	
		
			
				|  |  |         String nowTime = DateUtil.getStringDate();
 | 
	
		
			
				|  |  |         //昨日时间
 | 
	
		
			
				|  |  |         String oneDayAgo = DateUtil.getNextDay(startTime, -1);
 | 
	
		
			
				|  |  |         String oneStrTime = oneDayAgo + " 00:00:00";
 | 
	
		
			
				|  |  |         String oneEndTime = oneDayAgo + " 23:59:59";
 | 
	
		
			
				|  |  |         //七天之前时间
 | 
	
		
			
				|  |  |         String sevenDayAgo = DateUtil.getNextDay(startTime, -7);
 | 
	
		
			
				|  |  |         String sevenStrTime = sevenDayAgo + " 00:00:00";
 | 
	
		
			
				|  |  |         String sevenEndTime = sevenDayAgo + " 23:59:59";
 | 
	
		
			
				|  |  |         //服务总评分
 | 
	
		
			
				|  |  |         map.put("totalAvgScore",getAvgScore(null, null, area, level));
 | 
	
		
			
				|  |  |         //周同比
 | 
	
		
			
				|  |  |         map.put("weekJudge",judgeScore(getAvgScore(startTime, nowTime, area, level),getAvgScore(sevenStrTime, sevenEndTime, area, level)));
 | 
	
		
			
				|  |  |         //日环比
 | 
	
		
			
				|  |  |         map.put("dayJudge",judgeScore(getAvgScore(startTime, nowTime, area, level),getAvgScore(oneStrTime, oneEndTime, area, level)));
 | 
	
		
			
				|  |  |         return map;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 计算平均分
 | 
	
		
			
				|  |  |      * @param startTime
 | 
	
		
			
				|  |  |      * @param endTime
 | 
	
		
			
				|  |  |      * @param area
 | 
	
		
			
				|  |  |      * @param level
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private Double getAvgScore(String startTime,String endTime,String area,int level){
 | 
	
		
			
				|  |  |         String sql = "select count(*) as total, sum(score) as score from base.base_evaluate_score o where";
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         if (level == 4){
 | 
	
		
			
				|  |  |             sql += " o.doctor IN (SELECT doctor_code FROM `base_doctor_hospital` dh where dh.org_code ='"+area+"' and dh.del=1)";
 | 
	
		
			
				|  |  |         }else if (level == 5){
 | 
	
		
			
				|  |  |             sql += " o.doctor IN (SELECT doctor_code FROM `base_doctor_hospital` dh where dh.dept_code ='"+area+"' and dh.del=1)";
 | 
	
		
			
				|  |  |         }else if (level == 6){
 | 
	
		
			
				|  |  |             sql += " o.doctor ='"+area+"'";
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         if (startTime != null){
 | 
	
		
			
				|  |  |             sql += " and o.create_time >='" + startTime + "'";
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         if(endTime != null){
 | 
	
		
			
				|  |  |             sql += " and o.create_time <='" + endTime + "'";
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         List<Map<String,Object>> rstotal = jdbcTemplate.queryForList(sql);
 | 
	
		
			
				|  |  |         double total = 0d;
 | 
	
		
			
				|  |  |         double score = 0d;
 | 
	
		
			
				|  |  |         if(rstotal != null && rstotal.size()>0){
 | 
	
		
			
				|  |  |             if (null == rstotal.get(0).get("score")){
 | 
	
		
			
				|  |  |                 return 0.0;
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             total = Double.valueOf((rstotal.get(0).get("total")).toString());
 | 
	
		
			
				|  |  |             score = Double.valueOf((rstotal.get(0).get("score")).toString());
 | 
	
		
			
				|  |  |             if (0 == total || 0 == score){
 | 
	
		
			
				|  |  |                 return 0.0;
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         double avgScore = score / total;
 | 
	
		
			
				|  |  |         DecimalFormat df = new DecimalFormat("0.0");//格式化小数,不足的补0
 | 
	
		
			
				|  |  |         String filesize = df.format(avgScore);
 | 
	
		
			
				|  |  |         return Double.valueOf(filesize);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 计算周同比和日环比
 | 
	
		
			
				|  |  |      * @param nowScore
 | 
	
		
			
				|  |  |      * @param oldScore
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private Object judgeScore(Double nowScore, Double oldScore){
 | 
	
		
			
				|  |  |         JSONObject object = new JSONObject();
 | 
	
		
			
				|  |  |         if (nowScore > oldScore){
 | 
	
		
			
				|  |  |             if (oldScore == 0){
 | 
	
		
			
				|  |  |                 object.put("trend",1);
 | 
	
		
			
				|  |  |                 object.put("percentage","100%");
 | 
	
		
			
				|  |  |             }else {
 | 
	
		
			
				|  |  |                 Double difScore = nowScore - oldScore;
 | 
	
		
			
				|  |  |                 String percentage = getPercentage((float) (difScore.intValue()), (float) oldScore.intValue());
 | 
	
		
			
				|  |  |                 object.put("trend",1);
 | 
	
		
			
				|  |  |                 object.put("percentage",percentage);
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }else if (nowScore < oldScore){
 | 
	
		
			
				|  |  |             Double difScore = oldScore - nowScore;
 | 
	
		
			
				|  |  |             String percentage = getPercentage((float) (difScore.intValue()), (float) oldScore.intValue());
 | 
	
		
			
				|  |  |             object.put("trend",-1);
 | 
	
		
			
				|  |  |             object.put("percentage",percentage);
 | 
	
		
			
				|  |  |         }else {
 | 
	
		
			
				|  |  |             String percentage = "0%";
 | 
	
		
			
				|  |  |             object.put("trend",0);
 | 
	
		
			
				|  |  |             object.put("percentage",percentage);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return object;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 计算百分比
 | 
	
		
			
				|  |  |      * @param num1
 | 
	
		
			
				|  |  |      * @param num2
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private String getPercentage(float num1,float num2){
 | 
	
		
			
				|  |  |         //创建一个数值格式化对象
 | 
	
		
			
				|  |  |         NumberFormat format = NumberFormat.getInstance();
 | 
	
		
			
				|  |  |         //设置精确到小数点后两位
 | 
	
		
			
				|  |  |         format.setMaximumFractionDigits(2);
 | 
	
		
			
				|  |  |         String result = format.format(num1 / num2 * 100) + "%";
 | 
	
		
			
				|  |  |         return result;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | }
 |