package com.sinata.system.service.biz;
|
|
import cn.hutool.core.date.DatePattern;
|
import cn.hutool.core.date.DateUtil;
|
import com.alibaba.fastjson2.JSONArray;
|
import com.sinata.common.exception.ServiceException;
|
import com.sinata.common.utils.BeanUtils;
|
import com.sinata.common.utils.CollUtils;
|
import com.sinata.common.utils.DateUtils;
|
import com.sinata.system.domain.MedicalWasteStaticsVO;
|
import com.sinata.system.domain.MwCollectRecord;
|
import com.sinata.system.domain.MwTransitCarCollectPoint;
|
import com.sinata.system.domain.MwWarningRecord;
|
import com.sinata.system.domain.SysDepartment;
|
import com.sinata.system.domain.vo.CarDistributionVO;
|
import com.sinata.system.domain.vo.DepartmentTagInfoVO;
|
import com.sinata.system.domain.vo.MedicalInstitutionCollectListVO;
|
import com.sinata.system.domain.vo.MedicalWasteCollectVO;
|
import com.sinata.system.domain.vo.MwWarningRecordStaticsVO;
|
import com.sinata.system.domain.vo.MwWarningRecordVO;
|
import com.sinata.system.domain.vo.ScreenDepartmentVO;
|
import com.sinata.system.domain.vo.SysDictDataVO;
|
import com.sinata.system.domain.vo.TodayMedicalWastePieVO;
|
import com.sinata.system.domain.vo.TotalCollectWeightByTypeVO;
|
import com.sinata.system.enums.DepartmentEnum;
|
import com.sinata.system.enums.WarningTypeEnum;
|
import com.sinata.system.service.ISysDictDataService;
|
import com.sinata.system.service.MwCollectRecordService;
|
import com.sinata.system.service.MwDisposalRecordService;
|
import com.sinata.system.service.MwTransitCarCollectPointService;
|
import com.sinata.system.service.MwWarningRecordService;
|
import com.sinata.system.service.SysDepartmentService;
|
import lombok.RequiredArgsConstructor;
|
import org.jetbrains.annotations.NotNull;
|
import org.springframework.stereotype.Service;
|
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.util.ArrayList;
|
import java.util.Arrays;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.Objects;
|
import java.util.stream.Collectors;
|
|
/**
|
* @author mitao
|
* @date 2025/1/1
|
*/
|
@Service
|
@RequiredArgsConstructor
|
public class ScreenService {
|
private final SysDepartmentService sysDepartmentService;
|
private final MwCollectRecordService mwCollectRecordService;
|
private final ISysDictDataService sysDictDataService;
|
private final MwDisposalRecordService mwDisposalRecordService;
|
private final MwWarningRecordService mwWarningRecordService;
|
private final MwTransitCarCollectPointService mwTransitCarCollectPointService;
|
|
/**
|
* 机构分布-获取机构列表
|
*
|
* @return
|
*/
|
public List<ScreenDepartmentVO> departmentList() {
|
SysDepartment department = getNanNingDepartment();
|
List<SysDepartment> list = sysDepartmentService.lambdaQuery().likeRight(SysDepartment::getTreeCode, department.getTreeCode()).in(SysDepartment::getOrgType, DepartmentEnum.MEDICAL_INSTITUTION.getCode(), DepartmentEnum.DISPOSAL_UNIT.getCode()).list();
|
return BeanUtils.copyToList(list, ScreenDepartmentVO.class);
|
}
|
|
/**
|
* 获取大屏单位标签信息
|
*
|
* @param id
|
* @return
|
*/
|
public DepartmentTagInfoVO getTagInfo(Long id) {
|
SysDepartment department = sysDepartmentService.getById(id);
|
DepartmentTagInfoVO vo = new DepartmentTagInfoVO();
|
if (Objects.isNull(department)) {
|
throw new ServiceException("单位不存在");
|
}
|
if (department.getOrgType().equals(DepartmentEnum.MEDICAL_INSTITUTION.getCode())) {
|
vo = mwCollectRecordService.getTagInfo(id);
|
} else {
|
vo = mwDisposalRecordService.getTagInfo(id);
|
}
|
return vo;
|
}
|
/**
|
* 预警数据统计
|
*
|
* @return
|
*/
|
public MedicalWasteStaticsVO medicalWasteStatics() {
|
SysDepartment department = getNanNingDepartment();
|
return mwCollectRecordService.queryMedicalWasteStatics(department.getTreeCode());
|
}
|
|
/**
|
* 查询南宁市
|
*
|
* @return
|
*/
|
@NotNull
|
private SysDepartment getNanNingDepartment() {
|
SysDepartment department = sysDepartmentService.lambdaQuery().eq(SysDepartment::getDepartmentName, "南宁市").one();
|
if (Objects.isNull(department)) {
|
throw new ServiceException("南宁市不存在!");
|
}
|
return department;
|
}
|
|
/**
|
* 今日医废类型统计占比
|
*
|
* @return
|
*/
|
public List<TodayMedicalWastePieVO> todayMedicalWastePie() {
|
List<TodayMedicalWastePieVO> todayMedicalWastePieVOList = new ArrayList<>();
|
List<Long> departmentIdList = getNanNingMedicalInsitutionIdList();
|
if (CollUtils.isEmpty(departmentIdList)) {
|
return todayMedicalWastePieVOList;
|
}
|
//查询收集记录
|
List<MwCollectRecord> collectRecordList = mwCollectRecordService.lambdaQuery()
|
.in(MwCollectRecord::getDepartmentId, departmentIdList).list();
|
if (CollUtils.isEmpty(collectRecordList)) {
|
return todayMedicalWastePieVOList;
|
}
|
int total = collectRecordList.size();
|
//查询医废类型列表
|
List<SysDictDataVO> sysDictDataVOS = sysDictDataService.medicalWasteTypeList();
|
// 分组并统计每个 wasteType 对应的记录数
|
Map<Long, Long> resultMap = collectRecordList.stream()
|
.collect(Collectors.groupingBy(MwCollectRecord::getWasteType, Collectors.counting()));
|
todayMedicalWastePieVOList = sysDictDataVOS.stream().map(sysDictDataVO -> {
|
Long count = resultMap.getOrDefault(sysDictDataVO.getDictCode(), 0L);
|
TodayMedicalWastePieVO todayMedicalWastePieVO = new TodayMedicalWastePieVO();
|
todayMedicalWastePieVO.setMedicalWasteStr(sysDictDataVO.getDictLabel());
|
todayMedicalWastePieVO.setCssClass(sysDictDataVO.getCssClass());
|
todayMedicalWastePieVO.setCount(count.intValue());
|
todayMedicalWastePieVO.setProportion(BigDecimal.valueOf(count).divide(BigDecimal.valueOf(total), 4, RoundingMode.FLOOR).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.FLOOR));
|
return todayMedicalWastePieVO;
|
}).collect(Collectors.toList());
|
return todayMedicalWastePieVOList;
|
}
|
|
/**
|
* 南宁市医疗单位id列表
|
*
|
* @return
|
*/
|
public List<Long> getNanNingMedicalInsitutionIdList() {
|
SysDepartment nanNingDepartment = getNanNingDepartment();
|
List<SysDepartment> list = sysDepartmentService.lambdaQuery().likeRight(SysDepartment::getTreeCode, nanNingDepartment.getTreeCode()).eq(SysDepartment::getOrgType, DepartmentEnum.MEDICAL_INSTITUTION.getCode()).list();
|
return list.stream().map(SysDepartment::getId).collect(Collectors.toList());
|
}
|
/**
|
* 各类型医废收集总量
|
*
|
* @param type
|
* @return
|
*/
|
public TotalCollectWeightByTypeVO totalCollectWeightByType(Integer type) {
|
SysDepartment nanNingDepartment = getNanNingDepartment();
|
TotalCollectWeightByTypeVO vo = new TotalCollectWeightByTypeVO();
|
Date startTime = DateUtils.getNowDate();
|
Date endTime = DateUtils.getNowDate();
|
if (type.equals(1)) {
|
//获取最本周的日期
|
vo.setDateList(DateUtils.getAllDatesOfCurrentWeek("MM-dd"));
|
startTime = DateUtils.getFirstDayOfCurrentWeekAtMidnight();
|
} else {
|
//最近一个月的日期
|
vo.setDateList(DateUtils.getAllDatesOfCurrentMonth("MM-dd"));
|
startTime = DateUtils.getFirstDayOfCurrentMonthAtMidnight();
|
}
|
//查询医废类型
|
List<SysDictDataVO> medicalWasteTypeList = sysDictDataService.medicalWasteTypeList();
|
vo.setWasteTypeList(medicalWasteTypeList);
|
//查询南宁市下面的医疗机构
|
List<SysDepartment> list = sysDepartmentService.lambdaQuery()
|
.likeRight(SysDepartment::getTreeCode, nanNingDepartment.getTreeCode())
|
.eq(SysDepartment::getOrgType, DepartmentEnum.MEDICAL_INSTITUTION.getCode()).list();
|
List<Long> departmentIdList = list.stream().map(SysDepartment::getId).collect(Collectors.toList());
|
if (CollUtils.isEmpty(departmentIdList)) {
|
return vo;
|
}
|
//查询医废收集记录
|
List<MwCollectRecord> collectRecordList = mwCollectRecordService.lambdaQuery()
|
.in(MwCollectRecord::getDepartmentId, departmentIdList).between(MwCollectRecord::getCollectTime, startTime, endTime).list();
|
if (CollUtils.isEmpty(collectRecordList)) {
|
return vo;
|
}
|
//封装数据
|
for (SysDictDataVO sysDictDataVO : medicalWasteTypeList) {
|
List<BigDecimal> totalCollectWeightList = new ArrayList<>();
|
for (String date : vo.getDateList()) {
|
BigDecimal totalWeight = collectRecordList.stream().filter(record -> DateUtil.format(record.getCollectTime(), "MM-dd").equals(date)
|
&& record.getWasteType().equals(sysDictDataVO.getDictCode())).map(MwCollectRecord::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add);
|
totalCollectWeightList.add(totalWeight);
|
}
|
vo.getTotalCollectWeightList().add(totalCollectWeightList);
|
}
|
return vo;
|
}
|
|
/**
|
* 医疗机构收集情况
|
*
|
* @return
|
*/
|
public List<MedicalInstitutionCollectListVO> medicalInstitutionCollectList() {
|
// 获取南宁市医疗机构ID列表
|
List<Long> nanNingMedicalInstitutionIdList = getNanNingMedicalInsitutionIdList();
|
if (CollUtils.isEmpty(nanNingMedicalInstitutionIdList)) {
|
return CollUtils.emptyList();
|
}
|
|
// 查询收集记录
|
List<MwCollectRecord> collectRecordList = mwCollectRecordService.lambdaQuery()
|
.in(MwCollectRecord::getDepartmentId, nanNingMedicalInstitutionIdList)
|
.list();
|
if (CollUtils.isEmpty(collectRecordList)) {
|
return CollUtils.emptyList();
|
}
|
|
// 查询医废类型
|
List<SysDictDataVO> medicalWasteTypeList = sysDictDataService.medicalWasteTypeList();
|
|
// 根据医院分组
|
Map<String, List<MwCollectRecord>> recordGroupByDepartment = collectRecordList.stream()
|
.collect(Collectors.groupingBy(MwCollectRecord::getHospitalName));
|
|
// 构建结果列表
|
return recordGroupByDepartment.entrySet().stream()
|
.map(entry -> buildMedicalInstitutionCollectVO(entry.getKey(), entry.getValue(), medicalWasteTypeList))
|
.collect(Collectors.toList());
|
}
|
|
/**
|
* 构建医疗机构收集情况视图对象
|
*
|
* @param hospitalName
|
* @param records
|
* @param medicalWasteTypeList
|
* @return
|
*/
|
private MedicalInstitutionCollectListVO buildMedicalInstitutionCollectVO(String hospitalName, List<MwCollectRecord> records, List<SysDictDataVO> medicalWasteTypeList) {
|
// 医院基础信息
|
MedicalInstitutionCollectListVO vo = new MedicalInstitutionCollectListVO();
|
vo.setHospitalName(hospitalName);
|
|
// 根据医废类型分组
|
Map<Long, List<MwCollectRecord>> collectRecordGroupByWasteType = records.stream()
|
.collect(Collectors.groupingBy(MwCollectRecord::getWasteType));
|
|
// 构建医废类型统计信息
|
List<MedicalWasteCollectVO> medicalWasteList = medicalWasteTypeList.stream()
|
.map(sysDictDataVO -> buildMedicalWasteCollectVO(sysDictDataVO, collectRecordGroupByWasteType))
|
.collect(Collectors.toList());
|
vo.setMedicalWasteList(medicalWasteList);
|
|
return vo;
|
}
|
|
/**
|
* 封装医废类型统计信息
|
*
|
* @param sysDictDataVO
|
* @param collectRecordGroupByWasteType
|
* @return
|
*/
|
private MedicalWasteCollectVO buildMedicalWasteCollectVO(SysDictDataVO sysDictDataVO, Map<Long, List<MwCollectRecord>> collectRecordGroupByWasteType) {
|
MedicalWasteCollectVO medicalWasteCollectVO = new MedicalWasteCollectVO();
|
medicalWasteCollectVO.setWasteTypeStr(sysDictDataVO.getDictLabel());
|
|
// 获取当前类型的医废记录
|
List<MwCollectRecord> mwCollectRecords = collectRecordGroupByWasteType.getOrDefault(sysDictDataVO.getDictCode(), CollUtils.emptyList());
|
medicalWasteCollectVO.setCssClass(sysDictDataVO.getCssClass());
|
medicalWasteCollectVO.setBagNum(mwCollectRecords.size());
|
medicalWasteCollectVO.setWeight(mwCollectRecords.stream()
|
.map(MwCollectRecord::getWeight)
|
.reduce(BigDecimal.ZERO, BigDecimal::add));
|
return medicalWasteCollectVO;
|
}
|
|
/**
|
* 预警记录统计
|
*
|
* @return
|
*/
|
public List<MwWarningRecordStaticsVO> warningRecordStaticsList() {
|
SysDepartment nanNingDepartment = getNanNingDepartment();
|
//查询南宁的所有单位
|
List<SysDepartment> list = sysDepartmentService.lambdaQuery()
|
.likeRight(SysDepartment::getTreeCode, nanNingDepartment.getTreeCode())
|
.in(SysDepartment::getOrgType, DepartmentEnum.MEDICAL_INSTITUTION.getCode(), DepartmentEnum.DISPOSAL_UNIT.getCode()).list();
|
if (CollUtils.isEmpty(list)) {
|
return CollUtils.emptyList();
|
}
|
List<Long> departmentIds = list.stream().map(SysDepartment::getId).collect(Collectors.toList());
|
List<MwWarningRecord> warningRecordList = mwWarningRecordService.lambdaQuery().in(MwWarningRecord::getDepartmentId, departmentIds).list();
|
if (CollUtils.isEmpty(warningRecordList)) {
|
return CollUtils.emptyList();
|
}
|
return Arrays.stream(WarningTypeEnum.values()).map(item -> buildWarningRecordStaticsVO(item, warningRecordList)).collect(Collectors.toList());
|
}
|
|
/**
|
* 构建预警记录统计视图对象
|
*
|
* @param item
|
* @param warningRecordList
|
* @return
|
*/
|
private MwWarningRecordStaticsVO buildWarningRecordStaticsVO(WarningTypeEnum item, List<MwWarningRecord> warningRecordList) {
|
MwWarningRecordStaticsVO vo = new MwWarningRecordStaticsVO();
|
vo.setType(item.getCode());
|
vo.setTypeName(item.getDesc());
|
vo.setCount(warningRecordList.stream().filter(record -> record.getType().equals(item.getCode())).count());
|
return vo;
|
}
|
|
/**
|
* 根据预警类型查询预警详情
|
*
|
* @param type
|
* @return
|
*/
|
public List<MwWarningRecordVO> queryWarningRecordDetailByType(Integer type) {
|
SysDepartment nanNingDepartment = getNanNingDepartment();
|
//查询南宁市所有单位信息
|
List<SysDepartment> list = sysDepartmentService.lambdaQuery().likeRight(SysDepartment::getTreeCode, nanNingDepartment.getTreeCode()).list();
|
if (CollUtils.isEmpty(list)) {
|
return CollUtils.emptyList();
|
}
|
List<Long> departmentIds = list.stream().map(SysDepartment::getId).collect(Collectors.toList());
|
List<MwWarningRecord> warningRecordList = mwWarningRecordService.lambdaQuery().in(MwWarningRecord::getDepartmentId, departmentIds).eq(MwWarningRecord::getType, type).list();
|
return BeanUtils.copyToList(warningRecordList, MwWarningRecordVO.class);
|
}
|
|
/**
|
* 车辆分布
|
*
|
* @return
|
*/
|
public List<CarDistributionVO> queryCarDistribution() {
|
SysDepartment nanNingDepartment = getNanNingDepartment();
|
//查询车辆分布列表
|
List<CarDistributionVO> carDistributionVOS = mwTransitCarCollectPointService.queryCarListByTreeCode(nanNingDepartment.getTreeCode());
|
if (CollUtils.isNotEmpty(carDistributionVOS)) {
|
for (CarDistributionVO carDistributionVO : carDistributionVOS) {
|
MwTransitCarCollectPoint point = mwTransitCarCollectPointService.lambdaQuery().eq(MwTransitCarCollectPoint::getCarId, carDistributionVO.getId()).eq(MwTransitCarCollectPoint::getTransitDate, DateUtil.format(DateUtil.date(), DatePattern.NORM_DATE_PATTERN)).last("LIMIT 1").one();
|
if (Objects.nonNull(point)) {
|
String pointList = point.getPointList();
|
List<Long> pointIdList = JSONArray.parseArray(pointList, Long.class);
|
if (CollUtils.isNotEmpty(pointIdList)) {
|
//查询最后一个点位
|
SysDepartment department = sysDepartmentService.getById(pointIdList.get(pointIdList.size() - 1));
|
carDistributionVO.setLatitude(department.getLatitude());
|
carDistributionVO.setLongitude(department.getLongitude());
|
}
|
}
|
}
|
|
}
|
return carDistributionVOS;
|
}
|
|
/**
|
* 车辆分布详情
|
*
|
* @param id
|
* @return
|
*/
|
public CarDistributionVO queryCarDistributionDetail(Long id) {
|
return mwTransitCarCollectPointService.queryCarDistributionDetail(id);
|
}
|
}
|