From 32945d7469d1ae7af9823cc71fb2d87a250606e4 Mon Sep 17 00:00:00 2001 From: Mauve Date: Tue, 29 Sep 2026 21:55:52 +0800 Subject: [PATCH] update --- pom.xml | 2 +- .../controllers/SSORestProcessController.java | 3 + .../approval/service/ApprovalService.java | 49 +- .../daylight/services/DaylightApiService.java | 26 +- .../dtos/opera/GuestRequestsRequest.java | 13 +- .../mgm/mcrm/booking/models/BookingsView.java | 2 + .../mcrm/booking/services/BookingService.java | 230 +++-- .../services/NonMGMBookingService.java | 3 +- .../mcrm/booking/services/OperaService.java | 2 +- .../services/WaitlistBookingService.java | 14 +- .../mgm/mcrm/common/constants/SysCommon.java | 23 + .../common/httpclient/HttpSslSupport.java | 58 +- .../mcrm/common/listener/ConfigListener.java | 17 + .../services/ConfigurableTrustHandler.java | 63 ++ .../common/services/MGMEsbLimoApiService.java | 4 +- .../com/mgm/mcrm/common/utils/HttpUtil.java | 96 +- .../com/mgm/mcrm/common/utils/SOAPUtil.java | 85 +- .../com/mgm/mcrm/common/utils/SendEmail.java | 9 +- .../mcrm/limo/controller/LimoController.java | 33 +- .../GetLimoBookingGetOverriderRequest.java | 1 + .../dtos/request/GetLimoLocationRequest.java | 8 + .../mgm/mcrm/limo/services/LimoService.java | 3 +- .../SysLogDeviceTokenController.java | 2 +- .../controllers/NotificationController.java | 23 +- .../CountNotificationByUserIdRequest.java | 8 + .../dtos/request/EmailProxyRequest.java | 29 + .../services/EmailTemplateService.java | 5 +- .../services/SendEmailService.java | 907 ++++++++++++++++++ .../mgm/mcrm/player/services/TodoService.java | 9 +- src/main/resources/application-dev.yml | 13 +- src/main/resources/idp-metadata.xml | 1 - 31 files changed, 1473 insertions(+), 268 deletions(-) create mode 100644 src/main/java/com/mgm/mcrm/common/services/ConfigurableTrustHandler.java create mode 100644 src/main/java/com/mgm/mcrm/limo/dtos/request/GetLimoLocationRequest.java create mode 100644 src/main/java/com/mgm/mcrm/notification/dtos/request/CountNotificationByUserIdRequest.java create mode 100644 src/main/java/com/mgm/mcrm/notification/dtos/request/EmailProxyRequest.java create mode 100644 src/main/java/com/mgm/mcrm/notification/services/SendEmailService.java delete mode 100644 src/main/resources/idp-metadata.xml diff --git a/pom.xml b/pom.xml index ee28e21..07e7bed 100644 --- a/pom.xml +++ b/pom.xml @@ -123,7 +123,7 @@ org.springdoc springdoc-openapi-starter-webmvc-ui - 2.8.17 + 3.1.1 com.microsoft.sqlserver diff --git a/src/main/java/com/mgm/mcrm/adfs/controllers/SSORestProcessController.java b/src/main/java/com/mgm/mcrm/adfs/controllers/SSORestProcessController.java index 705c8d3..f58435f 100644 --- a/src/main/java/com/mgm/mcrm/adfs/controllers/SSORestProcessController.java +++ b/src/main/java/com/mgm/mcrm/adfs/controllers/SSORestProcessController.java @@ -392,6 +392,7 @@ public class SSORestProcessController { form.add(new BasicNameValuePair("Kmsi", "True")); UrlEncodedFormEntity entity = new UrlEncodedFormEntity(form, StandardCharsets.UTF_8); StreamUtils.copy(entity.getContent(), request.getBody()); + request.getHeaders().add("Content-Length", String.valueOf(entity.getContentLength())); clientResponse = request.execute(); }catch(Exception err) { errorCode="RequestFailed"; @@ -423,6 +424,7 @@ public class SSORestProcessController { form.add(new BasicNameValuePair("AuthMethod", "AzureMfaAuthentication")); UrlEncodedFormEntity entity = new UrlEncodedFormEntity(form, StandardCharsets.UTF_8); StreamUtils.copy(entity.getContent(), request.getBody()); + request.getHeaders().add("Content-Length", String.valueOf(entity.getContentLength())); clientResponse = request.execute(); }catch(Exception err) { errorCode="RequestFailed"; @@ -456,6 +458,7 @@ public class SSORestProcessController { form.add(new BasicNameValuePair("__EVENTTARGET", eventTarget)); UrlEncodedFormEntity entity = new UrlEncodedFormEntity(form, StandardCharsets.UTF_8); StreamUtils.copy(entity.getContent(), request.getBody()); + request.getHeaders().add("Content-Length", String.valueOf(entity.getContentLength())); clientResponse = request.execute(); }catch(Exception err) { errorCode="RequestFailed"; diff --git a/src/main/java/com/mgm/mcrm/approval/service/ApprovalService.java b/src/main/java/com/mgm/mcrm/approval/service/ApprovalService.java index 42903c7..8b4605b 100644 --- a/src/main/java/com/mgm/mcrm/approval/service/ApprovalService.java +++ b/src/main/java/com/mgm/mcrm/approval/service/ApprovalService.java @@ -58,13 +58,12 @@ import com.mgm.mcrm.common.jms.BookingControlMsgSender; import com.mgm.mcrm.common.services.MGMEsbApiService; import com.mgm.mcrm.common.utils.DateTimeUtil; import com.mgm.mcrm.common.utils.LogUtil; -import com.mgm.mcrm.common.utils.SendEmail; import com.mgm.mcrm.logging.models.SysLogBooking; import com.mgm.mcrm.logging.repositories.SysLogBookingDao; import com.mgm.mcrm.logging.services.SysLogBookingService; import com.mgm.mcrm.notification.models.Email; import com.mgm.mcrm.notification.repositories.EmailDao; -import com.mgm.mcrm.player.dtos.request.TodoChangeDateRequest; +import com.mgm.mcrm.notification.services.SendEmailService; import com.mgm.mcrm.player.services.PlayerService; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; @@ -149,6 +148,8 @@ public class ApprovalService { private NonMGMBookingService nonMGMBookingService; @Autowired private TeamStructureDao teamStructureDao; + @Resource + private SendEmailService sendEmailService; public BaseApiResponse> getRequestReason() throws Exception { // 新建對象 @@ -930,7 +931,7 @@ public class ApprovalService { email.setCreatedAt(creatdDate); email.setCreatedBy(originBooking.getCreatedBy()); emailBook.setCategory("OTHER"); - email = SendEmail.sendApprovalNewEmail(emailBook, originBookingView,email,userId,userName,true,false,emailAddress.getKeyValues()); + email = sendEmailService.sendApprovalNewEmail(emailBook, originBookingView,email,userId,userName,true,false,emailAddress.getKeyValues()); if(email.getStatus()==1) { originBooking.setApproveStatus("AA"); bookingDao.save(originBooking); @@ -968,7 +969,7 @@ public class ApprovalService { email.setCreatedAt(creatdDate); email.setCreatedBy(originBooking.getCreatedBy()); - email = SendEmail.sendApprovalNewEmail(emailBook, originBookingView,email,userId,userName,false,true,emailAddress.getKeyValues()); + email = sendEmailService.sendApprovalNewEmail(emailBook, originBookingView,email,userId,userName,false,true,emailAddress.getKeyValues()); emailDao.save(email); } @@ -988,7 +989,7 @@ public class ApprovalService { email.setCreatedAt(creatdDate); email.setCreatedBy(originBooking.getCreatedBy()); - email = SendEmail.sendApprovalExtendEmail(emailBook, originBookingView,email,userId,userName,originBookingView,false,emailAddress.getKeyValues()); + email = sendEmailService.sendApprovalExtendEmail(emailBook, originBookingView,email,userId,userName,originBookingView,false,emailAddress.getKeyValues()); LogUtil.info(ApprovalService.class,"Send Email Approved Id = "+originBooking.getId()); if(email.getStatus()==1) { originBooking.setApproveStatus("AA"); @@ -1003,33 +1004,24 @@ public class ApprovalService { response.setMessage("Send Email Failed"); } }else if (Strings.CS.equals(properties.getCategory(),"DAYLIGHT")) { - //调用daylight接口去Extend Booking - BaseApiResponse findPlayerResult = playerService.findPlayerProfileByPlayerIdAndUserId(originBooking.getPlayerId(), userId); - if(findPlayerResult.isSuccess()) { + BaseApiResponse findPlayerResult = playerService + .findPlayerProfileByPlayerIdAndUserId(originBooking.getPlayerId(), userId); + if (!findPlayerResult.isSuccess() || findPlayerResult.getData() == null) { + response.setSuccess(false); + response.setCode("Player Profile Not Found"); + } else { + BaseApiResponse> extendResult = bookingService.extendDaylightApprovalBooking( + originBooking, findPlayerResult.getData(), userId, userName); + if (extendResult.isSuccess()) { originBooking.setApproveStatus("AA"); bookingDao.save(originBooking); - }else{ - response.setSuccess(false); - response.setCode("Player Profile Not Found"); - } - //Directly send email when submit Approval Routing for daylight - BookingsView originBookingView = bookingViewDao.findById(Long.parseLong(originBooking.getApprovalBookingId())); - originBookingView = this.getEmailInfo(originBookingView,originBookingView.getCreatedBy()).getData(); - Email email = new Email(); - - email.setBookId(originBooking.getId()); - email.setCreatedAt(creatdDate); - email.setCreatedBy(originBooking.getCreatedBy()); - - email = SendEmail.sendApprovalExtendEmail(originBooking, originBookingView,email,userId,userName,bookingView,isOtherOverBook,emailAddress.getKeyValues()); - if(email.getStatus()==1) { - emailDao.save(email); response.setSuccess(true); response.setData(approvalMapper.toSubmitApprovalResponse(originBooking)); - }else{ + } else { response.setSuccess(false); - response.setMessage("Send Email Failed"); - response.setLogMessage("Send Email Failed"); + response.setMessage(extendResult.getMessage()); + response.setLogMessage(extendResult.getLogMessage()); + } } }else{ //send email instead of sync other booking @@ -1041,7 +1033,7 @@ public class ApprovalService { email.setCreatedAt(creatdDate); email.setCreatedBy(originBooking.getCreatedBy()); - email = SendEmail.sendApprovalExtendEmail(originBooking, originBookingView,email,userId,userName,bookingView,isOtherOverBook,emailAddress.getKeyValues()); + email = sendEmailService.sendApprovalExtendEmail(originBooking, originBookingView,email,userId,userName,bookingView,isOtherOverBook,emailAddress.getKeyValues()); if(email.getStatus()==1) { originBooking.setApproveStatus("AA"); bookingDao.save(originBooking); @@ -1480,5 +1472,4 @@ public class ApprovalService { booking.setUpdatedAt(now); bookingDao.save(booking); } - } diff --git a/src/main/java/com/mgm/mcrm/basesetting/daylight/services/DaylightApiService.java b/src/main/java/com/mgm/mcrm/basesetting/daylight/services/DaylightApiService.java index 410e734..2378e68 100644 --- a/src/main/java/com/mgm/mcrm/basesetting/daylight/services/DaylightApiService.java +++ b/src/main/java/com/mgm/mcrm/basesetting/daylight/services/DaylightApiService.java @@ -1554,13 +1554,13 @@ public class DaylightApiService { .build(); String approver = daylightViewRoomOnly.getApprover(); - boolean isMansion = StringUtils.containsIgnoreCase(roomName, "mansion"); - String requestorUserId = StringUtils.isNotEmpty(approver) && isMansion ? userId + boolean isVillaOrMansion = isVillaOrMansionRoom(roomName); + String requestorUserId = StringUtils.isNotEmpty(approver) && isVillaOrMansion ? userId : StringUtils.isNotEmpty(approver) ? approver : userId; BaseApiResponse requestorResponse = getDaylightRequestorApproverByUserId(dlPropertyId, requestorUserId); BaseApiResponse approverResponse = - StringUtils.isNotEmpty(approver) && !isMansion + StringUtils.isNotEmpty(approver) && !isVillaOrMansion ? requestorResponse : StringUtils.isNotEmpty(approver) ? getDaylightRequestorApproverByUserId(dlPropertyId, approver) @@ -1616,6 +1616,11 @@ public class DaylightApiService { return result; } + static boolean isVillaOrMansionRoom(String roomName) { + return StringUtils.equalsAnyIgnoreCase(StringUtils.substringBefore(roomName, "-"), + "V1", "V2", "V2M", "V3", "S3", "M1", "M2", "M3"); + } + public BaseApiResponse createDaylightNewRoomOnlyCompRule( String dlAccountId, String profileId, @@ -1774,11 +1779,22 @@ public class DaylightApiService { crr.setExecutive(false); crr.setDoNotIssueInvoice(false); crr.setProfileId(profileId); - crr.setComplimentaryRuleLimits(getMiscChargeComplimentaryRuleLimits(startDate, endDate, miscCharge, daylightView.getSoftLimit())); + crr.setComplimentaryRuleLimits( + getMiscChargeComplimentaryRuleLimits(startDate, endDate, miscCharge, daylightView.getSoftLimit()) + ); crr.setComplimentaryAccountingPresetsIds(distinctCapIds); crr.setJustification(""); crr.setRequestorId(requestor.getId()); - crr.setApproverId(approver.getId()); + + String paymentMethodCodeContent = daylightView.getPaymentMethodCodeContent(); + + if (StringUtils.isNotBlank(paymentMethodCodeContent) && + "Comp Settlement - Comp Room Incidentals Settlement".equalsIgnoreCase(paymentMethodCodeContent) + ) { + crr.setApproverId(requestor.getId()); + } else { + crr.setApproverId(approver.getId()); + } result.setSuccess(true); result.setData(crr); diff --git a/src/main/java/com/mgm/mcrm/booking/dtos/opera/GuestRequestsRequest.java b/src/main/java/com/mgm/mcrm/booking/dtos/opera/GuestRequestsRequest.java index 0f618ce..046b3c2 100644 --- a/src/main/java/com/mgm/mcrm/booking/dtos/opera/GuestRequestsRequest.java +++ b/src/main/java/com/mgm/mcrm/booking/dtos/opera/GuestRequestsRequest.java @@ -5,6 +5,7 @@ import com.mgm.mcrm.booking.dtos.opera.schema.*; import com.mgm.mcrm.common.utils.SOAPUtil; import jakarta.xml.soap.SOAPMessage; import lombok.Data; +import org.apache.commons.lang3.Strings; import javax.xml.namespace.QName; import java.util.ArrayList; @@ -44,13 +45,21 @@ public class GuestRequestsRequest { this.requestString.append(" "); this.requestString.append(" "+this.confirmationNo+""); if(this.comment!=null) { - this.requestString.append(" ADD"); + if (this.actionType!=null) { + this.requestString.append(" "+this.actionType+""); + }else{ + this.requestString.append(" ADD"); + } this.requestString.append(" COMMENTS"); this.requestString.append(" "+this.fullOverlay+""); this.requestString.append(" "); this.requestString.append(" "); this.requestString.append(" "); this.requestString.append(" "+this.comment+""); + if(this.commentId!=null){ + this.requestString.append(" "+this.commentId+""); + this.requestString.append(" false"); + } if(this.commentType!=null) { this.requestString.append(" "+this.commentType+""); } @@ -87,7 +96,7 @@ public class GuestRequestsRequest { this.requestString.append(" "); this.requestString.append(" "); this.requestString.append(""); - + return this.requestString; } diff --git a/src/main/java/com/mgm/mcrm/booking/models/BookingsView.java b/src/main/java/com/mgm/mcrm/booking/models/BookingsView.java index f8ae8a8..303a111 100644 --- a/src/main/java/com/mgm/mcrm/booking/models/BookingsView.java +++ b/src/main/java/com/mgm/mcrm/booking/models/BookingsView.java @@ -248,6 +248,8 @@ public class BookingsView implements Serializable { private String failPlatform; @Column(name="booking_approval_reason") private String bookingApprovalReason; + @Column(name="source_code") + private String sourceCode; @Transient private String status; 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 dac9e54..8efe4f9 100644 --- a/src/main/java/com/mgm/mcrm/booking/services/BookingService.java +++ b/src/main/java/com/mgm/mcrm/booking/services/BookingService.java @@ -60,10 +60,10 @@ import com.mgm.mcrm.common.jms.BookingControlMsgSender; import com.mgm.mcrm.common.utils.DaoUtil; import com.mgm.mcrm.common.utils.DateTimeUtil; import com.mgm.mcrm.common.utils.LogUtil; -import com.mgm.mcrm.common.utils.SendEmail; import com.mgm.mcrm.logging.services.SysLogBookingService; import com.mgm.mcrm.notification.models.Email; import com.mgm.mcrm.notification.repositories.EmailDao; +import com.mgm.mcrm.notification.services.SendEmailService; import com.mgm.mcrm.player.dtos.request.TodoChangeDateRequest; import com.mgm.mcrm.player.dtos.response.DaylightReservationResponse; import com.mgm.mcrm.player.services.PlayerService; @@ -174,6 +174,8 @@ public class BookingService { private BookingTypeDao bookingTypeDao; @Resource private CfgCompRuleDao cfgCompRuleDao; + @Resource + private SendEmailService sendEmailService; @Autowired private BookingMapper bookingMapper; @@ -514,14 +516,16 @@ public class BookingService { String operaComment = ""; String stayDateForOpera = DateTimeUtil.formatOperaCommentStayDateRange( checkinDate, checkoutDate, Integer.valueOf(numOfNight)); - // 生成给 OPERA 的 comment:根据 misCharge 是否为空决定是否包含 INC.CHRG$ 相关信息 - if (param.getMiscCharge() == null || param.getMiscCharge().trim().isEmpty()) { + // IM 使用 GOA/TBA 和 deposit/post 模板,其他类型根据 miscCharge 生成 RM 模板。 + if ("IM".equalsIgnoreCase(cfgBookingType.getName())) { + operaComment = buildIMComment(booking); + } else if (param.getMiscCharge() == null || param.getMiscCharge().trim().isEmpty()) { operaComment = "(RM)COMP ..APP\n\n" + stayDateForOpera + ",OD," + userId; } else { // 这里 *** 替换为 mischarge 的实际值 operaComment = "(RM+INC$" + param.getMiscCharge() + ")COMP ..APP\n\n" + "INC.CHRG$" + param.getMiscCharge() + "COMP BY " + booking.getBooker() + " ..APP\n" - + stayDateForOpera + ",OD," + userId; + + stayDateForOpera + ","+booking.getSourceCode()+"," + userId; } booking.setOperaComment(operaComment); @@ -1471,7 +1475,7 @@ public class BookingService { email.setBookId(booking.getId()); email.setCreatedAt(new Date()); email.setCreatedBy(booking.getCreatedBy()); - email = SendEmail.sendCreateR2Y2NewEmail(booking, originBookingView,email,userId,booking.getCreatedByName(), false, true, emailAddress.getKeyValues()); + email = sendEmailService.sendCreateR2Y2NewEmail(booking, originBookingView,email,userId,booking.getCreatedByName(), false, true, emailAddress.getKeyValues()); if (email.getStatus() == 1) { emailDao.save(email); @@ -2242,7 +2246,7 @@ public class BookingService { CfgSettings emailAddress = settingService.getSettingByKey(SysConstants.MGM_EMAIL_ADDRESS); - email = SendEmail.sendExtendEmail(emailBook, originBook, email, userId, userName, emailAddress.getKeyValues()); + email = sendEmailService.sendExtendEmail(emailBook, originBook, email, userId, userName, emailAddress.getKeyValues()); if (email.getStatus() == 1) { processResult.setSuccess(true); @@ -2406,7 +2410,7 @@ public class BookingService { //判断SourceCode 如果为OD 或 VMTK 且没有Sharer 直接extend TodoChangeDateRequest changeRequest = bookingMapper.bookingDtoToChangeRequest(param); - BaseApiResponse> result = this.daylightReservationChangeDate(changeRequest, player, true); + BaseApiResponse> result = this.daylightReservationChangeDate(changeRequest, player, true, false); if (result.isSuccess()) { processResult.setSuccess(true); @@ -2415,36 +2419,6 @@ public class BookingService { processResult.setSuccess(false); processResult.setMessage(result.getMessage()); } - - if (result.isSuccess()) { - if ((!booking.getSourceCode().isEmpty() && !Strings.CS.containsAny(booking.getSourceCode(),"OD","VMKT")) - || - (booking.getSharer() != null && !Strings.CS.equals(booking.getSharer(),"[]"))) { - //send email instead of sync other booking - Date now = new Date(); - CfgSettings emailAddress = settingService.getSettingByKey(SysConstants.MGM_EMAIL_ADDRESS); - BookingsView originBookingView = bookingViewDao.findById(bookId).orElse(null); - originBookingView = this.getEmailInfo(originBookingView,originBookingView.getCreatedBy()).getData(); - booking.setCheckoutDate( - DateTimeUtil.getDateFromString(param.getChangeCheckoutDate(), "yyyy-MM-dd")); - - Email email = new Email(); - email.setBookId(booking.getId()); - email.setCreatedAt(now); - email.setCreatedBy(booking.getCreatedBy()); - email = SendEmail.sendExtendEmail(booking, originBookingView,email,userId,userName,emailAddress.getKeyValues()); - - if(email.getStatus()==1) { - emailDao.save(email); - processResult.setSuccess(true); - processResult.setData(resultBookings); - }else{ - processResult.setSuccess(false); - processResult.setMessage("Send Email Failed"); - processResult.setLogMessage("Send Email Failed"); - } - } - } }else if (isApproval){ booking.setCheckinDate( originBook.getCheckoutDate() @@ -2486,7 +2460,8 @@ public class BookingService { return processResult; } - public BaseApiResponse> daylightReservationChangeDate(TodoChangeDateRequest param, PlayerProfileEntry player, boolean isExtend) throws Exception { + public BaseApiResponse> daylightReservationChangeDate(TodoChangeDateRequest param, + PlayerProfileEntry player, boolean isExtend, boolean isApprovalExtend) throws Exception { BaseApiResponse> processResult = new BaseApiResponse<>(); Date createDate = DateTimeUtil.getCurrentDateTime("yyyy-MM-dd HH:mm:ss"); Long bookId = param.getId(); @@ -2500,6 +2475,7 @@ public class BookingService { Date checkinDate; Date checkoutDate; String userId = param.getUser()!=null? param.getUser().getUserId():null; + String userName = param.getUserName(); Bookings booking = bookingDao.findById(bookId).orElse(null); @@ -2643,6 +2619,38 @@ public class BookingService { bookId, checkinDateStr, checkoutDateStr, property.getDlPropertyId()); } + if (isExtend && result.isSuccess()) { + if (isApprovalExtend + || + (StringUtils.isNotEmpty(booking.getSourceCode()) && !Strings.CS.containsAny(booking.getSourceCode(),"OD","VMKT")) + || + (booking.getSharer() != null && !Strings.CS.equals(booking.getSharer(),"[]"))) { + //send email instead of sync other booking + Date now = new Date(); + CfgSettings emailAddress = settingService.getSettingByKey(SysConstants.MGM_EMAIL_ADDRESS); + BookingsView originBookingView = bookingViewDao.findById(bookId).orElse(null); + originBookingView = this.getEmailInfo(originBookingView,originBookingView.getCreatedBy()).getData(); + booking.setCheckoutDate( + DateTimeUtil.getDateFromString(checkoutDateStr, "yyyy-MM-dd")); + + Email email = new Email(); + email.setBookId(booking.getId()); + email.setCreatedAt(now); + email.setCreatedBy(booking.getCreatedBy()); + email = sendEmailService.sendExtendEmail(booking, originBookingView,email,userId,userName,emailAddress.getKeyValues()); + + if(email.getStatus()==1) { + emailDao.save(email); + processResult.setSuccess(true); + processResult.setData(resultBookings); + }else{ + processResult.setSuccess(false); + processResult.setMessage("Send Email Failed"); + processResult.setLogMessage("Send Email Failed"); + } + } + } + // Thread.sleep(2000L); // if (booking.getDlBlockId() != null) // dlService.daylightReservationSetBlock(booking.getDlReservationId(), property.getDlPropertyId(), booking.getDlBlockId()); @@ -2745,6 +2753,50 @@ public class BookingService { * extension record. The waitlist row contains the requested checkout date, * while waitlistId identifies the booking that must be sent to Daylight. */ + public BaseApiResponse> extendDaylightApprovalBooking(Bookings approvalBooking, + PlayerProfileEntry player, String userId, String userName) throws Exception { + BaseApiResponse> result = new BaseApiResponse<>(); + if (approvalBooking == null || StringUtils.isBlank(approvalBooking.getApprovalBookingId())) { + result.setSuccess(false); + result.setMessage("Approval booking does not reference an original booking"); + return result; + } + + Long originalBookingId; + try { + originalBookingId = Long.valueOf(approvalBooking.getApprovalBookingId()); + } catch (NumberFormatException e) { + result.setSuccess(false); + result.setMessage("Invalid original booking id: " + approvalBooking.getApprovalBookingId()); + return result; + } + + Bookings originalBooking = bookingDao.findById(originalBookingId).orElse(null); + if (originalBooking == null) { + result.setSuccess(false); + result.setMessage("Original booking not found: " + originalBookingId); + return result; + } + if (originalBooking.getCheckinDate() == null || originalBooking.getCheckoutDate() == null + || approvalBooking.getCheckoutDate() == null) { + result.setSuccess(false); + result.setMessage("Booking dates are incomplete"); + return result; + } + + TodoChangeDateRequest changeRequest = bookingMapper.bookingToChangeRequest(originalBooking); + if (changeRequest.getDateList() == null || changeRequest.getDateList().isEmpty()) { + changeRequest.setDateList(buildDefaultDateList( + originalBooking.getCheckinDate(), originalBooking.getCheckoutDate())); + } + changeRequest.setExtendDate(buildDefaultDateList( + originalBooking.getCheckinDate(), approvalBooking.getCheckoutDate())); + changeRequest.setUserId(userId); + changeRequest.setUserName(userName); + + return daylightReservationChangeDate(changeRequest, player, true, true); + } + public BaseApiResponse> extendDaylightWaitlistBooking(Bookings waitlistBooking, PlayerProfileEntry player, String userId, String userName) throws Exception { BaseApiResponse> result = new BaseApiResponse<>(); @@ -2779,7 +2831,7 @@ public class BookingService { changeRequest.setUserId(userId); changeRequest.setUserName(userName); - return daylightReservationChangeDate(changeRequest, player, true); + return daylightReservationChangeDate(changeRequest, player, true, false); } public BaseApiResponse cancelWaitlistBooking(BookingDto param,HttpServletRequest request) { @@ -3473,9 +3525,10 @@ public class BookingService { booking.setRatePlanCode(b.getRatePlanCode()); booking.setHotelCode(b.getHotelCode()); booking.setMarketCode(b.getMarketCode()); -// booking.setSourceCode(b.getSourceCode()); + booking.setSourceCode(b.getSourceCode()); booking.setBookingTypeName(b.getBookingTypeName()); booking.setMiscCharge(b.getMiscCharge()); + LogUtil.info(BookingService.class,"ConfirmNo:"+booking.getConfirmationNo()+"MisCharge"+b.getMiscCharge()); if (!b.getRoomTypeCode().equals(booking.getRoomTypeCode())) { CfgRoomTypes operRoomType = roomTypeDao.findByCodeAndCategory(b.getRoomTypeCode(), "OPERA"); @@ -3818,6 +3871,9 @@ public class BookingService { BookingsView viewBook = bookingViewDao.findById(booking.getId()).orElse(null); String bookComment = operaService.makeCashierComment(viewBook); + if ("IM".equalsIgnoreCase(viewBook.getBookingTypeName())) { + booking.setOperaComment(bookComment); + } bookingDao.save(booking); //update waitlist booking @@ -3949,6 +4005,9 @@ public class BookingService { } BookingsView viewBook = bookingViewDao.findById(booking.getId()).orElse(null); String bookComment = operaService.makeCashierComment(viewBook); + if ("IM".equalsIgnoreCase(viewBook.getBookingTypeName())) { + booking.setOperaComment(bookComment); + } Bookings successBook = bookingDao.save(booking); @@ -3961,7 +4020,7 @@ public class BookingService { JSONObject cashCommentResponse = new JSONObject(); cashCommentRequest.setActionType("ADD"); cashCommentRequest.setProperty(property); - cashCommentRequest.setComment(bookComment); + cashCommentRequest.setComment(booking.getOperaComment()); cashCommentRequest.setConfirmationNo(booking.getConfirmationNo()); cashCommentRequest.setCommentType("CASHIER"); cashCommentResponse = operaService.guestRequests(cashCommentRequest); @@ -4533,7 +4592,7 @@ public class BookingService { LogUtil.info(BookingService.class, "[synvBookingSharer] profileIdList " + gson.toJson(profileIdList)); if (profileIdList.size()>0) { - shareBook.setOperaProfileId(Long.valueOf(profileIdList.get(0))); + shareBook.setOperaProfileId(Long.valueOf(profileIdList.getFirst())); }else { shareBook.setOperaProfileId(null); } @@ -4550,7 +4609,7 @@ public class BookingService { } }else if(!StringUtils.isEmpty(shareName)) { -// shareBook.setOperaProfileId(null); + shareBook.setOperaProfileId(null); shareBook.setPlayerId(null); String[] shareNameArr = StringUtils.split(shareName, ", ",2); if(shareNameArr.length>1) { @@ -5514,7 +5573,7 @@ public class BookingService { } operaBooking.setApproveStatus(dbBooking.getApproveStatus()); operaBooking.setResvId(dbBooking.getResvId()); - operaBooking.setMiscCharge(dbBooking.getMiscCharge()); +// operaBooking.setMiscCharge(dbBooking.getMiscCharge()); String nights = DateTimeUtil.getDiffDate(operaBooking.getCheckinDate(), operaBooking.getCheckoutDate(), "day"); operaBooking.setNumOfNight(Integer.valueOf(nights)); operaBooking.setPropertyName(dbBookingView.getPropertyName()); @@ -6212,14 +6271,7 @@ public class BookingService { } String amendLine = "AMEND INC.CHRG$" + newMisCharge.trim() + " AS " + userId + "..APP"; - Matcher amendMatcher = Pattern.compile("(?m)^AMEND INC\\.CHRG\\s*\\$").matcher(comment); - if (amendMatcher.find()) { - // 保留 GOA 原始说明,将最新金额记录插入已有修改记录之前。 - int insertPos = amendMatcher.start(); - return comment.substring(0, insertPos).stripTrailing() + "\n\n" - + amendLine + "\n" + comment.substring(insertPos); - } - return comment.stripTrailing() + "\n\n" + amendLine; + return insertIMChangeLine(comment, amendLine); } if (!newMisCharge.isEmpty() && !comment.isEmpty()) { @@ -6261,18 +6313,31 @@ public class BookingService { } } - int headerEnd = comment.indexOf("..APP"); - - if (headerEnd >= 0) { - int insertPos = headerEnd + "..APP".length(); - + Matcher mscHeaderMatcher = Pattern.compile( + "(?m)^[ \\t]*\\(RM(?:\\+INC\\$[^)]*)?\\)COMP[ \\t]+\\.\\.MSC(?: |[ \\t])*$") + .matcher(comment); + if (mscHeaderMatcher.find()) { + int insertPos = mscHeaderMatcher.end(); + String remainingComment = comment.substring(insertPos).trim() + .replaceAll("\\n(?:[ \\t]*\\n)+", "\n"); comment = comment.substring(0, insertPos) + "\n\n" + amendLine - + "\n" - + comment.substring(insertPos).trim(); + + (remainingComment.isEmpty() ? "" : "\n" + remainingComment); } else { - comment = comment + "\n" + amendLine; + int headerEnd = comment.indexOf("..APP"); + + if (headerEnd >= 0) { + int insertPos = headerEnd + "..APP".length(); + + comment = comment.substring(0, insertPos) + + "\n\n" + + amendLine + + "\n" + + comment.substring(insertPos).trim(); + } else { + comment = comment + "\n" + amendLine; + } } } } else { @@ -6317,23 +6382,48 @@ public class BookingService { return extLine; } + return insertIMChangeLine(existingComment, extLine); + } + + /** + * 将 IM 的最新变更记录插入固定头部之后、历史变更记录之前。 + * 固定头部为 GOA/TBA 及紧随其后的 deposit/post 行。 + */ + private String insertIMChangeLine(String existingComment, String newLine) { + if (StringUtils.isBlank(existingComment)) { + return newLine; + } + String comment = existingComment .replace("\r\n", "\n") .replace("\r", "\n") .replace(" ", "\n") - .replace("$", "$"); + .replace("$", "$") + .trim(); String goaHeader = "GOA/TBA..APP"; - int goaEndIndex = comment.indexOf(goaHeader); - - if (goaEndIndex < 0) { - return extLine + "\n\n" + comment.trim(); + int goaIndex = comment.indexOf(goaHeader); + if (goaIndex < 0) { + return newLine + "\n" + comment; } - goaEndIndex += goaHeader.length(); - return comment.substring(0, goaEndIndex) - + "\n" - + extLine - + comment.substring(goaEndIndex); + int baseEnd = goaIndex + goaHeader.length(); + Matcher depositMatcher = Pattern.compile( + "(?m)^[ \\t]*\\[(?:WAIVE|COLLECT) DEPOSIT AND (?:YES|NO) POST\\]\\.\\.APP[ \\t]*$") + .matcher(comment); + while (depositMatcher.find()) { + if (depositMatcher.start() >= baseEnd) { + baseEnd = depositMatcher.end(); + break; + } + } + + String baseComment = comment.substring(0, baseEnd).stripTrailing(); + String changeHistory = comment.substring(baseEnd).strip(); + if (changeHistory.isEmpty()) { + return baseComment + "\n\n" + newLine; + } + + return baseComment + "\n\n" + newLine + "\n" + changeHistory; } private String buildOperaExtendComment(Bookings booking, Date originCheckoutDate, String booker) { diff --git a/src/main/java/com/mgm/mcrm/booking/services/NonMGMBookingService.java b/src/main/java/com/mgm/mcrm/booking/services/NonMGMBookingService.java index 789babf..7489199 100644 --- a/src/main/java/com/mgm/mcrm/booking/services/NonMGMBookingService.java +++ b/src/main/java/com/mgm/mcrm/booking/services/NonMGMBookingService.java @@ -193,6 +193,7 @@ public class NonMGMBookingService { booking.setSharer(JSONArray.toJSONString(sharer)); booking.setBookingTypeId(bookingTypeId); booking.setMember(JSONObject.toJSONString(member)); + booking.setCategory("OTHER"); booking.setFeatureCode(specialCode); booking.setSegmentId(segmentId); @@ -210,7 +211,7 @@ public class NonMGMBookingService { Date checkoutDate = DateTimeUtil.getDateFromString(String.valueOf(dateArr.getLast()), "yyyy-MM-dd"); String numOfNight = String.valueOf(dateItem.getNumOfNight()); String bookRemark = String.valueOf(dateItem.getRemark()); - if(StringUtils.isNotEmpty(bookRemark)) booking.setRemark(bookRemark); + if(StringUtils.isNotEmpty(bookRemark) && !"null".equalsIgnoreCase(bookRemark)) booking.setRemark(bookRemark); String bookingStatus = dateItem.getBookingStatus(); diff --git a/src/main/java/com/mgm/mcrm/booking/services/OperaService.java b/src/main/java/com/mgm/mcrm/booking/services/OperaService.java index 45a7a46..468e8c6 100644 --- a/src/main/java/com/mgm/mcrm/booking/services/OperaService.java +++ b/src/main/java/com/mgm/mcrm/booking/services/OperaService.java @@ -1101,7 +1101,7 @@ public class OperaService { } }else { comment = String.format("(RM) COMP..APP %s,%s,%s", dateRange, - book.getDlSourceId(), book.getCreatedBy()); + book.getSourceCode(), book.getCreatedBy()); } return comment; diff --git a/src/main/java/com/mgm/mcrm/booking/services/WaitlistBookingService.java b/src/main/java/com/mgm/mcrm/booking/services/WaitlistBookingService.java index 8217865..f663d8e 100644 --- a/src/main/java/com/mgm/mcrm/booking/services/WaitlistBookingService.java +++ b/src/main/java/com/mgm/mcrm/booking/services/WaitlistBookingService.java @@ -35,10 +35,10 @@ import com.mgm.mcrm.common.jms.BookingControlMsgSender; import com.mgm.mcrm.common.services.MGMEsbApiService; import com.mgm.mcrm.common.utils.DateTimeUtil; import com.mgm.mcrm.common.utils.LogUtil; -import com.mgm.mcrm.common.utils.SendEmail; import com.mgm.mcrm.logging.services.SysLogBookingService; import com.mgm.mcrm.notification.models.Email; import com.mgm.mcrm.notification.repositories.EmailDao; +import com.mgm.mcrm.notification.services.SendEmailService; import com.mgm.mcrm.player.services.PlayerService; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; @@ -90,6 +90,8 @@ public class WaitlistBookingService { private PropertyDao propertyDao; @Autowired private BookingMapper bookingMapper; + @Resource + private SendEmailService sendEmailService; public List getBookingsByPlayer(String playerId) throws Exception { List bookingList = new ArrayList(); @@ -398,7 +400,7 @@ public class WaitlistBookingService { email.setCreatedAt(creatdDate); email.setCreatedBy(originBooking.getCreatedBy()); - email = SendEmail.sendApprovalExtendEmail(emailBook, originBookingView, email, userId, userName, bookingView, isOtherOverBook, emailAddress.getKeyValues()); + email = sendEmailService.sendApprovalExtendEmail(emailBook, originBookingView, email, userId, userName, bookingView, isOtherOverBook, emailAddress.getKeyValues()); if (email.getStatus() == 1) { originBooking.setApproveStatus("WA"); bookingDao.save(originBooking); @@ -439,7 +441,7 @@ public class WaitlistBookingService { email.setCreatedAt(creatdDate); email.setCreatedBy(originBooking.getCreatedBy()); - email = SendEmail.sendApprovalExtendEmail(originBooking, originBookingView,email,userId,userName,bookingView,isOtherOverBook,emailAddress.getKeyValues()); + email = sendEmailService.sendApprovalExtendEmail(originBooking, originBookingView,email,userId,userName,bookingView,isOtherOverBook,emailAddress.getKeyValues()); if(email.getStatus()==1) { emailDao.save(email); } @@ -455,7 +457,7 @@ public class WaitlistBookingService { email.setCreatedAt(creatdDate); email.setCreatedBy(originBooking.getCreatedBy()); - email = SendEmail.sendApprovalExtendEmail(emailBook, originBookingView, email, userId, userName, bookingView, false, emailAddress.getKeyValues()); + email = sendEmailService.sendApprovalExtendEmail(emailBook, originBookingView, email, userId, userName, bookingView, false, emailAddress.getKeyValues()); if (email.getStatus() == 1) { originBooking.setApproveStatus("WA"); bookingDao.save(originBooking); @@ -475,7 +477,7 @@ public class WaitlistBookingService { email.setCreatedAt(creatdDate); email.setCreatedBy(originBooking.getCreatedBy()); - email = SendEmail.sendApprovalNewEmail(emailBook, bookingView, email, userId, userName, true, false, emailAddress.getKeyValues()); + email = sendEmailService.sendApprovalNewEmail(emailBook, bookingView, email, userId, userName, true, false, emailAddress.getKeyValues()); if (email.getStatus() == 1) { originBooking.setApproveStatus("WA"); bookingDao.save(originBooking); @@ -532,7 +534,7 @@ public class WaitlistBookingService { email.setCreatedAt(creatdDate); email.setCreatedBy(originBooking.getCreatedBy()); - email = SendEmail.sendApprovalNewEmail(emailBook, bookingView, email, userId, userName, false, true, emailAddress.getKeyValues()); + email = sendEmailService.sendApprovalNewEmail(emailBook, bookingView, email, userId, userName, false, true, emailAddress.getKeyValues()); emailDao.save(email); } } diff --git a/src/main/java/com/mgm/mcrm/common/constants/SysCommon.java b/src/main/java/com/mgm/mcrm/common/constants/SysCommon.java index c4bf968..74b791f 100644 --- a/src/main/java/com/mgm/mcrm/common/constants/SysCommon.java +++ b/src/main/java/com/mgm/mcrm/common/constants/SysCommon.java @@ -16,6 +16,7 @@ import com.mgm.mcrm.common.utils.NetworkUtil; import com.mgm.mcrm.logging.models.SysLogLogin; import com.mgm.mcrm.logging.models.SysLogOperation; import jakarta.servlet.http.HttpServletRequest; +import lombok.Getter; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Strings; import org.springframework.boot.system.ApplicationHome; @@ -24,8 +25,12 @@ import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.web.servlet.support.RequestContextUtils; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.X509TrustManager; import java.io.*; import java.lang.reflect.Field; +import java.security.KeyStore; import java.text.SimpleDateFormat; import java.util.*; @@ -50,7 +55,9 @@ public class SysCommon { private static Map notifyTemplateMap = new HashMap(); private static final Map appServerStates = new HashMap(); private static final List allowOriginSource = new ArrayList(); + @Getter private static final List soapServers = new ArrayList(); + @Getter private static final List httpApiServers = new ArrayList(); private static final List allowIPSource = new ArrayList(); // @Autowired @@ -635,4 +642,20 @@ public class SysCommon { } return isAllow; } + + public static X509TrustManager getDefaultTrustManager() { + try { + // 获取 JVM 默认的 TrustManager 作为核心校验逻辑 + TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + tmf.init((KeyStore) null); // 使用系统的默认信任库 + for (TrustManager tm : tmf.getTrustManagers()) { + if (tm instanceof X509TrustManager) { + return (X509TrustManager) tm; + } + } + }catch(Exception err){ + LogUtil.error(SysCommon.class,"Default X509TrustManager not found["+err.getMessage()+"]"); + } + return null; + } } diff --git a/src/main/java/com/mgm/mcrm/common/httpclient/HttpSslSupport.java b/src/main/java/com/mgm/mcrm/common/httpclient/HttpSslSupport.java index 25e4df5..6c6277b 100644 --- a/src/main/java/com/mgm/mcrm/common/httpclient/HttpSslSupport.java +++ b/src/main/java/com/mgm/mcrm/common/httpclient/HttpSslSupport.java @@ -1,5 +1,9 @@ package com.mgm.mcrm.common.httpclient; +import com.mgm.mcrm.common.constants.SysCommon; +import com.mgm.mcrm.common.services.ConfigurableTrustHandler; +import lombok.Getter; +import lombok.Setter; import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; import org.apache.hc.core5.ssl.SSLContexts; @@ -26,7 +30,11 @@ import java.security.cert.CertificateException; * @version 2.0 (client5) */ public class HttpSslSupport { - private static final SSLHandler SIMPLE_VERIFIER = new SSLHandler(); + @Getter + @Setter + private static boolean skipValidation=true; + + private static ConfigurableTrustHandler trustHandler=null; private static SSLSocketFactory sslFactory; // 注意:SSLConnectionSocketFactory 在 HttpClient 5 中被标记为 deprecated, @@ -46,42 +54,13 @@ public class HttpSslSupport { return new HttpSslSupport(); } - /** - * 重写 X509TrustManager 和 HostnameVerifier,信任所有证书与主机名。 - * 仅推荐在内部环境或调试场景使用。 - */ - private static class SSLHandler implements X509TrustManager, HostnameVerifier { - - @Override - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - return new java.security.cert.X509Certificate[]{}; - } - - @Override - public void checkServerTrusted(java.security.cert.X509Certificate[] chain, - String authType) throws CertificateException { - // 信任所有服务器证书 - } - - @Override - public void checkClientTrusted(java.security.cert.X509Certificate[] chain, - String authType) throws CertificateException { - // 信任所有客户端证书 - } - - @Override - public boolean verify(String paramString, SSLSession paramSSLSession) { - // 信任所有主机名 - return true; + public static ConfigurableTrustHandler getTrustHandler(){ + if(trustHandler==null){ + trustHandler =new ConfigurableTrustHandler(skipValidation, SysCommon.getDefaultTrustManager(), SysCommon.getHttpApiServers()); } + return trustHandler; } - /** - * 获取默认 HostnameVerifier(信任所有主机名) - */ - public static HostnameVerifier getVerifier() { - return SIMPLE_VERIFIER; - } /** * 获取信任所有证书的 {@link SSLSocketFactory} @@ -92,7 +71,9 @@ public class HttpSslSupport { } try { SSLContext context = getSSLContext(sslpv); - context.init(null, new TrustManager[]{SIMPLE_VERIFIER}, null); + context.init(null, new TrustManager[]{ + getTrustHandler() + }, null); sslFactory = context.getSocketFactory(); return sslFactory; } catch (KeyManagementException e) { @@ -113,8 +94,11 @@ public class HttpSslSupport { } try { SSLContext context = getSSLContext(sslpv); - context.init(null, new TrustManager[]{SIMPLE_VERIFIER}, new java.security.SecureRandom()); - sslConnFactory = new SSLConnectionSocketFactory(context, SIMPLE_VERIFIER); + ConfigurableTrustHandler trustHandler = getTrustHandler(); + context.init(null, new TrustManager[]{ + trustHandler + }, new java.security.SecureRandom()); + sslConnFactory = new SSLConnectionSocketFactory(context, trustHandler); return sslConnFactory; } catch (KeyManagementException e) { throw new RuntimeException("初始化 SSLConnectionSocketFactory 失败", e); diff --git a/src/main/java/com/mgm/mcrm/common/listener/ConfigListener.java b/src/main/java/com/mgm/mcrm/common/listener/ConfigListener.java index 7b56b3e..333e7ab 100644 --- a/src/main/java/com/mgm/mcrm/common/listener/ConfigListener.java +++ b/src/main/java/com/mgm/mcrm/common/listener/ConfigListener.java @@ -4,9 +4,12 @@ import com.mgm.mcrm.appsetting.models.SysSetting; import com.mgm.mcrm.appsetting.services.SysSettingService; import com.mgm.mcrm.common.constants.SysCommon; import com.mgm.mcrm.common.dtos.system.AppServerState; +import com.mgm.mcrm.common.httpclient.HttpSslSupport; import com.mgm.mcrm.common.jms.AppControlMsgSender; import com.mgm.mcrm.common.utils.ExcelUtils; +import com.mgm.mcrm.common.utils.HttpUtil; import com.mgm.mcrm.common.utils.NetworkUtil; +import com.mgm.mcrm.common.utils.SOAPUtil; import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -29,6 +32,14 @@ public class ConfigListener implements ApplicationListener allowedServers; + + public ConfigurableTrustHandler(boolean skipValidation, X509TrustManager defaultTrustManager, List allowedServers ) { + this.skipValidation = skipValidation; + this.defaultTrustManager = defaultTrustManager; + this.allowedServers = allowedServers; + } + + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + if (skipValidation) { + return new java.security.cert.X509Certificate[0]; + }else{ + return defaultTrustManager != null ? defaultTrustManager.getAcceptedIssuers() : new java.security.cert.X509Certificate[0]; + } + } + + @Override + public void checkServerTrusted(java.security.cert.X509Certificate[] chain, + String authType) throws java.security.cert.CertificateException { + if (!skipValidation && defaultTrustManager != null) { + defaultTrustManager.checkServerTrusted(chain, authType); + } + } + + @Override + public void checkClientTrusted(java.security.cert.X509Certificate[] chain, + String authType) throws java.security.cert.CertificateException { + if (!skipValidation && defaultTrustManager != null) { + defaultTrustManager.checkClientTrusted(chain, authType); + } + } + + @Override + public boolean verify(String hostname, SSLSession paramSSLSession) { + boolean isAllow = skipValidation; + if(!skipValidation && allowedServers!=null && !allowedServers.isEmpty()){ + for(String allowItem:allowedServers) { + if(Strings.CI.startsWith(hostname, allowItem)) { + isAllow=true; + break; + } + } + } + if(!skipValidation && !isAllow) { + LogUtil.warn(ConfigurableTrustHandler.class, "API Server of ["+hostname+"] is not allowed"); + } + return isAllow; + } +} diff --git a/src/main/java/com/mgm/mcrm/common/services/MGMEsbLimoApiService.java b/src/main/java/com/mgm/mcrm/common/services/MGMEsbLimoApiService.java index e64f15b..bc7249f 100644 --- a/src/main/java/com/mgm/mcrm/common/services/MGMEsbLimoApiService.java +++ b/src/main/java/com/mgm/mcrm/common/services/MGMEsbLimoApiService.java @@ -38,13 +38,15 @@ public class MGMEsbLimoApiService { public HttpResponseResult invokeLimoOverrider( - String overriderIdOrName + String overriderIdOrName, + String employeeId ) throws Exception { JSONObject requestObj = new JSONObject(); Map requestHeader = new HashMap<>(); requestObj.put("OverriderIdOrName", "%"); +// requestObj.put("EmployeeId", employeeId); return mgmEsbApiService.invokeESBAPI(ESB_LIMO_API_TYPE, API_GET_LIMO_OVERRIDER, requestObj, "POST", requestHeader); } diff --git a/src/main/java/com/mgm/mcrm/common/utils/HttpUtil.java b/src/main/java/com/mgm/mcrm/common/utils/HttpUtil.java index 11802e4..cc51bfe 100644 --- a/src/main/java/com/mgm/mcrm/common/utils/HttpUtil.java +++ b/src/main/java/com/mgm/mcrm/common/utils/HttpUtil.java @@ -1,9 +1,16 @@ package com.mgm.mcrm.common.utils; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; import com.mgm.mcrm.common.constants.SysCommon; +import com.mgm.mcrm.common.dtos.config.ApiGatewaySetting; import com.mgm.mcrm.common.dtos.http_util.HttpRequestDefine; import com.mgm.mcrm.common.dtos.http_util.HttpResponseResult; +import com.mgm.mcrm.common.services.ConfigurableTrustHandler; import jakarta.servlet.http.HttpServletRequest; +import lombok.Getter; +import lombok.Setter; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Strings; import org.apache.hc.client5.http.classic.methods.HttpDelete; import org.apache.hc.client5.http.classic.methods.HttpGet; @@ -35,19 +42,30 @@ import org.springframework.web.multipart.MultipartFile; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; import java.io.BufferedReader; import java.io.IOException; import java.net.URI; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; +import java.util.HashMap; import java.util.List; import java.util.Map; public class HttpUtil { + @Getter + @Setter + private static boolean skipValidation=true; + + private static ConfigurableTrustHandler trustHandler=null; + + public static ConfigurableTrustHandler getTrustHandler(){ + if(trustHandler==null){ + trustHandler =new ConfigurableTrustHandler(skipValidation, SysCommon.getDefaultTrustManager(), SysCommon.getHttpApiServers()); + } + return trustHandler; + } + //----------- public static HttpResponseResult processHttpRequest(HttpRequestDefine request) { HttpResponseResult responseResult = new HttpResponseResult(); @@ -200,33 +218,7 @@ public class HttpUtil { // 这里可以填两种值 TLS和LLS , 具体差别可以自行搜索 SSLContext sc = SSLContext.getInstance("TLS"); // 构建新对象 - X509TrustManager manager = new X509TrustManager() { - @Override - public void checkServerTrusted(X509Certificate[] chain, String arg1) throws CertificateException { - if (chain == null || chain.length == 0) { - throw new IllegalArgumentException("No server certificates provided"); - } - for (X509Certificate cert : chain) { - cert.checkValidity(); - } - } - - @Override - public void checkClientTrusted(X509Certificate[] chain, String arg1) throws CertificateException { - if (chain == null || chain.length == 0) { - throw new CertificateException("No client certificates provided"); - } - for (X509Certificate cert : chain) { - cert.checkValidity(); // 检查证书是否在有效期内 - } - } - - @Override - public X509Certificate[] getAcceptedIssuers() { - return new java.security.cert.X509Certificate[] {}; - } - - }; + ConfigurableTrustHandler manager = getTrustHandler(); sc.init(null, new TrustManager[]{manager}, null); return sc; } catch (Exception e) { @@ -259,4 +251,48 @@ public class HttpUtil { } return sb.toString(); } + + public static HttpResponseResult invokeGatewayEmailAPI(JSONObject requestContent, String requestMethod, + MultipartFile[] files, ApiGatewaySetting apiGatewaySetting) throws Exception { + String serverUrl = apiGatewaySetting.getNotificationProxyUrl(); + int timeoutTime = apiGatewaySetting.getRequestTimeout(); + + HttpRequestDefine requestDef = new HttpRequestDefine(); + String apiLink="/send_email"; + String requestUrl = serverUrl + apiLink; + Map requestHeader = new HashMap(); + requestHeader.put("Origin", "MGM_CRM_CMS"); + requestHeader.put("application-id", apiGatewaySetting.getNotificationAppId()); + requestHeader.put("authorization", apiGatewaySetting.getNotificationAppSecret()); + requestHeader.put("Content-type", "application/json;charset=utf-8"); + + requestDef.setRequestUrl(requestUrl); + requestDef.setRequestMethod(requestMethod); + requestDef.setTimeout(timeoutTime); + requestDef.setHeaders(requestHeader); + if(files!=null) { + requestDef.setUpload(true); + requestDef.setUploadFile(files[0]); + requestDef.setFileParaName(files[0].getName()); + } + + if(requestContent!=null) { + requestDef.setEntityContent(requestContent.toString()); + }else { + requestDef.setEntityContent(""); + } + // -- + LogUtil.info(HttpUtil.class, "[invoke Proxy Email API] start request:" + requestDef.getRequestUrl()); + HttpResponseResult httpResult =HttpUtil.processHttpRequest(requestDef); + httpResult.setRequestContent(requestDef.getEntityContent()); + Gson gson = new Gson(); + LogUtil.info(HttpUtil.class, "[invoke Proxy Email API]getRequestUrl:"+gson.toJson(requestDef.getRequestUrl())); + LogUtil.info(HttpUtil.class, "[invoke Proxy Email API]getHeaders:"+gson.toJson(requestDef.getHeaders())); + LogUtil.info(HttpUtil.class, "[invoke Proxy Email API]getRequestMethod:"+gson.toJson(requestDef.getRequestMethod())); + LogUtil.info(HttpUtil.class, "[invoke Proxy Email API]getEntityContent:"+gson.toJson(requestContent)); + LogUtil.info(HttpUtil.class, "[invoke Proxy Email API]getStatusCode:"+gson.toJson(httpResult.getStatusCode())); + LogUtil.info(HttpUtil.class, "[invoke Proxy Email API]getErrorMessage:"+gson.toJson(httpResult.getErrorMessage())); + LogUtil.info(HttpUtil.class, "[invoke Proxy Email API]getResponseContent:"+gson.toJson(httpResult.getResponseContent())); + return httpResult; + } } diff --git a/src/main/java/com/mgm/mcrm/common/utils/SOAPUtil.java b/src/main/java/com/mgm/mcrm/common/utils/SOAPUtil.java index 2d8c4a1..631e5d7 100644 --- a/src/main/java/com/mgm/mcrm/common/utils/SOAPUtil.java +++ b/src/main/java/com/mgm/mcrm/common/utils/SOAPUtil.java @@ -2,13 +2,15 @@ package com.mgm.mcrm.common.utils; import com.mgm.mcrm.common.constants.SysCommon; import com.mgm.mcrm.common.dtos.config.ApiGatewaySetting; +import com.mgm.mcrm.common.services.ConfigurableTrustHandler; import jakarta.xml.bind.JAXBContext; import jakarta.xml.bind.JAXBException; import jakarta.xml.bind.Marshaller; import jakarta.xml.bind.Unmarshaller; import jakarta.xml.soap.*; +import lombok.Getter; +import lombok.Setter; import org.apache.commons.lang3.StringUtils; -import org.apache.hc.core5.http.message.BasicHeader; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.NodeList; @@ -17,9 +19,6 @@ import javax.xml.namespace.QName; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; -import java.security.KeyStore; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; import java.util.Iterator; import java.util.List; @@ -40,6 +39,19 @@ public class SOAPUtil { * 参考---》http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?op=getWeatherbyCityName */ + @Getter + @Setter + private static boolean skipValidation=true; + + private static ConfigurableTrustHandler trustHandler=null; + + public static ConfigurableTrustHandler getTrustHandler(){ + if(trustHandler==null){ + trustHandler =new ConfigurableTrustHandler(skipValidation, SysCommon.getDefaultTrustManager(), SysCommon.getSoapServers()); + } + return trustHandler; + } + public static String getWebServiceSOAP(String url, String action, StringBuffer sendSoapString, ApiGatewaySetting apiGatewaySetting){ String soap = sendSoapString.toString(); if (soap == null) { @@ -52,8 +64,9 @@ public class SOAPUtil { HttpURLConnection conn = (HttpURLConnection) soapUrl.openConnection(); if(isHttps) { HttpsURLConnection https = (HttpsURLConnection) conn; - trustAllHosts(https); - https.setHostnameVerifier(checkSoapServer); + ConfigurableTrustHandler manager = getTrustHandler(); + trustAllHosts(https,manager); + https.setHostnameVerifier(manager); } conn.setUseCaches(false); conn.setDoInput(true); @@ -107,8 +120,9 @@ public class SOAPUtil { HttpURLConnection conn = (HttpURLConnection) soapUrl.openConnection(); if(isHttps) { HttpsURLConnection https = (HttpsURLConnection) conn; - trustAllHosts(https); - https.setHostnameVerifier(checkSoapServer); + ConfigurableTrustHandler manager = getTrustHandler(); + trustAllHosts(https,manager); + https.setHostnameVerifier(manager); } conn.setUseCaches(false); conn.setDoInput(true); @@ -162,63 +176,14 @@ public class SOAPUtil { } return soapMessage; } - - private static final TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() { - private X509TrustManager defaultTrustManager=null; - { - try { - // 获取 JVM 默认的 TrustManager 作为核心校验逻辑 - TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); - tmf.init((KeyStore) null); // 使用系统的默认信任库 - for (TrustManager tm : tmf.getTrustManagers()) { - if (tm instanceof X509TrustManager) { - defaultTrustManager = (X509TrustManager) tm; - } - } - }catch(Exception err){ - LogUtil.error(SOAPUtil.class,"Default X509TrustManager not found["+err.getMessage()+"]"); - } - } - - @Override - public X509Certificate[] getAcceptedIssuers() { - return defaultTrustManager.getAcceptedIssuers(); - } - - @Override - public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { - defaultTrustManager.checkServerTrusted(chain,authType); - } - - @Override - public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { - defaultTrustManager.checkClientTrusted(chain,authType); - } - }}; - - - - private static final HostnameVerifier checkSoapServer = new HostnameVerifier() { - public boolean verify(String hostname, SSLSession session) { - boolean isServerAllow = SysCommon.isAllowSoapServer(hostname); - if(isServerAllow==false) { - LogUtil.warn(SOAPUtil.class, "SOAP Server of ["+hostname+"] is not allowed"); - } - return SysCommon.isAllowSoapServer(hostname); - } - }; - /** - * 信任所有 - * @param connection - * @return - */ - private static SSLSocketFactory trustAllHosts(HttpsURLConnection conn) { + + private static SSLSocketFactory trustAllHosts(HttpsURLConnection conn,ConfigurableTrustHandler manager) { SSLSocketFactory oldFactory = conn.getSSLSocketFactory(); try { SSLContext sc = SSLContext.getInstance("TLS"); - sc.init(null, trustAllCerts, new java.security.SecureRandom()); + sc.init(null, new TrustManager[]{manager}, new java.security.SecureRandom()); SSLSocketFactory newFactory = sc.getSocketFactory(); conn.setSSLSocketFactory(newFactory); } catch (Exception e) { diff --git a/src/main/java/com/mgm/mcrm/common/utils/SendEmail.java b/src/main/java/com/mgm/mcrm/common/utils/SendEmail.java index 574de03..1aa4199 100644 --- a/src/main/java/com/mgm/mcrm/common/utils/SendEmail.java +++ b/src/main/java/com/mgm/mcrm/common/utils/SendEmail.java @@ -278,7 +278,7 @@ public class SendEmail { }else { mail_to = SysCommon.apiConfig.getSend_to_SMTP(); } - + sender.setHost(mail_smtp_host); sender.setPort(mail_port); // 默认就是25 sender.setUsername(mail_sender); @@ -486,7 +486,7 @@ public class SendEmail { +format.format(bookView.getCheckoutDate())+ " " + "" - +(bookView.getBookerTeam()!=null?bookView.getBookerTeam():"")+ + +(bookView.getSectionName()!=null?bookView.getSectionName():"")+ " " + "" +bookView.getCreatedBy()+ @@ -651,7 +651,7 @@ public class SendEmail { +format.format(bookView.getCheckoutDate())+ " " + "" - +(bookView.getBookerTeam()!=null?bookView.getBookerTeam():"")+ + +(bookView.getSectionName()!=null?bookView.getSectionName():"")+ " " + "" +bookView.getCreatedBy()+ @@ -835,7 +835,7 @@ public class SendEmail { +format.format(book.getCheckoutDate())+ " " + "" - +(viewBook.getBookerTeam()!=null?viewBook.getBookerTeam():"")+ + +(viewBook.getSectionName()!=null?viewBook.getSectionName():"")+ " " + "" +originBook.getCreatedBy()+ @@ -916,7 +916,6 @@ public class SendEmail { public static Email sendCancelEmail(Bookings book,BookingsView bookingsView,Email emailObj,String userId,String userName,String emailTo) { String content1 = cancelEmailTemp; - try { JavaMailSenderImpl sender = new JavaMailSenderImpl(); if(StringUtils.isEmpty(mail_smtp_host)) { diff --git a/src/main/java/com/mgm/mcrm/limo/controller/LimoController.java b/src/main/java/com/mgm/mcrm/limo/controller/LimoController.java index 46147ae..4bac41e 100644 --- a/src/main/java/com/mgm/mcrm/limo/controller/LimoController.java +++ b/src/main/java/com/mgm/mcrm/limo/controller/LimoController.java @@ -1,6 +1,7 @@ package com.mgm.mcrm.limo.controller; import com.auth0.jwt.JWT; +import com.mgm.mcrm.authorization.dtos.LoginUserInfo; import com.mgm.mcrm.authorization.models.SysRouterPermission; import com.mgm.mcrm.authorization.services.MgmUserService; import com.mgm.mcrm.authorization.services.SysGroupPermissionService; @@ -25,13 +26,10 @@ import org.apache.commons.lang3.Strings; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @RestController -@RequestMapping("/api/limo") +@RequestMapping("/api/app/limo") public class LimoController { @Resource @@ -70,12 +68,21 @@ public class LimoController { return limoService.getLocation(location); } - @GetMapping("/getCarType") + @PostMapping(value = "/getLocation", produces = "application/json;charset=UTF-8", + consumes = MediaType.APPLICATION_JSON_VALUE) + public BaseApiResponse> getLocationPost( + @RequestBody(required = false) GetLimoLocationRequest request) throws Exception { + return limoService.getLocation(request == null ? null : request.getLocation()); + } + + @RequestMapping(value = "/getCarType", method = {RequestMethod.GET, RequestMethod.POST}, + produces = "application/json;charset=UTF-8") public BaseApiResponse> getCarType() throws Exception { return limoService.getCarType(); } - @GetMapping("/getGreetType") + @RequestMapping(value = "/getGreetType", method = {RequestMethod.GET, RequestMethod.POST}, + produces = "application/json;charset=UTF-8") public BaseApiResponse> getGreetType() throws Exception { return limoService.getGreetType(); } @@ -244,7 +251,17 @@ public class LimoController { @GetMapping("/getOverrider") public GetOverriderInfoResponse getLimoOverriderInfo( - GetLimoBookingGetOverriderRequest request) throws Exception { + GetLimoBookingGetOverriderRequest request, HttpServletRequest req) throws Exception { + String token = req.getHeader("Authorization"); + + if (StringUtils.isNotEmpty(token)) { + if (token.startsWith("Bearer ")) { + token = token.substring(7); + } + String userId = JWT.decode(token).getClaim("login_id").asString(); + request.setEmployeeId(userId); + } + return limoService.getLimoOverriderData(request); } diff --git a/src/main/java/com/mgm/mcrm/limo/dtos/request/GetLimoBookingGetOverriderRequest.java b/src/main/java/com/mgm/mcrm/limo/dtos/request/GetLimoBookingGetOverriderRequest.java index 6ecd605..675d7f8 100644 --- a/src/main/java/com/mgm/mcrm/limo/dtos/request/GetLimoBookingGetOverriderRequest.java +++ b/src/main/java/com/mgm/mcrm/limo/dtos/request/GetLimoBookingGetOverriderRequest.java @@ -5,4 +5,5 @@ import lombok.Data; @Data public class GetLimoBookingGetOverriderRequest { private String OverriderInfo; + private String EmployeeId; } diff --git a/src/main/java/com/mgm/mcrm/limo/dtos/request/GetLimoLocationRequest.java b/src/main/java/com/mgm/mcrm/limo/dtos/request/GetLimoLocationRequest.java new file mode 100644 index 0000000..db1dc91 --- /dev/null +++ b/src/main/java/com/mgm/mcrm/limo/dtos/request/GetLimoLocationRequest.java @@ -0,0 +1,8 @@ +package com.mgm.mcrm.limo.dtos.request; + +import lombok.Data; + +@Data +public class GetLimoLocationRequest { + private String location; +} diff --git a/src/main/java/com/mgm/mcrm/limo/services/LimoService.java b/src/main/java/com/mgm/mcrm/limo/services/LimoService.java index be0cbb4..a416f08 100644 --- a/src/main/java/com/mgm/mcrm/limo/services/LimoService.java +++ b/src/main/java/com/mgm/mcrm/limo/services/LimoService.java @@ -181,6 +181,7 @@ public class LimoService { try { GetLimoBookingGetOverriderRequest overriderRequest = new GetLimoBookingGetOverriderRequest(); overriderRequest.setOverriderInfo(overRiderId); + overriderRequest.setEmployeeId(userId); GetOverriderInfoResponse overriderResponse = getLimoOverriderData(overriderRequest); if (Strings.CI.equals("OK", overriderResponse.getStatusCode()) && CollectionUtils.isNotEmpty(overriderResponse.getRecords())) { @@ -849,7 +850,7 @@ public class LimoService { //通过ESB接口 获取到Overriver,当Booking不够分的时候填入Overrider public GetOverriderInfoResponse getLimoOverriderData(GetLimoBookingGetOverriderRequest request) throws Exception { - HttpResponseResult httpResponseResult = mgmEsbLimoApiService.invokeLimoOverrider(request.getOverriderInfo()); + HttpResponseResult httpResponseResult = mgmEsbLimoApiService.invokeLimoOverrider(request.getOverriderInfo(), request.getEmployeeId()); if (httpResponseResult.getStatusCode() != 200) { throw new IllegalStateException( diff --git a/src/main/java/com/mgm/mcrm/logging/controllers/SysLogDeviceTokenController.java b/src/main/java/com/mgm/mcrm/logging/controllers/SysLogDeviceTokenController.java index 60c93ca..49800cd 100644 --- a/src/main/java/com/mgm/mcrm/logging/controllers/SysLogDeviceTokenController.java +++ b/src/main/java/com/mgm/mcrm/logging/controllers/SysLogDeviceTokenController.java @@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/api/deviceToken") +@RequestMapping("/api/app/deviceToken") public class SysLogDeviceTokenController { @Resource diff --git a/src/main/java/com/mgm/mcrm/notification/controllers/NotificationController.java b/src/main/java/com/mgm/mcrm/notification/controllers/NotificationController.java index c8800f0..3224cc4 100644 --- a/src/main/java/com/mgm/mcrm/notification/controllers/NotificationController.java +++ b/src/main/java/com/mgm/mcrm/notification/controllers/NotificationController.java @@ -8,6 +8,7 @@ import com.mgm.mcrm.common.annotation.logging.OperationLog; import com.mgm.mcrm.common.constants.SysCommon; import com.mgm.mcrm.common.dtos.BaseApiResponse; import com.mgm.mcrm.notification.dtos.request.ChangeNotificationStatusRequest; +import com.mgm.mcrm.notification.dtos.request.CountNotificationByUserIdRequest; import com.mgm.mcrm.notification.dtos.request.SendNotificationRequest; import com.mgm.mcrm.notification.dtos.response.ChangeNotificationStatusResponse; import com.mgm.mcrm.notification.dtos.response.CountNotificationByUserIdResponse; @@ -31,7 +32,7 @@ import java.util.ArrayList; import java.util.List; @RestController -@RequestMapping("/api/notification") +@RequestMapping("/api/app/notification") public class NotificationController { @Resource @@ -67,10 +68,26 @@ public class NotificationController { @GetMapping("/count_notification_by_user_id") public CountNotificationByUserIdResponse countNotificationByUserId(HttpServletRequest request) { + return countNotificationByUserIdCore(request, null); + } + + @PostMapping(value = "/count_notification_by_user_id", + produces = "application/json;charset=UTF-8", + consumes = MediaType.APPLICATION_JSON_VALUE) + public CountNotificationByUserIdResponse countNotificationByUserIdPost( + HttpServletRequest request, + @RequestBody(required = false) CountNotificationByUserIdRequest body) { + return countNotificationByUserIdCore(request, body == null ? null : body.getUserId()); + } + + private CountNotificationByUserIdResponse countNotificationByUserIdCore( + HttpServletRequest request, String requestUserId) { String token = request.getHeader("Authorization"); - String userId = JWT.decode(token).getClaim("login_id").asString(); + String userId = StringUtils.isNotBlank(requestUserId) + ? requestUserId + : JWT.decode(token).getClaim("login_id").asString(); String groupName = JWT.decode(token).getClaim("group_name").asString(); - return notificationService.countNotificationByUserId(userId,groupName); + return notificationService.countNotificationByUserId(userId, groupName); } @PostMapping(value="/change_status", produces = "application/json;charset=UTF-8",consumes = MediaType.APPLICATION_JSON_VALUE) diff --git a/src/main/java/com/mgm/mcrm/notification/dtos/request/CountNotificationByUserIdRequest.java b/src/main/java/com/mgm/mcrm/notification/dtos/request/CountNotificationByUserIdRequest.java new file mode 100644 index 0000000..8bb8cbe --- /dev/null +++ b/src/main/java/com/mgm/mcrm/notification/dtos/request/CountNotificationByUserIdRequest.java @@ -0,0 +1,8 @@ +package com.mgm.mcrm.notification.dtos.request; + +import lombok.Data; + +@Data +public class CountNotificationByUserIdRequest { + private String userId; +} diff --git a/src/main/java/com/mgm/mcrm/notification/dtos/request/EmailProxyRequest.java b/src/main/java/com/mgm/mcrm/notification/dtos/request/EmailProxyRequest.java new file mode 100644 index 0000000..c9eaf32 --- /dev/null +++ b/src/main/java/com/mgm/mcrm/notification/dtos/request/EmailProxyRequest.java @@ -0,0 +1,29 @@ +package com.mgm.mcrm.notification.dtos.request; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * 后端A转发过来的发送邮件参数。 + * showTemp 为 HTML 正文,content 为纯文本备用正文。 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class EmailProxyRequest { + private int id; + private String name; + private int type; + private String field; + private String bookIds; + private int propertyId; + private String subject; + private String content; + private String showTemp; + private String sender; + private String to; + private String cc; + private String createdBy; + private String updatedBy; + private String createdAt; + private String updatedAt; +} diff --git a/src/main/java/com/mgm/mcrm/notification/services/EmailTemplateService.java b/src/main/java/com/mgm/mcrm/notification/services/EmailTemplateService.java index b237596..b2cdc5d 100644 --- a/src/main/java/com/mgm/mcrm/notification/services/EmailTemplateService.java +++ b/src/main/java/com/mgm/mcrm/notification/services/EmailTemplateService.java @@ -11,7 +11,6 @@ import com.mgm.mcrm.booking.repositories.BookingViewDao; import com.mgm.mcrm.common.dtos.BaseApiResponse; import com.mgm.mcrm.common.dtos.mgm_api.UserInfoApiRecord; import com.mgm.mcrm.common.utils.DateTimeUtil; -import com.mgm.mcrm.common.utils.SendEmail; import com.mgm.mcrm.logging.services.SysLogBookingService; import com.mgm.mcrm.notification.models.CfgEmailTemplate; import com.mgm.mcrm.notification.models.Email; @@ -45,6 +44,8 @@ public class EmailTemplateService { private BookingDao bookingDao; @Resource private OtherRoomStatusDao roomStatusDao; + @Resource + private SendEmailService sendEmailService; private static String emailTemp = "
{{title}}
"+ @@ -71,7 +72,7 @@ public class EmailTemplateService { List getEmailList = generateEmailTemplate(idString); boolean res = false; if(!getEmailList.isEmpty()) { - res = SendEmail.sendOtherBookingEmail(getEmailList.getFirst()); + res = sendEmailService.sendOtherBookingEmail(getEmailList.getFirst()); String[] ids = emailTemplate.getBookIds().split(";"); ArrayList idList = new ArrayList<>(); List emailList = new ArrayList<>(); diff --git a/src/main/java/com/mgm/mcrm/notification/services/SendEmailService.java b/src/main/java/com/mgm/mcrm/notification/services/SendEmailService.java new file mode 100644 index 0000000..f8dcba4 --- /dev/null +++ b/src/main/java/com/mgm/mcrm/notification/services/SendEmailService.java @@ -0,0 +1,907 @@ +package com.mgm.mcrm.notification.services; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.mgm.mcrm.booking.models.Bookings; +import com.mgm.mcrm.booking.models.BookingsView; +import com.mgm.mcrm.common.dtos.EumnApprovalStatus; +import com.mgm.mcrm.common.dtos.config.ApiGatewaySetting; +import com.mgm.mcrm.common.dtos.http_util.HttpResponseResult; +import com.mgm.mcrm.common.utils.DateTimeUtil; +import com.mgm.mcrm.common.utils.HttpUtil; +import com.mgm.mcrm.common.utils.LogUtil; +import com.mgm.mcrm.notification.dtos.request.EmailProxyRequest; +import com.mgm.mcrm.notification.models.CfgEmailTemplate; +import com.mgm.mcrm.notification.models.Email; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Strings; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Service +public class SendEmailService { + + @Value("${notification.default-email-sender}") + private String defaultEmailSender; + + @Value("${notification.default-email-receiver}") + private String defaultEmailReceiver; + + @Resource + private ApiGatewaySetting apiGatewaySetting; + + private static final String emailTemp = "
Submission Date & Time:{{ttime}}
"+ + "
Submitted User:{{tuser}}
"+ + "

" + + "\r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " {{tbody}}"+ + " \r\n" + + "
\r\n" + + " Conf#\r\n" + + " \r\n" + + " Booking Status\r\n" + + " \r\n" + + " Member ID\r\n" + + " \r\n" + + " Member Name\r\n" + + " \r\n" + + " Tier\r\n" + + " \r\n" + + " Property\r\n" + + " \r\n" + + " Room Type\r\n" + + " \r\n" + + " Sharer\r\n" + + " \r\n" + + " Original C/I\r\n" + + " \r\n" + + " Original C/O\r\n" + + " \r\n" + + " Extending C/O\r\n" + + "
"; + + private static final String emailApprovalTemp = "
Submission Date & Time:{{ttime}}
"+ + "
Submitted and Approver:{{tuser}}
"+ + "

" + + "\r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" +" \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " {{tbody}}"+ + " \r\n" + + "
\r\n" + + " Booking Status\r\n" + + " \r\n" + + " Conf#\r\n" + + " \r\n" + + " Member ID\r\n" + + " \r\n" + + " Member Name\r\n" + + " \r\n" + + " Tier\r\n" + + " \r\n" + + " Property\r\n" + + " \r\n" + + " Room Type\r\n" + + " \r\n" + + " Sharer\r\n" + + " \r\n" + + " Type\r\n" + + " \r\n" + + " Requested C/I\r\n" + + " \r\n" + + " Requested C/O\r\n" + + " \r\n" + + " Approved Property\r\n" + + " \r\n" + + " Approved Room Type\r\n" + + " \r\n" + + " Approved C/I\r\n" + + " \r\n" + + " Approved C/O\r\n" + + " \r\n" + + " Booker Team\r\n" + + " \r\n" + + " Booker ID\r\n" + + " \r\n" + + " Booker Name\r\n" + + " \r\n" + + " Approval Remark\r\n" + + " \r\n" + + " Remark\r\n" + + "
"; + + private static final String emailNewApprovalTemp = "
Submission Date & Time:{{ttime}}
"+ + "
Submitted and Approver:{{tuser}}
"+ + "

" + + "{{content}}"+ + "\r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " {{tbody}}"+ + " \r\n" + + "
\r\n" + + " Booking Status\r\n" + + " \r\n" + + " Member ID\r\n" + + " \r\n" + + " Member Name\r\n" + + " \r\n" + + " Tier\r\n" + + " \r\n" + + " Property\r\n" + + " \r\n" + + " Room Type\r\n" + + " \r\n" + + " Sharer\r\n" + + " \r\n" + + " Type\r\n" + + " \r\n" + + " Requested C/I\r\n" + + " \r\n" + + " Requested C/O\r\n" + + " \r\n" + + " Booker Team\r\n" + + " \r\n" + + " Booker ID\r\n" + + " \r\n" + + " Booker Name\r\n" + + " \r\n" + + " Approval Remark\r\n" + + " \r\n" + + " Remark\r\n" + + "
"; + + private static final String cancelEmailTemp = "
Submission Date & Time:{{ttime}}
"+ + "
Submitted User:{{tuser}}
"+ + "

" + + "{{content}}"+ + "\r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " {{tbody}}"+ + " \r\n" + + "
\r\n" + + " Conf#\r\n" + + " \r\n" + + " Booking Status\r\n" + + " \r\n" + + " Member ID\r\n" + + " \r\n" + + " Member Name\r\n" + + " \r\n" + + " Tier\r\n" + + " \r\n" + + " Property\r\n" + + " \r\n" + + " Room Type\r\n" + + " \r\n" + + " Sharer\r\n" + + " \r\n" + + " Type\r\n" + + " \r\n" + + " Original C/I\r\n" + + " \r\n" + + " Original C/O\r\n" + + " \r\n" + + " Change C/I\r\n" + + " \r\n" + + " Change C/O\r\n" + + "
"; + + public Email sendExtendEmail(Bookings book, BookingsView originBook, Email emailObj, String userId, String userName, String emailTo) { + String content1 = emailTemp; + try { + EmailProxyRequest emailRequest = new EmailProxyRequest(); + emailRequest.setTo(StringUtils.isNotBlank(emailTo)?emailTo: defaultEmailReceiver); + emailRequest.setSender(defaultEmailSender); + + String subTitle = ""; + emailRequest.setSubject("[Urgent] Extension Request from Mobile CRM APP"+subTitle); + + SimpleDateFormat sf = new SimpleDateFormat("dd-MMM-yyyy HH:mm"); + SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy"); + String RequestDate = sf.format(new Date()); + + String content2 = ""; + String tTime = RequestDate; + userId = !StringUtils.isEmpty(userId)?userId:""; + userName = !StringUtils.isEmpty(userName)?userName:""; + String tUser = userId+" "+userName; + String operaStatus = Strings.CS.replace(book.getLastOperaStatus(), "_", " "); + + content2 += ""+ + "" + +book.getConfirmationNo()+ + " "+ + "" + +operaStatus+ + " " + + "" + +book.getPlayerId()+ + " " + + "" + +book.getMemberLastName()+ + " " + + "" + +(originBook.getMemberTier()!=null?originBook.getMemberTier():"")+ + " " + + "" + +(originBook.getPropertyName()!=null?originBook.getPropertyName():"")+ + " " + + "" + +(originBook.getRoom()!=null?originBook.getRoom():"")+ + " "+ + "" + +(originBook.getSharerName()!=null?originBook.getSharerName():"")+ + " "+ + "" + +format.format(originBook.getCheckinDate())+ + " " + + "" + +format.format(originBook.getCheckoutDate())+ + " " + + "" + +format.format(book.getCheckoutDate())+ + " " + + " "; + + content1 = content1.replace("{{tbody}}", content2); + content1 = content1.replace("{{ttime}}", tTime); + content1 = content1.replace("{{tuser}}", tUser); + emailRequest.setShowTemp(content1); + emailRequest.setContent(content1); + JSONObject emailJson = new JSONObject(); + emailJson.put("conf", book.getConfirmationNo()); + emailJson.put("memberId", book.getPlayerId()); + emailJson.put("memberName", book.getMemberLastName()); + emailJson.put("tier", originBook.getMemberTier()); + emailJson.put("property", originBook.getPropertyName()); + emailJson.put("roomType", originBook.getRoom()); + emailJson.put("checkin", format.format(originBook.getCheckinDate())); + emailJson.put("checkout", format.format(originBook.getCheckoutDate())); + emailJson.put("extCheckout", format.format(book.getCheckoutDate())); + + emailObj.setSendObject(emailJson.toJSONString()); + emailObj.setContent(content1); + emailObj.setSendTo(emailRequest.getTo()); + HttpResponseResult httpResult = HttpUtil.invokeGatewayEmailAPI((JSONObject) JSON.toJSON(emailRequest), "POST", null, apiGatewaySetting); + String resultMsg = this.extractResultFromResponse(httpResult); + if(StringUtils.isBlank(resultMsg)){ + emailObj.setStatus(1); + LogUtil.info(SendEmailService.class, "---mgmEmail.sendExtendEmail--OK!"); + }else{ + emailObj.setStatus(0); + emailObj.setMessage("Send Email to ["+emailRequest.getTo()+"] Failed:"+resultMsg); + LogUtil.error(SendEmailService.class, "---mgmEmail.sendExtendEmail--Failed!"+resultMsg); + } + } catch (Exception e) { + LogUtil.error(SendEmailService.class,"---mgmEmail.sendExtenEmail--Exception-->>"+e.getMessage()); + emailObj.setMessage(e.getMessage()); + emailObj.setStatus(0); + } + + return emailObj; + } + + public Email sendApprovalNewEmail(Bookings book,BookingsView bookView,Email emailObj,String userId,String userName,boolean isOverBook,boolean isConnectRoom,String emailTo) { + String content1 = emailNewApprovalTemp; + try { + EmailProxyRequest emailRequest = new EmailProxyRequest(); + emailRequest.setTo(StringUtils.isNotBlank(emailTo)?emailTo: defaultEmailReceiver); + emailRequest.setSender(defaultEmailSender); + + String mainTitle; + if(isConnectRoom) { + mainTitle = "[R2/Y2]"; + }else if(isOverBook) { + mainTitle = "[Overbook]"; + }else { + mainTitle = "[Urgent]"; + } + emailRequest.setSubject(mainTitle+"Waitlist Approval from Mobile CRM APP"); // 标题 + + SimpleDateFormat sf = new SimpleDateFormat("dd-MMM-yyyy HH:mm"); + SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy"); + String RequestDate = sf.format(new Date()); + + String content2 = ""; + String tTime = RequestDate; + userId = !StringUtils.isEmpty(userId)?userId:""; + userName = !StringUtils.isEmpty(userName)?userName:""; + String tUser = userId+" "+userName; + String approvalStatus = EumnApprovalStatus.getApprovalStatusByDBValue(book.getApproveStatus()); + + content2 += ""+ + "" + +approvalStatus+ + " "+ + "" + +bookView.getPlayerId()+ + " " + + "" + +bookView.getMemberLastName()+ + " " + + "" + +(bookView.getMemberTier()!=null?bookView.getMemberTier():"")+ + " " + + "" + +(bookView.getPropertyName()!=null?bookView.getPropertyName():"")+ + " " + + "" + +(bookView.getRoom()!=null?bookView.getRoom():"")+ + " "+ + "" + +(bookView.getSharerName()!=null?bookView.getSharerName():"")+ + " " + + "" + +"New"+ + " "+ + "" + +format.format(bookView.getCheckinDate())+ + " " + + "" + +format.format(bookView.getCheckoutDate())+ + " " + + "" + +(bookView.getSectionName()!=null?bookView.getSectionName():"")+ + " " + + "" + +bookView.getCreatedBy()+ + " " + + "" + +bookView.getCreatedByName()+ + " " + + "" + +(bookView.getApprovalRemark()!=null?bookView.getApprovalRemark():"")+ + " " + + "" + +(bookView.getRemark()!=null?bookView.getRemark():"")+ + " " + + " "; + + String mailContent = isConnectRoom?"Please create TT/YY booking for below approved booking

":""; + content1 = content1.replace("{{tbody}}", content2); + content1 = content1.replace("{{ttime}}", tTime); + content1 = content1.replace("{{tuser}}", tUser); + content1 = content1.replace("{{content}}", mailContent); + emailRequest.setShowTemp(content1); + emailRequest.setContent(content1); + JSONObject emailJson = new JSONObject(); + emailJson.put("approvalStatus", approvalStatus); + emailJson.put("memberId", bookView.getPlayerId()); + emailJson.put("memberName", bookView.getMemberLastName()); + emailJson.put("tier", bookView.getMemberTier()); + emailJson.put("property", bookView.getPropertyName()); + emailJson.put("roomType", bookView.getRoom()); + emailJson.put("type", "New"); + emailJson.put("checkin", format.format(bookView.getCheckinDate())); + emailJson.put("checkout", format.format(bookView.getCheckoutDate())); + emailJson.put("bookerTeam", bookView.getBookerTeam()); + emailJson.put("bookerId", bookView.getCreatedBy()); + emailJson.put("bookerName", bookView.getCreatedByName()); + emailJson.put("approvalRemark", bookView.getApprovalRemark()); + emailJson.put("remark", bookView.getRemark()); + + emailObj.setSendObject(emailJson.toJSONString()); + emailObj.setContent(content1); + emailObj.setSendTo(emailRequest.getTo()); + + HttpResponseResult httpResult = HttpUtil.invokeGatewayEmailAPI((JSONObject) JSON.toJSON(emailRequest), "POST", null, apiGatewaySetting); + String resultMsg = this.extractResultFromResponse(httpResult); + if(StringUtils.isBlank(resultMsg)){ + emailObj.setStatus(1); + LogUtil.info(SendEmailService.class, "---mgmEmail.sendApprovalNewEmail--OK!"); + }else{ + emailObj.setStatus(0); + emailObj.setMessage("Send Email to ["+emailRequest.getTo()+"] Failed:"+resultMsg); + LogUtil.error(SendEmailService.class, "---mgmEmail.sendApprovalNewEmail--Failed!"+resultMsg); + } + } catch (Exception e) { + LogUtil.error(SendEmailService.class,"---mgmEmail.sendApprovalNewEmail--Exception-->>"+e.getMessage()); + emailObj.setMessage(e.getMessage()); + emailObj.setStatus(0); + } + + return emailObj; + } + + public Email sendCreateR2Y2NewEmail(Bookings book,BookingsView bookView,Email emailObj,String userId,String userName,boolean isOverBook,boolean isConnectRoom,String emailTo) { + String content1 = emailNewApprovalTemp; + try { + + EmailProxyRequest emailRequest = new EmailProxyRequest(); + emailRequest.setTo(StringUtils.isNotBlank(emailTo)?emailTo: defaultEmailReceiver); + emailRequest.setSender(defaultEmailSender); + + String mainTitle; + if(isConnectRoom) { + mainTitle = "[R2/Y2]"; + }else if(isOverBook) { + mainTitle = "[Overbook]"; + }else { + mainTitle = "[Urgent]"; + } + emailRequest.setSubject(mainTitle+"Booking Creation from Mobile CRM APP"); // 标题 + + SimpleDateFormat sf = new SimpleDateFormat("dd-MMM-yyyy HH:mm"); + SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy"); + String RequestDate = sf.format(new Date()); + + String content2 = ""; + String tTime = RequestDate; + userId = !StringUtils.isEmpty(userId)?userId:""; + userName = !StringUtils.isEmpty(userName)?userName:""; + String tUser = userId+" "+userName; + String approvalStatus = EumnApprovalStatus.getApprovalStatusByDBValue(book.getApproveStatus()); + + + content2 += ""+ + "" + +approvalStatus+ + " "+ + "" + +bookView.getPlayerId()+ + " " + + "" + +bookView.getMemberLastName()+ + " " + + "" + +(bookView.getMemberTier()!=null?bookView.getMemberTier():"")+ + " " + + "" + +(bookView.getPropertyName()!=null?bookView.getPropertyName():"")+ + " " + + "" + +(bookView.getRoom()!=null?bookView.getRoom():"")+ + " "+ + "" + +(bookView.getSharerName()!=null?bookView.getSharerName():"")+ + " " + + "" + +"New"+ + " "+ + "" + +format.format(bookView.getCheckinDate())+ + " " + + "" + +format.format(bookView.getCheckoutDate())+ + " " + + "" + +(bookView.getSectionName()!=null?bookView.getSectionName():"")+ + " " + + "" + +bookView.getCreatedBy()+ + " " + + "" + +bookView.getCreatedByName()+ + " " + + "" + +(bookView.getApprovalRemark()!=null?bookView.getApprovalRemark():"")+ + " " + + "" + +(bookView.getRemark()!=null?bookView.getRemark():"")+ + " " + + " "; + + String mailContent = isConnectRoom?"Please create TT/YY booking for below approved booking

":""; + content1 = content1.replace("{{tbody}}", content2); + content1 = content1.replace("{{ttime}}", tTime); + content1 = content1.replace("{{tuser}}", tUser); + content1 = content1.replace("{{content}}", mailContent); + emailRequest.setShowTemp(content1); + emailRequest.setContent(content1); + JSONObject emailJson = new JSONObject(); + emailJson.put("approvalStatus", approvalStatus); + emailJson.put("memberId", bookView.getPlayerId()); + emailJson.put("memberName", bookView.getMemberLastName()); + emailJson.put("tier", bookView.getMemberTier()); + emailJson.put("property", bookView.getPropertyName()); + emailJson.put("roomType", bookView.getRoom()); + emailJson.put("type", "New"); + emailJson.put("checkin", format.format(bookView.getCheckinDate())); + emailJson.put("checkout", format.format(bookView.getCheckoutDate())); + emailJson.put("bookerTeam", bookView.getBookerTeam()); + emailJson.put("bookerId", bookView.getCreatedBy()); + emailJson.put("bookerName", bookView.getCreatedByName()); + emailJson.put("approvalRemark", bookView.getApprovalRemark()); + emailJson.put("remark", bookView.getRemark()); + + emailObj.setSendObject(emailJson.toJSONString()); + emailObj.setContent(content1); + emailObj.setSendTo(emailRequest.getTo()); + + HttpResponseResult httpResult = HttpUtil.invokeGatewayEmailAPI((JSONObject) JSON.toJSON(emailRequest), "POST", null, apiGatewaySetting); + String resultMsg = this.extractResultFromResponse(httpResult); + if(StringUtils.isBlank(resultMsg)){ + emailObj.setStatus(1); + LogUtil.info(SendEmailService.class, "---mgmEmail.sendApprovalNewEmail--OK!"); + }else{ + emailObj.setStatus(0); + emailObj.setMessage("Send Email to ["+emailRequest.getTo()+"] Failed:"+resultMsg); + LogUtil.error(SendEmailService.class, "---mgmEmail.sendApprovalNewEmail--Failed!"+resultMsg); + } + } catch (Exception e) { + LogUtil.error(SendEmailService.class,"---mgmEmail.sendApprovalNewEmail--Exception-->>"+e.getMessage()); + emailObj.setMessage(e.getMessage()); + emailObj.setStatus(0); + } + + return emailObj; + } + + public Email sendApprovalExtendEmail(Bookings book, BookingsView originBook, Email emailObj, String userId, String userName, BookingsView viewBook, boolean isOverBook, String emailTo) { + String content1 = emailApprovalTemp; + try { + EmailProxyRequest emailRequest = new EmailProxyRequest(); + emailRequest.setTo(StringUtils.isNotBlank(emailTo)?emailTo: defaultEmailReceiver); + emailRequest.setSender(defaultEmailSender); + + String subTitle = ""; + String mainTitle = isOverBook?"[Overbook]":"[Urgent]"; + emailRequest.setSubject(mainTitle+"Waitlist Approval from Mobile CRM APP"+subTitle); // 标题 + + SimpleDateFormat sf = new SimpleDateFormat("dd-MMM-yyyy HH:mm"); + SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy"); + String RequestDate = sf.format(new Date()); + + String content2 = ""; + String tTime = RequestDate; + userId = !StringUtils.isEmpty(userId)?userId:""; + userName = !StringUtils.isEmpty(userName)?userName:""; + String tUser = userId+" "+userName; + String approvalStatus = EumnApprovalStatus.getApprovalStatusByDBValue(book.getApproveStatus()); + String changeProperty = ""; + String changeRoom = ""; + String changeCheckInDate = ""; + if(!Strings.CS.equals(viewBook.getPropertyName(), originBook.getPropertyName()) || + !Strings.CS.equals(viewBook.getRoom(), originBook.getRoom()) || + viewBook.getCheckinDate().getTime()!=originBook.getCheckoutDate().getTime()) { + changeProperty = viewBook.getPropertyName()!=null?viewBook.getPropertyName():""; + changeRoom = viewBook.getRoom()!=null?viewBook.getRoom():""; + changeCheckInDate = viewBook.getCheckinDate()!=null?format.format(viewBook.getCheckinDate()):""; + } + + + content2 += ""+ + "" + +approvalStatus+ + " "+ + "" + +originBook.getConfirmationNo()+ + " "+ + "" + +originBook.getPlayerId()+ + " " + + "" + +originBook.getMemberLastName()+ + " " + + "" + +(originBook.getMemberTier()!=null?originBook.getMemberTier():"")+ + " " + + "" + +(originBook.getPropertyName()!=null?originBook.getPropertyName():"")+ + " " + + "" + +(originBook.getRoom()!=null?originBook.getRoom():"")+ + " "+ + "" + +(originBook.getSharerName()!=null?originBook.getSharerName():"")+ + " "+ + "" + +"Extend"+ + " "+ + "" + +format.format(originBook.getCheckinDate())+ + " " + + "" + +format.format(originBook.getCheckoutDate())+ + " " + + "" + +changeProperty+ + " " + + "" + +changeRoom+ + " " + + "" + +changeCheckInDate+ + " " + + "" + +format.format(book.getCheckoutDate())+ + " " + + "" + +(viewBook.getSectionName()!=null?viewBook.getSectionName():"")+ + " " + + "" + +originBook.getCreatedBy()+ + " " + + "" + +originBook.getCreatedByName()+ + " " + + "" + +(book.getApprovalRemark()!=null?book.getApprovalRemark():"")+ + " " + + "" + +(book.getRemark()!=null?book.getRemark():"")+ + " " + + " "; + + content1 = content1.replace("{{tbody}}", content2); + content1 = content1.replace("{{ttime}}", tTime); + content1 = content1.replace("{{tuser}}", tUser); + emailRequest.setShowTemp(content1); + emailRequest.setContent(content1); + JSONObject emailJson = new JSONObject(); + emailJson.put("approvalStatus", approvalStatus); + emailJson.put("conf", book.getConfirmationNo()); + emailJson.put("memberId", book.getPlayerId()); + emailJson.put("memberName", book.getMemberLastName()); + emailJson.put("tier", originBook.getMemberTier()); + emailJson.put("property", originBook.getPropertyName()); + emailJson.put("roomType", originBook.getRoom()); + emailJson.put("type", "Extend"); + emailJson.put("checkin", format.format(originBook.getCheckinDate())); + emailJson.put("checkout", format.format(originBook.getCheckoutDate())); + emailJson.put("changeProperty", changeProperty); + emailJson.put("changeRoom", changeRoom); + emailJson.put("changeCheckin", changeCheckInDate); + emailJson.put("changeCheckout", format.format(book.getCheckoutDate())); + emailJson.put("bookerTeam", viewBook.getBookerTeam()); + emailJson.put("bookerId", originBook.getCreatedBy()); + emailJson.put("bookerName", originBook.getCreatedByName()); + emailJson.put("approvalRemark", book.getApprovalRemark()); + emailJson.put("remark", book.getRemark()); + + emailObj.setSendObject(emailJson.toJSONString()); + emailObj.setContent(content1); + emailObj.setSendTo(emailRequest.getTo()); + + HttpResponseResult httpResult = HttpUtil.invokeGatewayEmailAPI((JSONObject) JSON.toJSON(emailRequest), "POST", null, apiGatewaySetting); + String resultMsg = this.extractResultFromResponse(httpResult); + if(StringUtils.isBlank(resultMsg)){ + emailObj.setStatus(1); + LogUtil.info(SendEmailService.class, "---mgmEmail.sendApprovalExtendEmail--OK!"); + }else{ + emailObj.setStatus(0); + emailObj.setMessage("Send Email to ["+emailRequest.getTo()+"] Failed:"+resultMsg); + LogUtil.error(SendEmailService.class, "---mgmEmail.sendApprovalExtendEmail--Failed!"+resultMsg); + } + } catch (Exception e) { + LogUtil.error(SendEmailService.class,"---mgmEmail.sendApprovalExtendEmail--Exception-->>"+e.getMessage()); + emailObj.setMessage(e.getMessage()); + emailObj.setStatus(0); + } + + return emailObj; + } + + public Email sendCancelEmail(Bookings book,BookingsView bookingsView,Email emailObj,String userId,String userName,String emailTo) { + String content1 = cancelEmailTemp; + + try { + EmailProxyRequest emailRequest = new EmailProxyRequest(); + emailRequest.setTo(StringUtils.isNotBlank(emailTo)?emailTo: defaultEmailReceiver); + emailRequest.setSender(defaultEmailSender); + + String subTitle = ""; + emailRequest.setSubject("[Urgent] Modify Request from Mobile CRM APP"+subTitle); // 标题 + + SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + String RequestDate = sf.format(new Date()); + + String tTime = RequestDate; + userId = !StringUtils.isEmpty(userId)?userId:""; + userName = !StringUtils.isEmpty(userName)?userName:""; + String tUser = userId+" "+userName; + String content2 = ""; + userId = !StringUtils.isEmpty(userId)?userId:""; + userName = !StringUtils.isEmpty(userName)?userName:""; + String approvalStatus = EumnApprovalStatus.getApprovalStatusByDBValue(book.getApproveStatus()); + + content2 += ""+ + "" + +bookingsView.getConfirmationNo()+ + " "+ + "" + +approvalStatus+ + " "+ + "" + +bookingsView.getPlayerId()+ + " " + + "" + +bookingsView.getMemberLastName()+ + " " + + "" + +(bookingsView.getTier()!=null?bookingsView.getTier():"")+ + " " + + "" + +(bookingsView.getPropertyName()!=null?bookingsView.getPropertyName():"")+ + " " + + "" + +(bookingsView.getRoom()!=null?bookingsView.getRoom():"")+ + " "+ + "" + +(bookingsView.getSharerName()!=null?bookingsView.getSharerName():"")+ + " "+ + "" + +"Cancel"+ + " "+ + "" + +format.format(bookingsView.getCheckinDate())+ + " " + + "" + +format.format(bookingsView.getCheckoutDate())+ + " " + + "" + +book.getChangeCheckinDate()+ + " " + + "" + +book.getChangeCheckoutDate()+ + " "; + + + String content = "Please cancel Conf#"+book.getConfirmationNo()+" under "+book.getMemberLastName(); + + content1 = content1.replace("{{tbody}}", content2); + content1 = content1.replace("{{ttime}}", tTime); + content1 = content1.replace("{{tuser}}", tUser); + content1 = content1.replace("{{content}}", content); + emailRequest.setShowTemp(content1); + emailRequest.setContent(content1); + JSONObject emailJson = new JSONObject(); + emailJson.put("conf", book.getConfirmationNo()); + emailJson.put("memberId", book.getPlayerId()); + emailJson.put("memberName", book.getMemberLastName()); + + emailObj.setSendObject(emailJson.toJSONString()); + emailObj.setContent(content1); + emailObj.setSendTo(emailRequest.getTo()); + + HttpResponseResult httpResult = HttpUtil.invokeGatewayEmailAPI((JSONObject) JSON.toJSON(emailRequest), "POST", null, apiGatewaySetting); + String resultMsg = this.extractResultFromResponse(httpResult); + if(StringUtils.isBlank(resultMsg)){ + emailObj.setStatus(1); + LogUtil.info(SendEmailService.class, "---mgmEmail.sendCancelEmail--OK!"); + }else{ + emailObj.setStatus(0); + emailObj.setMessage("Send Email to ["+emailRequest.getTo()+"] Failed:"+resultMsg); + LogUtil.error(SendEmailService.class, "---mgmEmail.sendCancelEmail--Failed!"+resultMsg); + } + } catch (Exception e) { + LogUtil.error(SendEmailService.class,"---mgmEmail.sendCancelEmail--Exception-->>"+e.getMessage()); + emailObj.setMessage(e.getMessage()); + emailObj.setStatus(0); + } + + return emailObj; + } + + public boolean sendOtherBookingEmail(CfgEmailTemplate emailTemplate) { + boolean status = false; + try { + EmailProxyRequest emailRequest = new EmailProxyRequest(); + emailRequest.setTo(defaultEmailReceiver); + emailRequest.setSender(emailTemplate.getSender()); + + String subject = emailTemplate.getSubject(); + subject = Strings.CI.replace(subject, "[TODAY]", DateTimeUtil.getCurrentDate("dd MMM")); + emailRequest.setSubject(subject); // 标题 + emailRequest.setCc(emailTemplate.getCc()); + emailRequest.setShowTemp(emailTemplate.getShowTemp()); + emailRequest.setContent(emailTemplate.getShowTemp()); + + HttpResponseResult httpResult = HttpUtil.invokeGatewayEmailAPI((JSONObject) JSON.toJSON(emailRequest), "POST", null, apiGatewaySetting); + String resultMsg = this.extractResultFromResponse(httpResult); + if(StringUtils.isBlank(resultMsg)){ + status=true; + LogUtil.info(SendEmailService.class, "---mgmEmail.sendOtherBookingEmail--OK!"); + }else{ + status=false; + LogUtil.error(SendEmailService.class, "send email failed:" + resultMsg); + } + } catch (Exception e) { + LogUtil.error(SendEmailService.class,"---mgmEmail.sendOtherBookingEmail--Exception-->>"+e.getMessage()); + status=false; + } + + return status; + } + + private String extractResultFromResponse(HttpResponseResult httpResult){ + String result =""; + try{ + JSONObject obj = JSONObject.parseObject(httpResult.getResponseContent()); + if(obj.getBooleanValue("success")) { + result=""; + }else { + if(obj.getString("message")!=null&&obj.getString("message")!="") { + result = obj.getString("message"); + }else { + result = "System Error"; + } + } + }catch(Exception err){ + result = err.getMessage(); + } + return result; + } + + +} 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 dc17744..5687783 100644 --- a/src/main/java/com/mgm/mcrm/player/services/TodoService.java +++ b/src/main/java/com/mgm/mcrm/player/services/TodoService.java @@ -37,11 +37,11 @@ import com.mgm.mcrm.common.services.HttpService; import com.mgm.mcrm.common.services.MGMEsbApiService; import com.mgm.mcrm.common.utils.DateTimeUtil; import com.mgm.mcrm.common.utils.LogUtil; -import com.mgm.mcrm.common.utils.SendEmail; import com.mgm.mcrm.logging.models.SysLogBooking; import com.mgm.mcrm.logging.services.SysLogBookingService; import com.mgm.mcrm.notification.models.Email; import com.mgm.mcrm.notification.repositories.EmailDao; +import com.mgm.mcrm.notification.services.SendEmailService; import com.mgm.mcrm.player.dtos.request.EtaRecordInfo; import com.mgm.mcrm.player.dtos.request.TodoCancelBookingRequest; import com.mgm.mcrm.player.dtos.request.TodoChangeDateRequest; @@ -125,6 +125,9 @@ public class TodoService { @Resource private BookingMapper bookingMapper; + @Resource + private SendEmailService sendEmailService; + public GetDashboardResponse getTodoDashboard(String userId) throws Exception { GetDashboardResponse result = new GetDashboardResponse(); @@ -830,7 +833,7 @@ public class TodoService { bookingDao.save(booking); processResult.setSuccess(true); processResult.setData(bookingMapper.entityToDto(booking)); - bookingService.daylightReservationChangeDate(param, profile, false); + bookingService.daylightReservationChangeDate(param, profile, false, false); LogUtil.info(TodoService.class, "[ChangeBookingDate] ID:"+bookingView.getDlReservationId()); @@ -855,7 +858,7 @@ public class TodoService { booking.setChangeCheckoutDate(coDate); bookingView = this.getEmailInfo(bookingView, userId); CfgSettings emailAddress = settingService.getSettingByKey(SysConstants.MGM_EMAIL_ADDRESS); - email = SendEmail.sendCancelEmail(booking, bookingView, email, userId, userName, emailAddress.getKeyValues()); + email = sendEmailService.sendCancelEmail(booking, bookingView, email, userId, userName, emailAddress.getKeyValues()); if (email.getStatus() == 1) { processResult.setSuccess(true); } else { diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 1513908..95b2e1d 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -141,6 +141,15 @@ api-gateway: app-id: MCRM_APP auth-code: securItykeyOfCrmapp87895312 +#============== Truststore Manager Setting ============== +trust-store: + http-support: + skip-validation: true + http-util: + skip-validation: true + soap-util: + skip-validation: true + sso: callback: login: @@ -157,7 +166,7 @@ host_name: mcrm adfs_request_timeout: 10000 adfs_login_timeout: 60000 -allow_origin: "http://localhost:5173,http://127.0.0.1:5173,http://localhost:8080,MGM_CRM_APP,MGM_CRM_CMS,https://localhost:9085,http://localhost:8081,http://127.0.0.1:8081,https://localhost:9087/api/esb/proxy" +allow_origin: "http://localhost:5173,http://127.0.0.1:5173,http://localhost:8080,MGM_CRM_APP,MGM_CRM_CMS,https://localhost:9085,http://localhost:8081,http://127.0.0.1:8081,https://localhost:9087,https://localhost:9086,https://127.0.0.1:9086" soap_servers: "http://localhost:5173,http://127.0.0.1:5173" http_api_servers: "http://localhost:5173,http://127.0.0.1:5173,http://localhost:9087" allow_ip: "0:0:0:0:0:0:0:1,127.0.0.1" @@ -197,6 +206,8 @@ calendar: #==================APP Config=================== notification: recent-hours: 6 + default-email-sender: test@test.com + default-email-receiver: missing@test.com limo: booking-draft: diff --git a/src/main/resources/idp-metadata.xml b/src/main/resources/idp-metadata.xml deleted file mode 100644 index 577c6f2..0000000 --- a/src/main/resources/idp-metadata.xml +++ /dev/null @@ -1 +0,0 @@ -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电子邮件地址用户的电子邮件地址名用户的名名称用户的唯一名称UPN用户的用户主体名称(UPN)公用名用户的公用名AD FS 1.x 电子邮件地址与 AD FS 1.1 或 AD FS 1.0 互操作时用户的电子邮件地址组用户是其成员的组AD FS 1.x UPN与 AD FS 1.1 或 AD FS 1.0 互操作时用户的 UPN角色用户所具有的角色Surname用户的姓氏PPID用户的专用标识符名称 ID用户的 SAML 名称标识符身份验证时间戳用于显示验证用户身份的时间和日期身份验证方法用于验证用户身份的方法“仅拒绝”组 SID用户的“仅拒绝”组 SID“仅拒绝”主 SID用户的“仅拒绝”主 SID“仅拒绝”主组 SID用户的“仅拒绝”主组 SID组 SID用户的组 SID主组 SID用户的主组 SID主 SID用户的主 SIDWindows 帐户名用户的域帐户名(域\用户形式)为注册用户为了使用此设备,用户已注册设备标识符设备的标识符Device Registration 标识符Device Registration 的标识符Device Registration 显示名称Device Registration 的显示名称设备 OS 类型设备的 OS 类型设备 OS 版本设备的 OS 版本为托管设备设备由管理服务进行管理转发的客户端 IP用户的 IP 地址客户端应用程序客户端应用程序的类型客户端用户代理客户端访问应用程序所使用的设备类型客户端 IP客户端的 IP 地址终结点路径可用于确定主动和被动客户端的绝对终结点路径代理传递请求的联合服务器代理的 DNS 名称应用程序标识符信赖方标识符应用程序策略证书的应用程序策略授权密钥标识符对已颁发证书签名的证书授权密钥标识符扩展基本约束证书的基本约束之一增强密钥用法描述证书的增强密钥用法之一颁发者颁发 X.509 证书的证书颁发机构的名称颁发者名称证书颁发者的可分辨名称密钥用法证书的密钥用法之一不晚于以本地时间表示的证书有效截止日期不早于以本地时间表示的证书生效日期证书策略颁发证书所依据的策略公钥证书的公钥证书原始数据证书的原始数据使用者可选名称证书的备用名称之一序列号证书的序列号签名算法用于创建证书签名的算法使用者证书中的使用者使用者密钥标识符描述证书的使用者密钥标识符使用者名称证书中的使用者可分辨名称V2 模板名称颁发或续订证书时使用的版本 2 证书模板的名称。扩展名特定于 Microsoft。V1 模板名称颁发或续订证书时使用的版本 1 证书模板的名称。扩展名特定于 Microsoft。指纹证书的指纹X.509 版本证书的 X.509 格式版本在公司网络内部用于指明请求是否从公司网络中发出。密码到期时间用于显示密码到期时间密码到期天数用于显示距密码到期的天数更新密码 URL用于显示更新密码服务的 Web 地址身份验证方法引用用于指示用来验证用户的所有身份验证方法客户端请求 ID用户会话的标识符
https://adserver.willtechmacau.com/adfs/services/trust/2005/issuedtokenmixedasymmetricbasic256
https://adserver.willtechmacau.com/adfs/services/trust/2005/issuedtokenmixedsymmetricbasic256
https://adserver.willtechmacau.com/adfs/services/trust/13/issuedtokenmixedasymmetricbasic256
https://adserver.willtechmacau.com/adfs/services/trust/13/issuedtokenmixedsymmetricbasic256
https://adserver.willtechmacau.com/adfs/ls/
http://adserver.willtechmacau.com/adfs/services/trust
https://adserver.willtechmacau.com/adfs/services/trust/2005/issuedtokenmixedasymmetricbasic256
https://adserver.willtechmacau.com/adfs/ls/
MIIC8DCCAdigAwIBAgIQMzdxsgcsk7JBQOiD4S7Z9TANBgkqhkiG9w0BAQsFADA0MTIwMAYDVQQDEylBREZTIFNpZ25pbmcgLSBhZHNlcnZlci53aWxsdGVjaG1hY2F1LmNvbTAeFw0yNDA5MTYwODExMzNaFw0yNTA5MTYwODExMzNaMDQxMjAwBgNVBAMTKUFERlMgU2lnbmluZyAtIGFkc2VydmVyLndpbGx0ZWNobWFjYXUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7IYsJuA7nu7lEreZbWUuZbW4ywfm6rGddTYRusRSrqJRmcLtIby9FQP3jt5brPzoleSbVsrOU+3h9IXMkfJ1sBu+BcW1X/IzUIrQsjJQss1L/9b81ZMiy+ew1QTg2CZt8fQbbt+PXh8jm3vFvSQdXHMD/cO16eZNGBZFeq8xM15k7bo+aAm6X0XQbIOsAhymAFwVLLpEzXxsmCAIy6hz9cdVH1GOVoKtX7SGw6uDGiwrZLNHJsRVzt0Byx3xvFXM1zEZBRJ0nexWK6zk+80AuLoZqiidwi8cnsdceBk4no5b4COE8bEFMN8oR6/ohDW6JQBhVIJS+jwJCweez9xcgQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBoRtn4mw9VUCKe2Bg+XskP/rAPPMsuENH26S6100vEvJu35z/ak61ttCuF3d7lpI/WVge/AZNbulx3Hl0EzCx4tN3cnVU5aW/0Ynn4My5m8Lz+cK37crukTtFqY2rdBlSAUy1uw+z9OXluJ/St7DL7cbLNyJg/ncKRncjkb0rtbFQ3kOiULO3WTWDQcKbQjFZKYpJ+QmTq2DmGkuYb+lwxcK+ObBm3gklw77f3Fhz5Briz9UEPVzp5QeLpfeNEbI4rvwSeUo/UQ4eyE2Ux4K5LNvXDSHTBiggUl9yTXLjvPdT439HRuiFpZ+fj19lB4Ywu8dphvkfJO12FEQpaNqO/电子邮件地址用户的电子邮件地址名用户的名名称用户的唯一名称UPN用户的用户主体名称(UPN)公用名用户的公用名AD FS 1.x 电子邮件地址与 AD FS 1.1 或 AD FS 1.0 互操作时用户的电子邮件地址组用户是其成员的组AD FS 1.x UPN与 AD FS 1.1 或 AD FS 1.0 互操作时用户的 UPN角色用户所具有的角色Surname用户的姓氏PPID用户的专用标识符名称 ID用户的 SAML 名称标识符身份验证时间戳用于显示验证用户身份的时间和日期身份验证方法用于验证用户身份的方法“仅拒绝”组 SID用户的“仅拒绝”组 SID“仅拒绝”主 SID用户的“仅拒绝”主 SID“仅拒绝”主组 SID用户的“仅拒绝”主组 SID组 SID用户的组 SID主组 SID用户的主组 SID主 SID用户的主 SIDWindows 帐户名用户的域帐户名(域\用户形式)为注册用户为了使用此设备,用户已注册设备标识符设备的标识符Device Registration 标识符Device Registration 的标识符Device Registration 显示名称Device Registration 的显示名称设备 OS 类型设备的 OS 类型设备 OS 版本设备的 OS 版本为托管设备设备由管理服务进行管理转发的客户端 IP用户的 IP 地址客户端应用程序客户端应用程序的类型客户端用户代理客户端访问应用程序所使用的设备类型客户端 IP客户端的 IP 地址终结点路径可用于确定主动和被动客户端的绝对终结点路径代理传递请求的联合服务器代理的 DNS 名称应用程序标识符信赖方标识符应用程序策略证书的应用程序策略授权密钥标识符对已颁发证书签名的证书授权密钥标识符扩展基本约束证书的基本约束之一增强密钥用法描述证书的增强密钥用法之一颁发者颁发 X.509 证书的证书颁发机构的名称颁发者名称证书颁发者的可分辨名称密钥用法证书的密钥用法之一不晚于以本地时间表示的证书有效截止日期不早于以本地时间表示的证书生效日期证书策略颁发证书所依据的策略公钥证书的公钥证书原始数据证书的原始数据使用者可选名称证书的备用名称之一序列号证书的序列号签名算法用于创建证书签名的算法使用者证书中的使用者使用者密钥标识符描述证书的使用者密钥标识符使用者名称证书中的使用者可分辨名称V2 模板名称颁发或续订证书时使用的版本 2 证书模板的名称。扩展名特定于 Microsoft。V1 模板名称颁发或续订证书时使用的版本 1 证书模板的名称。扩展名特定于 Microsoft。指纹证书的指纹X.509 版本证书的 X.509 格式版本在公司网络内部用于指明请求是否从公司网络中发出。密码到期时间用于显示密码到期时间密码到期天数用于显示距密码到期的天数更新密码 URL用于显示更新密码服务的 Web 地址身份验证方法引用用于指示用来验证用户的所有身份验证方法客户端请求 ID用户会话的标识符
https://adserver.willtechmacau.com/adfs/services/trust/2005/certificatemixed
https://adserver.willtechmacau.com/adfs/services/trust/mex
https://adserver.willtechmacau.com/adfs/ls/
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:oasis:names:tc:SAML:1.1:nameid-format:emailAddressurn:oasis:names:tc:SAML:2.0:nameid-format:persistenturn:oasis:names:tc:SAML:2.0:nameid-format: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:oasis:names:tc:SAML:1.1:nameid-format:emailAddressurn:oasis:names:tc:SAML:2.0:nameid-format:persistenturn:oasis:names:tc:SAML:2.0:nameid-format:transient
\ No newline at end of file