SSM框架之酒店管理系统十五(B端预定管理)
如果还没有
订单管理
就要到后台添加对应的菜单信息和预定管理的跳转路径
1、在SystemController
控制器中添加去到预定管理的控制器
/**
* 去到预定管理页面
* @return
*/
@RequestMapping("/toOrdersManager")
public String toOrdersManager(){
return "admin/orders/ordersManager";
}
前提是需要在
webapp.WEB-INF.js.admin.orders
文件下有ordersManager.jsp
页面,否则是跳转不了的
2、预订管理查询
-
创建分页查询的预订VO类
public class OrdersVo extends Orders { /** * 当前页码 */ private Integer page; /** * 每页显示数量 */ private Integer limit; /** * 开始日期 */ @DateTimeFormat(pattern = "yyyy-MM-dd") private Date startDate; /** * 结束日期 */ @DateTimeFormat(pattern = "yyyy-MM-dd") private Date endDate; }
-
修改Orders实体类
目前修改了字段的属性大写了,需要修改用户提交信息的表单name值,否则回接收不到数据,或者是不修改实体,都可以
package com.zcl.entity; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; @Data @ToString public class Orders { private Integer id;//订单主键 private String orderSno;//订单号 private Integer accountId;//用户id private Integer roomTypeId;//房型ID private Integer roomId;//房间ID private String reservationName;//预订人姓名 private String idCard;//身份证号码 private String phone;//电话 private Integer status;//订单状态 1-待确认 2-已确认 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date reserveDate;//预订时间 @DateTimeFormat(pattern = "yyyy-MM-dd") private Date arriveDate;//入住时间 @DateTimeFormat(pattern = "yyyy-MM-dd") private Date leaveDate;//离店时间 private Double reservePrice;//预订房价 private String remark;//备注 //房间对象 private String roomNum; //房型对象 private String typeName; }
同时也需要修改搜索区域的nane值
-
OrdersMapper
package com.zcl.dao; import com.zcl.entity.Orders; import com.zcl.entity.vo.OrdersVo; import java.util.List; /** * 项目名称:ssm_hotel * 描述:预订表持久层 * * @author zhong * @date 2022-05-22 12:19 */ public interface OrdersMapper { /** * 分页查询预订订单列表 * @param vo * @return */ List<Orders> findOrdersList(OrdersVo vo); /** * 添加预订信息 * @param orders * @return */ int addOrders(Orders orders); }
映射文件
<?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.zcl.dao.OrdersMapper"> <!--分页查询预订信息列表--> <select id="findOrdersList" resultType="com.zcl.entity.Orders"> select o.*,r.`roomNum`,t.`typeName` from t_orders o inner join t_room r on r.id = o.`roomId` inner join t_room_type t on t.id = r.`roomTypeId` <where> <if test="reservationName!=null and reservationName!=''"> and o.reservationName like concat('%',#{reservationName},'%') </if> <if test="idCard!=null and idCard!=''"> and o.idCard like concat('%',#{idCard},'%') </if> <if test="phone!=null and phone!=''"> and o.phone like concat('%',#{phone},'%') </if> <if test="roomTypeId!=null"> and o.roomTypeId = #{roomTypeId} </if> <if test="status!=null"> and o.status = #{status} </if> <if test="startDate!=null"> <![CDATA[ and o.reserveDate >= #{startDate} ]]> </if> <if test="endDate!=null"> <![CDATA[ and o.reserveDate <= #{endDate}]]> </if> </where> </select> <!--添加预订信息--> <insert id="addOrders"> insert into t_orders (ordersNo, accountId, roomTypeId, roomId, reservationName, idCard, phone, status, reserveDate, arriveDate, leaveDate, reservePrice, remark) values ( #{orderSno}, #{accountId}, #{roomTypeId}, #{roomId}, #{reservationName}, #{idCard}, #{phone}, #{status} , #{reserveDate}, #{arriveDate} , #{leaveDate}, #{reservePrice}, #{remark}); </insert> </mapper>
上面的映射文件同时也包含了用户预订时插入的数据
-
OrdersService
package com.zcl.service; import com.zcl.entity.Orders; import com.zcl.entity.vo.OrdersVo; import java.util.List; /** * 项目名称:ssm_hotel * 描述:预订业务层 * * @author zhong * @date 2022-05-22 12:23 */ public interface OrdersService { /** * 分页查询预订订单列表 * @param vo * @return */ List<Orders> findOrdersList(OrdersVo vo); /** * 添加预订信息 * @param orders * @return */ int addOrders(Orders orders); }
接口实现类
package com.zcl.service.impl; import com.zcl.dao.OrdersMapper; import com.zcl.dao.RoomMapper; import com.zcl.dao.RoomTypeMapper; import com.zcl.entity.Orders; import com.zcl.entity.Room; import com.zcl.entity.RoomType; import com.zcl.entity.vo.OrdersVo; import com.zcl.service.OrdersService; import com.zcl.service.RoomService; import com.zcl.service.RoomTypeService; import com.zcl.utils.UUIDUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.Date; import java.util.List; /** * 项目名称:ssm_hotel * 描述: * * @author zhong * @date 2022-05-22 12:24 */ @Service @Transactional public class OrdersServiceImpl implements OrdersService { /** * 注入持久层 */ @Resource OrdersMapper ordersMapper; /** * 注入房间业务层 */ @Resource RoomMapper roomMapper; /** * 注入房间类型业务层 */ @Resource RoomTypeMapper roomTypeMapper; /** * 分页查询预订订单列表 * @param vo * @return */ public List<Orders> findOrdersList(OrdersVo vo) { System.out.println("业务员层在执行查询"); return ordersMapper.findOrdersList(vo); } /** * 添加预订信息,添加了运行时异常就回滚 * @param orders * @return */ @Transactional(rollbackFor = RuntimeException.class) public int addOrders(Orders orders) { // 1代表确认 orders.setStatus(1); // 2、订单编号 orders.setOrderSno(UUIDUtils.randomUUID()); // 3、预订时间 orders.setReserveDate(new Date()); int count = ordersMapper.addOrders(orders); // 判断是否修改成功 if(count > 0){ // 修改房间状态(1已预订) Room room = roomMapper.findById(orders.getRoomId()); // 修改房间的状态 room.setStatus(1); // 调用修改房间的方法 roomMapper.updateRoom(room); // 修改房间类型信息【已预订+1,可使用-1】 RoomType roomType = roomTypeMapper.findById(orders.getRoomId()); // 修改可用房间数据量 roomType.setAvilablenum(roomType.getAvilablenum()-1); // 已预订数量 roomType.setReservednum(roomType.getReservednum()+1); // 调用修改方法 roomTypeMapper.updateRoomType(roomType); } return count; } }
-
OrdersAdminController
package com.zcl.controller.admin; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.zcl.entity.Menu; import com.zcl.entity.Orders; import com.zcl.entity.vo.MenuVo; import com.zcl.entity.vo.OrdersVo; import com.zcl.service.OrdersService; import com.zcl.utils.DataGridViewResult; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import java.util.List; /** * 项目名称:ssm_hotel * 描述:预订管理控制器 * * @author zhong * @date 2022-05-22 19:26 */ @RestController @RequestMapping("/admin/orders") public class OrdersAdminController { @Resource OrdersService ordersService; /** * 查询订单列表 * @param ordersVo * @return */ @ResponseBody @RequestMapping("/list") public DataGridViewResult list(OrdersVo ordersVo){ //设置分页信息 PageHelper.startPage(ordersVo.getPage(),ordersVo.getLimit()); //调用分页查询订单列表的方法 List<Orders> ordersList = ordersService.findOrdersList(ordersVo); for (Orders orders : ordersList) { System.out.println("查询的预订数据:"+orders); } //创建分页对象 PageInfo<Orders> pageInfo = new PageInfo<Orders>(ordersList); //返回数据 return new DataGridViewResult(pageInfo.getTotal(),pageInfo.getList()); } }
-
前端页面接口编写
需要注意的时,layui接接口对应的是属性字段
3、确认订单
-
OrdersMapper
/** * 确认订单 * @param orders * @return */ int updateOrders(Orders orders);
映射文件
<!--确认订单--> <update id="updateOrders"> update t_orders <set> <if test="orderSno != null"> ordersNo = #{orderSno}, </if> <if test="accountId != null"> accountId = #{accountId}, </if> <if test="roomTypeId != null"> roomTypeId = #{roomTypeId}, </if> <if test="roomId != null"> roomId = #{roomId}, </if> <if test="reservationName != null"> reservationName = #{reservationName}, </if> <if test="idCard != null"> idCard = #{idCard}, </if> <if test="phone != null"> phone = #{phone}, </if> <if test="status != null"> status = #{status}, </if> <if test="reserveDate != null"> reserveDate = #{reserveDate}, </if> <if test="arriveDate != null"> arriveDate = #{arriveDate}, </if> <if test="leaveDate != null"> leaveDate = #{leaveDate}, </if> <if test="reservePrice != null"> reservePrice = #{reservePrice}, </if> <if test="remark != null"> remark = #{remark}, </if> </set> where id = #{id} </update>
-
OrdersService实现类
/** * 确认订单信息 * @param orders * @return */ public int updateOrders(Orders orders) { return ordersMapper.updateOrders(orders); }
-
OrdersController
/** * 确认入住 * @param orders * @return */ @RequestMapping("/confirmOrders") public String confirmOrders(Orders orders){ HashMap<String, Object> map = new HashMap<String, Object>(); // 修改订单的状态 orders.setStatus(2); // 调用修改的方法 if(ordersService.updateOrders(orders) > 0){ map.put(SystemConstant.SUCCESS,true); map.put(SystemConstant.MESSAGES,"订单确认成功"); }else{ map.put(SystemConstant.SUCCESS,false); map.put(SystemConstant.MESSAGES,"订单确认失败"); } return JSON.toJSONString(map); }
-
前端页面请求
// 预订确认事件 function confirmOrders(data) { // 判断当前的状态 if(data.status ==1){ // 发送请求 $.post("/admin/orders/confirmOrders",{"id":data.id},function (result) { if(result.succser){ // 刷新表格数据 tableIns.reload(); } layer.msg(result.messages); },"json"); }else { layer.msg("该订单已确认,无需重复操作"); } }
-
批量确认订单
-
前端页面请求获取复选框的数据
// 批量监听事件 function barchConfim() { // 获取选中行 var checkStatus = table.checkStatus('currentTableId'); //idTest 即为基础参数 id 对应的值 //获取选中行数量,可作为是否有选中行的条件 var lengths = checkStatus.data.length; if( lengths > 0){ // 判断包含或与入住的 for (var i = 0; i < lengths; i++) { if(checkStatus.data[i].status != 1){ layer.alert("只能批量待确认的订单"); return; } } // 提示用户是否确认 layer.confirm("确定要批量确认这些订单吗",{icon:3,title:"提示"},function (index) { // 获取选中行的数据 var data = checkStatus.data; // 声明数组存储批量确认的id var idsArr = []; // 循环获取到待确认的id for (var i = 0; i < lengths; i++) { // 将选中行的id放到数组中 idsArr.push(data[i].id); } // 将数组转换层字符串 var ids = idsArr.join(","); // 发送请求 $.post("/admin/orders/barchConfim",{"ids":ids},function (result) { if(result.succser){ // 刷新表格数据 tableIns.reload(); } layer.msg(result.messages); },"json"); }); }else { layer.msg("请选择需要确认的订单"); } }
-
OrdersAdminController控制器
因为前面点击确认请求时,已经完成了持久层和业务层的创建,所以在控制器中直接调用数据修改就可以了的
/** * 批量确认入住 * @param ids * @return */ @RequestMapping("/barchConfim") public String barchConfim(String ids){ HashMap<String, Object> map = new HashMap<String, Object>(); int count = 0; // 将字符串拆分成数组 String[] idsStr = ids.split(","); // 循环确认 for (int i = 0; i < idsStr.length; i++) { // 创建对象【修改状态和查询条件】 Orders orders = new Orders(); orders.setId(Integer.valueOf(idsStr[i])); orders.setStatus(2); // 调用修改方法 count = ordersService.updateOrders(orders); // 判断受影响的行数 if(count > 0){ map.put(SystemConstant.SUCCESS,true); map.put(SystemConstant.MESSAGES,"订单确认成功"); } } if(count <= 0){ map.put(SystemConstant.SUCCESS,false); map.put(SystemConstant.MESSAGES,"订单确认失败"); } return JSON.toJSONString(map); }
-