package com.ruoyi.chargingPile.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.chargingPile.api.model.TParkingLot; import com.ruoyi.chargingPile.api.model.TParkingRecord; import com.ruoyi.chargingPile.api.query.ParkingRecordQuery; import com.ruoyi.chargingPile.api.vo.*; import com.ruoyi.chargingPile.dto.ParkingRecordPageQuery; import com.ruoyi.chargingPile.dto.ParkingRecordQueryDto; import com.ruoyi.chargingPile.export.TParkingRecordExport; import com.ruoyi.chargingPile.service.TParkingLotService; import com.ruoyi.chargingPile.service.TParkingRecordService; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.WebUtils; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.log.enums.OperatorType; import com.ruoyi.order.api.query.TOrderInvoiceQuery; import com.ruoyi.order.api.vo.TCharingUserEquimentVO; import com.ruoyi.order.api.vo.TOrderInvoiceVO; import io.swagger.annotations.ApiOperation; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.BeanUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.math.BigDecimal; import java.net.URLEncoder; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** *

* 前端控制器 *

* * @author xiaochen * @since 2024-08-08 */ @RestController @RequestMapping("/t-parking-record") public class TParkingRecordController { @Resource private TParkingRecordService parkingRecordService; @Resource private TParkingLotService parkingLotService; @ApiOperation(tags = {"后台-订单管理-停车记录"},value = "列表") @PostMapping(value = "/page") public R> page(@RequestBody ParkingRecordPageQuery query) { Page page = parkingRecordService.lambdaQuery().ge(query.getStart() != null, TParkingRecord::getCreateTime, query.getStart()) .le(query.getEnd() != null, TParkingRecord::getCreateTime, query.getEnd()) .like(query.getLicensePlate() != null, TParkingRecord::getLicensePlate, query.getLicensePlate()) .eq(query.getStatus() != null, TParkingRecord::getStatus, query.getStatus()) .eq(query.getOutParkingType() != null, TParkingRecord::getOutParkingType, query.getOutParkingType()) .page(Page.of(query.getPageCurr(), query.getPageSize())); for (TParkingRecord record : page.getRecords()) { record.setName(parkingLotService.getById(record.getParkingLotId()).getName()); record.setUid(record.getId().toString()); } return R.ok(page); } @ApiOperation(tags = {"后台-订单管理-停车记录"},value = "停车缴费订单列表") @PostMapping(value = "/pageList") public R pageList(@RequestBody ParkingRecordQuery query) { return R.ok(parkingRecordService.pageList(query)); } @ApiOperation(tags = {"后台-订单管理-停车记录"},value = "导出") @PutMapping("/export") @Log(title = "【停车记录】导出停车记录", businessType = BusinessType.EXPORT,operatorType = OperatorType.MANAGE) public void export(@RequestBody ParkingRecordQuery query) { List records = parkingRecordService.pageList(query).getParkingRecordVOS().getRecords(); List orderInvoiceExports = new ArrayList<>(); for (TParkingRecordVO orderInvoiceVO : records) { TParkingRecordExport orderInvoiceExport = new TParkingRecordExport(); BeanUtils.copyProperties(orderInvoiceVO,orderInvoiceExport); if (orderInvoiceVO.getFreeDuration()!=null){ orderInvoiceExport.setParkingDuration(orderInvoiceVO.getParkingDuration()-orderInvoiceVO.getFreeDuration()); }else{ orderInvoiceExport.setParkingDuration(orderInvoiceVO.getParkingDuration()); } if (orderInvoiceVO.getTimeoutAmount()!=null){ orderInvoiceExport.setAmount(orderInvoiceVO.getOrderAmount().subtract(orderInvoiceVO.getTimeoutAmount())); }else{ orderInvoiceExport.setAmount(orderInvoiceVO.getOrderAmount()); } orderInvoiceExports.add(orderInvoiceExport); } Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TParkingRecordExport.class, orderInvoiceExports); HttpServletResponse response = WebUtils.response(); response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); ServletOutputStream outputStream = null; try { String fileName = URLEncoder.encode("停车记录.xls", "utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName); response.setContentType("application/vnd.ms-excel;charset=UTF-8"); response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); outputStream = response.getOutputStream(); workbook.write(outputStream); } catch (IOException e) { e.printStackTrace(); } finally { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } @ApiOperation(tags = {"后台-订单管理-停车记录"},value = "详情") @GetMapping(value = "/detail") public R detail(Long id) { return R.ok(parkingRecordService.getById(id)); } @ApiOperation(tags = {"后台-订单管理-停车记录"},value = "出场") @GetMapping(value = "/out") @Log(title = "【停车记录】修改出场状态", businessType = BusinessType.UPDATE,operatorType = OperatorType.MANAGE) public R out(Long id) { TParkingRecord byId = parkingRecordService.getById(id); byId.setStatus(2); parkingRecordService.updateById(byId); return R.ok(); } /** * 根据车牌和状态查询停车数据 * @param query * @return */ @PostMapping("/getParkingRecord") public R getParkingRecord(@RequestBody GetParkingRecord query){ TParkingRecord one = parkingRecordService.getOne(new LambdaQueryWrapper() .eq(TParkingRecord::getLicensePlate, query.getLicensePlate()).eq(TParkingRecord::getStatus, query.getStatus())); return R.ok(one); } /** * 修改停车数据 * @param parkingRecord */ @PostMapping("/updateParkingRecord") public void updateParkingRecord(@RequestBody TParkingRecord parkingRecord){ parkingRecordService.updateById(parkingRecord); } /** * 根据id获取数据 * @param id * @return */ @PostMapping("/getParkingRecordById") public R getParkingRecordById(@RequestParam("id") Long id){ TParkingRecord parkingRecord = parkingRecordService.getById(id); return R.ok(parkingRecord); } /** * 添加数据 * @param parkingRecord */ @PostMapping("/addParkingRecord") public void addParkingRecord(@RequestBody TParkingRecord parkingRecord){ parkingRecordService.save(parkingRecord); } @ResponseBody @PostMapping(value = "/parking/data") @ApiOperation(value = "统计", tags = {"管理后台-数据分析-车场运营分析"}) public R data(@RequestBody ParkingRecordQueryDto parkingRecordQueryDto){ //上方折线图 TParkLotRecordVO tParkLotRecordVO = new TParkLotRecordVO(); if (parkingRecordQueryDto.getDayType()==1) { List> maps = parkingRecordService.parkingData(parkingRecordQueryDto); List> charMap = new ArrayList<>(); // 生成从 "00:00" 到 "23:00" 的时间数据 for (int hour = 0; hour < 24; hour++) { String time = String.format("%02d:00", hour); Map mapWithTimeValue = findMapWithTimeValue(maps, time); if (mapWithTimeValue!=null){ charMap.add(mapWithTimeValue); }else { Map timeMap = new HashMap<>(); timeMap.put("time", time); // 初始化值为 null timeMap.put("orders", 0); timeMap.put("timeoutAmount", 0); charMap.add(timeMap); } } tParkLotRecordVO.setMaps(charMap); }else { List> maps = parkingRecordService.parkingDataByDate(parkingRecordQueryDto); if(parkingRecordQueryDto.getDayType()==2||parkingRecordQueryDto.getDayType()==3){ //按日 // 解析 startTime 和 endTime 为 LocalDate LocalDate startDate = parkingRecordQueryDto.getStartTime(); LocalDate endDate = parkingRecordQueryDto.getEndTime(); List> dateRangeStatistics = new ArrayList<>(); // 遍历日期范围 while (!startDate.isAfter(endDate)) { String formattedDate = startDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); Map dailyStats = findMapWithDateValue(maps, formattedDate); if (dailyStats != null) { dateRangeStatistics.add(dailyStats); } else { Map dateMap = new HashMap<>(); dateMap.put("time", formattedDate); dateMap.put("electrovalence", 0); dateMap.put("orderCount", 0); dateMap.put("servicecharge", 0); dateMap.put("electricity", 0); dateRangeStatistics.add(dateMap); } // 移动到下一天 startDate = startDate.plusDays(1); } tParkLotRecordVO.setMaps(dateRangeStatistics); }else { } tParkLotRecordVO.setMaps(maps); } //车辆类型饼图 List> carColor = parkingRecordService.getCarColor(parkingRecordQueryDto); //出场类型 List> outType = parkingRecordService.getOutType(parkingRecordQueryDto); //进场充电占比 List> isCharge = parkingRecordService.getIsCharge(parkingRecordQueryDto); tParkLotRecordVO.setCarColor(carColor); tParkLotRecordVO.setOutType(outType); tParkLotRecordVO.setIsCharge(isCharge); return R.ok(tParkLotRecordVO); } private static Map findMapWithTimeValue(List> charMap1,String timeValue) { for (Map map : charMap1) { if (map.containsKey("time") && map.get("time").equals(timeValue)) { return map; } } return null; // 如果没有找到,返回 null } private Map findMapWithDateValue(List> list, String date) { for (Map map : list) { if (date.equals(map.get("time"))) { return map; } } return null; } @ResponseBody @PostMapping(value = "/parking/work") @ApiOperation(value = "停车订单统计", tags = {"管理后台-工作台"}) public R work(@RequestBody ParkingRecordQueryDto parkingRecordQueryDto){ List list = parkingRecordService.lambdaQuery().eq(parkingRecordQueryDto.getParkingLotId() != null, TParkingRecord::getParkingLotId, parkingRecordQueryDto.getParkingLotId()) .between(TParkingRecord::getCreateTime, parkingRecordQueryDto.getStartTime(), parkingRecordQueryDto.getEndTime()).list(); int count1 = list.size(); //统计出list中chargingOrderId为null的数据个数 int count2 = list.stream().filter(item -> item.getChargingOrderId() == null).collect(Collectors.toList()).size(); int count3 = count1-count2; //计算出list中parkingDuration的总和 int count4 = 0; for (TParkingRecord tParkingRecord : list) { count4 = count4+tParkingRecord.getParkingDuration(); } //计算出list中orderAmount的总和 BigDecimal count5 = list.stream().map(TParkingRecord::getOrderAmount).reduce(BigDecimal.ZERO, BigDecimal::add); TParkLotRecordCountVo tParkLotRecordCountVo = new TParkLotRecordCountVo(); tParkLotRecordCountVo.setCount1(count1); tParkLotRecordCountVo.setCount2(count2); tParkLotRecordCountVo.setCount3(count3); tParkLotRecordCountVo.setCount4(count4); tParkLotRecordCountVo.setCount5(count5); return R.ok(tParkLotRecordCountVo); } @ResponseBody @PostMapping(value = "/parking/work1") @ApiOperation(value = "停车订单统计", tags = {"管理后台-工作台"}) public R work1(@RequestBody ParkingRecordQueryDto parkingRecordQueryDto){ List list = parkingRecordService.lambdaQuery().eq(parkingRecordQueryDto.getParkingLotId() != null, TParkingRecord::getParkingLotId, parkingRecordQueryDto.getParkingLotId()) .between(TParkingRecord::getCreateTime, parkingRecordQueryDto.getStartTime(), parkingRecordQueryDto.getEndTime()).list(); int count1 = list.size(); //统计出list中chargingOrderId为null的数据个数 int count2 = list.stream().filter(item -> item.getChargingOrderId() == null).collect(Collectors.toList()).size(); int count3 = count1-count2; //计算出list中parkingDuration的总和 int count4 = 0; for (TParkingRecord tParkingRecord : list) { count4 = count4+tParkingRecord.getParkingDuration(); } //计算出list中orderAmount的总和 BigDecimal count5 = list.stream().map(TParkingRecord::getOrderAmount).reduce(BigDecimal.ZERO, BigDecimal::add); TParkLotRecordCountVo tParkLotRecordCountVo = new TParkLotRecordCountVo(); tParkLotRecordCountVo.setCount1(count1); tParkLotRecordCountVo.setCount2(count2); tParkLotRecordCountVo.setCount3(count3); tParkLotRecordCountVo.setCount4(count4); tParkLotRecordCountVo.setCount5(count5); return R.ok(tParkLotRecordCountVo); } @ResponseBody @PostMapping(value = "/parking/income") @ApiOperation(value = "停车收入统计", tags = {"管理后台-工作台"}) public R income(@RequestBody ParkingRecordQueryDto parkingRecordQueryDto){ List> maps = parkingRecordService.income(parkingRecordQueryDto); return R.ok(maps); } }