
一.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 > #{begin}
</if>
<if test="end != null">
and order_time < #{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 > #{begin}
</if>
<if test="end != null">
and order_time < #{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>
四.功能测试
