package com.gkhy.hazmat.system.service.impl; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.support.ExcelTypeEnum; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.gkhy.hazmat.common.api.CommonPage; import com.gkhy.hazmat.common.config.IdTableNameHandler; import com.gkhy.hazmat.common.domain.entity.SysUser; import com.gkhy.hazmat.common.enums.HazmatPackageEnum; import com.gkhy.hazmat.common.enums.HazmatStatusEnum; import com.gkhy.hazmat.common.enums.UserTypeEnum; import com.gkhy.hazmat.common.excel.HazmatBasicUseExcelData; import com.gkhy.hazmat.common.exception.ApiException; import com.gkhy.hazmat.common.utils.PageUtils; import com.gkhy.hazmat.common.utils.SecurityUtils; import com.gkhy.hazmat.common.utils.StringUtils; import com.gkhy.hazmat.system.domain.*; import com.gkhy.hazmat.system.domain.vo.HzCompanyMessage; import com.gkhy.hazmat.system.domain.vo.HzEntryRecordVO; import com.gkhy.hazmat.system.domain.vo.HzHazmatUseVO; import com.gkhy.hazmat.system.domain.vo.HzHomeDataVO; import com.gkhy.hazmat.system.mapper.*; import com.gkhy.hazmat.system.service.HzStatisticService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.*; import java.util.stream.Collectors; @Service public class HzStatisticServiceImpl implements HzStatisticService { @Autowired private HzEntryRecordMapper entryRecordMapper; @Autowired private HzHazmatMapper hazmatMapper; @Autowired private HzHazmatBasicMapper hazmatBasicMapper; @Autowired private HzWarehouseMapper warehouseMapper; @Autowired private HzWarningMapper warningMapper; @Override public List entryStatic(Long companyId) { SysUser currentUser= SecurityUtils.getLoginUser().getUser(); Date currentDate=new Date(); DateTime endTime = DateUtil.endOfDay(currentDate); DateTime startTime = DateUtil.beginOfDay(DateUtil.offsetDay(currentDate, -29)); String startDate= DateUtil.format(startTime, DatePattern.NORM_DATETIME_FORMAT); String endDate=DateUtil.format(endTime,DatePattern.NORM_DATETIME_FORMAT); List dayEntryRecordList=new ArrayList<>(); while (DateUtil.compare(startTime,endTime)<0){ String day=String.valueOf(DateUtil.dayOfMonth(startTime)); HzEntryRecordVO entryRecordVO=new HzEntryRecordVO(); entryRecordVO.setCount(0); entryRecordVO.setDay(day); entryRecordVO.setMonth(String.valueOf(DateUtil.month(startTime)+1)); dayEntryRecordList.add(entryRecordVO); startTime=DateUtil.offsetDay(startTime,1); } //todo List entryRecordVOList= entryRecordMapper.entryCountStatic(startDate, endDate,currentUser.getUserType().equals(UserTypeEnum.CHECK_USER.getCode()) ? companyId:currentUser.getCompanyId()); if(!entryRecordVOList.isEmpty()) { Map resMap = entryRecordVOList.stream().collect(Collectors.toMap(item -> item.getMonth()+"_"+item.getDay(), item -> item)); for (HzEntryRecordVO er : dayEntryRecordList) { HzEntryRecordVO entryRecordVO= resMap.get(er.getMonth()+"_"+er.getDay()); if (entryRecordVO == null) { continue; } er.setCount(entryRecordVO.getCount()); } } return dayEntryRecordList; } @Override public List useEverydayStatic(Long companyId) { SysUser currentUser= SecurityUtils.getLoginUser().getUser(); checkUserAllowed(currentUser); Date currentDate=new Date(); DateTime endTime = DateUtil.endOfDay(currentDate); DateTime startTime = DateUtil.beginOfDay(DateUtil.offsetDay(currentDate, -6)); String startDate= DateUtil.format(startTime, DatePattern.NORM_DATETIME_FORMAT); String endDate=DateUtil.format(endTime,DatePattern.NORM_DATETIME_FORMAT); List dayEntryRecordList=new ArrayList<>(); while (DateUtil.compare(startTime,endTime)<0){ String day=String.valueOf(DateUtil.dayOfMonth(startTime)); HzEntryRecordVO entryRecordVO=new HzEntryRecordVO(); entryRecordVO.setCount(0); entryRecordVO.setDay(day); dayEntryRecordList.add(entryRecordVO); startTime=DateUtil.offsetDay(startTime,1); } if (currentUser.getUserType().equals(UserTypeEnum.CHECK_USER.getCode())){ IdTableNameHandler.setCurrentId(companyId); }else { //设置分表id //todo IdTableNameHandler.setCurrentId(currentUser.getCompanyId()); } List entryRecordVOList= hazmatMapper.useCountEverydayStatic(startDate, endDate,currentUser.getUserType().equals(UserTypeEnum.CHECK_USER.getCode()) ? companyId:currentUser.getCompanyId()); IdTableNameHandler.removeCurrentId(); if(!entryRecordVOList.isEmpty()) { Map resMap = entryRecordVOList.stream().collect(Collectors.toMap(item -> item.getDay(), item -> item)); for (HzEntryRecordVO er : dayEntryRecordList) { if (resMap.get(er.getDay()) == null) { continue; } er.setCount(resMap.get(er.getDay()).getCount()); } } return dayEntryRecordList; } @Override public List maxUseStatic(Long companyId) { SysUser currentUser= SecurityUtils.getLoginUser().getUser(); checkUserAllowed(currentUser); Date currentDate=new Date(); DateTime endTime = DateUtil.endOfDay(currentDate); DateTime startTime = DateUtil.beginOfDay(DateUtil.offsetDay(currentDate, -6)); String startDate= DateUtil.format(startTime, DatePattern.NORM_DATETIME_FORMAT); String endDate=DateUtil.format(endTime,DatePattern.NORM_DATETIME_FORMAT); if (currentUser.getUserType().equals(UserTypeEnum.CHECK_USER.getCode())){ IdTableNameHandler.setCurrentId(companyId); }else { //设置分表id //todo IdTableNameHandler.setCurrentId(currentUser.getCompanyId()); } List hazmatUseVOList= hazmatMapper.maxUseCountStatic(startDate, endDate,currentUser.getUserType().equals(UserTypeEnum.CHECK_USER.getCode()) ? companyId:currentUser.getCompanyId()); IdTableNameHandler.removeCurrentId(); if(!hazmatUseVOList.isEmpty()) { List basicIds = hazmatUseVOList.stream().map(HzHazmatUseVO::getBasicId).collect(Collectors.toList()); List hzHazmatBasicList = hazmatBasicMapper.selectHazmatBasicListByIds(basicIds); Map hazmatBasicMap = hzHazmatBasicList.stream().collect(Collectors.toMap(HzHazmatBasic::getId, item -> item)); for (HzHazmatUseVO hu : hazmatUseVOList) { HzHazmatBasic hazmatBasic = hazmatBasicMap.get(hu.getBasicId()); if (hazmatBasic != null) { hu.setName(hazmatBasic.getName()); } } } return hazmatUseVOList; } @Override public HzHomeDataVO homeDataStatistic(Long companyid) { SysUser currentUser=SecurityUtils.getLoginUser().getUser(); checkUserAllowed(currentUser); Long companyId= null; if (currentUser.getUserType().equals(UserTypeEnum.CHECK_USER.getCode())){ companyId = companyid; }else { companyId = currentUser.getCompanyId(); } Integer warehouseCount= Math.toIntExact(warehouseMapper.selectCount(Wrappers.lambdaQuery() .eq(true, HzWarehouse::getDelFlag, 0) .eq(companyId!=null,HzWarehouse::getCompanyId,companyId))); List stateList=new ArrayList<>(); stateList.add(HazmatStatusEnum.USED.getCode()); stateList.add(HazmatStatusEnum.DISCARD.getCode()); //设置分表id //todo IdTableNameHandler.setCurrentId(companyId); Integer hazmatCount= Math.toIntExact(hazmatMapper.selectCount(Wrappers.lambdaQuery() .notIn(true, HzHazmat::getState, stateList) .eq(companyId!=null,HzHazmat::getCompanyId,companyId))); Integer usedCount= Math.toIntExact(hazmatMapper.selectCount(Wrappers.lambdaQuery() .eq(true, HzHazmat::getState, HazmatStatusEnum.USED.getCode()) .eq(companyId!=null,HzHazmat::getCompanyId,companyId))); IdTableNameHandler.removeCurrentId(); Integer warningCount= Math.toIntExact(warningMapper.selectCount(Wrappers.lambdaQuery() .eq(true, HzWarning::getState,0) .eq(companyId!=null,HzWarning::getCompanyId,companyId))); HzHomeDataVO homeDataVO=new HzHomeDataVO(); homeDataVO.setWarehouseCount(warehouseCount); homeDataVO.setHazmatCount(hazmatCount); homeDataVO.setUsedCount(usedCount); homeDataVO.setWarningCount(warningCount); return homeDataVO; } @Override public CommonPage useStatic(String startTime, String endTime,Long companyId) { SysUser currentUser= SecurityUtils.getLoginUser().getUser(); checkUserAllowed(currentUser); String startDate=""; String endDate=""; if(StringUtils.isBlank(startTime)&&StringUtils.isBlank(endTime)){ Date currentDate=new Date(); startDate= DateUtil.format(DateUtil.beginOfDay(DateUtil.offsetDay(DateUtil.endOfDay(currentDate), -6)), DatePattern.NORM_DATETIME_FORMAT); endDate=DateUtil.format(DateUtil.endOfDay(currentDate),DatePattern.NORM_DATETIME_FORMAT); } else if (StringUtils.isBlank(startTime)&&StringUtils.isNotBlank(endTime)) { startDate= DateUtil.format(DateUtil.beginOfDay(DateUtil.offsetDay(DateUtil.endOfDay(new Date(endTime)), -6)), DatePattern.NORM_DATETIME_FORMAT); endDate=endTime; }else if (StringUtils.isNotBlank(startTime)&&StringUtils.isBlank(endTime)){ startDate=startTime; endDate=DateUtil.format(DateUtil.beginOfDay(DateUtil.offsetDay(DateUtil.endOfDay(new Date(endTime)), 6)), DatePattern.NORM_DATETIME_FORMAT); }else{ startDate=startTime; endDate=endTime; if(DateUtil.between(DateUtil.parse(startDate),DateUtil.parse(startTime), DateUnit.DAY)>90){ throw new ApiException("只能查询90天以内数据"); } } if (currentUser.getUserType().equals(UserTypeEnum.CHECK_USER.getCode())){ IdTableNameHandler.setCurrentId(companyId); }else { //设置分表id //todo IdTableNameHandler.setCurrentId(currentUser.getCompanyId()); } PageUtils.startPage(); List hazmatUseVOList= hazmatMapper.useCountStatic(startDate, endDate,currentUser.getUserType().equals(UserTypeEnum.CHECK_USER.getCode()) ? companyId:currentUser.getCompanyId()); IdTableNameHandler.removeCurrentId(); if(!hazmatUseVOList.isEmpty()) { List basicIds = hazmatUseVOList.stream().map(HzHazmatUseVO::getBasicId).collect(Collectors.toList()); List hzHazmatBasicList = hazmatBasicMapper.selectHazmatBasicListByIds(basicIds); Map hazmatBasicMap = hzHazmatBasicList.stream().collect(Collectors.toMap(HzHazmatBasic::getId, item -> item)); for (HzHazmatUseVO hu : hazmatUseVOList) { HzHazmatBasic hazmatBasic = hazmatBasicMap.get(hu.getBasicId()); if (hazmatBasic != null) { hu.setName(hazmatBasic.getName()); hu.setHazmatBasic(hazmatBasic); } } } return CommonPage.restPage(hazmatUseVOList); } @Override public void importBaiscUse(HttpServletResponse response, String startTime, String endTime) throws IOException { SysUser currentUser= SecurityUtils.getLoginUser().getUser(); checkUserAllowed(currentUser); OutputStream outputStream = response.getOutputStream(); try { String startDate=""; String endDate=""; if(StringUtils.isBlank(startTime)&&StringUtils.isBlank(endTime)){ Date currentDate=new Date(); startDate= DateUtil.format(DateUtil.beginOfDay(DateUtil.offsetDay(DateUtil.endOfDay(currentDate), -29)), DatePattern.NORM_DATETIME_FORMAT); endDate=DateUtil.format(DateUtil.endOfDay(currentDate),DatePattern.NORM_DATETIME_FORMAT); } else if (StringUtils.isBlank(startTime)&&StringUtils.isNotBlank(endTime)) { startDate= DateUtil.format(DateUtil.beginOfDay(DateUtil.offsetDay(DateUtil.endOfDay(new Date(endTime)), -29)), DatePattern.NORM_DATETIME_FORMAT); endDate=endTime; }else if (StringUtils.isNotBlank(startTime)&&StringUtils.isBlank(endTime)){ startDate=startTime; endDate=DateUtil.format(DateUtil.beginOfDay(DateUtil.offsetDay(DateUtil.endOfDay(new Date(endTime)), 29)), DatePattern.NORM_DATETIME_FORMAT); }else{ startDate=startTime; endDate=endTime; if(DateUtil.between(DateUtil.parse(startDate),DateUtil.parse(startTime), DateUnit.DAY)>90){ throw new ApiException("只能查询90天以内数据"); } } //设置分表id IdTableNameHandler.setCurrentId(currentUser.getCompanyId()); // PageUtils.startPage(); List hazmatUseVOList= hazmatMapper.useCountStatic(startDate, endDate,currentUser.getCompanyId()); IdTableNameHandler.removeCurrentId(); List hazmatBasicUseExcelDatas = new ArrayList<>(); if(!hazmatUseVOList.isEmpty()) { List basicIds = hazmatUseVOList.stream().map(HzHazmatUseVO::getBasicId).collect(Collectors.toList()); List hzHazmatBasicList = hazmatBasicMapper.selectHazmatBasicListByIds(basicIds); Map hazmatBasicMap = hzHazmatBasicList.stream().collect(Collectors.toMap(HzHazmatBasic::getId, item -> item)); Integer index=1; for (HzHazmatUseVO hu : hazmatUseVOList) { HazmatBasicUseExcelData hazmatBasicUseExcelData = new HazmatBasicUseExcelData(); hazmatBasicUseExcelData.setCount(hu.getCount()); HzHazmatBasic hazmatBasic = hazmatBasicMap.get(hu.getBasicId()); if (hazmatBasic != null) { BeanUtils.copyProperties(hazmatBasic,hazmatBasicUseExcelData); hazmatBasicUseExcelData.setIndex(index); hazmatBasicUseExcelData.setProductType(hazmatBasic.getHazmatType()); hazmatBasicUseExcelData.setProductCharacter(hazmatBasic.getHazmatCharacter()); hazmatBasicUseExcelData.setProductFormat(hazmatBasic.getHazmatFormat()); hazmatBasicUseExcelData.setMinPackage(HazmatPackageEnum.getInfoByCode(hazmatBasic.getMinPackage())); } index++; hazmatBasicUseExcelDatas.add(hazmatBasicUseExcelData); } } Date date = new Date(); long time = date.getTime(); String fileName = "危化品用量统计_"+time; this.setExcelResponseProp(response,fileName); //使用 EasyExcel 导出数据 EasyExcel.write(response.getOutputStream(), HazmatBasicUseExcelData.class) .excelType(ExcelTypeEnum.XLSX) .sheet("危化品使用记录统计表") // 设置 Sheet 名称 .doWrite(hazmatBasicUseExcelDatas); // 写入数据 } catch (IOException e) { throw new RuntimeException(e); } } @Override public List dayUseStatistic(Long companyId) { SysUser currentUser = SecurityUtils.getLoginUser().getUser(); checkUserAllowed(currentUser); Date currentDate = new Date(); // 设置当天的8点作为开始时间,20点作为结束时间 DateTime beginOfDay = DateUtil.beginOfDay(currentDate); // 当天零点 // 从零点偏移8小时得到8点,偏移20小时得到20点 DateTime startTime = DateUtil.offsetHour(beginOfDay, 8); // 08:00:00 DateTime endTime = DateUtil.offsetHour(beginOfDay, 21); // 20:00:00 String startDate = DateUtil.format(startTime, DatePattern.NORM_DATETIME_FORMAT); String endDate = DateUtil.format(endTime, DatePattern.NORM_DATETIME_FORMAT); // 设置分表ID逻辑 if (currentUser.getUserType().equals(UserTypeEnum.CHECK_USER.getCode())) { IdTableNameHandler.setCurrentId(companyId); } else { IdTableNameHandler.setCurrentId(currentUser.getCompanyId()); } // 生成每小时的统计列表,初始count为0 List hourEntryList = new ArrayList<>(); DateTime currentHour = startTime; Integer i = hazmatMapper.countTotal(currentUser.getUserType().equals(UserTypeEnum.CHECK_USER.getCode()) ? companyId:currentUser.getCompanyId()); while (currentHour.isBefore(endTime)) { // 从8点开始到20点前,共12个小时 String hour = DateUtil.format(currentHour, "HH"); // 两位小时格式,如08,09,...,19 HzEntryRecordVO entryRecordVO = new HzEntryRecordVO(); entryRecordVO.setHour(hour); entryRecordVO.setCount(0); entryRecordVO.setTotalCount(i); hourEntryList.add(entryRecordVO); currentHour = DateUtil.offsetHour(currentHour, 1); // 增加一小时 } // 查询数据库,按小时统计使用量 List entryRecordVOList = hazmatMapper.useCountHourlyStatic(startDate, endDate, currentUser.getUserType().equals(UserTypeEnum.CHECK_USER.getCode()) ? companyId:currentUser.getCompanyId() ); hourEntryList.get(0).setTotalCount(i); IdTableNameHandler.removeCurrentId(); // 将查询结果合并到初始化的每小时列表中 if (!entryRecordVOList.isEmpty()) { Map resMap = entryRecordVOList.stream() .collect(Collectors.toMap(HzEntryRecordVO::getHour, item -> item)); for (HzEntryRecordVO hourEntry : hourEntryList) { HzEntryRecordVO matched = resMap.get(hourEntry.getHour()); if (matched != null) { hourEntry.setCount(matched.getCount()); } } } return hourEntryList; } @Override public List companyMessage(Long type) { return hazmatMapper.companyMessage(type); } private void setExcelResponseProp(HttpServletResponse response, String rawFileName) throws UnsupportedEncodingException { //设置内容类型 response.setContentType("application/vnd.vnd.ms-excel"); //设置编码格式 response.setCharacterEncoding("utf-8"); //设置导出文件名称(避免乱码) String fileName = URLEncoder.encode(rawFileName.concat(".xlsx"), "UTF-8"); // 设置响应头 response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName); } public void checkUserAllowed(SysUser user) { if (user.getUserType().equals(UserTypeEnum.SYSTEM_USER.getCode())) { throw new ApiException("管理员不能操作"); } } }