소스 검색

bug修改

chenweida 7 년 전
부모
커밋
eac92201fd
1개의 변경된 파일160개의 추가작업 그리고 139개의 파일을 삭제
  1. 160 139
      patient-co-wlyy/src/main/java/com/yihu/wlyy/service/app/consult/EvaluateService.java

+ 160 - 139
patient-co-wlyy/src/main/java/com/yihu/wlyy/service/app/consult/EvaluateService.java

@ -26,133 +26,152 @@ import java.util.*;
@Component
@Transactional
public class EvaluateService extends BaseService {
	@Autowired
	EvaluateDao evaluateDao;
	@Autowired
	ConsultTeamService consultTeamService;
	@Autowired
	EvaluateLabelService evaluateLabelService;
	@Autowired
	JdbcTemplate jdbcTemplate;
	@Autowired
	ConsultTeamDoctorDao consultTeamDoctorDao;
	@Autowired
	EvaluateScoreDao evaluateScoreDao;
	private  void save(Map<String,List<Evaluate>> docEvaMap){
		for(String key :docEvaMap.keySet())
			evaluateDao.save(docEvaMap.get(key));
	}
	public void saveByJson(String jsonData,String patient){
		JSONObject jsonObject = new JSONObject(jsonData);
		String consult = jsonObject.getString("consult");
		ConsultTeam consultTeam  = consultTeamService.findByCode(consult);
		JSONArray evaluateArray = jsonObject.getJSONArray("evaluate");
		JSONArray labelArray = jsonObject.getJSONArray("label");
		List<Evaluate> evaluateList =null;
		List<EvaluateLabel> evaluateLabelList = new ArrayList<>();
		Map<String,List<Evaluate>> docEvaMap = new HashMap<>();
		for(Object evaluateObj: evaluateArray){
			Evaluate evaluate = new Evaluate();
			JSONObject obj =(JSONObject) evaluateObj;
			ClazzReflect clazzReflect = new ClazzReflect();
			evaluate = (Evaluate)clazzReflect.formatToClazz(evaluate,obj);
			evaluate.setConsult(consult);
			evaluate.setPatient(patient);
			if(docEvaMap.get(evaluate.getDoctor())==null){
				evaluateList = new ArrayList<>();
				evaluateList.add(evaluate);
				docEvaMap.put(evaluate.getDoctor(),evaluateList);
			}else{
				docEvaMap.get(evaluate.getDoctor()).add(evaluate);
			}
		}
		for(Object labelObj: labelArray){
			EvaluateLabel evaluateLabel = new EvaluateLabel();
			JSONObject obj =(JSONObject) labelObj;
			ClazzReflect clazzReflect = new ClazzReflect();
			evaluateLabel = (EvaluateLabel)clazzReflect.formatToClazz(evaluateLabel,obj);
			evaluateLabel.setConsult(consult);
			evaluateLabel.setPatient(patient);
			evaluateLabelList.add(evaluateLabel);
		}
		//计算单条得分
		evaluateScoreCal(docEvaMap,consult);
		this.save(docEvaMap);
		evaluateLabelService.save(evaluateLabelList);
		consultTeam.setEvaluate(1);
		consultTeam.setEvaluateTime(new Date());
		JSONObject topicObject = new JSONObject();
		topicObject.put("evaluate",1);
		topicObject.put("evaluate_time",new Date());
		ImUtill.updateTopics(consult,topicObject.toString());
		this.consultTeamService.save(consultTeam);
	}
	/**
	 * 查询某个咨询某种类型的评价
	 * @param consult
	 * @param type
	 * @return
	 */
	public List<Evaluate> getEvaluateByConsultAndType(String consult,int type){
		List<Evaluate> evaluates = evaluateDao.findByConsultAndType(consult,type);
		return 	evaluates;
	}
	/**
	 * 查询某个咨询的评价
	 * @param consult
	 * @return
	 */
	public List<Evaluate> getEvaluateByConsult(String consult){
		List<Evaluate> evaluates = evaluateDao.findByConsult(consult);
		return 	evaluates;
	}
	/**
	 * 获取某个医生的某种类型的评价
	 * @param doctor
	 * @param type
	 * @return
	 */
	public List<Evaluate> getEvaluateByDoctorAndType(String doctor,int type){
		List<Evaluate> evaluates = evaluateDao.findByDoctorAndType(doctor,type);
		return 	evaluates;
	}
	private void evaluateScoreCal(Map<String,List<Evaluate>> docEvaMap,String consult){
		for(String doctor:docEvaMap.keySet()){
			BigDecimal realScore = new BigDecimal(REAL_SCORE_DEFAULT);//实名评价
			BigDecimal anonymousScore1 = new BigDecimal(ANONYMOUS_SCORE_DEFAULT_ONE);//专业能力
			BigDecimal anonymousScore2 = new BigDecimal(ANONYMOUS_SCORE_DEFAULT_TWO);//服务态度
			BigDecimal anonymousScore3 = new BigDecimal(ANONYMOUS_SCORE_DEFAULT_THREE);//回复速度
			//计算此次评价的分数来源
			for(Evaluate evaluate:docEvaMap.get(doctor)){
				if(evaluate.getEvaluateType()==0){
					realScore = BigDecimal.valueOf(evaluate.getScore());
				}else if(evaluate.getEvaluateType()==1){
					anonymousScore1 = BigDecimal.valueOf(evaluate.getScore());
				}else if(evaluate.getEvaluateType()==2){
					anonymousScore2 = BigDecimal.valueOf(evaluate.getScore());
				}else if(evaluate.getEvaluateType()==3){
					anonymousScore3 = BigDecimal.valueOf(evaluate.getScore());
				}
			}
			String evaluateTimesSql = "select count(1) as count from wlyy_evaluate w where w.doctor =? GROUP BY w.consult,w.doctor";
			//有效评价次数
			List<Map<String, Object>> evaluateTimesList = jdbcTemplate.queryForList(evaluateTimesSql, new Object[]{doctor});
			//有效咨询次数
			int consultTimes = consultTeamDoctorDao.countByDoctorAndType(2, doctor);
			BigDecimal score = BigDecimal.ZERO;//总分
			BigDecimal anonymousScore = BigDecimal.ZERO;//加权平均分笔直综合
			BigDecimal jiaquan = BigDecimal.ZERO;//加权平均分
			//加权平均分=(实名评分×30%+专业能力×20%+服务态度×25%+回复速度×25%)/有效评价次数
			anonymousScore = anonymousScore.add(realScore.multiply(new BigDecimal("0.3")));
			anonymousScore =anonymousScore.add(anonymousScore1.multiply(new BigDecimal("0.2")));
			anonymousScore =anonymousScore.add(anonymousScore2.multiply(new BigDecimal("0.25")));
			anonymousScore =anonymousScore.add(anonymousScore3.multiply(new BigDecimal("0.25")));
    @Autowired
    EvaluateDao evaluateDao;
    @Autowired
    ConsultTeamService consultTeamService;
    @Autowired
    EvaluateLabelService evaluateLabelService;
    @Autowired
    JdbcTemplate jdbcTemplate;
    @Autowired
    ConsultTeamDoctorDao consultTeamDoctorDao;
    @Autowired
    EvaluateScoreDao evaluateScoreDao;
    private void save(Map<String, List<Evaluate>> docEvaMap) {
        for (String key : docEvaMap.keySet())
            evaluateDao.save(docEvaMap.get(key));
    }
    public void saveByJson(String jsonData, String patient) {
        JSONObject jsonObject = new JSONObject(jsonData);
        String consult = jsonObject.getString("consult");
        ConsultTeam consultTeam = consultTeamService.findByCode(consult);
        //评价的分数
        JSONArray evaluateArray = jsonObject.getJSONArray("evaluate");
        //标签
        JSONArray labelArray = jsonObject.getJSONArray("label");
        List<Evaluate> evaluateList = null;
        List<EvaluateLabel> evaluateLabelList = new ArrayList<>();
        Map<String, List<Evaluate>> docEvaMap = new HashMap<>();
        //反射生成评价对象
        for (Object evaluateObj : evaluateArray) {
            Evaluate evaluate = new Evaluate();
            JSONObject obj = (JSONObject) evaluateObj;
            ClazzReflect clazzReflect = new ClazzReflect();
            evaluate = (Evaluate) clazzReflect.formatToClazz(evaluate, obj);
            evaluate.setConsult(consult);
            evaluate.setPatient(patient);
            //把分数放入map中 给参与此次咨询的医生都评分
            if (docEvaMap.get(evaluate.getDoctor()) == null) {
                evaluateList = new ArrayList<>();
                evaluateList.add(evaluate);
                docEvaMap.put(evaluate.getDoctor(), evaluateList);
            } else {
                docEvaMap.get(evaluate.getDoctor()).add(evaluate);
            }
        }
        //反射得到标签内容
        for (Object labelObj : labelArray) {
            EvaluateLabel evaluateLabel = new EvaluateLabel();
            JSONObject obj = (JSONObject) labelObj;
            ClazzReflect clazzReflect = new ClazzReflect();
            evaluateLabel = (EvaluateLabel) clazzReflect.formatToClazz(evaluateLabel, obj);
            evaluateLabel.setConsult(consult);
            evaluateLabel.setPatient(patient);
            evaluateLabelList.add(evaluateLabel);
        }
        //计算单条得分
        evaluateScoreCal(docEvaMap, consult);
        this.save(docEvaMap);
        evaluateLabelService.save(evaluateLabelList);
        consultTeam.setEvaluate(1);
        consultTeam.setEvaluateTime(new Date());
        JSONObject topicObject = new JSONObject();
        topicObject.put("evaluate", 1);
        topicObject.put("evaluate_time", new Date());
        ImUtill.updateTopics(consult, topicObject.toString());
        this.consultTeamService.save(consultTeam);
    }
    /**
     * 查询某个咨询某种类型的评价
     *
     * @param consult
     * @param type
     * @return
     */
    public List<Evaluate> getEvaluateByConsultAndType(String consult, int type) {
        List<Evaluate> evaluates = evaluateDao.findByConsultAndType(consult, type);
        return evaluates;
    }
    /**
     * 查询某个咨询的评价
     *
     * @param consult
     * @return
     */
    public List<Evaluate> getEvaluateByConsult(String consult) {
        List<Evaluate> evaluates = evaluateDao.findByConsult(consult);
        return evaluates;
    }
    /**
     * 获取某个医生的某种类型的评价
     *
     * @param doctor
     * @param type
     * @return
     */
    public List<Evaluate> getEvaluateByDoctorAndType(String doctor, int type) {
        List<Evaluate> evaluates = evaluateDao.findByDoctorAndType(doctor, type);
        return evaluates;
    }
    private void evaluateScoreCal(Map<String, List<Evaluate>> docEvaMap, String consult) {
        for (String doctor : docEvaMap.keySet()) {
            List<Evaluate> evaluates = docEvaMap.get(doctor);
            if (evaluates.size() == 1) {
                //如果一条那么这条一定是实名,只有实名那么分数按实名的来存
                EvaluateScore evaluateScore = new EvaluateScore();
                evaluateScore.setConsult(consult);
                evaluateScore.setDoctor(doctor);
                evaluateScore.setScore(Double.valueOf(evaluates.get(0).getScore()));
                evaluateScoreDao.save(evaluateScore);
            } else {
                //如果既有实名和匿名的那么按照公式来存
                BigDecimal realScore = new BigDecimal(REAL_SCORE_DEFAULT);//实名评价
                BigDecimal anonymousScore1 = new BigDecimal(ANONYMOUS_SCORE_DEFAULT_ONE);//专业能力
                BigDecimal anonymousScore2 = new BigDecimal(ANONYMOUS_SCORE_DEFAULT_TWO);//服务态度
                BigDecimal anonymousScore3 = new BigDecimal(ANONYMOUS_SCORE_DEFAULT_THREE);//回复速度
                //计算此次评价的分数来源
                for (Evaluate evaluate : docEvaMap.get(doctor)) {
                    if (evaluate.getEvaluateType() == 0) {
                        realScore = BigDecimal.valueOf(evaluate.getScore());
                    } else if (evaluate.getEvaluateType() == 1) {
                        anonymousScore1 = BigDecimal.valueOf(evaluate.getScore());
                    } else if (evaluate.getEvaluateType() == 2) {
                        anonymousScore2 = BigDecimal.valueOf(evaluate.getScore());
                    } else if (evaluate.getEvaluateType() == 3) {
                        anonymousScore3 = BigDecimal.valueOf(evaluate.getScore());
                    }
                }
                String evaluateTimesSql = "select count(1) as count from wlyy_evaluate w where w.doctor =? GROUP BY w.consult,w.doctor";
                //有效评价次数
                List<Map<String, Object>> evaluateTimesList = jdbcTemplate.queryForList(evaluateTimesSql, new Object[]{doctor});
                //有效咨询次数
                int consultTimes = consultTeamDoctorDao.countByDoctorAndType(2, doctor);
                BigDecimal score = BigDecimal.ZERO;//总分
                BigDecimal anonymousScore = BigDecimal.ZERO;//加权平均分笔直综合
                BigDecimal jiaquan = BigDecimal.ZERO;//加权平均分
                //加权平均分=(实名评分×30%+专业能力×20%+服务态度×25%+回复速度×25%)/有效评价次数
                anonymousScore = anonymousScore.add(realScore.multiply(new BigDecimal("0.3")));
                anonymousScore = anonymousScore.add(anonymousScore1.multiply(new BigDecimal("0.2")));
                anonymousScore = anonymousScore.add(anonymousScore2.multiply(new BigDecimal("0.25")));
                anonymousScore = anonymousScore.add(anonymousScore3.multiply(new BigDecimal("0.25")));
//			int evaTimes = 0;
//			if(evaluateTimesList.size()>0){
//				evaTimes = evaluateTimesList.size();
@ -174,19 +193,21 @@ public class EvaluateService extends BaseService {
//				jiaquan = (jiaquan.subtract(BigDecimal.valueOf(80L))).divide(BigDecimal.valueOf(1L),2,BigDecimal.ROUND_HALF_UP);
//			}
//			score = jiaquan.add(BigDecimal.valueOf(80L)).setScale(1, BigDecimal.ROUND_HALF_UP);
			score=anonymousScore;
			EvaluateScore evaluateScore = new EvaluateScore();
			evaluateScore.setConsult(consult);
			evaluateScore.setDoctor(doctor);
			evaluateScore.setScore(score.doubleValue());
			evaluateScoreDao.save(evaluateScore);
		}
	};
                score = anonymousScore;
                EvaluateScore evaluateScore = new EvaluateScore();
                evaluateScore.setConsult(consult);
                evaluateScore.setDoctor(doctor);
                evaluateScore.setScore(score.doubleValue());
                evaluateScoreDao.save(evaluateScore);
            }
        }
    }
    ;
	public static Long REAL_SCORE_DEFAULT =100L;
	public static Long ANONYMOUS_SCORE_DEFAULT_ONE =100L;
	public static Long ANONYMOUS_SCORE_DEFAULT_TWO =100L;
	public static Long ANONYMOUS_SCORE_DEFAULT_THREE =100L;
    public static Long REAL_SCORE_DEFAULT = 100L;
    public static Long ANONYMOUS_SCORE_DEFAULT_ONE = 100L;
    public static Long ANONYMOUS_SCORE_DEFAULT_TWO = 100L;
    public static Long ANONYMOUS_SCORE_DEFAULT_THREE = 100L;
}