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.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() { 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); } List entryRecordVOList= entryRecordMapper.entryCountStatic(startDate, endDate,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() { 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); } //设置分表id IdTableNameHandler.setCurrentId(currentUser.getCompanyId()); List entryRecordVOList= hazmatMapper.useCountEverydayStatic(startDate, endDate,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() { 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); //设置分表id IdTableNameHandler.setCurrentId(currentUser.getCompanyId()); List hazmatUseVOList= hazmatMapper.maxUseCountStatic(startDate, endDate,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() { SysUser currentUser=SecurityUtils.getLoginUser().getUser(); checkUserAllowed(currentUser); Long 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 IdTableNameHandler.setCurrentId(currentUser.getCompanyId()); 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) { 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天以内数据"); } } //设置分表id IdTableNameHandler.setCurrentId(currentUser.getCompanyId()); PageUtils.startPage(); List hazmatUseVOList= hazmatMapper.useCountStatic(startDate, endDate,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); } } 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("管理员不能操作"); } } }