如何接受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>
相关推荐
paopaokaka_luck21 分钟前
基于SpringBoot+Uniapp的健身饮食小程序(协同过滤算法、地图组件)
前端·javascript·vue.js·spring boot·后端·小程序·uni-app
患得患失9491 小时前
【前端】【vscode】【.vscode/settings.json】为单个项目配置自动格式化和开发环境
前端·vscode·json
飛_1 小时前
解决VSCode无法加载Json架构问题
java·服务器·前端
柊二三2 小时前
XML的简略知识点
xml·数据库·oracle
YGY Webgis糕手之路3 小时前
OpenLayers 综合案例-轨迹回放
前端·经验分享·笔记·vue·web
木棉软糖4 小时前
一个MySQL的数据表最多能够存多少的数据?
java
90后的晨仔4 小时前
🚨XSS 攻击全解:什么是跨站脚本攻击?前端如何防御?
前端·vue.js
Ares-Wang4 小时前
JavaScript》》JS》 Var、Let、Const 大总结
开发语言·前端·javascript
90后的晨仔4 小时前
Vue 模板语法完全指南:从插值表达式到动态指令,彻底搞懂 Vue 模板语言
前端·vue.js
程序视点4 小时前
Java BigDecimal详解:小数精确计算、使用方法与常见问题解决方案
java·后端