package com.sinata.system.service.biz;
|
|
import cn.idev.excel.FastExcel;
|
import com.alibaba.fastjson2.JSONObject;
|
import com.google.common.collect.Lists;
|
import com.sinata.common.utils.CollUtils;
|
import com.sinata.common.utils.DateUtils;
|
import com.sinata.common.utils.StringUtils;
|
import com.sinata.system.config.AutoColumnWidthStrategy;
|
import com.sinata.system.domain.MwCollectRecord;
|
import com.sinata.system.domain.MwWarningRecord;
|
import com.sinata.system.domain.SysDepartment;
|
import com.sinata.system.domain.query.DisposalReportQuery;
|
import com.sinata.system.domain.query.HospitalReportQuery;
|
import com.sinata.system.domain.query.TransformQuery;
|
import com.sinata.system.domain.vo.DepartmentReportItemVO;
|
import com.sinata.system.domain.vo.DepartmentReportVO;
|
import com.sinata.system.domain.vo.MwCollectRecordVO;
|
import com.sinata.system.domain.vo.MwDisposalRecordReportVO;
|
import com.sinata.system.domain.vo.MwMedicalWasteBoxVO;
|
import com.sinata.system.domain.vo.SysDictDataVO;
|
import com.sinata.system.domain.vo.TransformVO;
|
import com.sinata.system.service.ISysDictDataService;
|
import com.sinata.system.service.MwCheckoutRecordService;
|
import com.sinata.system.service.MwCollectRecordService;
|
import com.sinata.system.service.MwDisposalHandleRecordService;
|
import com.sinata.system.service.MwDisposalRecordService;
|
import com.sinata.system.service.MwMicroEquipmentRecordItemService;
|
import com.sinata.system.service.MwWarningRecordService;
|
import com.sinata.system.service.SysDepartmentService;
|
import com.sinata.system.utils.ImageToBase64;
|
import lombok.RequiredArgsConstructor;
|
import org.springframework.stereotype.Service;
|
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.IOException;
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.net.MalformedURLException;
|
import java.net.URL;
|
import java.net.URLEncoder;
|
import java.text.SimpleDateFormat;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Objects;
|
import java.util.stream.Collectors;
|
|
/**
|
* @author mitao
|
* @date 2024/12/25
|
*/
|
@Service
|
@RequiredArgsConstructor
|
public class StaticsService {
|
private final SysDepartmentService sysDepartmentService;
|
private final MwCollectRecordService mwCollectRecordService;
|
private final MwCheckoutRecordService mwCheckoutRecordService;
|
private final ISysDictDataService sysDictDataService;
|
private final MwWarningRecordService mwWarningRecordService;
|
private final HttpServletResponse response;
|
private final MwDisposalRecordService mwDisposalRecordService;
|
private final MwDisposalHandleRecordService mwDisposalHandleRecordService;
|
private final MwMicroEquipmentRecordItemService mwMicroEquipmentRecordItemService;
|
|
|
|
/**
|
* 医院报表
|
*
|
* @param query
|
* @return
|
*/
|
public DepartmentReportVO hospitalReport(HospitalReportQuery query) {
|
DepartmentReportVO vo = new DepartmentReportVO();
|
SysDepartment department = sysDepartmentService.getById(query.getDepartmentId());
|
if (Objects.nonNull(department)) {
|
vo.setDepartmentName(department.getDepartmentName());
|
}
|
List<SysDictDataVO> wasteTypeList = sysDictDataService.medicalWasteTypeList();
|
|
if (CollUtils.isEmpty(wasteTypeList)) {
|
return vo;
|
}
|
vo.setLegend(wasteTypeList.stream().map(SysDictDataVO::getDictLabel).collect(Collectors.toList()));
|
vo.getLegend().add("小计");
|
List<MwCollectRecord> collectRecordList = mwCollectRecordService.lambdaQuery()/*.eq(query.getReportType().equals(1), MwCollectRecord::getStatus, MedicalWasteStatusEnum.TEMPORARILY_STORED.getCode())
|
.ne(query.getReportType().equals(2), MwCollectRecord::getStatus, MedicalWasteStatusEnum.TEMPORARILY_STORED.getCode())*/
|
.eq(MwCollectRecord::getDepartmentId, query.getDepartmentId())
|
.between(query.getReportType().equals(1), MwCollectRecord::getCollectTime, query.getStartTime(), query.getEndTime())
|
.between(query.getReportType().equals(2), MwCollectRecord::getCheckoutTime, query.getStartTime(), query.getEndTime())
|
.orderByDesc(MwCollectRecord::getCollectTime).list();
|
SimpleDateFormat sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS);
|
switch (query.getDateType()) {
|
case 1:
|
sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD);
|
break;
|
case 2:
|
sdf = new SimpleDateFormat(DateUtils.YYYY_MM);
|
break;
|
case 3:
|
sdf = new SimpleDateFormat(DateUtils.YYYY);
|
break;
|
}
|
List<String> dateList = DateUtils.getDayBetween(query.getStartTime(), query.getEndTime(), query.getDateType());
|
List<DepartmentReportItemVO> list = new ArrayList<>();
|
for (String date : dateList) {
|
DepartmentReportItemVO itemVO = new DepartmentReportItemVO();
|
itemVO.setName(date);
|
itemVO.setData(new ArrayList<>());
|
BigDecimal totalCount = BigDecimal.ZERO;
|
BigDecimal totalWeight = BigDecimal.ZERO;
|
SimpleDateFormat finalSdf = sdf;
|
for (SysDictDataVO sysDictData : wasteTypeList) {
|
BigDecimal weight = BigDecimal.ZERO;
|
BigDecimal currentCount = BigDecimal.ZERO;
|
if (query.getReportType().equals(1)) {
|
weight = collectRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode())
|
&& finalSdf.format(e.getCollectTime()).equals(date)).map(MwCollectRecord::getWeight)
|
.reduce(BigDecimal::add).orElse(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
|
long count = collectRecordList.stream()
|
.filter(e -> e.getWasteType().equals(sysDictData.getDictCode()) && finalSdf.format(e.getCollectTime()).equals(date))
|
.count();
|
currentCount = BigDecimal.valueOf(count);
|
} else {
|
weight = collectRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode())
|
&& finalSdf.format(e.getCheckoutTime()).equals(date)).map(MwCollectRecord::getWeight)
|
.reduce(BigDecimal::add).orElse(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
|
long count = collectRecordList.stream()
|
.filter(e -> e.getWasteType().equals(sysDictData.getDictCode()) && finalSdf.format(e.getCheckoutTime()).equals(date))
|
.count();
|
currentCount = BigDecimal.valueOf(count);
|
}
|
itemVO.getData().add(currentCount);
|
itemVO.getData().add(weight);
|
totalCount = totalCount.add(currentCount);
|
totalWeight = totalWeight.add(weight);
|
}
|
itemVO.getData().add(totalCount);
|
itemVO.getData().add(totalWeight);
|
//查询预警记录判断是否超时
|
if (query.getDateType().equals(1)) {
|
itemVO.setOverTimeFlag("否");
|
List<Long> collectIdList = collectRecordList.stream().filter(e -> finalSdf.format(e.getCollectTime()).equals(date))
|
.map(MwCollectRecord::getId).collect(Collectors.toList());
|
if (CollUtils.isNotEmpty(collectIdList)) {
|
List<MwWarningRecord> warningRecordList = mwWarningRecordService.lambdaQuery().in(MwWarningRecord::getWarningTargetId, collectIdList).list();
|
if (CollUtils.isNotEmpty(warningRecordList)) {
|
itemVO.setOverTimeFlag("是");
|
}
|
}
|
}
|
list.add(itemVO);
|
}
|
// 添加合计行
|
if (!list.isEmpty()) {
|
DepartmentReportItemVO totalRow = new DepartmentReportItemVO();
|
totalRow.setName("合计");
|
totalRow.setData(new ArrayList<>());
|
|
// 计算各类型废物的数量和重量总计
|
for (SysDictDataVO sysDictDataVO : wasteTypeList) {
|
BigDecimal totalTypeCount = BigDecimal.ZERO;
|
BigDecimal totalTypeWeight = BigDecimal.ZERO;
|
|
for (DepartmentReportItemVO item : list) {
|
// 每种废物类型占用两列(数量和重量)
|
int index = wasteTypeList.indexOf(sysDictDataVO);
|
int countIndex = index * 2;
|
int weightIndex = countIndex + 1;
|
|
if (countIndex < item.getData().size()) {
|
totalTypeCount = totalTypeCount.add(item.getData().get(countIndex));
|
}
|
if (weightIndex < item.getData().size()) {
|
totalTypeWeight = totalTypeWeight.add(item.getData().get(weightIndex));
|
}
|
}
|
|
totalRow.getData().add(totalTypeCount);
|
totalRow.getData().add(totalTypeWeight);
|
}
|
|
// 计算总的数量和重量
|
BigDecimal finalTotalCount = BigDecimal.ZERO;
|
BigDecimal finalTotalWeight = BigDecimal.ZERO;
|
|
for (DepartmentReportItemVO item : list) {
|
int totalCountIndex = item.getData().size() - 2;
|
int totalWeightIndex = item.getData().size() - 1;
|
|
if (totalCountIndex >= 0 && totalWeightIndex >= 0) {
|
finalTotalCount = finalTotalCount.add(item.getData().get(totalCountIndex));
|
finalTotalWeight = finalTotalWeight.add(item.getData().get(totalWeightIndex));
|
}
|
}
|
|
totalRow.getData().add(finalTotalCount);
|
totalRow.getData().add(finalTotalWeight);
|
|
// 超时标记处理(如果有)
|
if (query.getDateType().equals(1)) {
|
totalRow.setOverTimeFlag("—"); // 合计行不显示超时标记
|
}
|
|
// 将合计行添加到列表开头
|
list.add(0, totalRow);
|
}
|
vo.setList(list);
|
return vo;
|
}
|
|
/**
|
* 医院报表-导出
|
*
|
* @param query
|
* @return
|
*/
|
public void hospitalReportExport(HospitalReportQuery query) throws IOException {
|
List<List<String>> head = hospitalReportHead();
|
System.out.println(JSONObject.toJSONString(head));
|
// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
|
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
response.setCharacterEncoding("utf-8");
|
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
|
String fileName = URLEncoder.encode("医院报表", "UTF-8").replaceAll("\\+", "%20");
|
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
|
// 这里需要设置不关闭流
|
FastExcel.write(response.getOutputStream())
|
.head(head)
|
.autoCloseStream(Boolean.TRUE)
|
.registerWriteHandler(new AutoColumnWidthStrategy())
|
.sheet("医院报表")
|
.doWrite(getHospitalReportStaticsData(query));
|
}
|
|
/**
|
* 封装Excel导出数据
|
*
|
* @param query
|
* @return
|
*/
|
private List<List<Object>> getHospitalReportStaticsData(HospitalReportQuery query) {
|
DepartmentReportVO vo = hospitalReport(query);
|
if (CollUtils.isNotEmpty(vo.getList())) {
|
List<List<Object>> result = new ArrayList<>();
|
for (DepartmentReportItemVO departmentReportItemVO : vo.getList()) {
|
List<Object> data = new ArrayList<>();
|
data.add(departmentReportItemVO.getName());
|
data.addAll(departmentReportItemVO.getData());
|
if (query.getDateType().equals(1)) {
|
data.add(departmentReportItemVO.getOverTimeFlag());
|
}
|
result.add(data);
|
}
|
return result;
|
}
|
return CollUtils.emptyList();
|
}
|
|
/**
|
* 医院报表表头
|
*
|
* @return
|
*/
|
private List<List<String>> hospitalReportHead() {
|
List<SysDictDataVO> wasteTypeList = sysDictDataService.medicalWasteTypeList();
|
List<List<String>> headTitles = Lists.newArrayList();
|
headTitles.add(Lists.newArrayList("日期", "日期"));
|
wasteTypeList.forEach(item -> {
|
headTitles.add(Lists.newArrayList(item.getDictLabel(), "数量"));
|
headTitles.add(Lists.newArrayList(item.getDictLabel(), "重量(KG)"));
|
});
|
headTitles.add(Lists.newArrayList("小计", "数量"));
|
headTitles.add(Lists.newArrayList("小计", "重量(KG)"));
|
return headTitles;
|
}
|
|
/**
|
* 转移联单
|
*
|
* @param query
|
* @return
|
*/
|
public DepartmentReportVO transformList(TransformQuery query) {
|
DepartmentReportVO vo = new DepartmentReportVO();
|
SysDepartment department = sysDepartmentService.getById(query.getDepartmentId());
|
if (Objects.nonNull(department)) {
|
vo.setDepartmentName(department.getDepartmentName());
|
}
|
SysDepartment region = sysDepartmentService.getDepartmentByParentId(department.getParentId());
|
//List<SysDepartment> hospitalList = sysDepartmentService.lambdaQuery().likeRight(SysDepartment::getTreeCode, region.getTreeCode()).eq(SysDepartment::getOrgType, DepartmentEnum.MEDICAL_INSTITUTION.getCode()).list();
|
List<TransformVO> checkoutRecordVOList = mwCheckoutRecordService.getCheckoutRecordList(query, region.getTreeCode());
|
//查询医废类型
|
List<SysDictDataVO> sysDictDataVOS = sysDictDataService.medicalWasteTypeListByDictCode(query.getWasteTypeCodeList());
|
if (CollUtils.isNotEmpty(sysDictDataVOS)) {
|
vo.setLegend(sysDictDataVOS.stream().map(SysDictDataVO::getDictLabel).collect(Collectors.toList()));
|
vo.getLegend().add("小计");
|
|
List<DepartmentReportItemVO> list = new ArrayList<>();
|
|
// 处理各医院数据
|
for (TransformVO transformVO : checkoutRecordVOList) {
|
BigDecimal totalCount = BigDecimal.ZERO;
|
BigDecimal totalWeight = BigDecimal.ZERO;
|
DepartmentReportItemVO departmentReportItemVO = new DepartmentReportItemVO();
|
departmentReportItemVO.setName(transformVO.getHospitalName());
|
departmentReportItemVO.setData(new ArrayList<>());
|
departmentReportItemVO.setDriverName(transformVO.getDriverName());
|
departmentReportItemVO.setHospitalSignature(ImageToBase64.convertImageToBase64(transformVO.getHospitalSignature()));
|
departmentReportItemVO.setHospitalSignatureUrl(transformVO.getHospitalSignature());
|
departmentReportItemVO.setHandoverTime(transformVO.getCheckoutTime());
|
for (SysDictDataVO sysDictData : sysDictDataVOS) {
|
BigDecimal count = BigDecimal.valueOf(transformVO.getCollectRecordList().stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode())).count());
|
BigDecimal weight = transformVO.getCollectRecordList().stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode())).map(MwMedicalWasteBoxVO::getTotalWeight).reduce(BigDecimal.ZERO, BigDecimal::add);
|
departmentReportItemVO.getData().add(count);
|
departmentReportItemVO.getData().add(weight);
|
totalCount = totalCount.add(count);
|
totalWeight = totalWeight.add(weight);
|
}
|
departmentReportItemVO.getData().add(totalCount);
|
departmentReportItemVO.getData().add(totalWeight);
|
list.add(departmentReportItemVO);
|
}
|
|
// 添加合计行
|
if (!list.isEmpty()) {
|
DepartmentReportItemVO totalRow = new DepartmentReportItemVO();
|
totalRow.setName("合计");
|
totalRow.setData(new ArrayList<>());
|
|
// 计算各类型废物的总数量和总重量
|
for (SysDictDataVO sysDictData : sysDictDataVOS) {
|
BigDecimal totalTypeCount = BigDecimal.ZERO;
|
BigDecimal totalTypeWeight = BigDecimal.ZERO;
|
|
for (DepartmentReportItemVO item : list) {
|
// 获取当前废物类型在数据列表中的索引位置
|
int index = sysDictDataVOS.indexOf(sysDictData);
|
// 每个废物类型占两列(数量和重量)
|
int countIndex = index * 2;
|
int weightIndex = countIndex + 1;
|
|
if (countIndex < item.getData().size()) {
|
totalTypeCount = totalTypeCount.add(item.getData().get(countIndex));
|
}
|
if (weightIndex < item.getData().size()) {
|
totalTypeWeight = totalTypeWeight.add(item.getData().get(weightIndex));
|
}
|
}
|
|
totalRow.getData().add(totalTypeCount);
|
totalRow.getData().add(totalTypeWeight);
|
}
|
|
// 计算总的数量和重量
|
BigDecimal finalTotalCount = BigDecimal.ZERO;
|
BigDecimal finalTotalWeight = BigDecimal.ZERO;
|
|
for (DepartmentReportItemVO item : list) {
|
int totalCountIndex = item.getData().size() - 2;
|
int totalWeightIndex = item.getData().size() - 1;
|
|
if (totalCountIndex >= 0 && totalWeightIndex >= 0) {
|
finalTotalCount = finalTotalCount.add(item.getData().get(totalCountIndex));
|
finalTotalWeight = finalTotalWeight.add(item.getData().get(totalWeightIndex));
|
}
|
}
|
|
totalRow.getData().add(finalTotalCount);
|
totalRow.getData().add(finalTotalWeight);
|
|
// 将合计行添加到列表开头
|
list.add(0, totalRow);
|
}
|
|
vo.setList(list);
|
}
|
return vo;
|
}
|
|
public void transformListExport(TransformQuery query) throws IOException {
|
List<List<String>> head = transformReportHead(query.getWasteTypeCodeList());
|
System.out.println(JSONObject.toJSONString(head));
|
// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
|
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
response.setCharacterEncoding("utf-8");
|
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
|
String fileName = URLEncoder.encode("医院报表", "UTF-8").replaceAll("\\+", "%20");
|
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
|
// 这里需要设置不关闭流
|
FastExcel.write(response.getOutputStream())
|
.head(head)
|
.autoCloseStream(Boolean.TRUE)
|
.registerWriteHandler(new AutoColumnWidthStrategy())
|
.sheet("转运联单")
|
.doWrite(getTransformReportStaticsData(query));
|
}
|
|
/**
|
* 转运联单导出数据
|
*
|
* @param query
|
* @return
|
* @throws MalformedURLException
|
*/
|
private List<List<Object>> getTransformReportStaticsData(TransformQuery query) throws MalformedURLException {
|
DepartmentReportVO vo = transformList(query);
|
List<DepartmentReportItemVO> list = vo.getList();
|
if (CollUtils.isNotEmpty(list)) {
|
List<List<Object>> result = new ArrayList<>();
|
for (DepartmentReportItemVO departmentReportItemVO : list) {
|
List<Object> data = new ArrayList<>();
|
data.add(departmentReportItemVO.getName());
|
data.addAll(departmentReportItemVO.getData());
|
data.add(StringUtils.isNotBlank(departmentReportItemVO.getHospitalSignatureUrl()) ? new URL(departmentReportItemVO.getHospitalSignatureUrl()) : "");
|
data.add(departmentReportItemVO.getDriverName());
|
data.add(departmentReportItemVO.getHandoverTime());
|
result.add(data);
|
}
|
return result;
|
}
|
return CollUtils.emptyList();
|
}
|
|
/**
|
* 转运联单导出表头
|
*
|
* @param wasteTypeCodeList
|
* @return
|
*/
|
private List<List<String>> transformReportHead(List<Long> wasteTypeCodeList) {
|
//查询医废类型
|
List<SysDictDataVO> sysDictDataVOS = sysDictDataService.medicalWasteTypeListByDictCode(wasteTypeCodeList);
|
List<List<String>> headTitles = Lists.newArrayList();
|
headTitles.add(Lists.newArrayList("医院名称", "医院名称"));
|
sysDictDataVOS.forEach(item -> {
|
headTitles.add(Lists.newArrayList(item.getDictLabel(), "数量"));
|
headTitles.add(Lists.newArrayList(item.getDictLabel(), "重量(KG)"));
|
});
|
headTitles.add(Lists.newArrayList("小计", "数量"));
|
headTitles.add(Lists.newArrayList("小计", "重量(KG)"));
|
headTitles.add(Lists.newArrayList("机构人员签字", "机构人员签字"));
|
headTitles.add(Lists.newArrayList("运输人员签字", "运输人员签字"));
|
headTitles.add(Lists.newArrayList("交接时间", "交接时间"));
|
return headTitles;
|
}
|
|
/**
|
* 处置报表
|
*
|
* @param query
|
* @return
|
*/
|
public DepartmentReportVO disposalReport(DisposalReportQuery query) {
|
DepartmentReportVO vo = new DepartmentReportVO();
|
SysDepartment department = sysDepartmentService.getById(query.getDepartmentId());
|
if (Objects.nonNull(department)) {
|
vo.setDepartmentName(department.getDepartmentName());
|
}
|
//已接收
|
List<MwDisposalRecordReportVO> receivedList = mwDisposalRecordService.disposalReceiveReport(query);
|
//已处置
|
List<MwDisposalRecordReportVO> disposaledList = mwDisposalHandleRecordService.disposalReport(query);
|
SimpleDateFormat sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS);
|
switch (query.getDateType()) {
|
case 1:
|
sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD);
|
break;
|
case 2:
|
sdf = new SimpleDateFormat(DateUtils.YYYY_MM);
|
break;
|
case 3:
|
sdf = new SimpleDateFormat(DateUtils.YYYY);
|
break;
|
}
|
List<String> dateList = DateUtils.getDayBetween(query.getStartTime(), query.getEndTime(), query.getDateType());
|
//查询医废类型
|
List<SysDictDataVO> sysDictDataVOS = sysDictDataService.medicalWasteTypeListByDictCode(query.getWasteTypeCodeList());
|
if (CollUtils.isNotEmpty(sysDictDataVOS)) {
|
List<String> legend = sysDictDataVOS.stream().map(SysDictDataVO::getDictLabel).collect(Collectors.toList());
|
vo.setLegend(legend);
|
List<DepartmentReportItemVO> list = new ArrayList<>();
|
for (String date : dateList) {
|
DepartmentReportItemVO departmentReportItemVO = new DepartmentReportItemVO();
|
departmentReportItemVO.setName(date);
|
departmentReportItemVO.setData(new ArrayList<>());
|
SimpleDateFormat finalSdf = sdf;
|
//接收
|
for (SysDictDataVO sysDictData : sysDictDataVOS) {
|
BigDecimal totalWeight = receivedList.stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode()) &&
|
finalSdf.format(item.getReceiveTime()).equals(date)).map(MwDisposalRecordReportVO::getWeight)
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
departmentReportItemVO.getData().add(totalWeight);
|
}
|
//处置
|
for (SysDictDataVO sysDictData : sysDictDataVOS) {
|
BigDecimal totalWeight = disposaledList.stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode()) &&
|
finalSdf.format(item.getDisposalTime()).equals(date)).map(MwDisposalRecordReportVO::getWeight)
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
departmentReportItemVO.getData().add(totalWeight);
|
}
|
list.add(departmentReportItemVO);
|
}
|
|
// 添加合计行
|
if (!list.isEmpty()) {
|
DepartmentReportItemVO totalRow = new DepartmentReportItemVO();
|
totalRow.setName("合计");
|
totalRow.setData(new ArrayList<>());
|
|
// 计算各类型废物的接收总量
|
for (SysDictDataVO sysDictData : sysDictDataVOS) {
|
BigDecimal totalReceiveWeight = BigDecimal.ZERO;
|
|
for (DepartmentReportItemVO item : list) {
|
int index = sysDictDataVOS.indexOf(sysDictData);
|
if (index < item.getData().size()) {
|
totalReceiveWeight = totalReceiveWeight.add(item.getData().get(index));
|
}
|
}
|
|
totalRow.getData().add(totalReceiveWeight);
|
}
|
|
// 计算各类型废物的处置总量
|
for (SysDictDataVO sysDictData : sysDictDataVOS) {
|
BigDecimal totalDisposalWeight = BigDecimal.ZERO;
|
|
for (DepartmentReportItemVO item : list) {
|
int index = sysDictDataVOS.indexOf(sysDictData);
|
// 处置量数据在接收量数据之后,所以索引需要加上sysDictDataVOS的大小
|
int disposalIndex = sysDictDataVOS.size() + index;
|
if (disposalIndex < item.getData().size()) {
|
totalDisposalWeight = totalDisposalWeight.add(item.getData().get(disposalIndex));
|
}
|
}
|
|
totalRow.getData().add(totalDisposalWeight);
|
}
|
|
// 将合计行添加到列表开头
|
list.add(0, totalRow);
|
}
|
|
vo.setList(list);
|
}
|
return vo;
|
}
|
|
/**
|
* 处置报表导出
|
*
|
* @param query
|
* @throws IOException
|
*/
|
public void disposalReportExport(DisposalReportQuery query) throws IOException {
|
List<List<String>> head = disposalReportHead(query.getWasteTypeCodeList());
|
System.out.println(JSONObject.toJSONString(head));
|
// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
|
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
response.setCharacterEncoding("utf-8");
|
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
|
String fileName = URLEncoder.encode("处置报表", "UTF-8").replaceAll("\\+", "%20");
|
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
|
// 这里需要设置不关闭流
|
FastExcel.write(response.getOutputStream())
|
.head(head)
|
.autoCloseStream(Boolean.TRUE)
|
.registerWriteHandler(new AutoColumnWidthStrategy())
|
.sheet("处置报表")
|
.doWrite(getDisposalReportStaticsData(query));
|
}
|
|
/**
|
* 处置报表统计数据
|
*
|
* @param query
|
* @return
|
*/
|
private List<List<Object>> getDisposalReportStaticsData(DisposalReportQuery query) {
|
DepartmentReportVO vo = disposalReport(query);
|
List<DepartmentReportItemVO> list = vo.getList();
|
if (CollUtils.isNotEmpty(list)) {
|
List<List<Object>> result = new ArrayList<>();
|
for (DepartmentReportItemVO departmentReportItemVO : list) {
|
List<Object> data = new ArrayList<>();
|
data.add(departmentReportItemVO.getName());
|
data.addAll(departmentReportItemVO.getData());
|
result.add(data);
|
}
|
return result;
|
}
|
return CollUtils.emptyList();
|
}
|
|
/**
|
* 处置报表表头
|
*
|
* @param wasteTypeCodeList
|
* @return
|
*/
|
private List<List<String>> disposalReportHead(List<Long> wasteTypeCodeList) {
|
//查询医废类型
|
List<SysDictDataVO> sysDictDataVOS = sysDictDataService.medicalWasteTypeListByDictCode(wasteTypeCodeList);
|
List<List<String>> headTitles = Lists.newArrayList();
|
headTitles.add(Lists.newArrayList("日期"));
|
sysDictDataVOS.forEach(item -> {
|
headTitles.add(Lists.newArrayList("医疗废物接收量(kg)", item.getDictLabel()));
|
});
|
sysDictDataVOS.forEach(item -> {
|
headTitles.add(Lists.newArrayList("医疗废物处置量(kg)", item.getDictLabel()));
|
});
|
return headTitles;
|
}
|
|
/**
|
* 监管报表
|
*
|
* @param query
|
* @return
|
*/
|
public DepartmentReportVO regulationReport(DisposalReportQuery query) {
|
DepartmentReportVO vo = new DepartmentReportVO();
|
SysDepartment department = sysDepartmentService.getById(query.getDepartmentId());
|
if (Objects.nonNull(department)) {
|
vo.setDepartmentName(department.getDepartmentName());
|
}
|
//医废产生量
|
List<MwCollectRecordVO> collectRecordList = mwCollectRecordService.getRegulationReportList(query);
|
//医废转移量
|
List<MwCollectRecordVO> checkoutRecordList = mwCheckoutRecordService.getRegulationReportList(query);
|
//医废处置量
|
List<MwCollectRecordVO> disposalRecordList = mwDisposalRecordService.getRegulationReportList(query);
|
List<MwCollectRecordVO> microEquipmentRecordList = mwMicroEquipmentRecordItemService.getRegulationReportList(query);
|
disposalRecordList.addAll(microEquipmentRecordList);
|
SimpleDateFormat sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS);
|
switch (query.getDateType()) {
|
case 1:
|
sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD);
|
break;
|
case 2:
|
sdf = new SimpleDateFormat(DateUtils.YYYY_MM);
|
break;
|
case 3:
|
sdf = new SimpleDateFormat(DateUtils.YYYY);
|
break;
|
}
|
List<String> dateList = DateUtils.getDayBetween(query.getStartTime(), query.getEndTime(), query.getDateType());
|
//查询医废类型
|
List<SysDictDataVO> sysDictDataVOS = sysDictDataService.medicalWasteTypeListByDictCode(query.getWasteTypeCodeList());
|
if (CollUtils.isNotEmpty(sysDictDataVOS)) {
|
vo.setLegend(sysDictDataVOS.stream().map(SysDictDataVO::getDictLabel).collect(Collectors.toList()));
|
vo.setList(new ArrayList<>());
|
List<DepartmentReportItemVO> list = new ArrayList<>();
|
for (String date : dateList) {
|
DepartmentReportItemVO departmentReportItemVO = new DepartmentReportItemVO();
|
departmentReportItemVO.setName(date);
|
departmentReportItemVO.setData(new ArrayList<>());
|
SimpleDateFormat finalSdf = sdf;
|
for (SysDictDataVO sysDictData : sysDictDataVOS) {
|
BigDecimal weight = collectRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode()) &&
|
finalSdf.format(e.getCollectTime()).equals(date)).map(MwCollectRecordVO::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add);
|
departmentReportItemVO.getData().add(weight);
|
|
}
|
for (SysDictDataVO sysDictData : sysDictDataVOS) {
|
BigDecimal weight = checkoutRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode()) &&
|
finalSdf.format(e.getCheckoutTime()).equals(date)).map(MwCollectRecordVO::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add);
|
departmentReportItemVO.getData().add(weight);
|
}
|
for (SysDictDataVO sysDictData : sysDictDataVOS) {
|
BigDecimal weight = disposalRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode()) &&
|
finalSdf.format(e.getCollectTime()).equals(date)).map(MwCollectRecordVO::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add);
|
departmentReportItemVO.getData().add(weight);
|
}
|
list.add(departmentReportItemVO);
|
}
|
|
// 添加合计行
|
if (!list.isEmpty()) {
|
DepartmentReportItemVO totalRow = new DepartmentReportItemVO();
|
totalRow.setName("合计");
|
totalRow.setData(new ArrayList<>());
|
|
// 计算各类型废物的产生总量
|
for (SysDictDataVO sysDictData : sysDictDataVOS) {
|
BigDecimal totalGeneratedWeight = BigDecimal.ZERO;
|
|
for (DepartmentReportItemVO item : list) {
|
int index = sysDictDataVOS.indexOf(sysDictData);
|
if (index < item.getData().size()) {
|
totalGeneratedWeight = totalGeneratedWeight.add(item.getData().get(index));
|
}
|
}
|
|
totalRow.getData().add(totalGeneratedWeight);
|
}
|
|
// 计算各类型废物的转移总量
|
for (SysDictDataVO sysDictData : sysDictDataVOS) {
|
BigDecimal totalTransferWeight = BigDecimal.ZERO;
|
|
for (DepartmentReportItemVO item : list) {
|
int index = sysDictDataVOS.indexOf(sysDictData);
|
// 转移量数据在产生量数据之后,所以索引需要加上wasteTypeList的大小
|
int transferIndex = sysDictDataVOS.size() + index;
|
if (transferIndex < item.getData().size()) {
|
totalTransferWeight = totalTransferWeight.add(item.getData().get(transferIndex));
|
}
|
}
|
|
totalRow.getData().add(totalTransferWeight);
|
}
|
|
// 计算各类型废物的处置总量
|
for (SysDictDataVO sysDictData : sysDictDataVOS) {
|
BigDecimal totalDisposalWeight = BigDecimal.ZERO;
|
|
for (DepartmentReportItemVO item : list) {
|
int index = sysDictDataVOS.indexOf(sysDictData);
|
// 处置量数据在产生量和转移量数据之后,所以索引需要加上wasteTypeList的大小的2倍
|
int disposalIndex = sysDictDataVOS.size() * 2 + index;
|
if (disposalIndex < item.getData().size()) {
|
totalDisposalWeight = totalDisposalWeight.add(item.getData().get(disposalIndex));
|
}
|
}
|
|
totalRow.getData().add(totalDisposalWeight);
|
}
|
|
// 将合计行添加到列表开头
|
list.add(0, totalRow);
|
}
|
|
vo.setList(list);
|
}
|
return vo;
|
}
|
|
public void regulationReportExport(DisposalReportQuery query) throws IOException {
|
List<List<String>> head = regulationReportHead(query.getWasteTypeCodeList());
|
System.out.println(JSONObject.toJSONString(head));
|
// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
|
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
response.setCharacterEncoding("utf-8");
|
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
|
String fileName = URLEncoder.encode("监管报表", "UTF-8").replaceAll("\\+", "%20");
|
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
|
// 这里需要设置不关闭流
|
FastExcel.write(response.getOutputStream())
|
.head(head)
|
.autoCloseStream(Boolean.TRUE)
|
.registerWriteHandler(new AutoColumnWidthStrategy())
|
.sheet("监管报表")
|
.doWrite(getRegulationReportStaticsData(query));
|
}
|
|
/**
|
* 监管报表导出数据
|
*
|
* @param query
|
* @return
|
*/
|
private List<List<Object>> getRegulationReportStaticsData(DisposalReportQuery query) {
|
DepartmentReportVO vo = regulationReport(query);
|
List<DepartmentReportItemVO> list = vo.getList();
|
if (CollUtils.isNotEmpty(list)) {
|
List<List<Object>> result = new ArrayList<>();
|
for (DepartmentReportItemVO departmentReportItemVO : list) {
|
List<Object> data = new ArrayList<>();
|
data.add(departmentReportItemVO.getName());
|
data.addAll(departmentReportItemVO.getData());
|
result.add(data);
|
}
|
return result;
|
}
|
return CollUtils.emptyList();
|
}
|
|
/**
|
* 监管报表表头
|
*
|
* @param wasteTypeCodeList
|
* @return
|
*/
|
private List<List<String>> regulationReportHead(List<Long> wasteTypeCodeList) {
|
//查询医废类型
|
List<SysDictDataVO> sysDictDataVOS = sysDictDataService.medicalWasteTypeListByDictCode(wasteTypeCodeList);
|
List<List<String>> headTitles = Lists.newArrayList();
|
headTitles.add(Lists.newArrayList("日期"));
|
sysDictDataVOS.forEach(item -> {
|
headTitles.add(Lists.newArrayList("医疗废物产生量(kg)", item.getDictLabel()));
|
});
|
sysDictDataVOS.forEach(item -> {
|
headTitles.add(Lists.newArrayList("医疗废物转移量(kg)", item.getDictLabel()));
|
});
|
sysDictDataVOS.forEach(item -> {
|
headTitles.add(Lists.newArrayList("医疗废物处置量(kg)", item.getDictLabel()));
|
});
|
return headTitles;
|
}
|
}
|