| package com.doumee.service.business.impl; | 
|   | 
| import com.doumee.core.annotation.excel.ExcelExporter; | 
| import com.doumee.core.constants.ResponseStatus; | 
| import com.doumee.core.exception.BusinessException; | 
| import com.doumee.core.utils.Constants; | 
| import com.doumee.core.utils.DateUtil; | 
| import com.doumee.core.utils.Utils; | 
| import com.doumee.dao.business.CategoryMapper; | 
| import com.doumee.dao.business.InoutRecordMapper; | 
| import com.doumee.dao.business.dto.InParkDataDTO; | 
| import com.doumee.dao.business.model.Category; | 
| import com.doumee.dao.business.model.InoutRecord; | 
| import com.doumee.dao.business.model.Member; | 
| import com.doumee.dao.business.vo.GeneralDataVO; | 
| import com.doumee.dao.business.vo.InParkUserDataVO; | 
| import com.doumee.service.business.InoutRecordService; | 
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
| import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; | 
| import com.baomidou.mybatisplus.core.metadata.IPage; | 
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
| import com.doumee.service.business.third.model.PageData; | 
| import com.doumee.service.business.third.model.PageWrap; | 
| import com.github.yulichang.wrapper.MPJLambdaWrapper; | 
| import io.swagger.annotations.ApiModelProperty; | 
| import io.swagger.models.auth.In; | 
| import org.apache.commons.lang.StringUtils; | 
| import org.checkerframework.checker.units.qual.C; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.stereotype.Service; | 
| import org.springframework.util.CollectionUtils; | 
|   | 
| import javax.servlet.http.HttpServletResponse; | 
| import java.io.IOException; | 
| import java.math.BigDecimal; | 
| import java.net.URLEncoder; | 
| import java.nio.charset.Charset; | 
| import java.text.DecimalFormat; | 
| import java.time.*; | 
| import java.time.format.DateTimeFormatter; | 
| import java.time.temporal.TemporalAdjusters; | 
| import java.util.*; | 
| import java.util.stream.Collectors; | 
|   | 
| /** | 
|  * 出入场人次车次每日统计表Service实现 | 
|  * @author 江蹄蹄 | 
|  * @date 2025/04/28 16:19 | 
|  */ | 
| @Service | 
| public class InoutRecordServiceImpl implements InoutRecordService { | 
|   | 
|     @Autowired | 
|     private InoutRecordMapper inoutRecordMapper; | 
|   | 
|     @Autowired | 
|     private CategoryMapper categoryMapper; | 
|   | 
|     @Override | 
|     public Integer create(InoutRecord inoutRecord) { | 
|         inoutRecordMapper.insert(inoutRecord); | 
|         return inoutRecord.getId(); | 
|     } | 
|   | 
|     @Override | 
|     public void deleteById(Integer id) { | 
|         inoutRecordMapper.deleteById(id); | 
|     } | 
|   | 
|     @Override | 
|     public void delete(InoutRecord inoutRecord) { | 
|         UpdateWrapper<InoutRecord> deleteWrapper = new UpdateWrapper<>(inoutRecord); | 
|         inoutRecordMapper.delete(deleteWrapper); | 
|     } | 
|   | 
|     @Override | 
|     public void deleteByIdInBatch(List<Integer> ids) { | 
|         if (CollectionUtils.isEmpty(ids)) { | 
|             return; | 
|         } | 
|         inoutRecordMapper.deleteBatchIds(ids); | 
|     } | 
|   | 
|     @Override | 
|     public void updateById(InoutRecord inoutRecord) { | 
|         inoutRecordMapper.updateById(inoutRecord); | 
|     } | 
|   | 
|     @Override | 
|     public void updateByIdInBatch(List<InoutRecord> inoutRecords) { | 
|         if (CollectionUtils.isEmpty(inoutRecords)) { | 
|             return; | 
|         } | 
|         for (InoutRecord inoutRecord: inoutRecords) { | 
|             this.updateById(inoutRecord); | 
|         } | 
|     } | 
|   | 
|     @Override | 
|     public InoutRecord findById(Integer id) { | 
|         return inoutRecordMapper.selectById(id); | 
|     } | 
|   | 
|     @Override | 
|     public InoutRecord findOne(InoutRecord inoutRecord) { | 
|         QueryWrapper<InoutRecord> wrapper = new QueryWrapper<>(inoutRecord); | 
|         return inoutRecordMapper.selectOne(wrapper); | 
|     } | 
|   | 
|     @Override | 
|     public List<InoutRecord> findList(InoutRecord inoutRecord) { | 
|         QueryWrapper<InoutRecord> wrapper = new QueryWrapper<>(inoutRecord); | 
|         return inoutRecordMapper.selectList(wrapper); | 
|     } | 
|    | 
|     @Override | 
|     public PageData<InoutRecord> findPage(PageWrap<InoutRecord> pageWrap) { | 
|         IPage<InoutRecord> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); | 
|         MPJLambdaWrapper<InoutRecord> queryWrapper = new MPJLambdaWrapper<>(); | 
|         Utils.MP.blankToNull(pageWrap.getModel()); | 
|         InoutRecord model = pageWrap.getModel(); | 
|         queryWrapper.selectAll(InoutRecord.class) | 
|                 .eq(InoutRecord::getIsdeleted,Constants.ZERO) | 
| //                .eq(Objects.nonNull(model.getType()),InoutRecord::getType, model.getType()) | 
|                 .isNotNull(Objects.nonNull(model.getType())&&Constants.equalsInteger(model.getType(),Constants.ZERO),InoutRecord::getCarCode) | 
|                 .isNotNull(Objects.nonNull(model.getType())&&Constants.equalsInteger(model.getType(),Constants.ONE),InoutRecord::getMemberPhone) | 
|                 .eq(Objects.nonNull(model.getInOrOut()),InoutRecord::getInOrOut, model.getInOrOut()) | 
|                 .eq(Objects.nonNull(model.getObjType()),InoutRecord::getObjType, model.getObjType()) | 
|                 .eq(Objects.nonNull(model.getCarBizType()),InoutRecord::getCarBizType, model.getCarBizType()) | 
|                 .eq(Objects.nonNull(model.getMemberType()),InoutRecord::getMemberType, model.getMemberType()) | 
|                 .ge(Objects.nonNull(model.getStartDate()),InoutRecord::getCreateDate, Utils.Date.getStart(model.getStartDate())) | 
|                 .le(Objects.nonNull(model.getEndDate()),InoutRecord::getCreateDate, Utils.Date.getEnd(model.getEndDate())) | 
|                 .and(StringUtils.isNotBlank(model.getCategoryName()),i->i.like(InoutRecord::getCategoryName,model.getCategoryName()).or().like(InoutRecord::getCategoryParentName,model.getCategoryName())) | 
|                 .and(StringUtils.isNotBlank(model.getMemberName()),i->i.like(InoutRecord::getMemberName,model.getMemberName()).or().like(InoutRecord::getMemberPhone,model.getMemberName())) | 
|                 .and(StringUtils.isNotBlank(model.getCarCode()),i->i.like(InoutRecord::getCarCode,model.getCarCode()).or().like(InoutRecord::getRemark,model.getCarCode())) | 
|                 .like(StringUtils.isNotBlank(model.getCompanyName()),InoutRecord::getCompanyName,model.getCompanyName()) | 
|                 .like(StringUtils.isNotBlank(model.getDeviceName()),InoutRecord::getDeviceName,model.getDeviceName()) | 
|                 .orderByDesc(InoutRecord::getId) | 
|         ; | 
|         for(PageWrap.SortData sortData: pageWrap.getSorts()) { | 
|             if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { | 
|                 queryWrapper.orderByDesc(sortData.getProperty()); | 
|             } else { | 
|                 queryWrapper.orderByAsc(sortData.getProperty()); | 
|             } | 
|         } | 
|         return PageData.from(inoutRecordMapper.selectPage(page, queryWrapper)); | 
|     } | 
|   | 
|     @Override | 
|     public long count(InoutRecord inoutRecord) { | 
|         QueryWrapper<InoutRecord> wrapper = new QueryWrapper<>(inoutRecord); | 
|         return inoutRecordMapper.selectCount(wrapper); | 
|     } | 
|   | 
|   | 
|     //人员分类  单独处理人员数据  0劳务访客 1普通访客 2内部员工 3车辆信息 4相关方人员 5货运司机 | 
|     private static String[] userTypeList = new String[]{"","普通访客","内部人员","","相关方人员","货运司机"}; | 
|   | 
|   | 
|     /** | 
|      *  查询基础数据 | 
|      * @return | 
|      */ | 
|     @Override | 
|     public InParkUserDataVO getInParkUserData(InParkDataDTO inParkDataDTO){ | 
|         if(Objects.isNull(inParkDataDTO) | 
|         || Objects.isNull(inParkDataDTO.getType()) | 
|         || Objects.isNull(inParkDataDTO.getIsGroupBy()) | 
|         || (Objects.nonNull(inParkDataDTO.getType())&& !(Constants.equalsInteger(inParkDataDTO.getType(),Constants.ZERO) || Constants.equalsInteger(inParkDataDTO.getType(),Constants.ONE) )) | 
|         || (Objects.nonNull(inParkDataDTO.getIsGroupBy())&& !(Constants.equalsInteger(inParkDataDTO.getIsGroupBy(),Constants.ZERO) || Constants.equalsInteger(inParkDataDTO.getIsGroupBy(),Constants.ONE) )) | 
|         ){ | 
|             throw new BusinessException(ResponseStatus.BAD_REQUEST); | 
|         } | 
|         //查询本周的开始日期和结束日期 | 
|         Long weekStart = LocalDate.now().with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).atStartOfDay(ZoneOffset.UTC).toInstant().toEpochMilli(); | 
|         InParkUserDataVO inParkUserDataVO = new InParkUserDataVO(); | 
|         List<InoutRecord> yearList = inoutRecordMapper.selectJoinList(InoutRecord.class,new MPJLambdaWrapper<InoutRecord>() | 
|                 .selectAll(InoutRecord.class) | 
|                 .eq(InoutRecord::getIsdeleted,Constants.ZERO) | 
|                 .eq(InoutRecord::getInOrOut,Constants.ZERO) | 
|                 .isNotNull(Constants.equalsInteger(inParkDataDTO.getType(),Constants.ZERO),InoutRecord::getCarCode) | 
|                 .isNotNull(Constants.equalsInteger(inParkDataDTO.getType(),Constants.ONE),InoutRecord::getMemberPhone) | 
|                 .apply(" ( DATE_FORMAT(CREATE_DATE, '%Y') = DATE_FORMAT(now(), '%Y') ) ") | 
|                 .orderByAsc(Constants.equalsInteger(inParkDataDTO.getType(),Constants.ZERO),InoutRecord::getCarBizType) | 
|                 .orderByAsc(Constants.equalsInteger(inParkDataDTO.getType(),Constants.ONE),InoutRecord::getMemberType) | 
|         ); | 
|         List<InoutRecord> monthList = yearList.stream().filter(i->DateUtil.formatDate(i.getCreateDate(),"yyyy-MM").equals(DateUtil.formatDate(new Date(),"yyyy-MM"))).collect(Collectors.toList()); | 
|         List<InoutRecord> weekList = yearList.stream().filter(i->i.getCreateDate().getTime()>=weekStart).collect(Collectors.toList()); | 
|         List<InoutRecord> todayList = weekList.stream().filter(i-> DateUtil.formatDate(i.getCreateDate(),"yyyy-MM-dd").equals(DateUtil.formatDate(new Date(),"yyyy-MM-dd"))).collect(Collectors.toList()); | 
|         List<InoutRecord> yesterdayList = yearList.stream().filter(i-> DateUtil.formatDate(i.getCreateDate(),"yyyy-MM-dd").equals(DateUtil.getBeforDay(new Date(),1))).collect(Collectors.toList()); | 
|   | 
|         if(Constants.equalsInteger(inParkDataDTO.getIsGroupBy(),Constants.ZERO)){ | 
|             inParkUserDataVO.setYearTotal(yearList.size()); | 
|             inParkUserDataVO.setMonthTotal(monthList.size()); | 
|             inParkUserDataVO.setTodayTotal(todayList.size()); | 
|             inParkUserDataVO.setWeekTotal(weekList.size()); | 
|             inParkUserDataVO.setYesterdayTotal(yesterdayList.size()); | 
|         }else{ | 
|             yearList = this.getListByType(yearList,inParkDataDTO.getType()); | 
|             monthList = this.getListByType(monthList,inParkDataDTO.getType()); | 
|             weekList = this.getListByType(weekList,inParkDataDTO.getType()); | 
|             todayList = this.getListByType(todayList,inParkDataDTO.getType()); | 
|             yesterdayList = this.getListByType(yesterdayList,inParkDataDTO.getType()); | 
|             inParkUserDataVO.setYearTotal(yearList.size()); | 
|             inParkUserDataVO.setMonthTotal(monthList.size()); | 
|             inParkUserDataVO.setTodayTotal(todayList.size()); | 
|             inParkUserDataVO.setWeekTotal(weekList.size()); | 
|             inParkUserDataVO.setYesterdayTotal(yesterdayList.size()); | 
|         } | 
|         //处理年度折线图数据 | 
|         List<GeneralDataVO> cumulativeDataList = new ArrayList<>(); | 
|         for (int i = 1; i <=12 ; i++) { | 
|             GeneralDataVO generalDataVO = new GeneralDataVO(); | 
|             generalDataVO.setName(Integer.toString(i)); | 
|             generalDataVO.setTotal(yearList.stream().filter(j->Constants.equalsInteger(Integer.valueOf(generalDataVO.getName()),Integer.valueOf(DateUtil.formatDate(j.getCreateDate(),"MM")))).collect(Collectors.toList()).size()); | 
|             generalDataVO.setName(generalDataVO.getName()+"月"); | 
|             cumulativeDataList.add(generalDataVO); | 
|         } | 
|         inParkUserDataVO.setCumulativeDataList(cumulativeDataList); | 
|         //处理分类数据 | 
|         List<GeneralDataVO> yearSortList = new ArrayList<>(); | 
|         if(Constants.equalsInteger(inParkDataDTO.getType(),Constants.ONE)){ | 
|             for (int i = 0; i < userTypeList.length; i++) { | 
|                 if(StringUtils.isBlank(userTypeList[i])){ | 
|                     continue; | 
|                 } | 
|                 GeneralDataVO generalDataVO = new GeneralDataVO(); | 
|                 generalDataVO.setName(userTypeList[i]); | 
|                 int index = i; | 
|                 generalDataVO.setTotal(yearList.stream().filter(j->Constants.equalsInteger(j.getMemberType(), index)).collect(Collectors.toList()).size()); | 
|                 yearSortList.add(generalDataVO); | 
|             } | 
|         }else{ | 
|             List<String> categoryNameList = yearList.stream().filter(i-> StringUtils.isNotBlank(i.getCategoryName())).map(i->i.getCategoryName()).collect(Collectors.toList()); | 
|             if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categoryNameList)){ | 
|                 Set<String> setList = new HashSet<>(categoryNameList); | 
|                 for (String categoryName:setList) { | 
|                     GeneralDataVO generalDataVO = new GeneralDataVO(); | 
|                     generalDataVO.setName(categoryName); | 
|                     generalDataVO.setTotal(yearList.stream().filter(j->StringUtils.isNotBlank(j.getCategoryName())&&j.getCategoryName().equals(categoryName)).collect(Collectors.toList()).size()); | 
|                     yearSortList.add(generalDataVO); | 
|                 } | 
|             } | 
|         } | 
|         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(yearSortList)){ | 
|             Collections.sort(yearSortList, new Comparator<GeneralDataVO>() { | 
|                 @Override | 
|                 public int compare(GeneralDataVO o1, GeneralDataVO o2) { | 
|                     // 返回值为int类型,大于0表示正序,小于0表示逆序 | 
|                     return o2.getTotal() - o1.getTotal(); | 
|                 } | 
|             }); | 
|             inParkUserDataVO.setYearSortList(yearSortList); | 
|         } | 
|         return inParkUserDataVO; | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 查询占比数据 | 
|      * @return | 
|      */ | 
|     @Override | 
|     public List<GeneralDataVO> getRataList(InParkDataDTO inParkDataDTO){ | 
|         if(Objects.isNull(inParkDataDTO) | 
|             || Objects.isNull(inParkDataDTO.getType()) | 
|             || Objects.isNull(inParkDataDTO.getIsGroupBy()) | 
|             || StringUtils.isBlank(inParkDataDTO.getDateStr()) | 
|             || (Objects.nonNull(inParkDataDTO.getType())&& !(Constants.equalsInteger(inParkDataDTO.getType(),Constants.ZERO) || Constants.equalsInteger(inParkDataDTO.getType(),Constants.ONE) )) | 
|             || (Objects.nonNull(inParkDataDTO.getIsGroupBy())&& !(Constants.equalsInteger(inParkDataDTO.getIsGroupBy(),Constants.ZERO) || Constants.equalsInteger(inParkDataDTO.getIsGroupBy(),Constants.ONE) )) | 
|             || !( Constants.equalsInteger(inParkDataDTO.getDateStr().length(),4) || Constants.equalsInteger(inParkDataDTO.getDateStr().length(),7) ) | 
|         ){ | 
|             throw new BusinessException(ResponseStatus.BAD_REQUEST); | 
|         } | 
|         List<GeneralDataVO> rataList = new ArrayList<>(); | 
|         List<InoutRecord> yearList = inoutRecordMapper.selectJoinList(InoutRecord.class,new MPJLambdaWrapper<InoutRecord>() | 
|                 .selectAll(InoutRecord.class) | 
|                 .eq(InoutRecord::getIsdeleted,Constants.ZERO) | 
|                 .eq(InoutRecord::getInOrOut,Constants.ZERO) | 
|                 .isNotNull(Constants.equalsInteger(inParkDataDTO.getType(),Constants.ZERO),InoutRecord::getCarCode) | 
|                 .isNotNull(Constants.equalsInteger(inParkDataDTO.getType(),Constants.ONE),InoutRecord::getMemberPhone) | 
|                 .apply(Constants.equalsInteger(inParkDataDTO.getDateStr().length(),4)," ( DATE_FORMAT(CREATE_DATE, '%Y') =  '"+inParkDataDTO.getDateStr()+"' ) ") | 
|                 .apply(Constants.equalsInteger(inParkDataDTO.getDateStr().length(),7)," ( DATE_FORMAT(CREATE_DATE, '%Y-%m') =  '"+inParkDataDTO.getDateStr()+"' ) ") | 
|         ); | 
|         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(yearList)){ | 
|             return rataList; | 
|         } | 
|         if(Constants.equalsInteger(inParkDataDTO.getIsGroupBy(),Constants.ONE)){ | 
|             yearList = this.getListByType(yearList,inParkDataDTO.getType()); | 
|         } | 
|   | 
|         if(Constants.equalsInteger(inParkDataDTO.getType(),Constants.ONE)){ | 
|             for (int i = 0; i < userTypeList.length; i++) { | 
|                 if(StringUtils.isBlank(userTypeList[i])){ | 
|                     continue; | 
|                 } | 
|                 GeneralDataVO generalDataVO = new GeneralDataVO(); | 
|                 generalDataVO.setName(userTypeList[i]); | 
|                 int index = i; | 
|                 generalDataVO.setTotal(yearList.stream().filter(j->Constants.equalsInteger(j.getMemberType(), index)).collect(Collectors.toList()).size()); | 
|                 generalDataVO.setRata(new BigDecimal(generalDataVO.getTotal().toString()).divide(new BigDecimal(yearList.size()+""),2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))); | 
|                 rataList.add(generalDataVO); | 
|             } | 
|         }else{ | 
|             List<String> categoryNameList = yearList.stream().filter(i-> StringUtils.isNotBlank(i.getCategoryParentName())) | 
|                     .map(i->i.getCategoryParentName()).collect(Collectors.toList()); | 
|             if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categoryNameList)){ | 
|                 Set<String> setList = new HashSet<>(categoryNameList); | 
|                 for (String categoryName:setList) { | 
|                     GeneralDataVO generalDataVO = new GeneralDataVO(); | 
|                     generalDataVO.setName(categoryName); | 
|                     generalDataVO.setTotal(yearList.stream().filter(j->StringUtils.isNotBlank(j.getCategoryParentName())&&j.getCategoryName().equals(categoryName)).collect(Collectors.toList()).size()); | 
|                     generalDataVO.setRata(new BigDecimal(generalDataVO.getTotal().toString()).divide(new BigDecimal(yearList.size()+""),2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))); | 
|                     rataList.add(generalDataVO); | 
|                 } | 
|             } | 
|         } | 
|         return rataList; | 
|     } | 
|   | 
|     @Override | 
|     public List<List<String>> getReportList(InParkDataDTO inParkDataDTO){ | 
|         if(Objects.isNull(inParkDataDTO) | 
|                 || Objects.isNull(inParkDataDTO.getType()) | 
|                 || Objects.isNull(inParkDataDTO.getIsGroupBy()) | 
|                 || StringUtils.isBlank(inParkDataDTO.getDateStr()) | 
|                 || (Objects.nonNull(inParkDataDTO.getType())&& !(Constants.equalsInteger(inParkDataDTO.getType(),Constants.ZERO) || Constants.equalsInteger(inParkDataDTO.getType(),Constants.ONE) )) | 
|                 || (Objects.nonNull(inParkDataDTO.getIsGroupBy())&& !(Constants.equalsInteger(inParkDataDTO.getIsGroupBy(),Constants.ZERO) || Constants.equalsInteger(inParkDataDTO.getIsGroupBy(),Constants.ONE) )) | 
|                 || !( Constants.equalsInteger(inParkDataDTO.getDateStr().length(),4) || Constants.equalsInteger(inParkDataDTO.getDateStr().length(),7) ) | 
|         ){ | 
|             throw new BusinessException(ResponseStatus.BAD_REQUEST); | 
|         } | 
|         List<InoutRecord> allList = new ArrayList<>(); | 
|         MPJLambdaWrapper mpjLambdaWrapper = new MPJLambdaWrapper<InoutRecord>().eq(InoutRecord::getIsdeleted,Constants.ZERO) | 
|                 .eq(InoutRecord::getInOrOut,Constants.ZERO) | 
|                 .isNotNull(Constants.equalsInteger(inParkDataDTO.getType(),Constants.ZERO),InoutRecord::getCarCode) | 
|                 .isNotNull(Constants.equalsInteger(inParkDataDTO.getType(),Constants.ONE),InoutRecord::getMemberPhone) | 
|                 .apply(Constants.equalsInteger(inParkDataDTO.getDateStr().length(),4)," ( DATE_FORMAT(CREATE_DATE, '%Y') =  '"+inParkDataDTO.getDateStr()+"' ) ") | 
|                 .apply(Constants.equalsInteger(inParkDataDTO.getDateStr().length(),7)," ( DATE_FORMAT(CREATE_DATE, '%Y-%m') =  '"+inParkDataDTO.getDateStr()+"' ) "); | 
|         if(Constants.equalsInteger(inParkDataDTO.getIsGroupBy(),Constants.ONE)){ | 
|              mpjLambdaWrapper.groupBy(Constants.equalsInteger(inParkDataDTO.getDateStr().length(),4)&&Constants.equalsInteger(inParkDataDTO.getType(),Constants.ZERO), | 
|                             "car_code,category_name,DATE_FORMAT(CREATE_DATE, '%Y-%m')") | 
|                     .groupBy(Constants.equalsInteger(inParkDataDTO.getDateStr().length(),7)&&Constants.equalsInteger(inParkDataDTO.getType(),Constants.ZERO), | 
|                             "car_code,category_name,DATE_FORMAT(CREATE_DATE, '%Y-%m-%d')") | 
|                     .groupBy(Constants.equalsInteger(inParkDataDTO.getDateStr().length(),4)&&Constants.equalsInteger(inParkDataDTO.getType(),Constants.ONE), | 
|                             "member_phone,MEMBER_TYPE,DATE_FORMAT(CREATE_DATE, '%Y-%m')") | 
|                     .groupBy(Constants.equalsInteger(inParkDataDTO.getDateStr().length(),7)&&Constants.equalsInteger(inParkDataDTO.getType(),Constants.ONE), | 
|                             "member_phone,MEMBER_TYPE,DATE_FORMAT(CREATE_DATE, '%Y-%m-%d')"); | 
|             if(Constants.equalsInteger(inParkDataDTO.getDateStr().length(),4)&&Constants.equalsInteger(inParkDataDTO.getType(),Constants.ZERO)){ | 
|                 mpjLambdaWrapper.select("car_code,category_name,DATE_FORMAT(CREATE_DATE, '%Y-%m') as createDateStr "); | 
|             }else if(Constants.equalsInteger(inParkDataDTO.getDateStr().length(),7)&&Constants.equalsInteger(inParkDataDTO.getType(),Constants.ZERO)){ | 
|                 mpjLambdaWrapper.select("car_code,category_name,DATE_FORMAT(CREATE_DATE, '%Y-%m-%d') as createDateStr "); | 
|             }else if(Constants.equalsInteger(inParkDataDTO.getDateStr().length(),4)&&Constants.equalsInteger(inParkDataDTO.getType(),Constants.ONE)){ | 
|   | 
|                 mpjLambdaWrapper.select("member_phone,MEMBER_TYPE,DATE_FORMAT(CREATE_DATE, '%Y-%m') as createDateStr"); | 
|             }else{ | 
|                 mpjLambdaWrapper.select("member_phone,MEMBER_TYPE,DATE_FORMAT(CREATE_DATE, '%Y-%m-%d') as createDateStr "); | 
|             } | 
|   | 
|         }else{ | 
|             mpjLambdaWrapper.selectAll(InoutRecord.class); | 
|             if(Constants.equalsInteger(inParkDataDTO.getDateStr().length(),4)&&Constants.equalsInteger(inParkDataDTO.getType(),Constants.ZERO)){ | 
|                 mpjLambdaWrapper.select("DATE_FORMAT(CREATE_DATE, '%Y-%m') as createDateStr "); | 
|             }else if(Constants.equalsInteger(inParkDataDTO.getDateStr().length(),7)&&Constants.equalsInteger(inParkDataDTO.getType(),Constants.ZERO)){ | 
|                 mpjLambdaWrapper.select("DATE_FORMAT(CREATE_DATE, '%Y-%m-%d') as createDateStr "); | 
|             }else if(Constants.equalsInteger(inParkDataDTO.getDateStr().length(),4)&&Constants.equalsInteger(inParkDataDTO.getType(),Constants.ONE)){ | 
|   | 
|                 mpjLambdaWrapper.select("DATE_FORMAT(CREATE_DATE, '%Y-%m') as createDateStr"); | 
|             }else{ | 
|                 mpjLambdaWrapper.select("DATE_FORMAT(CREATE_DATE, '%Y-%m-%d') as createDateStr "); | 
|             } | 
| //           allList = inoutRecordMapper.selectJoinList(InoutRecord.class,new MPJLambdaWrapper<InoutRecord>() | 
| //                    .selectAll(InoutRecord.class) | 
| //                    .eq(InoutRecord::getIsdeleted,Constants.ZERO) | 
| //                    .eq(InoutRecord::getInOrOut,Constants.ZERO) | 
| //                    .isNotNull(Constants.equalsInteger(inParkDataDTO.getType(),Constants.ZERO),InoutRecord::getCarCode) | 
| //                    .isNotNull(Constants.equalsInteger(inParkDataDTO.getType(),Constants.ONE),InoutRecord::getMemberPhone) | 
| //                    .apply(Constants.equalsInteger(inParkDataDTO.getDateStr().length(),4)," ( DATE_FORMAT(CREATE_DATE, '%Y') =  '"+inParkDataDTO.getDateStr()+"' ) ") | 
| //                    .apply(Constants.equalsInteger(inParkDataDTO.getDateStr().length(),7)," ( DATE_FORMAT(CREATE_DATE, '%Y-%m') =  '"+inParkDataDTO.getDateStr()+"' ) ") | 
| //            ); | 
|         } | 
|         allList = inoutRecordMapper.selectJoinList(InoutRecord.class,mpjLambdaWrapper); | 
|   | 
|         List<List<String>>  resultList = new ArrayList<>(); | 
|         if(CollectionUtils.isEmpty(allList)){ | 
|             return resultList; | 
|         } | 
|   | 
|         List<String> dateList = new ArrayList<>(); | 
|         //年份 | 
|         if(Constants.equalsInteger(inParkDataDTO.getDateStr().length(),4)){ | 
|             Integer maxMonth = 12; | 
|             if(Constants.equalsInteger(DateUtil.getNowYearNum(),Integer.valueOf(inParkDataDTO.getDateStr()))){ | 
|                 maxMonth =  DateUtil.getNowMonthNum(); | 
|             } | 
|             for (int i = maxMonth; i >0 ; i--) { | 
|                 dateList.add(DateUtil.getNowYearNum()+"-"+ StringUtils.leftPad(i+"",2,"0")); | 
|             } | 
|         }else { | 
|             //日期 | 
|             Integer year  = Integer.valueOf(inParkDataDTO.getDateStr().substring(0,4)); | 
|             Integer month = Integer.valueOf(inParkDataDTO.getDateStr().substring(5,7)); | 
|             Integer today = DateUtil.getNowDayNum(); | 
|             YearMonth yearMonth = YearMonth.of(year, month); | 
|             // 获取该月的最后一天 | 
|             LocalDate lastDayDate = yearMonth.atEndOfMonth(); | 
|             DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd"); | 
|             Integer lastDay = Integer.valueOf(lastDayDate.format(formatter)); | 
|             if(Constants.equalsInteger(year,DateUtil.getNowYearNum()) && Constants.equalsInteger(month,DateUtil.getNowMonthNum())){ | 
|                 if(today <  lastDay){ | 
|                     lastDay = today; | 
|                 } | 
|             } | 
|             for (int i = lastDay; i > 0 ; i--) { | 
|                 dateList.add(year + "-" + StringUtils.leftPad(month.toString(),2,"0") + "-" + StringUtils.leftPad(Integer.toString(i),2,"0")); | 
|             } | 
|         } | 
|         return this.dealResultData(allList,dateList,inParkDataDTO.getType(),inParkDataDTO.getDateStr()); | 
|     } | 
|   | 
|   | 
|     public List<List<String>> dealResultData(List<InoutRecord> allList,List<String> dataList ,Integer type,String dateStr){ | 
|         List<List<String>>  resultList = new ArrayList<>(); | 
|         List<String> totalString = new ArrayList<>(); | 
|         totalString.add("数据日期"); | 
|         if(Constants.equalsInteger(type,Constants.ZERO)){ | 
|             List<String> categoryNameList = allList.stream().filter(j-> StringUtils.isNotBlank(j.getCategoryName())).map(j->j.getCategoryName()).collect(Collectors.toList()); | 
|             if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(categoryNameList)){ | 
|                 return resultList; | 
|             } | 
|             Set<String> setList = new HashSet<>(categoryNameList); | 
|             for (String categoryName:setList) { | 
|                 totalString.add(categoryName); | 
|             } | 
|             totalString.add("合计"); | 
|             resultList.add(totalString); | 
|             for (String str:dataList) { | 
|                 Integer total = 0; | 
|                 List<String> dataChildList = new ArrayList<>(); | 
|                 dataChildList.add(str); | 
|                 for (String categoryName:setList) { | 
|                     if(Constants.equalsInteger(dateStr.length(),4)){ | 
|                         Integer childNum = allList.stream().filter(i->categoryName.equals(i.getCategoryName()) | 
|                                 && i.getCreateDateStr().equals(str)).collect(Collectors.toList()).size(); | 
|                         dataChildList.add( | 
|                                 Integer.toString(childNum) | 
|                         ); | 
|                         total = total + childNum; | 
|                     }else if(Constants.equalsInteger(dateStr.length(),7)){ | 
|                         Integer childNum = allList.stream().filter(i->categoryName.equals(i.getCategoryName()) | 
|                                 &&i.getCreateDateStr().equals(str)).collect(Collectors.toList()).size(); | 
|                         dataChildList.add( | 
|                                 Integer.toString(childNum) | 
|                         ); | 
|                         total = total + childNum; | 
|                     } | 
|                 } | 
|                 dataChildList.add(Integer.toString(total)); | 
|                 resultList.add(dataChildList); | 
|             } | 
|         }else{ | 
|             for (int j = 0; j < userTypeList.length; j++) { | 
|                 if(StringUtils.isBlank(userTypeList[j])){ | 
|                     continue; | 
|                 } | 
|                 totalString.add(userTypeList[j]); | 
|             } | 
|             totalString.add("合计"); | 
|             resultList.add(totalString); | 
|             for (String str:dataList) { | 
|                 Integer total = 0; | 
|                 List<String> dataChildList = new ArrayList<>(); | 
|                 dataChildList.add(str); | 
|                 for (int i = 0; i < userTypeList.length; i++) { | 
|                     String typeName = userTypeList[i]; | 
|                     if(StringUtils.isBlank(typeName)){ | 
|                         continue; | 
|                     } | 
|                     int finalI = i; | 
|                     if(Constants.equalsInteger(dateStr.length(),4)){ | 
|                         Integer childNum = allList.stream().filter(j->Constants.equalsInteger(j.getMemberType(), finalI) | 
|                                 && j.getCreateDateStr().equals(str)).collect(Collectors.toList()).size(); | 
|                         dataChildList.add( | 
|                                 Integer.toString(childNum) | 
|                         ); | 
|                         total = total + childNum; | 
|                     }else if(Constants.equalsInteger(dateStr.length(),7)){ | 
|                         Integer childNum = allList.stream().filter(j->Constants.equalsInteger(j.getMemberType(), finalI) | 
|                                 &&j.getCreateDateStr().equals(str)).collect(Collectors.toList()).size(); | 
|                         dataChildList.add( | 
|                                 Integer.toString(childNum) | 
|                         ); | 
|                         total = total + childNum; | 
|                     } | 
|                 } | 
|                 dataChildList.add(Integer.toString(total)); | 
|                 resultList.add(dataChildList); | 
|             } | 
|         } | 
|         return resultList; | 
|     } | 
|   | 
|   | 
|     public List<InoutRecord> getListByType(List<InoutRecord> list,Integer type){ | 
|         return Constants.equalsInteger(type,Constants.ONE)?this.getDataByMemberPhoneSize(list):this.getDataByCarCodeSize(list); | 
|     } | 
|   | 
|   | 
|     public List<InoutRecord> getDataByMemberPhoneSize(List<InoutRecord> list){ | 
|         Map<String, InoutRecord> uniqueByMemberPhone = list.stream() | 
|                 .collect(Collectors.toMap( | 
|                         InoutRecord::getMemberPhone, | 
|                         person -> person, | 
|                         (existing, replacement) -> existing | 
|                 )); | 
|         List<InoutRecord> uniqueList = new ArrayList<>(uniqueByMemberPhone.values()); | 
|         return uniqueList; | 
|     } | 
|   | 
|     public List<InoutRecord> getDataByCarCodeSize(List<InoutRecord> list){ | 
|         Map<String, InoutRecord> uniqueByCarCode = list.stream() | 
|                 .collect(Collectors.toMap( | 
|                         InoutRecord::getCarCode, | 
|                         person -> person, | 
|                         (existing, replacement) -> existing | 
|                 )); | 
|         List<InoutRecord> uniqueList = new ArrayList<>(uniqueByCarCode.values()); | 
|         return uniqueList; | 
|     } | 
|   | 
|   | 
|     @Override | 
|     public void excel(InParkDataDTO inParkDataDTO, HttpServletResponse response){ | 
|         List<List<String>> data = this.getReportList(inParkDataDTO); | 
|         try { | 
|             String fileName = Constants.equalsInteger(inParkDataDTO.getType(),Constants.ZERO)?"入园车辆统计表_":"入园人员统计表_"+System.currentTimeMillis(); | 
|             String encodeFileName = URLEncoder.encode(fileName, Charset.forName("UTF-8").toString()) + ".xlsx"; | 
|             response.setHeader("Content-Disposition","attachment;filename=" + encodeFileName); | 
|             response.setContentType("application/octet-stream"); | 
|             response.setHeader("eva-opera-type", "download"); | 
|             response.setHeader("eva-download-filename", encodeFileName); | 
|             ExcelExporter.exportList(data, fileName, response.getOutputStream()); | 
|         } catch (IOException e) { | 
|             throw new BusinessException(ResponseStatus.EXPORT_EXCEL_ERROR, e); | 
|         } | 
|     } | 
| } |