如何接受Date范围的数据

controller

  • 注解 @DateTimeFormat 会自动完成字符串LocalDate的转换
java 复制代码
/**
 * 报表的接口
 */
@RestController
@RequestMapping("/admin/report")
@Api(tags = "报表的接口")
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ReportController {


    // 日期列表 2020-01-01,2020-01-02,2020-01-03
    private String dateList ;

    // 交易额列表 100,200,300
    private String turnoverList ;

    // 服务类
    private final ReportService reportService;

    /**
     * 交易额统计
     * @param begin 开始时间
     * @param end 结束时间
     * @return 交易额统计
     */
    @GetMapping("/turnoverStatistics")
    @ApiOperation("交易额统计")
    public Result<TurnoverReportVO> turnoverStatistics(
            @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
            @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end
    ) {
        log.info("交易额统计, begin={}, end={}", begin, end);
        return Result.success(reportService.getTurnoverStatistics(begin, end));
    }
}

service层

  • Map<String, Object> map = new HashMap<>(); 使用map封装特殊类型的Date
java 复制代码
@Service
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ReportServiceImpl implements ReportService {

    private final OrderMapper orderMapper;

    // 交易额统计
    public TurnoverReportVO getTurnoverStatistics(LocalDate begin, LocalDate end) {
        TurnoverReportVO turnoverReportVO = new TurnoverReportVO();

        // 计算从开始时间到结束时间的日期列表
        List<LocalDate> dateList = new ArrayList<>();
        LocalDate tempDate = begin;
        while (!tempDate.isAfter(end)) {
            dateList.add(tempDate);
            tempDate = tempDate.plusDays(1);
        }
        log.info("日期列表: {}", dateList);
        turnoverReportVO.setDateList(String.join(",", dateList.toString()));

        // 计算从开始时间到结束时间的交易额列表
        List<BigDecimal> turnoverList = new ArrayList<>();
        for (LocalDate date : dateList) {
            // 获取当日交易状态为已完成的交易额
            LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);
            LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);
            // 计算当日交易额
            Map<String, Object> map = new HashMap<>();
            map.put("begin", beginTime);
            map.put("end", endTime);
            map.put("status", Orders.COMPLETED);
            BigDecimal turnover =  orderMapper.sumByMap(map);
            if (ObjectUtil.isNull(turnover)) {
                turnover = BigDecimal.ZERO;
            }
            turnoverList.add(turnover);
        }
        log.info("交易额列表: {}", turnoverList);
        turnoverReportVO.setTurnoverList(String.join(",", turnoverList.toString()));


        // 计算从开始时间到结束时间的交易额列表
        return turnoverReportVO;
    }
}

mapper层

xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.OrderMapper">

    <select id="sumByMap" resultType="java.math.BigDecimal">
        select sum(amount) from orders
        <where>
            <if test="begin != null"><![CDATA[
                and order_time >= #{begin}
            ]]></if>
            <if test="end != null"><![CDATA[
                and order_time <= #{end}
            ]]></if>
            <if test="status != null">
                and status = #{status}
            </if>
        </where>
    </select>
</mapper>
相关推荐
香精煎鱼香翅捞饭几秒前
java通用自研接口限流组件
java·开发语言
灵感__idea1 分钟前
Vuejs技术内幕:数据响应式之3.x版
前端·vue.js·源码阅读
勘察加熊人3 分钟前
fastapi房产销售系统
数据库·lua·fastapi
烛阴5 分钟前
JavaScript 构造器进阶:掌握 “new” 的底层原理,写出更优雅的代码!
前端·javascript
Alan-Xia6 分钟前
使用jest测试用例之入门篇
前端·javascript·学习·测试用例
浪遏7 分钟前
面试官😏 :文本太长,超出部分用省略号 ,怎么搞?我:🤡
前端·面试
昕er9 分钟前
CefSharp 文件下载和保存功能-监听前端事件
前端
@PHARAOH15 分钟前
WHAT - Tree Shaking 的前提是 ES Module
前端·webpack·ecmascript
ChinaRainbowSea19 分钟前
Linux: Centos7 Cannot find a valid baseurl for repo: base/7/x86_64 解决方案
java·linux·运维·服务器·docker·架构
囧囧 O_o20 分钟前
Java 实现 Oracle 的 MONTHS_BETWEEN 函数
java·oracle