diff --git a/platform-dal/src/main/java/com/lyms/platform/pojo/HealthChargeModel.java b/platform-dal/src/main/java/com/lyms/platform/pojo/HealthChargeModel.java index 0e67353..06db2e2 100644 --- a/platform-dal/src/main/java/com/lyms/platform/pojo/HealthChargeModel.java +++ b/platform-dal/src/main/java/com/lyms/platform/pojo/HealthChargeModel.java @@ -37,7 +37,7 @@ public class HealthChargeModel extends BaseModel { */ private String babyNutritionId; - //打印报告等级 + //打印报告等级 1普通报告 2高危报告 private Integer type; private Date created; diff --git a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/controller/AreaCountController.java b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/controller/AreaCountController.java index c6fde54..8fd4e6b 100644 --- a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/controller/AreaCountController.java +++ b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/controller/AreaCountController.java @@ -274,5 +274,44 @@ public class AreaCountController extends BaseController { } } + /** + * 健康管理统计详情list + * + * @param query + */ + @RequestMapping(value = "/healthManagerDetail/list",method = RequestMethod.POST) + @ResponseBody + @TokenRequired + public BaseResponse healthManagerDetailList(@RequestBody @Valid HealthManagerListRequest query, HttpServletRequest request){ + LoginContext loginState = (LoginContext) request.getAttribute("loginContext"); + query.setUserId(loginState.getId()); + try { + return areaCountFacade.healthManagerDetailList(query); + }catch (Exception e){ + logger.error("健康管理统计详情失败",e); + BaseResponse baseResponse = new BaseResponse(); + baseResponse.setErrorcode(ErrorCodeConstants.SYSTEM_ERROR); + baseResponse.setErrormsg("增健康管理统计详情失败"); + return baseResponse; + } + } + + + /** + * 增值服务统计detailList 导出 + * + * @param param + */ + @RequestMapping(value = "/healthManagerDetail/export",method = RequestMethod.GET) + @TokenRequired + public void healthManagerDetailExport(HealthManagerListRequest param, HttpServletRequest request, HttpServletResponse response){ + LoginContext loginState = (LoginContext) request.getAttribute("loginContext"); + param.setUserId(loginState.getId()); + try { + areaCountFacade.healthManagerDetailExport(param, response); + }catch (Exception e){ + logger.error("增值服务统计导出失败", e); + } + } } \ No newline at end of file diff --git a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/AreaCountFacade.java b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/AreaCountFacade.java index 8ba834d..5e11356 100644 --- a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/AreaCountFacade.java +++ b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/AreaCountFacade.java @@ -1,6 +1,7 @@ package com.lyms.platform.operate.web.facade; +import com.alibaba.fastjson.JSONObject; import com.lyms.platform.beans.AddressBean; import com.lyms.platform.biz.service.*; import com.lyms.platform.common.base.PageInfo; @@ -39,6 +40,7 @@ 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.aggregation.SortOperation; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @@ -51,6 +53,7 @@ import java.time.ZoneId; import java.time.temporal.TemporalAdjusters; import java.util.*; import java.util.concurrent.*; +import java.util.stream.Collectors; import static org.springframework.data.mongodb.core.aggregation.Aggregation.project; @@ -1401,70 +1404,409 @@ public class AreaCountFacade { startTime = getStartDate(); endTime = new Date(); } + List hospitalIds = getHospitalIds(query); + if (CollectionUtils.isEmpty(hospitalIds)){ + return baseResponse; + } - String hospitalId = query.getHospitalId(); - String provinceId = query.getProvinceId(); - String cityId = query.getCityId(); - String areaId = query.getAreaId(); + HealthChargeQuery healthChargeQuery = getHealthChargeQuery(query, startTime, endTime, hospitalIds); + + List columnarResults = getColumnarResultsByGroup(healthChargeQuery); + if (CollectionUtils.isNotEmpty(columnarResults)){ + for (HashMap map : columnarResults){ + String month = map.get("month").toString(); + String year = map.get("year").toString(); + String dateName = year +"-"+ month; + map.put("dateName", dateName); + + HealthChargeQuery chargeQuery = new HealthChargeQuery(); + BeanUtils.copy(healthChargeQuery, chargeQuery); + int length = month.length(); + if (length == 1){ + month = "0"+month; + } + dateName = year + "-" + month; + Date monthStart = DateUtil.yyyyMMParse(dateName); + Date monthEnd = getMonthEnd(monthStart); + chargeQuery.setCreatedStart(monthStart); + chargeQuery.setCreatedEnd(monthEnd); + Integer tzCount = countByType(chargeQuery, 1, false); + Integer xtCount = countByType(chargeQuery, 2, false); + Integer xyCount = countByType(chargeQuery, 3, false); + Integer babyCount = countByType(chargeQuery, 5, false); + HashMap hashMap = new HashMap<>(16); + hashMap.put("tzNumber",tzCount); + hashMap.put("xtNumber",xtCount); + hashMap.put("xyNumber",xyCount); + hashMap.put("babyNumber",babyCount); + map.put("dateVal", hashMap); + } + } + List results = getResults(healthChargeQuery); + + if (CollectionUtils.isNotEmpty(results)){ + for (HashMap map: results){ + String id = map.get("_id").toString(); + if (id != null){ + // 1体重 2 血糖 3 血压 4妊高症(暂时不需要) 5-儿童 + HealthChargeQuery chargeQuery = new HealthChargeQuery(); + BeanUtils.copy(healthChargeQuery, chargeQuery); + ArrayList arrayList = new ArrayList<>(); + arrayList.add(id); + chargeQuery.setHospitalIds(arrayList); + Integer tzCount = countByType(chargeQuery, 1, true); + Integer xtCount = countByType(chargeQuery, 2, true); + Integer xyCount = countByType(chargeQuery, 3, true); + Integer babyCount = countByType(chargeQuery, 5, true); + + Organization organization = organizationService.getOrganization(Integer.parseInt(id)); + if (organization != null){ + String oProvinceId = organization.getProvinceId(); + String oCityId = organization.getCityId(); + String oAreaId = organization.getAreaId(); + BasicConfig province = basicConfigService.getOneBasicConfigById(oProvinceId); + BasicConfig city = basicConfigService.getOneBasicConfigById(oCityId); + BasicConfig area = basicConfigService.getOneBasicConfigById(oAreaId); + map.put("provinceId", oProvinceId); + map.put("cityId", oCityId); + map.put("areaId", oAreaId); + map.put("provinceName", province.getName()); + map.put("cityName", city.getName()); + map.put("areaName", area.getName()); + map.put("hospitalName",organization.getName()); + map.put("tzNumber",tzCount); + map.put("xtNumber",xtCount); + map.put("xyNumber",xyCount); + map.put("babyNumber",babyCount); + map.put("count", tzCount + xtCount + xyCount + babyCount); + } + } + } + } + + + HashMap hashMap = new HashMap<>(16); + hashMap.put("columnarResults",columnarResults); + hashMap.put("results", results); + baseResponse.setObject(hashMap); + + return baseResponse; + } + + private HealthChargeQuery getHealthChargeQuery(HealthManagerListRequest query, Date startTime, Date endTime, List hospitalIds) { String reportNameType = query.getReportNameType(); String interpretDoctorId = query.getInterpretDoctorId(); String reportSource = query.getReportSource(); String reportType = query.getReportType(); String settleStatus = query.getSettleStatus(); - - List hospitalIds = new ArrayList<>(); - if (StringUtils.isNotEmpty(hospitalId)){ - hospitalIds.add(hospitalId); - }else { - hospitalIds = getCurrentUserHospPermissions(query.getUserId(), StringUtils.isEmpty(provinceId) ? null : provinceId, StringUtils.isEmpty(cityId) ? null : cityId, - StringUtils.isEmpty(areaId) ? null : areaId); - } - if (CollectionUtils.isEmpty(hospitalIds)){ - return baseResponse; - } - HealthChargeQuery healthChargeQuery = new HealthChargeQuery(); healthChargeQuery.setCreatedStart(startTime); healthChargeQuery.setCreatedEnd(endTime); healthChargeQuery.setYn(YnEnums.YES.getId()); - if (StringUtils.isNotEmpty(reportNameType)){ + if (StringUtils.isNotEmpty(reportNameType)) { healthChargeQuery.setHealthType(Integer.parseInt(reportNameType)); } - if (StringUtils.isNotEmpty(interpretDoctorId)){ + if (StringUtils.isNotEmpty(interpretDoctorId)) { healthChargeQuery.setDoctorId(interpretDoctorId); } - if (StringUtils.isNotEmpty(reportSource)){ + if (StringUtils.isNotEmpty(reportSource)) { healthChargeQuery.setSource(Integer.parseInt(reportSource)); } - if (StringUtils.isNotEmpty(reportType)){ + if (StringUtils.isNotEmpty(reportType)) { healthChargeQuery.setType(Integer.parseInt(reportType)); } - if (StringUtils.isNotEmpty(settleStatus)){ + if (StringUtils.isNotEmpty(settleStatus)) { healthChargeQuery.setStatus(Integer.parseInt(settleStatus)); } - if (CollectionUtils.isNotEmpty(hospitalIds)){ + if (CollectionUtils.isNotEmpty(hospitalIds)) { healthChargeQuery.setHospitalIds(hospitalIds); } + return healthChargeQuery; + } + + /** + * 月份的最后时间 + * + * @param date + * @return + */ + public Date getMonthEnd(Date date) { + Calendar c = Calendar.getInstance(); + c.setTime(date); + + //设置为当月最后一天 + c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH)); + //将小时至23 + c.set(Calendar.HOUR_OF_DAY, 23); + //将分钟至59 + c.set(Calendar.MINUTE, 59); + //将秒至59 + c.set(Calendar.SECOND,59); + //将毫秒至999 + c.set(Calendar.MILLISECOND, 999); + // 获取本月最后一天的时间戳 + + return new Date(c.getTimeInMillis()); + } + + /** + * 根据类型获取总数 + * + * @param chargeQuery + * @param i + * @return + */ + private Integer countByType(HealthChargeQuery chargeQuery, int i, boolean isGroup) { + chargeQuery.setHealthType(i); + List mapList; + Integer count = 0; + if (isGroup){ + mapList = getResults(chargeQuery); + } else { + mapList = getResultsNoGroup(chargeQuery); + } + if (CollectionUtils.isNotEmpty(mapList)) { + HashMap hashMap = mapList.get(0); + String countStr = hashMap.get("count").toString(); + count = Integer.parseInt(countStr); + } + + return count; + } + + /** + * 根据类型和医院分组查询 + * + * @param healthChargeQuery + * @return + */ + private List getResults(HealthChargeQuery healthChargeQuery) { + AggregationOperation queryParam1 = Aggregation.match(healthChargeQuery.convertToQuery().getCriteria()); + AggregationOperation group = Aggregation.group("hospitalId").count().as("count"); + Aggregation aggregation2 = Aggregation.newAggregation(queryParam1, group ); + AggregationResults result = mongoTemplate.aggregate(aggregation2, "lyms_health_charge", HashMap.class); + return result.getMappedResults(); + } - AggregationOperation match = Aggregation.match(healthChargeQuery.convertToQuery().getCriteria()); - AggregationOperation group = Aggregation.group("day","month","year","healthType").count().as("count"); + /** + * + * @param healthChargeQuery + * @return + */ + private List getResultsNoGroup(HealthChargeQuery healthChargeQuery) { + AggregationOperation queryParam1 = Aggregation.match(healthChargeQuery.convertToQuery().getCriteria()); + AggregationOperation group = Aggregation.group().count().as("count"); + Aggregation aggregation2 = Aggregation.newAggregation(queryParam1, group); + AggregationResults result = mongoTemplate.aggregate(aggregation2, "lyms_health_charge", HashMap.class); + return result.getMappedResults(); + } + + + private List getColumnarResults(HealthChargeQuery healthChargeQuery) { + AggregationOperation queryParam = Aggregation.match(healthChargeQuery.convertToQuery().getCriteria()); + AggregationOperation group = Aggregation.group("month","year","healthType","hospitalId").count().as("count"); AggregationOperation month = project(). - andExpression("dayOfMonth(created)").as("day"). - andExpression("month(created)").as("month"). - andExpression("year(created)").as("year"). - andExpression("healthType").as("healthType"); - Aggregation aggregation = Aggregation.newAggregation(match, month, group ); + //andExpression("dayOfMonth(created)").as("day"). + andExpression("month(created)").as("month"). + andExpression("year(created)").as("year"). + andExpression("healthType").as("healthType"). + andExpression("hospitalId").as("hospitalId"); + AggregationOperation sort = Aggregation.sort(Sort.Direction.ASC, "year", "month"); + Aggregation aggregation = Aggregation.newAggregation(queryParam, month, group, sort); AggregationResults result = mongoTemplate.aggregate(aggregation, "lyms_health_charge", HashMap.class); - List mappedResults = result.getMappedResults(); + return result.getMappedResults(); + } - AggregationOperation group2 = Aggregation.group("healthType").count().as("count"); - Aggregation aggregation2 = Aggregation.newAggregation(match, group2 ); - AggregationResults result2 = mongoTemplate.aggregate(aggregation2, "lyms_health_charge", HashMap.class); - List mappedResults2 = result2.getMappedResults(); + /** + * 针对柱状图查询结果集 + * + * @param healthChargeQuery + * @return + */ + private List getColumnarResultsByGroup(HealthChargeQuery healthChargeQuery) { + AggregationOperation queryParam = Aggregation.match(healthChargeQuery.convertToQuery().getCriteria()); + AggregationOperation group = Aggregation.group("month","year").count().as("count"); + AggregationOperation month = project(). + //andExpression("dayOfMonth(created)").as("day"). + andExpression("month(created)").as("month"). + andExpression("year(created)").as("year"); + AggregationOperation sort = Aggregation.sort(Sort.Direction.ASC, "year", "month"); + Aggregation aggregation = Aggregation.newAggregation(queryParam, month, group, sort); + AggregationResults result = mongoTemplate.aggregate(aggregation, "lyms_health_charge", HashMap.class); + return result.getMappedResults(); + } - baseResponse.setObject(mappedResults2); + /** + * 统计详情 list + * + * @param query + * @return + */ + public BaseResponse healthManagerDetailList(HealthManagerListRequest query) { + Date startTime = query.getStartTime(); + Date endTime = query.getEndTime(); + if (startTime == null || endTime == null){ + startTime = getStartDate(); + endTime = new Date(); + } - return baseResponse; + List hospitalIds = getHospitalIds(query); + + HealthChargeQuery healthChargeQuery = getHealthChargeQuery(query, startTime, endTime, hospitalIds); + List healthChargeModels = healthChargeService.queryHealthChargeList(healthChargeQuery); + LinkedList> linkedList = new LinkedList<>(); + if (CollectionUtils.isNotEmpty(healthChargeModels)){ + for (HealthChargeModel model : healthChargeModels){ + HashMap map = getStringObjectHashMap(model); + linkedList.add(map); + + } + } + + BaseListResponse baseListResponse = new BaseListResponse(); + baseListResponse.setData(linkedList); + baseListResponse.setPageInfo(healthChargeQuery.getPageInfo()); + return baseListResponse; + } + + private List getHospitalIds(HealthManagerListRequest query) { + String hospitalId = query.getHospitalId(); + String provinceId = query.getProvinceId(); + String cityId = query.getCityId(); + String areaId = query.getAreaId(); + + List hospitalIds = new ArrayList<>(); + if (StringUtils.isNotEmpty(hospitalId)) { + hospitalIds.add(hospitalId); + } else { + hospitalIds = getCurrentUserHospPermissions(query.getUserId(), StringUtils.isEmpty(provinceId) ? null : provinceId, StringUtils.isEmpty(cityId) ? null : cityId, + StringUtils.isEmpty(areaId) ? null : areaId); + } + return hospitalIds; + } + + /** + * 挑选需要的数据 + * + * @param model + * @return + */ + private HashMap getStringObjectHashMap(HealthChargeModel model) { + Date createDate = model.getCreated(); + String babyForeignId = model.getBabyForeignId(); + String name = "", healthTypeName = "", typeName = "", sourceName = "", doctorName = ""; + if (babyForeignId != null) { + BabyModel babyModel = mongoTemplate.findOne(Query.query(Criteria.where("_id").is(babyForeignId)), BabyModel.class); + if (babyModel != null) { + name = babyModel.getName(); + } + } + healthTypeName = getHealthTypeName(model, healthTypeName); + typeName = getTypeName(model, typeName); + Integer source = model.getSource(); + if (source != null) { + if (source == 1) { + sourceName = "院内报告"; + } + if (source == 2) { + sourceName = "临时报告"; + } + } + String doctorId = model.getDoctorId(); + if (StringUtils.isNotEmpty(doctorId)) { + Users users = usersService.getUsers(Integer.parseInt(doctorId)); + if (users != null) { + doctorName = users.getName(); + } + } + HashMap map = new HashMap<>(16); + map.put("createDate", createDate); + map.put("patientName", name); + map.put("healthType", healthTypeName); + map.put("type", typeName); + map.put("source", sourceName); + map.put("doctorName", doctorName); + map.put("status", model.getStatus() == 1 ? "未结算" : "已结算"); + return map; + } + + /** + * 导出 + * + * @param query + * @param response + */ + public void healthManagerDetailExport(HealthManagerListRequest query, HttpServletResponse response) throws Exception { + Date startTime = query.getStartTime(); + Date endTime = query.getEndTime(); + if (startTime == null || endTime == null){ + startTime = getStartDate(); + endTime = new Date(); + } + + String hospitalId = query.getHospitalId(); + List hospitalIds = new ArrayList<>(); + if (StringUtils.isNotEmpty(hospitalId)){ + hospitalIds.add(hospitalId); + }else { + hospitalIds = getCurrentUserHospPermissions(query.getUserId(), + StringUtils.isEmpty(query.getProvinceId()) ? null : query.getProvinceId(), StringUtils.isEmpty(query.getCityId()) ? null : query.getCityId(), + StringUtils.isEmpty(query.getAreaId()) ? null : query.getAreaId()); + } + + HealthChargeQuery healthChargeQuery = getHealthChargeQuery(query, startTime, endTime, hospitalIds); + + List healthChargeModels = healthChargeService.queryHealthChargeList(healthChargeQuery); + LinkedList> linkedList = new LinkedList<>(); + + if (CollectionUtils.isNotEmpty(healthChargeModels)){ + for (HealthChargeModel model : healthChargeModels){ + HashMap map = getStringObjectHashMap(model); + linkedList.add(map); + + } + Map names = new LinkedHashMap<>(); + names.put("createDate","购买日期"); + names.put("patientName", "姓名"); + names.put("healthType", "报告名称"); + names.put("type", "报告类型"); + names.put("source", "报告来源"); + names.put("doctorName","报告解读人"); + names.put("status","结算状态"); + ResponseUtil.responseExcel(names,linkedList,response); + } + } + + private String getTypeName(HealthChargeModel model, String typeName) { + Integer type = model.getType(); + if (type != null){ + if (type == 1){ + typeName = "1普通报告"; + } + if (type == 2){ + typeName = "高危报告"; + } + } + return typeName; + } + + private String getHealthTypeName(HealthChargeModel model, String healthTypeName) { + Integer healthType = model.getHealthType(); + if (healthType != null){ + if (healthType == 1){ + healthTypeName = "体重报告"; + } + if (healthType == 2){ + healthTypeName = "血糖报告"; + } + if (healthType == 3){ + healthTypeName = "血压报告"; + } + if (healthType == 5){ + healthTypeName = "儿童膳食报告"; + } + } + return healthTypeName; } }