package cn.iocoder.yudao.module.mes.controller.admin.trace.consumer; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.mes.controller.admin.trace.consumer.vo.MesTraceLocationVisitPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.trace.consumer.vo.MesTraceLocationDistributionRespVO; import cn.iocoder.yudao.module.mes.dal.dataobject.trace.consumer.MesTraceLocationVisitDO; import cn.iocoder.yudao.module.mes.dal.mysql.trace.consumer.MesTraceLocationVisitMapper; import cn.iocoder.yudao.module.mes.controller.admin.trace.consumer.vo.MesTraceConsumerScanDistributionReqVO; import cn.iocoder.yudao.module.mes.controller.admin.trace.consumer.vo.MesTraceConsumerScanDistributionRespVO; import cn.iocoder.yudao.module.mes.controller.admin.trace.consumer.vo.MesTraceConsumerScanSummaryRespVO; import cn.iocoder.yudao.module.mes.controller.admin.trace.consumer.vo.MesTraceConsumerScanTrendRespVO; import cn.iocoder.yudao.module.mes.service.trace.consumer.MesTraceConsumerScanStatisticsService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.validation.Valid; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDateTime; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @Tag(name = "管理后台 - MES 消费者扫码访问统计") @RestController @RequestMapping("/mes/trace-consumer-scan") @Validated public class MesTraceConsumerScanController { @Resource private MesTraceConsumerScanStatisticsService statisticsService; @Resource private MesTraceLocationVisitMapper locationVisitMapper; @GetMapping("/location-visits") @Operation(summary = "定位授权访问记录(含位置与总数)") @PreAuthorize("@ss.hasPermission('mes:trace-consumer-scan:query')") public CommonResult> getLocationVisits(@Valid MesTraceLocationVisitPageReqVO reqVO) { return success(locationVisitMapper.selectPage(reqVO)); } @GetMapping("/location-distribution") @Operation(summary = "定位授权访问的坐标网格分布") @PreAuthorize("@ss.hasPermission('mes:trace-consumer-scan:query')") public CommonResult> getLocationDistribution(@Valid MesTraceLocationVisitPageReqVO reqVO) { Map> groups = locationVisitMapper.selectListByFilter(reqVO).stream() .collect(Collectors.groupingBy(e -> e.getLatitude().setScale(2, RoundingMode.HALF_UP).toPlainString() + "," + e.getLongitude().setScale(2, RoundingMode.HALF_UP).toPlainString())); return success(groups.entrySet().stream() .sorted((a, b) -> Long.compare(b.getValue().size(), a.getValue().size())) .limit(20) .map(entry -> { MesTraceLocationDistributionRespVO vo = new MesTraceLocationDistributionRespVO(); String[] coordinates = entry.getKey().split(","); vo.setLatitude(new BigDecimal(coordinates[0])); vo.setLongitude(new BigDecimal(coordinates[1])); vo.setCount((long) entry.getValue().size()); return vo; }).toList()); } @GetMapping("/summary") @Operation(summary = "消费者扫码访问汇总") @PreAuthorize("@ss.hasPermission('mes:trace-consumer-scan:query')") public CommonResult getSummary( @RequestParam(value = "startTime", required = false) @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) LocalDateTime startTime, @RequestParam(value = "endTime", required = false) @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) LocalDateTime endTime) { return success(statisticsService.getSummary(startTime, endTime)); } @GetMapping("/trend") @Operation(summary = "消费者扫码访问趋势") @PreAuthorize("@ss.hasPermission('mes:trace-consumer-scan:query')") public CommonResult> getTrend( @RequestParam(value = "startTime", required = false) @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) LocalDateTime startTime, @RequestParam(value = "endTime", required = false) @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) LocalDateTime endTime) { return success(statisticsService.getTrend(startTime, endTime)); } @GetMapping("/distribution") @Operation(summary = "消费者扫码访问分布") @PreAuthorize("@ss.hasPermission('mes:trace-consumer-scan:query')") public CommonResult> getDistribution( @Valid MesTraceConsumerScanDistributionReqVO reqVO) { return success(statisticsService.getDistribution(reqVO)); } }