diff --git a/src/main/java/com/mgm/mcrm/basesetting/agebucket/services/AgebucketService.java b/src/main/java/com/mgm/mcrm/basesetting/agebucket/services/AgebucketService.java index 3d5bdfa..7095062 100644 --- a/src/main/java/com/mgm/mcrm/basesetting/agebucket/services/AgebucketService.java +++ b/src/main/java/com/mgm/mcrm/basesetting/agebucket/services/AgebucketService.java @@ -3,7 +3,7 @@ package com.mgm.mcrm.basesetting.agebucket.services; import com.mgm.mcrm.basesetting.agebucket.models.SysAgebucket; import com.mgm.mcrm.basesetting.agebucket.repositories.SysAgebucketDao; import com.mgm.mcrm.basesetting.daylight.dtos.response.AgebucketResponse; -import com.mgm.mcrm.basesetting.daylight.services.DaylightService; +import com.mgm.mcrm.basesetting.daylight.services.DaylightApiService; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -21,13 +21,13 @@ public class AgebucketService { @Lazy @Resource - private DaylightService daylightService; + private DaylightApiService daylightApiService; @Resource private SysAgebucketDao sysAgebucketDao; public void syncDaylightAgebuckets(String dlPropertyId) { - List agebucketResponses = daylightService.daylightAgebucketResponseList(dlPropertyId); + List agebucketResponses = daylightApiService.daylightAgebucketResponseList(dlPropertyId); if (isEmpty(agebucketResponses)) { return; } diff --git a/src/main/java/com/mgm/mcrm/basesetting/daylight/services/DaylightService.java b/src/main/java/com/mgm/mcrm/basesetting/daylight/services/DaylightService.java deleted file mode 100644 index a710a13..0000000 --- a/src/main/java/com/mgm/mcrm/basesetting/daylight/services/DaylightService.java +++ /dev/null @@ -1,2229 +0,0 @@ -package com.mgm.mcrm.basesetting.daylight.services; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.mgm.mcrm.basesetting.agebucket.models.SysAgebucket; -import com.mgm.mcrm.basesetting.agebucket.services.AgebucketService; -import com.mgm.mcrm.basesetting.daylight.dtos.request.*; -import com.mgm.mcrm.basesetting.daylight.dtos.response.*; -import com.mgm.mcrm.basesetting.daylight.models.*; -import com.mgm.mcrm.basesetting.daylight.repositories.CompPresetDao; -import com.mgm.mcrm.basesetting.daylight.repositories.DaylightConfigurationDao; -import com.mgm.mcrm.basesetting.daylight.repositories.MarketCodeDao; -import com.mgm.mcrm.basesetting.daylight.repositories.RateCodeDao; -import com.mgm.mcrm.basesetting.property.models.CfgProperties; -import com.mgm.mcrm.basesetting.property.services.PropertyCache; -import com.mgm.mcrm.basesetting.room.models.CfgRoomTypes; -import com.mgm.mcrm.basesetting.room.models.CfgRooms; -import com.mgm.mcrm.basesetting.room.repositories.RoomDao; -import com.mgm.mcrm.booking.dtos.BookingDto; -import com.mgm.mcrm.booking.dtos.daylight.Breakdown; -import com.mgm.mcrm.booking.dtos.daylight.GuestForBreakdown; -import com.mgm.mcrm.booking.dtos.daylight.requests.createReservation.ReservationRequestDTO; -import com.mgm.mcrm.booking.dtos.daylight.responses.DistributionChannelResponse; -import com.mgm.mcrm.booking.dtos.daylight.responses.GuaranteeTypeResponse; -import com.mgm.mcrm.booking.models.Bookings; -import com.mgm.mcrm.booking.repositories.BookingDao; -import com.mgm.mcrm.booking.services.BookingService; -import com.mgm.mcrm.common.dtos.BaseApiResponse; -import com.mgm.mcrm.common.dtos.HttpResult; -import com.mgm.mcrm.common.dtos.mgm_api.PlayerProfileEntry; -import com.mgm.mcrm.common.enums.EnumBookingStatus; -import com.mgm.mcrm.common.httpclient.HttpHeaderBuilder; -import com.mgm.mcrm.common.services.HttpService; -import com.mgm.mcrm.common.utils.DateTimeUtil; -import com.mgm.mcrm.common.utils.LogUtil; -import com.mgm.mcrm.player.dtos.RatePricingDetail; -import com.mgm.mcrm.player.dtos.response.DaylightReservationResponse; -import com.mgm.mcrm.player.services.PlayerService; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.hc.core5.http.Header; -import org.jspecify.annotations.NonNull; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; -import java.util.concurrent.TimeUnit; - -@Slf4j -@Service -public class DaylightService { - - @Resource - private HttpService httpService; - - @Resource - private PropertyCache propertyCache; - - @Resource - private DaylightConfigurationDao dlConfigurationDao; - - @Resource - private PlayerService playerService; - - @Resource - private BookingDao bookingDao; - - @Resource - private RateCodeDao rateCodeDao; - - @Resource - private MarketCodeDao marketCodeDao; - - @Resource - private AgebucketService agebucketService; - - @Resource - private RoomDao roomDao; - - @Resource - private CompPresetDao compPresetDao; - - @Value("${daylight.system-id}") - private String dlSystemId; - - public BaseApiResponse daylightUpsertReservationNew(ReservationRequestDTO requestDTO, String dlPropertyId) { - BaseApiResponse result = new BaseApiResponse<>(); - - try { - String url = "/api-gateway/aggregator/v1/integrations/reservation/multiroom/upsert"; - - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .build(); - - log.info("Create daylight booking request body: {}", JSON.toJSONString(requestDTO)); - HttpResult httpResult = httpService.sslPost(url, headers, requestDTO); - - if (httpResult.getStatusCode() == 201) { - // TO'DO by Mauve 2026-07-07 - // 这个完成了 by Mauve 2026-07-21 - - String responseData = httpResult.getResult(); - - JSONObject responseJson = JSON.parseObject(responseData); - - if (responseJson.isEmpty()) { - result.setSuccess(false); - result.setMessage("Failed to create DayLight reservation"); - log.warn("Failed to create DayLight reservation, jsonObject is Empty"); - return result; - } - - String reservationId = responseJson.getJSONArray("reservations").getJSONObject(0).getString("id"); - String confirmationNumber = responseJson.getJSONArray("reservations").getJSONObject(0).getString("confirmationNumber"); - - String profileId = ""; - - JSONArray jsonArray = responseJson.getJSONArray("individuals"); - if (!jsonArray.isEmpty()) { - for (int i = 0; i < jsonArray.size(); i++) { - JSONObject jsonObject = jsonArray.getJSONObject(i); - - String refId = jsonObject.getString("_refId"); - - if (refId.startsWith("gus_")) { - profileId = jsonObject.getString("id"); - break; - } - } - } - - JSONObject temp = new JSONObject(); - temp.put("reservationId", reservationId); - temp.put("confirmationNumber", confirmationNumber); - if (StringUtils.isNotBlank(profileId)) { - temp.put("profileId", profileId); - - result.setMessage("Created dayLight reservation and profile success"); - } - - result.setData(temp); - result.setSuccess(true); - if (StringUtils.isBlank(profileId)) { - result.setMessage("Create DayLight reservation success"); - } - - } else if (httpResult.getStatusCode() == 202) { - String operationUrl = ""; - Header[] createHeader = httpResult.getRespHeaders(); - for (Header header : createHeader) { - if (header.getName().equals("Location")) { - operationUrl = header.getValue(); - break; - } - } - - JSONObject jsonObject = this.daylightCallOperationUrl(operationUrl, dlPropertyId); - - if (jsonObject.isEmpty()) { - result.setSuccess(false); - result.setMessage("Failed to create DayLight reservation, jsonObject is Empty"); - log.warn("Failed to create DayLight reservation, jsonObject is Empty"); - return result; - } - - String status = jsonObject - .getJSONObject("status") - .getString("status"); - - if (!"Completed".equalsIgnoreCase(status)) { - - String errorMessage = getFailMessage(jsonObject.getJSONObject("data")); - - result.setSuccess(false); - result.setMessage("Failed to create DayLight reservation, error message: " + errorMessage); - log.warn("Failed to create DayLight reservation, error message: {}", errorMessage); - - return result; - } - - JSONArray jsonArray = jsonObject - .getJSONObject("data") - .getJSONArray("steps"); - - // 创建 reservation - if (jsonArray.size() == 1) { - JSONObject resId = this.getResIdAndConfNo(jsonArray); - - if (resId.isEmpty()) { - - result.setSuccess(false); - result.setMessage("Failed to create DayLight reservation, reservation id is empty"); - log.warn("Failed to create DayLight reservation, reservation id is empty, json: {}", jsonArray.toJSONString()); - } else { - result.setSuccess(true); - result.setData(resId); - log.info("Create reservation successful, reservation id: {}", resId); - } - - // 创建 reservation 并且创建了 profile - } else if (jsonArray.size() == 2) { - - JSONObject profileIdAndResId = this.getProfileIdAndResIdAndConfNo(jsonArray); - - if (profileIdAndResId.isEmpty()) { - result.setSuccess(false); - result.setMessage("Failed to create DayLight reservation, reservation id or profile id is empty"); - log.warn("Failed to create DayLight reservation, reservation id or profile id is empty, json: {}",profileIdAndResId.toJSONString()); - - return result; - } - - String profileId = profileIdAndResId.getString("profileId"); - String resId = profileIdAndResId.getString("reservationId"); - String confirmationNumber = profileIdAndResId.getString("confirmationNumber"); - - JSONObject temp = new JSONObject(); - - if (StringUtils.isNotBlank(profileId)) { - temp.put("profileId", profileId); - } else { - log.warn("ProfileId is empty, maybe this profile is sharer"); - } - - if (StringUtils.isNotBlank(resId)) { - temp.put("reservationId", resId); - } else { - log.warn("ReservationId is empty"); - } - - if (StringUtils.isNotBlank(confirmationNumber)) { - temp.put("confirmationNumber", confirmationNumber); - } else { - log.warn("ConfirmationNumber is empty"); - } - - result.setData(temp); - result.setSuccess(true); - result.setMessage("Created dayLight reservation and profile success"); - - // TO'DO 应该走不到这里才对 by Mauve 2026-07-07 - } else { - result.setSuccess(true); - result.setMessage("Created dayLight reservation and profile success"); - } - } else { - String json = httpResult.getResult(); - JSONObject jsonObject = JSON.parseObject(json); - - String message = null; - - JSONArray details = jsonObject.getJSONArray("details"); - - if (details != null && !details.isEmpty()) { - JSONObject detail = details.getJSONObject(0); - message = detail.getString("message"); - } - - result.setSuccess(false); - result.setMessage(message); - } - - } catch (Exception e) { - result.setSuccess(false); - result.setMessage("Failed to create DayLight reservation"); - log.error("Failed to create DayLight reservation: ", e); - } - - return result; - } - - private String getFailMessage(JSONObject operationData) { - - if (operationData == null) { - return null; - } - - if (operationData.getJSONArray("steps") == null) { - return null; - } - - JSONArray jsonArray = operationData.getJSONArray("steps"); - - for (int i = 0; i < jsonArray.size(); i++) { - JSONObject jsonObject = jsonArray.getJSONObject(i); - - if ("UpsertReservations".equalsIgnoreCase(jsonObject.getString("name"))) { - - JSONObject propertiesJSON = jsonObject.getJSONObject("properties"); - JSONObject errorJSON = propertiesJSON.getJSONObject("error"); - - return errorJSON.getString("message"); - } - } - - return null; - } - - private JSONObject getResIdAndConfNo(JSONArray jsonArray) { - - JSONObject jsonObject = jsonArray.getJSONObject(0); - - String status = jsonObject.getString("stage"); - - if (!"Completed".equalsIgnoreCase(status)) { - return new JSONObject(); - } - - JSONObject properties = jsonObject.getJSONObject("properties"); - JSONArray reservations = properties.getJSONArray("reservations"); - JSONObject reservation = reservations.getJSONObject(0); - - String id = reservation.getString("id"); - String confirmationNumber = reservation.getString("confirmationNumber"); - - JSONObject result = new JSONObject(); - - result.put("reservationId", id); - result.put("confirmationNumber", confirmationNumber); - - return result; - } - - private JSONObject getProfileIdAndResIdAndConfNo(JSONArray jsonArray) { - - JSONObject result = new JSONObject(); - - for (int i = 0; i < jsonArray.size(); i++) { - - JSONObject jsonObject = jsonArray.getJSONObject(i); - - String name = jsonObject.getString("name"); - String stage = jsonObject.getString("stage"); - - if (!"Completed".equalsIgnoreCase(stage)) { - continue; - } - - if ("CreateProfiles".equalsIgnoreCase(name)) { - - JSONObject properties = jsonObject.getJSONObject("properties"); - JSONArray individuals = properties.getJSONArray("individuals"); - - JSONObject profile = individuals.getJSONObject(0); - - String refId = profile.getString("_refId"); - if (refId.startsWith("sha_")) { - continue; - } - - String id = profile.getString("id"); - - result.put("profileId", id); - - continue; - } - - if ("UpsertReservations".equalsIgnoreCase(name)) { - - JSONArray temp = new JSONArray(); - temp.add(jsonObject); - - JSONObject resId = this.getResIdAndConfNo(temp); - - result.put("reservationId", resId.getString("reservationId")); - result.put("confirmationNumber", resId.getString("confirmationNumber")); - } - } - - return result; - } - - public BaseApiResponse daylightUpdateReservationNote( - String dlPropertyId, - String reservationId, - String dlNoteId, - String content, - Integer version) { - - BaseApiResponse result = new BaseApiResponse<>(); - - try { - String url = "/api-gateway/booking/v1/reservations/" + reservationId + "/notes/" + dlNoteId + "/update-content"; - - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .ifMatch(String.valueOf(version)) - .build(); - - // 参数设置 - Map map = new HashMap<>(); - map.put("content", content); - - HttpResult httpResult = httpService.sslPost(url, headers, map); - - int responsecode = httpResult.getStatusCode(); - - if (responsecode >= 200 && responsecode < 300) { - result.setSuccess(true); - result.setMessage("Update note success"); - log.info("Update note success, reservation id: {}", reservationId); - } else { - result.setSuccess(false); - result.setMessage("Update note failed"); - log.warn("Update note failed, reservation id: {}", reservationId); - } - - } catch (Exception e) { - result.setSuccess(false); - result.setMessage("Update reservation note error"); - log.error("Update reservation note error: ", e); - } - - return result; - } - - public BaseApiResponse daylightGetNoteListById(String dlPropertyId, String reservationId) { - BaseApiResponse result = new BaseApiResponse<>(); - - try { - String url = "/api-gateway/booking/v1/reservations/" + reservationId + "/notes"; - - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .build(); - - // 参数设置 - Map map = new HashMap<>(); - - HttpResult httpResult = httpService.sslGetHttpResult(url, headers, map); - - int responsecode = httpResult.getStatusCode(); - - if (responsecode >= 200 && responsecode < 300) { - String responseStr = httpResult.getResult(); - - JSONObject jsonObject = JSONObject.parseObject(responseStr); - - JSONArray jsonArray = jsonObject.getJSONArray("results"); - - ReservationNoteResponse object = jsonArray.getObject(0, ReservationNoteResponse.class); - result.setData(object); - result.setSuccess(true); - } else { - result.setSuccess(false); - result.setMessage("Failed to get reservation note, id: " + reservationId); - } - } catch (Exception e) { - log.error("Get reservation note error, id: {}", reservationId, e); - result.setSuccess(false); - result.setMessage("Get reservation note error, id: " + reservationId); - } - - return result; - } - - public BaseApiResponse daylightCancelReservationNew( - String dlReservationId, - String dlPropertyId, - List dlSharerIds, - Long version) { - BaseApiResponse result = new BaseApiResponse<>(); - - try { - if (CollectionUtils.isNotEmpty(dlSharerIds)) { - daylightRemoveAccompanyingGuest(dlReservationId, dlPropertyId, dlSharerIds, version); - } - - String url = "/api-gateway/aggregator/v1/integrations/reservation/multiroom/cancel"; - - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .build(); - - JSONObject cancelRequest = buildCancelReservationRequest(dlReservationId, dlPropertyId); - - HttpResult httpResult = httpService.sslPost(url, headers, cancelRequest); - - log.info("Cancel reservation response code: {}", httpResult.getStatusCode()); - - if (httpResult.getStatusCode() == 201) { - - log.info("Cancel reservation response success, response code: {}", httpResult.getStatusCode()); - log.info("Cancel reservation response body: {}", JSON.toJSONString(httpResult.getResult())); - - result.setSuccess(true); - result.setMessage("Cancel reservation response success"); - - } else if (httpResult.getStatusCode() == 202) { - - Header[] respHeaders = httpResult.getRespHeaders(); - String operationUrl = ""; - for (Header header : respHeaders) { - if (header.getName().equals("Location")) { - operationUrl = header.getValue(); - break; - } - } - - JSONObject jsonObject = this.daylightCallOperationUrl(operationUrl, dlPropertyId); - - if (jsonObject.isEmpty()) { - result.setSuccess(false); - result.setMessage("Failed to cancel reservation"); - return result; - } - - String status = jsonObject - .getJSONObject("status") - .getString("status"); - - if ("Completed".equalsIgnoreCase(status)) { - String stepStage = jsonObject - .getJSONObject("data") - .getJSONArray("steps") - .getJSONObject(0) - .getString("stage"); - - if ("Completed".equalsIgnoreCase(stepStage)) { - result.setSuccess(true); - result.setMessage("Cancel reservation successful"); - log.info("Cancel reservation: {} successful", dlReservationId); - } else { - result.setSuccess(false); - result.setMessage("Cancel reservation failed"); - log.warn("Cancel reservation: {} failed", dlReservationId); - } - } else { - result.setSuccess(false); - result.setMessage("Failed to cancel reservation"); - log.warn("Failed to cancel reservation: {} failed", dlReservationId); - } - } else { - result.setSuccess(false); - result.setMessage("Failed to cancel reservation, response code: " + httpResult.getStatusCode()); - log.warn("Failed to cancel reservation: {}, response code: {}", dlReservationId, httpResult.getStatusCode()); - } - } catch (Exception e) { - result.setSuccess(false); - result.setMessage("Failed to cancel reservation"); - log.error("Failed to cancel reservation: {}", e.getMessage()); - } - - return result; - } - - private JSONObject daylightCallOperationUrl(String operationUrl, String dlPropertyId) { - - JSONObject jsonObject = new JSONObject(); - try { - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .build(); - - String responseData; - - int notRunCount = 0; - int inProgressCount = 0; - do { - responseData = httpService.sslGet(operationUrl, headers, new HashMap<>()); - - JSONObject jsonObject1 = JSON.parseObject(responseData); - - String string = - jsonObject1.getJSONObject("status").getString("status"); - - if (string.contains("Fail")) break; - - if (string.contains("NotRun")) { - notRunCount++; - continue; - } - - if (string.contains("InProgress")) { - inProgressCount++; - } - - // 让进程暂停1.5秒 by Mauve 20260909 - TimeUnit.MILLISECONDS.sleep(1500L); - } while ((responseData.contains("InProgress") || responseData.contains("NotRun")) && notRunCount < 20 && inProgressCount < 50); - - jsonObject = JSON.parseObject(responseData); - - } catch (Exception e) { - log.error("Call operation url failed: {}", operationUrl, e); - } - - return jsonObject; - } - - private JSONObject buildCancelReservationRequest(String dlReservationId, String dlPropertyId) { - - JSONObject json = new JSONObject(); - - json.put( - "identity", - new JSONObject() - .fluentPut("id", dlReservationId) - ); - - BaseApiResponse> listBaseApiResponse - = this.daylightGetCancelReasonList(dlPropertyId); - - List cancelReasonList; - if (listBaseApiResponse.isSuccess()) { - cancelReasonList = listBaseApiResponse.getData(); - } else { - throw new RuntimeException("Can not find cancel reason list, message: " + listBaseApiResponse.getMessage()); - } - - String planId = null; - for (CancelReasonResponse cancelReasonResponse : cancelReasonList) { - String code = cancelReasonResponse.getCode(); - if ("PLAN".equalsIgnoreCase(code)) { - planId = cancelReasonResponse.getId(); - break; - } - } - if (StringUtils.isEmpty(planId)) { - planId = cancelReasonList.getFirst().getId(); - } - - json.put("reasonId", planId); - - String processId = UUID.randomUUID().toString(); - - json.put( - "_flowControl", - new JSONObject() - .fluentPut("processId", processId) - ); - - log.info("Cancel reservation process id: {}", processId); - - return json; - } - - public DaylightReservationResponse getDaylightReservationByDlId( - String dlReservationId, - String dlPropertyId - ) { - DaylightReservationResponse resultResponse; - - try { - String url = "/api-gateway/booking/v1/reservations/" + dlReservationId - + "?extend=PurchaseElements,CustomFields"; - // 获取对应的值 - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .build(); - // 参数设置 - Map map = new HashMap<>(); - - String responseData = httpService.sslGet(url, headers, map); - resultResponse = JSON.parseObject(responseData, DaylightReservationResponse.class); - - } catch (Exception e) { - throw new RuntimeException(e); - } - - return resultResponse; - } - - public BaseApiResponse getReservationDoorKeyByConfirmationNumber( - String dlPropertyId, - String confirmationNumber - ) { - BaseApiResponse result = new BaseApiResponse<>(); - - try { - String url = "/api-gateway/booking/v1/reservations?pageNumber=1&pageSize=200&extend=DoorKeys&filter=confirmationNumber==" - + confirmationNumber; - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .build(); - Map map = new HashMap<>(); - - HttpResult httpResult = httpService.sslGetHttpResult(url, headers, map); - if (httpResult.getStatusCode() >= 200 && httpResult.getStatusCode() < 300) { - JSONObject response = JSON.parseObject(httpResult.getResult()); - JSONArray reservations = response.getJSONArray("results"); - ReservationDoorKeyResponse doorKeyResponse = new ReservationDoorKeyResponse(); - if (CollectionUtils.isNotEmpty(reservations)) { - JSONObject reservation = reservations.getJSONObject(0); - doorKeyResponse.setId(reservation.getString("id")); - - String roomId = reservation.getString("roomId"); - doorKeyResponse.setRoomId(roomId); - if (StringUtils.isNotBlank(roomId)) { - CfgDaylightConfiguration roomConfig = dlConfigurationDao.findByDlPropertyIdAndConfigName(dlPropertyId, "Room"); - if (roomConfig != null && StringUtils.isNotBlank(roomConfig.getConfigValue())) { - JSONArray roomArray = JSON.parseArray(roomConfig.getConfigValue()); - if (roomArray != null) { - for (int i = 0; i < roomArray.size(); i++) { - JSONObject roomObj = roomArray.getJSONObject(i); - if (roomId.equals(roomObj.getString("id"))) { - doorKeyResponse.setRoomNumber(roomObj.getString("code")); - break; - } - } - } - } - } - - JSONObject embedded = reservation.getJSONObject("_embedded"); - JSONObject doorKeys = embedded == null ? null : embedded.getJSONObject("doorKeys"); - Integer amount = doorKeys == null ? null : doorKeys.getInteger("doorKeyAmount"); - doorKeyResponse.setHasKey(amount != null && amount > 0); - } - result.setData(doorKeyResponse); - result.setSuccess(true); - } else { - result.setSuccess(false); - result.setMessage("Failed to get reservation door key, confirmationNumber: " + confirmationNumber); - log.error("Failed to get reservation door key, confirmationNumber={}, responseCode={}", confirmationNumber, httpResult.getStatusCode()); - } - } catch (Exception e) { - log.error("Get reservation door key error, confirmationNumber: {}", confirmationNumber, e); - result.setSuccess(false); - result.setMessage("Get reservation door key error, confirmationNumber: " + confirmationNumber); - } - - return result; - } - - public BaseApiResponse getReservationQueueByConfirmationNumber( - String dlPropertyId, - String confirmationNumber - ) { - BaseApiResponse result = new BaseApiResponse<>(); - ReservationQueueResponse queueResponse = new ReservationQueueResponse(); - - try { - BaseApiResponse reservationResult = - getReservationDoorKeyByConfirmationNumber(dlPropertyId, confirmationNumber); - ReservationDoorKeyResponse reservationData = reservationResult.getData(); - if (!reservationResult.isSuccess() || reservationData == null || StringUtils.isBlank(reservationData.getId())) { - result.setSuccess(false); - result.setMessage("Failed to get reservation id by confirmation number"); - return result; - } - - String url = "/api-gateway/housekeeping/v1/room-queues/current/reservation/" + reservationData.getId(); - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .build(); - - HttpResult httpResult = httpService.sslGetHttpResult(url, headers, new HashMap<>()); - if (httpResult.getStatusCode() >= 200 && httpResult.getStatusCode() < 300) { - JSONObject response = JSON.parseObject(httpResult.getResult()); - queueResponse.setId(reservationData.getId()); - queueResponse.setQueue(response != null && response.getJSONObject("current") != null); - result.setSuccess(true); - result.setData(queueResponse); - } else { - result.setSuccess(false); - result.setMessage("Failed to get reservation queue status"); - } - } catch (Exception e) { - result.setSuccess(false); - result.setMessage("Failed to get reservation queue status"); - log.error("Failed to get reservation queue status", e); - } - - return result; - } - - public List dayLightGetGuaranteeType(String dlPropertyId) { - - CfgDaylightConfiguration guaranteeType = - dlConfigurationDao.findByDlPropertyIdAndConfigName(dlPropertyId, "GuaranteeType"); - - String responseData = guaranteeType.getConfigValue(); - - JSONArray jsonObject = JSON.parseArray(responseData); - - List result = new ArrayList<>(); - - for (int i = 0; i < jsonObject.size(); i++) { - - boolean isActive = jsonObject.getJSONObject(i).getBoolean("isActive"); - - if (!isActive) { - continue; - } - - String id = jsonObject.getJSONObject(i).getString("id"); - String code = jsonObject.getJSONObject(i).getString("code"); - - GuaranteeTypeResponse guaranteeTypeResponse = new GuaranteeTypeResponse(); - guaranteeTypeResponse.setId(id); - guaranteeTypeResponse.setCode(code); - - result.add(guaranteeTypeResponse); - } - - return result; - } - - public List dayLightGetDistributeChannel(String dlPropertyId) { - - CfgDaylightConfiguration distributionChannel = - dlConfigurationDao.findByDlPropertyIdAndConfigName(dlPropertyId, "DistributionChannel"); - - String responseData = distributionChannel.getConfigValue(); - - JSONArray jsonObject = JSON.parseArray(responseData); - - List result = new ArrayList<>(); - - for (int i = 0; i < jsonObject.size(); i++) { - - boolean isActive = jsonObject.getJSONObject(i).getBoolean("isActive"); - - if (!isActive) { - continue; - } - - String id = jsonObject.getJSONObject(i).getString("id"); - String code = jsonObject.getJSONObject(i).getString("code"); - - DistributionChannelResponse distributionChannelResponse = new DistributionChannelResponse(); - distributionChannelResponse.setId(id); - distributionChannelResponse.setCode(code); - - result.add(distributionChannelResponse); - } - - return result; - } - - public BaseApiResponse> dayLightGetProfileByPlayerId(String playerId) { - BaseApiResponse> result = new BaseApiResponse<>(); - - List properties = propertyCache.getProperties(); - if (properties == null || properties.isEmpty()) { - log.error("[dayLightGetProfileByPlayerId] No DAYLIGHT properties configured, playerId={}", playerId); - result.setSuccess(false); - result.setMessage("No DAYLIGHT properties configured"); - return result; - } - CfgProperties cfgProperties = properties.getFirst(); - log.info("[dayLightGetProfileByPlayerId] Using property[0] dlPropertyId={}, totalProperties={}, playerId={}", - cfgProperties.getDlPropertyId(), properties.size(), playerId); - - try { - String url = "/api-gateway/profiles/v1/individual"; - // 获取对应的值 - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(cfgProperties.getDlPropertyId()) - .build(); - // 参数设置 - Map map = new HashMap<>(); - map.put("filter", "membershipDetails.manual.number==" + playerId); - - log.info("[dayLightGetProfileByPlayerId] Calling Daylight API, url={}, filter=membershipDetails.manual.number=={}", url, playerId); - HttpResult responseData = httpService.sslGetHttpResult(url, headers, map); - log.info("[dayLightGetProfileByPlayerId] Daylight API response statusCode={}", responseData.getStatusCode()); - Map mapResult = JSON.parseObject(responseData.getResult(), Map.class); - if (responseData.getStatusCode() >= 200 && responseData.getStatusCode() < 300) { - result.setSuccess(true); - - JSONArray results = mapResult.get("results"); - log.info("[dayLightGetProfileByPlayerId] results array={}, size={}", results != null ? "not null" : "null", results != null ? results.size() : 0); - - if (results == null || results.isEmpty()) { - log.warn("[dayLightGetProfileByPlayerId] Daylight returned empty results for playerId={}", playerId); - result.setSuccess(false); - result.setMessage("Daylight profile not found for playerId=" + playerId); - return result; - } - - ProfileDetailResponse object = results.getObject(0, ProfileDetailResponse.class); - log.info("[dayLightGetProfileByPlayerId] Found profile id={}, playerId={}", object != null ? object.getId() : "null", playerId); - - result.setData(List.of(object)); - } else { - result.setSuccess(false); - result.setMessage(responseData.getResult()); - log.warn("[dayLightGetProfileByPlayerId] Daylight API returned non-success statusCode={}, body={}", responseData.getStatusCode(), responseData.getResult()); - } - - } catch (Exception e) { - result.setSuccess(false); - result.setMessage("Failed to get DayLight Profile"); - log.error("[dayLightGetProfileByPlayerId] Failed to get DayLight Profile, playerId={}, error={}", playerId, e.getMessage(), e); - } - - return result; - } - - public ProfileDetailResponse dayLightGetProfileByProfileId(String profileId) { - ProfileDetailResponse result = new ProfileDetailResponse(); - - List properties = propertyCache.getProperties(); - if (properties == null || properties.isEmpty()) { - log.error("[dayLightGetProfileByProfileId] No DAYLIGHT properties configured, profileId={}", profileId); - return result; - } - CfgProperties cfgProperties = properties.getFirst(); - log.info("[dayLightGetProfileByProfileId] Using property[0] dlPropertyId={}, totalProperties={}, profileId={}", - cfgProperties.getDlPropertyId(), properties.size(), profileId); - - try { - String url = "/api-gateway/profiles/v1/individual/"+profileId; - // 获取对应的值 - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(cfgProperties.getDlPropertyId()) - .build(); - // 参数设置 - Map map = new HashMap<>(); - - log.info("[dayLightGetProfileByProfileId] Calling Daylight API, url={}, filter=id=={}", url, profileId); - HttpResult responseData = httpService.sslGetHttpResult(url, headers, map); - log.info("[dayLightGetProfileByProfileId] Daylight API response statusCode={}", responseData.getStatusCode()); - - if (responseData.getStatusCode() >= 200 && responseData.getStatusCode() < 300) { - result = JSON.parseObject(responseData.getResult(), ProfileDetailResponse.class); - } else { - log.warn("[dayLightGetProfileByProfileId] Daylight API returned non-success statusCode={}, body={}", responseData.getStatusCode(), responseData.getResult()); - } - - } catch (Exception e) { - log.error("[dayLightGetProfileByProfileId] Failed to get DayLight Profile, profileId={}, error={}", profileId, e.getMessage(), e); - } - - return result; - } - -// public List daylightGetProfileList(List dlProfileIdList) { -// -// if (CollectionUtils.isEmpty(dlProfileIdList)) { -// log.warn("Profile id list is empty"); -// return Collections.emptyList(); -// } -// -// List result = new ArrayList<>(); -// -// List properties = propertyCache.getProperties(); -// if (properties == null || properties.isEmpty()) { -// log.error("[daylightGetProfileList] No DAYLIGHT properties configured"); -// return result; -// } -// CfgProperties cfgProperties = properties.getFirst(); -// log.info("[dayLightGetProfileByProfileId] Using property[0] dlPropertyId={}, totalProperties={}, profileIdList={}", -// cfgProperties.getDlPropertyId(), properties.size(), dlProfileIdList); -// -// try { -// String url = "/api-gateway/profiles/v1/individual"; -// // 获取对应的值 -// Header[] headers = HttpHeaderBuilder.custom() -// .contentType("application/json") -// .ac_property_id(cfgProperties.getDlPropertyId()) -// .build(); -// // 参数设置 -// Map map = new HashMap<>(); -// -// String temp = dlProfileIdList.stream() -// .map(id -> "id==" + id) -// .collect(Collectors.joining(",")); -// -// map.put("filter", temp); -// -// HttpResult responseData = httpService.sslGetHttpResult(url, headers, map); -// log.info("[dayLightGetProfileByProfileId] Daylight API response statusCode={}", responseData.getStatusCode()); -// -// if (responseData.getStatusCode() >= 200 && responseData.getStatusCode() < 300) { -// -// } else { -// log.warn("[dayLightGetProfileByProfileId] Daylight API returned non-success statusCode={}, body={}", responseData.getStatusCode(), responseData.getResult()); -// } -// -// } catch (Exception e) { -// log.error("[dayLightGetProfileByProfileId] Failed to get DayLight Profile, profileId={}, error={}", profileId, e.getMessage(), e); -// } -// -// return result; -// } - - public List daylightAgebucketResponseList(String dlPropertyId) { - - CfgDaylightConfiguration daylightConfiguration = dlConfigurationDao.findByDlPropertyIdAndConfigName(dlPropertyId, "Agebucket"); - String responseData = daylightConfiguration.getConfigValue(); - - JSONArray jsonObject = JSON.parseArray(responseData); - - List result = new ArrayList<>(); - - for (int i = 0; i < jsonObject.size(); i++) { - - boolean isActive = jsonObject.getJSONObject(i).getBoolean("isActive"); - - if (!isActive) { - continue; - } - - String id = jsonObject.getJSONObject(i).getString("id"); - String code = jsonObject.getJSONObject(i).getString("code"); - - AgebucketResponse agebucketResponse = new AgebucketResponse(); - agebucketResponse.setId(id); - agebucketResponse.setCode(code); - - result.add(agebucketResponse); - } - - return result; - } - - public List getBookingRecordByProfileId_Optimize(String profileId, String playerId) { - List bookingList = new ArrayList<>(); - - propertyCache.refresh(); - List properties = propertyCache.getProperties(); - if (properties == null || properties.isEmpty()) { - log.warn("[getBookingRecordByProfileId_Optimize] No DAYLIGHT properties found, profileId={}", profileId); - return bookingList; - } - log.info("[getBookingRecordByProfileId_Optimize] totalProperties={}, profileId={}", properties.size(), profileId); - -// String currentDate = DateTimeUtil.getCurrentDate("yyyy-MM-dd"); - - String url = "/api-gateway/aggregator/v1/reservations?pageNumber=1&pageSize=40&filter=profileId==" + profileId - + ";(statusCode.code==DI,statusCode.code==RS,statusCode.code==DO,statusCode.code==IH,statusCode.code==CX)" -// + ";departureDate=ge=" + currentDate - + "&extend=PurchaseElements,CustomFields,Breakdown,DoorKeys&sort=-createdAt"; - Map map = new HashMap<>(); - try { - for (CfgProperties property : properties) { - String dlPropertyId = property.getDlPropertyId(); - if (StringUtils.isBlank(dlPropertyId)) { - log.warn("[getBookingRecordByProfileId_Optimize] Skipping property with null/blank dlPropertyId, propertyName={}", property.getName()); - continue; - } - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .build(); - log.info("[getBookingRecordByProfileId_Optimize] Querying property dlPropertyId={}", dlPropertyId); - String responseData = httpService.sslGet(url, headers, map); - JSONObject res = JSON.parseObject(responseData); - JSONArray bookings = res.getJSONArray("results"); - log.info("[getBookingRecordByProfileId_Optimize] Property dlPropertyId={}, bookings array size={}", dlPropertyId, bookings != null ? bookings.size() : 0); - bookingList.addAll(convertBookingDtoList(bookings, dlPropertyId, playerId)); - } - } catch (Exception e) { - log.error("[getBookingRecordByProfileId_Optimize] Exception while querying Daylight bookings, profileId={}, error={}", profileId, e.getMessage(), e); - throw new RuntimeException(e); - } - log.info("[getBookingRecordByProfileId_Optimize] Total bookings collected={}", bookingList.size()); - return bookingList; - } - - public List convertBookingDtoList(JSONArray bookings, String dlPropertyId, String playerId){ - List bookingList = new ArrayList<>(); - if(bookings==null || bookings.isEmpty()) { - log.info("[convertBookingDtoList] bookings is null or empty for dlPropertyId={}", dlPropertyId); - return bookingList; - } - log.info("[convertBookingDtoList] Processing {} raw bookings for dlPropertyId={}", bookings.size(), dlPropertyId); - Date currentTime = new Date(); - int skippedByCheckout = 0; - - for (int i = 0; i < bookings.size(); i++) { - - JSONObject bookingRes = bookings.getJSONObject(i); - BookingDto booking = new BookingDto(); - - Date checkinDate = DateTimeUtil.getDateFromString(bookingRes.getString("arrivalDate"),"yyyy-MM-dd"); - Date checkoutDate = DateTimeUtil.getDateFromString(bookingRes.getString("departureDate"),"yyyy-MM-dd"); - - LocalDate checkoutLocalDate = LocalDate.parse( - bookingRes.getString("departureDate"), - DateTimeFormatter.ofPattern("yyyy-MM-dd") - ); - - LocalDate currentDate = LocalDate.now(); - -// if (checkoutLocalDate.isBefore(currentDate)) { -// skippedByCheckout++; -// continue; -// } - - JSONArray jsonArray = bookingRes.getJSONArray("externalIds"); - if (CollectionUtils.isNotEmpty(jsonArray)) { - String dlExternalNo = jsonArray.getJSONObject(0).getString("number"); - booking.setDlExternalNo(dlExternalNo); - } else { - - String dlExternalNo = "UP1-" + UUID.randomUUID().toString().replace("-", ""); - - this.daylightSetExternalNo( - dlPropertyId, - bookingRes.getString("id"), - dlExternalNo, - bookingRes.getInteger("version") - ); - - booking.setDlExternalNo(dlExternalNo); - } - - booking.setPlayerId(playerId); - booking.setConfirmationNo(bookingRes.getString("confirmationNumber")); - booking.setDlReservationId(bookingRes.getString("id")); - booking.setCheckinDate(checkinDate); - booking.setCheckoutDate(checkoutDate); - booking.setDlAccountId(bookingRes.getString("accountId")); - booking.setDlChannelId(bookingRes.getString("channelId")); - booking.setDlSourceId(bookingRes.getString("sourceId")); - booking.setDlPropertyId(dlPropertyId); - booking.setDlRoomTypeId(bookingRes.getString("roomTypeId")); - booking.setDlReservationId(bookingRes.getString("id")); - booking.setDlGuaranteeTypeId(bookingRes.getString("guaranteeTypeId")); - booking.setDlProfileId(bookingRes.getString("profileId")); - booking.setDlBlockId(bookingRes.getString("blockId")); - - JSONObject sc = bookingRes.getJSONObject("statusCode"); - - booking.setLastOperaStatus(EnumBookingStatus.getStatusByDaylightStatus(sc.getString("description").toUpperCase())); - - String approveStatus = "CANCELED".equalsIgnoreCase(booking.getLastOperaStatus()) ? "C" : "N"; - booking.setApproveStatus(approveStatus); - - JSONObject embedded = bookingRes.getJSONObject("_embedded"); - if (embedded == null) { - log.warn("[convertBookingDtoList] _embedded is null for reservation id={}, confirmationNo={}, dlPropertyId={}", - bookingRes.getString("id"), bookingRes.getString("confirmationNumber"), dlPropertyId); - } else { - JSONArray customFields = embedded.getJSONArray("customFields"); - - if (customFields != null) { - for (int j = 0; j < customFields.size(); j++) { - JSONObject jsonObject = customFields.getJSONObject(j); - String value = jsonObject.getString("value"); - JSONObject valueJson = JSON.parseObject(value); - String booker = valueJson.getString("Booker"); - String approver = valueJson.getString("Approver"); - - if (StringUtils.isNotBlank(booker)) { - booking.setCreatedBy(booker); - booking.setBooker(booker); - } - - if (StringUtils.isNotBlank(approver)) { - // TODO 看看是要设置进approver还是approverdBy by Mauve 2026-07-07 - } - } - } - - JSONObject purchaseElementsJSON = embedded.getJSONObject("purchaseElements"); - - if (purchaseElementsJSON != null) { - JSONArray results = purchaseElementsJSON.getJSONArray("results"); - - String purchaseElementsId = null; - if (results != null && !results.isEmpty()) { - purchaseElementsId = results.getJSONObject(0).getString("id"); - } - - booking.setDlPurchaseElementId(purchaseElementsId); - } - - // Extract marketSegmentId and ratePlanId from breakdown, then resolve to code - JSONObject breakdownJSON = embedded.getJSONObject("breakdown"); - if (breakdownJSON != null) { - JSONArray breakdownResults = breakdownJSON.getJSONArray("results"); - if (breakdownResults != null && !breakdownResults.isEmpty()) { - JSONObject firstBreakdown = breakdownResults.getJSONObject(0); - String marketSegmentId = firstBreakdown.getString("marketSegmentId"); - JSONObject ratePricingDetails = firstBreakdown.getJSONObject("ratePricingDetails"); - String ratePlanId = ratePricingDetails != null ? ratePricingDetails.getString("ratePlanId") : null; - - if (StringUtils.isNotBlank(marketSegmentId)) { - CfgMarketCodes marketCode = marketCodeDao.findByDlMarketSegmentId(marketSegmentId); - if (marketCode != null) { - booking.setMarketCode(marketCode.getCode()); - } else { - log.warn("[convertBookingDtoList] MarketCode not found for dlMarketSegmentId={}, dlPropertyId={}", marketSegmentId, dlPropertyId); - } - } - if (StringUtils.isNotBlank(ratePlanId)) { - CfgRateCodes rateCode = rateCodeDao.findByDlRatePlanId(ratePlanId); - if (rateCode != null) { - booking.setRatePlanCode(rateCode.getCode()); - } else { - log.warn("[convertBookingDtoList] RateCode not found for dlRatePlanId={}, dlPropertyId={}", ratePlanId, dlPropertyId); - } - } - } - } - } - - String eta = bookingRes.getString("eta"); - if (eta != null) { - LocalDateTime dateTime = LocalDateTime.parse(eta); - String etaTime = dateTime.format(DateTimeFormatter.ofPattern("HH:mm")); - booking.setEta(etaTime); - } - booking.setDataTime(currentTime); - - JSONArray sharerArray = new JSONArray(); - //share - if(bookingRes.containsKey("accompanyingGuestProfileIds")){ - JSONArray sharerList = bookingRes.getJSONArray("accompanyingGuestProfileIds"); - if(!sharerList.isEmpty()){ - for (Object obj : sharerList) { - String profileId = String.valueOf(obj); - ProfileDetailResponse profileObj = this.dayLightGetProfileByProfileId(profileId); - String sharerPlayerId = ""; - String sharerName = ""; - try{ - sharerPlayerId = profileObj.getMemberships().getFirst().getNumber(); - } catch (Exception e) { - - } - String firstName = profileObj.getDetails().getFirstName(); - String lastName = profileObj.getDetails().getLastName(); - - if (lastName != null && firstName != null) { - sharerName = lastName + firstName; - } else if (lastName != null) { - sharerName = lastName; - } else if (firstName != null) { - sharerName = firstName; - } - if(!sharerPlayerId.isEmpty()){ - BaseApiResponse findPlayerResult = playerService.findPlayerProfileByPlayerIdAndUserId(sharerPlayerId, booking.getCreatedBy()); - if(findPlayerResult.isSuccess()) { - PlayerProfileEntry profile = findPlayerResult.getData(); - JSONObject sharerPlayer = new JSONObject(); - sharerPlayer.put("playerId", sharerPlayerId); - sharerPlayer.put("name", profile.getName()); - sharerPlayer.put("tierName", profile.getTierName()); - sharerArray.add(sharerPlayer); - } - }else if(!sharerName.isEmpty()){ - JSONObject sharerPlayer = new JSONObject(); - sharerPlayer.put("playerId", ""); - sharerPlayer.put("name", sharerName); - sharerPlayer.put("tierName", ""); - sharerArray.add(sharerPlayer); - } - - } - } - } - booking.setSharer(sharerArray.toJSONString()); - - bookingList.add(booking); - } - log.info("[convertBookingDtoList] dlPropertyId={}, raw={}, converted={}, skippedByCheckout={}", - dlPropertyId, bookings.size(), bookingList.size(), skippedByCheckout); - return bookingList; - } - - public BaseApiResponse daylightGetCompRulesByAccount(String dlPropertyId, String dlAccountId) { - BaseApiResponse result = new BaseApiResponse<>(); - JSONArray array = null; - try { - String url = "/api-gateway/cashiering/v1/accounts/" + dlAccountId + "/complimentary-rules"; - // 获取对应的值 - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .build(); - // 参数设置 - Map map = new HashMap<>(); - - String responseData = httpService.sslGet(url, headers, map); - - array = JSON.parseArray(responseData); - - } catch (Exception e) { - result.setSuccess(false); - result.setMessage("Failed to get dayLight comp rules for account: " + dlAccountId); - log.error("Failed to get dayLight comp rules: ", e); - } - - result.setSuccess(true); - result.setData(array); - - return result; - } - - public BaseApiResponse updateDaylightCompRule( - String dlAccountId, - String dlPropertyId, - String startDate, - String endDate, - CfgDaylightView daylightView, - String miscCharge - ) { - BaseApiResponse result = new BaseApiResponse<>(); - - BaseApiResponse compRuleListResponse = daylightGetCompRulesByAccount(dlPropertyId, dlAccountId); - - if (!compRuleListResponse.isSuccess() || compRuleListResponse.getData() == null) { - result.setSuccess(false); - result.setMessage(compRuleListResponse.getMessage()); - return result; - } - - JSONArray compRuleList = compRuleListResponse.getData(); - - String needCompRulesId = null; - Long version = null; - for (int i = 0; i < compRuleList.size(); i++) { - JSONObject one = compRuleList.getJSONObject(i); - - JSONObject complimentaryRuleLimits = one.getJSONObject("complimentaryRuleLimits"); - JSONObject totalAmountLimit = complimentaryRuleLimits.getJSONObject("totalAmountLimit"); - - if (totalAmountLimit != null) { - needCompRulesId = one.getString("id"); - version = one.getLong("version"); - break; - } - } - - if (StringUtils.isEmpty(needCompRulesId)) { - result.setSuccess(false); - result.setMessage("Not found comp rule"); - return result; - } - - try { - String url = "/api-gateway/cashiering/v1/accounts/" + dlAccountId + "/complimentary-rules/" + needCompRulesId; - - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .ifMatch(String.valueOf(version)) - .build(); - - UpdateCompRuleRequest updateCompRuleRequest = new UpdateCompRuleRequest(); - - ComplimentaryRuleLimits crl = getMiscChargeComplimentaryRuleLimits(startDate, endDate, miscCharge, daylightView.getSoftLimit()); - - updateCompRuleRequest.setComplimentaryRuleLimits(crl); - - BaseApiResponse updateResponse = updateCompRule(url, headers, updateCompRuleRequest); - - if (updateResponse.isSuccess()) { - result.setSuccess(true); - result.setMessage(updateResponse.getMessage()); - } else { - result.setSuccess(false); - result.setMessage(updateResponse.getMessage()); - } - } catch (Exception e) { - result.setSuccess(false); - result.setMessage(e.getMessage()); - LogUtil.error(DaylightService.class, e.getMessage()); - } - - return result; - } - - public BaseApiResponse createDaylightCompRule( - String dlAccountId, - String profileId, - String dlPropertyId, - String userId, - String startDate, - String endDate, - List daylightViewList, - String miscCharge - ) { - - BaseApiResponse result = new BaseApiResponse<>(); - - log.info("Start to create complimentary rule"); - - String dlBookingTypeName = daylightViewList.getFirst().getBookingType().getName(); - - if ("IM".equalsIgnoreCase(dlBookingTypeName)) { - result.setSuccess(false); - result.setMessage("IM booking type don't need to create complimentary rules"); - log.info("IM booking type don't need to create complimentary rules"); - return result; - } - - BaseApiResponse jsonArrayBaseApiResponse = daylightGetCompRulesByAccount(dlPropertyId, dlAccountId); - if (!jsonArrayBaseApiResponse.isSuccess() || jsonArrayBaseApiResponse.getData() == null) { - result.setSuccess(false); - result.setMessage(jsonArrayBaseApiResponse.getMessage()); - return result; - } - - int compRuleCount = jsonArrayBaseApiResponse.getData().size(); - boolean hasMiscCharge = miscCharge != null; - boolean createRoomOnlyCompRule = compRuleCount == 0; - boolean createDaylightViewCompRule = hasMiscCharge && compRuleCount <= 1; - - CfgDaylightView daylightViewRoomOnly = null; - CfgDaylightView daylightView = null; - - for (CfgDaylightView d : daylightViewList) { - if (d.getCompRuleCategory() == 1) { - daylightViewRoomOnly = d; - continue; - } - if (d.getCompRuleCategory() == 2) { - daylightView = d; - } - } - - if (daylightViewRoomOnly == null && daylightView == null) { - result.setSuccess(false); - result.setMessage("Daylight view room only and daylight view are null"); - return result; - } - - if (compRuleCount == 2) { - try { - return updateDaylightCompRule(dlAccountId, dlPropertyId, startDate, endDate, daylightView, miscCharge); - } catch (Exception e) { - result.setSuccess(false); - result.setMessage(e.getMessage()); - LogUtil.error(DaylightService.class, e.getMessage()); - return result; - } - } - - if (compRuleCount >= 2 || (!createRoomOnlyCompRule && !createDaylightViewCompRule)) { - result.setSuccess(true); - result.setMessage("No CompRule created"); - return result; - } - - try { - String url = "/api-gateway/cashiering/v1/accounts/" + dlAccountId + "/complimentary-rules"; - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .build(); - - String approver = daylightViewRoomOnly.getApprover(); - - BaseApiResponse requestorApproverByUserId; - if (StringUtils.isNotEmpty(approver)) { - requestorApproverByUserId = getDaylightRequestorApproverByUserId(dlPropertyId, approver); - } else { - requestorApproverByUserId = getDaylightRequestorApproverByUserId(dlPropertyId, userId); - } - - // 如果查不到 requestor/approver 直接返回 false - if (!requestorApproverByUserId.isSuccess()) { - result.setSuccess(false); - result.setMessage(requestorApproverByUserId.getMessage()); - - return result; - } - - RequestorApproverResponse returnData = requestorApproverByUserId.getData(); - - if (createRoomOnlyCompRule && daylightViewRoomOnly != null) { - CreateCompRuleRequest roomOnlyCompRuleRequest = buildRoomOnlyCompRuleRequest( - profileId, startDate, endDate, returnData, daylightViewRoomOnly,false); - BaseApiResponse createDefaultResult = createCompRule(url, headers, roomOnlyCompRuleRequest); - if (!createDefaultResult.isSuccess()) { - return createDefaultResult; - } - } - - if (createDaylightViewCompRule) { - BaseApiResponse daylightViewCompRuleRequest = buildDaylightViewCompRuleRequest( - profileId, startDate, endDate, daylightView, returnData, miscCharge); - if (!daylightViewCompRuleRequest.isSuccess()) { - result.setSuccess(false); - result.setMessage(daylightViewCompRuleRequest.getMessage()); - return result; - } - - BaseApiResponse createDaylightViewResult = createCompRule(url, headers, daylightViewCompRuleRequest.getData()); - if (!createDaylightViewResult.isSuccess()) { - return createDaylightViewResult; - } - } - - result.setSuccess(true); - result.setMessage("Create CompRule success"); - - } catch (Exception e) { - result.setSuccess(false); - result.setMessage(e.getMessage()); - LogUtil.error(DaylightService.class, "Error message: " + e.getMessage()); - } - - log.info("End to create complimentary rule, isSuccess={}", result.isSuccess()); - - return result; - } - - public BaseApiResponse createDaylightNewRoomOnlyCompRule( - String dlAccountId, - String profileId, - String dlPropertyId, - String userId, - String startDate, - String endDate, - CfgDaylightView daylightViewRoomOnly - ) { - - BaseApiResponse result = new BaseApiResponse<>(); - - log.info("Start to create new room only complimentary rule"); - - String dlBookingTypeName = daylightViewRoomOnly.getBookingType().getName(); - - if ("IM".equalsIgnoreCase(dlBookingTypeName)) { - result.setSuccess(false); - result.setMessage("IM booking type don't need to create complimentary rules"); - log.info("IM booking type don't need to create complimentary rules"); - return result; - } - - try { - String url = "/api-gateway/cashiering/v1/accounts/" + dlAccountId + "/complimentary-rules"; - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .build(); - - String approver = daylightViewRoomOnly.getApprover(); - - BaseApiResponse requestorApproverByUserId; - if (StringUtils.isNotEmpty(approver)) { - requestorApproverByUserId = getDaylightRequestorApproverByUserId(dlPropertyId, approver); - } else { - requestorApproverByUserId = getDaylightRequestorApproverByUserId(dlPropertyId, userId); - } - - // 如果查不到 requestor/approver 直接返回 false - if (!requestorApproverByUserId.isSuccess()) { - result.setSuccess(false); - result.setMessage(requestorApproverByUserId.getMessage()); - - return result; - } - - RequestorApproverResponse returnData = requestorApproverByUserId.getData(); - - CreateCompRuleRequest roomOnlyCompRuleRequest = buildRoomOnlyCompRuleRequest( - profileId, startDate, endDate, returnData, daylightViewRoomOnly,true); - BaseApiResponse createDefaultResult = createCompRule(url, headers, roomOnlyCompRuleRequest); - if (!createDefaultResult.isSuccess()) { - return createDefaultResult; - } - - result.setSuccess(true); - result.setMessage("Create CompRule success"); - - } catch (Exception e) { - result.setSuccess(false); - result.setMessage(e.getMessage()); - LogUtil.error(DaylightService.class, "Error message: " + e.getMessage()); - } - - log.info("End to create complimentary rule, isSuccess={}", result.isSuccess()); - - return result; - } - - private CreateCompRuleRequest buildRoomOnlyCompRuleRequest( - String profileId, - String startDate, - String endDate, - RequestorApproverResponse requestorApprover, - CfgDaylightView daylightView, - boolean setRuleLimits) { - CreateCompRuleRequest crr = new CreateCompRuleRequest(); - - crr.setComplimentaryTypeId(daylightView.getDlCompTypeId()); - crr.setPaymentMethodTransactionCodeId(daylightView.getDlPaymentMethodCodeId()); - crr.setExecutive(false); - crr.setDoNotIssueInvoice(false); - crr.setProfileId(profileId); - if(setRuleLimits) crr.setComplimentaryRuleLimits(getComplimentaryRuleLimits(startDate, endDate)); - - List compPresetList = compPresetDao.findAllByDaylightMappingId(daylightView.getId()); - CfgCompPreset compPreset = compPresetList.getFirst(); - - crr.setComplimentaryAccountingPresetsIds(List.of(compPreset.getDlCompPresetId())); - crr.setJustification(""); - crr.setRequestorId(requestorApprover.getId()); - crr.setApproverId(requestorApprover.getId()); - - return crr; - } - - private BaseApiResponse buildDaylightViewCompRuleRequest( - String profileId, - String startDate, - String endDate, - CfgDaylightView daylightView, - RequestorApproverResponse requestorApprover, - String miscCharge) { - BaseApiResponse result = new BaseApiResponse<>(); - - if (daylightView == null) { - result.setSuccess(false); - result.setMessage("Daylight config is empty"); - log.error("Daylight config is empty"); - return result; - } - - if (StringUtils.isBlank(daylightView.getDlCompTypeId())) { - result.setSuccess(false); - result.setMessage("Daylight comp type id is empty"); - log.error("Daylight comp type id is empty"); - return result; - } - - if (StringUtils.isBlank(daylightView.getDlPaymentMethodCodeId())) { - result.setSuccess(false); - result.setMessage("Daylight payment method code id is empty"); - log.error("Daylight payment method code id is empty"); - return result; - } - - List capIds = new ArrayList<>(); - if (CollectionUtils.isEmpty(daylightView.getCfgCompPresetList())) { - result.setSuccess(false); - result.setMessage("Daylight comp preset id is empty"); - log.error("Daylight comp preset id is empty"); - return result; - } - - for (CfgCompPreset cfgCompPreset : daylightView.getCfgCompPresetList()) { - if (cfgCompPreset != null && StringUtils.isNotBlank(cfgCompPreset.getDlCompPresetId())) { - capIds.add(cfgCompPreset.getDlCompPresetId()); - } - } - - List distinctCapIds = new ArrayList<>(new HashSet<>(capIds)); - - if (CollectionUtils.isEmpty(capIds)) { - result.setSuccess(false); - result.setMessage("Daylight comp preset id is empty"); - log.error("Daylight comp preset id is empty"); - return result; - } - - CreateCompRuleRequest crr = new CreateCompRuleRequest(); - crr.setComplimentaryTypeId(daylightView.getDlCompTypeId()); - crr.setPaymentMethodTransactionCodeId(daylightView.getDlPaymentMethodCodeId()); - crr.setExecutive(false); - crr.setDoNotIssueInvoice(false); - crr.setProfileId(profileId); - crr.setComplimentaryRuleLimits(getMiscChargeComplimentaryRuleLimits(startDate, endDate, miscCharge, daylightView.getSoftLimit())); - crr.setComplimentaryAccountingPresetsIds(distinctCapIds); - crr.setJustification(""); - crr.setRequestorId(requestorApprover.getId()); - crr.setApproverId(requestorApprover.getId()); - - result.setSuccess(true); - result.setData(crr); - return result; - } - - private BaseApiResponse updateCompRule(String url, Header[] headers, UpdateCompRuleRequest urr) throws Exception { - BaseApiResponse result = new BaseApiResponse<>(); - - log.info("Create comp rule request params: {}", JSON.toJSONString(urr)); - HttpResult httpResult = httpService.sslPatch(url, headers, urr); - - if (httpResult.getStatusCode() == 204) { - result.setSuccess(true); - result.setMessage("Update CompRule success"); - } else { - result.setSuccess(false); - result.setMessage("Update CompRule failed"); - result.setLogMessage(httpResult.getResult()); - - LogUtil.error(BookingService.class, "[recordSearch] updateDaylightCompRule failed: " + httpResult.getResult()); - } - - return result; - } - - private BaseApiResponse createCompRule(String url, Header[] headers, CreateCompRuleRequest crr) throws Exception { - BaseApiResponse result = new BaseApiResponse<>(); - - log.info("Create comp rule request params: {}", JSON.toJSONString(crr)); - HttpResult httpResult = httpService.sslPost(url, headers, crr); - - if (httpResult.getStatusCode() == 201) { - result.setSuccess(true); - result.setMessage("Create CompRule success"); - } else { - result.setSuccess(false); - result.setMessage("Create CompRule failed"); - result.setLogMessage(httpResult.getResult()); - - LogUtil.error(BookingService.class, "[recordSearch] createDaylightCompRule failed: " + httpResult.getResult()); - } - - return result; - } - - /** - * TODO 暂时写死, 之后参数可能需要多加几个 by Mauve - * @param startDate - * @param endDate - * @return - */ - private static @NonNull ComplimentaryRuleLimits getComplimentaryRuleLimits(String startDate, String endDate) { - - CompRuleDateRange dateRange = new CompRuleDateRange(); - dateRange.setStart(startDate); - dateRange.setEnd(endDate); - - ComplimentaryRuleLimits complimentaryRuleLimits = new ComplimentaryRuleLimits(); - complimentaryRuleLimits.setDateRanges(List.of(dateRange)); - - return complimentaryRuleLimits; - } - - private static @NonNull ComplimentaryRuleLimits getMiscChargeComplimentaryRuleLimits( - String startDate, - String endDate, - String miscCharge, - String daylightPercentage - ) { - CompRuleDateRange dateRange = new CompRuleDateRange(); - dateRange.setStart(startDate); - dateRange.setEnd(endDate); - - AmountLimit totalAmountLimit = new AmountLimit(); - totalAmountLimit.setCurrency("MOP"); - totalAmountLimit.setAmount(new BigDecimal(miscCharge.trim())); - - AmountLimit softTotalAmountLimit = new AmountLimit(); - softTotalAmountLimit.setCurrency("MOP"); - softTotalAmountLimit.setAmount(calculateAmount(miscCharge.trim(), daylightPercentage)); - - ComplimentaryRuleLimits complimentaryRuleLimits = new ComplimentaryRuleLimits(); -// complimentaryRuleLimits.setDateRanges(List.of(dateRange)); - - complimentaryRuleLimits.setTotalAmountLimit(totalAmountLimit); - - complimentaryRuleLimits.setSoftTotalAmountLimit(softTotalAmountLimit); - - return complimentaryRuleLimits; - } - - // 使用BigDecimal来计算金额以保留精度 by Mauve 2026-07-22 - private static BigDecimal calculateAmount(String amountStr, String percentStr) { - - BigDecimal amount = new BigDecimal(amountStr); - - BigDecimal percent = new BigDecimal(percentStr) - .divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP); - - return amount.multiply(percent) - .setScale(2, RoundingMode.HALF_UP); - } - - public BaseApiResponse getDaylightRequestorApproverByUserId(final String propertyId, final String userId) { - BaseApiResponse serviceResult = new BaseApiResponse<>(); - - try { - String url = "/api-gateway/resource-management/v1/resource?filter=code==" + userId + ";isActive==true"; - // 获取对应的值 - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(propertyId) - .build(); - // 参数设置 - Map map = new HashMap<>(); - String responseData = httpService.sslGet(url, headers, map); - JSONObject res = JSON.parseObject(responseData); - JSONArray raJson = res.getJSONArray("results"); - - RequestorApproverResponse result = convertRequestorApprover(raJson); - - if (result != null) { - serviceResult.setSuccess(true); - serviceResult.setData(result); - } else { - serviceResult.setSuccess(false); - serviceResult.setMessage("Convert failed"); - } - } catch (Exception e) { - serviceResult.setSuccess(false); - serviceResult.setMessage("Get requestor approver by userId failed"); - LogUtil.error(DaylightService.class, e.getMessage()); - } - - return serviceResult; - } - - private RequestorApproverResponse convertRequestorApprover(JSONArray raJson) { - - if (raJson == null || raJson.isEmpty()) return null; - - RequestorApproverResponse result = new RequestorApproverResponse(); - - // TODO 正常来讲应该只有一条数据在 raJson 中,而不会有多条数据 by Mauve - JSONObject jsonObject = raJson.getJSONObject(0); - - result.setId(jsonObject.getString("id")); - result.setFirstName(jsonObject.getString("firstName")); - result.setLastName(jsonObject.getString("lastName")); - result.setCode(jsonObject.getString("code")); - result.setVersion(jsonObject.getInteger("version")); - - return result; - } - - @Deprecated - public BaseApiResponse daylightReservationSetBlock( - String reservationId, - String propertyId, - String blockId) { - BaseApiResponse serviceResult = new BaseApiResponse<>(); - - try { - String url = "/api-gateway/booking/v1/reservations/" + reservationId + "/move-to-block"; - // 获取对应的值 - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(propertyId) - .build(); - - DaylightReservationResponse daylightReservationByDlId = getDaylightReservationByDlId(reservationId, propertyId); - Long version = daylightReservationByDlId.getVersion(); - - Map map = new HashMap<>(); - map.put("blockId", blockId); - map.put("version", version); - - HttpResult httpResult = httpService.sslPost(url, headers, map); - - if (httpResult.getStatusCode() >= 200 && httpResult.getStatusCode() < 300) { - serviceResult.setSuccess(true); - - LogUtil.info(DaylightService.class, "Set block Success"); - } else { - serviceResult.setSuccess(false); - serviceResult.setMessage("Set block failed"); - serviceResult.setLogMessage(httpResult.getResult()); - - LogUtil.error(DaylightService.class, "Set block failure"); - } - } catch (Exception e) { - serviceResult.setSuccess(false); - serviceResult.setMessage("Set block failed"); - LogUtil.error(DaylightService.class, e.getMessage()); - } - - return serviceResult; - } - - public BaseApiResponse daylightRemoveAccompanyingGuest( - String reservationId, - String dlPropertyId, - List dlSharerIds, - Long verion) { - BaseApiResponse serviceResult = new BaseApiResponse<>(); - - if (CollectionUtils.isEmpty(dlSharerIds)) { - serviceResult.setSuccess(true); - serviceResult.setMessage("Sharer does not exist"); - return serviceResult; - } - - try { - String url = "/api-gateway/booking/v1/reservations/" + reservationId + "/remove-accompanying-guest"; - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .ifMatch(verion.toString()) - .build(); - - // 第三方接口对同一预订加锁,必须串行调用;两次请求之间等待上一笔完成后再发下一笔 - final long requestIntervalMs = 1500L; - - for (int i = 0; i < dlSharerIds.size(); i++) { - if (i > 0) { - try { - TimeUnit.MILLISECONDS.sleep(requestIntervalMs); - } catch (InterruptedException ie) { - Thread.currentThread().interrupt(); - serviceResult.setSuccess(false); - serviceResult.setMessage("Remove accompanying guest interrupted"); - LogUtil.error(DaylightService.class, ie.getMessage()); - return serviceResult; - } - } - - String profileId = dlSharerIds.get(i); - Map body = new HashMap<>(2); - body.put("profileId", profileId); - - HttpResult httpResult = httpService.sslPost(url, headers, body); - int statusCode = httpResult.getStatusCode(); - if (statusCode < 200 || statusCode >= 300) { - serviceResult.setSuccess(false); - serviceResult.setMessage(String.format( - "Remove accompanying guest failed for profileId %s: HTTP %d", profileId, statusCode)); - LogUtil.error(DaylightService.class, httpResult.getResult()); - return serviceResult; - } - } - - serviceResult.setSuccess(true); - serviceResult.setMessage("Removed accompanying guest successfully"); - } catch (Exception e) { - serviceResult.setSuccess(false); - serviceResult.setMessage("Remove accompanying guest failed"); - LogUtil.error(DaylightService.class, e.getMessage()); - } - - return serviceResult; - } - - // 先留着不要删,可能后面会用上 by Mauve 2026-07-20 - public BaseApiResponse> daylightGetCancelReasonList(String dlPropertyId) { - - BaseApiResponse> response = new BaseApiResponse<>(); - - CfgDaylightConfiguration cancellationReason = - dlConfigurationDao.findByDlPropertyIdAndConfigName(dlPropertyId, "CancellationReason"); - - String configValue = cancellationReason.getConfigValue(); - - JSONArray list = JSON.parseArray(configValue); - - List result = new ArrayList<>(); - - for (int i = 0; i < list.size(); i++) { - JSONObject temp = list.getJSONObject(i); - - boolean isActive = temp.getBoolean("isActive"); - - if (!isActive) { - continue; - } - - String id = temp.getString("id"); - String code = temp.getString("code"); - String enContent = null; - - JSONArray descriptions = temp.getJSONArray("description"); - - for (int j = 0; j < descriptions.size(); j++) { - String languageCode = descriptions.getJSONObject(j).getString("languageCode"); - - if ("EN".equals(languageCode)) { - enContent = descriptions.getJSONObject(j).getString("content"); - break; - } - } - - if (StringUtils.isEmpty(enContent)) { - enContent = descriptions.getJSONObject(0).getString("content"); - } - - CancelReasonResponse cancelReasonResponse = - new CancelReasonResponse(); - - cancelReasonResponse.setId(id); - cancelReasonResponse.setCode(code); - cancelReasonResponse.setEnContent(enContent); - - result.add(cancelReasonResponse); - - if (CollectionUtils.isNotEmpty(result)) { - response.setData(result); - response.setSuccess(true); - } else { - response.setSuccess(false); - response.setMessage("No result"); - } - } - - return response; - } - - public BaseApiResponse daylightSetPost(String dlPropertyId, String dlAccountId) { - - BaseApiResponse response = new BaseApiResponse<>(); - - BaseApiResponse accountResponse = - daylightGetByAccountId(dlPropertyId, dlAccountId); - - if (!accountResponse.isSuccess()) { - response.setSuccess(false); - response.setMessage(accountResponse.getMessage()); - return response; - } - - AccountResponse accountData = accountResponse.getData(); - - try { - String url = "/api-gateway/cashiering/v1/reservation-accounts/" + dlAccountId; - // 获取对应的值 - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .ifMatch(String.valueOf(accountData.getVersion())) - .build(); - // 参数设置 - Map map = new HashMap<>(); - - map.put("noPost", false); - - HttpResult responseData = httpService.sslPatch(url, headers, map); - - if (responseData.getStatusCode() >= 200 && responseData.getStatusCode() < 300) { - response.setSuccess(true); - response.setMessage("Set post success"); - } else { - response.setSuccess(false); - response.setMessage("Set post failed"); - } - - } catch (Exception e) { - throw new RuntimeException(e); - } - - return response; - } - - public BaseApiResponse daylightGetByAccountId(String dlPropertyId, String dlAccountId) { - - BaseApiResponse response = new BaseApiResponse<>(); - - try { - String url = "/api-gateway/cashiering/v1/accounts/" + dlAccountId; - // 获取对应的值 - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .build(); - // 参数设置 - Map map = new HashMap<>(); - - HttpResult responseData = httpService.sslGetHttpResult(url, headers, map); - - if (responseData.getStatusCode() >= 200 && responseData.getStatusCode() < 300) { - response.setSuccess(true); - response.setMessage("Get account success"); - AccountResponse accountResponse = JSON.parseObject(responseData.getResult(), AccountResponse.class); - response.setData(accountResponse); - } else { - response.setSuccess(false); - response.setMessage("Get account failed"); - } - - } catch (Exception e) { - throw new RuntimeException(e); - } - - return response; - } - - public BaseApiResponse daylightChangeReservationByDlId( - Long bookingId, - String checkInDate, - String checkOutDate, - String dlPropertyId - ) { - try { - BaseApiResponse result = new BaseApiResponse<>(); - Bookings bookings = bookingDao.findById(bookingId).get(); - List cfgMarketCodes = marketCodeDao.findByCodeAndCategory(bookings.getMarketCode(), "DAYLIGHT"); - List rateCodes = rateCodeDao.findByCodeAndCategory(bookings.getRatePlanCode(), "DAYLIGHT"); - String marketCodeId = cfgMarketCodes.getFirst().getDlMarketSegmentId(); - String ratePlanId = rateCodes.getFirst().getDlRatePlanId(); - - String dlRoomTypeId = null; - CfgRooms room = roomDao.findById(bookings.getRoomId()).orElse(null); - List roomRoomType = room.getRoomRoomType(); - for(CfgRoomTypes type:roomRoomType) { - dlRoomTypeId = type.getDlRoomTypeId(); - if (dlRoomTypeId!=null) break; - } - - String dlReservationId = bookings.getDlReservationId(); - String url = "/api-gateway/booking/v1/reservations/" + dlReservationId + "/change-dates"; - - DaylightReservationResponse daylightReservationByDlId = getDaylightReservationByDlId(dlReservationId, dlPropertyId); - Long version = daylightReservationByDlId.getVersion(); - - Breakdown breakdown = new Breakdown(); - GuestForBreakdown guest = new GuestForBreakdown(); - RatePricingDetail ratePricingDetail = new RatePricingDetail(); - - SysAgebucket sysAgebucket = agebucketService.getSysAgebucket(dlPropertyId); - guest.setAgeBucketId(sysAgebucket.getDlAgeBucketId()); - - guest.setCount(1L); - List guests = new ArrayList<>(); - guests.add(guest); - ratePricingDetail.setRatePlanId(ratePlanId); - ratePricingDetail.setRoomTypeToChargeId(dlRoomTypeId); - breakdown.setRatePricingDetails(ratePricingDetail); - breakdown.setGuests(guests); - breakdown.setFromDate(checkInDate); - breakdown.setToDate(checkOutDate); - breakdown.setMarketSegmentId(marketCodeId); - List breakdowns = new ArrayList<>(); - breakdowns.add(breakdown); - Map params = new HashMap<>(); - - String etaStr = bookings.getEta() != null ? bookings.getEta() : ""; - - if (StringUtils.isNotBlank(etaStr) && etaStr.length() <= 5) - etaStr += ":00"; - - if (StringUtils.isNotBlank(etaStr)) - etaStr = checkInDate + "T" + etaStr; - - params.put("eta", etaStr); - - params.put("breakdown", breakdowns); - params.put("arrivalDate", checkInDate); - params.put("departureDate", checkOutDate); - params.put("blockId", bookings.getDlBlockId()); -// params.put("keepOriginalPrice",true); - // 获取对应的值 - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .ifMatch(String.valueOf(version)) - .build(); - - log.info("Change-date params: {}", JSON.toJSONString(params)); - - HttpResult submitResult = httpService.sslPost(url, headers,params); - String responseBody = submitResult.getResult(); - if (submitResult.getStatusCode() == 200 || submitResult.getStatusCode() == 201 || submitResult.getStatusCode() == 202) { - result.setSuccess(true); - result.setData(bookings); - }else{ - JSONObject rootNode = JSON.parseObject(responseBody); - String errorStr; - - JSONArray detailsNode = rootNode.getJSONArray("details"); - if (detailsNode != null && !detailsNode.isEmpty()) { - // 获取第一个 details 元素的 message - JSONObject firstDetail = detailsNode.getJSONObject(0); - String detailMessage = firstDetail.getString("message"); - - // 获取详细信息 - String errorCode = rootNode.getString("code"); - String correlationId = rootNode.getString("correlationId"); - - errorStr = String.format("Error: %s, Detail: %s, CorrelationId: %s", - errorCode, detailMessage, correlationId); - - } else { - errorStr = rootNode.getString("message"); - } - result.setSuccess(false); - result.setMessage(errorStr); - } - return result; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public BaseApiResponse daylightSetExternalNo( - String dlPropertyId, - String dlReservationId, - String dlExternalNo, - Number version) { - - BaseApiResponse response = new BaseApiResponse<>(); - - try { - String url = "/api-gateway/booking/v1/reservations/" + dlReservationId; - // 获取对应的值 - Header[] headers = HttpHeaderBuilder.custom() - .contentType("application/json") - .ac_property_id(dlPropertyId) - .ifMatch(String.valueOf(version)) - .build(); - // 参数设置 - Map map = new HashMap<>(); - - ReservationRequestDTO.ExternalIdDTO externalIdDTO - = new ReservationRequestDTO.ExternalIdDTO(); - - externalIdDTO.setSystemId(dlSystemId); - externalIdDTO.setNumber(dlExternalNo); - - map.put("externalIds", List.of(externalIdDTO)); - - HttpResult responseData = httpService.sslPatch(url, headers, map); - - if (responseData.getStatusCode() >= 200 && responseData.getStatusCode() < 300) { - response.setSuccess(true); - response.setMessage("Set external number success"); - } else { - response.setSuccess(false); - response.setMessage("Set external number failed"); - } - - } catch (Exception e) { - throw new RuntimeException(e); - } - - return response; - } -} diff --git a/src/main/java/com/mgm/mcrm/booking/controllers/BookingController.java b/src/main/java/com/mgm/mcrm/booking/controllers/BookingController.java index 6e0d110..3824d49 100644 --- a/src/main/java/com/mgm/mcrm/booking/controllers/BookingController.java +++ b/src/main/java/com/mgm/mcrm/booking/controllers/BookingController.java @@ -13,7 +13,7 @@ import com.mgm.mcrm.authorization.services.MgmUserService; import com.mgm.mcrm.authorization.services.SysGroupPermissionService; import com.mgm.mcrm.authorization.utils.JwtTokenUtil; import com.mgm.mcrm.basesetting.daylight.dtos.response.ProfileDetailResponse; -import com.mgm.mcrm.basesetting.daylight.services.DaylightService; +import com.mgm.mcrm.basesetting.daylight.services.DaylightApiService; import com.mgm.mcrm.booking.dtos.BookingDto; import com.mgm.mcrm.booking.dtos.daylight.requests.ChangeMiscChargeRequest; import com.mgm.mcrm.booking.dtos.search.*; @@ -81,7 +81,7 @@ public class BookingController { @Resource private WaitlistBookingService waitlistBookingService; @Autowired - private DaylightService daylightService; + private DaylightApiService daylightApiService; @Resource private BookingServiceMockup bookingServiceMockup; @@ -471,12 +471,12 @@ public class BookingController { List daylightResult = new ArrayList<>(); //去Daylight查ProfileId stepStartTime = System.currentTimeMillis(); - BaseApiResponse> profileResult = daylightService.dayLightGetProfileByPlayerId(playerId); + BaseApiResponse> profileResult = daylightApiService.dayLightGetProfileByPlayerId(playerId); List returnData = profileResult.getData(); if (profileResult.isSuccess()) { //Daylight存在 则去Daylight查Record 在Daylight不存在的话 跳过 ProfileDetailResponse profileDetailResponse = returnData.getFirst(); - daylightResult = daylightService.getBookingRecordByProfileId_Optimize(profileDetailResponse.getId(), playerId); + daylightResult = daylightApiService.getBookingRecordByProfileId_Optimize(profileDetailResponse.getId(), playerId); } else { LogUtil.warn(BookingService.class, "[recordSearch] Daylight profile lookup failed, message=" + profileResult.getMessage() + ", playerId=" + playerId); } diff --git a/src/main/java/com/mgm/mcrm/booking/services/BookingService.java b/src/main/java/com/mgm/mcrm/booking/services/BookingService.java index de04ca5..ca53c1d 100644 --- a/src/main/java/com/mgm/mcrm/booking/services/BookingService.java +++ b/src/main/java/com/mgm/mcrm/booking/services/BookingService.java @@ -23,7 +23,7 @@ import com.mgm.mcrm.basesetting.daylight.dtos.response.ProfileDetailResponse; import com.mgm.mcrm.basesetting.daylight.dtos.response.ReservationNoteResponse; import com.mgm.mcrm.basesetting.daylight.models.*; import com.mgm.mcrm.basesetting.daylight.repositories.*; -import com.mgm.mcrm.basesetting.daylight.services.DaylightService; +import com.mgm.mcrm.basesetting.daylight.services.DaylightApiService; import com.mgm.mcrm.basesetting.property.models.CfgProperties; import com.mgm.mcrm.basesetting.property.repositories.PropertyDao; import com.mgm.mcrm.basesetting.property.services.PropertyCache; @@ -160,7 +160,7 @@ public class BookingService { @Resource private SourceCodeDao sourceCodeDao; @Resource - private DaylightService dlService; + private DaylightApiService dlService; @Resource private AgebucketService agebucketService; @Resource diff --git a/src/main/java/com/mgm/mcrm/player/services/TodoService.java b/src/main/java/com/mgm/mcrm/player/services/TodoService.java index 6b78062..80b532c 100644 --- a/src/main/java/com/mgm/mcrm/player/services/TodoService.java +++ b/src/main/java/com/mgm/mcrm/player/services/TodoService.java @@ -10,7 +10,7 @@ import com.mgm.mcrm.appsetting.services.SysSettingService; import com.mgm.mcrm.authorization.dtos.LoginUserInfo; import com.mgm.mcrm.basesetting.daylight.dtos.response.ReservationDoorKeyResponse; import com.mgm.mcrm.basesetting.daylight.dtos.response.ReservationQueueResponse; -import com.mgm.mcrm.basesetting.daylight.services.DaylightService; +import com.mgm.mcrm.basesetting.daylight.services.DaylightApiService; import com.mgm.mcrm.basesetting.property.models.CfgProperties; import com.mgm.mcrm.basesetting.property.repositories.PropertyDao; import com.mgm.mcrm.basesetting.room.models.CfgOtherRoomStatus; @@ -120,7 +120,7 @@ public class TodoService { private BookingService bookingService; @Resource - private DaylightService dlService; + private DaylightApiService dlService; @Resource private BookingMapper bookingMapper; diff --git a/src/test/java/com/mgm/mcrm/booking/controllers/BookingControllerRecordSearchTest.java b/src/test/java/com/mgm/mcrm/booking/controllers/BookingControllerRecordSearchTest.java index 28d3ae5..d2cc0c7 100644 --- a/src/test/java/com/mgm/mcrm/booking/controllers/BookingControllerRecordSearchTest.java +++ b/src/test/java/com/mgm/mcrm/booking/controllers/BookingControllerRecordSearchTest.java @@ -2,27 +2,12 @@ package com.mgm.mcrm.booking.controllers; import com.mgm.mcrm.appsetting.models.CfgSettings; import com.mgm.mcrm.appsetting.services.SettingService; -import com.mgm.mcrm.appsetting.services.SysSettingService; -import com.mgm.mcrm.authorization.dtos.LoginUserInfo; -import com.mgm.mcrm.basesetting.daylight.dtos.response.ProfileDetailResponse; -import com.mgm.mcrm.basesetting.daylight.services.DaylightService; import com.mgm.mcrm.booking.dtos.BookingDto; -import com.mgm.mcrm.booking.dtos.search.BookingSearchRequest; -import com.mgm.mcrm.booking.services.BookingService; -import com.mgm.mcrm.booking.services.NonMGMBookingService; -import com.mgm.mcrm.booking.services.OperaDBBookingService; -import com.mgm.mcrm.booking.services.WaitlistBookingService; -import com.mgm.mcrm.booking.services.mockup.BookingServiceMockup; -import com.mgm.mcrm.common.constants.SysConstants; -import com.mgm.mcrm.common.dtos.BaseApiResponse; -import com.mgm.mcrm.common.dtos.mgm_api.PlayerProfileEntry; -import com.mgm.mcrm.player.services.PlayerService; import org.junit.jupiter.api.Test; import org.springframework.test.util.ReflectionTestUtils; import java.lang.reflect.Method; import java.util.ArrayList; -import java.util.Collections; import java.util.Date; import java.util.List;