From dde0d6082597e452dec842f36498880858d7660c Mon Sep 17 00:00:00 2001 From: Mauve Date: Mon, 12 Oct 2026 15:16:50 +0800 Subject: [PATCH] update --- .../export/export_exception_daylight.json | 56 +++++- .../excel_define/export/export_waitlist.json | 2 +- .../export/export_waitlist_gaming.json | 2 +- .../import/import_exception_daylight.json | 145 ++++++++++++++++ .../import/import_item_inventory.json | 3 +- .../import/import_room_criteria.json | 2 +- .../import/import_waitlist_criteria.json | 2 +- pom.xml | 1 + .../request/SysGroupDeleteByIdRequest.java | 2 +- .../mcrm/admin/services/PlayerService.java | 18 +- .../mcrm/admin/services/SysGroupService.java | 16 ++ .../mcrm/admin/services/SysUserService.java | 2 +- .../models/CfgAppChannelDaylight.java | 7 + .../DaylightRoomTypeAllotmentDao.java | 2 +- .../services/OtherAllotmentService.java | 2 +- .../services/RoomCriteriaDaylightService.java | 13 +- .../services/RoomCriteriaService.java | 18 +- .../controllers/LoginController.java | 3 + .../authorization/utils/JwtTokenUtil.java | 7 +- .../ExceptionDaylightController.java | 118 ++++++++++--- .../controllers/ItemInventoryController.java | 3 +- .../dtos/CfgExceptionDaylightViewDto.java | 10 ++ .../CreateUpdateExceptionDaylightRequest.java | 9 + .../CfgExceptionDaylightResponse.java | 12 ++ .../mappers/CfgExceptionDaylightMapper.java | 3 + .../models/CfgExceptionCompPreset.java | 29 ++++ .../daylight/models/CfgExceptionDaylight.java | 26 +++ .../models/CfgExceptionDaylightView.java | 24 ++- .../daylight/repositories/BlockCodeDao.java | 9 +- .../repositories/ExceptionCompPresetDao.java | 13 ++ .../daylight/services/DaylightService.java | 5 +- .../services/ExceptionDlMappingService.java | 124 +++++++++++--- .../services/ItemInventoryService.java | 3 + .../utils/ExceptionDaylightExcelSupport.java | 159 ++++++++++++++++++ .../property/dtos/CfgPropertiesDto.java | 1 + .../request/CreateUpdatePropertyRequest.java | 2 + .../property/models/CfgProperties.java | 3 + .../ExceptionDaylightImportRow.java | 38 +++++ .../common/dtos/excelmodel/ColumnDefine.java | 7 + .../common/httpclient/HttpClientExecutor.java | 8 +- .../common/httpclient/HttpRequestOptions.java | 51 +++--- .../mgm/mcrm/common/services/HttpService.java | 2 +- .../com/mgm/mcrm/common/utils/ExcelUtils.java | 9 + .../com/mgm/mcrm/common/utils/HttpUtil.java | 12 +- .../CfgEmailTemplateDeleteByIdRequest.java | 2 +- .../services/SendEmailService.java | 37 +++- .../mcrm/reservation/models/BookingsView.java | 2 + .../reservation/services/BookingService.java | 8 +- 48 files changed, 880 insertions(+), 152 deletions(-) create mode 100644 crm_runtime/excel_define/import/import_exception_daylight.json create mode 100644 src/main/java/com/mgm/mcrm/basesetting/daylight/models/CfgExceptionCompPreset.java create mode 100644 src/main/java/com/mgm/mcrm/basesetting/daylight/repositories/ExceptionCompPresetDao.java create mode 100644 src/main/java/com/mgm/mcrm/basesetting/daylight/utils/ExceptionDaylightExcelSupport.java create mode 100644 src/main/java/com/mgm/mcrm/common/dtos/dataimport/appsetting/ExceptionDaylightImportRow.java diff --git a/crm_runtime/excel_define/export/export_exception_daylight.json b/crm_runtime/excel_define/export/export_exception_daylight.json index 614b7f0..5f1f6f2 100644 --- a/crm_runtime/excel_define/export/export_exception_daylight.json +++ b/crm_runtime/excel_define/export/export_exception_daylight.json @@ -63,8 +63,62 @@ "attrName": "marketCodeName", "dataType": "String", "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 } ] }] }] -} \ No newline at end of file +} diff --git a/crm_runtime/excel_define/export/export_waitlist.json b/crm_runtime/excel_define/export/export_waitlist.json index 9ad3db3..7ca0537 100644 --- a/crm_runtime/excel_define/export/export_waitlist.json +++ b/crm_runtime/excel_define/export/export_waitlist.json @@ -14,7 +14,7 @@ "headerTextColor":"#000000", "textAlign":"left", "textColor":"#000000", - "objClassName": "com.mgm.mcrm.reservation.models.BookingsView", + "objClassName": "com.mgm.mcrm.reservation.dtos.BookingsViewDto", "columnDefs": [ { "columnHeader":"Waitlist Status", diff --git a/crm_runtime/excel_define/export/export_waitlist_gaming.json b/crm_runtime/excel_define/export/export_waitlist_gaming.json index bffa7a6..8d862ef 100644 --- a/crm_runtime/excel_define/export/export_waitlist_gaming.json +++ b/crm_runtime/excel_define/export/export_waitlist_gaming.json @@ -14,7 +14,7 @@ "headerTextColor":"#000000", "textAlign":"left", "textColor":"#000000", - "objClassName": "com.mgm.mcrm.reservation.models.BookingsView", + "objClassName": "com.mgm.mcrm.reservation.dtos.BookingsViewDto", "columnDefs": [ { "columnHeader":"Waitlist Status", diff --git a/crm_runtime/excel_define/import/import_exception_daylight.json b/crm_runtime/excel_define/import/import_exception_daylight.json new file mode 100644 index 0000000..1b75307 --- /dev/null +++ b/crm_runtime/excel_define/import/import_exception_daylight.json @@ -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" + } + ] + } + ] + } + ] +} diff --git a/crm_runtime/excel_define/import/import_item_inventory.json b/crm_runtime/excel_define/import/import_item_inventory.json index 51e083d..ddbb60d 100644 --- a/crm_runtime/excel_define/import/import_item_inventory.json +++ b/crm_runtime/excel_define/import/import_item_inventory.json @@ -47,6 +47,7 @@ }, { "columnHeader": "Category", + "optionalHeader": true, "attrName": "category", "dataType": "String", "columnWidth": 50 @@ -56,4 +57,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/crm_runtime/excel_define/import/import_room_criteria.json b/crm_runtime/excel_define/import/import_room_criteria.json index 9769f20..40a4a64 100644 --- a/crm_runtime/excel_define/import/import_room_criteria.json +++ b/crm_runtime/excel_define/import/import_room_criteria.json @@ -5,7 +5,7 @@ "dataElements": [{ "offsetRow": 2, "offsetCol": 0, - "objClassName": "com.mgm.mcrm.common.dtos.dataimport.appsetting.RoomCriteriaImportRow", + "objClassName": "com.mgm.mcrm.allotment.dtos.request.RoomCriteriaImportRowRequest", "columnDefs": [{ "columnHeader":"Property", "attrName": "propertyName", diff --git a/crm_runtime/excel_define/import/import_waitlist_criteria.json b/crm_runtime/excel_define/import/import_waitlist_criteria.json index 43404bc..b01b381 100644 --- a/crm_runtime/excel_define/import/import_waitlist_criteria.json +++ b/crm_runtime/excel_define/import/import_waitlist_criteria.json @@ -5,7 +5,7 @@ "dataElements": [{ "offsetRow": 2, "offsetCol": 0, - "objClassName": "com.mgm.mcrm.common.dtos.dataimport.appsetting.RoomCriteriaImportRow", + "objClassName": "com.mgm.mcrm.allotment.dtos.request.RoomCriteriaImportRowRequest", "columnDefs": [{ "columnHeader":"Property", "attrName": "propertyName", diff --git a/pom.xml b/pom.xml index 6bec4b9..22b8f08 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,7 @@ UTF-8 21 + 11.0.25 4.2.18.Final 5.6.4 5.2.3 diff --git a/src/main/java/com/mgm/mcrm/admin/dtos/request/SysGroupDeleteByIdRequest.java b/src/main/java/com/mgm/mcrm/admin/dtos/request/SysGroupDeleteByIdRequest.java index 71129d3..730a43c 100644 --- a/src/main/java/com/mgm/mcrm/admin/dtos/request/SysGroupDeleteByIdRequest.java +++ b/src/main/java/com/mgm/mcrm/admin/dtos/request/SysGroupDeleteByIdRequest.java @@ -9,5 +9,5 @@ import lombok.Setter; @NoArgsConstructor public class SysGroupDeleteByIdRequest { - private Long Id; + private Long id; } diff --git a/src/main/java/com/mgm/mcrm/admin/services/PlayerService.java b/src/main/java/com/mgm/mcrm/admin/services/PlayerService.java index 27876aa..2dc5885 100644 --- a/src/main/java/com/mgm/mcrm/admin/services/PlayerService.java +++ b/src/main/java/com/mgm/mcrm/admin/services/PlayerService.java @@ -200,22 +200,6 @@ public class PlayerService { String content = httpResult.getResponseContent(); JSONObject obj = new JSONObject(); 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 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")) { result.setSuccess(true); Object getData = obj.get("data"); @@ -228,7 +212,7 @@ public class PlayerService { result.setErrorMessage("System Error"); } } - } + return result; } diff --git a/src/main/java/com/mgm/mcrm/admin/services/SysGroupService.java b/src/main/java/com/mgm/mcrm/admin/services/SysGroupService.java index 1915699..af9b5e3 100644 --- a/src/main/java/com/mgm/mcrm/admin/services/SysGroupService.java +++ b/src/main/java/com/mgm/mcrm/admin/services/SysGroupService.java @@ -44,6 +44,7 @@ import com.google.gson.Gson; import com.mgm.mcrm.common.utils.DaoUtil; import com.mgm.mcrm.common.utils.LogUtil; +import org.springframework.transaction.annotation.Transactional; @Service public class SysGroupService { @@ -257,6 +258,20 @@ public class SysGroupService { return validGroupNames; } + public String getFullGroupNames() { + String validGroupNames =""; + List 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) { AssignGroupDataAccess accessInfo = null; if(groupId !=null) { @@ -347,6 +362,7 @@ public class SysGroupService { return isFind; } + @Transactional public String assignGroupDataAccess(SysGroupSaveAccessSettingRequest sysGroupSaveAccessSettingRequest) { String resMessage=""; Long groupId = sysGroupSaveAccessSettingRequest.getGroupId(); diff --git a/src/main/java/com/mgm/mcrm/admin/services/SysUserService.java b/src/main/java/com/mgm/mcrm/admin/services/SysUserService.java index a56313d..9e2fa36 100644 --- a/src/main/java/com/mgm/mcrm/admin/services/SysUserService.java +++ b/src/main/java/com/mgm/mcrm/admin/services/SysUserService.java @@ -347,7 +347,7 @@ public class SysUserService { String token = request.getHeader("Authorization"); token = token.substring(7); 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)) { return true; } diff --git a/src/main/java/com/mgm/mcrm/allotment/models/CfgAppChannelDaylight.java b/src/main/java/com/mgm/mcrm/allotment/models/CfgAppChannelDaylight.java index feaed8b..2fac1cc 100644 --- a/src/main/java/com/mgm/mcrm/allotment/models/CfgAppChannelDaylight.java +++ b/src/main/java/com/mgm/mcrm/allotment/models/CfgAppChannelDaylight.java @@ -27,4 +27,11 @@ public class CfgAppChannelDaylight implements Serializable { private Integer pickedUp; @Column(name="available") private Integer available; + + @PostLoad + public void postLoad() { + if (channelTotal == null) channelTotal = 0; + if (pickedUp == null) pickedUp = 0; + if (available == null) available = 0; + } } diff --git a/src/main/java/com/mgm/mcrm/allotment/repositories/DaylightRoomTypeAllotmentDao.java b/src/main/java/com/mgm/mcrm/allotment/repositories/DaylightRoomTypeAllotmentDao.java index 7f90b4e..5c8292a 100644 --- a/src/main/java/com/mgm/mcrm/allotment/repositories/DaylightRoomTypeAllotmentDao.java +++ b/src/main/java/com/mgm/mcrm/allotment/repositories/DaylightRoomTypeAllotmentDao.java @@ -23,7 +23,7 @@ public interface DaylightRoomTypeAllotmentDao extends JpaRepository cacheDlBlockCodeMapping(){ + private Map cacheDlBlockCodeMapping(Long propertyId){ Map cacheData = new HashMap(); - List dlBlockCodes = blockCodeDao.findAllByDlBlockIdIsNotNull(); + List dlBlockCodes = blockCodeDao.findAllByPropertyIdAndDlBlockIdIsNotNull(propertyId); for(CfgBlockCodes blockCode: dlBlockCodes){ cacheData.put(blockCode.getDlBlockId(),blockCode.getId()); } @@ -1350,7 +1347,7 @@ public class RoomCriteriaDaylightService { MappingDataCache cacheMapping = new MappingDataCache(); cacheMapping.setCacheRoomTypeIds(this.cacheDlRoomTypeMapping()); cacheMapping.setCachePropertyRoomCate(this.cachePropertyRoomCategory(propertyId)); - cacheMapping.setCacheBlockCodes(this.cacheDlBlockCodeMapping()); + cacheMapping.setCacheBlockCodes(this.cacheDlBlockCodeMapping(propertyId)); String url = "/api-gateway/data-api/v1/blocks/availability"; Header[] headers = HttpHeaderBuilder.create() @@ -1359,7 +1356,7 @@ public class RoomCriteriaDaylightService { .build(); Map 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("endDate", syncRequest.getToDate()); diff --git a/src/main/java/com/mgm/mcrm/allotment/services/RoomCriteriaService.java b/src/main/java/com/mgm/mcrm/allotment/services/RoomCriteriaService.java index 133ec95..6dc1989 100644 --- a/src/main/java/com/mgm/mcrm/allotment/services/RoomCriteriaService.java +++ b/src/main/java/com/mgm/mcrm/allotment/services/RoomCriteriaService.java @@ -3,14 +3,8 @@ package com.mgm.mcrm.allotment.services; import java.text.SimpleDateFormat; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Calendar; +import java.util.*; 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.CfgOtherAppChannelDto; @@ -329,7 +323,7 @@ public class RoomCriteriaService { if(dow!=null) { for(int i=0;i importRows) throws Exception { + @RequestBody(required = false) List importRows) throws Exception { AjaxResult processResult = new AjaxResult(); if (importRows == null || importRows.size() <= 0) { processResult.setSuccess(false); @@ -234,27 +244,93 @@ public class ExceptionDaylightController { 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 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 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 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(); - boolean success = true; String errorMessage = ""; - String errorCode = ""; - //-- - if (!"CREATE".equals(operateType)) { - String userId = null; - if (operaObj instanceof CfgExceptionDaylight) { - userId = ((CfgExceptionDaylight) operaObj).getUserId(); - } else if (operaObj instanceof CreateUpdateExceptionDaylightRequest) { - userId = ((CreateUpdateExceptionDaylightRequest) operaObj).getUserId(); - } - if (StringUtils.isBlank(userId)) { - success = false; - errorCode = ExceptionDaylightResponseFactory.CODE_ERR_ILLEGAL_DATA; - errorMessage = "User ID can't be empty"; + if (request.getSoftLimit() != null) { + request.setSoftLimit(request.getSoftLimit().trim()); + } + + if (StringUtils.isBlank(request.getUserId())) { + errorMessage = "User ID can't be empty"; + } else if (request.getCompRuleCategory() != null + && request.getCompRuleCategory() != 1 && request.getCompRuleCategory() != 2) { + errorMessage = "Category must be 1 or 2"; + } else if (StringUtils.isNotBlank(request.getSoftLimit())) { + String softLimit = request.getSoftLimit().trim(); + if (softLimit.length() > 50 || !softLimit.matches("[0-9]+(?:\\.[0-9]*)?")) { + 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.setErrorCode(errorCode); + validateResult.setErrorCode(success ? "" : ExceptionDaylightResponseFactory.CODE_ERR_ILLEGAL_DATA); validateResult.setMessage(errorMessage); return validateResult; } diff --git a/src/main/java/com/mgm/mcrm/basesetting/daylight/controllers/ItemInventoryController.java b/src/main/java/com/mgm/mcrm/basesetting/daylight/controllers/ItemInventoryController.java index bbc7de3..72c02dc 100644 --- a/src/main/java/com/mgm/mcrm/basesetting/daylight/controllers/ItemInventoryController.java +++ b/src/main/java/com/mgm/mcrm/basesetting/daylight/controllers/ItemInventoryController.java @@ -323,13 +323,12 @@ public class ItemInventoryController { } ServiceResult importResult; Gson gson = new Gson(); + String json = gson.toJson(importRows); if ("DAYLIGHT".equalsIgnoreCase(category)) { - String json = gson.toJson(importRows); List daylightRows = gson.fromJson(json, new TypeToken>(){}.getType()); importResult = itemInventoryService.importDaylightBatch(daylightRows); } else { - String json = gson.toJson(importRows); List operaRows = gson.fromJson(json, new TypeToken>(){}.getType()); importResult = itemInventoryService.importBatch(operaRows); diff --git a/src/main/java/com/mgm/mcrm/basesetting/daylight/dtos/CfgExceptionDaylightViewDto.java b/src/main/java/com/mgm/mcrm/basesetting/daylight/dtos/CfgExceptionDaylightViewDto.java index b4e45e9..70ffcd1 100644 --- a/src/main/java/com/mgm/mcrm/basesetting/daylight/dtos/CfgExceptionDaylightViewDto.java +++ b/src/main/java/com/mgm/mcrm/basesetting/daylight/dtos/CfgExceptionDaylightViewDto.java @@ -1,6 +1,7 @@ package com.mgm.mcrm.basesetting.daylight.dtos; 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.CfgRateCodes; import com.mgm.mcrm.basesetting.daylight.models.CfgSourceCodes; @@ -10,6 +11,7 @@ import lombok.Data; import java.io.Serializable; import java.time.LocalDateTime; +import java.util.List; import java.util.Set; @Data @@ -22,6 +24,14 @@ public class CfgExceptionDaylightViewDto implements Serializable { private Long sourceCodeId; private Long marketCodeId; 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 cfgCompPresetList; private LocalDateTime createdAt; private String createdBy; private LocalDateTime updatedAt; diff --git a/src/main/java/com/mgm/mcrm/basesetting/daylight/dtos/request/CreateUpdateExceptionDaylightRequest.java b/src/main/java/com/mgm/mcrm/basesetting/daylight/dtos/request/CreateUpdateExceptionDaylightRequest.java index 20aa3a2..8ad2387 100644 --- a/src/main/java/com/mgm/mcrm/basesetting/daylight/dtos/request/CreateUpdateExceptionDaylightRequest.java +++ b/src/main/java/com/mgm/mcrm/basesetting/daylight/dtos/request/CreateUpdateExceptionDaylightRequest.java @@ -15,6 +15,15 @@ public class CreateUpdateExceptionDaylightRequest { private Long sourceCodeId; private Long marketCodeId; 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 dlCompPresetIds; + private List compPresetContents; private LocalDateTime createdAt; private String createdBy; private LocalDateTime updatedAt; diff --git a/src/main/java/com/mgm/mcrm/basesetting/daylight/dtos/response/CfgExceptionDaylightResponse.java b/src/main/java/com/mgm/mcrm/basesetting/daylight/dtos/response/CfgExceptionDaylightResponse.java index b4405fe..6455a02 100644 --- a/src/main/java/com/mgm/mcrm/basesetting/daylight/dtos/response/CfgExceptionDaylightResponse.java +++ b/src/main/java/com/mgm/mcrm/basesetting/daylight/dtos/response/CfgExceptionDaylightResponse.java @@ -1,6 +1,7 @@ package com.mgm.mcrm.basesetting.daylight.dtos.response; 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.CfgRateCodes; import com.mgm.mcrm.basesetting.daylight.models.CfgSourceCodes; @@ -9,6 +10,7 @@ import com.mgm.mcrm.basesetting.room.models.CfgRoomTypes; import lombok.Data; import java.time.LocalDateTime; +import java.util.List; import java.util.Set; @Data @@ -22,6 +24,14 @@ public class CfgExceptionDaylightResponse { private Long sourceCodeId; private Long marketCodeId; 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 cfgCompPresetList; private LocalDateTime createdAt; private String createdBy; private LocalDateTime updatedAt; @@ -45,6 +55,8 @@ public class CfgExceptionDaylightResponse { private Set daylightRoomType; //-- For export + private String compPresetContent; + private String compPresetId; private String propertyName; private String bookingTypeName; private String rateCodeName; diff --git a/src/main/java/com/mgm/mcrm/basesetting/daylight/mappers/CfgExceptionDaylightMapper.java b/src/main/java/com/mgm/mcrm/basesetting/daylight/mappers/CfgExceptionDaylightMapper.java index f0ecd5a..9a01613 100644 --- a/src/main/java/com/mgm/mcrm/basesetting/daylight/mappers/CfgExceptionDaylightMapper.java +++ b/src/main/java/com/mgm/mcrm/basesetting/daylight/mappers/CfgExceptionDaylightMapper.java @@ -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.models.CfgExceptionDaylightView; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; import java.util.List; @@ -20,6 +21,8 @@ public interface CfgExceptionDaylightMapper { * @param source 源視圖實體對象 * @return 轉換後的Response DTO */ + @Mapping(target = "compPresetContent", ignore = true) + @Mapping(target = "compPresetId", ignore = true) CfgExceptionDaylightResponse toResponse(CfgExceptionDaylightView source); /** diff --git a/src/main/java/com/mgm/mcrm/basesetting/daylight/models/CfgExceptionCompPreset.java b/src/main/java/com/mgm/mcrm/basesetting/daylight/models/CfgExceptionCompPreset.java new file mode 100644 index 0000000..fa4ae69 --- /dev/null +++ b/src/main/java/com/mgm/mcrm/basesetting/daylight/models/CfgExceptionCompPreset.java @@ -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; +} diff --git a/src/main/java/com/mgm/mcrm/basesetting/daylight/models/CfgExceptionDaylight.java b/src/main/java/com/mgm/mcrm/basesetting/daylight/models/CfgExceptionDaylight.java index 56c8b43..d83799c 100644 --- a/src/main/java/com/mgm/mcrm/basesetting/daylight/models/CfgExceptionDaylight.java +++ b/src/main/java/com/mgm/mcrm/basesetting/daylight/models/CfgExceptionDaylight.java @@ -9,6 +9,10 @@ import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; 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.Transient; @@ -36,6 +40,24 @@ public class CfgExceptionDaylight implements Serializable { private Long marketCodeId; @Column(name = "block_code_id") 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 cfgCompPresetList; @Column(name = "created_at") private LocalDateTime createdAt; @Column(name = "created_by") @@ -48,4 +70,8 @@ public class CfgExceptionDaylight implements Serializable { private List roomTypeIds; @Transient private List blockCodeIds; + @Transient + private List dlCompPresetIds; + @Transient + private List compPresetContents; } diff --git a/src/main/java/com/mgm/mcrm/basesetting/daylight/models/CfgExceptionDaylightView.java b/src/main/java/com/mgm/mcrm/basesetting/daylight/models/CfgExceptionDaylightView.java index 2116284..6395056 100644 --- a/src/main/java/com/mgm/mcrm/basesetting/daylight/models/CfgExceptionDaylightView.java +++ b/src/main/java/com/mgm/mcrm/basesetting/daylight/models/CfgExceptionDaylightView.java @@ -2,6 +2,7 @@ package com.mgm.mcrm.basesetting.daylight.models; import java.io.Serializable; import java.time.LocalDateTime; +import java.util.List; import java.util.Set; import com.mgm.mcrm.basesetting.property.models.CfgProperties; @@ -22,7 +23,8 @@ import org.hibernate.annotations.NotFoundAction; @NamedAttributeNode("rateCode"), @NamedAttributeNode("sourceCode"), @NamedAttributeNode("marketCode"), - @NamedAttributeNode("daylightRoomType") + @NamedAttributeNode("daylightRoomType"), + @NamedAttributeNode("cfgCompPresetList") } ) @Data @@ -62,6 +64,26 @@ public class CfgExceptionDaylightView implements Serializable { @Column(name = "block_id") 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 cfgCompPresetList; + @NotFound(action = NotFoundAction.IGNORE) @ManyToOne(fetch = FetchType.EAGER) diff --git a/src/main/java/com/mgm/mcrm/basesetting/daylight/repositories/BlockCodeDao.java b/src/main/java/com/mgm/mcrm/basesetting/daylight/repositories/BlockCodeDao.java index 3b7768e..3ebc8b8 100644 --- a/src/main/java/com/mgm/mcrm/basesetting/daylight/repositories/BlockCodeDao.java +++ b/src/main/java/com/mgm/mcrm/basesetting/daylight/repositories/BlockCodeDao.java @@ -11,6 +11,7 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.transaction.annotation.Transactional; public interface BlockCodeDao extends JpaRepository { @@ -34,5 +35,11 @@ public interface BlockCodeDao extends JpaRepository { CfgBlockCodes findByCode(String code); - List findAllByDlBlockIdIsNotNull(); + @Query(""" + SELECT c + FROM CfgBlockCodes c + WHERE c.propertyId = :propertyId + AND c.dlBlockId IS NOT NULL +""") + List findAllByPropertyIdAndDlBlockIdIsNotNull(@Param("propertyId") Long propertyId); } diff --git a/src/main/java/com/mgm/mcrm/basesetting/daylight/repositories/ExceptionCompPresetDao.java b/src/main/java/com/mgm/mcrm/basesetting/daylight/repositories/ExceptionCompPresetDao.java new file mode 100644 index 0000000..7d79769 --- /dev/null +++ b/src/main/java/com/mgm/mcrm/basesetting/daylight/repositories/ExceptionCompPresetDao.java @@ -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 { + + @Modifying + @Query("delete from CfgExceptionCompPreset preset where preset.exceptionDaylightMappingId = ?1") + int deleteByExceptionDaylightMappingId(Long exceptionDaylightMappingId); +} diff --git a/src/main/java/com/mgm/mcrm/basesetting/daylight/services/DaylightService.java b/src/main/java/com/mgm/mcrm/basesetting/daylight/services/DaylightService.java index 2f5618e..b42aae1 100644 --- a/src/main/java/com/mgm/mcrm/basesetting/daylight/services/DaylightService.java +++ b/src/main/java/com/mgm/mcrm/basesetting/daylight/services/DaylightService.java @@ -460,7 +460,10 @@ public class DaylightService { 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); } diff --git a/src/main/java/com/mgm/mcrm/basesetting/daylight/services/ExceptionDlMappingService.java b/src/main/java/com/mgm/mcrm/basesetting/daylight/services/ExceptionDlMappingService.java index 5d38c70..c597fa2 100644 --- a/src/main/java/com/mgm/mcrm/basesetting/daylight/services/ExceptionDlMappingService.java +++ b/src/main/java/com/mgm/mcrm/basesetting/daylight/services/ExceptionDlMappingService.java @@ -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.response.CfgExceptionDaylightResponse; 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.repositories.*; 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.ServiceResult; 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.utils.DaoUtil; 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.jpa.domain.Specification; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.ArrayList; @@ -51,6 +53,8 @@ public class ExceptionDlMappingService { @Resource private ExceptDlMappingRoomTypeDao exceptDlMappingRoomTypeDao; @Resource + private ExceptionCompPresetDao exceptionCompPresetDao; + @Resource private SectionDao sectionDao; @Resource private PropertyDao propertyDao; @@ -73,6 +77,7 @@ public class ExceptionDlMappingService { private SysUserDao sysUserDao; + @Transactional public ServiceResult createExceptionDaylight(CfgExceptionDaylight createRequest) { ServiceResult processResult = new ServiceResult(); LocalDateTime createDate = LocalDateTime.now(); @@ -98,6 +103,8 @@ public class ExceptionDlMappingService { exceptDlMappingRoomTypeDao.save(romType); } } + newExceptionOpera.setCfgCompPresetList(saveCompPresets(newExceptionOpera.getId(), + createRequest.getDlCompPresetIds(), createRequest.getCompPresetContents())); } } processResult.setSuccess(true); @@ -105,6 +112,7 @@ public class ExceptionDlMappingService { return processResult; } + @Transactional public ServiceResult updateExceptionDaylight(CreateUpdateExceptionDaylightRequest updateRequest) { ServiceResult processResult = new ServiceResult(); CfgExceptionDaylight existsType = exceptionDlMappingDao.findById(updateRequest.getId()).orElse(null); @@ -128,12 +136,35 @@ public class ExceptionDlMappingService { exceptDlMappingRoomTypeDao.save(roomType); } } + exceptionCompPresetDao.deleteByExceptionDaylightMappingId(existsType.getId()); + existsType.setCfgCompPresetList(saveCompPresets(existsType.getId(), + updateRequest.getDlCompPresetIds(), updateRequest.getCompPresetContents())); processResult.setReturnData(existsType); processResult.setSuccess(true); } return processResult; } + private List saveCompPresets(Long mappingId, List presetIds, + List presetContents) { + List 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) { return exceptionDaylightViewDao.findById(id); } @@ -266,7 +297,7 @@ public class ExceptionDlMappingService { private long getMatchPropertyId(List properties, String name) { long matchId = 0; 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(); break; } @@ -285,10 +316,11 @@ public class ExceptionDlMappingService { return matchId; } - private long getMatchRateCodeId(List rateCodes, String name) { + private long getMatchRateCodeId(List rateCodes, String name, Long propertyId) { long matchId = 0; 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(); break; } @@ -299,7 +331,7 @@ public class ExceptionDlMappingService { private long getMatchSourceCodeId(List sourceCodes, String name) { long matchId = 0; 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(); break; } @@ -310,7 +342,7 @@ public class ExceptionDlMappingService { private long getMatchMarketCodeId(List marketCodes, String name) { long matchId = 0; 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(); break; } @@ -318,10 +350,11 @@ public class ExceptionDlMappingService { return matchId; } - private long getMatchBlockCodeId(List blockCodes, String code) { + private long getMatchBlockCodeId(List blockCodes, String code, Long propertyId) { long matchId = 0; 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(); break; } @@ -329,10 +362,11 @@ public class ExceptionDlMappingService { return matchId; } - private long getMatchRoomTypeId(List roomTypes, String name) { + private long getMatchRoomTypeId(List roomTypes, String name, Long propertyId) { long matchId = 0; 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(); break; } @@ -340,24 +374,33 @@ public class ExceptionDlMappingService { return matchId; } - private ValidateResult validateImportData(List exceptionOperaList) { + private boolean matchesProperty(Integer candidatePropertyId, Long mappingPropertyId) { + return candidatePropertyId != null && mappingPropertyId != null + && candidatePropertyId.longValue() == mappingPropertyId.longValue(); + } + + private Specification daylightCategorySpec() { + return (root, query, cb) -> cb.equal(cb.upper(root.get("category")), "DAYLIGHT"); + } + + private ValidateResult validateImportData(List exceptionOperaList) { ValidateResult result = new ValidateResult(); int totalRows = 0; int failedRows = 0; int successRows = 0; if (!exceptionOperaList.isEmpty()) { totalRows = exceptionOperaList.size(); - List roomTypeList = roomTypeDao.findAll(); - List propertyList = propertyDao.findAll(); + List roomTypeList = roomTypeDao.findAll(daylightCategorySpec()); + List propertyList = propertyDao.findAll(daylightCategorySpec()); List bookingTypeList = bookingTypeDao.findAll(); - List rateCodeList = rateCodeDao.findAll(); - List sourceCodeList = sourceCodeDao.findAll(); - List marketCodeList = marketCodeDao.findAll(); - List blockCodeList = blockCodeDao.findAll(); + List rateCodeList = rateCodeDao.findAll(daylightCategorySpec()); + List sourceCodeList = sourceCodeDao.findAll(daylightCategorySpec()); + List marketCodeList = marketCodeDao.findAll(daylightCategorySpec()); + List blockCodeList = blockCodeDao.findAll(daylightCategorySpec()); for (int i = 0; i < exceptionOperaList.size(); i++) { String errMsg = ""; boolean isPassed = true; - ExceptionOperaImportRow pItem = exceptionOperaList.get(i); + ExceptionDaylightImportRow pItem = exceptionOperaList.get(i); if (StringUtils.isBlank(pItem.getUserId())) { errMsg += "User ID is blank;"; isPassed = false; @@ -395,11 +438,12 @@ public class ExceptionDlMappingService { errMsg += "Block Code is blank;"; isPassed = false; } else { - long blockCodeId = this.getMatchBlockCodeId(blockCodeList, pItem.getBlockCodeName()); + long blockCodeId = this.getMatchBlockCodeId(blockCodeList, pItem.getBlockCodeName(), pItem.getPropertyId()); if (blockCodeId > 0) { pItem.setBlockCodeId(blockCodeId); } else { - errMsg += "No match Block Code of [" + pItem.getBlockCodeName() + "];"; + errMsg += "No match DAYLIGHT Block Code of [" + pItem.getBlockCodeName() + + "] in Property [" + pItem.getPropertyName() + "];"; isPassed = false; } } @@ -407,11 +451,12 @@ public class ExceptionDlMappingService { errMsg += "Rate Code is blank;"; isPassed = false; } else { - long rateCodeId = this.getMatchRateCodeId(rateCodeList, pItem.getRateCodeName()); + long rateCodeId = this.getMatchRateCodeId(rateCodeList, pItem.getRateCodeName(), pItem.getPropertyId()); if (rateCodeId > 0) { pItem.setRateCodeId(rateCodeId); } else { - errMsg += "No match Rate Code of [" + pItem.getRateCodeName() + "];"; + errMsg += "No match DAYLIGHT Rate Code of [" + pItem.getRateCodeName() + + "] in Property [" + pItem.getPropertyName() + "];"; isPassed = false; } } @@ -445,10 +490,11 @@ public class ExceptionDlMappingService { for (String roomTypeVal : roomTypeVals) { roomTypeVal = roomTypeVal.trim(); if (StringUtils.isNotBlank(roomTypeVal)) { - long matchTypeId = this.getMatchRoomTypeId(roomTypeList, roomTypeVal); + long matchTypeId = this.getMatchRoomTypeId(roomTypeList, roomTypeVal, pItem.getPropertyId()); if (matchTypeId <= 0) { isPassed = false; - errMsg += "Room Type [" + roomTypeVal + "] not found;"; + errMsg += "DAYLIGHT Room Type [" + roomTypeVal + "] not found in Property [" + + pItem.getPropertyName() + "];"; } else { Long typeId = Long.valueOf(matchTypeId); 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.setErrorMessage(errMsg); if (isPassed) @@ -486,9 +537,16 @@ public class ExceptionDlMappingService { public ServiceResult parseImportExcel(String importFilePath) { ServiceResult result = new ServiceResult(); - String importName = "IMPORT_EXCEPTION_OPERA"; + String importName = "IMPORT_EXCEPTION_DAYLIGHT"; ImportDefine importDef = ExcelUtils.getImportDefineByName(importName); 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); if (!importResult.isSuccess()) { result.setSuccess(false); @@ -497,7 +555,7 @@ public class ExceptionDlMappingService { if (importResult.getReturnData() != null) { List dataList = (List) importResult.getReturnData(); if (dataList.size() > 0) { - List exceptionOperaList = (List) dataList.getFirst(); + List exceptionOperaList = (List) dataList.getFirst(); ValidateResult validateRes = validateImportData(exceptionOperaList); if (validateRes.getResultCount() > 0) { result.setSuccess(true); @@ -522,7 +580,8 @@ public class ExceptionDlMappingService { return result; } - public ServiceResult importBatch(List importRows) { + @Transactional + public ServiceResult importBatch(List importRows) { ServiceResult result = new ServiceResult(); if (importRows != null && importRows.size() > 0) { ValidateResult validateRes = validateImportData(importRows); @@ -530,7 +589,7 @@ public class ExceptionDlMappingService { LocalDateTime currentTime = LocalDateTime.now(); List newExceptionOperaRoomTypeList = new ArrayList(); for (int i = 0; i < importRows.size(); i++) { - ExceptionOperaImportRow pItem = importRows.get(i); + ExceptionDaylightImportRow pItem = importRows.get(i); CfgExceptionDaylight newExceptionOpera = new CfgExceptionDaylight(); newExceptionOpera.setPropertyId(pItem.getPropertyId()); newExceptionOpera.setUserId(pItem.getUserId()); @@ -541,9 +600,18 @@ public class ExceptionDlMappingService { newExceptionOpera.setSourceCodeId(pItem.getSourceCodeId()); newExceptionOpera.setMarketCodeId(pItem.getMarketCodeId()); 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); exceptionDlMappingDao.save(newExceptionOpera); Long newExceptionOperaId = newExceptionOpera.getId(); + newExceptionOpera.setCfgCompPresetList(saveCompPresets(newExceptionOperaId, + pItem.getDlCompPresetIds(), pItem.getCompPresetContents())); if (pItem.getRoomTypeIds() != null && pItem.getRoomTypeIds().size() > 0) { List operaRoomTypeIds = pItem.getRoomTypeIds(); for (Long roomTypeId : operaRoomTypeIds) { diff --git a/src/main/java/com/mgm/mcrm/basesetting/daylight/services/ItemInventoryService.java b/src/main/java/com/mgm/mcrm/basesetting/daylight/services/ItemInventoryService.java index 21246a9..485339d 100644 --- a/src/main/java/com/mgm/mcrm/basesetting/daylight/services/ItemInventoryService.java +++ b/src/main/java/com/mgm/mcrm/basesetting/daylight/services/ItemInventoryService.java @@ -395,6 +395,9 @@ public class ItemInventoryService { String errMsg = ""; boolean isPassed = true; ItemInventoryImportRow pItem = itemInventoryList.get(i); + if (StringUtils.isBlank(pItem.getCategory())) { + pItem.setCategory("OPERA"); + } if (StringUtils.isBlank(pItem.getIgtTierId())) { errMsg += "IGT Tier ID is blank"; isPassed = false; diff --git a/src/main/java/com/mgm/mcrm/basesetting/daylight/utils/ExceptionDaylightExcelSupport.java b/src/main/java/com/mgm/mcrm/basesetting/daylight/utils/ExceptionDaylightExcelSupport.java new file mode 100644 index 0000000..5b0fcce --- /dev/null +++ b/src/main/java/com/mgm/mcrm/basesetting/daylight/utils/ExceptionDaylightExcelSupport.java @@ -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 ids = parseCsvCell(row.getCompPresetId()); + List 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 parseCsvCell(String value) { + List 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; + } +} diff --git a/src/main/java/com/mgm/mcrm/basesetting/property/dtos/CfgPropertiesDto.java b/src/main/java/com/mgm/mcrm/basesetting/property/dtos/CfgPropertiesDto.java index 90769c2..f7057aa 100644 --- a/src/main/java/com/mgm/mcrm/basesetting/property/dtos/CfgPropertiesDto.java +++ b/src/main/java/com/mgm/mcrm/basesetting/property/dtos/CfgPropertiesDto.java @@ -23,4 +23,5 @@ public class CfgPropertiesDto { private Integer showCalendar; private String calendarName; private Integer calendarOrder; + private int displayType; } diff --git a/src/main/java/com/mgm/mcrm/basesetting/property/dtos/request/CreateUpdatePropertyRequest.java b/src/main/java/com/mgm/mcrm/basesetting/property/dtos/request/CreateUpdatePropertyRequest.java index b9d2c85..4fc9d0b 100644 --- a/src/main/java/com/mgm/mcrm/basesetting/property/dtos/request/CreateUpdatePropertyRequest.java +++ b/src/main/java/com/mgm/mcrm/basesetting/property/dtos/request/CreateUpdatePropertyRequest.java @@ -23,6 +23,8 @@ public class CreateUpdatePropertyRequest { private int status = 1; + private int displayType = 1; + private String calendarName; private Integer calendarOrder; diff --git a/src/main/java/com/mgm/mcrm/basesetting/property/models/CfgProperties.java b/src/main/java/com/mgm/mcrm/basesetting/property/models/CfgProperties.java index a406364..ead0693 100644 --- a/src/main/java/com/mgm/mcrm/basesetting/property/models/CfgProperties.java +++ b/src/main/java/com/mgm/mcrm/basesetting/property/models/CfgProperties.java @@ -59,4 +59,7 @@ public class CfgProperties implements Serializable { private String calendarName; @Column(name="calendar_order") private Integer calendarOrder; + + @Column(name = "display_type") + private int displayType; } diff --git a/src/main/java/com/mgm/mcrm/common/dtos/dataimport/appsetting/ExceptionDaylightImportRow.java b/src/main/java/com/mgm/mcrm/common/dtos/dataimport/appsetting/ExceptionDaylightImportRow.java new file mode 100644 index 0000000..9b3d316 --- /dev/null +++ b/src/main/java/com/mgm/mcrm/common/dtos/dataimport/appsetting/ExceptionDaylightImportRow.java @@ -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 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 dlCompPresetIds; + private List compPresetContents; + private String softLimit; +} diff --git a/src/main/java/com/mgm/mcrm/common/dtos/excelmodel/ColumnDefine.java b/src/main/java/com/mgm/mcrm/common/dtos/excelmodel/ColumnDefine.java index 2aa1366..9ab8243 100644 --- a/src/main/java/com/mgm/mcrm/common/dtos/excelmodel/ColumnDefine.java +++ b/src/main/java/com/mgm/mcrm/common/dtos/excelmodel/ColumnDefine.java @@ -12,6 +12,7 @@ public class ColumnDefine { private String formatVal; private String groupKeyAttrName; private boolean checkHeader=false; + private boolean optionalHeader=false; private int columnWidth=0; private int columnIndex=0; private int headerRowIdx=0; @@ -71,6 +72,12 @@ public class ColumnDefine { public void setCheckHeader(boolean checkHeader) { this.checkHeader = checkHeader; } + public boolean isOptionalHeader() { + return optionalHeader; + } + public void setOptionalHeader(boolean optionalHeader) { + this.optionalHeader = optionalHeader; + } public int getHeaderRowIdx() { return headerRowIdx; } diff --git a/src/main/java/com/mgm/mcrm/common/httpclient/HttpClientExecutor.java b/src/main/java/com/mgm/mcrm/common/httpclient/HttpClientExecutor.java index cb59a8e..ecaa353 100644 --- a/src/main/java/com/mgm/mcrm/common/httpclient/HttpClientExecutor.java +++ b/src/main/java/com/mgm/mcrm/common/httpclient/HttpClientExecutor.java @@ -12,6 +12,8 @@ import org.apache.hc.core5.http.Header; import org.apache.hc.core5.http.HttpEntity; import org.apache.hc.core5.http.NameValuePair; import org.apache.hc.core5.http.io.entity.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.nio.charset.Charset; import java.util.ArrayList; @@ -59,6 +61,8 @@ import com.mgm.mcrm.common.httpclient.HttpEntityBuilder; */ public class HttpClientExecutor { + private static final Logger log = LoggerFactory.getLogger(HttpClientExecutor.class); + private HttpClientExecutor() { // 工具类,禁止实例化 } @@ -181,7 +185,7 @@ public class HttpClientExecutor { url = url + "?" + query; } } - System.out.println(url); + log.info("Final GET request URL: {}", url); HttpGet httpGet = new HttpGet(url); setHeaders(httpGet, headers); setRequestConfig(httpGet, config); @@ -284,7 +288,7 @@ public class HttpClientExecutor { url = url + "?" + query; } } - System.out.println(url); + log.info("Final GET request URL: {}", url); HttpGet httpGet = new HttpGet(url); setHeaders(httpGet, headers); setRequestConfig(httpGet, options); diff --git a/src/main/java/com/mgm/mcrm/common/httpclient/HttpRequestOptions.java b/src/main/java/com/mgm/mcrm/common/httpclient/HttpRequestOptions.java index 6c64d97..e5b5342 100644 --- a/src/main/java/com/mgm/mcrm/common/httpclient/HttpRequestOptions.java +++ b/src/main/java/com/mgm/mcrm/common/httpclient/HttpRequestOptions.java @@ -90,19 +90,19 @@ public class HttpRequestOptions { private RequestConfig requestConfig; /** - * 解决多线程下载时,strean被close的问题 + * 当前请求的输出流 */ - private static final ThreadLocal outs = new ThreadLocal(); + private OutputStream out; /** - * 解决多线程处理时,url被覆盖问题 + * 当前请求的 URL */ - private static final ThreadLocal urls = new ThreadLocal(); + private String url; /** - * 解决多线程处理时,url被覆盖问题 + * 当前请求的参数,随实例保存,避免线程复用时混入上一次请求的数据 */ - private static final ThreadLocal> maps = new ThreadLocal>(); + private Map parameters; /** * @param client HttpClient对象 @@ -118,7 +118,7 @@ public class HttpRequestOptions { * @return 返回当前对象 */ public HttpRequestOptions url(String url) { - urls.set(url); + this.url = url; return this; } @@ -176,13 +176,13 @@ public class HttpRequestOptions { * @return 返回当前对象 */ public HttpRequestOptions map(Map map) { - Map m = maps.get(); - if(m == null || map.isEmpty()){ - m = map; - }else { - m.putAll(map); + if (map == null) { + parameters = null; + } else if (parameters == null || map.isEmpty()) { + parameters = new HashMap<>(map); + } else { + parameters.putAll(map); } - maps.set(m); return this; } @@ -192,9 +192,8 @@ public class HttpRequestOptions { */ public HttpRequestOptions json(String json) { this.json = json; - Map map = new HashMap(); - map.put(HttpEntityBuilder.ENTITY_JSON, json); - maps.set(map); + parameters = new HashMap<>(); + parameters.put(HttpEntityBuilder.ENTITY_JSON, json); return this; } @@ -222,14 +221,12 @@ public class HttpRequestOptions { * @return 返回当前对象 */ public HttpRequestOptions files(String[] filePaths, String inputName, boolean forceRemoveContentTypeChraset) { - Map m = maps.get(); - if(m == null || m.isEmpty()){ - m = new HashMap(); + if (parameters == null) { + parameters = new HashMap<>(); } - m.put(HttpEntityBuilder.ENTITY_MULTIPART, filePaths); - m.put(HttpEntityBuilder.ENTITY_MULTIPART+".name", inputName); - m.put(HttpEntityBuilder.ENTITY_MULTIPART+".rmCharset", forceRemoveContentTypeChraset); - maps.set(m); + parameters.put(HttpEntityBuilder.ENTITY_MULTIPART, filePaths); + parameters.put(HttpEntityBuilder.ENTITY_MULTIPART+".name", inputName); + parameters.put(HttpEntityBuilder.ENTITY_MULTIPART+".rmCharset", forceRemoveContentTypeChraset); return this; } @@ -264,7 +261,7 @@ public class HttpRequestOptions { * @return 返回当前对象 */ public HttpRequestOptions out(OutputStream out) { - outs.set(out); + this.out = out; return this; } @@ -320,7 +317,7 @@ public class HttpRequestOptions { } public String url() { - return urls.get(); + return url; } public HttpMethods method() { @@ -336,7 +333,7 @@ public class HttpRequestOptions { } public Map map() { - return maps.get(); + return parameters; } public String json() { @@ -356,7 +353,7 @@ public class HttpRequestOptions { } public OutputStream out() { - return outs.get(); + return out; } public RequestConfig requestConfig() { diff --git a/src/main/java/com/mgm/mcrm/common/services/HttpService.java b/src/main/java/com/mgm/mcrm/common/services/HttpService.java index dc8dfb0..652e0cd 100644 --- a/src/main/java/com/mgm/mcrm/common/services/HttpService.java +++ b/src/main/java/com/mgm/mcrm/common/services/HttpService.java @@ -65,7 +65,7 @@ public class HttpService { .client(httpClient); String result = HttpClientExecutor.get(options, supplementDaylightProxySecurity(headers)); - log.info("====== GET request result:{}", result); + log.info("====== GET request result length={}", result.length()); return result; } diff --git a/src/main/java/com/mgm/mcrm/common/utils/ExcelUtils.java b/src/main/java/com/mgm/mcrm/common/utils/ExcelUtils.java index eae29ad..db22841 100644 --- a/src/main/java/com/mgm/mcrm/common/utils/ExcelUtils.java +++ b/src/main/java/com/mgm/mcrm/common/utils/ExcelUtils.java @@ -170,6 +170,15 @@ public class ExcelUtils { for(int k=0; k= 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); colInfo.setColIndex(colIdx); masterFields.add(colInfo); diff --git a/src/main/java/com/mgm/mcrm/common/utils/HttpUtil.java b/src/main/java/com/mgm/mcrm/common/utils/HttpUtil.java index 35c394b..ab09ce1 100644 --- a/src/main/java/com/mgm/mcrm/common/utils/HttpUtil.java +++ b/src/main/java/com/mgm/mcrm/common/utils/HttpUtil.java @@ -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.io.PoolingHttpClientConnectionManager; 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.TrustAllStrategy; import org.apache.hc.core5.http.ContentType; import org.apache.hc.core5.http.HttpEntity; 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.io.entity.EntityUtils; import org.apache.hc.core5.http.message.BasicHeader; -import org.apache.hc.core5.ssl.SSLContextBuilder; import org.apache.hc.core5.util.Timeout; import org.springframework.web.multipart.MultipartFile; @@ -121,8 +118,8 @@ public class HttpUtil { return httpResult; } - public static HttpResponseResult invokeGatewayAPI(JSONObject requestContent, String requestMethod, - HttpServletRequest request, MultipartFile[] files, ApiGatewaySetting apiGatewaySetting) throws Exception { + public static HttpResponseResult invokeGatewayEmailAPI(JSONObject requestContent, String requestMethod, + HttpServletRequest request, MultipartFile[] files, ApiGatewaySetting apiGatewaySetting) throws Exception { String serverUrl = apiGatewaySetting.getBaseUrl(); int timeoutTime = apiGatewaySetting.getRequestTimeout(); @@ -308,12 +305,13 @@ public class HttpUtil { if(Strings.CI.startsWith(requestUrl, "https://")) { SSLContext sslContext = null; try { - sslContext = SSLContextBuilder.create().loadTrustMaterial(TrustAllStrategy.INSTANCE).build(); + //sslContext = SSLContextBuilder.create().loadTrustMaterial(TrustAllStrategy.INSTANCE).build(); + sslContext = getSSLContext(); } catch (Exception e) { e.printStackTrace(); } Registry registry = RegistryBuilder.create() - .register("https", new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE )) + .register("https", new SSLConnectionSocketFactory(sslContext, getTrustHandler())) .build(); PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); HttpClientBuilder httpClientBuilder = HttpClients.custom().setConnectionManager(connectionManager) diff --git a/src/main/java/com/mgm/mcrm/notification/dtos/Request/CfgEmailTemplateDeleteByIdRequest.java b/src/main/java/com/mgm/mcrm/notification/dtos/Request/CfgEmailTemplateDeleteByIdRequest.java index 04fe86e..98eb521 100644 --- a/src/main/java/com/mgm/mcrm/notification/dtos/Request/CfgEmailTemplateDeleteByIdRequest.java +++ b/src/main/java/com/mgm/mcrm/notification/dtos/Request/CfgEmailTemplateDeleteByIdRequest.java @@ -9,5 +9,5 @@ import lombok.Setter; @NoArgsConstructor public class CfgEmailTemplateDeleteByIdRequest { - private Long Id; + private Long id; } diff --git a/src/main/java/com/mgm/mcrm/notification/services/SendEmailService.java b/src/main/java/com/mgm/mcrm/notification/services/SendEmailService.java index 9aa11ac..bfb1029 100644 --- a/src/main/java/com/mgm/mcrm/notification/services/SendEmailService.java +++ b/src/main/java/com/mgm/mcrm/notification/services/SendEmailService.java @@ -1,16 +1,20 @@ package com.mgm.mcrm.notification.services; +import com.alibaba.fastjson.JSONArray; import com.mgm.mcrm.common.dtos.HttpResponseResult; import com.mgm.mcrm.common.dtos.ServiceResult; import com.mgm.mcrm.common.dtos.config.ApiGatewaySetting; +import com.mgm.mcrm.common.utils.DateTimeUtil; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; +import org.apache.commons.lang3.Strings; import org.springframework.stereotype.Service; import com.alibaba.fastjson.JSONObject; import com.mgm.mcrm.common.utils.HttpUtil; +import java.util.Objects; @Service @@ -23,14 +27,35 @@ public class SendEmailService { JSONObject requestObj = temp; HttpResponseResult httpResult = HttpUtil.invokeWebAPI(requestObj, "POST", request,null); String content = httpResult.getResponseContent(); - JSONObject obj = (JSONObject) JSONObject.parseObject(content); + JSONObject obj = JSONObject.parseObject(content); 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); - Object getData = obj.get("data"); - result.setReturnData(getData); + result.setReturnData(data); }else { 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")); }else { result.setErrorMessage("System Error"); @@ -44,7 +69,7 @@ public class SendEmailService { public ServiceResult sendEmailTemplates(HttpServletRequest request,JSONObject temp) throws Exception { ServiceResult result = new ServiceResult(); 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(); JSONObject obj = JSONObject.parseObject(content); if(obj.getBooleanValue("success")) { @@ -53,7 +78,7 @@ public class SendEmailService { result.setReturnData(getData); }else { 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")); }else { result.setErrorMessage("System Error"); diff --git a/src/main/java/com/mgm/mcrm/reservation/models/BookingsView.java b/src/main/java/com/mgm/mcrm/reservation/models/BookingsView.java index 783d70f..b47b466 100644 --- a/src/main/java/com/mgm/mcrm/reservation/models/BookingsView.java +++ b/src/main/java/com/mgm/mcrm/reservation/models/BookingsView.java @@ -245,6 +245,8 @@ public class BookingsView implements Serializable { private String approverName; @Column(name = "approval_reason") private String approvalReason; + @Column(name = "booking_approval_reason") + private String bookingApprovalReason; @Transient private String status; diff --git a/src/main/java/com/mgm/mcrm/reservation/services/BookingService.java b/src/main/java/com/mgm/mcrm/reservation/services/BookingService.java index 8dc57a2..feaa270 100644 --- a/src/main/java/com/mgm/mcrm/reservation/services/BookingService.java +++ b/src/main/java/com/mgm/mcrm/reservation/services/BookingService.java @@ -701,7 +701,7 @@ public class BookingService { if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchFirstName())) { list.add(cb.like(cb.upper(root.get("memberLastName")), - "%" + ", " + otherPropertyPageRequest.getSearchFirstName().toUpperCase() + "%")); + "%" + otherPropertyPageRequest.getSearchFirstName().toUpperCase() + "%")); } if (StringUtils.isNotBlank(otherPropertyPageRequest.getSearchConfirmationNo())) { @@ -817,11 +817,11 @@ public class BookingService { } 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())); } - if (StringUtils.isNotBlank(otherPropertyPageRequest.getPropertyName())) { + if (StringUtils.isNotBlank(otherPropertyPageRequest.getPropertyName()) && !"ALL".equalsIgnoreCase(otherPropertyPageRequest.getPropertyName())) { list.add(cb.like(cb.upper(root.get("propertyName")), "%" + otherPropertyPageRequest.getPropertyName().toUpperCase() + "%")); } @@ -832,7 +832,7 @@ public class BookingService { } 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() + "%")); }