| 
					
				 | 
			
			
				@ -57,6 +57,7 @@ public class StatisticsESService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private SystemDictService systemDictService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXX"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 获取上次统计时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -1927,4 +1928,192 @@ public class StatisticsESService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public JSONObject getRenewAnalysis(String switchIndex, String switchIndexReson, String signIn, String signOut, String level, String code) throws Exception{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject jo = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //获取统计的最新事件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String quotaDate = elasticsearchUtil.getQuotaTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //获取转签人数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        int switchNum = getLevel1NumForRedis(switchIndex, level, code, quotaDate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //获取转签分布 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONArray switchJO = getLevel2JsonObjectForRedis(switchIndexReson, level, code, quotaDate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //获取签入人数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        int inNum = getLevel1NumForRedis(signIn, level, code, quotaDate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //获取签出人数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        int outNum = getLevel1NumForRedis(signOut, level, code, quotaDate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        int changeTeam = getLevel1NumForRedis("31", level, code, quotaDate);//夸团队的数目 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        int changeHospital = getLevel1NumForRedis("32", level, code, quotaDate);//夸社区的数目 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        int changeTown = getLevel1NumForRedis("33", level, code, quotaDate);//夸社区的数目 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        int allChangeCount = changeTeam + changeHospital + changeTown; //跨团队,跨社区 跨区的分母 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        jo.put("inNum", inNum);//今年的签入量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        jo.put("outNum", outNum);//今年的签出量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        jo.put("thisYearSwithch", switchNum);//今年的转签量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        jo.put("switchHealth", switchJO);//今年的服务分布 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String changeTeamNum = getRangeNoLast(changeTeam, allChangeCount, 2);//跨团队转签率 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String changeHospNum = getRangeNoLast(changeHospital, allChangeCount, 2);//跨社区转签率 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String changeTownNum = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //保留两位小数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        DecimalFormat df = new DecimalFormat("######0.00"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (changeTown == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            changeTownNum = "0"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            changeTownNum = df.format(100 - Double.valueOf(changeTeamNum) - Double.valueOf(changeHospNum)) + "";//跨区转签率,解决算出来可能不是100%的问题 用扣的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        jo.put("switchTeam", changeTeamNum + "%");//今年的转签量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        jo.put("switchHospital", changeHospNum + "%");//今年的转签量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        jo.put("switchTown", changeTownNum + "%");//今年的转签量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return jo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 通用的方法 获取一级维度的数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param index 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param level 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param code 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param timeKey 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private int getLevel1NumForRedis(String index, String level, String code, String timeKey) throws Exception{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        SaveModel saveModel = elasticsearchUtil.findOneDateQuotaLevel0(timeKey,code,Integer.parseInt(level),index,"2"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return saveModel.getResult2(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 通用的方法 获取二级维度的数据列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param index 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param level 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param code 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param timeKey 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private JSONArray getLevel2JsonObjectForRedis(String index, String level, String code, String timeKey) throws Exception{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        List<SaveModel> list = elasticsearchUtil.findOneDateQuotaLevel1(timeKey,code,Integer.parseInt(level),index,"2"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        JSONObject jo = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONArray switchJo = new JSONArray(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        list.stream().forEach(one->{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Map<String,Object> map = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            map.put("date",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(one.getQuotaDate())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if (SaveModel.teamLevel.equals(level)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                map.put("code",one.getTeam()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                map.put("name",one.getTeamName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } else if (SaveModel.OrgLevel.equals(level)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                map.put("code",one.getHospital()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                map.put("name",one.getHospitalName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } else if (SaveModel.townLevel.equals(level)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                map.put("code",one.getTown()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                map.put("name",one.getTownName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } else if (SaveModel.cityLevel.equals(level)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                map.put("code",one.getCity()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                map.put("name",one.getCityName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            map.put("num",one.getResult2()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            switchJo.put(map); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return switchJo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public String getRangeNoLast(int first, int second, int i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (second == 0 && first > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            return "100"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } else if (second == 0 && first == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            return "0"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        float size = (float) (first * 100) / second; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        DecimalFormat df = new DecimalFormat("0.00");//格式化小数,不足的补0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String filesize = df.format(size); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return filesize; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 查询某个级别的某个指标到达量(单条记录) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param date 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param area 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param level 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public JSONObject getLowLevelTotalSingle2(String date, String area, int level) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //获取微信关注的未交费 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        Map<String, Object> expenseStatus0 = getByIndexSingle(date, area, level, "49",dateFormat); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        SaveModel expenseStatus0 = elasticsearchUtil.findOneDateQuotaLevel0(date,area,level,"49","2"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //获取微信关注的已交费 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        Map<String, Object> expenseStatus1 = getByIndexSingle(date, area, level, "50",dateFormat); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        SaveModel expenseStatus1 = elasticsearchUtil.findOneDateQuotaLevel0(date,area,level,"50","2"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //获取已缴费的签约数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        Map<String, Object> expenseStatus1Sigjn = getByIndexSingle(date, area, level, "1",dateFormat); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        SaveModel expenseStatus1Sigjn = elasticsearchUtil.findOneDateQuotaLevel0(date,area,level,"1","2"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject jsonObject = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (SaveModel.teamLevel.equals(level)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            jsonObject.put("name", expenseStatus1Sigjn.getTeamName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } else if (SaveModel.OrgLevel.equals(level)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            jsonObject.put("name", expenseStatus1Sigjn.getHospitalName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } else if (SaveModel.townLevel.equals(level)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            jsonObject.put("name", expenseStatus1Sigjn.getTownName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } else if (SaveModel.cityLevel.equals(level)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            jsonObject.put("name", expenseStatus1Sigjn.getCityName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        jsonObject.put("code", area); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Long  weChatAmount0 =  Long.valueOf(expenseStatus0.getResult2().toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Long  weChatAmount1 =  Long.valueOf(expenseStatus1.getResult2().toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Long  signAccount =  Long.valueOf(expenseStatus1Sigjn.getResult2().toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        jsonObject.put("weChatAmount0", weChatAmount0);//微信关注未交费数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        jsonObject.put("weChatAmount1", weChatAmount1);//微信关注已交费数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        jsonObject.put("bindRate", getRangeDouuble(weChatAmount1.intValue(), signAccount.intValue(), 2));//微信关注率 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return jsonObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 获取某个指标某一天某一level的值 到达量(单条记录) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param date 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param area 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param level 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param index 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param dateFormat 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private Map<String,Object> getByIndexSingle(String date, String area, int level, String index, SimpleDateFormat dateFormat) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Map<String,Object> map =null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (date.compareTo(dateFormat.format(new Date())) >= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            map = getTodayLowLevelTotalSingle(date, area, level, index); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return map; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 获取今天某个区域一级指标的下级统计(单条记录) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param area 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param level 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param index 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public Map<String, Object> getTodayLowLevelTotalSingle(String date, String area, int level, String index) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Map<String, Object> data = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String redisData = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//            redisData = redisTemplate.opsForValue().get("quota:" + index + ":" + level + ":" + area  + ":" + getQuotaTimeStamp()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            redisData = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (!org.springframework.util.StringUtils.isEmpty(redisData)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            JSONObject json = new JSONObject(redisData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            data.put("code", String.valueOf(json.get("code"))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            data.put("name", String.valueOf(json.get("name"))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            data.put("amount",String.valueOf(json.get("num"))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Calendar today = Calendar.getInstance(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            today.add(Calendar.DATE, -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String preDate = new SimpleDateFormat("yyyy-MM-dd").format(today.getTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//            data = getTodayBeforeLowLevelTotalSingle(preDate, area, level, index); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				} 
			 |