苍穹外卖day11-问题与解决办法

1.注意:传向前端的数据不能为null,每次传的数据记得做非null判断

turnover = turnover == null ? 0.0 : turnover;

2.链式编程,需要将List中的数据转换成逗号分隔的字符串

				TurnoverReportVO
                .builder()
                .dateList(StringUtils.join(dateList,","))
                .turnoverList(StringUtils.join(turnoverList,","))
                .build();

通过apache.lang3中的StringUtils能实现将List中的数据转换成逗号分隔的字符串,并且List中可装任意的数据类型

3.日期形参由于有多个格式因此需要在传入时,通过备注

public Result<TurnoverReportVO> turnoverStatistics(
            @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
            @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end  ) {

        return Result.success(reportService.turnoverStatistics(begin,end));
    }

4.reduce:合并

//获得时间段中的订单总数
        Integer totalOrderCount = orderCountList.stream().reduce(Integer::sum).get();

5.对于上方Integer的总订单数和有效订单数,为了求百分比(Double),因此要将Integer转换成doubleValue

//有效比例
        Double orderCompletionRate = 0.0;
        if(totalOrderCount != 0){
            orderCompletionRate = totalValidOrderCount.doubleValue() / totalOrderCount.doubleValue();
        }

注意:做除法时,记得分母不能为0,要做非0判断

6.问题:上边一段代码由于没有把sum(od.number)重命名为number,就没法在idea中查找到od.name和sum(od.number)这两条数据,但是在MySQL Workbench中能够实现功能

<select id="getByTime" resultType="com.sky.dto.GoodsSalesDTO">
		select
            od.name,sum(od.number)
        from order_detail od, orders o
        
        where od.oders_id = o.id and o.status = 5
        <if test="beginTime != null">
            and o.order_time &gt;= #{beginTime}
        </if>
        <if test="endTime != null">
            and o.order_time &lt;= #{endTime}
        </if>
        //两表联查+条件限制
        
        group by
            od.name		//分组才能查出来
        order by
            sum(od.number) desc /*按照倒叙排列*/
        limit 10
</select>
<select id="getByTime" resultType="com.sky.dto.GoodsSalesDTO">
        select
            od.name,sum(od.number) number
        from order_detail od, orders o
        where od.order_id = o.id and o.status = 5
        <if test="beginTime != null">
            and o.order_time &gt;= #{beginTime}
        </if>
        <if test="endTime != null">
            and o.order_time &lt;= #{endTime}
        </if>
        group by
            od.name
        order by
            number desc /*按照倒叙排列*/
        limit 10
    </select>

解决方法:由于返回类型为GoodsSalesDTO(内含name,number两个类变量),所以查询出来的数据,也应该命名为name,number,做到一一对应才能把查到的数据储存到DTO中.

7.Stream流中map可以提取元素,collect可以将提取出来的元素,转换成新的List储存

List<GoodsSalesDTO> goodsSalesDTOS = ordersMapper.getByTime(beginTime, endTime);
//上方是个List,下面对List进行Stream流处理
List<String> name = goodsSalesDTOS.stream().map(GoodsSalesDTO::getName).collect(Collectors.toList());
String nameList = StringUtils.join(name, ",");

8.由于test="beginTime != null,与下方的#{begin}不对应,虽然没报错,但是查到的数据为所有数据,不是限定时间的数据

<select id="countByMap" resultType="java.lang.Integer">
        select count(id) from user
        <where>
            <if test="beginTime != null">
                and create_time &gt;= #{begin}
            </if>
            <if test="endTime != null">
                and create_time &lt;= #{end}
            </if>
        </where>
    </select>

解决方法:把beginTime改成传入的数据的变量名(begin).

你可能感兴趣的:(java)