package com.mgm.mcrm.reservation.services; import java.util.*; import java.time.LocalDateTime; import java.time.ZoneId; import com.alibaba.fastjson.JSON; import com.mgm.mcrm.admin.repositories.SysUserDao; import com.mgm.mcrm.admin.services.SysGroupService; import com.mgm.mcrm.admin.services.SysSettingService; import com.mgm.mcrm.allotment.repositories.AppChannelDao; import com.mgm.mcrm.allotment.repositories.RoomCriteriaDao; import com.mgm.mcrm.basesetting.daylight.models.CfgBlocks; import com.mgm.mcrm.basesetting.daylight.models.CfgItemInventory; import com.mgm.mcrm.basesetting.daylight.models.CfgDaylightView; import com.mgm.mcrm.basesetting.daylight.models.CfgTiers; import com.mgm.mcrm.basesetting.daylight.repositories.BlockDao; import com.mgm.mcrm.basesetting.daylight.repositories.DaylightViewDao; import com.mgm.mcrm.basesetting.daylight.repositories.ItemInventoryDao; import com.mgm.mcrm.basesetting.daylight.repositories.TierDao; import com.mgm.mcrm.basesetting.opera.models.CfgOperaView; import com.mgm.mcrm.basesetting.opera.repositories.OperaViewDao; import com.mgm.mcrm.basesetting.property.models.CfgProperties; import com.mgm.mcrm.basesetting.property.repositories.PropertyDao; import com.mgm.mcrm.basesetting.property.services.PropertyService; import com.mgm.mcrm.basesetting.room.models.CfgRoomFeatures; import com.mgm.mcrm.basesetting.room.models.CfgRoomTypes; import com.mgm.mcrm.basesetting.room.models.CfgRooms; import com.mgm.mcrm.basesetting.room.repositories.*; import com.mgm.mcrm.basesetting.team.models.CfgSections; import com.mgm.mcrm.basesetting.team.models.CfgTeamStructure; import com.mgm.mcrm.basesetting.team.repositories.AppUserDao; import com.mgm.mcrm.basesetting.team.repositories.SectionDao; import com.mgm.mcrm.basesetting.team.repositories.TeamStructureDao; import com.mgm.mcrm.common.dtos.DataTableResult; import com.mgm.mcrm.common.dtos.QueryFilter; import com.mgm.mcrm.common.dtos.ServiceResult; import com.mgm.mcrm.common.utils.LogUtil; import com.mgm.mcrm.logging.services.SysLogBookingService; import com.mgm.mcrm.reservation.dtos.BookingsDto; import com.mgm.mcrm.reservation.dtos.BookingsViewDto; import com.mgm.mcrm.reservation.dtos.request.BookingGetFollowUpNumRequest; import com.mgm.mcrm.reservation.dtos.request.OtherPropertyPageRequest; import com.mgm.mcrm.reservation.dtos.response.BookingGetFollowUpNumResponse; import com.mgm.mcrm.reservation.mappers.BookingMapper; import com.mgm.mcrm.reservation.models.Bookings; import com.mgm.mcrm.reservation.models.BookingsView; import com.mgm.mcrm.reservation.repositories.BookingDao; import com.mgm.mcrm.reservation.repositories.BookingViewDao; import jakarta.annotation.Resource; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Strings; import org.springframework.beans.BeanUtils; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.auth0.jwt.JWT; import com.mgm.mcrm.common.utils.DaoUtil; import com.mgm.mcrm.common.utils.DateTimeUtil; @Service public class BookingService { @Resource private BookingDao bookingDao; @Resource private BookingViewDao bookingViewDao; @Resource private BlockDao blockDao; @Resource private RoomDao roomDao; @Resource private RoomTypeDao roomTypeDao; @Resource private AppUserDao appUserDao; @Resource private DaylightViewDao daylightViewDao; @Resource private SysUserDao userDao; @Resource private TierDao tierDao; @Resource private ItemInventoryDao itemDao; @Resource private PropertyDao propertyDao; @Resource private SysSettingService sysSettingService; @Resource private AppChannelDao appChannelDao; @Resource private RoomCriteriaDao criteriaDao; @Resource private RoomRoomTypeDao roomRoomTypeDao; @Resource private RoomFeatureDao roomFeatureDao; @Resource private BedTypeMappingDao bedTypeMappingDao; @Resource private PropertyService propertyService; @Resource private SysLogBookingService sysLogBookingService; @Resource private SysGroupService sysGroupService; @Resource private BookingMapper bookingMapper; @Resource private TeamStructureDao teamStructureDao; @Resource private SectionDao sectionDao; @Resource private OperaViewDao operaViewDao; public ServiceResult createBooking(Map param, HttpServletRequest request) { ServiceResult processResult= new ServiceResult(); LocalDateTime createDate = LocalDateTime.now(); Bookings booking = new Bookings(); String playerId = String.valueOf(param.get("playerId")); Long blockId = Long.valueOf(String.valueOf(param.get("blockId"))); Long propertyId = Long.valueOf(String.valueOf(param.get("propertyId"))); Long roomId = Long.valueOf(String.valueOf(param.get("roomId"))); Long roomTypeId = Long.valueOf(String.valueOf(param.get("roomTypeId"))); String special = param.get("specialIds")!=null?String.valueOf(param.get("specialIds")):null; String sharer = param.get("sharer")!=null?String.valueOf(param.get("sharer")):null; String remark = param.get("remark")!=null?String.valueOf(param.get("remark")):null; Boolean isWaitlist = Boolean.valueOf(String.valueOf(param.get("isWaitlist"))); HashMap member = (HashMap)param.get("member"); List operaId = (List)member.get("nameId"); List selectDate = (List)param.get("selectDate"); LocalDateTime checkinDate = DateTimeUtil.getDateFromString(String.valueOf(selectDate.get(0)), "yyyy-MM-dd"); LocalDateTime checkoutDate = DateTimeUtil.getDateFromString(String.valueOf(selectDate.get(1)), "yyyy-MM-dd"); String numOfNight = DateTimeUtil.getDiffDate(checkinDate, checkoutDate, "day"); CfgProperties property = propertyDao.findById(propertyId).orElse(null); CfgBlocks block = blockDao.getById(blockId); CfgRooms room = roomDao.getById(roomId); CfgRoomTypes roomType = roomTypeDao.getById(roomTypeId); CfgTiers tier = tierDao.findByTierName(String.valueOf(member.get("tier"))); CfgItemInventory item = new CfgItemInventory(); if(tier!=null&&blockId!=null&&roomTypeId!=null) { item = itemDao.findByTierIdAndRoomId(Long.valueOf(tier.getId()),roomId); } String oldToken = request.getHeader("Authorization"); // oldToken = oldToken.substring(6); String userId = JWT.decode(oldToken).getClaim("login_id").asString(); Map user = (Map) param.get("user"); Long teamStructureId = user.get("teamStructureId") != null ? Long.valueOf(String.valueOf(param.get("teamStructureId"))) : null; CfgTeamStructure cfgTeamStructure = teamStructureDao.findById(teamStructureId).orElse(null); Long sectionId = cfgTeamStructure.getSectionId(); CfgSections cfgSections = sectionDao.findById(sectionId).orElse(null); List operas = operaViewDao.findByPropertyIdAndBookingTypeId(propertyId,blockId); List teamOpera = new ArrayList<>(); CfgOperaView opera = new CfgOperaView(); for(CfgOperaView o :operas) { for(CfgRoomTypes r :o.getOperaRoomType()) { if(Objects.equals(r.getId(), roomTypeId)) { teamOpera.add(o); } } } String blockCode = null; Date checkinAsDate = Date.from(checkinDate.atZone(ZoneId.systemDefault()).toInstant()); Date checkoutAsDate = Date.from(checkoutDate.atZone(ZoneId.systemDefault()).toInstant()); for(CfgOperaView o :teamOpera) { Date startTime = o.getStartDate(); Date endTime = o.getEndDate(); if((!startTime.after(checkinAsDate)) && (!endTime.before(checkoutAsDate))) { blockCode = o.getBlockCodeName(); opera = o; } } booking.setId(null); booking.setPlayerId(playerId); booking.setMemberTitle(String.valueOf(member.get("salutation"))); // booking.setMemberFirstName(memberFirstName); booking.setMemberLastName(String.valueOf(member.get("name"))); booking.setCheckinDate(checkinDate); booking.setCheckoutDate(checkoutDate); booking.setPropertyId(propertyId); booking.setHotelCode(property.getCode()); booking.setRoomTypeId(roomTypeId); // booking.setOperaProfileId(Long.valueOf(String.valueOf(operaId.get(0)))); booking.setBlockCode(blockCode); booking.setRatePlanCode(opera.getRateCode().getCode()); booking.setRoomTypeCode(roomType.getCode()); booking.setMarketCode(opera.getMarketCode().getCode()); booking.setDlSourceId(opera.getSourceCode().getDlSourceId()); booking.setSourceCode(opera.getSourceCode().getCode()); booking.setCreatedAt(createDate); booking.setCreatedBy(JWT.decode(oldToken).getSubject()); booking.setSectionId(sectionId); booking.setApproveStatus(isWaitlist?"W":"PN"); booking.setRemark(remark); booking.setBookType("0"); booking.setBlock(block.getName()); booking.setNumOfNight(Integer.valueOf(numOfNight)); // booking.setTeamName(team.getCode()); booking.setBooker(userId); booking.setSharer(sharer); booking.setItemCode(item.getId()!=null?item.getDlCode():null); booking.setFeatureCode(special); booking.setRoom(room.getName()); booking.setSectionName(cfgSections.getName()); booking.setCategory(property.getCategory()); Bookings newBooking= bookingDao.save(booking); processResult.setSuccess(true); processResult.setReturnData(booking); return processResult; } private ServiceResult createDayligtBooking(Map param, HttpServletRequest request) { ServiceResult processResult= new ServiceResult(); LocalDateTime createDate = LocalDateTime.now(); Bookings booking = new Bookings(); String playerId = String.valueOf(param.get("playerId")); Long blockId = Long.valueOf(String.valueOf(param.get("blockId"))); Long propertyId = Long.valueOf(String.valueOf(param.get("propertyId"))); Long roomId = Long.valueOf(String.valueOf(param.get("roomId"))); Long roomTypeId = Long.valueOf(String.valueOf(param.get("roomTypeId"))); String special = param.get("specialIds")!=null?String.valueOf(param.get("specialIds")):null; String sharer = param.get("sharer")!=null?String.valueOf(param.get("sharer")):null; String remark = param.get("remark")!=null?String.valueOf(param.get("remark")):null; Boolean isWaitlist = Boolean.valueOf(String.valueOf(param.get("isWaitlist"))); HashMap member = (HashMap)param.get("member"); List operaId = (List)member.get("nameId"); List selectDate = (List)param.get("selectDate"); LocalDateTime checkinDate = DateTimeUtil.getDateFromString(String.valueOf(selectDate.get(0)), "yyyy-MM-dd"); LocalDateTime checkoutDate = DateTimeUtil.getDateFromString(String.valueOf(selectDate.get(1)), "yyyy-MM-dd"); String numOfNight = DateTimeUtil.getDiffDate(checkinDate, checkoutDate, "day"); CfgProperties property = propertyDao.findById(propertyId).orElse(null); CfgBlocks block = blockDao.getById(blockId); CfgRooms room = roomDao.getById(roomId); CfgRoomTypes roomType = roomTypeDao.getById(roomTypeId); CfgTiers tier = tierDao.findByTierName(String.valueOf(member.get("tier"))); CfgItemInventory item = new CfgItemInventory(); if(tier!=null&&blockId!=null&&roomTypeId!=null) { item = itemDao.findByTierIdAndRoomId(Long.valueOf(tier.getId()),roomId); } String oldToken = request.getHeader("Authorization"); // oldToken = oldToken.substring(6); String userId = JWT.decode(oldToken).getClaim("login_id").asString(); Map user = (Map) param.get("user"); Long teamStructureId = user.get("teamStructureId") != null ? Long.valueOf(String.valueOf(param.get("teamStructureId"))) : null; CfgTeamStructure cfgTeamStructure = teamStructureDao.findById(teamStructureId).orElse(null); Long sectionId = cfgTeamStructure.getSectionId(); CfgSections cfgSections = sectionDao.findById(sectionId).orElse(null); List operas = daylightViewDao.findByPropertyIdAndBookingTypeId(propertyId,blockId); List teamOpera = new ArrayList(); CfgDaylightView opera = new CfgDaylightView(); for(CfgDaylightView o :operas) { for(CfgRoomTypes r :o.getDaylightRoomType()) { if(Objects.equals(r.getId(), roomTypeId)) { teamOpera.add(o); } } } String blockCode = null; for(CfgDaylightView o :teamOpera) { LocalDateTime startTime = o.getStartDate(); LocalDateTime endTime = o.getEndDate(); if((startTime.isBefore(checkinDate) || startTime.isEqual(checkinDate)) && (endTime.isAfter(checkoutDate) || endTime.isEqual(checkoutDate))) { blockCode = o.getBlockCodeName(); opera = o; } } booking.setId(null); booking.setPlayerId(playerId); booking.setMemberTitle(String.valueOf(member.get("salutation"))); // booking.setMemberFirstName(memberFirstName); booking.setMemberLastName(String.valueOf(member.get("name"))); booking.setCheckinDate(checkinDate); booking.setCheckoutDate(checkoutDate); booking.setPropertyId(propertyId); booking.setHotelCode(property.getCode()); booking.setRoomTypeId(roomTypeId); // booking.setOperaProfileId(Long.valueOf(String.valueOf(operaId.get(0)))); booking.setBlockCode(blockCode); booking.setRatePlanCode(opera.getRateCode().getCode()); booking.setRoomTypeCode(roomType.getCode()); booking.setMarketCode(opera.getMarketCode().getCode()); booking.setDlSourceId(opera.getSourceCode().getDlSourceId()); booking.setSourceCode(opera.getSourceCode().getCode()); booking.setCreatedAt(createDate); booking.setCreatedBy(JWT.decode(oldToken).getSubject()); booking.setSectionId(sectionId); booking.setApproveStatus(isWaitlist?"W":"PN"); booking.setRemark(remark); booking.setBookType("0"); booking.setBlock(block.getName()); booking.setNumOfNight(Integer.valueOf(numOfNight)); // booking.setTeamName(team.getCode()); booking.setBooker(userId); booking.setSharer(sharer); booking.setItemCode(item.getId()!=null?item.getDlCode():null); booking.setFeatureCode(special); booking.setRoom(room.getName()); booking.setSectionName(cfgSections.getName()); booking.setCategory(property.getCategory()); Bookings newBooking= bookingDao.save(booking); processResult.setSuccess(true); processResult.setReturnData(booking); return processResult; } public ServiceResult updateBooking(Bookings booking) { ServiceResult processResult= new ServiceResult(); Bookings existsType = bookingDao.findById(booking.getId()).orElse(null); if(existsType==null) { processResult.setErrorCode("ERR_OBJECT_NOT_FOUND"); processResult.setErrorMessage("Can't find Booking by Id"); }else { String[] ignoreProperties = new String[] {"id","createdAt", "createdBy","updatedAt","updatedBy"}; BeanUtils.copyProperties(booking, existsType, ignoreProperties); booking.setCreatedAt(existsType.getCreatedAt()); booking.setUpdatedAt( DateTimeUtil.getCurrentDateTime("yyyy-MM-dd HH:mm:ss")); bookingDao.save(booking); processResult.setReturnData(existsType); processResult.setSuccess(true); } return processResult; } public ServiceResult updateFailedBooking(Bookings booking) { ServiceResult processResult= new ServiceResult(); Bookings existsType = bookingDao.findById(booking.getId()).orElse(null); if(existsType==null) { processResult.setErrorCode("ERR_OBJECT_NOT_FOUND"); processResult.setErrorMessage("Can't find Booking by Id"); }else { existsType.setApproveStatus(booking.getApproveStatus()); existsType.setMscRemark(booking.getMscRemark()); existsType.setUpdatedAt( DateTimeUtil.getCurrentDateTime("yyyy-MM-dd HH:mm:ss")); existsType.setUpdatedBy(booking.getUpdatedBy()); bookingDao.save(existsType); processResult.setReturnData(existsType); processResult.setSuccess(true); } return processResult; } public ServiceResult updateWaitlistBookingStatus(Bookings booking) { ServiceResult processResult= new ServiceResult(); Bookings existsType = bookingDao.findById(booking.getId()).orElse(null); if(existsType==null) { processResult.setErrorCode("ERR_OBJECT_NOT_FOUND"); processResult.setErrorMessage("Can't find Booking by Id"); }else { if("W".equals(booking.getApproveStatus())) { existsType.setApproveStatus("WA"); existsType.setApprovedBy(booking.getUpdatedBy()); existsType.setApprovedAt( DateTimeUtil.getCurrentDateTime("yyyy-MM-dd HH:mm:ss")); }else if("WA".equals(booking.getApproveStatus())) { existsType.setApproveStatus("WR"); existsType.setApprovedBy(booking.getUpdatedBy()); existsType.setApprovedAt( DateTimeUtil.getCurrentDateTime("yyyy-MM-dd HH:mm:ss")); }else if("WR".equals(booking.getApproveStatus())) { existsType.setApproveStatus("W"); existsType.setApprovedBy(null); existsType.setApprovedAt(null); } existsType.setUpdatedAt( DateTimeUtil.getCurrentDateTime("yyyy-MM-dd HH:mm:ss")); existsType.setUpdatedBy(booking.getUpdatedBy()); bookingDao.save(existsType); processResult.setReturnData(existsType); processResult.setSuccess(true); } return processResult; } public ServiceResult updateWaitlistBookingRemark(Bookings booking) { ServiceResult processResult= new ServiceResult(); Bookings existsType = bookingDao.findById(booking.getId()).orElse(null); if(existsType==null) { processResult.setErrorCode("ERR_OBJECT_NOT_FOUND"); processResult.setErrorMessage("Can't find Booking by Id"); }else { existsType.setMscRemark(booking.getMscRemark()); existsType.setUpdatedAt( DateTimeUtil.getCurrentDateTime("yyyy-MM-dd HH:mm:ss")); existsType.setUpdatedBy(booking.getUpdatedBy()); bookingDao.save(existsType); processResult.setReturnData(existsType); processResult.setSuccess(true); } return processResult; } public ServiceResult updateBatchWaitlistBookingStatus(String[]bookIds,String status,String approver) { ServiceResult processResult= new ServiceResult(); String approvedBy = null; LocalDateTime approvedAt = null; bookingDao.updateBatchStatus(status,bookIds); if("W".equals(status)) { bookingDao.updateBatchApprover(approvedBy,approvedAt,bookIds); }else if("WA".equals(status)) { approvedBy = approver; approvedAt = DateTimeUtil.getCurrentDateTime("yyyy-MM-dd HH:mm:ss"); bookingDao.updateBatchApprover(approvedBy,approvedAt,bookIds); }else if("WR".equals(status)) { approvedBy = approver; approvedAt = DateTimeUtil.getCurrentDateTime("yyyy-MM-dd HH:mm:ss"); bookingDao.updateBatchApprover(approvedBy,approvedAt,bookIds); } processResult.setReturnData(bookIds); processResult.setSuccess(true); return processResult; } public BookingsDto getBookingById(long id) { BookingsDto booking = bookingMapper.toBookingDto(bookingDao.findById(id).orElse(null)); return booking; } public BookingGetFollowUpNumResponse getFollowUpBookingNum(BookingGetFollowUpNumRequest bookingGetFollowUpNumRequest) { BookingGetFollowUpNumResponse response = new BookingGetFollowUpNumResponse(); String marketCode = bookingGetFollowUpNumRequest.getSearchMarketCode(); if (StringUtils.isNotBlank(marketCode)) { response.setNewBooking(bookingDao.getFollowUpNewBookingByMarketCode(1,marketCode)); response.setExtendBooking(bookingDao.getFollowUpNewBookingByMarketCode(2,marketCode)); response.setPendingBooking(bookingDao.getFollowUpNewBookingByMarketCode(3,marketCode)); response.setDoneBooking(bookingDao.getFollowUpNewBookingByMarketCode(4,marketCode)); response.setCancelBooking(bookingDao.getFollowUpNewBookingByMarketCode(5,marketCode)); }else { response.setNewBooking(bookingDao.getFollowUpNewBooking(1)); response.setExtendBooking(bookingDao.getFollowUpNewBooking(2)); response.setPendingBooking(bookingDao.getFollowUpNewBooking(3)); response.setDoneBooking(bookingDao.getFollowUpNewBooking(4)); response.setCancelBooking(bookingDao.getFollowUpNewBooking(5)); } return response; } public Bookings save(Bookings booking) { return bookingDao.save(booking); } public DataTableResult getBookingByPage(OtherPropertyPageRequest otherPropertyPageRequest) { LogUtil.info(BookingService.class, "otherPropertyPageRequest body: " + JSON.toJSONString(otherPropertyPageRequest)); // 先验证分页参数 otherPropertyPageRequest.validatePageInfo(); Specification listSpec = buildSpecificationViewByQueryFilter(otherPropertyPageRequest); int pageSize = otherPropertyPageRequest.getPageSize(); int pageStart = otherPropertyPageRequest.getStartRow()/pageSize; String sortProperties = otherPropertyPageRequest.getSortOrder()!=null?otherPropertyPageRequest.getSortOrder():""; sortProperties = sortProperties.replace("1-asc", "-asc"); sortProperties = sortProperties.replace("1-desc", "-desc"); otherPropertyPageRequest.setSortOrder(sortProperties); Sort sort = DaoUtil.buildSortByString(otherPropertyPageRequest.getSortOrder(), "id"); Pageable pageable = PageRequest.of(pageStart, pageSize, sort); Page resultPage = bookingViewDao.findAll(listSpec, pageable); // LogUtil.info(BookingService.class, "resultPage:"+resultPage.getContent()); DataTableResult dataResult = new DataTableResult(); dataResult.setTotalRecords(resultPage.getTotalElements()); dataResult.setPageSize(pageSize); List resultList = resultPage.getContent(); dataResult.setRowData(resultList); return dataResult; } public List listBookingView(QueryFilter queryFilter) { OtherPropertyPageRequest otherPropertyPageRequest = new OtherPropertyPageRequest(); Specification listSpec = buildSpecificationViewByQueryFilter(otherPropertyPageRequest); Sort sort = DaoUtil.buildSortByFilter(queryFilter, "id"); return bookingViewDao.findAll(listSpec,sort); } public List listBooking(QueryFilter queryFilter) { Specification listSpec = buildSpecificationByQueryFilter(queryFilter); Sort sort = DaoUtil.buildSortByFilter(queryFilter, "id"); return bookingDao.findAll(listSpec,sort); } public List listBookingViewToExport(QueryFilter queryFilter) { OtherPropertyPageRequest otherPropertyPageRequest = queryFilter.convertToRequest(OtherPropertyPageRequest.class); if(otherPropertyPageRequest == null) { otherPropertyPageRequest = new OtherPropertyPageRequest(); } Specification listSpec = buildSpecificationViewByQueryFilter(otherPropertyPageRequest); Sort sort = DaoUtil.buildSortByFilter(queryFilter, "id"); String sortProperties = queryFilter.getString("sortOrder"); List resultList = bookingMapper.toBookingViewDtoList(bookingViewDao.findAll(listSpec,sort)); if(resultList!=null) { List features = roomFeatureDao.findAll(); int key = 1; for(BookingsViewDto booking:resultList) { String statusName=""; if("W".equals(booking.getApproveStatus())) { statusName="Pending"; }else if("WC".equals(booking.getApproveStatus())) { statusName="Cancelled"; }else if("WF".equals(booking.getApproveStatus())) { statusName="Reserved"; }else if("WE".equals(booking.getApproveStatus())) { statusName="Expired"; }else if("F".equals(booking.getApproveStatus())) { statusName="Failed"; }else if("FC".equals( booking.getApproveStatus())) { statusName="Completed"; }else if("WA".equals(booking.getApproveStatus())) { statusName="Approved"; }else if("WR".equals(booking.getApproveStatus())) { statusName="Reject"; } booking.setApproveStatusName(statusName); booking.setBookTypeName("1".equals(booking.getBookType())?"Extension":"New"); if(booking.getSegment()!=null) { booking.setSegmentName(booking.getSegment().getSegmentName()); } if(booking.getOtherRoomStatus()!=null) { booking.setRoomStatusName(booking.getOtherRoomStatus().getStatusName()); } if(booking.getOtherFollowUpStatus()!=null) { booking.setFollowUpStatusName(booking.getOtherFollowUpStatus().getName()); } booking.setMemberFullName(booking.getMemberLastName()); String nameStr = Strings.CS.replace(booking.getMemberLastName(), ", ", ";"); String[] nameArr = StringUtils.split(nameStr, ";"); if(nameArr!=null&&nameArr.length>1) { booking.setMemberFirstName(nameArr[1]); booking.setMemberLastName(nameArr[0]); }else { booking.setMemberFirstName(booking.getMemberLastName()); } if(booking.getFeatureCode()!=null && !booking.getFeatureCode().isEmpty()) { String[] arrSpecialCode = booking.getFeatureCode().split(","); String specialStr = ""; if(arrSpecialCode.length>0) { for (String s : arrSpecialCode) { if (!s.isEmpty()) { for (CfgRoomFeatures feature : features) { if (feature.getDlAttributeId() != null && feature.getDlAttributeId().equals(s)) { if ("".equals(specialStr)) { specialStr = feature.getDescription(); } else { specialStr = specialStr + ", " + feature.getDescription(); } break; } } } } if(StringUtils.isEmpty(specialStr)) { booking.setSpecialName(booking.getFeatureCode()); }else { booking.setSpecialName(specialStr); } } } if(booking.getSharer()!=null&&!"[]".equals(booking.getSharer()) &&!StringUtils.isEmpty(booking.getSharer())) { JSONArray sharerArr = JSONArray.parseArray(booking.getSharer()); List sharerId = new ArrayList(); List sharerName = new ArrayList(); for(Object sharer : sharerArr) { JSONObject sharerObj = (JSONObject) sharer; if(sharerObj.containsKey("playerId")) { sharerId.add(sharerObj.get("playerId").toString()); } if(sharerObj.containsKey("name")) { sharerName.add(sharerObj.get("name").toString()); } } booking.setSharer(String.join(";", sharerId)); booking.setSharerName(String.join(";", sharerName)); }else { booking.setSharer(""); booking.setSharerName(""); } if(sortProperties!=null && sortProperties.contains("dailyTheoProfit-asc")) { booking.setRankingByPlayer(resultList.size()-key-1+""); }else { booking.setRankingByPlayer(key+""); } key++; } } return resultList; } private Specification buildSpecificationByQueryFilter(QueryFilter queryfilter) { Specification Bookingpec = new Specification() { @Override public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder cb) { List list = new ArrayList<>(); Map query = queryfilter.getFilterParas(); if (StringUtils.isNotBlank(queryfilter.getString("searchName"))) { list.add(cb.like(cb.upper(root.get("id")), "%" + queryfilter.getString("searchName").toUpperCase() + "%")); } if (StringUtils.isNotBlank(queryfilter.getString("searchPlayerId"))) { list.add(cb.like(cb.upper(root.get("playerId")), "%" + queryfilter.getString("searchPlayerId").toUpperCase() + "%")); } if (StringUtils.isNotBlank(queryfilter.getString("searchConfirmationNo"))) { list.add(cb.like(cb.upper(root.get("confirmationNo")), "%" + queryfilter.getString("searchConfirmationNo").toUpperCase() + "%")); } if (StringUtils.isNotBlank(queryfilter.getString("searchStatus"))) { list.add(cb.like(cb.upper(root.get("approveStatus")), "%" + queryfilter.getString("searchStatus").toUpperCase() + "%")); } if(StringUtils.isNotBlank(queryfilter.getString("permissionId"))) { String routerId=queryfilter.getString("permissionId"); String paraGroup=queryfilter.getString("permissionGroup"); String groupName = StringUtils.isNotBlank(paraGroup)?paraGroup:"NO_GROUP"; List accessRoomIds = sysGroupService.getGroupAccessRoomIds(routerId, groupName); list.add(root.get("roomId").in(accessRoomIds)); } if (query.get("searchPropertyCode")!=null&&((ArrayList) query.get("searchPropertyCode")).size()>0) { CriteriaBuilder.In in = cb.in(root.get("hotelCode")); List qu = (ArrayList) query.get("searchPropertyCode"); for(int i=0;i buildSpecificationViewByQueryFilter(OtherPropertyPageRequest otherPropertyPageRequest) { Specification Bookingpec = new Specification() { @Override public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder cb) { List list = new ArrayList<>(); if (otherPropertyPageRequest.getSearchId() != null) { list.add(cb.equal(root.get("id"), otherPropertyPageRequest.getSearchId())); } if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchName())) { list.add(cb.like(cb.upper(root.get("id")), "%" + otherPropertyPageRequest.getSearchName().toUpperCase() + "%")); } if(StringUtils.isNotBlank(otherPropertyPageRequest.getSearchBookerId())) { list.add(cb.like(cb.upper(root.get("createdBy")), "%" + otherPropertyPageRequest.getSearchBookerId().toUpperCase() + "%")); } if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchBookerName())) { list.add(cb.like(cb.upper(root.get("booker")), "%" + otherPropertyPageRequest.getSearchBookerName().toUpperCase() + "%")); } if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchBookerTeam())) { list.add(cb.like(cb.upper(root.get("bookerTeam")), "%" + otherPropertyPageRequest.getSearchBookerTeam().toUpperCase() + "%")); } if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchPlayerId())) { list.add(cb.like(cb.upper(root.get("playerId")), "%" + otherPropertyPageRequest.getSearchPlayerId().toUpperCase() + "%")); } if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchLastName())) { list.add(cb.like(cb.upper(root.get("memberLastName")), "%" + otherPropertyPageRequest.getSearchLastName().toUpperCase() + "%")); } if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchFirstName())) { list.add(cb.like(cb.upper(root.get("memberLastName")), "%" + ", " + otherPropertyPageRequest.getSearchFirstName().toUpperCase() + "%")); } if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchConfirmationNo())) { list.add(cb.like(cb.upper(root.get("confirmationNo")), "%" + otherPropertyPageRequest.getSearchConfirmationNo().toUpperCase() + "%")); } if(StringUtils.isNotBlank(otherPropertyPageRequest.getSearchStatus())) { List searchStatus = DaoUtil.parseMultipleFilter(otherPropertyPageRequest.getSearchStatus()); if(searchStatus.size() == 1) { list.add(cb.equal(root.get("approveStatus"), searchStatus.get(0))); } else if(searchStatus.size() > 1) { list.add(root.get("approveStatus").in(searchStatus)); } } if(StringUtils.isNotBlank(otherPropertyPageRequest.getSearchTryTime())) { try { int tryTime = Integer.parseInt(otherPropertyPageRequest.getSearchTryTime()); if(tryTime > 0) { list.add(cb.greaterThanOrEqualTo(root.get("tryTime"), tryTime)); } } catch (NumberFormatException e) { } } if(otherPropertyPageRequest.getSearchPropertyId() != null && !otherPropertyPageRequest.getSearchPropertyId().isEmpty()) { List propertyIds = otherPropertyPageRequest.getSearchPropertyId(); if(!propertyIds.isEmpty()) { if(!propertyIds.contains(0L)) { list.add(root.get("propertyId").in(propertyIds)); } } } if(otherPropertyPageRequest.getSearchBookDate() != null && !otherPropertyPageRequest.getSearchBookDate().isEmpty()) { List date = otherPropertyPageRequest.getSearchBookDate(); if(date.size() >= 2) { list.add(cb.greaterThanOrEqualTo(root.get("createdAt"), DateTimeUtil.getDateFromString(date.get(0) + " 00:00:00", "yyyy-MM-dd HH:mm:ss"))); list.add(cb.lessThanOrEqualTo(root.get("createdAt"), DateTimeUtil.getDateFromString(date.get(1) + " 23:59:59", "yyyy-MM-dd HH:mm:ss"))); } } if(otherPropertyPageRequest.getSearchCheckInDate() != null && !otherPropertyPageRequest.getSearchCheckInDate().isEmpty()) { List searchCheckInDate = otherPropertyPageRequest.getSearchCheckInDate(); if(searchCheckInDate.size() >= 1) { list.add(cb.greaterThanOrEqualTo(root.get("checkoutDate"), DateTimeUtil.getDateFromString(searchCheckInDate.get(0), "yyyy-MM-dd"))); if(searchCheckInDate.size() >= 2) { list.add(cb.lessThanOrEqualTo(root.get("checkinDate"), DateTimeUtil.getDateFromString(searchCheckInDate.get(1), "yyyy-MM-dd"))); } } } if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchWaitlistCheckInDate())) { String searchWaitlistCheckInDate = otherPropertyPageRequest.getSearchWaitlistCheckInDate(); String[] date = searchWaitlistCheckInDate.split(","); if(date.length >= 1) { list.add(cb.greaterThanOrEqualTo(root.get("checkinDate"), DateTimeUtil.getDateFromString(date[0], "yyyy-MM-dd"))); if(date.length >= 2) { list.add(cb.lessThanOrEqualTo(root.get("checkinDate"), DateTimeUtil.getDateFromString(date[1], "yyyy-MM-dd"))); } } } if(StringUtils.isNotBlank(otherPropertyPageRequest.getPermissionId())) { String routerId = otherPropertyPageRequest.getPermissionId(); String paraGroup = otherPropertyPageRequest.getPermissionGroup(); String groupName = StringUtils.isNotBlank(paraGroup) ? paraGroup : "NO_GROUP"; List accessRoomIds = sysGroupService.getGroupAccessRoomIds(routerId, groupName); list.add(root.get("roomId").in(accessRoomIds)); } if(otherPropertyPageRequest.getSearchRoomId() != null && !otherPropertyPageRequest.getSearchRoomId().isEmpty()) { List roomIds = otherPropertyPageRequest.getSearchRoomId(); if(!roomIds.isEmpty()) { list.add(root.get("roomId").in(roomIds)); } } if(StringUtils.isNotBlank(otherPropertyPageRequest.getSearchRoomTypeId())) { try { String[] roomTypeIdArray = otherPropertyPageRequest.getSearchRoomTypeId().split(","); List roomTypeIds = new ArrayList<>(); for (String id : roomTypeIdArray) { roomTypeIds.add(Long.parseLong(id.trim())); } if(!roomTypeIds.isEmpty()) { list.add(root.get("roomTypeId").in(roomTypeIds)); } } catch (NumberFormatException e) { } } if(otherPropertyPageRequest.getSearchOtherRoomStatusId() != null && !otherPropertyPageRequest.getSearchOtherRoomStatusId().isEmpty()) { List otherRoomStatusIds = otherPropertyPageRequest.getSearchOtherRoomStatusId(); if(!otherRoomStatusIds.isEmpty()) { if(!otherRoomStatusIds.contains(0L)) { list.add(root.get("otherRoomStatusId").in(otherRoomStatusIds)); } } } if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchPropertyCategory())) { list.add(cb.like(cb.upper(root.get("propertyCategory")), "%" + otherPropertyPageRequest.getSearchPropertyCategory().toUpperCase() + "%")); } if (otherPropertyPageRequest.getSearchFollowUpStatusId() != null) { list.add(cb.equal(root.get("otherFollowUpStatusId"), otherPropertyPageRequest.getSearchFollowUpStatusId())); } if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchMarketCode())) { list.add(cb.equal(cb.upper(root.get("marketCode")), otherPropertyPageRequest.getSearchMarketCode().toUpperCase())); } if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchSourceCode())) { list.add(cb.equal(cb.upper(root.get("dlSourceId")), otherPropertyPageRequest.getSearchSourceCode().toUpperCase())); } if (StringUtils.isNotBlank(otherPropertyPageRequest.getPropertyName())) { list.add(cb.like(cb.upper(root.get("propertyName")), "%" + otherPropertyPageRequest.getPropertyName().toUpperCase() + "%")); } if (StringUtils.isNotBlank(otherPropertyPageRequest.getRoomStatusName())) { list.add(cb.like(cb.upper(root.get("roomStatusName")), "%" + otherPropertyPageRequest.getRoomStatusName().toUpperCase() + "%")); } if (StringUtils.isNotBlank(otherPropertyPageRequest.getRoomTypeName())) { list.add(cb.like(cb.upper(root.get("roomTypeName")), "%" + otherPropertyPageRequest.getRoomTypeName().toUpperCase() + "%")); } Predicate[] predicates = new Predicate[list.size()]; criteriaQuery.where(list.toArray(predicates)); return cb.and(list.toArray(predicates)); } }; return Bookingpec; } public DataTableResult getMockupBookingByPage() throws Exception { List bookList = bookingViewDao.findMockupOtherPropertyBooking(); DataTableResult dataResult = new DataTableResult<>(); dataResult.setTotalRecords(bookList.size()); dataResult.setPageSize(0); dataResult.setRowData(bookList); return dataResult; } }