This commit is contained in:
Mauve
2026-09-29 21:55:52 +08:00
parent 3b6f0495a3
commit 32945d7469
31 changed files with 1473 additions and 268 deletions
+1 -1
View File
@@ -123,7 +123,7 @@
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.8.17</version>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
@@ -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";
@@ -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<List<CfgRequestReason>> 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<PlayerProfileEntry> findPlayerResult = playerService.findPlayerProfileByPlayerIdAndUserId(originBooking.getPlayerId(), userId);
if(findPlayerResult.isSuccess()) {
originBooking.setApproveStatus("AA");
bookingDao.save(originBooking);
}else{
BaseApiResponse<PlayerProfileEntry> findPlayerResult = playerService
.findPlayerProfileByPlayerIdAndUserId(originBooking.getPlayerId(), userId);
if (!findPlayerResult.isSuccess() || findPlayerResult.getData() == null) {
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);
} else {
BaseApiResponse<List<Bookings>> extendResult = bookingService.extendDaylightApprovalBooking(
originBooking, findPlayerResult.getData(), userId, userName);
if (extendResult.isSuccess()) {
originBooking.setApproveStatus("AA");
bookingDao.save(originBooking);
response.setSuccess(true);
response.setData(approvalMapper.toSubmitApprovalResponse(originBooking));
} 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);
}
}
@@ -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<RequestorApproverResponse> requestorResponse =
getDaylightRequestorApproverByUserId(dlPropertyId, requestorUserId);
BaseApiResponse<RequestorApproverResponse> 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<String> 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());
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);
@@ -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(" <HotelReference chainCode=\""+this.getProperty().getCode()+"\" hotelCode=\""+this.getProperty().getHotelCode()+"\"/>");
this.requestString.append(" <ConfirmationNumber type=\"INTERNAL\">"+this.confirmationNo+"</ConfirmationNumber>");
if(this.comment!=null) {
if (this.actionType!=null) {
this.requestString.append(" <ActionType>"+this.actionType+"</ActionType>");
}else{
this.requestString.append(" <ActionType>ADD</ActionType>");
}
this.requestString.append(" <RequestType>COMMENTS</RequestType>");
this.requestString.append(" <FullOverlay>"+this.fullOverlay+"</FullOverlay>");
this.requestString.append(" <GuestRequests>");
this.requestString.append(" <hc:Comments>");
this.requestString.append(" <hc:Comment guestViewable=\"true\">");
this.requestString.append(" <hc:Text>"+this.comment+"</hc:Text>");
if(this.commentId!=null){
this.requestString.append(" <hc:CommentId>"+this.commentId+"</hc:CommentId>");
this.requestString.append(" <hc:InternalYn>false</hc:InternalYn>");
}
if(this.commentType!=null) {
this.requestString.append(" <hc:CommentType>"+this.commentType+"</hc:CommentType>");
}
@@ -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;
@@ -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<List<Bookings>> result = this.daylightReservationChangeDate(changeRequest, player, true);
BaseApiResponse<List<Bookings>> 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<List<Bookings>> daylightReservationChangeDate(TodoChangeDateRequest param, PlayerProfileEntry player, boolean isExtend) throws Exception {
public BaseApiResponse<List<Bookings>> daylightReservationChangeDate(TodoChangeDateRequest param,
PlayerProfileEntry player, boolean isExtend, boolean isApprovalExtend) throws Exception {
BaseApiResponse<List<Bookings>> 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<List<Bookings>> extendDaylightApprovalBooking(Bookings approvalBooking,
PlayerProfileEntry player, String userId, String userName) throws Exception {
BaseApiResponse<List<Bookings>> 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<List<Bookings>> extendDaylightWaitlistBooking(Bookings waitlistBooking,
PlayerProfileEntry player, String userId, String userName) throws Exception {
BaseApiResponse<List<Bookings>> 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<Bookings> 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,6 +6313,18 @@ public class BookingService {
}
}
Matcher mscHeaderMatcher = Pattern.compile(
"(?m)^[ \\t]*\\(RM(?:\\+INC\\$[^)]*)?\\)COMP[ \\t]+\\.\\.MSC(?:&#x20;|[ \\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
+ (remainingComment.isEmpty() ? "" : "\n" + remainingComment);
} else {
int headerEnd = comment.indexOf("..APP");
if (headerEnd >= 0) {
@@ -6275,6 +6339,7 @@ public class BookingService {
comment = comment + "\n" + amendLine;
}
}
}
} else {
// 全新构造
comment = "(RM+INC$" + newMisCharge + ")COMP ..APP\n\n"
@@ -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("&#xA;", "\n")
.replace("&#x24;", "$");
.replace("&#x24;", "$")
.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) {
@@ -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();
@@ -1101,7 +1101,7 @@ public class OperaService {
}
}else {
comment = String.format("(RM) COMP..APP&#xA;&#xA;%s,%s,%s", dateRange,
book.getDlSourceId(), book.getCreatedBy());
book.getSourceCode(), book.getCreatedBy());
}
return comment;
@@ -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<BookingsView> getBookingsByPlayer(String playerId) throws Exception {
List<BookingsView> bookingList = new ArrayList<BookingsView>();
@@ -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);
}
}
@@ -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<String,String> notifyTemplateMap = new HashMap<String,String>();
private static final Map<String,AppServerState> appServerStates = new HashMap<String,AppServerState>();
private static final List<String> allowOriginSource = new ArrayList<String>();
@Getter
private static final List<String> soapServers = new ArrayList<String>();
@Getter
private static final List<String> httpApiServers = new ArrayList<String>();
private static final List<String> allowIPSource = new ArrayList<String>();
// @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;
}
}
@@ -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[]{};
public static ConfigurableTrustHandler getTrustHandler(){
if(trustHandler==null){
trustHandler =new ConfigurableTrustHandler(skipValidation, SysCommon.getDefaultTrustManager(), SysCommon.getHttpApiServers());
}
return trustHandler;
}
@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;
}
}
/**
* 获取默认 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);
@@ -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<ApplicationStartedEve
private String httpApiServers;
@Value("${allow_ip}")
private String allowIP;
@Value("${trust-store.http-support.skip-validation}")
private boolean skipHttpSupportValidation;
@Value("${trust-store.http-util.skip-validation}")
private boolean skipHttpUtilValidation;
@Value("${trust-store.soap-util.skip-validation}")
private boolean skipSoapUtilValidation;
@Resource
private SysSettingService sysSettingService;
@Autowired
@@ -49,6 +60,12 @@ public class ConfigListener implements ApplicationListener<ApplicationStartedEve
SysCommon.loadApiServerConfig(httpApiServers);
SysCommon.loadAllowIPConfig(allowIP);
ExcelUtils.loadExcelDefines();
//-- Set Trust Manager validation
HttpSslSupport.setSkipValidation(skipHttpSupportValidation);
HttpUtil.setSkipValidation(skipHttpUtilValidation);
SOAPUtil.setSkipValidation(skipSoapUtilValidation);
if(ctrlMsgSender!=null) {
AppServerState serverState = SysCommon.refreshAppServerState();
SysCommon.jmsRunning = ctrlMsgSender.sendMessage("REQ_SYNC_SERVER_STATE",serverState);
@@ -0,0 +1,63 @@
package com.mgm.mcrm.common.services;
import com.mgm.mcrm.common.utils.LogUtil;
import org.apache.commons.lang3.Strings;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
import javax.net.ssl.X509TrustManager;
import java.util.List;
public class ConfigurableTrustHandler implements X509TrustManager, HostnameVerifier {
private final boolean skipValidation;
private final X509TrustManager defaultTrustManager;
private final List<String> allowedServers;
public ConfigurableTrustHandler(boolean skipValidation, X509TrustManager defaultTrustManager, List<String> 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;
}
}
@@ -38,13 +38,15 @@ public class MGMEsbLimoApiService {
public HttpResponseResult invokeLimoOverrider(
String overriderIdOrName
String overriderIdOrName,
String employeeId
) throws Exception {
JSONObject requestObj = new JSONObject();
Map<String, String> requestHeader = new HashMap<>();
requestObj.put("OverriderIdOrName", "%");
// requestObj.put("EmployeeId", employeeId);
return mgmEsbApiService.invokeESBAPI(ESB_LIMO_API_TYPE, API_GET_LIMO_OVERRIDER, requestObj, "POST", requestHeader);
}
@@ -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<String, String> requestHeader = new HashMap<String,String>();
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;
}
}
@@ -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);
@@ -163,62 +177,13 @@ 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) {
@@ -486,7 +486,7 @@ public class SendEmail {
+format.format(bookView.getCheckoutDate())+
"</td> " +
"<td>"
+(bookView.getBookerTeam()!=null?bookView.getBookerTeam():"")+
+(bookView.getSectionName()!=null?bookView.getSectionName():"")+
"</td> " +
"<td>"
+bookView.getCreatedBy()+
@@ -651,7 +651,7 @@ public class SendEmail {
+format.format(bookView.getCheckoutDate())+
"</td> " +
"<td>"
+(bookView.getBookerTeam()!=null?bookView.getBookerTeam():"")+
+(bookView.getSectionName()!=null?bookView.getSectionName():"")+
"</td> " +
"<td>"
+bookView.getCreatedBy()+
@@ -835,7 +835,7 @@ public class SendEmail {
+format.format(book.getCheckoutDate())+
"</td> " +
"<td>"
+(viewBook.getBookerTeam()!=null?viewBook.getBookerTeam():"")+
+(viewBook.getSectionName()!=null?viewBook.getSectionName():"")+
"</td> " +
"<td>"
+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)) {
@@ -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<List<LimoPointOfInterestItem>> 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<List<LimoCarTypeItem>> getCarType() throws Exception {
return limoService.getCarType();
}
@GetMapping("/getGreetType")
@RequestMapping(value = "/getGreetType", method = {RequestMethod.GET, RequestMethod.POST},
produces = "application/json;charset=UTF-8")
public BaseApiResponse<List<LimoGreetTypeItem>> 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);
}
@@ -5,4 +5,5 @@ import lombok.Data;
@Data
public class GetLimoBookingGetOverriderRequest {
private String OverriderInfo;
private String EmployeeId;
}
@@ -0,0 +1,8 @@
package com.mgm.mcrm.limo.dtos.request;
import lombok.Data;
@Data
public class GetLimoLocationRequest {
private String location;
}
@@ -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(
@@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/deviceToken")
@RequestMapping("/api/app/deviceToken")
public class SysLogDeviceTokenController {
@Resource
@@ -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,8 +68,24 @@ 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);
}
@@ -0,0 +1,8 @@
package com.mgm.mcrm.notification.dtos.request;
import lombok.Data;
@Data
public class CountNotificationByUserIdRequest {
private String userId;
}
@@ -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;
}
@@ -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 =
"<div>{{title}}</div>"+
@@ -71,7 +72,7 @@ public class EmailTemplateService {
List<CfgEmailTemplate> 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<Long> idList = new ArrayList<>();
List<Email> emailList = new ArrayList<>();
@@ -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 = "<div>Submission Date & Time:{{ttime}}</div>"+
"<div>Submitted User:{{tuser}}</div>"+
"<br><br>" +
"<table border=\"1\" align=\"left\" cellspacing=\"0\" cellpadding=\"5\" width=\"auto\" style=\"font-family: Avenir, Helvetica, sans-serif;font-weight:500;background-color:#ffffff;color:#000000;border: 0;white-space: nowrap;width:auto;\">\r\n" +
" <thead style=\"color:#000000;font-size:14px;padding:10px 40px 0 40px;line-height:32px;background-color: #c8e2b6;white-space: nowrap;margin: 20px 0;\">\r\n" +
" <tr>\r\n" +
" <th>\r\n" +
" Conf#\r\n" +
" </th> \r\n" +
" <th >\r\n" +
" Booking Status\r\n" +
" </th> \r\n" +
" <th >\r\n" +
" Member ID\r\n" +
" </th> \r\n" +
" <th >\r\n" +
" Member Name\r\n" +
" </th> \r\n" +
" <th >\r\n" +
" Tier\r\n" +
" </th> \r\n" +
" <th >\r\n" +
" Property\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Room Type\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Sharer\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Original C/I\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Original C/O\r\n" +
" </th> \r\n" +
" <th style=\"background-color:#FFFF00;\">\r\n" +
" Extending C/O\r\n" +
" </th> \r\n" +
" </tr> \r\n" +
" </thead>\r\n" +
" <tbody style=\"color:#000000;font-size:14px;padding:10px 40px 0 40px;line-height:32px;white-space: nowrap;\">\r\n" +
" {{tbody}}"+
" </tbody>\r\n" +
"</table>";
private static final String emailApprovalTemp = "<div>Submission Date & Time:{{ttime}}</div>"+
"<div>Submitted and Approver:{{tuser}}</div>"+
"<br><br>" +
"<table border=\"1\" align=\"left\" cellspacing=\"0\" cellpadding=\"5\" width=\"auto\" style=\"font-family: Avenir, Helvetica, sans-serif;font-weight:500;background-color:#ffffff;color:#000000;border: 0;white-space: nowrap;width:auto;\">\r\n" +
" <thead style=\"color:#000000;font-size:14px;padding:10px 40px 0 40px;line-height:32px;background-color: #c8e2b6;white-space: nowrap;margin: 20px 0;\">\r\n" +
" <tr>\r\n" +
" <th>\r\n" +
" Booking Status\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Conf#\r\n" +
" </th> \r\n" +
" <th >\r\n" +
" Member ID\r\n" +
" </th>\r\n" +
" <th >\r\n" +
" Member Name\r\n" +
" </th>\r\n" +
" <th >\r\n" +
" Tier\r\n" +
" </th>\r\n" +
" <th>\r\n" +
" Property\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Room Type\r\n" +
" </th>\r\n" +
" <th>\r\n" +
" Sharer\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Type\r\n" +
" </th>\r\n" +
" <th>\r\n" +
" Requested C/I\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Requested C/O\r\n" +
" </th> \r\n" +
" <th style=\"background-color:#FFFF00;\">\r\n" +
" Approved Property\r\n" +
" </th> \r\n" +
" <th style=\"background-color:#FFFF00;\">\r\n" +
" Approved Room Type\r\n" +
" </th> \r\n" +
" <th style=\"background-color:#FFFF00;\">\r\n" +
" Approved C/I\r\n" +
" </th> \r\n" +
" <th style=\"background-color:#FFFF00;\">\r\n" +
" Approved C/O\r\n" +
" </th> \r\n" +" <th>\r\n" +
" Booker Team\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Booker ID\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Booker Name\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Approval Remark\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Remark\r\n" +
" </th> \r\n" +
" </tr> \r\n" +
" </thead>\r\n" +
" <tbody style=\"color:#000000;font-size:14px;padding:10px 40px 0 40px;line-height:32px;white-space: nowrap;\">\r\n" +
" {{tbody}}"+
" </tbody>\r\n" +
"</table>";
private static final String emailNewApprovalTemp = "<div>Submission Date & Time:{{ttime}}</div>"+
"<div>Submitted and Approver:{{tuser}}</div>"+
"<br><br>" +
"{{content}}"+
"<table border=\"1\" align=\"left\" cellspacing=\"0\" cellpadding=\"5\" width=\"auto\" style=\"font-family: Avenir, Helvetica, sans-serif;font-weight:500;background-color:#ffffff;color:#000000;border: 0;white-space: nowrap;width:auto;\">\r\n" +
" <thead style=\"color:#000000;font-size:14px;padding:10px 40px 0 40px;line-height:32px;background-color: #c8e2b6;white-space: nowrap;margin: 20px 0;\">\r\n" +
" <tr>\r\n" +
" <th>\r\n" +
" Booking Status\r\n" +
" </th> \r\n" +
" <th >\r\n" +
" Member ID\r\n" +
" </th>\r\n" +
" <th >\r\n" +
" Member Name\r\n" +
" </th>\r\n" +
" <th >\r\n" +
" Tier\r\n" +
" </th>\r\n" +
" <th>\r\n" +
" Property\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Room Type\r\n" +
" </th>\r\n" +
" <th>\r\n" +
" Sharer\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Type\r\n" +
" </th>\r\n" +
" <th>\r\n" +
" Requested C/I\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Requested C/O\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Booker Team\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Booker ID\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Booker Name\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Approval Remark\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Remark\r\n" +
" </th> \r\n" +
" </tr> \r\n" +
" </thead>\r\n" +
" <tbody style=\"color:#000000;font-size:14px;padding:10px 40px 0 40px;line-height:32px;white-space: nowrap;\">\r\n" +
" {{tbody}}"+
" </tbody>\r\n" +
"</table>";
private static final String cancelEmailTemp = "<div>Submission Date & Time:{{ttime}}</div>"+
"<div>Submitted User:{{tuser}}</div>"+
"<br><br>" +
"{{content}}"+
"<table border=\"1\" align=\"left\" cellspacing=\"0\" cellpadding=\"5\" width=\"auto\" style=\"font-family: Avenir, Helvetica, sans-serif;font-weight:500;background-color:#ffffff;color:#000000;border: 0;white-space: nowrap;width:auto;\">\r\n" +
" <thead style=\"color:#000000;font-size:14px;padding:10px 40px 0 40px;line-height:32px;background-color: #c8e2b6;white-space: nowrap;margin: 20px 0;\">\r\n" +
" <tr>\r\n" +
" <th>\r\n" +
" Conf#\r\n" +
" </th> \r\n" +
" <th >\r\n" +
" Booking Status\r\n" +
" </th> \r\n" +
" <th >\r\n" +
" Member ID\r\n" +
" </th> \r\n" +
" <th >\r\n" +
" Member Name\r\n" +
" </th> \r\n" +
" <th >\r\n" +
" Tier\r\n" +
" </th> \r\n" +
" <th >\r\n" +
" Property\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Room Type\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Sharer\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Type\r\n" +
" </th>\r\n" +
" <th>\r\n" +
" Original C/I\r\n" +
" </th> \r\n" +
" <th>\r\n" +
" Original C/O\r\n" +
" </th> \r\n" +
" <th style=\"background-color:#FFFF00;\">\r\n" +
" Change C/I\r\n" +
" </th> \r\n" +
" <th style=\"background-color:#FFFF00;\">\r\n" +
" Change C/O\r\n" +
" </th> \r\n" +
" </tr> \r\n" +
" </thead>\r\n" +
" <tbody style=\"color:#000000;font-size:14px;padding:10px 40px 0 40px;line-height:32px;white-space: nowrap;\">\r\n" +
" {{tbody}}"+
" </tbody>\r\n" +
"</table>";
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 += "<tr>"+
"<td>"
+book.getConfirmationNo()+
"</td> "+
"<td>"
+operaStatus+
"</td> " +
"<td >"
+book.getPlayerId()+
"</td> " +
"<td>"
+book.getMemberLastName()+
"</td> " +
"<td>"
+(originBook.getMemberTier()!=null?originBook.getMemberTier():"")+
"</td> " +
"<td>"
+(originBook.getPropertyName()!=null?originBook.getPropertyName():"")+
"</td> " +
"<td>"
+(originBook.getRoom()!=null?originBook.getRoom():"")+
"</td> "+
"<td>"
+(originBook.getSharerName()!=null?originBook.getSharerName():"")+
"</td> "+
"<td>"
+format.format(originBook.getCheckinDate())+
"</td> " +
"<td>"
+format.format(originBook.getCheckoutDate())+
"</td> " +
"<td style=\"background-color:#FFFF00;\">"
+format.format(book.getCheckoutDate())+
"</td> " +
"</tr> ";
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 += "<tr>"+
"<td>"
+approvalStatus+
"</td> "+
"<td >"
+bookView.getPlayerId()+
"</td> " +
"<td>"
+bookView.getMemberLastName()+
"</td> " +
"<td>"
+(bookView.getMemberTier()!=null?bookView.getMemberTier():"")+
"</td> " +
"<td>"
+(bookView.getPropertyName()!=null?bookView.getPropertyName():"")+
"</td> " +
"<td>"
+(bookView.getRoom()!=null?bookView.getRoom():"")+
"</td> "+
"<td>"
+(bookView.getSharerName()!=null?bookView.getSharerName():"")+
"</td> " +
"<td>"
+"New"+
"</td> "+
"<td>"
+format.format(bookView.getCheckinDate())+
"</td> " +
"<td>"
+format.format(bookView.getCheckoutDate())+
"</td> " +
"<td>"
+(bookView.getSectionName()!=null?bookView.getSectionName():"")+
"</td> " +
"<td>"
+bookView.getCreatedBy()+
"</td> " +
"<td>"
+bookView.getCreatedByName()+
"</td> " +
"<td>"
+(bookView.getApprovalRemark()!=null?bookView.getApprovalRemark():"")+
"</td> " +
"<td>"
+(bookView.getRemark()!=null?bookView.getRemark():"")+
"</td> " +
"</tr> ";
String mailContent = isConnectRoom?"Please create TT/YY booking for below approved booking<br><br>":"";
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 += "<tr>"+
"<td>"
+approvalStatus+
"</td> "+
"<td >"
+bookView.getPlayerId()+
"</td> " +
"<td>"
+bookView.getMemberLastName()+
"</td> " +
"<td>"
+(bookView.getMemberTier()!=null?bookView.getMemberTier():"")+
"</td> " +
"<td>"
+(bookView.getPropertyName()!=null?bookView.getPropertyName():"")+
"</td> " +
"<td>"
+(bookView.getRoom()!=null?bookView.getRoom():"")+
"</td> "+
"<td>"
+(bookView.getSharerName()!=null?bookView.getSharerName():"")+
"</td> " +
"<td>"
+"New"+
"</td> "+
"<td>"
+format.format(bookView.getCheckinDate())+
"</td> " +
"<td>"
+format.format(bookView.getCheckoutDate())+
"</td> " +
"<td>"
+(bookView.getSectionName()!=null?bookView.getSectionName():"")+
"</td> " +
"<td>"
+bookView.getCreatedBy()+
"</td> " +
"<td>"
+bookView.getCreatedByName()+
"</td> " +
"<td>"
+(bookView.getApprovalRemark()!=null?bookView.getApprovalRemark():"")+
"</td> " +
"<td>"
+(bookView.getRemark()!=null?bookView.getRemark():"")+
"</td> " +
"</tr> ";
String mailContent = isConnectRoom?"Please create TT/YY booking for below approved booking<br><br>":"";
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 += "<tr>"+
"<td>"
+approvalStatus+
"</td> "+
"<td>"
+originBook.getConfirmationNo()+
"</td> "+
"<td >"
+originBook.getPlayerId()+
"</td> " +
"<td>"
+originBook.getMemberLastName()+
"</td> " +
"<td>"
+(originBook.getMemberTier()!=null?originBook.getMemberTier():"")+
"</td> " +
"<td>"
+(originBook.getPropertyName()!=null?originBook.getPropertyName():"")+
"</td> " +
"<td>"
+(originBook.getRoom()!=null?originBook.getRoom():"")+
"</td> "+
"<td>"
+(originBook.getSharerName()!=null?originBook.getSharerName():"")+
"</td> "+
"<td>"
+"Extend"+
"</td> "+
"<td>"
+format.format(originBook.getCheckinDate())+
"</td> " +
"<td>"
+format.format(originBook.getCheckoutDate())+
"</td> " +
"<td style=\"background-color:#FFFF00;\">"
+changeProperty+
"</td> " +
"<td style=\"background-color:#FFFF00;\">"
+changeRoom+
"</td> " +
"<td style=\"background-color:#FFFF00;\">"
+changeCheckInDate+
"</td> " +
"<td style=\"background-color:#FFFF00;\">"
+format.format(book.getCheckoutDate())+
"</td> " +
"<td>"
+(viewBook.getSectionName()!=null?viewBook.getSectionName():"")+
"</td> " +
"<td>"
+originBook.getCreatedBy()+
"</td> " +
"<td>"
+originBook.getCreatedByName()+
"</td> " +
"<td>"
+(book.getApprovalRemark()!=null?book.getApprovalRemark():"")+
"</td> " +
"<td>"
+(book.getRemark()!=null?book.getRemark():"")+
"</td> " +
"</tr> ";
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 += "<tr>"+
"<td>"
+bookingsView.getConfirmationNo()+
"</td> "+
"<td>"
+approvalStatus+
"</td> "+
"<td >"
+bookingsView.getPlayerId()+
"</td> " +
"<td>"
+bookingsView.getMemberLastName()+
"</td> " +
"<td>"
+(bookingsView.getTier()!=null?bookingsView.getTier():"")+
"</td> " +
"<td>"
+(bookingsView.getPropertyName()!=null?bookingsView.getPropertyName():"")+
"</td> " +
"<td>"
+(bookingsView.getRoom()!=null?bookingsView.getRoom():"")+
"</td> "+
"<td>"
+(bookingsView.getSharerName()!=null?bookingsView.getSharerName():"")+
"</td> "+
"<td>"
+"Cancel"+
"</td> "+
"<td>"
+format.format(bookingsView.getCheckinDate())+
"</td> " +
"<td>"
+format.format(bookingsView.getCheckoutDate())+
"</td> " +
"<td style=\"background-color:#FFFF00;\">"
+book.getChangeCheckinDate()+
"</td> " +
"<td style=\"background-color:#FFFF00;\">"
+book.getChangeCheckoutDate()+
"</td> ";
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;
}
}
@@ -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 {
+12 -1
View File
@@ -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:
File diff suppressed because one or more lines are too long