From bf39b5dd037fda5b11f06ac4797b9e35cc6f1650 Mon Sep 17 00:00:00 2001 From: ParrySMS Date: Sun, 30 May 2021 16:01:51 +0800 Subject: [PATCH 1/9] add getPriceForSkuInSelectedPeriod,TODO:mathUtil FactorUnit*PriceString then sum to get the total price. --- DevelopLog.md | 21 ++-- .../retal/controller/VehicleController.java | 35 ++++-- .../retal/exception/PocketApiException.java | 2 +- .../retal/exception/ValidationException.java | 2 +- .../com/pocket/retal/model/ApiResult.java | 1 + .../retal/model/VehicleSkuWithPrice.java | 16 +++ .../model/{ => constant}/ParamsConst.java | 2 +- .../pocket/retal/model/dto/SkuPriceDTO.java | 17 +++ .../PocketResponseStatus.java | 2 +- .../model/enumeration/PriceFrequency.java | 39 +++++++ .../retal/repository/SkuRepository.java | 24 ++++ .../retal/repository/VehicleRepository.java | 2 +- .../pocket/retal/service/VehicleService.java | 103 +++++++++++++++++- .../java/com/pocket/retal/util/DateUtil.java | 31 ++++++ .../com/pocket/retal/util/ValidateUtil.java | 27 +++-- .../pocket/retal/util/ValidateUtilTest.java | 10 +- 16 files changed, 291 insertions(+), 43 deletions(-) create mode 100644 pocket-rental-company/src/main/java/com/pocket/retal/model/VehicleSkuWithPrice.java rename pocket-rental-company/src/main/java/com/pocket/retal/model/{ => constant}/ParamsConst.java (69%) create mode 100644 pocket-rental-company/src/main/java/com/pocket/retal/model/dto/SkuPriceDTO.java rename pocket-rental-company/src/main/java/com/pocket/retal/model/{ => enumeration}/PocketResponseStatus.java (91%) create mode 100644 pocket-rental-company/src/main/java/com/pocket/retal/model/enumeration/PriceFrequency.java diff --git a/DevelopLog.md b/DevelopLog.md index 7984e80..43101e5 100644 --- a/DevelopLog.md +++ b/DevelopLog.md @@ -114,24 +114,23 @@ https://docs.microsoft.com/zh-cn/azure/app-service/deploy-local-git?tabs=portal ## Final -Git Repository: https://github.com/ParrySMS/PocketRentalCompany/tree/develop -Solution design document: https://github.com/ParrySMS/PocketRentalCompany/blob/develop/software%20design%20document.md +Git Repository: https://github.com/ParrySMS/PocketRentalCompany/tree/develop -API Spec Swagger: http://demo-company.azurewebsites.net/swagger-ui.html#/ +Solution design document: https://github.com/ParrySMS/PocketRentalCompany/blob/develop/software%20design%20document.md -Test cases (Unit test): https://github.com/ParrySMS/PocketRentalCompany/tree/develop/pocket-rental-company/src/test/java/com/pocket/retal +API Spec Swagger: http://demo-company.azurewebsites.net/swagger-ui.html#/ -Tech introduction doc: https://github.com/ParrySMS/PocketRentalCompany/blob/develop/README.md +Test cases (Unit test): https://github.com/ParrySMS/PocketRentalCompany/tree/develop/pocket-rental-company/src/test/java/com/pocket/retal -More Details: +Tech introduction doc: https://github.com/ParrySMS/PocketRentalCompany/blob/develop/README.md -- The issues that have been done: https://github.com/ParrySMS/PocketRentalCompany/issues?q=is%3Aissue+assignee%3AParrySMS+ +More Details: -- The open issues that need to do: https://github.com/ParrySMS/PocketRentalCompany/issues +- The issues that have been done: https://github.com/ParrySMS/PocketRentalCompany/issues?q=is%3Aissue+assignee%3AParrySMS+ -- The releases: https://github.com/ParrySMS/PocketRentalCompany/releases +- The open issues that need to do: https://github.com/ParrySMS/PocketRentalCompany/issues -- SQL migration: https://github.com/ParrySMS/PocketRentalCompany/tree/develop/storage/db-sql-server/src/main/resources/db/migration +- The releases: https://github.com/ParrySMS/PocketRentalCompany/releases - +- SQL migration: https://github.com/ParrySMS/PocketRentalCompany/tree/develop/storage/db-sql-server/src/main/resources/db/migration diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/controller/VehicleController.java b/pocket-rental-company/src/main/java/com/pocket/retal/controller/VehicleController.java index 64ad62f..098ebd0 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/controller/VehicleController.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/controller/VehicleController.java @@ -3,6 +3,7 @@ import com.pocket.retal.model.ApiResult; import com.pocket.retal.model.dto.VehicleDTO; import com.pocket.retal.model.dto.VehicleSkuDTO; +import com.pocket.retal.model.VehicleSkuWithPrice; import com.pocket.retal.service.VehicleService; import com.pocket.retal.util.ValidateUtil; import io.swagger.annotations.Api; @@ -13,7 +14,6 @@ import java.text.ParseException; import java.util.Date; import java.util.List; -import java.util.Optional; @CrossOrigin @RestController @@ -31,18 +31,14 @@ public VehicleController(VehicleService vehicleService) { public ResponseEntity>> getVehicles( @RequestParam(value = "startDate", required = false) String startDateStr, @RequestParam(value = "endDate", required = false) String endDateStr) throws ParseException { - Optional opStartDate = ValidateUtil.parseDate(startDateStr); - Optional opEndDate = ValidateUtil.parseDate(endDateStr); - if (opStartDate.isPresent() && opEndDate.isPresent()) { - ValidateUtil.Friendly.assertFalse(opEndDate.get().before(opStartDate.get()), + Date startDate = ValidateUtil.parseDate(startDateStr); + Date endDate = ValidateUtil.parseDate(endDateStr); + if (startDate != null && endDate != null) { + ValidateUtil.Friendly.assertFalse(endDate.before(startDate), "endDate should not before startDate"); - - ValidateUtil.Friendly.assertFalse(opEndDate.get().equals(opStartDate.get()), + ValidateUtil.Friendly.assertFalse(endDate.equals(startDate), "endDate should not be the same as startDate"); } - - var startDate = opStartDate.orElse(null); - var endDate = opEndDate.orElse(null); return ApiResult.ok(vehicleService.getVehiclesWithDates(startDate, endDate)); } @@ -72,4 +68,23 @@ public ResponseEntity>> getAllSkusFromOneVehicle( ValidateUtil.notNull(pageSize, "pageSize"); return ApiResult.ok(vehicleService.getAllSkusFromOneVehicle(vehicleId, offset, pageSize)); } + + @GetMapping("/{vehicleId}/skus/{skuGuid}/price") + public ResponseEntity> getPriceForSkuInSelectedPeriod( + @RequestParam(value = "startDate") String startDateStr, + @RequestParam(value = "endDate") String endDateStr, + @PathVariable("vehicleId") int vehicleId, + @PathVariable("skuGuid") String skuGuid) throws ParseException { + Date startDate = ValidateUtil.parseDate(startDateStr, null, true); + Date endDate = ValidateUtil.parseDate(endDateStr, null, true); + ValidateUtil.Friendly.assertFalse(endDate.before(startDate), + "endDate should not before startDate"); + ValidateUtil.Friendly.assertFalse(endDate.equals(startDate), + "endDate should not be the same as startDate"); + ValidateUtil.min(vehicleId, 1, "vehicleId"); + ValidateUtil.notNullOrEmptyOrBlank(skuGuid, "skuGuid"); + ValidateUtil.IsValidUUID(skuGuid, "skuGuid"); + return ApiResult.ok(vehicleService.getPriceForSkuInSelectedPeriod(vehicleId, skuGuid, startDate, endDate)); + } + } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/exception/PocketApiException.java b/pocket-rental-company/src/main/java/com/pocket/retal/exception/PocketApiException.java index b5a2127..fc21cee 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/exception/PocketApiException.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/exception/PocketApiException.java @@ -1,7 +1,7 @@ package com.pocket.retal.exception; -import com.pocket.retal.model.PocketResponseStatus; +import com.pocket.retal.model.enumeration.PocketResponseStatus; public class PocketApiException extends RuntimeException { private PocketResponseStatus pocketResponseStatus; diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/exception/ValidationException.java b/pocket-rental-company/src/main/java/com/pocket/retal/exception/ValidationException.java index 0162aac..7bb02f1 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/exception/ValidationException.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/exception/ValidationException.java @@ -1,7 +1,7 @@ package com.pocket.retal.exception; -import com.pocket.retal.model.PocketResponseStatus; +import com.pocket.retal.model.enumeration.PocketResponseStatus; public class ValidationException extends PocketApiException { diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/ApiResult.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/ApiResult.java index 516129d..ec1a3d5 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/model/ApiResult.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/ApiResult.java @@ -1,5 +1,6 @@ package com.pocket.retal.model; +import com.pocket.retal.model.enumeration.PocketResponseStatus; import lombok.Builder; import org.springframework.http.ResponseEntity; diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/VehicleSkuWithPrice.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/VehicleSkuWithPrice.java new file mode 100644 index 0000000..46cd368 --- /dev/null +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/VehicleSkuWithPrice.java @@ -0,0 +1,16 @@ +package com.pocket.retal.model; + +import com.pocket.retal.model.dto.VehicleSkuDTO; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class VehicleSkuWithPrice extends VehicleSkuDTO { + String finalPrice; + String averageDailyPrice; +} diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/ParamsConst.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/constant/ParamsConst.java similarity index 69% rename from pocket-rental-company/src/main/java/com/pocket/retal/model/ParamsConst.java rename to pocket-rental-company/src/main/java/com/pocket/retal/model/constant/ParamsConst.java index 182d4fd..178a349 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/model/ParamsConst.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/constant/ParamsConst.java @@ -1,4 +1,4 @@ -package com.pocket.retal.model; +package com.pocket.retal.model.constant; public class ParamsConst { public static final int DB_DEFAULT_SELECT_PAGE_SIZE = 500; diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/SkuPriceDTO.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/SkuPriceDTO.java new file mode 100644 index 0000000..864bba6 --- /dev/null +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/SkuPriceDTO.java @@ -0,0 +1,17 @@ +package com.pocket.retal.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SkuPriceDTO { + String skuGuid; + int priceFrequencyId; + String price; + String frequencyType; +} diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/PocketResponseStatus.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/enumeration/PocketResponseStatus.java similarity index 91% rename from pocket-rental-company/src/main/java/com/pocket/retal/model/PocketResponseStatus.java rename to pocket-rental-company/src/main/java/com/pocket/retal/model/enumeration/PocketResponseStatus.java index 696e496..429e1fb 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/model/PocketResponseStatus.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/enumeration/PocketResponseStatus.java @@ -1,4 +1,4 @@ -package com.pocket.retal.model; +package com.pocket.retal.model.enumeration; public enum PocketResponseStatus { NORMAL("200200", ""), diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/enumeration/PriceFrequency.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/enumeration/PriceFrequency.java new file mode 100644 index 0000000..b55bdc0 --- /dev/null +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/enumeration/PriceFrequency.java @@ -0,0 +1,39 @@ +package com.pocket.retal.model.enumeration; + +import java.util.HashMap; +import java.util.Map; + +public enum PriceFrequency { + DAILY(1, "Daily"), + WEEKLY(2, "Weekly"), + MONTHLY(3, "Monthly"), + HALF_YEARLY(4, "Half-Yearly"), + YEARLY(5, "Yearly"), + ; + + public int getPriceFrequencyId() { + return priceFrequencyId; + } + + public String getFrequencyType() { + return frequencyType; + } + + private int priceFrequencyId; + private String frequencyType; + + PriceFrequency(int priceFrequencyId, String frequencyType) { + this.priceFrequencyId = priceFrequencyId; + this.frequencyType = frequencyType; + } + + public static Map getPriceFrequencyIdMapToFactorUnit(int defaultFactorUnit) { + return new HashMap<>() {{ + put(PriceFrequency.DAILY.getPriceFrequencyId(), 0); + put(PriceFrequency.WEEKLY.getPriceFrequencyId(), 0); + put(PriceFrequency.MONTHLY.getPriceFrequencyId(), 0); + put(PriceFrequency.HALF_YEARLY.getPriceFrequencyId(), 0); + put(PriceFrequency.YEARLY.getPriceFrequencyId(), 0); + }}; + } +} diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/repository/SkuRepository.java b/pocket-rental-company/src/main/java/com/pocket/retal/repository/SkuRepository.java index 83fc109..2546a12 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/repository/SkuRepository.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/repository/SkuRepository.java @@ -1,5 +1,6 @@ package com.pocket.retal.repository; +import com.pocket.retal.model.dto.SkuPriceDTO; import com.pocket.retal.model.dto.VehicleSkuDTO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; @@ -19,4 +20,27 @@ public interface SkuRepository { " offset #{pageSize} * #{offset} rows FETCH NEXT #{pageSize} rows ONLY" + ""}) List selectAllSkusFromOneVehicle(int vehicleId, int offset, int pageSize); + + @Select({""}) + List getSkuFrequencyPrice(String skuGuid, List priceFrequencyIdList); } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/repository/VehicleRepository.java b/pocket-rental-company/src/main/java/com/pocket/retal/repository/VehicleRepository.java index d998d60..4c3c1eb 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/repository/VehicleRepository.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/repository/VehicleRepository.java @@ -33,7 +33,7 @@ public interface VehicleRepository { " LEFT JOIN [pocket].[pocket_vehicle_description] AS t_description ON " + " t_vehicle.id = t_description.vehicle_id " + " " + - " " + + " " + " t_vehicle.id IN" + " " + " #{availableVehicleId} " + diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java b/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java index 99c811e..247f5f9 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java @@ -1,10 +1,17 @@ package com.pocket.retal.service; import com.pocket.retal.exception.PocketApiException; -import com.pocket.retal.model.*; +import com.pocket.retal.model.SkuAvailableDate; +import com.pocket.retal.model.SkuServiceDate; +import com.pocket.retal.model.TimeInterval; +import com.pocket.retal.model.VehicleSkuWithPrice; +import com.pocket.retal.model.constant.ParamsConst; import com.pocket.retal.model.dto.RentalScheduleVehicleSkuDTO; +import com.pocket.retal.model.dto.SkuPriceDTO; import com.pocket.retal.model.dto.VehicleDTO; import com.pocket.retal.model.dto.VehicleSkuDTO; +import com.pocket.retal.model.enumeration.PocketResponseStatus; +import com.pocket.retal.model.enumeration.PriceFrequency; import com.pocket.retal.repository.RentalScheduleRepository; import com.pocket.retal.repository.SkuRepository; import com.pocket.retal.repository.VehicleRepository; @@ -177,11 +184,10 @@ public List breakAvailableTimeInterval(TimeInterval serviceTimeInt // service take the mid part from available if (serviceTimeInterval.getStartDate().after(availableTimeInterval.getStartDate()) && serviceTimeInterval.getEndDate().before(availableTimeInterval.getEndDate())) { - TimeInterval nextAvailableTimeInterval = - TimeInterval.builder() - .startDate(DateUtil.getNextDay(serviceTimeInterval.getEndDate())) - .endDate(availableTimeInterval.getEndDate()) - .build(); + TimeInterval nextAvailableTimeInterval = TimeInterval.builder() + .startDate(DateUtil.getNextDay(serviceTimeInterval.getEndDate())) + .endDate(availableTimeInterval.getEndDate()) + .build(); availableTimeInterval.setEndDate( DateUtil.getLastDay(serviceTimeInterval.getStartDate())); @@ -233,4 +239,89 @@ public SkuAvailableDate buildFreeSkuAvailableDate(RentalScheduleVehicleSkuDTO sc .build(); } + + public VehicleSkuWithPrice getPriceForSkuInSelectedPeriod(int vehicleId, String skuGuid, Date startDate, Date endDate) { + // todo: count the day. + // count yearly, monthly, daily price + // sum + + int selectedPeriodDays = DateUtil.getDaysBetween(startDate, endDate); + if (selectedPeriodDays == 0) { + selectedPeriodDays = 1; + } + List priceFrequencyIdList = initPriceFrequencyIdList(selectedPeriodDays); + List skuPriceDTOList = skuRepository.getSkuFrequencyPrice(skuGuid, priceFrequencyIdList); + Map priceFrequencyIdMapToPriceString = skuPriceDTOList.stream().collect(Collectors.toMap( + SkuPriceDTO::getPriceFrequencyId, + SkuPriceDTO::getPrice)); + + Map priceFrequencyIdMapToFactorUnit = initPriceFrequencyIdMapToFactorUnit(selectedPeriodDays); + //todo: mathUtil FactorUnit*PriceString sum to get the total price. + return null; + } + + public void priceFrequencyIdMapIncrement(Map priceFrequencyIdMapToFactorUnit, int key, int incrementUnit) { + int value = priceFrequencyIdMapToFactorUnit.getOrDefault(key, 0); + priceFrequencyIdMapToFactorUnit.put(key, value + incrementUnit); + } + + private Map initPriceFrequencyIdMapToFactorUnit(int selectedPeriodDays) { + // mean 5 weeks + Map priceFrequencyIdMapToFactorUnit = PriceFrequency.getPriceFrequencyIdMapToFactorUnit(0); + + //split selectedPeriodDays into diff Frequency + LinkedHashMap dayUnitWithPriceFrequencyId = setUpDayUnitWithPriceFrequencyId(); + Set> entrySet = dayUnitWithPriceFrequencyId.entrySet(); + for (Map.Entry entry : entrySet) { + var dayUnit = entry.getKey(); + var priceFrequencyId = entry.getValue(); + while (selectedPeriodDays >= dayUnit) { + selectedPeriodDays -= dayUnit; + priceFrequencyIdMapIncrement( + priceFrequencyIdMapToFactorUnit, + priceFrequencyId, + 1); + } + } + return priceFrequencyIdMapToFactorUnit; + } + + private LinkedHashMap setUpDayUnitWithPriceFrequencyId() { + // the order of dayUnitWithPriceFrequencyId should be max to min + LinkedHashMap dayUnitWithPriceFrequencyId = new LinkedHashMap(); + dayUnitWithPriceFrequencyId.put(DateUtil.YEARLY_DAY_UNIT, PriceFrequency.YEARLY.getPriceFrequencyId()); + dayUnitWithPriceFrequencyId.put(DateUtil.HALF_YEARLY_DAY_UNIT, PriceFrequency.HALF_YEARLY.getPriceFrequencyId()); + dayUnitWithPriceFrequencyId.put(DateUtil.MONTHLY_DAY_UNIT, PriceFrequency.MONTHLY.getPriceFrequencyId()); + dayUnitWithPriceFrequencyId.put(DateUtil.WEEKLY_DAY_UNIT, PriceFrequency.WEEKLY.getPriceFrequencyId()); + dayUnitWithPriceFrequencyId.put(DateUtil.DAILY_DAY_UNIT, PriceFrequency.DAILY.getPriceFrequencyId()); + return dayUnitWithPriceFrequencyId; + } + + private Map getIntegerIntegerMap() { + return new HashMap<>() {{ + put(PriceFrequency.YEARLY.getPriceFrequencyId(), 0); + put(PriceFrequency.HALF_YEARLY.getPriceFrequencyId(), 0); + put(PriceFrequency.MONTHLY.getPriceFrequencyId(), 0); + put(PriceFrequency.WEEKLY.getPriceFrequencyId(), 0); + put(PriceFrequency.DAILY.getPriceFrequencyId(), 0); + }}; + } + + private List initPriceFrequencyIdList(int selectedPeriodDays) { + List priceFrequencyIdList = new ArrayList<>(); + priceFrequencyIdList.add(PriceFrequency.DAILY.getPriceFrequencyId()); + if (selectedPeriodDays >= DateUtil.WEEKLY_DAY_UNIT) { + priceFrequencyIdList.add(PriceFrequency.WEEKLY.getPriceFrequencyId()); + } + if (selectedPeriodDays >= DateUtil.MONTHLY_DAY_UNIT) { + priceFrequencyIdList.add(PriceFrequency.MONTHLY.getPriceFrequencyId()); + } + if (selectedPeriodDays >= DateUtil.HALF_YEARLY_DAY_UNIT) { + priceFrequencyIdList.add(PriceFrequency.HALF_YEARLY.getPriceFrequencyId()); + } + if (selectedPeriodDays >= DateUtil.YEARLY_DAY_UNIT) { + priceFrequencyIdList.add(PriceFrequency.YEARLY.getPriceFrequencyId()); + } + return priceFrequencyIdList; + } } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/util/DateUtil.java b/pocket-rental-company/src/main/java/com/pocket/retal/util/DateUtil.java index 7a9234b..70d0884 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/util/DateUtil.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/util/DateUtil.java @@ -4,6 +4,15 @@ import java.util.Date; public class DateUtil { + public static int DAILY_DAY_UNIT = 1; + public static int WEEKLY_DAY_UNIT = 7; + public static int MONTHLY_DAY_UNIT = 28; + public static int HALF_YEARLY_DAY_UNIT = 180; + public static int YEARLY_DAY_UNIT = 365; + public static int DAY_IN_MILLIS = 1000 * 3600 * 24; + public static int WEEK_IN_MILLIS = DAY_IN_MILLIS * WEEKLY_DAY_UNIT; + public static int MONTH_MIN_IN_MILLIS = DAY_IN_MILLIS * MONTHLY_DAY_UNIT; + public static Date getNextDay(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); @@ -17,4 +26,26 @@ public static Date getLastDay(Date date) { c.add(Calendar.DAY_OF_MONTH, -1); return c.getTime(); } + + public static int getIntervalBetween(Date date1, Date date2, int timeInMillis) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date1); + long time1 = cal.getTimeInMillis(); + cal.setTime(date2); + long time2 = cal.getTimeInMillis(); + long between = (time2 - time1) / timeInMillis; + return Integer.parseInt(String.valueOf(between)); + } + + public static int getDaysBetween(Date date1, Date date2) { + return getIntervalBetween(date1, date2, DAY_IN_MILLIS); + } + + public static int getWeeksBetween(Date date1, Date date2) { + return getIntervalBetween(date1, date2, WEEK_IN_MILLIS); + } + + public static int getMonthsBetween(Date date1, Date date2) { + return getIntervalBetween(date1, date2, MONTH_MIN_IN_MILLIS); + } } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/util/ValidateUtil.java b/pocket-rental-company/src/main/java/com/pocket/retal/util/ValidateUtil.java index 68cdc9c..5d9c428 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/util/ValidateUtil.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/util/ValidateUtil.java @@ -2,12 +2,13 @@ import com.pocket.retal.exception.PocketApiException; import com.pocket.retal.exception.ValidationException; -import com.pocket.retal.model.PocketResponseStatus; +import com.pocket.retal.model.enumeration.PocketResponseStatus; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Optional; +import java.util.UUID; public class ValidateUtil { private ValidateUtil() { @@ -27,9 +28,9 @@ public static void internalNotNull(T value) throws PocketApiException { } } - public static void notNullOrEmpty(String value, String paramName) throws ValidationException { - if (value == null || value.isEmpty()) { - throw new ValidationException(paramName + " should not be null or empty"); + public static void notNullOrEmptyOrBlank(String value, String paramName) throws ValidationException { + if (value == null || value.isEmpty() || value.isBlank()) { + throw new ValidationException(paramName + " should not be null or empty or blank"); } } @@ -45,16 +46,16 @@ public static void doubleMin(double value, double minimum, String paramName) thr } } - public static Optional parseDate(String dateString) throws ValidationException, ParseException { + public static Date parseDate(String dateString) throws ValidationException, ParseException { return parseDate(dateString, null, false); } - public static Optional parseDate(String dateString, Date defaultDate, boolean isThrowException) throws ValidationException, ParseException { + public static Date parseDate(String dateString, Date defaultDate, boolean isThrowException) throws ValidationException, ParseException { if (dateString == null || dateString.isEmpty() || dateString.isBlank()) { if (isThrowException) { throw new ValidationException("parse dateString error"); } - return Optional.empty(); + return defaultDate; } SimpleDateFormat formatter = new SimpleDateFormat(YMD_DATE_FORMAT); @@ -63,7 +64,17 @@ public static Optional parseDate(String dateString, Date defaultDate, bool if (validDate == defaultDate && isThrowException) { throw new ValidationException("parse date error"); } - return Optional.of(validDate); + return validDate; + } + + public static void IsValidUUID(String uuidString, String paramName) { + try { + UUID uuid = UUID.fromString(uuidString); + uuid = null; + //Friendly to Java garbage collection + } catch (IllegalArgumentException e) { + throw new ValidationException(paramName + "is not a valid uuid"); + } } public static class Friendly { diff --git a/pocket-rental-company/src/test/java/com/pocket/retal/util/ValidateUtilTest.java b/pocket-rental-company/src/test/java/com/pocket/retal/util/ValidateUtilTest.java index aedfcf4..3a881f7 100644 --- a/pocket-rental-company/src/test/java/com/pocket/retal/util/ValidateUtilTest.java +++ b/pocket-rental-company/src/test/java/com/pocket/retal/util/ValidateUtilTest.java @@ -23,13 +23,17 @@ void internalNotNull() { } @Test - void notNullOrEmpty() { + void notNullOrEmptyOrBlank() { assertThrows(ValidationException.class, () -> { - ValidateUtil.notNullOrEmpty(null, "null"); + ValidateUtil.notNullOrEmptyOrBlank(null, "null"); }); assertThrows(ValidationException.class, () -> { - ValidateUtil.notNullOrEmpty("", ""); + ValidateUtil.notNullOrEmptyOrBlank("", ""); + }); + + assertThrows(ValidationException.class, () -> { + ValidateUtil.notNullOrEmptyOrBlank(" ", ""); }); } From 0ee31d2be6ce6ad76e666f109694c269b27bf1c6 Mon Sep 17 00:00:00 2001 From: ParrySMS Date: Sun, 30 May 2021 16:55:12 +0800 Subject: [PATCH 2/9] finish getVehicleSkuWithPriceInSelectedPeriod --- .../retal/controller/VehicleController.java | 4 +- .../retal/model/VehicleSkuWithPrice.java | 15 +++- .../retal/repository/SkuRepository.java | 11 +++ .../pocket/retal/service/VehicleService.java | 73 ++++++++++++++----- .../java/com/pocket/retal/util/MathUtil.java | 66 +++++++++++++++++ 5 files changed, 144 insertions(+), 25 deletions(-) create mode 100644 pocket-rental-company/src/main/java/com/pocket/retal/util/MathUtil.java diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/controller/VehicleController.java b/pocket-rental-company/src/main/java/com/pocket/retal/controller/VehicleController.java index 098ebd0..87ad012 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/controller/VehicleController.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/controller/VehicleController.java @@ -70,7 +70,7 @@ public ResponseEntity>> getAllSkusFromOneVehicle( } @GetMapping("/{vehicleId}/skus/{skuGuid}/price") - public ResponseEntity> getPriceForSkuInSelectedPeriod( + public ResponseEntity> getVehicleSkuWithPriceInSelectedPeriod( @RequestParam(value = "startDate") String startDateStr, @RequestParam(value = "endDate") String endDateStr, @PathVariable("vehicleId") int vehicleId, @@ -84,7 +84,7 @@ public ResponseEntity> getPriceForSkuInSelectedPe ValidateUtil.min(vehicleId, 1, "vehicleId"); ValidateUtil.notNullOrEmptyOrBlank(skuGuid, "skuGuid"); ValidateUtil.IsValidUUID(skuGuid, "skuGuid"); - return ApiResult.ok(vehicleService.getPriceForSkuInSelectedPeriod(vehicleId, skuGuid, startDate, endDate)); + return ApiResult.ok(vehicleService.getVehicleSkuWithPriceInSelectedPeriod(vehicleId, skuGuid, startDate, endDate)); } } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/VehicleSkuWithPrice.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/VehicleSkuWithPrice.java index 46cd368..bf43340 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/model/VehicleSkuWithPrice.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/VehicleSkuWithPrice.java @@ -1,7 +1,6 @@ package com.pocket.retal.model; import com.pocket.retal.model.dto.VehicleSkuDTO; -import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @@ -9,8 +8,18 @@ @Data @Builder @NoArgsConstructor -@AllArgsConstructor public class VehicleSkuWithPrice extends VehicleSkuDTO { - String finalPrice; + String skuPrice; String averageDailyPrice; + + public VehicleSkuWithPrice(int vehicleId, String skuGuid, String color, String skuPrice, String averageDailyPrice) { + super(vehicleId, skuGuid, color); + this.skuPrice = skuPrice; + this.averageDailyPrice = averageDailyPrice; + } + + public VehicleSkuWithPrice(String skuPrice, String averageDailyPrice) { + this.skuPrice = skuPrice; + this.averageDailyPrice = averageDailyPrice; + } } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/repository/SkuRepository.java b/pocket-rental-company/src/main/java/com/pocket/retal/repository/SkuRepository.java index 2546a12..9d5513a 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/repository/SkuRepository.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/repository/SkuRepository.java @@ -43,4 +43,15 @@ public interface SkuRepository { " " + ""}) List getSkuFrequencyPrice(String skuGuid, List priceFrequencyIdList); + + @Select({""}) + VehicleSkuDTO selectOneSku(int vehicleId, String skuGuid); } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java b/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java index 247f5f9..8ae1189 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java @@ -16,11 +16,21 @@ import com.pocket.retal.repository.SkuRepository; import com.pocket.retal.repository.VehicleRepository; import com.pocket.retal.util.DateUtil; +import com.pocket.retal.util.MathUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; @Service @@ -121,6 +131,14 @@ public List getAllSkusFromOneVehicle(int vehicleId, int offset, i return skuList; } + public VehicleSkuDTO getOneSku(int vehicleId, String skuGuid) { + VehicleSkuDTO vehicleSkuDTO = skuRepository.selectOneSku(vehicleId, skuGuid); + if (vehicleSkuDTO == null) { + throw new PocketApiException(PocketResponseStatus.SYSTEM_INTERNAL_ERROR, "selectOneSku but vehicleSkuDTO null"); + } + return vehicleSkuDTO; + } + public List getRentalScheduleVehicleSkus(Date startDate, Date endDate) { List rentalScheduleVehicleSkus = rentalScheduleRepository.getRentalScheduleVehicleSkus(startDate, endDate); if (rentalScheduleVehicleSkus == null) { @@ -134,8 +152,7 @@ public void fixSkuAvailableDate(Map skuGuidMapSkuAvail var skuGuid = skuServiceDate.getSkuGuid(); var skuAvailableDate = skuGuidMapSkuAvailableDate.get(skuGuid); if (skuAvailableDate == null) { - log.error("fixSkuAvailableDate but skuAvailableDate is null"); - throw new PocketApiException(PocketResponseStatus.SYSTEM_INTERNAL_ERROR); + throw new PocketApiException(PocketResponseStatus.SYSTEM_INTERNAL_ERROR, "fixSkuAvailableDate but skuAvailableDate is null"); } List finalAvailableTimeIntervalList = skuAvailableDate.getAvailableDates().stream() @@ -240,11 +257,7 @@ public SkuAvailableDate buildFreeSkuAvailableDate(RentalScheduleVehicleSkuDTO sc } - public VehicleSkuWithPrice getPriceForSkuInSelectedPeriod(int vehicleId, String skuGuid, Date startDate, Date endDate) { - // todo: count the day. - // count yearly, monthly, daily price - // sum - + public VehicleSkuWithPrice getVehicleSkuWithPriceInSelectedPeriod(int vehicleId, String skuGuid, Date startDate, Date endDate) { int selectedPeriodDays = DateUtil.getDaysBetween(startDate, endDate); if (selectedPeriodDays == 0) { selectedPeriodDays = 1; @@ -256,8 +269,38 @@ public VehicleSkuWithPrice getPriceForSkuInSelectedPeriod(int vehicleId, String SkuPriceDTO::getPrice)); Map priceFrequencyIdMapToFactorUnit = initPriceFrequencyIdMapToFactorUnit(selectedPeriodDays); - //todo: mathUtil FactorUnit*PriceString sum to get the total price. - return null; + + double skuPrice = getSkuPriceBySumAllFrequencyPrice(priceFrequencyIdList, priceFrequencyIdMapToPriceString, priceFrequencyIdMapToFactorUnit); + double averageDailyPrice = MathUtil.div(skuPrice, selectedPeriodDays); + VehicleSkuDTO vehicleSkuDTO = getOneSku(vehicleId, skuGuid); + + return new VehicleSkuWithPrice( + vehicleSkuDTO.getVehicleId(), + vehicleSkuDTO.getSkuGuid(), + vehicleSkuDTO.getColor(), + Double.toString(skuPrice), + Double.toString(averageDailyPrice) + ); + } + + public double getSkuPriceBySumAllFrequencyPrice(List priceFrequencyIdList, Map priceFrequencyIdMapToPriceString, Map priceFrequencyIdMapToFactorUnit) { + double skuPrice = priceFrequencyIdList.stream() + .mapToDouble(priceFrequencyId -> getOneFrequencyPrice( + priceFrequencyId, + priceFrequencyIdMapToPriceString, + priceFrequencyIdMapToFactorUnit)) + .sum(); + + return MathUtil.round(skuPrice); + } + + public double getOneFrequencyPrice(int keyPriceFrequencyId, + Map priceFrequencyIdMapToPriceString, + Map priceFrequencyIdMapToFactorUnit) { + String priceString = priceFrequencyIdMapToPriceString.get(keyPriceFrequencyId); + String factorUnitString = priceFrequencyIdMapToFactorUnit.get(keyPriceFrequencyId).toString(); + return MathUtil.multiply(priceString, factorUnitString); + } public void priceFrequencyIdMapIncrement(Map priceFrequencyIdMapToFactorUnit, int key, int incrementUnit) { @@ -297,16 +340,6 @@ private LinkedHashMap setUpDayUnitWithPriceFrequencyId() { return dayUnitWithPriceFrequencyId; } - private Map getIntegerIntegerMap() { - return new HashMap<>() {{ - put(PriceFrequency.YEARLY.getPriceFrequencyId(), 0); - put(PriceFrequency.HALF_YEARLY.getPriceFrequencyId(), 0); - put(PriceFrequency.MONTHLY.getPriceFrequencyId(), 0); - put(PriceFrequency.WEEKLY.getPriceFrequencyId(), 0); - put(PriceFrequency.DAILY.getPriceFrequencyId(), 0); - }}; - } - private List initPriceFrequencyIdList(int selectedPeriodDays) { List priceFrequencyIdList = new ArrayList<>(); priceFrequencyIdList.add(PriceFrequency.DAILY.getPriceFrequencyId()); diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/util/MathUtil.java b/pocket-rental-company/src/main/java/com/pocket/retal/util/MathUtil.java new file mode 100644 index 0000000..43d3ebe --- /dev/null +++ b/pocket-rental-company/src/main/java/com/pocket/retal/util/MathUtil.java @@ -0,0 +1,66 @@ +package com.pocket.retal.util; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class MathUtil { + private MathUtil() { + } + + public static final int DEF_DIV_SCALE = 5; + public static final int DEF_MUL_SCALE = 2; + private static final BigDecimal ONE = new BigDecimal("1"); + + public static double multiply(String v1, String v2) { + BigDecimal b1 = new BigDecimal(v1); + BigDecimal b2 = new BigDecimal(v2); + return b1.multiply(b2).doubleValue(); + } + + public static double multiplyWithScale(double v1, double v2) { + return multiplyWithScale(v1, v2, DEF_MUL_SCALE); + } + + public static double multiplyWithScale(double v1, double v2, int scale) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.multiply(b2).setScale(scale, RoundingMode.HALF_UP).doubleValue(); + } + + public static boolean isEqualByBigDecimalCompareTo(double v1, double v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return (0 == b1.compareTo(b2)); + } + + public static double div(double dividend, double divisor) { + return div(dividend, divisor, DEF_DIV_SCALE); + } + + public static double div(double dividend, double divisor, int scale) { + if (scale < 0) { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b1 = new BigDecimal(Double.toString(dividend)); + BigDecimal b2 = new BigDecimal(Double.toString(divisor)); + return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); + } + + public static double round(double num) { + return round(num, DEF_MUL_SCALE); + } + + public static Double round(Double num, int scale) { + if (num == null) { + return num; + } + if (scale < 0) { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal numDecimal = new BigDecimal(Double.toString(num)); + return numDecimal.divide(ONE, scale, RoundingMode.HALF_UP).doubleValue(); + } + +} From a6a9dbeff8c12fe06ff165466ece9eecb954e6ef Mon Sep 17 00:00:00 2001 From: ParrySMS Date: Sun, 30 May 2021 22:43:18 +0800 Subject: [PATCH 3/9] TICKET-009 API get price --- .../CustomizedExceptionHandler.java | 6 ++- .../retal/model/VehicleSkuWithPrice.java | 19 +++---- .../retal/model/dto/PriceFrequencyDTO.java | 2 +- .../pocket/retal/model/dto/SkuPriceDTO.java | 2 +- .../pocket/retal/model/dto/VehicleDTO.java | 4 +- .../pocket/retal/model/dto/VehicleSkuDTO.java | 2 +- .../retal/repository/SkuRepository.java | 2 - .../pocket/retal/service/VehicleService.java | 27 ++++------ .../java/com/pocket/retal/util/MathUtil.java | 37 +++++++++---- .../com/pocket/retal/util/DateUtilTest.java | 6 ++- .../com/pocket/retal/util/MathUtilTest.java | 54 +++++++++++++++++++ 11 files changed, 109 insertions(+), 52 deletions(-) create mode 100644 pocket-rental-company/src/test/java/com/pocket/retal/util/MathUtilTest.java diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/controller/CustomizedExceptionHandler.java b/pocket-rental-company/src/main/java/com/pocket/retal/controller/CustomizedExceptionHandler.java index 63c12ee..e6b84ff 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/controller/CustomizedExceptionHandler.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/controller/CustomizedExceptionHandler.java @@ -14,9 +14,13 @@ @ControllerAdvice @Slf4j public class CustomizedExceptionHandler extends ResponseEntityExceptionHandler { + // TODO: this shoule be set as the config for Env params + public static boolean ENABLE_DETAIL_MESSAGE = true; + public static String DEFAULT_MESSAGE = "System error."; + @ExceptionHandler(Exception.class) public ResponseEntity> globalExceptionHandler(Exception ex, WebRequest request) { - String msg = ex.getMessage() + System.getProperty("line.separator") + request.getParameterMap().toString(); + String msg = ENABLE_DETAIL_MESSAGE ? ex.getMessage() : DEFAULT_MESSAGE; if (ex instanceof ValidationException) { return ApiResult.failedWithBadRequest(msg); } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/VehicleSkuWithPrice.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/VehicleSkuWithPrice.java index bf43340..cf2aa50 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/model/VehicleSkuWithPrice.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/VehicleSkuWithPrice.java @@ -1,25 +1,18 @@ package com.pocket.retal.model; -import com.pocket.retal.model.dto.VehicleSkuDTO; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data @Builder +@AllArgsConstructor @NoArgsConstructor -public class VehicleSkuWithPrice extends VehicleSkuDTO { +public class VehicleSkuWithPrice { + Integer vehicleId; + String skuGuid; + String color; String skuPrice; String averageDailyPrice; - - public VehicleSkuWithPrice(int vehicleId, String skuGuid, String color, String skuPrice, String averageDailyPrice) { - super(vehicleId, skuGuid, color); - this.skuPrice = skuPrice; - this.averageDailyPrice = averageDailyPrice; - } - - public VehicleSkuWithPrice(String skuPrice, String averageDailyPrice) { - this.skuPrice = skuPrice; - this.averageDailyPrice = averageDailyPrice; - } } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/PriceFrequencyDTO.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/PriceFrequencyDTO.java index 8647c49..e56703f 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/PriceFrequencyDTO.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/PriceFrequencyDTO.java @@ -10,6 +10,6 @@ @NoArgsConstructor @AllArgsConstructor public class PriceFrequencyDTO { - private int id; + private Integer id; private String frequencyType; } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/SkuPriceDTO.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/SkuPriceDTO.java index 864bba6..9ceee65 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/SkuPriceDTO.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/SkuPriceDTO.java @@ -11,7 +11,7 @@ @AllArgsConstructor public class SkuPriceDTO { String skuGuid; - int priceFrequencyId; + Integer priceFrequencyId; String price; String frequencyType; } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/VehicleDTO.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/VehicleDTO.java index 9141f3b..e150c3d 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/VehicleDTO.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/VehicleDTO.java @@ -10,8 +10,8 @@ @NoArgsConstructor @AllArgsConstructor public class VehicleDTO { - int id; + Integer id; String name; - int modelYear; + Integer modelYear; String description; } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/VehicleSkuDTO.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/VehicleSkuDTO.java index 3d6a863..d4cfb6b 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/VehicleSkuDTO.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/VehicleSkuDTO.java @@ -10,7 +10,7 @@ @NoArgsConstructor @AllArgsConstructor public class VehicleSkuDTO { - int vehicleId; + Integer vehicleId; String skuGuid; String color; } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/repository/SkuRepository.java b/pocket-rental-company/src/main/java/com/pocket/retal/repository/SkuRepository.java index 9d5513a..a022fad 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/repository/SkuRepository.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/repository/SkuRepository.java @@ -30,8 +30,6 @@ public interface SkuRepository { " FROM [pocket].[pocket_sku_price] AS p " + " LEFT JOIN [pocket].[pocket_price_frequency] AS pf " + " ON p.price_frequency_id = pf.id " + - " WHERE p.sku_guid = #{skuGuid} " + - " AND p.price_frequency_id IN " + " " + " p.sku_guid = #{skuGuid} " + " " + diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java b/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java index 8ae1189..9497e12 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java @@ -21,16 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; @Service @@ -274,13 +265,13 @@ public VehicleSkuWithPrice getVehicleSkuWithPriceInSelectedPeriod(int vehicleId, double averageDailyPrice = MathUtil.div(skuPrice, selectedPeriodDays); VehicleSkuDTO vehicleSkuDTO = getOneSku(vehicleId, skuGuid); - return new VehicleSkuWithPrice( - vehicleSkuDTO.getVehicleId(), - vehicleSkuDTO.getSkuGuid(), - vehicleSkuDTO.getColor(), - Double.toString(skuPrice), - Double.toString(averageDailyPrice) - ); + return VehicleSkuWithPrice.builder() + .vehicleId(vehicleSkuDTO.getVehicleId()) + .skuGuid(vehicleSkuDTO.getSkuGuid()) + .color(vehicleSkuDTO.getColor()) + .skuPrice(Double.toString(skuPrice)) + .averageDailyPrice(Double.toString(averageDailyPrice)) + .build(); } public double getSkuPriceBySumAllFrequencyPrice(List priceFrequencyIdList, Map priceFrequencyIdMapToPriceString, Map priceFrequencyIdMapToFactorUnit) { @@ -299,7 +290,7 @@ public double getOneFrequencyPrice(int keyPriceFrequencyId, Map priceFrequencyIdMapToFactorUnit) { String priceString = priceFrequencyIdMapToPriceString.get(keyPriceFrequencyId); String factorUnitString = priceFrequencyIdMapToFactorUnit.get(keyPriceFrequencyId).toString(); - return MathUtil.multiply(priceString, factorUnitString); + return MathUtil.multiplyWithScale(priceString, factorUnitString); } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/util/MathUtil.java b/pocket-rental-company/src/main/java/com/pocket/retal/util/MathUtil.java index 43d3ebe..752b938 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/util/MathUtil.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/util/MathUtil.java @@ -7,29 +7,33 @@ public class MathUtil { private MathUtil() { } - public static final int DEF_DIV_SCALE = 5; + public static final int DEF_DIV_SCALE = 2; public static final int DEF_MUL_SCALE = 2; private static final BigDecimal ONE = new BigDecimal("1"); public static double multiply(String v1, String v2) { + isValidDoubleString(v1, true); + isValidDoubleString(v2, true); BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.multiply(b2).doubleValue(); } - public static double multiplyWithScale(double v1, double v2) { + public static double multiplyWithScale(String v1, String v2) { return multiplyWithScale(v1, v2, DEF_MUL_SCALE); } - public static double multiplyWithScale(double v1, double v2, int scale) { - BigDecimal b1 = new BigDecimal(Double.toString(v1)); - BigDecimal b2 = new BigDecimal(Double.toString(v2)); + public static double multiplyWithScale(String v1, String v2, int scale) { + isValidDoubleString(v1, true); + isValidDoubleString(v2, true); + BigDecimal b1 = new BigDecimal(v1); + BigDecimal b2 = new BigDecimal(v2); return b1.multiply(b2).setScale(scale, RoundingMode.HALF_UP).doubleValue(); } public static boolean isEqualByBigDecimalCompareTo(double v1, double v2) { - BigDecimal b1 = new BigDecimal(Double.toString(v1)); - BigDecimal b2 = new BigDecimal(Double.toString(v2)); + BigDecimal b1 = BigDecimal.valueOf(v1); + BigDecimal b2 = BigDecimal.valueOf(v2); return (0 == b1.compareTo(b2)); } @@ -39,8 +43,7 @@ public static double div(double dividend, double divisor) { public static double div(double dividend, double divisor, int scale) { if (scale < 0) { - throw new IllegalArgumentException( - "The scale must be a positive integer or zero"); + throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(dividend)); BigDecimal b2 = new BigDecimal(Double.toString(divisor)); @@ -56,11 +59,23 @@ public static Double round(Double num, int scale) { return num; } if (scale < 0) { - throw new IllegalArgumentException( - "The scale must be a positive integer or zero"); + throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal numDecimal = new BigDecimal(Double.toString(num)); return numDecimal.divide(ONE, scale, RoundingMode.HALF_UP).doubleValue(); } + public static boolean isValidDoubleString(String str, boolean isThrowException) { + try { + Double value = Double.valueOf(str); + return true; + } catch (Exception e) { + if (isThrowException) { + throw new IllegalArgumentException("This is not valid double String:" + str); + } else { + return false; + } + } + } + } diff --git a/pocket-rental-company/src/test/java/com/pocket/retal/util/DateUtilTest.java b/pocket-rental-company/src/test/java/com/pocket/retal/util/DateUtilTest.java index fe1482a..c109dae 100644 --- a/pocket-rental-company/src/test/java/com/pocket/retal/util/DateUtilTest.java +++ b/pocket-rental-company/src/test/java/com/pocket/retal/util/DateUtilTest.java @@ -7,6 +7,8 @@ import java.text.SimpleDateFormat; import java.util.Date; +import static org.junit.jupiter.api.Assertions.assertEquals; + class DateUtilTest { private static final String YMD_DATE_FORMAT = "yyyy/MM/dd"; @@ -16,7 +18,7 @@ void getNextDay() throws ParseException { Date date = formatter.parse("2021/12/05"); Date nextDate = formatter.parse("2021/12/06"); Date actual = DateUtil.getNextDay(date); - Assertions.assertEquals(actual, nextDate); + assertEquals(actual, nextDate); } @Test @@ -25,6 +27,6 @@ void getLastDay() throws ParseException { Date lastDate = formatter.parse("2021/12/05"); Date date = formatter.parse("2021/12/06"); Date actual = DateUtil.getLastDay(date); - Assertions.assertEquals(actual, lastDate); + assertEquals(actual, lastDate); } } \ No newline at end of file diff --git a/pocket-rental-company/src/test/java/com/pocket/retal/util/MathUtilTest.java b/pocket-rental-company/src/test/java/com/pocket/retal/util/MathUtilTest.java new file mode 100644 index 0000000..67092b5 --- /dev/null +++ b/pocket-rental-company/src/test/java/com/pocket/retal/util/MathUtilTest.java @@ -0,0 +1,54 @@ +package com.pocket.retal.util; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class MathUtilTest { + + @Test + void multiply() { + } + + @Test + void multiplyWithScale() { + } + + @Test + void testMultiplyWithScale() { + } + + @Test + void isEqualByBigDecimalCompareTo() { + } + + @Test + void div() { + } + + @Test + void testDiv() { + } + + @Test + void round() { + } + + @Test + void testRound() { + } + + @Test + void isValidDoubleString() { + assertTrue(MathUtil.isValidDoubleString("123.12", false)); + assertTrue(MathUtil.isValidDoubleString("-123.12", false)); + assertTrue(MathUtil.isValidDoubleString("123", false)); + assertTrue(MathUtil.isValidDoubleString("0", false)); + assertTrue(MathUtil.isValidDoubleString("0.0", false)); + + assertFalse(MathUtil.isValidDoubleString("", false)); + assertFalse(MathUtil.isValidDoubleString(null, false)); + assertFalse(MathUtil.isValidDoubleString(" ", false)); + } +} \ No newline at end of file From 0063ab201fa30edd16979537d31eb0fe20cc9011 Mon Sep 17 00:00:00 2001 From: ParrySMS Date: Mon, 31 May 2021 00:58:49 +0800 Subject: [PATCH 4/9] TICKET-011 API add the {SKU + period} into order Part 1 --- pocket-rental-company/pom.xml | 252 +++++++++--------- .../retal/controller/OrderController.java | 49 ++++ .../java/com/pocket/retal/model/SkuOrder.java | 21 ++ .../java/com/pocket/retal/model/SkuPrice.java | 15 ++ .../retal/model/dto/InsertOrderDTO.java | 16 ++ .../repository/RentalOrderRepository.java | 19 ++ .../repository/RentalScheduleRepository.java | 9 + .../retal/service/RentalOrderService.java | 44 +++ .../pocket/retal/service/VehicleService.java | 21 +- .../com/pocket/retal/util/ValidateUtil.java | 10 +- 10 files changed, 320 insertions(+), 136 deletions(-) create mode 100644 pocket-rental-company/src/main/java/com/pocket/retal/controller/OrderController.java create mode 100644 pocket-rental-company/src/main/java/com/pocket/retal/model/SkuOrder.java create mode 100644 pocket-rental-company/src/main/java/com/pocket/retal/model/SkuPrice.java create mode 100644 pocket-rental-company/src/main/java/com/pocket/retal/model/dto/InsertOrderDTO.java create mode 100644 pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalOrderRepository.java create mode 100644 pocket-rental-company/src/main/java/com/pocket/retal/service/RentalOrderService.java diff --git a/pocket-rental-company/pom.xml b/pocket-rental-company/pom.xml index f76d819..8d91458 100644 --- a/pocket-rental-company/pom.xml +++ b/pocket-rental-company/pom.xml @@ -1,138 +1,138 @@ - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.5.0 - - - com.pocket - pocket-rental-company - 0.0.1-SNAPSHOT - pocket-rental-company - Demo project for Spring Boot - - 11 - 2020.0.3-SNAPSHOT - 2.9.2 - - - - org.springframework.boot - spring-boot-starter-jdbc - - - - io.springfox - springfox-swagger-ui - ${swagger.version} - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.5.0 + + + com.pocket + pocket-rental-company + 0.0.1-SNAPSHOT + pocket-rental-company + Demo project for Spring Boot + + 11 + 2020.0.3-SNAPSHOT + 2.9.2 + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + io.springfox + springfox-swagger-ui + ${swagger.version} + - - io.springfox - springfox-swagger2 - ${swagger.version} - + + io.springfox + springfox-swagger2 + ${swagger.version} + - - net.jodah - failsafe - 2.0.1 - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - 2.1.1 - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-aop - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-devtools - true - - - com.microsoft.sqlserver - mssql-jdbc - runtime - - - org.mybatis - mybatis - 3.4.1 - - - org.projectlombok - lombok - true - + + net.jodah + failsafe + 2.0.1 + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.1 + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-aop + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-devtools + true + + + com.microsoft.sqlserver + mssql-jdbc + runtime + + + org.mybatis + mybatis + 3.4.1 + + + org.projectlombok + lombok + true + com.jayway.jsonpath json-path - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - false - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/controller/OrderController.java b/pocket-rental-company/src/main/java/com/pocket/retal/controller/OrderController.java new file mode 100644 index 0000000..9ff6cd5 --- /dev/null +++ b/pocket-rental-company/src/main/java/com/pocket/retal/controller/OrderController.java @@ -0,0 +1,49 @@ +package com.pocket.retal.controller; + + +import com.pocket.retal.model.ApiResult; +import com.pocket.retal.model.SkuOrder; +import com.pocket.retal.model.dto.InsertOrderDTO; +import com.pocket.retal.service.RentalOrderService; +import com.pocket.retal.util.ValidateUtil; +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.text.ParseException; +import java.util.Date; + +@CrossOrigin +@RestController +@Api +@RequestMapping("/orders") +public class OrderController { + private RentalOrderService rentalOrderService; + + @Autowired + public OrderController(RentalOrderService rentalOrderService) { + this.rentalOrderService = rentalOrderService; + } + + @PostMapping("") + public ResponseEntity> createOrder( + @RequestBody SkuOrder skuOrder + ) throws ParseException { + int mockClientId = 999; + Date startDate = ValidateUtil.parseDate(skuOrder.getStartDateStr(), null, true); + Date endDate = ValidateUtil.parseDate(skuOrder.getEndDateStr(), null, true); + Date today = new Date(); + ValidateUtil.Friendly.assertFalse(startDate.before(today), + "startDate should not before today"); + ValidateUtil.Friendly.assertFalse(endDate.before(today), + "endDate should not before today"); + ValidateUtil.Friendly.assertFalse(endDate.before(startDate), + "endDate should not before startDate"); + ValidateUtil.Friendly.assertFalse(endDate.equals(startDate), + "endDate should not be the same as startDate"); + ValidateUtil.notNullOrEmptyOrBlank(skuOrder.getSkuGuid(), "skuGuid"); + return ApiResult.ok(rentalOrderService.createOrder(mockClientId, skuOrder.getSkuGuid(), startDate, endDate)); + } + +} diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/SkuOrder.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/SkuOrder.java new file mode 100644 index 0000000..dc2ecd4 --- /dev/null +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/SkuOrder.java @@ -0,0 +1,21 @@ +package com.pocket.retal.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SkuOrder { + Integer orderId; + String skuGuid; + @JsonProperty("startDate") + String startDateStr; + @JsonProperty("endDate") + String endDateStr; +} diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/SkuPrice.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/SkuPrice.java new file mode 100644 index 0000000..d7ebea7 --- /dev/null +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/SkuPrice.java @@ -0,0 +1,15 @@ +package com.pocket.retal.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SkuPrice { + Double skuPrice; + Double averageDailyPrice; +} diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/InsertOrderDTO.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/InsertOrderDTO.java new file mode 100644 index 0000000..89db461 --- /dev/null +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/InsertOrderDTO.java @@ -0,0 +1,16 @@ +package com.pocket.retal.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Builder +@Data +@NoArgsConstructor +@AllArgsConstructor +public class InsertOrderDTO { + public Integer orderId; + public Integer clientId; + public String totalPriceString; +} diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalOrderRepository.java b/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalOrderRepository.java new file mode 100644 index 0000000..2838201 --- /dev/null +++ b/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalOrderRepository.java @@ -0,0 +1,19 @@ +package com.pocket.retal.repository; + +import com.pocket.retal.model.dto.InsertOrderDTO; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface RentalOrderRepository { + @Insert({""}) + @Options(useGeneratedKeys = true, keyProperty = "insertOrder.orderId", keyColumn = "id") + int insertOrder(@Param("insertOrder") InsertOrderDTO insertOrder); +} diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalScheduleRepository.java b/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalScheduleRepository.java index ce1b3b3..4bfcb31 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalScheduleRepository.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalScheduleRepository.java @@ -1,6 +1,7 @@ package com.pocket.retal.repository; import com.pocket.retal.model.dto.RentalScheduleVehicleSkuDTO; +import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; @@ -37,4 +38,12 @@ public interface RentalScheduleRepository { "" + ""}) List getRentalScheduleVehicleSkus(Date startDate, Date endDate); + + @Insert({""}) + int insertSchedule(String skuGuid, Date startDate, Date endDate, String schedulePriceString, int rentalOrderId); } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/service/RentalOrderService.java b/pocket-rental-company/src/main/java/com/pocket/retal/service/RentalOrderService.java new file mode 100644 index 0000000..3d784ec --- /dev/null +++ b/pocket-rental-company/src/main/java/com/pocket/retal/service/RentalOrderService.java @@ -0,0 +1,44 @@ +package com.pocket.retal.service; + +import com.pocket.retal.model.SkuPrice; +import com.pocket.retal.model.dto.InsertOrderDTO; +import com.pocket.retal.repository.RentalOrderRepository; +import com.pocket.retal.repository.RentalScheduleRepository; +import com.pocket.retal.util.ValidateUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +public class RentalOrderService { + + private VehicleService vehicleService; + private RentalOrderRepository rentalOrderRepo; + private RentalScheduleRepository rentalScheduleRepo; + + @Autowired + public RentalOrderService(VehicleService vehicleService, + RentalOrderRepository rentalOrderRepo, + RentalScheduleRepository rentalScheduleRepo) { + this.vehicleService = vehicleService; + this.rentalOrderRepo = rentalOrderRepo; + this.rentalScheduleRepo = rentalScheduleRepo; + } + + public InsertOrderDTO createOrder(int clientId, String skuGuid, Date startDate, Date endDate) { + SkuPrice skuPrice = vehicleService.getSkuPriceInSelectedPeriod(skuGuid, startDate, endDate); + String skuPriceString = skuPrice.getSkuPrice().toString(); + InsertOrderDTO insertOrderDTO = InsertOrderDTO.builder() + .clientId(clientId) + .totalPriceString(skuPriceString) + .build(); + int effectRowsOnRentalOrder = rentalOrderRepo.insertOrder(insertOrderDTO); + int orderId = insertOrderDTO.getOrderId(); + int effectRowsOnRentalSchedule = rentalScheduleRepo.insertSchedule(skuGuid, startDate, endDate, skuPriceString, orderId); + ValidateUtil.effectRowsAssert(1, effectRowsOnRentalOrder, "rentalOrderRepo"); + ValidateUtil.effectRowsAssert(1, effectRowsOnRentalSchedule, "rentalScheduleRepo"); + return insertOrderDTO; + } + +} diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java b/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java index 9497e12..de00fcd 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java @@ -1,10 +1,7 @@ package com.pocket.retal.service; import com.pocket.retal.exception.PocketApiException; -import com.pocket.retal.model.SkuAvailableDate; -import com.pocket.retal.model.SkuServiceDate; -import com.pocket.retal.model.TimeInterval; -import com.pocket.retal.model.VehicleSkuWithPrice; +import com.pocket.retal.model.*; import com.pocket.retal.model.constant.ParamsConst; import com.pocket.retal.model.dto.RentalScheduleVehicleSkuDTO; import com.pocket.retal.model.dto.SkuPriceDTO; @@ -248,7 +245,7 @@ public SkuAvailableDate buildFreeSkuAvailableDate(RentalScheduleVehicleSkuDTO sc } - public VehicleSkuWithPrice getVehicleSkuWithPriceInSelectedPeriod(int vehicleId, String skuGuid, Date startDate, Date endDate) { + public SkuPrice getSkuPriceInSelectedPeriod(String skuGuid, Date startDate, Date endDate) { int selectedPeriodDays = DateUtil.getDaysBetween(startDate, endDate); if (selectedPeriodDays == 0) { selectedPeriodDays = 1; @@ -260,17 +257,23 @@ public VehicleSkuWithPrice getVehicleSkuWithPriceInSelectedPeriod(int vehicleId, SkuPriceDTO::getPrice)); Map priceFrequencyIdMapToFactorUnit = initPriceFrequencyIdMapToFactorUnit(selectedPeriodDays); - double skuPrice = getSkuPriceBySumAllFrequencyPrice(priceFrequencyIdList, priceFrequencyIdMapToPriceString, priceFrequencyIdMapToFactorUnit); double averageDailyPrice = MathUtil.div(skuPrice, selectedPeriodDays); - VehicleSkuDTO vehicleSkuDTO = getOneSku(vehicleId, skuGuid); + return SkuPrice.builder() + .skuPrice(skuPrice) + .averageDailyPrice(averageDailyPrice) + .build(); + } + public VehicleSkuWithPrice getVehicleSkuWithPriceInSelectedPeriod(int vehicleId, String skuGuid, Date startDate, Date endDate) { + SkuPrice skuPriceEntity = getSkuPriceInSelectedPeriod(skuGuid, startDate, endDate); + VehicleSkuDTO vehicleSkuDTO = getOneSku(vehicleId, skuGuid); return VehicleSkuWithPrice.builder() .vehicleId(vehicleSkuDTO.getVehicleId()) .skuGuid(vehicleSkuDTO.getSkuGuid()) .color(vehicleSkuDTO.getColor()) - .skuPrice(Double.toString(skuPrice)) - .averageDailyPrice(Double.toString(averageDailyPrice)) + .skuPrice(Double.toString(skuPriceEntity.getSkuPrice())) + .averageDailyPrice(Double.toString(skuPriceEntity.getAverageDailyPrice())) .build(); } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/util/ValidateUtil.java b/pocket-rental-company/src/main/java/com/pocket/retal/util/ValidateUtil.java index 5d9c428..bc864ee 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/util/ValidateUtil.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/util/ValidateUtil.java @@ -93,4 +93,12 @@ public static void assertFalse(boolean condition, String friendlyMessage) throws } } } -} + + public static void effectRowsAssert(int expectedNum, int effectRows, String reposName) { + if (effectRows != expectedNum) { + throw new PocketApiException( + PocketResponseStatus.SYSTEM_INTERNAL_ERROR, + "effectRows != expectedNum on " + reposName); + } + } +} \ No newline at end of file From a16b8b3b570b04be9a6fb2d0ee828fefd6aa717a Mon Sep 17 00:00:00 2001 From: ParrySMS Date: Mon, 31 May 2021 01:02:20 +0800 Subject: [PATCH 5/9] TICKET-011 better format --- .../.mvn/wrapper/MavenWrapperDownloader.java | 14 ++++++-------- .../retal/PocketRentalCompanyApplication.java | 1 - .../retal/controller/OrderController.java | 6 +++++- .../retal/controller/VehicleController.java | 9 +++++++-- .../model/enumeration/PocketResponseStatus.java | 3 +-- .../repository/PriceFrequencyRepository.java | 2 +- .../pocket/retal/service/VehicleService.java | 17 +++++++++++++++-- .../retal/controller/VehicleControllerTest.java | 5 ++++- .../retal/service/VehicleServiceTest.java | 5 ++++- .../com/pocket/retal/util/DateUtilTest.java | 1 - 10 files changed, 43 insertions(+), 20 deletions(-) diff --git a/pocket-rental-company/.mvn/wrapper/MavenWrapperDownloader.java b/pocket-rental-company/.mvn/wrapper/MavenWrapperDownloader.java index e76d1f3..d6d1381 100644 --- a/pocket-rental-company/.mvn/wrapper/MavenWrapperDownloader.java +++ b/pocket-rental-company/.mvn/wrapper/MavenWrapperDownloader.java @@ -13,9 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import java.net.*; -import java.io.*; -import java.nio.channels.*; + import java.util.Properties; public class MavenWrapperDownloader { @@ -25,7 +23,7 @@ public class MavenWrapperDownloader { * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. */ private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; /** * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to @@ -54,7 +52,7 @@ public static void main(String args[]) { // wrapperUrl parameter. File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); String url = DEFAULT_DOWNLOAD_URL; - if(mavenWrapperPropertyFile.exists()) { + if (mavenWrapperPropertyFile.exists()) { FileInputStream mavenWrapperPropertyFileInputStream = null; try { mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); @@ -65,7 +63,7 @@ public static void main(String args[]) { System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); } finally { try { - if(mavenWrapperPropertyFileInputStream != null) { + if (mavenWrapperPropertyFileInputStream != null) { mavenWrapperPropertyFileInputStream.close(); } } catch (IOException e) { @@ -76,8 +74,8 @@ public static void main(String args[]) { System.out.println("- Downloading from: " + url); File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if(!outputFile.getParentFile().exists()) { - if(!outputFile.getParentFile().mkdirs()) { + if (!outputFile.getParentFile().exists()) { + if (!outputFile.getParentFile().mkdirs()) { System.out.println( "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/PocketRentalCompanyApplication.java b/pocket-rental-company/src/main/java/com/pocket/retal/PocketRentalCompanyApplication.java index 0e95ff6..a7c608c 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/PocketRentalCompanyApplication.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/PocketRentalCompanyApplication.java @@ -3,7 +3,6 @@ import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.web.servlet.ServletComponentScan; import springfox.documentation.swagger2.annotations.EnableSwagger2; diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/controller/OrderController.java b/pocket-rental-company/src/main/java/com/pocket/retal/controller/OrderController.java index 9ff6cd5..c2c06da 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/controller/OrderController.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/controller/OrderController.java @@ -9,7 +9,11 @@ import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.text.ParseException; import java.util.Date; diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/controller/VehicleController.java b/pocket-rental-company/src/main/java/com/pocket/retal/controller/VehicleController.java index 87ad012..b4c8b78 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/controller/VehicleController.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/controller/VehicleController.java @@ -1,15 +1,20 @@ package com.pocket.retal.controller; import com.pocket.retal.model.ApiResult; +import com.pocket.retal.model.VehicleSkuWithPrice; import com.pocket.retal.model.dto.VehicleDTO; import com.pocket.retal.model.dto.VehicleSkuDTO; -import com.pocket.retal.model.VehicleSkuWithPrice; import com.pocket.retal.service.VehicleService; import com.pocket.retal.util.ValidateUtil; import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import java.text.ParseException; import java.util.Date; diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/enumeration/PocketResponseStatus.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/enumeration/PocketResponseStatus.java index 429e1fb..987fc3b 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/model/enumeration/PocketResponseStatus.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/enumeration/PocketResponseStatus.java @@ -3,8 +3,7 @@ public enum PocketResponseStatus { NORMAL("200200", ""), SYSTEM_INTERNAL_ERROR("500500", "Internal Error"), - BAD_REQUEST_ERROR("400400", "Bad Request Error") - ; + BAD_REQUEST_ERROR("400400", "Bad Request Error"); private String appCode; private String message; diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/repository/PriceFrequencyRepository.java b/pocket-rental-company/src/main/java/com/pocket/retal/repository/PriceFrequencyRepository.java index 938b618..f2c5a58 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/repository/PriceFrequencyRepository.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/repository/PriceFrequencyRepository.java @@ -9,7 +9,7 @@ @Mapper public interface PriceFrequencyRepository { @Select({""}) List selectAllPriceFrequencies(); } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java b/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java index de00fcd..8b1edad 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/service/VehicleService.java @@ -1,7 +1,11 @@ package com.pocket.retal.service; import com.pocket.retal.exception.PocketApiException; -import com.pocket.retal.model.*; +import com.pocket.retal.model.SkuAvailableDate; +import com.pocket.retal.model.SkuPrice; +import com.pocket.retal.model.SkuServiceDate; +import com.pocket.retal.model.TimeInterval; +import com.pocket.retal.model.VehicleSkuWithPrice; import com.pocket.retal.model.constant.ParamsConst; import com.pocket.retal.model.dto.RentalScheduleVehicleSkuDTO; import com.pocket.retal.model.dto.SkuPriceDTO; @@ -18,7 +22,16 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; @Service diff --git a/pocket-rental-company/src/test/java/com/pocket/retal/controller/VehicleControllerTest.java b/pocket-rental-company/src/test/java/com/pocket/retal/controller/VehicleControllerTest.java index 2f06979..44469c7 100644 --- a/pocket-rental-company/src/test/java/com/pocket/retal/controller/VehicleControllerTest.java +++ b/pocket-rental-company/src/test/java/com/pocket/retal/controller/VehicleControllerTest.java @@ -8,7 +8,10 @@ import java.text.ParseException; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class VehicleControllerTest { diff --git a/pocket-rental-company/src/test/java/com/pocket/retal/service/VehicleServiceTest.java b/pocket-rental-company/src/test/java/com/pocket/retal/service/VehicleServiceTest.java index 510cbf6..b5d6b84 100644 --- a/pocket-rental-company/src/test/java/com/pocket/retal/service/VehicleServiceTest.java +++ b/pocket-rental-company/src/test/java/com/pocket/retal/service/VehicleServiceTest.java @@ -16,7 +16,10 @@ import java.util.List; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class VehicleServiceTest { private static final String YMD_DATE_FORMAT = "yyyy/MM/dd"; diff --git a/pocket-rental-company/src/test/java/com/pocket/retal/util/DateUtilTest.java b/pocket-rental-company/src/test/java/com/pocket/retal/util/DateUtilTest.java index c109dae..1890404 100644 --- a/pocket-rental-company/src/test/java/com/pocket/retal/util/DateUtilTest.java +++ b/pocket-rental-company/src/test/java/com/pocket/retal/util/DateUtilTest.java @@ -1,6 +1,5 @@ package com.pocket.retal.util; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.text.ParseException; From 2ee407fff41f5928bbc79df56a403aa958111f02 Mon Sep 17 00:00:00 2001 From: ParrySMS Date: Mon, 31 May 2021 01:47:51 +0800 Subject: [PATCH 6/9] TICKET-012 API show order --- .../retal/controller/OrderController.java | 43 +++++++++++++++---- ...er.java => InsertSkuOrderRequestBody.java} | 4 +- ...nsertOrderDTO.java => RentalOrderDTO.java} | 7 ++- .../repository/RentalOrderRepository.java | 30 ++++++++++++- .../retal/service/RentalOrderService.java | 29 +++++++++---- software design document.md | 6 +-- 6 files changed, 93 insertions(+), 26 deletions(-) rename pocket-rental-company/src/main/java/com/pocket/retal/model/{SkuOrder.java => InsertSkuOrderRequestBody.java} (85%) rename pocket-rental-company/src/main/java/com/pocket/retal/model/dto/{InsertOrderDTO.java => RentalOrderDTO.java} (69%) diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/controller/OrderController.java b/pocket-rental-company/src/main/java/com/pocket/retal/controller/OrderController.java index c2c06da..2a17c69 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/controller/OrderController.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/controller/OrderController.java @@ -2,14 +2,16 @@ import com.pocket.retal.model.ApiResult; -import com.pocket.retal.model.SkuOrder; -import com.pocket.retal.model.dto.InsertOrderDTO; +import com.pocket.retal.model.InsertSkuOrderRequestBody; +import com.pocket.retal.model.dto.RentalOrderDTO; import com.pocket.retal.service.RentalOrderService; import com.pocket.retal.util.ValidateUtil; import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -17,6 +19,7 @@ import java.text.ParseException; import java.util.Date; +import java.util.List; @CrossOrigin @RestController @@ -30,13 +33,31 @@ public OrderController(RentalOrderService rentalOrderService) { this.rentalOrderService = rentalOrderService; } + @GetMapping("/client/{clientId}") + public ResponseEntity>> selectAllOrdersByClient( + @PathVariable("clientId") int clientId + ) { + ValidateUtil.min(clientId, 1, "clientId"); + return ApiResult.ok(rentalOrderService.selectAllOrdersByClient(clientId)); + } + + @GetMapping("/{orderId}/client/{clientId}") + public ResponseEntity> selectOneOrderByClient( + @PathVariable("clientId") int clientId, + @PathVariable("orderId") int orderId + ) { + ValidateUtil.min(clientId, 1, "clientId"); + ValidateUtil.min(orderId, 1, "orderId"); + return ApiResult.ok(rentalOrderService.selectOneOrderByClient(clientId, orderId)); + } + + @PostMapping("") - public ResponseEntity> createOrder( - @RequestBody SkuOrder skuOrder + public ResponseEntity> insertSkuOrder( + @RequestBody InsertSkuOrderRequestBody insertSkuOrderRequestBody ) throws ParseException { - int mockClientId = 999; - Date startDate = ValidateUtil.parseDate(skuOrder.getStartDateStr(), null, true); - Date endDate = ValidateUtil.parseDate(skuOrder.getEndDateStr(), null, true); + Date startDate = ValidateUtil.parseDate(insertSkuOrderRequestBody.getStartDateStr(), null, true); + Date endDate = ValidateUtil.parseDate(insertSkuOrderRequestBody.getEndDateStr(), null, true); Date today = new Date(); ValidateUtil.Friendly.assertFalse(startDate.before(today), "startDate should not before today"); @@ -46,8 +67,12 @@ public ResponseEntity> createOrder( "endDate should not before startDate"); ValidateUtil.Friendly.assertFalse(endDate.equals(startDate), "endDate should not be the same as startDate"); - ValidateUtil.notNullOrEmptyOrBlank(skuOrder.getSkuGuid(), "skuGuid"); - return ApiResult.ok(rentalOrderService.createOrder(mockClientId, skuOrder.getSkuGuid(), startDate, endDate)); + String skuGuid = insertSkuOrderRequestBody.getSkuGuid(); + int clientId = insertSkuOrderRequestBody.getClientId(); + ValidateUtil.min(clientId, 1, "clientId"); + ValidateUtil.notNullOrEmptyOrBlank(skuGuid, "skuGuid"); + ValidateUtil.IsValidUUID(skuGuid, "skuGuid"); + return ApiResult.ok(rentalOrderService.createOrder(clientId, skuGuid, startDate, endDate)); } } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/SkuOrder.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/InsertSkuOrderRequestBody.java similarity index 85% rename from pocket-rental-company/src/main/java/com/pocket/retal/model/SkuOrder.java rename to pocket-rental-company/src/main/java/com/pocket/retal/model/InsertSkuOrderRequestBody.java index dc2ecd4..3a1c773 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/model/SkuOrder.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/InsertSkuOrderRequestBody.java @@ -11,8 +11,8 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class SkuOrder { - Integer orderId; +public class InsertSkuOrderRequestBody { + Integer clientId; String skuGuid; @JsonProperty("startDate") String startDateStr; diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/InsertOrderDTO.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalOrderDTO.java similarity index 69% rename from pocket-rental-company/src/main/java/com/pocket/retal/model/dto/InsertOrderDTO.java rename to pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalOrderDTO.java index 89db461..c66b264 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/InsertOrderDTO.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalOrderDTO.java @@ -5,12 +5,15 @@ import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Date; + @Builder @Data @NoArgsConstructor @AllArgsConstructor -public class InsertOrderDTO { +public class RentalOrderDTO { public Integer orderId; public Integer clientId; - public String totalPriceString; + public Date signingTime; + public String totalPrice; } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalOrderRepository.java b/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalOrderRepository.java index 2838201..78a17f0 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalOrderRepository.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalOrderRepository.java @@ -1,10 +1,13 @@ package com.pocket.retal.repository; -import com.pocket.retal.model.dto.InsertOrderDTO; +import com.pocket.retal.model.dto.RentalOrderDTO; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Options; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; @Mapper public interface RentalOrderRepository { @@ -15,5 +18,28 @@ public interface RentalOrderRepository { " (#{insertOrder.clientId}, GETDATE(), #{insertOrder.totalPriceString}, GETDATE(), GETDATE())" + ""}) @Options(useGeneratedKeys = true, keyProperty = "insertOrder.orderId", keyColumn = "id") - int insertOrder(@Param("insertOrder") InsertOrderDTO insertOrder); + int insertOrder(@Param("insertOrder") RentalOrderDTO insertOrder); + + @Select({""}) + List selectAllOrders(int clientId); + + @Select({""}) + RentalOrderDTO selectOneOrderByClient(int clientId, int orderId); } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/service/RentalOrderService.java b/pocket-rental-company/src/main/java/com/pocket/retal/service/RentalOrderService.java index 3d784ec..592a22a 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/service/RentalOrderService.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/service/RentalOrderService.java @@ -1,14 +1,16 @@ package com.pocket.retal.service; import com.pocket.retal.model.SkuPrice; -import com.pocket.retal.model.dto.InsertOrderDTO; +import com.pocket.retal.model.dto.RentalOrderDTO; import com.pocket.retal.repository.RentalOrderRepository; import com.pocket.retal.repository.RentalScheduleRepository; import com.pocket.retal.util.ValidateUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.Date; +import java.util.List; @Service public class RentalOrderService { @@ -26,19 +28,30 @@ public RentalOrderService(VehicleService vehicleService, this.rentalScheduleRepo = rentalScheduleRepo; } - public InsertOrderDTO createOrder(int clientId, String skuGuid, Date startDate, Date endDate) { + public RentalOrderDTO createOrder(int clientId, String skuGuid, Date startDate, Date endDate) { SkuPrice skuPrice = vehicleService.getSkuPriceInSelectedPeriod(skuGuid, startDate, endDate); String skuPriceString = skuPrice.getSkuPrice().toString(); - InsertOrderDTO insertOrderDTO = InsertOrderDTO.builder() + RentalOrderDTO rentalOrderDTO = RentalOrderDTO.builder() .clientId(clientId) - .totalPriceString(skuPriceString) + .totalPrice(skuPriceString) .build(); - int effectRowsOnRentalOrder = rentalOrderRepo.insertOrder(insertOrderDTO); - int orderId = insertOrderDTO.getOrderId(); - int effectRowsOnRentalSchedule = rentalScheduleRepo.insertSchedule(skuGuid, startDate, endDate, skuPriceString, orderId); + int effectRowsOnRentalOrder = rentalOrderRepo.insertOrder(rentalOrderDTO); + int newOrderId = rentalOrderDTO.getOrderId(); + int effectRowsOnRentalSchedule = rentalScheduleRepo.insertSchedule(skuGuid, startDate, endDate, skuPriceString, newOrderId); ValidateUtil.effectRowsAssert(1, effectRowsOnRentalOrder, "rentalOrderRepo"); ValidateUtil.effectRowsAssert(1, effectRowsOnRentalSchedule, "rentalScheduleRepo"); - return insertOrderDTO; + return rentalOrderDTO; } + public List selectAllOrdersByClient(int clientId) { + List rentalOrderDTOList = rentalOrderRepo.selectAllOrders(clientId); + if (rentalOrderDTOList.isEmpty()) { + rentalOrderDTOList = new ArrayList<>(); + } + return rentalOrderDTOList; + } + + public RentalOrderDTO selectOneOrderByClient(int clientId, int orderId) { + return rentalOrderRepo.selectOneOrderByClient(clientId, orderId); + } } diff --git a/software design document.md b/software design document.md index fd63233..911ba70 100644 --- a/software design document.md +++ b/software design document.md @@ -34,14 +34,14 @@ Flyway Service for database migration | get all vehicles | GET /vehicles/{offset}/{pageSize} | | get all SKUs for one vehicle | GET /vehicles/{vehicleId}/skus | | get all SKUs for one vehicle | GET /vehicles/{vehicleId}/skus/{offset}/{pageSize} | -| get available vehicles in selected period | GET /vehicles?startDate={startDate}&endDate={endDate} | +| get available vehicles in selected period | GET /vehicles?startDate={startDate}&endDate={endDate} | | get the price for one SKU in selected period | GET /vehicles/{vehiclesId}/sku/{skuId}/price?startDate={startDate}&endDate={endDate} | | | | | create an order for a SKU in selected period | POST /orders | | add other SKU in other selected period | PUT /orders/{orderId} | | update the original rental schedule | PUT /orders/{orderId}/{rentalScheduleId} | -| list one order | GET /orders/{orderId} | -| list all orders | GET /orders | +| list one order | GET /orders/{orderId}/client/{clientId} | +| list all orders | GET /orders/client/{clientId} | ## Database From edefc150c1a9a28676c9d60908084f5393ec56fc Mon Sep 17 00:00:00 2001 From: ParrySMS Date: Mon, 31 May 2021 02:23:35 +0800 Subject: [PATCH 7/9] Better details. TICKET-012 API show order --- .../retal/model/dto/RentalOrderDTO.java | 11 ++++--- .../retal/model/dto/RentalScheduleDTO.java | 19 ++++++++++++ .../repository/RentalOrderRepository.java | 29 ++++++++++++++----- software design document.md | 26 ++++++++--------- 4 files changed, 61 insertions(+), 24 deletions(-) create mode 100644 pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalScheduleDTO.java diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalOrderDTO.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalOrderDTO.java index c66b264..2f96d56 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalOrderDTO.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalOrderDTO.java @@ -1,5 +1,6 @@ package com.pocket.retal.model.dto; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -12,8 +13,10 @@ @NoArgsConstructor @AllArgsConstructor public class RentalOrderDTO { - public Integer orderId; - public Integer clientId; - public Date signingTime; - public String totalPrice; + Integer orderId; + Integer clientId; + Date signingTime; + String totalPrice; + @JsonProperty("rentalSchedule") + RentalScheduleDTO rentalScheduleDTO; } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalScheduleDTO.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalScheduleDTO.java new file mode 100644 index 0000000..dac5c79 --- /dev/null +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalScheduleDTO.java @@ -0,0 +1,19 @@ +package com.pocket.retal.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@Builder +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RentalScheduleDTO { + public String skuGuid; + public Date startTime; + public Date endTime; + public String schedulePrice; +} diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalOrderRepository.java b/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalOrderRepository.java index 78a17f0..6500e5d 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalOrderRepository.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalOrderRepository.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Options; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import java.util.List; @@ -33,13 +35,26 @@ public interface RentalOrderRepository { @Select({""}) + @Results( + value = { + @Result(property = "rentalScheduleDTO.skuGuid", column = "sku_guid"), + @Result(property = "rentalScheduleDTO.startTime", column = "start_time"), + @Result(property = "rentalScheduleDTO.endTime", column = "end_time"), + @Result(property = "rentalScheduleDTO.schedulePrice", column = "schedule_price") + }) RentalOrderDTO selectOneOrderByClient(int clientId, int orderId); } diff --git a/software design document.md b/software design document.md index 911ba70..2a001c7 100644 --- a/software design document.md +++ b/software design document.md @@ -29,19 +29,19 @@ Flyway Service for database migration ### API Design -| Feature | url | -| -------------------------------------------- | ------------------------------------------------------------ | -| get all vehicles | GET /vehicles/{offset}/{pageSize} | -| get all SKUs for one vehicle | GET /vehicles/{vehicleId}/skus | -| get all SKUs for one vehicle | GET /vehicles/{vehicleId}/skus/{offset}/{pageSize} | -| get available vehicles in selected period | GET /vehicles?startDate={startDate}&endDate={endDate} | -| get the price for one SKU in selected period | GET /vehicles/{vehiclesId}/sku/{skuId}/price?startDate={startDate}&endDate={endDate} | -| | | -| create an order for a SKU in selected period | POST /orders | -| add other SKU in other selected period | PUT /orders/{orderId} | -| update the original rental schedule | PUT /orders/{orderId}/{rentalScheduleId} | -| list one order | GET /orders/{orderId}/client/{clientId} | -| list all orders | GET /orders/client/{clientId} | +| Feature | url | +| ------------------------------------------------ | ------------------------------------------------------------ | +| **get all vehicles** | GET /vehicles/{offset}/{pageSize} | +| **get all SKUs for one vehicle** | GET /vehicles/{vehicleId}/skus | +| **get all SKUs for one vehicle** | GET /vehicles/{vehicleId}/skus/{offset}/{pageSize} | +| **get available vehicles in selected period** | GET /vehicles?startDate={startDate}&endDate={endDate} | +| **get the price for one SKU in selected period** | GET /vehicles/{vehiclesId}/sku/{skuId}/price?startDate={startDate}&endDate={endDate} | +| | | +| **create an order for a SKU in selected period** | POST /orders | +| add other SKU in other selected period | PUT /orders/{orderId}/client/{clientId} | +| update the original rental schedule | PUT /orders/{orderId}/{rentalScheduleId} | +| **list one order** | GET /orders/{orderId}/client/{clientId} | +| **list all orders** | GET /orders/client/{clientId} | ## Database From e978e217323010c1c97d3602caa085c85dd03488 Mon Sep 17 00:00:00 2001 From: ParrySMS Date: Mon, 31 May 2021 03:29:18 +0800 Subject: [PATCH 8/9] TICKET-011 API add the {SKU + period} into order --- .../retal/controller/OrderController.java | 33 +++++++++++------ .../model/UpdateOneOrderRequestBody.java | 21 +++++++++++ .../com/pocket/retal/model/ValidDate.java | 17 +++++++++ .../retal/model/dto/RentalOrderDTO.java | 5 ++- .../retal/model/dto/RentalScheduleDTO.java | 8 ++-- .../repository/RentalOrderRepository.java | 37 ++++++++++--------- .../retal/service/RentalOrderService.java | 21 ++++++++++- .../com/pocket/retal/util/ValidateUtil.java | 20 ++++++++++ .../db/migration/R__insert_pocket_sku.sql | 4 +- .../R__insert_pocket_vehicle_sku_price.sql | 20 +++++----- 10 files changed, 139 insertions(+), 47 deletions(-) create mode 100644 pocket-rental-company/src/main/java/com/pocket/retal/model/UpdateOneOrderRequestBody.java create mode 100644 pocket-rental-company/src/main/java/com/pocket/retal/model/ValidDate.java diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/controller/OrderController.java b/pocket-rental-company/src/main/java/com/pocket/retal/controller/OrderController.java index 2a17c69..b79f2da 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/controller/OrderController.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/controller/OrderController.java @@ -3,6 +3,8 @@ import com.pocket.retal.model.ApiResult; import com.pocket.retal.model.InsertSkuOrderRequestBody; +import com.pocket.retal.model.UpdateOneOrderRequestBody; +import com.pocket.retal.model.ValidDate; import com.pocket.retal.model.dto.RentalOrderDTO; import com.pocket.retal.service.RentalOrderService; import com.pocket.retal.util.ValidateUtil; @@ -13,6 +15,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -51,22 +54,30 @@ public ResponseEntity> selectOneOrderByClient( return ApiResult.ok(rentalOrderService.selectOneOrderByClient(clientId, orderId)); } + @PutMapping("{orderId}") + public ResponseEntity> addOneSchduleInExistingOrder( + @PathVariable("orderId") int orderId, + @RequestBody UpdateOneOrderRequestBody updateOneOrderRequestBody + ) throws ParseException { + ValidDate validDate = ValidateUtil.getValidDate(updateOneOrderRequestBody.getStartDateStr(), updateOneOrderRequestBody.getEndDateStr()); + Date startDate = validDate.getStartDate(); + Date endDate = validDate.getEndDate(); + int clientId = updateOneOrderRequestBody.getClientId(); + String skuGuid = updateOneOrderRequestBody.getSkuGuid(); + ValidateUtil.min(clientId, 1, "clientId"); + ValidateUtil.min(orderId, 1, "orderId"); + ValidateUtil.notNullOrEmptyOrBlank(skuGuid, "skuGuid"); + ValidateUtil.IsValidUUID(skuGuid, "skuGuid"); + return ApiResult.ok(rentalOrderService.addOneSchduleInExistingOrder(clientId, orderId, skuGuid, startDate, endDate)); + } @PostMapping("") public ResponseEntity> insertSkuOrder( @RequestBody InsertSkuOrderRequestBody insertSkuOrderRequestBody ) throws ParseException { - Date startDate = ValidateUtil.parseDate(insertSkuOrderRequestBody.getStartDateStr(), null, true); - Date endDate = ValidateUtil.parseDate(insertSkuOrderRequestBody.getEndDateStr(), null, true); - Date today = new Date(); - ValidateUtil.Friendly.assertFalse(startDate.before(today), - "startDate should not before today"); - ValidateUtil.Friendly.assertFalse(endDate.before(today), - "endDate should not before today"); - ValidateUtil.Friendly.assertFalse(endDate.before(startDate), - "endDate should not before startDate"); - ValidateUtil.Friendly.assertFalse(endDate.equals(startDate), - "endDate should not be the same as startDate"); + ValidDate validDate = ValidateUtil.getValidDate(insertSkuOrderRequestBody.getStartDateStr(), insertSkuOrderRequestBody.getEndDateStr()); + Date startDate = validDate.getStartDate(); + Date endDate = validDate.getEndDate(); String skuGuid = insertSkuOrderRequestBody.getSkuGuid(); int clientId = insertSkuOrderRequestBody.getClientId(); ValidateUtil.min(clientId, 1, "clientId"); diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/UpdateOneOrderRequestBody.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/UpdateOneOrderRequestBody.java new file mode 100644 index 0000000..07f4c82 --- /dev/null +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/UpdateOneOrderRequestBody.java @@ -0,0 +1,21 @@ +package com.pocket.retal.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UpdateOneOrderRequestBody { + Integer clientId; + String skuGuid; + @JsonProperty("startDate") + String startDateStr; + @JsonProperty("endDate") + String endDateStr; +} diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/ValidDate.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/ValidDate.java new file mode 100644 index 0000000..8cb1354 --- /dev/null +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/ValidDate.java @@ -0,0 +1,17 @@ +package com.pocket.retal.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ValidDate { + Date startDate; + Date endDate; +} diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalOrderDTO.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalOrderDTO.java index 2f96d56..35c267f 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalOrderDTO.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalOrderDTO.java @@ -7,6 +7,7 @@ import lombok.NoArgsConstructor; import java.util.Date; +import java.util.List; @Builder @Data @@ -17,6 +18,6 @@ public class RentalOrderDTO { Integer clientId; Date signingTime; String totalPrice; - @JsonProperty("rentalSchedule") - RentalScheduleDTO rentalScheduleDTO; + @JsonProperty("rentalSchedules") + List rentalScheduleDTO; } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalScheduleDTO.java b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalScheduleDTO.java index dac5c79..edf280d 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalScheduleDTO.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/model/dto/RentalScheduleDTO.java @@ -12,8 +12,8 @@ @NoArgsConstructor @AllArgsConstructor public class RentalScheduleDTO { - public String skuGuid; - public Date startTime; - public Date endTime; - public String schedulePrice; + String skuGuid; + Date startTime; + Date endTime; + String schedulePrice; } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalOrderRepository.java b/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalOrderRepository.java index 6500e5d..cbea3de 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalOrderRepository.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/repository/RentalOrderRepository.java @@ -1,12 +1,11 @@ package com.pocket.retal.repository; import com.pocket.retal.model.dto.RentalOrderDTO; +import com.pocket.retal.model.dto.RentalScheduleDTO; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Options; import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Result; -import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import java.util.List; @@ -29,32 +28,36 @@ public interface RentalOrderRepository { " signing_time, " + " total_price " + " FROM [pocket].[pocket_rental_order] " + - " WHERE client_id = #{clientId}" + + " WHERE client_id = #{clientId} " + ""}) List selectAllOrders(int clientId); @Select({""}) + RentalOrderDTO selectOneOrderByClient(int clientId, int orderId); + + @Select({""}) - @Results( - value = { - @Result(property = "rentalScheduleDTO.skuGuid", column = "sku_guid"), - @Result(property = "rentalScheduleDTO.startTime", column = "start_time"), - @Result(property = "rentalScheduleDTO.endTime", column = "end_time"), - @Result(property = "rentalScheduleDTO.schedulePrice", column = "schedule_price") - }) - RentalOrderDTO selectOneOrderByClient(int clientId, int orderId); + List selectAllSchedulesInOneOrderByClient(int clientId, int orderId); + + // TODO: + int updateTotalPrice(int orderId, String skuPriceString); } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/service/RentalOrderService.java b/pocket-rental-company/src/main/java/com/pocket/retal/service/RentalOrderService.java index 592a22a..4fb73be 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/service/RentalOrderService.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/service/RentalOrderService.java @@ -2,6 +2,7 @@ import com.pocket.retal.model.SkuPrice; import com.pocket.retal.model.dto.RentalOrderDTO; +import com.pocket.retal.model.dto.RentalScheduleDTO; import com.pocket.retal.repository.RentalOrderRepository; import com.pocket.retal.repository.RentalScheduleRepository; import com.pocket.retal.util.ValidateUtil; @@ -37,6 +38,7 @@ public RentalOrderDTO createOrder(int clientId, String skuGuid, Date startDate, .build(); int effectRowsOnRentalOrder = rentalOrderRepo.insertOrder(rentalOrderDTO); int newOrderId = rentalOrderDTO.getOrderId(); + //TODO check available time before insertSchedule int effectRowsOnRentalSchedule = rentalScheduleRepo.insertSchedule(skuGuid, startDate, endDate, skuPriceString, newOrderId); ValidateUtil.effectRowsAssert(1, effectRowsOnRentalOrder, "rentalOrderRepo"); ValidateUtil.effectRowsAssert(1, effectRowsOnRentalSchedule, "rentalScheduleRepo"); @@ -52,6 +54,23 @@ public List selectAllOrdersByClient(int clientId) { } public RentalOrderDTO selectOneOrderByClient(int clientId, int orderId) { - return rentalOrderRepo.selectOneOrderByClient(clientId, orderId); + List rentalScheduleList = rentalOrderRepo.selectAllSchedulesInOneOrderByClient(clientId, orderId); + RentalOrderDTO rentalOrderDTO = rentalOrderRepo.selectOneOrderByClient(clientId, orderId); + rentalOrderDTO.setRentalScheduleDTO(rentalScheduleList); + return rentalOrderDTO; + } + + public RentalOrderDTO addOneSchduleInExistingOrder(int clientId, int orderId, String skuGuid, Date startDate, Date endDate) { + SkuPrice skuPrice = vehicleService.getSkuPriceInSelectedPeriod(skuGuid, startDate, endDate); + String skuPriceString = skuPrice.getSkuPrice().toString(); + //TODO check available time before insertSchedule + int effectRowsOnRentalSchedule = rentalScheduleRepo.insertSchedule(skuGuid, startDate, endDate, skuPriceString, orderId); + ValidateUtil.effectRowsAssert(1, effectRowsOnRentalSchedule, "rentalScheduleRepo"); + // TODO: S1: get total price , lock, add , then update + // S2: handle in SQL to update by self .. + int effectRowsOnRentalOrder = rentalOrderRepo.updateTotalPrice(orderId, skuPriceString); +// ValidateUtil.effectRowsAssert(1, effectRowsOnRentalOrder, "rentalOrderRepo"); + + return selectOneOrderByClient(clientId, orderId); } } diff --git a/pocket-rental-company/src/main/java/com/pocket/retal/util/ValidateUtil.java b/pocket-rental-company/src/main/java/com/pocket/retal/util/ValidateUtil.java index bc864ee..f0b69f8 100644 --- a/pocket-rental-company/src/main/java/com/pocket/retal/util/ValidateUtil.java +++ b/pocket-rental-company/src/main/java/com/pocket/retal/util/ValidateUtil.java @@ -2,6 +2,7 @@ import com.pocket.retal.exception.PocketApiException; import com.pocket.retal.exception.ValidationException; +import com.pocket.retal.model.ValidDate; import com.pocket.retal.model.enumeration.PocketResponseStatus; import java.text.ParseException; @@ -101,4 +102,23 @@ public static void effectRowsAssert(int expectedNum, int effectRows, String repo "effectRows != expectedNum on " + reposName); } } + + public static ValidDate getValidDate(String startDateStr, String endDateStr) throws ParseException { + Date startDate = parseDate(startDateStr, null, true); + Date endDate = parseDate(endDateStr, null, true); + Date today = new Date(); + ValidateUtil.Friendly.assertFalse(startDate.before(today), + "startDate should not before today"); + ValidateUtil.Friendly.assertFalse(endDate.before(today), + "endDate should not before today"); + ValidateUtil.Friendly.assertFalse(endDate.before(startDate), + "endDate should not before startDate"); + ValidateUtil.Friendly.assertFalse(endDate.equals(startDate), + "endDate should not be the same as startDate"); + + return ValidDate.builder() + .startDate(startDate) + .endDate(endDate) + .build(); + } } \ No newline at end of file diff --git a/storage/db-sql-server/src/main/resources/db/migration/R__insert_pocket_sku.sql b/storage/db-sql-server/src/main/resources/db/migration/R__insert_pocket_sku.sql index 19c346d..acb40eb 100644 --- a/storage/db-sql-server/src/main/resources/db/migration/R__insert_pocket_sku.sql +++ b/storage/db-sql-server/src/main/resources/db/migration/R__insert_pocket_sku.sql @@ -12,9 +12,9 @@ INSERT [pocket].[pocket_sku] (sku_guid, vehicle_id, color, create_on, last_modif -- BWM INSERT [pocket].[pocket_sku] (sku_guid, vehicle_id, color, create_on, last_modified) - VALUES ('bkq29752-b794-4703-541j-fa3d6h9l0105', 2, 'SUPER WHITE', GETDATE(), GETDATE()) -- id:3 + VALUES ('006ca2f8-a8df-43cc-b85e-59208b3635bc', 2, 'SUPER WHITE', GETDATE(), GETDATE()) -- id:3 INSERT [pocket].[pocket_sku] (sku_guid, vehicle_id, color, create_on, last_modified) - VALUES ('b7155a02-4558-4956-bba9-d77e9e75ca32', 2, 'BLUEPRINT', GETDATE(), GETDATE()) -- id:4 + VALUES ('341dbdc5-4a62-48ed-a146-e86078e949a2', 2, 'BLUEPRINT', GETDATE(), GETDATE()) -- id:4 GO diff --git a/storage/db-sql-server/src/main/resources/db/migration/R__insert_pocket_vehicle_sku_price.sql b/storage/db-sql-server/src/main/resources/db/migration/R__insert_pocket_vehicle_sku_price.sql index 06f49f1..0967989 100644 --- a/storage/db-sql-server/src/main/resources/db/migration/R__insert_pocket_vehicle_sku_price.sql +++ b/storage/db-sql-server/src/main/resources/db/migration/R__insert_pocket_vehicle_sku_price.sql @@ -38,35 +38,35 @@ INSERT [pocket].[pocket_sku_price] (sku_guid, price_frequency_id, price, create_ -- BWM 3 INSERT [pocket].[pocket_sku_price] (sku_guid, price_frequency_id, price, create_on, last_modified) - VALUES ('bkq29752-b794-4703-541j-fa3d6h9l0105', 1, '180.00', GETDATE(), GETDATE()) -- Daily + VALUES ('006ca2f8-a8df-43cc-b85e-59208b3635bc', 1, '180.00', GETDATE(), GETDATE()) -- Daily INSERT [pocket].[pocket_sku_price] (sku_guid, price_frequency_id, price, create_on, last_modified) - VALUES ('bkq29752-b794-4703-541j-fa3d6h9l0105', 2, '1230.00', GETDATE(), GETDATE()) -- Weekly + VALUES ('006ca2f8-a8df-43cc-b85e-59208b3635bc', 2, '1230.00', GETDATE(), GETDATE()) -- Weekly INSERT [pocket].[pocket_sku_price] (sku_guid, price_frequency_id, price, create_on, last_modified) - VALUES ('bkq29752-b794-4703-541j-fa3d6h9l0105', 3, '4420.00', GETDATE(), GETDATE()) -- Monthly + VALUES ('006ca2f8-a8df-43cc-b85e-59208b3635bc', 3, '4420.00', GETDATE(), GETDATE()) -- Monthly INSERT [pocket].[pocket_sku_price] (sku_guid, price_frequency_id, price, create_on, last_modified) - VALUES ('bkq29752-b794-4703-541j-fa3d6h9l0105', 4, '25000.00', GETDATE(), GETDATE()) -- Half-Yearly + VALUES ('006ca2f8-a8df-43cc-b85e-59208b3635bc', 4, '25000.00', GETDATE(), GETDATE()) -- Half-Yearly INSERT [pocket].[pocket_sku_price] (sku_guid, price_frequency_id, price, create_on, last_modified) - VALUES ('bkq29752-b794-4703-541j-fa3d6h9l0105', 5, '50000.00', GETDATE(), GETDATE()) -- Yearly + VALUES ('006ca2f8-a8df-43cc-b85e-59208b3635bc', 5, '50000.00', GETDATE(), GETDATE()) -- Yearly -- BWM 4 INSERT [pocket].[pocket_sku_price] (sku_guid, price_frequency_id, price, create_on, last_modified) - VALUES ('b7155a02-4558-4956-bba9-d77e9e75ca32', 1, '210.00', GETDATE(), GETDATE()) -- Daily + VALUES ('341dbdc5-4a62-48ed-a146-e86078e949a2', 1, '210.00', GETDATE(), GETDATE()) -- Daily INSERT [pocket].[pocket_sku_price] (sku_guid, price_frequency_id, price, create_on, last_modified) - VALUES ('b7155a02-4558-4956-bba9-d77e9e75ca32', 2, '1300.00', GETDATE(), GETDATE()) -- Weekly + VALUES ('341dbdc5-4a62-48ed-a146-e86078e949a2', 2, '1300.00', GETDATE(), GETDATE()) -- Weekly INSERT [pocket].[pocket_sku_price] (sku_guid, price_frequency_id, price, create_on, last_modified) - VALUES ('b7155a02-4558-4956-bba9-d77e9e75ca32', 3, '4650.00', GETDATE(), GETDATE()) -- Monthly + VALUES ('341dbdc5-4a62-48ed-a146-e86078e949a2', 3, '4650.00', GETDATE(), GETDATE()) -- Monthly INSERT [pocket].[pocket_sku_price] (sku_guid, price_frequency_id, price, create_on, last_modified) - VALUES ('b7155a02-4558-4956-bba9-d77e9e75ca32', 4, '26500.00', GETDATE(), GETDATE()) -- Half-Yearly + VALUES ('341dbdc5-4a62-48ed-a146-e86078e949a2', 4, '26500.00', GETDATE(), GETDATE()) -- Half-Yearly INSERT [pocket].[pocket_sku_price] (sku_guid, price_frequency_id, price, create_on, last_modified) - VALUES ('b7155a02-4558-4956-bba9-d77e9e75ca32', 5, '51800.00', GETDATE(), GETDATE()) -- Yearly + VALUES ('341dbdc5-4a62-48ed-a146-e86078e949a2', 5, '51800.00', GETDATE(), GETDATE()) -- Yearly GO \ No newline at end of file From 0a1bb6ea8826b0a5cf25d0098e8895f2aef2fa1e Mon Sep 17 00:00:00 2001 From: ParrySMS Date: Mon, 31 May 2021 03:30:04 +0800 Subject: [PATCH 9/9] update API doc --- software design document.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/software design document.md b/software design document.md index 2a001c7..243f00a 100644 --- a/software design document.md +++ b/software design document.md @@ -37,8 +37,8 @@ Flyway Service for database migration | **get available vehicles in selected period** | GET /vehicles?startDate={startDate}&endDate={endDate} | | **get the price for one SKU in selected period** | GET /vehicles/{vehiclesId}/sku/{skuId}/price?startDate={startDate}&endDate={endDate} | | | | -| **create an order for a SKU in selected period** | POST /orders | -| add other SKU in other selected period | PUT /orders/{orderId}/client/{clientId} | +| **create an order for a SKU in selected period** | POST /orders with body | +| **add other SKU in other selected period** | PUT /orders/{orderId} with body | | update the original rental schedule | PUT /orders/{orderId}/{rentalScheduleId} | | **list one order** | GET /orders/{orderId}/client/{clientId} | | **list all orders** | GET /orders/client/{clientId} |