This commit is contained in:
Mauve
2026-10-12 15:16:50 +08:00
parent 92858be8bd
commit dde0d60825
48 changed files with 880 additions and 152 deletions
@@ -63,6 +63,60 @@
"attrName": "marketCodeName", "attrName": "marketCodeName",
"dataType": "String", "dataType": "String",
"columnWidth":20 "columnWidth":20
},
{
"columnHeader":"Approver",
"attrName": "approver",
"dataType": "String",
"columnWidth":30
},
{
"columnHeader":"Room Category",
"attrName": "compRuleCategory",
"dataType": "String",
"columnWidth":30
},
{
"columnHeader":"Complimentary Type",
"attrName": "compTypeContent",
"dataType": "String",
"columnWidth":30
},
{
"columnHeader":"Complimentary Type Id",
"attrName": "dlCompTypeId",
"dataType": "String",
"columnWidth":30
},
{
"columnHeader":"Payment Method Code",
"attrName": "paymentMethodCodeContent",
"dataType": "String",
"columnWidth":30
},
{
"columnHeader":"Payment Method Code Id",
"attrName": "dlPaymentMethodCodeId",
"dataType": "String",
"columnWidth":30
},
{
"columnHeader":"Complimentary Preset",
"attrName": "compPresetContent",
"dataType": "String",
"columnWidth":40
},
{
"columnHeader":"Complimentary Preset Id",
"attrName": "compPresetId",
"dataType": "String",
"columnWidth":40
},
{
"columnHeader":"Soft Limit",
"attrName": "softLimit",
"dataType": "String",
"columnWidth":30
} }
] ]
}] }]
@@ -14,7 +14,7 @@
"headerTextColor":"#000000", "headerTextColor":"#000000",
"textAlign":"left", "textAlign":"left",
"textColor":"#000000", "textColor":"#000000",
"objClassName": "com.mgm.mcrm.reservation.models.BookingsView", "objClassName": "com.mgm.mcrm.reservation.dtos.BookingsViewDto",
"columnDefs": [ "columnDefs": [
{ {
"columnHeader":"Waitlist Status", "columnHeader":"Waitlist Status",
@@ -14,7 +14,7 @@
"headerTextColor":"#000000", "headerTextColor":"#000000",
"textAlign":"left", "textAlign":"left",
"textColor":"#000000", "textColor":"#000000",
"objClassName": "com.mgm.mcrm.reservation.models.BookingsView", "objClassName": "com.mgm.mcrm.reservation.dtos.BookingsViewDto",
"columnDefs": [ "columnDefs": [
{ {
"columnHeader":"Waitlist Status", "columnHeader":"Waitlist Status",
@@ -0,0 +1,145 @@
{
"importName": "IMPORT_EXCEPTION_DAYLIGHT",
"importPages": [
{
"sheetIndx": 0,
"dataElements": [
{
"offsetRow": 1,
"offsetCol": 0,
"objClassName": "com.mgm.mcrm.common.dtos.dataimport.appsetting.ExceptionDaylightImportRow",
"columnDefs": [
{
"columnHeader": "User ID",
"checkHeader": true,
"headerRowIdx": 0,
"attrName": "userId",
"dataType": "String"
},
{
"columnHeader": "Booking Type",
"checkHeader": true,
"headerRowIdx": 0,
"attrName": "bookingTypeName",
"dataType": "String"
},
{
"columnHeader": "Hotel Property",
"checkHeader": true,
"headerRowIdx": 0,
"attrName": "propertyName",
"dataType": "String"
},
{
"columnHeader": "Block Code",
"checkHeader": true,
"headerRowIdx": 0,
"attrName": "blockCodeName",
"dataType": "String"
},
{
"columnHeader": "Rate Code",
"checkHeader": true,
"headerRowIdx": 0,
"attrName": "rateCodeName",
"dataType": "String"
},
{
"columnHeader": "Room Type",
"checkHeader": true,
"headerRowIdx": 0,
"attrName": "roomTypeNames",
"dataType": "String"
},
{
"columnHeader": "Source Code",
"checkHeader": true,
"headerRowIdx": 0,
"attrName": "sourceCodeName",
"dataType": "String"
},
{
"columnHeader": "Market Code",
"checkHeader": true,
"headerRowIdx": 0,
"attrName": "marketCodeName",
"dataType": "String"
},
{
"columnHeader": "Approver",
"checkHeader": true,
"optionalHeader": true,
"headerRowIdx": 0,
"attrName": "approver",
"dataType": "String"
},
{
"columnHeader": "Room Category",
"checkHeader": true,
"optionalHeader": true,
"headerRowIdx": 0,
"attrName": "compRuleCategory",
"dataType": "String"
},
{
"columnHeader": "Complimentary Type",
"checkHeader": true,
"optionalHeader": true,
"headerRowIdx": 0,
"attrName": "compTypeContent",
"dataType": "String"
},
{
"columnHeader": "Complimentary Type Id",
"checkHeader": true,
"optionalHeader": true,
"headerRowIdx": 0,
"attrName": "dlCompTypeId",
"dataType": "String"
},
{
"columnHeader": "Payment Method Code",
"checkHeader": true,
"optionalHeader": true,
"headerRowIdx": 0,
"attrName": "paymentMethodCodeContent",
"dataType": "String"
},
{
"columnHeader": "Payment Method Code Id",
"checkHeader": true,
"optionalHeader": true,
"headerRowIdx": 0,
"attrName": "dlPaymentMethodCodeId",
"dataType": "String"
},
{
"columnHeader": "Complimentary Preset",
"checkHeader": true,
"optionalHeader": true,
"headerRowIdx": 0,
"attrName": "compPresetContent",
"dataType": "String"
},
{
"columnHeader": "Complimentary Preset Id",
"checkHeader": true,
"optionalHeader": true,
"headerRowIdx": 0,
"attrName": "compPresetId",
"dataType": "String"
},
{
"columnHeader": "Soft Limit",
"checkHeader": true,
"optionalHeader": true,
"headerRowIdx": 0,
"attrName": "softLimit",
"dataType": "String"
}
]
}
]
}
]
}
@@ -47,6 +47,7 @@
}, },
{ {
"columnHeader": "Category", "columnHeader": "Category",
"optionalHeader": true,
"attrName": "category", "attrName": "category",
"dataType": "String", "dataType": "String",
"columnWidth": 50 "columnWidth": 50
@@ -5,7 +5,7 @@
"dataElements": [{ "dataElements": [{
"offsetRow": 2, "offsetRow": 2,
"offsetCol": 0, "offsetCol": 0,
"objClassName": "com.mgm.mcrm.common.dtos.dataimport.appsetting.RoomCriteriaImportRow", "objClassName": "com.mgm.mcrm.allotment.dtos.request.RoomCriteriaImportRowRequest",
"columnDefs": [{ "columnDefs": [{
"columnHeader":"Property", "columnHeader":"Property",
"attrName": "propertyName", "attrName": "propertyName",
@@ -5,7 +5,7 @@
"dataElements": [{ "dataElements": [{
"offsetRow": 2, "offsetRow": 2,
"offsetCol": 0, "offsetCol": 0,
"objClassName": "com.mgm.mcrm.common.dtos.dataimport.appsetting.RoomCriteriaImportRow", "objClassName": "com.mgm.mcrm.allotment.dtos.request.RoomCriteriaImportRowRequest",
"columnDefs": [{ "columnDefs": [{
"columnHeader":"Property", "columnHeader":"Property",
"attrName": "propertyName", "attrName": "propertyName",
+1
View File
@@ -20,6 +20,7 @@
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>21</java.version> <java.version>21</java.version>
<tomcat.version>11.0.25</tomcat.version>
<netty.version>4.2.18.Final</netty.version> <netty.version>4.2.18.Final</netty.version>
<httpclient5.version>5.6.4</httpclient5.version> <httpclient5.version>5.6.4</httpclient5.version>
<httpclient5-win.version>5.2.3</httpclient5-win.version> <httpclient5-win.version>5.2.3</httpclient5-win.version>
@@ -9,5 +9,5 @@ import lombok.Setter;
@NoArgsConstructor @NoArgsConstructor
public class SysGroupDeleteByIdRequest { public class SysGroupDeleteByIdRequest {
private Long Id; private Long id;
} }
@@ -200,22 +200,6 @@ public class PlayerService {
String content = httpResult.getResponseContent(); String content = httpResult.getResponseContent();
JSONObject obj = new JSONObject(); JSONObject obj = new JSONObject();
obj = (JSONObject) JSONObject.parseObject(content); obj = (JSONObject) JSONObject.parseObject(content);
if(SysCommon.mgmApiMockup){
CheckTpdDto checkTpdDto = new CheckTpdDto();
CheckTpdRecordDto checkTpdRecordDto = new CheckTpdRecordDto();
checkTpdRecordDto.setPlayerId(playerId);
checkTpdRecordDto.setBookingDate("2024/06/01");
checkTpdRecordDto.setRoomCategory("GR");
checkTpdRecordDto.setBookingDateQualificationFlag(1);
List<CheckTpdRecordDto> list = new ArrayList<>();
list.add(checkTpdRecordDto);
checkTpdDto.setRecord(list);
checkTpdDto.setStatus(0);
checkTpdDto.setStatusDescription("SUCCESS");
result.setSuccess(true);
result.setReturnData(checkTpdDto);
}else{
if(obj.getBooleanValue("success")) { if(obj.getBooleanValue("success")) {
result.setSuccess(true); result.setSuccess(true);
Object getData = obj.get("data"); Object getData = obj.get("data");
@@ -228,7 +212,7 @@ public class PlayerService {
result.setErrorMessage("System Error"); result.setErrorMessage("System Error");
} }
} }
}
return result; return result;
} }
@@ -44,6 +44,7 @@ import com.google.gson.Gson;
import com.mgm.mcrm.common.utils.DaoUtil; import com.mgm.mcrm.common.utils.DaoUtil;
import com.mgm.mcrm.common.utils.LogUtil; import com.mgm.mcrm.common.utils.LogUtil;
import org.springframework.transaction.annotation.Transactional;
@Service @Service
public class SysGroupService { public class SysGroupService {
@@ -257,6 +258,20 @@ public class SysGroupService {
return validGroupNames; return validGroupNames;
} }
public String getFullGroupNames() {
String validGroupNames ="";
List<SysGroup> groups = sysGroupDao.findAll();
if(!groups.isEmpty()) {
for(SysGroup gItem:groups) {
if(StringUtils.isNotBlank(validGroupNames)) {
validGroupNames+=";";
}
validGroupNames+=gItem.getDisplayName();
}
}
return validGroupNames;
}
public AssignGroupDataAccess queryGroupAccessSetting(Long groupId) { public AssignGroupDataAccess queryGroupAccessSetting(Long groupId) {
AssignGroupDataAccess accessInfo = null; AssignGroupDataAccess accessInfo = null;
if(groupId !=null) { if(groupId !=null) {
@@ -347,6 +362,7 @@ public class SysGroupService {
return isFind; return isFind;
} }
@Transactional
public String assignGroupDataAccess(SysGroupSaveAccessSettingRequest sysGroupSaveAccessSettingRequest) { public String assignGroupDataAccess(SysGroupSaveAccessSettingRequest sysGroupSaveAccessSettingRequest) {
String resMessage=""; String resMessage="";
Long groupId = sysGroupSaveAccessSettingRequest.getGroupId(); Long groupId = sysGroupSaveAccessSettingRequest.getGroupId();
@@ -347,7 +347,7 @@ public class SysUserService {
String token = request.getHeader("Authorization"); String token = request.getHeader("Authorization");
token = token.substring(7); token = token.substring(7);
String loginId = JWT.decode(token).getSubject(); String loginId = JWT.decode(token).getSubject();
String groupName = JWT.decode(token).getClaim("user_group").asString(); String groupName = JWT.decode(token).getClaim("group_name").asString();
if(loginId!=null && Strings.CS.equals(SysConstants.SUPER_ADMIN_ID,loginId)) { if(loginId!=null && Strings.CS.equals(SysConstants.SUPER_ADMIN_ID,loginId)) {
return true; return true;
} }
@@ -27,4 +27,11 @@ public class CfgAppChannelDaylight implements Serializable {
private Integer pickedUp; private Integer pickedUp;
@Column(name="available") @Column(name="available")
private Integer available; private Integer available;
@PostLoad
public void postLoad() {
if (channelTotal == null) channelTotal = 0;
if (pickedUp == null) pickedUp = 0;
if (available == null) available = 0;
}
} }
@@ -23,7 +23,7 @@ public interface DaylightRoomTypeAllotmentDao extends JpaRepository<CfgDlRoomTyp
public Integer getAvailable(); public Integer getAvailable();
} }
@Query(value = "select ?1 as calendarDate, sum(total_rooms) as channelTotal, sum(all_deduct) as pickedUp, sum(all_non_deduct) as available " + @Query(value = "select ?1 as calendarDate, sum(isnull(total_rooms,0)) as channelTotal, sum(isnull(all_deduct,0)) as pickedUp, sum(isnull(all_non_deduct,0)) as available " +
" from cfg_daylight_roomtype_allotment " + " from cfg_daylight_roomtype_allotment " +
" where allotment_date=?1 and property_id =?2 and block_code_id =?4 and room_type_id in " + " where allotment_date=?1 and property_id =?2 and block_code_id =?4 and room_type_id in " +
" (select room_type_id from cfg_rooms_room_types where room_id =?3 )", nativeQuery = true) " (select room_type_id from cfg_rooms_room_types where room_id =?3 )", nativeQuery = true)
@@ -285,7 +285,7 @@ public class OtherAllotmentService {
if(dow!=null) { if(dow!=null) {
for(int i=0;i<dow.size();i++) { for(int i=0;i<dow.size();i++) {
int num = Integer.valueOf(String.valueOf(dow.get(i))); int num = Integer.valueOf(String.valueOf(dow.get(i)));
dow.set(i, num-1); dow.set(i, num);
} }
} }
for(int i=0;i<getCriterias.size();i++) { for(int i=0;i<getCriterias.size();i++) {
@@ -10,7 +10,6 @@ import com.mgm.mcrm.allotment.dtos.request.*;
import com.mgm.mcrm.basesetting.agebucket.models.SysAgebucket; import com.mgm.mcrm.basesetting.agebucket.models.SysAgebucket;
import com.mgm.mcrm.basesetting.agebucket.services.AgebucketService; import com.mgm.mcrm.basesetting.agebucket.services.AgebucketService;
import com.mgm.mcrm.basesetting.room.models.CfgRoomsRoomTypes; import com.mgm.mcrm.basesetting.room.models.CfgRoomsRoomTypes;
import com.mgm.mcrm.common.constants.SettingConstants;
import com.mgm.mcrm.common.dtos.AjaxResult; import com.mgm.mcrm.common.dtos.AjaxResult;
import com.mgm.mcrm.common.dtos.CheckCalendarDaylightRequest; import com.mgm.mcrm.common.dtos.CheckCalendarDaylightRequest;
import com.mgm.mcrm.common.dtos.dataimport.appsetting.AppChannelDaylightImportRow; import com.mgm.mcrm.common.dtos.dataimport.appsetting.AppChannelDaylightImportRow;
@@ -53,8 +52,6 @@ import com.mgm.mcrm.reservation.models.BookingsView;
import com.mgm.mcrm.reservation.repositories.BookingViewDao; import com.mgm.mcrm.reservation.repositories.BookingViewDao;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Predicate;
import jakarta.validation.constraints.NotBlank;
import lombok.extern.log4j.Log4j;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.hc.core5.http.Header; import org.apache.hc.core5.http.Header;
@@ -339,7 +336,7 @@ public class RoomCriteriaDaylightService {
if (dow != null) { if (dow != null) {
for (int i = 0; i < dow.size(); i++) { for (int i = 0; i < dow.size(); i++) {
int num = Integer.parseInt(String.valueOf(dow.get(i))); int num = Integer.parseInt(String.valueOf(dow.get(i)));
dow.set(i, num - 1); dow.set(i, num);
} }
} }
for (int i = 0; i < getCriterias.size(); i++) { for (int i = 0; i < getCriterias.size(); i++) {
@@ -1258,9 +1255,9 @@ public class RoomCriteriaDaylightService {
return cacheData; return cacheData;
} }
private Map<String,Long> cacheDlBlockCodeMapping(){ private Map<String,Long> cacheDlBlockCodeMapping(Long propertyId){
Map<String,Long> cacheData = new HashMap<String,Long>(); Map<String,Long> cacheData = new HashMap<String,Long>();
List<CfgBlockCodes> dlBlockCodes = blockCodeDao.findAllByDlBlockIdIsNotNull(); List<CfgBlockCodes> dlBlockCodes = blockCodeDao.findAllByPropertyIdAndDlBlockIdIsNotNull(propertyId);
for(CfgBlockCodes blockCode: dlBlockCodes){ for(CfgBlockCodes blockCode: dlBlockCodes){
cacheData.put(blockCode.getDlBlockId(),blockCode.getId()); cacheData.put(blockCode.getDlBlockId(),blockCode.getId());
} }
@@ -1350,7 +1347,7 @@ public class RoomCriteriaDaylightService {
MappingDataCache cacheMapping = new MappingDataCache(); MappingDataCache cacheMapping = new MappingDataCache();
cacheMapping.setCacheRoomTypeIds(this.cacheDlRoomTypeMapping()); cacheMapping.setCacheRoomTypeIds(this.cacheDlRoomTypeMapping());
cacheMapping.setCachePropertyRoomCate(this.cachePropertyRoomCategory(propertyId)); cacheMapping.setCachePropertyRoomCate(this.cachePropertyRoomCategory(propertyId));
cacheMapping.setCacheBlockCodes(this.cacheDlBlockCodeMapping()); cacheMapping.setCacheBlockCodes(this.cacheDlBlockCodeMapping(propertyId));
String url = "/api-gateway/data-api/v1/blocks/availability"; String url = "/api-gateway/data-api/v1/blocks/availability";
Header[] headers = HttpHeaderBuilder.create() Header[] headers = HttpHeaderBuilder.create()
@@ -1359,7 +1356,7 @@ public class RoomCriteriaDaylightService {
.build(); .build();
Map<String, Object> queryParams = new HashMap<>(); Map<String, Object> queryParams = new HashMap<>();
queryParams.put("blockIds", String.join(",", syncRequest.getDlBlockCodeIds())); queryParams.put("blockIds", String.join(",", cacheMapping.getCacheBlockCodes().keySet()));
queryParams.put("startDate", syncRequest.getFromDate()); queryParams.put("startDate", syncRequest.getFromDate());
queryParams.put("endDate", syncRequest.getToDate()); queryParams.put("endDate", syncRequest.getToDate());
@@ -3,14 +3,8 @@ package com.mgm.mcrm.allotment.services;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.*;
import java.util.Calendar;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.mgm.mcrm.allotment.dtos.CfgOtherAllotmentViewDto; import com.mgm.mcrm.allotment.dtos.CfgOtherAllotmentViewDto;
import com.mgm.mcrm.allotment.dtos.CfgOtherAppChannelDto; import com.mgm.mcrm.allotment.dtos.CfgOtherAppChannelDto;
@@ -329,7 +323,7 @@ public class RoomCriteriaService {
if(dow!=null) { if(dow!=null) {
for(int i=0;i<dow.size();i++) { for(int i=0;i<dow.size();i++) {
int num = Integer.parseInt(String.valueOf(dow.get(i))); int num = Integer.parseInt(String.valueOf(dow.get(i)));
dow.set(i, num-1); dow.set(i, num);
} }
} }
for(int i=0;i<getCriterias.size();i++) { for(int i=0;i<getCriterias.size();i++) {
@@ -349,7 +343,7 @@ public class RoomCriteriaService {
CfgAppChannel getChannel = new CfgAppChannel(); CfgAppChannel getChannel = new CfgAppChannel();
Integer channel = ch.getInteger("appChannel")!=null?ch.getInteger("appChannel"):0; Integer channel = ch.getInteger("appChannel")!=null?ch.getInteger("appChannel"):0;
for(CfgAppChannel c:appChannels) { for(CfgAppChannel c:appChannels) {
if(c.getBlockId()==ch.getLong("id")) { if(Objects.equals(c.getBlockId(), ch.getLong("id"))) {
BeanUtils.copyProperties(c, getChannel); BeanUtils.copyProperties(c, getChannel);
getChannel.setAppChannel(channel); getChannel.setAppChannel(channel);
if(getChannel.getPickedUp()==null) { if(getChannel.getPickedUp()==null) {
@@ -562,9 +556,9 @@ public class RoomCriteriaService {
Long segmentId = checkCalendarRequest.getSegmentId(); Long segmentId = checkCalendarRequest.getSegmentId();
long propertyId = checkCalendarRequest.getPropertyId(); long propertyId = checkCalendarRequest.getPropertyId();
long roomId =checkCalendarRequest.getRoomId(); long roomId =checkCalendarRequest.getRoomId();
String userId =checkCalendarRequest.getTeamId()!=null?checkCalendarRequest.getUserId():null; String userId =checkCalendarRequest.getUserId()!=null?checkCalendarRequest.getUserId():null;
String userName = checkCalendarRequest.getTeamId()!=null?checkCalendarRequest.getUserName():null; String userName = checkCalendarRequest.getUserName()!=null?checkCalendarRequest.getUserName():null;
String playerId =checkCalendarRequest.getTeamId()!=null?checkCalendarRequest.getPlayerId():null; String playerId =checkCalendarRequest.getPlayerId()!=null?checkCalendarRequest.getPlayerId():null;
Long teamId = checkCalendarRequest.getTeamId()!=null?checkCalendarRequest.getTeamId():null; Long teamId = checkCalendarRequest.getTeamId()!=null?checkCalendarRequest.getTeamId():null;
Long bookId = checkCalendarRequest.getBookId(); Long bookId = checkCalendarRequest.getBookId();
@@ -125,6 +125,9 @@ public class LoginController {
loginInfo.setListUserSetting(usrSettings); loginInfo.setListUserSetting(usrSettings);
// build object for response body // build object for response body
LoginUserInfo returnUser = loginEntryMapper.toLoginUserDto(sysUser); LoginUserInfo returnUser = loginEntryMapper.toLoginUserDto(sysUser);
if(SysConstants.SUPER_ADMIN_ID.equals(sysUser.getId().toString())) {
returnUser.setGroupName(sysGroupService.getFullGroupNames());
}
loginInfo.setLoginUser(returnUser); loginInfo.setLoginUser(returnUser);
//-- Generate Access Token & Refresh Token //-- Generate Access Token & Refresh Token
Token accessToken = JwtTokenUtil.generateTokenByLoginUser(request.getRequestURI(), returnUser, SysConstants.CMS_TOKEN_TYPE,false); Token accessToken = JwtTokenUtil.generateTokenByLoginUser(request.getRequestURI(), returnUser, SysConstants.CMS_TOKEN_TYPE,false);
@@ -7,6 +7,7 @@ import com.auth0.jwt.interfaces.DecodedJWT;
import com.mgm.mcrm.authorization.dtos.LoginUserInfo; import com.mgm.mcrm.authorization.dtos.LoginUserInfo;
import com.mgm.mcrm.authorization.models.Token; import com.mgm.mcrm.authorization.models.Token;
import com.mgm.mcrm.common.constants.SysCommon; import com.mgm.mcrm.common.constants.SysCommon;
import com.mgm.mcrm.common.dtos.BaseApiResponse;
import com.mgm.mcrm.common.utils.LogUtil; import com.mgm.mcrm.common.utils.LogUtil;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import lombok.Getter; import lombok.Getter;
@@ -58,7 +59,7 @@ public class JwtTokenUtil {
.withIssuer(issueSource) .withIssuer(issueSource)
.withIssuedAt(now).withNotBefore(now).withExpiresAt(expDate).withJWTId(uuid) .withIssuedAt(now).withNotBefore(now).withExpiresAt(expDate).withJWTId(uuid)
.withClaim("login_id", user.getLoginId()) .withClaim("login_id", user.getLoginId())
.withClaim("user_group", user.getGroupName()) .withClaim("group_name", user.getGroupName())
.withClaim("last_post_time", now) .withClaim("last_post_time", now)
.withSubject(String.valueOf(user.getId())) .withSubject(String.valueOf(user.getId()))
.sign(Algorithm.HMAC256(secretKey)); .sign(Algorithm.HMAC256(secretKey));
@@ -103,7 +104,7 @@ public class JwtTokenUtil {
loginUser.setId(-1L); loginUser.setId(-1L);
} }
loginUser.setLoginId(decodeData.getClaim("login_id").asString()); loginUser.setLoginId(decodeData.getClaim("login_id").asString());
loginUser.setGroupName(decodeData.getClaim("user_group").asString()); loginUser.setGroupName(decodeData.getClaim("group_name").asString());
loginUser.setTokenUuid(decodeData.getId()); loginUser.setTokenUuid(decodeData.getId());
}catch(Exception err) { }catch(Exception err) {
LogUtil.error(SysCommon.class, "Parse Token failed:"+err.getMessage()); LogUtil.error(SysCommon.class, "Parse Token failed:"+err.getMessage());
@@ -1,6 +1,7 @@
package com.mgm.mcrm.basesetting.daylight.controllers; package com.mgm.mcrm.basesetting.daylight.controllers;
import java.util.HashMap; import java.util.HashMap;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@@ -12,17 +13,23 @@ import com.mgm.mcrm.basesetting.daylight.dtos.request.CreateUpdateExceptionDayli
import com.mgm.mcrm.basesetting.daylight.dtos.request.DeleteExceptionDaylightRequest; import com.mgm.mcrm.basesetting.daylight.dtos.request.DeleteExceptionDaylightRequest;
import com.mgm.mcrm.basesetting.daylight.dtos.request.ExceptionDaylightPageRequest; import com.mgm.mcrm.basesetting.daylight.dtos.request.ExceptionDaylightPageRequest;
import com.mgm.mcrm.basesetting.daylight.dtos.request.GetExceptionDaylightRequest; import com.mgm.mcrm.basesetting.daylight.dtos.request.GetExceptionDaylightRequest;
import com.mgm.mcrm.basesetting.daylight.dtos.request.PropertyIdRequest;
import com.mgm.mcrm.basesetting.daylight.dtos.response.CfgExceptionDaylightResponse; import com.mgm.mcrm.basesetting.daylight.dtos.response.CfgExceptionDaylightResponse;
import com.mgm.mcrm.basesetting.daylight.dtos.response.DaylightComplimentaryPresetResponse;
import com.mgm.mcrm.basesetting.daylight.dtos.response.DaylightComplimentaryTypeResponse;
import com.mgm.mcrm.basesetting.daylight.dtos.response.DaylightPaymenMethodCodeResponse;
import com.mgm.mcrm.basesetting.daylight.dtos.response.ExceptionDaylightResponseFactory; import com.mgm.mcrm.basesetting.daylight.dtos.response.ExceptionDaylightResponseFactory;
import com.mgm.mcrm.basesetting.daylight.mappers.CfgExceptionDaylightMapper; import com.mgm.mcrm.basesetting.daylight.mappers.CfgExceptionDaylightMapper;
import com.mgm.mcrm.basesetting.daylight.models.CfgExceptionDaylight; import com.mgm.mcrm.basesetting.daylight.models.CfgExceptionDaylight;
import com.mgm.mcrm.basesetting.daylight.models.CfgExceptionDaylightView; import com.mgm.mcrm.basesetting.daylight.models.CfgExceptionDaylightView;
import com.mgm.mcrm.basesetting.daylight.services.DaylightService;
import com.mgm.mcrm.basesetting.daylight.services.ExceptionDlMappingService; import com.mgm.mcrm.basesetting.daylight.services.ExceptionDlMappingService;
import com.mgm.mcrm.basesetting.daylight.utils.ExceptionDaylightExcelSupport;
import com.mgm.mcrm.basesetting.room.models.CfgRoomTypes; import com.mgm.mcrm.basesetting.room.models.CfgRoomTypes;
import com.mgm.mcrm.common.dtos.DataTableResult; import com.mgm.mcrm.common.dtos.DataTableResult;
import com.mgm.mcrm.common.dtos.QueryFilter; import com.mgm.mcrm.common.dtos.QueryFilter;
import com.mgm.mcrm.common.dtos.ServiceResult; import com.mgm.mcrm.common.dtos.ServiceResult;
import com.mgm.mcrm.common.dtos.dataimport.appsetting.ExceptionOperaImportRow; import com.mgm.mcrm.common.dtos.dataimport.appsetting.ExceptionDaylightImportRow;
import com.mgm.mcrm.common.dtos.excelmodel.ExportDefine; import com.mgm.mcrm.common.dtos.excelmodel.ExportDefine;
import com.mgm.mcrm.logging.services.SysLogOperationService; import com.mgm.mcrm.logging.services.SysLogOperationService;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
@@ -61,6 +68,8 @@ public class ExceptionDaylightController {
@Resource @Resource
private ExceptionDlMappingService exceptionDlMappingService; private ExceptionDlMappingService exceptionDlMappingService;
@Resource @Resource
private DaylightService daylightService;
@Resource
private SysLogOperationService sysAuditLogService; private SysLogOperationService sysAuditLogService;
@Resource @Resource
private ExceptionDaylightResponseFactory exceptionDaylightResponseFactory; private ExceptionDaylightResponseFactory exceptionDaylightResponseFactory;
@@ -71,7 +80,7 @@ public class ExceptionDaylightController {
@OperationLog(actionName="Create Exception Opera", eventCode = "exception_opera_create") @OperationLog(actionName="Create Exception Opera", eventCode = "exception_opera_create")
@RequestMapping(value = "/create", method = RequestMethod.POST, produces = "application/json;charset=UTF-8",consumes = MediaType.APPLICATION_JSON_VALUE) @RequestMapping(value = "/create", method = RequestMethod.POST, produces = "application/json;charset=UTF-8",consumes = MediaType.APPLICATION_JSON_VALUE)
public AjaxResult createOpera(HttpServletRequest request, @RequestBody CreateUpdateExceptionDaylightRequest cfgExceptionOperaRequest) { public AjaxResult createOpera(HttpServletRequest request, @RequestBody CreateUpdateExceptionDaylightRequest cfgExceptionOperaRequest) {
AjaxResult validateResult = validateData(cfgExceptionOperaRequest, "CREATE"); AjaxResult validateResult = validateData(cfgExceptionOperaRequest);
if (!validateResult.isSuccess()) { if (!validateResult.isSuccess()) {
return validateResult; return validateResult;
} }
@@ -91,7 +100,7 @@ public class ExceptionDaylightController {
@OperationLog(eventCode="exception_opera_update",actionName="Update Exception Opera") @OperationLog(eventCode="exception_opera_update",actionName="Update Exception Opera")
@RequestMapping(value = "/update", method = RequestMethod.POST, produces = "application/json;charset=UTF-8",consumes = MediaType.APPLICATION_JSON_VALUE) @RequestMapping(value = "/update", method = RequestMethod.POST, produces = "application/json;charset=UTF-8",consumes = MediaType.APPLICATION_JSON_VALUE)
public AjaxResult updateOpera(HttpServletRequest request, @RequestBody CreateUpdateExceptionDaylightRequest opera) { public AjaxResult updateOpera(HttpServletRequest request, @RequestBody CreateUpdateExceptionDaylightRequest opera) {
AjaxResult validateResult = validateData(opera, "UPDATE"); AjaxResult validateResult = validateData(opera);
if (!validateResult.isSuccess()) { if (!validateResult.isSuccess()) {
return validateResult; return validateResult;
} }
@@ -171,6 +180,7 @@ public class ExceptionDaylightController {
if (operaView.getMarketCode() != null) { if (operaView.getMarketCode() != null) {
operaView.setMarketCodeName(operaView.getMarketCode().getCode()); operaView.setMarketCodeName(operaView.getMarketCode().getCode());
} }
ExceptionDaylightExcelSupport.preparePresetExport(operaView);
} }
String reportFileName = "ExceptionDaylightMapping.xlsx"; String reportFileName = "ExceptionDaylightMapping.xlsx";
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
@@ -182,7 +192,7 @@ public class ExceptionDaylightController {
ExcelUtils.errorResponse(err.getMessage(), request, response); ExcelUtils.errorResponse(err.getMessage(), request, response);
} }
} else { } else {
ExcelUtils.errorResponse("EXPORT_DAYLIGHT_MAPPING not found", request, response); ExcelUtils.errorResponse("EXPORT_EXCEPTION_DAYLIGHT not found", request, response);
} }
} }
@@ -219,7 +229,7 @@ public class ExceptionDaylightController {
@OperationLog(eventCode = "exception_opera_import") @OperationLog(eventCode = "exception_opera_import")
@RequestMapping(value = "/import_batch", method = RequestMethod.POST) @RequestMapping(value = "/import_batch", method = RequestMethod.POST)
public AjaxResult batchImportRows(HttpServletRequest request, HttpServletResponse response, public AjaxResult batchImportRows(HttpServletRequest request, HttpServletResponse response,
@RequestBody(required = false) List<ExceptionOperaImportRow> importRows) throws Exception { @RequestBody(required = false) List<ExceptionDaylightImportRow> importRows) throws Exception {
AjaxResult processResult = new AjaxResult(); AjaxResult processResult = new AjaxResult();
if (importRows == null || importRows.size() <= 0) { if (importRows == null || importRows.size() <= 0) {
processResult.setSuccess(false); processResult.setSuccess(false);
@@ -234,27 +244,93 @@ public class ExceptionDaylightController {
return processResult; return processResult;
} }
private AjaxResult validateData(Object operaObj, String operateType) { @PostMapping(value = "/daylight_complimentary_type_list", produces = "application/json;charset=UTF-8", consumes = MediaType.APPLICATION_JSON_VALUE)
public AjaxResult daylightComplimentaryTypeList(@RequestBody PropertyIdRequest propertyIdRequest) {
AjaxResult processResult = new AjaxResult();
try {
List<DaylightComplimentaryTypeResponse> dayLightResult =
daylightService.daylightGetComplimentaryTypeList(propertyIdRequest.getDlPropertyId());
processResult.setSuccess(true);
processResult.setMessage("Success");
processResult.setData(dayLightResult);
} catch (Exception e) {
processResult.setSuccess(false);
processResult.setMessage("Failed to get DayLightComplimentaryTypeList");
}
processResult.setLogMessage(LogUtil.getAjaxFormatLog(processResult, "daylight_complimentary_type_list", null, null));
return processResult;
}
@PostMapping(value = "/daylight_payment_method_code_list", produces = "application/json;charset=UTF-8", consumes = MediaType.APPLICATION_JSON_VALUE)
public AjaxResult daylightPaymentMethodCodeList(@RequestBody PropertyIdRequest propertyIdRequest) {
AjaxResult processResult = new AjaxResult();
try {
List<DaylightPaymenMethodCodeResponse> dayLightResult =
daylightService.daylightPaymenMethodCodeListResponseList(propertyIdRequest.getDlPropertyId());
processResult.setSuccess(true);
processResult.setMessage("Success");
processResult.setData(dayLightResult);
} catch (Exception e) {
processResult.setSuccess(false);
processResult.setMessage("Failed to get DayLightPaymentMethodCodeList");
}
processResult.setLogMessage(LogUtil.getAjaxFormatLog(processResult, "daylight_payment_method_code_list", null, null));
return processResult;
}
@PostMapping(value = "/daylight_complimentary_preset_list", produces = "application/json;charset=UTF-8", consumes = MediaType.APPLICATION_JSON_VALUE)
public AjaxResult daylightComplimentaryPresetList(@RequestBody PropertyIdRequest propertyIdRequest) {
AjaxResult processResult = new AjaxResult();
try {
List<DaylightComplimentaryPresetResponse> list =
daylightService.daylightGetComplimentaryPresetList(propertyIdRequest.getDlPropertyId());
processResult.setSuccess(true);
processResult.setMessage("Success");
processResult.setData(list);
} catch (Exception e) {
processResult.setSuccess(false);
processResult.setMessage("Failed to get DaylightComplimentaryPresetList");
}
processResult.setLogMessage(LogUtil.getAjaxFormatLog(processResult, "daylight_complimentary_preset_list", null, null));
return processResult;
}
private AjaxResult validateData(CreateUpdateExceptionDaylightRequest request) {
AjaxResult validateResult = new AjaxResult(); AjaxResult validateResult = new AjaxResult();
boolean success = true;
String errorMessage = ""; String errorMessage = "";
String errorCode = ""; if (request.getSoftLimit() != null) {
//-- request.setSoftLimit(request.getSoftLimit().trim());
if (!"CREATE".equals(operateType)) { }
String userId = null;
if (operaObj instanceof CfgExceptionDaylight) { if (StringUtils.isBlank(request.getUserId())) {
userId = ((CfgExceptionDaylight) operaObj).getUserId(); errorMessage = "User ID can't be empty";
} else if (operaObj instanceof CreateUpdateExceptionDaylightRequest) { } else if (request.getCompRuleCategory() != null
userId = ((CreateUpdateExceptionDaylightRequest) operaObj).getUserId(); && request.getCompRuleCategory() != 1 && request.getCompRuleCategory() != 2) {
} errorMessage = "Category must be 1 or 2";
if (StringUtils.isBlank(userId)) { } else if (StringUtils.isNotBlank(request.getSoftLimit())) {
success = false; String softLimit = request.getSoftLimit().trim();
errorCode = ExceptionDaylightResponseFactory.CODE_ERR_ILLEGAL_DATA; if (softLimit.length() > 50 || !softLimit.matches("[0-9]+(?:\\.[0-9]*)?")) {
errorMessage = "User ID can't be empty"; errorMessage = "Soft Limit must be a number between 1 and 100";
} else {
BigDecimal value = new BigDecimal(softLimit);
if (value.compareTo(BigDecimal.ONE) < 0 || value.compareTo(BigDecimal.valueOf(100)) > 0) {
errorMessage = "Soft Limit must be a number between 1 and 100";
}
} }
} }
boolean success = errorMessage.isEmpty();
validateResult.setSuccess(success); validateResult.setSuccess(success);
validateResult.setErrorCode(errorCode); validateResult.setErrorCode(success ? "" : ExceptionDaylightResponseFactory.CODE_ERR_ILLEGAL_DATA);
validateResult.setMessage(errorMessage); validateResult.setMessage(errorMessage);
return validateResult; return validateResult;
} }
@@ -323,13 +323,12 @@ public class ItemInventoryController {
} }
ServiceResult importResult; ServiceResult importResult;
Gson gson = new Gson(); Gson gson = new Gson();
String json = gson.toJson(importRows);
if ("DAYLIGHT".equalsIgnoreCase(category)) { if ("DAYLIGHT".equalsIgnoreCase(category)) {
String json = gson.toJson(importRows);
List<ItemInventoryDaylightImportRow> daylightRows = gson.fromJson(json, List<ItemInventoryDaylightImportRow> daylightRows = gson.fromJson(json,
new TypeToken<List<ItemInventoryDaylightImportRow>>(){}.getType()); new TypeToken<List<ItemInventoryDaylightImportRow>>(){}.getType());
importResult = itemInventoryService.importDaylightBatch(daylightRows); importResult = itemInventoryService.importDaylightBatch(daylightRows);
} else { } else {
String json = gson.toJson(importRows);
List<ItemInventoryImportRow> operaRows = gson.fromJson(json, List<ItemInventoryImportRow> operaRows = gson.fromJson(json,
new TypeToken<List<ItemInventoryImportRow>>(){}.getType()); new TypeToken<List<ItemInventoryImportRow>>(){}.getType());
importResult = itemInventoryService.importBatch(operaRows); importResult = itemInventoryService.importBatch(operaRows);
@@ -1,6 +1,7 @@
package com.mgm.mcrm.basesetting.daylight.dtos; package com.mgm.mcrm.basesetting.daylight.dtos;
import com.mgm.mcrm.basesetting.daylight.models.CfgBookingTypes; import com.mgm.mcrm.basesetting.daylight.models.CfgBookingTypes;
import com.mgm.mcrm.basesetting.daylight.models.CfgExceptionCompPreset;
import com.mgm.mcrm.basesetting.daylight.models.CfgMarketCodes; import com.mgm.mcrm.basesetting.daylight.models.CfgMarketCodes;
import com.mgm.mcrm.basesetting.daylight.models.CfgRateCodes; import com.mgm.mcrm.basesetting.daylight.models.CfgRateCodes;
import com.mgm.mcrm.basesetting.daylight.models.CfgSourceCodes; import com.mgm.mcrm.basesetting.daylight.models.CfgSourceCodes;
@@ -10,6 +11,7 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
import java.util.Set; import java.util.Set;
@Data @Data
@@ -22,6 +24,14 @@ public class CfgExceptionDaylightViewDto implements Serializable {
private Long sourceCodeId; private Long sourceCodeId;
private Long marketCodeId; private Long marketCodeId;
private Long blockCodeId; private Long blockCodeId;
private String approver;
private Integer compRuleCategory;
private String dlCompTypeId;
private String compTypeContent;
private String dlPaymentMethodCodeId;
private String paymentMethodCodeContent;
private String softLimit;
private List<CfgExceptionCompPreset> cfgCompPresetList;
private LocalDateTime createdAt; private LocalDateTime createdAt;
private String createdBy; private String createdBy;
private LocalDateTime updatedAt; private LocalDateTime updatedAt;
@@ -15,6 +15,15 @@ public class CreateUpdateExceptionDaylightRequest {
private Long sourceCodeId; private Long sourceCodeId;
private Long marketCodeId; private Long marketCodeId;
private Long blockCodeId; private Long blockCodeId;
private String approver;
private Integer compRuleCategory;
private String dlCompTypeId;
private String compTypeContent;
private String dlPaymentMethodCodeId;
private String paymentMethodCodeContent;
private String softLimit;
private List<String> dlCompPresetIds;
private List<String> compPresetContents;
private LocalDateTime createdAt; private LocalDateTime createdAt;
private String createdBy; private String createdBy;
private LocalDateTime updatedAt; private LocalDateTime updatedAt;
@@ -1,6 +1,7 @@
package com.mgm.mcrm.basesetting.daylight.dtos.response; package com.mgm.mcrm.basesetting.daylight.dtos.response;
import com.mgm.mcrm.basesetting.daylight.models.CfgBookingTypes; import com.mgm.mcrm.basesetting.daylight.models.CfgBookingTypes;
import com.mgm.mcrm.basesetting.daylight.models.CfgExceptionCompPreset;
import com.mgm.mcrm.basesetting.daylight.models.CfgMarketCodes; import com.mgm.mcrm.basesetting.daylight.models.CfgMarketCodes;
import com.mgm.mcrm.basesetting.daylight.models.CfgRateCodes; import com.mgm.mcrm.basesetting.daylight.models.CfgRateCodes;
import com.mgm.mcrm.basesetting.daylight.models.CfgSourceCodes; import com.mgm.mcrm.basesetting.daylight.models.CfgSourceCodes;
@@ -9,6 +10,7 @@ import com.mgm.mcrm.basesetting.room.models.CfgRoomTypes;
import lombok.Data; import lombok.Data;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
import java.util.Set; import java.util.Set;
@Data @Data
@@ -22,6 +24,14 @@ public class CfgExceptionDaylightResponse {
private Long sourceCodeId; private Long sourceCodeId;
private Long marketCodeId; private Long marketCodeId;
private Long blockCodeId; private Long blockCodeId;
private String approver;
private Integer compRuleCategory;
private String dlCompTypeId;
private String compTypeContent;
private String dlPaymentMethodCodeId;
private String paymentMethodCodeContent;
private String softLimit;
private List<CfgExceptionCompPreset> cfgCompPresetList;
private LocalDateTime createdAt; private LocalDateTime createdAt;
private String createdBy; private String createdBy;
private LocalDateTime updatedAt; private LocalDateTime updatedAt;
@@ -45,6 +55,8 @@ public class CfgExceptionDaylightResponse {
private Set<CfgRoomTypes> daylightRoomType; private Set<CfgRoomTypes> daylightRoomType;
//-- For export //-- For export
private String compPresetContent;
private String compPresetId;
private String propertyName; private String propertyName;
private String bookingTypeName; private String bookingTypeName;
private String rateCodeName; private String rateCodeName;
@@ -4,6 +4,7 @@ import com.mgm.mcrm.basesetting.daylight.dtos.CfgExceptionDaylightViewDto;
import com.mgm.mcrm.basesetting.daylight.dtos.response.CfgExceptionDaylightResponse; import com.mgm.mcrm.basesetting.daylight.dtos.response.CfgExceptionDaylightResponse;
import com.mgm.mcrm.basesetting.daylight.models.CfgExceptionDaylightView; import com.mgm.mcrm.basesetting.daylight.models.CfgExceptionDaylightView;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import java.util.List; import java.util.List;
@@ -20,6 +21,8 @@ public interface CfgExceptionDaylightMapper {
* @param source 源視圖實體對象 * @param source 源視圖實體對象
* @return 轉換後的Response DTO * @return 轉換後的Response DTO
*/ */
@Mapping(target = "compPresetContent", ignore = true)
@Mapping(target = "compPresetId", ignore = true)
CfgExceptionDaylightResponse toResponse(CfgExceptionDaylightView source); CfgExceptionDaylightResponse toResponse(CfgExceptionDaylightView source);
/** /**
@@ -0,0 +1,29 @@
package com.mgm.mcrm.basesetting.daylight.models;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Data;
@Data
@Entity
@Table(name = "cfg_exception_comp_preset")
public class CfgExceptionCompPreset {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "exception_daylight_mapping_id", nullable = false)
private Long exceptionDaylightMappingId;
@Column(name = "dl_comp_preset_id", nullable = false, length = 100)
private String dlCompPresetId;
@Column(name = "comp_preset_content", length = 1000)
private String compPresetContent;
}
@@ -9,6 +9,10 @@ import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue; import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType; import jakarta.persistence.GenerationType;
import jakarta.persistence.Id; import jakarta.persistence.Id;
import jakarta.persistence.FetchType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OrderBy;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import jakarta.persistence.Transient; import jakarta.persistence.Transient;
@@ -36,6 +40,24 @@ public class CfgExceptionDaylight implements Serializable {
private Long marketCodeId; private Long marketCodeId;
@Column(name = "block_code_id") @Column(name = "block_code_id")
private Long blockCodeId; private Long blockCodeId;
@Column(name = "approver", length = 255)
private String approver;
@Column(name = "comp_rule_category")
private Integer compRuleCategory;
@Column(name = "dl_comp_type_id", length = 100)
private String dlCompTypeId;
@Column(name = "comp_type_content", length = 1000)
private String compTypeContent;
@Column(name = "dl_payment_method_code_id", length = 100)
private String dlPaymentMethodCodeId;
@Column(name = "payment_method_code_content", length = 1000)
private String paymentMethodCodeContent;
@Column(name = "soft_limit", length = 50)
private String softLimit;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "exception_daylight_mapping_id", insertable = false, updatable = false)
@OrderBy("id ASC")
private List<CfgExceptionCompPreset> cfgCompPresetList;
@Column(name = "created_at") @Column(name = "created_at")
private LocalDateTime createdAt; private LocalDateTime createdAt;
@Column(name = "created_by") @Column(name = "created_by")
@@ -48,4 +70,8 @@ public class CfgExceptionDaylight implements Serializable {
private List<String> roomTypeIds; private List<String> roomTypeIds;
@Transient @Transient
private List<String> blockCodeIds; private List<String> blockCodeIds;
@Transient
private List<String> dlCompPresetIds;
@Transient
private List<String> compPresetContents;
} }
@@ -2,6 +2,7 @@ package com.mgm.mcrm.basesetting.daylight.models;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
import java.util.Set; import java.util.Set;
import com.mgm.mcrm.basesetting.property.models.CfgProperties; import com.mgm.mcrm.basesetting.property.models.CfgProperties;
@@ -22,7 +23,8 @@ import org.hibernate.annotations.NotFoundAction;
@NamedAttributeNode("rateCode"), @NamedAttributeNode("rateCode"),
@NamedAttributeNode("sourceCode"), @NamedAttributeNode("sourceCode"),
@NamedAttributeNode("marketCode"), @NamedAttributeNode("marketCode"),
@NamedAttributeNode("daylightRoomType") @NamedAttributeNode("daylightRoomType"),
@NamedAttributeNode("cfgCompPresetList")
} }
) )
@Data @Data
@@ -62,6 +64,26 @@ public class CfgExceptionDaylightView implements Serializable {
@Column(name = "block_id") @Column(name = "block_id")
private Long blockId; private Long blockId;
@Column(name = "approver", length = 255)
private String approver;
@Column(name = "comp_rule_category")
private Integer compRuleCategory;
@Column(name = "dl_comp_type_id", length = 100)
private String dlCompTypeId;
@Column(name = "comp_type_content", length = 1000)
private String compTypeContent;
@Column(name = "dl_payment_method_code_id", length = 100)
private String dlPaymentMethodCodeId;
@Column(name = "payment_method_code_content", length = 1000)
private String paymentMethodCodeContent;
@Column(name = "soft_limit", length = 50)
private String softLimit;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "exception_daylight_mapping_id", insertable = false, updatable = false)
@OrderBy("id ASC")
private List<CfgExceptionCompPreset> cfgCompPresetList;
@NotFound(action = NotFoundAction.IGNORE) @NotFound(action = NotFoundAction.IGNORE)
@ManyToOne(fetch = FetchType.EAGER) @ManyToOne(fetch = FetchType.EAGER)
@@ -11,6 +11,7 @@ import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
public interface BlockCodeDao extends JpaRepository<CfgBlockCodes, Long> { public interface BlockCodeDao extends JpaRepository<CfgBlockCodes, Long> {
@@ -34,5 +35,11 @@ public interface BlockCodeDao extends JpaRepository<CfgBlockCodes, Long> {
CfgBlockCodes findByCode(String code); CfgBlockCodes findByCode(String code);
List<CfgBlockCodes> findAllByDlBlockIdIsNotNull(); @Query("""
SELECT c
FROM CfgBlockCodes c
WHERE c.propertyId = :propertyId
AND c.dlBlockId IS NOT NULL
""")
List<CfgBlockCodes> findAllByPropertyIdAndDlBlockIdIsNotNull(@Param("propertyId") Long propertyId);
} }
@@ -0,0 +1,13 @@
package com.mgm.mcrm.basesetting.daylight.repositories;
import com.mgm.mcrm.basesetting.daylight.models.CfgExceptionCompPreset;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
public interface ExceptionCompPresetDao extends JpaRepository<CfgExceptionCompPreset, Long> {
@Modifying
@Query("delete from CfgExceptionCompPreset preset where preset.exceptionDaylightMappingId = ?1")
int deleteByExceptionDaylightMappingId(Long exceptionDaylightMappingId);
}
@@ -460,7 +460,10 @@ public class DaylightService {
for (int i = 0; i < objects.size(); i++) { for (int i = 0; i < objects.size(); i++) {
PropertyResultResponse javaObject = objects.getJSONObject(i).toJavaObject(PropertyResultResponse.class); JSONObject jsonObject = objects.getJSONObject(i);
PropertyResultResponse javaObject = jsonObject.toJavaObject(PropertyResultResponse.class);
javaObject.setId(jsonObject.getString("unitId"));
result.add(javaObject); result.add(javaObject);
} }
@@ -7,6 +7,7 @@ import com.mgm.mcrm.basesetting.daylight.dtos.request.DeleteExceptionDaylightReq
import com.mgm.mcrm.basesetting.daylight.dtos.request.ExceptionDaylightPageRequest; import com.mgm.mcrm.basesetting.daylight.dtos.request.ExceptionDaylightPageRequest;
import com.mgm.mcrm.basesetting.daylight.dtos.response.CfgExceptionDaylightResponse; import com.mgm.mcrm.basesetting.daylight.dtos.response.CfgExceptionDaylightResponse;
import com.mgm.mcrm.basesetting.daylight.mappers.CfgExceptionDaylightMapper; import com.mgm.mcrm.basesetting.daylight.mappers.CfgExceptionDaylightMapper;
import com.mgm.mcrm.basesetting.daylight.utils.ExceptionDaylightExcelSupport;
import com.mgm.mcrm.basesetting.daylight.models.*; import com.mgm.mcrm.basesetting.daylight.models.*;
import com.mgm.mcrm.basesetting.daylight.repositories.*; import com.mgm.mcrm.basesetting.daylight.repositories.*;
import com.mgm.mcrm.basesetting.property.models.CfgProperties; import com.mgm.mcrm.basesetting.property.models.CfgProperties;
@@ -17,7 +18,7 @@ import com.mgm.mcrm.basesetting.team.repositories.SectionDao;
import com.mgm.mcrm.common.dtos.DataTableResult; import com.mgm.mcrm.common.dtos.DataTableResult;
import com.mgm.mcrm.common.dtos.ServiceResult; import com.mgm.mcrm.common.dtos.ServiceResult;
import com.mgm.mcrm.common.dtos.dataimport.ValidateResult; import com.mgm.mcrm.common.dtos.dataimport.ValidateResult;
import com.mgm.mcrm.common.dtos.dataimport.appsetting.ExceptionOperaImportRow; import com.mgm.mcrm.common.dtos.dataimport.appsetting.ExceptionDaylightImportRow;
import com.mgm.mcrm.common.dtos.excelmodel.ImportDefine; import com.mgm.mcrm.common.dtos.excelmodel.ImportDefine;
import com.mgm.mcrm.common.utils.DaoUtil; import com.mgm.mcrm.common.utils.DaoUtil;
import com.mgm.mcrm.common.utils.DateTimeUtil; import com.mgm.mcrm.common.utils.DateTimeUtil;
@@ -34,6 +35,7 @@ import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
@@ -51,6 +53,8 @@ public class ExceptionDlMappingService {
@Resource @Resource
private ExceptDlMappingRoomTypeDao exceptDlMappingRoomTypeDao; private ExceptDlMappingRoomTypeDao exceptDlMappingRoomTypeDao;
@Resource @Resource
private ExceptionCompPresetDao exceptionCompPresetDao;
@Resource
private SectionDao sectionDao; private SectionDao sectionDao;
@Resource @Resource
private PropertyDao propertyDao; private PropertyDao propertyDao;
@@ -73,6 +77,7 @@ public class ExceptionDlMappingService {
private SysUserDao sysUserDao; private SysUserDao sysUserDao;
@Transactional
public ServiceResult createExceptionDaylight(CfgExceptionDaylight createRequest) { public ServiceResult createExceptionDaylight(CfgExceptionDaylight createRequest) {
ServiceResult processResult = new ServiceResult(); ServiceResult processResult = new ServiceResult();
LocalDateTime createDate = LocalDateTime.now(); LocalDateTime createDate = LocalDateTime.now();
@@ -98,6 +103,8 @@ public class ExceptionDlMappingService {
exceptDlMappingRoomTypeDao.save(romType); exceptDlMappingRoomTypeDao.save(romType);
} }
} }
newExceptionOpera.setCfgCompPresetList(saveCompPresets(newExceptionOpera.getId(),
createRequest.getDlCompPresetIds(), createRequest.getCompPresetContents()));
} }
} }
processResult.setSuccess(true); processResult.setSuccess(true);
@@ -105,6 +112,7 @@ public class ExceptionDlMappingService {
return processResult; return processResult;
} }
@Transactional
public ServiceResult updateExceptionDaylight(CreateUpdateExceptionDaylightRequest updateRequest) { public ServiceResult updateExceptionDaylight(CreateUpdateExceptionDaylightRequest updateRequest) {
ServiceResult processResult = new ServiceResult(); ServiceResult processResult = new ServiceResult();
CfgExceptionDaylight existsType = exceptionDlMappingDao.findById(updateRequest.getId()).orElse(null); CfgExceptionDaylight existsType = exceptionDlMappingDao.findById(updateRequest.getId()).orElse(null);
@@ -128,12 +136,35 @@ public class ExceptionDlMappingService {
exceptDlMappingRoomTypeDao.save(roomType); exceptDlMappingRoomTypeDao.save(roomType);
} }
} }
exceptionCompPresetDao.deleteByExceptionDaylightMappingId(existsType.getId());
existsType.setCfgCompPresetList(saveCompPresets(existsType.getId(),
updateRequest.getDlCompPresetIds(), updateRequest.getCompPresetContents()));
processResult.setReturnData(existsType); processResult.setReturnData(existsType);
processResult.setSuccess(true); processResult.setSuccess(true);
} }
return processResult; return processResult;
} }
private List<CfgExceptionCompPreset> saveCompPresets(Long mappingId, List<String> presetIds,
List<String> presetContents) {
List<CfgExceptionCompPreset> presets = new ArrayList<>();
if (presetIds != null) {
for (int i = 0; i < presetIds.size(); i++) {
if (StringUtils.isBlank(presetIds.get(i))) {
continue;
}
CfgExceptionCompPreset preset = new CfgExceptionCompPreset();
preset.setExceptionDaylightMappingId(mappingId);
preset.setDlCompPresetId(presetIds.get(i));
if (presetContents != null && presetContents.size() > i) {
preset.setCompPresetContent(presetContents.get(i));
}
presets.add(preset);
}
}
return presets.isEmpty() ? presets : exceptionCompPresetDao.saveAll(presets);
}
public CfgExceptionDaylightView getExceptionDaylightViewById(long id) { public CfgExceptionDaylightView getExceptionDaylightViewById(long id) {
return exceptionDaylightViewDao.findById(id); return exceptionDaylightViewDao.findById(id);
} }
@@ -266,7 +297,7 @@ public class ExceptionDlMappingService {
private long getMatchPropertyId(List<CfgProperties> properties, String name) { private long getMatchPropertyId(List<CfgProperties> properties, String name) {
long matchId = 0; long matchId = 0;
for (CfgProperties item : properties) { for (CfgProperties item : properties) {
if (Strings.CI.equals(item.getName(), name)) { if ("DAYLIGHT".equalsIgnoreCase(item.getCategory()) && Strings.CI.equals(item.getName(), name)) {
matchId = item.getId(); matchId = item.getId();
break; break;
} }
@@ -285,10 +316,11 @@ public class ExceptionDlMappingService {
return matchId; return matchId;
} }
private long getMatchRateCodeId(List<CfgRateCodes> rateCodes, String name) { private long getMatchRateCodeId(List<CfgRateCodes> rateCodes, String name, Long propertyId) {
long matchId = 0; long matchId = 0;
for (CfgRateCodes item : rateCodes) { for (CfgRateCodes item : rateCodes) {
if (Strings.CI.equals(item.getCode(), name)) { if ("DAYLIGHT".equalsIgnoreCase(item.getCategory()) && Strings.CI.equals(item.getCode(), name)
&& matchesProperty(item.getPropertyId(), propertyId)) {
matchId = item.getId(); matchId = item.getId();
break; break;
} }
@@ -299,7 +331,7 @@ public class ExceptionDlMappingService {
private long getMatchSourceCodeId(List<CfgSourceCodes> sourceCodes, String name) { private long getMatchSourceCodeId(List<CfgSourceCodes> sourceCodes, String name) {
long matchId = 0; long matchId = 0;
for (CfgSourceCodes item : sourceCodes) { for (CfgSourceCodes item : sourceCodes) {
if (Strings.CI.equals(item.getCode(), name)) { if ("DAYLIGHT".equalsIgnoreCase(item.getCategory()) && Strings.CI.equals(item.getCode(), name)) {
matchId = item.getId(); matchId = item.getId();
break; break;
} }
@@ -310,7 +342,7 @@ public class ExceptionDlMappingService {
private long getMatchMarketCodeId(List<CfgMarketCodes> marketCodes, String name) { private long getMatchMarketCodeId(List<CfgMarketCodes> marketCodes, String name) {
long matchId = 0; long matchId = 0;
for (CfgMarketCodes item : marketCodes) { for (CfgMarketCodes item : marketCodes) {
if (Strings.CI.equals(item.getCode(), name)) { if ("DAYLIGHT".equalsIgnoreCase(item.getCategory()) && Strings.CI.equals(item.getCode(), name)) {
matchId = item.getId(); matchId = item.getId();
break; break;
} }
@@ -318,10 +350,11 @@ public class ExceptionDlMappingService {
return matchId; return matchId;
} }
private long getMatchBlockCodeId(List<CfgBlockCodes> blockCodes, String code) { private long getMatchBlockCodeId(List<CfgBlockCodes> blockCodes, String code, Long propertyId) {
long matchId = 0; long matchId = 0;
for (CfgBlockCodes item : blockCodes) { for (CfgBlockCodes item : blockCodes) {
if (Strings.CI.equals(item.getCode(), code)) { if ("DAYLIGHT".equalsIgnoreCase(item.getCategory()) && Strings.CI.equals(item.getCode(), code)
&& matchesProperty(item.getPropertyId(), propertyId)) {
matchId = item.getId(); matchId = item.getId();
break; break;
} }
@@ -329,10 +362,11 @@ public class ExceptionDlMappingService {
return matchId; return matchId;
} }
private long getMatchRoomTypeId(List<CfgRoomTypes> roomTypes, String name) { private long getMatchRoomTypeId(List<CfgRoomTypes> roomTypes, String name, Long propertyId) {
long matchId = 0; long matchId = 0;
for (CfgRoomTypes item : roomTypes) { for (CfgRoomTypes item : roomTypes) {
if (Strings.CI.equals(item.getCode(), name)) { if ("DAYLIGHT".equalsIgnoreCase(item.getCategory()) && Strings.CI.equals(item.getCode(), name)
&& matchesProperty(item.getPropertyId(), propertyId)) {
matchId = item.getId(); matchId = item.getId();
break; break;
} }
@@ -340,24 +374,33 @@ public class ExceptionDlMappingService {
return matchId; return matchId;
} }
private ValidateResult validateImportData(List<ExceptionOperaImportRow> exceptionOperaList) { private boolean matchesProperty(Integer candidatePropertyId, Long mappingPropertyId) {
return candidatePropertyId != null && mappingPropertyId != null
&& candidatePropertyId.longValue() == mappingPropertyId.longValue();
}
private <T> Specification<T> daylightCategorySpec() {
return (root, query, cb) -> cb.equal(cb.upper(root.get("category")), "DAYLIGHT");
}
private ValidateResult validateImportData(List<ExceptionDaylightImportRow> exceptionOperaList) {
ValidateResult result = new ValidateResult(); ValidateResult result = new ValidateResult();
int totalRows = 0; int totalRows = 0;
int failedRows = 0; int failedRows = 0;
int successRows = 0; int successRows = 0;
if (!exceptionOperaList.isEmpty()) { if (!exceptionOperaList.isEmpty()) {
totalRows = exceptionOperaList.size(); totalRows = exceptionOperaList.size();
List<CfgRoomTypes> roomTypeList = roomTypeDao.findAll(); List<CfgRoomTypes> roomTypeList = roomTypeDao.findAll(daylightCategorySpec());
List<CfgProperties> propertyList = propertyDao.findAll(); List<CfgProperties> propertyList = propertyDao.findAll(daylightCategorySpec());
List<CfgBookingTypes> bookingTypeList = bookingTypeDao.findAll(); List<CfgBookingTypes> bookingTypeList = bookingTypeDao.findAll();
List<CfgRateCodes> rateCodeList = rateCodeDao.findAll(); List<CfgRateCodes> rateCodeList = rateCodeDao.findAll(daylightCategorySpec());
List<CfgSourceCodes> sourceCodeList = sourceCodeDao.findAll(); List<CfgSourceCodes> sourceCodeList = sourceCodeDao.findAll(daylightCategorySpec());
List<CfgMarketCodes> marketCodeList = marketCodeDao.findAll(); List<CfgMarketCodes> marketCodeList = marketCodeDao.findAll(daylightCategorySpec());
List<CfgBlockCodes> blockCodeList = blockCodeDao.findAll(); List<CfgBlockCodes> blockCodeList = blockCodeDao.findAll(daylightCategorySpec());
for (int i = 0; i < exceptionOperaList.size(); i++) { for (int i = 0; i < exceptionOperaList.size(); i++) {
String errMsg = ""; String errMsg = "";
boolean isPassed = true; boolean isPassed = true;
ExceptionOperaImportRow pItem = exceptionOperaList.get(i); ExceptionDaylightImportRow pItem = exceptionOperaList.get(i);
if (StringUtils.isBlank(pItem.getUserId())) { if (StringUtils.isBlank(pItem.getUserId())) {
errMsg += "User ID is blank;"; errMsg += "User ID is blank;";
isPassed = false; isPassed = false;
@@ -395,11 +438,12 @@ public class ExceptionDlMappingService {
errMsg += "Block Code is blank;"; errMsg += "Block Code is blank;";
isPassed = false; isPassed = false;
} else { } else {
long blockCodeId = this.getMatchBlockCodeId(blockCodeList, pItem.getBlockCodeName()); long blockCodeId = this.getMatchBlockCodeId(blockCodeList, pItem.getBlockCodeName(), pItem.getPropertyId());
if (blockCodeId > 0) { if (blockCodeId > 0) {
pItem.setBlockCodeId(blockCodeId); pItem.setBlockCodeId(blockCodeId);
} else { } else {
errMsg += "No match Block Code of [" + pItem.getBlockCodeName() + "];"; errMsg += "No match DAYLIGHT Block Code of [" + pItem.getBlockCodeName()
+ "] in Property [" + pItem.getPropertyName() + "];";
isPassed = false; isPassed = false;
} }
} }
@@ -407,11 +451,12 @@ public class ExceptionDlMappingService {
errMsg += "Rate Code is blank;"; errMsg += "Rate Code is blank;";
isPassed = false; isPassed = false;
} else { } else {
long rateCodeId = this.getMatchRateCodeId(rateCodeList, pItem.getRateCodeName()); long rateCodeId = this.getMatchRateCodeId(rateCodeList, pItem.getRateCodeName(), pItem.getPropertyId());
if (rateCodeId > 0) { if (rateCodeId > 0) {
pItem.setRateCodeId(rateCodeId); pItem.setRateCodeId(rateCodeId);
} else { } else {
errMsg += "No match Rate Code of [" + pItem.getRateCodeName() + "];"; errMsg += "No match DAYLIGHT Rate Code of [" + pItem.getRateCodeName()
+ "] in Property [" + pItem.getPropertyName() + "];";
isPassed = false; isPassed = false;
} }
} }
@@ -445,10 +490,11 @@ public class ExceptionDlMappingService {
for (String roomTypeVal : roomTypeVals) { for (String roomTypeVal : roomTypeVals) {
roomTypeVal = roomTypeVal.trim(); roomTypeVal = roomTypeVal.trim();
if (StringUtils.isNotBlank(roomTypeVal)) { if (StringUtils.isNotBlank(roomTypeVal)) {
long matchTypeId = this.getMatchRoomTypeId(roomTypeList, roomTypeVal); long matchTypeId = this.getMatchRoomTypeId(roomTypeList, roomTypeVal, pItem.getPropertyId());
if (matchTypeId <= 0) { if (matchTypeId <= 0) {
isPassed = false; isPassed = false;
errMsg += "Room Type [" + roomTypeVal + "] not found;"; errMsg += "DAYLIGHT Room Type [" + roomTypeVal + "] not found in Property ["
+ pItem.getPropertyName() + "];";
} else { } else {
Long typeId = Long.valueOf(matchTypeId); Long typeId = Long.valueOf(matchTypeId);
if (!roomTypeIds.contains(typeId)) if (!roomTypeIds.contains(typeId))
@@ -468,6 +514,11 @@ public class ExceptionDlMappingService {
} }
} }
String compRuleErrors = ExceptionDaylightExcelSupport.validateCompRuleImport(pItem);
if (!compRuleErrors.isEmpty()) {
errMsg += compRuleErrors;
isPassed = false;
}
pItem.setValidatePassed(isPassed); pItem.setValidatePassed(isPassed);
pItem.setErrorMessage(errMsg); pItem.setErrorMessage(errMsg);
if (isPassed) if (isPassed)
@@ -486,9 +537,16 @@ public class ExceptionDlMappingService {
public ServiceResult parseImportExcel(String importFilePath) { public ServiceResult parseImportExcel(String importFilePath) {
ServiceResult result = new ServiceResult(); ServiceResult result = new ServiceResult();
String importName = "IMPORT_EXCEPTION_OPERA"; String importName = "IMPORT_EXCEPTION_DAYLIGHT";
ImportDefine importDef = ExcelUtils.getImportDefineByName(importName); ImportDefine importDef = ExcelUtils.getImportDefineByName(importName);
if (importDef != null) { if (importDef != null) {
String headerError = ExceptionDaylightExcelSupport.validateOptionalImportHeaders(importDef, importFilePath);
if (!headerError.isEmpty()) {
result.setSuccess(false);
result.setErrorCode("INVALID_TEMPLATE");
result.setErrorMessage(headerError);
return result;
}
ServiceResult importResult = ExcelUtils.importDataBlock(importDef, importFilePath, null); ServiceResult importResult = ExcelUtils.importDataBlock(importDef, importFilePath, null);
if (!importResult.isSuccess()) { if (!importResult.isSuccess()) {
result.setSuccess(false); result.setSuccess(false);
@@ -497,7 +555,7 @@ public class ExceptionDlMappingService {
if (importResult.getReturnData() != null) { if (importResult.getReturnData() != null) {
List<Object> dataList = (List<Object>) importResult.getReturnData(); List<Object> dataList = (List<Object>) importResult.getReturnData();
if (dataList.size() > 0) { if (dataList.size() > 0) {
List<ExceptionOperaImportRow> exceptionOperaList = (List<ExceptionOperaImportRow>) dataList.getFirst(); List<ExceptionDaylightImportRow> exceptionOperaList = (List<ExceptionDaylightImportRow>) dataList.getFirst();
ValidateResult validateRes = validateImportData(exceptionOperaList); ValidateResult validateRes = validateImportData(exceptionOperaList);
if (validateRes.getResultCount() > 0) { if (validateRes.getResultCount() > 0) {
result.setSuccess(true); result.setSuccess(true);
@@ -522,7 +580,8 @@ public class ExceptionDlMappingService {
return result; return result;
} }
public ServiceResult importBatch(List<ExceptionOperaImportRow> importRows) { @Transactional
public ServiceResult importBatch(List<ExceptionDaylightImportRow> importRows) {
ServiceResult result = new ServiceResult(); ServiceResult result = new ServiceResult();
if (importRows != null && importRows.size() > 0) { if (importRows != null && importRows.size() > 0) {
ValidateResult validateRes = validateImportData(importRows); ValidateResult validateRes = validateImportData(importRows);
@@ -530,7 +589,7 @@ public class ExceptionDlMappingService {
LocalDateTime currentTime = LocalDateTime.now(); LocalDateTime currentTime = LocalDateTime.now();
List<CfgExceptDaylightRoomTypes> newExceptionOperaRoomTypeList = new ArrayList<CfgExceptDaylightRoomTypes>(); List<CfgExceptDaylightRoomTypes> newExceptionOperaRoomTypeList = new ArrayList<CfgExceptDaylightRoomTypes>();
for (int i = 0; i < importRows.size(); i++) { for (int i = 0; i < importRows.size(); i++) {
ExceptionOperaImportRow pItem = importRows.get(i); ExceptionDaylightImportRow pItem = importRows.get(i);
CfgExceptionDaylight newExceptionOpera = new CfgExceptionDaylight(); CfgExceptionDaylight newExceptionOpera = new CfgExceptionDaylight();
newExceptionOpera.setPropertyId(pItem.getPropertyId()); newExceptionOpera.setPropertyId(pItem.getPropertyId());
newExceptionOpera.setUserId(pItem.getUserId()); newExceptionOpera.setUserId(pItem.getUserId());
@@ -541,9 +600,18 @@ public class ExceptionDlMappingService {
newExceptionOpera.setSourceCodeId(pItem.getSourceCodeId()); newExceptionOpera.setSourceCodeId(pItem.getSourceCodeId());
newExceptionOpera.setMarketCodeId(pItem.getMarketCodeId()); newExceptionOpera.setMarketCodeId(pItem.getMarketCodeId());
newExceptionOpera.setCreatedAt(currentTime); newExceptionOpera.setCreatedAt(currentTime);
newExceptionOpera.setApprover(pItem.getApprover());
newExceptionOpera.setCompRuleCategory(pItem.getCompRuleCategoryVal());
newExceptionOpera.setDlCompTypeId(pItem.getDlCompTypeId());
newExceptionOpera.setCompTypeContent(pItem.getCompTypeContent());
newExceptionOpera.setDlPaymentMethodCodeId(pItem.getDlPaymentMethodCodeId());
newExceptionOpera.setPaymentMethodCodeContent(pItem.getPaymentMethodCodeContent());
newExceptionOpera.setSoftLimit(pItem.getSoftLimit());
newExceptionOpera.setUpdatedAt(currentTime); newExceptionOpera.setUpdatedAt(currentTime);
exceptionDlMappingDao.save(newExceptionOpera); exceptionDlMappingDao.save(newExceptionOpera);
Long newExceptionOperaId = newExceptionOpera.getId(); Long newExceptionOperaId = newExceptionOpera.getId();
newExceptionOpera.setCfgCompPresetList(saveCompPresets(newExceptionOperaId,
pItem.getDlCompPresetIds(), pItem.getCompPresetContents()));
if (pItem.getRoomTypeIds() != null && pItem.getRoomTypeIds().size() > 0) { if (pItem.getRoomTypeIds() != null && pItem.getRoomTypeIds().size() > 0) {
List<Long> operaRoomTypeIds = pItem.getRoomTypeIds(); List<Long> operaRoomTypeIds = pItem.getRoomTypeIds();
for (Long roomTypeId : operaRoomTypeIds) { for (Long roomTypeId : operaRoomTypeIds) {
@@ -395,6 +395,9 @@ public class ItemInventoryService {
String errMsg = ""; String errMsg = "";
boolean isPassed = true; boolean isPassed = true;
ItemInventoryImportRow pItem = itemInventoryList.get(i); ItemInventoryImportRow pItem = itemInventoryList.get(i);
if (StringUtils.isBlank(pItem.getCategory())) {
pItem.setCategory("OPERA");
}
if (StringUtils.isBlank(pItem.getIgtTierId())) { if (StringUtils.isBlank(pItem.getIgtTierId())) {
errMsg += "IGT Tier ID is blank"; errMsg += "IGT Tier ID is blank";
isPassed = false; isPassed = false;
@@ -0,0 +1,159 @@
package com.mgm.mcrm.basesetting.daylight.utils;
import com.mgm.mcrm.basesetting.daylight.dtos.response.CfgExceptionDaylightResponse;
import com.mgm.mcrm.common.dtos.dataimport.appsetting.ExceptionDaylightImportRow;
import com.mgm.mcrm.common.dtos.excelmodel.ImportDefine;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.StringEscapeUtils;
import java.math.BigDecimal;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
public final class ExceptionDaylightExcelSupport {
private ExceptionDaylightExcelSupport() {
}
public static String validateOptionalImportHeaders(ImportDefine define, String filePath) {
var block = define.getImportPages().getFirst().getDataElements().getFirst();
var columns = block.getColumnDefs();
int firstOptional = 0;
while (firstOptional < columns.size() && !columns.get(firstOptional).isOptionalHeader()) firstOptional++;
// Optional headers permit legacy files, but a typo must not silently drop settings.
try (var input = Files.newInputStream(Path.of(filePath)); var workbook = new XSSFWorkbook(input)) {
var header = workbook.getSheetAt(0).getRow(0);
if (header == null) return "";
DataFormatter formatter = new DataFormatter();
int lastHeader = header.getLastCellNum() - 1;
while (lastHeader >= firstOptional
&& formatter.formatCellValue(header.getCell(lastHeader)).isBlank()) lastHeader--;
int expected = firstOptional;
for (int index = firstOptional; index <= lastHeader; index++) {
String actual = formatter.formatCellValue(header.getCell(index)).trim();
while (expected < columns.size()
&& !StringUtils.equalsIgnoreCase(columns.get(expected).getColumnHeader(), actual)) expected++;
if (actual.isEmpty() || expected == columns.size()) {
return "Invalid Comp Rule column header or order at column " + (index + 1);
}
expected++;
}
return "";
} catch (Exception e) {
return "Unable to read import file: " + e.getMessage();
}
}
public static void preparePresetExport(CfgExceptionDaylightResponse row) {
row.setCompPresetId("");
row.setCompPresetContent("");
if (row.getCfgCompPresetList() == null) return;
var presets = row.getCfgCompPresetList().stream().filter(Objects::nonNull).toList();
row.setCompPresetId(presets.stream()
.map(preset -> StringEscapeUtils.escapeCsv(StringUtils.defaultString(preset.getDlCompPresetId())))
.collect(Collectors.joining(",")));
row.setCompPresetContent(presets.stream()
.map(preset -> StringEscapeUtils.escapeCsv(StringUtils.defaultString(preset.getCompPresetContent())))
.collect(Collectors.joining(",")));
}
public static String validateCompRuleImport(ExceptionDaylightImportRow row) {
StringBuilder errors = new StringBuilder();
row.setCompRuleCategoryVal(null);
if (StringUtils.isNotBlank(row.getCompRuleCategory())) {
String category = row.getCompRuleCategory().trim();
if ("1".equals(category) || "2".equals(category)) {
row.setCompRuleCategoryVal(Integer.valueOf(category));
} else {
errors.append("Room Category must be 1 or 2;");
}
}
if (row.getSoftLimit() != null) row.setSoftLimit(row.getSoftLimit().trim());
if (StringUtils.isNotBlank(row.getSoftLimit())) {
String limit = row.getSoftLimit();
if (limit.length() > 50 || !limit.matches("[0-9]+(?:\\.[0-9]*)?")) {
errors.append("Soft Limit must be a number between 1 and 100;");
} else {
BigDecimal value = new BigDecimal(limit);
if (value.compareTo(BigDecimal.ONE) < 0 || value.compareTo(BigDecimal.valueOf(100)) > 0) {
errors.append("Soft Limit must be a number between 1 and 100;");
}
}
}
checkLength(errors, "Approver", row.getApprover(), 255);
checkLength(errors, "Complimentary Type Id", row.getDlCompTypeId(), 100);
checkLength(errors, "Complimentary Type", row.getCompTypeContent(), 1000);
checkLength(errors, "Payment Method Code Id", row.getDlPaymentMethodCodeId(), 100);
checkLength(errors, "Payment Method Code", row.getPaymentMethodCodeContent(), 1000);
row.setDlCompPresetIds(new ArrayList<>());
row.setCompPresetContents(new ArrayList<>());
try {
List<String> ids = parseCsvCell(row.getCompPresetId());
List<String> contents = parseCsvCell(row.getCompPresetContent());
if (contents.size() > ids.size() && contents.stream().anyMatch(StringUtils::isNotBlank)) {
errors.append("Complimentary Preset has more descriptions than IDs;");
}
for (int i = 0; i < ids.size(); i++) {
if (StringUtils.isBlank(ids.get(i))) continue;
String content = contents.size() > i ? contents.get(i) : null;
checkLength(errors, "Complimentary Preset Id", ids.get(i), 100);
checkLength(errors, "Complimentary Preset", content, 1000);
row.getDlCompPresetIds().add(ids.get(i));
row.getCompPresetContents().add(content);
}
} catch (IllegalArgumentException e) {
errors.append("Complimentary Preset contains invalid CSV quoting;");
}
return errors.toString();
}
private static void checkLength(StringBuilder errors, String field, String value, int maximum) {
if (value != null && value.length() > maximum) {
errors.append(field).append(" exceeds ").append(maximum).append(" characters;");
}
}
// CSV inside a single Excel cell preserves commas and quotes in preset names.
private static List<String> parseCsvCell(String value) {
List<String> values = new ArrayList<>();
if (StringUtils.isBlank(value)) return values;
StringBuilder token = new StringBuilder();
boolean quoted = false;
boolean closedQuote = false;
for (int i = 0; i < value.length(); i++) {
char character = value.charAt(i);
if (quoted) {
if (character == '"') {
if (i + 1 < value.length() && value.charAt(i + 1) == '"') {
token.append('"');
i++;
} else {
quoted = false;
closedQuote = true;
}
} else {
token.append(character);
}
} else if (character == ',') {
values.add(token.toString().trim());
token.setLength(0);
closedQuote = false;
} else if (character == '"' && !closedQuote && token.toString().isBlank()) {
token.setLength(0);
quoted = true;
} else if (character == '"' || (closedQuote && !Character.isWhitespace(character))) {
throw new IllegalArgumentException("Invalid CSV quoting");
} else if (!closedQuote) {
token.append(character);
}
}
if (quoted) throw new IllegalArgumentException("Unclosed CSV quoting");
values.add(token.toString().trim());
return values;
}
}
@@ -23,4 +23,5 @@ public class CfgPropertiesDto {
private Integer showCalendar; private Integer showCalendar;
private String calendarName; private String calendarName;
private Integer calendarOrder; private Integer calendarOrder;
private int displayType;
} }
@@ -23,6 +23,8 @@ public class CreateUpdatePropertyRequest {
private int status = 1; private int status = 1;
private int displayType = 1;
private String calendarName; private String calendarName;
private Integer calendarOrder; private Integer calendarOrder;
@@ -59,4 +59,7 @@ public class CfgProperties implements Serializable {
private String calendarName; private String calendarName;
@Column(name="calendar_order") @Column(name="calendar_order")
private Integer calendarOrder; private Integer calendarOrder;
@Column(name = "display_type")
private int displayType;
} }
@@ -0,0 +1,38 @@
package com.mgm.mcrm.common.dtos.dataimport.appsetting;
import lombok.Data;
import java.util.List;
@Data
public class ExceptionDaylightImportRow {
private boolean validatePassed;
private String errorMessage;
private String userId;
private Long propertyId;
private Long bookingTypeId;
private Long rateCodeId;
private Long sourceCodeId;
private Long marketCodeId;
private Long blockCodeId;
private String propertyName;
private String bookingTypeName;
private String blockCodeName;
private String rateCodeName;
private String roomTypeNames;
private String sourceCodeName;
private String marketCodeName;
private List<Long> roomTypeIds;
private String approver;
private String compRuleCategory;
private Integer compRuleCategoryVal;
private String dlCompTypeId;
private String compTypeContent;
private String dlPaymentMethodCodeId;
private String paymentMethodCodeContent;
private String compPresetId;
private String compPresetContent;
private List<String> dlCompPresetIds;
private List<String> compPresetContents;
private String softLimit;
}
@@ -12,6 +12,7 @@ public class ColumnDefine {
private String formatVal; private String formatVal;
private String groupKeyAttrName; private String groupKeyAttrName;
private boolean checkHeader=false; private boolean checkHeader=false;
private boolean optionalHeader=false;
private int columnWidth=0; private int columnWidth=0;
private int columnIndex=0; private int columnIndex=0;
private int headerRowIdx=0; private int headerRowIdx=0;
@@ -71,6 +72,12 @@ public class ColumnDefine {
public void setCheckHeader(boolean checkHeader) { public void setCheckHeader(boolean checkHeader) {
this.checkHeader = checkHeader; this.checkHeader = checkHeader;
} }
public boolean isOptionalHeader() {
return optionalHeader;
}
public void setOptionalHeader(boolean optionalHeader) {
this.optionalHeader = optionalHeader;
}
public int getHeaderRowIdx() { public int getHeaderRowIdx() {
return headerRowIdx; return headerRowIdx;
} }
@@ -12,6 +12,8 @@ import org.apache.hc.core5.http.Header;
import org.apache.hc.core5.http.HttpEntity; import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.NameValuePair; import org.apache.hc.core5.http.NameValuePair;
import org.apache.hc.core5.http.io.entity.EntityUtils; import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.ArrayList; import java.util.ArrayList;
@@ -59,6 +61,8 @@ import com.mgm.mcrm.common.httpclient.HttpEntityBuilder;
*/ */
public class HttpClientExecutor { public class HttpClientExecutor {
private static final Logger log = LoggerFactory.getLogger(HttpClientExecutor.class);
private HttpClientExecutor() { private HttpClientExecutor() {
// 工具类,禁止实例化 // 工具类,禁止实例化
} }
@@ -181,7 +185,7 @@ public class HttpClientExecutor {
url = url + "?" + query; url = url + "?" + query;
} }
} }
System.out.println(url); log.info("Final GET request URL: {}", url);
HttpGet httpGet = new HttpGet(url); HttpGet httpGet = new HttpGet(url);
setHeaders(httpGet, headers); setHeaders(httpGet, headers);
setRequestConfig(httpGet, config); setRequestConfig(httpGet, config);
@@ -284,7 +288,7 @@ public class HttpClientExecutor {
url = url + "?" + query; url = url + "?" + query;
} }
} }
System.out.println(url); log.info("Final GET request URL: {}", url);
HttpGet httpGet = new HttpGet(url); HttpGet httpGet = new HttpGet(url);
setHeaders(httpGet, headers); setHeaders(httpGet, headers);
setRequestConfig(httpGet, options); setRequestConfig(httpGet, options);
@@ -90,19 +90,19 @@ public class HttpRequestOptions {
private RequestConfig requestConfig; private RequestConfig requestConfig;
/** /**
* 解决多线程下载时,strean被close的问题 * 当前请求的输出流
*/ */
private static final ThreadLocal<OutputStream> outs = new ThreadLocal<OutputStream>(); private OutputStream out;
/** /**
* 解决多线程处理时,url被覆盖问题 * 当前请求的 URL
*/ */
private static final ThreadLocal<String> urls = new ThreadLocal<String>(); private String url;
/** /**
* 解决多线程处理时,url被覆盖问题 * 当前请求的参数,随实例保存,避免线程复用时混入上一次请求的数据
*/ */
private static final ThreadLocal<Map<String,Object>> maps = new ThreadLocal<Map<String,Object>>(); private Map<String, Object> parameters;
/** /**
* @param client HttpClient对象 * @param client HttpClient对象
@@ -118,7 +118,7 @@ public class HttpRequestOptions {
* @return 返回当前对象 * @return 返回当前对象
*/ */
public HttpRequestOptions url(String url) { public HttpRequestOptions url(String url) {
urls.set(url); this.url = url;
return this; return this;
} }
@@ -176,13 +176,13 @@ public class HttpRequestOptions {
* @return 返回当前对象 * @return 返回当前对象
*/ */
public HttpRequestOptions map(Map<String, Object> map) { public HttpRequestOptions map(Map<String, Object> map) {
Map<String, Object> m = maps.get(); if (map == null) {
if(m == null || map.isEmpty()){ parameters = null;
m = map; } else if (parameters == null || map.isEmpty()) {
}else { parameters = new HashMap<>(map);
m.putAll(map); } else {
parameters.putAll(map);
} }
maps.set(m);
return this; return this;
} }
@@ -192,9 +192,8 @@ public class HttpRequestOptions {
*/ */
public HttpRequestOptions json(String json) { public HttpRequestOptions json(String json) {
this.json = json; this.json = json;
Map<String, Object> map = new HashMap<String, Object>(); parameters = new HashMap<>();
map.put(HttpEntityBuilder.ENTITY_JSON, json); parameters.put(HttpEntityBuilder.ENTITY_JSON, json);
maps.set(map);
return this; return this;
} }
@@ -222,14 +221,12 @@ public class HttpRequestOptions {
* @return 返回当前对象 * @return 返回当前对象
*/ */
public HttpRequestOptions files(String[] filePaths, String inputName, boolean forceRemoveContentTypeChraset) { public HttpRequestOptions files(String[] filePaths, String inputName, boolean forceRemoveContentTypeChraset) {
Map<String, Object> m = maps.get(); if (parameters == null) {
if(m == null || m.isEmpty()){ parameters = new HashMap<>();
m = new HashMap<String, Object>();
} }
m.put(HttpEntityBuilder.ENTITY_MULTIPART, filePaths); parameters.put(HttpEntityBuilder.ENTITY_MULTIPART, filePaths);
m.put(HttpEntityBuilder.ENTITY_MULTIPART+".name", inputName); parameters.put(HttpEntityBuilder.ENTITY_MULTIPART+".name", inputName);
m.put(HttpEntityBuilder.ENTITY_MULTIPART+".rmCharset", forceRemoveContentTypeChraset); parameters.put(HttpEntityBuilder.ENTITY_MULTIPART+".rmCharset", forceRemoveContentTypeChraset);
maps.set(m);
return this; return this;
} }
@@ -264,7 +261,7 @@ public class HttpRequestOptions {
* @return 返回当前对象 * @return 返回当前对象
*/ */
public HttpRequestOptions out(OutputStream out) { public HttpRequestOptions out(OutputStream out) {
outs.set(out); this.out = out;
return this; return this;
} }
@@ -320,7 +317,7 @@ public class HttpRequestOptions {
} }
public String url() { public String url() {
return urls.get(); return url;
} }
public HttpMethods method() { public HttpMethods method() {
@@ -336,7 +333,7 @@ public class HttpRequestOptions {
} }
public Map<String, Object> map() { public Map<String, Object> map() {
return maps.get(); return parameters;
} }
public String json() { public String json() {
@@ -356,7 +353,7 @@ public class HttpRequestOptions {
} }
public OutputStream out() { public OutputStream out() {
return outs.get(); return out;
} }
public RequestConfig requestConfig() { public RequestConfig requestConfig() {
@@ -65,7 +65,7 @@ public class HttpService {
.client(httpClient); .client(httpClient);
String result = HttpClientExecutor.get(options, supplementDaylightProxySecurity(headers)); String result = HttpClientExecutor.get(options, supplementDaylightProxySecurity(headers));
log.info("====== GET request result:{}", result); log.info("====== GET request result length={}", result.length());
return result; return result;
} }
@@ -170,6 +170,15 @@ public class ExcelUtils {
for(int k=0; k<colDefs.size();k++) { for(int k=0; k<colDefs.size();k++) {
ColumnDefine colDef = colDefs.get(k); ColumnDefine colDef = colDefs.get(k);
if(StringUtils.isBlank(colDef.getGroupName())) { if(StringUtils.isBlank(colDef.getGroupName())) {
if (colDef.isOptionalHeader()) {
int headerCol = dataBlock.getOffsetCol() >= 0
? dataBlock.getOffsetCol() : lastCol - dataBlock.getOffsetCol();
Row headerRow = sheet.getRow(lastRow + colDef.getHeaderRowIdx());
String header = getCellTextValueInRow(headerRow, headerCol + colIdx, true).trim();
if (!Strings.CI.equals(colDef.getColumnHeader(), header)) {
continue;
}
}
RowFieldInfo colInfo= getImportFieldInfoFromDefine(colDef,objClass); RowFieldInfo colInfo= getImportFieldInfoFromDefine(colDef,objClass);
colInfo.setColIndex(colIdx); colInfo.setColIndex(colIdx);
masterFields.add(colInfo); masterFields.add(colInfo);
@@ -26,10 +26,8 @@ import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
import org.apache.hc.client5.http.impl.classic.HttpClients; import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.client5.http.socket.ConnectionSocketFactory; import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
import org.apache.hc.client5.http.ssl.NoopHostnameVerifier;
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
import org.apache.hc.client5.http.ssl.TrustAllStrategy;
import org.apache.hc.core5.http.ContentType; import org.apache.hc.core5.http.ContentType;
import org.apache.hc.core5.http.HttpEntity; import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.Header; import org.apache.hc.core5.http.Header;
@@ -37,7 +35,6 @@ import org.apache.hc.core5.http.config.Registry;
import org.apache.hc.core5.http.config.RegistryBuilder; import org.apache.hc.core5.http.config.RegistryBuilder;
import org.apache.hc.core5.http.io.entity.EntityUtils; import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.http.message.BasicHeader; import org.apache.hc.core5.http.message.BasicHeader;
import org.apache.hc.core5.ssl.SSLContextBuilder;
import org.apache.hc.core5.util.Timeout; import org.apache.hc.core5.util.Timeout;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@@ -121,8 +118,8 @@ public class HttpUtil {
return httpResult; return httpResult;
} }
public static HttpResponseResult invokeGatewayAPI(JSONObject requestContent, String requestMethod, public static HttpResponseResult invokeGatewayEmailAPI(JSONObject requestContent, String requestMethod,
HttpServletRequest request, MultipartFile[] files, ApiGatewaySetting apiGatewaySetting) throws Exception { HttpServletRequest request, MultipartFile[] files, ApiGatewaySetting apiGatewaySetting) throws Exception {
String serverUrl = apiGatewaySetting.getBaseUrl(); String serverUrl = apiGatewaySetting.getBaseUrl();
int timeoutTime = apiGatewaySetting.getRequestTimeout(); int timeoutTime = apiGatewaySetting.getRequestTimeout();
@@ -308,12 +305,13 @@ public class HttpUtil {
if(Strings.CI.startsWith(requestUrl, "https://")) { if(Strings.CI.startsWith(requestUrl, "https://")) {
SSLContext sslContext = null; SSLContext sslContext = null;
try { try {
sslContext = SSLContextBuilder.create().loadTrustMaterial(TrustAllStrategy.INSTANCE).build(); //sslContext = SSLContextBuilder.create().loadTrustMaterial(TrustAllStrategy.INSTANCE).build();
sslContext = getSSLContext();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create() Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("https", new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE )) .register("https", new SSLConnectionSocketFactory(sslContext, getTrustHandler()))
.build(); .build();
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
HttpClientBuilder httpClientBuilder = HttpClients.custom().setConnectionManager(connectionManager) HttpClientBuilder httpClientBuilder = HttpClients.custom().setConnectionManager(connectionManager)
@@ -9,5 +9,5 @@ import lombok.Setter;
@NoArgsConstructor @NoArgsConstructor
public class CfgEmailTemplateDeleteByIdRequest { public class CfgEmailTemplateDeleteByIdRequest {
private Long Id; private Long id;
} }
@@ -1,16 +1,20 @@
package com.mgm.mcrm.notification.services; package com.mgm.mcrm.notification.services;
import com.alibaba.fastjson.JSONArray;
import com.mgm.mcrm.common.dtos.HttpResponseResult; import com.mgm.mcrm.common.dtos.HttpResponseResult;
import com.mgm.mcrm.common.dtos.ServiceResult; import com.mgm.mcrm.common.dtos.ServiceResult;
import com.mgm.mcrm.common.dtos.config.ApiGatewaySetting; import com.mgm.mcrm.common.dtos.config.ApiGatewaySetting;
import com.mgm.mcrm.common.utils.DateTimeUtil;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.Strings;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.mgm.mcrm.common.utils.HttpUtil; import com.mgm.mcrm.common.utils.HttpUtil;
import java.util.Objects;
@Service @Service
@@ -23,14 +27,35 @@ public class SendEmailService {
JSONObject requestObj = temp; JSONObject requestObj = temp;
HttpResponseResult httpResult = HttpUtil.invokeWebAPI(requestObj, "POST", request,null); HttpResponseResult httpResult = HttpUtil.invokeWebAPI(requestObj, "POST", request,null);
String content = httpResult.getResponseContent(); String content = httpResult.getResponseContent();
JSONObject obj = (JSONObject) JSONObject.parseObject(content); JSONObject obj = JSONObject.parseObject(content);
if(obj.getBooleanValue("success")) { if(obj.getBooleanValue("success")) {
JSONArray data = obj.getJSONArray("data");
if (data != null) {
for (int i = 0; i < data.size(); i++) {
JSONObject dataObj = data.getJSONObject(i);
String subject = dataObj.getString("subject");
if (subject != null) {
dataObj.put(
"subject",
Strings.CI.replace(
subject,
"[TODAY]",
DateTimeUtil.getCurrentDate("dd MMM")
)
);
}
}
}
result.setSuccess(true); result.setSuccess(true);
Object getData = obj.get("data"); result.setReturnData(data);
result.setReturnData(getData);
}else { }else {
result.setSuccess(false); result.setSuccess(false);
if(obj.getString("message")!=null&&obj.getString("message")!="") { if(obj.getString("message")!=null&& !Objects.equals(obj.getString("message"), "")) {
result.setErrorMessage(obj.getString("message")); result.setErrorMessage(obj.getString("message"));
}else { }else {
result.setErrorMessage("System Error"); result.setErrorMessage("System Error");
@@ -44,7 +69,7 @@ public class SendEmailService {
public ServiceResult sendEmailTemplates(HttpServletRequest request,JSONObject temp) throws Exception { public ServiceResult sendEmailTemplates(HttpServletRequest request,JSONObject temp) throws Exception {
ServiceResult result = new ServiceResult(); ServiceResult result = new ServiceResult();
JSONObject requestObj = temp; JSONObject requestObj = temp;
HttpResponseResult httpResult = HttpUtil.invokeGatewayAPI(requestObj, "POST", request, null, apiGatewaySetting); HttpResponseResult httpResult = HttpUtil.invokeGatewayEmailAPI(requestObj, "POST", request, null, apiGatewaySetting);
String content = httpResult.getResponseContent(); String content = httpResult.getResponseContent();
JSONObject obj = JSONObject.parseObject(content); JSONObject obj = JSONObject.parseObject(content);
if(obj.getBooleanValue("success")) { if(obj.getBooleanValue("success")) {
@@ -53,7 +78,7 @@ public class SendEmailService {
result.setReturnData(getData); result.setReturnData(getData);
}else { }else {
result.setSuccess(false); result.setSuccess(false);
if(obj.getString("message")!=null&&obj.getString("message")!="") { if(obj.getString("message")!=null&& !Objects.equals(obj.getString("message"), "")) {
result.setErrorMessage(obj.getString("message")); result.setErrorMessage(obj.getString("message"));
}else { }else {
result.setErrorMessage("System Error"); result.setErrorMessage("System Error");
@@ -245,6 +245,8 @@ public class BookingsView implements Serializable {
private String approverName; private String approverName;
@Column(name = "approval_reason") @Column(name = "approval_reason")
private String approvalReason; private String approvalReason;
@Column(name = "booking_approval_reason")
private String bookingApprovalReason;
@Transient @Transient
private String status; private String status;
@@ -701,7 +701,7 @@ public class BookingService {
if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchFirstName())) { if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchFirstName())) {
list.add(cb.like(cb.upper(root.get("memberLastName")), list.add(cb.like(cb.upper(root.get("memberLastName")),
"%" + ", " + otherPropertyPageRequest.getSearchFirstName().toUpperCase() + "%")); "%" + otherPropertyPageRequest.getSearchFirstName().toUpperCase() + "%"));
} }
if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchConfirmationNo())) { if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchConfirmationNo())) {
@@ -817,11 +817,11 @@ public class BookingService {
} }
if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchSourceCode())) { if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchSourceCode())) {
list.add(cb.equal(cb.upper(root.get("dlSourceId")), list.add(cb.equal(cb.upper(root.get("sourceCode")),
otherPropertyPageRequest.getSearchSourceCode().toUpperCase())); otherPropertyPageRequest.getSearchSourceCode().toUpperCase()));
} }
if (StringUtils.isNotBlank(otherPropertyPageRequest.getPropertyName())) { if (StringUtils.isNotBlank(otherPropertyPageRequest.getPropertyName()) && !"ALL".equalsIgnoreCase(otherPropertyPageRequest.getPropertyName())) {
list.add(cb.like(cb.upper(root.get("propertyName")), list.add(cb.like(cb.upper(root.get("propertyName")),
"%" + otherPropertyPageRequest.getPropertyName().toUpperCase() + "%")); "%" + otherPropertyPageRequest.getPropertyName().toUpperCase() + "%"));
} }
@@ -832,7 +832,7 @@ public class BookingService {
} }
if (StringUtils.isNotBlank(otherPropertyPageRequest.getRoomTypeName())) { if (StringUtils.isNotBlank(otherPropertyPageRequest.getRoomTypeName())) {
list.add(cb.like(cb.upper(root.get("roomTypeName")), list.add(cb.like(cb.upper(root.get("room")),
"%" + otherPropertyPageRequest.getRoomTypeName().toUpperCase() + "%")); "%" + otherPropertyPageRequest.getRoomTypeName().toUpperCase() + "%"));
} }