Bläddra i källkod

修改程序结构

esb 8 år sedan
förälder
incheckning
577414eace
59 ändrade filer med 11741 tillägg och 0 borttagningar
  1. 101 0
      patient-co-statistics/pom.xml
  2. 19 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/CityDao.java
  3. 237 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/ConsultTeamDao.java
  4. 62 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/DoctorAdminTeamDao.java
  5. 124 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/DoctorDao.java
  6. 105 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/DoctorPatientGroupInfoDao.java
  7. 42 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/HospitalDao.java
  8. 17 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/JobConfigDao.java
  9. 53 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/PatientDao.java
  10. 56 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/PatientHealthGuidanceDao.java
  11. 11 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/QuartzJobLogDao.java
  12. 11 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/QuotaDao.java
  13. 299 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/SignFamilyDao.java
  14. 24 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/TownDao.java
  15. 24 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/WlyyQuotaResultDao.java
  16. 88 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/model/ETLModel.java
  17. 68 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/role/Level1Role.java
  18. 67 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/role/Level2Role.java
  19. 76 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/role/Level3Role.java
  20. 88 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/role/PatientAgeRole.java
  21. 72 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/role/PatientGroupRole.java
  22. 69 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/role/PatientSexRole.java
  23. 682 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/storage/DBStorage.java
  24. 313 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/storage/RedisStorage.java
  25. 227 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/AllSignExpenseStatusJob.java
  26. 223 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/AllSignJob.java
  27. 223 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/ChangeSignJob.java
  28. 158 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/Constant.java
  29. 209 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/ConsultJob.java
  30. 1852 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/CurrentDayAllQuotaJob.java
  31. 296 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/FollowUpJob.java
  32. 215 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/HealthGuideJob.java
  33. 45 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/InstantiationTracingBeanPostProcessor.java
  34. 110 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/QuartzHelper.java
  35. 438 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/SignAgeGroupDiseaseJob.java
  36. 859 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/SignJob.java
  37. 224 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/UnSignJob.java
  38. 223 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/WaitSignJob.java
  39. 38 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/IdEntity.java
  40. 230 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/consult/ConsultTeam.java
  41. 351 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/doctor/Doctor.java
  42. 71 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/doctor/DoctorPatientGroup.java
  43. 128 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/doctor/DoctorPatientGroupInfo.java
  44. 156 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/hosptial/Hospital.java
  45. 124 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/job/QuartzJobConfig.java
  46. 104 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/job/QuartzJobLog.java
  47. 117 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/job/WlyyQuota.java
  48. 228 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/job/WlyyQuotaResult.java
  49. 321 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/patient/Patient.java
  50. 96 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/patient/PatientHealthGuidance.java
  51. 467 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/signfamily/SignFamily.java
  52. 57 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/system/City.java
  53. 78 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/system/Town.java
  54. 76 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/team/AdminTeam.java
  55. 710 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/util/DateUtil.java
  56. 155 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/util/IdCardUtil.java
  57. 110 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/vo/WlyyJobConfigVO.java
  58. 107 0
      patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/vo/WlyyQuotaVO.java
  59. 7 0
      patient-co-statistics/src/main/resources/log4j2.properties

+ 101 - 0
patient-co-statistics/pom.xml

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <parent>
        <groupId>com.yihu</groupId>
        <artifactId>wlyy</artifactId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>patient-co-statistics</artifactId>
    <packaging>jar</packaging>
    <name>patient-co-statistics</name>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-parent</artifactId>
                <version>2.18.0</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-core</artifactId>
        </dependency>
        <!-- logging -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- testing -->
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <defaultGoal>install</defaultGoal>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.1</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <!-- Allows the example to be run via 'mvn compile exec:java' -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.5.0</version>
                <configuration>
                    <mainClass>com.yihu.MainApp</mainClass>
                    <includePluginDependencies>false</includePluginDependencies>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

+ 19 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/CityDao.java

@ -0,0 +1,19 @@
/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.yihu.wlyy.statistics.dao;
import com.yihu.wlyy.statistics.model.system.City;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
public interface CityDao extends PagingAndSortingRepository<City, Long> {
	// 根據CODE查詢城市名稱
	@Query("select p from City p where p.code = ?1")
	City findByCode(String code);
	
	@Query("select a from City a where a.province = ?1 order by id")
	Iterable<City> findByProvince(String province);
}

+ 237 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/ConsultTeamDao.java

@ -0,0 +1,237 @@
/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.yihu.wlyy.statistics.dao;
import com.yihu.wlyy.statistics.model.consult.ConsultTeam;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
public interface ConsultTeamDao extends PagingAndSortingRepository<ConsultTeam, Long>, JpaSpecificationExecutor<ConsultTeam> {
	// 根據consult查詢咨询记录
	ConsultTeam findByConsult(String consult);
	@Query("select a from ConsultTeam a where a.patient = ?1 and a.del = '1' and a.status = 0")
	List<ConsultTeam> findUnfinishedConsult(String patient);
	// 统计未完成的数量
	@Query("select count(1) from ConsultTeam a where a.patient = ?1 and a.status = 0 and a.del = '1'and a.type=?2")
	int countByPatient(String patient, Integer signType);
	// 被指定且未结束列表
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and b.to = ?1 and a.del = '1' and b.del = '1' and a.type<3")
	Page<ConsultTeam> findDoctorList(String doctor, Pageable pageRequest);
	// 被指定且未结束列表
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and b.to = ?1 and a.id < ?2 and a.del = '1' and b.del = '1' and a.type<3")
	Page<ConsultTeam> findDoctorList(String doctor, long id, Pageable pageRequest);
	// 被指定且未结束列表
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and b.to = ?1 and a.status = 0 and a.del = '1' and b.del = '1' and a.type<3 ")
	Page<ConsultTeam> findDoctorPointList(String doctor, Pageable pageRequest);
	// 被指定且未结束列表
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and b.to = ?1 and a.id < ?2 and a.status = 0 and a.del = '1' and b.del = '1' and a.type<3 ")
	Page<ConsultTeam> findDoctorPointList(String doctor, long id, Pageable pageRequest);
	// 被指定且未结束列表
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and b.to = ?1 and a.id < ?2 and a.status = 0 and a.del = '1' and b.del = '1' and (a.type = 1 or a.type = 2 or a.type = 6) ")
	Page<ConsultTeam> findDoctorAllList(String doctor, long id, Pageable pageRequest);
	// 被指定且未结束列表
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and b.to = ?1 and a.status = 0 and a.del = '1' and b.del = '1' and (a.type = 1 or a.type = 2 or a.type = 6) ")
	Page<ConsultTeam> findDoctorAllList(String doctor, Pageable pageRequest);
	// 医生参与且未结束列表
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and b.to = ?1 and a.status = 0 and b.reply = 1 and a.del = '1' and b.del = '1' and a.type<3")
	Page<ConsultTeam> findDoctorJoinList(String doctor, Pageable pageRequest);
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and b.to = ?1 and a.id < ?2 and a.status = 0 and b.reply = 1 and a.del = '1' and b.del = '1' and a.type<3 ")
	Page<ConsultTeam> findDoctorJoinList(String doctor, long id, Pageable pageRequest);
	// 医生参与并已结束列表
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and b.to = ?1 and a.status = 1 and a.del = '1' and b.del = '1' and a.type<3")
	Page<ConsultTeam> findDoctorFinishList(String doctor, Pageable pageRequest);
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and b.to = ?1 and a.id < ?2 and a.status = 1 and a.del = '1' and b.del = '1' and a.type<3")
	Page<ConsultTeam> findDoctorFinishList(String doctor, long id, Pageable pageRequest);
	// 医生关闭三师咨询
	@Modifying
	@Query("update ConsultTeam a set a.status = 1 where a.consult = ?1")
	int updateStatusByConsult(String consult);
	@Modifying
	@Query("update ConsultTeam a set a.doctorRead = 0 where a.consult = ?1")
	int updateReadedByConsult(String consult);
	/**
	 * 解约时结束家庭咨询
	 *
	 * @param patient
	 * @return
	 */
	@Modifying
	@Query("update ConsultTeam a set a.status = 1 where a.patient =?1 and a.type = 2")
	int updateStatusByPatient(String patient);
	// 取消三师咨询
	@Modifying
	@Query("update ConsultTeam a set a.status = -1 where a.consult = ?1 and a.status <> 1")
	int cancel(String consult);
	// 患者咨询列表(未结束)
	@Query("select a from ConsultTeam a where a.patient = ?1 and a.status=0 and del = '1'")
	Page<ConsultTeam> findNotFinishedBypatient(String patient, Pageable pageRequest);
	@Query("select a from ConsultTeam a where a.patient = ?1 and a.id < ?2 and a.status=0 and del = '1'")
	Page<ConsultTeam> findNotFinishedBypatient(String patient, long id, Pageable pageRequest);
	// 患者咨询列表(已结束)
	@Query("select a from ConsultTeam a where a.patient=?1 and a.status=1 and del = '1'")
	Page<ConsultTeam> findFinishedBypatient(String patient, Pageable pageRequest);
	@Query("select a from ConsultTeam a where a.patient=?1 and a.id < ?2 and a.status=1 and del = '1'")
	Page<ConsultTeam> findFinishedBypatient(String patient, long id, Pageable pageRequest);
	// 患者咨询列表(已取消)
	@Query("select a from ConsultTeam a where a.patient=?1 and a.status=-1 and del = '1'")
	Page<ConsultTeam> findCancelBypatient(String patient, Pageable pageRequest);
	@Query("select a from ConsultTeam a where a.patient=?1 and a.id < ?2 and a.status=-1 and del = '1'")
	Page<ConsultTeam> findCancelBypatient(String patient, long id, Pageable pageRequest);
	// 医生未读数量+1
	@Modifying
	@Query("update ConsultTeam a set a.doctorRead = a.doctorRead + 1 where a.consult = ?1")
	int increaseDoctorRead(String consult);
	// 患者未读数量+1
	@Modifying
	@Query("update ConsultTeam a set a.patientRead = a.patientRead + 1 where a.consult = ?1")
	int increasePatientRead(String consult);
	// 清空医生未读数量
	@Modifying
	@Query("update ConsultTeam a set a.doctorRead = 0 where a.consult = ?1")
	int clearDoctorRead(String consult);
	// 清空患者未读数量
	@Modifying
	@Query("update ConsultTeam a set a.patientRead = 0 where a.consult = ?1")
	int clearPatientRead(String consult);
	// 更新患者评价标识
	@Modifying
	@Query("update ConsultTeam a set a.commentContent = ?2, a.commentStar = ?3 where a.consult = ?4")
	int updateComment(String commentContent, double commentStar, String consult);
	// 查询医生所有未读的消息总数
	@Query("SELECT SUM(a.doctorRead) FROM ConsultTeam a, ConsultTeamDoctor b WHERE a.consult = b.consult AND b.to = ?1 AND a.del = '1' AND a.status = 0 AND a.type <> 6")
	int amountAllDoctorUnread(String doctor);
	// 查询医生所有未读的消息总数
	@Query("SELECT SUM(a.doctorRead) FROM ConsultTeam a, ConsultTeamDoctor b WHERE a.consult = b.consult AND b.to = ?1 AND a.del = '1' AND a.status = 0 AND a.type = 6")
	int amountAlFamouslDoctorUnread(String doctor);
	// 查询医生所有未读的消息总数
	@Query("SELECT a.name,b.czrq FROM ConsultTeam a, ConsultTeamDoctor b WHERE a.consult = b.consult AND b.to = ?1 AND a.del = '1' AND a.status = 0 AND a.type <> 6 order by b.czrq desc")
	Page<Object> AllDoctorUnreadLast(String doctor, Pageable pageRequest);
	// 查询医生所有未读的消息总数
	@Query("SELECT a.name,b.czrq FROM ConsultTeam a, ConsultTeamDoctor b WHERE a.consult = b.consult AND b.to = ?1 AND a.del = '1' AND a.status = 0 AND a.type = 6 order by b.czrq desc")
	Page<Object> AllDoctorFamousUnreadLast(String doctor, Pageable pageRequest);
	// 查询带未读数量的所有健康咨询列表
	@Query("SELECT a FROM ConsultTeam a, ConsultTeamDoctor b WHERE a.consult = b.consult AND b.to = ?1 AND a.status = 0 and a.type< 3")
	Page<ConsultTeam> findListByUnreadDoctor(String doctor, Pageable pageRequest);
	// 查询带未读数量的所有健康咨询列表
	@Query("SELECT a FROM ConsultTeam a, ConsultTeamDoctor b WHERE a.consult = b.consult AND b.to = ?1 and a.id < ?2 AND a.status = 0 and a.type<3")
	Page<ConsultTeam> findListByUnreadDoctor(String doctor, long id, Pageable pageRequest);
	//找出当日的咨询量
	@Query("SELECT a FROM ConsultTeam a WHERE a.type=2 and unix_timestamp(a.czrq)>=unix_timestamp(?1) and unix_timestamp(a.czrq)<unix_timestamp(?2) ")
	List<ConsultTeam> findByCzrqyYesterday(String yesterday, String now);
	//查找
	@Query("SELECT a FROM ConsultTeam a WHERE a.patient=?1 and a.status=0 and a.del=1 and a.type=6")
	ConsultTeam findFamousConsultByPatient(String uid);
	//名医咨询 -全部
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and a.type=6 and b.to = ?1 and a.id < ?2 and a.del = '1' and b.del = '1'")
	Page<ConsultTeam> findFamousDoctorAllList(String uid, long id, Pageable pageRequest);
	//名医咨询 -全部
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and a.type=6 and b.to = ?1  and a.del = '1' and b.del = '1'")
	Page<ConsultTeam> findFamousDoctorAllList(String uid, Pageable pageRequest);
	//名医咨询 -全部 带symptoms
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and a.type=6 and b.to = ?1 and a.id < ?2 and a.symptoms like ?3 and a.del = '1' and b.del = '1'")
	Page<ConsultTeam> findFamousDoctorAllList(String uid, long id, String title, Pageable pageRequest);
	//名医咨询 -全部 带symptoms
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and a.type=6 and b.to = ?1 and a.symptoms like ?2  and a.del = '1' and b.del = '1'")
	Page<ConsultTeam> findFamousDoctorAllList(String uid, String title, Pageable pageRequest);
	//名医咨询 -根据status
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and a.type=6 and b.to = ?1 and a.id < ?2 and a.status = ?3 and a.del = '1' and b.del = '1'")
	Page<ConsultTeam> findFamousDoctorDoingList(String uid, long id, Integer type, Pageable pageRequest);
	//名医咨询 -根据status
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and a.type=6 and b.to = ?1 and a.status = ?2  and a.del = '1' and b.del = '1'")
	Page<ConsultTeam> findFamousDoctorDoingList(String uid, Integer type, Pageable pageRequest);
	//名医咨询 -根据status 带symptoms
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and a.type=6 and b.to = ?1 and a.id < ?2 and a.symptoms like ?3 and a.status = ?4 and a.del = '1' and b.del = '1'")
	Page<ConsultTeam> findFamousDoctorDoingList(String uid, long id, String title, Integer type, Pageable pageRequest);
	//名医咨询 -根据status 带symptoms
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and a.type=6 and b.to = ?1 and a.symptoms like ?2 and a.status = ?3 and a.del = '1' and b.del = '1'")
	Page<ConsultTeam> findFamousDoctorDoingList(String uid, String title, Integer type, Pageable pageRequest);
	@Query("select a from ConsultTeam a where  a.type=?3  and a.del = '1' and a.patient=?1 and a.doctor=?2 and  a.status=0 ")
	ConsultTeam findByParientCodeAndSignTypeAndDoctor(String patientCode, String doctor, int s);
	//名医咨询 -全部 带symptoms 未处理、未回复
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and a.type=6 and b.to = ?1 and a.id < ?2 and a.symptoms like ?3 and a.status = 0 and (a.doctorRead > 0 or b.reply <> 1) and a.del = '1' and b.del = '1'")
	Page<ConsultTeam> findFamousDoctorUnReplyReadList(String uid, long id, String title, Pageable pageRequest);
	//名医咨询 -全部 带symptoms 处理、未回复
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and a.type=6 and b.to = ?1 and a.symptoms like ?2 and a.status = 0 and (a.doctorRead > 0 or b.reply <> 1) and a.del = '1' and b.del = '1'")
	Page<ConsultTeam> findFamousDoctorUnReplyReadList(String uid, String title, Pageable pageRequest);
	//名医咨询 -全部 处理、未回复
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and a.type=6 and b.to = ?1 and a.id < ?2 and a.status = 0 and (a.doctorRead > 0 or b.reply <> 1) and a.del = '1' and b.del = '1'")
	Page<ConsultTeam> findFamousDoctorUnReplyReadNoTitleList(String uid, long id, Pageable pageRequest);
	//名医咨询 -全部
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and a.type=6 and b.to = ?1 and a.status = 0 and (a.doctorRead > 0 or b.reply <> 1) and a.del = '1' and b.del = '1'")
	Page<ConsultTeam> findFamousDoctorUnReplyReadNoTitleList(String uid, Pageable pageRequest);
	//名医咨询 -全部 带symptoms 进行中
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and a.type=6 and b.to = ?1 and a.id < ?2 and a.symptoms like ?3 and a.status = 0 and b.reply = 1 and a.del = '1' and b.del = '1'")
	Page<ConsultTeam> findFamousDoctorIngList(String uid, long id, String title, Pageable pageRequest);
	//名医咨询 -全部 带symptoms 进行中
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and a.type=6 and b.to = ?1 and a.symptoms like ?2 and a.status = 0 and  b.reply = 1 and a.del = '1' and b.del = '1'")
	Page<ConsultTeam> findFamousDoctorIngList(String uid, String title, Pageable pageRequest);
	//名医咨询 -全部 进行中
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and a.type=6 and b.to = ?1 and a.id < ?2 and a.status = 0 and  b.reply = 1 and a.del = '1' and b.del = '1'")
	Page<ConsultTeam> findFamousDoctorIngNoTitleList(String uid, long id, Pageable pageRequest);
	//名医咨询 -全部 进行中
	@Query("select a from ConsultTeam a, ConsultTeamDoctor b where a.consult = b.consult and a.type=6 and b.to = ?1 and a.status = 0 and b.reply = 1 and a.del = '1' and b.del = '1'")
	Page<ConsultTeam> findFamousDoctorIngNoTitleList(String uid, Pageable pageRequest);
    // 更新超过24小时未回复的项目,多加一分钟,防止过于频繁更新
    @Modifying
    @Query("UPDATE ConsultTeam a set a.status = -2 where TIMESTAMPDIFF(SECOND, a.czrq, CURRENT_TIME) > 87840 and status = 0")
    void updateUnresponsedConsultOver24Hours();
    // 最近24小时内未回复的项目
    @Query("FROM ConsultTeam a where TIMESTAMPDIFF(SECOND, a.czrq, CURRENT_TIME) < 86400 and a.status = 0 order by a.czrq desc")
    Page<ConsultTeam> getUnresponsedConsultIn24Hours(Pageable pageable);
	@Query("FROM ConsultTeam a where a.type=?1 and a.adminTeamId is null")
	List<ConsultTeam> findByTypeAndAdminTeamIdIsNull(Integer s);
}

+ 62 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/DoctorAdminTeamDao.java

@ -0,0 +1,62 @@
package com.yihu.wlyy.statistics.dao;
import com.yihu.wlyy.statistics.model.team.AdminTeam;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import java.util.List;
/**
 * 行政团队DAO。
 * 
 * @author Sand
 */
public interface DoctorAdminTeamDao extends
        PagingAndSortingRepository<AdminTeam, Long>,
        JpaSpecificationExecutor<AdminTeam> {
    /**
     * 团队内,全科医生的签约数。
     *
     * @param doctorCode
     * @param teamId
     * @return
     */
    @Query("SELECT count(s) FROM SignFamily s WHERE doctor = :doctorCode AND adminTeamId = :teamId")
    Integer getDoctorSignCount(@Param(value = "doctorCode") String doctorCode,
                               @Param(value = "teamId") long teamId);
    /**
     * 团队内,健康管理师的签约数。
     *
     * @param healthDoctorCode
     * @param teamId
     * @return
     */
    @Query("SELECT count(s) FROM SignFamily s WHERE doctorHealth = :healthDoctorCode AND adminTeamId = :teamId")
    Integer getHealthDoctorSignCount(@Param(value = "healthDoctorCode") String healthDoctorCode,
                                     @Param(value = "teamId") long teamId);
    /**
     * 患者所签约团队。
     *
     * @param patientCode
     * @return
     */
    @Query("SELECT  t.id, t.name, d1.code, d1.name, d2.code, d2.name\n" +
            "FROM SignFamily f, Doctor d1, Doctor d2, AdminTeam t, AdminTeamMember m \n" +
            "WHERE d1.code = f.doctor AND f.doctorHealth = d2.code AND f.patient = :patientCode AND m.doctorCode = " +
            "d1.code AND m.teamId = t.id")
    Object getPatientSigningTeam(@Param("patientCode") String patientCode);
    @Query("SELECT t.id from AdminTeam t WHERE t.leaderCode = :leaderCode")
    Long findIdByLeaderCode(@Param("leaderCode") String leaderCode);
    @Query(" from AdminTeam t")
    List<AdminTeam> findAllTeam();
    @Query("SELECT t from AdminTeam t WHERE t.leaderCode = :leaderCode")
    AdminTeam findByLeaderCode(@Param("leaderCode") String leaderCode);
}

+ 124 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/DoctorDao.java

@ -0,0 +1,124 @@
/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.yihu.wlyy.statistics.dao;
import com.yihu.wlyy.statistics.model.doctor.Doctor;
import com.yihu.wlyy.statistics.model.doctor.DoctorPatientGroup;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
public interface DoctorDao extends PagingAndSortingRepository<Doctor, Long>, JpaSpecificationExecutor<Doctor> {
    Doctor findByName(String name);
    // 按医生标识查询医生信息
    @Query("select p from Doctor p where p.code = ?1")
    Doctor findByCode(String code);
    @Query("select d from Doctor d where d.del = 1")
    List<Doctor> findAllDoctors();
    @Query("select d from Doctor d where d.del = 1 and d.hospital = ?1")
    Iterable<Doctor> findHospitalDoctors(String hospital);
    // 手机号查询医生信息
    @Query("select p from Doctor p where p.mobile = ?1")
    Doctor findByMobile(String mobile);
    // 根据医生分组查询患者信息
    @Query("select a.group, b.code, b.name, b.photo, b.birthday, b.sex, b.diseaseCondition, b.disease, b.recordAmount, a.partAmount, a.qyrq, a.signType,b.idcard from DoctorPatientGroupInfo a, Patient b where a.doctor = ?1 and a.patient = b.code and a.status=1")
    List<Object> findPatientByDoctorSign(String doctor);
    // 根据医生分组查询患者信息
    @Query("select distinct a.patient,  a.id, b.name, b.photo,b.provinceName,b.cityName,b.townName,b.address, a.begin,b.code,b.mobile,a.signType,b.idcard from SignFamily a, Patient b where (a.doctor = ?1 or a.doctorHealth = ?1) and a.patient = b.code and a.status=1 ORDER BY a.id desc")
    Page<Object> findPatientByDoctorSign(String doctor, Pageable pageRequest);
    // 根据医生分组查询患者信息
    @Query("select distinct a.patient, a.id, b.name, b.photo,b.provinceName,b.cityName,b.townName,b.address, a.begin,b.code,b.mobile,a.signType,b.idcard from SignFamily a, Patient b where (a.doctor = ?1 or a.doctorHealth = ?1) and a.patient = b.code and a.id< ?2 and a.status=1  ORDER BY a.id desc")
    Page<Object> findPatientByDoctorSign(String doctor, long id, Pageable pageRequest);
    // 根据医生分组查询患者信息
    @Query("select distinct a.patient, a.id, b.name, b.photo,b.provinceName,b.cityName,b.townName,b.address, a.begin,b.code,b.mobile, a.signType,b.idcard  from SignFamily a, Patient b where (a.doctor = ?1 or a.doctorHealth = ?1) and a.patient = b.code and a.status=1 and b.name like ?2 and a.status=1 ORDER BY a.id desc")
    Page<Object> findPatientByDoctorSign(String doctor, String patientName, Pageable pageRequest);
    // 根据医生分组查询患者信息
    @Query("select distinct a.patient, a.id, b.name, b.photo,b.provinceName,b.cityName,b.townName,b.address, a.begin,b.code,b.mobile,a.signType,b.idcard  from SignFamily a, Patient b where (a.doctor = ?1 or a.doctorHealth = ?1) and a.patient = b.code and a.id<?2 and a.status=1 and b.name like ?3 and a.status=1  ORDER BY a.id desc")
    Page<Object> findPatientByDoctorSign(String doctor, long id, String patientName, Pageable pageRequest);
    // 查询医生下的患者总数
    @Query("select count(distinct a.patient) from DoctorPatientGroupInfo a where a.doctor = ?1 and a.status=1")
    int amountPatientByDoctorSign(String doctor);
    @Query("select p from DoctorPatientGroup p where p.doctor = ?1  and p.status = 1")
    Iterable<DoctorPatientGroup> findDoctorPatientGroupWithOutNull(String doctor);
    @Query("select p from DoctorPatientGroup p where (p.doctor = ?1 or p.doctor is null) and p.status = 1 order by p.id asc")
    Iterable<DoctorPatientGroup> findDoctorPatientGroup(String doctor);
    @Query("from Doctor p where p.hospital=?1 and p.level = ?2 and p.iscertified=1 and status=1 ")
    List<Doctor> getDoctorCombobxByHospital(String hospital, int type);
    @Query("from Doctor p where p.level = 1 and p.iscertified=1 and p.status=1 ")
    Page<Doctor> findDoctor1ByParient(Pageable pageRequest);
    @Query("from Doctor p where p.level = 1 and p.iscertified=1 and p.status=1 and p.code != ?1")
    Page<Doctor> findDoctor1ByParient(String code, Pageable pageRequest);
    @Query("select d from Doctor d, DoctorTeamMember dtm where d.code=dtm.memberCode and dtm.signType='1' and dtm.team=?1  and dtm.del='1'")
    List<Doctor> findSanshiDoctorByTeam(String code);
    @Query("select d from Doctor d, DoctorTeamMember dtm where d.code=dtm.memberCode and dtm.signType='2' and dtm.team=?1  and dtm.del='1'")
    List<Doctor> findJiatingDoctorByTeam(String code);
    // 手机号查询正常医生信息
    @Query("select p from Doctor p where p.mobile = ?1 and p.del=1")
    Doctor findNormalByMobile(String mobile);
    @Query("select p from Doctor p where p.level=2 and p.del=1 ")
    List<Doctor> findAllQKDoctot();
    @Query("select p from Doctor p where p.level=3 and p.del=1 ")
    List<Doctor> findAllZKDoctot();
    @Query("select p from Doctor p where p.level=1 and p.del=1 ")
    List<Doctor> findAllJKDoctot();
    @Query("select d from Doctor d where d.del = 1 ")
    List<Doctor> findAllCertifiedDoctors();
    @Query("select p from Doctor p where p.level in (2,3) and p.del=1 and p.iscertified=1")
    List<Doctor> findAllQKDoctotAndJKDoctor();
    @Query(" select p from Doctor p where p.hospital =?1 and p.level =?2 and p.del=1  ")
    List<Doctor> findDoctorByLevelAndHospital(String hospital, Integer level);
    @Modifying
    @Query("update Doctor set idcard = ?2 where code = ?1")
    int updateIdcard(String doctor, String idcard);
    List<Doctor> findByIsFamous(Integer isFamous);
    @Query("select p from Doctor p ,DoctorFamousConsultTimesRemain w where p.code=w.doctor and p.isFamous=1 and w.consultDate = ?1 and p.name like ?2 and w.timesRemain > 0 order by w.timesRemain desc")
    Page<Doctor> famousDoctorList(String date, String name, Pageable pageRequest);
    @Query("select p from Doctor p ,DoctorFamousConsultTimesRemain w where p.code=w.doctor and p.isFamous=1 and w.consultDate = ?1  and w.timesRemain > 0  order by w.timesRemain desc")
    Page<Doctor> famousDoctorList(String date, Pageable pageRequest);
    @Query("select p from Doctor p where p.isFamous=1 and p.name like ?1 ")
    Page<Doctor> doctorFamousDoctorList(String name, Pageable pageRequest);
    @Query("select p from Doctor p where p.isFamous=1 ")
    Page<Doctor> doctorFamousDoctorList(Pageable pageRequest);
}

+ 105 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/DoctorPatientGroupInfoDao.java

@ -0,0 +1,105 @@
/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.yihu.wlyy.statistics.dao;
import com.yihu.wlyy.statistics.model.doctor.DoctorPatientGroupInfo;
import com.yihu.wlyy.statistics.model.patient.Patient;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
public interface DoctorPatientGroupInfoDao extends PagingAndSortingRepository<DoctorPatientGroupInfo, Long>, JpaSpecificationExecutor<DoctorPatientGroupInfo> {
	// 根据签约类型获取患者信息
	@Query("select p from DoctorPatientGroupInfo p where p.group = ?1")
	Iterable<DoctorPatientGroupInfo> findPatientByType(String type);
	@Query("select p from DoctorPatientGroupInfo p where p.doctor = ?1 and p.patient = ?2")
	DoctorPatientGroupInfo findGroupInfoByPatient(String doctor, String patient);
	@Query("select p from DoctorPatientGroupInfo p where p.doctor = ?1 and p.patient = ?2 and p.status = 1 and p.signType = '2'")
	List<DoctorPatientGroupInfo> findGroupInfoByPatientAndDoctor(String doctor, String patient);
	// 删除分组时将原来分组患者移动到other分组
	@Modifying
	@Query("update DoctorPatientGroupInfo a set a.group = 'other' where a.group = ?1")
	int moveByCode(String group);
	// 查询所有分组下的患者信息
	@Query("SELECT p FROM Patient p, DoctorPatientGroupInfo d where p.code = d.patient and d.doctor = ?1")
	List<Patient> findPatientByDisease(String doctor);
	// 片段总数+1
	@Modifying
	@Query("update DoctorPatientGroupInfo a set a.partAmount = a.partAmount + 1 where a.doctor = ?1 and a.patient = ?2")
	int addPartAmount(String doctor, String patient);
	// 片段总数-1
	@Modifying
	@Query("update DoctorPatientGroupInfo a set a.partAmount = a.partAmount - 1 where a.doctor = ?1 and a.patient = ?2")
	int reducePartAmount(String doctor, String patient);
	// 病历总数+1
	@Modifying
	@Query("update Patient a set a.recordAmount = a.recordAmount + 1 where a.code = ?1")
	int addRecordAmount(String patient);
	@Query("SELECT a FROM DoctorPatientGroupInfo a where a.patient = ?1")
	List<DoctorPatientGroupInfo> findByPatient(String patient);
	@Modifying
	@Query("delete DoctorPatientGroupInfo a where a.doctor = ?1 and a.patient = ?2")
	int deleteByDoctorPatient(String doctor, String patient);
	
	@Query("select count(1) from DoctorPatientGroupInfo a where a.doctor = ?1 and a.group = ?2 and a.patient = ?3 and a.status = 1")
	int isExistsInGroup(String doctor, String group, String patient);
	@Modifying
	@Query("update DoctorPatientGroupInfo a set a.group ='2'  where a.patient = ?1 and a.group in ('1','3')")
	int updateGroupByParient(String parientCode);
	@Modifying
	@Query("update DoctorPatientGroupInfo a set a.status =0  where a.patient = ?1 and signType='2'")
	void deleteByPatient(String patient);
	//查找家庭签约的病人所在的分组
	@Query("SELECT a FROM DoctorPatientGroupInfo a where a.patient = ?1 and a.signType='2' and a.group in ('1','2','3') and a.status=1 " )
	List<DoctorPatientGroupInfo> findByMorenPatient(String patient);
	/**
	 * 查询患者存在的医生自建组
	 *
	 * @param patient
	 * @return
	 */
	@Query("select a from DoctorPatientGroupInfo a where a.patient = ?1 and a.status = 1 and a.group not in ('1','2','3')")
	List<DoctorPatientGroupInfo> findPatientGroups(String patient);
	//查找所有的签约患者所在的分组
	@Query("select a from DoctorPatientGroupInfo a where  a.status = 1 and a.signType in ('2','3') and a.group in ('1','2','3')")
	List<DoctorPatientGroupInfo> findAllPatient();
	@Query("select a from DoctorPatientGroupInfo a where  a.status = 1 and a.doctor = ?1 and a.patient = ?2 and a.group = ?3")
	List<DoctorPatientGroupInfo> findDoctorPatientGroup(String doctor, String patient, String group);
	@Query("select count(*) from DoctorPatientGroupInfo a where  a.status = 1 and a.doctor = ?1 and a.patient = ?2 and a.group = ?3")
	long countDoctorPatientGroup(String doctor, String patient, String group);
	@Query("select count(*) from DoctorPatientGroupInfo a where  a.status = 1 and a.doctor = ?1 and a.patient = ?2 and a.group = ?3 and a.signType = ?4")
	long countDoctorPatientGroupType(String doctor, String patient, String group, String type);
	@Modifying
	@Query("update DoctorPatientGroupInfo set status = ?4 where doctor = ?1 and patient = ?2 and group = ?3 and status = 1")
	int updateDoctorPatientGroup(String doctor, String patient, String group, int status);
	@Query("select a from DoctorPatientGroupInfo a where  a.status = 1 and a.doctor = ?2 and a.patient = ?1 and a.signType =2")
	List<DoctorPatientGroupInfo> findByPatientAndDoctor(String patient, String oldDoctorCode);
	List<DoctorPatientGroupInfo> findByGroupAndStatus(String group, Integer status);
}

+ 42 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/HospitalDao.java

@ -0,0 +1,42 @@
/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.yihu.wlyy.statistics.dao;
import com.yihu.wlyy.statistics.model.hosptial.Hospital;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
public interface HospitalDao extends PagingAndSortingRepository<Hospital, Long>,JpaSpecificationExecutor<Hospital>  {
	// 根據CODE查詢医院名称
	@Query("select p from Hospital p where p.code = ?1")
	Hospital findByCode(String code);
	@Query("select a from Hospital a where a.name like ?1 and a.id<?2")
	Page<Hospital> getHospitalList(String query, long id, Pageable pageRequest);
	@Query("select p from Hospital p where p.del = 1 and p.level in (1,2) ")
	List<Hospital> findAllHospital();
	@Query("select p from Hospital p where p.del = 1 and p.level = 2 ")
	List<Hospital> findAllSqHospital();
	@Query("select p from Hospital p where p.del = 1 and p.level = 2 and town = ?1")
	List<Hospital> findAreaSqHospital(String town);
	@Query("select p from Hospital p where p.del = 1 and p.level =2 and p.centerSite='00'")
	List<Hospital> findHospital2();
	@Query("select p from Hospital p where p.del = 1 and p.level =2 and p.centerSite='00'")
	List<Hospital> findHospitalzxFWZ();
	@Query("select p from Hospital p where p.town = ?1 and p.del='1' and p.level =2 and p.centerSite='00'")
	List<Hospital> findByTownCode(String town);
}

+ 17 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/JobConfigDao.java

@ -0,0 +1,17 @@
package com.yihu.wlyy.statistics.dao;
import com.yihu.wlyy.statistics.model.job.QuartzJobConfig;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
/**
 * Created by Administrator on 2016/8/16.
 */
public interface JobConfigDao extends PagingAndSortingRepository<QuartzJobConfig, String>,JpaSpecificationExecutor<QuartzJobConfig> {
    @Query(" from QuartzJobConfig p where p.status=?1 and p.del='1'")
    List<QuartzJobConfig> findByStatus(String s);
}

+ 53 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/PatientDao.java

@ -0,0 +1,53 @@
/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.yihu.wlyy.statistics.dao;
import com.yihu.wlyy.statistics.model.patient.Patient;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
public interface PatientDao extends PagingAndSortingRepository<Patient, Long> {
	// 查询患者姓名
	@Query("select p.name from Patient p where p.code=?1 and p.status=1")
	String findNameByCode(String code);
	// 根據患者標識查詢患者信息
	@Query("select p from Patient p where p.code=?1 and p.status=1")
	Patient findByCode(String code);
	// 根據身份證號查詢患者信息
	@Query("select p from Patient p where p.idcard=?1 and p.status=1")
	Patient findByIdcard(String idcard);
	
	@Query("select p from Patient p where p.ssc=?1 and p.status=1")
	Patient findBySsc(String ssc);
	// 根據手机号查詢患者信息
	@Query("select p from Patient p where p.mobile=?1 and p.status=1")
	Patient findByMobile(String mobile);
	// 根據病情等级获取患者信息
	@Query("select p from Patient p where p.diseaseCondition=?1 and p.status=1")
	Iterable<Patient> findInfoByLevel(int level);
	@Query("select p from Patient p where p.openid=?1 and p.status=1")
	Patient findByOpenid(String openid);
	
	@Query("select count(1) from Patient p where p.openid=?1 and p.status=1")
	int countByOpenid(String openid);
	
	//清空openid
	@Modifying
	@Query("update Patient p set p.openid = null where p.code <> ?1 and p.openid = ?2 and p.status=1")
	int clearOpenid(String patient, String openid);
	@Query(" select p from Patient p,SignFamily s where p.code=s.patient and s.status > 0 ")
	List<Patient> findAllSignPatient();
}

+ 56 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/PatientHealthGuidanceDao.java

@ -0,0 +1,56 @@
/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.yihu.wlyy.statistics.dao;
import com.yihu.wlyy.statistics.model.patient.PatientHealthGuidance;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.Date;
import java.util.List;
public interface PatientHealthGuidanceDao extends PagingAndSortingRepository<PatientHealthGuidance, Long>, JpaSpecificationExecutor<PatientHealthGuidance> {
	@Query("select b.name, b.photo, a.id, a.content, a.czrq,b.level from PatientHealthGuidance a, Doctor b where a.patient = ?1 and a.doctor = b.code and a.del = '1' order by a.id desc")
	Page<Object> findByPatient(String patient, Pageable pageRequest);
	@Query("select b.name, b.photo, a.id, a.content, a.czrq,b.level from PatientHealthGuidance a, Doctor b where a.patient = ?1 and a.doctor = b.code and a.id < ?2 and a.del = '1' order by a.id desc")
	Page<Object> findByPatient(String patient, long id, Pageable pageRequest);
	
	@Query("select b.name, b.photo, a.id, a.content, a.czrq from PatientHealthGuidance a, Patient b where a.doctor = ?1 and a.patient = b.code and a.del = '1' order by a.id desc")
	Page<Object> findByDoctor(String doctor, Pageable pageRequest);
	
	@Query("select b.name, b.photo, a.id, a.content, a.czrq from PatientHealthGuidance a, Patient b where a.doctor = ?1 and a.id < ?2 and a.patient = b.code and a.del = '1' order by a.id desc")
	Page<Object> findByDoctor(String doctor, long id, Pageable pageRequest);
	@Query("select b.name, b.photo, a.id, a.content, a.czrq from PatientHealthGuidance a, Patient b where a.doctor = ?1 and a.patient = ?2 and a.patient = b.code and a.del = '1' order by a.id desc")
	Page<Object> findByDoctor(String doctor, String patient, Pageable pageRequest);
	@Query("select b.name, b.photo, a.id, a.content, a.czrq from PatientHealthGuidance a, Patient b where a.doctor = ?1 and a.patient = ?2 and a.patient = b.code and a.id < ?3 and a.del = '1' order by a.id desc")
	Page<Object> findByDoctor(String doctor, String patient, long id, Pageable pageRequest);
	@Query("select b.name, b.photo, a.id, a.content, a.czrq from PatientHealthGuidance a, Patient b where a.doctor = ?1 and a.czrq between ?2 and ?3 and a.patient = b.code and a.del = '1' order by a.id desc")
	Page<Object> findByDoctor(String doctor, Date begin, Date end, Pageable pageRequest);
	@Query("select b.name, b.photo, a.id, a.content, a.czrq from PatientHealthGuidance a, Patient b where a.doctor = ?1 and a.czrq between ?2 and ?3 and a.id < ?4 and a.patient = b.code and a.del = '1' order by a.id desc")
	Page<Object> findByDoctor(String doctor, Date begin, Date end, long id, Pageable pageRequest);
	@Query("select b.name, b.photo, a.id, a.content, a.czrq from PatientHealthGuidance a, Patient b where a.doctor = ?1 and a.patient = ?2 and a.czrq between ?3 and ?4 and a.patient = b.code and a.del = '1' order by a.id desc")
	Page<Object> findByDoctor(String doctor, String patient, Date begin, Date end, Pageable pageRequest);
	@Query("select b.name, b.photo, a.id, a.content, a.czrq from PatientHealthGuidance a, Patient b where a.doctor = ?1 and a.patient = ?2 and a.czrq between ?3 and ?4 and a.id < ?5 and a.patient = b.code and a.del = '1' order by a.id desc")
	Page<Object> findByDoctor(String doctor, String patient, Date begin, Date end, long id, Pageable pageRequest);
	//查找昨天的健康指导
	@Query("SELECT a FROM PatientHealthGuidance a WHERE unix_timestamp(a.czrq)>=unix_timestamp(?1) and unix_timestamp(a.czrq)<unix_timestamp(?2) ")
	List<PatientHealthGuidance> findByCzrqyYesterday(String yesterday, String now);
	@Query("SELECT count(a) from PatientHealthGuidance a WHERE  a.patient=?2 and a.doctor=?1 ")
	Integer findbydoctorAndPatient(String doctor, String patientCode);
}

+ 11 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/QuartzJobLogDao.java

@ -0,0 +1,11 @@
package com.yihu.wlyy.statistics.dao;
import com.yihu.wlyy.statistics.model.job.QuartzJobLog;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * Created by Administrator on 2016/8/16.
 */
public interface QuartzJobLogDao extends PagingAndSortingRepository<QuartzJobLog, String>, JpaSpecificationExecutor<QuartzJobLog> {
}

+ 11 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/QuotaDao.java

@ -0,0 +1,11 @@
package com.yihu.wlyy.statistics.dao;
import com.yihu.wlyy.statistics.model.job.WlyyQuota;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * Created by Administrator on 2016/8/16.
 */
public interface QuotaDao extends PagingAndSortingRepository<WlyyQuota, String>, JpaSpecificationExecutor<WlyyQuota> {
}

+ 299 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/SignFamilyDao.java

@ -0,0 +1,299 @@
/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.yihu.wlyy.statistics.dao;
import com.yihu.wlyy.statistics.model.signfamily.SignFamily;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
public interface SignFamilyDao extends PagingAndSortingRepository<SignFamily, Long>, JpaSpecificationExecutor<SignFamily> {
	@Query("select count(1) from SignFamily a where a.idcard = ?1 and a.type = 2 and a.status >= 0")
	int hasSingStatus(String idcard);
	@Query("select a from SignFamily a where a.idcard = ?1 and status = ?2 and a.type = 2")
	SignFamily findByPatientStatus(String idcard, int status);
	@Query("select a from SignFamily a where a.patient = ?1 and status = ?2 and a.type = 2")
	SignFamily findByPatientCodeStatus(String patient, int status);
	@Query("select a from SignFamily a where a.patient = ?1 and a.type = ?2 and a.status >= 1")
	SignFamily findByPatientAndType(String patient, int type);
	SignFamily findByCode(String code);
	SignFamily findByCodeAndType(String code, Integer type);
	SignFamily findByFamilyCode(String familyCode);
	@Query("select a from SignFamily a where a.doctor = ?1 and a.patient = ?2 and a.type = 2 and a.status >= 0")
	SignFamily findByDoctorPatient(String doctor, String patient);
	@Query("select a from SignFamily a where a.doctor = ?1 and a.patient = ?2 and a.type = 1 and a.status > 0")
	SignFamily findSsSignByDoctorPatient(String doctor, String patient);
	@Query("select a from SignFamily a,DoctorTeamMember w where a.teamCode = w.team and w.del = '1' and w.memberCode = ?1 and a.patient = ?2 and a.status > 0")
	List<SignFamily> findByDoctorAndPatient(String doctor, String patient);
	@Query("select a from SignFamily a where a.doctor = ?1 and a.patient = ?2 and a.status = 1 and a.type = 2")
	SignFamily findByFamilyDoctorAndPatient(String doctor, String patient);
	@Query("select a from SignFamily a where a.doctor = ?1 and a.patient = ?2 and a.status = 1 and a.type = 1")
	SignFamily findBySanshiDoctorAndPatient(String doctor, String patient);
	@Query("select a from SignFamily a where a.doctor = ?1 and a.openid = ?2 and a.type = 2 and a.status >= 0")
	SignFamily findByDoctorOpenid(String doctor, String openid);
	@Query("select a from SignFamily a where a.doctor = ?1 and a.idcard = ?2 and a.type = 2 and a.status >= 0")
	SignFamily findByDoctorIdcard(String doctor, String idcard);
	@Query("select a from SignFamily a where a.idcard = ?1 and a.type = 2 and a.status >= 0")
	SignFamily findByIdcard(String idcard);
	@Query("select a from SignFamily a where a.idcard = ?1 and a.type =1 and a.status >= 0")
	SignFamily findSSByIdcard(String idcard);
	@Query("select a from SignFamily a where a.idcard = ?1 ")
	List<SignFamily> findAllByIdcard(String idcard);
	@Query("select a from SignFamily a where a.idcard = ?1 and a.status >= 0")
	List<SignFamily> findSSandJTByIdcard(String idcard);
	@Query("select a from SignFamily a where a.openid = ?1 and a.type = 2 and a.status >= 0")
	SignFamily findByOpenid(String openid);
	// 取消签约申请
	@Modifying
	@Query("update SignFamily a set a.status = -1 where a.patient = ?1 and a.doctor = ?2 and a.type = 2 and a.status = 0")
	void unsignByPatient(String patient, String doctor);
	// 取消签约申请
	@Modifying
	@Query("update SignFamily a set a.status = -1 where a.openid = ?1 and a.doctor = ?2 and a.type = 2 and a.status = 0")
	void unsignByOpenid(String openid, String doctor);
	// 查询医生的签约数量
	@Query("select count(1) from SignFamily a where a.doctor = ?1")
	int countByDoctor(String doctor);
	// 查询医生的签约数量
	@Query("select count(1) from SignFamily a")
	int countByDoctor();
	// 更新状态为待解约
	@Modifying
	@Query("update SignFamily a set a.status = 2 where a.patient = ?1 and a.doctor = ?2 and a.status = 1 and a.type = 2")
	int surrender(String patient, String doctor);
	// 更新待签约状态为拒绝或同意状态
	@Modifying
	@Query("update SignFamily a set a.status = ?1 where a.patient = ?2 and a.status = 0 and a.type = 2")
	int handleSign(int status, String patient);
	// 更新已签约状态为解约
	@Modifying
	@Query("update SignFamily a set a.status = -3, a.reason = ?1 where a.patient = ?2 and a.status = 2 and a.type = 2")
	int handleSurrender(String reason, String patient);
	// 拒绝解约
	@Modifying
	@Query("update SignFamily a set a.status = 1 where a.patient = ?1 and a.status = 2 and a.type = 2")
	int refuseSurrender(String patient);
	// 查询患者已生效的家庭签约
	@Query("select a from SignFamily a where a.patient = ?1 and a.type = 2 and a.status > 0")
	SignFamily findSignByPatient(String patient);
	@Modifying
	@Query("update SignFamily a set a.openid = ?1 where patient = ?2")
	int updateOpenidByPatient(String openid, String patient);
	// 查询已签约的总数
	@Query("select count(1) from SignFamily a where a.doctor = ?1 and (a.status = 1 or a.status = 2) and a.type = 2")
	int countAmountSignedByDoctor(String doctor);
	// 查询待签约总数
	@Query("select count(1) from SignFamily a where a.doctor = ?1 and a.status = 0 and a.type = 2")
	int countAmountUnsignByDoctor(String doctor);
	
	// 查询团队中的健康管理师 sf.doctorHealth,sf.doctorHealthName,
	//select sf.doctorHealth,sf.doctorHealthName,count(*) totalContract from SignFamily sf where sf.healthDoctor = ?1
	@Query("select sf.doctorHealth,sf.doctorHealthName,count(sf)  from SignFamily sf where sf.doctorHealth = ?1")
    List<Object> findTeamHealthDoctors(String healthDoctor);
	// 查询团队中的全科医生 sf.doctor,sf.doctorName,d.hosptialName,
	//select sf.doctor,sf.doctorName,d.hosptialName,count(*) totalContract from SignFamily sf left join Doctor d on sf.doctor = d.code where sf.doctor = ?1
	@Query("select sf.doctor,sf.doctorName,d.hosptialName,count(sf) from SignFamily sf, Doctor d  where ( sf.doctor is null or sf.doctor = d.code) and sf.doctor = ?1")
    List<Object> findTeamQkDoctors(String doctor);
	// 待签约 待解决 已签约
	@Query("select a.code,a.doctor,b.code,b.name,b.provinceName,b.cityName,b.townName,b.address,b.photo,a.status,a.id,a.applyDate,a.reason,b.streetName,b.sex from SignFamily a,Patient b,DoctorTeam t,DoctorTeamMember td where a.patient=b.code and a.teamCode=t.code and t.code=td.team and td.memberCode=?1 and td.type=?2 and a.status=?3 order by a.begin desc")
	Page<Object> findToBeSignSignWebByDoctor(String doctor, int doctorType, int status, Pageable pageRequest);
	/**
	 * 查询全科医生签约患者
	 *
	 * @param doctor
	 * @param status
	 * @param pageRequest
	 * @return
	 */
	@Query("select a.code,a.doctor,b.code,b.name,b.provinceName,b.cityName,b.townName,b.address,b.photo,a.status,a.id,a.applyDate,a.reason,b.streetName,b.sex from SignFamily a,Patient b where a.patient=b.code and a.doctor = ?1 and a.status=?2 order by a.begin desc")
	Page<Object> findSignedPatientByQkDoctor(String doctor, int status, Pageable pageRequest);
	/**
	 * 查询健康管理师签约患者
	 *
	 * @param doctor
	 * @param status
	 * @param pageRequest
	 * @return
	 */
	@Query("select a.code,a.doctor,b.code,b.name,b.provinceName,b.cityName,b.townName,b.address,b.photo,a.status,a.id,a.applyDate,a.reason,b.streetName,b.sex from SignFamily a,Patient b where a.patient=b.code and a.doctorHealth = ?1 and a.status=?2 order by a.begin desc")
	Page<Object> findSignedPatientByJkDoctor(String doctor, int status, Pageable pageRequest);
	/**
	 * 查询全科医生已解约患者
	 *
	 * @param doctor
	 * @param pageRequest
	 * @return
	 */
	@Query("select a.code,a.doctor,b.code,b.name,b.provinceName,b.cityName,b.townName,b.address,b.photo,a.status,a.id,a.applyDate,a.reason,b.streetName,b.sex from SignFamily a,Patient b where a.patient=b.code and a.doctor = ?1 and (a.status=-3 or a.status=-4) order by a.begin desc")
	Page<Object> findUnSignedPatientByQkDoctor(String doctor, Pageable pageRequest);
	/**
	 * 查询健康管理师已解约患者
	 *
	 * @param doctor
	 * @param pageRequest
	 * @return
	 */
	@Query("select a.code,a.doctor,b.code,b.name,b.provinceName,b.cityName,b.townName,b.address,b.photo,a.status,a.id,a.applyDate,a.reason,b.streetName,b.sex from SignFamily a,Patient b where a.patient=b.code and a.doctorHealth = ?1 and (a.status=-3 or a.status=-4) order by a.begin desc")
	Page<Object> findUnSignedPatientByJkDoctor(String doctor, Pageable pageRequest);
	//已经解约
	@Query("select a.code,a.doctor,b.code,b.name,b.provinceName,b.cityName,b.townName,b.address,b.photo,a.status,a.id,a.applyDate,a.reason,b.streetName,b.sex from SignFamily a,Patient b,DoctorTeam t,DoctorTeamMember td where a.patient=b.code and a.teamCode=t.code and t.code=td.team and td.memberCode=?1 and td.type=?2 and(a.status=-3 or a.status=-4 ) order by a.begin desc")
	Page<Object> findToBeSignSignWebByDoctor_34(String doctor, int doctorType, Pageable pageRequest);
	@Query("select a from SignFamily a where a.mobile = ?1 and a.type = 2 and a.status >= 0")
	SignFamily findByMobile(String mobile);
	@Query("select a.code,a.doctor,b.code,b.name,b.provinceName,b.cityName,b.townName,b.address,b.photo,a.status,a.id,a.applyDate,a.reason,b.streetName,b.sex from SignFamily a,Patient b where a.patient=b.code and a.doctor=?1 and a.status=?2 order by a.begin desc")
	Page<Object> findToBeSignSignWebByDoctor_0(String doctor, int i, Pageable pageRequest);
	@Query("select count(1) from SignFamily a where a.doctorHealth = ?1 and (a.status = 1 or a.status = 2) and a.type = 2")
	int countAmountSignedByHeather(String uid);
	@Query("select a from SignFamily a where a.patient = ?1 and a.type =1 and a.status >= 1")
	SignFamily findBySanshiPatient(String code);
	@Query("select a from SignFamily a where a.patient = ?1 and a.type =1 and a.status >= 0")
	SignFamily findBySsPatient(String code);
	@Query("select a from SignFamily a where a.patient = ?1 and a.type =2 and a.status >= 1")
	SignFamily findByjiatingPatient(String code);
	@Query("select a from SignFamily a where a.patient = ?1 and a.type =2 and a.status = 1")
	SignFamily findByjiatingPatientYes(String code);
	@Query("select a from SignFamily a where a.patient = ?1 and a.type =1 and a.status = 1")
	SignFamily findBySanshiPatientYes(String id);
	@Query("select a from SignFamily a where a.idcard = ?1 and a.type = 1 and a.status in (0,1,2,3)")
	SignFamily findByPatientSanshiSignInfo(String idCard);
	@Query("select a from SignFamily a where a.idcard = ?1 and a.type = 2 and a.status in (0,1,2,3)")
	SignFamily findByPatientFamilySignInfo(String idCard);
	@Query("select a from SignFamily a where a.patient = ?1 and a.type =2 and a.status >=0")
	SignFamily findByjiatingPatientStatus0(String patient);
	//查找昨天的家庭签约数据
	@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) and a.expensesStatus=1 ")
	List<SignFamily> findByJiatingSignYesterdayExpensesStatus(String yesterday, String today);
	//查找昨天的家庭签约数据
	@Query(" from SignFamily a where  a.type =2 and a.status >= 1  and  unix_timestamp(a.applyDate)<=unix_timestamp(?1) and a.expensesStatus=1 ")
	List<SignFamily> findByJiatingSignYesterdayExpensesStatus(String yesterday);
	//查找昨天的家庭签约数据
	@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) and a.expensesStatus=1")
	List<SignFamily> findByJiatingUnSignYesterdayExpensesStatus(String yesterday, String today);
	//查找昨天的家庭待数据
	@Query(" from SignFamily a where  a.type =2 and a.status =0  and unix_timestamp(a.patientApplyDate)>=unix_timestamp(?1) and unix_timestamp(a.patientApplyDate)<unix_timestamp(?2)")
	List<SignFamily> findByJiatingWaitSignYesterdayExpensesStatus(String yesterday, String today);
	//查找昨天的家庭待改签
	@Query(" from SignFamily a where  a.type =2 and a.status =100  and unix_timestamp(a.patientApplyDate)>=unix_timestamp(?1) and unix_timestamp(a.patientApplyDate)<unix_timestamp(?2) and a.expensesStatus=1 ")
	List<SignFamily> findByJiatingChaangeSignYesterdayExpensesStatus(String yesterday, String now);
	@Query("select a from SignFamily a where a.patient = ?1 and a.type = 1 and a.status in (0,1,2)")
	SignFamily findSanshiSignByPatient(String patientCode);
	@Query("select a from SignFamily a where a.patient = ?1 and a.type = 2 and a.status in (0,1,2)")
	SignFamily findFamilySignByPatient(String patientCode);
	@Query("select p.code, p.name, p.photo, p.birthday, p.sex, p.diseaseCondition, p.disease, p.recordAmount,a.type,a.applyDate,p.idcard from SignFamily a,Patient p where (a.doctor = ?1 or a.doctorHealth = ?1) and a.patient = p.code and a.status in (1,2,3)")
	List<Object> findDoctorSignPatients(String doctor);
	@Query("select p.code, p.name, p.photo, p.birthday, p.sex, p.diseaseCondition, p.disease, p.recordAmount,a.type,a.applyDate,p.idcard  from SignFamily a,Patient p where (a.doctor = ?1 or a.doctorHealth = ?1) and p.name like ?2 and a.patient = p.code and a.status in (1,2,3)")
	List<Object> findDoctorSignPatientsLikeName(String doctor, String name);
	@Query("select p.code, p.name, p.photo, p.birthday, p.sex, p.diseaseCondition, p.disease, p.recordAmount,a.type,a.applyDate,p.idcard  from SignFamily a,Patient p where (a.doctor = ?1 or a.doctorHealth = ?1) and a.type = ?2 and a.patient = p.code and a.status in (1,2,3)")
	List<Object> findDoctorSignPatientsBySignType(String doctor, int type);
	@Query("select p.code, p.name, p.photo, p.birthday, p.sex, p.diseaseCondition, p.disease, p.recordAmount,a.type,a.applyDate,p.idcard  from SignFamily a,Patient p where (a.doctor = ?1 or a.doctorHealth = ?1) and a.type = ?2 and p.name like ?3 and a.patient = p.code and a.status in (1,2,3)")
	List<Object> findDoctorSignPatientsByTypeName(String doctor, int type, String name);
	@Query("select a from SignFamily a where a.patient = ?1 and a.type =2 and a.status >= 0")
	SignFamily findByPatient(String patient);
	@Query("select a from SignFamily a where a.idcard = ?1 and a.type = 1 and a.status >= 0")
	SignFamily findBySanshiIdcard(String idcard);
	@Query("select a from SignFamily a where a.patient = ?1 and a.type = ?2 and a.status > 0")
	SignFamily findSignByPatient(String patient, int type);
	@Query(" from SignFamily a where a.patient = ?1 and a.type = ?2 and (a.status=-3 or a.status=-4)  order by a.id desc")
	List<SignFamily> findLastJySignByPatient(String patient, int type);
	@Query(" from SignFamily a where  a.type =1 and unix_timestamp(a.czrq)=unix_timestamp( ?1 )  ")
	List<SignFamily> findByDate(String s);
	@Modifying
	@Query("update SignFamily set expenses_type = ?1 where patient = ?2 and status > 0 and type = 2")
	int updateExpensesType(String expensesType, String patient);
	@Query("select count(*) from SignFamily where patient = ?1 and status > 0 and type = 1")
	int countPatientSsSign(String patient);
	@Query("select count(*) from SignFamily where patient = ?1 and status > 0 and type = 2")
	int countPatientJtSign(String patient);
	// 查询患者已生效的家庭签约
	@Query("select a from SignFamily a where a.patient = ?1 and a.type = 2 and a.status = 0")
	SignFamily findSigningByPatient(String patient);
	//找出家庭签约中 团队是空的值
	@Query("select a from SignFamily a where a.type = 2 and a.status = 1 and a.adminTeamId is null")
	List<SignFamily> findBySignTypeAndTeamCode();
	//找出没有健康管理师的签约数据
	@Query("select a from SignFamily a where a.type = 2 and a.status >= 1 and a.doctorHealth is null and a.doctor=?1 order by a.czrq desc")
	List<SignFamily> findNoHealthSignFamilyNum(String doctor);
	//找出没有健康管理师的签约数据
	@Query("select a from SignFamily a where a.type = 2 and a.status >= 1 and a.doctorHealth is null and a.doctor=?1 order by a.czrq desc")
	Page<SignFamily> findNoHealthSignFamilyHealth(String doctor, Pageable pageRequest);
	@Query("select a from SignFamily a where a.type = ?1 and a.signSource = ?2 and a.status > 0 order by a.id")
	Page<SignFamily> findByTypeAndSignSource(Integer type, String signSource, Pageable pageable);
	@Query("select a from SignFamily a where a.type = ?1 and a.signSource = ?2 and a.status > 0 and a.id >= ?3 and a.id <= ?4 order by a.id")
	Page<SignFamily> findByTypeAndSignSourceAndId(Integer type, String signSource, Long start, Long end, Pageable pageable);
}

+ 24 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/TownDao.java

@ -0,0 +1,24 @@
/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.yihu.wlyy.statistics.dao;
import com.yihu.wlyy.statistics.model.system.Town;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
public interface TownDao extends PagingAndSortingRepository<Town, Long> {
	// 根據CODE查詢區縣名稱
	@Query("select p from Town p where p.code = ?1")
	Town findByCode(String code);
	@Query("select a from Town a where a.city = ?1 order by id")
	Iterable<Town> findByCity(String province);
	@Query("select a from Town a where a.city = ?1 order by id")
	List<Town> findByCityCode(String province);
}

+ 24 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/dao/WlyyQuotaResultDao.java

@ -0,0 +1,24 @@
package com.yihu.wlyy.statistics.dao;
import com.yihu.wlyy.statistics.model.job.WlyyQuotaResult;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
/**
 * Created by Administrator on 2016/8/16.
 */
public interface WlyyQuotaResultDao extends PagingAndSortingRepository<WlyyQuotaResult, String>, JpaSpecificationExecutor<WlyyQuotaResult> {
    @Query(" FROM WlyyQuotaResult a WHERE a.quotaDate =?1 and a.quatoCode=?2")
    List<WlyyQuotaResult> findByYesterday(String yesterday, String quatoCode);
    @Modifying
    @Query(" delete FROM WlyyQuotaResult a WHERE a.quotaDate =?1 and a.quatoCode=?2")
    void deleteByDateAndCode(String yesterday, String quatoCode);
    @Query(" FROM WlyyQuotaResult a WHERE a.level1Type =?1 and a.qkdoctorJobName != ?2 and a.quatoCode=1")
    List<WlyyQuotaResult> findByLevel1TypeAndQkdoctorJobName(String level1Type, String qkdoctorJobName);
}

+ 88 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/model/ETLModel.java

@ -0,0 +1,88 @@
package com.yihu.wlyy.statistics.etl.model;
/**
 * 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;//患者分组
    private String signExpensesStatus;//扣费状态 【0未扣费 1已扣费 2已退费】
    private String level2Key;//二级维度的key
    private String level3Key;//三级维度的key
    public String getLevel3Key() {
        return level3Key;
    }
    public void setLevel3Key(String level3Key) {
        this.level3Key = level3Key;
    }
    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;
    }
    public String getSignExpensesStatus() {
        return signExpensesStatus;
    }
    public void setSignExpensesStatus(String signExpensesStatus) {
        this.signExpensesStatus = signExpensesStatus;
    }
    public String getLevel2Key() {
        return level2Key;
    }
    public void setLevel2Key(String level2Key) {
        this.level2Key = level2Key;
    }
}

+ 68 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/role/Level1Role.java

@ -0,0 +1,68 @@
package com.yihu.wlyy.statistics.etl.role;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
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.
 * 1级维度 机构等级分组
 */
@Component
@Transactional
public class Level1Role {
    /**
     * 返回的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);
        }
    }
}

+ 67 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/role/Level2Role.java

@ -0,0 +1,67 @@
package com.yihu.wlyy.statistics.etl.role;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
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.11.
 * 二级维度 的公共的统计算法
 */
@Component
@Transactional
public class Level2Role {
    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= eltModel.getLevel2Key();
                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);
        }
    }
}

+ 76 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/role/Level3Role.java

@ -0,0 +1,76 @@
package com.yihu.wlyy.statistics.etl.role;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
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.11.
 * 二级维度的公共的统计算法
 */
@Component
@Transactional
public class Level3Role {
    public List<Map<String, Map<String, Map<String, List<ETLModel>>>>> elt(List<Map<String, Map<String, List<ETLModel>>>> data) throws  Exception{
        List<Map<String, Map<String, Map<String, List<ETLModel>>>>> returnMapsList=new ArrayList<Map<String, Map<String, Map<String, List<ETLModel>>>>>();
        Map<String, Map<String, Map<String, List<ETLModel>>>> tjCityMap = new HashMap<String, Map<String, Map<String, List<ETLModel>>>>();//市级的统计map key 是区行政区划350200
        Map<String, Map<String, Map<String, List<ETLModel>>>> tjTownMap = new HashMap<String, Map<String, Map<String, List<ETLModel>>>>();//区级的统计map key 是区行政区划350206
        Map<String, Map<String, Map<String, List<ETLModel>>>> tjOrgMap = new HashMap<String, Map<String, Map<String, List<ETLModel>>>>();//机构的统计map key 是机构的code
        Map<String, Map<String, Map<String, List<ETLModel>>>> tjAdminTeamMap = new HashMap<String, Map<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, Map<String, List<ETLModel>>>> tjMap, Map<String, Map<String, List<ETLModel>>> eltDateMap) throws Exception{
        //遍历数据Map
        for(Map.Entry<String, Map<String, List<ETLModel>>> oneData:eltDateMap.entrySet()){
            Map<String, List<ETLModel>> datasOne=oneData.getValue();//得到数据列表 全部区或者市或者机构或者区的数据
            Map<String, Map<String, List<ETLModel>>> childrens=new HashMap<String, Map<String, List<ETLModel>>>();//返回的map
            for(Map.Entry<String, List<ETLModel>> datasTwo:datasOne.entrySet()){
                 //如果
                 List<ETLModel> datasTwoList=datasTwo.getValue();
                 //做三级维度的数据计算
                 Map<String, List<ETLModel>> newThreeDataMap=new HashMap<String, List<ETLModel>>();
                 for(ETLModel etlModel:datasTwoList){
                      if(newThreeDataMap.containsKey(etlModel.getLevel3Key())){
                          newThreeDataMap.get(etlModel.getLevel3Key()).add(etlModel);
                      }else{
                          List<ETLModel> newThreeDataList=new ArrayList<ETLModel>();
                          newThreeDataList.add(etlModel);
                          newThreeDataMap.put(etlModel.getLevel3Key(),newThreeDataList);
                      }
                 }
                //把三级维度统计好的数据加入到二级维度的Map去
                childrens.put(datasTwo.getKey(),newThreeDataMap);
            }
            //把二级维度的数据加入到一级维度里面去
            tjMap.put(oneData.getKey(),childrens);
        }
    }
}

+ 88 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/role/PatientAgeRole.java

@ -0,0 +1,88 @@
package com.yihu.wlyy.statistics.etl.role;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.job.Constant;
import com.yihu.wlyy.statistics.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;
        }
    }
}

+ 72 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/role/PatientGroupRole.java

@ -0,0 +1,72 @@
package com.yihu.wlyy.statistics.etl.role;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
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);
        }
    }
}

+ 69 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/role/PatientSexRole.java

@ -0,0 +1,69 @@
package com.yihu.wlyy.statistics.etl.role;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.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);
        }
    }
}

+ 682 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/storage/DBStorage.java

@ -0,0 +1,682 @@
package com.yihu.wlyy.statistics.etl.storage;
import com.yihu.wlyy.statistics.dao.DoctorAdminTeamDao;
import com.yihu.wlyy.statistics.dao.HospitalDao;
import com.yihu.wlyy.statistics.dao.TownDao;
import com.yihu.wlyy.statistics.dao.WlyyQuotaResultDao;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.job.Constant;
import com.yihu.wlyy.statistics.model.hosptial.Hospital;
import com.yihu.wlyy.statistics.model.job.WlyyQuotaResult;
import com.yihu.wlyy.statistics.model.system.City;
import com.yihu.wlyy.statistics.model.system.Town;
import com.yihu.wlyy.statistics.model.team.AdminTeam;
import com.yihu.wlyy.statistics.util.DateUtil;
import com.yihu.wlyy.statistics.vo.WlyyQuotaVO;
import org.springframework.beans.factory.annotation.Autowired;
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 用户分组 4.签约费用
     */
    public void saveByLevel2(List<Map<String, Map<String, List<ETLModel>>>> data, String day, WlyyQuotaVO wlyyQuota,Integer foreachNum,Integer type) throws Exception{
        Integer start=1;
        this.wlyyQuota=wlyyQuota;
        level2Public(data, day, foreachNum, type, start);
    }
    /**
     * 保存二级维度
     * @param data
     * @param day
     * @param wlyyQuota
     * @param foreachNum 如果start是默认的 标识二级维度循环的次数  例如 年龄就传6  性别就传3
     * @param type 1 性别 2 年龄 3 用户分组 4.签约费用
     * @param start 起始位置 默认是1
     */
    public void saveByLevel2(List<Map<String, Map<String, List<ETLModel>>>> data, String day, WlyyQuotaVO wlyyQuota,Integer foreachNum,Integer type,Integer start)throws Exception {
        this.wlyyQuota=wlyyQuota;
        level2Public(data, day, foreachNum, type, start);
    }
    /**
     * 保存三级维度
     * @param data
     * @param day
     * @param wlyyQuota
     * @param foreachNum2 标识二级维度循环的次数  例如 年龄就传6  性别就传3
     * @param foreachNum3 标识三级维度循环的次数  例如 年龄就传6  性别就传3
     * @param type 1 性别 2 年龄 3 用户分组 4.签约费用
     */
    public void saveByLevel3(List<Map<String, Map<String, Map<String, List<ETLModel>>>>> data, String day, WlyyQuotaVO wlyyQuota,Integer foreachNum2,Integer foreachNum3,Integer type) throws Exception{
        Integer start2=1;
        Integer start3=1;
        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);
        //保存团队
        saveAdminTeamDataLevel3(data.get(0),day,adminTeamMap,foreachNum2,foreachNum3,type,start2,start3);
        //保存机构
        saveHospitalTeamDataLevel3(data.get(1),day,hospitalsMap,foreachNum2,foreachNum3,type,start2,start3);
        //保存区
        saveTownTeamDataLevel3(data.get(2),day,townsMap,foreachNum2,foreachNum3,type,start2,start3);
        //保存市
        saveCityTeamDataLevel3(data.get(3),day,cityMap,foreachNum2,foreachNum3,type,start2,start3);
    }
    /**
     * 保存三级维度
     * @param data
     * @param day
     * @param wlyyQuota
     * @param foreachNum2 标识二级维度循环的次数  例如 年龄就传6  性别就传3
     * @param foreachNum3 标识三级维度循环的次数  例如 年龄就传6  性别就传3
     * @param type 1 性别 2 年龄 3 用户分组 4.签约费用
     * @param start2 耳機維度起始位置 默认是1
     * @param start3 耳機維度起始位置 默认是1
     */
    public void saveByLevel3(List<Map<String, Map<String, Map<String, List<ETLModel>>>>> data, String day, WlyyQuotaVO wlyyQuota,Integer foreachNum2,Integer foreachNum3,Integer type,Integer start2,Integer start3) throws Exception{
        if(start2==null){
            start2=1;
        }
        if(start3==null){
            start2=3;
        }
        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);
        //保存团队
        saveAdminTeamDataLevel3(data.get(0),day,adminTeamMap,foreachNum2,foreachNum3,type,start2,start3);
        //保存机构
        saveHospitalTeamDataLevel3(data.get(1),day,hospitalsMap,foreachNum2,foreachNum3,type,start2,start3);
        //保存区
        saveTownTeamDataLevel3(data.get(2),day,townsMap,foreachNum2,foreachNum3,type,start2,start3);
        //保存市
        saveCityTeamDataLevel3(data.get(3),day,cityMap,foreachNum2,foreachNum3,type,start2,start3);
    }
    private void saveAdminTeamDataLevel3(Map<String, Map<String, Map<String, List<ETLModel>>>> etlModelMap, String day, Map<String, AdminTeam> adminTeamMap, Integer foreachNum2, Integer foreachNum3, Integer type, Integer start2, Integer start3) {
        //遍历团队的Map
        for(Map.Entry<String,AdminTeam> oneAdminTeam:adminTeamMap.entrySet()){
            //得到每个团队的2级维度
            Map<String, Map<String, List<ETLModel>>> twoETLMap= etlModelMap.get(oneAdminTeam.getKey());
            for(int i=start2;i<=foreachNum2;i++){
                 //得到每个团队的三级维度
                 Map<String, List<ETLModel>> threeETLMap= new HashMap<String, List<ETLModel>>();
                 if(twoETLMap!=null){
                     threeETLMap=twoETLMap.get(i);
                 }
                 for(int j=start3;j<=foreachNum3;j++){
                     int num=0;
                     List<ETLModel> etlModelList= threeETLMap.get(i);
                     if(etlModelList!=null&&etlModelList.size()>0){
                         num=etlModelList.size();
                     }
                     AdminTeam adminTeamObj = adminTeamMap.get(oneAdminTeam.getKey());//团队
                     if(adminTeamObj==null)continue;
                     String orgCodeTemp=getOrg(adminTeamObj.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=adminTeamObj.getId()+"";
                     String doctorName=adminTeamObj.getName();
                     String doctorJob="";
                     String level="1";
                     String level2=i+"";
                     String level3=j+"";
                     String level3Name=getLevel3Name(level3,type);
                     save(num, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level,level2,null,level3,level3Name,day);
                }
            }
        }
    }
    private void saveHospitalTeamDataLevel3(Map<String, Map<String, Map<String, List<ETLModel>>>> etlModelMap, String day, Map<String, Hospital> hospitalsMap, Integer foreachNum2, Integer foreachNum3, Integer type, Integer start2, Integer start3) {
        //遍历团队的Map
        for(Map.Entry<String,Hospital> oneHospital:hospitalsMap.entrySet()){
            //得到每个团队的2级维度
            Map<String, Map<String, List<ETLModel>>> twoETLMap= etlModelMap.get(oneHospital.getKey());
            for(int i=start2;i<=foreachNum2;i++){
                //得到每个团队的三级维度
                Map<String, List<ETLModel>> threeETLMap= new HashMap<String, List<ETLModel>>();
                if(twoETLMap!=null){
                    threeETLMap=twoETLMap.get(i);
                }
                for(int j=start3;j<=foreachNum3;j++){
                    int num=0;
                    List<ETLModel> etlModelList= threeETLMap.get(i);
                    if(etlModelList!=null&&etlModelList.size()>0){
                        num=etlModelList.size();
                    }
                    Hospital hospital = hospitalsMap.get(oneHospital.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="1";
                    String level2=i+"";
                    String level3=j+"";
                    String level3Name=getLevel3Name(level3,type);
                    save(num, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level,level2,null,level3,level3Name,day);
                }
            }
        }
    }
    private void saveTownTeamDataLevel3(Map<String, Map<String, Map<String, List<ETLModel>>>> etlModelMap, String day, Map<String, Town> townsMap, Integer foreachNum2, Integer foreachNum3, Integer type, Integer start2, Integer start3) {
        //遍历团队的Map
        for(Map.Entry<String,Town> oneTownTeam:townsMap.entrySet()){
            //得到每个团队的2级维度
            Map<String, Map<String, List<ETLModel>>> twoETLMap= etlModelMap.get(oneTownTeam.getKey());
            for(int i=start2;i<=foreachNum2;i++){
                //得到每个团队的三级维度
                Map<String, List<ETLModel>> threeETLMap= new HashMap<String, List<ETLModel>>();
                if(twoETLMap!=null){
                    threeETLMap=twoETLMap.get(i);
                }
                for(int j=start3;j<=foreachNum3;j++){
                    int num=0;
                    List<ETLModel> etlModelList= threeETLMap.get(i);
                    if(etlModelList!=null&&etlModelList.size()>0){
                        num=etlModelList.size();
                    }
                    Town townObj=townsMap.get(oneTownTeam.getKey());
                    if(townObj==null)continue;
                    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="1";
                    String level2=i+"";
                    String level3=j+"";
                    String level3Name=getLevel3Name(level3,type);
                    save(num, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level,level2,null,level3,level3Name,day);
                }
            }
        }
    }
    private void saveCityTeamDataLevel3(Map<String, Map<String, Map<String, List<ETLModel>>>> etlModelMap, String day, Map<String, City> cityMap, Integer foreachNum2, Integer foreachNum3, Integer type, Integer start2, Integer start3) {
        //遍历团队的Map
        for(Map.Entry<String,City> oneCityTeam:cityMap.entrySet()){
            //得到每个团队的2级维度
            Map<String, Map<String, List<ETLModel>>> twoETLMap= etlModelMap.get(oneCityTeam.getKey());
            for(int i=start2;i<=foreachNum2;i++){
                //得到每个团队的三级维度
                Map<String, List<ETLModel>> threeETLMap= new HashMap<String, List<ETLModel>>();
                if(twoETLMap!=null){
                    threeETLMap=twoETLMap.get(i);
                }
                for(int j=start3;j<=foreachNum3;j++){
                    int num=0;
                    List<ETLModel> etlModelList= threeETLMap.get(i);
                    if(etlModelList!=null&&etlModelList.size()>0){
                        num=etlModelList.size();
                    }
                    String city=Constant.city;
                    String cityName=Constant.cityName;
                    String town="";
                    String townName="";
                    String org="";
                    String orgName="";
                    String doctorCode="";
                    String doctorName="";
                    String doctorJob="";
                    String level="1";
                    String level2=i+"";
                    String level3=j+"";
                    String level3Name=getLevel3Name(level3,type);
                    save(num, city, cityName, town, townName, org, orgName, doctorCode, doctorName, doctorJob, level,level2,null,level3,level3Name,day);
                }
            }
        }
    }
    private void level2Public(List<Map<String, Map<String, List<ETLModel>>>> data, String day, Integer foreachNum, Integer type, Integer start)throws Exception {
        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,start);
        //保存机构
        saveHospitalTeamDataLevel2(data.get(1),day,hospitalsMap,foreachNum,type,start);
        //保存区
        saveTownTeamDataLevel2(data.get(2),day,townsMap,foreachNum,type,start);
        //保存市
        saveCityTeamDataLevel2(data.get(3),day,cityMap,foreachNum,type,start);
    }
    private void saveCityTeamDataLevel2(Map<String, Map<String, List<ETLModel>>> etlModelMap, String day, Map<String, City> citysMap ,Integer foreachNum,Integer type,Integer start) {
         for(Map.Entry<String,City> oneCity:citysMap.entrySet()){
             Map<String, List<ETLModel>> oneELTMap= etlModelMap.get(oneCity.getKey());
             for(int i=start;i<=foreachNum;i++){
                 int num=0;
                 if(oneELTMap!=null){
                     List<ETLModel> etlModel= oneELTMap.get(i+"");
                     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,Integer start) {
        for(Map.Entry<String,Town> oneTown:townsMap.entrySet()){
            Map<String, List<ETLModel>> oneELTMap= etlModelMap.get(oneTown.getKey());
            for(int i=start;i<=foreachNum;i++){
                int num=0;
                if(oneELTMap!=null){
                    List<ETLModel> etlModel= oneELTMap.get(i+"");
                    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,Integer start) {
        for(Map.Entry<String,Hospital> oneHospital:hospitalsMap.entrySet()){
            Map<String, List<ETLModel>> oneELTMap= etlModelMap.get(oneHospital.getKey());
            for(int i=start;i<=foreachNum;i++){
                int num=0;
                if(oneELTMap!=null){
                    List<ETLModel> etlModel= oneELTMap.get(i+"");
                    if(etlModel!=null&&etlModel.size()>0){
                        num=etlModel.size();
                    }
                }
                Hospital hospital = oneHospital.getValue();//得到全科医生的机构
                if(hospital==null)continue;
                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,Integer start) {
        for(Map.Entry<String,AdminTeam> adminTeam:adminTeamMap.entrySet()){
            Map<String, List<ETLModel>> oneELTMap= etlModelMap.get(adminTeam.getKey());
            for(int i=start;i<=foreachNum;i++){
                int num=0;
                if(oneELTMap!=null){
                    List<ETLModel> etlModel= oneELTMap.get(i+"");
                    if(etlModel!=null&&etlModel.size()>0){
                        num=etlModel.size();
                    }
                }
                AdminTeam adminTeamObj = adminTeamMap.get(adminTeam.getKey());//团队
                if(adminTeamObj==null)continue;
                String orgCodeTemp=getOrg(adminTeamObj.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=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());//得到全科医生
            if(adminTeam==null)continue;
            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=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;
            if(hospital==null)continue;
            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);
            }
            case  4:{
                //费用类别
                return Constant.getLevelExpenseName(i);
            }
            default:{
                return "";
            }
        }
    }
    private String getLevel3Name(String j, Integer type) {
        switch (type){
            case  1:{
                //签约费用
                return Constant.getLevelExpenseName(j);
            }
            default:{
                return "";
            }
        }
    }
}

+ 313 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/storage/RedisStorage.java

@ -0,0 +1,313 @@
package com.yihu.wlyy.statistics.etl.storage;
import com.yihu.wlyy.statistics.dao.DoctorAdminTeamDao;
import com.yihu.wlyy.statistics.dao.HospitalDao;
import com.yihu.wlyy.statistics.dao.TownDao;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.job.Constant;
import com.yihu.wlyy.statistics.model.hosptial.Hospital;
import com.yihu.wlyy.statistics.model.system.City;
import com.yihu.wlyy.statistics.model.system.Town;
import com.yihu.wlyy.statistics.model.team.AdminTeam;
import com.yihu.wlyy.statistics.util.DateUtil;
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 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++){
                AdminTeam adminTeamObj=adminTeam.getValue();
                if(adminTeamObj==null)continue;
                JSONObject jo=new JSONObject();
                int num=0;
                if(oneELTMap!=null){
                    List<ETLModel> etlModel= oneELTMap.get(i+"");
                    if(etlModel!=null&&etlModel.size()>0){
                        num=etlModel.size();
                    }
                }
                jo.put("date", DateUtil.dateToStrLong(new Date()));
                jo.put("num", num);
                jo.put("teamName", adminTeamObj.getName());
                jo.put("teamId", adminTeamObj.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++){
                Hospital hospitalObj=hospital.getValue();
                if(hospitalObj==null)continue;
                JSONObject jo=new JSONObject();
                int num=0;
                if(oneELTMap!=null){
                    List<ETLModel> etlModel= oneELTMap.get(i+"");
                    if(etlModel!=null&&etlModel.size()>0){
                        num=etlModel.size();
                    }
                }
                jo.put("date", DateUtil.dateToStrLong(new Date()));
                jo.put("num", num);
                jo.put("orgName", hospitalObj.getName());
                jo.put("orgCode", hospitalObj.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();
                int num=0;
                if(oneELTMap!=null){
                    List<ETLModel> etlModel= oneELTMap.get(i+"");
                    if(etlModel!=null&&etlModel.size()>0){
                        num=etlModel.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();
                int num=0;
                if(oneELTMap!=null){
                    List<ETLModel> etlModel= oneELTMap.get(i+"");
                    if(etlModel!=null&&etlModel.size()>0){
                        num=etlModel.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;
            AdminTeam adminTeamObj=entry.getValue();
            if(adminTeamObj==null)continue;
            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", adminTeamObj.getName());
            jo.put("teamId", adminTeamObj.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()){
            Hospital hospital=entry.getValue();
            if(hospital==null)continue;
            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", hospital.getName());
            jo.put("orgCode", hospital.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 "";
            }
        }
    }
}

+ 227 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/AllSignExpenseStatusJob.java

@ -0,0 +1,227 @@
package com.yihu.wlyy.statistics.job;
import com.yihu.wlyy.statistics.dao.*;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.etl.role.Level1Role;
import com.yihu.wlyy.statistics.etl.role.Level2Role;
import com.yihu.wlyy.statistics.etl.storage.DBStorage;
import com.yihu.wlyy.statistics.model.hosptial.Hospital;
import com.yihu.wlyy.statistics.model.job.QuartzJobLog;
import com.yihu.wlyy.statistics.model.signfamily.SignFamily;
import com.yihu.wlyy.statistics.model.system.Town;
import com.yihu.wlyy.statistics.model.team.AdminTeam;
import com.yihu.wlyy.statistics.vo.WlyyJobConfigVO;
import com.yihu.wlyy.statistics.vo.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.11.
 * 签约费用统计 到达量
 */
@Component
public class AllSignExpenseStatusJob 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 Level1Role levelRole;
    @Autowired
    private Level2Role level2Role;
    @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='" + 14 + "'");
        //新建任务日志对象
        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();
            etlModel.setLevel2Key(signFamily.getExpensesStatus());//设置二级维度的Key
            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);
            List<Map<String, Map<String, List<ETLModel>>>>  level2Data= level2Role.elt(returnDatas);
            //保存数据
            dbStorage.saveByLevel2(level2Data,date,wlyyQuota,2,4,0);
        } catch (Exception e) {
            e.printStackTrace();
            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;
    }
}

+ 223 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/AllSignJob.java

@ -0,0 +1,223 @@
package com.yihu.wlyy.statistics.job;
import com.yihu.wlyy.statistics.dao.*;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.etl.role.Level1Role;
import com.yihu.wlyy.statistics.etl.role.Level2Role;
import com.yihu.wlyy.statistics.etl.storage.DBStorage;
import com.yihu.wlyy.statistics.model.hosptial.Hospital;
import com.yihu.wlyy.statistics.model.job.QuartzJobLog;
import com.yihu.wlyy.statistics.model.signfamily.SignFamily;
import com.yihu.wlyy.statistics.model.system.Town;
import com.yihu.wlyy.statistics.model.team.AdminTeam;
import com.yihu.wlyy.statistics.vo.WlyyJobConfigVO;
import com.yihu.wlyy.statistics.vo.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 Level1Role 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.findByJiatingSignYesterdayExpensesStatus(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){
            e.printStackTrace();
            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;
    }
}

+ 223 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/ChangeSignJob.java

@ -0,0 +1,223 @@
package com.yihu.wlyy.statistics.job;
import com.yihu.wlyy.statistics.dao.*;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.etl.role.Level1Role;
import com.yihu.wlyy.statistics.etl.role.Level2Role;
import com.yihu.wlyy.statistics.etl.storage.DBStorage;
import com.yihu.wlyy.statistics.model.hosptial.Hospital;
import com.yihu.wlyy.statistics.model.job.QuartzJobLog;
import com.yihu.wlyy.statistics.model.signfamily.SignFamily;
import com.yihu.wlyy.statistics.model.system.Town;
import com.yihu.wlyy.statistics.model.team.AdminTeam;
import com.yihu.wlyy.statistics.vo.WlyyJobConfigVO;
import com.yihu.wlyy.statistics.vo.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.*;
/**
 * 已改簽的指标执行类
 */
@Component
public class ChangeSignJob 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 Level1Role levelRole;
    @Autowired
    private DBStorage dbStorage;
    String yesterday; //起始时间
    String now;//结束时间
    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");
        now= StringUtils.isEmpty(map.get("now"))?SignJob.getDayString(0):map.get("now").toString();
        yesterday= 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='"+yesterday+"' and quato_code='"+10+"'");
        //新建任务日志对象
        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);
        }
        //找出今天的已改簽信息
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingChaangeSignYesterdayExpensesStatus(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();
        //统计有已改簽的
        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,yesterday,wlyyQuota);
        }catch (Exception e){
            e.printStackTrace();
            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("统计"+yesterday+" 的已改簽数据完成 ,数据库查询到改签数目:"+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;
    }
}

+ 158 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/Constant.java

@ -0,0 +1,158 @@
package com.yihu.wlyy.statistics.job;
/**
 * Created by Administrator on 2016.08.18.
 * 常量类
 */
public class Constant {
    public static String city="350200";
    public static String cityName="厦门市";
    //二级维度的性别
    public static String level_sex_1="1";
    public static String level_sex_2="2";
    public static String level_sex_3="3";
    public static String level_sex_1_name="女";
    public static String level_sex_2_name="男";
    public static String level_sex_3_name="未知";
    //二级维度的年龄
    public static String level_age_1="1";
    public static String level_age_2="2";
    public static String level_age_3="3";
    public static String level_age_4="4";
    public static String level_age_5="5";
    public static String level_age_6="6";
    public static String level_age_1_name="0~6";
    public static String level_age_2_name="7~18";
    public static String level_age_3_name="19~30";
    public static String level_age_4_name="31~50";
    public static String level_age_5_name="51~65";
    public static String level_age_6_name=">65";
    //二级维度的组
    public static String level_group_1="1";
    public static String level_group_2="2";
    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_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_6_name="糖尿病和高血压";
    //二级维度签约扣费
    public static String level_expense_0="0";
    public static String level_expense_1="1";
    public static String level_expense_2="2";
    public static String level_expense_0_name="未扣费";
    public static String level_expense_1_name="已扣费";
    public static String level_expense_2_name="已退费";
    //三级维度的疾病
    public static String level_disease_1="1";
    public static String level_disease_2="2";
    public static String level_disease_3="3";
    public static String level_disease_4="4";
    public static String level_disease_1_name="高血压";
    public static String level_disease_2_name="糖尿病";
    public static String level_disease_3_name="糖尿病和高血压";
    public static String level_disease_4_name="健康人群";
    public static String getLevelExpenseName(String key){
        switch (key){
            case "1":{
                return level_expense_1_name;
            }
            case "2":{
                return level_expense_2_name;
            }
            case "0":{
                return level_expense_0_name;
            }
        }
        return "";
    }
    public static String getLevelSexName(String key){
        switch (key){
            case "1":{
                return level_sex_1_name;
            }
            case "2":{
                return level_sex_2_name;
            }
            case "3":{
                return level_sex_3_name;
            }
        }
        return "";
    }
    public static String getLevelGroupName(String key){
        switch (key){
            case "1":{
                return level_group_1_name;
            }
            case "2":{
                return level_group_2_name;
            }
            case "3":{
                return level_group_3_name;
            }
            case "4":{
                return level_group_4_name;
            }
            case "5":{
                return level_group_5_name;
            }
            case "6":{
                return level_group_6_name;
            }
        }
        return "";
    }
    public static String getLevelAgeName(String key){
        switch (key){
            case "1":{
                return level_age_1_name;
            }
            case "2":{
                return level_age_2_name;
            }
            case "3":{
                return level_age_3_name;
            }
            case "4":{
                return level_age_4_name;
            }
            case "5":{
                return level_age_5_name;
            }
            case "6":{
                return level_age_6_name;
            }
        }
        return "";
    }
    public static String getLevelDiseaseName(String key){
        switch (key){
            case "1":{
                return level_disease_1_name;
            }
            case "2":{
                return level_disease_2_name;
            }
            case "3":{
                return level_disease_3_name;
            }
            case "4":{
                return level_disease_4_name;
            }
        }
        return "";
    }
}

+ 209 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/ConsultJob.java

@ -0,0 +1,209 @@
package com.yihu.wlyy.statistics.job;
import com.yihu.wlyy.statistics.dao.*;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.etl.role.Level1Role;
import com.yihu.wlyy.statistics.etl.role.Level2Role;
import com.yihu.wlyy.statistics.etl.storage.DBStorage;
import com.yihu.wlyy.statistics.model.consult.ConsultTeam;
import com.yihu.wlyy.statistics.model.hosptial.Hospital;
import com.yihu.wlyy.statistics.model.job.QuartzJobLog;
import com.yihu.wlyy.statistics.model.signfamily.SignFamily;
import com.yihu.wlyy.statistics.model.system.Town;
import com.yihu.wlyy.statistics.model.team.AdminTeam;
import com.yihu.wlyy.statistics.vo.WlyyJobConfigVO;
import com.yihu.wlyy.statistics.vo.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.*;
/**
 * 咨询模块的指标执行类
 */
@Component
public class ConsultJob implements Job {
    private WlyyQuotaVO wlyyQuota;//指标对象
    private WlyyJobConfigVO wlyyJobConfig;//配置对象
    @Autowired
    private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
    private TownDao townDao;
    @Autowired
    private ConsultTeamDao consultTeamDao;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    @Autowired
    private Level1Role levelRole;
    @Autowired
    private DBStorage dbStorage;
    String yesterday;
    String now;
    @Override
    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");
        now= StringUtils.isEmpty(map.get("now"))?SignJob.getDayString(0):map.get("now").toString();
        yesterday= 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='"+yesterday+"' and quato_code='"+3+"'");
        //新建任务日志对象
        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);
        }
        //找出今天的咨询信息
        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();
        //统计有已改簽的
        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()+",团队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()))){
                //统计站
                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()+",机构Id,医生团队的机构不存在");
                isAll=false;
                continue;
            }
            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);
            //保存数据
            dbStorage.saveByLevel1(returnDatas,yesterday,wlyyQuota);
        }catch (Exception e){
            e.printStackTrace();
            errorContent.append("统计失败:"+e.getMessage());
        }
        //保存日志
        quartzJobLog.setJobEndTime(new Date());
        quartzJobLog.setJobContent(saveContent(consultTeams,adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
        quartzJobLog.setJobType(isAll?"1":"0");
        quartzJobLogDao.save(quartzJobLog);
    }
    private String saveContent(List<ConsultTeam> consultTeams, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent,Long errorCount) {
        StringBuffer string=new StringBuffer("统计"+yesterday+" 的咨询数据完成 ,数据库查询到咨询数目:"+consultTeams.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;
    }
}

+ 1852 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/CurrentDayAllQuotaJob.java

@ -0,0 +1,1852 @@
package com.yihu.wlyy.statistics.job;
import com.yihu.wlyy.statistics.dao.*;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.etl.role.*;
import com.yihu.wlyy.statistics.etl.storage.DBStorage;
import com.yihu.wlyy.statistics.etl.storage.RedisStorage;
import com.yihu.wlyy.statistics.model.consult.ConsultTeam;
import com.yihu.wlyy.statistics.model.doctor.DoctorPatientGroupInfo;
import com.yihu.wlyy.statistics.model.hosptial.Hospital;
import com.yihu.wlyy.statistics.model.job.QuartzJobLog;
import com.yihu.wlyy.statistics.model.patient.Patient;
import com.yihu.wlyy.statistics.model.patient.PatientHealthGuidance;
import com.yihu.wlyy.statistics.model.signfamily.SignFamily;
import com.yihu.wlyy.statistics.model.system.Town;
import com.yihu.wlyy.statistics.model.team.AdminTeam;
import com.yihu.wlyy.statistics.util.DateUtil;
import com.yihu.wlyy.statistics.util.IdCardUtil;
import com.yihu.wlyy.statistics.vo.WlyyJobConfigVO;
import com.yihu.wlyy.statistics.vo.WlyyQuotaVO;
import org.json.JSONArray;
import org.json.JSONObject;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
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.util.StringUtils;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * 实时统计今天的数据
 */
@Component
public class CurrentDayAllQuotaJob implements Job {
    @Autowired
    private SignFamilyDao signFamilyDao;
    @Autowired
    private DoctorDao doctorDao;
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
    private TownDao townDao;
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private ConsultTeamDao consultTeamDao;
    @Autowired
    private PatientHealthGuidanceDao patientHealthGuidanceDao;
    @Autowired
    private DoctorPatientGroupInfoDao doctorPatientGroupInfoDao;
    @Autowired
    private PatientDao patientDao;
    @Autowired
    private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    @Autowired
    private Level1Role 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();//随访数据源
    private JdbcTemplate jdbcTemplate = new JdbcTemplate();
    private Properties systemProperties;
    List<Town> towns = null;//厦门市全部的区
    List<Hospital> hospitals = null;//系统全部的机构
    List<AdminTeam> adminTeams=null;//系统全部的团队
    Map<String, Hospital> hospitalsMap = new HashMap<String, Hospital>();
    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 {
        try {
            SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
            getSystemProperties();
            fvdataSource.setDriverClassName(systemProperties.get("fv.jdbc.driver").toString());
            fvdataSource.setUrl(systemProperties.get("fv.jdbc.url").toString());
            fvdataSource.setUsername(systemProperties.get("fv.jdbc.username").toString());
            fvdataSource.setPassword(systemProperties.get("fv.jdbc.password").toString());
            jdbcTemplate.setDataSource(fvdataSource);//初始化随访的数据源
            towns = townDao.findByCityCode(Constant.city); //查找出厦门市全部的区
            hospitals = hospitalDao.findHospitalzxFWZ(); //查找出系统全部的机构
            adminTeams=doctorAdminTeamDao.findAllTeam();//查找出系统全部的全科医生
            for (Hospital hospital : hospitals) {
                hospitalsMap.put(hospital.getCode(), hospital);
            }
            for (Town town : towns) {
                townsMap.put(town.getCode(), town);
            }
            for (AdminTeam adminTeam : adminTeams) {
                adminTeamMap.put(adminTeam.getId()+"", adminTeam);
            }
            //计算指标
            computequota();
        }catch (Exception e){
            e.printStackTrace();
            e.printStackTrace();
        }
    }
    //统计
    private void computequota() throws Exception {
        QuartzJobLog quartzJobLog =new QuartzJobLog();
        quartzJobLog.setJobStartTime(new Date());
        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");
        quartzJobLog.setJobEndTime(new Date());
        quartzJobLogDao.save(quartzJobLog);
    }
    private void computequota_12() throws Exception{
        StringBuffer errorContent=new StringBuffer();
        String now = getDayString(0);
        String tomorrow = getDayString(1);
        //找出今天的签约信息 yesterday,now
        //查找出系统全部的机构
        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.findByJiatingSignYesterdayExpensesStatus(now, tomorrow);
        //数组里面第一个是健康人群 第二个是慢病人群 第三个是65岁以上人群
        Map<String, Map<String, Map>> cityAgeMap = new HashMap<String, Map<String, Map>>();//key是市行政代码 目前只有厦门市
        Map<String,Map> temp =new HashMap<String,Map>();
        cityAgeMap.put(Constant.city, temp);
        Map<String, Map<String, Map>> townAgeMap = new HashMap<String, Map<String, Map>>();//key是区行政代码
        Map<String, Map<String, Map>> orgAgeMap = new HashMap<String, Map<String, Map>>();//key是机构代码
        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;//是否统计失败
        //统计有签约的
        for (SignFamily signFamily : signFamilys) {
            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;
            }
             town = hospital.getTown();
            int age = IdCardUtil.getAgeForIdcard(signFamily.getIdcard());//根据card解析年龄
            String ageCode = getAgeCode(age);//得到年龄的code
            boolean hasGXY = false;//有高血压
            boolean hasTNB = false;//有糖尿病
            //如果是慢病的 统计高血压的 糖尿病  1高血压,2糖尿病  糖尿病和高血压是3
            String diseaseType="";
            String jsonString = redisTemplate.opsForValue().get("disease:" + signFamily.getPatient());
            if (StringUtils.isEmpty(jsonString)) {
                diseaseType="4";//健康人群
            }else{
                //排除数据 只留下高血压和糖尿病
                List<JSONObject> jsonObjects = new ArrayList<JSONObject>();
                JSONArray redisValues = new JSONArray(jsonString);
                if(redisValues.length()>0){
                    for (Object obj : redisValues) {
                        JSONObject redisValue =  (JSONObject)(obj);
                        if(!redisValue.has("signType")){
                            continue;
                        }
                        //排除掉三师签约
                        if ("1".equals(redisValue.getString("signType"))) {
                            continue;
                        }
                        String disease = redisValue.getString("disease");
                        if (("1").equals(disease)) {
                            jsonObjects.add(redisValue);
                            hasGXY = true;//设置有高血压
                            diseaseType="1";
                        }
                        if (("2").equals(disease)) {
                            jsonObjects.add(redisValue);
                            hasTNB = true;//设置有糖尿病
                            diseaseType="2";
                        }
                    }
                    if(hasGXY&&hasTNB){
                        diseaseType="3";
                    }
                }else{
                    diseaseType="4";
                }
            }
            //统计市
            compute(cityAgeMap, Constant.city, ageCode, diseaseType);
            //统计区
            compute(townAgeMap, town, ageCode, diseaseType);
            //统计机构
            //统计站
             orgCode=hospital.getCode();
            if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                //统计站
                 orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
                //统计机构
                compute(orgAgeMap, orgCodeTemp, ageCode, diseaseType);
            } else {
                compute(orgAgeMap, hospital.getCode(), ageCode, diseaseType);
            }
            //统计数目+1
            cityCount++;
            townCount++;
            orgCount++;
            adminCount++;
        }
        //保存市级数据
        for (Map.Entry<String, Map<String, Map>> entry : cityAgeMap.entrySet()) {
            Map<String, Map> oneAgeMap = entry.getValue();
            for(int i=1;i<7;i++){
                for(int j=1;j<5;j++){
                    String key_2=i+"";
                    String key_3=j+"";
                    String name=Constant.cityName;
                    JSONObject jsonObject=new JSONObject();
                    if (oneAgeMap != null && oneAgeMap.containsKey(key_2)) {
                        Map<String,Long> key3Map=oneAgeMap.get(key_2);
                        if(key3Map!=null&&key3Map.containsKey(key_3)){
                            jsonObject.put("num",key3Map.get(key_3) + "");
                        }else{
                            jsonObject.put("num",0);
                        }
                    } else {
                        jsonObject.put("num",0);
                    }
                    jsonObject.put("name",name);
                    jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
                    redisTemplate.opsForValue().set(new StringBuffer("quota:12:4:"+i+":"+j+":"+entry.getKey()).toString(),jsonObject.toString());
                }
            }
        }
        //保存区级
        for (Map.Entry<String, Town> entry : townsMap.entrySet()) {
            //判断该区是否有统计数据
            Map<String, Map> oneAgeMap = townAgeMap.get(entry.getKey());//得到当个区的统计数据
            Town townObj = entry.getValue();//得到区级信息
            for(int i=1;i<7;i++){
                for(int j=1;j<5;j++){
                    String key_2=i+"";
                    String key_3=j+"";
                    String name=townObj.getName();
                    JSONObject jsonObject=new JSONObject();
                    if (oneAgeMap != null && oneAgeMap.containsKey(key_2)) {
                        Map<String,Long> key3Map=oneAgeMap.get(key_2);
                        if(key3Map!=null&&key3Map.containsKey(key_3)){
                            jsonObject.put("num",(key3Map.get(key_3) + ""));
                        }else{
                            jsonObject.put("num",0);
                        }
                    } else {
                        jsonObject.put("num",0);
                    }
                    jsonObject.put("name",townObj.getName());
                    jsonObject.put("date", DateUtil.dateToStrLong(new Date()));//quota:12:2:6:1:350200
                    redisTemplate.opsForValue().set(new StringBuffer("quota:12:3:"+i+":"+j+":"+entry.getKey()).toString(),jsonObject.toString());
                }
            }
        }
        //保存机构级
        for (Map.Entry<String, Hospital> entry : hospitalsMap.entrySet()) {
            //判断该机构是否有统计数据
            Map<String, Map> oneAgeMap = orgAgeMap.get(entry.getKey());//得到当个机构的统计数据
            Hospital hospital = entry.getValue();//得到机构信息
            for(int i=1;i<7;i++){
                for(int j=1;j<5;j++){
                    String key_2=i+"";
                    String key_3=j+"";
                    String name=hospital.getName();
                    JSONObject jsonObject=new JSONObject();
                    if (oneAgeMap != null && oneAgeMap.containsKey(key_2)) {
                        Map<String,Long> key3Map=oneAgeMap.get(key_2);
                        if(key3Map!=null&&key3Map.containsKey(key_3)){
                            jsonObject.put("num",(key3Map.get(key_3) + ""));
                        }else{
                            jsonObject.put("num",0);
                        }
                    } else {
                        jsonObject.put("num",0);
                    }
                    jsonObject.put("name",name);
                    jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
                    redisTemplate.opsForValue().set(new StringBuffer("quota:12:2:"+i+":"+j+":"+entry.getKey()).toString(),jsonObject.toString());
                }
            }
        }
        saveContent("12",signFamilys.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("-----------12----------");
    }
    private void compute(Map<String, Map<String, Map>> rootMap, String rootKey, String ageCode, String diseaseType) {
        if (rootMap.containsKey(rootKey)) {
            //得到市下面的所有的年龄map
            Map<String, Map> groupMapTemp = rootMap.get(rootKey);
            if(groupMapTemp.containsKey(ageCode)){
                //得到这个年龄下的患者map
                Map<String,Long> mape= groupMapTemp.get(ageCode);
                if(mape.containsKey(diseaseType)){
                    mape.put(diseaseType,mape.get(diseaseType)+1L);
                }else{
                    mape.put(diseaseType,1L);
                }
            }else{
                //新增疾病的统计map
                Map<String, Long> groupMapTemp1 = new HashMap<String, Long>();
                groupMapTemp1.put(diseaseType, 1L);
                groupMapTemp.put(ageCode,groupMapTemp1);
            }
        } else {
            //没有就新建统计数据  新增疾病的统计map
            Map<String, Long> groupMapTemp = new HashMap<String, Long>();
            groupMapTemp.put(diseaseType, 1L);
            //把统计疾病的map放入对应的年龄组map中
            Map<String, Map> groupMapTemp2 = new HashMap<String, Map>();
            groupMapTemp2.put(ageCode,groupMapTemp);
            //把年龄组map放入市的map里面
            rootMap.put(rootKey, groupMapTemp2);
        }
    }
    private void computequota_1() {
        StringBuffer errorContent=new StringBuffer();
        //找出今天的签约信息 yesterday,now
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterdayExpensesStatus(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数据不存在");
                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);
            //保存数据
            redisStorage.saveByLevel1(returnDatas,"1");
        }catch (Exception e){
            e.printStackTrace();
            errorContent.append("统计失败:"+e.getMessage());
        }
        saveContent("1",signFamilys.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("-----------1----------");
    }
    private void computequota_2() {
        StringBuffer errorContent=new StringBuffer();
        String quotaId="2";
        //找出今天的解约信息
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterdayExpensesStatus(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数据不存在");
                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);
            //保存数据
            redisStorage.saveByLevel1(returnDatas,quotaId);
        }catch (Exception e){
            e.printStackTrace();
            errorContent.append("统计失败:"+e.getMessage());
        }
        saveContent(quotaId,signFamilys.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("----------2-----------");
    }
    private void computequota_3() {
        StringBuffer errorContent=new StringBuffer();
        String quotaId="3";
        //找出今天的咨询信息
        List<ConsultTeam> consultTeams = consultTeamDao.findByCzrqyYesterday(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(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()+",团队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()))){
                //统计站
                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()+",机构Id:"+hospital.getId()+",医生团队的机构不存在");
                isAll=false;
                continue;
            }
            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){
            e.printStackTrace();
            errorContent.append("统计失败:"+e.getMessage());
        }
        saveContent(quotaId,consultTeams.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("----------3-----------");
    }
    private void computequota_4() {
        StringBuffer errorContent=new StringBuffer();
        String quotaId="4";
        //找出今天的随访信息
        List<Map<String,Object>> plans = getFvYesterday();
        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;
            }
            //统计机构
            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;
            }
            String town =hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("随访id:"+plan.get("id")+",机构Id:"+hospital.getId()+",机构表的中的town为空");
                isAll=false;
                errorCount++;
                continue;
            }
            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){
            e.printStackTrace();
            errorContent.append("统计失败:"+e.getMessage());
        }
        saveContent(quotaId,plans.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("-----------4----------");
    }
    private void computequota_5() {
        StringBuffer errorContent=new StringBuffer();
        String quotaId="5";
        List<PatientHealthGuidance> patientHealthGuidances = patientHealthGuidanceDao.findByCzrqyYesterday(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(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()+",患者code:"+patient+",家庭签约不存在");
                isAll=false;
                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()+",咨询的家庭签约的团队不存在");
                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()))){
                //统计站
                orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
            }else{
                //统计社区
                orgCodeTemp=orgCode;
            }
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                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;
            }
            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){
            e.printStackTrace();
            errorContent.append("统计失败:"+e.getMessage());
        }
        saveContent(quotaId,patientHealthGuidances.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("-----------5----------");
    }
    private void computequota_6() throws Exception {
        StringBuffer errorContent=new StringBuffer();
        String quotaId="6";
        //找出今天的签约信息
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterdayExpensesStatus(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数据不存在");
                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.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){
            e.printStackTrace();
            errorContent.append("统计失败:"+e.getMessage());
        }
        saveContent(quotaId,signFamilys.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("-----------6----------");
    }
    private void computequota_7() {
        StringBuffer errorContent=new StringBuffer();
        String quotaId="7";
        String now = getDayString(0);
        String tomorrow = getDayString(1);
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterdayExpensesStatus(now, tomorrow);
        errorContent.append("截止时间:"+now+"-"+DateUtil.dateToStrLong(new Date())+",数据库查询的签约数是:"+signFamilys.size()+",错误:");
        //查找出系统全部的患者
        List<Patient> patients = patientDao.findAllSignPatient();
        Map<String, Patient> patientsMap = new HashMap<String, Patient>();
        for (Patient patient : patients) {
            patientsMap.put(patient.getCode(), patient);
        }
        Map<String, Map<String, Long>> cityGroupMap = new HashMap<String, Map<String, Long>>();//key是市行政代码 目前只有厦门市
        cityGroupMap.put(Constant.city,new HashMap<String, Long>());
        Map<String, Map<String, Long>> townGroupMap = new HashMap<String, Map<String, Long>>();//key是区行政代码
        Map<String, Map<String, Long>> orgGroupMap = new HashMap<String, Map<String, Long>>();//key是机构代码
        //得到所有的签约病人的分组信息
        List<DoctorPatientGroupInfo> doctorPatientGroupInfos = doctorPatientGroupInfoDao.findAllPatient();
        Map<String, String> groupMap = new HashMap<String, String>();
        for (DoctorPatientGroupInfo doctorPatientGroupInfo : doctorPatientGroupInfos) {
            groupMap.put(doctorPatientGroupInfo.getPatient(), doctorPatientGroupInfo.getGroup());
        }
        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;//是否统计失败
        //统计有签约的
        for (SignFamily signFamily : signFamilys) {
            String patient=signFamily.getPatient();
            String group = groupMap.get(patient);//得到该签约病人的所在分组 1 普通 2 慢病 3是 65岁以上人群
            Hospital hospital = hospitalsMap.get(getOrg(signFamily.getHospital()));//得到患者签约的机构
            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=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;
            }
            town = hospital.getTown();
            //统计市  现在只有厦门市 默认先写死 后面再改
            if (cityGroupMap.containsKey(Constant.city)) {
                Map<String, Long> groupMapTemp = cityGroupMap.get(Constant.city);
                groupMapTemp.put(group,(groupMapTemp.get(group)==null?0l:groupMapTemp.get(group))  + 1);
                cityGroupMap.put(Constant.city, groupMapTemp);
            } else {
                Map<String, Long> groupMapTemp = new HashMap<String, Long>();
                groupMapTemp.put(group, 1L);
                cityGroupMap.put(Constant.city, groupMapTemp);
            }
            //统计区
            if (townGroupMap.containsKey(town)) {
                Map<String, Long> groupMapTemp = townGroupMap.get(town);
                groupMapTemp.put(group, (groupMapTemp.get(group)==null?0l:groupMapTemp.get(group))+ 1);
                townGroupMap.put(town, groupMapTemp);
            } else {
                Map<String, Long> groupMapTemp = new HashMap<String, Long>();
                groupMapTemp.put(group, 1L);
                townGroupMap.put(town, groupMapTemp);
            }
            //统计机构
            if (orgGroupMap.containsKey(hospital.getCode())) {
                Map<String, Long> groupMapTemp = orgGroupMap.get(hospital.getCode());
                groupMapTemp.put(group, (groupMapTemp.get(group)==null?0l:groupMapTemp.get(group)) + 1);
                orgGroupMap.put(hospital.getCode(), groupMapTemp);
            } else {
                Map<String, Long> groupMapTemp = new HashMap<String, Long>();
                groupMapTemp.put(group, 1L);
                orgGroupMap.put(hospital.getCode(), groupMapTemp);
            }
            boolean hasGXY = false;//有高血压
            boolean hasTNB = false;//有糖尿病
            if ("2".equals(group)) {
                //如果是慢病的 统计高血压的 糖尿病  1高血压,2糖尿病
                String jsonString = redisTemplate.opsForValue().get("disease:" + patient);
                if (StringUtils.isEmpty(jsonString)) {
                    continue;
                }
                //排除数据 只留下高血压和糖尿病
                List<JSONObject> jsonObjects = new ArrayList<JSONObject>();
                JSONArray redisValues = new JSONArray(jsonString);
                for (Object obj : redisValues) {
                    JSONObject redisValue = (JSONObject)(obj);
                    if(!redisValue.has("signType")){
                        continue;
                    }
                    //排除掉三师签约
                    if ("1".equals(redisValue.getString("signType"))) {
                        continue;
                    }
                    String disease = redisValue.getString("disease");
                    if ("1".equals(disease)) {
                        jsonObjects.add(redisValue);
                        hasGXY = true;//设置有高血压
                    }
                    if ("2".equals(disease)) {
                        jsonObjects.add(redisValue);
                        hasTNB = true;//设置有糖尿病
                    }
                }
                if(jsonObjects.size()==0){
                    continue;//如果没有高血压和糖尿病 不统计
                }
                if (hasGXY && hasTNB) {
                    group = "6";//有高血压又有糖尿病
                } else {
                    group = Integer.valueOf(jsonObjects.get(0).get("disease").toString()) + 3 + "";//4高血压,5糖尿病
                }
                if (cityGroupMap.containsKey(Constant.city)) {
                    Map<String, Long> groupMapTemp = cityGroupMap.get(Constant.city);
                    groupMapTemp.put(group, (groupMapTemp.get(group) == null ? 0l : groupMapTemp.get(group)) + 1);
                    cityGroupMap.put(Constant.city, groupMapTemp);
                } else {
                    Map<String, Long> groupMapTemp = new HashMap<String, Long>();
                    groupMapTemp.put(group, 1L);
                    cityGroupMap.put(Constant.city, groupMapTemp);
                }
                //统计区
                if (townGroupMap.containsKey(town)) {
                    Map<String, Long> groupMapTemp = townGroupMap.get(town);
                    groupMapTemp.put(group, (groupMapTemp.get(group) == null ? 0l : groupMapTemp.get(group)) + 1);
                    townGroupMap.put(town, groupMapTemp);
                } else {
                    Map<String, Long> groupMapTemp = new HashMap<String, Long>();
                    groupMapTemp.put(group, 1L);
                    townGroupMap.put(town, groupMapTemp);
                }
                //统计机构
                //统计站
                String org=hospital.getCode();
                if (!"00".equals(org.substring(org.length()-2,org.length()))) {
                    orgCodeTemp =org.substring(0,org.length()-2)+"00";
                    //统计机构
                    if (orgGroupMap.containsKey(orgCodeTemp)) {
                        Map<String, Long> groupMapTemp = orgGroupMap.get(orgCodeTemp);
                        groupMapTemp.put(group, (groupMapTemp.get(group) == null ? 0l : groupMapTemp.get(group)) + 1);
                        orgGroupMap.put(orgCodeTemp, groupMapTemp);
                    } else {
                        Map<String, Long> groupMapTemp = new HashMap<String, Long>();
                        groupMapTemp.put(group, 1L);
                        orgGroupMap.put(orgCodeTemp, groupMapTemp);
                    }
                } else {
                    //统计机构
                    if (orgGroupMap.containsKey(hospital.getCode())) {
                        Map<String, Long> groupMapTemp = orgGroupMap.get(hospital.getCode());
                        groupMapTemp.put(group, (groupMapTemp.get(group) == null ? 0l : groupMapTemp.get(group)) + 1);
                        orgGroupMap.put(hospital.getCode(), groupMapTemp);
                    } else {
                        Map<String, Long> groupMapTemp = new HashMap<String, Long>();
                        groupMapTemp.put(group, 1L);
                        orgGroupMap.put(hospital.getCode(), groupMapTemp);
                    }
                }
            }
            //统计数目+1
            cityCount++;
            townCount++;
            orgCount++;
            adminCount++;
        }
        //保存统计数据
        //保存市的统计数据
        for (Map.Entry<String, Map<String, Long>> entry : cityGroupMap.entrySet()) {
            //保存健康人群
            JSONObject jsonObject=new JSONObject();
            if (entry.getValue() != null && entry.getValue().containsKey(Constant.level_group_1)) {
                jsonObject.put("num",entry.getValue().get(Constant.level_group_1));
            } 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:1:"+entry.getKey()).toString(),jsonObject.toString());
            //保存慢病人群
            jsonObject=new JSONObject();
            if (entry.getValue() != null && entry.getValue().containsKey(Constant.level_group_2)) {
                jsonObject.put("num",entry.getValue().get(Constant.level_group_2));
            } 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:2:"+entry.getKey()).toString(),jsonObject.toString());
            //保存65岁以上人群
            jsonObject=new JSONObject();
            if (entry.getValue() != null && entry.getValue().containsKey(Constant.level_group_3)) {
                jsonObject.put("num",entry.getValue().get(Constant.level_group_3));
            } 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:3:"+entry.getKey()).toString(),jsonObject.toString());
            //保存高血压
            jsonObject=new JSONObject();
            if (entry.getValue() != null && entry.getValue().containsKey(Constant.level_group_4)) {
                jsonObject.put("num",entry.getValue().get(Constant.level_group_4));
            } 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:4:"+entry.getKey()).toString(),jsonObject.toString());
            //保存糖尿病
            jsonObject=new JSONObject();
            if (entry.getValue() != null && entry.getValue().containsKey(Constant.level_group_5)) {
                jsonObject.put("num",entry.getValue().get(Constant.level_group_5));
            } 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:5:"+entry.getKey()).toString(),jsonObject.toString());
            //保存糖尿病和高血压
            jsonObject=new JSONObject();
            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:6:"+entry.getKey()).toString(),jsonObject.toString());
        }
        //保存区级
        //保存区的统计数据
        for (Map.Entry<String, Town> townEntry : townsMap.entrySet()) {//保存健康人群
            JSONObject jsonObject=new JSONObject();
            Town town=townsMap.get(townEntry.getKey());
            Map<String, Long> oneTown= townGroupMap.get(townEntry.getKey());
            if (oneTown != null && oneTown.containsKey(Constant.level_group_1)) {
                jsonObject.put("num",oneTown.get(Constant.level_group_1));
            } 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:1:"+townEntry.getKey()).toString(),jsonObject.toString());
            //保存慢病人群
            jsonObject=new JSONObject();
            if (oneTown != null && oneTown.containsKey(Constant.level_group_2)) {
                jsonObject.put("num",oneTown.get(Constant.level_group_2));
            } 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:2:"+townEntry.getKey()).toString(),jsonObject.toString());
            //保存65岁以上人群
            jsonObject=new JSONObject();
            if (oneTown != null && oneTown.containsKey(Constant.level_group_3)) {
                jsonObject.put("num",oneTown.get(Constant.level_group_3));
            } 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:3:"+townEntry.getKey()).toString(),jsonObject.toString());
            //保存高血压
            jsonObject=new JSONObject();
            if (oneTown != null && oneTown.containsKey(Constant.level_group_4)) {
                jsonObject.put("num",oneTown.get(Constant.level_group_4));
            } 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:4:"+townEntry.getKey()).toString(),jsonObject.toString());
            //保存糖尿病
            jsonObject=new JSONObject();
            if (oneTown != null && oneTown.containsKey(Constant.level_group_5)) {
                jsonObject.put("num",oneTown.get(Constant.level_group_5));
            } 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:5:"+townEntry.getKey()).toString(),jsonObject.toString());
            //保存糖尿病和高血压
            jsonObject=new JSONObject();
            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:6:"+townEntry.getKey()).toString(),jsonObject.toString());
        }
        //保存机构
        for (Map.Entry<String, Hospital> hospitalEntry : hospitalsMap.entrySet()) {
            //保存健康人群
            Hospital hospital=hospitalsMap.get(hospitalEntry.getKey());
            if(hospital == null) continue;
            JSONObject jsonObject=new JSONObject();
            Map<String, Long> oneOrg= orgGroupMap.get(hospitalEntry.getKey());
            if (oneOrg != null && oneOrg.containsKey(Constant.level_group_1)) {
                jsonObject.put("num",oneOrg.get(Constant.level_group_1));
            } 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:1:"+hospitalEntry.getKey()).toString(),jsonObject.toString());
            //保存慢病人群
            jsonObject=new JSONObject();
            if (oneOrg != null && oneOrg.containsKey(Constant.level_group_2)) {
                jsonObject.put("num",oneOrg.get(Constant.level_group_2));
            } 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:2:"+hospitalEntry.getKey()).toString(),jsonObject.toString());
            //保存65岁以上人群
            jsonObject=new JSONObject();
            if (oneOrg != null && oneOrg.containsKey(Constant.level_group_3)) {
                jsonObject.put("num",oneOrg.get(Constant.level_group_3));
            } 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:3:"+hospitalEntry.getKey()).toString(),jsonObject.toString());
            //保存高血压
            jsonObject=new JSONObject();
            if (oneOrg != null && oneOrg.containsKey(Constant.level_group_4)) {
                jsonObject.put("num",oneOrg.get(Constant.level_group_4));
            } 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:4:"+hospitalEntry.getKey()).toString(),jsonObject.toString());
            //保存糖尿病
            jsonObject=new JSONObject();
            if (oneOrg != null && oneOrg.containsKey(Constant.level_group_5)) {
                jsonObject.put("num",oneOrg.get(Constant.level_group_5));
            } 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:5:"+hospitalEntry.getKey()).toString(),jsonObject.toString());
            //保存糖尿病和高血压
            jsonObject=new JSONObject();
            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:6:"+hospitalEntry.getKey()).toString(),jsonObject.toString());
        }
        saveContent(quotaId,signFamilys.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("----------7-----------");
    }
    private void computequota_8()throws Exception {
        StringBuffer errorContent=new StringBuffer();
        String quotaId="8";
        //找出今天的签约信息
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterdayExpensesStatus(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数据不存在");
                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.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){
            e.printStackTrace();
            errorContent.append("统计失败:"+e.getMessage());
        }
        saveContent(quotaId,signFamilys.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("----------8-----------");
    }
    private void computequota_9() {
        StringBuffer errorContent=new StringBuffer();
        String quotaId="9";
        //找出今天的待签约信息
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingWaitSignYesterdayExpensesStatus(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数据不存在");
                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);
            //保存数据
            redisStorage.saveByLevel1(returnDatas,quotaId);
        }catch (Exception e){
            e.printStackTrace();
            errorContent.append("统计失败:"+e.getMessage());
        }
        saveContent(quotaId,signFamilys.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("----------9-----------");
    }
    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.findByJiatingChaangeSignYesterdayExpensesStatus(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数据不存在");
                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);
            //保存数据
            redisStorage.saveByLevel1(returnDatas,quotaId);
        }catch (Exception e){
            e.printStackTrace();
            errorContent.append("统计失败:"+e.getMessage());
        }
        saveContent(quotaId,signFamilys.size(),adminCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount);
        allContent.append(errorContent);
        allContent.append("-----------10----------");
    }
    public Properties getSystemProperties() {
        if (systemProperties == null) {
            InputStream is = null;
            try {
                is = this.getClass().getResourceAsStream("/application.properties");
                systemProperties = new Properties();
                systemProperties.load(is);
            } catch (IOException e1) {
                e1.printStackTrace();
            } finally {
                if (is != null) {
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return systemProperties;
    }
    public static String getDayString(Integer size) {
        Date date = new Date();//取时间
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.add(calendar.DATE, size);//把日期往后增加一天.整数往后推,负数往前移动
        date = calendar.getTime(); //这个时间就是日期往后推一天的结果
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String dateString = formatter.format(date);
        return dateString;
    }
    public List<Map<String,Object>> getFvYesterday() {
        String now = getDayString(0);
        String tomorrow = getDayString(1);
        String sql=" select * from fv_plan a where unix_timestamp(a.update_time)>=unix_timestamp('"+now+"') and unix_timestamp(a.update_time)< unix_timestamp('"+tomorrow+"')  ";
        return jdbcTemplate.queryForList(sql);
    }
    /**
     * 根据年龄得到对应的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;
        }
    }
    private String getOrg(String org){
        //if(!"00".equals(org.substring(org.length()-2,org.length()))){
        if(org.length() == 10 && !org.endsWith("00")){
            return org.substring(0,org.length()-2)+"00";
        }else{
            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();
    }
}

+ 296 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/FollowUpJob.java

@ -0,0 +1,296 @@
package com.yihu.wlyy.statistics.job;
import com.yihu.wlyy.statistics.dao.*;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.etl.role.Level1Role;
import com.yihu.wlyy.statistics.etl.storage.DBStorage;
import com.yihu.wlyy.statistics.model.hosptial.Hospital;
import com.yihu.wlyy.statistics.model.job.QuartzJobLog;
import com.yihu.wlyy.statistics.model.job.WlyyQuotaResult;
import com.yihu.wlyy.statistics.model.signfamily.SignFamily;
import com.yihu.wlyy.statistics.model.system.Town;
import com.yihu.wlyy.statistics.model.team.AdminTeam;
import com.yihu.wlyy.statistics.vo.WlyyJobConfigVO;
import com.yihu.wlyy.statistics.vo.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.io.IOException;
import java.io.InputStream;
import java.util.*;
/**
 * 随访的指标执行类
 */
@Component
public class FollowUpJob implements Job {
    private WlyyQuotaVO wlyyQuota;//指标对象
    private WlyyJobConfigVO wlyyJobConfig;//配置对象
    @Autowired
    private WlyyQuotaResultDao wlyyQuotaResultDao;//指标结果Dao
    @Autowired
    private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
    private TownDao townDao;
    @Autowired
    private SignFamilyDao signFamilyDao;
    @Autowired
    private JdbcTemplate jdbcTemplate_wlyy;
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    @Autowired
    private Level1Role 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();
    private Properties systemProperties;
    String yesterday;
    String now;
    @Override
    public void execute(JobExecutionContext context)
            throws JobExecutionException {
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        getSystemProperties();
        fvdataSource.setDriverClassName( systemProperties.get("fv.jdbc.driver").toString());
        fvdataSource.setUrl( systemProperties.get("fv.jdbc.url").toString());
        fvdataSource.setUsername( systemProperties.get("fv.jdbc.username").toString());
        fvdataSource.setPassword( systemProperties.get("fv.jdbc.password").toString());
        //初始化参数
        JobDataMap map = context.getJobDetail().getJobDataMap();
        wlyyQuota = (WlyyQuotaVO) map.get("quota");
        wlyyJobConfig = (WlyyJobConfigVO) map.get("jobConfig");
        //计算指标
        jdbcTemplate.setDataSource(fvdataSource);//初始化随访的数据源
        //線刪除今天的数据
        now= StringUtils.isEmpty(map.get("now"))?SignJob.getDayString(0):map.get("now").toString();
        yesterday= StringUtils.isEmpty(map.get("yesterday"))?SignJob.getDayString(-1):map.get("yesterday").toString();
        computequota();
    }
    @Transactional
    private void computequota() {
        jdbcTemplate_wlyy.execute("delete from wlyy_quota_result where quota_date='"+yesterday+"' and quato_code='"+4+"'");
        //新建任务日志对象
        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);
        }
        //找出今天的随访信息
        List<Map<String,Object>> plans = getFvYesterday();
        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(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:,随访中的患者身份证在签约表中找不到数据");
                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;
            }
            //统计机构
            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;
            }
            String town =hospital.getTown();
            if(StringUtils.isEmpty(town)) {
                errorContent.append("随访id:"+plan.get("id")+",机构Id:"+hospital.getId()+",机构表的中的town为空");
                isAll=false;
                errorCount++;
                continue;
            }
            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);
            //保存数据
            dbStorage.saveByLevel1(returnDatas,yesterday,wlyyQuota);
        }catch (Exception e){
            e.printStackTrace();
            errorContent.append("统计失败:"+e.getMessage());
        }
        //保存日志
        quartzJobLog.setJobEndTime(new Date());
        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, Long errorCount) {
        StringBuffer string=new StringBuffer("统计"+yesterday+" 的随访完成 ,数据库查询到随访数目:"+plans.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() {
        return yesterday;
    }
    public List<Map<String,Object>> getFvYesterday() {
        String sql=" select * from fv_plan a where unix_timestamp(a.update_time)>=unix_timestamp('"+yesterday+"') and unix_timestamp(a.update_time)< unix_timestamp('"+now+"')  ";
        return jdbcTemplate.queryForList(sql);
    }
    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);
    }
    public Properties getSystemProperties() {
        if (systemProperties == null) {
            InputStream is = null;
            try {
                is = this.getClass().getResourceAsStream("/application.properties");
                systemProperties = new Properties();
                systemProperties.load(is);
            } catch (IOException e1) {
                e1.printStackTrace();
            } finally {
                if (is != null) {
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return systemProperties;
    }
    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;
        }
    }
}

+ 215 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/HealthGuideJob.java

@ -0,0 +1,215 @@
package com.yihu.wlyy.statistics.job;
import com.yihu.wlyy.statistics.dao.*;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.etl.role.Level1Role;
import com.yihu.wlyy.statistics.etl.storage.DBStorage;
import com.yihu.wlyy.statistics.model.hosptial.Hospital;
import com.yihu.wlyy.statistics.model.job.QuartzJobLog;
import com.yihu.wlyy.statistics.model.job.WlyyQuotaResult;
import com.yihu.wlyy.statistics.model.patient.PatientHealthGuidance;
import com.yihu.wlyy.statistics.model.signfamily.SignFamily;
import com.yihu.wlyy.statistics.model.system.Town;
import com.yihu.wlyy.statistics.model.team.AdminTeam;
import com.yihu.wlyy.statistics.vo.WlyyJobConfigVO;
import com.yihu.wlyy.statistics.vo.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.util.*;
/**
 * 健康指导的指标执行类
 */
@Component
public class HealthGuideJob implements Job {
    private WlyyQuotaVO wlyyQuota;//指标对象
    private WlyyJobConfigVO wlyyJobConfig;//配置对象
    @Autowired
    private WlyyQuotaResultDao wlyyQuotaResultDao;//指标结果Dao
    @Autowired
    private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
    @Autowired
    private SignFamilyDao signFamilyDao;
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
    private TownDao townDao;
    @Autowired
    private PatientHealthGuidanceDao patientHealthGuidanceDao;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    @Autowired
    private Level1Role levelRole;
    @Autowired
    private DBStorage dbStorage;
    String yesterday;
    String now;
    @Override
    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");
        now= StringUtils.isEmpty(map.get("now"))?SignJob.getDayString(0):map.get("now").toString();
        yesterday= 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='"+yesterday+"' and quato_code='"+3+"'");
        //新建任务日志对象
        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);
        }
        //找出今天的健康指导信息
        List<PatientHealthGuidance> patientHealthGuidances = patientHealthGuidanceDao.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();
        //统计有已改簽的
        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()+",患者code:"+patient+",家庭签约不存在");
                isAll=false;
                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()+",咨询的家庭签约的团队不存在");
                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()))){
                //统计站
                orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
            }else{
                //统计社区
                orgCodeTemp=orgCode;
            }
            Hospital hospital=hospitalsMap.get(orgCodeTemp);
            if(hospital == null) {
                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;
            }
            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){
            e.printStackTrace();
            errorContent.append("统计失败:"+e.getMessage());
        }
        //保存日志
        quartzJobLog.setJobEndTime(new Date());
        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, Long errorCount) {
        StringBuffer string=new StringBuffer("统计"+yesterday+" 的健康指导数据完成 ,数据库查询到健康指导数目:"+patientHealthGuidances.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() {
        return yesterday;
    }
}

+ 45 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/InstantiationTracingBeanPostProcessor.java

@ -0,0 +1,45 @@
package com.yihu.wlyy.statistics.job;
/**
 * Created by Administrator on 2016/8/16.
 * 现在用的数据库保存job不需要用这个类
 */
//@Component
public class InstantiationTracingBeanPostProcessor {
       // implements ApplicationListener<ContextRefreshedEvent> {
//
//    @Autowired
//    private SchedulerFactoryBean schedulerFactoryBean;
//    @Autowired
//    private QuotaDao quotaDao;
//    @Autowired
//    private JobConfigDao jobConfigDao;
//    private Scheduler scheduler = null;
//    @Autowired
//    private QuartzHelper quartzHelper;
//    @Override
//    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
//        try {
//            scheduler = schedulerFactoryBean.getScheduler();
//            //查询所有需要开始运行的任务的指标
//            List<QuartzJobConfig> jobConfigList=jobConfigDao.findByStatus("1");
//            for(QuartzJobConfig quartzJobConfig :jobConfigList){
//                WlyyQuota wlyyQuota=quotaDao.findOne(quartzJobConfig.getQuotaId());
//
//                WlyyQuotaVO wlyyQuotaVO= new WlyyQuotaVO();
//                WlyyJobConfigVO wlyyJobConfigVO=new WlyyJobConfigVO();
//                BeanUtils.copyProperties(wlyyQuota,wlyyQuotaVO);
//                BeanUtils.copyProperties(quartzJobConfig,wlyyJobConfigVO);
//
//                Map<String,Object> params=new HashMap<String,Object>();
//                params.put("quota",wlyyQuotaVO);
//                params.put("jobConfig",wlyyJobConfigVO);
//                quartzHelper.addJob(Class.forName(quartzJobConfig.getJobClass()), quartzJobConfig.getQuartzCron(), quartzJobConfig.getId(),params);
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
}

+ 110 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/QuartzHelper.java

@ -0,0 +1,110 @@
package com.yihu.wlyy.statistics.job;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.Map;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
@Component("quartzHelper")
public class QuartzHelper {
    @Autowired
    private SchedulerFactoryBean schedulerFactoryBean;
    private Scheduler scheduler = null;
    @PostConstruct
    public void init() {
        try {
            scheduler = schedulerFactoryBean.getScheduler();
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
    public void addJob(Class jobClass, String cronString, String jobKey,
                       Map<String, Object> params) throws Exception {
        if (!CronExpression.isValidExpression(cronString)) {
            throw new Exception("cronExpression is not a valid Expression");
        }
        try {
            JobDetail job = JobBuilder.newJob(jobClass)
                    .withIdentity("job-id:" + jobKey, "job-group:" + jobKey)
                    .build();
            JobDataMap jobDataMap = job.getJobDataMap();
            jobDataMap.putAll(params);
            CronTrigger trigger = TriggerBuilder
                    .newTrigger()
                    .withIdentity("trigger-name:" + jobKey,
                            "trigger-group:" + jobKey)
                    .withSchedule(CronScheduleBuilder.cronSchedule(cronString))
                    .build();
            scheduler.scheduleJob(job, trigger);
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
    public void removeJob(String jobKeyString) throws Exception {
        TriggerKey triggerKey = new TriggerKey("trigger-name:" + jobKeyString,
                "trigger-group:" + jobKeyString);
        JobKey jobName = new JobKey("job-group:" + jobKeyString, "job-id:"
                + jobKeyString);
        scheduler.pauseTrigger(triggerKey);// 停止触发器
        scheduler.unscheduleJob(triggerKey);// 移除触发器
        scheduler.deleteJob(jobName);// 删除任务
    }
    public boolean isExistJob(String jobKey) throws SchedulerException {
        JobKey jk = new JobKey("job-id:" + jobKey, "job-group:" + jobKey);
        if (scheduler.checkExists(jk)) {
            return true;
        } else {
            return false;
        }
    }
    /**
     * 立即执行任务。
     *
     * @param jobClass
     * @param id
     * @param params
     * @throws Exception
     */
    public void startNow(Class jobClass, String id, Map<String, Object> params) throws Exception {
        startAt(new Date(), jobClass, id, params);
    }
    /**
     * 在指定时间点执行。
     *
     * @param time
     * @param jobClass
     * @param id
     * @param params
     * @throws Exception
     */
    public void startAt(Date time, Class jobClass, String id, Map<String, Object> params) throws Exception {
        JobDetail job = JobBuilder.newJob(jobClass).
                withIdentity("job-id:" + id, "job-group:" + id)
                .build();
        JobDataMap jobDataMap = job.getJobDataMap();
        if(null != params) jobDataMap.putAll(params);
        SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger-id:" + id, "group-group:" + id)
                .startAt(time)
                .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(0))
                .build();
        scheduler.scheduleJob(job, trigger);
        scheduler.start();
    }
}

+ 438 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/SignAgeGroupDiseaseJob.java

@ -0,0 +1,438 @@
package com.yihu.wlyy.statistics.job;
import com.yihu.wlyy.statistics.dao.*;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.etl.role.Level1Role;
import com.yihu.wlyy.statistics.etl.storage.DBStorage;
import com.yihu.wlyy.statistics.model.hosptial.Hospital;
import com.yihu.wlyy.statistics.model.job.QuartzJobLog;
import com.yihu.wlyy.statistics.model.job.WlyyQuotaResult;
import com.yihu.wlyy.statistics.model.patient.PatientHealthGuidance;
import com.yihu.wlyy.statistics.model.signfamily.SignFamily;
import com.yihu.wlyy.statistics.model.system.Town;
import com.yihu.wlyy.statistics.model.team.AdminTeam;
import com.yihu.wlyy.statistics.util.IdCardUtil;
import com.yihu.wlyy.statistics.vo.WlyyJobConfigVO;
import com.yihu.wlyy.statistics.vo.WlyyQuotaVO;
import org.json.JSONArray;
import org.json.JSONObject;
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.data.redis.core.StringRedisTemplate;
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.*;
/**
 * 签约下按年龄分组后再按疾病统计
 */
@Component
public class SignAgeGroupDiseaseJob implements Job {
    private WlyyQuotaVO wlyyQuota;//指标对象
    private WlyyJobConfigVO wlyyJobConfig;//配置对象
    @Autowired
    private WlyyQuotaResultDao wlyyQuotaResultDao;//指标结果Dao
    @Autowired
    private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
    @Autowired
    private SignFamilyDao signFamilyDao;
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
    private TownDao townDao;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private StringRedisTemplate redisTemplate;
    String yesterday;
    String now;
    @Override
    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");
        now = StringUtils.isEmpty(map.get("now")) ? SignAgeGroupDiseaseJob.getDayString(0) : map.get("now").toString();
        yesterday = StringUtils.isEmpty(map.get("yesterday")) ? SignAgeGroupDiseaseJob.getDayString(-1) : map.get("yesterday").toString();
        computequotaByPatientAge();
    }
    /**
     * 机构维度患者年龄维度计算指标
     */
    @Transactional
    private void computequotaByPatientAge() {
        try {
            jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='"+yesterday+"' and quato_code='"+12+"'");
            //新建任务日志对象
            QuartzJobLog wlyyJobLog = new QuartzJobLog();
            wlyyJobLog.setJobStartTime(new Date());
            wlyyJobLog.setJobId(wlyyJobConfig.getId());
            wlyyJobLog.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);
            }
            //找出今天的签约信息
            List<SignFamily> signFamilies = signFamilyDao.findByJiatingSignYesterdayExpensesStatus(yesterday, now);
            //数组里面第一个是健康人群 第二个是慢病人群 第三个是65岁以上人群
            Map<String, Map<String, Map>> cityAgeMap = new HashMap<String, Map<String, Map>>();//key是市行政代码 目前只有厦门市
            Map<String,Map> temp =new HashMap<String,Map>();
            cityAgeMap.put(Constant.city, temp);
            Map<String, Map<String, Map>> townAgeMap = new HashMap<String, Map<String, Map>>();//key是区行政代码
            Map<String, Map<String, Map>> orgAgeMap = new HashMap<String, Map<String, Map>>();//key是机构代码
            //统计有签约的
            Long cityCount = 0L; //统计到市的数目
            Long townCount = 0L; //统计到所有区的数目
            Long orgCount = 0L;//统计到所有机构的数目
            Long qkCount = 0L;//统计到所有全科医生的数目
            Long errorCount=0L;
            boolean isAll=true;//是否统计失败
            StringBuffer errorContent=new StringBuffer();
            for (SignFamily signFamily : signFamilies) {
                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;
                }
                int age = IdCardUtil.getAgeForIdcard(idCard);//根据card解析年龄
                String ageCode = getAgeCode(age);//得到年龄的code
                boolean hasGXY = false;//有高血压
                boolean hasTNB = false;//有糖尿病
                //如果是慢病的 统计高血压的 糖尿病  1高血压,2糖尿病  3 糖尿病和高血压 4健康人群数
                String diseaseType="";
                String jsonString = redisTemplate.opsForValue().get("disease:" + signFamily.getPatient());
                if (StringUtils.isEmpty(jsonString)) {
                    diseaseType="4";//健康人群
                }else{
                    //排除数据 只留下高血压和糖尿病
                    List<JSONObject> jsonObjects = new ArrayList<JSONObject>();
                    JSONArray redisValues = new JSONArray(jsonString);
                    if(redisValues.length()>0){
                        for (Object obj : redisValues) {
                            JSONObject redisValue = (JSONObject)(obj);
                            if(!redisValue.has("signType")){
                                continue;
                            }
                            //排除掉三师签约
                            if ("1".equals(redisValue.get("signType").toString())) {
                                continue;
                            }
                            String disease =  redisValue.getString("disease");
                            if ("1".equals(disease)) {
                                jsonObjects.add(redisValue);
                                hasGXY = true;//设置有高血压
                                diseaseType="1";
                            }
                            if ("2".equals(disease)) {
                                jsonObjects.add(redisValue);
                                hasTNB = true;//设置有糖尿病
                                diseaseType="2";
                            }
                        }
                        if(hasGXY&&hasTNB){
                            diseaseType="3";//高血压和糖尿病
                        }
                    }else{
                        diseaseType="4";//健康人群
                    }
                }
                //统计市
                compute(cityAgeMap, Constant.city, ageCode, diseaseType);
                cityCount++;
                //统计区
                compute(townAgeMap, town, ageCode, diseaseType);
                townCount++;
                //统计机构
                //统计站
                orgCode=hospital.getCode();
                if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                    //统计站
                     orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
                    //统计机构
                    compute(orgAgeMap, orgCodeTemp, ageCode, diseaseType);
                } else {
                    compute(orgAgeMap, hospital.getCode(), ageCode, diseaseType);
                }
                orgCount++;
            }
            //保存统计数据
            // 保存市的统计数据
            for (Map.Entry<String, Map<String, Map>> entry : cityAgeMap.entrySet()) {
               Map<String, Map> oneAgeMap = entry.getValue();
               for(int i=1;i<7;i++){
                   for(int j=1;j<5;j++){
                       String key_2=i+"";
                       String key_3=j+"";
                       String city=Constant.city;
                       String cityName=Constant.cityName;
                       String town="";
                       String townName="";
                       String org="";
                       String orgName="";
                       save(oneAgeMap, key_2, key_3, city, cityName, town, townName, org, orgName,"4");
                   }
               }
            }
            //保存区级
            for (Map.Entry<String, Town> entry : townsMap.entrySet()) {
                //判断该区是否有统计数据
                Map<String, Map> oneAgeMap = townAgeMap.get(entry.getKey());//得到当个区的统计数据
                Town townObj = entry.getValue();//得到区级信息
                for(int i=1;i<7;i++){
                    for(int j=1;j<5;j++){
                        String key_2=i+"";
                        String key_3=j+"";
                        String city=Constant.city;
                        String cityName=Constant.cityName;
                        String town=townObj.getCode();
                        String townName=townObj.getName();
                        String org="";
                        String orgName="";
                        save(oneAgeMap, key_2, key_3, city, cityName, town, townName, org, orgName,"3");
                    }
                }
            }
            for (Map.Entry<String, Hospital> entry : hospitalsMap.entrySet()) {
                //判断该机构是否有统计数据
                Map<String, Map> oneAgeMap = orgAgeMap.get(entry.getKey());//得到当个机构的统计数据
                Hospital hospital = entry.getValue();//得到机构信息
                for(int i=1;i<7;i++){
                    for(int j=1;j<5;j++){
                        Hospital hospital1=entry.getValue();
                        if(hospital1==null)continue;
                        String key_2=i+"";
                        String key_3=j+"";
                        String city=Constant.city;
                        String cityName=Constant.cityName;
                        String town=hospital.getTown();
                        String townName=hospital.getTownName();
                        String org=hospital.getCode();
                        String orgName=hospital.getName();
                        save(oneAgeMap, key_2, key_3, city, cityName, town, townName, org, orgName,"2");
                    }
                }
            }
            wlyyJobLog.setJobEndTime(new Date());
            wlyyJobLog.setJobContent(saveContent(signFamilies,qkCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
            wlyyJobLog.setJobType(isAll?"1":"0");
            quartzJobLogDao.save(wlyyJobLog);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private String saveContent(List<SignFamily> signFamilys, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent,long errorCount) {
        StringBuffer string=new StringBuffer("统计"+yesterday+" 的签约数据完成 ,数据库查询到签约数目:"+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();
    }
    private void save(Map<String, Map> oneAgeMap, String key_2, String key_3, 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_2);
        wlyyQuotaResult.setLevel2TypeName(Constant.getLevelAgeName(key_2));
        wlyyQuotaResult.setLevel3Type(key_3);
        wlyyQuotaResult.setLevel3TypeName(Constant.getLevelDiseaseName(key_3));
        if (oneAgeMap != null && oneAgeMap.containsKey(key_2)) {
            Map<String,Long> key3Map=oneAgeMap.get(key_2);
            if(key3Map!=null&&key3Map.containsKey(key_3)){
                wlyyQuotaResult.setResult(key3Map.get(key_3) + "");
            }else{
                wlyyQuotaResult.setResult("0");
            }
        } else {
            wlyyQuotaResult.setResult("0");
        }
        wlyyQuotaResultDao.save(wlyyQuotaResult);
    }
    /**
     * 统计方案
     * @param rootMap 数据存放的map
     * @param rootKey 数据的key 机构 区  市
     * @param ageCode 年龄的key
     * @param diseaseType 疾病类型 1是高血压 2是糖尿病 3是高血压和糖尿病 4是健康人群
     */
    private void compute(Map<String, Map<String, Map>> rootMap, String rootKey, String ageCode, String diseaseType) {
        if (rootMap.containsKey(rootKey)) {
            //得到市下面的所有的年龄map
            Map<String, Map> groupMapTemp = rootMap.get(rootKey);
            if(groupMapTemp.containsKey(ageCode)){
                //得到这个年龄下的患者map
                Map<String,Long> mape= groupMapTemp.get(ageCode);
                if(mape.containsKey(diseaseType)){
                    mape.put(diseaseType,mape.get(diseaseType)+1L); //key是三级维度
                }else{
                    mape.put(diseaseType,1L); //key是三级维度
                }
            }else{
                //新增疾病的统计map
                Map<String, Long> groupMapTemp1 = new HashMap<String, Long>();
                groupMapTemp1.put(diseaseType, 1L);//key是三级维度
                groupMapTemp.put(ageCode,groupMapTemp1);//key是二级维度
            }
        } else {
            //没有就新建统计数据  新增疾病的统计map
            Map<String, Long> groupMapTemp = new HashMap<String, Long>();
            groupMapTemp.put(diseaseType, 1L); //key是三级维度
            //把统计疾病的map放入对应的年龄组map中
            Map<String, Map> groupMapTemp2 = new HashMap<String, Map>();
            groupMapTemp2.put(ageCode,groupMapTemp); //key是二级维度
            //把年龄组map放入市的map里面
            rootMap.put(rootKey, groupMapTemp2); //key是一级维度
        }
    }
    /*
    得到昨天的日期字符串  yyyy-MM-dd
     */
    public String getYesterday() {
        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();
        calendar.setTime(date);
        calendar.add(calendar.DATE, size);//把日期往后增加一天.整数往后推,负数往前移动
        date = calendar.getTime(); //这个时间就是日期往后推一天的结果
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String dateString = formatter.format(date);
        return dateString;
    }
    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 static void main(String[] args) {
        getDayString(0);
    }
}

+ 859 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/SignJob.java

@ -0,0 +1,859 @@
package com.yihu.wlyy.statistics.job;
import com.yihu.wlyy.statistics.dao.*;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.etl.role.Level1Role;
import com.yihu.wlyy.statistics.etl.role.PatientAgeRole;
import com.yihu.wlyy.statistics.etl.role.PatientGroupRole;
import com.yihu.wlyy.statistics.etl.role.PatientSexRole;
import com.yihu.wlyy.statistics.etl.storage.DBStorage;
import com.yihu.wlyy.statistics.model.doctor.DoctorPatientGroupInfo;
import com.yihu.wlyy.statistics.model.hosptial.Hospital;
import com.yihu.wlyy.statistics.model.job.QuartzJobLog;
import com.yihu.wlyy.statistics.model.job.WlyyQuotaResult;
import com.yihu.wlyy.statistics.model.patient.PatientHealthGuidance;
import com.yihu.wlyy.statistics.model.signfamily.SignFamily;
import com.yihu.wlyy.statistics.model.system.Town;
import com.yihu.wlyy.statistics.model.team.AdminTeam;
import com.yihu.wlyy.statistics.vo.WlyyJobConfigVO;
import com.yihu.wlyy.statistics.vo.WlyyQuotaVO;
import org.json.JSONArray;
import org.json.JSONObject;
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.data.redis.core.StringRedisTemplate;
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.*;
/**
 * 签约的指标执行类
 */
@Component
public class SignJob implements Job {
    private WlyyQuotaVO wlyyQuota;//指标对象
    private WlyyJobConfigVO wlyyJobConfig;//配置对象
    @Autowired
    private WlyyQuotaResultDao wlyyQuotaResultDao;//指标结果Dao
    @Autowired
    private QuartzJobLogDao quartzJobLogDao;//执行日志Dao
    @Autowired
    private SignFamilyDao signFamilyDao;
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
    private TownDao townDao;
    @Autowired
    private DoctorPatientGroupInfoDao doctorPatientGroupInfoDao;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    @Autowired
    private Level1Role levelRole;
    @Autowired
    private PatientAgeRole patientAgeRole;
    @Autowired
    private PatientGroupRole patientGroupRole;
    @Autowired
    private PatientSexRole patientSexRole;
    @Autowired
    private DBStorage dbStorage;
    String yesterday;
    String now;
    @Override
    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");
        now = StringUtils.isEmpty(map.get("now")) ? SignJob.getDayString(0) : map.get("now").toString();
        yesterday = StringUtils.isEmpty(map.get("yesterday")) ? SignJob.getDayString(-1) : map.get("yesterday").toString();
        String level1 = wlyyQuota.getLevel1();//得到一级维度
        String level2 = wlyyQuota.getLevel2();//得到二级维度
        //如果一级维度为空 不进行统计
        if (!StringUtils.isEmpty(level1)) {
            if (StringUtils.isEmpty(level2)) {
                //線刪除今天的数据
                //2级维度是空按照一级的机构唯独计算指标
                computequota();
            } else {
                switch (level2) {
                    case "1": {
                        //線刪除今天的数据
                        //患者性别
                        computequotaByPatientSex();
                        break;
                    }
                    case "2": {
                        //患者分组
                        computequotaByPatientGroup();
                        break;
                    }
                    case "3": {
                        //患者年龄
                        computequotaByPatientAge();
                        break;
                    }
                }
            }
        }
    }
    /**
     * 机构维度下患者性别维度计算指标
     */
    @Transactional
    private void computequotaByPatientSex() {
        jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='" + yesterday + "' and quato_code='" + 6 + "'");
        try{
            //新建任务日志对象
            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.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);
            }
            //找出今天的签约信息
            List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterdayExpensesStatus(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();
            //统计有已改簽的
            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.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);
                //保存数据
                dbStorage.saveByLevel2(patientSexRoleData,yesterday,wlyyQuota,3,1);
            }catch (Exception e){
                e.printStackTrace();
                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();
        }
    }
    /**
     * 机构维度患者分组维度计算指标
     */
    @Transactional
    private void computequotaByPatientGroup() {
        jdbcTemplate.execute("delete from wlyy_quota_result where quota_date='" + yesterday + "' and quato_code='" + 7 + "'");
        try {
            //数组里面第一个是健康人群 第二个是慢病人群 第三个是65岁以上人群
            Map<String, Map<String, Long>> cityGroupMap = new HashMap<String, Map<String, Long>>();//key是市行政代码 目前只有厦门市
            cityGroupMap.put(Constant.city, new HashMap<String, Long>());
            Map<String, Map<String, Long>> townGroupMap = new HashMap<String, Map<String, Long>>();//key是区行政代码
            Map<String, Map<String, Long>> orgGroupMap = new HashMap<String, Map<String, Long>>();//key是机构代码
            //新建任务日志对象
            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);
                Map<String, Long> one = new HashMap<String, Long>();
                one.put("1", 0L);
                one.put("2", 0L);
                one.put("3", 0L);
                one.put("4", 0L);
                one.put("5", 0L);
                one.put("6", 0L);
                orgGroupMap.put(hospital.getCode(), one);
            }
            //查找出厦门市全部的区
            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, Long> one = new HashMap<String, Long>();
                one.put("1", 0L);
                one.put("2", 0L);
                one.put("3", 0L);
                one.put("4", 0L);
                one.put("5", 0L);
                one.put("6", 0L);
                townGroupMap.put(town.getCode(), one);
            }
            //找出今天的签约信息
            List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterdayExpensesStatus(yesterday, now);
            Long cityCount = 0L; //统计到市的数目
            Long townCount = 0L; //统计到所有区的数目
            Long orgCount = 0L;//统计到所有机构的数目
            Long qkCount = 0L;//统计到所有全科医生的数目
            Long errorCount=0L;//错误数目
            boolean isAll=true;//是否统计失败
            StringBuffer errorContent=new StringBuffer();
            //统计有签约的
            for (SignFamily signFamily : signFamilys) {
                String patient = signFamily.getPatient();
                //设置查看病人所在分组
                List<DoctorPatientGroupInfo> dctorPatientGroupInfo = doctorPatientGroupInfoDao.findByMorenPatient(patient);
                String group ="";//得到该签约病人的所在分组 1 普通 2 慢病 3是 65岁以上人群  4是 高血压 5是糖尿病 100是高血压和糖尿病
                if (dctorPatientGroupInfo != null && dctorPatientGroupInfo.size() > 0) {
                    group=dctorPatientGroupInfo.get(0).getGroup();
                } else {
                    errorContent.append("签约code:"+signFamily.getCode()+",患者未分组");
                    group="1";
                }
                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;
                }
                //统计市  现在只有厦门市 默认先写死 后面再改
                compute_level2_2(cityGroupMap, group,Constant.city);
                cityCount++;
                //统计区
                compute_level2_2(townGroupMap, group,town);
                townCount++;
                //统计站
                orgCode=hospital.getCode();
                if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                    //统计站
                   orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
                    //统计机构
                   compute_level2_2(orgGroupMap, group,orgCodeTemp);
                } else {
                    //统计机构
                    compute_level2_2(orgGroupMap, group,hospital.getCode());
                }
                orgCount++;
                boolean hasGXY = false;//有高血压
                boolean hasTNB = false;//有糖尿病
                if ("2".equals(group)) {
                    //如果是慢病的 统计高血压的 糖尿病  1高血压,2糖尿病
                    String jsonString = redisTemplate.opsForValue().get("disease:" + patient);
                    if (StringUtils.isEmpty(jsonString)) {
                        continue;
                    }
                    //排除数据 只留下高血压和糖尿病
                    List<JSONObject> jsonObjects = new ArrayList<JSONObject>();
                    JSONArray redisValues = new JSONArray(jsonString);
                    for (Object obj : redisValues) {
                        JSONObject redisValue = (JSONObject)(obj);
                        if(!redisValue.has("signType")){
                            continue;
                        }
                        //排除掉三师签约
                        if ("1".equals(redisValue.get("signType").toString())) {
                            continue;
                        }
                        String disease =  redisValue.getString("disease");
                        if ("1".equals(disease)) {
                            jsonObjects.add(redisValue);
                            hasGXY = true;//设置有高血压
                        }
                        if ("2".equals(disease)) {
                            jsonObjects.add(redisValue);
                            hasTNB = true;//设置有糖尿病
                        }
                    }
                    if(jsonObjects.size()==0){
                        continue;//如果没有高血压和糖尿病 不统计
                    }
                    if (hasGXY && hasTNB) {
                        group = "100";//有高血压又有糖尿病
                    } else if(hasGXY){
                        group = 4 + "";//4高血压,5糖尿病
                    }else if(hasTNB){
                        group = 5 + "";//4高血压,5糖尿病
                    }
                    //统计市  现在只有厦门市 默认先写死 后面再改
                    compute_level2_2(cityGroupMap, group,Constant.city);
                    //统计区
                    compute_level2_2(townGroupMap, group,town);
                    //统计站
                    orgCode=hospital.getCode();
                    if(!"00".equals(orgCode.substring(orgCode.length()-2,orgCode.length()))){
                        //统计站
                        orgCodeTemp=orgCode.substring(0,orgCode.length()-2)+"00";
                        //统计机构
                        compute_level2_2(orgGroupMap, group,orgCodeTemp);
                    } else {
                        //统计机构
                        compute_level2_2(orgGroupMap, group,hospital.getCode());
                    }
                }
            }
            //保存统计数据
            //保存市的统计数据
            for (Map.Entry<String, Map<String, Long>> entry : cityGroupMap.entrySet()) {
                //保存健康人群
                Map<String, Long> oneMap=entry.getValue();
                for(Map.Entry<String, Long> entryCh: oneMap.entrySet()){
                    String city=entry.getKey();
                    String cityName=Constant.cityName;
                    String town="";
                    String townName="";
                    String org="";
                    String orgName="";
                    String level="4";
                    String key=entryCh.getKey();
                    save_level2_2(oneMap, city, cityName, town, townName, org, orgName, level, key);
                }
            }
            //保存区级
            //保存区的统计数据
            for (Map.Entry<String, Town> townEntry : townsMap.entrySet()) {
                //判断该区是否有统计数据
                Map<String, Long> oneTownGroupMap = townGroupMap.get(townEntry.getKey());//得到当个区的统计数据
                Town townObj = townEntry.getValue();//得到区级信息
                for(Map.Entry<String, Long> entryCh: oneTownGroupMap.entrySet()){
                    String city=entryCh.getKey();
                    String cityName=Constant.cityName;
                    String town=townObj.getCode();
                    String townName=townObj.getName();
                    String org="";
                    String orgName="";
                    String level="3";
                    String key=entryCh.getKey();
                    save_level2_2(oneTownGroupMap, city, cityName, town, townName, org, orgName, level, key);
                }
            }
            //保存机构
            for (Map.Entry<String, Hospital> hospitalEntry : hospitalsMap.entrySet()) {
                //判断该机构是否有统计数据
                Map<String, Long> oneOrgGroupMap = orgGroupMap.get(hospitalEntry.getKey());//得到当个机构的统计数据
                Hospital hospital = hospitalEntry.getValue();//得到区级信息
                for(Map.Entry<String, Long> entryCh: oneOrgGroupMap.entrySet()){
                    Hospital hospital1=hospitalEntry.getValue();
                    if(hospital1==null)continue;
                    String city=entryCh.getKey();
                    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=entryCh.getKey();
                    save_level2_2(oneOrgGroupMap, city, cityName, town, townName, org, orgName, level, key);
                }
            }
            QuartzJobLog.setJobEndTime(new Date());
            QuartzJobLog.setJobContent(saveContent(signFamilys,qkCount,orgCount,townCount,cityCount,isAll,errorContent,errorCount));
            QuartzJobLog.setJobType(isAll?"1":"0");
            quartzJobLogDao.save(QuartzJobLog);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private void save_level2_2(Map<String, Long> oneMap, 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.getLevelGroupName(key));
        if (oneMap != null && oneMap.containsKey(key)) {
            wlyyQuotaResult.setResult(oneMap.get(key) + "");
        } else {
            wlyyQuotaResult.setResult("0");
        }
        wlyyQuotaResultDao.save(wlyyQuotaResult);
    }
    private void compute_level2_2(Map<String, Map<String, Long>> cityGroupMap, String group,String key) {
        if (cityGroupMap.containsKey(key)) {
            Map<String, Long> groupMapTemp = cityGroupMap.get(key);
            groupMapTemp.put(group, (groupMapTemp.get(group) == null ? 0l : groupMapTemp.get(group)) + 1);
            cityGroupMap.put(key, groupMapTemp);
        } else {
            Map<String, Long> groupMapTemp = new HashMap<String, Long>();
            groupMapTemp.put(group, 1L);
            cityGroupMap.put(key, groupMapTemp);
        }
    }
    /**
     * 机构维度患者年龄维度计算指标
     */
    @Transactional
    private void computequotaByPatientAge() {
        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());
            //查找出系统全部的团队
            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.findByJiatingSignYesterdayExpensesStatus(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();
            //统计有已改簽的
            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.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);
                //保存数据
                dbStorage.saveByLevel2(patientAgeRoleData,yesterday,wlyyQuota,6,2);
            }catch (Exception e){
                e.printStackTrace();
                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();
        }
    }
    /**
     * 机构维度计算指标
     */
    @Transactional
    private void computequota() {
        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());
        //查找出系统全部的团队
        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);
        }
        //找出今天的签约信息 yesterday,now
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingSignYesterdayExpensesStatus(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();
        //统计有已改簽的
        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,yesterday,wlyyQuota);
        }catch (Exception e){
            e.printStackTrace();
            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);
    }
    /*
    得到昨天的日期字符串  yyyy-MM-dd
     */
    public String getYesterday() {
        return yesterday;
    }
    public static String getDayString(Integer size) {
        Date date = new Date();//取时间
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.add(calendar.DATE, size);//把日期往后增加一天.整数往后推,负数往前移动
        date = calendar.getTime(); //这个时间就是日期往后推一天的结果
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String dateString = formatter.format(date);
        return dateString;
    }
    private String saveContent(List<SignFamily> signFamilys, Long qkCount, Long orgCount, Long townCount, Long cityCount, boolean isAll, StringBuffer errorContent,Long errorCount) {
        StringBuffer string=new StringBuffer("统计"+yesterday+" 的签约数据完成 ,数据库查询到签约数目:"+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();
    }
}

+ 224 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/UnSignJob.java

@ -0,0 +1,224 @@
package com.yihu.wlyy.statistics.job;
import com.yihu.wlyy.statistics.dao.*;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.etl.role.Level1Role;
import com.yihu.wlyy.statistics.etl.storage.DBStorage;
import com.yihu.wlyy.statistics.model.hosptial.Hospital;
import com.yihu.wlyy.statistics.model.job.QuartzJobLog;
import com.yihu.wlyy.statistics.model.job.WlyyQuotaResult;
import com.yihu.wlyy.statistics.model.patient.PatientHealthGuidance;
import com.yihu.wlyy.statistics.model.signfamily.SignFamily;
import com.yihu.wlyy.statistics.model.system.Town;
import com.yihu.wlyy.statistics.model.team.AdminTeam;
import com.yihu.wlyy.statistics.vo.WlyyJobConfigVO;
import com.yihu.wlyy.statistics.vo.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.*;
/**
 * 解约的指标执行类
 */
@Component
public class UnSignJob 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 Level1Role levelRole;
    @Autowired
    private DBStorage dbStorage;
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    String yesterday;
    String now;
    @Override
    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");
        now= StringUtils.isEmpty(map.get("now"))?SignJob.getDayString(0):map.get("now").toString();
        yesterday= 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='"+yesterday+"' and quato_code='"+2+"'");
        //新建任务日志对象
        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);
        }
        //找出今天的解约信息
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingUnSignYesterdayExpensesStatus(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();
        //统计有已改簽的
        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,yesterday,wlyyQuota);
        }catch (Exception e){
            e.printStackTrace();
            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("统计"+yesterday+" 的解约数据完成 ,数据库查询到解约数目:"+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;
    }
}

+ 223 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/WaitSignJob.java

@ -0,0 +1,223 @@
package com.yihu.wlyy.statistics.job;
import com.yihu.wlyy.statistics.dao.*;
import com.yihu.wlyy.statistics.etl.model.ETLModel;
import com.yihu.wlyy.statistics.etl.role.Level1Role;
import com.yihu.wlyy.statistics.etl.storage.DBStorage;
import com.yihu.wlyy.statistics.model.hosptial.Hospital;
import com.yihu.wlyy.statistics.model.job.QuartzJobLog;
import com.yihu.wlyy.statistics.model.job.WlyyQuotaResult;
import com.yihu.wlyy.statistics.model.patient.PatientHealthGuidance;
import com.yihu.wlyy.statistics.model.signfamily.SignFamily;
import com.yihu.wlyy.statistics.model.system.Town;
import com.yihu.wlyy.statistics.model.team.AdminTeam;
import com.yihu.wlyy.statistics.vo.WlyyJobConfigVO;
import com.yihu.wlyy.statistics.vo.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.*;
/**
 * 待签约的指标执行类
 */
@Component
public class WaitSignJob 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 Level1Role levelRole;
    @Autowired
    private DBStorage dbStorage;
    String yesterday;
    String now;
    @Autowired
    private DoctorAdminTeamDao doctorAdminTeamDao;
    @Override
    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");
        now= StringUtils.isEmpty(map.get("now"))?SignJob.getDayString(0):map.get("now").toString();
        yesterday= 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='"+yesterday+"' and quato_code='"+9+"'");
        //新建任务日志对象
        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);
        }
        //找出今天的待签约信息
        List<SignFamily> signFamilys = signFamilyDao.findByJiatingWaitSignYesterdayExpensesStatus(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();
        //统计有已改簽的
        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,yesterday,wlyyQuota);
        }catch (Exception e){
            e.printStackTrace();
            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("统计"+yesterday+" 的待签约数据完成 ,数据库查询到待签约数目:"+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;
    }
}

+ 38 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/IdEntity.java

@ -0,0 +1,38 @@
/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.yihu.wlyy.statistics.model;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import java.io.Serializable;
/**
 * 统一定义id的entity基类.
 * 
 * 基类统一定义id的属性名称、数据类型、列名映射及生成策略.
 * Oracle需要每个Entity独立定义id的SEQUCENCE时,不继承于本类而改为实现一个Idable的接口。
 * 
 * @author calvin
 */
// JPA 基类的标识
@MappedSuperclass
public abstract class IdEntity implements Serializable {
	private static final long serialVersionUID = 3673803562328635206L;
	protected Long id;  // 非业务主键
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
}

+ 230 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/consult/ConsultTeam.java

@ -0,0 +1,230 @@
package com.yihu.wlyy.statistics.model.consult;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yihu.wlyy.statistics.model.IdEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.Date;
/**
 * 三师咨询
 * @author George
 */
@Entity
@Table(name = "wlyy_consult_team")
public class ConsultTeam extends IdEntity {
	private static final long serialVersionUID = -7644448339473861513L;
	private String consult;         // 咨询标识
	private String doctor;          // 医生标识
	private String team;            // 三师团队标识
	private Integer type;           //  1、三师咨询,2、家庭医生咨询,6、名医咨询
	private String patient;         // 提问者标识
	private String name;            // 患者姓名
	private Integer sex;            // 患者性别
	private Date birthday;          // 患者生日
	private String photo;           // 患者头像
	private String when;            // 发病日期
	private String symptoms;        // 主要症状
	private Integer status;         // 咨询状态(0进行中,1已完成,-1患者取消,-2超时未响应自动关闭)
	private String images;          // 咨询图片URL,多图以逗号分隔
	private String voice;           // 咨询语音URL
	private String comment;         // 用户评价标识
	private String commentContent;  // 用户评价内容
	private Integer commentStar;    // 用户评价星级
	private Integer doctorRead;     // 医生未读数量
	private Integer patientRead;    // 患者未读数量
	private Date czrq;              // 咨询时间
	private String del;             // 作废标识,1正常,0作废
	private Long adminTeamId;//行政团队ID
	@Column(name = "admin_team_code")
	public Long getAdminTeamId() {
		return adminTeamId;
	}
	public void setAdminTeamId(Long adminTeamId) {
		this.adminTeamId = adminTeamId;
	}
	public String getConsult() {
		return consult;
	}
	public void setConsult(String consult) {
		this.consult = consult;
	}
	public ConsultTeam() {
	}
	public String getDoctor() {
		return doctor;
	}
	public void setDoctor(String doctor) {
		this.doctor = doctor;
	}
	public String getTeam() {
		return team;
	}
	public void setTeam(String team) {
		this.team = team;
	}
	public Integer getType() {
		return type;
	}
	public void setType(Integer type) {
		this.type = type;
	}
	public String getPatient() {
		return patient;
	}
	public void setPatient(String patient) {
		this.patient = patient;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+08:00")
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getPhoto() {
		return photo;
	}
	public void setPhoto(String photo) {
		this.photo = photo;
	}
	@Column(name = "fbsj")
	public String getWhen() {
		return when;
	}
	public void setWhen(String when) {
		this.when = when;
	}
	public Integer getStatus() {
		return status;
	}
	public void setStatus(Integer status) {
		this.status = status;
	}
	public String getImages() {
		return images;
	}
	public void setImages(String images) {
		this.images = images;
	}
	public String getVoice() {
		return voice;
	}
	public void setVoice(String voice) {
		this.voice = voice;
	}
	public String getComment() {
		return comment;
	}
	public void setComment(String comment) {
		this.comment = comment;
	}
	@Column(name = "comment_content")
	public String getCommentContent() {
		return commentContent;
	}
	public void setCommentContent(String commentContent) {
		this.commentContent = commentContent;
	}
	@Column(name = "comment_star")
	public Integer getCommentStar() {
		return commentStar;
	}
	public void setCommentStar(Integer commentStar) {
		this.commentStar = commentStar;
	}
	@Column(name = "doctor_read")
	public Integer getDoctorRead() {
		return doctorRead;
	}
	public void setDoctorRead(Integer doctorRead) {
		this.doctorRead = doctorRead;
	}
	@Column(name = "patient_read")
	public Integer getPatientRead() {
		return patientRead;
	}
	public void setPatientRead(Integer patientRead) {
		this.patientRead = patientRead;
	}
	// 设定JSON序列化时的日期格式
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00")
	public Date getCzrq() {
		return czrq;
	}
	public void setCzrq(Date czrq) {
		this.czrq = czrq;
	}
	public String getSymptoms() {
		return symptoms;
	}
	public void setSymptoms(String symptoms) {
		this.symptoms = symptoms;
	}
	public String getDel() {
		return del;
	}
	public void setDel(String del) {
		this.del = del;
	}
	public Integer getSex() {
		return sex;
	}
	public void setSex(Integer sex) {
		this.sex = sex;
	}
}

+ 351 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/doctor/Doctor.java

@ -0,0 +1,351 @@
package com.yihu.wlyy.statistics.model.doctor;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yihu.wlyy.statistics.model.IdEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.util.Date;
/**
 * 医生信息
 * @author George
 */
@Entity
@Table(name = "wlyy_doctor")
public class Doctor extends IdEntity {
	private static final long serialVersionUID = -6585552029939285364L;
    
	private String code;        // 业务主键
	
	private String name;
	private Integer sex;        // 性别(1男,2女)
	private Date birthday;
	private String photo;
	private String mobile;
	private String password;
	private String salt;        // 密码标识
	private Integer status;     // 状态(1正常,0禁用)
	
	private String province;
	private String city;
	private String town;
	private String provinceName;
	private String cityName;
    private String townName;
	
	private String hospital;        // 医院代码
	private String hosptialName;
	private String dept;            // 科室代码
	private String deptName;
	private String job;             // 职称代码
	private String jobName;         // 职称名
	
	private String expertise;       // 医生专长
	private String introduce;       // 医生介绍
	
	private Integer level;          // 类型:1专科医生,2全科医生,3健康管理师
	private Integer iscertified;   // 资格是否认证通过,1是,0否
    private String qrcode;          // 二维码
	
	private Date czrq;              // 更新时间
	private Integer del;            // 状态(1正常,0删除)
	private String idcard;          //身份证号
	private Integer isFamous;       //是否是名医 1是  0或者空不是
	public Doctor() {}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public Doctor(Long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getSex() {
		return sex;
	}
	public void setSex(Integer sex) {
		this.sex = sex;
	}
	@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+08:00")
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getPhoto() {
		return photo;
	}
	public void setPhoto(String photo) {
		this.photo = photo;
	}
	public String getMobile() {
		return mobile;
	}
	public void setMobile(String mobile) {
		this.mobile = mobile;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getSalt() {
		return salt;
	}
	public void setSalt(String salt) {
		this.salt = salt;
	}
	public Integer getStatus() {
		return status;
	}
	public void setStatus(Integer status) {
		this.status = status;
	}
	public String getProvince() {
		return province;
	}
	public void setProvince(String province) {
		this.province = province;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getTown() {
		return town;
	}
	public void setTown(String town) {
		this.town = town;
	}
	
	@Column(name = "province_name")
	public String getProvinceName() {
		return provinceName;
	}
	public void setProvinceName(String provinceName) {
		this.provinceName = provinceName;
	}
	@Column(name = "city_name")
	public String getCityName() {
		return cityName;
	}
	public void setCityName(String cityName) {
		this.cityName = cityName;
	}
	@Column(name = "town_name")
	public String getTownName() {
		return townName;
	}
	public void setTownName(String townName) {
		this.townName = townName;
	}
	
	@Column(name = "hospital_name")
	public String getHosptialName() {
		return hosptialName;
	}
	public void setHosptialName(String hosptialName) {
		this.hosptialName = hosptialName;
	}
	@Column(name = "dept_name")
	public String getDeptName() {
		return deptName;
	}
	public void setDeptName(String deptName) {
		this.deptName = deptName;
	}
	@Column(name = "job_name")
	public String getJobName() {
		return jobName;
	}
	public void setJobName(String jobName) {
		this.jobName = jobName;
	}
	public String getHospital() {
		return hospital;
	}
	public void setHospital(String hospital) {
		this.hospital = hospital;
	}
	public String getDept() {
		return dept;
	}
	public void setDept(String dept) {
		this.dept = dept;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	public String getExpertise() {
		return expertise;
	}
	public void setExpertise(String expertise) {
		this.expertise = expertise;
	}
	public String getIntroduce() {
		return introduce;
	}
	public void setIntroduce(String introduce) {
		this.introduce = introduce;
	}
	public Integer getLevel() {
		return level;
	}
	public void setLevel(Integer level) {
		this.level = level;
	}
    @Column(name = "iscertified")
    public Integer getIscertified() {
		return iscertified;
	}
	public void setIscertified(Integer isCertified) {
		this.iscertified = isCertified;
	}
	public String getQrcode() {
		return qrcode;
	}
	public void setQrcode(String qrcode) {
		this.qrcode = qrcode;
	}
	// 设定JSON序列化时的日期格式
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00")
	public Date getCzrq() {
		return czrq;
	}
	public void setCzrq(Date czrq) {
		this.czrq = czrq;
	}
	@Override
	public String toString() {
		return ToStringBuilder.reflectionToString(this);
	}
	@Column(name = "del")
	public Integer getDel() {
		return del;
	}
	public void setDel(Integer del) {
		this.del = del;
	}
	public String getIdcard() {
		return idcard;
	}
	public void setIdcard(String idcard) {
		this.idcard = idcard;
	}
	@Column(name = "is_famous")
	public Integer getIsFamous() {
		return isFamous;
	}
	public void setIsFamous(Integer isFamous) {
		this.isFamous = isFamous;
	}
    /**
     * 是否为专科医生。
     *
     * @return
     */
    @Transient
	public boolean isProfessionalDoctor(){
	    return level == 1;
    }
    /**
     * 是否为全科医生。
     *
     * @return
     */
    @Transient
	public boolean isGeneralDoctor(){
	    return level == 2;
    }
    /**
     * 是否为健康管理师。
     *
     * @return
     */
    @Transient
    public boolean isHealthDoctor(){
        return level == 3;
    }
}

+ 71 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/doctor/DoctorPatientGroup.java

@ -0,0 +1,71 @@
package com.yihu.wlyy.statistics.model.doctor;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yihu.wlyy.statistics.model.IdEntity;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.Date;
/**
 * 医生分组(三师、普通签约等)表
 * @author George
 *
 */
@Entity
@Table(name = "wlyy_doctor_patient_group")
public class DoctorPatientGroup extends IdEntity {
	private static final long serialVersionUID = 2055055862188986760L;
	
	// 业务主键
	private String code;
	//组名
	private String name;	
	// 医生标识
	private String doctor;
	// 发布时间
	private Date czrq;
	// 状态,1正常,0作废
	private Integer status;
	
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public String getDoctor() {
		return doctor;
	}
	public void setDoctor(String doctor) {
		this.doctor = doctor;
	}
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00")
	public Date getCzrq() {
		return czrq;
	}
	public void setCzrq(Date czrq) {
		this.czrq = czrq;
	}
	public Integer getStatus() {
		return status;
	}
	public void setStatus(Integer status) {
		this.status = status;
	}
	
}

+ 128 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/doctor/DoctorPatientGroupInfo.java

@ -0,0 +1,128 @@
package com.yihu.wlyy.statistics.model.doctor;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yihu.wlyy.statistics.model.IdEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.Date;
/**
 * 医生对患者分组(三师、普通签约等)记录表
 * @author George
 *
 */
@Entity
@Table(name = "wlyy_doctor_patient_group_info")
public class DoctorPatientGroupInfo extends IdEntity {
	private static final long serialVersionUID = 5559656428707106920L;
	// 医生标识
	private String doctor;
	// 患者标识
	private String patient;
	// 患者姓名
	private String pname;
	// 分组标识(1:健康人群 2:慢病人群 3:我的具名)
	private String group;
	// 病历片段总数
	private Integer partAmount;
	// 签约日期/已诊日期
	private Date qyrq;
	// 到期日期
	private Date dqrq;
	// 添加时间
	private Date czrq;
	// 状态,1正常,0作废
	private Integer status;
	//签约类型(1表示三师签约,2表示家庭签约)
	private String signType;
	@Column(name = "sign_type")
	public String getSignType() {
		return signType;
	}
	public void setSignType(String signType) {
		this.signType = signType;
	}
	
	public Integer getStatus() {
		return status;
	}
	public void setStatus(Integer status) {
		this.status = status;
	}
	public String getDoctor() {
		return doctor;
	}
	public void setDoctor(String doctor) {
		this.doctor = doctor;
	}
	public String getPatient() {
		return patient;
	}
	public void setPatient(String patient) {
		this.patient = patient;
	}
	public String getPname() {
		return pname;
	}
	public void setPname(String pname) {
		this.pname = pname;
	}
	@Column(name = "group_code")
	public String getGroup() {
		return group;
	}
	public void setGroup(String group) {
		this.group = group;
	}
	@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+08:00")
	public Date getDqrq() {
		return dqrq;
	}
	public void setDqrq(Date dqrq) {
		this.dqrq = dqrq;
	}
	@Column(name = "part_amount")
	public Integer getPartAmount() {
		return partAmount;
	}
	public void setPartAmount(Integer partAmount) {
		this.partAmount = partAmount;
	}
	@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+08:00")
	public Date getQyrq() {
		return qyrq;
	}
	public void setQyrq(Date qyrq) {
		this.qyrq = qyrq;
	}
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00")
	public Date getCzrq() {
		return czrq;
	}
	public void setCzrq(Date czrq) {
		this.czrq = czrq;
	}
}

+ 156 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/hosptial/Hospital.java

@ -0,0 +1,156 @@
package com.yihu.wlyy.statistics.model.hosptial;
import com.yihu.wlyy.statistics.model.IdEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
 * 医院
 *
 * @author George
 */
@Entity
@Table(name = "dm_hospital")
public class Hospital extends IdEntity {
	private static final long serialVersionUID = 8039389705624435301L;
	private String code;            // 医院編碼
	private String name;	        // 医院名稱
	private String del;             // 作废标志
	private String province;        //省份标志
	private String provinceName;    //省份名称
	private String city;            //城市标志
	private String cityName;        //城市名称
	private String town;            //区县标志
	private String townName;        //区县名称
	private Integer level;          //级别,1医院,2社区医院
	private String address;         //医院详细地址
	private String intro;           //医院简介
	private String photo;           //医院图片
	private String roadCode;        //街道编码
	private String centerSite;      //中心/站点
	public String getDel() {
		return del;
	}
	public void setDel(String del) {
		this.del = del;
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getProvince() {
		return province;
	}
	public void setProvince(String province) {
		this.province = province;
	}
	public String getProvinceName() {
		return provinceName;
	}
	public void setProvinceName(String provinceName) {
		this.provinceName = provinceName;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getCityName() {
		return cityName;
	}
	public void setCityName(String cityName) {
		this.cityName = cityName;
	}
	public String getTown() {
		return town;
	}
	public void setTown(String town) {
		this.town = town;
	}
	public String getTownName() {
		return townName;
	}
	public void setTownName(String townName) {
		this.townName = townName;
	}
	public Integer getLevel() {
		return level;
	}
	public void setLevel(Integer level) {
		this.level = level;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getIntro() {
		return intro;
	}
	public void setIntro(String intro) {
		this.intro = intro;
	}
	public String getPhoto() {
		return photo;
	}
	public void setPhoto(String photo) {
		this.photo = photo;
	}
	@Column(name="road_code")
	public String getRoadCode() {
		return roadCode;
	}
	public void setRoadCode(String roadCode) {
		this.roadCode = roadCode;
	}
	@Column(name="center_site")
	public String getCenterSite() {
		return centerSite;
	}
	public void setCenterSite(String centerSite) {
		this.centerSite = centerSite;
	}
}

+ 124 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/job/QuartzJobConfig.java

@ -0,0 +1,124 @@
package com.yihu.wlyy.statistics.model.job;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
/**
 * 计划任务
 */
@Entity
@Table(name = "wlyy_job_config")
public class QuartzJobConfig implements java.io.Serializable {
	private String id;
	private String quotaId;//指标id
	private String jobName;//任务名称
	private String jobInfo;//任务描述
	private String jobType;//任务类型(0--单次执行  1--周期执行 2--监听任务)
	private String jobClass;//任务执行的class
	private String quartzCron;//quartz表达式
	private String status;//1 启动 0停止
	private String del;//是否删除 1正常 0删除
	/** minimal constructor */
	public QuartzJobConfig() {
	}
	/** full constructor */
	public QuartzJobConfig(String jobName, String jobInfo, String jobType,
                           String jobClass, String quartzCron, String status) {
		this.jobName = jobName;
		this.jobInfo = jobInfo;
		this.jobType = jobType;
		this.jobClass = jobClass;
		this.quartzCron = quartzCron;
		this.status = status;
	}
	// Property accessors
	@GenericGenerator(name = "generator", strategy = "uuid")
	@Id
	@GeneratedValue(generator = "generator")
	@Column(name = "id", unique = true, nullable = false, length = 50)
	public String getId() {
		return this.id;
	}
	public void setId(String id) {
		this.id = id;
	}
	@Column(name = "job_name", length = 50)
	public String getJobName() {
		return this.jobName;
	}
	public void setJobName(String jobName) {
		this.jobName = jobName;
	}
	@Column(name = "job_info", length = 200)
	public String getJobInfo() {
		return this.jobInfo;
	}
	public void setJobInfo(String jobInfo) {
		this.jobInfo = jobInfo;
	}
	@Column(name = "job_type", length = 10)
	public String getJobType() {
		return this.jobType;
	}
	public void setJobType(String jobType) {
		this.jobType = jobType;
	}
	@Column(name = "job_class", length = 200)
	public String getJobClass() {
		return jobClass;
	}
	public void setJobClass(String jobClass) {
		this.jobClass = jobClass;
	}
	@Column(name = "quartz_cron", length = 200)
	public String getQuartzCron() {
		return this.quartzCron;
	}
	public void setQuartzCron(String quartzCron) {
		this.quartzCron = quartzCron;
	}
	@Column(name = "status", length = 1)
	public String getStatus() {
		return this.status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	@Column(name = "quota_id", length = 50)
	public String getQuotaId() {
		return quotaId;
	}
	public void setQuotaId(String quotaId) {
		this.quotaId = quotaId;
	}
	@Column(name = "del", length = 1)
	public String getDel() {
		return del;
	}
	public void setDel(String del) {
		this.del = del;
	}
}

+ 104 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/job/QuartzJobLog.java

@ -0,0 +1,104 @@
package com.yihu.wlyy.statistics.model.job;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.sql.Timestamp;
import java.util.Date;
/**
 * QuartzJobLog entity. @author MyEclipse Persistence Tools
 */
@Entity
@Table(name = "wlyy_job_log")
public class QuartzJobLog implements java.io.Serializable {
	private String id;
	private Date jobStartTime;  //任务开始执行时间
	private Date jobEndTime;    //任务结束时间
	private String jobId;       //任务id
	private String jobName;     //任务名称
	private String jobContent;  //任务执行情况
	private String jobType;     // 1成功 0失败
    public QuartzJobLog(){}
	public QuartzJobLog(String jobId) {
		this.jobId = jobId;
	}
	public QuartzJobLog(Timestamp jobStartTime, Timestamp jobEndTime,
                        String jobId, String jobContent, String jobType) {
		this.jobStartTime = jobStartTime;
		this.jobEndTime = jobEndTime;
		this.jobId = jobId;
		this.jobContent = jobContent;
		this.jobType = jobType;
	}
	@GenericGenerator(name = "generator", strategy = "uuid")
	@Id
	@GeneratedValue(generator = "generator")
	@Column(name = "id", unique = true, nullable = false, length = 50)
	public String getId() {
		return this.id;
	}
	public void setId(String id) {
		this.id = id;
	}
	@Column(name = "job_start_time", length = 0)
	public Date getJobStartTime() {
		return this.jobStartTime;
	}
	public void setJobStartTime(Date jobStartTime) {
		this.jobStartTime = jobStartTime;
	}
	@Column(name = "Job_end_time", length = 0)
	public Date getJobEndTime() {
		return this.jobEndTime;
	}
	public void setJobEndTime(Date jobEndTime) {
		this.jobEndTime = jobEndTime;
	}
	@Column(name = "job_id", nullable = false, length = 50)
	public String getJobId() {
		return this.jobId;
	}
	public void setJobId(String jobId) {
		this.jobId = jobId;
	}
	@Column(name = "job_content", length = 1000)
	public String getJobContent() {
		return this.jobContent;
	}
	public void setJobContent(String jobContent) {
		this.jobContent = jobContent;
	}
	@Column(name = "job_type", length = 1)
	public String getJobType() {
		return this.jobType;
	}
	public void setJobType(String jobType) {
		this.jobType = jobType;
	}
	@Column(name = "job_name", length = 200)
	public String getJobName() {
		return jobName;
	}
	public void setJobName(String jobName) {
		this.jobName = jobName;
	}
}

+ 117 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/job/WlyyQuota.java

@ -0,0 +1,117 @@
package com.yihu.wlyy.statistics.model.job;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.util.Date;
/**
 * WlyyQuota entity. @author MyEclipse Persistence Tools
 */
@Entity
@Table(name = "wlyy_quota")
public class WlyyQuota implements java.io.Serializable {
	private String id;
	private String name;//指标名称
	private String level1;//指标维度(1:机构维度)
	private String level2;//2级维度 (1:患者性别 2:患者分组 3:患者年龄)
	private String level3;//3级维度 (1:患者疾病)
	private String cycle;//统计周期( 1:天 )
	private String type;//尺度(1 新增 2是累计)
	private Date createTime;//创建时间
	private Date modifyTime;//修改时间
	private String del;//1: 正常 0: 删除
	@GenericGenerator(name = "generator", strategy = "uuid")
	@Id
	@GeneratedValue(generator = "generator")
	@Column(name = "id", unique = true, nullable = false, length = 100)
	public String getId() {
		return this.id;
	}
	public void setId(String id) {
		this.id = id;
	}
	@Column(name = "name", length = 200)
	public String getName() {
		return this.name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Column(name = "level_2", length = 2)
	public String getLevel2() {
		return this.level2;
	}
	public void setLevel2(String level2) {
		this.level2 = level2;
	}
	@Column(name = "level_1", length = 2)
	public String getLevel1() {
		return this.level1;
	}
	public void setLevel1(String level1) {
		this.level1 = level1;
	}
	@Column(name = "cycle", length = 2)
	public String getCycle() {
		return this.cycle;
	}
	public void setCycle(String cycle) {
		this.cycle = cycle;
	}
	@Column(name = "type", length = 2)
	public String getType() {
		return this.type;
	}
	public void setType(String type) {
		this.type = type;
	}
	@Column(name = "create_time", length = 0)
	public Date getCreateTime() {
		return this.createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
	@Column(name = "modify_time", length = 0)
	public Date getModifyTime() {
		return this.modifyTime;
	}
	public void setModifyTime(Date modifyTime) {
		this.modifyTime = modifyTime;
	}
	@Column(name = "del", length = 1)
	public String getDel() {
		return this.del;
	}
	public void setDel(String del) {
		this.del = del;
	}
	@Column(name = "level_3", length = 2)
	public String getLevel3() {
		return level3;
	}
	public void setLevel3(String level3) {
		this.level3 = level3;
	}
}

+ 228 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/job/WlyyQuotaResult.java

@ -0,0 +1,228 @@
package com.yihu.wlyy.statistics.model.job;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.util.Date;
/**
 * WlyyQuotaResult entity. @author MyEclipse Persistence Tools
 */
@Entity
@Table(name = "wlyy_quota_result")
public class WlyyQuotaResult implements java.io.Serializable {
    private String id;
    private String quotaDate;//统计时间
    private String quatoCode;//指标code
    private String quatoName;//指标name
    private String result;//统计结果
    private String del;//1: 正常 0: 删除
    private String level1Type;//等级 1:团队 2社区机构 3区级 4市级
    private String level2Type;//如果有二级维度那么这个存的是二级维度的code 例如二级维度是性别 那么这个存 1
    private String level2TypeName;//如果有二级维度那么这个存的是二级维度的code 例如二级维度是性别 那么这个存 男
    private String level3Type;//如果有三级维度那么这个存的是三级维度的code 例如三级维度是疾病 那么这个存 1
    private String level3TypeName;//如果有三级维度那么这个存的是三级维度的code 例如三级维度是疾病 那么这个存 高血压
    private String city;//市
    private String cityName;//市级名称
    private String town;//区级
    private String townName;//区级名称
    private String orgCode;//机构code
    private String orgName;//机构名称
    private String qkdoctorName;//全科医生名称 --现在是团队名称
    private String qkdoctorCode;//全科医生code --现在是团队code
    private String qkdoctorJobName;//全科医生职称   用于检验统计线程判断指标是否需要重新生成  等于 1 的时候是不需要
    private Date createTime;//创建时间
    @Id
    @GenericGenerator(name = "generator", strategy = "uuid")
    @GeneratedValue(generator = "generator")
    @Column(name = "id", unique = true, nullable = false, length = 100)
    public String getId() {
        return this.id;
    }
    public void setId(String id) {
        this.id = id;
    }
    @Column(name = "org_code", length = 100)
    public String getOrgCode() {
        return this.orgCode;
    }
    public void setOrgCode(String orgCode) {
        this.orgCode = orgCode;
    }
    @Column(name = "org_name", length = 200)
    public String getOrgName() {
        return this.orgName;
    }
    public void setOrgName(String orgName) {
        this.orgName = orgName;
    }
    @Column(name = "quota_date", length = 0)
    public String getQuotaDate() {
        return this.quotaDate;
    }
    public void setQuotaDate(String quotaDate) {
        this.quotaDate = quotaDate;
    }
    @Column(name = "quato_code", length = 100)
    public String getQuatoCode() {
        return this.quatoCode;
    }
    public void setQuatoCode(String quatoCode) {
        this.quatoCode = quatoCode;
    }
    @Column(name = "quato_name", length = 200)
    public String getQuatoName() {
        return this.quatoName;
    }
    public void setQuatoName(String quatoName) {
        this.quatoName = quatoName;
    }
    @Column(name = "result", length = 500)
    public String getResult() {
        return this.result;
    }
    public void setResult(String result) {
        this.result = result;
    }
    @Column(name = "city", length = 10)
    public String getCity() {
        return this.city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    @Column(name = "city_name", length = 200)
    public String getCityName() {
        return this.cityName;
    }
    public void setCityName(String cityName) {
        this.cityName = cityName;
    }
    @Column(name = "town", length = 10)
    public String getTown() {
        return this.town;
    }
    public void setTown(String town) {
        this.town = town;
    }
    @Column(name = "town_name", length = 200)
    public String getTownName() {
        return this.townName;
    }
    public void setTownName(String townName) {
        this.townName = townName;
    }
    @Column(name = "qkdoctor_name", length = 200)
    public String getQkdoctorName() {
        return this.qkdoctorName;
    }
    public void setQkdoctorName(String qkdoctorName) {
        this.qkdoctorName = qkdoctorName;
    }
    @Column(name = "qkdoctor_job_name", length = 200)
    public String getQkdoctorJobName() {
        return this.qkdoctorJobName;
    }
    public void setQkdoctorJobName(String qkdoctorJobName) {
        this.qkdoctorJobName = qkdoctorJobName;
    }
    @Column(name = "del", length = 1)
    public String getDel() {
        return this.del;
    }
    public void setDel(String del) {
        this.del = del;
    }
    @Column(name = "qkdoctor_code", length = 200)
    public String getQkdoctorCode() {
        return qkdoctorCode;
    }
    public void setQkdoctorCode(String qkdoctorCode) {
        this.qkdoctorCode = qkdoctorCode;
    }
    @Column(name = "create_time")
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    @Column(name = "level1_type", length = 2)
    public String getLevel1Type() {
        return level1Type;
    }
    public void setLevel1Type(String level1Type) {
        this.level1Type = level1Type;
    }
    @Column(name = "level2_type", length = 50)
    public String getLevel2Type() {
        return level2Type;
    }
    public void setLevel2Type(String level2Type) {
        this.level2Type = level2Type;
    }
    @Column(name = "level2_type_name", length = 50)
    public String getLevel2TypeName() {
        return level2TypeName;
    }
    public void setLevel2TypeName(String level2TypeName) {
        this.level2TypeName = level2TypeName;
    }
    @Column(name = "level3_type", length = 50)
    public String getLevel3Type() {
        return level3Type;
    }
    public void setLevel3Type(String level3Type) {
        this.level3Type = level3Type;
    }
    @Column(name = "level3_type_name", length = 50)
    public String getLevel3TypeName() {
        return level3TypeName;
    }
    public void setLevel3TypeName(String level3TypeName) {
        this.level3TypeName = level3TypeName;
    }
}

+ 321 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/patient/Patient.java

@ -0,0 +1,321 @@
package com.yihu.wlyy.statistics.model.patient;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yihu.wlyy.statistics.model.IdEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;
/**
 * 患者信息
 * @author George
 *
 */
@Entity
@Table(name = "wlyy_patient")
public class Patient extends IdEntity implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 8358924836164389434L;
	// 业务主键
	private String code;
	// 身份证号
	private String idcard;
	// 登录密码
	private String password;
	private String salt;
	// 姓名
	private String name;
	// 生日
	private Date birthday;
	// 性別,1男,2女
	private Integer sex;
	// 手機號
	private String mobile;
	// 聯繫電話
	private String phone;
	// 社保卡號
	private String ssc;
	// 頭像HTTP地址
	private String photo;
	// 省代碼
	private String province;
	// 城市代碼
	private String city;
	// 區縣代碼
	private String town;
	// 街道代码
	private String street;
	// 省名
	private String provinceName;
	// 市名
	private String cityName;
	// 區縣名
	private String townName;
	// 街道名称
	private String streetName;
	// 地址
	private String address;
	// 疾病类型,0健康,1高血压,2糖尿病,3高血压+糖尿病
	private Integer disease;
	// 病情:0绿标,1黄标,2红标
	private Integer diseaseCondition;
	// 病历记录总数
	private Integer recordAmount;
	// 總積分
	private Integer points;
	// 更新時間
	private Date czrq;
	// 微信编号
	private String openid;
	// 用户状态:1正常,0禁用,-1恶意注册,2审核中
	private Integer status;
	public Patient() {
	}
	public Patient(Long id) {
		this.id = id;
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String getIdcard() {
		return idcard;
	}
	public void setIdcard(String idcard) {
		this.idcard = idcard;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getSalt() {
		return salt;
	}
	public void setSalt(String salt) {
		this.salt = salt;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+08:00")
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public Integer getSex() {
		return sex;
	}
	public void setSex(Integer sex) {
		this.sex = sex;
	}
	public String getMobile() {
		return mobile;
	}
	public void setMobile(String mobile) {
		this.mobile = mobile;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getSsc() {
		return ssc;
	}
	public void setSsc(String ssc) {
		this.ssc = ssc;
	}
	public String getPhoto() {
		return photo;
	}
	public void setPhoto(String photo) {
		this.photo = photo;
	}
	public String getProvince() {
		return province;
	}
	public void setProvince(String province) {
		this.province = province;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getTown() {
		return town;
	}
	public void setTown(String town) {
		this.town = town;
	}
	public String getStreet() {
		return street;
	}
	public void setStreet(String street) {
		this.street = street;
	}
	@Column(name = "province_name")
	public String getProvinceName() {
		return provinceName;
	}
	public void setProvinceName(String provinceName) {
		this.provinceName = provinceName;
	}
	@Column(name = "city_name")
	public String getCityName() {
		return cityName;
	}
	public void setCityName(String cityName) {
		this.cityName = cityName;
	}
	@Column(name = "town_name")
	public String getTownName() {
		return townName;
	}
	public void setTownName(String townName) {
		this.townName = townName;
	}
	@Column(name = "street_name")
	public String getStreetName() {
		return streetName;
	}
	public void setStreetName(String streetName) {
		this.streetName = streetName;
	}
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Integer getDisease() {
		return disease;
	}
	public void setDisease(Integer disease) {
		this.disease = disease;
	}
	@Column(name = "disease_condition")
	public Integer getDiseaseCondition() {
		return diseaseCondition;
	}
	public void setDiseaseCondition(Integer diseaseCondition) {
		this.diseaseCondition = diseaseCondition;
	}
	@Column(name = "record_amount")
	public Integer getRecordAmount() {
		return recordAmount;
	}
	public void setRecordAmount(Integer recordAmount) {
		this.recordAmount = recordAmount;
	}
	public Integer getPoints() {
		return points;
	}
	public void setPoints(Integer points) {
		this.points = points;
	}
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00")
	public Date getCzrq() {
		return czrq;
	}
	public void setCzrq(Date czrq) {
		this.czrq = czrq;
	}
	public String getOpenid() {
		return openid;
	}
	public void setOpenid(String openid) {
		this.openid = openid;
	}
	@Override
	public String toString() {
		return ToStringBuilder.reflectionToString(this);
	}
	public Integer getStatus() {
		return status;
	}
	public void setStatus(Integer status) {
		this.status = status;
	}
}

+ 96 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/patient/PatientHealthGuidance.java

@ -0,0 +1,96 @@
package com.yihu.wlyy.statistics.model.patient;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yihu.wlyy.statistics.model.IdEntity;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.Date;
/**
 * 健康指导
 * @author George
 *
 */
@Entity
@Table(name = "wlyy_patient_health_guidance")
public class PatientHealthGuidance extends IdEntity {
	/**
	 * 
	 */
	private static final long serialVersionUID = -4187769034437765691L;
	// 患者标识
	private String patient;
	// 医生标识
	private String doctor;
	// 指导内容
	private String content;
	// 咨询图片URL,多图以逗号分隔
	private String images;
	// 咨询语音URL
	private String voice;
	// 作废标识:1正常,0作废
	private String del;
	// 添加时间
	private Date czrq;
	public String getPatient() {
		return patient;
	}
	public void setPatient(String patient) {
		this.patient = patient;
	}
	public String getDoctor() {
		return doctor;
	}
	public void setDoctor(String doctor) {
		this.doctor = doctor;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getDel() {
		return del;
	}
	public void setDel(String del) {
		this.del = del;
	}
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00")
	public Date getCzrq() {
		return czrq;
	}
	public void setCzrq(Date czrq) {
		this.czrq = czrq;
	}
	public String getImages() {
		return images;
	}
	public void setImages(String images) {
		this.images = images;
	}
	public String getVoice() {
		return voice;
	}
	public void setVoice(String voice) {
		this.voice = voice;
	}
}

+ 467 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/signfamily/SignFamily.java

@ -0,0 +1,467 @@
package com.yihu.wlyy.statistics.model.signfamily;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yihu.wlyy.statistics.model.IdEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.Date;
/**
 * 家庭签约
 * @author George
 */
@Entity
@Table(name = "wlyy_sign_family")
public class SignFamily extends IdEntity {
	private static final long serialVersionUID = 364799142991631092L;
	private String code;        // 签约标识
	private String lwCode;      // 两网标识
	private Integer type;       // 签约类型:1三师签约,2网络签约
	private String patient;     // 患者标识
	private String openid;      // 微信OPENID
	private String name;        // 患者姓名
	private String idcard;      // 身份证号
	private String ssc;         // 社保卡号
	private String mobile;      // 手机号
	private String emerMobile;  // 紧急联系人手机号
	private String hospital;    // 签约医院标识
	private String hospitalName;    // 签约医院名称
	private String doctor;      // 全科医生
	private String doctorName;  // 全科医生姓名
	private String doctorHealth;    // 健康管理师
	private String doctorHealthName;    // 健康管理师姓名
	private Date begin;         // 签约开始日期
	private Date end;           // 签约结束日期
	private Integer status;     // 签约状态(-1患者已取消,-2已拒绝,-3已解约,-4已到期,0待签约,1已签约,2患者申请取消签约
	private String images;      // 签约图片附件URL,多图以逗号分隔
	private String reason;      // 解约原因
	private Date czrq;          // 操作时间
	private String teamCode;
	private Date applyDate;     //签约时间
	private Date applyUnsignDate;//解约时间
	private Date patientApplyDate;//患者发起签约时间
	private Date patientApplyUnsignDate;//患者发起解约时间
	private String signType;//1 用户自己申请  2医生手工带签  3.医生发起邀请
	private String familyCode;//签约code
	private Double expenses;//签约费用
	private String expensesStatus;//扣费状态【0未扣费 1已扣费 2已退费】
	private String signSource;// 签约来源【1 社区签约 2 移动签约】
	private String signDoctorCode;//簽約人code
	private String signDoctorName;//簽約人銘
	private String signDoctorLevel;//簽約人等级
	private String expensesType;//补贴类型(4种类型:01无补贴,02全部贴,03补个人承担部分(20),04补统筹基金(70))
	private String signYear;//签约年度
	private String medicalInsuranceNum;//医保流水号
	private String agentDoctorCode;//代理簽約人code
	private String agentDoctorName;//代理簽約人銘
	private String agentDoctorLevel;//代理簽約人等级
	private Long adminTeamId;//行政团队ID
	private Date expensesTime;//缴费时间
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String getLwCode() {
		return lwCode;
	}
	public void setLwCode(String lwCode) {
		this.lwCode = lwCode;
	}
	public Integer getType() {
		return type;
	}
	public void setType(Integer type) {
		this.type = type;
	}
	public String getPatient() {
		return patient;
	}
	public void setPatient(String patient) {
		this.patient = patient;
	}
	public String getOpenid() {
		return openid;
	}
	public void setOpenid(String openid) {
		this.openid = openid;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getIdcard() {
		return idcard;
	}
	public void setIdcard(String idcard) {
		this.idcard = idcard;
	}
	public String getSsc() {
		return ssc;
	}
	public void setSsc(String ssc) {
		this.ssc = ssc;
	}
	public String getMobile() {
		return mobile;
	}
	public void setMobile(String mobile) {
		this.mobile = mobile;
	}
	@Column(name = "emer_mobile")
	public String getEmerMobile() {
		return emerMobile;
	}
	public void setEmerMobile(String emerMobile) {
		this.emerMobile = emerMobile;
	}
	public String getHospital() {
		return hospital;
	}
	public void setHospital(String hospital) {
		this.hospital = hospital;
	}
	@Column(name = "hospital_name")
	public String getHospitalName() {
		return hospitalName;
	}
	public void setHospitalName(String hospitalName) {
		this.hospitalName = hospitalName;
	}
	public String getDoctor() {
		return doctor;
	}
	public void setDoctor(String doctor) {
		this.doctor = doctor;
	}
	@Column(name = "doctor_name")
	public String getDoctorName() {
		return doctorName;
	}
	public void setDoctorName(String doctorName) {
		this.doctorName = doctorName;
	}
	@Column(name = "doctor_health")
	public String getDoctorHealth() {
		return doctorHealth;
	}
	public void setDoctorHealth(String doctorHealth) {
		this.doctorHealth = doctorHealth;
	}
	@Column(name = "doctor_health_name")
	public String getDoctorHealthName() {
		return doctorHealthName;
	}
	public void setDoctorHealthName(String doctorHealthName) {
		this.doctorHealthName = doctorHealthName;
	}
	@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+08:00")
	public Date getBegin() {
		return begin;
	}
	public void setBegin(Date begin) {
		this.begin = begin;
	}
	@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+08:00")
	public Date getEnd() {
		return end;
	}
	public void setEnd(Date end) {
		this.end = end;
	}
	public Integer getStatus() {
		return status;
	}
	public void setStatus(Integer status) {
		this.status = status;
	}
	public String getImages() {
		return images;
	}
	public void setImages(String images) {
		this.images = images;
	}
	public String getReason() {
		return reason;
	}
	public void setReason(String reason) {
		this.reason = reason;
	}
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00")
	public Date getCzrq() {
		return czrq;
	}
	public void setCzrq(Date czrq) {
		this.czrq = czrq;
	}
	@Column(name = "team_code")
	public String getTeamCode() {
		return teamCode;
	}
	public void setTeamCode(String teamCode) {
		this.teamCode = teamCode;
	}
	@Column(name = "sign_type")
	public String getSignType() {
		return signType;
	}
	public void setSignType(String signType) {
		this.signType = signType;
	}
	@Column(name = "apply_date")
	public Date getApplyDate() {
		return applyDate;
	}
	public void setApplyDate(Date applyDate) {
		this.applyDate = applyDate;
	}
	@Column(name = "patient_apply_date")
	public Date getPatientApplyDate() {
		return patientApplyDate;
	}
	public void setPatientApplyDate(Date patientApplyDate) {
		this.patientApplyDate = patientApplyDate;
	}
	@Column(name = "patient_apply_unsgin_date")
	public Date getPatientApplyUnsignDate() {
		return patientApplyUnsignDate;
	}
	public void setPatientApplyUnsignDate(Date patientApplyUnsignDate) {
		this.patientApplyUnsignDate = patientApplyUnsignDate;
	}
	@Column(name = "family_code")
	public String getFamilyCode() {
		return familyCode;
	}
	public void setFamilyCode(String familyCode) {
		this.familyCode = familyCode;
	}
	@Column(name = "expenses")
	public Double getExpenses() {
		return expenses;
	}
	public void setExpenses(Double expenses) {
		this.expenses = expenses;
	}
	@Column(name = "sign_doctor_code")
	public String getSignDoctorCode() {
		return signDoctorCode;
	}
	public void setSignDoctorCode(String signDoctorCode) {
		this.signDoctorCode = signDoctorCode;
	}
	@Column(name = "sign_doctor_name")
	public String getSignDoctorName() {
		return signDoctorName;
	}
	public void setSignDoctorName(String signDoctorName) {
		this.signDoctorName = signDoctorName;
	}
	@Column(name = "sign_doctor_level")
	public String getSignDoctorLevel() {
		return signDoctorLevel;
	}
	public void setSignDoctorLevel(String signDoctorLevel) {
		this.signDoctorLevel = signDoctorLevel;
	}
	@Column(name = "apply_unsign_date")
	public Date getApplyUnsignDate() {
		return applyUnsignDate;
	}
	public void setApplyUnsignDate(Date applyUnsignDate) {
		this.applyUnsignDate = applyUnsignDate;
	}
	@Column(name = "expenses_type")
	public String getExpensesType() {
		return expensesType;
	}
	public void setExpensesType(String expensesType) {
		this.expensesType = expensesType;
	}
	@Column(name = "sign_year")
	public String getSignYear() {
		return signYear;
	}
	public void setSignYear(String signYear) {
		this.signYear = signYear;
	}
	@Column(name = "medical_insurance_num")
	public String getMedicalInsuranceNum() {
		return medicalInsuranceNum;
	}
	public void setMedicalInsuranceNum(String medicalInsuranceNum) {
		this.medicalInsuranceNum = medicalInsuranceNum;
	}
	@Column(name = "agent_doctor_code")
	public String getAgentDoctorCode() {
		return agentDoctorCode;
	}
	public void setAgentDoctorCode(String agentDoctorCode) {
		this.agentDoctorCode = agentDoctorCode;
	}
	@Column(name = "agent_doctor_name")
	public String getAgentDoctorName() {
		return agentDoctorName;
	}
	public void setAgentDoctorName(String agentDoctorName) {
		this.agentDoctorName = agentDoctorName;
	}
	@Column(name = "agent_doctor_level")
	public String getAgentDoctorLevel() {
		return agentDoctorLevel;
	}
	public void setAgentDoctorLevel(String agentDoctorLevel) {
		this.agentDoctorLevel = agentDoctorLevel;
	}
	@Column(name = "expenses_status")
	public String getExpensesStatus() {
		return expensesStatus;
	}
	public void setExpensesStatus(String expensesStatus) {
		this.expensesStatus = expensesStatus;
	}
	@Column(name = "sign_source")
	public String getSignSource() {
		return signSource;
	}
	public void setSignSource(String signSource) {
		this.signSource = signSource;
	}
	@Column(name = "admin_team_code")
	public Long getAdminTeamId() {
		return adminTeamId;
	}
	public void setAdminTeamId(Long adminTeamId) {
		this.adminTeamId = adminTeamId;
	}
	@Override
	public String toString() {
		return "SignFamily{" +
				"code='" + code + '\'' +
				", lwCode='" + lwCode + '\'' +
				", type=" + type +
				", patient='" + patient + '\'' +
				", openid='" + openid + '\'' +
				", name='" + name + '\'' +
				", idcard='" + idcard + '\'' +
				", ssc='" + ssc + '\'' +
				", mobile='" + mobile + '\'' +
				", emerMobile='" + emerMobile + '\'' +
				", hospital='" + hospital + '\'' +
				", hospitalName='" + hospitalName + '\'' +
				", doctor='" + doctor + '\'' +
				", doctorName='" + doctorName + '\'' +
				", doctorHealth='" + doctorHealth + '\'' +
				", doctorHealthName='" + doctorHealthName + '\'' +
				", begin=" + begin +
				", end=" + end +
				", status=" + status +
				", images='" + images + '\'' +
				", reason='" + reason + '\'' +
				", czrq=" + czrq +
				", teamCode='" + teamCode + '\'' +
				", applyDate=" + applyDate +
				", signType='" + signType + '\'' +
				", familyCode='" + familyCode + '\'' +
				'}';
	}
	public Date getExpensesTime() {
		return expensesTime;
	}
	public void setExpensesTime(Date expensesTime) {
		this.expensesTime = expensesTime;
	}
}

+ 57 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/system/City.java

@ -0,0 +1,57 @@
package com.yihu.wlyy.statistics.model.system;
import com.yihu.wlyy.statistics.model.IdEntity;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
 * 城市信息對象
 * @author George
 *
 */
@Entity
@Table(name = "dm_city")
public class City extends IdEntity {
	/**
	 * 
	 */
	private static final long serialVersionUID = 366338400555505599L;
	
	// 省編碼
	private String province;
	// 城市編碼
	private String code;
	// 城市名稱
	private String name;
	public City() {
	}
	public String getProvince() {
		return province;
	}
	public void setProvince(String province) {
		this.province = province;
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

+ 78 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/system/Town.java

@ -0,0 +1,78 @@
package com.yihu.wlyy.statistics.model.system;
import com.yihu.wlyy.statistics.model.IdEntity;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
 * 區縣信息對象
 * @author George
 *
 */
@Entity
@Table(name = "dm_town")
public class Town extends IdEntity {
	/**
	 * 
	 */
	private static final long serialVersionUID = -3851597133734507811L;
	
	// 省編碼
	private String province;
	// 城市編碼
	private String city;
	// 區縣編碼
	private String code;
	// 區縣名稱
	private String name;
	private String photo;
	public Town() {
	}
	public String getProvince() {
		return province;
	}
	public void setProvince(String province) {
		this.province = province;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPhoto() {
		return photo;
	}
	public void setPhoto(String photo) {
		this.photo = photo;
	}
}

+ 76 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/model/team/AdminTeam.java

@ -0,0 +1,76 @@
package com.yihu.wlyy.statistics.model.team;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yihu.wlyy.statistics.model.IdEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.Date;
/**
 * 医生行政团队。
 *
 * @author Sand
 */
@Entity
@Table(name = "wlyy_admin_team")
public class AdminTeam extends IdEntity {
    private String name;
    private Date createTime;
    private String leaderCode;
    private String orgCode;
    private boolean available;
    public String getName() {
        return name;
    }
    @Column(name = "name")
    public void setName(String name) {
        this.name = name;
    }
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm", timezone = "GMT+08:00")
    public Date getCreateTime() {
        return createTime;
    }
    @Column(name = "create_time")
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public String getOrgCode() {
        return orgCode;
    }
    @Column(name = "org_code")
    public void setOrgCode(String orgCode) {
        this.orgCode = orgCode;
    }
    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this);
    }
    public String getLeaderCode() {
        return leaderCode;
    }
    @Column(name = "leader_id")
    public void setLeaderCode(String leaderCode) {
        this.leaderCode = leaderCode;
    }
    public boolean isAvailable() {
        return available;
    }
    @Column(name = "available")
    public void setAvailable(boolean available) {
        this.available = available;
    }
}

+ 710 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/util/DateUtil.java

@ -0,0 +1,710 @@
package com.yihu.wlyy.statistics.util;
import org.apache.commons.lang3.StringUtils;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.*;
public class DateUtil {
	public static final String HH_MM = "HH:mm";
	public static final String HH_MM_SS = "HH:mm:ss";
	public static final String YY = "yy";
	public static final String YYYYMM = "yyyyMM";
	public static final String YYYYMMDD = "yyyyMMdd";
	public static final String YYYY_MM_DD = "yyyy-MM-dd";
	public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
	public static final String YYYY_MM_DD_HH = "yyyy-MM-dd HH";
	public static final String YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";
	public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
	/**
	 * 字符串转时间格式
	 */
	public static Date strToDate(String strDate) {
		if (StringUtils.isEmpty(strDate)) {
			return null;
		}
		else{
			int length = strDate.length();
			if(strDate.contains("-"))
			{
				if(length == 10)
				{
					 return strToDate(strDate,YYYY_MM_DD);
				}
				else if(length == 19)
				{
					return strToDate(strDate,YYYY_MM_DD_HH_MM_SS);
				}
			}
			else{
				if(length == 8)
				{
					return strToDate(strDate,YYYYMMDD);
				}
				else if(length == 14)
				{
					return strToDate(strDate,YYYYMMDDHHMMSS);
				}
			}
		}
		return null;
	}
	/**
	  * 获取现在时间
	  * 
	  * @return 返回时间类型 yyyy-MM-dd HH:mm:ss
	  */
	public static Date getNowDate() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		String dateString = formatter.format(currentTime);
		ParsePosition pos = new ParsePosition(0);
		return formatter.parse(dateString, pos);
	}
	/**
	 * 获取现在时间
	 * 
	 * @return返回短时间格式 yyyy-MM-dd
	 */
	public static Date getNowDateShort() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD);
		String dateString = formatter.format(currentTime);
		return strToDate(dateString, YYYY_MM_DD);
	}
	/**
	 * 获取现在时间
	 * 
	 * @return返回字符串格式 yyyy-MM-dd HH:mm:ss
	 */
	public static String getStringDate() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		return formatter.format(currentTime);
	}
	/**
	 * 获取现在时间
	 * 
	 * @return返回字符串格式 yyyy-MM-dd HH:mm:ss
	 */
	public static String getStringDate(String format) {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat(format);
		return formatter.format(currentTime);
	}
	/**
	 * 获取现在时间
	 * 
	 * @return 返回短时间字符串格式yyyy-MM-dd
	 */
	public static String getStringDateShort() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD);
		return formatter.format(currentTime);
	}
	/**
	 * 获取时间 小时:分;秒 HH:mm:ss
	 * 
	 * @return
	 */
	public static String getTimeShort() {
		SimpleDateFormat formatter = new SimpleDateFormat(HH_MM_SS);
		Date currentTime = new Date();
		return formatter.format(currentTime);
	}
	/**
	 * 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss
	 * 
	 * @param strDate
	 * @return
	 */
	public static Date strToDateLong(String strDate) {
		if (StringUtils.isEmpty(strDate)) {
			return null;
		}
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		ParsePosition pos = new ParsePosition(0);
		return formatter.parse(strDate, pos);
	}
	public static Date strToDateShort(String strDate) {
		if (StringUtils.isEmpty(strDate)) {
			return null;
		}
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD);
		ParsePosition pos = new ParsePosition(0);
		return formatter.parse(strDate, pos);
	}
	/**
	 * 将长时间格式时间转换为字符串 yyyy-MM-dd HH:mm:ss
	 * 
	 * @param dateDate
	 * @return
	 */
	public static String dateToStrLong(Date dateDate) {
		if (dateDate == null) {
			return "";
		}
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		return formatter.format(dateDate);
	}
	/**
	 * 将长时间格式时间转换为字符串 yyyy-MM-dd
	 *
	 * @param dateDate
	 * @return
	 */
	public static String dateToStrShort(Date dateDate) {
		if (dateDate == null) {
			return "";
		}
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD);
		return formatter.format(dateDate);
	}
	/**
	 * 将短时间格式时间转换为字符串 yyyy-MM-dd
	 *
	 * @param dateDate
	 * @param k
	 * @return
	 */
	public static String dateToStr(Date dateDate, String format) {
		if (dateDate == null) {
			return "";
		}
		SimpleDateFormat formatter = new SimpleDateFormat(format);
		return formatter.format(dateDate);
	}
	/**
	 * 将短时间格式字符串转换为时间
	 *
	 * @param strDate
	 * @return
	 */
	public static Date strToDate(String strDate, String format) {
		if (StringUtils.isEmpty(strDate)) {
			return null;
		}
		SimpleDateFormat formatter = new SimpleDateFormat(format);
		ParsePosition pos = new ParsePosition(0);
		return formatter.parse(strDate, pos);
	}
	public static Date strToDateAppendNowTime(String strDate, String format) {
		if (StringUtils.isEmpty(strDate)) {
			return null;
		}
		strDate += " " + getTimeShort();
		SimpleDateFormat formatter = new SimpleDateFormat(format);
		ParsePosition pos = new ParsePosition(0);
		return formatter.parse(strDate, pos);
	}
	/**
	 * 得到现在时间
	 *
	 * @return
	 */
	public static Date getNow() {
		Date currentTime = new Date();
		return currentTime;
	}
	/**
	 * 提取一个月中的最后一天
	 *
	 * @param day
	 * @return
	 */
	public static Date getLastDate(long day) {
		Date date = new Date();
		long date_3_hm = date.getTime() - 3600000 * 34 * day;
		Date date_3_hm_date = new Date(date_3_hm);
		return date_3_hm_date;
	}
	/**
	 * 得到现在时间
	 *
	 * @return 字符串 yyyyMMdd HHmmss
	 */
	public static String getStringToday() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd HHmmss");
		String dateString = formatter.format(currentTime);
		return dateString;
	}
	/**
	 * 得到现在小时
	 */
	public static String getHour() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		String dateString = formatter.format(currentTime);
		String hour;
		hour = dateString.substring(11, 13);
		return hour;
	}
	/**
	 * 得到现在分钟
	 *
	 * @return
	 */
	public static String getTime() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		String dateString = formatter.format(currentTime);
		String min;
		min = dateString.substring(14, 16);
		return min;
	}
	/**
	 * 根据用户传入的时间表示格式,返回当前时间的格式 如果是yyyyMMdd,注意字母y不能大写。
	 *
	 * @param sformat
	 *            yyyyMMddhhmmss
	 * @return
	 */
	public static String getUserDate(String sformat) {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat(sformat);
		String dateString = formatter.format(currentTime);
		return dateString;
	}
	/**
	 * 二个小时时间间的差值,必须保证二个时间都是"HH:MM"的格式,返回字符型的分钟
	 */
	public static String getTwoHour(String st1, String st2) {
		String[] kk = null;
		String[] jj = null;
		kk = st1.split(":");
		jj = st2.split(":");
		if (Integer.parseInt(kk[0]) < Integer.parseInt(jj[0]))
			return "0";
		else {
			double y = Double.parseDouble(kk[0]) + Double.parseDouble(kk[1]) / 60;
			double u = Double.parseDouble(jj[0]) + Double.parseDouble(jj[1]) / 60;
			if ((y - u) > 0)
				return y - u + "";
			else
				return "0";
		}
	}
	/**
	 * 得到二个日期间的间隔天数
	 */
	public static String getTwoDay(String sj1, String sj2) {
		SimpleDateFormat myFormatter = new SimpleDateFormat(YYYY_MM_DD);
		long day = 0;
		try {
			Date date = myFormatter.parse(sj1);
			Date mydate = myFormatter.parse(sj2);
			day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
		} catch (Exception e) {
			return "";
		}
		return day + "";
	}
	/**
	 * 时间前推或后推分钟,其中JJ表示分钟.
	 */
	public static String getPreTime(String sj1, String jj) {
		SimpleDateFormat format = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		String mydate1 = "";
		try {
			Date date1 = format.parse(sj1);
			long Time = (date1.getTime() / 1000) + Integer.parseInt(jj) * 60;
			date1.setTime(Time * 1000);
			mydate1 = format.format(date1);
		} catch (Exception e) {
		}
		return mydate1;
	}
	/**
	 * 得到一个时间延后或前移几分钟的时间,nowdate为时间,delay为前移或后延的分钟数
	 */
	public static Date getNextMin(Date date, int delay) {
		try {
			Calendar cal = Calendar.getInstance();
			cal.setTime(date);
			cal.add(Calendar.MINUTE, delay);
			return cal.getTime();
		} catch (Exception e) {
			return null;
		}
	}
	/**
	 * 得到一个时间延后或前移几天的时间,nowdate为时间,delay为前移或后延的天数
	 */
	public static String getNextDay(String nowdate, int delay) {
		try {
			SimpleDateFormat format = new SimpleDateFormat(YYYY_MM_DD);
			String mdate = "";
			Date d = strToDate(nowdate, YYYY_MM_DD);
			long myTime = (d.getTime() / 1000) + delay * 24 * 60 * 60;
			d.setTime(myTime * 1000);
			mdate = format.format(d);
			return mdate;
		} catch (Exception e) {
			return "";
		}
	}
	// public static String getNextDay(Date d, int delay) {
	// try {
	// SimpleDateFormat format = new SimpleDateFormat(YYYY_MM_DD);
	// String mdate = "";
	// long myTime = (d.getTime() / 1000) + delay * 24 * 60 * 60;
	// d.setTime(myTime * 1000);
	// mdate = format.format(d);
	// return mdate;
	// } catch (Exception e) {
	// return "";
	// }
	// }
	public static String getNextDay(Date d, int days) {
		Calendar c = Calendar.getInstance();
		c.setTime(d);
		c.add(Calendar.DATE, days);
		return dateToStrShort(c.getTime());
	}
	public static String getNextMonth(Date d, int months) {
		Calendar c = Calendar.getInstance();
		c.setTime(d);
		c.add(Calendar.MONTH, months);
		return dateToStrShort(c.getTime());
	}
	public static String getNextYear(Date d, int year) {
		Calendar c = Calendar.getInstance();
		c.setTime(d);
		c.add(Calendar.YEAR, year);
		return dateToStrShort(c.getTime());
	}
	/**
	 * 判断是否润年
	 *
	 * @param ddate
	 * @return
	 */
	public static boolean isLeapYear(String ddate) {
		/**
		 * 详细设计: 1.被400整除是闰年,否则: 2.不能被4整除则不是闰年 3.能被4整除同时不能被100整除则是闰年
		 * 3.能被4整除同时能被100整除则不是闰年
		 */
		Date d = strToDate(ddate, YYYY_MM_DD);
		GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
		gc.setTime(d);
		int year = gc.get(Calendar.YEAR);
		if ((year % 400) == 0)
			return true;
		else if ((year % 4) == 0) {
			if ((year % 100) == 0)
				return false;
			else
				return true;
		} else
			return false;
	}
	/**
	 * 返回美国时间格式 26 Apr 2006
	 *
	 * @param str
	 * @return
	 */
	public static String getEDate(String str) {
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD);
		ParsePosition pos = new ParsePosition(0);
		Date strtodate = formatter.parse(str, pos);
		String j = strtodate.toString();
		String[] k = j.split(" ");
		return k[2] + k[1].toUpperCase() + k[5].substring(2, 4);
	}
	/**
	 * 获取一个月的最后一天
	 *
	 * @param dat
	 * @return
	 */
	public static String getEndDateOfMonth(String dat) {// yyyy-MM-dd
		String str = dat.substring(0, 8);
		String month = dat.substring(5, 7);
		int mon = Integer.parseInt(month);
		if (mon == 1 || mon == 3 || mon == 5 || mon == 7 || mon == 8 || mon == 10 || mon == 12) {
			str += "31";
		} else if (mon == 4 || mon == 6 || mon == 9 || mon == 11) {
			str += "30";
		} else {
			if (isLeapYear(dat)) {
				str += "29";
			} else {
				str += "28";
			}
		}
		return str;
	}
	/**
	 * 判断二个时间是否在同一个周
	 *
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static boolean isSameWeekDates(Date date1, Date date2) {
		Calendar cal1 = Calendar.getInstance();
		Calendar cal2 = Calendar.getInstance();
		cal1.setTime(date1);
		cal2.setTime(date2);
		int subYear = cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR);
		if (0 == subYear) {
			if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))
				return true;
		} else if (1 == subYear && 11 == cal2.get(Calendar.MONTH)) {
			// 如果12月的最后一周横跨来年第一周的话则最后一周即算做来年的第一周
			if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))
				return true;
		} else if (-1 == subYear && 11 == cal1.get(Calendar.MONTH)) {
			if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))
				return true;
		}
		return false;
	}
	/**
	 * 产生周序列,即得到当前时间所在的年度是第几周
	 *
	 * @return
	 */
	public static String getSeqWeek() {
		Calendar c = Calendar.getInstance(Locale.CHINA);
		String week = Integer.toString(c.get(Calendar.WEEK_OF_YEAR));
		if (week.length() == 1)
			week = "0" + week;
		String year = Integer.toString(c.get(Calendar.YEAR));
		return year + week;
	}
	/**
	 * 获得一个日期所在的周的星期几的日期,如要找出2002年2月3日所在周的星期一是几号
	 *
	 * @param sdate
	 * @param num
	 * @return
	 */
	public static String getWeek(String sdate, String num) {
		// 再转换为时间
		Date dd = DateUtil.strToDate(sdate, YYYY_MM_DD);
		Calendar c = Calendar.getInstance();
		c.setTime(dd);
		if (num.equals("1")) // 返回星期一所在的日期
			c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
		else if (num.equals("2")) // 返回星期二所在的日期
			c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
		else if (num.equals("3")) // 返回星期三所在的日期
			c.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);
		else if (num.equals("4")) // 返回星期四所在的日期
			c.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
		else if (num.equals("5")) // 返回星期五所在的日期
			c.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
		else if (num.equals("6")) // 返回星期六所在的日期
			c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
		else if (num.equals("0")) // 返回星期日所在的日期
			c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
		return new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
	}
	/**
	 * 根据一个日期,返回是星期几的字符串
	 *
	 * @param sdate
	 * @return
	 */
	public static String getWeek(String sdate) {
		// 再转换为时间
		Date date = DateUtil.strToDate(sdate, YYYY_MM_DD);
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		// int hour=c.get(Calendar.DAY_OF_WEEK);
		// hour中存的就是星期几了,其范围 1~7
		// 1=星期日 7=星期六,其他类推
		return new SimpleDateFormat("EEEE").format(c.getTime());
	}
	public static String getWeekStr(String sdate) {
		String str = "";
		str = DateUtil.getWeek(sdate);
		if ("1".equals(str)) {
			str = "星期日";
		} else if ("2".equals(str)) {
			str = "星期一";
		} else if ("3".equals(str)) {
			str = "星期二";
		} else if ("4".equals(str)) {
			str = "星期三";
		} else if ("5".equals(str)) {
			str = "星期四";
		} else if ("6".equals(str)) {
			str = "星期五";
		} else if ("7".equals(str)) {
			str = "星期六";
		}
		return str;
	}
	/**
	 * 两个时间之间的天数
	 *
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static long getDays(String date1, String date2) {
		if (date1 == null || date1.equals(""))
			return 0;
		if (date2 == null || date2.equals(""))
			return 0;
		// 转换为标准时间
		SimpleDateFormat myFormatter = new SimpleDateFormat(YYYY_MM_DD);
		Date date = null;
		Date mydate = null;
		try {
			date = myFormatter.parse(date1);
			mydate = myFormatter.parse(date2);
		} catch (Exception e) {
		}
		long day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
		return day;
	}
	/**
	 * 返回两个日期相差的天数
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static long getDays(Date date1, Date date2) {
		if (date1 == null || date2 == null)
			return 0;
		long day = (date1.getTime() - date2.getTime()) / (24 * 60 * 60 * 1000);
		return day;
	}
	/**
	 * 形成如下的日历 , 根据传入的一个时间返回一个结构 星期日 星期一 星期二 星期三 星期四 星期五 星期六 下面是当月的各个时间
	 * 此函数返回该日历第一行星期日所在的日期
	 * 
	 * @param sdate
	 * @return
	 */
	public static String getNowMonth(String sdate) {
		// 取该时间所在月的一号
		sdate = sdate.substring(0, 8) + "01";
		// 得到这个月的1号是星期几
		Date date = DateUtil.strToDate(sdate, YYYY_MM_DD);
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		int u = c.get(Calendar.DAY_OF_WEEK);
		String newday = DateUtil.getNextDay(sdate, 1 - u);
		return newday;
	}
	/**
	 * 取得数据库主键 生成格式为yyyymmddhhmmss+k位随机数
	 * 
	 * @param k 表示是取几位随机数,可以自己定
	 */
	public static String getNo(int k) {
		return getUserDate("yyyyMMddhhmmss") + getRandom(k);
	}
	/**
	 * 返回一个随机数
	 * 
	 * @param i
	 * @return
	 */
	public static String getRandom(int i) {
		Random jjj = new Random();
		if (i == 0)
			return "";
		String jj = "";
		for (int k = 0; k < i; k++) {
			jj = jj + jjj.nextInt(9);
		}
		return jj;
	}
	/**
	 * 根据用户生日计算年龄
	 */
	public static int getAgeByBirthday(Date birthday) {
		try {
			Calendar cal = Calendar.getInstance();
			if (cal.before(birthday)) {
				return 0;
			}
			int yearNow = cal.get(Calendar.YEAR);
			int monthNow = cal.get(Calendar.MONTH) + 1;
			int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
			cal.setTime(birthday);
			int yearBirth = cal.get(Calendar.YEAR);
			int monthBirth = cal.get(Calendar.MONTH) + 1;
			int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);
			int age = yearNow - yearBirth;
			if (monthNow <= monthBirth) {
				if (monthNow == monthBirth) {
					if (dayOfMonthNow < dayOfMonthBirth) {
						age--;
					}
				} else {
					age--;
				}
			}
			return age;
		} catch (Exception e) {
			return 0;
		}
	}
	public static void main(String[] args) {
//		String hour = "12:22:12";
//		System.out.println(Time.valueOf(hour));
//		System.out.println(getNowDate());
//
		System.out.println(getNextYear(new Date(), -65));
	}
}

+ 155 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/util/IdCardUtil.java

@ -0,0 +1,155 @@
package com.yihu.wlyy.statistics.util;
import com.yihu.wlyy.statistics.job.Constant;
import org.apache.commons.lang3.StringUtils;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
 * Created by Administrator on 2016.08.17.
 * 身份证工具类
 */
public class IdCardUtil {
    /**
     * 根据身份证的号码算出当前身份证持有者的性别
     * 1 女 2 男 3未知
     *
     * @return
     * @throws Exception
     */
    public static String getSexForIdcard(String CardCode)
            throws Exception {
        String sex = Constant.level_sex_3;
        if (CardCode.length() == 18) {
            if (Integer.parseInt(CardCode.substring(16).substring(0, 1)) % 2 == 0) {// 判断性别
                // modifid by lyr 2016-09-29
                // sex =  Constant.level_sex_2;
                sex = Constant.level_sex_1;
                // modifid by lyr 2016-09-29
            } else {
                // modifid by lyr 2016-09-29
                // sex =  Constant.level_sex_1;
                sex = Constant.level_sex_2;
                // modifid by lyr 2016-09-29
            }
        } else if (CardCode.length() == 15) {
            String usex = CardCode.substring(14, 15);// 用户的性别
            if (Integer.parseInt(usex) % 2 == 0) {
                // sex =  Constant.level_sex_2;
                sex = Constant.level_sex_1;
            } else {
                // sex =  Constant.level_sex_1;
                sex = Constant.level_sex_2;
            }
        }
        return sex;
    }
//    /**
//     * 根据身份证的号码算出当前身份证持有者的年龄
//     *
//     * @param
//     * @throws Exception
//     */
//    public static int getAgeForIdcard(String card)
//            throws Exception {
//        int age = 0;
//        if (card.length() == 18) {
//            String year = card.substring(6).substring(0, 4);// 得到年份
//            String yue = card.substring(10).substring(0, 2);// 得到月份
//            // String day=CardCode.substring(12).substring(0,2);//得到日
//            Date date = new Date();// 得到当前的系统时间
//            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
//            String fyear = format.format(date).substring(0, 4);// 当前年份
//            String fyue = format.format(date).substring(5, 7);// 月份
//            if (Integer.parseInt(yue) <= Integer.parseInt(fyue)) { // 当前月份大于用户出身的月份表示已过生
//                age = Integer.parseInt(fyear) - Integer.parseInt(year) + 1;
//            } else {// 当前用户还没过生
//                age = Integer.parseInt(fyear) - Integer.parseInt(year);
//            }
//        } else if (card.length() == 15) {
//            String uyear = "19" + card.substring(6, 8);// 年份
//            String uyue = card.substring(8, 10);// 月份
//            Date date = new Date();// 得到当前的系统时间
//            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
//            String fyear = format.format(date).substring(0, 4);// 当前年份
//            String fyue = format.format(date).substring(5, 7);// 月份
//            // String fday=format.format(date).substring(8,10);
//            if (Integer.parseInt(uyue) <= Integer.parseInt(fyue)) { // 当前月份大于用户出身的月份表示已过生
//                age = Integer.parseInt(fyear) - Integer.parseInt(uyear) + 1;
//            } else {// 当前用户还没过生
//                age = Integer.parseInt(fyear) - Integer.parseInt(uyear);
//            }
//
//        }
//        return age;
//    }
    /**
     * 根据身份证的号码算出当前身份证持有者的年龄
     *
     * @param
     * @throws Exception
     */
    public static int getAgeForIdcard(String idcard) {
        int age = 0;
        if (StringUtils.isEmpty(idcard)) {
            return age;
        }
        String birth = "";
        if (idcard.length() == 18) {
            birth = idcard.substring(6, 14);
        } else if (idcard.length() == 15) {
            birth = "19" + idcard.substring(6, 12);
        }
        int year = Integer.valueOf(birth.substring(0, 4));
        int month = Integer.valueOf(birth.substring(4, 6));
        int day = Integer.valueOf(birth.substring(6));
        Calendar cal = Calendar.getInstance();
        age = cal.get(Calendar.YEAR) - year;
        //周岁计算
        if (cal.get(Calendar.MONTH) > (month - 1) || (cal.get(Calendar.MONTH) == (month - 1) && cal.get(Calendar.DATE) > day)) {
            age--;
        }
        return age;
    }
    /**
     * 身份证提取出身日期
     *
     * @param card
     * @return
     * @throws Exception
     */
    public static Date getBirthdayForIdcard(String card)
            throws Exception {
        Date b = null;
        if (card.length() == 18) {
            String year = card.substring(6).substring(0, 4);// 得到年份
            String yue = card.substring(10).substring(0, 2);// 得到月份
            String ri = card.substring(12).substring(0, 2);// 得到日
            // String day=CardCode.substring(12).substring(0,2);//得到日
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            b = format.parse(year + "-" + yue + "-" + ri);
        } else if (card.length() == 15) {
            String uyear = "19" + card.substring(6, 8);// 年份
            String uyue = card.substring(8, 10);// 月份
            String uri = card.substring(10, 12);// 得到日
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            b = format.parse(uyear + "-" + uyue + "-" + uri);
        }
        return b;
    }
    public static void main(String[] args) throws Exception {
        System.out.println(getSexForIdcard("350206199109092018"));
    }
}

+ 110 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/vo/WlyyJobConfigVO.java

@ -0,0 +1,110 @@
package com.yihu.wlyy.statistics.vo;
import java.io.Serializable;
/**
 * Created by Administrator on 2016/8/16.
 */
public class WlyyJobConfigVO implements  Serializable {
    private static final long serialVersionUID = 1L;
    private String id;
    private String quotaId;//指标id
    private String jobName;//任务名称
    private String jobInfo;//任务描述
    private String jobType;//任务类型(0--单次执行  1--周期执行 2--监听任务)
    private String jobClass;//任务执行的class
    private String quartzCron;//quartz表达式
    private String status;//1 启动 0停止
    private String del;//是否删除 1正常 0删除
    public WlyyJobConfigVO() {
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getQuotaId() {
        return quotaId;
    }
    public void setQuotaId(String quotaId) {
        this.quotaId = quotaId;
    }
    public String getJobName() {
        return jobName;
    }
    public void setJobName(String jobName) {
        this.jobName = jobName;
    }
    public String getJobInfo() {
        return jobInfo;
    }
    public void setJobInfo(String jobInfo) {
        this.jobInfo = jobInfo;
    }
    public String getJobType() {
        return jobType;
    }
    public void setJobType(String jobType) {
        this.jobType = jobType;
    }
    public String getJobClass() {
        return jobClass;
    }
    public void setJobClass(String jobClass) {
        this.jobClass = jobClass;
    }
    public String getQuartzCron() {
        return quartzCron;
    }
    public void setQuartzCron(String quartzCron) {
        this.quartzCron = quartzCron;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    public String getDel() {
        return del;
    }
    public void setDel(String del) {
        this.del = del;
    }
    @Override
    public String toString() {
        return "WlyyJobConfigVO{" +
                "id='" + id + '\'' +
                ", quotaId='" + quotaId + '\'' +
                ", jobName='" + jobName + '\'' +
                ", jobInfo='" + jobInfo + '\'' +
                ", jobType='" + jobType + '\'' +
                ", jobClass='" + jobClass + '\'' +
                ", quartzCron='" + quartzCron + '\'' +
                ", status='" + status + '\'' +
                ", del='" + del + '\'' +
                '}';
    }
}

+ 107 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/vo/WlyyQuotaVO.java

@ -0,0 +1,107 @@
package com.yihu.wlyy.statistics.vo;
import java.io.Serializable;
import java.util.Date;
/**
 * Created by Administrator on 2016/8/16.
 */
public class WlyyQuotaVO implements Serializable {
    private static final long serialVersionUID = 2L;
    private String id;
    private String name;//指标名称
    private String level1;//指标维度(1:机构维度)
    private String level2;//2级维度 (1:患者性别 2:患者分组 3:患者年龄)
    private String cycle;//统计周期( 1:天 )
    private String type;//尺度(1 新增 2是累计)
    private Date createTime;//创建时间
    private Date modifyTime;//修改时间
    private String del;//1: 正常 0: 删除
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getLevel1() {
        return level1;
    }
    public void setLevel1(String level1) {
        this.level1 = level1;
    }
    public String getLevel2() {
        return level2;
    }
    public void setLevel2(String level2) {
        this.level2 = level2;
    }
    public String getCycle() {
        return cycle;
    }
    public void setCycle(String cycle) {
        this.cycle = cycle;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public Date getModifyTime() {
        return modifyTime;
    }
    public void setModifyTime(Date modifyTime) {
        this.modifyTime = modifyTime;
    }
    public String getDel() {
        return del;
    }
    public void setDel(String del) {
        this.del = del;
    }
    @Override
    public String toString() {
        return "WlyyQuotaVO{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", level1='" + level1 + '\'' +
                ", level2='" + level2 + '\'' +
                ", cycle='" + cycle + '\'' +
                ", type='" + type + '\'' +
                ", createTime=" + createTime +
                ", modifyTime=" + modifyTime +
                ", del='" + del + '\'' +
                '}';
    }
}

+ 7 - 0
patient-co-statistics/src/main/resources/log4j2.properties

@ -0,0 +1,7 @@
appender.out.type = Console
appender.out.name = out
appender.out.layout.type = PatternLayout
appender.out.layout.pattern = [%30.30t] %-30.30c{1} %-5p %m%n
rootLogger.level = INFO
rootLogger.appenderRef.out.ref = out