diff --git a/src/main/java/com/service/imp/OrderServiceImp.java b/src/main/java/com/service/imp/OrderServiceImp.java index 8c7231d..5df2b52 100644 --- a/src/main/java/com/service/imp/OrderServiceImp.java +++ b/src/main/java/com/service/imp/OrderServiceImp.java @@ -21,150 +21,222 @@ import com.mapper.ScheduleMapper; import com.mapper.UserMapper; import com.service.IOrderService; +/** + * OrderServiceImp类,它实现了IOrderService接口,主要用于处理订单(Order)相关的业务逻辑。 + * 此类通过Spring的依赖注入机制获取了多个Mapper对象,包括OrderMapper、UserMapper、ScheduleMapper、HallMapper、MovieMapper以及CinemaMapper等,用于与不同实体对应的数据库表进行交互,以获取或更新相关数据,并且借助Spring的事务管理功能来保障数据操作的一致性和完整性。 + * 通过`@Service`注解将该类标记为Spring的服务层组件,方便Spring框架进行管理以及在其他组件中进行依赖注入使用。 + */ @Service -public class OrderServiceImp implements IOrderService{ - @Autowired - private OrderMapper orderMapper; - @Autowired - private UserMapper userMapper; - @Autowired - private ScheduleMapper scheduleMapper; - @Autowired - private HallMapper hallMapper; - @Autowired - private MovieMapper movieMapper; - @Autowired - private CinemaMapper cinemaMapper; - - @Transactional(propagation=Propagation.REQUIRED,readOnly=true) - @Override - public Order findOrderById(String order_id) { - Order order = this.orderMapper.findOrderById(order_id); - if(order != null) { - order.setOrder_user(this.userMapper.findUserById(order.getUser_id())); - Schedule schedule = this.scheduleMapper.findScheduleById(order.getSchedule_id()); - Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); - hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); - schedule.setSchedule_hall(hall); - schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); - order.setOrder_schedule(schedule); - }else { - order = null; - } - return order; - } - - @Transactional(propagation=Propagation.REQUIRED,readOnly=true) - @Override - public List findRefundOrderByUserName(String user_name) { - List list = this.orderMapper.findRefundOrderByUserName(user_name); - if(list.size() > 0) { - for(Order order : list) { - order.setOrder_user(this.userMapper.findUserById(order.getUser_id())); - Schedule schedule = this.scheduleMapper.findScheduleById(order.getSchedule_id()); - Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); - hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); - schedule.setSchedule_hall(hall); - schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); - order.setOrder_schedule(schedule); - } - }else { - list = null; - } - return list; - } - - @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) - @Override - public Integer addOrder(Order order) { - return this.orderMapper.addOrder(order); - } - - @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) - @Override - public Integer updateOrderStateToRefund(String order_id) { - return this.orderMapper.updateOrderStateToRefund(order_id); - } - - @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) - @Override - public Integer updateOrderStateToRefunded(String order_id) { - return this.orderMapper.updateOrderStateToRefunded(order_id); - } - - @Transactional(propagation=Propagation.REQUIRED,readOnly=true) - @Override - public PageInfo findOrdersByUserName(Integer page,Integer limit,String user_name) { - PageHelper.startPage(page, limit); - List list = this.orderMapper.findOrdersByUserName(user_name); - for(Order order : list) { - order.setOrder_user(this.userMapper.findUserById(order.getUser_id())); - Schedule schedule = this.scheduleMapper.findScheduleById(order.getSchedule_id()); - Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); - hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); - schedule.setSchedule_hall(hall); - schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); - order.setOrder_schedule(schedule); - } - PageInfo info = new PageInfo(list); - return info; - } - - @Transactional(propagation=Propagation.REQUIRED,readOnly=true) - @Override - public List findAllOrders() { - List list = this.orderMapper.findAllOrders(); - for(Order order : list) { - order.setOrder_user(this.userMapper.findUserById(order.getUser_id())); - Schedule schedule = this.scheduleMapper.findScheduleById(order.getSchedule_id()); - Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); - hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); - schedule.setSchedule_hall(hall); - schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); - order.setOrder_schedule(schedule); - } - return list; - } - - @Transactional(propagation=Propagation.REQUIRED,readOnly=true) - @Override - public PageInfo findOrdersByState(Integer page,Integer limit,int order_state) { - PageHelper.startPage(page, limit); - List list = this.orderMapper.findOrdersByState(order_state); - for(Order order : list) { - order.setOrder_user(this.userMapper.findUserById(order.getUser_id())); - Schedule schedule = this.scheduleMapper.findScheduleById(order.getSchedule_id()); - Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); - hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); - schedule.setSchedule_hall(hall); - schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); - order.setOrder_schedule(schedule); - } - PageInfo info = new PageInfo(list); - return info; - } - - @Transactional(propagation=Propagation.REQUIRED,readOnly=true) - @Override - public PageInfo findAllOrdersBySplitPage(Integer page, Integer limit, String keyword) { - PageHelper.startPage(page, limit); - List list = new ArrayList(); - if(keyword != null && !keyword.trim().equals("")) { - list = this.orderMapper.findOrdersByUserName(keyword); - }else { - list = this.orderMapper.findAllOrders(); - } - for(Order order : list) { - order.setOrder_user(this.userMapper.findUserById(order.getUser_id())); - Schedule schedule = this.scheduleMapper.findScheduleById(order.getSchedule_id()); - Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); - hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); - schedule.setSchedule_hall(hall); - schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); - order.setOrder_schedule(schedule); - } - PageInfo info = new PageInfo(list); - return info; - } - -} +public class OrderServiceImp implements IOrderService { + + /** + * 通过Spring的依赖注入自动获取OrderMapper对象,用于调用与订单数据持久化相关的方法,例如查询、插入、更新订单记录等操作,实现与数据库中订单表的交互。 + */ + @Autowired + private OrderMapper orderMapper; + + /** + * 通过Spring的依赖注入自动获取UserMapper对象,用于调用与用户数据持久化相关的方法,在处理订单业务时,可用于获取订单关联的用户信息,实现与数据库中用户表的交互。 + */ + @Autowired + private UserMapper userMapper; + + /** + * 通过Spring的依赖注入自动获取ScheduleMapper对象,用于调用与电影场次数据持久化相关的方法,在订单业务中,可获取订单对应的场次信息,实现与数据库中场次表的交互。 + */ + @Autowired + private ScheduleMapper scheduleMapper; + + /** + * 通过Spring的依赖注入自动获取HallMapper对象,用于调用与放映厅数据持久化相关的方法,配合场次信息进一步获取场次对应的放映厅详情,实现与数据库中放映厅表的交互。 + */ + @Autowired + private HallMapper hallMapper; + + /** + * 通过Spring的依赖注入自动获取MovieMapper对象,用于调用与电影数据持久化相关的方法,用于获取场次对应的电影信息,实现与数据库中电影表的交互。 + */ + @Autowired + private MovieMapper movieMapper; + + /** + * 通过Spring的依赖注入自动获取CinemaMapper对象,用于调用与电影院数据持久化相关的方法,在获取放映厅信息后,进一步获取放映厅所属的电影院信息,实现与数据库中电影院表的交互。 + */ + @Autowired + private CinemaMapper cinemaMapper; + + /** + * 根据订单的唯一标识(ID)查询订单信息的方法。 + * 该方法被标记为事务性方法,事务传播行为设置为`Propagation.REQUIRED`,意味着如果当前存在事务,则加入该事务;如果不存在,则创建一个新事务。同时设置为只读事务(`readOnly=true`),因为主要是查询数据,无需修改数据,这样可提高性能并优化数据库资源利用。 + * 首先通过OrderMapper的`findOrderById`方法从数据库中获取指定ID的订单基本信息,如果获取到的订单对象不为空,则进行关联信息的设置:通过UserMapper的`findUserById`方法获取订单关联的用户信息并设置到订单对象中;接着获取订单关联的场次信息,再依次获取场次对应的放映厅信息、放映厅所属的电影院信息以及场次对应的电影信息,并将这些关联信息层层设置到相应的对象中,最后返回包含完整关联信息的订单对象;若未获取到订单对象(即订单不存在),则直接返回`null`。 + * @param order_id 要查询的订单的唯一标识(通常是一个特定格式的字符串) + * @return 返回一个`Order`对象,代表查询到的订单信息,其中包含了关联的用户、场次、放映厅、电影院以及电影等详细信息,如果未找到对应订单则返回`null`(具体取决于底层Mapper的实现逻辑) + */ + @Transactional(propagation = Propagation.REQUIRED, readOnly = true) + @Override + public Order findOrderById(String order_id) { + Order order = this.orderMapper.findOrderById(order_id); + if (order!= null) { + order.setOrder_user(this.userMapper.findUserById(order.getUser_id())); + Schedule schedule = this.scheduleMapper.findScheduleById(order.getSchedule_id()); + Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); + hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); + schedule.setSchedule_hall(hall); + schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); + order.setOrder_schedule(schedule); + } else { + order = null; + } + return order; + } + + /** + * 根据用户名查询该用户所有处于申请退票状态的订单信息的方法。 + * 该方法同样是事务性且只读的方法,事务传播行为为`Propagation.REQUIRED`。 + * 首先通过OrderMapper的`findRefundOrderByUserName`方法获取指定用户名对应的申请退票状态的订单列表,如果列表中有订单(即列表大小大于0),则遍历该列表,对每个订单对象进行关联信息的设置,操作与`findOrderById`方法中设置关联信息类似,将用户、场次、放映厅、电影院以及电影等关联信息设置到订单对象中;若列表为空(即没有符合条件的订单),则将列表设置为`null`,最后返回处理后的订单列表。 + * @param user_name 要查询其申请退票订单的用户名 + * @return 返回一个包含符合条件的`Order`对象的`List`集合,每个对象代表一条申请退票的订单记录信息,且其中包含了关联的用户、场次、放映厅、电影院以及电影等详细信息,可能为空集合(如果该用户没有申请退票的订单) + */ + @Transactional(propagation = Propagation.REQUIRED, readOnly = true) + @Override + public List findRefundOrderByUserName(String user_name) { + List list = this.orderMapper.findRefundOrderByUserName(user_name); + if (list.size() > 0) { + for (Order order : list) { + order.setOrder_user(this.userMapper.findUserById(order.getUser_id())); + Schedule schedule = this.scheduleMapper.findScheduleById(order.getSchedule_id()); + Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); + hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); + schedule.setSchedule_hall(hall); + schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); + order.setOrder_schedule(schedule); + } + } else { + list = null; + } + return list; + } + + /** + * 向数据库中插入一条新的订单记录的方法。 + * 此方法是事务性方法,事务传播行为为`Propagation.REQUIRED`,且设置了`rollbackFor=Exception.class`,表示如果方法执行过程中抛出任何异常,都会回滚当前事务,以此保证数据的一致性,确保插入操作要么全部成功,要么全部失败。 + * 内部通过调用OrderMapper的`addOrder`方法,将传入的包含订单信息的`Order`对象插入到数据库的订单表中,并返回受影响的行数(通常插入成功返回1,失败返回0等,具体依数据库执行情况而定),用于判断插入操作是否成功。 + * @param order 包含要插入的订单信息的`Order`对象 + * @return 返回一个`Integer`类型的值,表示插入操作影响的行数,可用于判断插入是否成功 + */ + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + @Override + public Integer addOrder(Order order) { + return this.orderMapper.addOrder(order); + } + + /** + * 将指定订单的状态更新为申请退票状态的方法。 + * 同样是事务性方法,事务传播行为为`Propagation.REQUIRED`,且设置了`rollbackFor=Exception.class`,保证在更新订单状态出现异常时能正确回滚事务,维持数据的完整性。 + * 通过调用OrderMapper的`updateOrderStateToRefund`方法,依据传入的订单唯一标识(order_id)在数据库中找到对应的订单记录,并将其订单状态字段更新为表示申请退票的值(具体值由业务逻辑中约定),然后返回受影响的行数来表明更新操作是否成功执行(一般成功更新返回1,不存在对应记录返回0等情况),用于确认订单状态更新为申请退票这一操作的结果。 + * @param order_id 要更新状态为申请退票的订单的唯一标识 + * @return 返回一个`Integer`类型的值,表示更新操作影响的行数,可用于判断更新是否成功 + */ + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + @Override + public Integer updateOrderStateToRefund(String order_id) { + return this.orderMapper.updateOrderStateToRefund(order_id); + } + + /** + * 将指定订单的状态更新为同意退票状态的方法。 + * 也是事务性方法,事务传播行为和异常回滚设置与上述更新为申请退票状态的方法类似,确保更新订单状态为同意退票操作的事务一致性。 + * 调用OrderMapper的`updateOrderStateToRefunded`方法,依据传入的订单唯一标识(order_id)在数据库里定位到相应订单记录,把其订单状态字段更新为表示同意退票的值(按照业务逻辑中定义的相应状态值来更新),同样根据更新操作结果返回受影响的行数,用于判断订单状态更新为同意退票这一操作是否成功执行。 + * @param order_id 要更新状态为同意退票的订单的唯一标识 + * @return 返回一个`Integer`类型的值,表示更新操作影响的行数,可用于判断更新是否成功 + */ + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + @Override + public Integer updateOrderStateToRefunded(String order_id) { + return this.orderMapper.updateOrderStateToRefunded(order_id); + } + + /** + * 分页查询指定用户名的订单信息的方法。 + * 该方法设置为事务性且只读,事务传播行为为`Propagation.REQUIRED`。 + * 首先通过`PageHelper.startPage(page, limit)`设置分页参数,然后通过OrderMapper的`findOrdersByUserName`方法获取指定用户名的订单列表,接着遍历该列表,为每个订单对象设置关联的用户、场次、放映厅、电影院以及电影等信息,最后将设置好关联信息的订单列表封装到`PageInfo`对象中,`PageInfo`对象包含了分页相关的各种信息(如总记录数、总页数、当前页数据等),便于在前端展示分页效果以及进行相关分页操作的处理,然后返回这个`PageInfo`对象。 + * @param page 当前页码,用于指定要获取的是第几页数据 + * @param limit 每页显示的记录条数,用于限制每页的数据量 + * @param user_name 要查询其订单的用户名 + * @return 返回一个`PageInfo`对象,包含了分页后的指定用户名的订单信息以及分页相关的详细数据 + */ + @Transactional(propagation = Propagation.REQUIRED, readOnly = true) + @Override + public PageInfo findOrdersByUserName(Integer page, Integer limit, String user_name) { + PageHelper.startPage(page, limit); + List list = this.orderMapper.findOrdersByUserName(user_name); + for (Order order : list) { + order.setOrder_user(this.userMapper.findUserById(order.getUser_id())); + Schedule schedule = this.scheduleMapper.findScheduleById(order.getSchedule_id()); + Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); + hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); + schedule.setSchedule_hall(hall); + schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); + order.setOrder_schedule(schedule); + } + PageInfo info = new PageInfo(list); + return info; + } + + /** + * 查询数据库中所有订单信息的方法。 + * 同样是事务性且只读的方法,事务传播行为为`Propagation.REQUIRED`。 + * 首先通过OrderMapper的`findAllOrders`方法获取所有订单的基本信息列表,然后遍历该列表,为每个订单对象设置关联的用户、场次、放映厅、电影院以及电影等信息,最后返回包含完整关联信息的所有订单列表,方便获取整体的订单及其关联详情情况,例如用于订单数据统计、管理等业务场景。 + * @return 返回一个包含所有`Order`对象的`List`集合,每个对象代表一条订单记录信息,且其中包含了关联的用户、场次、放映厅、电影院以及电影等详细信息 + */ + @Transactional(propagation = Propagation.REQUIRED, readOnly = true) + @Override + public List findAllOrders() { + List list = this.orderMapper.findAllOrders(); + for (Order order : list) { + order.setOrder_user(this.userMapper.findUserById(order.getUser_id())); + Schedule schedule = this.scheduleMapper.findScheduleById(order.getSchedule_id()); + Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); + hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); + schedule.setSchedule_hall(hall); + schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); + order.setOrder_schedule(schedule); + } + return list; + } + + /** + * 分页查询符合指定状态的订单信息的方法。 + * 该方法设置为事务性且只读,事务传播行为为`Propagation.REQUIRED`。 + * 先通过`PageHelper.startPage(page, limit)`设置分页参数,然后通过OrderMapper的`findOrdersByState`方法获取符合指定状态的订单列表,接着遍历该列表,为每个订单对象设置关联的用户、场次、放映厅、电影院以及电影等信息,最后将设置好关联信息的订单列表封装到`PageInfo`对象中返回,便于前端根据状态展示分页的订单列表以及进行相关操作,例如按不同订单状态统计订单数量等业务场景。 + * @param page 当前页码,用于指定要获取的是第几页数据 + * @param limit 每页显示的记录条数,用于限制每页的数据量 + * @param order_state 表示订单状态的整数,用于筛选符合该状态的订单记录 + * @return 返回一个`PageInfo`对象,包含了分页后的符合指定状态的订单信息以及分页相关的详细数据 + */ + @Transactional(propagation = Propagation.REQUIRED, readOnly = true) + @Override + public PageInfo findOrdersByState(Integer page, Integer limit, int order_state) { + PageHelper.startPage(page, limit); + List list = this.orderMapper.findOrdersByState(order_state); + for (Order order : list) { + order.setOrder_user(this.userMapper.findUserById(order.getUser_id())); + Schedule schedule = this.scheduleMapper.findScheduleById(order.getSchedule_id()); + Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); + hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); + schedule.setSchedule_hall(hall); + schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); + order.setOrder_schedule(schedule); + } + PageInfo info = new PageInfo(list); + return info; + } + + /** + * 分页查询所有订单信息的方法,支持根据关键词筛选订单(如果关键词不为空,则按用户名模糊查询订单)。 + * 同样是事务性且只读的方法,事务传播行为为`Propagation.REQUIRED`。 + * 首先通过`PageHelper.startPage(page, limit)`设置分页参数,然后根据关键词情况决定查询逻辑:如果关键词不为空且去除空格后不为空字符串,就通过OrderMapper的`findOrdersByUserName`方法按用户名进行模糊查询获取订单列表;否则直接通过`findAllOrders`方法获取所有订单列表。接着遍历获取到的订单列表,为每个订单对象设置关联的用户、场次、放映厅、电影院以及电影等信息,最后将设置好关联信息的订单列表封装到`PageInfo`对象中返回,便于前端展示分页的订单列表以及进行相关操作,例如订单搜索功能实现等业务场景。 + * @param page 当前页码,用于指定要获取的是第几页数据 + * @param limit 每页显示的记录条数,用于限制每页的数据量 + * @param keyword 关键词,用于按用户名模糊查询订单,如果为`null`或者空字符串则查询全部订单 + * @return 返回一个`PageInfo`对象,包含了分页后的订单信息以及 \ No newline at end of file