工作台-02.代码开发

发布于:2025-06-28 ⋅ 阅读:(17) ⋅ 点赞:(0)

一.Controller层

package com.sky.controller.admin;

import com.sky.result.Result;
import com.sky.service.WorkSpaceService;
import com.sky.vo.BusinessDataVO;
import com.sky.vo.DishOverViewVO;
import com.sky.vo.OrderOverViewVO;
import com.sky.vo.SetmealOverViewVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/admin/workspace")
@Api(tags = "工作台接口")
@Slf4j
public class WorkSpaceController {
    @Autowired
    private WorkSpaceService workSpaceService;

    /**
     * 查询今日运营数据
     * @return
     */
    @GetMapping("/businessData")
    @ApiOperation("查询今日运营数据")
    public Result<BusinessDataVO> getBusinessData() {
        log.info("查询今日运营数据");
        BusinessDataVO businessDataVO = workSpaceService.getBusinessVO();
        return Result.success(businessDataVO);
    }

    /**
     * 查询套餐总览
     * @return
     */
    @GetMapping("/overviewSetmeals")
    @ApiOperation("查询套餐总览")
    public Result<SetmealOverViewVO> getSetmealOverView() {
        log.info("查询套餐总览");
        SetmealOverViewVO setmealOverViewVO = workSpaceService.getSetmealOverView();
        return Result.success(setmealOverViewVO);
    }

    /**
     * 查询菜品总览
     * @return
     */
    @GetMapping("/overviewDishes")
    @ApiOperation("查询菜品总览")
    public Result<DishOverViewVO> getDishOverView() {
        log.info("查询菜品总览");
        DishOverViewVO dishOverViewVO = workSpaceService.getDishOverView();
        return Result.success(dishOverViewVO);
    }

    /**
     * 查询订单管理数据
     * @return
     */
    @GetMapping("/overviewOrders")
    @ApiOperation("查询订单管理数据")
    public Result<OrderOverViewVO> getOrderOverView() {
        log.info("查询订单管理数据");
        OrderOverViewVO orderOverViewVO = workSpaceService.getOrderOverView();
        return Result.success(orderOverViewVO);
    }
}

二.Service层

接口

package com.sky.service;

import com.sky.vo.BusinessDataVO;
import com.sky.vo.DishOverViewVO;
import com.sky.vo.OrderOverViewVO;
import com.sky.vo.SetmealOverViewVO;
import org.springframework.stereotype.Service;

@Service
public interface WorkSpaceService {

    /**
     * 查询今日运营数据
     * @return
     */
    BusinessDataVO getBusinessVO();

    /**
     * 查询套餐总览
     * @return
     */
    SetmealOverViewVO getSetmealOverView();

    /**
     * 查询菜品总览
     * @return
     */
    DishOverViewVO getDishOverView();

    /**
     * 查询订单管理数据
     * @return
     */
    OrderOverViewVO getOrderOverView();

}

实现类

package com.sky.service.impl;

import com.sky.entity.Orders;
import com.sky.entity.Setmeal;
import com.sky.mapper.DishMapper;
import com.sky.mapper.OrdersMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.mapper.UserMapper;
import com.sky.service.SetmealService;
import com.sky.service.WorkSpaceService;
import com.sky.vo.BusinessDataVO;
import com.sky.vo.DishOverViewVO;
import com.sky.vo.OrderOverViewVO;
import com.sky.vo.SetmealOverViewVO;
import io.swagger.models.auth.In;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.HashMap;
import java.util.Map;

@Service
public class WorkSpaceServiceImpl implements WorkSpaceService {
    @Autowired
    private UserMapper userMapper;

    @Autowired
    private OrdersMapper ordersMapper;

    @Autowired
    private SetmealMapper setmealMapper;

    @Autowired
    private DishMapper dishMapper;
    /**
     * 查询今日运营数据
     * @return
     */
    @Override
    public BusinessDataVO getBusinessVO() {
        // 1.查询新增用户数 select count(id) from user where create_time < ? and create_time > ?;  countByMap()方法
        LocalDateTime begin = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
        LocalDateTime end = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
        Map map = new HashMap<>();
        map.put("begin",begin);
        map.put("end",end);
        Integer newUsers = userMapper.countByMap(map);

        // 2.查询当日的订单完成率 有效订单数
        Integer totalOrderCount = ordersMapper.countByMap(map);
        map.put("status", Orders.COMPLETED);
        Integer validOrderCount = ordersMapper.countByMap(map);
        Double orderCompletionRate = 0.0;
        if (totalOrderCount != 0) {
            orderCompletionRate = validOrderCount.doubleValue() / totalOrderCount;
        }

        // 3.统计当日营业额
        Double turnover = ordersMapper.sumByMap(map);
        turnover = (turnover == null) ? 0.0 : turnover;

        // 4.平均客单价
        Double unitPrice = 0.0;
        if (validOrderCount != 0) {
            unitPrice = turnover / validOrderCount;
        }
        BusinessDataVO businessDataVO = BusinessDataVO.builder()
                .newUsers(newUsers)
                .orderCompletionRate(orderCompletionRate)
                .turnover(turnover)
                .unitPrice(unitPrice)
                .validOrderCount(validOrderCount)
                .build();
        return businessDataVO;
    }

    /**
     * 查询套餐总览
     * @return
     */
    @Override
    public SetmealOverViewVO getSetmealOverView() {
        // 查询起售套餐数量
        Integer soldSetmealCount = setmealMapper.getBySetmealStatus(1);

        // 查询停售套餐数量
        Integer discontinuedSetmealCount = setmealMapper.getBySetmealStatus(0);

        SetmealOverViewVO setmealOverViewVO = SetmealOverViewVO.builder()
                .sold(soldSetmealCount)
                .discontinued(discontinuedSetmealCount)
                .build();
        return setmealOverViewVO;
    }

    /**
     * 查询菜品总览
     * @return
     */
    @Override
    public DishOverViewVO getDishOverView() {
        // 查询起售菜品数量
        Integer soldDishCount = dishMapper.getByDishStatus(1);

        // 查询停售菜品数量
        Integer discontinuedDishCount = dishMapper.getByDishStatus(0);

        DishOverViewVO dishOverViewVO = DishOverViewVO.builder()
                .sold(soldDishCount)
                .discontinued(discontinuedDishCount)
                .build();
        return dishOverViewVO;
    }

    /**
     * 查询订单管理数据
     * @return
     */
    @Override
    public OrderOverViewVO getOrderOverView() {
        Integer allOrders = ordersMapper.countByStatus(null);
        Integer cancelledOrders = ordersMapper.countByStatus(Orders.CANCELLED);
        Integer completedOrders = ordersMapper.countByStatus(Orders.COMPLETED);
        Integer deliveredOrders = ordersMapper.countByStatus(Orders.CONFIRMED);
        Integer waitingOrders = ordersMapper.countByStatus(Orders.TO_BE_CONFIRMED);
        OrderOverViewVO orderOverViewVO = OrderOverViewVO.builder()
                .allOrders(allOrders)
                .cancelledOrders(cancelledOrders)
                .deliveredOrders(deliveredOrders)
                .completedOrders(completedOrders)
                .waitingOrders(waitingOrders)
                .build();
        return orderOverViewVO;
    }
}

三.Mapper层

接口

SetmealMapper.java

package com.sky.mapper;

import com.github.pagehelper.Page;
import com.sky.annotation.AutoFill;
import com.sky.aspect.AutoFillAspect;
import com.sky.dto.SetmealPageQueryDTO;
import com.sky.entity.Setmeal;
import com.sky.enumeration.OperationType;
import com.sky.vo.SetmealVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

@Mapper
public interface SetmealMapper {


    /**
     * 根据category_id查询该分类下的套餐数
     * @param categoryId
     * @return
     */
    @Select("select count(*) from setmeal where category_id = #{categoryId}")
    Integer countByCategoryId(Long categoryId);

    /**
     * 套餐分页查询
     * @param setmealPageQueryDTO
     * @return
     */
    Page<SetmealVO> pageQuery(SetmealPageQueryDTO setmealPageQueryDTO);

    /**
     * 新增套餐
     * @param setmeal
     */
    @AutoFill(value = OperationType.INSERT)
    void save(Setmeal setmeal);

    /**
     * 根据id查询套餐
     * @param id
     * @return
     */
    @Select("select * from setmeal where id = #{id}")
    Setmeal getById(Long id);

    /**
     * 修改套餐
     * @param setmeal
     */
    @AutoFill(value = OperationType.UPDATE)
    void update(Setmeal setmeal);

    /**
     * 批量删除套餐
     * @param ids
     */
    void deleteBatch(List<Long> ids);

    /**
     * 根据分类id查询套餐
     * @param setmeal
     * @return
     */
    List<Setmeal> getByCategory(Setmeal setmeal);

    /**
     * 根据套餐起售/停售状态查询套餐数量
     * @return
     */
    @Select("select count(id) from setmeal where status = #{status}")
    Integer getBySetmealStatus(Integer status);
}

OrdersMapper.java

package com.sky.mapper;

import com.github.pagehelper.Page;
import com.sky.dto.OrdersPageQueryDTO;
import com.sky.entity.Orders;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.core.annotation.Order;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;


@Mapper
public interface OrdersMapper {

    /**
     * 用户下单
     * @param orders
     */
    void insert(Orders orders);

    /**
     * 用于替换微信支付更新数据库状态的问题
     * @param orderStatus
     * @param orderPaidStatus
     */
    @Update("update orders set status = #{orderStatus},pay_status = #{orderPaidStatus} ,checkout_time = #{check_out_time} " +
            "where number = #{orderNumber}")
    void updateStatus(Integer orderStatus, Integer orderPaidStatus, LocalDateTime check_out_time, String orderNumber);

    /**
     * 根据id查询订单信息
     * @param id
     * @return
     */
    @Select("select * from orders where id = #{id}")
    Orders getById(Long id);

    /**
     * 分页条件查询并按下单时间排序
     * @param ordersPageQueryDTO
     * @return
     */
    Page<Orders> pageQuery(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 各个状态的订单数量统计
     * @param status
     * @return
     */
    Integer countByStatus(Integer status);

    /**
     * 修改订单状态
     * @param orders
     */
    void update(Orders orders);

    /**
     * 定时查询订单状态
     * @param status
     * @param time
     * @return
     */
    @Select("select * from orders where status = #{status} and order_time < #{time}")
    List<Orders> getByStatusAndOrderTimeLT(Integer status, LocalDateTime time);


    /**
     * 根据订单号查询订单id
     * @param number
     * @return
     */
    @Select("select id from orders where number = #{number}")
    Long getByOrderNumber(String number);

    /**
     * 根据动态条件统计营业额数据
     * @param map
     * @return
     */
    Double sumByMap(Map map);

    /**
     * 根据动态条件统计订单数据
     * @param map
     * @return
     */
    Integer countByMap(Map map);
}

DishMapper.java 

package com.sky.mapper;

import com.github.pagehelper.Page;
import com.sky.annotation.AutoFill;
import com.sky.dto.DishPageQueryDTO;
import com.sky.entity.Dish;
import com.sky.enumeration.OperationType;
import com.sky.vo.DishVO;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Set;

@Mapper
public interface DishMapper {

    /**
     * 根据category_id查询该分类下的菜品数
     * @param categoryId
     * @return
     */
    @Select("select count(*) from dish where category_id = #{categoryId}")
    Integer countByCategoryId(Long categoryId);

    /**
     * 新增菜品
     * @param dish
     */
    @AutoFill(value = OperationType.INSERT)
    void insert(Dish dish);

    /**
     * 菜品分页查询
     * @param dishPageQueryDTO
     * @return
     */
    Page<DishVO> pageQuery(DishPageQueryDTO dishPageQueryDTO);

    /**
     * 根据id查询菜品
     * @param id
     * @return
     */
    @Select("select * from dish where id = #{id}")
    Dish getById(Long id);

    /**
     * 删除菜品
     * @param id
     */
    @Delete("delete from dish where id = #{id}")
    void deleteById(Long id);

    /**
     * 批量删除菜品
     * @param ids
     */
    void deleteByIds(List<Long> ids);

    /**
     * 修改菜品
     * @param dish
     */
    @AutoFill(value = OperationType.UPDATE)
    void update(Dish dish);

    /**
     * 根据分类id查询菜品,该接口仅仅是为了在用户端根据分类id显示出对应的菜品时,能够将其在售的菜品显示出来,对于管理端本身没用
     * @param dish
     * @return
     */
    List<Dish> getByCategoryId(Dish dish);

    /**
     * 根据套餐id查询包含的菜品
     * @param setmealId
     * @return
     */
    @Select("select d.* from dish d left outer join setmeal_dish sd on d.id = sd.dish_id where setmeal_id = #{setmealId}")
    List<Dish> getDishsBySetmealId(Long setmealId);

    /**
     * 根据分类id查询出菜品及相关口味并展示
     * @param ids
     * @return
     */
    Set<Long> getCategoryIdsByIds(List<Long> ids);

    /**
     * 查询菜品总览
     * @return
     */
    @Select("select count(id) from dish where status = #{status}")
    Integer getByDishStatus(Integer status);
}

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.OrdersMapper">

    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
        insert into orders(number, status, user_id, address_book_id, order_time, checkout_time, pay_method, pay_status,
                           amount, remark, phone, address, user_name, consignee, cancel_reason, rejection_reason,
                           cancel_time, estimated_delivery_time, delivery_status, delivery_time, pack_amount,
                           tableware_number, tableware_status)
        VALUES (#{number}, #{status}, #{userId}, #{addressBookId}, #{orderTime}, #{checkoutTime}, #{payMethod},
                #{payStatus}, #{amount}, #{remark}, #{phone}, #{address}, #{userName}, #{consignee}, #{cancelReason},
                #{rejectionReason}, #{cancelTime}, #{estimatedDeliveryTime}, #{deliveryStatus}, #{deliveryTime},
                #{packAmount}, #{tablewareNumber}, #{tablewareStatus})
    </insert>
    <update id="update">
        update orders
        <set>
            <if test="payStatus != null">
                pay_status = #{payStatus},
            </if>
            <if test="status != null">
                status = #{status},
            </if>
            <if test="cancelReason != null and cancelReason != ''">
                cancel_reason = #{cancelReason},
            </if>
            <if test="rejectionReason != null and rejectionReason != ''">
                rejection_reason = #{rejectionReason},
            </if>
            <if test="cancelTime != null">
                cancel_time = #{cancelTime},
            </if>
            <if test="checkoutTime != null">
                checkout_time = #{checkoutTime},
            </if>
            <if test="deliveryTime != null">
                delivery_time = #{deliveryTime},
            </if>
            <if test="payMethod != null">
                pay_method = #{payMethod}
            </if>
        </set>
        where id = #{id}
    </update>

    <select id="pageQuery" resultType="com.sky.entity.Orders">
        select * from orders
        <where>
            <if test="number != null and number != ''">
                and number = #{number}
            </if>
            <if test="phone != null and phone != ''">
                and phone = #{phone}
            </if>
            <if test="status != null">
                and status = #{status}
            </if>
            <if test="beginTime != null">
                and order_time = #{beginTime}
            </if>
            <if test="endTime != null">
                and order_time = #{endTime}
            </if>
            <if test="userId != null">
                and user_id = #{userId}
            </if>
        </where>
        order by order_time desc
    </select>
    <select id="sumByMap" resultType="java.lang.Double">
        select sum(amount) from orders
        <where>
            <if test="begin != null">
                and order_time &gt; #{begin}
            </if>
            <if test="end != null">
                and order_time &lt; #{end}
            </if>
            <if test="status != null">
                and status = #{status}
            </if>
        </where>
    </select>
    <select id="countByMap" resultType="java.lang.Integer">
        select count(id) from orders
        <where>
            <if test="begin != null">
                and order_time &gt; #{begin}
            </if>
            <if test="end != null">
                and order_time &lt; #{end}
            </if>
            <if test="status != null">
                and status = #{status}
            </if>
        </where>
    </select>
    <select id="countByStatus" resultType="java.lang.Integer">
        select count(*) from orders
        <where>
            <if test="status != null">
                status = #{status}
            </if>
        </where>
    </select>
</mapper>

四.功能测试 


网站公告

今日签到

点亮在社区的每一天
去签到