package com.happy.action; import com.baidubce.model.User; import com.happy.Model.*; import com.happy.Model.weixin.Users; import com.happy.Until.*; import com.happy.Until.Enum.TempEnum; import com.happy.Until.Excel.toExcel; import com.happy.common.http.Message; import com.happy.dto.BookTypeEto; import com.happy.dto.IPage; import com.happy.service.*; import com.opensymphony.xwork2.ActionSupport; import net.sf.json.JSONObject; import org.apache.struts2.ServletActionContext; import org.apache.struts2.interceptor.ServletRequestAware; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.text.ParseException; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; public class bookAction extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; public HttpServletResponse response; @Resource public BookService bookService; @Resource public UserService userService; @Resource public HotelDictService hotelDictService; @Resource public AdminManagerService adminManagerService; @Resource public HouseNumberStatusService houseNumberStatusService; @Resource public HouseNumberService houseNumberService; public int page; // 当前页 public int rows;// 每页显示的行数rows public Integer id; public Integer type; public String orderStatus;//订单状态 public String managerId;//商户Id public String payStartTime;//支付开始时间 public String payEndTime;//支付结束时间 public String ledgerParam;//台账列表查询参数 public String hotelTownship;//所属乡镇 public String minTotalPrice;//最小订单总价 public String maxTotalPrice;//最大订单总价 public String houseNumberIds; // 房间号ids public HttpServletRequest getRequest() { return request; } public void setRequest(HttpServletRequest request) { this.request = request; } public void setServletRequest(HttpServletRequest request) { this.request = request; } public HttpServletResponse getResponse() { return response; } public void setResponse(HttpServletResponse response) { this.response = response; } /** * 描述:修改订单状态接单、入住、退房 * @return */ public String updateBookStatus(){ JSONObject resultJson = new JSONObject(); if (id == null) { resultJson.put("message", "请传入订单id"); resultJson.put("code", 500); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } //根据id获取当前订单信息 Booking book = bookService.getById(id); if(book==null){ resultJson.put("message", "未查询到订单"); resultJson.put("code", 500); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } //获取用户openId Users user = userService.queryByUserId(book.getCreateUserid()); if(user.getOpenid()==null){ resultJson.put("message", "用户openId为空,请该订单用户授权才能操作。"); resultJson.put("code", 502); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } String msg = ""; String sendMsg = ""; try{ switch (type){ case 1://接单 if(!"2".equals(book.getOrderStatus())){ resultJson.put("message", "已支付状态才能接单"); resultJson.put("code", 502); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } book.setOrderStatus("3"); book.setUpdateTime(UUIDUtil.getNewDate()); msg = "接单"; sendMsg = "商家已接单"; //验证民宿房态表 List houseNumbers = houseNumberService.queryHouseStatus(book); List houseNumberList = houseNumberService.queryByHouseId(book.getHouseId()); List Ids = new ArrayList<>(); AtomicInteger i = new AtomicInteger(); if (houseNumbers != null){ // houseNumberList.forEach(houseNumber -> { // //添加的房间不在不可添加的房间当中并且数量小于订房总数 // // }); List houseStrs = houseNumbers.stream().map(HouseNumber::getId).collect(Collectors.toList()); for (HouseNumber houseNumber: houseNumberList) { if (!houseStrs.contains(houseNumber.getId()) && i.get() < book.getHouseOrderNumber()){ Ids.add(houseNumber.getId()); i.getAndIncrement(); } } }else { //所有房间都可以预定 houseNumberList.forEach(houseNumber -> { //添加的房间不在不可添加的房间当中并且数量小于订房总数 if (i.get() < book.getHouseOrderNumber()){ Ids.add(houseNumber.getId()); i.getAndIncrement(); } }); } //添加民宿房态表 List list = handleHouseStatus(Ids, 5, book); int m = houseNumberStatusService.saveBatch(list); if (m == 0){ resultJson.put("message", "确认失败"); resultJson.put("code", 502); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } break; case 2://入住 if(!"3".equals(book.getOrderStatus())){ resultJson.put("message", "待入住状态才能办理入住"); resultJson.put("code", 502); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } if(houseNumberIds == null || "".equals(houseNumberIds)){ resultJson.put("message", "请分配房间号"); resultJson.put("code", 502); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } List ids = Arrays.asList(houseNumberIds.split(",")); if(book.getHouseOrderNumber() != ids.size()){ resultJson.put("message", "房间数不一致"); resultJson.put("code", 502); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } List houseNumbers1 = houseNumberService.queryHouseStatus(book); if (houseNumbers1!=null){ for (String id: ids){ for (HouseNumber houseNumber: houseNumbers1){ if (houseNumber.getStatus() != null && houseNumber.getStatus()==3 && id.equals(houseNumber.getId())){ resultJson.put("message", "选择的房间该时间段已有预定!请重新选择房间!"); resultJson.put("code", 502); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } } } } //删除 预定房态 int a = houseNumberStatusService.updateHouseNumberStatus(String.valueOf(id)); if (a == 0){ resultJson.put("message", "确认失败"); resultJson.put("code", 502); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } //写入 入住数据 List list1 = handleHouseStatus(ids, 6, book); int n = houseNumberStatusService.saveBatch(list1); if (n == 0){ resultJson.put("message", "确认失败"); resultJson.put("code", 502); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } book.setOrderStatus("4"); book.setLiveTime(UUIDUtil.getNewDate()); book.setUpdateTime(UUIDUtil.getNewDate()); userService.addhotelAndUsers(book.getHotelId(),book.getCreateUserid(), TempEnum.住过); // 办理入住,则将信息写入用户入住过的酒店 editor by xieli msg = "入住办理"; break; case 3://退房 if(!"4".equals(book.getOrderStatus())){ resultJson.put("message", "已入住状态才能办理退房"); resultJson.put("code", 502); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } //房态删除 String sql = " and booking_id = " + id; List houseNumberStatuse = houseNumberStatusService.getList(sql); int i1 = houseNumberStatusService.updateHouseNumberStatus(String.valueOf(id)); if (i1 == 0){ resultJson.put("message", "退房失败"); resultJson.put("code", 502); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } //房间设为脏房 String numberIds = houseNumberStatuse.stream().map(HouseNumberStatus::getNumberId).distinct().collect(Collectors.joining()); int i2 = houseNumberService.updateHouseStatus(numberIds); if (i2 == 0){ resultJson.put("message", "退房失败"); resultJson.put("code", 502); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } book.setCheckOutTime(UUIDUtil.getNewDate());//退房时间 book.setUpdateTime(UUIDUtil.getNewDate()); book.setOrderStatus("5"); msg = "退房"; break; // case 4://退单 // if(!"2".equals(book.getOrderStatus())){ // resultJson.put("message", "已支付状态才能退单"); // resultJson.put("code", 502); // ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); // return null; // } // book.setOrderStatus("8"); // book.setUpdateTime(UUIDUtil.getNewDate()); // msg = "退单"; // sendMsg = "商家已退单"; // break; } int m = bookService.updateBooking(book); if (m > 0) { //推送信息 if(!"".equals(sendMsg)){ String liveTime = book.getOrderStartTime()!=null ? book.getOrderStartTime().substring(0,10):""; String endTime = book.getOrderEndTime()!=null ? book.getOrderEndTime().substring(0,10):""; String errmsg = Message.wxErrorMsg(Message.send(user.getOpenid(),book.getHotelName(),book.getOrderStatus(),liveTime,endTime,book.getHouseName())); if("请求成功".equals(errmsg)){ resultJson.put("message", msg+"成功"); resultJson.put("code", 200); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } //resultJson.put("message", msg+"成功"+",推送消息失败,原因:"+errmsg); resultJson.put("message", "接单成功,因用户未订阅小程序消息,无法推送消息,请通过电话或者短信通知旅客!"); resultJson.put("code", 500); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } resultJson.put("message", msg+"成功"); resultJson.put("code", 200); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } else { resultJson.put("message", msg+"失败"); resultJson.put("code", 502); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } }catch (Exception e){ e.printStackTrace(); } resultJson.put("message", "未知异常"); resultJson.put("code", 205); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } /** * 根据传入传入房间号写入状态 */ private List handleHouseStatus(List Ids,int status,Booking book) throws ParseException { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime str = LocalDateTime.parse(book.getOrderStartTime(), inputFormatter); LocalDateTime end = LocalDateTime.parse(book.getOrderEndTime(), inputFormatter); String a = str.format(formatter); String B = end.format(formatter); LocalDate strDate = LocalDate.parse(a, formatter); LocalDate endDate = LocalDate.parse(B, formatter); List list = new ArrayList<>(); Date now = DateUtil.formateDate(DateUtil.getCurrentDate(), DateUtil.Time_Formatter_Second); for (String number : Ids){ for (LocalDate date = strDate;!date.isAfter(endDate.minusDays(1));date = date.plusDays(1)){ HouseNumberStatus houseNumberStatus = new HouseNumberStatus(); houseNumberStatus.setNumberId(number); houseNumberStatus.setId(String.valueOf(UUID.randomUUID())); houseNumberStatus.setCreateDate(now); houseNumberStatus.setModifyDate(now); houseNumberStatus.setRemark(""); houseNumberStatus.setBookingId(String.valueOf(book.getId())); houseNumberStatus.setSetDate(date.format(formatter)); houseNumberStatus.setStatus(status);//状态(0删除 1.正常 2.关房 3.脏房 4.净房 5.预定 6.入住) list.add(houseNumberStatus); } } return list; } /** * 描述:分页查询订单 * @return */ public String quearyBookPage(){ JSONObject resultJson = new JSONObject(); StringBuilder s1 = new StringBuilder(""); if(managerId!=null){ s1.append(" and hotel_manager_id = '").append(managerId).append("'"); } if (ledgerParam!=null){ s1.append(" and (order_num like '%").append(ledgerParam).append("%'") .append(" or user_name like '%").append(ledgerParam).append("%'") .append(" or user_phone like '%").append(ledgerParam).append("%')"); } if(orderStatus!=null){ s1.append(" and order_status = ").append(orderStatus); } if(payStartTime!=null && payEndTime!=null){ s1.append(" and DATE_FORMAT(pay_time,'%Y-%m-%d') >= '").append(payStartTime).append("'") .append(" and DATE_FORMAT(pay_time,'%Y-%m-%d') <= '").append(payEndTime).append("'"); } IPage bookIPage = bookService.queryPage(s1.toString(),page,rows,"create_time"); //获取订单汇总信息 BookTypeEto bookTypeEto = bookService.getBookStatusSum(s1.toString()); bookTypeEto.setSumAccount(new BigDecimal(bookTypeEto.getSumAccount()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()); bookTypeEto.setBookIPage(bookIPage); if(bookTypeEto!=null && !"".equals(bookTypeEto)){ resultJson.put("message", "查询分页成功"); resultJson.put("code", 200); resultJson.put("data", bookTypeEto); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); }else{ resultJson.put("message", "查询分页失败"); resultJson.put("code", 500); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); } return null; } /** * 描述:导出订单 * @return */ public String toBookExcel() { JSONObject resultJson = new JSONObject(); StringBuilder s1 = new StringBuilder(""); s1.append(" and hotel_manager_id = '").append(managerId).append("'"); if(managerId==null){ resultJson.put("code", 500); resultJson.put("message", "managerId禁止为空"); ResponseUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); } if (ledgerParam!=null){ s1.append(" and (order_num like '%").append(ledgerParam).append("%'") .append(" or user_name like '%").append(ledgerParam).append("%'") .append(" or user_phone like '%").append(ledgerParam).append("%')"); } if(orderStatus!=null){ s1.append(" and order_status = ").append(orderStatus); } if(payStartTime!=null && payEndTime!=null){ s1.append(" and DATE_FORMAT(pay_time,'%Y-%m-%d') >= '").append(payStartTime).append("'") .append(" and DATE_FORMAT(pay_time,'%Y-%m-%d') <= '").append(payEndTime).append("'"); } List list = bookService.queryList(s1.toString()); // 查询分页 List vectorsList = new ArrayList<>(); if(list==null){ resultJson.put("code", 500); resultJson.put("message", "无数据无法导出"); ResponseUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); } for(Booking book:list){ Vector columnValue = new Vector(); columnValue.add(book.getOrderNum()); columnValue.add(book.getOrderName()); columnValue.add(book.getUserName());//用户名称 columnValue.add(book.getUserPhone());//用户电话 columnValue.add(book.getHouseName());//房型名称 columnValue.add(book.getHouseOrderNumber());//订房数量 columnValue.add(book.getHouseTotalPrice());//总价 columnValue.add(book.getPayTime()); vectorsList.add(columnValue); } // 项目路径地址 String path = request.getSession().getServletContext() .getRealPath("/download/");// File.separator try{ Vector columnName = new Vector(); columnName.add("订单号"); columnName.add("状态"); columnName.add("预定人"); columnName.add("手机号"); columnName.add("预定房型"); columnName.add("房间数"); columnName.add("订单金额(元)"); columnName.add("支付时间"); String filePathName ="订单信息" + UUIDUtil.generateID() +"Report.xls"; // 导出文件 new toExcel().book(vectorsList, path + filePathName, "sheet1", columnName); String url = "https://chtech.ncjti.edu.cn/hotelReservation/mhotel"; resultJson.put("downurl", url + "/download/" + filePathName); resultJson.put("code", 200); resultJson.put("message", "导出成功"); ResponseUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); } catch (Exception e){ e.printStackTrace(); } return null; } /** * 描述:分页查询台账(查询以消费订单数据) * @return */ public String quearyLedgerPage(){ JSONObject resultJson = new JSONObject(); StringBuilder s1 = new StringBuilder(""); s1.append(" and order_status = 5"); if(managerId!=null){ s1.append(" and hotel_manager_id = '").append(managerId).append("'"); } if (ledgerParam!=null){ s1.append(" and (order_num like '%").append(ledgerParam).append("%'") .append(" or user_name like '%").append(ledgerParam).append("%'") .append(" or user_phone like '%").append(ledgerParam).append("%')"); } if(payStartTime!=null && payEndTime!=null){ s1.append(" and DATE_FORMAT(pay_time,'%Y-%m-%d') >= '").append(payStartTime).append("'") .append(" and DATE_FORMAT(pay_time,'%Y-%m-%d') <= '").append(payEndTime).append("'"); } if(hotelTownship!=null){ s1.append(" and hotel_township = '").append(hotelTownship).append("'"); } if(minTotalPrice!=null){ s1.append(" and house_total_price >= '").append(minTotalPrice).append("'"); } if(maxTotalPrice!=null){ s1.append(" and house_total_price <= '").append(maxTotalPrice).append("'"); } IPage bookIPage = bookService.queryPage(s1.toString(),page,rows, "check_out_time"); //获取订单汇总信息 BookTypeEto bookTypeEto = bookService.getBookStatusSum(s1.toString()); bookTypeEto.setBookIPage(bookIPage); if(bookTypeEto!=null && !"".equals(bookTypeEto)){ resultJson.put("message", "查询分页成功"); resultJson.put("code", 200); resultJson.put("data", bookTypeEto); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); }else{ resultJson.put("message", "查询分页失败"); resultJson.put("code", 500); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); } return null; } /** * 描述:根据Id查询订单详细 * @return */ public String getById(){ JSONObject resultJson = new JSONObject(); if (id == null) { resultJson.put("message", "请传入id"); resultJson.put("code", 500); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } Booking book = bookService.getById(id); List houseNumbers = houseNumberService.queryHouseStatus(book); book.setHouseNumbers(houseNumbers); if (book != null) { resultJson.put("message", "查询成功"); resultJson.put("code", 200); resultJson.put("data", book); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; }else{ resultJson.put("message", "未查到用户信息"); resultJson.put("code", 500); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } } /** * 描述:导出台账 * @return */ public String toLedgerExcel() { JSONObject resultJson = new JSONObject(); StringBuilder s1 = new StringBuilder(""); s1.append(" and order_status = 5"); s1.append(" and hotel_manager_id = '").append(managerId).append("'"); if (ledgerParam!=null){ s1.append(" and (order_num like '%").append(ledgerParam).append("%'") .append(" or user_name like '%").append(ledgerParam).append("%'") .append(" or user_phone like '%").append(ledgerParam).append("%')"); } if(payStartTime!=null && payEndTime!=null){ s1.append(" and DATE_FORMAT(pay_time,'%Y-%m-%d') >= '").append(payStartTime).append("'") .append(" and DATE_FORMAT(pay_time,'%Y-%m-%d') <= '").append(payEndTime).append("'"); } if(hotelTownship!=null){ s1.append(" and hotel_township = '").append(payStartTime).append("'"); } if(minTotalPrice!=null){ s1.append(" and house_total_price >= '").append(minTotalPrice).append("'"); } if(maxTotalPrice!=null){ s1.append(" and house_total_price <= '").append(maxTotalPrice).append("'"); } List list = bookService.queryList(s1.toString()); // 查询列表 if(list==null){ resultJson.put("code", 500); resultJson.put("message", "无数据无法导出"); ResponseUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); } List vectorsList = new ArrayList<>(); for(Booking book:list){ Vector columnValue = new Vector(); columnValue.add(book.getOrderNum()); columnValue.add(book.getUserName()); columnValue.add(book.getUserPhone()); columnValue.add(book.getHouseOrderNumber()); columnValue.add(book.getPayAccount()); columnValue.add(book.getPayTime()); vectorsList.add(columnValue); } // 项目路径地址 String path = request.getSession().getServletContext() .getRealPath("/download/");;// File.separator try{ Vector columnName = new Vector(); columnName.add("订单号"); columnName.add("预定人"); columnName.add("手机号"); columnName.add("房间数"); columnName.add("订单金额"); columnName.add("退房时间"); String filePathName ="台账信息" + UUIDUtil.generateID() +"Report.xls"; // 导出文件 new toExcel().book(vectorsList, path + filePathName, "sheet1", columnName); String url = "https://chtech.ncjti.edu.cn/hotelReservation/mhotel"; resultJson.put("downurl", url + "/download/" + filePathName); resultJson.put("code", 200); resultJson.put("message", "导出成功"); ResponseUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); } catch (Exception e){ e.printStackTrace(); } return null; } /** * 描述:导出台账 管理端 * @return */ public String toLedgerAdmimnExcel() { JSONObject resultJson = new JSONObject(); StringBuilder s1 = new StringBuilder(""); s1.append(" and order_status = 5"); if (ledgerParam!=null){ s1.append(" and (order_num like '%").append(ledgerParam).append("%'") .append(" or user_name like '%").append(ledgerParam).append("%'") .append(" or user_phone like '%").append(ledgerParam).append("%')"); } if(payStartTime!=null && payEndTime!=null){ s1.append(" and DATE_FORMAT(pay_time,'%Y-%m-%d') >= '").append(payStartTime).append("'") .append(" and DATE_FORMAT(pay_time,'%Y-%m-%d') <= '").append(payEndTime).append("'"); } if(hotelTownship!=null){ s1.append(" and hotel_township = '").append(payStartTime).append("'"); } if(minTotalPrice!=null){ s1.append(" and house_total_price >= '").append(minTotalPrice).append("'"); } if(maxTotalPrice!=null){ s1.append(" and house_total_price <= '").append(maxTotalPrice).append("'"); } List list = bookService.queryList(s1.toString()); // 查询列表 List hotelDicts = hotelDictService.queryList("and code = 10"); Map dictMap = null; if(hotelDicts!=null && hotelDicts.size()>0){ dictMap = hotelDicts.stream().collect(Collectors.toMap(HotelDict::getId, HotelDict::getName, (key1, key2) -> key1 )); }else{ resultJson.put("message", "未查到民宿乡镇信息"); resultJson.put("code", 500); ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); return null; } List vectorsList = new ArrayList<>(); for(Booking book:list){ Vector columnValue = new Vector(); AdminManager adminManager = adminManagerService.getById(book.getHotelManagerId()); if(adminManager!=null){ columnValue.add(dictMap.get(Integer.valueOf(adminManager.getHotelTownship())));//所属乡镇 columnValue.add(adminManager.getHotelName());//乡宿名称 }else{ columnValue.add("");//所属乡镇 columnValue.add("");//乡宿名称 } columnValue.add(book.getOrderNum());//订单号 columnValue.add(book.getPayAccount());//订单金额 columnValue.add(book.getPayTime());//退房时间 vectorsList.add(columnValue); } // 项目路径地址 String path = request.getSession().getServletContext() .getRealPath("/download/");// File.separator try{ Vector columnName = new Vector(); columnName.add("所属乡镇"); columnName.add("民宿名称"); columnName.add("订单号"); columnName.add("订单金额(元)"); columnName.add("退房时间"); String filePathName ="台账信息" + UUIDUtil.generateID() +"Report.xls"; // 导出文件 new toExcel().book(vectorsList, path + filePathName, "sheet1", columnName); String url = "https://chtech.ncjti.edu.cn/hotelReservation/mhotel"; resultJson.put("downurl", url + "/download/" + filePathName); resultJson.put("code", 200); resultJson.put("message", "导出成功"); ResponseUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString()); } catch (Exception e){ e.printStackTrace(); } return null; } /** * 定时任务 */ public void setBookStatus(){ int i = bookService.updateBookStatus(); } }