|
@ -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;
|
|
|
}
|
|
|
|
|
|
}
|