Forráskód Böngészése

Merge branch 'dev' of http://192.168.1.220:10080/Amoy/patient-co-management into dev

Sand 8 éve
szülő
commit
6ec033afac
26 módosított fájl, 1583 hozzáadás és 606 törlés
  1. 1 1
      src/main/java/com/yihu/wlyy/entity/consult/ConsultTeam.java
  2. 1 1
      src/main/java/com/yihu/wlyy/entity/doctor/DoctorFamousConsultTimesRemain.java
  3. 73 5
      src/main/java/com/yihu/wlyy/entity/statistics/PopulationBase.java
  4. 57 49
      src/main/java/com/yihu/wlyy/interceptors/DoctorInterceptor.java
  5. 1 1
      src/main/java/com/yihu/wlyy/job/Constant.java
  6. 1 1
      src/main/java/com/yihu/wlyy/job/CurrentDayAllQuotaJob.java
  7. 30 25
      src/main/java/com/yihu/wlyy/job/SignAgeGroupDiseaseJob.java
  8. 9 1
      src/main/java/com/yihu/wlyy/repository/consult/ConsultDao.java
  9. 25 0
      src/main/java/com/yihu/wlyy/repository/consult/ConsultTeamDao.java
  10. 1 1
      src/main/java/com/yihu/wlyy/repository/doctor/FamousDoctorTimesRemainDao.java
  11. 2 0
      src/main/java/com/yihu/wlyy/repository/statistics/PopulationBaseDao.java
  12. 15 5
      src/main/java/com/yihu/wlyy/service/app/consult/ConsultService.java
  13. 59 13
      src/main/java/com/yihu/wlyy/service/app/consult/ConsultTeamService.java
  14. 114 13
      src/main/java/com/yihu/wlyy/service/app/disease/PatientDiseaseService.java
  15. 3 0
      src/main/java/com/yihu/wlyy/service/app/family/FamilyService.java
  16. 23 21
      src/main/java/com/yihu/wlyy/service/app/scheduling/DoctorWorkTimeService.java
  17. 671 413
      src/main/java/com/yihu/wlyy/service/app/statistics/StatisticsService.java
  18. 107 0
      src/main/java/com/yihu/wlyy/service/common/QrcodeService.java
  19. 37 0
      src/main/java/com/yihu/wlyy/service/common/account/DoctorService.java
  20. 2 1
      src/main/java/com/yihu/wlyy/task/PushMsgTask.java
  21. 99 0
      src/main/java/com/yihu/wlyy/web/common/qrcode/QrcodeController.java
  22. 2 2
      src/main/java/com/yihu/wlyy/web/doctor/consult/DoctorConsultController.java
  23. 124 7
      src/main/java/com/yihu/wlyy/web/patient/consult/ConsultController.java
  24. 96 46
      src/main/java/com/yihu/wlyy/web/statistic/StatisticsController.java
  25. 29 0
      src/main/java/com/yihu/wlyy/wechat/process/WeiXinEventProcess.java
  26. 1 0
      src/main/resources/system.properties

+ 1 - 1
src/main/java/com/yihu/wlyy/entity/consult/ConsultTeam.java

@ -30,7 +30,7 @@ public class ConsultTeam extends IdEntity {
	private String doctor;
	// 三师团队标识
	private String team;
	//三师咨询,2家庭医生咨询 3.名医咨询
	//1 三师咨询,2家庭医生咨询 6.名医咨询
	private Integer type;
	// 提问者标识
	private String patient;

+ 1 - 1
src/main/java/com/yihu/wlyy/entity/doctor/DoctorFamousConsultTimesRemain.java

@ -1,4 +1,4 @@
package com.yihu.wlyy.entity.doctor;
package com.yihu.wlyy.entity.doctor.schedule;
import com.yihu.wlyy.entity.IdEntity;
import org.springframework.data.repository.cdi.Eager;

+ 73 - 5
src/main/java/com/yihu/wlyy/entity/statistics/PopulationBase.java

@ -13,11 +13,30 @@ import javax.persistence.Table;
@Entity
@Table(name = "wlyy_people_num")
public class PopulationBase extends IdEntity implements java.io.Serializable{
    private String code;// 行政区划代码
    private String name;// 行政区划名称
    private Integer num;// 人口数
    private String type;// 类别 1市 2区
    private Integer year;// 年份
    // 行政区划代码
    private String code;
    // 行政区划名称
    private String name;
    // 人口数
    private Integer num;
    // 类别 1市 2区
    private String type;
    // 年份
    private Integer year;
    // 高血压发病数
    private Integer gxyNum;
    // 糖尿病发布数
    private Integer tnbNum;
    // 65岁以上老年人口数
    private Integer sixFiveNum;
    // 高血压任务数
    private Integer gxyTaskNum;
    // 糖尿病任务数
    private Integer tnbTaskNum;
    // 65岁以上老年人口任务数
    private Integer sixFiveTaskNum;
    // 户籍人口任务数
    private Integer taskNum;
    public String getCode() {
        return code;
@ -54,4 +73,53 @@ public class PopulationBase extends IdEntity implements java.io.Serializable{
    public void setYear(Integer year) {
        this.year = year;
    }
    public Integer getGxyNum() {
        return gxyNum;
    }
    public void setGxyNum(Integer gxyNum) {
        this.gxyNum = gxyNum;
    }
    public Integer getTnbNum() {
        return tnbNum;
    }
    public void setTnbNum(Integer tnbNum) {
        this.tnbNum = tnbNum;
    }
    public Integer getSixFiveNum() {
        return sixFiveNum;
    }
    public void setSixFiveNum(Integer sixFiveNum) {
        this.sixFiveNum = sixFiveNum;
    }
    public Integer getGxyTaskNum() {
        return gxyTaskNum;
    }
    public void setGxyTaskNum(Integer gxyTaskNum) {
        this.gxyTaskNum = gxyTaskNum;
    }
    public Integer getTnbTaskNum() {
        return tnbTaskNum;
    }
    public void setTnbTaskNum(Integer tnbTaskNum) {
        this.tnbTaskNum = tnbTaskNum;
    }
    public Integer getSixFiveTaskNum() {
        return sixFiveTaskNum;
    }
    public void setSixFiveTaskNum(Integer sixFiveTaskNum) {
        this.sixFiveTaskNum = sixFiveTaskNum;
    }
    public Integer getTaskNum() {
        return taskNum;
    }
    public void setTaskNum(Integer taskNum) {
        this.taskNum = taskNum;
    }
}

+ 57 - 49
src/main/java/com/yihu/wlyy/interceptors/DoctorInterceptor.java

@ -3,8 +3,16 @@ package com.yihu.wlyy.interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.yihu.wlyy.entity.security.Token;
import com.yihu.wlyy.util.DateUtil;
import com.yihu.wlyy.util.SystemConf;
import com.yihu.wlyy.util.SystemData;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;
import org.springframework.web.servlet.ModelAndView;
import java.util.Date;
/**
 * 医生权限校验
 * @author George
@ -16,55 +24,55 @@ public class DoctorInterceptor extends BaseInterceptor {
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		boolean flag = true;
		try {
//			response.setCharacterEncoding("UTF-8");
//			JSONObject json = getAgent(request);
//			if (json == null) {
//				// 未登录
//				response.getOutputStream().write(error(SystemConf.NOT_LOGIN, "请登录后再操作!").getBytes());
//				return false;
//			}
//			String tokenStr = json.has("token") ? json.getString("token") : "";
//			String uid = json.has("uid") ? json.getString("uid") : "";
//			String imei = json.has("imei") ? json.getString("imei") : "";
//
//			if (StringUtils.isEmpty(tokenStr) || StringUtils.isEmpty(imei) || StringUtils.isEmpty(uid)) {
//				response.getOutputStream().write(error(SystemConf.NOT_LOGIN, "请登录后再操作!").getBytes());
//				return false;
//			}
//
//			Token token = SystemData.doctorTokens.get(uid);
//			if (token == null) {
//				token = tokenDao.findByPatient(uid, 2);
//				if (token != null) {
//					// 加入缓存
//					SystemData.doctorTokens.put(uid, token);
//				}
//			}
//			if (token == null || token.getPlatform() != 2) {
//				// 未登录
//				response.getOutputStream().write(error(SystemConf.NOT_LOGIN, "请登录后再操作!").getBytes());
//				flag = false;
//			} else {
//				if (token.getTimeout().getTime() < new Date().getTime()) {
//					// 登录超时
//					response.getOutputStream().write(error(SystemConf.LOGIN_TIMEOUT, "登录超时,请重新登录").getBytes());
//					flag = false;
//				} else if (!StringUtils.equals(tokenStr, token.getToken()) || !StringUtils.equals(uid, token.getUser()) || !StringUtils.equals(imei, token.getImei())) {
//					// 别处登录
//					response.getOutputStream().write(error(SystemConf.LOGIN_OTHER, "帐号在别处登录,请重新登录").getBytes());
//					flag = false;
//				} else {
//					// 一天只更新一次
//					if (DateUtil.getDays(token.getCzrq(), DateUtil.getNowDateShort()) != 0) {
//						// 今天未更新,则更新缓存
//						token.setCzrq(new Date());
//						// 更新内存
//						SystemData.doctorTokens.put(uid, token);
//						// 更新数据库
//						tokenDao.save(token);
//					}
//				}
//			}
			response.setCharacterEncoding("UTF-8");
			JSONObject json = getAgent(request);
			if (json == null) {
				// 未登录
				response.getOutputStream().write(error(SystemConf.NOT_LOGIN, "请登录后再操作!").getBytes());
				return false;
			}
			String tokenStr = json.has("token") ? json.getString("token") : "";
			String uid = json.has("uid") ? json.getString("uid") : "";
			String imei = json.has("imei") ? json.getString("imei") : "";
			if (StringUtils.isEmpty(tokenStr) || StringUtils.isEmpty(imei) || StringUtils.isEmpty(uid)) {
				response.getOutputStream().write(error(SystemConf.NOT_LOGIN, "请登录后再操作!").getBytes());
				return false;
			}
			Token token = SystemData.doctorTokens.get(uid);
			if (token == null) {
				token = tokenDao.findByPatient(uid, 2);
				if (token != null) {
					// 加入缓存
					SystemData.doctorTokens.put(uid, token);
				}
			}
			if (token == null || token.getPlatform() != 2) {
				// 未登录
				response.getOutputStream().write(error(SystemConf.NOT_LOGIN, "请登录后再操作!").getBytes());
				flag = false;
			} else {
				if (token.getTimeout().getTime() < new Date().getTime()) {
					// 登录超时
					response.getOutputStream().write(error(SystemConf.LOGIN_TIMEOUT, "登录超时,请重新登录").getBytes());
					flag = false;
				} else if (!StringUtils.equals(tokenStr, token.getToken()) || !StringUtils.equals(uid, token.getUser()) || !StringUtils.equals(imei, token.getImei())) {
					// 别处登录
					response.getOutputStream().write(error(SystemConf.LOGIN_OTHER, "帐号在别处登录,请重新登录").getBytes());
					flag = false;
				} else {
					// 一天只更新一次
					if (DateUtil.getDays(token.getCzrq(), DateUtil.getNowDateShort()) != 0) {
						// 今天未更新,则更新缓存
						token.setCzrq(new Date());
						// 更新内存
						SystemData.doctorTokens.put(uid, token);
						// 更新数据库
						tokenDao.save(token);
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

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

@ -84,7 +84,7 @@ public class Constant {
            case "2":{
                return level_disease_2_name;
            }
            case "100":{
            case "3":{
                return level_disease_3_name;
            }
        }

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

@ -260,7 +260,7 @@ public class CurrentDayAllQuotaJob implements Job {
                        jsonObject.put("num",0);
                    }
                    jsonObject.put("name",townObj.getName());
                    jsonObject.put("date", DateUtil.dateToStrLong(new Date()));
                    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());
                }
            }

+ 30 - 25
src/main/java/com/yihu/wlyy/job/SignAgeGroupDiseaseJob.java

@ -119,36 +119,41 @@ public class SignAgeGroupDiseaseJob implements Job {
                boolean hasGXY = false;//有高血压
                boolean hasTNB = false;//有糖尿病
                //如果是慢病的 统计高血压的 糖尿病  1高血压,2糖尿病  糖尿病和高血压是100
                //如果是慢病的 统计高血压的 糖尿病  1高血压,2糖尿病  3 糖尿病和高血压 4健康人群数
                String diseaseType="";
                String jsonString = redisTemplate.opsForValue().get("disease:" + signFamily.getPatient());
                if (StringUtils.isEmpty(jsonString)) {
                    continue;
                }
                //排除数据 只留下高血压和糖尿病
                List<JSONObject> jsonObjects = new ArrayList<JSONObject>();
                JSONArray redisValues = new JSONArray(jsonString);
                for (Object obj : redisValues) {
                    JSONObject redisValue = new JSONObject(obj);
                    //排除掉三师签约
                    if ("1".equals(redisValue.get("signType").toString())) {
                        continue;
                    }
                    String disease = redisValue.get("disease").toString();
                    if (Integer.valueOf(disease).equals("1")) {
                        jsonObjects.add(redisValue);
                        hasGXY = true;//设置有高血压
                        diseaseType="1";
                    }
                    if (Integer.valueOf(disease).equals("2")) {
                        jsonObjects.add(redisValue);
                        hasTNB = true;//设置有糖尿病
                        diseaseType="2";
                    diseaseType="4";//健康人群
                }else{
                    //排除数据 只留下高血压和糖尿病
                    List<JSONObject> jsonObjects = new ArrayList<JSONObject>();
                    JSONArray redisValues = new JSONArray(jsonString);
                    if(redisValues.length()>0){
                        for (Object obj : redisValues) {
                            JSONObject redisValue = new JSONObject(obj);
                            //排除掉三师签约
                            if ("1".equals(redisValue.get("signType").toString())) {
                                continue;
                            }
                            String disease = redisValue.get("disease").toString();
                            if (Integer.valueOf(disease).equals("1")) {
                                jsonObjects.add(redisValue);
                                hasGXY = true;//设置有高血压
                                diseaseType="1";
                            }
                            if (Integer.valueOf(disease).equals("2")) {
                                jsonObjects.add(redisValue);
                                hasTNB = true;//设置有糖尿病
                                diseaseType="2";
                            }
                        }
                        if(hasGXY&&hasTNB){
                            diseaseType="3";
                        }
                    }else{
                        diseaseType="4";
                    }
                }
                if(hasGXY&&hasTNB){
                    diseaseType="100";
                }
                //统计市
                compute(cityAgeMap, Constant.city, ageCode, diseaseType);
                //统计区

+ 9 - 1
src/main/java/com/yihu/wlyy/repository/consult/ConsultDao.java

@ -12,12 +12,20 @@ public interface ConsultDao extends PagingAndSortingRepository<Consult, Long>, J
	
	Consult findByCode(String code);
	// 查询患者咨询记录
	@Query("select a.id,a.type,a.code,a.title,a.symptoms,a.czrq,b.status from Consult a,ConsultTeam b where a.code = b.consult and a.patient = ?1 and a.del = '1' and a.symptoms like ?2 order by a.czrq desc")
	Page<Object> findByPatient(String patient,String title, Pageable pageRequest);
	// 查询患者咨询记录
	@Query("select a.id,a.type,a.code,a.title,a.symptoms,a.czrq,b.status from Consult a,ConsultTeam b where a.code = b.consult and a.patient = ?1 and a.id < ?3 and a.del = '1'and a.symptoms like ?2 order by a.czrq desc")
	Page<Object> findByPatient(String patient,String title, long id, Pageable pageRequest);
	// 查询患者咨询记录
	@Query("select a.id,a.type,a.code,a.title,a.symptoms,a.czrq,b.status from Consult a,ConsultTeam b where a.code = b.consult and a.patient = ?1 and a.del = '1' order by a.czrq desc")
	Page<Object> findByPatient(String patient, Pageable pageRequest);
	// 查询患者咨询记录
	@Query("select a.id,a.type,a.code,a.title,a.symptoms,a.czrq,b.status from Consult a,ConsultTeam b where a.code = b.consult and a.patient = ?1 and a.id < ?2 and a.del = '1' order by a.czrq desc")
	@Query("select a.id,a.type,a.code,a.title,a.symptoms,a.czrq,b.status from Consult a,ConsultTeam b where a.code = b.consult and a.patient = ?1 and a.id < ?2 and a.del = '1'order by a.czrq desc")
	Page<Object> findByPatient(String patient, long id, Pageable pageRequest);
	@Query("select count(a) from Consult a,ConsultTeamDoctor b  where a.code = b.consult and a.patient=?1 and b.to=?2 ")

+ 25 - 0
src/main/java/com/yihu/wlyy/repository/consult/ConsultTeamDao.java

@ -6,6 +6,7 @@
package com.yihu.wlyy.repository.consult;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
@ -144,4 +145,28 @@ public interface ConsultTeamDao extends PagingAndSortingRepository<ConsultTeam,
	//查找
	@Query("SELECT a FROM ConsultTeam a WHERE a.patient=?1 and a.status=0 and a.del=1")
	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);
}

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

@ -1,6 +1,6 @@
package com.yihu.wlyy.repository.doctor;
import com.yihu.wlyy.entity.doctor.DoctorFamousConsultTimesRemain;
import com.yihu.wlyy.entity.doctor.schedule.DoctorFamousConsultTimesRemain;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;

+ 2 - 0
src/main/java/com/yihu/wlyy/repository/statistics/PopulationBaseDao.java

@ -12,4 +12,6 @@ public interface PopulationBaseDao extends PagingAndSortingRepository<Population
    @Query("select a.num from PopulationBase a where a.code = ?1 and a.year = (select max(b.year) from PopulationBase b where b.code = ?1)")
    int findPeopleNumByCode(String code);
    PopulationBase findByCodeAndYear(String code,Integer year);
}

+ 15 - 5
src/main/java/com/yihu/wlyy/service/app/consult/ConsultService.java

@ -19,6 +19,7 @@ import com.yihu.wlyy.repository.consult.ConsultTeamDao;
import com.yihu.wlyy.repository.doctor.DoctorDao;
import com.yihu.wlyy.repository.patient.PatientDao;
import com.yihu.wlyy.service.BaseService;
import org.springframework.util.StringUtils;
public class ConsultService extends BaseService {
@ -68,7 +69,7 @@ public class ConsultService extends BaseService {
	 * @param pagesize 分页大小
	 * @return
	 */
	public Page<Object> findConsultRecordByPatient(String patient, long id, int pagesize) {
	public Page<Object> findConsultRecordByPatient(String patient, long id, int pagesize,String title) {
		if (id < 0) {
			id = 0;
		}
@ -79,10 +80,19 @@ public class ConsultService extends BaseService {
		Sort sort = new Sort(Direction.DESC, "id");
		// 分页信息
		PageRequest pageRequest = new PageRequest(0, pagesize, sort);
		if (id > 0) {
			return consultDao.findByPatient(patient, id, pageRequest);
		} else {
			return consultDao.findByPatient(patient, pageRequest);
		if(!StringUtils.isEmpty(title)){
			title="%"+title+"%";
			if (id > 0) {
				return consultDao.findByPatient(patient,title, id, pageRequest);
			} else {
				return consultDao.findByPatient(patient,title, pageRequest);
			}
		}else{
			if (id > 0) {
				return consultDao.findByPatient(patient, id, pageRequest);
			} else {
				return consultDao.findByPatient(patient, pageRequest);
			}
		}
	}

+ 59 - 13
src/main/java/com/yihu/wlyy/service/app/consult/ConsultTeamService.java

@ -83,12 +83,12 @@ public class ConsultTeamService extends ConsultService {
	/**
	 * 查詢醫生網絡諮詢列表
	 * @param type 咨询类型:1、咨询我的,2、公共的, 3、参与过的,4、已结束的
	 * @param type 咨询类型:1、咨询我的,2、公共的, 3、参与过的,4、已结束的 5 名医咨询 全部  6 名医咨询 进行中 7 名医咨询 已结束
	 * @param id
	 * @param pagesize 每页显示数,默认为10
	 * @return
	 */
	public Page<ConsultTeam> findByDoctor(String uid, int type, long id, int pagesize) {
	public Page<ConsultTeam> findByDoctor(String uid, int type, long id, int pagesize,String title) {
		if (id < 0) {
			id = 0;
		}
@ -112,12 +112,58 @@ public class ConsultTeamService extends ConsultService {
			// 已完成的
			return findByDoctorType4(uid, id, pagesize);
		case 5:
			// 名医咨询
			return findByDoctorType1(uid, type, id, pagesize);
			// 5 名医咨询 全部
			return findByDoctorType5(uid, id, pagesize,title);
		case 6:
			//6 名医咨询 进行中
			return findByDoctorType6(uid, 0, id, pagesize,title);
		case 7:
			//7 名医咨询 已结束
			return findByDoctorType6(uid, 1, id, pagesize,title);
		}
		return null;
	}
	private Page<ConsultTeam> findByDoctorType5(String uid,  long id, int pagesize,String title) {
		Sort sort = new Sort(Direction.DESC, "id");
		// 分页信息
		PageRequest pageRequest = new PageRequest(0, pagesize, sort);
		if(StringUtils.isNoneEmpty(title)){
			title="%"+title+"%";
			if (id > 0) {
				return consultTeamDao.findFamousDoctorAllList(uid, id,title, pageRequest);
			} else {
				return consultTeamDao.findFamousDoctorAllList(uid,title, pageRequest);
			}
		}else{
			if (id > 0) {
				return consultTeamDao.findFamousDoctorAllList(uid, id, pageRequest);
			} else {
				return consultTeamDao.findFamousDoctorAllList(uid, pageRequest);
			}
		}
	}
	private Page<ConsultTeam> findByDoctorType6(String uid, int type, long id, int pagesize,String title) {
		// 排序
		Sort sort = new Sort(Direction.DESC, "id");
		// 分页信息
		PageRequest pageRequest = new PageRequest(0, pagesize, sort);
		if(StringUtils.isNoneEmpty(title)){
			title="%"+title+"%";
			if (id > 0) {
				return consultTeamDao.findFamousDoctorDoingList(uid, id,title,type, pageRequest);
			} else {
				return consultTeamDao.findFamousDoctorDoingList(uid, title,type,pageRequest);
			}
		}else{
			if (id > 0) {
				return consultTeamDao.findFamousDoctorDoingList(uid, id,type, pageRequest);
			} else {
				return consultTeamDao.findFamousDoctorDoingList(uid,type, pageRequest);
			}
		}
	}
	/**
	 * 查询全部咨询记录
	 * @param uid
@ -662,6 +708,15 @@ public class ConsultTeamService extends ConsultService {
		return consultTeamLogDao.findOne(logId);
	}
	public boolean isExistFamousConsult(String uid) {
		ConsultTeam consultTeam= consultTeamDao.findFamousConsultByPatient(uid);
		if(consultTeam!=null){
			return true;
		}else{
			return false;
		}
	}
	public void addFamousTeamConsult(ConsultTeam ct, String uid) throws Exception{
		// 设置患者信息
		ct.setPatient(uid);
@ -701,13 +756,4 @@ public class ConsultTeamService extends ConsultService {
		// 添加医生咨询日志
		addLogs(ct);
	}
	public boolean isExistFamousConsult(String uid) {
		ConsultTeam consultTeam= consultTeamDao.findFamousConsultByPatient(uid);
		if(consultTeam!=null){
			return true;
		}else{
			return false;
		}
	}
}

+ 114 - 13
src/main/java/com/yihu/wlyy/service/app/disease/PatientDiseaseService.java

@ -197,6 +197,21 @@ public class PatientDiseaseService extends BaseService {
                    groupInfoDao.save(ncdGroup);
                }
                if (groupInfoDao.countDoctorPatientGroupType(jjSign.getDoctorHealth(), patient, "2", "2") < 1) {
                    DoctorPatientGroupInfo ncdJgGroup = new DoctorPatientGroupInfo();
                    ncdJgGroup.setDoctor(jjSign.getDoctorHealth());
                    ncdJgGroup.setPatient(patient);
                    ncdJgGroup.setSignType("2");
                    ncdJgGroup.setCzrq(new Date());
                    ncdJgGroup.setStatus(1);
                    ncdJgGroup.setPname(jjSign.getName());
                    ncdJgGroup.setQyrq(jjSign.getApplyDate());
                    ncdJgGroup.setDqrq(jjSign.getEnd());
                    ncdJgGroup.setGroup("2");
                    groupInfoDao.save(ncdJgGroup);
                }
            }
            if (ssSign != null) {
                if (groupInfoDao.countDoctorPatientGroupType(ssSign.getDoctor(), patient, "2", "1") < 1) {
@ -214,9 +229,26 @@ public class PatientDiseaseService extends BaseService {
                    groupInfoDao.save(ncdGroup);
                }
                if (groupInfoDao.countDoctorPatientGroupType(ssSign.getDoctorHealth(), patient, "2", "1") < 1) {
                    DoctorPatientGroupInfo ncdJgGroup = new DoctorPatientGroupInfo();
                    ncdJgGroup.setDoctor(ssSign.getDoctorHealth());
                    ncdJgGroup.setPatient(patient);
                    ncdJgGroup.setSignType("1");
                    ncdJgGroup.setCzrq(new Date());
                    ncdJgGroup.setStatus(1);
                    ncdJgGroup.setPname(ssSign.getName());
                    ncdJgGroup.setQyrq(ssSign.getApplyDate());
                    ncdJgGroup.setDqrq(ssSign.getEnd());
                    ncdJgGroup.setGroup("2");
                    groupInfoDao.save(ncdJgGroup);
                }
            }
            groupInfoDao.updateDoctorPatientGroup(jjSign != null ? jjSign.getDoctor() : ssSign.getDoctor(), patient, "1", 0);
            groupInfoDao.updateDoctorPatientGroup(jjSign != null ? jjSign.getDoctor() : ssSign.getDoctor(), patient, "3", 0);
            groupInfoDao.updateDoctorPatientGroup(jjSign != null ? jjSign.getDoctorHealth() : ssSign.getDoctorHealth(), patient, "1", 0);
            groupInfoDao.updateDoctorPatientGroup(jjSign != null ? jjSign.getDoctorHealth() : ssSign.getDoctorHealth(), patient, "3", 0);
        } else {
            boolean isSixFive = false;
            String birth = p.getIdcard().substring(6, 14);
@ -251,6 +283,21 @@ public class PatientDiseaseService extends BaseService {
                        groupInfoDao.save(ncdGroup);
                    }
                    if (groupInfoDao.countDoctorPatientGroupType(jjSign.getDoctorHealth(), patient, "3", "2") < 1) {
                        DoctorPatientGroupInfo ncdJgGroup = new DoctorPatientGroupInfo();
                        ncdJgGroup.setDoctor(jjSign.getDoctorHealth());
                        ncdJgGroup.setPatient(patient);
                        ncdJgGroup.setSignType("2");
                        ncdJgGroup.setCzrq(new Date());
                        ncdJgGroup.setStatus(1);
                        ncdJgGroup.setPname(jjSign.getName());
                        ncdJgGroup.setQyrq(jjSign.getApplyDate());
                        ncdJgGroup.setDqrq(jjSign.getEnd());
                        ncdJgGroup.setGroup("3");
                        groupInfoDao.save(ncdJgGroup);
                    }
                }
                if (ssSign != null) {
                    if (groupInfoDao.countDoctorPatientGroupType(ssSign.getDoctor(), patient, "3", "1") < 1) {
@ -268,9 +315,26 @@ public class PatientDiseaseService extends BaseService {
                        groupInfoDao.save(ncdGroup);
                    }
                    if (groupInfoDao.countDoctorPatientGroupType(ssSign.getDoctorHealth(), patient, "3", "1") < 1) {
                        DoctorPatientGroupInfo ncdJgGroup = new DoctorPatientGroupInfo();
                        ncdJgGroup.setDoctor(ssSign.getDoctorHealth());
                        ncdJgGroup.setPatient(patient);
                        ncdJgGroup.setSignType("1");
                        ncdJgGroup.setCzrq(new Date());
                        ncdJgGroup.setStatus(1);
                        ncdJgGroup.setPname(ssSign.getName());
                        ncdJgGroup.setQyrq(ssSign.getApplyDate());
                        ncdJgGroup.setDqrq(ssSign.getEnd());
                        ncdJgGroup.setGroup("3");
                        groupInfoDao.save(ncdJgGroup);
                    }
                }
                groupInfoDao.updateDoctorPatientGroup(jjSign != null ? jjSign.getDoctor() : ssSign.getDoctor(), patient, "1", 0);
                groupInfoDao.updateDoctorPatientGroup(jjSign != null ? jjSign.getDoctor() : ssSign.getDoctor(), patient, "2", 0);
                groupInfoDao.updateDoctorPatientGroup(jjSign != null ? jjSign.getDoctorHealth() : ssSign.getDoctorHealth(), patient, "1", 0);
                groupInfoDao.updateDoctorPatientGroup(jjSign != null ? jjSign.getDoctorHealth() : ssSign.getDoctorHealth(), patient, "2", 0);
            } else {
                // 普通分组
                if (jjSign != null) {
@ -289,6 +353,21 @@ public class PatientDiseaseService extends BaseService {
                        groupInfoDao.save(ncdGroup);
                    }
                    if (groupInfoDao.countDoctorPatientGroupType(jjSign.getDoctorHealth(), patient, "1", "2") < 1) {
                        DoctorPatientGroupInfo ncdJgGroup = new DoctorPatientGroupInfo();
                        ncdJgGroup.setDoctor(jjSign.getDoctorHealth());
                        ncdJgGroup.setPatient(patient);
                        ncdJgGroup.setSignType("2");
                        ncdJgGroup.setCzrq(new Date());
                        ncdJgGroup.setStatus(1);
                        ncdJgGroup.setPname(jjSign.getName());
                        ncdJgGroup.setQyrq(jjSign.getApplyDate());
                        ncdJgGroup.setDqrq(jjSign.getEnd());
                        ncdJgGroup.setGroup("1");
                        groupInfoDao.save(ncdJgGroup);
                    }
                }
                if (ssSign != null) {
                    if (groupInfoDao.countDoctorPatientGroupType(ssSign.getDoctor(), patient, "1", "1") < 1) {
@ -306,9 +385,26 @@ public class PatientDiseaseService extends BaseService {
                        groupInfoDao.save(ncdGroup);
                    }
                    if (groupInfoDao.countDoctorPatientGroupType(ssSign.getDoctorHealth(), patient, "1", "1") < 1) {
                        DoctorPatientGroupInfo ncdJgGroup = new DoctorPatientGroupInfo();
                        ncdJgGroup.setDoctor(ssSign.getDoctorHealth());
                        ncdJgGroup.setPatient(patient);
                        ncdJgGroup.setSignType("1");
                        ncdJgGroup.setCzrq(new Date());
                        ncdJgGroup.setStatus(1);
                        ncdJgGroup.setPname(ssSign.getName());
                        ncdJgGroup.setQyrq(ssSign.getApplyDate());
                        ncdJgGroup.setDqrq(ssSign.getEnd());
                        ncdJgGroup.setGroup("1");
                        groupInfoDao.save(ncdJgGroup);
                    }
                }
                groupInfoDao.updateDoctorPatientGroup(jjSign != null ? jjSign.getDoctor() : ssSign.getDoctor(), patient, "2", 0);
                groupInfoDao.updateDoctorPatientGroup(jjSign != null ? jjSign.getDoctor() : ssSign.getDoctor(), patient, "3", 0);
                groupInfoDao.updateDoctorPatientGroup(jjSign != null ? jjSign.getDoctorHealth() : ssSign.getDoctorHealth(), patient, "2", 0);
                groupInfoDao.updateDoctorPatientGroup(jjSign != null ? jjSign.getDoctorHealth() : ssSign.getDoctorHealth(), patient, "3", 0);
            }
        }
@ -319,24 +415,29 @@ public class PatientDiseaseService extends BaseService {
     * 更新患者疾病到redis
     */
    public void updateToRedis() {
        String sql = "select * from wlyy_patient_disease where del = '1'";
        String sql = "select * from wlyy_patient_disease";
        List<Map<String, Object>> patientDiseases = jdbcTemplate.queryForList(sql);
        Map<String, JSONArray> diseases = new HashMap<>();
        if (patientDiseases != null) {
            for (Map<String, Object> map : patientDiseases) {
                JSONObject disease = new JSONObject();
                disease.put("disease", map.get("disease"));
                disease.put("diseaseName", map.get("disease_name"));
                disease.put("del", map.get("del"));
                disease.put("signType", map.get("sign_type"));
                if (diseases.containsKey(map.get("patient").toString())) {
                    diseases.get(map.get("patient").toString()).put(disease);
                } else {
                    JSONArray jsonArray = new JSONArray();
                    jsonArray.put(disease);
                    diseases.put(map.get("patient").toString(), jsonArray);
                if(!diseases.containsKey(map.get("patient").toString())){
                    diseases.put(map.get("patient").toString(), new JSONArray());
                }
                if(map.get("del").toString().equals("1")) {
                    JSONObject disease = new JSONObject();
                    disease.put("disease", map.get("disease"));
                    disease.put("diseaseName", map.get("disease_name"));
                    disease.put("del", map.get("del"));
                    disease.put("signType", map.get("sign_type"));
                    if (diseases.containsKey(map.get("patient").toString())) {
                        diseases.get(map.get("patient").toString()).put(disease);
                    } else {
                        JSONArray jsonArray = new JSONArray();
                        jsonArray.put(disease);
                        diseases.put(map.get("patient").toString(), jsonArray);
                    }
                }
            }
        }

+ 3 - 0
src/main/java/com/yihu/wlyy/service/app/family/FamilyService.java

@ -212,6 +212,9 @@ public class FamilyService {
                    patientTemp.setPoints(0);
                    patientTemp.setRecordAmount(0);
                    patientDao.save(patientTemp);
                    jo.put("code",patientTemp.getCode());
                }else{
                    jo.put("code",patient.getCode());
                }
            }
        }

+ 23 - 21
src/main/java/com/yihu/wlyy/service/app/scheduling/DoctorWorkTimeService.java

@ -1,6 +1,6 @@
package com.yihu.wlyy.service.app.scheduling;
import com.yihu.wlyy.entity.doctor.DoctorFamousConsultTimesRemain;
import com.yihu.wlyy.entity.doctor.schedule.DoctorFamousConsultTimesRemain;
import com.yihu.wlyy.entity.doctor.profile.Doctor;
import com.yihu.wlyy.entity.doctor.schedule.WlyyDoctorWorkTime;
import com.yihu.wlyy.entity.doctor.schedule.WlyyDoctorWorkWeek;
@ -28,6 +28,7 @@ import java.util.*;
@Transactional
public class DoctorWorkTimeService extends BaseService {
    static Object obj  = new Object();
    @Autowired
    private DoctorWorkTimeDao doctorWorkTimeDao;
    @Autowired
@ -382,32 +383,33 @@ public class DoctorWorkTimeService extends BaseService {
     */
    public boolean setDoctorCurrentConsultTimesRemain(String doctor) {
        try {
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            DoctorFamousConsultTimesRemain timesRemain = timesRemainDao.findByDoctorAndConsultDate(doctor, df.format(new Date()));
            synchronized (obj) {
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                DoctorFamousConsultTimesRemain timesRemain = timesRemainDao.findByDoctorAndConsultDate(doctor, df.format(new Date()));
            if (timesRemain != null) {
                int times = timesRemain.getTimesRemain();
                if (timesRemain != null) {
                    int times = timesRemain.getTimesRemain();
                if (times < 1) {
                    throw new Exception("consult-times-error:doctor does not have not consult times remain");
                }
                    if (times < 1) {
                        throw new Exception("consult-times-error:doctor does not have not consult times remain");
                    }
                timesRemain.setTimesRemain(times - 1);
                timesRemainDao.save(timesRemain);
            } else {
                DoctorFamousConsultTimesRemain timesRemainNew = new DoctorFamousConsultTimesRemain();
                WlyyDoctorWorkTime workTime = doctorWorkTimeDao.findDoctorWorkTime(doctor);
                    timesRemain.setTimesRemain(times - 1);
                    timesRemainDao.save(timesRemain);
                } else {
                    DoctorFamousConsultTimesRemain timesRemainNew = new DoctorFamousConsultTimesRemain();
                    WlyyDoctorWorkTime workTime = doctorWorkTimeDao.findDoctorWorkTime(doctor);
                if (workTime == null || workTime.getFamousConsultTimes() < 1) {
                    throw new Exception("consult-times-error:doctor does not have consult times setting");
                }
                    if (workTime == null || workTime.getFamousConsultTimes() < 1) {
                        throw new Exception("consult-times-error:doctor does not have consult times setting");
                    }
                timesRemainNew.setDoctor(doctor);
                timesRemainNew.setConsultDate(df.format(new Date()));
                timesRemainNew.setTimesRemain(workTime.getFamousConsultTimes() - 1);
                timesRemainDao.save(timesRemainNew);
                    timesRemainNew.setDoctor(doctor);
                    timesRemainNew.setConsultDate(df.format(new Date()));
                    timesRemainNew.setTimesRemain(workTime.getFamousConsultTimes() - 1);
                    timesRemainDao.save(timesRemainNew);
                }
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();

+ 671 - 413
src/main/java/com/yihu/wlyy/service/app/statistics/StatisticsService.java

@ -3,6 +3,8 @@ package com.yihu.wlyy.service.app.statistics;
import com.yihu.wlyy.entity.address.Hospital;
import com.yihu.wlyy.entity.address.Town;
import com.yihu.wlyy.entity.doctor.profile.Doctor;
import com.yihu.wlyy.entity.statistics.PopulationBase;
import com.yihu.wlyy.repository.*;
import com.yihu.wlyy.repository.address.CityDao;
import com.yihu.wlyy.repository.address.TownDao;
import com.yihu.wlyy.repository.doctor.DoctorDao;
@ -58,7 +60,7 @@ public class StatisticsService extends BaseService {
    @Autowired
    JdbcTemplate jdbcTemplate;
    @Autowired
    PopulationBaseDao populationBaseDao;
    PopulationBaseDao peopleNumDao;
    @Autowired
    private StringRedisTemplate redisTemplate;
@ -66,42 +68,42 @@ public class StatisticsService extends BaseService {
     * 查询截止某个日期累计量
     *
     * @param endDate 截止日期
     * @param area 区域或机构代码
     * @param level 级别
     * @param area    区域或机构代码
     * @param level   级别
     * @return
     */
    public long getTotalAmount(String endDate,String area,int level,String index){
    public long getTotalAmount(String endDate, String area, int level, String index) {
        int todayAmount = 0;
        // 查询语句
        String sql = " select " +
                     "     sum(result) amount" +
                     " from  " +
                     "     wlyy_quota_result " +
                     " where " +
                     "     quato_code = '" + index + "' " +
                     "   and level1_type = ? and del = '1'" +
                     "   and quota_date <= ? ";
        if(level == 4){
                "     sum(result) amount" +
                " from  " +
                "     wlyy_quota_result " +
                " where " +
                "     quato_code = '" + index + "' " +
                "   and level1_type = ? and del = '1'" +
                "   and quota_date <= ? ";
        if (level == 4) {
            // 市级别
            sql += " and city = ? ";
        }else if(level == 3){
        } else if (level == 3) {
            // 区、城镇级别
            sql += " and town = ? ";
        }else if(level == 2){
        } else if (level == 2) {
            // 机构级别
            sql += " and org_code = ? ";
        }else if(level == 1){
        } else if (level == 1) {
            sql += " and qkdoctor_code = ?";
        }
        Map<String,Object> result = jdbcTemplate.queryForMap(sql,new Object[]{level,endDate,area});
        Map<String, Object> result = jdbcTemplate.queryForMap(sql, new Object[]{level, endDate, area});
        // 截止日期包含当天,则从redis查询当天统计数据
        if(endDate.compareTo(new SimpleDateFormat("yyyy-MM-dd").format(new Date())) >= 0){
            String val =  redisTemplate.opsForValue().get("quota:" + index + ":" + level + ":" + area);
            if(!StringUtils.isEmpty(val)) {
        if (endDate.compareTo(new SimpleDateFormat("yyyy-MM-dd").format(new Date())) >= 0) {
            String val = redisTemplate.opsForValue().get("quota:" + index + ":" + level + ":" + area);
            if (!StringUtils.isEmpty(val)) {
                JSONObject valJson = new JSONObject(val);
                if (valJson.has("num") && valJson.getInt("num") > 0) {
                    todayAmount = valJson.getInt("num");
@ -109,9 +111,9 @@ public class StatisticsService extends BaseService {
            }
        }
        if(result != null){
            return (result.get("amount") != null ? Math.round((double)result.get("amount")) : 0) + todayAmount;
        }else{
        if (result != null) {
            return (result.get("amount") != null ? Math.round((double) result.get("amount")) : 0) + todayAmount;
        } else {
            return 0 + todayAmount;
        }
    }
@ -120,19 +122,39 @@ public class StatisticsService extends BaseService {
     * 查询截止某个日期累计签约率
     *
     * @param endDate 截止日期
     * @param area 区域或机构代码
     * @param level 级别
     * @param area    区域或机构代码
     * @param level   级别
     * @return
     */
    public String getSignRate(String endDate,String area,int level) throws Exception {
        long signAmount = getTotalAmount(endDate,area,level,SIGN);
        long serviceNum = populationBaseDao.findPeopleNumByCode(area);
        DecimalFormat df = new DecimalFormat("0.00");
        if(serviceNum > 0){
            return df.format((signAmount*1.00)/serviceNum*100);
        }else{
            throw new Exception("服务人口为0");
    public String getSignRate(String endDate, String area, int level) throws Exception {
        long signAmount = getTotalAmount(endDate, area, level, SIGN);
        PopulationBase peopleNum = peopleNumDao.findByCodeAndYear(area, Calendar.getInstance().get(Calendar.YEAR));
        DecimalFormat df = new DecimalFormat("0.0000");
        if (peopleNum != null && peopleNum.getNum() > 0) {
            return df.format((signAmount * 1.0000) / peopleNum.getNum() * 100);
        } else {
            throw new Exception("户籍人口为0");
        }
    }
    /**
     * 查询截止某个日期签约完成率
     *
     * @param endDate 截止日期
     * @param area    区域或机构代码
     * @param level   级别
     * @return
     */
    public String getSignTaskRate(String endDate, String area, int level) throws Exception {
        long signAmount = getTotalAmount(endDate, area, level, SIGN);
        PopulationBase peopleNum = peopleNumDao.findByCodeAndYear(area, Calendar.getInstance().get(Calendar.YEAR));
        DecimalFormat df = new DecimalFormat("0.0000");
        if (peopleNum != null && peopleNum.getTaskNum() > 0) {
            return df.format((signAmount * 1.0000) / peopleNum.getTaskNum() * 100);
        } else {
            throw new Exception("户籍人口任务数为0");
        }
    }
@ -140,11 +162,11 @@ public class StatisticsService extends BaseService {
     * 查询截止某个日期累计建档率
     *
     * @param endDate 截止日期
     * @param area 区域或机构代码
     * @param level 级别
     * @param area    区域或机构代码
     * @param level   级别
     * @return
     */
    public String getFilingRate(String endDate,String area,int level){
    public String getFilingRate(String endDate, String area, int level) {
        return "";
    }
@ -153,12 +175,12 @@ public class StatisticsService extends BaseService {
     * 获取某个指标在某个期间的增长量
     *
     * @param startDate 起始时间
     * @param endDate 结束时间
     * @param area 区域或机构代码
     * @param level 级别
     * @param endDate   结束时间
     * @param area      区域或机构代码
     * @param level     级别
     * @return
     */
    public long getIntervalIncrement(String startDate,String endDate,String area,int level,String index){
    public long getIntervalIncrement(String startDate, String endDate, String area, int level, String index) {
        int todayAmount = 0;
        // 查询语句
@ -172,25 +194,25 @@ public class StatisticsService extends BaseService {
                "   and quota_date >= ? " +
                "   and quota_date <= ? ";
        if(level == 4){
        if (level == 4) {
            // 市级别
            sql += " and city = ? ";
        }else if(level == 3){
        } else if (level == 3) {
            // 区、城镇级别
            sql += " and town = ? ";
        }else if(level == 2){
        } else if (level == 2) {
            // 机构级别
            sql += " and org_code = ? ";
        }else if(level == 1){
        } else if (level == 1) {
            sql += " and qkdoctor_code = ?";
        }
        Map<String,Object> result = jdbcTemplate.queryForMap(sql,new Object[]{level,startDate,endDate,area});
        Map<String, Object> result = jdbcTemplate.queryForMap(sql, new Object[]{level, startDate, endDate, area});
        // 截止日期包含当天,则从redis查询当天统计数据
        if(endDate.compareTo(new SimpleDateFormat("yyyy-MM-dd").format(new Date())) >= 0){
            String val =  redisTemplate.opsForValue().get("quota:" + index + ":" + level + ":" + area);
            if(!StringUtils.isEmpty(val)) {
        if (endDate.compareTo(new SimpleDateFormat("yyyy-MM-dd").format(new Date())) >= 0) {
            String val = redisTemplate.opsForValue().get("quota:" + index + ":" + level + ":" + area);
            if (!StringUtils.isEmpty(val)) {
                JSONObject valJson = new JSONObject(val);
                if (valJson.has("num") && valJson.getInt("num") > 0) {
                    todayAmount = valJson.getInt("num");
@ -198,9 +220,9 @@ public class StatisticsService extends BaseService {
            }
        }
        if(result != null){
            return (result.get("amount") != null ? Math.round((double)result.get("amount")) : 0) + todayAmount;
        }else{
        if (result != null) {
            return (result.get("amount") != null ? Math.round((double) result.get("amount")) : 0) + todayAmount;
        } else {
            return 0 + todayAmount;
        }
    }
@ -209,31 +231,31 @@ public class StatisticsService extends BaseService {
     * 查询截止某个日期某个区域后机构各下级累计签约情况
     *
     * @param endDate 截止日期
     * @param area 区域或机构代码
     * @param level 级别
     * @param area    区域或机构代码
     * @param level   级别
     * @return
     */
    public JSONArray getLowLevelSignDetail(String endDate, String area, int level){
    public JSONArray getLowLevelSignDetail(String endDate, String area, int level) {
        String areaField = "";
        String lowLevelField = "";
        String lowLevelName = "";
        if(level == 4){
        if (level == 4) {
            // 市级别
            areaField = "city";
            lowLevelField = "town";
            lowLevelName = "town_name";
        }else if(level == 3){
        } else if (level == 3) {
            // 区、城镇级别
            areaField = "town";
            lowLevelField = "org_code";
            lowLevelName = "org_name";
        }else if(level == 2){
        } else if (level == 2) {
            // 机构级别
            areaField = "org_code";
            lowLevelField = "qkdoctor_code";
            lowLevelName = "qkdoctor_name";
        }else if(level == 1){
        } else if (level == 1) {
        }
        // 查询语句
@ -258,19 +280,19 @@ public class StatisticsService extends BaseService {
                "   and a." + areaField + " = ? " +
                " group by a." + lowLevelField + ",a." + lowLevelName;
        List<Map<String,Object>> resultList = jdbcTemplate.queryForList(sql,new Object[]{level - 1,endDate,area});
        List<Map<String, Object>> resultList = jdbcTemplate.queryForList(sql, new Object[]{level - 1, endDate, area});
        if(resultList != null){
        if (resultList != null) {
            DecimalFormat df = new DecimalFormat("0.00");
            for(Map<String,Object> map : resultList){
                map.put("amount",map.get("amount") != null ? Math.round((double)map.get("amount")) : 0);
            for (Map<String, Object> map : resultList) {
                map.put("amount", map.get("amount") != null ? Math.round((double) map.get("amount")) : 0);
//                if(level > 3){
//                    map.put("rate",df.format(map.get("rate") != null ? map.get("rate") : 0));
//                }
            }
            return new JSONArray(resultList);
        }else {
        } else {
            return new JSONArray();
        }
    }
@ -279,31 +301,31 @@ public class StatisticsService extends BaseService {
     * 查询截止某个日期某个区域后机构各下级累计建档情况
     *
     * @param endDate 截止日期
     * @param area 区域或机构代码
     * @param level 级别
     * @param area    区域或机构代码
     * @param level   级别
     * @return
     */
    public JSONArray getLowLevelFilingDetail(String endDate, String area, int level){
    public JSONArray getLowLevelFilingDetail(String endDate, String area, int level) {
        String areaField = "";
        String lowLevelField = "";
        String lowLevelName = "";
        if(level == 4){
        if (level == 4) {
            // 市级别
            areaField = "city";
            lowLevelField = "town";
            lowLevelName = "town_name";
        }else if(level == 3){
        } else if (level == 3) {
            // 区、城镇级别
            areaField = "town";
            lowLevelField = "org_code";
            lowLevelName = "org_name";
        }else if(level == 2){
        } else if (level == 2) {
            // 机构级别
            areaField = "org_code";
            lowLevelField = "qkdoctor_code";
            lowLevelName = "qkdoctor_name";
        }else if(level == 1){
        } else if (level == 1) {
        }
        // 查询语句
@ -320,15 +342,15 @@ public class StatisticsService extends BaseService {
                "   and " + areaField + " = ? " +
                " group by " + lowLevelField + "," + lowLevelName;
        List<Map<String,Object>> resultList = jdbcTemplate.queryForList(sql,new Object[]{endDate,area});
        List<Map<String, Object>> resultList = jdbcTemplate.queryForList(sql, new Object[]{endDate, area});
        if(resultList != null){
            for(Map<String,Object> map : resultList){
                map.put("amount",map.get("amount") != null ? Math.round((double)map.get("amount")) : 0);
        if (resultList != null) {
            for (Map<String, Object> map : resultList) {
                map.put("amount", map.get("amount") != null ? Math.round((double) map.get("amount")) : 0);
            }
            return new JSONArray(resultList);
        }else {
        } else {
            return new JSONArray();
        }
    }
@ -337,33 +359,49 @@ public class StatisticsService extends BaseService {
     * 查询截止某个日期某个区域后机构各下级指标累计情况
     *
     * @param endDate 截止日期
     * @param area 区域或机构代码
     * @param level 级别
     * @param area    区域或机构代码
     * @param level   级别
     * @return
     */
    public JSONArray getLowLevelTotalDetail(String endDate, String area, int level,String index,int sort){
    public JSONArray getLowLevelTotalDetail(String endDate, String area, int level, String index, int sort, String lowLevel) throws Exception {
        String areaField = "";
        String lowLevelField = "";
        String lowLevelName = "";
        if(level == 4){
        if (level == 4) {
            // 市级别
            areaField = "city";
            lowLevelField = "town";
            lowLevelName = "town_name";
        }else if(level == 3){
        } else if (level == 3) {
            // 区、城镇级别
            areaField = "town";
            lowLevelField = "org_code";
            lowLevelName = "org_name";
        }else if(level == 2){
        } else if (level == 2) {
            // 机构级别
            areaField = "org_code";
            lowLevelField = "qkdoctor_code";
            lowLevelName = "qkdoctor_name";
        }else if(level == 1){
        } else if (level == 1) {
            throw new Exception("param level error");
        }
        if (!StringUtils.isEmpty(lowLevel)) {
            if (lowLevel.equals("3")) {
                lowLevelField = "town";
                lowLevelName = "town_name";
            } else if (lowLevel.equals("2")) {
                lowLevelField = "org_code";
                lowLevelName = "org_name";
            } else if (lowLevel.equals("1")) {
                lowLevelField = "qkdoctor_code";
                lowLevelName = "qkdoctor_name";
            } else {
                throw new Exception("param lowLevel error");
            }
        }
        // 查询语句
        String sql = " select " +
                "     ifnull(" + lowLevelField + ",'') code " +
@ -378,60 +416,60 @@ public class StatisticsService extends BaseService {
                "   and " + areaField + " = ? " +
                " group by " + lowLevelField + "," + lowLevelName;
        if(sort == 1){
        if (sort == 1) {
            sql += " order by amount desc";
        }else{
        } else {
            sql += " order by amount asc ";
        }
        List<Map<String,Object>> resultList = jdbcTemplate.queryForList(sql,new Object[]{level - 1,endDate,area});
        List<Map<String, Object>> resultList = jdbcTemplate.queryForList(sql, new Object[]{(StringUtils.isEmpty(lowLevel)?(level - 1):lowLevel), endDate, area});
        // 结果为空时,自建结果集
        if(resultList == null || resultList.size() < 1){
        if (resultList == null || resultList.size() < 1) {
            resultList = new ArrayList<>();
            if(level  == 4){
            if (level == 4) {
                List<Town> towns = townDao.findByCityCode(area);
                if(towns != null){
                    for(Town town : towns){
                        Map<String,Object> obj =  new HashMap<>();
                        obj.put("code",town.getCode());
                        obj.put("name",town.getName());
                        obj.put("amount",Double.valueOf("0.0"));
                if (towns != null) {
                    for (Town town : towns) {
                        Map<String, Object> obj = new HashMap<>();
                        obj.put("code", town.getCode());
                        obj.put("name", town.getName());
                        obj.put("amount", Double.valueOf("0.0"));
                    }
                }
            }else if(level == 3){
            } else if (level == 3) {
                List<Hospital> hospitals = hospitalDao.findByTownCode(area);
                if(hospitals != null){
                    for(Hospital hos : hospitals){
                        Map<String,Object> obj =  new HashMap<>();
                        obj.put("code",hos.getCode());
                        obj.put("name",hos.getName());
                        obj.put("amount",Double.valueOf("0.0"));
                if (hospitals != null) {
                    for (Hospital hos : hospitals) {
                        Map<String, Object> obj = new HashMap<>();
                        obj.put("code", hos.getCode());
                        obj.put("name", hos.getName());
                        obj.put("amount", Double.valueOf("0.0"));
                    }
                }
            }else if(level == 2){
                List<Doctor> doctors = doctorDao.findDoctorByLevelAndHospital(area,2);
                if(doctors != null){
                    for(Doctor doc : doctors){
                        Map<String,Object> obj =  new HashMap<>();
                        obj.put("code",doc.getCode());
                        obj.put("name",doc.getName());
                        obj.put("amount",Double.valueOf("0.0"));
            } else if (level == 2) {
                List<Doctor> doctors = doctorDao.findDoctorByLevelAndHospital(area, 2);
                if (doctors != null) {
                    for (Doctor doc : doctors) {
                        Map<String, Object> obj = new HashMap<>();
                        obj.put("code", doc.getCode());
                        obj.put("name", doc.getName());
                        obj.put("amount", Double.valueOf("0.0"));
                    }
                }
            }
        }
        if(resultList != null){
            for(Map<String,Object> map : resultList){
                map.put("amount",map.get("amount") != null ? Math.round((double)map.get("amount")) : 0);
        if (resultList != null) {
            for (Map<String, Object> map : resultList) {
                map.put("amount", map.get("amount") != null ? Math.round((double) map.get("amount")) : 0);
                // 截止日期包含当天,则从redis查询当天统计数据
                if(endDate.compareTo(new SimpleDateFormat("yyyy-MM-dd").format(new Date())) >= 0){
                if (endDate.compareTo(new SimpleDateFormat("yyyy-MM-dd").format(new Date())) >= 0) {
                    String code = map.get("code") != null ? String.valueOf(map.get("code")) : "";
                    String val =  redisTemplate.opsForValue().get("quota:" + index + ":" + (level - 1) + ":" + code);
                    if(!StringUtils.isEmpty(val)) {
                    String val = redisTemplate.opsForValue().get("quota:" + index + ":" + (StringUtils.isEmpty(lowLevel)?(level - 1):lowLevel) + ":" + code);
                    if (!StringUtils.isEmpty(val)) {
                        JSONObject valJson = new JSONObject(val);
                        if (valJson.has("num") && valJson.getInt("num") > 0) {
                            map.put("amount",(long)map.get("amount") + valJson.getInt("num"));
                            map.put("amount", (long) map.get("amount") + valJson.getInt("num"));
                        }
                    }
                }
@ -442,18 +480,18 @@ public class StatisticsService extends BaseService {
                    long map1value = (long) o1.get("amount");
                    long map2value = (long) o2.get("amount");
                    if(map1value - map2value > 0){
                    if (map1value - map2value > 0) {
                        return sort == 1 ? -1 : 1;
                    }else if(map1value - map2value < 0){
                    } else if (map1value - map2value < 0) {
                        return sort == 1 ? 1 : -1;
                    }else{
                    } else {
                        return 0;
                    }
                }
            });
            return new JSONArray(resultList);
        }else {
        } else {
            return new JSONArray();
        }
    }
@ -462,35 +500,51 @@ public class StatisticsService extends BaseService {
     * 查询某个日期范围内某个区域或机构各下级指标增量情况
     *
     * @param startDate 起始日期
     * @param endDate 结束日期
     * @param area 区域或机构代码
     * @param level 级别
     * @param index 指标
     * @param endDate   结束日期
     * @param area      区域或机构代码
     * @param level     级别
     * @param index     指标
     * @return
     */
    public JSONArray getLowLevelIncrementDetail(String startDate,String endDate,String area,int level,String index,int sort){
    public JSONArray getLowLevelIncrementDetail(String startDate, String endDate, String area, int level, String index, int sort,String lowLevel) throws Exception {
        String areaField = "";
        String lowLevelField = "";
        String lowLevelName = "";
        if(level == 4){
        if (level == 4) {
            // 市级别
            areaField = "city";
            lowLevelField = "town";
            lowLevelName = "town_name";
        }else if(level == 3){
        } else if (level == 3) {
            // 区、城镇级别
            areaField = "town";
            lowLevelField = "org_code";
            lowLevelName = "org_name";
        }else if(level == 2){
        } else if (level == 2) {
            // 机构级别
            areaField = "org_code";
            lowLevelField = "qkdoctor_code";
            lowLevelName = "qkdoctor_name";
        }else if(level == 1){
        } else if (level == 1) {
            throw new Exception("param level error");
        }
        if (!StringUtils.isEmpty(lowLevel)) {
            if (lowLevel.equals("3")) {
                lowLevelField = "town";
                lowLevelName = "town_name";
            } else if (lowLevel.equals("2")) {
                lowLevelField = "org_code";
                lowLevelName = "org_name";
            } else if (lowLevel.equals("1")) {
                lowLevelField = "qkdoctor_code";
                lowLevelName = "qkdoctor_name";
            } else {
                throw new Exception("param lowLevel error");
            }
        }
        // 查询语句
        String sql = " select " +
                "     ifnull(" + lowLevelField + ",'') code " +
@ -506,64 +560,64 @@ public class StatisticsService extends BaseService {
                "   and " + areaField + " = ? " +
                " group by " + lowLevelField + "," + lowLevelName;
        if(sort == 1){
        if (sort == 1) {
            sql += " order by amount desc";
        }else{
        } else {
            sql += " order by amount asc ";
        }
        List<Map<String,Object>> resultList = jdbcTemplate.queryForList(sql,new Object[]{level - 1,startDate,endDate,area});
        List<Map<String, Object>> resultList = jdbcTemplate.queryForList(sql, new Object[]{(StringUtils.isEmpty(lowLevel)?(level - 1):lowLevel), startDate, endDate, area});
        // 结果为空时,自建结果集
        if(resultList == null || resultList.size() < 1){
        if (resultList == null || resultList.size() < 1) {
            resultList = new ArrayList<>();
            if(level  == 4){
            if (level == 4) {
                List<Town> towns = townDao.findByCityCode(area);
                if(towns != null){
                    for(Town town : towns){
                        Map<String,Object> obj =  new HashMap<>();
                        obj.put("code",town.getCode());
                        obj.put("name",town.getName());
                        obj.put("amount",Double.valueOf("0.0"));
                if (towns != null) {
                    for (Town town : towns) {
                        Map<String, Object> obj = new HashMap<>();
                        obj.put("code", town.getCode());
                        obj.put("name", town.getName());
                        obj.put("amount", Double.valueOf("0.0"));
                        resultList.add(obj);
                    }
                }
            }else if(level == 3){
            } else if (level == 3) {
                List<Hospital> hospitals = hospitalDao.findByTownCode(area);
                if(hospitals != null){
                    for(Hospital hos : hospitals){
                        Map<String,Object> obj =  new HashMap<>();
                        obj.put("code",hos.getCode());
                        obj.put("name",hos.getName());
                        obj.put("amount",Double.valueOf("0.0"));
                if (hospitals != null) {
                    for (Hospital hos : hospitals) {
                        Map<String, Object> obj = new HashMap<>();
                        obj.put("code", hos.getCode());
                        obj.put("name", hos.getName());
                        obj.put("amount", Double.valueOf("0.0"));
                        resultList.add(obj);
                    }
                }
            }else if(level == 2){
                List<Doctor> doctors = doctorDao.findDoctorByLevelAndHospital(area,2);
                if(doctors != null){
                    for(Doctor doc : doctors){
                        Map<String,Object> obj =  new HashMap<>();
                        obj.put("code",doc.getCode());
                        obj.put("name",doc.getName());
                        obj.put("amount",Double.valueOf("0.0"));
            } else if (level == 2) {
                List<Doctor> doctors = doctorDao.findDoctorByLevelAndHospital(area, 2);
                if (doctors != null) {
                    for (Doctor doc : doctors) {
                        Map<String, Object> obj = new HashMap<>();
                        obj.put("code", doc.getCode());
                        obj.put("name", doc.getName());
                        obj.put("amount", Double.valueOf("0.0"));
                        resultList.add(obj);
                    }
                }
            }
        }
        if(resultList != null){
            for(Map<String,Object> map : resultList){
                map.put("amount",map.get("amount") != null ? Math.round((double)map.get("amount")) : 0);
        if (resultList != null) {
            for (Map<String, Object> map : resultList) {
                map.put("amount", map.get("amount") != null ? Math.round((double) map.get("amount")) : 0);
                // 截止日期包含当天,则从redis查询当天统计数据
                if(endDate.compareTo(new SimpleDateFormat("yyyy-MM-dd").format(new Date())) >= 0){
                if (endDate.compareTo(new SimpleDateFormat("yyyy-MM-dd").format(new Date())) >= 0) {
                    String code = map.get("code") != null ? String.valueOf(map.get("code")) : "";
                    String val =  redisTemplate.opsForValue().get("quota:" + index + ":" + (level - 1) + ":" + code);
                    if(!StringUtils.isEmpty(val)) {
                    String val = redisTemplate.opsForValue().get("quota:" + index + ":" + (StringUtils.isEmpty(lowLevel)?(level - 1):lowLevel) + ":" + code);
                    if (!StringUtils.isEmpty(val)) {
                        JSONObject valJson = new JSONObject(val);
                        if (valJson.has("num") && valJson.getInt("num") > 0) {
                            map.put("amount",(long)map.get("amount") + valJson.getInt("num"));
                            map.put("amount", (long) map.get("amount") + valJson.getInt("num"));
                        }
                    }
                }
@ -574,18 +628,18 @@ public class StatisticsService extends BaseService {
                    long map1value = (long) o1.get("amount");
                    long map2value = (long) o2.get("amount");
                    if(map1value - map2value > 0){
                    if (map1value - map2value > 0) {
                        return sort == 1 ? -1 : 1;
                    }else if(map1value - map2value < 0){
                    } else if (map1value - map2value < 0) {
                        return sort == 1 ? 1 : -1;
                    }else{
                    } else {
                        return 0;
                    }
                }
            });
            return new JSONArray(resultList);
        }else {
        } else {
            return new JSONArray();
        }
    }
@ -594,22 +648,20 @@ public class StatisticsService extends BaseService {
     * 获取时间范围内按间隔统计指标增量
     *
     * @param startDate 起始时间
     * @param endDate 结束时间
     * @param interval 时间间隔
     * @param area 区域或机构代码
     * @param level 级别
     * @param index 指标
     * @param endDate   结束时间
     * @param interval  时间间隔
     * @param area      区域或机构代码
     * @param level     级别
     * @param index     指标
     * @return
     */
    public JSONArray getDateIncrementDetail(String startDate,String endDate,int interval,String area,int level,String index) throws Exception {
        if(interval == 1) {
            return dateStatistics(startDate,endDate,area,level,index);
        }
        else if(interval == 2){
            return weekStatistics(startDate,endDate,area,level,index);
        }
        else if(interval == 3) {
            return monthStatistics(startDate,endDate,area,level,index);
    public JSONArray getDateIncrementDetail(String startDate, String endDate, int interval, String area, int level, String index) throws Exception {
        if (interval == 1) {
            return dateStatistics(startDate, endDate, area, level, index);
        } else if (interval == 2) {
            return weekStatistics(startDate, endDate, area, level, index);
        } else if (interval == 3) {
            return monthStatistics(startDate, endDate, area, level, index);
        }
        return new JSONArray();
@ -625,21 +677,21 @@ public class StatisticsService extends BaseService {
     * @param index
     * @return
     */
    private JSONArray dateStatistics(String startDate,String endDate,String area,int level,String index){
    private JSONArray dateStatistics(String startDate, String endDate, String area, int level, String index) {
        String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        String areaField = "";
        String sql ="";
        String sql = "";
        if(level == 4){
        if (level == 4) {
            // 市级别
            areaField = "city";
        }else if(level == 3){
        } else if (level == 3) {
            // 区、城镇级别
            areaField = "town";
        }else if(level == 2){
        } else if (level == 2) {
            // 机构级别
            areaField = "org_code";
        }else if(level == 1){
        } else if (level == 1) {
            // 机构级别
            areaField = "qkdoctor_code";
        }
@ -647,59 +699,59 @@ public class StatisticsService extends BaseService {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        // 起始日期
        Calendar start = Calendar.getInstance();
        start.setTime(DateUtil.strToDate(startDate,DateUtil.YYYY_MM_DD));
        start.setTime(DateUtil.strToDate(startDate, DateUtil.YYYY_MM_DD));
        //结束日期
        Calendar end = Calendar.getInstance();
        end.setTime(DateUtil.strToDate(endDate,DateUtil.YYYY_MM_DD));
        end.setTime(DateUtil.strToDate(endDate, DateUtil.YYYY_MM_DD));
        // 日期集合
        List<Calendar> days = new ArrayList<>();
        days.add(start);
        boolean flag = true;
        if(startDate.compareTo(endDate) == 0){
        if (startDate.compareTo(endDate) == 0) {
            flag = false;
        }
        // 计算统计日期
        while(flag){
        while (flag) {
            Calendar next = Calendar.getInstance();
            next.setTime(days.get(days.size() - 1).getTime());
            next.add(Calendar.DATE,1);
            if(df.format(next.getTime()).compareTo(endDate) < 0){
            next.add(Calendar.DATE, 1);
            if (df.format(next.getTime()).compareTo(endDate) < 0) {
                days.add(next);
            }else{
            } else {
                days.add(end);
                flag = false;
            }
        }
        Map<String,JSONObject> countResult = new HashMap<>();
        Map<String, JSONObject> countResult = new HashMap<>();
        // 统计预计构建
        for(int i = 0;i < days.size() ; i++) {
        for (int i = 0; i < days.size(); i++) {
            String startStr = "";
            long amount = 0;
            startStr = df.format(days.get(i).getTime());
            // 当前范围包含当天,则需添加当天的统计数据
            if(startStr.compareTo(today) == 0) {
                String val =  redisTemplate.opsForValue().get("quota:" + index + ":" + level + ":" + area);
                if(!StringUtils.isEmpty(val)) {
            if (startStr.compareTo(today) == 0) {
                String val = redisTemplate.opsForValue().get("quota:" + index + ":" + level + ":" + area);
                if (!StringUtils.isEmpty(val)) {
                    JSONObject valJson = new JSONObject(val);
                    if (valJson.has("num") && valJson.getInt("num") > 0) {
                        amount = (long)valJson.getInt("num");
                        amount = (long) valJson.getInt("num");
                    }
                }
            }
            JSONObject range = new JSONObject();
            range.put("range",startStr);
            range.put("amount",amount);
            countResult.put(startStr,range);
            range.put("range", startStr);
            range.put("amount", amount);
            countResult.put(startStr, range);
        }
        sql =  " select " +
        sql = " select " +
                "     ifnull(quota_date,'') as 'range' " +
                "     ,ifnull(sum(result),0) amount " +
                " from  " +
@ -712,15 +764,15 @@ public class StatisticsService extends BaseService {
                "   and " + areaField + " = '" + area + "' " +
                "   group by quota_date ";
        List<Map<String,Object>> resultList = jdbcTemplate.queryForList(sql);
        List<Map<String, Object>> resultList = jdbcTemplate.queryForList(sql);
        if(resultList != null){
            for(Map<String,Object> map : resultList){
                if(countResult.containsKey(map.get("range").toString())){
                    JSONObject range = (JSONObject)countResult.get(map.get("range").toString());
        if (resultList != null) {
            for (Map<String, Object> map : resultList) {
                if (countResult.containsKey(map.get("range").toString())) {
                    JSONObject range = (JSONObject) countResult.get(map.get("range").toString());
                    long amount = range.getLong("amount");
                    long resultAmount = map.get("amount") != null ? Math.round((double)map.get("amount")) : 0;
                    range.put("amount",amount + resultAmount);
                    long resultAmount = map.get("amount") != null ? Math.round((double) map.get("amount")) : 0;
                    range.put("amount", amount + resultAmount);
                }
            }
@ -729,18 +781,18 @@ public class StatisticsService extends BaseService {
            result.sort(new Comparator<JSONObject>() {
                @Override
                public int compare(JSONObject o1, JSONObject o2) {
                    if(o1.getString("range").compareTo(o2.getString("range")) > 0){
                    if (o1.getString("range").compareTo(o2.getString("range")) > 0) {
                        return 1;
                    }else if(o1.getString("range").compareTo(o2.getString("range")) < 0){
                    } else if (o1.getString("range").compareTo(o2.getString("range")) < 0) {
                        return -1;
                    }else{
                    } else {
                        return 0;
                    }
                }
            });
            return new JSONArray(result);
        }else {
        } else {
            return new JSONArray();
        }
    }
@ -755,21 +807,21 @@ public class StatisticsService extends BaseService {
     * @param index
     * @return
     */
    private JSONArray weekStatistics(String startDate,String endDate,String area,int level,String index) throws Exception {
    private JSONArray weekStatistics(String startDate, String endDate, String area, int level, String index) throws Exception {
        String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        String areaField = "";
        String sql ="";
        String sql = "";
        if(level == 4){
        if (level == 4) {
            // 市级别
            areaField = "city";
        }else if(level == 3){
        } else if (level == 3) {
            // 区、城镇级别
            areaField = "town";
        }else if(level == 2){
        } else if (level == 2) {
            // 机构级别
            areaField = "org_code";
        }else if(level == 1){
        } else if (level == 1) {
            // 机构级别
            areaField = "qkdoctor_code";
        }
@ -777,12 +829,12 @@ public class StatisticsService extends BaseService {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        // 起始日期
        Calendar start = Calendar.getInstance();
        start.setTime(DateUtil.strToDate(startDate,DateUtil.YYYY_MM_DD));
        start.setTime(DateUtil.strToDate(startDate, DateUtil.YYYY_MM_DD));
        // 第一个统计周期结束日期
        String firstEnd = "";
        // 结束日期
        Calendar end = Calendar.getInstance();
        end.setTime(DateUtil.strToDate(endDate,DateUtil.YYYY_MM_DD));
        end.setTime(DateUtil.strToDate(endDate, DateUtil.YYYY_MM_DD));
        // 起始日期为周几
        int week = start.get(Calendar.DAY_OF_WEEK);
        int incre = 7 - week + 1;
@ -793,33 +845,33 @@ public class StatisticsService extends BaseService {
        boolean flag = true;
        int i = 0;
        if(startDate.compareTo(endDate) == 0){
        if (startDate.compareTo(endDate) == 0) {
            flag = false;
            days.add(end);
            firstEnd = df.format(end.getTime());
        }
        // 计算统计日期
        while(flag){
        while (flag) {
            Calendar next = Calendar.getInstance();
            next.setTime(days.get(days.size() - 1).getTime());
            if(i == 0) {
                if(incre != 7) {
            if (i == 0) {
                if (incre != 7) {
                    next.add(Calendar.DATE, incre);
                }
            }else{
            } else {
                next.add(Calendar.DATE, 7);
            }
            if(df.format(next.getTime()).compareTo(df.format(end.getTime())) < 0){
            if (df.format(next.getTime()).compareTo(df.format(end.getTime())) < 0) {
                days.add(next);
                if(i == 0){
                if (i == 0) {
                    firstEnd = df.format(next.getTime());
                }
            }else{
            } else {
                days.add(end);
                flag = false;
                if(i == 0){
                if (i == 0) {
                    firstEnd = df.format(end.getTime());
                }
            }
@ -828,28 +880,28 @@ public class StatisticsService extends BaseService {
        }
        // 结果集
        Map<String,JSONObject> countResult = new HashMap<>();
        Map<String, JSONObject> countResult = new HashMap<>();
        // 算出每个查询周期
        for(int j = 0; j < days.size() - 1;j++){
        for (int j = 0; j < days.size() - 1; j++) {
            String startStr = "";
            String endStr = df.format(days.get(j + 1).getTime());
            long amount = 0;
            // 起始、截止日期
            if(j == 0){
            if (j == 0) {
                startStr = df.format(days.get(j).getTime());
            }else{
            } else {
                Calendar cal = Calendar.getInstance();
                cal.setTime(days.get(j).getTime());
                cal.add(Calendar.DATE,1);
                cal.add(Calendar.DATE, 1);
                startStr = df.format(cal.getTime());
            }
            // 当前范围包含当天,则需添加当天的统计数据
            if(startStr.compareTo(today) <= 0 && endStr.compareTo(today) >= 0) {
                String val =  redisTemplate.opsForValue().get("quota:" + index + ":" + level + ":" + area);
                if(!StringUtils.isEmpty(val)) {
            if (startStr.compareTo(today) <= 0 && endStr.compareTo(today) >= 0) {
                String val = redisTemplate.opsForValue().get("quota:" + index + ":" + level + ":" + area);
                if (!StringUtils.isEmpty(val)) {
                    JSONObject valJson = new JSONObject(val);
                    if (valJson.has("num") && valJson.getInt("num") > 0) {
                        amount = valJson.getInt("num");
@ -857,16 +909,16 @@ public class StatisticsService extends BaseService {
                }
            }
            JSONObject range =  new JSONObject();
            JSONObject range = new JSONObject();
            range.put("range",startStr);
            range.put("amount",amount);
            range.put("range", startStr);
            range.put("amount", amount);
            countResult.put(startStr + ":" + endStr,range);
            countResult.put(startStr + ":" + endStr, range);
        }
        // 查询时间范围内所有记录
        sql =  " select " +
        sql = " select " +
                "     ifnull(quota_date,'') as 'range' " +
                "     ,ifnull(sum(result),0) amount " +
                " from  " +
@ -879,45 +931,45 @@ public class StatisticsService extends BaseService {
                "   and " + areaField + " = '" + area + "' " +
                "   group by quota_date ";
        List<Map<String,Object>> resultList = jdbcTemplate.queryForList(sql);
        List<Map<String, Object>> resultList = jdbcTemplate.queryForList(sql);
        if(resultList != null){
        if (resultList != null) {
            // 计算结果
            for(Map<String,Object> map : resultList){
                long resultAmount = map.get("amount") != null ? Math.round((double)map.get("amount")) : 0;
            for (Map<String, Object> map : resultList) {
                long resultAmount = map.get("amount") != null ? Math.round((double) map.get("amount")) : 0;
                String range = map.get("range").toString();
                if(org.apache.commons.lang3.StringUtils.isNotEmpty(range)){
                if (org.apache.commons.lang3.StringUtils.isNotEmpty(range)) {
                    // 起始日期
                    String startStr = "";
                    // 结束日期
                    String endStr = "";
                    if(range.compareTo(startDate) >= 0 && range.compareTo(firstEnd) <= 0){
                        startStr =  startDate;
                    if (range.compareTo(startDate) >= 0 && range.compareTo(firstEnd) <= 0) {
                        startStr = startDate;
                        endStr = firstEnd;
                    }else{
                    } else {
                        Calendar cal = Calendar.getInstance();
                        cal.setTime(df.parse(range));
                        int calWeek =  cal.get(Calendar.DAY_OF_WEEK) - 2;
                        int calWeek = cal.get(Calendar.DAY_OF_WEEK) - 2;
                        if(calWeek == -1){
                        if (calWeek == -1) {
                            cal.add(Calendar.DATE, -6);
                        }else{
                        } else {
                            cal.add(Calendar.DATE, -calWeek);
                        }
                        startStr = df.format(cal.getTime());
                        cal.add(Calendar.DATE,6);
                        cal.add(Calendar.DATE, 6);
                        endStr = df.format(cal.getTime());
                        if(endStr.compareTo(endDate) > 0){
                        if (endStr.compareTo(endDate) > 0) {
                            endStr = endDate;
                        }
                    }
                    JSONObject json = countResult.get(startStr + ":" + endStr);
                    json.put("amount",json.getLong("amount") + resultAmount);
                    json.put("amount", json.getLong("amount") + resultAmount);
                }
            }
@ -927,18 +979,18 @@ public class StatisticsService extends BaseService {
            result.sort(new Comparator<JSONObject>() {
                @Override
                public int compare(JSONObject o1, JSONObject o2) {
                    if(o1.getString("range").compareTo(o2.getString("range")) > 0){
                    if (o1.getString("range").compareTo(o2.getString("range")) > 0) {
                        return 1;
                    }else if(o1.getString("range").compareTo(o2.getString("range")) < 0){
                    } else if (o1.getString("range").compareTo(o2.getString("range")) < 0) {
                        return -1;
                    }else{
                    } else {
                        return 0;
                    }
                }
            });
            return new JSONArray(result);
        }else{
        } else {
            return new JSONArray();
        }
    }
@ -954,21 +1006,21 @@ public class StatisticsService extends BaseService {
     * @return
     * @throws Exception
     */
    private JSONArray monthStatistics(String startDate,String endDate,String area,int level,String index) throws Exception{
    private JSONArray monthStatistics(String startDate, String endDate, String area, int level, String index) throws Exception {
        String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        String areaField = "";
        String sql ="";
        String sql = "";
        if(level == 4){
        if (level == 4) {
            // 市级别
            areaField = "city";
        }else if(level == 3){
        } else if (level == 3) {
            // 区、城镇级别
            areaField = "town";
        }else if(level == 2){
        } else if (level == 2) {
            // 机构级别
            areaField = "org_code";
        }else if(level == 1){
        } else if (level == 1) {
            // 机构级别
            areaField = "qkdoctor_code";
        }
@ -976,10 +1028,10 @@ public class StatisticsService extends BaseService {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        // 起始日期
        Calendar start = Calendar.getInstance();
        start.setTime(DateUtil.strToDate(startDate,DateUtil.YYYY_MM_DD));
        start.setTime(DateUtil.strToDate(startDate, DateUtil.YYYY_MM_DD));
        // 结束日期
        Calendar end = Calendar.getInstance();
        end.setTime(DateUtil.strToDate(endDate,DateUtil.YYYY_MM_DD));
        end.setTime(DateUtil.strToDate(endDate, DateUtil.YYYY_MM_DD));
        // 第一个结束日期
        String firstEnd = "";
@ -990,34 +1042,34 @@ public class StatisticsService extends BaseService {
        boolean flag = true;
        int k = 0;
        if(startDate.compareTo(endDate) == 0){
        if (startDate.compareTo(endDate) == 0) {
            flag = false;
            days.add(end);
            firstEnd = df.format(end.getTime());
        }
        // 统计日期计算
        while(flag){
        while (flag) {
            Calendar next = Calendar.getInstance();
            next.setTime(days.get(days.size() - 1).getTime());
            if(k == 0){
            if (k == 0) {
                next.add(Calendar.MONTH, 1);
            }else{
            } else {
                next.add(Calendar.MONTH, 2);
            }
            next.set(Calendar.DAY_OF_MONTH, 1);
            next.add(Calendar.DAY_OF_MONTH, -1);
            if(df.format(next.getTime()).compareTo(df.format(end.getTime())) < 0){
            if (df.format(next.getTime()).compareTo(df.format(end.getTime())) < 0) {
                days.add(next);
                if(k == 0){
                if (k == 0) {
                    firstEnd = df.format(next.getTime());
                }
            }else{
            } else {
                days.add(end);
                flag = false;
                if(k == 0){
                if (k == 0) {
                    firstEnd = df.format(end.getTime());
                }
            }
@ -1025,27 +1077,27 @@ public class StatisticsService extends BaseService {
        }
        // 统计结果
        Map<String,JSONObject> countResult = new HashMap<>();
        Map<String, JSONObject> countResult = new HashMap<>();
        for(int i = 0; i < days.size() - 1; i++) {
        for (int i = 0; i < days.size() - 1; i++) {
            String startStr = "";
            String endStr = df.format(days.get(i + 1).getTime());
            int amount = 0;
            // 起始时间计算
            if(i == 0){
            if (i == 0) {
                startStr = df.format(days.get(i).getTime());
            }else{
            } else {
                Calendar cal = Calendar.getInstance();
                cal.setTime(days.get(i).getTime());
                cal.add(Calendar.DATE,1);
                cal.add(Calendar.DATE, 1);
                startStr = df.format(cal.getTime());
            }
            // 当天数据计算
            if(startStr.compareTo(today) <= 0 && endStr.compareTo(today) >= 0) {
                String val =  redisTemplate.opsForValue().get("quota:" + index + ":" + level + ":" + area);
                if(!StringUtils.isEmpty(val)) {
            if (startStr.compareTo(today) <= 0 && endStr.compareTo(today) >= 0) {
                String val = redisTemplate.opsForValue().get("quota:" + index + ":" + level + ":" + area);
                if (!StringUtils.isEmpty(val)) {
                    JSONObject valJson = new JSONObject(val);
                    if (valJson.has("num") && valJson.getInt("num") > 0) {
                        amount = valJson.getInt("num");
@ -1053,16 +1105,16 @@ public class StatisticsService extends BaseService {
                }
            }
            JSONObject range =  new JSONObject();
            JSONObject range = new JSONObject();
            range.put("range",startStr);
            range.put("amount",amount);
            range.put("range", startStr);
            range.put("amount", amount);
            countResult.put(startStr + ":" + endStr,range);
            countResult.put(startStr + ":" + endStr, range);
        }
        // 查询时间范围内所有记录
        sql =  " select " +
        sql = " select " +
                "     ifnull(quota_date,'') as 'range' " +
                "     ,ifnull(sum(result),0) amount " +
                " from  " +
@ -1075,41 +1127,41 @@ public class StatisticsService extends BaseService {
                "   and " + areaField + " = '" + area + "' " +
                "   group by quota_date ";
        List<Map<String,Object>> resultList = jdbcTemplate.queryForList(sql);
        List<Map<String, Object>> resultList = jdbcTemplate.queryForList(sql);
        if(resultList != null){
        if (resultList != null) {
            // 计算结果
            for(Map<String,Object> map : resultList){
                long resultAmount = map.get("amount") != null ? Math.round((double)map.get("amount")) : 0;
            for (Map<String, Object> map : resultList) {
                long resultAmount = map.get("amount") != null ? Math.round((double) map.get("amount")) : 0;
                String range = map.get("range").toString();
                if(org.apache.commons.lang3.StringUtils.isNotEmpty(range)){
                if (org.apache.commons.lang3.StringUtils.isNotEmpty(range)) {
                    // 起始日期
                    String startStr = "";
                    // 结束日期
                    String endStr = "";
                    if(range.compareTo(startDate) >= 0 && range.compareTo(firstEnd) <= 0){
                        startStr =  startDate;
                    if (range.compareTo(startDate) >= 0 && range.compareTo(firstEnd) <= 0) {
                        startStr = startDate;
                        endStr = firstEnd;
                    }else{
                    } else {
                        Calendar cal = Calendar.getInstance();
                        cal.setTime(df.parse(range));
                        cal.set(Calendar.DATE, 1);
                        startStr = df.format(cal.getTime());
                        cal.add(Calendar.MONTH,1);
                        cal.set(Calendar.DATE,1);
                        cal.add(Calendar.DATE,-1);
                        cal.add(Calendar.MONTH, 1);
                        cal.set(Calendar.DATE, 1);
                        cal.add(Calendar.DATE, -1);
                        endStr = df.format(cal.getTime());
                        if(endStr.compareTo(endDate) > 0){
                        if (endStr.compareTo(endDate) > 0) {
                            endStr = endDate;
                        }
                    }
                    JSONObject json = countResult.get(startStr + ":" + endStr);
                    json.put("amount",json.getLong("amount") + resultAmount);
                    json.put("amount", json.getLong("amount") + resultAmount);
                }
            }
@ -1119,18 +1171,18 @@ public class StatisticsService extends BaseService {
            result.sort(new Comparator<JSONObject>() {
                @Override
                public int compare(JSONObject o1, JSONObject o2) {
                    if(o1.getString("range").compareTo(o2.getString("range")) > 0){
                    if (o1.getString("range").compareTo(o2.getString("range")) > 0) {
                        return 1;
                    }else if(o1.getString("range").compareTo(o2.getString("range")) < 0){
                    } else if (o1.getString("range").compareTo(o2.getString("range")) < 0) {
                        return -1;
                    }else{
                    } else {
                        return 0;
                    }
                }
            });
            return new JSONArray(result);
        }else{
        } else {
            return new JSONArray();
        }
    }
@ -1140,25 +1192,25 @@ public class StatisticsService extends BaseService {
     * 获取二级维度下指标时间范围内增量
     *
     * @param startDate 起始时间
     * @param endDate 结束时间
     * @param area 区域或机构代码
     * @param level 级别
     * @param index 指标
     * @param endDate   结束时间
     * @param area      区域或机构代码
     * @param level     级别
     * @param index     指标
     * @return
     */
    public JSONArray getLevelTwoIndexIncrement(String startDate,String endDate,String area,int level,String index){
    public JSONArray getLevelTwoIndexIncrement(String startDate, String endDate, String area, int level, String index) {
        String areaField = "";
        if(level == 4){
        if (level == 4) {
            // 市级别
            areaField = "city";
        }else if(level == 3){
        } else if (level == 3) {
            // 区、城镇级别
            areaField = "town";
        }else if(level == 2){
        } else if (level == 2) {
            // 机构级别
            areaField = "org_code";
        }else if(level == 1){
        } else if (level == 1) {
            // 团队
            areaField = "qkdoctor_code";
        }
@ -1174,175 +1226,381 @@ public class StatisticsService extends BaseService {
                "   and level1_type = ? and del = '1'";
        if(!org.apache.commons.lang3.StringUtils.isEmpty(startDate)){
        if (!org.apache.commons.lang3.StringUtils.isEmpty(startDate)) {
            sql += "   and quota_date >= ? ";
        }
        sql +=  "   and quota_date <= ? " +
        sql += "   and quota_date <= ? " +
                "   and " + areaField + " = ? " +
                " group by level2_type,level2_type_name";
        List<Map<String,Object>> resultList = null;
        List<Map<String, Object>> resultList = null;
        if(org.apache.commons.lang3.StringUtils.isEmpty(startDate)){
            resultList = jdbcTemplate.queryForList(sql,new Object[]{level,endDate,area});
        }else {
        if (org.apache.commons.lang3.StringUtils.isEmpty(startDate)) {
            resultList = jdbcTemplate.queryForList(sql, new Object[]{level, endDate, area});
        } else {
            resultList = jdbcTemplate.queryForList(sql, new Object[]{level, startDate, endDate, area});
        }
        if(resultList == null || resultList.size() < 1) {
        if (resultList == null || resultList.size() < 1) {
            resultList = new ArrayList<>();
            if(index.equals(SEX)){
                Map<String,Object> women = new HashMap<>();
                women.put("code","1");
                women.put("name","女");
                women.put("amount",Double.valueOf("0.0"));
            if (index.equals(SEX)) {
                Map<String, Object> women = new HashMap<>();
                women.put("code", "1");
                women.put("name", "女");
                women.put("amount", Double.valueOf("0.0"));
                resultList.add(women);
                Map<String,Object> man = new HashMap<>();
                man.put("code","2");
                man.put("name","男");
                man.put("amount",Double.valueOf("0.0"));
                Map<String, Object> man = new HashMap<>();
                man.put("code", "2");
                man.put("name", "男");
                man.put("amount", Double.valueOf("0.0"));
                resultList.add(man);
                Map<String,Object> unknown = new HashMap<>();
                unknown.put("code","3");
                unknown.put("name","未知");
                unknown.put("amount",Double.valueOf("0.0"));
                Map<String, Object> unknown = new HashMap<>();
                unknown.put("code", "3");
                unknown.put("name", "未知");
                unknown.put("amount", Double.valueOf("0.0"));
                resultList.add(unknown);
            }else if(index.equals(GROUP)){
                Map<String,Object> normal = new HashMap<>();
                normal.put("code","1");
                normal.put("name","普通人群");
                normal.put("amount",Double.valueOf("0.0"));
            } else if (index.equals(GROUP)) {
                Map<String, Object> normal = new HashMap<>();
                normal.put("code", "1");
                normal.put("name", "普通人群");
                normal.put("amount", Double.valueOf("0.0"));
                resultList.add(normal);
                Map<String,Object> manbing = new HashMap<>();
                manbing.put("code","2");
                manbing.put("name","慢病人群");
                manbing.put("amount",Double.valueOf("0.0"));
                Map<String, Object> manbing = new HashMap<>();
                manbing.put("code", "2");
                manbing.put("name", "慢病人群");
                manbing.put("amount", Double.valueOf("0.0"));
                resultList.add(manbing);
                Map<String,Object> upsixfive = new HashMap<>();
                upsixfive.put("code","3");
                upsixfive.put("name","65岁以上人群");
                upsixfive.put("amount",Double.valueOf("0.0"));
                Map<String, Object> upsixfive = new HashMap<>();
                upsixfive.put("code", "3");
                upsixfive.put("name", "65岁以上人群");
                upsixfive.put("amount", Double.valueOf("0.0"));
                resultList.add(upsixfive);
                Map<String,Object> gxy = new HashMap<>();
                gxy.put("code","4");
                gxy.put("name","高血压");
                gxy.put("amount",Double.valueOf("0.0"));
                Map<String, Object> gxy = new HashMap<>();
                gxy.put("code", "4");
                gxy.put("name", "高血压");
                gxy.put("amount", Double.valueOf("0.0"));
                resultList.add(gxy);
                Map<String,Object> tnb = new HashMap<>();
                tnb.put("code","5");
                tnb.put("name","糖尿病");
                tnb.put("amount",Double.valueOf("0.0"));
                Map<String, Object> tnb = new HashMap<>();
                tnb.put("code", "5");
                tnb.put("name", "糖尿病");
                tnb.put("amount", Double.valueOf("0.0"));
                resultList.add(tnb);
                Map<String, Object> tnbGxy = new HashMap<>();
                tnbGxy.put("code", "100");
                tnbGxy.put("name", "高血压+糖尿病");
                tnbGxy.put("amount", Double.valueOf("0.0"));
                resultList.add(tnb);
            }else if(index.equals(AGE)){
                Map<String,Object> map1= new HashMap<>();
                map1.put("code","1");
                map1.put("name","0~6");
                map1.put("amount",Double.valueOf("0.0"));
            } else if (index.equals(AGE)) {
                Map<String, Object> map1 = new HashMap<>();
                map1.put("code", "1");
                map1.put("name", "0~6");
                map1.put("amount", Double.valueOf("0.0"));
                resultList.add(map1);
                Map<String,Object> map2 = new HashMap<>();
                map2.put("code","2");
                map2.put("name","7~18");
                map2.put("amount",Double.valueOf("0.0"));
                Map<String, Object> map2 = new HashMap<>();
                map2.put("code", "2");
                map2.put("name", "7~18");
                map2.put("amount", Double.valueOf("0.0"));
                resultList.add(map2);
                Map<String,Object> map3 = new HashMap<>();
                map3.put("code","3");
                map3.put("name","18~30");
                map3.put("amount",Double.valueOf("0.0"));
                Map<String, Object> map3 = new HashMap<>();
                map3.put("code", "3");
                map3.put("name", "18~30");
                map3.put("amount", Double.valueOf("0.0"));
                resultList.add(map3);
                Map<String,Object> map4 = new HashMap<>();
                map4.put("code","4");
                map4.put("name","30~50");
                map4.put("amount",Double.valueOf("0.0"));
                Map<String, Object> map4 = new HashMap<>();
                map4.put("code", "4");
                map4.put("name", "30~50");
                map4.put("amount", Double.valueOf("0.0"));
                resultList.add(map4);
                Map<String,Object> map5 = new HashMap<>();
                map5.put("code","5");
                map5.put("name","50~65");
                map5.put("amount",Double.valueOf("0.0"));
                Map<String, Object> map5 = new HashMap<>();
                map5.put("code", "5");
                map5.put("name", "50~65");
                map5.put("amount", Double.valueOf("0.0"));
                resultList.add(map5);
                Map<String,Object> map6 = new HashMap<>();
                map6.put("code","6");
                map6.put("name","50~65");
                map6.put("amount",Double.valueOf("0.0"));
                Map<String, Object> map6 = new HashMap<>();
                map6.put("code", "6");
                map6.put("name", "50~65");
                map6.put("amount", Double.valueOf("0.0"));
                resultList.add(map6);
            }
        }
        if(resultList != null){
        if (resultList != null) {
            long total = 0;
            for(Map<String,Object> map : resultList){
                map.put("amount",map.get("amount") == null ? 0 : Math.round((double)map.get("amount")));
            for (Map<String, Object> map : resultList) {
                map.put("amount", map.get("amount") == null ? 0 : Math.round((double) map.get("amount")));
                // 当天数据统计
                if(endDate.compareTo(new SimpleDateFormat("yyyy-MM-dd").format(new Date())) >= 0){
                if (endDate.compareTo(new SimpleDateFormat("yyyy-MM-dd").format(new Date())) >= 0) {
                    String code = map.get("code") != null ? String.valueOf(map.get("code")) : "";
                    String val =  redisTemplate.opsForValue().get("quota:" + index + ":" + level + ":" + code +":" + area);
                    if(!StringUtils.isEmpty(val)) {
                    String val = redisTemplate.opsForValue().get("quota:" + index + ":" + level + ":" + code + ":" + area);
                    if (!StringUtils.isEmpty(val)) {
                        JSONObject valJson = new JSONObject(val);
                        if (valJson.has("num") && valJson.getInt("num") > 0) {
                            map.put("amount",(long)map.get("amount") + valJson.getInt("num"));
                            map.put("amount", (long) map.get("amount") + valJson.getInt("num"));
                        }
                    }
                }
                if(index.equals(GROUP)){
                if (index.equals(GROUP)) {
                    // 分组指标总数算法
                    String code = map.get("code") != null ? String.valueOf(map.get("code")) : "";
                    if(!code.equals("2")){
                        total += (long)map.get("amount");
                    if (code.equals("1") || code.equals("2") || code.equals("3")) {
                        total += (long) map.get("amount");
                    }
                }else{
                    total += (long)map.get("amount");
                } else {
                    total += (long) map.get("amount");
                }
            }
            if(!index.equals(AGE)) {
                DecimalFormat df = new DecimalFormat("0.00");
                double rateTotal = 0.00;
            if (!index.equals(AGE)) {
                DecimalFormat df = new DecimalFormat("0.0000");
                double rateTotal = 0.0000;
                for (Map<String, Object> map : resultList) {
                    double rateG = (total > 0 ? ((long) map.get("amount")) * 1.00 / total * 100 : 0);
                    String code = String.valueOf(map.get("code"));
                    double rateG = (total > 0 ? ((long) map.get("amount")) * 1.0000 / total * 100 : 0);
                    map.put("rate", df.format(rateG));
                    rateTotal += rateG;
//                    if (index.equals(GROUP)) {
//                        if (code.equals("1") || code.equals("2") || code.equals("3")) {
//                            rateTotal += rateG;
//                        }
//                    } else {
//                        rateTotal += rateG;
//                    }
                }
                if(1 - rateTotal > 0) {
                    for (Map<String, Object> map : resultList) {
                        if ((long) map.get("amount") > 0) {
                            map.put("rate",df.format(Double.valueOf((String)map.get("rate")) +(1 - rateTotal)));
                            break;
                        }
                    }
                }
//                if (1 - rateTotal > 0) {
//                    for (Map<String, Object> map : resultList) {
//                        if (index.equals(GROUP)) {
//                            String code = String.valueOf(map.get("code"));
//                            if ((long) map.get("amount") > 0 && (code.equals("1") || code.equals("2") || code.equals("3"))) {
//                                map.put("rate", df.format(Double.valueOf((String) map.get("rate")) + (1 - rateTotal)));
//                                break;
//                            }
//                        }else{
//                            if ((long) map.get("amount") > 0) {
//                                map.put("rate", df.format(Double.valueOf((String) map.get("rate")) + (1 - rateTotal)));
//                                break;
//                            }
//                        }
//                    }
//                }
            }
            if(index.equals(SEX) && resultList.size() > 0){
            if (index.equals(SEX) && resultList.size() > 0) {
                int i = 0;
                boolean flag = false;
                for (;i < resultList.size(); i++) {
                    if(resultList.get(i).get("code") != null && String.valueOf(resultList.get(i).get("code")).equals("3")
                for (; i < resultList.size(); i++) {
                    if (resultList.get(i).get("code") != null && String.valueOf(resultList.get(i).get("code")).equals("3")
                            && String.valueOf(resultList.get(i).get("amount")).equals("0")) {
                        flag = true;
                        break;
                    }
                }
                if(flag){
                if (flag) {
                    resultList.remove(i);
                }
            }
            return new JSONArray(resultList);
        }else {
        } else {
            return new JSONArray();
        }
    }
    /**
     * 统计65以上人群数据
     *
     * @param startDate
     * @param endDate
     * @param area
     * @param level
     * @return
     */
    public JSONArray getSixFiveStatistics(String startDate, String endDate, String area, int level) {
        String areaField = "";
        if (level == 4) {
            // 市级别
            areaField = "city";
        } else if (level == 3) {
            // 区、城镇级别
            areaField = "town";
        } else if (level == 2) {
            // 机构级别
            areaField = "org_code";
        } else if (level == 1) {
            // 团队
            areaField = "qkdoctor_code";
        }
        // 查询语句
        String sql = " select " +
                "     ifnull(level3_type,'') code " +
                "     ,ifnull(level3_type_name,'') 'name' " +
                "     ,ifnull(sum(result),0) amount" +
                " from  " +
                "     wlyy_quota_result " +
                " where " +
                "     quato_code = '12' " +
                "   and level2_type = '6' " +
                "   and level1_type = ? and del = '1'";
        if (!org.apache.commons.lang3.StringUtils.isEmpty(startDate)) {
            sql += "   and quota_date >= ? ";
        }
        sql += "   and quota_date <= ? " +
                "   and " + areaField + " = ? " +
                " group by level3_type,level3_type_name";
        List<Map<String, Object>> resultList = null;
        if (org.apache.commons.lang3.StringUtils.isEmpty(startDate)) {
            resultList = jdbcTemplate.queryForList(sql, new Object[]{level, endDate, area});
        } else {
            resultList = jdbcTemplate.queryForList(sql, new Object[]{level, startDate, endDate, area});
        }
        if (resultList == null || resultList.size() < 1) {
            resultList = new ArrayList<>();
            Map<String, Object> gxy = new HashMap<>();
            gxy.put("code", "1");
            gxy.put("name", "高血压");
            gxy.put("amount", Double.valueOf("0.0"));
            resultList.add(gxy);
            Map<String, Object> tnb = new HashMap<>();
            tnb.put("code", "2");
            tnb.put("name", "糖尿病");
            tnb.put("amount", Double.valueOf("0.0"));
            resultList.add(tnb);
            Map<String, Object> gxyTnb = new HashMap<>();
            gxyTnb.put("code", "3");
            gxyTnb.put("name", "高血压+糖尿病");
            gxyTnb.put("amount", Double.valueOf("0.0"));
            resultList.add(gxyTnb);
            Map<String, Object> jk = new HashMap<>();
            jk.put("code", "4");
            jk.put("name", "健康人群");
            jk.put("amount", Double.valueOf("0.0"));
            resultList.add(jk);
        }
        if (resultList != null) {
            for (Map<String, Object> map : resultList) {
                map.put("amount", map.get("amount") == null ? 0 : Math.round((double) map.get("amount")));
                // 当天数据统计
                if (endDate.compareTo(new SimpleDateFormat("yyyy-MM-dd").format(new Date())) >= 0) {
                    String code = map.get("code") != null ? String.valueOf(map.get("code")) : "";
                    String val = redisTemplate.opsForValue().get("quota:12:" + level + ":6:" + code + ":" + area);
                    if (!StringUtils.isEmpty(val)) {
                        JSONObject valJson = new JSONObject(val);
                        if (valJson.has("num") && valJson.getInt("num") > 0) {
                            map.put("amount", (long) map.get("amount") + valJson.getInt("num"));
                        }
                    }
                }
            }
            // 65岁以上人群总数统计
            long sixFiveTotal = getSixFiveTotal(startDate, endDate, area, level);
            Map<String, Object> sixFive = new HashMap<>();
            sixFive.put("code", "0");
            sixFive.put("name", "总数");
            sixFive.put("amount", sixFiveTotal);
            resultList.add(sixFive);
            return new JSONArray(resultList);
        } else {
            return new JSONArray();
        }
    }
    /**
     * 获取65岁以上人群总数
     *
     * @param startDate
     * @param endDate
     * @param area
     * @param level
     * @return
     */
    public long getSixFiveTotal(String startDate, String endDate, String area, int level) {
        String areaField = "";
        long total = 0;
        if (level == 4) {
            // 市级别
            areaField = "city";
        } else if (level == 3) {
            // 区、城镇级别
            areaField = "town";
        } else if (level == 2) {
            // 机构级别
            areaField = "org_code";
        } else if (level == 1) {
            // 团队
            areaField = "qkdoctor_code";
        }
        // 查询语句
        String sql = " select " +
                "     ifnull(sum(result),0) amount" +
                " from  " +
                "     wlyy_quota_result " +
                " where " +
                "     quato_code = '8' " +
                "   and level2_type = '6' " +
                "   and level1_type = ? and del = '1'";
        if (!org.apache.commons.lang3.StringUtils.isEmpty(startDate)) {
            sql += "   and quota_date >= ? ";
        }
        sql += "   and quota_date <= ? " +
                "   and " + areaField + " = ? ";
        Map<String, Object> result = null;
        if (org.apache.commons.lang3.StringUtils.isEmpty(startDate)) {
            result = jdbcTemplate.queryForMap(sql, new Object[]{level, endDate, area});
        } else {
            result = jdbcTemplate.queryForMap(sql, new Object[]{level, startDate, endDate, area});
        }
        if (result != null && result.containsKey("amount")) {
            total += (result.get("amount") == null ? 0 : Math.round((double) result.get("amount")));
        }
        String code = "6";
        String val = redisTemplate.opsForValue().get("quota:8:" + level + ":" + code + ":" + area);
        if (!StringUtils.isEmpty(val)) {
            JSONObject valJson = new JSONObject(val);
            if (valJson.has("num") && valJson.getInt("num") > 0) {
                total += valJson.getInt("num");
            }
        }
        return total;
    }
}

+ 107 - 0
src/main/java/com/yihu/wlyy/service/common/QrcodeService.java

@ -1,7 +1,9 @@
package com.yihu.wlyy.service.common;
import com.yihu.wlyy.entity.address.Hospital;
import com.yihu.wlyy.entity.address.Town;
import com.yihu.wlyy.entity.doctor.profile.Doctor;
import com.yihu.wlyy.repository.address.TownDao;
import com.yihu.wlyy.repository.doctor.DoctorDao;
import com.yihu.wlyy.repository.organization.HospitalDao;
import com.yihu.wlyy.service.BaseService;
@ -30,6 +32,8 @@ public class QrcodeService extends BaseService {
    private DoctorDao doctorDao;
    @Autowired
    private HospitalDao hospitalDao;
    @Autowired
    private TownDao townDao;
    /**
     * 所有医生二维码生成
@ -104,6 +108,39 @@ public class QrcodeService extends BaseService {
        return true;
    }
    /**
     * 生成区二维码
     *
     * @param town
     * @param token
     * @return
     * @throws Exception
     */
    public boolean makeTownQrcode(String town,String token) throws Exception{
        try{
            Town twn = townDao.findByCode(town);
            if (twn != null) {
                // 二维码内容
                String content = "tw_" + twn.getCode() + "_" + twn.getName();
                // 二维码图片文件名
                String fileName = twn.getCode();
                String path = QrcodeService.class.getResource("/").getPath().replace("/WEB-INF/classes/", "")
                        + File.separator + "qrcode";
                // 通过微信接口生成区二维码
                makeQrcodeFromWeiXin(content, fileName.replaceAll("\r\n", ""), path, token);
                return true;
            } else {
                throw new Exception("can not find town info");
            }
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 社区二维码生成打包为zip
     *
@ -250,6 +287,74 @@ public class QrcodeService extends BaseService {
        }
    }
    /**
     * 区二维码生成打包为zip
     *
     * @param city
     * @param token
     * @return
     * @throws Exception
     */
    public File downLoadTownQrcodes(String city,String token) throws Exception{
        // 查找所有医生
        Iterable<Town> towns = null;
        String zipFileName = "town_qrcode";
        if (StringUtils.isNotEmpty(city)) {
            towns = townDao.findByCity(city);
        } else {
            towns = townDao.findAll();
        }
        String path = QrcodeService.class.getResource("/").getPath().replace("/WEB-INF/classes/", "")
                + File.separator + "qrcode_download";
        File file = new File(path);
        // 删除文件夹、文件
        if (file.exists()) {
            File[] files = file.listFiles();
            if (files != null && files.length > 0) {
                for (File f : files) {
                    f.delete();
                }
            }
            file.delete();
        }
        if (towns != null) {
            for (Town town : towns) {
                if (StringUtils.isNotEmpty(city)) {
                    zipFileName = town.getCity();
                }
                // 二维码内容
                String content = "tw_" + town.getCode() + "_" + town.getName();
                // 二维码图片文件名
                String fileName = town.getName() + "_" + town.getCode();
                if (StringUtils.isEmpty(fileName)) {
                    continue;
                }
                // 通过微信接口生成医生二维码
                makeQrcodeFromWeiXin(content, fileName.replaceAll("\r\n", ""), path, token);
            }
            File zipFile = new File(path.replace("qrcode_download", "") + zipFileName + ".zip");
            if (zipFile.exists()) {
                zipFile.delete();
            }
            // 打包文件夹
            if (fileToZip(path, path.replace("qrcode_download", ""), zipFileName)) {
                return new File(path.replace("qrcode_download", "") + zipFileName + ".zip");
            } else {
                return null;
            }
        } else {
            return null;
        }
    }
    /**
     * 打包文件夹
     *
@ -388,4 +493,6 @@ public class QrcodeService extends BaseService {
            throw new Exception(e.getMessage());
        }
    }
}

+ 37 - 0
src/main/java/com/yihu/wlyy/service/common/account/DoctorService.java

@ -5,10 +5,17 @@
 *******************************************************************************/
package com.yihu.wlyy.service.common.account;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springside.modules.persistence.DynamicSpecifications;
import org.springside.modules.persistence.SearchFilter;
import org.springside.modules.utils.Clock;
import com.yihu.wlyy.entity.doctor.profile.Doctor;
@ -16,6 +23,10 @@ import com.yihu.wlyy.entity.security.Token;
import com.yihu.wlyy.repository.doctor.DoctorDao;
import com.yihu.wlyy.util.EncodesUtil;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 医生基本信息类.
 *
@ -66,5 +77,31 @@ public class DoctorService extends TokenService {
	}
	public Page<Doctor> famousDoctorList(String name, long id, int pagesize) {
		if (pagesize <= 0) {
			pagesize = 10;
		}
		// 排序
		Sort sort = new Sort(Sort.Direction.ASC, "id");
		// 分页信息
		PageRequest pageRequest = new PageRequest(0, pagesize, sort);
		// 设置查询条件
		Map<String, SearchFilter> filters = new HashMap<String, SearchFilter>();
		if (StringUtils.isNoneEmpty(name)) {
			filters.put("name", new SearchFilter("name", SearchFilter.Operator.LIKE, "%"+name+"%"));
		}
		if (id > 0) {
			filters.put("id", new SearchFilter("id", SearchFilter.Operator.GT, id));
		}
		//设置过滤条件是名医
		//filters.put("level", new SearchFilter("level", SearchFilter.Operator.EQ, level));
		//设置过滤条件是次数大于零
		//filters.put("level", new SearchFilter("level", SearchFilter.Operator.EQ, level));
		// 未作废
		filters.put("status", new SearchFilter("status", SearchFilter.Operator.EQ, 1));
		Specification<Doctor> spec = DynamicSpecifications.bySearchFilter(filters.values(), Doctor.class);
		return doctorDao.findAll(spec, pageRequest);
	}
}

+ 2 - 1
src/main/java/com/yihu/wlyy/task/PushMsgTask.java

@ -164,7 +164,7 @@ public class PushMsgTask {
//	private static final String termination = "C0tdXtA_8k-Cy4a1EkzQuI877vqaqAtRkc-e_Gsd7sk";
//	private static final String appointmentSuccess = "FY3Pqa66tHIE1Fv-irbFBPOh5cYP71fkOzfZKH4S-Fo";
//	private static final String appointmentCancel = "tldWEb9AN7p_RoHoD8ml0GxWW3V1V_mpEEhp2v6p56s";
	private static final String url = "http://www.xmtyw.cn/wlyy/wx/html/";
//	private static final String url = "http://www.xmtyw.cn/wlyy/wx/html/";
	/**
	 * 发送微信模板消息
@ -213,6 +213,7 @@ public class PushMsgTask {
	 */
	public String typeMsg(int type, String openid, String name, JSONObject json) {
		try {
			String url = SystemConf.getInstance().getSystemProperties().getProperty("server_url") + "wx/html/";
			WechatTemplate temp = new WechatTemplate();
			temp.setTouser(openid);
			temp.setTopcolor("#000000");

+ 99 - 0
src/main/java/com/yihu/wlyy/web/common/qrcode/QrcodeController.java

@ -85,6 +85,28 @@ public class QrcodeController extends WeixinBaseController {
        }
    }
    /**
     * 生成区二维码
     *
     * @param town
     * @return
     */
    @RequestMapping(value = "/town")
    @ResponseBody
    public String makeTownQrcode(String town){
        try{
            if(qrcodeService.makeTownQrcode(town,getAccessToken())){
                return write(200,"生成二维码成功!");
            }else{
                return error(-1,"生成二维码失败!");
            }
        }catch (Exception e){
            e.printStackTrace();
            return error(-1,"生成二维码失败!");
        }
    }
    /**
     * 下载某个社区的二维码
     *
@ -127,6 +149,47 @@ public class QrcodeController extends WeixinBaseController {
        }
    }
    /**
     * 下载某个区的二维码
     *
     * @param town
     * @param response
     */
    @RequestMapping(value = "/town_img")
    public void downloadTownQrcode(String town, HttpServletResponse response){
        try{
            File file = new File(QrcodeController.class.getResource("/").getPath().replace("/WEB-INF/classes/", "") +
                    File.separator +"qrcode" + File.separator + town + ".png");
            boolean flag = false;
            if(!file.exists()){
                flag = qrcodeService.makeTownQrcode(town,getAccessToken());
            }else{
                flag = true;
            }
            if(flag = true) {
                response.setCharacterEncoding("utf-8");
                String path = request.getSession().getServletContext().getRealPath("/")
                        + File.separator + "qrcode" + File.separator + town + ".png";
                InputStream inputStream = new FileInputStream(path);
                OutputStream outputStream = response.getOutputStream();
                byte[] b = new byte[2048];
                int length = 0;
                while ((length = inputStream.read(b)) > 0) {
                    outputStream.write(b, 0, length);
                }
                outputStream.close();
                inputStream.close();
            }else{
                response.setStatus(404);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /**
     * 下载某个医生的二维码
@ -297,4 +360,40 @@ public class QrcodeController extends WeixinBaseController {
        }
    }
    /**
     * 下载某个城市的区的二维码图片
     *
     * @param city
     * @param response
     */
    @RequestMapping(value = "/download/towns")
    public void downloadTownQrcodes(String city,HttpServletResponse response){
        try{
            File file = qrcodeService.downLoadTownQrcodes(city,getAccessToken());
            if(file != null){
                response.setCharacterEncoding("utf-8");
                response.setContentType("multipart/form-data");
                response.setHeader("Content-Disposition", "attachment;fileName=towns_qrcode.zip");
                InputStream inputStream = new FileInputStream(file);
                OutputStream outputStream = response.getOutputStream();
                byte[] b = new byte[2048];
                int length = 0;
                while ((length = inputStream.read(b)) > 0) {
                    outputStream.write(b, 0, length);
                }
                outputStream.close();
                inputStream.close();
            }else{
                response.setStatus(500);
            }
        }catch (Exception e){
            e.printStackTrace();
            response.setStatus(500);
        }
    }
}

+ 2 - 2
src/main/java/com/yihu/wlyy/web/doctor/consult/DoctorConsultController.java

@ -53,9 +53,9 @@ public class DoctorConsultController extends WeixinBaseController {
	 */
	@RequestMapping(value = "list")
	@ResponseBody
	public String list(int type, int id, int pagesize, @RequestParam(required = false) String patient) {
	public String list(int type, int id, int pagesize, @RequestParam(required = false) String patient, @RequestParam(required = false) String title) {
		try {
			Page<ConsultTeam> list = consultTeamService.findByDoctor(getUID(), type, id, pagesize);
			Page<ConsultTeam> list = consultTeamService.findByDoctor(getUID(), type, id, pagesize,title);
			JSONArray jsonArray = new JSONArray();
			for (ConsultTeam consult : list) {
				if (consult == null) {

+ 124 - 7
src/main/java/com/yihu/wlyy/web/patient/consult/ConsultController.java

@ -54,16 +54,20 @@ public class ConsultController extends WeixinBaseController {
	/**
	 * 患者咨询记录查询
	 * @param title 咨询标题
	 * @param id
	 * @param pagesize 分页大小
	 * @return
	 */
	@RequestMapping(value = "records")
	@ResponseBody
	public String consultRecords(long id, int pagesize) {
	public String consultRecords(
			@RequestParam(required = false) String  title,
			long id,
			int pagesize) {
		try {
			JSONArray array = new JSONArray();
			Page<Object> data = consultTeamService.findConsultRecordByPatient(getUID(), id, pagesize);
			Page<Object> data = consultTeamService.findConsultRecordByPatient(getUID(), id, pagesize,title);
			if (data != null) {
				for (Object consult : data.getContent()) {
					if (consult == null) {
@ -228,7 +232,7 @@ public class ConsultController extends WeixinBaseController {
				voice = CommonUtil.copyTempVoice(voice);
			}
			ConsultTeam consult = new ConsultTeam();
			// 设置咨询类型:1三师咨询,2家庭医生咨询
			// 设置咨询类型:1三师咨询,2家庭医生咨询  6.名医咨询
			consult.setType(type);
			// 设置发病时间
			consult.setWhen(when);
@ -256,7 +260,12 @@ public class ConsultController extends WeixinBaseController {
				DoctorStatisticsTask.getInstance(doctorStatisticsService).put(consult.getDoctor(), 1, 1, 0);
			}
			// 推送消息给医生
			PushMsgTask.getInstance().put(consult.getDoctor(), MessageType.MESSAGE_TYPE_DOCTOR_NEW_CONSULT_TEAM.D_CT_01.name(), MessageType.MESSAGE_TYPE_DOCTOR_NEW_CONSULT_TEAM.指定咨询.name(), MessageType.MESSAGE_TYPE_DOCTOR_NEW_CONSULT_TEAM.您有新的指定咨询.name(), consult.getConsult());
			if(type==6){
				// 推送消息给医生
				PushMsgTask.getInstance().put(consult.getDoctor(), MessageType.MESSAGE_TYPE_DOCTOR_NEW_FAMOUS_CONSULT_TEAM.D_CT_01.name(), MessageType.MESSAGE_TYPE_DOCTOR_NEW_FAMOUS_CONSULT_TEAM.名医咨询.name(), MessageType.MESSAGE_TYPE_DOCTOR_NEW_FAMOUS_CONSULT_TEAM.您有新的名医咨询.name(), consult.getConsult());
			}else{
				PushMsgTask.getInstance().put(consult.getDoctor(), MessageType.MESSAGE_TYPE_DOCTOR_NEW_CONSULT_TEAM.D_CT_01.name(), MessageType.MESSAGE_TYPE_DOCTOR_NEW_CONSULT_TEAM.指定咨询.name(), MessageType.MESSAGE_TYPE_DOCTOR_NEW_CONSULT_TEAM.您有新的指定咨询.name(), consult.getConsult());
			}
			return success("提交成功");
		} catch (Exception ex) {
			error(ex);
@ -282,6 +291,16 @@ public class ConsultController extends WeixinBaseController {
					  @RequestParam(required = false) String images,
					  @RequestParam(required = false) String voice) {
		try {
			//判断医生是否是在工作时间
			JSONObject jo=doctorWorkTimeService.isDoctorWorking(doctorCode);
			if(!jo.get("status").equals("1")){
				return error(-1, jo.get("msg").toString());
			}
			//判断医生是否剩下咨询次数
			int result = doctorWorkTimeService.getDoctorConsultTimesRemain(doctorCode);
			if(result==0){
				return error(-1, "没有次数");
			}
			if (StringUtils.isEmpty(images)) {
				images = fetchWxImages();
			}
@ -300,8 +319,8 @@ public class ConsultController extends WeixinBaseController {
				return error(-1, "已经存在名医咨询!");
			}
			ConsultTeam consult = new ConsultTeam();
			// 设置咨询类型:1三师咨询,2家庭医生咨询 3.名医咨询
			consult.setType(3);
			// 设置咨询类型:1三师咨询,2家庭医生咨询 6.名医咨询
			consult.setType(6);
			// 设置发病时间
			consult.setWhen(when);
			// 设置主要症状
@ -313,7 +332,8 @@ public class ConsultController extends WeixinBaseController {
			consult.setDoctor(doctorCode);//设置专科医生
			// 保存到数据库
			consultTeamService.addFamousTeamConsult(consult, getUID());
			//名医咨询次数减一
			doctorWorkTimeService.setDoctorCurrentConsultTimesRemain(doctorCode);
			// 推送消息给医生
			PushMsgTask.getInstance().put(consult.getDoctor(), MessageType.MESSAGE_TYPE_DOCTOR_NEW_FAMOUS_CONSULT_TEAM.D_CT_01.name(), MessageType.MESSAGE_TYPE_DOCTOR_NEW_FAMOUS_CONSULT_TEAM.名医咨询.name(), MessageType.MESSAGE_TYPE_DOCTOR_NEW_FAMOUS_CONSULT_TEAM.您有新的名医咨询.name(), consult.getConsult());
			return success("提交成功");
@ -323,7 +343,104 @@ public class ConsultController extends WeixinBaseController {
		}
	}
	/**
	 * 名医列表
	 * @return
     */
	@RequestMapping(value = "famousDoctorList")
	@ResponseBody
	public String famousDoctorList(
									@RequestParam(required = false) String name,
									long id,
									int pagesize) {
		try {
			JSONArray array = new JSONArray();
			Page<Doctor>list = doctorService.famousDoctorList(name, id, pagesize);
			if (list != null) {
				for (Doctor doctor : list) {
					if (doctor == null) {
						continue;
					}
					JSONObject json = new JSONObject();
					json.put("id", doctor.getId());
					// 医生标识
					json.put("code", doctor.getCode());
					// 医生姓名
					json.put("name", doctor.getName());
					// 所在医院名称
					json.put("hospital", doctor.getHospital());
					// 所在医院名称
					json.put("hospital_name", doctor.getHosptialName());
					// 科室名称
					json.put("dept_name", (doctor.getDeptName() == null ||
							StringUtils.isEmpty(doctor.getDeptName().toString())) ? " " : doctor.getDeptName());
					// 职称名称
					json.put("job_name", (doctor.getJobName() == null ||
							StringUtils.isEmpty(doctor.getJobName().toString())) ? " " : doctor.getJobName());
					// 头像
					json.put("photo", doctor.getPhoto());
					// 简介
					json.put("introduce", doctor.getIntroduce());
					// 专长
					json.put("expertise", doctor.getExpertise());
					// 剩余咨询次数
					json.put("num", doctorWorkTimeService.getDoctorConsultTimesRemain(doctor.getCode()));
					array.put(json);
				}
			}
			return write(200, "获取医院医生列表成功!", "list", array);
		} catch (Exception e) {
			error(e);
			return error(-1, "获取医院医生列表失败!");
		}
	}
	/**
	 * 名医主页
	 * @return
	 */
	@RequestMapping(value = "famousDoctorPage")
	@ResponseBody
	public String famousDoctorPage(
			 String doctorCode) {
		try {
			Doctor temp = doctorService.findDoctorByCode(doctorCode);
			if (temp != null) {
				JSONObject json = new JSONObject();
				// 设置医生手机号码
				json.put("mobile", temp.getMobile());
				// 设置医生标识
				json.put("code", temp.getCode());
				// 设置医生姓名
				json.put("name", temp.getName());
				// 设置医生头像
				json.put("photo", CommonUtil.getPhoneUrl(temp.getPhoto()));
				// 设置医生性别
				json.put("sex", temp.getSex());
				// 设置省名称
				json.put("provinceName", temp.getProvinceName());
				// 设置城市名称
				json.put("cityName", temp.getCityName());
				// 设置医院名称
				json.put("hospitalName", temp.getHosptialName());
				// 设置部门名称
				json.put("deptName", StringUtils.isNotEmpty(temp.getDeptName()) ? temp.getDeptName() : "");
				// 设置职称
				json.put("jobName", StringUtils.isNotEmpty(temp.getJobName()) ? temp.getJobName() : "");
				// 设置医生专长
				json.put("expertise", StringUtils.isNotEmpty(temp.getExpertise()) ? temp.getExpertise() : "");
				// 设置医生简介
				json.put("introduce", StringUtils.isNotEmpty(temp.getIntroduce()) ? temp.getIntroduce() : "");
				//doctorWorkTimeService.findDoctorWeekWorkTime()
				return write(200, "医生信息查询成功!", "data", json);
			} else {
				return error(-1, "医生信息查询失败!");
			}
		} catch (Exception e) {
			error(e);
			return invalidUserException(e, -1, "医生信息查询失败!");
		}
	}
	@RequestMapping(value = "status")
	@ResponseBody

+ 96 - 46
src/main/java/com/yihu/wlyy/web/statistic/StatisticsController.java

@ -23,31 +23,31 @@ public class StatisticsController extends BaseController {
     * 指标按间隔统计
     *
     * @param startDate 起始日期
     * @param endDate 结束时间
     * @param interval 时间间隔
     * @param area 区域或机构
     * @param level 级别
     * @param index 指标
     * @param endDate   结束时间
     * @param interval  时间间隔
     * @param area      区域或机构
     * @param level     级别
     * @param index     指标
     * @return
     */
    @RequestMapping(value = "/interval")
    @ResponseBody
    public String indexInterval(String startDate,String endDate,int interval,String area,int level,String index){
    public String indexInterval(String startDate, String endDate, int interval, String area, int level, String index) {
        String tag = "";
        try{
        try {
            String[] indexes = index.split(",");
            JSONObject result = new JSONObject();
            if(index != null){
                for(String idx : indexes) {
                    result.put("index_" + idx,statisticsService.getDateIncrementDetail(startDate,endDate,interval,area,level,idx));
            if (index != null) {
                for (String idx : indexes) {
                    result.put("index_" + idx, statisticsService.getDateIncrementDetail(startDate, endDate, interval, area, level, idx));
                }
            }
            return write(200,"查询成功!","data",result);
        }catch (Exception e){
            return write(200, "查询成功!", "data", result);
        } catch (Exception e) {
            e.printStackTrace();
            return error(-1,tag +"查询失败!");
            return error(-1, tag + "查询失败!");
        }
    }
@ -63,19 +63,19 @@ public class StatisticsController extends BaseController {
     */
    @RequestMapping("/increment")
    @ResponseBody
    public String getIndexIncrement(String startDate,String endDate,String area,int level,String index){
        try{
    public String getIndexIncrement(String startDate, String endDate, String area, int level, String index) {
        try {
            String[] indexes = index.split(",");
            JSONObject result = new JSONObject();
            for(String idx : indexes){
                result.put("index_" + idx,statisticsService.getIntervalIncrement(startDate,endDate,area,level,idx));
            for (String idx : indexes) {
                result.put("index_" + idx, statisticsService.getIntervalIncrement(startDate, endDate, area, level, idx));
            }
            return write(200,"查询成功","data",result);
        }catch (Exception e){
            return write(200, "查询成功", "data", result);
        } catch (Exception e) {
            e.printStackTrace();
            return error(-1,"查询失败");
            return error(-1, "查询失败");
        }
    }
@ -90,19 +90,19 @@ public class StatisticsController extends BaseController {
     */
    @RequestMapping("/total")
    @ResponseBody
    public String getIndexTotal(String endDate,String area,int level,String index){
        try{
    public String getIndexTotal(String endDate, String area, int level, String index) {
        try {
            String[] indexes = index.split(",");
            JSONObject result = new JSONObject();
            for(String idx : indexes){
                result.put("index_" + idx,statisticsService.getTotalAmount(endDate,area,level,idx));
            for (String idx : indexes) {
                result.put("index_" + idx, statisticsService.getTotalAmount(endDate, area, level, idx));
            }
            return write(200,"查询成功","data",result);
        }catch (Exception e){
            return write(200, "查询成功", "data", result);
        } catch (Exception e) {
            e.printStackTrace();
            return error(-1,"查询失败");
            return error(-1, "查询失败");
        }
    }
@ -118,19 +118,19 @@ public class StatisticsController extends BaseController {
     */
    @RequestMapping("/lowlevel_increment")
    @ResponseBody
    public String getIndexLowLevelIncrement(String startDate,String endDate,String area,int level,String index,int sort){
        try{
    public String getIndexLowLevelIncrement(String startDate, String endDate, String area, int level, String index, int sort,String lowLevel) {
        try {
            String[] indexes = index.split(",");
            JSONObject result = new JSONObject();
            for(String idx : indexes){
                result.put("index_" + idx,statisticsService.getLowLevelIncrementDetail(startDate,endDate,area,level,idx,sort));
            for (String idx : indexes) {
                result.put("index_" + idx, statisticsService.getLowLevelIncrementDetail(startDate, endDate, area, level, idx, sort,lowLevel));
            }
            return write(200,"查询成功","data",result);
        }catch (Exception e){
            return write(200, "查询成功", "data", result);
        } catch (Exception e) {
            e.printStackTrace();
            return error(-1,"查询失败");
            return error(-1, "查询失败");
        }
    }
@ -145,19 +145,19 @@ public class StatisticsController extends BaseController {
     */
    @RequestMapping("/lowlevel_total")
    @ResponseBody
    public String getIndexLowLevelTotal(String endDate,String area,int level,String index,int sort){
        try{
    public String getIndexLowLevelTotal(String endDate, String area, int level, String index, int sort, String lowLevel) {
        try {
            String[] indexes = index.split(",");
            JSONObject result = new JSONObject();
            for(String idx : indexes){
                result.put("index_" + idx,statisticsService.getLowLevelTotalDetail(endDate,area,level,idx,sort));
            for (String idx : indexes) {
                result.put("index_" + idx, statisticsService.getLowLevelTotalDetail(endDate, area, level, idx, sort, lowLevel));
            }
            return write(200,"查询成功","data",result);
        }catch (Exception e){
            return write(200, "查询成功", "data", result);
        } catch (Exception e) {
            e.printStackTrace();
            return error(-1,"查询失败");
            return error(-1, "查询失败");
        }
    }
@ -173,20 +173,70 @@ public class StatisticsController extends BaseController {
     */
    @RequestMapping("/leveltwo_increment")
    @ResponseBody
    public String getIndexLevelTwoIncrement(String startDate,String endDate,String area,int level,String index){
        try{
    public String getIndexLevelTwoIncrement(String startDate, String endDate, String area, int level, String index) {
        try {
            String[] indexes = index.split(",");
            JSONObject result = new JSONObject();
            for(String idx : indexes){
                result.put("index_" + idx,statisticsService.getLevelTwoIndexIncrement(startDate,endDate,area,level,idx));
            for (String idx : indexes) {
                result.put("index_" + idx, statisticsService.getLevelTwoIndexIncrement(startDate, endDate, area, level, idx));
            }
            return write(200, "查询成功", "data", result);
        } catch (Exception e) {
            e.printStackTrace();
            return error(-1, "查询失败");
        }
    }
    /**
     * 获取签约率、签约完成率
     *
     * @param endDate 截止日期
     * @param area    区域
     * @param level   区域级别 4:城市 3:区 2:社区 1:团队
     * @param type    1:签约率  2:签约完成率
     * @return
     */
    @RequestMapping(value = "/rate")
    @ResponseBody
    public String getAreaRate(String endDate, String area, int level, String type) {
        try {
            String result = "0.00";
            if (type.equals("1")) {
                result = statisticsService.getSignRate(endDate,area,level);
            } else {
                result = statisticsService.getSignTaskRate(endDate,area,level);
            }
            return write(200, "查询成功", "data", result);
        } catch (Exception e) {
            e.printStackTrace();
            return error(-1, "查询失败");
        }
    }
    /**
     * 获取三级指标增量
     *
     * @param startDate
     * @param endDate
     * @param area
     * @param level
     * @return
     */
    @RequestMapping(value = "/sixfive_statistics")
    @ResponseBody
    public String getSixFiveStatistics(String startDate, String endDate, String area, int level){
        try{
            JSONArray result = statisticsService.getSixFiveStatistics(startDate,endDate,area,level);
            return write(200,"查询成功","data",result);
        }catch (Exception e){
            e.printStackTrace();
            return error(-1,"查询失败");
        }
    }
}

+ 29 - 0
src/main/java/com/yihu/wlyy/wechat/process/WeiXinEventProcess.java

@ -148,6 +148,35 @@ public class WeiXinEventProcess {
            article.put("Description","请点击查看社区详情");
            article.put("PicUrl",picUrl);
            articles.add(article);
            // 消息XML
            result = WeiXinMessageReplyUtils.replyNewsMessage(message.get("FromUserName"),message.get("ToUserName"),articles);
        } else if(StringUtils.isNotEmpty(eventKey) && (eventKey.startsWith("tw_") ||
                eventKey.startsWith("qrscene_tw_"))){
            // 配置信息
            Properties systemConf = SystemConf.getInstance().getSystemProperties();
            // 图文信息
            List<Map<String,String>> articles =  new ArrayList<>();
            Map<String,String> article = new HashMap<>();
            // 社区二维码跳转URL
            String url = systemConf.getProperty("doctor_town_qrcode_url");
            // 图片URL
            String picUrl = systemConf.getProperty("doctor_qrcode_pic_url");
            // 二维码参数
            String[] keys = eventKey.replace("qrscene_tw_","").replace("tw_","").split("_");
            // 图文消息URL
            url = url.replace("{server}", systemConf.getProperty("wechat_base_url"))
                    .replace("{appId}", systemConf.getProperty("appId"))
                    .replace("{town}",keys[0]);
            //图片地址
            picUrl = picUrl.replace("{server}", systemConf.getProperty("server_url"));
            article.put("Url",url);
            article.put("Title",keys[1]);
            article.put("Description","请点击查看区详情");
            article.put("PicUrl",picUrl);
            articles.add(article);
            // 消息XML
            result = WeiXinMessageReplyUtils.replyNewsMessage(message.get("FromUserName"),message.get("ToUserName"),articles);

+ 1 - 0
src/main/resources/system.properties

@ -89,6 +89,7 @@ chat_file_path=/var/local/upload/chat
doctor_qrcode_url=https://open.weixin.qq.com/connect/oauth2/authorize?appid={appId}&amp;redirect_uri={server}%2fwx%2fhtml%2fssgg%2fhtml%2fdoctor-homepage-new.html&amp;response_type=code&amp;scope=snsapi_base&amp;state={doctorCode}#wechat_redirect
doctor_hos_qrcode_url=https://open.weixin.qq.com/connect/oauth2/authorize?appid={appId}&amp;redirect_uri={server}%2fwx%2fhtml%2fqygl%2fhtml%2fsearch-doctor.html&amp;response_type=code&amp;scope=snsapi_base&amp;state={hospital}#wechat_redirect
doctor_subscribe_url=https://open.weixin.qq.com/connect/oauth2/authorize?appid={appId}&amp;redirect_uri={server}%2fwx%2fhtml%2fqygl%2fhtml%2fsigning-welcome.html&amp;response_type=code&amp;scope=snsapi_base&amp;state=code#wechat_redirect
doctor_town_qrcode_url=https://open.weixin.qq.com/connect/oauth2/authorize?appid={appId}&amp;redirect_uri={server}%2fwx%2fhtml%2fqygl%2fhtml%2fsearch-community.html&amp;response_type=code&amp;scope=snsapi_base&amp;state={town}#wechat_redirect
doctor_qrcode_pic_url={server}/images/familycontract.png
doctor_invitel_url=https://open.weixin.qq.com/connect/oauth2/authorize?appid={appId}&redirect_uri={server}%2fwx%2fhtml%2fssgg%2fhtml%2fdoctor-homepage-new.html&response_type=code&scope=snsapi_base&state={doctorCode}__{invilogcode}__{currentPatient}__{currentZH}#wechat_redirect