当前位置: 首页 > news >正文

工作台-02.代码开发

一.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 {@Autowiredprivate 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 {@Autowiredprivate UserMapper userMapper;@Autowiredprivate OrdersMapper ordersMapper;@Autowiredprivate SetmealMapper setmealMapper;@Autowiredprivate DishMapper dishMapper;/*** 查询今日运营数据* @return*/@Overridepublic 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*/@Overridepublic SetmealOverViewVO getSetmealOverView() {// 查询起售套餐数量Integer soldSetmealCount = setmealMapper.getBySetmealStatus(1);// 查询停售套餐数量Integer discontinuedSetmealCount = setmealMapper.getBySetmealStatus(0);SetmealOverViewVO setmealOverViewVO = SetmealOverViewVO.builder().sold(soldSetmealCount).discontinued(discontinuedSetmealCount).build();return setmealOverViewVO;}/*** 查询菜品总览* @return*/@Overridepublic DishOverViewVO getDishOverView() {// 查询起售菜品数量Integer soldDishCount = dishMapper.getByDishStatus(1);// 查询停售菜品数量Integer discontinuedDishCount = dishMapper.getByDishStatus(0);DishOverViewVO dishOverViewVO = DishOverViewVO.builder().sold(soldDishCount).discontinued(discontinuedDishCount).build();return dishOverViewVO;}/*** 查询订单管理数据* @return*/@Overridepublic 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>

四.功能测试 

http://www.lqws.cn/news/549721.html

相关文章:

  • Linux信号机制:从入门到精通
  • [Python]-基础篇1- 从零开始的Python入门指南
  • 微调大语言模型(生成任务),怎么评估它到底“变好”了?
  • Python网安-zip文件暴力破解
  • Java:链接mysql数据库报错:CommunicationsException: Communications link failure
  • Coze API如何上传文件能得到文件的file_url
  • 缓解停车难的城市密码:4G地磁检测器如何重构车位资源分配
  • Discrete Audio Tokens: More Than a Survey
  • TensorRT-LLM的深度剖析:关键问题与核心局限性
  • Java-异常类
  • Spearman检验组间相关性及SCI风格绘图
  • MySQL之事务原理深度解析
  • [Python] -基础篇2-Python中的变量和数据类型详解
  • 运营医疗信息化建设的思路
  • 创建一个简单入门SpringBoot3项目
  • 华为云Flexus+DeepSeek征文|高可用部署 Dify 平台构建 Flux 绘画中台 Chatflow 的设计与实现
  • Re:从零开始的文件结构(融合线性表来理解 考研向)
  • 设计模式精讲 Day 15:解释器模式(Interpreter Pattern)
  • LangChain4j(20)——调用百度地图MCP服务
  • Ubuntu系统Postman资源占用高怎么办?
  • Stable Diffusion入门-ControlNet 深入理解 第二课:ControlNet模型揭秘与使用技巧
  • 【软考--软件设计师】2.程序设计语言
  • mongodb生产备份工具PBM
  • opensuse安装rabbitmq
  • Transformer
  • 将ONNX模型转换为(OPENMV可用的格式)TensorFlow Lite格式
  • Spring Cloud 微服务(服务注册与发现原理深度解析)
  • python基于Django+mysql实现的图书管理系统【完整源码+数据库】
  • uv包管理常用命令
  • Stable Diffusion 3终极提示词库:2000个工业设计场景生成公式(2025企业级实战指南)