Bläddra i källkod

Merge branch 'dev' of chenweida/patient-co-management into dev

chenweida 8 år sedan
förälder
incheckning
3ad142884b
22 ändrade filer med 2869 tillägg och 2240 borttagningar
  1. 224 0
      src/main/java/com/yihu/wlyy/job/AllSignJob.java
  2. 79 170
      src/main/java/com/yihu/wlyy/job/ChangeSignJob.java
  3. 4 4
      src/main/java/com/yihu/wlyy/job/Constant.java
  4. 69 169
      src/main/java/com/yihu/wlyy/job/ConsultJob.java
  5. 827 867
      src/main/java/com/yihu/wlyy/job/CurrentDayAllQuotaJob.java
  6. 86 130
      src/main/java/com/yihu/wlyy/job/FollowUpJob.java
  7. 65 146
      src/main/java/com/yihu/wlyy/job/HealthGuideJob.java
  8. 254 454
      src/main/java/com/yihu/wlyy/job/SignJob.java
  9. 86 149
      src/main/java/com/yihu/wlyy/job/UnSignJob.java
  10. 85 147
      src/main/java/com/yihu/wlyy/job/WaitSignJob.java
  11. 62 0
      src/main/java/com/yihu/wlyy/job/elt/base/ETLModel.java
  12. 78 0
      src/main/java/com/yihu/wlyy/job/elt/role/LevelRole.java
  13. 88 0
      src/main/java/com/yihu/wlyy/job/elt/role/PatientAgeRole.java
  14. 74 0
      src/main/java/com/yihu/wlyy/job/elt/role/PatientGroupRole.java
  15. 70 0
      src/main/java/com/yihu/wlyy/job/elt/role/PatientSexRole.java
  16. 397 0
      src/main/java/com/yihu/wlyy/job/elt/storage/DBStorage.java
  17. 300 0
      src/main/java/com/yihu/wlyy/job/elt/storage/RedisStorage.java
  18. 1 2
      src/main/java/com/yihu/wlyy/repository/doctor/DoctorAdminTeamMemberDao.java
  19. 3 0
      src/main/java/com/yihu/wlyy/repository/patient/SignFamilyDao.java
  20. 1 0
      src/main/java/com/yihu/wlyy/service/app/team/AdminTeamService.java
  21. 1 1
      src/main/java/com/yihu/wlyy/service/quota/JobService.java
  22. 15 1
      src/main/java/com/yihu/wlyy/web/doctor/team/AdminTeamController.java

+ 224 - 0
src/main/java/com/yihu/wlyy/job/AllSignJob.java

@ -0,0 +1,224 @@
package com.yihu.wlyy.job;
import com.yihu.wlyy.entity.address.Town;
import com.yihu.wlyy.entity.doctor.team.admin.AdminTeam;
import com.yihu.wlyy.entity.job.QuartzJobLog;
import com.yihu.wlyy.entity.organization.Hospital;
import com.yihu.wlyy.entity.patient.SignFamily;
import com.yihu.wlyy.job.elt.base.ETLModel;
import com.yihu.wlyy.job.elt.role.LevelRole;
import com.yihu.wlyy.job.elt.storage.DBStorage;
import com.yihu.wlyy.repository.address.TownDao;
import com.yihu.wlyy.repository.doctor.DoctorAdminTeamDao;
import com.yihu.wlyy.repository.job.QuartzJobLogDao;
import com.yihu.wlyy.repository.organization.HospitalDao;
import com.yihu.wlyy.repository.patient.SignFamilyDao;
import com.yihu.wlyy.web.quota.WlyyJobConfigVO;
import com.yihu.wlyy.web.quota.WlyyQuotaVO;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * Created by Administrator on 2016.10.10.
 */
@Component
public class AllSignJob implements Job {
    private WlyyQuotaVO wlyyQuota;//指标对象
    private WlyyJobConfigVO wlyyJobConfig;//配置对象
    @Autowired
    private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
    @Autowired
    private SignFamilyDao signFamilyDao;
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
    private TownDao townDao;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    @Autowired
    private LevelRole levelRole;
    @Autowired
    private DBStorage dbStorage;
    String date; //起始时间
    public void execute(JobExecutionContext context)
            throws JobExecutionException {
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        //初始化参数
        JobDataMap map = context.getJobDetail().getJobDataMap();
        wlyyQuota = (WlyyQuotaVO) map.get("quota");
        wlyyJobConfig = (WlyyJobConfigVO) map.get("jobConfig");
        date= StringUtils.isEmpty(map.get("yesterday"))?SignJob.getDayString(-1):map.get("yesterday").toString();
        //计算指标
        computequota();
    }
    /**
     * 计算指标
     */
    @Transactional
    private void computequota() {
        jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='"+date+"' and quato_code='"+13+"'");
        //新建任务日志对象
        QuartzJobLog quartzJobLog = new QuartzJobLog();
        quartzJobLog.setJobStartTime(new Date());
        quartzJobLog.setJobId(wlyyJobConfig.getId());
        quartzJobLog.setJobName(wlyyJobConfig.getJobName());
        //查找出系统全部的全科医生
        List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
        Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
        for (AdminTeam adminTeam : adminTeams) {
            adminTeamMap.put(adminTeam.getId()+"", adminTeam);
        }
        //查找出系统全部的机构
        List<Hospital> hospitals = hospitalDao.findHospital2();
        Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
        for (Hospital hospital : hospitals) {
            hospitalsMap.put(hospital.getCode(), hospital);
        }
        //查找出厦门市全部的区
        List<Town> towns = townDao.findByCityCode(Constant.city);
        Map<String, Town> townsMap = new HashMap<String, Town>();
        for (Town town : towns) {
            townsMap.put(town.getCode(), town);
        }
        //找出今天的已改簽信息
        String dateTemp=date+" 17:30:00 ";
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(dateTemp);
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        StringBuffer errorContent=new StringBuffer();
        //统计有已改簽的
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        //数据过滤清洗出脏数据  -----------start
        for(SignFamily signFamily:signFamilys){
            ETLModel etlModel=new ETLModel();
            String orgCode = signFamily.getHospital();
            if(StringUtils.isEmpty(orgCode)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            String orgCodeTemp="";
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                //站
                orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
            }else{
                //社区
                orgCodeTemp=orgCode;
            }
            //判断社区有没有值
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            Long adminId=signFamily.getAdminTeamId();
            if(adminId == null||adminId<=0) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
            if(adminTeam == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            String idCard=signFamily.getIdcard();
            if(idCard == null||(idCard.length()==18||idCard.length()==15)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
                isAll=false;
                errorCount++;
                continue;
            }
            String town =hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
                isAll=false;
                errorCount++;
                continue;
            }
            Town townObj =townsMap.get(town);
            if(townObj==null) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            etlModel.setAdminTeam(adminTeam.getId()+"");
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModel.setIdcard(signFamily.getIdcard());
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            townCount++;
            orgCount++;
            adminCount++;
        }
        //数据过滤清洗出脏数据  -----------end
        try{
            //统计数据
            List<Map<String, List<ETLModel>>>  returnDatas= levelRole.elt(etlModels);
            //保存数据
            dbStorage.saveByLevel1(returnDatas,date,wlyyQuota);
        }catch (Exception e){
            errorContent.append("统计失败:"+e.getMessage());
        }
        //保存日志
        quartzJobLog.setJobEndTime(new Date());
        quartzJobLog.setJobContent(saveContent(signFamilys,adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
        quartzJobLog.setJobType(isAll?"1":"0");
        quartzJobLogDao.save(quartzJobLog);
    }
    private String saveContent(List<SignFamily> signFamilys, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent,Long errorCount) {
        StringBuffer string=new StringBuffer("统计"+date+" 的簽約数据完成 ,数据库查询到簽約数据:"+signFamilys.size());
        string.append(",过滤的脏数据数目:"+errorCount);
        string.append(",统计到市的数据总数:"+cityCount);
        string.append(",统计到区的数据总数:"+townCount);
        string.append(",统计到机构的数据总数:"+orgCount);
        string.append(",统计到团队的数据总数:"+qkCount);
        string.append(",是否统计成功:"+isAll);
        if(!isAll){
            string.append(",失败原因:"+errorContent);
        }
        return string.toString();
    }
    public String getYesterday() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -1);
        String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
        return yesterday;
    }
}

+ 79 - 170
src/main/java/com/yihu/wlyy/job/ChangeSignJob.java

@ -3,17 +3,16 @@ package com.yihu.wlyy.job;
import com.yihu.wlyy.entity.doctor.team.admin.AdminTeam;
import com.yihu.wlyy.entity.organization.Hospital;
import com.yihu.wlyy.entity.address.Town;
import com.yihu.wlyy.entity.doctor.profile.Doctor;
import com.yihu.wlyy.entity.job.QuartzJobLog;
import com.yihu.wlyy.entity.patient.SignFamily;
import com.yihu.wlyy.entity.statistics.WlyyQuotaResult;
import com.yihu.wlyy.job.elt.base.ETLModel;
import com.yihu.wlyy.job.elt.role.LevelRole;
import com.yihu.wlyy.job.elt.storage.DBStorage;
import com.yihu.wlyy.repository.address.TownDao;
import com.yihu.wlyy.repository.doctor.DoctorAdminTeamDao;
import com.yihu.wlyy.repository.doctor.DoctorDao;
import com.yihu.wlyy.repository.job.QuartzJobLogDao;
import com.yihu.wlyy.repository.organization.HospitalDao;
import com.yihu.wlyy.repository.patient.SignFamilyDao;
import com.yihu.wlyy.repository.statistics.WlyyQuotaResultDao;
import com.yihu.wlyy.web.quota.WlyyJobConfigVO;
import com.yihu.wlyy.web.quota.WlyyQuotaVO;
import org.quartz.Job;
@ -38,14 +37,10 @@ public class ChangeSignJob implements Job {
    private WlyyQuotaVO wlyyQuota;//指标对象
    private WlyyJobConfigVO wlyyJobConfig;//配置对象
    @Autowired
    private WlyyQuotaResultDao wlyyQuotaResultDao;//指标结果Dao
    @Autowired
    private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
    @Autowired
    private SignFamilyDao signFamilyDao;
    @Autowired
    private DoctorDao doctorDao;
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
    private TownDao townDao;
@ -53,9 +48,13 @@ public class ChangeSignJob implements Job {
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    @Autowired
    private LevelRole levelRole;
    @Autowired
    private DBStorage dbStorage;
    String yesterday;
    String now;
    String yesterday; //起始时间
    String now;//结束时间
    public void execute(JobExecutionContext context)
            throws JobExecutionException {
@ -77,7 +76,6 @@ public class ChangeSignJob implements Job {
    @Transactional
    private void computequota() {
        jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='"+yesterday+"' and quato_code='"+10+"'");
        //新建任务日志对象
        QuartzJobLog quartzJobLog = new QuartzJobLog();
        quartzJobLog.setJobStartTime(new Date());
@ -105,18 +103,25 @@ public class ChangeSignJob implements Job {
        //找出今天的已改簽信息
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingChaangeSignYesterday(yesterday,now);
        Map<String, Long> tjTownMap = new HashMap<String, Long>();//区级的统计map key 是区行政区划350200
        Map<String, Long> tjOrgMap = new HashMap<String, Long>();//机构的统计map key 是机构的code
        Map<String, Long> tjAdminTeamMap = new HashMap<String, Long>();//团队级的统计map 目前没有团队 先用全科医生统一  key doctorCode
        Long cityCount = 0L; //统计到市的数目
        Long townCount = 0L; //统计到所有区的数目
        Long orgCount = 0L;//统计到所有机构的数目
        Long qkCount = 0L;//统计到所有全科医生的数目
        boolean isAll=true;//是否统计失败
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        StringBuffer errorContent=new StringBuffer();
        //统计有已改簽的
        for (SignFamily signFamily : signFamilys) {
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        //数据过滤清洗出脏数据  -----------start
        for(SignFamily signFamily:signFamilys){
            ETLModel etlModel=new ETLModel();
            String orgCode = signFamily.getHospital();
            if(StringUtils.isEmpty(orgCode)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            String orgCodeTemp="";
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                //站
@ -125,117 +130,80 @@ public class ChangeSignJob implements Job {
                //社区
                orgCodeTemp=orgCode;
            }
            //判断社区有没有值
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据异常");
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            Long adminId=signFamily.getAdminTeamId();
            if(adminId == null||adminId<=0) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
            if(adminTeam == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据异常");
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            String idCard=signFamily.getIdcard();
            if(idCard == null||(idCard.length()==18||idCard.length()==15)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
                isAll=false;
                errorCount++;
                continue;
            }
            String town =hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
                isAll=false;
                errorCount++;
                continue;
            }
            Town townObj =townsMap.get(town);
            if(townObj==null) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            //统计市 ---------------start--------------
            etlModel.setAdminTeam(adminTeam.getId()+"");
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModel.setIdcard(signFamily.getIdcard());
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            //统计区 ---------------start--------------
            String townCode = hospital.getTown();
            compute(tjTownMap, townCode);
            townCount++;
            //统计机构---------------start--------------
            compute(tjOrgMap, orgCodeTemp);
            orgCount++;
            //统计团队 ---------------start--------------
            String adminTeamId = signFamily.getAdminTeamId()+"";
            compute(tjAdminTeamMap, adminTeamId);
            qkCount++;
        }
        //保存统计的结果
        for (Map.Entry<String, AdminTeam> entry : adminTeamMap.entrySet()) {
            AdminTeam adminTeam = adminTeamMap.get(entry.getKey());//得到全科医生
            String orgCodeTemp=getOrg(adminTeam.getOrgCode());
            Hospital hospital = hospitalsMap.get(orgCodeTemp);//得到全科医生的机构
            if(hospital == null) continue;
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=hospital.getTown();
            String townName=hospital.getTownName();
            String org=hospital.getCode();
            if(!"00".equals(hospital.getCode().substring(hospital.getCode().length()-2,hospital.getCode().length()))){
                //统计站
                org=hospital.getCode().substring(0,hospital.getCode().length()-2)+"00";
            }
            String orgName=hospital.getName();
            String doctorCode=adminTeam.getId()+"";
            String doctorName=adminTeam.getName();
            String doctorJob="";
            String level="1";
            String key=adminTeam.getId()+"";
            save(tjAdminTeamMap, key, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level);
        }
        //保存机构的改签统计
        for (Map.Entry<String, Hospital> entry : hospitalsMap.entrySet()) {
            Hospital hospital = hospitalsMap.get(entry.getKey());//得到全科医生
            if(hospital == null) continue;
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=hospital.getTown();
            String townName=hospital.getTownName();
            String org=hospital.getCode();
            String orgName=hospital.getName();
            String doctorCode="";
            String doctorName="";
            String doctorJob="";
            String level="2";
            String key=hospital.getCode();
            save(tjOrgMap, key, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level);
        }
        //保存区级的改签统计
        for (Map.Entry<String, Town> entry : townsMap.entrySet()) {
            Town townObj = townsMap.get(entry.getKey());//得到全科医生
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=townObj.getCode();
            String townName=townObj.getName();
            String org="";
            String orgName="";
            String doctorCode="";
            String doctorName="";
            String doctorJob="";
            String level="3";
            String key=townObj.getCode();
            save(tjTownMap, key, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level);
            adminCount++;
        }
        //保存市级的统计
        {
            WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
            wlyyQuotaResult.setDel("1");
            wlyyQuotaResult.setCity(Constant.city);
            wlyyQuotaResult.setCityName(Constant.cityName);
            wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
            wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
            wlyyQuotaResult.setQuotaDate(getYesterday());
            wlyyQuotaResult.setCreateTime(new Date());
            wlyyQuotaResult.setLevel1Type("4");
            //判断全科医生是否有改签量
            if (cityCount > 0) {
                wlyyQuotaResult.setResult(cityCount + "");
            } else {
                wlyyQuotaResult.setResult("0");
            }
            wlyyQuotaResultDao.save(wlyyQuotaResult);
        //数据过滤清洗出脏数据  -----------end
        try{
            //统计数据
            List<Map<String, List<ETLModel>>>  returnDatas= levelRole.elt(etlModels);
            //保存数据
            dbStorage.saveByLevel1(returnDatas,yesterday,wlyyQuota);
        }catch (Exception e){
            errorContent.append("统计失败:"+e.getMessage());
        }
        //保存日志
        quartzJobLog.setJobEndTime(new Date());
        quartzJobLog.setJobContent(saveContent(signFamilys,qkCount,orgCount,townCount,cityCount,isAll,errorContent));
        quartzJobLog.setJobContent(saveContent(signFamilys,adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
        quartzJobLog.setJobType(isAll?"1":"0");
        quartzJobLogDao.save(quartzJobLog);
    }
    private String saveContent(List<SignFamily> signFamilys, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent) {
    private String saveContent(List<SignFamily> signFamilys, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent,Long errorCount) {
        StringBuffer string=new StringBuffer("统计"+getYesterday()+" 的已改簽数据完成 ,数据库查询到改签数目:"+signFamilys.size());
        string.append(",过滤的脏数据数目:"+errorCount);
        string.append(",统计到市的数据总数:"+cityCount);
        string.append(",统计到区的数据总数:"+townCount);
        string.append(",统计到机构的数据总数:"+orgCount);
@ -247,70 +215,11 @@ public class ChangeSignJob implements Job {
        return string.toString();
    }
    /**
     * 统计规则
     * @param tjQkdoctorMap
     * @param doctorCode
     */
    private void compute(Map<String, Long> tjQkdoctorMap, String doctorCode) {
        if (tjQkdoctorMap.containsKey(doctorCode)) {
            tjQkdoctorMap.put(doctorCode, tjQkdoctorMap.get(doctorCode) + 1);
        } else {
            tjQkdoctorMap.put(doctorCode, 1L);
        }
    }
    /**
     * 保存方案
     * @param countMap
     * @param key
     * @param city
     * @param cityName
     * @param town
     * @param townName
     * @param org
     * @param orgName
     * @param doctorCode
     * @param doctorName
     * @param doctorJob
     * @param level
     */
    private void save(Map<String, Long> countMap, String key, String city, String cityName, String town, String townName, String org, String orgName, String doctorCode, String doctorName, String doctorJob, String level) {
        WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
        wlyyQuotaResult.setDel("1");
        wlyyQuotaResult.setOrgCode(org);
        wlyyQuotaResult.setOrgName(orgName);
        wlyyQuotaResult.setCity(city);
        wlyyQuotaResult.setCityName(cityName);
        wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
        wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
        wlyyQuotaResult.setQuotaDate(getYesterday());
        wlyyQuotaResult.setCreateTime(new Date());
        wlyyQuotaResult.setQkdoctorJobName(doctorJob);
        wlyyQuotaResult.setQkdoctorName(doctorName);
        wlyyQuotaResult.setQkdoctorCode(doctorCode);
        wlyyQuotaResult.setTown(town);
        wlyyQuotaResult.setTownName(townName);
        wlyyQuotaResult.setLevel1Type(level);
        //判断全科医生是否有改签量
        if (countMap.containsKey(key)) {
            wlyyQuotaResult.setResult(countMap.get(key) + "");
        } else {
            wlyyQuotaResult.setResult("0");
        }
        wlyyQuotaResultDao.save(wlyyQuotaResult);
    }
    private String getOrg(String org){
        if(!"00".equals(org.substring(org.length()-2,org.length()))){
            return org.substring(0,org.length()-2)+"00";
        }else{
            return org;
        }
    }
    public String getYesterday() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -1);
        String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
        return yesterday;
    }
}

+ 4 - 4
src/main/java/com/yihu/wlyy/job/Constant.java

@ -50,13 +50,13 @@ public class Constant {
    public static String level_group_3="3";
    public static String level_group_4="4";
    public static String level_group_5="5";
    public static String level_group_100="100";
    public static String level_group_6="6";
    public static String level_group_1_name="普通人群";
    public static String level_group_2_name="慢病人群";
    public static String level_group_3_name="65岁以上人群";
    public static String level_group_4_name="高血压";
    public static String level_group_5_name="糖尿病";
    public static String level_group_100_name="糖尿病和高血压";
    public static String level_group_6_name="糖尿病和高血压";
    //三级维度的疾病
    public static String level_disease_1="1";
@ -85,8 +85,8 @@ public class Constant {
            case "5":{
                return level_group_5_name;
            }
            case "100":{
                return level_group_100_name;
            case "6":{
                return level_group_6_name;
            }
        }
        return "";

+ 69 - 169
src/main/java/com/yihu/wlyy/job/ConsultJob.java

@ -8,12 +8,16 @@ import com.yihu.wlyy.entity.doctor.profile.Doctor;
import com.yihu.wlyy.entity.job.QuartzJobLog;
import com.yihu.wlyy.entity.patient.SignFamily;
import com.yihu.wlyy.entity.statistics.WlyyQuotaResult;
import com.yihu.wlyy.job.elt.base.ETLModel;
import com.yihu.wlyy.job.elt.role.LevelRole;
import com.yihu.wlyy.job.elt.storage.DBStorage;
import com.yihu.wlyy.repository.address.TownDao;
import com.yihu.wlyy.repository.consult.ConsultTeamDao;
import com.yihu.wlyy.repository.doctor.DoctorAdminTeamDao;
import com.yihu.wlyy.repository.doctor.DoctorDao;
import com.yihu.wlyy.repository.job.QuartzJobLogDao;
import com.yihu.wlyy.repository.organization.HospitalDao;
import com.yihu.wlyy.repository.patient.SignFamilyDao;
import com.yihu.wlyy.repository.statistics.WlyyQuotaResultDao;
import com.yihu.wlyy.web.quota.WlyyJobConfigVO;
import com.yihu.wlyy.web.quota.WlyyQuotaVO;
@ -28,6 +32,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import java.text.SimpleDateFormat;
import java.util.*;
/**
@ -39,12 +44,8 @@ public class ConsultJob implements Job {
    private WlyyQuotaVO wlyyQuota;//指标对象
    private WlyyJobConfigVO wlyyJobConfig;//配置对象
    @Autowired
    private WlyyQuotaResultDao wlyyQuotaResultDao;//指标结果Dao
    @Autowired
    private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
    @Autowired
    private DoctorDao doctorDao;
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
    private TownDao townDao;
@ -54,6 +55,10 @@ public class ConsultJob implements Job {
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    @Autowired
    private LevelRole levelRole;
    @Autowired
    private DBStorage dbStorage;
    String yesterday;
    String now;
@ -100,28 +105,39 @@ public class ConsultJob implements Job {
            townsMap.put(town.getCode(), town);
        }
        //找出今天的咨询信息
       List<ConsultTeam> consultTeams = consultTeamDao.findByCzrqyYesterday(yesterday,now);
        Map<String, Long> tjTownMap = new HashMap<String, Long>();//区级的统计map key 是区行政区划350200
        Map<String, Long> tjOrgMap = new HashMap<String, Long>();//机构的统计map key 是机构的code
        Map<String, Long> tjAdminTeamMap = new HashMap<String, Long>();//团队级的统计map 目前没有团队 先用全科医生统一  key doctorCode
        Long cityCount = 0L; //统计到市的数目
        Long townCount = 0L; //统计到所有区的数目
        Long orgCount = 0L;//统计到所有机构的数目
        Long jkCount = 0L;//统计到所有健康医生的数目
        boolean isAll=true;//是否统计失败
        List<ConsultTeam> consultTeams = consultTeamDao.findByCzrqyYesterday(yesterday,now);
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        StringBuffer errorContent=new StringBuffer();
        //统计有咨询的
        for (ConsultTeam consultTeam : consultTeams) {
        //统计有已改簽的
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        //数据过滤清洗出脏数据  -----------start
        for(ConsultTeam consultTeam:consultTeams){
            ETLModel etlModel=new ETLModel();
            Long adminId=consultTeam.getAdminTeamId();
            if(adminId == null||adminId<=0) {
                errorContent.append("咨询Id:"+consultTeam.getId()+",咨询的团队(wlyy_consult_team)中的admin_team_code数据为空");
                isAll=false;
                continue;
            }
            String teamCode = consultTeam.getAdminTeamId()+"";//行政的团队的id
            AdminTeam adminTeam=adminTeamMap.get(teamCode);
            if(adminTeam == null) {
                errorContent.append("咨询Id:"+consultTeam.getId()+",咨询的团队为空或者不存在");
                errorContent.append("咨询Id:"+consultTeam.getId()+",团队Id:"+adminTeam.getId()+",咨询的团队(wlyy_consult_team)中的团队不存在");
                isAll=false;
                continue;
            }
            String orgCode = adminTeam.getOrgCode();
            if(StringUtils.isEmpty(orgCode)) {
                errorContent.append("咨询Id:"+consultTeam.getId()+",团队Id:"+adminTeam.getId()+",医生团队的机构为空");
                isAll=false;
                continue;
            }
            String orgCodeTemp="";
            //统计机构
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
@ -134,170 +150,52 @@ public class ConsultJob implements Job {
            //统计区 ---------------start--------------
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                errorContent.append("咨询Id:"+consultTeam.getId()+",咨询的健康医生(doctor字段)的所属机构(wlyy_doctor表中的hospital字段)为空或者所属的机构数据有问题");
                errorContent.append("咨询Id:"+consultTeam.getId()+",机构Id:"+hospital.getId()+",医生团队的机构不存在");
                isAll=false;
                continue;
            }
            //统计市 ---------------start--------------
            String town=hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("咨询Id:"+consultTeam.getId()+",机构Id:"+hospital.getId()+",机构表的区字段(town)为空");
                isAll=false;
                continue;
            }
            Town townObj=townsMap.get(town);
            if(townObj==null) {
                errorContent.append("咨询Id:"+consultTeam.getId()+",机构Id:"+hospital.getId()+",机构表的区不存在");
                isAll=false;
                continue;
            }
            etlModel.setAdminTeam(adminTeam.getId()+"");
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            //统计区 ---------------start--------------
            String townCode = hospital.getTown();
            compute(tjTownMap, townCode);
            townCount++;
            //统计机构 ---------------start--------------
            compute(tjOrgMap, orgCodeTemp);
            orgCount++;
            //统计团队 ---------------start--------------
            compute(tjAdminTeamMap, teamCode);
            jkCount++;
        }
        //保存统计的结果
        //保存全科医生的咨询统计
        for (Map.Entry<String, AdminTeam> entry : adminTeamMap.entrySet()) {
            AdminTeam adminTeam = adminTeamMap.get(entry.getKey());//得到团队
            String orgCodeTemp=getOrg(adminTeam.getOrgCode());
            Hospital hospital = hospitalsMap.get(orgCodeTemp);//得到全科医生的机构
            if(hospital == null) continue;
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=hospital.getTown();
            String townName=hospital.getTownName();
            String org=hospital.getCode();
            if(!"00".equals(hospital.getCode().substring(hospital.getCode().length()-2,hospital.getCode().length()))){
                //统计站
                org=hospital.getCode().substring(0,hospital.getCode().length()-2)+"00";
            }
            String orgName=hospital.getName();
            String doctorCode=adminTeam.getId()+"";
            String doctorName=adminTeam.getName();
            String doctorJob="";
            String level="1";
            String key=adminTeam.getId()+"";
            save(tjAdminTeamMap, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level, key);
        }
        //保存机构的咨询统计
        for (Map.Entry<String, Hospital> entry : hospitalsMap.entrySet()) {
            Hospital hospital = hospitalsMap.get(entry.getKey());
            if(hospital == null) continue;
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=hospital.getTown();
            String townName=hospital.getTownName();
            String org=hospital.getCode();
            String orgName=hospital.getName();
            String doctorCode="";
            String doctorName="";
            String doctorJob="";
            String level="2";
            String key=hospital.getCode();
            save(tjOrgMap, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level, key);
            adminCount++;
        }
        //保存区级的咨询统计
        for (Map.Entry<String, Town> entry : townsMap.entrySet()) {
            Town townObj = townsMap.get(entry.getKey());
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=townObj.getCode();
            String townName=townObj.getName();
            String org="";
            String orgName="";
            String doctorCode="";
            String doctorName="";
            String doctorJob="";
            String level="3";
            String key=townObj.getCode();
            save(tjTownMap, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level, key);
        }
        //保存市级的统计
        {
            WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
            wlyyQuotaResult.setDel("1");
            wlyyQuotaResult.setCity(Constant.city);
            wlyyQuotaResult.setCityName(Constant.cityName);
            wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
            wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
            wlyyQuotaResult.setQuotaDate(getYesterday());
            wlyyQuotaResult.setCreateTime(new Date());
            wlyyQuotaResult.setLevel1Type("4");
            //判断全科医生是否有咨询量
            if (cityCount > 0) {
                wlyyQuotaResult.setResult(cityCount + "");
            } else {
                wlyyQuotaResult.setResult("0");
            }
            wlyyQuotaResultDao.save(wlyyQuotaResult);
        //数据过滤清洗出脏数据  -----------end
        try{
            //统计数据
            List<Map<String, List<ETLModel>>>  returnDatas= levelRole.elt(etlModels);
            //保存数据
            dbStorage.saveByLevel1(returnDatas,yesterday,wlyyQuota);
        }catch (Exception e){
            errorContent.append("统计失败:"+e.getMessage());
        }
        //保存日志
        quartzJobLog.setJobEndTime(new Date());
        quartzJobLog.setJobContent(saveContent(consultTeams,jkCount,orgCount,townCount,cityCount,isAll,errorContent));
        quartzJobLog.setJobContent(saveContent(consultTeams,adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
        quartzJobLog.setJobType(isAll?"1":"0");
        quartzJobLogDao.save(quartzJobLog);
    }
    /**
     * 保存方案
     * @param tjTownMap
     * @param city
     * @param cityName
     * @param town
     * @param townName
     * @param org
     * @param orgName
     * @param doctorCode
     * @param doctorName
     * @param doctorJob
     * @param level
     * @param key
     */
    private void save(Map<String, Long> tjTownMap, String city, String cityName, String town, String townName, String org, String orgName, String doctorCode, String doctorName, String doctorJob, String level, String key) {
        WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
        wlyyQuotaResult.setDel("1");
        wlyyQuotaResult.setCity(city);
        wlyyQuotaResult.setCityName(cityName);
        wlyyQuotaResult.setTown(town);
        wlyyQuotaResult.setTownName(townName);
        wlyyQuotaResult.setOrgCode(org);
        wlyyQuotaResult.setOrgName(orgName);
        wlyyQuotaResult.setQkdoctorJobName(doctorJob);
        wlyyQuotaResult.setQkdoctorName(doctorName);
        wlyyQuotaResult.setQkdoctorCode(doctorCode);
        wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
        wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
        wlyyQuotaResult.setQuotaDate(getYesterday());
        wlyyQuotaResult.setCreateTime(new Date());
        wlyyQuotaResult.setLevel1Type(level);
        //判断全科医生是否有咨询量
        if (tjTownMap.containsKey(key)) {
            wlyyQuotaResult.setResult(tjTownMap.get(key) + "");
        } else {
            wlyyQuotaResult.setResult("0");
        }
        wlyyQuotaResultDao.save(wlyyQuotaResult);
    }
    /**
     * 统计方案
     * @param tjQkdoctorMap
     * @param doctorCode
     */
    private void compute(Map<String, Long> tjQkdoctorMap, String doctorCode) {
        if (tjQkdoctorMap.containsKey(doctorCode)) {
            tjQkdoctorMap.put(doctorCode, tjQkdoctorMap.get(doctorCode) + 1);
        } else {
            tjQkdoctorMap.put(doctorCode, 1L);
        }
    }
    private String getOrg(String org){
        if(!"00".equals(org.substring(org.length()-2,org.length()))){
            return org.substring(0,org.length()-2)+"00";
        }else{
            return org;
        }
    }
    private String saveContent(List<ConsultTeam> consultTeams, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent) {
    private String saveContent(List<ConsultTeam> consultTeams, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent,Long errorCount) {
        StringBuffer string=new StringBuffer("统计"+getYesterday()+" 的咨询数据完成 ,数据库查询到咨询数目:"+consultTeams.size());
        string.append(",过滤的脏数据数目:"+errorCount);
        string.append(",统计到市的数据总数:"+cityCount);
        string.append(",统计到区的数据总数:"+townCount);
        string.append(",统计到机构的数据总数:"+orgCount);
@ -309,8 +207,10 @@ public class ConsultJob implements Job {
        return string.toString();
    }
    public String getYesterday() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -1);
        String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
        return yesterday;
    }
}

+ 827 - 867
src/main/java/com/yihu/wlyy/job/CurrentDayAllQuotaJob.java

@ -10,6 +10,13 @@ import com.yihu.wlyy.entity.job.QuartzJobLog;
import com.yihu.wlyy.entity.patient.Patient;
import com.yihu.wlyy.entity.patient.PatientHealthGuidance;
import com.yihu.wlyy.entity.patient.SignFamily;
import com.yihu.wlyy.job.elt.base.ETLModel;
import com.yihu.wlyy.job.elt.role.LevelRole;
import com.yihu.wlyy.job.elt.role.PatientAgeRole;
import com.yihu.wlyy.job.elt.role.PatientGroupRole;
import com.yihu.wlyy.job.elt.role.PatientSexRole;
import com.yihu.wlyy.job.elt.storage.DBStorage;
import com.yihu.wlyy.job.elt.storage.RedisStorage;
import com.yihu.wlyy.repository.address.TownDao;
import com.yihu.wlyy.repository.consult.ConsultTeamDao;
import com.yihu.wlyy.repository.doctor.DoctorAdminTeamDao;
@ -66,6 +73,17 @@ public class CurrentDayAllQuotaJob implements Job {
    private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    @Autowired
    private LevelRole levelRole;
    @Autowired
    private PatientAgeRole patientAgeRole;
    @Autowired
    private PatientGroupRole patientGroupRole;
    @Autowired
    private PatientSexRole patientSexRole;
    @Autowired
    private RedisStorage redisStorage;
    private org.apache.tomcat.jdbc.pool.DataSource fvdataSource = new org.apache.tomcat.jdbc.pool.DataSource();//随访数据源
@ -74,14 +92,14 @@ public class CurrentDayAllQuotaJob implements Job {
    private Properties systemProperties;
    List<Town> towns = null;//厦门市全部的区
    List<Hospital> hospitals = null;//系统全部的机构
    List<Doctor> qkdoctors = null;//系统全部的全科医生
    List<Doctor> jkglsdoctors = null;//系统全部的健康管理师
    List<AdminTeam> adminTeams=null;//系统全部的团队
    Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
    Map<String, Doctor> jkglsdoctorsMap = new HashMap<String, Doctor>();
    Map<String, Doctor> qkdoctorsMap = new HashMap<String, Doctor>();
    Map<String, Town> townsMap = new HashMap<String, Town>();
    Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
    private String now = getDayString(0);
    private String tomorrow = getDayString(1);
    private StringBuffer allContent=new StringBuffer();//日志内容
    @Override
    public void execute(JobExecutionContext context)
            throws JobExecutionException {
@ -96,22 +114,13 @@ public class CurrentDayAllQuotaJob implements Job {
            jdbcTemplate.setDataSource(fvdataSource);//初始化随访的数据源
            towns = townDao.findByCityCode(Constant.city); //查找出厦门市全部的区
            hospitals = hospitalDao.findHospitalzxFWZ(); //查找出系统全部的机构
            adminTeams=doctorAdminTeamDao.findAllTeam();//查找出系统全部的全科医生
            for (Hospital hospital : hospitals) {
                hospitalsMap.put(hospital.getCode(), hospital);
            }
            qkdoctors = doctorDao.findAllQKDoctot();//查找出系统全部的全科医生
            for (Doctor doctor : qkdoctors) {
                qkdoctorsMap.put(doctor.getCode(), doctor);
            }
            jkglsdoctors = doctorDao.findAllZKDoctot();//查找出系统全部的全科医生
            for (Doctor doctor : jkglsdoctors) {
                jkglsdoctorsMap.put(doctor.getCode(), doctor);
            }
            for (Town town : towns) {
                townsMap.put(town.getCode(), town);
            }
            //查找出系统全部的全科医生
            adminTeams=doctorAdminTeamDao.findAllTeam();
            for (AdminTeam adminTeam : adminTeams) {
                adminTeamMap.put(adminTeam.getId()+"", adminTeam);
            }
@ -127,20 +136,19 @@ public class CurrentDayAllQuotaJob implements Job {
    private void computequota() throws Exception {
        QuartzJobLog quartzJobLog =new QuartzJobLog();
        quartzJobLog.setJobStartTime(new Date());
        StringBuffer errorContent=new StringBuffer();
        computequota_1(errorContent); //统计今天的签约
        computequota_2(errorContent); //统计今天的解约
        computequota_3(errorContent); //统计今天的健康咨询量
        computequota_4(errorContent); //统计今天的随访量
        computequota_5(errorContent); //统计今天的健康指导
        computequota_6(errorContent); //统计今天的签约患者性别
        computequota_7(errorContent);//统计今天的签约患者分组
        computequota_8(errorContent);//统计今天的签约患者年龄
        computequota_9(errorContent);//统计今天的待签约
        computequota_10(errorContent);//统计今天的改签
        computequota_12(errorContent);//统计今天的签约下按年龄分组后再
        quartzJobLog.setJobContent(errorContent.toString());
        allContent=new StringBuffer();
        computequota_1(); //统计今天的签约
        computequota_2(); //统计今天的解约
        computequota_3(); //统计今天的健康咨询量
        computequota_4(); //统计今天的随访量
        computequota_5(); //统计今天的健康指导
        computequota_6(); //统计今天的签约患者性别
        computequota_7();//统计今天的签约患者分组
        computequota_8();//统计今天的签约患者年龄
        computequota_9();//统计今天的待签约
        computequota_10();//统计今天的改签
        computequota_12();//统计今天的签约下按年龄分组后再
        quartzJobLog.setJobContent(allContent.toString());
        quartzJobLog.setJobName("实时统计");
        quartzJobLog.setJobId("11");
        quartzJobLog.setJobType("1");
@ -148,8 +156,7 @@ public class CurrentDayAllQuotaJob implements Job {
        quartzJobLogDao.save(quartzJobLog);
    }
    private void computequota_12(StringBuffer errorContent) throws Exception{
        errorContent.append("computequota_12---start,");
    private void computequota_12() throws Exception{
        String now = getDayString(0);
        String tomorrow = getDayString(1);
        //找出今天的签约信息 yesterday,now
@ -167,7 +174,6 @@ public class CurrentDayAllQuotaJob implements Job {
        }
        //找出今天的签约信息
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(now, tomorrow);
        errorContent.append("截止时间:"+now+"-"+DateUtil.dateToStrLong(new Date())+",数据库查询的签约数是:"+signFamilys.size()+",错误:");
        //数组里面第一个是健康人群 第二个是慢病人群 第三个是65岁以上人群
        Map<String, Map<String, Map>> cityAgeMap = new HashMap<String, Map<String, Map>>();//key是市行政代码 目前只有厦门市
        Map<String,Map> temp =new HashMap<String,Map>();
@ -179,7 +185,6 @@ public class CurrentDayAllQuotaJob implements Job {
        for (SignFamily signFamily : signFamilys) {
            Hospital hospital = hospitalsMap.get(getOrg(signFamily.getHospital()));//得到患者签约的机构
            if(hospital == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据异常。");
                continue;
            }
            String town = hospital.getTown();
@ -321,7 +326,6 @@ public class CurrentDayAllQuotaJob implements Job {
                }
            }
        }
        errorContent.append("computequota_12---end!!");
    }
    private void compute(Map<String, Map<String, Map>> rootMap, String rootKey, String ageCode, String diseaseType) {
        if (rootMap.containsKey(rootKey)) {
@ -352,556 +356,580 @@ public class CurrentDayAllQuotaJob implements Job {
            rootMap.put(rootKey, groupMapTemp2);
        }
    }
    private void computequota_1(StringBuffer errorContent) {
        errorContent.append("computequota_1---start,");
        //签约需要的统计map
        Map<String, JSONObject> tjCityMap = new HashMap<>();//区级的统计map key 是区行政区划350200
        Map<String, JSONObject> tjTownMap = new HashMap<String, JSONObject>();//区级的统计map key 是区行政区划350200
        Map<String, JSONObject> tjOrgMap = new HashMap<String, JSONObject>();//机构的统计map key 是机构的code
        Map<String, JSONObject> tjAdminTeamMap = new HashMap<String, JSONObject>();//团队级的统计map 目前没有团队 先用全科医生统一  key doctorCode
        initMap(tjCityMap, tjTownMap, tjOrgMap, null, null,tjAdminTeamMap);
    private void computequota_1() {
        StringBuffer errorContent=new StringBuffer();
        //找出今天的签约信息 yesterday,now
        String now = getDayString(0);
        String tomorrow = getDayString(1);
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(now, tomorrow);
        errorContent.append("截止时间:"+now+"-"+DateUtil.dateToStrLong(new Date())+",数据库查询的签约数是:"+signFamilys.size()+",错误:");
        //统计有签约的
        for (SignFamily signFamily : signFamilys) {
            String hospitalCode=getOrg(signFamily.getHospital());
            Hospital hospital=hospitalsMap.get(hospitalCode);
            AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
            //统计机构
            //判断是中心还是服务站 服务站的话添加到中心去
            if(hospital == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据异常。");
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        //统计有已改簽的
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        //数据过滤清洗出脏数据  -----------start
        for(SignFamily signFamily:signFamilys){
            ETLModel etlModel=new ETLModel();
            String orgCode = signFamily.getHospital();
            if(StringUtils.isEmpty(orgCode)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            if(adminTeam == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的adminTeam数据异常。");
            String orgCodeTemp=getOrg(orgCode);
            //判断社区有没有值
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            JSONObject orgjo=tjOrgMap.get(getOrg(hospital.getCode()));
            if(orgjo==null){
                System.out.println(new JSONObject(hospital).toString());
            Long adminId=signFamily.getAdminTeamId();
            if(adminId == null||adminId<=0) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            orgjo.put("num",((int)orgjo.get("num"))+1);
            //统计市
            JSONObject cityjo=tjCityMap.get(Constant.city);
            cityjo.put("num",((int)cityjo.get("num"))+1);
            //统计区
            JSONObject townjo=tjTownMap.get(hospital.getTown());
            townjo.put("num",((int)townjo.get("num"))+1);
            //统计全科医生
            JSONObject qkjo=tjAdminTeamMap.get(signFamily.getAdminTeamId()+"");
            if(qkjo!=null){
                qkjo.put("num",((int)qkjo.get("num"))+1);
            AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
            if(adminTeam == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
        }
        //数据保存到redis
        //统计市
        for(Map.Entry<String,JSONObject> entry:tjCityMap.entrySet()){
            entry.getValue().put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:1:4:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存区
        for(Map.Entry<String,JSONObject> entry:tjTownMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:1:3:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存机构
        for(Map.Entry<String,JSONObject> entry:tjOrgMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:1:2:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存全科医生
        for(Map.Entry<String,JSONObject> entry:tjAdminTeamMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:1:1:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        errorContent.append("computequota_1---end!!!");
    }
    private void initMap(Map<String, JSONObject> tjCityMap, Map<String, JSONObject> tjTownMap, Map<String, JSONObject> tjOrgMap, Map<String, JSONObject> tjQkdoctorMap, Map<String, JSONObject> tjJKdoctorMap, Map<String, JSONObject> tjAdminTeamMap) {
        JSONObject jo=new JSONObject();
        jo.put("name", Constant.cityName);
        jo.put("num",0);
        tjCityMap.put(Constant.city,jo);
        for(Town town:towns){
            jo=new JSONObject();
            jo.put("name",town.getName());
            jo.put("num",0);
            jo.put("date", DateUtil.dateToStrLong(new Date()));
            tjTownMap.put(town.getCode(),jo);
        }
        for(Hospital hospital:hospitals){
            jo=new JSONObject();
            jo.put("name",hospital.getName());
            jo.put("num",0);
            jo.put("date", DateUtil.dateToStrLong(new Date()));
            tjOrgMap.put(hospital.getCode(),jo);
        }
        if (tjQkdoctorMap!=null){
            for(Doctor doctor:qkdoctors){
                jo=new JSONObject();
                jo.put("name",doctor.getName());
                jo.put("num",0);
                jo.put("date", DateUtil.dateToStrLong(new Date()));
                tjQkdoctorMap.put(doctor.getCode(),jo);
            String idCard=signFamily.getIdcard();
            if(idCard == null||(idCard.length()==18||idCard.length()==15)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
                isAll=false;
                errorCount++;
                continue;
            }
        }
        if(tjJKdoctorMap!=null){
            for(Doctor doctor:jkglsdoctors){
                jo=new JSONObject();
                jo.put("name",doctor.getName());
                jo.put("num",0);
                jo.put("date", DateUtil.dateToStrLong(new Date()));
                tjJKdoctorMap.put(doctor.getCode(),jo);
            String town =hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
                isAll=false;
                errorCount++;
                continue;
            }
        }
        if(tjAdminTeamMap!=null){
            for(AdminTeam adminTeam:adminTeams){
                jo=new JSONObject();
                jo.put("name",adminTeam.getName());
                jo.put("num",0);
                jo.put("date", DateUtil.dateToStrLong(new Date()));
                tjAdminTeamMap.put(adminTeam.getId()+"",jo);
            Town townObj =townsMap.get(town);
            if(townObj==null) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            etlModel.setAdminTeam(adminTeam.getId()+"");
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModel.setIdcard(signFamily.getIdcard());
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            townCount++;
            orgCount++;
            adminCount++;
        }
        //数据过滤清洗出脏数据  -----------end
        try{
            //统计数据
            List<Map<String, List<ETLModel>>>  returnDatas= levelRole.elt(etlModels);
            //保存数据
            redisStorage.saveByLevel1(returnDatas,"1");
        }catch (Exception e){
            errorContent.append("统计失败:"+e.getMessage());
        }
        saveContent("1",signFamilys.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("---------------------");
    }
    private void computequota_2(StringBuffer errorContent) {
        errorContent.append("computequota_2---start,");
        //签约需要的统计map
        Map<String, JSONObject> tjCityMap = new HashMap<>();//区级的统计map key 是区行政区划350200
        Map<String, JSONObject> tjTownMap = new HashMap<String, JSONObject>();//区级的统计map key 是区行政区划350200
        Map<String, JSONObject> tjOrgMap = new HashMap<String, JSONObject>();//机构的统计map key 是机构的code
        Map<String, JSONObject> tjAdminTeamMap = new HashMap<String, JSONObject>();//团队级的统计map 目前没有团队 先用全科医生统一  key doctorCode
        initMap(tjCityMap, tjTownMap, tjOrgMap, null, null,tjAdminTeamMap);
        String now = getDayString(0);
        String tomorrow = getDayString(1);
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingUnSignYesterday(now, tomorrow);
        errorContent.append("截止时间:"+now+"-"+DateUtil.dateToStrLong(new Date())+",数据库查询的解约数是:"+signFamilys.size()+",错误:");
        //统计有签约的
        for (SignFamily signFamily : signFamilys) {
            String hospitalCode=getOrg(signFamily.getHospital());
            Hospital hospital=hospitalsMap.get(hospitalCode);
            AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
    private void computequota_2() {
        StringBuffer errorContent=new StringBuffer();
        String quotaId="2";
        //找出今天的解约信息
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingUnSignYesterday(now,tomorrow);
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        //统计有已改簽的
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        //数据过滤清洗出脏数据  -----------start
        for(SignFamily signFamily:signFamilys){
            ETLModel etlModel=new ETLModel();
            String orgCode = signFamily.getHospital();
            if(StringUtils.isEmpty(orgCode)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            String orgCodeTemp="";
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                //站
                orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
            }else{
                //社区
                orgCodeTemp=orgCode;
            }
            //判断社区有没有值
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据异常。");
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            Long adminId=signFamily.getAdminTeamId();
            if(adminId == null||adminId<=0) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
            if(adminTeam == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的adminTeam数据异常。");
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            //统计机构
            //判断是中心还是服务站 服务站的话添加到中心去
            JSONObject orgjo=tjOrgMap.get(getOrg(hospital.getCode()));
            if(orgjo==null){
            String idCard=signFamily.getIdcard();
            if(idCard == null||(idCard.length()==18||idCard.length()==15)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
                isAll=false;
                errorCount++;
                continue;
            }
            orgjo.put("num",((int)orgjo.get("num"))+1);
            //统计市
            JSONObject cityjo=tjCityMap.get(Constant.city);
            cityjo.put("num",((int)cityjo.get("num"))+1);
            //统计区
            JSONObject townjo=tjTownMap.get(hospital.getTown());
            townjo.put("num",((int)townjo.get("num"))+1);
            //统计全科医生
            JSONObject qkjo=tjAdminTeamMap.get(signFamily.getAdminTeamId()+"");
            if(qkjo!=null){
                qkjo.put("num",((int)qkjo.get("num"))+1);
            String town =hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
                isAll=false;
                errorCount++;
                continue;
            }
            Town townObj =townsMap.get(town);
            if(townObj==null) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            etlModel.setAdminTeam(adminTeam.getId()+"");
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModel.setIdcard(signFamily.getIdcard());
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            townCount++;
            orgCount++;
            adminCount++;
        }
        //数据过滤清洗出脏数据  -----------end
        try{
            //统计数据
            List<Map<String, List<ETLModel>>>  returnDatas= levelRole.elt(etlModels);
            //保存数据
            redisStorage.saveByLevel1(returnDatas,quotaId);
        }catch (Exception e){
            errorContent.append("统计失败:"+e.getMessage());
        }
        //数据保存到redis
        //统计市
        for(Map.Entry<String,JSONObject> entry:tjCityMap.entrySet()){
            entry.getValue().put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:2:4:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存区
        for(Map.Entry<String,JSONObject> entry:tjTownMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:2:3:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存机构
        for(Map.Entry<String,JSONObject> entry:tjOrgMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:2:2:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存全科医生
        for(Map.Entry<String,JSONObject> entry:tjAdminTeamMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:2:1:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        errorContent.append("computequota_2---end!!!");
        saveContent(quotaId,signFamilys.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("---------------------");
    }
    private void computequota_3(StringBuffer errorContent) {
        errorContent.append("computequota_3---start,");
        //签约需要的统计map
        Map<String, JSONObject> tjCityMap = new HashMap<>();//区级的统计map key 是区行政区划350200
        Map<String, JSONObject> tjTownMap = new HashMap<String, JSONObject>();//区级的统计map key 是区行政区划350200
        Map<String, JSONObject> tjOrgMap = new HashMap<String, JSONObject>();//机构的统计map key 是机构的code
        Map<String, JSONObject> tjAdminTeamMap = new HashMap<String, JSONObject>();//全部的健康管理师
        initMap(tjCityMap, tjTownMap, tjOrgMap, null, null,tjAdminTeamMap);
        String now = getDayString(0);
        String tomorrow = getDayString(1);
    private void computequota_3() {
        StringBuffer errorContent=new StringBuffer();
        String quotaId="3";
        //找出今天的咨询信息
        List<ConsultTeam> consultTeams = consultTeamDao.findByCzrqyYesterday(now,tomorrow);
        errorContent.append("截止时间:"+now+"-"+DateUtil.dateToStrLong(new Date())+",数据库查询的咨询数是:"+consultTeams.size()+",错误:");
        //统计
        for (ConsultTeam consultTeam : consultTeams) {
            AdminTeam adminTeam=adminTeamMap.get(consultTeam.getAdminTeamId()+"");
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        //统计有已改簽的
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        //数据过滤清洗出脏数据  -----------start
        for(ConsultTeam consultTeam:consultTeams){
            ETLModel etlModel=new ETLModel();
            Long adminId=consultTeam.getAdminTeamId();
            if(adminId == null||adminId<=0) {
                errorContent.append("咨询Id:"+consultTeam.getId()+",咨询的团队(wlyy_consult_team)中的admin_team_code数据为空");
                isAll=false;
                continue;
            }
            String teamCode = consultTeam.getAdminTeamId()+"";//行政的团队的id
            AdminTeam adminTeam=adminTeamMap.get(teamCode);
            if(adminTeam == null) {
                errorContent.append("咨询id:"+consultTeam.getId()+",咨询表中的团队数据有误。");
                errorContent.append("咨询Id:"+consultTeam.getId()+",团队Id:"+adminTeam.getId()+",咨询的团队(wlyy_consult_team)中的团队不存在");
                isAll=false;
                continue;
            }
            //统计机构
            JSONObject orgjo=tjOrgMap.get(getOrg(adminTeam.getOrgCode()));
            if(orgjo == null) {
                errorContent.append("咨询id:"+consultTeam.getId()+",咨询表中的团队所属的机构数据有误。");
            String orgCode = adminTeam.getOrgCode();
            if(StringUtils.isEmpty(orgCode)) {
                errorContent.append("咨询Id:"+consultTeam.getId()+",团队Id:"+adminTeam.getId()+",医生团队的机构为空");
                isAll=false;
                continue;
            }
            Hospital hospital=hospitalsMap.get(getOrg(adminTeam.getOrgCode()));
            String orgCodeTemp="";
            //统计机构
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                //统计站
                orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
            }else{
                //统计社区
                orgCodeTemp=orgCode;
            }
            //统计区 ---------------start--------------
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                errorContent.append("咨询id:"+consultTeam.getId()+",咨询表中的团队所属的机构数据有误。");
                errorContent.append("咨询Id:"+consultTeam.getId()+",机构Id:"+hospital.getId()+",医生团队的机构不存在");
                isAll=false;
                continue;
            }
            orgjo.put("num",((int)orgjo.get("num"))+1);
            //统计市
            JSONObject cityjo=tjCityMap.get(Constant.city);
            cityjo.put("num",((int)cityjo.get("num"))+1);
            //统计区
            JSONObject townjo=tjTownMap.get(hospital.getTown());
            townjo.put("num",((int)townjo.get("num"))+1);
            //统计全科医生
            JSONObject qkjo=tjAdminTeamMap.get(consultTeam.getAdminTeamId()+"");
            if(qkjo!=null){
                qkjo.put("num",((int)qkjo.get("num"))+1);
            String town=hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("咨询Id:"+consultTeam.getId()+",机构Id:"+hospital.getId()+",机构表的区字段(town)为空");
                isAll=false;
                continue;
            }
            Town townObj=townsMap.get(town);
            if(townObj==null) {
                errorContent.append("咨询Id:"+consultTeam.getId()+",机构Id:"+hospital.getId()+",机构表的区不存在");
                isAll=false;
                continue;
            }
            etlModel.setAdminTeam(adminTeam.getId()+"");
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            townCount++;
            orgCount++;
            adminCount++;
        }
        //数据过滤清洗出脏数据  -----------end
        try{
            //统计数据
            List<Map<String, List<ETLModel>>>  returnDatas= levelRole.elt(etlModels);
            //保存数据
            redisStorage.saveByLevel1(returnDatas,quotaId);
        }catch (Exception e){
            errorContent.append("统计失败:"+e.getMessage());
        }
        //数据保存到redis
        //统计市
        for(Map.Entry<String,JSONObject> entry:tjCityMap.entrySet()){
            entry.getValue().put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:3:4:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存区
        for(Map.Entry<String,JSONObject> entry:tjTownMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:3:3:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存机构
        for(Map.Entry<String,JSONObject> entry:tjOrgMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:3:2:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存全科医生
        for(Map.Entry<String,JSONObject> entry:tjAdminTeamMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:3:1:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        errorContent.append("computequota_3---end!!!");
        saveContent(quotaId,consultTeams.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("---------------------");
    }
    private void computequota_4(StringBuffer errorContent) {
        errorContent.append("computequota_4---start,");
        Map<String, JSONObject> tjCityMap = new HashMap<>();//区级的统计map key 是区行政区划350200
        Map<String, JSONObject> tjTownMap = new HashMap<String, JSONObject>();//区级的统计map key 是区行政区划350200
        Map<String, JSONObject> tjOrgMap = new HashMap<String, JSONObject>();//机构的统计map key 是机构的code
        Map<String, JSONObject> tjJkdoctorMap = new HashMap<String, JSONObject>();//全部的健康管理师
        initMap(tjCityMap, tjTownMap, tjOrgMap, null, tjJkdoctorMap,null);
    private void computequota_4() {
        StringBuffer errorContent=new StringBuffer();
        String quotaId="4";
        //找出今天的随访信息
        List<Map<String,Object>> plans = getFvYesterday();
        errorContent.append("截止时间:"+DateUtil.dateToStrLong(new Date())+",数据库查询的随访数是:"+plans.size()+",错误:");
        //统计有随访的
        for (Map<String,Object> plan : plans) {
            String doctorCode = (String) plan.get("doctor_uid");//得到随访中健康医生的code
            Doctor doctor=jkglsdoctorsMap.get(doctorCode);//得到健康管理师
            if(doctor == null) {
                errorContent.append("随访id:"+plan.get("id")+",随访医生字段doctor_uid数据有误。");
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        //统计有已改簽的
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        //数据过滤清洗出脏数据  -----------start
        for(Map<String,Object> plan:plans){
            ETLModel etlModel=new ETLModel();
            Object idCard=plan.get("id_card");//得到隨訪的身份證
            if(StringUtils.isEmpty(idCard)){
                errorContent.append("随访id:"+plan.get("id")+",随访(fv_plan)表id_card为空");
                isAll=false;
                continue;
            }
            SignFamily signFamily=signFamilyDao.findByIdcard(idCard.toString());
            if(signFamily==null){
                errorContent.append("随访id:"+plan.get("id")+",签约code:"+signFamily.getCode()+",随访中的患者身份证在签约表中找不到数据");
                isAll=false;
                continue;
            }
            Long adminTeamId=signFamily.getAdminTeamId();
            if(adminTeamId==null||adminTeamId<=0){
                errorContent.append("随访id:"+plan.get("id")+",签约code:"+signFamily.getCode()+" 中的adminTeamId为空");
                isAll=false;
                continue;
            }
            AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId());
            if(adminTeam==null){
                errorContent.append("随访id:"+plan.get("id")+",签约code:"+signFamily.getCode()+",医生团队不存在");
                isAll=false;
                continue;
            }
            //统计机构------------------start ------------------
            //判断医生属于哪个机构
            String orgCodeTemp="";
            String orgCode=adminTeam.getOrgCode();
            if(StringUtils.isEmpty(orgCode)){
                errorContent.append("随访id:"+plan.get("id")+",团队Id:"+adminTeam.getId()+",随访的医生所属的团队(wlyy_admin_team)机构为空");
                isAll=false;
                continue;
            }
            //统计机构
            JSONObject orgjo=tjOrgMap.get(getOrg(doctor.getHospital()));
            if(orgjo==null){
                errorContent.append("随访id:"+plan.get("id")+",随访医生字段doctor_uid对应的doctor表中的hospital字段有误。");
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                //统计站
                orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
            }else{
                //统计社区
                orgCodeTemp=orgCode;
            }
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital==null){
                errorContent.append("随访id:"+plan.get("id")+",团队Id:"+adminTeam.getId()+",随访的医生所属的团队的机构不存在");
                isAll=false;
                continue;
            }
            orgjo.put("num",((int)orgjo.get("num"))+1);
            //统计市
            JSONObject cityjo=tjCityMap.get(Constant.city);
            cityjo.put("num",((int)cityjo.get("num"))+1);
            //统计区
            JSONObject townjo=tjTownMap.get(doctor.getTown());
            townjo.put("num",((int)townjo.get("num"))+1);
            //统计全科医生
            JSONObject qkjo=tjJkdoctorMap.get(doctor.getCode());
            if(qkjo!=null){
                qkjo.put("num",((int)qkjo.get("num"))+1);
            String town =hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("随访id:"+plan.get("id")+",机构Id:"+hospital.getId()+",机构表的中的town为空");
                isAll=false;
                errorCount++;
                continue;
            }
        }
        //统计市
        for(Map.Entry<String,JSONObject> entry:tjCityMap.entrySet()){
            entry.getValue().put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:4:4:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存区
        for(Map.Entry<String,JSONObject> entry:tjTownMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:4:3:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存机构
        for(Map.Entry<String,JSONObject> entry:tjOrgMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:4:2:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存全科医生
        for(Map.Entry<String,JSONObject> entry:tjJkdoctorMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:4:1:"+entry.getKey()).toString(), entry.getValue().toString());
            Town townObj =townsMap.get(town);
            if(townObj==null) {
                errorContent.append("随访id:"+plan.get("id")+",机构Id:"+hospital.getId()+",机构表的中的town不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            etlModel.setAdminTeam(adminTeam.getId()+"");
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModel.setIdcard(signFamily.getIdcard());
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            townCount++;
            orgCount++;
            adminCount++;
        }
        //数据过滤清洗出脏数据  -----------end
        try{
            //统计数据
            List<Map<String, List<ETLModel>>>  returnDatas= levelRole.elt(etlModels);
            //保存数据
            redisStorage.saveByLevel1(returnDatas,quotaId);
        }catch (Exception e){
            errorContent.append("统计失败:"+e.getMessage());
        }
        errorContent.append("computequota_4---end!!");
        saveContent(quotaId,plans.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("---------------------");
    }
    private void computequota_5(StringBuffer errorContent) {
        errorContent.append("computequota_5---start,");
        Map<String, JSONObject> tjCityMap = new HashMap<>();//区级的统计map key 是区行政区划350200
        Map<String, JSONObject> tjTownMap = new HashMap<String, JSONObject>();//区级的统计map key 是区行政区划350200
        Map<String, JSONObject> tjOrgMap = new HashMap<String, JSONObject>();//机构的统计map key 是机构的code
        Map<String, JSONObject> tjAdminTeamMap = new HashMap<String, JSONObject>();//全部的健康管理师
        initMap(tjCityMap, tjTownMap, tjOrgMap, null, null,tjAdminTeamMap);
        //找出今天的健康指导信息
    private void computequota_5() {
        StringBuffer errorContent=new StringBuffer();
        String quotaId="5";
        String now = getDayString(0);
        String tomorrow = getDayString(1);
        List<PatientHealthGuidance> patientHealthGuidances = patientHealthGuidanceDao.findByCzrqyYesterday(now,tomorrow);
        errorContent.append("截止时间:"+now+"-"+DateUtil.dateToStrLong(new Date())+",数据库查询的健康指導数是:"+patientHealthGuidances.size()+",错误:");
        for (PatientHealthGuidance patientHealthGuidance: patientHealthGuidances) {
            String doctorCode =patientHealthGuidance.getDoctor();
            Doctor doctor=jkglsdoctorsMap.get(doctorCode);//得到健康管理师
            SignFamily signFamily= signFamilyDao.findSignByPatient(patientHealthGuidance.getPatient(),2);//得到患者签约的行政团队
            if(doctor==null){
                doctor=qkdoctorsMap.get(doctorCode);//得到全科医生
                if(doctor==null){
                    errorContent.append("健康指導id:"+patientHealthGuidance.getId()+",找不到对应的医生信息。");
                    continue;
                }
            }
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        //统计有已改簽的
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        //数据过滤清洗出脏数据  -----------start
        for(PatientHealthGuidance patientHealthGuidance:patientHealthGuidances){
            ETLModel etlModel=new ETLModel();
            String patient=patientHealthGuidance.getPatient();
            SignFamily signFamily= signFamilyDao.findByPatientAndType(patient,2);//只统计家庭签约
            if(signFamily == null) {
                errorContent.append("健康指導id:"+patientHealthGuidance.getId()+",患者签约不存在或者已经过期。");
                errorContent.append("健康咨询id:"+patientHealthGuidance.getId()+",患者code:"+patient+",家庭签约不存在");
                isAll=false;
                continue;
            }
            //统计机构
            JSONObject orgjo=tjOrgMap.get(getOrg(doctor.getHospital()));
            if(orgjo==null){
                errorContent.append("健康指導id:"+patientHealthGuidance.getId()+",医生表中对应的hospital字段有误。");
            String adminId=signFamily.getAdminTeamId()+"";//得到团队ID
            if(StringUtils.isEmpty(adminId)){
                errorContent.append("健康咨询id:"+patientHealthGuidance.getId()+",签约code:"+signFamily.getCode()+",咨询的家庭签约的团队AdminTeamCode为空");
                isAll=false;
                continue;
            }
            //统计市
            JSONObject cityjo=tjCityMap.get(Constant.city);
            cityjo.put("num",((int)cityjo.get("num"))+1);
            //统计区
            JSONObject townjo=tjTownMap.get(doctor.getTown());
            townjo.put("num",((int)townjo.get("num"))+1);
            //统计机构
            orgjo.put("num",((int)orgjo.get("num"))+1);
            //统计全科医生
            JSONObject qkjo=tjAdminTeamMap.get(signFamily.getAdminTeamId()+"");
            if(qkjo!=null){
                qkjo.put("num",((int)qkjo.get("num"))+1);
            }
        }
        //统计市
        for(Map.Entry<String,JSONObject> entry:tjCityMap.entrySet()){
            entry.getValue().put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:5:4:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存区
        for(Map.Entry<String,JSONObject> entry:tjTownMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:5:3:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存机构
        for(Map.Entry<String,JSONObject> entry:tjOrgMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:5:2:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存全科医生
        for(Map.Entry<String,JSONObject> entry:tjAdminTeamMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:5:1:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        errorContent.append("computequota_5---end!!");
    }
    private void computequota_6(StringBuffer errorContent) throws Exception {
        errorContent.append("computequota_6---start,");
        String now = getDayString(0);
        String tomorrow = getDayString(1);
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(now, tomorrow);
        errorContent.append("截止时间:"+now+"-"+DateUtil.dateToStrLong(new Date())+",数据库查询的签约数是:"+signFamilys.size()+",错误:");
        //统计有签约的
        Map<String, Map<String, Long>> citySexMap = new HashMap<String, Map<String, Long>>();//key是市行政代码 目前只有厦门市
        citySexMap.put(Constant.city,new HashMap<String, Long>());
        Map<String, Map<String, Long>> townSexMap = new HashMap<String, Map<String, Long>>();//key是区行政代码
        Map<String, Map<String, Long>> orgSexMap = new HashMap<String, Map<String, Long>>();//key是机构代码
        for (SignFamily signFamily : signFamilys) {
            String idcard = signFamily.getIdcard();//得到签约中患者的身份证号
            Hospital hospital = hospitalsMap.get(getOrg(signFamily.getHospital()));//得到患者签约的机构
            //统计机构
            //判断是中心还是服务站 服务站的话添加到中心去
            if(hospital == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据异常。");
            AdminTeam adminTeam = adminTeamMap.get(adminId);
            if(adminTeam==null){
                errorContent.append("健康咨询id:"+patientHealthGuidance.getId()+",签约code:"+signFamily.getCode()+",咨询的家庭签约的团队不存在");
                isAll=false;
                continue;
            }
            String town = hospital.getTown();//得到患者签约的机构的区号
            String hospitalCode = hospital.getCode();//得到患者签约的机构号
            String sex = IdCardUtil.getSexForIdcard(idcard);//根据身份证得到性别
            //统计市 目前只统计厦门市 所以先写死 后期再改造
            if (citySexMap.containsKey(Constant.city)) {
                Map<String, Long> sexMap = citySexMap.get(Constant.city);
                sexMap.put(sex, (sexMap.get(sex)==null?0l:sexMap.get(sex)) + 1);
                citySexMap.put(Constant.city, sexMap);
            } else {
                Map<String, Long> sexMap = new HashMap<String, Long>();
                sexMap.put(sex, 1L);
                citySexMap.put(Constant.city, sexMap);
            }
            //统计区
            if (townSexMap.containsKey(town)) {
                Map<String, Long> sexMap = townSexMap.get(town);
                sexMap.put(sex, (sexMap.get(sex)==null?0l:sexMap.get(sex)) + 1);
                townSexMap.put(town, sexMap);
            } else {
                Map<String, Long> sexMap = new HashMap<String, Long>();
                sexMap.put(sex, 1L);
                townSexMap.put(town, sexMap);
            String orgCode=signFamily.getHospital();//得到机构id
            if(StringUtils.isEmpty(orgCode)){
                errorContent.append("健康咨询id:"+patientHealthGuidance.getId()+",签约code:"+signFamily.getCode()+",咨询的家庭签约的机构Hospital不存在");
                isAll=false;
                continue;
            }
            //统计机构
            if (orgSexMap.containsKey(hospitalCode)) {
                Map<String, Long> sexMap = orgSexMap.get(hospitalCode);
                sexMap.put(sex, (sexMap.get(sex)==null?0l:sexMap.get(sex)) + 1);
                orgSexMap.put(hospitalCode, sexMap);
            } else {
                Map<String, Long> sexMap = new HashMap<String, Long>();
                sexMap.put(sex, 1L);
                orgSexMap.put(hospitalCode, sexMap);
            String orgCodeTemp="";
            //统计机构 -----------------start---------------------
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                //统计站
                orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
            }else{
                //统计社区
                orgCodeTemp=orgCode;
            }
        }
        //保存统计数据
        //保存市统计数据
        for (Map.Entry<String, Map<String, Long>> entry : citySexMap.entrySet()) {
            //保存女
            JSONObject jsonObject=new JSONObject();
            if (entry.getValue() != null && entry.getValue().containsKey(Constant.level_sex_1)) {
                jsonObject.put("num",entry.getValue().get(Constant.level_sex_1));
            } else {
                jsonObject.put("num",0);
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                errorContent.append("健康咨询id:"+patientHealthGuidance.getId()+",机构code:"+orgCodeTemp+",健康咨询的医生所属的机构不存在");
                isAll=false;
                continue;
            }
            jsonObject.put("name",Constant.cityName);
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:6:4:1:"+entry.getKey()).toString(),jsonObject.toString());
            //保存男
            jsonObject=new JSONObject();
            if (entry.getValue() != null && entry.getValue().containsKey(Constant.level_sex_2)) {
                jsonObject.put("num",entry.getValue().get(Constant.level_sex_2));
            } else {
                jsonObject.put("num",0);
            String town =hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("健康咨询id:"+patientHealthGuidance.getId()+",机构code:"+hospital.getCode()+",机构表的中的town为空");
                isAll=false;
                errorCount++;
                continue;
            }
            jsonObject.put("name",Constant.cityName);
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:6:4:2:"+entry.getKey()).toString(),jsonObject.toString());
            //保存未知
            jsonObject=new JSONObject();
            if (entry.getValue() != null && entry.getValue().containsKey(Constant.level_sex_3)) {
                jsonObject.put("num",entry.getValue().get(Constant.level_sex_3));
            } else {
                jsonObject.put("num",0);
            Town townObj =townsMap.get(town);
            if(townObj==null) {
                errorContent.append("健康咨询id:"+patientHealthGuidance.getId()+",机构code:"+hospital.getCode()+",机构表的中的town不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            jsonObject.put("name",Constant.cityName);
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:6:4:3:"+entry.getKey()).toString(),jsonObject.toString());
            etlModel.setAdminTeam(adminTeam.getId()+"");
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModel.setIdcard(signFamily.getIdcard());
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            townCount++;
            orgCount++;
            adminCount++;
        }
        //数据过滤清洗出脏数据  -----------end
        try{
            //统计数据
            List<Map<String, List<ETLModel>>>  returnDatas= levelRole.elt(etlModels);
            //保存数据
            redisStorage.saveByLevel1(returnDatas,quotaId);
        }catch (Exception e){
            errorContent.append("统计失败:"+e.getMessage());
        }
        //保存区的统计数据
        for (Map.Entry<String, Town> townEntry : townsMap.entrySet()) {
            //判断该区是否有统计数据
            Map<String, Long> oneTownSexMap = townSexMap.get(townEntry.getKey());//得到当个区的统计数据
            Town town = townEntry.getValue();//得到区级信息
            //保存女
            JSONObject jsonObject=new JSONObject();
            if (oneTownSexMap != null && oneTownSexMap.containsKey(Constant.level_sex_1)) {
                jsonObject.put("num",oneTownSexMap.get(Constant.level_sex_1));
            } else {
                jsonObject.put("num",0);
        saveContent(quotaId,patientHealthGuidances.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("---------------------");
    }
    private void computequota_6() throws Exception {
        StringBuffer errorContent=new StringBuffer();
        String quotaId="6";
        //找出今天的签约信息
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(now, tomorrow);
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        //统计有已改簽的
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        //数据过滤清洗出脏数据  -----------start
        for(SignFamily signFamily:signFamilys){
            ETLModel etlModel=new ETLModel();
            String orgCode = signFamily.getHospital();
            if(StringUtils.isEmpty(orgCode)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            jsonObject.put("name",town.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:6:3:1:"+townEntry.getKey()).toString(),jsonObject.toString());
            //保存男
            jsonObject=new JSONObject();
            if (oneTownSexMap != null && oneTownSexMap.containsKey(Constant.level_sex_2)) {
                jsonObject.put("num",oneTownSexMap.get(Constant.level_sex_2));
            } else {
                jsonObject.put("num",0);
            String orgCodeTemp="";
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                //站
                orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
            }else{
                //社区
                orgCodeTemp=orgCode;
            }
            jsonObject.put("name",town.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:6:3:2:"+townEntry.getKey()).toString(),jsonObject.toString());
            //保存未知
            jsonObject=new JSONObject();
            if (oneTownSexMap != null && oneTownSexMap.containsKey(Constant.level_sex_3)) {
                jsonObject.put("num",oneTownSexMap.get(Constant.level_sex_3));
            } else {
                jsonObject.put("num",0);
            //判断社区有没有值
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            jsonObject.put("name",town.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:6:3:3:"+townEntry.getKey()).toString(),jsonObject.toString());
        }
        //统计机构
        for (Map.Entry<String, Hospital> hospitalEntry : hospitalsMap.entrySet()) {
            //判断该区是否有统计数据
            Map<String, Long> oneTownSexMap = orgSexMap.get(hospitalEntry.getKey());//得到当个区的统计数据
            Hospital town = hospitalEntry.getValue();//得到区级信息
            //保存女
            JSONObject jsonObject=new JSONObject();
            if (oneTownSexMap != null && oneTownSexMap.containsKey(Constant.level_sex_1)) {
                jsonObject.put("num",oneTownSexMap.get(Constant.level_sex_1));
            } else {
                jsonObject.put("num",0);
            String idCard=signFamily.getIdcard();
            if(idCard == null||(idCard.length()==18||idCard.length()==15)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
                isAll=false;
                errorCount++;
                continue;
            }
            jsonObject.put("name",town.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:6:2:1:"+hospitalEntry.getKey()).toString(),jsonObject.toString());
            //保存男
            jsonObject=new JSONObject();
            if (oneTownSexMap != null && oneTownSexMap.containsKey(Constant.level_sex_2)) {
                jsonObject.put("num",oneTownSexMap.get(Constant.level_sex_2));
            } else {
                jsonObject.put("num",0);
            String town =hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
                isAll=false;
                errorCount++;
                continue;
            }
            jsonObject.put("name",town.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:6:2:2:"+hospitalEntry.getKey()).toString(),jsonObject.toString());
            //保存未知
            jsonObject=new JSONObject();
            if (oneTownSexMap != null && oneTownSexMap.containsKey(Constant.level_sex_3)) {
                jsonObject.put("num",oneTownSexMap.get(Constant.level_sex_3));
            } else {
                jsonObject.put("num",0);
            Town townObj =townsMap.get(town);
            if(townObj==null) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            jsonObject.put("name",town.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:6:2:3:"+hospitalEntry.getKey()).toString(),jsonObject.toString());
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModel.setIdcard(signFamily.getIdcard());
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            townCount++;
            orgCount++;
            adminCount++;
        }
        //数据过滤清洗出脏数据  -----------end
        try{
            //统计数据
            List<Map<String, List<ETLModel>>>  returnData1s= levelRole.elt(etlModels);
            List<Map<String, Map<String, List<ETLModel>>>> patientSexRoleData= patientSexRole.elt(returnData1s);
            //保存数据
            redisStorage.saveByLevel2(patientSexRoleData,quotaId,3,1);
        }catch (Exception e){
            errorContent.append("统计失败:"+e.getMessage());
        }
        errorContent.append("computequota_6---end!!");
        saveContent(quotaId,signFamilys.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("---------------------");
    }
    private void computequota_7(StringBuffer errorContent) {
    private void computequota_7() {
        StringBuffer errorContent=new StringBuffer();
        errorContent.append("computequota_7---start,");
        String now = getDayString(0);
        String tomorrow = getDayString(1);
@ -999,7 +1027,7 @@ public class CurrentDayAllQuotaJob implements Job {
                    continue;//如果没有高血压和糖尿病 不统计
                }
                if (hasGXY && hasTNB) {
                    group = "100";//有高血压又有糖尿病
                    group = "6";//有高血压又有糖尿病
                } else {
                    group = Integer.valueOf(jsonObjects.get(0).get("disease").toString()) + 3 + "";//4高血压,5糖尿病
                }
@ -1110,14 +1138,14 @@ public class CurrentDayAllQuotaJob implements Job {
            //保存糖尿病和高血压
            jsonObject=new JSONObject();
            if (entry.getValue() != null && entry.getValue().containsKey(Constant.level_group_100)) {
                jsonObject.put("num",entry.getValue().get(Constant.level_group_100));
            if (entry.getValue() != null && entry.getValue().containsKey(Constant.level_group_6)) {
                jsonObject.put("num",entry.getValue().get(Constant.level_group_6));
            } else {
                jsonObject.put("num",0);
            }
            jsonObject.put("name",Constant.cityName);
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:7:4:100:"+entry.getKey()).toString(),jsonObject.toString());
            redisTemplate.opsForValue().set(new StringBuffer("quota:7:4:6:"+entry.getKey()).toString(),jsonObject.toString());
        }
        //保存区级
@ -1178,14 +1206,14 @@ public class CurrentDayAllQuotaJob implements Job {
            redisTemplate.opsForValue().set(new StringBuffer("quota:7:3:5:"+townEntry.getKey()).toString(),jsonObject.toString());
            //保存糖尿病和高血压
            jsonObject=new JSONObject();
            if (oneTown != null && oneTown.containsKey(Constant.level_group_100)) {
                jsonObject.put("num",oneTown.get(Constant.level_group_100));
            if (oneTown != null && oneTown.containsKey(Constant.level_group_6)) {
                jsonObject.put("num",oneTown.get(Constant.level_group_6));
            } else {
                jsonObject.put("num",0);
            }
            jsonObject.put("name",town.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:7:3:100:"+townEntry.getKey()).toString(),jsonObject.toString());
            redisTemplate.opsForValue().set(new StringBuffer("quota:7:3:6:"+townEntry.getKey()).toString(),jsonObject.toString());
        }
        //保存机构
        for (Map.Entry<String, Hospital> hospitalEntry : hospitalsMap.entrySet()) {
@ -1247,403 +1275,323 @@ public class CurrentDayAllQuotaJob implements Job {
            redisTemplate.opsForValue().set(new StringBuffer("quota:7:2:5:"+hospitalEntry.getKey()).toString(),jsonObject.toString());
            //保存糖尿病和高血压
            jsonObject=new JSONObject();
            if (oneOrg != null && oneOrg.containsKey(Constant.level_group_100)) {
                jsonObject.put("num",oneOrg.get(Constant.level_group_100));
            if (oneOrg != null && oneOrg.containsKey(Constant.level_group_6)) {
                jsonObject.put("num",oneOrg.get(Constant.level_group_6));
            } else {
                jsonObject.put("num",0);
            }
            jsonObject.put("name",hospital.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:7:2:100:"+hospitalEntry.getKey()).toString(),jsonObject.toString());
            redisTemplate.opsForValue().set(new StringBuffer("quota:7:2:6:"+hospitalEntry.getKey()).toString(),jsonObject.toString());
        }
        errorContent.append("computequota_7---end!!");
    }
    private void computequota_8(StringBuffer errorContent)throws Exception {
        errorContent.append("computequota_8---end,");
        //查找出系统全部的机构
        List<Hospital> hospitals = hospitalDao.findHospital2();
        Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
        for (Hospital hospital : hospitals) {
            hospitalsMap.put(hospital.getCode(), hospital);
        }
        //查找出厦门市全部的区
        List<Town> towns = townDao.findByCityCode(Constant.city);
        Map<String, Town> townsMap = new HashMap<String, Town>();
        for (Town town : towns) {
            townsMap.put(town.getCode(), town);
        }
    private void computequota_8()throws Exception {
        StringBuffer errorContent=new StringBuffer();
        String quotaId="8";
        //找出今天的签约信息
        String now = getDayString(0);
        String tomorrow = getDayString(1);
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(now,tomorrow);
        errorContent.append("截止时间:"+now+"-"+DateUtil.dateToStrLong(new Date())+",数据库查询的签约数是:"+signFamilys.size()+",错误:");
        //数组里面第一个是健康人群 第二个是慢病人群 第三个是65岁以上人群
        Map<String, Map<String, Long>> cityAgeMap = new HashMap<String, Map<String, Long>>();//key是市行政代码 目前只有厦门市
        cityAgeMap.put(Constant.city,new HashMap<String, Long>());
        Map<String, Map<String, Long>> townAgeMap = new HashMap<String, Map<String, Long>>();//key是区行政代码
        Map<String, Map<String, Long>> orgAgeMap = new HashMap<String, Map<String, Long>>();//key是机构代码
        //统计有签约的
        for (SignFamily signFamily : signFamilys) {
            Hospital hospital = hospitalsMap.get(getOrg(signFamily.getHospital()));//得到患者签约的机构
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(now, tomorrow);
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        //统计有已改簽的
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        //数据过滤清洗出脏数据  -----------start
        for(SignFamily signFamily:signFamilys){
            ETLModel etlModel=new ETLModel();
            String orgCode = signFamily.getHospital();
            if(StringUtils.isEmpty(orgCode)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            String orgCodeTemp="";
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                //站
                orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
            }else{
                //社区
                orgCodeTemp=orgCode;
            }
            //判断社区有没有值
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据异常。");
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            String town = hospital.getTown();
            int age = IdCardUtil.getAgeForIdcard(signFamily.getIdcard());//根据card解析年龄
            String ageCode =getAgeCode(age);//得到年龄的code
            //统计市
            if (cityAgeMap.containsKey(Constant.city)) {
                Map<String, Long> groupMapTemp = cityAgeMap.get(Constant.city);
                groupMapTemp.put(ageCode,(groupMapTemp.get(ageCode)==null?0l:groupMapTemp.get(ageCode)) + 1);
                cityAgeMap.put(Constant.city, groupMapTemp);
            } else {
                Map<String, Long> groupMapTemp = new HashMap<String, Long>();
                groupMapTemp.put(ageCode, 1L);
                cityAgeMap.put(Constant.city, groupMapTemp);
            String idCard=signFamily.getIdcard();
            if(idCard == null||(idCard.length()==18||idCard.length()==15)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
                isAll=false;
                errorCount++;
                continue;
            }
            //统计区
            if (townAgeMap.containsKey(town)) {
                Map<String, Long> groupMapTemp = townAgeMap.get(town);
                groupMapTemp.put(ageCode,(groupMapTemp.get(ageCode)==null?0l:groupMapTemp.get(ageCode)) + 1);
                townAgeMap.put(town, groupMapTemp);
            } else {
                Map<String, Long> groupMapTemp = new HashMap<String, Long>();
                groupMapTemp.put(ageCode, 1L);
                townAgeMap.put(town, groupMapTemp);
            String town =hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
                isAll=false;
                errorCount++;
                continue;
            }
            //统计机构
            if (orgAgeMap.containsKey(hospital.getCode())) {
                Map<String, Long> groupMapTemp = orgAgeMap.get(hospital.getCode());
                groupMapTemp.put(ageCode,(groupMapTemp.get(ageCode)==null?0l:groupMapTemp.get(ageCode))+ 1);
                orgAgeMap.put(hospital.getCode(), groupMapTemp);
            } else {
                Map<String, Long> groupMapTemp = new HashMap<String, Long>();
                groupMapTemp.put(ageCode, 1L);
                orgAgeMap.put(hospital.getCode(), groupMapTemp);
            Town townObj =townsMap.get(town);
            if(townObj==null) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModel.setIdcard(signFamily.getIdcard());
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            townCount++;
            orgCount++;
            adminCount++;
        }
        //数据过滤清洗出脏数据  -----------end
        try{
            //统计数据
            List<Map<String, List<ETLModel>>>  returnData1s= levelRole.elt(etlModels);
            List<Map<String, Map<String, List<ETLModel>>>> patientAgeRoleData= patientAgeRole.elt(returnData1s);
            //保存数据
            redisStorage.saveByLevel2(patientAgeRoleData,quotaId,6,2);
        }catch (Exception e){
            errorContent.append("统计失败:"+e.getMessage());
        }
        // 保存市的统计数据
        for (Map.Entry<String, Map<String, Long>> entry : cityAgeMap.entrySet()) {
            Map<String,Long> oneAgeMap=entry.getValue();
            //保存0~6
            JSONObject jsonObject=new JSONObject();
        saveContent(quotaId,signFamilys.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("---------------------");
    }
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_1)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_1));
            } else {
                jsonObject.put("num",0);
            }
            jsonObject.put("name",Constant.cityName);
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:4:1:"+entry.getKey()).toString(),jsonObject.toString());
            //保存7~18
            jsonObject=new JSONObject();
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_2)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_2));
            } else {
                jsonObject.put("num",0);
            }
            jsonObject.put("name",Constant.cityName);
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:4:2:"+entry.getKey()).toString(),jsonObject.toString());
            //保存18~30
            jsonObject=new JSONObject();
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_3)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_3));
            } else {
                jsonObject.put("num",0);
            }
            jsonObject.put("name",Constant.cityName);
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:4:3:"+entry.getKey()).toString(),jsonObject.toString());
            //保存30~50
            jsonObject=new JSONObject();
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_4)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_4));
            } else {
                jsonObject.put("num",0);
            }
            jsonObject.put("name",Constant.cityName);
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:4:4:"+entry.getKey()).toString(),jsonObject.toString());
            //保存50~65
            jsonObject=new JSONObject();
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_5)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_5));
            } else {
                jsonObject.put("num",0);
    private void computequota_9() {
        StringBuffer errorContent=new StringBuffer();
        String quotaId="9";
        //找出今天的待签约信息
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingWaitSignYesterday(now,tomorrow);
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        //统计有已改簽的
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        //数据过滤清洗出脏数据  -----------start
        for(SignFamily signFamily:signFamilys){
            ETLModel etlModel=new ETLModel();
            String orgCode = signFamily.getHospital();
            if(StringUtils.isEmpty(orgCode)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            jsonObject.put("name",Constant.cityName);
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:4:5:"+entry.getKey()).toString(),jsonObject.toString());
            //保存18~30
            jsonObject=new JSONObject();
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_6)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_6));
            } else {
                jsonObject.put("num",0);
            String orgCodeTemp="";
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                //站
                orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
            }else{
                //社区
                orgCodeTemp=orgCode;
            }
            jsonObject.put("name",Constant.cityName);
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:4:6:"+entry.getKey()).toString(),jsonObject.toString());
        }
        //保存区级
        for (Map.Entry<String, Town> entry : townsMap.entrySet()) {
            //判断该区是否有统计数据
            Map<String, Long> oneAgeMap = townAgeMap.get(entry.getKey());//得到当个区的统计数据
            Town town = entry.getValue();//得到区级信息
            JSONObject jsonObject=new JSONObject();
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_1)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_1));
            } else {
                jsonObject.put("num",0);
            //判断社区有没有值
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            jsonObject.put("name",town.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:3:1:"+entry.getKey()).toString(),jsonObject.toString());
            //保存7~18
            jsonObject=new JSONObject();
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_2)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_2));
            } else {
                jsonObject.put("num",0);
            Long adminId=signFamily.getAdminTeamId();
            if(adminId == null||adminId<=0) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            jsonObject.put("name",town.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:3:2:"+entry.getKey()).toString(),jsonObject.toString());
            //保存18~30
            jsonObject=new JSONObject();
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_3)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_3));
            } else {
                jsonObject.put("num",0);
            AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
            if(adminTeam == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            jsonObject.put("name",town.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:3:3:"+entry.getKey()).toString(),jsonObject.toString());
            //保存30~50
            jsonObject=new JSONObject();
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_4)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_4));
            } else {
                jsonObject.put("num",0);
            String idCard=signFamily.getIdcard();
            if(idCard == null||(idCard.length()==18||idCard.length()==15)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
                isAll=false;
                errorCount++;
                continue;
            }
            jsonObject.put("name",town.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:3:4:"+entry.getKey()).toString(),jsonObject.toString());
            //保存50~65
            jsonObject=new JSONObject();
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_5)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_5));
            } else {
                jsonObject.put("num",0);
            String town =hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
                isAll=false;
                errorCount++;
                continue;
            }
            jsonObject.put("name",town.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:3:5:"+entry.getKey()).toString(),jsonObject.toString());
            //保存18~30
            jsonObject=new JSONObject();
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_6)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_6));
            } else {
                jsonObject.put("num",0);
            Town townObj =townsMap.get(town);
            if(townObj==null) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            jsonObject.put("name",town.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:3:6:"+entry.getKey()).toString(),jsonObject.toString());
            etlModel.setAdminTeam(adminTeam.getId()+"");
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModel.setIdcard(signFamily.getIdcard());
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            townCount++;
            orgCount++;
            adminCount++;
        }
        //数据过滤清洗出脏数据  -----------end
        try{
            //统计数据
            List<Map<String, List<ETLModel>>>  returnDatas= levelRole.elt(etlModels);
            //保存数据
            redisStorage.saveByLevel1(returnDatas,quotaId);
        }catch (Exception e){
            errorContent.append("统计失败:"+e.getMessage());
        }
        saveContent(quotaId,signFamilys.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("---------------------");
    }
        for (Map.Entry<String, Hospital> entry : hospitalsMap.entrySet()) {
            //判断该机构是否有统计数据
            Map<String, Long> oneAgeMap = orgAgeMap.get(entry.getKey());//得到当个机构的统计数据
            Hospital hospital = entry.getValue();//得到区级信息
            //保存0~6
            JSONObject jsonObject=new JSONObject();
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_1)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_1));
            } else {
                jsonObject.put("num",0);
            }
            jsonObject.put("name",hospital.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:2:1:"+entry.getKey()).toString(),jsonObject.toString());
            //保存7~18
            jsonObject=new JSONObject();
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_2)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_2));
            } else {
                jsonObject.put("num",0);
            }
            jsonObject.put("name",hospital.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:2:2:"+entry.getKey()).toString(),jsonObject.toString());
            //保存18~30
            jsonObject=new JSONObject();
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_3)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_3));
            } else {
                jsonObject.put("num",0);
            }
            jsonObject.put("name",hospital.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:2:3:"+entry.getKey()).toString(),jsonObject.toString());
            //保存30~50
            jsonObject=new JSONObject();
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_4)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_4));
            } else {
                jsonObject.put("num",0);
            }
            jsonObject.put("name",hospital.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:2:4:"+entry.getKey()).toString(),jsonObject.toString());
            //保存50~65
            jsonObject=new JSONObject();
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_5)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_5));
            } else {
                jsonObject.put("num",0);
    private void computequota_10() {
        StringBuffer errorContent=new StringBuffer();
        String quotaId="10";
        //查找出系统全部的全科医生
        List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
        Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
        for (AdminTeam adminTeam : adminTeams) {
            adminTeamMap.put(adminTeam.getId()+"", adminTeam);
        }
        //查找出系统全部的机构
        List<Hospital> hospitals = hospitalDao.findHospital2();
        Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
        for (Hospital hospital : hospitals) {
            hospitalsMap.put(hospital.getCode(), hospital);
        }
        //查找出厦门市全部的区
        List<Town> towns = townDao.findByCityCode(Constant.city);
        Map<String, Town> townsMap = new HashMap<String, Town>();
        for (Town town : towns) {
            townsMap.put(town.getCode(), town);
        }
        //找出今天的已改簽信息
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingChaangeSignYesterday(now,tomorrow);
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        //统计有已改簽的
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        //数据过滤清洗出脏数据  -----------start
        for(SignFamily signFamily:signFamilys){
            ETLModel etlModel=new ETLModel();
            String orgCode = signFamily.getHospital();
            if(StringUtils.isEmpty(orgCode)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            jsonObject.put("name",hospital.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:2:5:"+entry.getKey()).toString(),jsonObject.toString());
            //保存18~30
            jsonObject=new JSONObject();
            if (oneAgeMap!=null&&oneAgeMap.containsKey(Constant.level_age_6)) {
                jsonObject.put("num",oneAgeMap.get(Constant.level_age_6));
            } else {
                jsonObject.put("num",0);
            String orgCodeTemp="";
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                //站
                orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
            }else{
                //社区
                orgCodeTemp=orgCode;
            }
            jsonObject.put("name",hospital.getName());
            jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:8:2:6:"+entry.getKey()).toString(),jsonObject.toString());
        }
        errorContent.append("computequota_8---end!!");
    }
    private void computequota_9(StringBuffer errorContent) {
        errorContent.append("computequota_9---start,");
        Map<String, JSONObject> tjCityMap = new HashMap<>();//区级的统计map key 是区行政区划350200
        Map<String, JSONObject> tjTownMap = new HashMap<String, JSONObject>();//区级的统计map key 是区行政区划350200
        Map<String, JSONObject> tjOrgMap = new HashMap<String, JSONObject>();//机构的统计map key 是机构的code
        Map<String, JSONObject> tjAdminTeamMap = new HashMap<String, JSONObject>();//团队级的统计map 目前没有团队 先用全科医生统一  key doctorCode
        initMap(tjCityMap, tjTownMap, tjOrgMap, null, null,tjAdminTeamMap);
        String now = getDayString(0);
        String tomorrow = getDayString(1);
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingWaitSignYesterday(now, tomorrow);
        errorContent.append("截止时间:"+now+"-"+DateUtil.dateToStrLong(new Date())+",数据库查询的签约数是:"+signFamilys.size()+",错误:");
        //统计有签约的
        for (SignFamily signFamily : signFamilys) {
            String hospitalCode=getOrg(signFamily.getHospital());
            Hospital hospital=hospitalsMap.get(hospitalCode);
            //判断社区有没有值
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据异常。");
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            //统计机构
            //判断是中心还是服务站 服务站的话添加到中心去
            JSONObject orgjo=tjOrgMap.get(getOrg(hospital.getCode()));
            if(orgjo==null){
            Long adminId=signFamily.getAdminTeamId();
            if(adminId == null||adminId<=0) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            orgjo.put("num",((int)orgjo.get("num"))+1);
            //统计市
            JSONObject cityjo=tjCityMap.get(Constant.city);
            cityjo.put("num",((int)cityjo.get("num"))+1);
            //统计区
            JSONObject townjo=tjTownMap.get(hospital.getTown());
            townjo.put("num",((int)townjo.get("num"))+1);
            //统计全科医生
            JSONObject qkjo=tjAdminTeamMap.get(signFamily.getAdminTeamId()+"");
            if(qkjo!=null){
                qkjo.put("num",((int)qkjo.get("num"))+1);
            AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
            if(adminTeam == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
        }
        //统计市
        for(Map.Entry<String,JSONObject> entry:tjCityMap.entrySet()){
            entry.getValue().put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:9:4:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存区
        for(Map.Entry<String,JSONObject> entry:tjTownMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:9:3:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存机构
        for(Map.Entry<String,JSONObject> entry:tjOrgMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:9:2:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存全科医生
        for(Map.Entry<String,JSONObject> entry:tjAdminTeamMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:9:1:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        errorContent.append("computequota_9---end!!");
    }
    private void computequota_10(StringBuffer errorContent) {
        errorContent.append("computequota_10---start,");
        Map<String, JSONObject> tjCityMap = new HashMap<>();//区级的统计map key 是区行政区划350200
        Map<String, JSONObject> tjTownMap = new HashMap<String, JSONObject>();//区级的统计map key 是区行政区划350200
        Map<String, JSONObject> tjOrgMap = new HashMap<String, JSONObject>();//机构的统计map key 是机构的code
        Map<String, JSONObject> tjAdminTeamMap = new HashMap<String, JSONObject>();//团队级的统计map 目前没有团队 先用全科医生统一  key doctorCode
        initMap(tjCityMap, tjTownMap, tjOrgMap, null, null,tjAdminTeamMap);
        String now = getDayString(0);
        String tomorrow = getDayString(1);
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingChaangeSignYesterday(now, tomorrow);
        errorContent.append("截止时间:"+now+"-"+DateUtil.dateToStrLong(new Date())+",数据库查询的签约数是:"+signFamilys.size()+",错误:");
        //统计有签约的
        for (SignFamily signFamily : signFamilys) {
            String hospitalCode=getOrg(signFamily.getHospital());
            Hospital hospital=hospitalsMap.get(hospitalCode);
            if(hospital == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据异常。");
            String idCard=signFamily.getIdcard();
            if(idCard == null||(idCard.length()==18||idCard.length()==15)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
                isAll=false;
                errorCount++;
                continue;
            }
            //统计机构
            JSONObject orgjo=tjOrgMap.get(hospital.getCode());
            if(orgjo==null){
            String town =hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
                isAll=false;
                errorCount++;
                continue;
            }
            orgjo.put("num",((int)orgjo.get("num"))+1);
            //统计市
            JSONObject cityjo=tjCityMap.get(Constant.city);
            cityjo.put("num",((int)cityjo.get("num"))+1);
            //统计区
            JSONObject townjo=tjTownMap.get(hospital.getTown());
            townjo.put("num",((int)townjo.get("num"))+1);
            //统计全科医生
            JSONObject qkjo=tjAdminTeamMap.get(signFamily.getAdminTeamId()+"");
            if(qkjo!=null){
                qkjo.put("num",((int)qkjo.get("num"))+1);
            Town townObj =townsMap.get(town);
            if(townObj==null) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            etlModel.setAdminTeam(adminTeam.getId()+"");
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModel.setIdcard(signFamily.getIdcard());
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            townCount++;
            orgCount++;
            adminCount++;
        }
        //数据过滤清洗出脏数据  -----------end
        try{
            //统计数据
            List<Map<String, List<ETLModel>>>  returnDatas= levelRole.elt(etlModels);
            //保存数据
            redisStorage.saveByLevel1(returnDatas,quotaId);
        }catch (Exception e){
            errorContent.append("统计失败:"+e.getMessage());
        }
        //统计市
        for(Map.Entry<String,JSONObject> entry:tjCityMap.entrySet()){
            entry.getValue().put("date", DateUtil.dateToStrLong(new Date()));
            redisTemplate.opsForValue().set(new StringBuffer("quota:10:4:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存区
        for(Map.Entry<String,JSONObject> entry:tjTownMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:10:3:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存机构
        for(Map.Entry<String,JSONObject> entry:tjOrgMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:10:2:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        //保存全科医生
        for(Map.Entry<String,JSONObject> entry:tjAdminTeamMap.entrySet()){
            redisTemplate.opsForValue().set(new StringBuffer("quota:10:1:"+entry.getKey()).toString(), entry.getValue().toString());
        }
        errorContent.append("computequota_10---end!!");
        saveContent(quotaId,signFamilys.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("---------------------");
    }
    public Properties getSystemProperties() {
@ -1715,5 +1663,17 @@ public class CurrentDayAllQuotaJob implements Job {
            return org;
        }
    }
    private String saveContent(String id,Integer size, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent,Long errorCount) {
        StringBuffer string=new StringBuffer("统计 quotaid:"+id+" 的数据完成 ,数据库查询到改签数目:"+size);
        string.append(",过滤的脏数据数目:"+errorCount);
        string.append(",统计到市的数据总数:"+cityCount);
        string.append(",统计到区的数据总数:"+townCount);
        string.append(",统计到机构的数据总数:"+orgCount);
        string.append(",统计到团队的数据总数:"+qkCount);
        string.append(",是否统计成功:"+isAll);
        if(!isAll){
            string.append(",失败原因:"+errorContent);
        }
        return string.toString();
    }
}

+ 86 - 130
src/main/java/com/yihu/wlyy/job/FollowUpJob.java

@ -6,12 +6,17 @@ import com.yihu.wlyy.entity.address.Town;
import com.yihu.wlyy.entity.doctor.profile.Doctor;
import com.yihu.wlyy.entity.job.QuartzJobLog;
import com.yihu.wlyy.entity.patient.PatientHealthGuidance;
import com.yihu.wlyy.entity.patient.SignFamily;
import com.yihu.wlyy.entity.statistics.WlyyQuotaResult;
import com.yihu.wlyy.job.elt.base.ETLModel;
import com.yihu.wlyy.job.elt.role.LevelRole;
import com.yihu.wlyy.job.elt.storage.DBStorage;
import com.yihu.wlyy.repository.address.TownDao;
import com.yihu.wlyy.repository.doctor.DoctorAdminTeamDao;
import com.yihu.wlyy.repository.doctor.DoctorDao;
import com.yihu.wlyy.repository.job.QuartzJobLogDao;
import com.yihu.wlyy.repository.organization.HospitalDao;
import com.yihu.wlyy.repository.patient.SignFamilyDao;
import com.yihu.wlyy.repository.statistics.WlyyQuotaResultDao;
import com.yihu.wlyy.web.quota.WlyyJobConfigVO;
import com.yihu.wlyy.web.quota.WlyyQuotaVO;
@ -28,6 +33,7 @@ import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.*;
/**
@ -43,17 +49,20 @@ public class FollowUpJob implements Job {
    @Autowired
    private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
    @Autowired
    private DoctorDao doctorDao;
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
    private TownDao townDao;
    @Autowired
    private SignFamilyDao signFamilyDao;
    @Autowired
    private JdbcTemplate jdbcTemplate_wlyy;
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    @Autowired
    private LevelRole levelRole;
    @Autowired
    private DBStorage dbStorage;
    private org.apache.tomcat.jdbc.pool.DataSource fvdataSource=new org.apache.tomcat.jdbc.pool.DataSource();//随访数据源
    private JdbcTemplate jdbcTemplate = new JdbcTemplate();
@ -115,152 +124,111 @@ public class FollowUpJob implements Job {
        //找出今天的随访信息
        List<Map<String,Object>> plans = getFvYesterday();
        Map<String, Long> tjTownMap = new HashMap<String, Long>();//区级的统计map key 是区行政区划350200
        Map<String, Long> tjOrgMap = new HashMap<String, Long>();//机构的统计map key 是机构的code
        Map<String, Long> tjAdminTeamMap = new HashMap<String, Long>();//团队级的统计map 目前没有团队 先用全科医生统一  key doctorCode
        Long cityCount = 0L; //统计到市的数目
        Long townCount = 0L; //统计到所有区的数目
        Long orgCount = 0L;//统计到所有机构的数目
        Long qkCount = 0L;//统计到所有全科医生的数目
        boolean isAll=true;//是否统计失败
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        StringBuffer errorContent=new StringBuffer();
        //统计有随访的
        String orgCodeTemp="";
        for (Map<String,Object> plan : plans) {
            //统计市 ------------------start ------------------
            cityCount++;
            //统计团队------------------start ------------------
            String doctorCode = (String) plan.get("doctor_uid");//得到随访中的全部医生的code
            String teamId= doctorAdminTeamDao.findIdByLeaderCode(doctorCode)+"";
            if(teamId==null){
                errorContent.append("随访id:"+plan.get("id")+",随访的医生所属的团队不存在");
        //统计有已改簽的
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        //数据过滤清洗出脏数据  -----------start
        for(Map<String,Object> plan:plans){
            ETLModel etlModel=new ETLModel();
            Object idCard=plan.get("id_card");//得到隨訪的身份證
            if(StringUtils.isEmpty(idCard)){
                errorContent.append("随访id:"+plan.get("id")+",随访(fv_plan)表id_card为空");
                isAll=false;
                continue;
            }
            SignFamily signFamily=signFamilyDao.findByIdcard(idCard.toString());
            if(signFamily==null){
                errorContent.append("随访id:"+plan.get("id")+",签约code:"+signFamily.getCode()+",随访中的患者身份证在签约表中找不到数据");
                isAll=false;
                continue;
            }
            AdminTeam adminTeam=adminTeamMap.get(teamId);
            Long adminTeamId=signFamily.getAdminTeamId();
            if(adminTeamId==null||adminTeamId<=0){
                errorContent.append("随访id:"+plan.get("id")+",签约code:"+signFamily.getCode()+" 中的adminTeamId为空");
                isAll=false;
                continue;
            }
            AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId());
            if(adminTeam==null){
                errorContent.append("随访id:"+plan.get("id")+",随访的医生所属的团队不存在");
                errorContent.append("随访id:"+plan.get("id")+",签约code:"+signFamily.getCode()+",医生团队不存在");
                isAll=false;
                continue;
            }
            compute(tjAdminTeamMap, teamId);
            qkCount++;
            //统计机构------------------start ------------------
            //判断医生属于哪个机构
            String orgCode = adminTeam.getOrgCode();
            Hospital hospital=hospitalsMap.get(orgCode);
            if(hospital==null){
                errorContent.append("随访id:"+plan.get("id")+",随访的医生所属的团队的机构不存在");
            String orgCodeTemp="";
            String orgCode=adminTeam.getOrgCode();
            if(StringUtils.isEmpty(orgCode)){
                errorContent.append("随访id:"+plan.get("id")+",团队Id:"+adminTeam.getId()+",随访的医生所属的团队(wlyy_admin_team)机构为空");
                isAll=false;
                continue;
            }
            //统计机构
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                //统计站
                 orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
                compute(tjOrgMap, orgCodeTemp);
                orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
            }else{
                //统计社区
                orgCodeTemp=orgCode;
                compute(tjOrgMap, orgCode);
            }
            orgCount++;
            //统计区------------------start ------------------
            if(hospital == null) {
                errorContent.append("随访id:"+plan.get("id")+",随访的医生所属的机构为空或者不存在");
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital==null){
                errorContent.append("随访id:"+plan.get("id")+",团队Id:"+adminTeam.getId()+",随访的医生所属的团队的机构不存在");
                isAll=false;
                continue;
            }
            String townCode = hospital.getTown();
            //统计区
            compute(tjTownMap, townCode);
            townCount++;
        }
        //保存统计的结果
        //保存全科医生的随访统计
        for (Map.Entry<String, AdminTeam> entry : adminTeamMap.entrySet()) {
            AdminTeam adminTeam = entry.getValue();//得到健康管理师
            orgCodeTemp=getOrg(adminTeam.getOrgCode());
            Hospital hospital = hospitalsMap.get(orgCodeTemp);//得到全科医生的机构
            if(hospital == null) continue;
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=hospital.getTown();
            String townName=hospital.getTownName();
            String org=hospital.getCode();
            if(!"00".equals(hospital.getCode().substring(hospital.getCode().length()-2,hospital.getCode().length()))){
                //统计站
                org=hospital.getCode().substring(0,hospital.getCode().length()-2)+"00";
            String town =hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("随访id:"+plan.get("id")+",机构Id:"+hospital.getId()+",机构表的中的town为空");
                isAll=false;
                errorCount++;
                continue;
            }
            String orgName=hospital.getName();
            String doctorCode=adminTeam.getId()+"";
            String doctorName=adminTeam.getName();
            String doctorJob="";
            String level="1";
            String key=adminTeam.getId()+"";
            save(tjAdminTeamMap, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level, key);
        }
        //保存机构的随访统计
        for (Map.Entry<String, Hospital> entry : hospitalsMap.entrySet()) {
            Hospital hospital = hospitalsMap.get(entry.getKey());
            if(hospital == null) continue;
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=hospital.getTown();
            String townName=hospital.getTownName();
            String org=hospital.getCode();
            String orgName=hospital.getName();
            String doctorCode="";
            String doctorName="";
            String doctorJob="";
            String level="2";
            String key=hospital.getCode();
            save(tjOrgMap, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level, key);
        }
        //保存区级的随访统计
        for (Map.Entry<String, Town> entry : townsMap.entrySet()) {
            Town townObj = townsMap.get(entry.getKey());
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=townObj.getCode();
            String townName=townObj.getName();
            String org="";
            String orgName="";
            String doctorCode="";
            String doctorName="";
            String doctorJob="";
            String level="3";
            String key=townObj.getCode();
            save(tjTownMap, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level, key);
        }
        //保存市级的统计
        {
            WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
            wlyyQuotaResult.setDel("1");
            wlyyQuotaResult.setCity(Constant.city);
            wlyyQuotaResult.setCityName(Constant.cityName);
            wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
            wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
            wlyyQuotaResult.setQuotaDate(getYesterday());
            wlyyQuotaResult.setCreateTime(new Date());
            wlyyQuotaResult.setLevel1Type("4");
            //判断全科医生是否有随访量
            if (cityCount > 0) {
                wlyyQuotaResult.setResult(cityCount + "");
            } else {
                wlyyQuotaResult.setResult("0");
            Town townObj =townsMap.get(town);
            if(townObj==null) {
                errorContent.append("随访id:"+plan.get("id")+",机构Id:"+hospital.getId()+",机构表的中的town不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            wlyyQuotaResultDao.save(wlyyQuotaResult);
            etlModel.setAdminTeam(adminTeam.getId()+"");
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModel.setIdcard(signFamily.getIdcard());
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            townCount++;
            orgCount++;
            adminCount++;
        }
        //数据过滤清洗出脏数据  -----------end
        try{
            //统计数据
            List<Map<String, List<ETLModel>>>  returnDatas= levelRole.elt(etlModels);
            //保存数据
            dbStorage.saveByLevel1(returnDatas,yesterday,wlyyQuota);
        }catch (Exception e){
            errorContent.append("统计失败:"+e.getMessage());
        }
        //保存日志
        quartzJobLog.setJobEndTime(new Date());
        quartzJobLog.setJobContent(saveContent(plans,qkCount,orgCount,townCount,cityCount,isAll,errorContent));
        quartzJobLog.setJobContent(saveContent(plans,adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
        quartzJobLog.setJobType(isAll?"1":"0");
        quartzJobLogDao.save(quartzJobLog);
    }
    private String saveContent( List<Map<String,Object>> plans, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent) {
    private String saveContent(List<Map<String, Object>> plans, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent, Long errorCount) {
        StringBuffer string=new StringBuffer("统计"+getYesterday()+" 的随访完成 ,数据库查询到随访数目:"+plans.size());
        string.append(",过滤的脏数据数目:"+errorCount);
        string.append(",统计到市的数据总数:"+cityCount);
        string.append(",统计到区的数据总数:"+townCount);
        string.append(",统计到机构的数据总数:"+orgCount);
@ -271,18 +239,6 @@ public class FollowUpJob implements Job {
        }
        return string.toString();
    }
    /**
     * 统计方案
     * @param tjQkdoctorMap
     * @param doctorCode
     */
    private void compute(Map<String, Long> tjQkdoctorMap, String doctorCode) {
        if (tjQkdoctorMap.containsKey(doctorCode)) {
            tjQkdoctorMap.put(doctorCode, tjQkdoctorMap.get(doctorCode) + 1);
        } else {
            tjQkdoctorMap.put(doctorCode, 1L);
        }
    }
    public String getYesterday() {
        return yesterday;

+ 65 - 146
src/main/java/com/yihu/wlyy/job/HealthGuideJob.java

@ -8,6 +8,9 @@ import com.yihu.wlyy.entity.job.QuartzJobLog;
import com.yihu.wlyy.entity.patient.PatientHealthGuidance;
import com.yihu.wlyy.entity.patient.SignFamily;
import com.yihu.wlyy.entity.statistics.WlyyQuotaResult;
import com.yihu.wlyy.job.elt.base.ETLModel;
import com.yihu.wlyy.job.elt.role.LevelRole;
import com.yihu.wlyy.job.elt.storage.DBStorage;
import com.yihu.wlyy.repository.address.TownDao;
import com.yihu.wlyy.repository.doctor.DoctorAdminTeamDao;
import com.yihu.wlyy.repository.doctor.DoctorDao;
@ -45,8 +48,6 @@ public class HealthGuideJob implements Job {
    @Autowired
    private SignFamilyDao signFamilyDao;
    @Autowired
    private DoctorDao doctorDao;
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
    private TownDao townDao;
@ -56,7 +57,10 @@ public class HealthGuideJob implements Job {
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    @Autowired
    private LevelRole levelRole;
    @Autowired
    private DBStorage dbStorage;
    String yesterday;
    String now;
@ -105,18 +109,18 @@ public class HealthGuideJob implements Job {
        //找出今天的健康指导信息
        List<PatientHealthGuidance> patientHealthGuidances = patientHealthGuidanceDao.findByCzrqyYesterday(yesterday,now);
        Map<String, Long> tjTownMap = new HashMap<String, Long>();//区级的统计map key 是区行政区划350200
        Map<String, Long> tjOrgMap = new HashMap<String, Long>();//机构的统计map key 是机构的code
        Map<String, Long> tjAdminTeamMap = new HashMap<String, Long>();//团队级的统计map 目前没有团队 先用医生和健康管理师统一  key doctorCode
        Long cityCount = 0L; //统计到市的数目
        Long townCount = 0L; //统计到所有区的数目
        Long orgCount = 0L;//统计到所有机构的数目
        Long qkCount = 0L;//统计到所有全科医生的数目
        boolean isAll=true;//是否统计失败
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        StringBuffer errorContent=new StringBuffer();
        //统计有健康指导的
        for (PatientHealthGuidance patientHealthGuidance : patientHealthGuidances) {
        //统计有已改簽的
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        //数据过滤清洗出脏数据  -----------start
        for(PatientHealthGuidance patientHealthGuidance:patientHealthGuidances){
            ETLModel etlModel=new ETLModel();
            String patient=patientHealthGuidance.getPatient();
            SignFamily signFamily= signFamilyDao.findByPatientAndType(patient,2);//只统计家庭签约
            if(signFamily == null) {
@ -125,13 +129,23 @@ public class HealthGuideJob implements Job {
                continue;
            }
            String adminId=signFamily.getAdminTeamId()+"";//得到团队ID
            if(StringUtils.isEmpty(adminId)){
                errorContent.append("健康咨询id:"+patientHealthGuidance.getId()+",签约code:"+signFamily.getCode()+",咨询的家庭签约的团队AdminTeamCode为空");
                isAll=false;
                continue;
            }
            AdminTeam adminTeam = adminTeamMap.get(adminId);
            if(adminTeam==null){
                errorContent.append("健康咨询id:"+patientHealthGuidance.getId()+",签约code"+signFamily.getCode()+",咨询的家庭签约的团队为空或者不存在");
                errorContent.append("健康咨询id:"+patientHealthGuidance.getId()+",签约code:"+signFamily.getCode()+",咨询的家庭签约的团队不存在");
                isAll=false;
                continue;
            }
            String orgCode=signFamily.getHospital();//得到机构id
            if(StringUtils.isEmpty(orgCode)){
                errorContent.append("健康咨询id:"+patientHealthGuidance.getId()+",签约code:"+signFamily.getCode()+",咨询的家庭签约的机构Hospital不存在");
                isAll=false;
                continue;
            }
            String orgCodeTemp="";
            //统计机构 -----------------start---------------------
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
@ -143,106 +157,54 @@ public class HealthGuideJob implements Job {
            }
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                errorContent.append("健康咨询id:"+patientHealthGuidance.getId()+",健康咨询的医生所属的机构为空");
                errorContent.append("健康咨询id:"+patientHealthGuidance.getId()+",机构code:"+orgCodeTemp+",健康咨询的医生所属的机构不存在");
                isAll=false;
                continue;
            }
            String town =hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("健康咨询id:"+patientHealthGuidance.getId()+",机构code:"+hospital.getCode()+",机构表的中的town为空");
                isAll=false;
                errorCount++;
                continue;
            }
            Town townObj =townsMap.get(town);
            if(townObj==null) {
                errorContent.append("健康咨询id:"+patientHealthGuidance.getId()+",机构code:"+hospital.getCode()+",机构表的中的town不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            //统计市 -----------------start---------------------
            etlModel.setAdminTeam(adminTeam.getId()+"");
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModel.setIdcard(signFamily.getIdcard());
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            //统计区 -----------------start---------------------
            String townCode = hospital.getTown();
            compute(tjTownMap, townCode);
            townCount++;
            //统计机构 -----------------start---------------------
            compute(tjOrgMap, orgCodeTemp);
            orgCount++;
            //统计团队 -----------------start---------------------
            compute(tjAdminTeamMap, adminId);
            qkCount++;
            adminCount++;
        }
        //保存统计的结果
        //保存全科医生和健康管理师的健康指导统计
        for (Map.Entry<String, AdminTeam> entry : adminTeamMap.entrySet()) {
            AdminTeam adminTeam = adminTeamMap.get(entry.getKey());//得到团队
            String orgCodeTemp=getOrg(adminTeam.getOrgCode());
            Hospital hospital = hospitalsMap.get(orgCodeTemp);//得到全科医生的机构
            if(hospital == null) continue;
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=hospital.getTown();
            String townName=hospital.getTownName();
            String org=hospital.getCode();
            String orgName=hospital.getName();
            String doctorCode=adminTeam.getId()+"";
            String doctorName=adminTeam.getName();
            String doctorJob="";
            String level="1";
            String key=adminTeam.getId()+"";
            save(tjAdminTeamMap, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level, key);
        }
        //保存机构的咨询统计
        for (Map.Entry<String, Hospital> entry : hospitalsMap.entrySet()) {
            Hospital hospital = hospitalsMap.get(entry.getKey());
            if(hospital == null) continue;
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=hospital.getTown();
            String townName=hospital.getTownName();
            String org=hospital.getCode();
            String orgName=hospital.getName();
            String doctorCode="";
            String doctorName="";
            String doctorJob="";
            String level="2";
            String key=hospital.getCode();
            save(tjOrgMap, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level, key);
        }
        //保存区级的咨询统计
        for (Map.Entry<String, Town> entry : townsMap.entrySet()) {
            Town townObj = townsMap.get(entry.getKey());
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=townObj.getCode();
            String townName=townObj.getName();
            String org="";
            String orgName="";
            String doctorCode="";
            String doctorName="";
            String doctorJob="";
            String level="3";
            String key=townObj.getCode();
            save(tjTownMap, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level, key);
        }
        //保存市级的统计
        {
            WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
            wlyyQuotaResult.setDel("1");
            wlyyQuotaResult.setCity(Constant.city);
            wlyyQuotaResult.setCityName(Constant.cityName);
            wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
            wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
            wlyyQuotaResult.setQuotaDate(getYesterday());
            wlyyQuotaResult.setCreateTime(new Date());
            wlyyQuotaResult.setLevel1Type("4");
            //判断全科医生是否有咨询量
            if (cityCount > 0) {
                wlyyQuotaResult.setResult(cityCount + "");
            } else {
                wlyyQuotaResult.setResult("0");
            }
            wlyyQuotaResultDao.save(wlyyQuotaResult);
        //数据过滤清洗出脏数据  -----------end
        try{
            //统计数据
            List<Map<String, List<ETLModel>>>  returnDatas= levelRole.elt(etlModels);
            //保存数据
            dbStorage.saveByLevel1(returnDatas,yesterday,wlyyQuota);
        }catch (Exception e){
            errorContent.append("统计失败:"+e.getMessage());
        }
        //保存日志
        quartzJobLog.setJobEndTime(new Date());
        quartzJobLog.setJobContent(saveContent(patientHealthGuidances,qkCount,orgCount,townCount,cityCount,isAll,errorContent));
        quartzJobLog.setJobContent(saveContent(patientHealthGuidances,adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
        quartzJobLog.setJobType(isAll?"1":"0");
        quartzJobLogDao.save(quartzJobLog);
    }
    private String saveContent(List<PatientHealthGuidance>  patientHealthGuidances, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent) {
    private String saveContent(List<PatientHealthGuidance> patientHealthGuidances, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent, Long errorCount) {
        StringBuffer string=new StringBuffer("统计"+getYesterday()+" 的健康指导数据完成 ,数据库查询到健康指导数目:"+patientHealthGuidances.size());
        string.append(",过滤的脏数据数目:"+errorCount);
        string.append(",统计到市的数据总数:"+cityCount);
        string.append(",统计到区的数据总数:"+townCount);
        string.append(",统计到机构的数据总数:"+orgCount);
@ -253,50 +215,7 @@ public class HealthGuideJob implements Job {
        }
        return string.toString();
    }
    /**
     * 统计方案
     * @param tjdoctorMap
     * @param doctorCode
     */
    private void compute(Map<String, Long> tjdoctorMap, String doctorCode) {
        if (tjdoctorMap.containsKey(doctorCode)) {
            tjdoctorMap.put(doctorCode, tjdoctorMap.get(doctorCode) + 1);
        } else {
            tjdoctorMap.put(doctorCode, 1L);
        }
    }
    private void save(Map<String, Long> tjTownMap, String city, String cityName, String town, String townName, String org, String orgName, String doctorCode, String doctorName, String doctorJob, String level, String key) {
        WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
        wlyyQuotaResult.setDel("1");
        wlyyQuotaResult.setCity(city);
        wlyyQuotaResult.setCityName(cityName);
        wlyyQuotaResult.setTown(town);
        wlyyQuotaResult.setTownName(townName);
        wlyyQuotaResult.setOrgCode(org);
        wlyyQuotaResult.setOrgName(orgName);
        wlyyQuotaResult.setQkdoctorJobName(doctorJob);
        wlyyQuotaResult.setQkdoctorName(doctorName);
        wlyyQuotaResult.setQkdoctorCode(doctorCode);
        wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
        wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
        wlyyQuotaResult.setQuotaDate(getYesterday());
        wlyyQuotaResult.setCreateTime(new Date());
        wlyyQuotaResult.setLevel1Type(level);
        //判断全科医生是否有随访量
        if (tjTownMap.containsKey(key)) {
            wlyyQuotaResult.setResult(tjTownMap.get(key) + "");
        } else {
            wlyyQuotaResult.setResult("0");
        }
        wlyyQuotaResultDao.save(wlyyQuotaResult);
    }
    private String getOrg(String org){
        if(!"00".equals(org.substring(org.length()-2,org.length()))){
            return org.substring(0,org.length()-2)+"00";
        }else{
            return org;
        }
    }
    public String getYesterday() {
        return yesterday;
    }

+ 254 - 454
src/main/java/com/yihu/wlyy/job/SignJob.java

@ -8,6 +8,12 @@ import com.yihu.wlyy.entity.doctor.team.sign.DoctorPatientGroupInfo;
import com.yihu.wlyy.entity.job.QuartzJobLog;
import com.yihu.wlyy.entity.patient.SignFamily;
import com.yihu.wlyy.entity.statistics.WlyyQuotaResult;
import com.yihu.wlyy.job.elt.base.ETLModel;
import com.yihu.wlyy.job.elt.role.LevelRole;
import com.yihu.wlyy.job.elt.role.PatientAgeRole;
import com.yihu.wlyy.job.elt.role.PatientGroupRole;
import com.yihu.wlyy.job.elt.role.PatientSexRole;
import com.yihu.wlyy.job.elt.storage.DBStorage;
import com.yihu.wlyy.repository.address.TownDao;
import com.yihu.wlyy.repository.doctor.DoctorAdminTeamDao;
import com.yihu.wlyy.repository.doctor.DoctorDao;
@ -50,8 +56,6 @@ public class SignJob implements Job {
    @Autowired
    private SignFamilyDao signFamilyDao;
    @Autowired
    private DoctorDao doctorDao;
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
    private TownDao townDao;
@ -63,6 +67,16 @@ public class SignJob implements Job {
    private StringRedisTemplate redisTemplate;
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    @Autowired
    private LevelRole levelRole;
    @Autowired
    private PatientAgeRole patientAgeRole;
    @Autowired
    private PatientGroupRole patientGroupRole;
    @Autowired
    private PatientSexRole patientSexRole;
    @Autowired
    private DBStorage dbStorage;
    String yesterday;
    String now;
@ -115,13 +129,12 @@ public class SignJob implements Job {
    private void computequotaByPatientSex() {
        jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='" + yesterday + "' and quato_code='" + 6 + "'");
        try {
        try{
            //新建任务日志对象
            QuartzJobLog QuartzJobLog = new QuartzJobLog();
            QuartzJobLog.setJobStartTime(new Date());
            QuartzJobLog.setJobId(wlyyJobConfig.getId());
            QuartzJobLog.setJobName(wlyyJobConfig.getJobName());
            QuartzJobLog quartzJobLog = new QuartzJobLog();
            quartzJobLog.setJobStartTime(new Date());
            quartzJobLog.setJobId(wlyyJobConfig.getId());
            quartzJobLog.setJobName(wlyyJobConfig.getJobName());
            //查找出系统全部的机构
            List<Hospital> hospitals = hospitalDao.findHospitalzxFWZ();
            Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
@ -136,157 +149,93 @@ public class SignJob implements Job {
            }
            //找出今天的签约信息
            List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(yesterday, now);
            //数组里面第一个是女 第二个是男 第三个是未知
            Map<String, Map<String, Long>> citySexMap = new HashMap<String, Map<String, Long>>();//key是市行政代码 目前只有厦门市
            citySexMap.put(Constant.city, new HashMap<String, Long>());
            Map<String, Map<String, Long>> townSexMap = new HashMap<String, Map<String, Long>>();//key是区行政代码
            Map<String, Map<String, Long>> orgSexMap = new HashMap<String, Map<String, Long>>();//key是机构代码
            //统计有签约的
            Long cityCount = 0L; //统计到市的数目
            Long townCount = 0L; //统计到所有区的数目
            Long orgCount = 0L;//统计到所有机构的数目
            Long qkCount = 0L;//统计到所有全科医生的数目
            boolean isAll=true;//是否统计失败
            Long cityCount = new Long(0L); //统计到市的数目
            Long townCount = new Long(0L); //统计到所有区的数目
            Long orgCount =new Long(0L);//统计到所有机构的数目
            Long adminCount = new Long(0L);//统计到所有团队的数目
            Long errorCount=new Long(0L);//脏数据
            Boolean isAll=true;//是否统计失败
            StringBuffer errorContent=new StringBuffer();
            for (SignFamily signFamily : signFamilys) {
                String idcard = signFamily.getIdcard();//得到签约中患者的身份证号
                String orgCodeTemp=getOrg(signFamily.getHospital());
                Hospital hospital = hospitalsMap.get(orgCodeTemp);//得到患者签约的机构
                if(hospital == null) {
                    errorContent.append("签约code:"+signFamily.getCode()+",签约的全科医生(doctor字段)的所属机构(wlyy_doctor表中的hospital字段)为空或者所属的机构数据有问题");
            //统计有已改簽的
            List<ETLModel> etlModels=new ArrayList<ETLModel>();
            //数据过滤清洗出脏数据  -----------start
            for(SignFamily signFamily:signFamilys){
                ETLModel etlModel=new ETLModel();
                String orgCode = signFamily.getHospital();
                if(StringUtils.isEmpty(orgCode)) {
                    errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
                    isAll=false;
                    errorCount++;
                    continue;
                }
                String town = hospital.getTown();//得到患者签约的机构的区号
                String hospitalCode = hospital.getCode();//得到患者签约的机构号
                String sex = IdCardUtil.getSexForIdcard(idcard);//根据身份证得到性别
                //统计市 目前只统计厦门市 所以先写死 后期再改造
                compute_level2_1(citySexMap,Constant.city, sex);
                cityCount++;
                //统计区
                compute_level2_1(townSexMap,town, sex);
                townCount++;
                //统计机构
                //统计站
                String orgCode=hospital.getCode();
                String orgCodeTemp="";
                if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                    //统计站
                    //站
                    orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
                    compute_level2_1(orgSexMap,orgCodeTemp, sex);
                } else {
                    //统计社区
                    compute_level2_1(orgSexMap,hospitalCode, sex);
                }else{
                    //社区
                    orgCodeTemp=orgCode;
                }
                orgCount++;
            }
            //保存统计数据
            //保存市统计数据
            for (Map.Entry<String, Map<String, Long>> entry : citySexMap.entrySet()) {
                for(int i=1;i<4;i++){
                    String key=i+"";
                    String city=Constant.city;
                    String cityName=Constant.cityName;
                    String town="";
                    String townName="";
                    String org="";
                    String orgName="";
                    String level="4";
                    save_level2_1(entry.getValue(), key, city, cityName, town, townName, org, orgName, level);
                //判断社区有没有值
                Hospital hospital=hospitalsMap.get(orgCodeTemp);
                if(hospital == null) {
                    errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
                    isAll=false;
                    errorCount++;
                    continue;
                }
            }
            //保存区的统计数据
            for (Map.Entry<String, Town> townEntry : townsMap.entrySet()) {
                //判断该区是否有统计数据
                Map<String, Long> oneTownSexMap = townSexMap.get(townEntry.getKey());//得到当个区的统计数据
                Town townObj = townEntry.getValue();//得到区级信息
                for(int i=1;i<4;i++){
                    String key=i+"";
                    String city=Constant.city;
                    String cityName=Constant.cityName;
                    String town=townObj.getCode();
                    String townName=townObj.getName();
                    String org="";
                    String orgName="";
                    String level="3";
                    save_level2_1(oneTownSexMap, key, city, cityName, town, townName, org, orgName, level);
                String idCard=signFamily.getIdcard();
                if(idCard == null||(idCard.length()==18||idCard.length()==15)) {
                    errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
                    isAll=false;
                    errorCount++;
                    continue;
                }
                String town =hospital.getTown();
                if(StringUtils.isEmpty(town)) {
                    errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
                    isAll=false;
                    errorCount++;
                    continue;
                }
                Town townObj =townsMap.get(town);
                if(townObj==null) {
                    errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
                    isAll=false;
                    errorCount++;
                    continue;
                }
                etlModel.setHospital(orgCodeTemp);
                etlModel.setTown(hospital.getTown());
                etlModel.setCity(Constant.city);
                etlModel.setIdcard(signFamily.getIdcard());
                etlModels.add(etlModel);
                //统计数目+1
                cityCount++;
                townCount++;
                orgCount++;
                adminCount++;
            }
            //统计机构
            for (Map.Entry<String, Hospital> hospitalEntry : hospitalsMap.entrySet()) {
                //判断该机构是否有统计数据
                Map<String, Long> oneorgSexMap = orgSexMap.get(hospitalEntry.getKey());//得到当个机构的统计数据
                Hospital hospital = hospitalEntry.getValue();//得到区级信息
                for(int i=1;i<4;i++){
                    String key=i+"";
                    String city=Constant.city;
                    String cityName=Constant.cityName;
                    String town=hospital.getTown();
                    String townName=hospital.getTownName();
                    String org=hospital.getCode();
                    String orgName=hospital.getName();
                    String level="2";
                    save_level2_1(oneorgSexMap, key, city, cityName, town, townName, org, orgName, level);
               }
            //数据过滤清洗出脏数据  -----------end
            try{
                //统计数据
                List<Map<String, List<ETLModel>>>  returnData1s= levelRole.elt(etlModels);
                List<Map<String, Map<String, List<ETLModel>>>> patientSexRoleData= patientSexRole.elt(returnData1s);
                //保存数据
                dbStorage.saveByLevel2(patientSexRoleData,yesterday,wlyyQuota,3,1);
            }catch (Exception e){
                errorContent.append("统计失败:"+e.getMessage());
            }
            QuartzJobLog.setJobEndTime(new Date());
            QuartzJobLog.setJobContent(saveContent(signFamilys,qkCount,orgCount,townCount,cityCount,isAll,errorContent));
            QuartzJobLog.setJobType(isAll?"1":"0");
            quartzJobLogDao.save(QuartzJobLog);
        } catch (Exception e) {
            //保存日志
            quartzJobLog.setJobEndTime(new Date());
            quartzJobLog.setJobContent(saveContent(signFamilys,adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
            quartzJobLog.setJobType(isAll?"1":"0");
            quartzJobLogDao.save(quartzJobLog);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /**
     * 机构维度下患者性别维度计算指标 公用保存方法
     * @param oneorgSexMap
     * @param key
     * @param city
     * @param cityName
     * @param town
     * @param townName
     * @param org
     * @param orgName
     * @param level
     */
    private void save_level2_1(Map<String, Long> oneorgSexMap, String key, String city, String cityName, String town, String townName, String org, String orgName, String level) {
        WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
        wlyyQuotaResult.setDel("1");
        wlyyQuotaResult.setCity(city);
        wlyyQuotaResult.setCityName(cityName);
        wlyyQuotaResult.setTown(town);
        wlyyQuotaResult.setTownName(townName);
        wlyyQuotaResult.setOrgCode(org);
        wlyyQuotaResult.setOrgName(orgName);
        wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
        wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
        wlyyQuotaResult.setQuotaDate(getYesterday());
        wlyyQuotaResult.setCreateTime(new Date());
        wlyyQuotaResult.setLevel1Type(level);//机构级
        wlyyQuotaResult.setLevel2Type(key);
        wlyyQuotaResult.setLevel2TypeName(Constant.getLevelSexName(key));
        if (oneorgSexMap != null && oneorgSexMap.containsKey(key)) {
            wlyyQuotaResult.setResult(oneorgSexMap.get(key) + "");
        } else {
            wlyyQuotaResult.setResult("0");
        }
        wlyyQuotaResultDao.save(wlyyQuotaResult);
    }
    private void compute_level2_1(Map<String, Map<String, Long>> citySexMap,String key, String sex) {
        if (citySexMap.containsKey(key)) {
            Map<String, Long> sexMap = citySexMap.get(key);
            sexMap.put(sex, (sexMap.get(sex) == null ? 0l : sexMap.get(sex)) + 1);
            citySexMap.put(key, sexMap);
        } else {
            Map<String, Long> sexMap = new HashMap<String, Long>();
            sexMap.put(sex, 1L);
            citySexMap.put(key, sexMap);
        }
    }
    /**
     * 机构维度患者分组维度计算指标
     */
@ -316,7 +265,7 @@ public class SignJob implements Job {
                one.put("3", 0L);
                one.put("4", 0L);
                one.put("5", 0L);
                one.put("100", 0L);
                one.put("6", 0L);
                orgGroupMap.put(hospital.getCode(), one);
            }
            //查找出厦门市全部的区
@ -330,7 +279,7 @@ public class SignJob implements Job {
                one.put("3", 0L);
                one.put("4", 0L);
                one.put("5", 0L);
                one.put("100", 0L);
                one.put("6", 0L);
                townGroupMap.put(town.getCode(), one);
            }
@ -492,7 +441,7 @@ public class SignJob implements Job {
            }
            QuartzJobLog.setJobEndTime(new Date());
            QuartzJobLog.setJobContent(saveContent(signFamilys,qkCount,orgCount,townCount,cityCount,isAll,errorContent));
            QuartzJobLog.setJobContent(saveContent(signFamilys,qkCount,orgCount,townCount,cityCount,isAll,errorContent,null));
            QuartzJobLog.setJobType(isAll?"1":"0");
            quartzJobLogDao.save(QuartzJobLog);
        } catch (Exception e) {
@ -544,10 +493,10 @@ public class SignJob implements Job {
        try {
            jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='" + yesterday + "' and quato_code='" + 8 + "'");
            //新建任务日志对象
            QuartzJobLog QuartzJobLog = new QuartzJobLog();
            QuartzJobLog.setJobStartTime(new Date());
            QuartzJobLog.setJobId(wlyyJobConfig.getId());
            QuartzJobLog.setJobName(wlyyJobConfig.getJobName());
            QuartzJobLog quartzJobLog = new QuartzJobLog();
            quartzJobLog.setJobStartTime(new Date());
            quartzJobLog.setJobId(wlyyJobConfig.getId());
            quartzJobLog.setJobName(wlyyJobConfig.getJobName());
            //查找出系统全部的机构
            List<Hospital> hospitals = hospitalDao.findHospital2();
            Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
@ -562,148 +511,93 @@ public class SignJob implements Job {
            }
            //找出今天的签约信息
            List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(yesterday, now);
            //数组里面第一个是健康人群 第二个是慢病人群 第三个是65岁以上人群
            Map<String, Map<String, Long>> cityAgeMap = new HashMap<String, Map<String, Long>>();//key是市行政代码 目前只有厦门市
            cityAgeMap.put(Constant.city, new HashMap<String, Long>());
            Map<String, Map<String, Long>> townAgeMap = new HashMap<String, Map<String, Long>>();//key是区行政代码
            Map<String, Map<String, Long>> orgAgeMap = new HashMap<String, Map<String, Long>>();//key是机构代码
            //统计有签约的
            Long cityCount = 0L; //统计到市的数目
            Long townCount = 0L; //统计到所有区的数目
            Long orgCount = 0L;//统计到所有机构的数目
            Long qkCount = 0L;//统计到所有全科医生的数目
            boolean isAll=true;//是否统计失败
            Long cityCount = new Long(0L); //统计到市的数目
            Long townCount = new Long(0L); //统计到所有区的数目
            Long orgCount =new Long(0L);//统计到所有机构的数目
            Long adminCount = new Long(0L);//统计到所有团队的数目
            Long errorCount=new Long(0L);//脏数据
            Boolean isAll=true;//是否统计失败
            StringBuffer errorContent=new StringBuffer();
            //统计有签约的
           for (SignFamily signFamily : signFamilys) {
                String orgCodeTemp=getOrg(signFamily.getHospital());
                Hospital hospital = hospitalsMap.get(orgCodeTemp);//得到患者签约的机构
               if(hospital == null) {
                   errorContent.append("签约code:"+signFamily.getCode()+",签约的全科医生(doctor字段)的所属机构(wlyy_doctor表中的hospital字段)为空或者所属的机构数据有问题");
                   isAll=false;
                   continue;
               }
                String town = hospital.getTown();
                int age = IdCardUtil.getAgeForIdcard(signFamily.getIdcard());//根据card解析年龄
                String ageCode = getAgeCode(age);//得到年龄的code
                //统计市
               compute_level2_3(cityAgeMap, ageCode,Constant.city);
               cityCount++;
               //统计区
               compute_level2_3(townAgeMap, ageCode,town);
               townCount++;
                //统计站
                String orgCode=hospital.getCode();
            //统计有已改簽的
            List<ETLModel> etlModels=new ArrayList<ETLModel>();
            //数据过滤清洗出脏数据  -----------start
            for(SignFamily signFamily:signFamilys){
                ETLModel etlModel=new ETLModel();
                String orgCode = signFamily.getHospital();
                if(StringUtils.isEmpty(orgCode)) {
                    errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
                    isAll=false;
                    errorCount++;
                    continue;
                }
                String orgCodeTemp="";
                if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                    //统计站
                    //站
                    orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
                    //统计机构
                    compute_level2_3(orgAgeMap, ageCode,orgCodeTemp);
                } else {
                    //统计机构
                    compute_level2_3(orgAgeMap, ageCode,hospital.getCode());
                }else{
                    //社区
                    orgCodeTemp=orgCode;
                }
               orgCount++;
            }
            //保存统计数据
            // 保存市的统计数据
            for (Map.Entry<String, Map<String, Long>> entry : cityAgeMap.entrySet()) {
                Map<String, Long> oneAgeMap = entry.getValue();
                for(int i=1;i<7;i++){
                    String city=Constant.city;
                    String cityName=Constant.cityName;
                    String town="";
                    String townName="";
                    String org="";
                    String orgName="";
                    String level="4";
                    String key=i+"";
                    save_level2_3(oneAgeMap, city, cityName, town, townName, org, orgName, level, key);
                //判断社区有没有值
                Hospital hospital=hospitalsMap.get(orgCodeTemp);
                if(hospital == null) {
                    errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
                    isAll=false;
                    errorCount++;
                    continue;
                }
            }
            //保存区级
            for (Map.Entry<String, Town> entry : townsMap.entrySet()) {
                //判断该区是否有统计数据
                Map<String, Long> oneAgeMap = townAgeMap.get(entry.getKey());//得到当个区的统计数据
                Town townObj = entry.getValue();//得到区级信息
                for(int i=1;i<7;i++){
                    String city=Constant.city;
                    String cityName=Constant.cityName;
                    String town=townObj.getCode();
                    String townName=townObj.getName();
                    String org="";
                    String orgName="";
                    String level="3";
                    String key=i+"";
                    save_level2_3(oneAgeMap, city, cityName, town, townName, org, orgName, level, key);
                String idCard=signFamily.getIdcard();
                if(idCard == null||(idCard.length()==18||idCard.length()==15)) {
                    errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
                    isAll=false;
                    errorCount++;
                    continue;
                }
            }
            //保存机构
            for (Map.Entry<String, Hospital> hospitalEntry : hospitalsMap.entrySet()) {
                //判断该机构是否有统计数据
                Map<String, Long> oneAgeMap = orgAgeMap.get(hospitalEntry.getKey());//得到当个机构的统计数据
                Hospital hospital = hospitalEntry.getValue();//得到区级信息
                for(int i=1;i<7;i++){
                    String city=Constant.city;
                    String cityName=Constant.cityName;
                    String town=hospital.getTown();
                    String townName=hospital.getTownName();
                    String org=hospital.getCode();
                    String orgName=hospital.getName();
                    String level="2";
                    String key=i+"";
                    save_level2_3(oneAgeMap, city, cityName, town, townName, org, orgName, level, key);
                String town =hospital.getTown();
                if(StringUtils.isEmpty(town)) {
                    errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
                    isAll=false;
                    errorCount++;
                    continue;
                }
                Town townObj =townsMap.get(town);
                if(townObj==null) {
                    errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
                    isAll=false;
                    errorCount++;
                    continue;
                }
                etlModel.setHospital(orgCodeTemp);
                etlModel.setTown(hospital.getTown());
                etlModel.setCity(Constant.city);
                etlModel.setIdcard(signFamily.getIdcard());
                etlModels.add(etlModel);
                //统计数目+1
                cityCount++;
                townCount++;
                orgCount++;
                adminCount++;
            }
            QuartzJobLog.setJobEndTime(new Date());
            QuartzJobLog.setJobContent(saveContent(signFamilys,qkCount,orgCount,townCount,cityCount,isAll,errorContent));
            QuartzJobLog.setJobType(isAll?"1":"0");
            quartzJobLogDao.save(QuartzJobLog);
            //数据过滤清洗出脏数据  -----------end
            try{
                //统计数据
                List<Map<String, List<ETLModel>>>  returnData1s= levelRole.elt(etlModels);
                List<Map<String, Map<String, List<ETLModel>>>> patientAgeRoleData= patientAgeRole.elt(returnData1s);
                //保存数据
                dbStorage.saveByLevel2(patientAgeRoleData,yesterday,wlyyQuota,6,2);
            }catch (Exception e){
                errorContent.append("统计失败:"+e.getMessage());
            }
            //保存日志
            quartzJobLog.setJobEndTime(new Date());
            quartzJobLog.setJobContent(saveContent(signFamilys,adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
            quartzJobLog.setJobType(isAll?"1":"0");
            quartzJobLogDao.save(quartzJobLog);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private void save_level2_3(Map<String, Long> oneAgeMap, String city, String cityName, String town, String townName, String org, String orgName, String level, String key) {
        WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
        wlyyQuotaResult.setDel("1");
        wlyyQuotaResult.setCity(city);
        wlyyQuotaResult.setCityName(cityName);
        wlyyQuotaResult.setTown(town);
        wlyyQuotaResult.setTownName(townName);
        wlyyQuotaResult.setOrgCode(org);
        wlyyQuotaResult.setOrgName(orgName);
        wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
        wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
        wlyyQuotaResult.setQuotaDate(getYesterday());
        wlyyQuotaResult.setCreateTime(new Date());
        wlyyQuotaResult.setLevel1Type(level);//市级
        wlyyQuotaResult.setLevel2Type(key);
        wlyyQuotaResult.setLevel2TypeName(Constant.getLevelAgeName(key));
        if (oneAgeMap != null && oneAgeMap.containsKey(key)) {
            wlyyQuotaResult.setResult(oneAgeMap.get(key) + "");
        } else {
            wlyyQuotaResult.setResult("0");
        }
        wlyyQuotaResultDao.save(wlyyQuotaResult);
    }
    private void compute_level2_3(Map<String, Map<String, Long>> cityAgeMap, String ageCode,String key) {
        if (cityAgeMap.containsKey(key)) {
            Map<String, Long> groupMapTemp = cityAgeMap.get(key);
            groupMapTemp.put(ageCode, (groupMapTemp.get(ageCode) == null ? 0l : groupMapTemp.get(ageCode)) + 1);
            cityAgeMap.put(key, groupMapTemp);
        } else {
            Map<String, Long> groupMapTemp = new HashMap<String, Long>();
            groupMapTemp.put(ageCode, 1L);
            cityAgeMap.put(key, groupMapTemp);
        }
    }
    /**
     * 机构维度计算指标
     */
@ -712,12 +606,12 @@ public class SignJob implements Job {
        jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='" + yesterday + "' and quato_code='" + 1 + "'");
        //新建任务日志对象
        QuartzJobLog QuartzJobLog = new QuartzJobLog();
        QuartzJobLog.setJobStartTime(new Date());
        QuartzJobLog.setJobId(wlyyJobConfig.getId());
        QuartzJobLog.setJobName(wlyyJobConfig.getJobName());
        QuartzJobLog quartzJobLog = new QuartzJobLog();
        quartzJobLog.setJobStartTime(new Date());
        quartzJobLog.setJobId(wlyyJobConfig.getId());
        quartzJobLog.setJobName(wlyyJobConfig.getJobName());
        //查找出系统全部的全科医生
        //查找出系统全部的团队
        List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
        Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
        for (AdminTeam adminTeam : adminTeams) {
@ -738,18 +632,25 @@ public class SignJob implements Job {
        //找出今天的签约信息 yesterday,now
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterday(yesterday, now);
        Map<String, Long> tjTownMap = new HashMap<String, Long>();//区级的统计map key 是区行政区划350200
        Map<String, Long> tjOrgMap = new HashMap<String, Long>();//机构的统计map key 是机构的code
        Map<String, Long> tjAdminTeamMap = new HashMap<String, Long>();//团队级的统计map 目前没有团队 先用全科医生统一  key doctorCode
        Long cityCount = 0L; //统计到市的数目
        Long townCount = 0L; //统计到所有区的数目
        Long orgCount = 0L;//统计到所有机构的数目
        Long qkCount = 0L;//统计到所有全科医生的数目
        boolean isAll=true;//是否统计失败
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        StringBuffer errorContent=new StringBuffer();
        //统计有签约的
        for (SignFamily signFamily : signFamilys) {
        //统计有已改簽的
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        //数据过滤清洗出脏数据  -----------start
        for(SignFamily signFamily:signFamilys){
            ETLModel etlModel=new ETLModel();
            String orgCode = signFamily.getHospital();
            if(StringUtils.isEmpty(orgCode)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            String orgCodeTemp="";
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                //站
@ -758,156 +659,76 @@ public class SignJob implements Job {
                //社区
                orgCodeTemp=orgCode;
            }
            //判断社区有没有值
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据异常");
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            Long adminId=signFamily.getAdminTeamId();
            if(adminId == null||adminId<=0) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
            if(adminTeam == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据异常");
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            String idCard=signFamily.getIdcard();
            if(idCard == null||(idCard.length()==18||idCard.length()==15)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
                isAll=false;
                errorCount++;
                continue;
            }
            String town =hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
                isAll=false;
                errorCount++;
                continue;
            }
            //统计市 ---------------start--------------
            Town townObj =townsMap.get(town);
            if(townObj==null) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            etlModel.setAdminTeam(adminTeam.getId()+"");
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModel.setIdcard(signFamily.getIdcard());
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            //统计区 ---------------start--------------
            String townCode = hospital.getTown();
            compute_level1(tjTownMap, townCode);
            townCount++;
            //统计机构---------------start--------------
            compute_level1(tjOrgMap, orgCodeTemp);
            orgCount++;
            //统计团队 ---------------start--------------
            String adminTeamId = signFamily.getAdminTeamId()+"";
            compute_level1(tjAdminTeamMap, adminTeamId);
            qkCount++;
            adminCount++;
        }
        //保存统计的结果
        for (Map.Entry<String, AdminTeam> entry : adminTeamMap.entrySet()) {
            AdminTeam adminTeam = adminTeamMap.get(entry.getKey());//得到全科医生
            String orgCodeTemp=getOrg(adminTeam.getOrgCode());
            Hospital hospital = hospitalsMap.get(orgCodeTemp);//得到全科医生的机构
            if(hospital == null) continue;
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=hospital.getTown();
            String townName=hospital.getTownName();
            String org=hospital.getCode();
            if(!"00".equals(hospital.getCode().substring(hospital.getCode().length()-2,hospital.getCode().length()))){
                //统计站
                org=hospital.getCode().substring(0,hospital.getCode().length()-2)+"00";
            }
            String orgName=hospital.getName();
            String doctorCode=adminTeam.getId()+"";
            String doctorName=adminTeam.getName();
            String doctorJob="";
            String level="1";
            String key=adminTeam.getId()+"";
            save_level1(tjAdminTeamMap, key, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level);
        }
        //保存机构的签约统计
        for (Map.Entry<String, Hospital> entry : hospitalsMap.entrySet()) {
            Hospital hospital = hospitalsMap.get(entry.getKey());//得到全科医生
            if(hospital == null) continue;
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=hospital.getTown();
            String townName=hospital.getTownName();
            String org=hospital.getCode();
            String orgName=hospital.getName();
            String doctorCode="";
            String doctorName="";
            String doctorJob="";
            String level="2";
            String key=hospital.getCode();
            save_level1(tjOrgMap, key, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level);
        }
        //保存区级的签约统计
        for (Map.Entry<String, Town> entry : townsMap.entrySet()) {
            Town townObj = townsMap.get(entry.getKey());//得到全科医生
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=townObj.getCode();
            String townName=townObj.getName();
            String org="";
            String orgName="";
            String doctorCode="";
            String doctorName="";
            String doctorJob="";
            String level="3";
            String key=townObj.getCode();
            save_level1(tjTownMap, key, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level);
        //数据过滤清洗出脏数据  -----------end
        try{
            //统计数据
            List<Map<String, List<ETLModel>>>  returnDatas= levelRole.elt(etlModels);
            //保存数据
            dbStorage.saveByLevel1(returnDatas,yesterday,wlyyQuota);
        }catch (Exception e){
            errorContent.append("统计失败:"+e.getMessage());
        }
        //保存市级的统计
        {
            WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
            wlyyQuotaResult.setDel("1");
            wlyyQuotaResult.setCity(Constant.city);
            wlyyQuotaResult.setCityName(Constant.cityName);
            wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
            wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
            wlyyQuotaResult.setQuotaDate(getYesterday());
            wlyyQuotaResult.setCreateTime(new Date());
            wlyyQuotaResult.setLevel1Type("4");
            //判断全科医生是否有签约量
            if (cityCount > 0) {
                wlyyQuotaResult.setResult(cityCount + "");
            } else {
                wlyyQuotaResult.setResult("0");
            }
            wlyyQuotaResultDao.save(wlyyQuotaResult);
        }
        QuartzJobLog.setJobEndTime(new Date());
        QuartzJobLog.setJobContent(saveContent(signFamilys,qkCount,orgCount,townCount,cityCount,isAll,errorContent));
        QuartzJobLog.setJobType(isAll?"1":"0");
        quartzJobLogDao.save(QuartzJobLog);
        //保存日志
        quartzJobLog.setJobEndTime(new Date());
        quartzJobLog.setJobContent(saveContent(signFamilys,adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
        quartzJobLog.setJobType(isAll?"1":"0");
        quartzJobLogDao.save(quartzJobLog);
    }
    /**
     * 统计签约的公用保存方案
     *
     */
    private void save_level1(Map<String, Long> countMap, String key, String city, String cityName, String town, String townName, String org, String orgName, String doctorCode, String doctorName, String doctorJob, String level) {
        WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
        wlyyQuotaResult.setDel("1");
        wlyyQuotaResult.setOrgCode(org);
        wlyyQuotaResult.setOrgName(orgName);
        wlyyQuotaResult.setCity(city);
        wlyyQuotaResult.setCityName(cityName);
        wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
        wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
        wlyyQuotaResult.setQuotaDate(getYesterday());
        wlyyQuotaResult.setCreateTime(new Date());
        wlyyQuotaResult.setQkdoctorJobName(doctorJob);
        wlyyQuotaResult.setQkdoctorName(doctorName);
        wlyyQuotaResult.setQkdoctorCode(doctorCode);
        wlyyQuotaResult.setTown(town);
        wlyyQuotaResult.setTownName(townName);
        wlyyQuotaResult.setLevel1Type(level);
        //判断全科医生是否有解约量
        if (countMap.containsKey(key)) {
            wlyyQuotaResult.setResult(countMap.get(key) + "");
        } else {
            wlyyQuotaResult.setResult("0");
        }
        wlyyQuotaResultDao.save(wlyyQuotaResult);
    }
    /**
     * 统计签约的公用统计方案
     * @param tjQkdoctorMap
     * @param doctorCode
     */
    private void compute_level1(Map<String, Long> tjQkdoctorMap, String doctorCode) {
        if (tjQkdoctorMap.containsKey(doctorCode)) {
            tjQkdoctorMap.put(doctorCode, tjQkdoctorMap.get(doctorCode) + 1);
        } else {
            tjQkdoctorMap.put(doctorCode, 1L);
        }
    }
    /*
    得到昨天的日期字符串  yyyy-MM-dd
     */
@ -915,28 +736,6 @@ public class SignJob implements Job {
        return yesterday;
    }
    /**
     * 根据年龄得到对应的code
     *
     * @param age
     * @return
     */
    public String getAgeCode(int age) {
        if (age < 7) {
            return Constant.level_age_1;
        } else if (age >= 7 && age < 18) {
            return Constant.level_age_2;
        } else if (age >= 18 && age < 30) {
            return Constant.level_age_3;
        } else if (age >= 30 && age < 50) {
            return Constant.level_age_4;
        } else if (age >= 50 && age < 65) {
            return Constant.level_age_5;
        } else {
            return Constant.level_age_6;
        }
    }
    public static String getDayString(Integer size) {
        Date date = new Date();//取时间
        Calendar calendar = new GregorianCalendar();
@ -956,8 +755,9 @@ public class SignJob implements Job {
        }
    }
    private String saveContent(List<SignFamily> signFamilys, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent) {
        StringBuffer string=new StringBuffer("统计"+getYesterday()+" 的待签约数据完成 ,数据库查询到待签约数目:"+signFamilys.size());
    private String saveContent(List<SignFamily> signFamilys, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent,Long errorCount) {
        StringBuffer string=new StringBuffer("统计"+getYesterday()+" 的已改簽数据完成 ,数据库查询到改签数目:"+signFamilys.size());
        string.append(",过滤的脏数据数目:"+errorCount);
        string.append(",统计到市的数据总数:"+cityCount);
        string.append(",统计到区的数据总数:"+townCount);
        string.append(",统计到机构的数据总数:"+orgCount);

+ 86 - 149
src/main/java/com/yihu/wlyy/job/UnSignJob.java

@ -7,6 +7,9 @@ import com.yihu.wlyy.entity.doctor.profile.Doctor;
import com.yihu.wlyy.entity.job.QuartzJobLog;
import com.yihu.wlyy.entity.patient.SignFamily;
import com.yihu.wlyy.entity.statistics.WlyyQuotaResult;
import com.yihu.wlyy.job.elt.base.ETLModel;
import com.yihu.wlyy.job.elt.role.LevelRole;
import com.yihu.wlyy.job.elt.storage.DBStorage;
import com.yihu.wlyy.repository.address.TownDao;
import com.yihu.wlyy.repository.doctor.DoctorAdminTeamDao;
import com.yihu.wlyy.repository.doctor.DoctorDao;
@ -27,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import java.text.SimpleDateFormat;
import java.util.*;
/**
@ -37,22 +41,22 @@ public class UnSignJob implements Job {
    private WlyyQuotaVO wlyyQuota;//指标对象
    private WlyyJobConfigVO wlyyJobConfig;//配置对象
    @Autowired
    private WlyyQuotaResultDao wlyyQuotaResultDao;//指标结果Dao
    @Autowired
    private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
    @Autowired
    private SignFamilyDao signFamilyDao;
    @Autowired
    private DoctorDao doctorDao;
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
    private TownDao townDao;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private LevelRole levelRole;
    @Autowired
    private DBStorage dbStorage;
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    String yesterday;
    String now;
    @Override
@ -104,18 +108,25 @@ public class UnSignJob implements Job {
        //找出今天的解约信息
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingUnSignYesterday(yesterday,now);
        Map<String, Long> tjTownMap = new HashMap<String, Long>();//区级的统计map key 是区行政区划350200
        Map<String, Long> tjOrgMap = new HashMap<String, Long>();//机构的统计map key 是机构的code
        Map<String, Long> tjAdminTeamMap = new HashMap<String, Long>();//团队级的统计map 目前没有团队 先用全科医生统一  key doctorCode
        Long cityCount = 0L; //统计到市的数目
        Long townCount = 0L; //统计到所有区的数目
        Long orgCount = 0L;//统计到所有机构的数目
        Long qkCount = 0L;//统计到所有全科医生的数目
        boolean isAll=true;//是否统计失败
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        StringBuffer errorContent=new StringBuffer();
        //统计有解约的
        for (SignFamily signFamily : signFamilys) {
        //统计有已改簽的
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        //数据过滤清洗出脏数据  -----------start
        for(SignFamily signFamily:signFamilys){
            ETLModel etlModel=new ETLModel();
            String orgCode = signFamily.getHospital();
            if(StringUtils.isEmpty(orgCode)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            String orgCodeTemp="";
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                //站
@ -124,161 +135,80 @@ public class UnSignJob implements Job {
                //社区
                orgCodeTemp=orgCode;
            }
            //判断社区有没有值
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据异常");
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            Long adminId=signFamily.getAdminTeamId();
            if(adminId == null||adminId<=0) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
            if(adminTeam == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据异常");
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            String idCard=signFamily.getIdcard();
            if(idCard == null||(idCard.length()==18||idCard.length()==15)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
                isAll=false;
                errorCount++;
                continue;
            }
            //统计市 ---------------start--------------
            String town =hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
                isAll=false;
                errorCount++;
                continue;
            }
            Town townObj =townsMap.get(town);
            if(townObj==null) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            etlModel.setAdminTeam(adminTeam.getId()+"");
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModel.setIdcard(signFamily.getIdcard());
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            //统计区 ---------------start--------------
            String townCode = hospital.getTown();
            compute(tjTownMap, townCode);
            townCount++;
            //统计机构---------------start--------------
            compute(tjOrgMap, orgCodeTemp);
            orgCount++;
            //统计团队 ---------------start--------------
            String adminTeamId = signFamily.getAdminTeamId()+"";
            compute(tjAdminTeamMap, adminTeamId);
            qkCount++;
            adminCount++;
        }
        //保存统计的结果
        for (Map.Entry<String, AdminTeam> entry : adminTeamMap.entrySet()) {
            AdminTeam adminTeam = adminTeamMap.get(entry.getKey());//得到全科医生
            String orgCodeTemp=getOrg(adminTeam.getOrgCode());
            Hospital hospital = hospitalsMap.get(orgCodeTemp);//得到全科医生的机构
            if(hospital == null) continue;
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=hospital.getTown();
            String townName=hospital.getTownName();
            String org=hospital.getCode();
            if(!"00".equals(hospital.getCode().substring(hospital.getCode().length()-2,hospital.getCode().length()))){
                //统计站
                org=hospital.getCode().substring(0,hospital.getCode().length()-2)+"00";
            }
            String orgName=hospital.getName();
            String doctorCode=adminTeam.getId()+"";
            String doctorName=adminTeam.getName();
            String doctorJob="";
            String level="1";
            String key=adminTeam.getId()+"";
            save(tjAdminTeamMap, key, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level);
        }
        //保存机构的解约统计
        for (Map.Entry<String, Hospital> entry : hospitalsMap.entrySet()) {
            Hospital hospital = hospitalsMap.get(entry.getKey());//得到全科医生
            if(hospital == null) continue;
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=hospital.getTown();
            String townName=hospital.getTownName();
            String org=hospital.getCode();
            String orgName=hospital.getName();
            String doctorCode="";
            String doctorName="";
            String doctorJob="";
            String level="2";
            String key=hospital.getCode();
            save(tjOrgMap, key, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level);
        }
        //保存区级的解约统计
        for (Map.Entry<String, Town> entry : townsMap.entrySet()) {
            Town townObj = townsMap.get(entry.getKey());//得到全科医生
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=townObj.getCode();
            String townName=townObj.getName();
            String org="";
            String orgName="";
            String doctorCode="";
            String doctorName="";
            String doctorJob="";
            String level="3";
            String key=townObj.getCode();
            save(tjTownMap, key, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level);
        //数据过滤清洗出脏数据  -----------end
        try{
            //统计数据
            List<Map<String, List<ETLModel>>>  returnDatas= levelRole.elt(etlModels);
            //保存数据
            dbStorage.saveByLevel1(returnDatas,yesterday,wlyyQuota);
        }catch (Exception e){
            errorContent.append("统计失败:"+e.getMessage());
        }
        //保存市级的统计
        {
            WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
            wlyyQuotaResult.setDel("1");
            wlyyQuotaResult.setCity(Constant.city);
            wlyyQuotaResult.setCityName(Constant.cityName);
            wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
            wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
            wlyyQuotaResult.setQuotaDate(getYesterday());
            wlyyQuotaResult.setCreateTime(new Date());
            wlyyQuotaResult.setLevel1Type("4");
            //判断全科医生是否有解约量
            if (cityCount > 0) {
                wlyyQuotaResult.setResult(cityCount + "");
            } else {
                wlyyQuotaResult.setResult("0");
            }
            wlyyQuotaResultDao.save(wlyyQuotaResult);
        }
        //保存日志
        quartzJobLog.setJobEndTime(new Date());
        quartzJobLog.setJobContent(saveContent(signFamilys,qkCount,orgCount,townCount,cityCount,isAll,errorContent));
        quartzJobLog.setJobContent(saveContent(signFamilys,adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
        quartzJobLog.setJobType(isAll?"1":"0");
        quartzJobLogDao.save(quartzJobLog);
    }
    private void compute(Map<String, Long> tjQkdoctorMap, String doctorCode) {
        if (tjQkdoctorMap.containsKey(doctorCode)) {
            tjQkdoctorMap.put(doctorCode, tjQkdoctorMap.get(doctorCode) + 1);
        } else {
            tjQkdoctorMap.put(doctorCode, 1L);
        }
    }
    private void save(Map<String, Long> countMap, String key, String city, String cityName, String town, String townName, String org, String orgName, String doctorCode, String doctorName, String doctorJob, String level) {
        WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
        wlyyQuotaResult.setDel("1");
        wlyyQuotaResult.setOrgCode(org);
        wlyyQuotaResult.setOrgName(orgName);
        wlyyQuotaResult.setCity(city);
        wlyyQuotaResult.setCityName(cityName);
        wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
        wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
        wlyyQuotaResult.setQuotaDate(getYesterday());
        wlyyQuotaResult.setCreateTime(new Date());
        wlyyQuotaResult.setQkdoctorJobName(doctorJob);
        wlyyQuotaResult.setQkdoctorName(doctorName);
        wlyyQuotaResult.setQkdoctorCode(doctorCode);
        wlyyQuotaResult.setTown(town);
        wlyyQuotaResult.setTownName(townName);
        wlyyQuotaResult.setLevel1Type(level);
        //判断全科医生是否有解约量
        if (countMap.containsKey(key)) {
            wlyyQuotaResult.setResult(countMap.get(key) + "");
        } else {
            wlyyQuotaResult.setResult("0");
        }
        wlyyQuotaResultDao.save(wlyyQuotaResult);
    }
    private String getOrg(String org){
        if(!"00".equals(org.substring(org.length()-2,org.length()))){
            return org.substring(0,org.length()-2)+"00";
        }else{
            return org;
        }
    }
    public String getYesterday() {
        return yesterday;
    }
    private String saveContent(List<SignFamily> signFamilys, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent) {
    private String saveContent(List<SignFamily> signFamilys, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent,Long errorCount) {
        StringBuffer string=new StringBuffer("统计"+getYesterday()+" 的解约数据完成 ,数据库查询到解约数目:"+signFamilys.size());
        string.append(",过滤的脏数据数目:"+errorCount);
        string.append(",统计到市的数据总数:"+cityCount);
        string.append(",统计到区的数据总数:"+townCount);
        string.append(",统计到机构的数据总数:"+orgCount);
@ -289,4 +219,11 @@ public class UnSignJob implements Job {
        }
        return string.toString();
    }
    public String getYesterday() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -1);
        String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
        return yesterday;
    }
}

+ 85 - 147
src/main/java/com/yihu/wlyy/job/WaitSignJob.java

@ -7,6 +7,9 @@ import com.yihu.wlyy.entity.doctor.profile.Doctor;
import com.yihu.wlyy.entity.job.QuartzJobLog;
import com.yihu.wlyy.entity.patient.SignFamily;
import com.yihu.wlyy.entity.statistics.WlyyQuotaResult;
import com.yihu.wlyy.job.elt.base.ETLModel;
import com.yihu.wlyy.job.elt.role.LevelRole;
import com.yihu.wlyy.job.elt.storage.DBStorage;
import com.yihu.wlyy.repository.address.TownDao;
import com.yihu.wlyy.repository.doctor.DoctorAdminTeamDao;
import com.yihu.wlyy.repository.doctor.DoctorDao;
@ -27,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import java.text.SimpleDateFormat;
import java.util.*;
/**
@ -37,19 +41,19 @@ public class WaitSignJob implements Job {
    private WlyyQuotaVO wlyyQuota;//指标对象
    private WlyyJobConfigVO wlyyJobConfig;//配置对象
    @Autowired
    private WlyyQuotaResultDao wlyyQuotaResultDao;//指标结果Dao
    @Autowired
    private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
    @Autowired
    private SignFamilyDao signFamilyDao;
    @Autowired
    private DoctorDao doctorDao;
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
    private TownDao townDao;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private LevelRole levelRole;
    @Autowired
    private DBStorage dbStorage;
    String yesterday;
    String now;
@ -103,18 +107,25 @@ public class WaitSignJob implements Job {
        //找出今天的待签约信息
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingWaitSignYesterday(yesterday,now);
        Map<String, Long> tjTownMap = new HashMap<String, Long>();//区级的统计map key 是区行政区划350200
        Map<String, Long> tjOrgMap = new HashMap<String, Long>();//机构的统计map key 是机构的code
        Map<String, Long> tjAdminTeamMap = new HashMap<String, Long>();//团队级的统计map 目前没有团队 先用全科医生统一  key doctorCode
        Long cityCount = 0L; //统计到市的数目
        Long townCount = 0L; //统计到所有区的数目
        Long orgCount = 0L;//统计到所有机构的数目
        Long qkCount = 0L;//统计到所有全科医生的数目
        boolean isAll=true;//是否统计失败
        Long cityCount = new Long(0L); //统计到市的数目
        Long townCount = new Long(0L); //统计到所有区的数目
        Long orgCount =new Long(0L);//统计到所有机构的数目
        Long adminCount = new Long(0L);//统计到所有团队的数目
        Long errorCount=new Long(0L);//脏数据
        Boolean isAll=true;//是否统计失败
        StringBuffer errorContent=new StringBuffer();
        //统计有待签约的
        for (SignFamily signFamily : signFamilys) {
        //统计有已改簽的
        List<ETLModel> etlModels=new ArrayList<ETLModel>();
        //数据过滤清洗出脏数据  -----------start
        for(SignFamily signFamily:signFamilys){
            ETLModel etlModel=new ETLModel();
            String orgCode = signFamily.getHospital();
            if(StringUtils.isEmpty(orgCode)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            String orgCodeTemp="";
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                //站
@ -123,160 +134,80 @@ public class WaitSignJob implements Job {
                //社区
                orgCodeTemp=orgCode;
            }
            //判断社区有没有值
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据异常");
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的hospital数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            Long adminId=signFamily.getAdminTeamId();
            if(adminId == null||adminId<=0) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据为空");
                isAll=false;
                errorCount++;
                continue;
            }
            AdminTeam adminTeam=adminTeamMap.get(signFamily.getAdminTeamId()+"");
            if(adminTeam == null) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据异常");
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的Admin_Team_Id数据不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            //统计市 ---------------start--------------
            String idCard=signFamily.getIdcard();
            if(idCard == null||(idCard.length()==18||idCard.length()==15)) {
                errorContent.append("签约code:"+signFamily.getCode()+",签约表中(wlyy_sign_family)中的idCard数据异常");
                isAll=false;
                errorCount++;
                continue;
            }
            String town =hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town为空");
                isAll=false;
                errorCount++;
                continue;
            }
            Town townObj =townsMap.get(town);
            if(townObj==null) {
                errorContent.append("签约code:"+signFamily.getCode()+",机构表的中的town不存在");
                isAll=false;
                errorCount++;
                continue;
            }
            etlModel.setAdminTeam(adminTeam.getId()+"");
            etlModel.setHospital(orgCodeTemp);
            etlModel.setTown(hospital.getTown());
            etlModel.setCity(Constant.city);
            etlModel.setIdcard(signFamily.getIdcard());
            etlModels.add(etlModel);
            //统计数目+1
            cityCount++;
            //统计区 ---------------start--------------
            String townCode = hospital.getTown();
            compute(tjTownMap, townCode);
            townCount++;
            //统计机构---------------start--------------
            compute(tjOrgMap, orgCodeTemp);
            orgCount++;
            //统计团队 ---------------start--------------
            String adminTeamId = signFamily.getAdminTeamId()+"";
            compute(tjAdminTeamMap, adminTeamId);
            qkCount++;
            adminCount++;
        }
        //保存统计的结果
        for (Map.Entry<String, AdminTeam> entry : adminTeamMap.entrySet()) {
            AdminTeam adminTeam = adminTeamMap.get(entry.getKey());//得到全科医生
            String orgCodeTemp=getOrg(adminTeam.getOrgCode());
            Hospital hospital = hospitalsMap.get(orgCodeTemp);//得到全科医生的机构
            if(hospital == null) continue;
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=hospital.getTown();
            String townName=hospital.getTownName();
            String org=hospital.getCode();
            if(!"00".equals(hospital.getCode().substring(hospital.getCode().length()-2,hospital.getCode().length()))){
                //统计站
                org=hospital.getCode().substring(0,hospital.getCode().length()-2)+"00";
            }
            String orgName=hospital.getName();
            String doctorCode=adminTeam.getId()+"";
            String doctorName=adminTeam.getName();
            String doctorJob="";
            String level="1";
            String key=adminTeam.getId()+"";
            save(tjAdminTeamMap, key, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level);
        }
        //保存机构的待签约统计
        for (Map.Entry<String, Hospital> entry : hospitalsMap.entrySet()) {
            Hospital hospital = hospitalsMap.get(entry.getKey());//得到全科医生
            if(hospital == null) continue;
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=hospital.getTown();
            String townName=hospital.getTownName();
            String org=hospital.getCode();
            String orgName=hospital.getName();
            String doctorCode="";
            String doctorName="";
            String doctorJob="";
            String level="2";
            String key=hospital.getCode();
            save(tjOrgMap, key, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level);
        }
        //保存区级的待签约统计
        for (Map.Entry<String, Town> entry : townsMap.entrySet()) {
            Town townObj = townsMap.get(entry.getKey());//得到全科医生
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=townObj.getCode();
            String townName=townObj.getName();
            String org="";
            String orgName="";
            String doctorCode="";
            String doctorName="";
            String doctorJob="";
            String level="3";
            String key=townObj.getCode();
            save(tjTownMap, key, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level);
        }
        //保存市级的统计
        {
            WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
            wlyyQuotaResult.setDel("1");
            wlyyQuotaResult.setCity(Constant.city);
            wlyyQuotaResult.setCityName(Constant.cityName);
            wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
            wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
            wlyyQuotaResult.setQuotaDate(getYesterday());
            wlyyQuotaResult.setCreateTime(new Date());
            wlyyQuotaResult.setLevel1Type("4");
            //判断全科医生是否有待签约量
            if (cityCount > 0) {
                wlyyQuotaResult.setResult(cityCount + "");
            } else {
                wlyyQuotaResult.setResult("0");
            }
            wlyyQuotaResultDao.save(wlyyQuotaResult);
        //数据过滤清洗出脏数据  -----------end
        try{
            //统计数据
            List<Map<String, List<ETLModel>>>  returnDatas= levelRole.elt(etlModels);
            //保存数据
            dbStorage.saveByLevel1(returnDatas,yesterday,wlyyQuota);
        }catch (Exception e){
            errorContent.append("统计失败:"+e.getMessage());
        }
        //保存日志
        quartzJobLog.setJobEndTime(new Date());
        quartzJobLog.setJobContent(saveContent(signFamilys,qkCount,orgCount,townCount,cityCount,isAll,errorContent));
        quartzJobLog.setJobContent(saveContent(signFamilys,adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
        quartzJobLog.setJobType(isAll?"1":"0");
        quartzJobLogDao.save(quartzJobLog);
    }
    private void compute(Map<String, Long> tjQkdoctorMap, String doctorCode) {
        if (tjQkdoctorMap.containsKey(doctorCode)) {
            tjQkdoctorMap.put(doctorCode, tjQkdoctorMap.get(doctorCode) + 1);
        } else {
            tjQkdoctorMap.put(doctorCode, 1L);
        }
    }
    private void save(Map<String, Long> countMap, String key, String city, String cityName, String town, String townName, String org, String orgName, String doctorCode, String doctorName, String doctorJob, String level) {
        WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
        wlyyQuotaResult.setDel("1");
        wlyyQuotaResult.setOrgCode(org);
        wlyyQuotaResult.setOrgName(orgName);
        wlyyQuotaResult.setCity(city);
        wlyyQuotaResult.setCityName(cityName);
        wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
        wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
        wlyyQuotaResult.setQuotaDate(getYesterday());
        wlyyQuotaResult.setCreateTime(new Date());
        wlyyQuotaResult.setQkdoctorJobName(doctorJob);
        wlyyQuotaResult.setQkdoctorName(doctorName);
        wlyyQuotaResult.setQkdoctorCode(doctorCode);
        wlyyQuotaResult.setTown(town);
        wlyyQuotaResult.setTownName(townName);
        wlyyQuotaResult.setLevel1Type(level);
        //判断全科医生是否有待签约量
        if (countMap.containsKey(key)) {
            wlyyQuotaResult.setResult(countMap.get(key) + "");
        } else {
            wlyyQuotaResult.setResult("0");
        }
        wlyyQuotaResultDao.save(wlyyQuotaResult);
    }
    private String getOrg(String org){
        if(!"00".equals(org.substring(org.length()-2,org.length()))){
            return org.substring(0,org.length()-2)+"00";
        }else{
            return org;
        }
    }
    public String getYesterday() {
        return yesterday;
    }
    private String saveContent(List<SignFamily> signFamilys, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent) {
    private String saveContent(List<SignFamily> signFamilys, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent,Long errorCount) {
        StringBuffer string=new StringBuffer("统计"+getYesterday()+" 的待签约数据完成 ,数据库查询到待签约数目:"+signFamilys.size());
        string.append(",过滤的脏数据数目:"+errorCount);
        string.append(",统计到市的数据总数:"+cityCount);
        string.append(",统计到区的数据总数:"+townCount);
        string.append(",统计到机构的数据总数:"+orgCount);
@ -287,4 +218,11 @@ public class WaitSignJob implements Job {
        }
        return string.toString();
    }
    public String getYesterday() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -1);
        String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
        return yesterday;
    }
}

+ 62 - 0
src/main/java/com/yihu/wlyy/job/elt/base/ETLModel.java

@ -0,0 +1,62 @@
package com.yihu.wlyy.job.elt.base;
/**
 * Created by Administrator on 2016.10.09.
 */
public class ETLModel {
    private String adminTeam;//团队的code
    private String hospital;//机构code
    private String town;//区代码 350206
    private String city;//城市代码 350200
    private String idcard;//患者身份证
    private String patientGroup;//患者分组
    public String getAdminTeam() {
        return adminTeam;
    }
    public void setAdminTeam(String adminTeam) {
        this.adminTeam = adminTeam;
    }
    public String getHospital() {
        return hospital;
    }
    public void setHospital(String hospital) {
        this.hospital = hospital;
    }
    public String getIdcard() {
        return idcard;
    }
    public void setIdcard(String idcard) {
        this.idcard = idcard;
    }
    public String getTown() {
        return town;
    }
    public void setTown(String town) {
        this.town = town;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getPatientGroup() {
        return patientGroup;
    }
    public void setPatientGroup(String patientGroup) {
        this.patientGroup = patientGroup;
    }
}

+ 78 - 0
src/main/java/com/yihu/wlyy/job/elt/role/LevelRole.java

@ -0,0 +1,78 @@
package com.yihu.wlyy.job.elt.role;
import com.yihu.wlyy.entity.address.Town;
import com.yihu.wlyy.entity.doctor.team.admin.AdminTeam;
import com.yihu.wlyy.entity.organization.Hospital;
import com.yihu.wlyy.job.Constant;
import com.yihu.wlyy.job.elt.base.ETLModel;
import com.yihu.wlyy.repository.address.TownDao;
import com.yihu.wlyy.repository.consult.ConsultTeamDao;
import com.yihu.wlyy.repository.doctor.DoctorAdminTeamDao;
import com.yihu.wlyy.repository.organization.HospitalDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by Administrator on 2016.10.09.
 * 机构等级分组
 */
@Component
@Transactional
public class LevelRole {
    /**
     * 返回的Listmap中 list第一個是 团队 第二个是机构 第三个是区  第四个市
     * @param models
     * @return
     * @throws Exception
     */
    public List<Map<String, List<ETLModel>>> elt(List<ETLModel> models) throws  Exception{
        List<Map<String, List<ETLModel>>> returnMapsList=new ArrayList<Map<String, List<ETLModel>>>();
        Map<String, List<ETLModel>> tjCityMap = new HashMap<String, List<ETLModel>>();//市级的统计map key 是区行政区划350200
        Map<String, List<ETLModel>> tjTownMap = new HashMap<String, List<ETLModel>>();//区级的统计map key 是区行政区划350206
        Map<String, List<ETLModel>> tjOrgMap = new HashMap<String, List<ETLModel>>();//机构的统计map key 是机构的code
        Map<String, List<ETLModel>> tjAdminTeamMap = new HashMap<String, List<ETLModel>>();//团队级的统计map 一  key 团队id
        for(ETLModel etlModel:models){
            //统计市市
            compute(tjCityMap, etlModel.getCity(),etlModel);
            //统计市区
            compute(tjTownMap, etlModel.getTown(),etlModel);
            //统计市机构
            compute(tjOrgMap, etlModel.getHospital(),etlModel);
            //统计团队
            compute(tjAdminTeamMap, etlModel.getAdminTeam(),etlModel);
        }
        returnMapsList.add(0,tjAdminTeamMap);
        returnMapsList.add(1,tjOrgMap);
        returnMapsList.add(2,tjTownMap);
        returnMapsList.add(3,tjCityMap);
        return returnMapsList;
    }
    /**
     * 统计算法
     * @param eltMap
     * @param key
     * @param etlModel
     */
    private void compute(Map<String, List<ETLModel>> eltMap,String key,ETLModel etlModel) {
        if (eltMap.containsKey(key)) {
            List<ETLModel> etlModels=eltMap.get(key);
            etlModels.add(etlModel);
        } else {
            List<ETLModel> etlModels=new ArrayList<ETLModel>();
            etlModels.add(etlModel);
            eltMap.put(key,etlModels);
        }
    }
}

+ 88 - 0
src/main/java/com/yihu/wlyy/job/elt/role/PatientAgeRole.java

@ -0,0 +1,88 @@
package com.yihu.wlyy.job.elt.role;
import com.yihu.wlyy.job.Constant;
import com.yihu.wlyy.job.elt.base.ETLModel;
import com.yihu.wlyy.util.IdCardUtil;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by Administrator on 2016.10.09.
 * 患者性别
 */
@Component
@Transactional
public class PatientAgeRole {
    public List<Map<String, Map<String, List<ETLModel>>>> elt(List<Map<String, List<ETLModel>>> data) throws  Exception{
        List<Map<String, Map<String, List<ETLModel>>>> returnMapsList=new ArrayList<Map<String, Map<String, List<ETLModel>>>>();
        Map<String,Map<String, List<ETLModel>>> tjCityMap = new HashMap<String,Map<String, List<ETLModel>>>();//市级的统计map key 是区行政区划350200
        Map<String,Map<String, List<ETLModel>>> tjTownMap = new HashMap<String,Map<String, List<ETLModel>>>();//区级的统计map key 是区行政区划350206
        Map<String,Map<String, List<ETLModel>>> tjOrgMap = new HashMap<String,Map<String, List<ETLModel>>>();//机构的统计map key 是机构的code
        Map<String,Map<String, List<ETLModel>>> tjAdminTeamMap = new HashMap<String,Map<String, List<ETLModel>>>();//团队级的统计map 一  key 团队id
        //统计市
       compute(tjCityMap,data.get(3));
        //统计区
       compute(tjTownMap,data.get(2));
       //统计机构
       compute(tjOrgMap,data.get(1));
       //统计团队
       compute(tjAdminTeamMap,data.get(0));
        returnMapsList.add(0,tjAdminTeamMap);
        returnMapsList.add(1,tjOrgMap);
        returnMapsList.add(2,tjTownMap);
        returnMapsList.add(3,tjCityMap);
        return returnMapsList;
    }
    /**
     * 统计算法
     * @param tjMap
     * @param eltDateMap
     */
    private void compute(Map<String, Map<String, List<ETLModel>>> tjMap, Map<String, List<ETLModel>> eltDateMap) throws Exception{
        //遍历数据Map
        for(Map.Entry<String,List<ETLModel>> oneData:eltDateMap.entrySet()){
            List<ETLModel> datas=oneData.getValue();//得到数据列表 全部区或者市或者机构或者区的数据
            Map<String, List<ETLModel>> childrens=new HashMap<String, List<ETLModel>>();//返回的map
            for(ETLModel eltModel:datas){
                Integer age= IdCardUtil.getAgeForIdcard(eltModel.getIdcard());//得到年龄
                String key=getAgeCode(age);//根据年龄得到key
                List<ETLModel> etlModels= childrens.get(key);
                //如果list不存在 新建一个
                if(etlModels==null){
                    etlModels=new ArrayList<>();
                }
                etlModels.add(eltModel);
                childrens.put(key,etlModels);
            }
            tjMap.put(oneData.getKey(),childrens);
        }
    }
    private String getAgeCode(int age) {
        if (age < 7) {
            return Constant.level_age_1;
        } else if (age >= 7 && age < 18) {
            return Constant.level_age_2;
        } else if (age >= 18 && age < 30) {
            return Constant.level_age_3;
        } else if (age >= 30 && age < 50) {
            return Constant.level_age_4;
        } else if (age >= 50 && age < 65) {
            return Constant.level_age_5;
        } else {
            return Constant.level_age_6;
        }
    }
}

+ 74 - 0
src/main/java/com/yihu/wlyy/job/elt/role/PatientGroupRole.java

@ -0,0 +1,74 @@
package com.yihu.wlyy.job.elt.role;
import com.yihu.wlyy.job.Constant;
import com.yihu.wlyy.job.elt.base.ETLModel;
import com.yihu.wlyy.util.IdCardUtil;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by Administrator on 2016.10.09.
 * 患者分组
 */
@Component
@Transactional
public class PatientGroupRole {
    public List<Map<String, Map<String, List<ETLModel>>>> elt(List<Map<String, List<ETLModel>>> data) throws  Exception{
        List<Map<String, Map<String, List<ETLModel>>>> returnMapsList=new ArrayList<Map<String, Map<String, List<ETLModel>>>>();
        Map<String,Map<String, List<ETLModel>>> tjCityMap = new HashMap<String,Map<String, List<ETLModel>>>();//市级的统计map key 是区行政区划350200
        Map<String,Map<String, List<ETLModel>>> tjTownMap = new HashMap<String,Map<String, List<ETLModel>>>();//区级的统计map key 是区行政区划350206
        Map<String,Map<String, List<ETLModel>>> tjOrgMap = new HashMap<String,Map<String, List<ETLModel>>>();//机构的统计map key 是机构的code
        Map<String,Map<String, List<ETLModel>>> tjAdminTeamMap = new HashMap<String,Map<String, List<ETLModel>>>();//团队级的统计map 一  key 团队id
        //统计市
        compute(tjCityMap,data.get(3));
        //统计区
        compute(tjTownMap,data.get(2));
        //统计机构
        compute(tjOrgMap,data.get(1));
        //统计团队
        compute(tjAdminTeamMap,data.get(0));
        returnMapsList.add(0,tjAdminTeamMap);
        returnMapsList.add(1,tjOrgMap);
        returnMapsList.add(2,tjTownMap);
        returnMapsList.add(3,tjCityMap);
        return returnMapsList;
    }
    /**
     * 统计算法
     * @param tjMap
     * @param eltDateMap
     */
    private void compute(Map<String, Map<String, List<ETLModel>>> tjMap, Map<String, List<ETLModel>> eltDateMap) throws Exception{
        //遍历数据Map
        for(Map.Entry<String,List<ETLModel>> oneData:eltDateMap.entrySet()){
            List<ETLModel> datas=oneData.getValue();//得到数据列表 全部区或者市或者机构或者区的数据
            Map<String, List<ETLModel>> childrens=new HashMap<String, List<ETLModel>>();//返回的map
            for(ETLModel eltModel:datas){
                String key =eltModel.getPatientGroup();//患者的分组
                List<ETLModel> etlModels= childrens.get(key);
                //如果list不存在 新建一个
                if(etlModels==null){
                    etlModels=new ArrayList<>();
                }
                etlModels.add(eltModel);
                childrens.put(key,etlModels);
                //如果是有疾病
                if("2".equals(key)){
                }
            }
            tjMap.put(oneData.getKey(),childrens);
        }
    }
}

+ 70 - 0
src/main/java/com/yihu/wlyy/job/elt/role/PatientSexRole.java

@ -0,0 +1,70 @@
package com.yihu.wlyy.job.elt.role;
import com.yihu.wlyy.job.Constant;
import com.yihu.wlyy.job.elt.base.ETLModel;
import com.yihu.wlyy.util.IdCardUtil;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by Administrator on 2016.10.09.
 * 患者性别分组
 */
@Component
@Transactional
public class PatientSexRole {
    public List<Map<String, Map<String, List<ETLModel>>>> elt(List<Map<String, List<ETLModel>>> data) throws  Exception{
        List<Map<String, Map<String, List<ETLModel>>>> returnMapsList=new ArrayList<Map<String, Map<String, List<ETLModel>>>>();
        Map<String,Map<String, List<ETLModel>>> tjCityMap = new HashMap<String,Map<String, List<ETLModel>>>();//市级的统计map key 是区行政区划350200
        Map<String,Map<String, List<ETLModel>>> tjTownMap = new HashMap<String,Map<String, List<ETLModel>>>();//区级的统计map key 是区行政区划350206
        Map<String,Map<String, List<ETLModel>>> tjOrgMap = new HashMap<String,Map<String, List<ETLModel>>>();//机构的统计map key 是机构的code
        Map<String,Map<String, List<ETLModel>>> tjAdminTeamMap = new HashMap<String,Map<String, List<ETLModel>>>();//团队级的统计map 一  key 团队id
        //统计市
        compute(tjCityMap,data.get(3));
        //统计区
        compute(tjTownMap,data.get(2));
        //统计机构
        compute(tjOrgMap,data.get(1));
        //统计团队
        compute(tjAdminTeamMap,data.get(0));
        returnMapsList.add(0,tjAdminTeamMap);
        returnMapsList.add(1,tjOrgMap);
        returnMapsList.add(2,tjTownMap);
        returnMapsList.add(3,tjCityMap);
        return returnMapsList;
    }
    /**
     * 统计算法
     * @param tjMap
     * @param eltDateMap
     */
    private void compute(Map<String, Map<String, List<ETLModel>>> tjMap, Map<String, List<ETLModel>> eltDateMap) throws Exception{
        //遍历数据Map
        for(Map.Entry<String,List<ETLModel>> oneData:eltDateMap.entrySet()){
            List<ETLModel> datas=oneData.getValue();//得到数据列表 全部区或者市或者机构或者区的数据
            Map<String, List<ETLModel>> childrens=new HashMap<String, List<ETLModel>>();//返回的map
            for(ETLModel eltModel:datas){
                String sexKey= IdCardUtil.getSexForIdcard(eltModel.getIdcard());//得到年龄
                List<ETLModel> etlModels= childrens.get(sexKey);
                //如果list不存在 新建一个
                if(etlModels==null){
                    etlModels=new ArrayList<>();
                }
                etlModels.add(eltModel);
                childrens.put(sexKey,etlModels);
            }
            tjMap.put(oneData.getKey(),childrens);
        }
    }
}

+ 397 - 0
src/main/java/com/yihu/wlyy/job/elt/storage/DBStorage.java

@ -0,0 +1,397 @@
package com.yihu.wlyy.job.elt.storage;
import com.yihu.wlyy.entity.address.City;
import com.yihu.wlyy.entity.address.Town;
import com.yihu.wlyy.entity.doctor.team.admin.AdminTeam;
import com.yihu.wlyy.entity.organization.Hospital;
import com.yihu.wlyy.entity.statistics.WlyyQuotaResult;
import com.yihu.wlyy.job.Constant;
import com.yihu.wlyy.job.elt.base.ETLModel;
import com.yihu.wlyy.repository.address.TownDao;
import com.yihu.wlyy.repository.doctor.DoctorAdminTeamDao;
import com.yihu.wlyy.repository.doctor.DoctorPatientGroupInfoDao;
import com.yihu.wlyy.repository.job.QuartzJobLogDao;
import com.yihu.wlyy.repository.organization.HospitalDao;
import com.yihu.wlyy.repository.statistics.WlyyQuotaResultDao;
import com.yihu.wlyy.web.quota.WlyyJobConfigVO;
import com.yihu.wlyy.web.quota.WlyyQuotaVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by Administrator on 2016.10.09.
 * 统计数据数据库存储器
 */
@Component
@Transactional
public class DBStorage   {
    private WlyyQuotaVO wlyyQuota;//指标对象
    private Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
    private Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
    private Map<String, Town> townsMap = new HashMap<String, Town>();
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
    private TownDao townDao;
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    @Autowired
    private WlyyQuotaResultDao wlyyQuotaResultDao;//指标结果Dao
    /**
     * 保存一级维度的数据
     * @param data
     * @param date
     * @param wlyyQuota
     * @throws Exception
     */
    public void saveByLevel1(List<Map<String, List<ETLModel>>> data,String date,WlyyQuotaVO wlyyQuota) throws Exception {
        this.wlyyQuota=wlyyQuota;
        List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
        for (AdminTeam adminTeam : adminTeams) {
            adminTeamMap.put(adminTeam.getId()+"", adminTeam);
        }
        //查找出系统全部的机构
        List<Hospital> hospitals = hospitalDao.findHospitalzxFWZ();
        for (Hospital hospital : hospitals) {
            hospitalsMap.put(hospital.getCode(), hospital);
        }
        //查找出厦门市全部的区
        List<Town> towns = townDao.findByCityCode(Constant.city);
        for (Town town : towns) {
            townsMap.put(town.getCode(), town);
        }
        //全部的市
        Map<String, City> cityMap = new HashMap<String, City>();
        City city=new City();
        city.setCode(Constant.city);
        city.setName(Constant.cityName);
        cityMap.put(Constant.city,city);
        //保存团队
        saveAdminTeamDataLevel1(data.get(0),date,adminTeamMap);
        //保存机构
        saveHospitalTeamDataLevel1(data.get(1),date,hospitalsMap);
        //保存区
        saveTownTeamDataLevel1(data.get(2),date,townsMap);
        //保存市
        saveCityTeamDataLevel1(data.get(3),date,cityMap);
    }
    /**
     * 保存二级维度
     * @param data
     * @param day
     * @param wlyyQuota
     * @param foreachNum 标识二级维度循环的次数  例如 年龄就传6  性别就传3
     * @param type 1 性别 2 年龄 3 用户分组
     */
    public void saveByLevel2(List<Map<String, Map<String, List<ETLModel>>>> data, String day, WlyyQuotaVO wlyyQuota,Integer foreachNum,Integer type) {
        this.wlyyQuota=wlyyQuota;
        List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
        for (AdminTeam adminTeam : adminTeams) {
            adminTeamMap.put(adminTeam.getId()+"", adminTeam);
        }
        //查找出系统全部的机构
        List<Hospital> hospitals = hospitalDao.findHospitalzxFWZ();
        for (Hospital hospital : hospitals) {
            hospitalsMap.put(hospital.getCode(), hospital);
        }
        //查找出厦门市全部的区
        List<Town> towns = townDao.findByCityCode(Constant.city);
        for (Town town : towns) {
            townsMap.put(town.getCode(), town);
        }
        //全部的市
        City city=new City();
        city.setCode(Constant.city);
        city.setName(Constant.cityName);
        Map<String, City> cityMap = new HashMap<String, City>();
        cityMap.put(Constant.city,city);
        //保存团队
        saveAdminTeamDataLevel2(data.get(0),day,adminTeamMap,foreachNum,type);
        //保存机构
        saveHospitalTeamDataLevel2(data.get(1),day,hospitalsMap,foreachNum,type);
        //保存区
        saveTownTeamDataLevel2(data.get(2),day,townsMap,foreachNum,type);
        //保存市
        saveCityTeamDataLevel2(data.get(3),day,cityMap,foreachNum,type);
    }
    private void saveCityTeamDataLevel2(Map<String, Map<String, List<ETLModel>>> etlModelMap, String day, Map<String, City> citysMap ,Integer foreachNum,Integer type) {
         for(Map.Entry<String,City> oneCity:citysMap.entrySet()){
             Map<String, List<ETLModel>> oneELTMap= etlModelMap.get(oneCity.getKey());
             for(int i=1;i<=foreachNum;i++){
                 List<ETLModel> etlModel= oneELTMap.get(i+"");
                 int num=0;
                 if(etlModel!=null&&etlModel.size()>0){
                     num=etlModel.size();
                 }
                 City cityObj=oneCity.getValue();
                 String city=cityObj.getCode();
                 String cityName=cityObj.getName();
                 String town="";
                 String townName="";
                 String org="";
                 String orgName="";
                 String doctorCode="";
                 String doctorName="";
                 String doctorJob="";
                 String level="4";
                 String level2=i+"";
                 String level2Name=getLevel2Name(level2,type);
                 save(num, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level,level2,level2Name,null,null,day);
             }
         }
    }
    private void saveTownTeamDataLevel2(Map<String, Map<String, List<ETLModel>>> etlModelMap, String day, Map<String, Town> townsMap ,Integer foreachNum,Integer type) {
        for(Map.Entry<String,Town> oneTown:townsMap.entrySet()){
            Map<String, List<ETLModel>> oneELTMap= etlModelMap.get(oneTown.getKey());
            for(int i=1;i<=foreachNum;i++){
                List<ETLModel> etlModel= oneELTMap.get(i+"");
                int num=0;
                if(etlModel!=null&&etlModel.size()>0){
                    num=etlModel.size();
                }
                Town townObj=oneTown.getValue();
                String city=Constant.city;
                String cityName=Constant.cityName;
                String town=townObj.getCode();
                String townName=townObj.getName();
                String org="";
                String orgName="";
                String doctorCode="";
                String doctorName="";
                String doctorJob="";
                String level="3";
                String level2=i+"";
                String level2Name=getLevel2Name(level2,type);
                save(num, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level,level2,level2Name,null,null,day);
            }
        }
    }
    private void saveHospitalTeamDataLevel2(Map<String, Map<String, List<ETLModel>>> etlModelMap, String day, Map<String, Hospital> hospitalsMap,Integer foreachNum,Integer type) {
        for(Map.Entry<String,Hospital> oneHospital:hospitalsMap.entrySet()){
            Map<String, List<ETLModel>> oneELTMap= etlModelMap.get(oneHospital.getKey());
            for(int i=1;i<=foreachNum;i++){
                List<ETLModel> etlModel= oneELTMap.get(i+"");
                int num=0;
                if(etlModel!=null&&etlModel.size()>0){
                    num=etlModel.size();
                }
                Hospital hospital = oneHospital.getValue();//得到全科医生的机构
                String city=Constant.city;
                String cityName=Constant.cityName;
                String town=hospital.getTown();
                String townName=hospital.getTownName();
                String org=getOrg(hospital.getCode());
                String orgName=hospital.getName();
                String doctorCode="";
                String doctorName="";
                String doctorJob="";
                String level="2";
                String level2=i+"";
                String level2Name=getLevel2Name(level2,type);
                save(num, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level,level2,level2Name,null,null,day);
            }
        }
    }
    private void saveAdminTeamDataLevel2(Map<String, Map<String, List<ETLModel>>> etlModelMap, String day, Map<String, AdminTeam> adminTeamMap,Integer foreachNum,Integer type) {
        for(Map.Entry<String,AdminTeam> adminTeam:adminTeamMap.entrySet()){
            Map<String, List<ETLModel>> oneELTMap= etlModelMap.get(adminTeam.getKey());
            for(int i=1;i<=foreachNum;i++){
                List<ETLModel> etlModel= oneELTMap.get(i+"");
                int num=0;
                if(etlModel!=null&&etlModel.size()>0){
                    num=etlModel.size();
                }
                AdminTeam adminTeamObj = adminTeamMap.get(adminTeam.getKey());//团队
                String orgCodeTemp=getOrg(adminTeamObj.getOrgCode());
                Hospital hospital = hospitalsMap.get(orgCodeTemp);
                String city=Constant.city;
                String cityName=Constant.cityName;
                String town=hospital.getTown();
                String townName=hospital.getTownName();
                String org=hospital.getCode();
                String orgName=hospital.getName();
                String doctorCode=adminTeamObj.getId()+"";
                String doctorName=adminTeamObj.getName();
                String doctorJob="";
                String level="1";
                String level2=i+"";
                String level2Name=getLevel2Name(level2,type);
                save(num, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level,level2,level2Name,null,null,day);
            }
        }
    }
    private void saveAdminTeamDataLevel1(Map<String, List<ETLModel>> mapData,String date,Map<String, AdminTeam> adminTeamMap) {
        for(Map.Entry<String, AdminTeam> entry:adminTeamMap.entrySet()){
            List<ETLModel> etlModel= mapData.get(entry.getKey());
            int num=0;
            if(etlModel!=null&&etlModel.size()>0){
                num=etlModel.size();
            }
            AdminTeam adminTeam = adminTeamMap.get(entry.getKey());//得到全科医生
            String orgCodeTemp=getOrg(adminTeam.getOrgCode());
            Hospital hospital = hospitalsMap.get(orgCodeTemp);//得到全科医生的机构
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=hospital.getTown();
            String townName=hospital.getTownName();
            String org=getOrg(hospital.getCode());
            String orgName=hospital.getName();
            String doctorCode=adminTeam.getId()+"";
            String doctorName=adminTeam.getName();
            String doctorJob="";
            String level="1";
            save(num, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level,null,null,null,null,date);
        }
    }
    private void saveHospitalTeamDataLevel1(Map<String, List<ETLModel>> mapData, String date,  Map<String, Hospital> hospitalsMap ) {
        for(Map.Entry<String, Hospital> entry:hospitalsMap.entrySet()){
            List<ETLModel> etlModel= mapData.get(entry.getKey());
            int num=0;
            if(etlModel!=null&&etlModel.size()>0){
                num=etlModel.size();
            }
            Hospital hospital = entry.getValue();//得到全科医生的机构
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=hospital.getTown();
            String townName=hospital.getTownName();
            String org=getOrg(hospital.getCode());
            String orgName=hospital.getName();
            String doctorCode="";
            String doctorName="";
            String doctorJob="";
            String level="2";
            save(num, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level,null,null,null,null,date);
        }
    }
    private void saveTownTeamDataLevel1(Map<String, List<ETLModel>> mapData, String date,  Map<String, Town> townsMap) {
        for(Map.Entry<String, Town> entry:townsMap.entrySet()){
            List<ETLModel> etlModel= mapData.get(entry.getKey());
            int num=0;
            if(etlModel!=null&&etlModel.size()>0){
                num=etlModel.size();
            }
            Town townObj=entry.getValue();
            String city=Constant.city;
            String cityName=Constant.cityName;
            String town=townObj.getCode();
            String townName=townObj.getName();
            String org="";
            String orgName="";
            String doctorCode="";
            String doctorName="";
            String doctorJob="";
            String level="3";
            save(num, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level,null,null,null,null,date);
        }
    }
    private void saveCityTeamDataLevel1(Map<String, List<ETLModel>> mapData, String date, Map<String, City> cityMap) {
        for(Map.Entry<String, City> entry:cityMap.entrySet()){
            List<ETLModel> etlModel= mapData.get(entry.getKey());
            int num=0;
            if(etlModel!=null&&etlModel.size()>0){
                num=etlModel.size();
            }
            City cityObj=entry.getValue();
            String city=cityObj.getCode();
            String cityName=cityObj.getName();
            String town="";
            String townName="";
            String org="";
            String orgName="";
            String doctorCode="";
            String doctorName="";
            String doctorJob="";
            String level="4";
            save(num, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level,null,null,null,null,date);
        }
    }
    private String getOrg(String org){
        if(!"00".equals(org.substring(org.length()-2,org.length()))){
            return org.substring(0,org.length()-2)+"00";
        }else{
            return org;
        }
    }
    /**
     * 保存方案
     * @param city
     * @param cityName
     * @param town
     * @param townName
     * @param org
     * @param orgName
     * @param doctorCode
     * @param doctorName
     * @param doctorJob
     * @param level1
     */
    private void save(int num,  String city, String cityName, String town, String townName, String org, String orgName, String doctorCode, String doctorName, String doctorJob, String level1, String level2, String level2Name,String level3, String level3Name,String date) {
        WlyyQuotaResult wlyyQuotaResult = new WlyyQuotaResult();
        wlyyQuotaResult.setDel("1");
        wlyyQuotaResult.setOrgCode(org);
        wlyyQuotaResult.setOrgName(orgName);
        wlyyQuotaResult.setCity(city);
        wlyyQuotaResult.setCityName(cityName);
        wlyyQuotaResult.setQuatoCode(wlyyQuota.getId());
        wlyyQuotaResult.setQuatoName(wlyyQuota.getName());
        wlyyQuotaResult.setQuotaDate(date);
        wlyyQuotaResult.setCreateTime(new Date());
        wlyyQuotaResult.setQkdoctorJobName(doctorJob);
        wlyyQuotaResult.setQkdoctorName(doctorName);
        wlyyQuotaResult.setQkdoctorCode(doctorCode);
        wlyyQuotaResult.setTown(town);
        wlyyQuotaResult.setTownName(townName);
        wlyyQuotaResult.setLevel1Type(level1);
        wlyyQuotaResult.setLevel2Type(level2);
        wlyyQuotaResult.setLevel2TypeName(level2Name);
        wlyyQuotaResult.setLevel3Type(level3);
        wlyyQuotaResult.setLevel3TypeName(level3Name);
        //判断全科医生是否有改签量
        wlyyQuotaResult.setResult(num+"");
        wlyyQuotaResultDao.save(wlyyQuotaResult);
    }
    private String getLevel2Name(String i, Integer type) {
        switch (type){
            case  1:{
                //性别
                return Constant.getLevelSexName(i);
            }
            case  2:{
                //年龄
                return Constant.getLevelAgeName(i);
            }
            case  3:{
                //用户分组
                return Constant.getLevelGroupName(i);
            }
            default:{
                return "";
            }
        }
    }
}

+ 300 - 0
src/main/java/com/yihu/wlyy/job/elt/storage/RedisStorage.java

@ -0,0 +1,300 @@
package com.yihu.wlyy.job.elt.storage;
import com.yihu.wlyy.entity.address.City;
import com.yihu.wlyy.entity.address.Town;
import com.yihu.wlyy.entity.doctor.team.admin.AdminTeam;
import com.yihu.wlyy.entity.organization.Hospital;
import com.yihu.wlyy.job.Constant;
import com.yihu.wlyy.job.elt.base.ETLModel;
import com.yihu.wlyy.repository.address.TownDao;
import com.yihu.wlyy.repository.doctor.DoctorAdminTeamDao;
import com.yihu.wlyy.repository.organization.HospitalDao;
import com.yihu.wlyy.repository.statistics.WlyyQuotaResultDao;
import com.yihu.wlyy.util.DateUtil;
import com.yihu.wlyy.web.quota.WlyyQuotaVO;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import springfox.documentation.spring.web.json.Json;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by Administrator on 2016.10.09.
 * 统计数据数据库存储器
 */
@Component
@Transactional
public class RedisStorage {
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
    private TownDao townDao;
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    /**
     * 保存一级维度的数据
     * @param data
     * @param wlyyQuotaId
     * @throws Exception
     */
    public void saveByLevel1(List<Map<String, List<ETLModel>>> data,String wlyyQuotaId) throws Exception {
        List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
        Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
        for (AdminTeam adminTeam : adminTeams) {
            adminTeamMap.put(adminTeam.getId()+"", adminTeam);
        }
        //查找出系统全部的机构
        List<Hospital> hospitals = hospitalDao.findHospitalzxFWZ();
         Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
        for (Hospital hospital : hospitals) {
            hospitalsMap.put(hospital.getCode(), hospital);
        }
        //查找出厦门市全部的区
        List<Town> towns = townDao.findByCityCode(Constant.city);
        Map<String, Town> townsMap = new HashMap<String, Town>();
        for (Town town : towns) {
            townsMap.put(town.getCode(), town);
        }
        //全部的市
        Map<String, City> cityMap = new HashMap<String, City>();
        City city=new City();
        city.setCode(Constant.city);
        city.setName(Constant.cityName);
        cityMap.put(Constant.city,city);
        
        Map<String, List<ETLModel>> adminTeam=data.get(0);//团队的数据
        Map<String, List<ETLModel>> orgTeam=data.get(1);//机构的数据
        Map<String, List<ETLModel>> townTeam=data.get(2);//区的数据
        Map<String, List<ETLModel>> cityTeam=data.get(3);//市的数据
        //保存市
        saveLevel1City(wlyyQuotaId, cityMap, cityTeam);
        //保存区
        saveLevel1Town(wlyyQuotaId, townsMap, townTeam);
        //保存机构
        saveLevel1Org(wlyyQuotaId, hospitalsMap, orgTeam);
        //保存全科团队
        saveLevel1Team(wlyyQuotaId, adminTeamMap, adminTeam);
    }
    /**
     * 保存二级维度的数据
     * @param data
     * @param wlyyQuotaId
     * @param foreachNum 标识二级维度循环的次数  例如 年龄就传6  性别就传3
     * @param type 1 性别 2 年龄 3 用户分组
     */
    public void saveByLevel2(List<Map<String, Map<String, List<ETLModel>>>> data, String wlyyQuotaId,Integer foreachNum,Integer type) throws Exception {
        List<AdminTeam> adminTeams=doctorAdminTeamDao.findAllTeam();
        Map<String, AdminTeam> adminTeamMap = new HashMap<String, AdminTeam>();
        for (AdminTeam adminTeam : adminTeams) {
            adminTeamMap.put(adminTeam.getId()+"", adminTeam);
        }
        //查找出系统全部的机构
        List<Hospital> hospitals = hospitalDao.findHospitalzxFWZ();
        Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
        for (Hospital hospital : hospitals) {
            hospitalsMap.put(hospital.getCode(), hospital);
        }
        //查找出厦门市全部的区
        List<Town> towns = townDao.findByCityCode(Constant.city);
        Map<String, Town> townsMap = new HashMap<String, Town>();
        for (Town town : towns) {
            townsMap.put(town.getCode(), town);
        }
        //全部的市
        Map<String, City> cityMap = new HashMap<String, City>();
        City city=new City();
        city.setCode(Constant.city);
        city.setName(Constant.cityName);
        cityMap.put(Constant.city,city);
        Map<String, Map<String, List<ETLModel>>> adminTeam=data.get(0);//团队的数据
        Map<String, Map<String, List<ETLModel>>> orgTeam=data.get(1);//机构的数据
        Map<String, Map<String, List<ETLModel>>> townTeam=data.get(2);//区的数据
        Map<String, Map<String, List<ETLModel>>> cityTeam=data.get(3);//市的数据
        //保存市
        saveLevel2City(wlyyQuotaId, cityMap, cityTeam,foreachNum,type);
        //保存区
        saveLevel2Town(wlyyQuotaId, townsMap, townTeam,foreachNum,type);
        //保存机构
        saveLevel2Org(wlyyQuotaId, hospitalsMap, orgTeam,foreachNum,type);
        //保存全科团队
        saveLevel2Team(wlyyQuotaId, adminTeamMap, adminTeam,foreachNum,type);
    }
    private void saveLevel2Team(String wlyyQuotaId, Map<String, AdminTeam> adminTeamMap, Map<String, Map<String, List<ETLModel>>> eltModel, Integer foreachNum, Integer type) {
        for(Map.Entry<String,AdminTeam> adminTeam:adminTeamMap.entrySet()){
            Map<String, List<ETLModel>> oneELTMap= eltModel.get(adminTeam.getKey());
            for(int i=1;i<=foreachNum;i++){
                JSONObject jo=new JSONObject();
                Integer num=0;
                List<ETLModel> etlList=oneELTMap.get(adminTeam.getKey());
                if(etlList!=null&&etlList.size()>0){
                    num=etlList.size();
                }
                jo.put("date", DateUtil.dateToStrLong(new Date()));
                jo.put("num", num);
                jo.put("teamName", adminTeam.getValue().getName());
                jo.put("teamId", adminTeam.getValue().getId());
                String key=i+"";
                jo.put("name", getLevel2Name(key,type));
                redisTemplate.opsForValue().set(new StringBuffer("quota:"+wlyyQuotaId+":1:"+key+":"+adminTeam.getKey()).toString(), jo.toString());
            }
        }
    }
    private void saveLevel2Org(String wlyyQuotaId, Map<String, Hospital> hospitalsMap, Map<String, Map<String, List<ETLModel>>> eltModel, Integer foreachNum, Integer type) {
        for(Map.Entry<String,Hospital> hospital:hospitalsMap.entrySet()){
            Map<String, List<ETLModel>> oneELTMap= eltModel.get(hospital.getKey());
            for(int i=1;i<=foreachNum;i++){
                JSONObject jo=new JSONObject();
                Integer num=0;
                List<ETLModel> etlList=oneELTMap.get(hospital.getKey());
                if(etlList!=null&&etlList.size()>0){
                    num=etlList.size();
                }
                jo.put("date", DateUtil.dateToStrLong(new Date()));
                jo.put("num", num);
                jo.put("orgName", hospital.getValue().getName());
                jo.put("orgCode", hospital.getValue().getCode());
                String key=i+"";
                jo.put("name", getLevel2Name(key,type));
                redisTemplate.opsForValue().set(new StringBuffer("quota:"+wlyyQuotaId+":2:"+key+":"+hospital.getKey()).toString(), jo.toString());
            }
        }
    }
    private void saveLevel2Town(String wlyyQuotaId, Map<String, Town> townsMap, Map<String, Map<String, List<ETLModel>>> eltModel, Integer foreachNum, Integer type) {
        for(Map.Entry<String,Town> town:townsMap.entrySet()){
            Map<String, List<ETLModel>> oneELTMap= eltModel.get(town.getKey());
            for(int i=1;i<=foreachNum;i++){
                JSONObject jo=new JSONObject();
                Integer num=0;
                List<ETLModel> etlList=oneELTMap.get(town.getKey());
                if(etlList!=null&&etlList.size()>0){
                    num=etlList.size();
                }
                jo.put("date", DateUtil.dateToStrLong(new Date()));
                jo.put("num", num);
                jo.put("townName", town.getValue().getName());
                jo.put("townCode", town.getValue().getCode());
                String key=i+"";
                jo.put("name", getLevel2Name(key,type));
                redisTemplate.opsForValue().set(new StringBuffer("quota:"+wlyyQuotaId+":3:"+key+":"+town.getKey()).toString(), jo.toString());
            }
        }
    }
    private void saveLevel2City(String wlyyQuotaId, Map<String, City> cityMap, Map<String, Map<String, List<ETLModel>>> eltModel, Integer foreachNum, Integer type) {
        for(Map.Entry<String,City> city:cityMap.entrySet()){
            Map<String, List<ETLModel>> oneELTMap= eltModel.get(city.getKey());
            for(int i=1;i<=foreachNum;i++){
                JSONObject jo=new JSONObject();
                Integer num=0;
                List<ETLModel> etlList=oneELTMap.get(city.getKey());
                if(etlList!=null&&etlList.size()>0){
                    num=etlList.size();
                }
                jo.put("date", DateUtil.dateToStrLong(new Date()));
                jo.put("num", num);
                jo.put("cityName", city.getValue().getName());
                jo.put("cityCode", city.getValue().getCode());
                String key=i+"";
                jo.put("name", getLevel2Name(key,type));
                redisTemplate.opsForValue().set(new StringBuffer("quota:"+wlyyQuotaId+":4:"+key+":"+city.getKey()).toString(), jo.toString());
            }
        }
    }
    private void saveLevel1Team(String wlyyQuotaId, Map<String, AdminTeam> adminTeamMap, Map<String, List<ETLModel>> adminTeam) {
        for(Map.Entry<String,AdminTeam> entry:adminTeamMap.entrySet()){
            JSONObject jo=new JSONObject();
            Integer num=0;
            List<ETLModel> etlList=adminTeam.get(entry.getKey());
            if(etlList!=null&&etlList.size()>0){
                num=etlList.size();
            }
            jo.put("date", DateUtil.dateToStrLong(new Date()));
            jo.put("num", num);
            jo.put("teamName", entry.getValue().getName());
            jo.put("teamId", entry.getValue().getId());
            redisTemplate.opsForValue().set(new StringBuffer("quota:"+wlyyQuotaId+":1:"+entry.getKey()).toString(), jo.toString());
        }
    }
    private void saveLevel1Org(String wlyyQuotaId, Map<String, Hospital> hospitalsMap, Map<String, List<ETLModel>> orgTeam) {
        for(Map.Entry<String,Hospital> entry:hospitalsMap.entrySet()){
            JSONObject jo=new JSONObject();
            Integer num=0;
            List<ETLModel> etlList=orgTeam.get(entry.getKey());
            if(etlList!=null&&etlList.size()>0){
                num=etlList.size();
            }
            jo.put("date", DateUtil.dateToStrLong(new Date()));
            jo.put("num", num);
            jo.put("orgName", entry.getValue().getName());
            jo.put("orgCode", entry.getValue().getCode());
            redisTemplate.opsForValue().set(new StringBuffer("quota:"+wlyyQuotaId+":2:"+entry.getKey()).toString(), jo.toString());
        }
    }
    private void saveLevel1Town(String wlyyQuotaId, Map<String, Town> townsMap, Map<String, List<ETLModel>> townTeam) {
        for(Map.Entry<String,Town> entry:townsMap.entrySet()){
            JSONObject jo=new JSONObject();
            Integer num=0;
            List<ETLModel> etlList=townTeam.get(entry.getKey());
            if(etlList!=null&&etlList.size()>0){
                num=etlList.size();
            }
            jo.put("date", DateUtil.dateToStrLong(new Date()));
            jo.put("num", num);
            jo.put("townName", entry.getValue().getName());
            jo.put("townCode", entry.getValue().getCode());
            redisTemplate.opsForValue().set(new StringBuffer("quota:"+wlyyQuotaId+":3:"+entry.getKey()).toString(), jo.toString());
        }
    }
    private void saveLevel1City(String wlyyQuotaId, Map<String, City> cityMap, Map<String, List<ETLModel>> cityTeam) {
        for(Map.Entry<String,City> entry:cityMap.entrySet()){
            JSONObject jo=new JSONObject();
            Integer num=0;
            List<ETLModel> etlList=cityTeam.get(entry.getKey());
            if(etlList!=null&&etlList.size()>0){
                num=etlList.size();
            }
            jo.put("date", DateUtil.dateToStrLong(new Date()));
            jo.put("num", num);
            jo.put("cityName", entry.getValue().getName());
            jo.put("cityCode", entry.getValue().getCode());
            redisTemplate.opsForValue().set(new StringBuffer("quota:"+wlyyQuotaId+":4:"+entry.getKey()).toString(), jo.toString());
        }
    }
    private String getLevel2Name(String i, Integer type) {
        switch (type){
            case  1:{
                //性别
                return Constant.getLevelSexName(i);
            }
            case  2:{
                //年龄
                return Constant.getLevelAgeName(i);
            }
            case  3:{
                //用户分组
                return Constant.getLevelGroupName(i);
            }
            default:{
                return "";
            }
        }
    }
}

+ 1 - 2
src/main/java/com/yihu/wlyy/repository/doctor/DoctorAdminTeamMemberDao.java

@ -26,8 +26,7 @@ public interface DoctorAdminTeamMemberDao extends
    @Query("SELECT t FROM AdminTeamMember m, AdminTeam t WHERE m.doctorCode = :doctorCode AND t.id = m.teamId")
    List<AdminTeam> findDoctorTeams(@Param(value = "doctorCode") String doctorCode);
    @Query("SELECT d FROM AdminTeamMember m, AdminTeam t, Doctor d WHERE t.id = :teamId AND t.id = m" +
            ".teamId AND m.doctorCode = d.code ORDER BY d.level")
    @Query("SELECT d FROM AdminTeamMember m, AdminTeam t, Doctor d WHERE t.id = :teamId AND t.id = m.teamId AND m.doctorCode = d.code ORDER BY d.level")
    List<Doctor> findAllMembers(@Param(value = "teamId") long teamId);
    @Query("SELECT case when count(A) > 0 then true else false END FROM AdminTeamMember A WHERE A.teamId = :teamId " +

+ 3 - 0
src/main/java/com/yihu/wlyy/repository/patient/SignFamilyDao.java

@ -220,6 +220,9 @@ public interface SignFamilyDao extends PagingAndSortingRepository<SignFamily, Lo
	//查找昨天的家庭签约数据
	@Query(" from SignFamily a where  a.type =2 and a.status = 1  and unix_timestamp(a.applyDate)>=unix_timestamp(?1) and unix_timestamp(a.applyDate)<unix_timestamp(?2) ")
	List<SignFamily> findByJiatingSignYesterday(String yesterday,String today);
	//查找昨天的家庭签约数据
	@Query(" from SignFamily a where  a.type =2 and a.status >= 1  and  unix_timestamp(a.applyDate)<=unix_timestamp(?1) ")
	List<SignFamily> findByJiatingSignYesterday(String yesterday);
	//查找昨天的家庭解约数据
	@Query(" from SignFamily a where  a.type =2 and a.status in (-3,-4) and unix_timestamp(a.applyUnsignDate)>=unix_timestamp(?1) and unix_timestamp(a.applyUnsignDate)<unix_timestamp(?2) ")
	List<SignFamily> findByJiatingUnSignYesterday(String yesterday,String today);

+ 1 - 0
src/main/java/com/yihu/wlyy/service/app/team/AdminTeamService.java

@ -199,6 +199,7 @@ public class AdminTeamService extends BaseService {
    public List<Doctor> getMembers(long teamId) {
        return memberDao.findAllMembers(teamId);
    }
    public List<Doctor> getMembers(long teamId,String doctorCode) {
        return memberDao.findAllHeathExcludeThis(teamId,doctorCode);
    }

+ 1 - 1
src/main/java/com/yihu/wlyy/service/quota/JobService.java

@ -126,7 +126,7 @@ public class JobService {
        //往quartz框架添加任务
        if (!StringUtils.isEmpty(quartzJobConfig.getJobClass())) {
            quartzHelper.startNow(Class.forName(quartzJobConfig.getJobClass()), quartzJobConfig.getId(), params);
            quartzHelper.startNow(Class.forName(quartzJobConfig.getJobClass()), quartzJobConfig.getId()+ UUID.randomUUID(), params);
        }
    }

+ 15 - 1
src/main/java/com/yihu/wlyy/web/doctor/team/AdminTeamController.java

@ -131,7 +131,21 @@ public class AdminTeamController extends BaseController {
    @ApiOperation(value = "获取团队成员")
    public String getTeamMembers(@PathVariable("team_id") long teamId) {
        try {
            List<Doctor> members = memberService.getMembers(teamId,getUID());
            List<Doctor> members = memberService.getMembers(teamId);
            return write(200, "OK", "data", new JSONArray(copyBeans(members, "id", "code", "name", "hospital",
                    "jobName", "level", "sex", "photo")));
        } catch (Exception e) {
            error(e);
            return error(-1, e.getMessage());
        }
    }
    //目前没用到,之后可能会用到
//    @RequestMapping(value = "/{team_id}/members/excludedThisAndLevel3", method = RequestMethod.GET)
//    @ApiOperation(value = "获取团队成员,排除自己和专科医生")
    public String getTeamMembersExcludedThisAndLevel3(@PathVariable("team_id") long teamId) {
        try {
            List<Doctor> members = memberService.getMembers(teamId,super.getUID());
            return write(200, "OK", "data", new JSONArray(copyBeans(members, "id", "code", "name", "hospital",
                    "jobName", "level", "sex", "photo")));