diff --git a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/controller/BabyStatisticsController.java b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/controller/BabyStatisticsController.java index abb7881..7136060 100644 --- a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/controller/BabyStatisticsController.java +++ b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/controller/BabyStatisticsController.java @@ -29,10 +29,21 @@ public class BabyStatisticsController { */ @ResponseBody @TokenRequired - @RequestMapping(value = "/matchpuerpera", method = RequestMethod.POST) - public BaseResponse matchCommunity(@RequestBody BabyStatisticsQueryRequest babyStatisticsQueryRequest) { + @RequestMapping(value = "/statistics", method = RequestMethod.POST) + public BaseResponse statistics(@RequestBody BabyStatisticsQueryRequest babyStatisticsQueryRequest) { return babyStatisticsFacade.statistics(babyStatisticsQueryRequest); } + /** + 儿童统计 + * @Author: 武涛涛 + * @Date: 2021/3/20 13:55 + */ + @ResponseBody + @TokenRequired + @RequestMapping(value = "/statistics2", method = RequestMethod.POST) + public BaseResponse statistics2(@RequestBody BabyStatisticsQueryRequest babyStatisticsQueryRequest) { + return babyStatisticsFacade.statistics2(babyStatisticsQueryRequest); + } diff --git a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/BabyStatisticsFacade.java b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/BabyStatisticsFacade.java index 4750263..fff9029 100644 --- a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/BabyStatisticsFacade.java +++ b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/BabyStatisticsFacade.java @@ -5,9 +5,16 @@ import com.lyms.platform.common.constants.ErrorCodeConstants; import com.lyms.platform.common.enums.YnEnums; import com.lyms.platform.common.result.BaseObjectResponse; import com.lyms.platform.common.result.BaseResponse; +import com.lyms.platform.common.utils.DateUtil; +import com.lyms.platform.common.utils.ExceptionUtils; import com.lyms.platform.common.utils.StringUtils; import com.lyms.platform.operate.web.request.BabyStatisticsQueryRequest; import com.lyms.platform.operate.web.service.impl.BaseServiceImpl; +import com.lyms.platform.operate.web.worker.BabyStatisticsWorker; +import com.lyms.platform.permission.dao.master.BabyPatientExtendEarHearingDiagnoseMapper; +import com.lyms.platform.permission.dao.master.BabyPatientExtendEarScreenMapper; +import com.lyms.platform.permission.model.BabyPatientExtendEarHearingDiagnoseQuery; +import com.lyms.platform.permission.model.BabyPatientExtendEarScreenQuery; import com.lyms.platform.permission.model.Organization; import com.lyms.platform.permission.model.OrganizationQuery; import com.lyms.platform.permission.service.OrganizationService; @@ -17,39 +24,64 @@ import org.apache.commons.collections.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.AggregationOperation; import org.springframework.data.mongodb.core.aggregation.AggregationResults; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import java.text.DecimalFormat; import java.util.*; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; @Component public class BabyStatisticsFacade extends BaseServiceImpl { private static final Logger logger = LoggerFactory.getLogger(BabyStatisticsFacade.class); // 儿童建册率分母 - private Long babyfm; + private Long babyfm = 0L; @Autowired private OrganizationService organizationService; + @Autowired private MongoTemplate mongoTemplate; @Autowired private IPatientDao iPatientDao; + @Autowired + private BabyPatientExtendEarScreenMapper babyPatientExtendEarScreenMapper; + + @Autowired + private BabyPatientExtendEarHearingDiagnoseMapper babyPatientExtendEarHearingDiagnoseMapper; + + @Autowired + @Qualifier("commonThreadPool") + private ThreadPoolTaskExecutor commonThreadPool; + + public BaseResponse statistics2(BabyStatisticsQueryRequest queryRequest) { + List < Map> listMaps = init(); + long startTime=System.currentTimeMillis(); //获取开始时间 + List mapList = convertToHugeQuanWeight(listMaps,queryRequest); + long endTime=System.currentTimeMillis(); //获取结束时间 + System.out.println("程序运行毫秒: "+(endTime-startTime)+"ms"); + return new BaseObjectResponse().setErrorcode(ErrorCodeConstants.SUCCESS).setErrormsg("成功").setData(mapList); + } /* - 儿童统计: - 1:高危儿管理率、2:儿童建册率、3:低出生体重儿百分比、 - 4:3岁以下儿童系统管理率、5.1:中重度贫血率、5.2:5岁以下儿童肥胖率、6:听力确诊率、7:听力筛查率 - */ + 儿童统计: + 1:高危儿管理率、2:儿童建册率、3:低出生体重儿百分比、 + 4:3岁以下儿童系统管理率、5.1:中重度贫血率、5.2:5岁以下儿童肥胖率、6:听力确诊率、7:听力筛查率 + */ public BaseResponse statistics(BabyStatisticsQueryRequest queryRequest) { Map staMaps = new HashMap <>(); + long startTime=System.currentTimeMillis(); //获取开始时间 + List provinceCityAreaHid = getProvinceCityAreaHid(queryRequest); //1:高危儿管理率 Map gwMap = getGwMap(queryRequest, provinceCityAreaHid); @@ -71,12 +103,192 @@ public class BabyStatisticsFacade extends BaseServiceImpl { Map fplMap = getFplMap(queryRequest, provinceCityAreaHid); staMaps.put("fplMap", fplMap); + //6:听力确诊率 + Map tlqzMap = getTlqzMap(queryRequest, provinceCityAreaHid); + staMaps.put("tlqzMap", tlqzMap); + //7:听力筛查率 + Map tlscMap = getTlscMap(queryRequest, provinceCityAreaHid); + staMaps.put("tlscMap", tlscMap); - + long endTime=System.currentTimeMillis(); //获取结束时间 + System.out.println("程序运行毫秒: "+(endTime-startTime)+"ms"); return new BaseObjectResponse().setErrorcode(ErrorCodeConstants.SUCCESS).setErrormsg("成功").setData(staMaps); } + /* + 1 定义 接口 抽象方法 + 2 实现 接口 抽象方法,不同对象的实现抽象方法, + 3 不同对象的实现抽象方法,存储在list集合中。 + 4 遍历list使用线程执集合元素 + */ + + private List convertToHugeQuanWeight( List< Map> listMaps,BabyStatisticsQueryRequest queryRequest) { + List provinceCityAreaHid = getProvinceCityAreaHid(queryRequest); + List data = new ArrayList <>(); + int batchSize = 2; + int end = 0; + List listFuture = new ArrayList <>(); + for (int i = 0; i < listMaps.size(); i += batchSize) { + end = (end + batchSize); + if (end > listMaps.size()) { + end = listMaps.size(); + } +// listFuture.add(commonThreadPool.submit(new BabyStatisticsWorker(listMaps.subList(i, end), mongoTemplate, commonService, basicConfigService))); + listFuture.add(commonThreadPool.submit(new BabyStatisticsWorker(listMaps.subList(i, end), queryRequest, provinceCityAreaHid))); + } + if(listFuture != null){ + for (Future f : listFuture) { + try { + if(f!=null && f.get(30, TimeUnit.SECONDS)!=null){ + data.addAll((List ) f.get(300, TimeUnit.SECONDS)); + } + } catch (Exception e) { + ExceptionUtils.catchException(e, "convertToQuanWeight get result Future error."); + } + } + } + return data; + } + + + + + public interface Statistic { + abstract Map statisticMap(BabyStatisticsQueryRequest queryRequest, List provinceCityAreaHid); + } + //1:高危儿管理率 + class GwMap implements Statistic{ + @Override + public Map statisticMap(BabyStatisticsQueryRequest queryRequest, List provinceCityAreaHid) { + return getGwMap(queryRequest, provinceCityAreaHid); + } + } + //2:儿童建册率 + class BabyMap implements Statistic{ + @Override + public Map statisticMap(BabyStatisticsQueryRequest queryRequest, List provinceCityAreaHid) { + return getBabyMap(queryRequest, provinceCityAreaHid); + } + } + //3:低出生体重儿百分比 + class DtzMap implements Statistic{ + @Override + public Map statisticMap(BabyStatisticsQueryRequest queryRequest, List provinceCityAreaHid) { + return getDtzMap(queryRequest, provinceCityAreaHid); + } + } + //4 :中重度贫血率 + class ZdpxMap implements Statistic{ + @Override + public Map statisticMap(BabyStatisticsQueryRequest queryRequest, List provinceCityAreaHid) { + return getZdpxMap(queryRequest, provinceCityAreaHid); + } + } + //5 :5岁以下儿童肥胖率 + class FplMap implements Statistic{ + @Override + public Map statisticMap(BabyStatisticsQueryRequest queryRequest, List provinceCityAreaHid) { + return getFplMap(queryRequest, provinceCityAreaHid); + } + } + //6:听力确诊率 + class TlqzMap implements Statistic{ + @Override + public Map statisticMap(BabyStatisticsQueryRequest queryRequest, List provinceCityAreaHid) { + return getTlqzMap(queryRequest, provinceCityAreaHid); + } + } + //7:听力筛查率 + class TlscMap implements Statistic{ + @Override + public Map statisticMap(BabyStatisticsQueryRequest queryRequest, List provinceCityAreaHid) { + return getTlscMap(queryRequest, provinceCityAreaHid); + } + } + + + + /** + 7:听力筛查率 + * @Author: 武涛涛 + * @Date: 2021/3/20 14:09 + */ + private Map getTlscMap(BabyStatisticsQueryRequest queryRequest, List provinceCityAreaHid) { + Map map = new HashMap <>(); + + try { + //分子 听筛管理的初筛条数 + BabyPatientExtendEarScreenQuery screenQuery = new BabyPatientExtendEarScreenQuery(); + screenQuery.setScreenType(1);// 1=初筛 2=复筛 + String[] str2= (String[])provinceCityAreaHid.toArray(new String[provinceCityAreaHid.size()]); + screenQuery.setCheckHospitalIds(str2); + screenQuery.setScreenStartDate(DateUtil.getYmdhmDate(queryRequest.getTimeStart())); + screenQuery.setScreenEndDate(DateUtil.getYmdhmDate(queryRequest.getTimeEnd())); + Integer fz = babyPatientExtendEarScreenMapper.queryEarScreenListCount(screenQuery); + map.put("fz",fz.toString()); + + //分母 + Long fm = getBabyfm(); + map.put("fm",fm.toString()); + + //分率 + if(fz !=null && fm !=null){ + Double fld = (double)fz/fm * 100; + if(fld <=0.01 ){ + fld = 0.01; + } + map.put("fl", new DecimalFormat("0.00").format(fld)+"%"); + } + + } catch (Exception e) { + e.printStackTrace(); + } + return map; + } + /** + 6:听力确诊率 + * @Author: 武涛涛 + * @Date: 2021/3/20 14:09 + */ + private Map getTlqzMap(BabyStatisticsQueryRequest queryRequest, List provinceCityAreaHid) { + Map map = new HashMap <>(); + + try { + String[] str2= (String[])provinceCityAreaHid.toArray(new String[provinceCityAreaHid.size()]); + + //分子 分子为确诊病历人数(诊断管理的已确诊条数) + BabyPatientExtendEarHearingDiagnoseQuery query = new BabyPatientExtendEarHearingDiagnoseQuery(); + query.setCheckHospitalIds(str2); + query.setIsconfirm(1);//1-确诊 + query.setDiagnoseStartTime(DateUtil.getYmdhmDate(queryRequest.getTimeStart())); + query.setDiagnoseEndTime(DateUtil.getYmdhmDate(queryRequest.getTimeEnd())); + Integer fz = babyPatientExtendEarHearingDiagnoseMapper.getHdAndScreenCount(query); + map.put("fz",fz.toString()); + + //分母 听筛管理的初筛条数 + BabyPatientExtendEarScreenQuery screenQuery = new BabyPatientExtendEarScreenQuery(); + screenQuery.setScrIspass(2);//2-未通过 + screenQuery.setCheckHospitalIds(str2); + screenQuery.setScreenStartDate(DateUtil.getYmdhmDate(queryRequest.getTimeStart())); + screenQuery.setScreenEndDate(DateUtil.getYmdhmDate(queryRequest.getTimeEnd())); + Integer fm = babyPatientExtendEarScreenMapper.queryEarScreenListCount(screenQuery); + map.put("fm",fm.toString()); + + //分率 + if(fz !=null && fm !=null){ + Double fld = (double)fz/fm * 100; + if(fld <=0.01 ){ + fld = 0.01; + } + map.put("fl", new DecimalFormat("0.00").format(fld)+"%"); + } + + } catch (Exception e) { + e.printStackTrace(); + } + return map; + } /** 5.2:5岁以下儿童肥胖率 @@ -95,7 +307,6 @@ public class BabyStatisticsFacade extends BaseServiceImpl { } Query queryZ = new Query(); queryZ.addCriteria(cz); - System.out.println("5.2.1:5岁以下儿童肥胖率 -- 分子 "+queryZ); Long countZ = mongoTemplate.count(queryZ, BabyCheckModel.class); map.put("fz",countZ.toString()); @@ -107,7 +318,6 @@ public class BabyStatisticsFacade extends BaseServiceImpl { } Query queryM = new Query(); queryM.addCriteria(cm); - System.out.println("5.2.2:5岁以下儿童肥胖率 -- 分母 "+queryZ); Long countM = mongoTemplate.count(queryM, BabyCheckModel.class); map.put("fm",countM.toString()); @@ -125,6 +335,7 @@ public class BabyStatisticsFacade extends BaseServiceImpl { } return map; } + /** 5.1:中重度贫血率 * @Author: 武涛涛 @@ -142,7 +353,6 @@ public class BabyStatisticsFacade extends BaseServiceImpl { } Query queryZ = new Query(); queryZ.addCriteria(cz); - System.out.println("5.1:中重度贫血率 -- 分子 "+queryZ); Long countZ = mongoTemplate.count(queryZ, BabyCheckModel.class); map.put("fz",countZ.toString()); @@ -178,7 +388,6 @@ public class BabyStatisticsFacade extends BaseServiceImpl { cz.orOperator(criteria2z,criteria1z); Query queryZ = new Query(); queryZ.addCriteria(cz); - System.out.println("3 低出生体重儿百分比 -- 分子 "+queryZ); Long countZ = mongoTemplate.count(queryZ, BabyModel.class); map.put("fz",countZ.toString()); @@ -221,8 +430,6 @@ public class BabyStatisticsFacade extends BaseServiceImpl { cz.orOperator(criteria2Z,criteria1Z); Query queryZ = new Query(); queryZ.addCriteria(cz); - System.out.println(queryZ); - System.out.println("2 儿童建册率 -- 分子 "+queryZ); Long countZ = mongoTemplate.count(queryZ, BabyModel.class); map.put("fz",countZ.toString() ); @@ -233,7 +440,6 @@ public class BabyStatisticsFacade extends BaseServiceImpl { } Query queryM = new Query(); queryM.addCriteria(cm); - System.out.println("2 儿童建册率 -- 分母 "+queryM); Long countM = mongoTemplate.count(queryM, BabyModel.class); setBabyfm(countM);//公共使用 map.put("fm",countM.toString()); @@ -353,4 +559,34 @@ public class BabyStatisticsFacade extends BaseServiceImpl { public void setBabyfm(Long babyfm) { this.babyfm = babyfm; } + + private List< Map> init() { + List< Map> listMaps = new ArrayList <>() ; + Map map0 = new HashMap(); + map0.put(0, new GwMap()); + listMaps.add(map0); + Map map1 = new HashMap(); + map1.put(1, new BabyMap()); + listMaps.add(map1); + Map map2 = new HashMap(); + map2.put(2, new DtzMap()); + listMaps.add(map2); + Map map3 = new HashMap(); + map3.put(3, new ZdpxMap()); + listMaps.add(map3); + Map map4 = new HashMap(); + map4.put(4, new ZdpxMap()); + listMaps.add(map4); + Map map5 = new HashMap(); + map5.put(5, new FplMap()); + listMaps.add(map5); + Map map6 = new HashMap(); + map6.put(6, new TlqzMap()); + listMaps.add(map6); + Map map7 = new HashMap(); + map7.put(7, new TlscMap()); + listMaps.add(map7); + return listMaps; + } + } diff --git a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/worker/BabyStatisticsWorker.java b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/worker/BabyStatisticsWorker.java new file mode 100644 index 0000000..b4fa0a8 --- /dev/null +++ b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/worker/BabyStatisticsWorker.java @@ -0,0 +1,63 @@ +package com.lyms.platform.operate.web.worker; + +import com.lyms.platform.operate.web.facade.BabyStatisticsFacade.Statistic; +import com.lyms.platform.operate.web.facade.PatientFacade; +import com.lyms.platform.operate.web.request.BabyStatisticsQueryRequest; +import org.apache.commons.collections.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; + +/** + * + 儿童统计 + * @Author: 武涛涛 + * @Date: 2021/3/21 11:11 + */ +public class BabyStatisticsWorker implements Callable> { + + public static final int i = 1; + private static final Logger logger = LoggerFactory.getLogger(PatientFacade.class); + + private List< Map> mapList; + private BabyStatisticsQueryRequest babyStatisticsQueryRequest; + private List provinceCityAreaHid; + + public BabyStatisticsWorker(List< Map> mapList, + BabyStatisticsQueryRequest babyStatisticsQueryRequest, + List provinceCityAreaHid + ) { + this.mapList = mapList; + this.babyStatisticsQueryRequest = babyStatisticsQueryRequest; + this.provinceCityAreaHid = provinceCityAreaHid; + } + + @Override + public List call() throws Exception { + List data = new ArrayList<>(); + for (int i = 0; i < mapList.size(); i++) { + if(CollectionUtils.isEmpty(provinceCityAreaHid)){ + continue; + } + Map integerStatisticMap = mapList.get(i); + + for (Map.Entry entry : integerStatisticMap.entrySet()) { + //System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); + Statistic statistic = integerStatisticMap.get(entry.getKey()); + if(statistic == null){ + continue; + } + Map map = statistic.statisticMap(babyStatisticsQueryRequest, provinceCityAreaHid); + data.add(map); + } + + } + return data; + } + + +} \ No newline at end of file