更新了写真预约特殊产品处理

This commit is contained in:
chen-xin-zhi 2025-03-10 08:25:11 +08:00
parent b6386a8c9e
commit d54d93a78c
7 changed files with 204 additions and 24 deletions

View File

@ -6,7 +6,7 @@ public interface MqConstant {
// List<Long> DELAY_MILLIS = List.of(10000L, 10000L, 10000L, 15000L, 15000L, 30000L, 30000L, 60000L, 60000L, 120000L, 300000L, 600000L, 600000L)); // List<Long> DELAY_MILLIS = List.of(10000L, 10000L, 10000L, 15000L, 15000L, 30000L, 30000L, 60000L, 60000L, 120000L, 300000L, 600000L, 600000L));
List<Long> DELAY_MILLIS = List.of(10000L, 10000L, 10000L, 15000L, 15000L, 30000L, 30000L); List<Long> DELAY_MILLIS = List.of(10000L, 10000L, 10000L, 15000L, 15000L);
String DELAY_EXCHANGE = "delay.topic"; String DELAY_EXCHANGE = "delay.topic";

View File

@ -364,9 +364,9 @@ public class PhotoProductsController {
List<BookingDateVO> bookingDateVOList = new ArrayList<>(); List<BookingDateVO> bookingDateVOList = new ArrayList<>();
// 过滤掉不合理的预约时间 // 过滤掉不合理的预约时间
for (BookingDateVO bookingDateVO : bookingDateVOS) { for (BookingDateVO bookingDateVO : bookingDateVOS) {
// 过滤掉没有空闲的预约时间 // 过滤掉没有空闲的预约日期
if (bookingDateVO.getIsAvailable() == 0) continue; if (bookingDateVO.getIsAvailable() == 0) continue;
// 过滤掉已过期的预约时间 // 过滤掉已过期的预约日期
String specificDate = bookingDateVO.getSpecificDate(); String specificDate = bookingDateVO.getSpecificDate();
String today = DateUtil.today(); String today = DateUtil.today();
int result = DateUtil.compare(DateUtil.parse(specificDate), DateUtil.parse(today)); int result = DateUtil.compare(DateUtil.parse(specificDate), DateUtil.parse(today));
@ -375,11 +375,12 @@ public class PhotoProductsController {
List<BookingTimeVO> bookingTimeVOS = bookingDateVO.getBookingTimeVOList(); List<BookingTimeVO> bookingTimeVOS = bookingDateVO.getBookingTimeVOList();
if (result == 0) { if (result == 0) {
bookingTimeVOS = bookingTimeVOS.stream().filter(bookingTimeVO -> { bookingTimeVOS = bookingTimeVOS.stream().filter(bookingTimeVO -> {
String timePoint = bookingTimeVO.getTimePoint() + ":00"; String point = bookingTimeVO.getTimePoint();
String timePoint = point + ":00";
DateTime targetTime = DateUtil.parse(timePoint, "HH:mm:ss"); DateTime targetTime = DateUtil.parse(timePoint, "HH:mm:ss");
DateTime now = DateUtil.date(); DateTime now = DateUtil.date();
DateTime currentTime = DateUtil.parse(now.toString("HH:mm:ss"), "HH:mm:ss"); DateTime currentTime = DateUtil.parse(now.toString("HH:mm:ss"), "HH:mm:ss");
return currentTime.compareTo(targetTime) < 0 && isOccupiedMap.get(specificDate + "&" + timePoint) == null; return currentTime.compareTo(targetTime) < 0 && isOccupiedMap.get(specificDate + "&" + point) == null;
}).toList(); }).toList();
} else { } else {
bookingTimeVOS = bookingTimeVOS.stream().filter(bookingTimeVO -> { bookingTimeVOS = bookingTimeVOS.stream().filter(bookingTimeVO -> {

View File

@ -26,6 +26,7 @@ import com.cultural.heritage.model.dto.good.service.ServiceGoodAddRequest;
import com.cultural.heritage.model.dto.good.service.ServiceGoodQueryRequest; import com.cultural.heritage.model.dto.good.service.ServiceGoodQueryRequest;
import com.cultural.heritage.model.dto.good.service.ServiceGoodSingleUpdateRequest; import com.cultural.heritage.model.dto.good.service.ServiceGoodSingleUpdateRequest;
import com.cultural.heritage.model.dto.good.service.ServiceGoodUpdateRequest; import com.cultural.heritage.model.dto.good.service.ServiceGoodUpdateRequest;
import com.cultural.heritage.model.dto.order.BuySingleServiceGoodVerifyRequest;
import com.cultural.heritage.model.dto.timePeriod.TimePeriodAddRequest; import com.cultural.heritage.model.dto.timePeriod.TimePeriodAddRequest;
import com.cultural.heritage.model.entity.*; import com.cultural.heritage.model.entity.*;
import com.cultural.heritage.model.vo.appointment.AppointmentDateTimePeriodVO; import com.cultural.heritage.model.vo.appointment.AppointmentDateTimePeriodVO;
@ -94,6 +95,55 @@ public class GoodController {
/**
* 小程序端校验常规类商品立即购买
* @param commonRequest 商品id
* @return 商品是否通过校验
*/
@PostMapping("/checkGeneralGood")
@Operation(summary = "小程序端校验常规类商品立即购买", description = "参数商品id权限所有人方法名checkGeneralGood")
public BaseResponse<Boolean> checkGeneralGood(@RequestBody CommonRequest commonRequest) {
if (commonRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long id = commonRequest.getId();
Good good = goodService.getById(id);
goodService.checkGoodIsExist(good);
goodService.checkInventoryIsEnough(1, good.getInventory());
return ResultUtils.success(true);
}
/**
* 小程序端校验服务类商品立即购买
* @param buySingleServiceGoodVerifyRequest 服务类商品校验请求体
* @return 商品是否通过校验
*/
@PostMapping("/checkServiceGood")
@Operation(summary = "小程序端校验服务类商品立即购买", description = "参数服务类商品校验请求体权限所有人方法名BuySingleServiceGoodVerifyRequest")
public BaseResponse<Boolean> checkServiceGood(@RequestBody BuySingleServiceGoodVerifyRequest buySingleServiceGoodVerifyRequest) {
if (buySingleServiceGoodVerifyRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
// 校验服务类商品预约参数
goodService.validServiceGoodBookingParameter(buySingleServiceGoodVerifyRequest);
Long goodId = buySingleServiceGoodVerifyRequest.getGoodId();
String reservationDate = buySingleServiceGoodVerifyRequest.getReservationDate();
String timeSlot = buySingleServiceGoodVerifyRequest.getTimeSlot();
Integer quantity = buySingleServiceGoodVerifyRequest.getQuantity();
Good good = goodService.getById(goodId);
goodService.checkGoodIsExist(good);
goodService.checkServiceGoodBookingDetailIsProperly(goodId, reservationDate, timeSlot, quantity);
return ResultUtils.success(true);
}
/** /**
* Web端管理员添加常规类商品 * Web端管理员添加常规类商品

View File

@ -1,6 +1,8 @@
package com.cultural.heritage.controller.order; package com.cultural.heritage.controller.order;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cultural.heritage.annotation.AuthCheck; import com.cultural.heritage.annotation.AuthCheck;
@ -16,13 +18,12 @@ import com.cultural.heritage.model.dto.advanceOrder.AdvanceOrderAddRequest;
import com.cultural.heritage.model.dto.advanceOrder.AdvanceOrderQueryRequest; import com.cultural.heritage.model.dto.advanceOrder.AdvanceOrderQueryRequest;
import com.cultural.heritage.model.dto.snapshot.ContactsSnapshot; import com.cultural.heritage.model.dto.snapshot.ContactsSnapshot;
import com.cultural.heritage.model.dto.snapshot.PhotoProductsSnapshot; import com.cultural.heritage.model.dto.snapshot.PhotoProductsSnapshot;
import com.cultural.heritage.model.entity.AdvanceOrder; import com.cultural.heritage.model.entity.*;
import com.cultural.heritage.model.entity.Contacts;
import com.cultural.heritage.model.entity.PhotoProducts;
import com.cultural.heritage.model.entity.User;
import com.cultural.heritage.model.vo.advanceorder.AdvanceOrderVO; import com.cultural.heritage.model.vo.advanceorder.AdvanceOrderVO;
import com.cultural.heritage.service.address.ContactsService; import com.cultural.heritage.service.address.ContactsService;
import com.cultural.heritage.service.book.AdvanceOrderService; import com.cultural.heritage.service.book.AdvanceOrderService;
import com.cultural.heritage.service.book.BookingDateService;
import com.cultural.heritage.service.book.BookingTimeService;
import com.cultural.heritage.service.book.PhotoProductsService; import com.cultural.heritage.service.book.PhotoProductsService;
import com.cultural.heritage.service.common.CommonService; import com.cultural.heritage.service.common.CommonService;
import com.cultural.heritage.service.user.UserService; import com.cultural.heritage.service.user.UserService;
@ -40,7 +41,9 @@ import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
@RestController @RestController
@RequestMapping("/advanceOrder") @RequestMapping("/advanceOrder")
@ -69,6 +72,14 @@ public class AdvanceOrderController {
private CommonService commonService; private CommonService commonService;
@Resource
private BookingDateService bookingDateService;
@Resource
private BookingTimeService bookingTimeService;
/** /**
@ -85,9 +96,36 @@ public class AdvanceOrderController {
// 获取用户id // 获取用户id
User loginUser = userService.getLoginUser(request); User loginUser = userService.getLoginUser(request);
Long userId = loginUser.getId(); Long userId = loginUser.getId();
// 校验当前订单时间是否被预约过或者已过期
String specificDate = addAdvanceOrderRequest.getSpecificDate(); // 获取写真产品信息
String timePoint = addAdvanceOrderRequest.getTimePoint(); Long photoProductId = addAdvanceOrderRequest.getPhotoProductId();
PhotoProducts photoProducts = photoProductsService.getById(photoProductId);
ThrowUtils.throwIf(photoProducts == null || photoProducts.getIsShelves() == 0, ErrorCode.OPERATION_ERROR, "当前写真产品不存在或者已下架");
PhotoProductsSnapshot photoProductsSnapshot = new PhotoProductsSnapshot();
BeanUtils.copyProperties(photoProducts, photoProductsSnapshot);
// 校验当前订单的预约日期和预约时间是否存在
Long bookingDateId = addAdvanceOrderRequest.getBookingDateId();
Long bookingTimeId = addAdvanceOrderRequest.getBookingTimeId();
BookingDate bookingDate = bookingDateService.getById(bookingDateId);
ThrowUtils.throwIf(bookingDate == null || bookingDate.getIsAvailable() == 0, ErrorCode.OPERATION_ERROR, "当前预约日期不存在或者已不可预约");
BookingTime bookingTime = bookingTimeService.getById(bookingTimeId);
ThrowUtils.throwIf(bookingTime == null, ErrorCode.OPERATION_ERROR, "当前预约时间不存在");
// 校验当前订单的拍摄场景是否存在
String shotScene = photoProducts.getShotScene();
Integer isIndoors = addAdvanceOrderRequest.getIsIndoors();
ThrowUtils.throwIf(shotScene.equals("室内") && isIndoors == 0 || shotScene.equals("室外") && isIndoors == 1, ErrorCode.OPERATION_ERROR, "拍摄场景不存在");
// 校验当前订单的的拍摄人数是否合理
Integer number = addAdvanceOrderRequest.getQuantity();
Integer maxNumber = photoProducts.getMaxNumber();
Integer minNumber = photoProducts.getMinNumber();
ThrowUtils.throwIf(number < minNumber || number > maxNumber, ErrorCode.OPERATION_ERROR, "预约人数不在范围内");
// 校验当前订单预约时间是否被预约过或者已过期
String specificDate = bookingDate.getSpecificDate();
String timePoint = bookingTime.getTimePoint();
advanceOrderService.validBookingTime(specificDate, timePoint); advanceOrderService.validBookingTime(specificDate, timePoint);
// 获取联系人信息 // 获取联系人信息
Long contactsId = addAdvanceOrderRequest.getContactsId(); Long contactsId = addAdvanceOrderRequest.getContactsId();
@ -95,12 +133,6 @@ public class AdvanceOrderController {
ThrowUtils.throwIf(contacts == null, ErrorCode.OPERATION_ERROR, "联系人信息不存在"); ThrowUtils.throwIf(contacts == null, ErrorCode.OPERATION_ERROR, "联系人信息不存在");
ContactsSnapshot contactsSnapshot = new ContactsSnapshot(); ContactsSnapshot contactsSnapshot = new ContactsSnapshot();
BeanUtils.copyProperties(contacts, contactsSnapshot); BeanUtils.copyProperties(contacts, contactsSnapshot);
// 获取写真产品信息
Long photoProductId = addAdvanceOrderRequest.getPhotoProductId();
PhotoProducts photoProducts = photoProductsService.getById(photoProductId);
ThrowUtils.throwIf(photoProducts == null, ErrorCode.OPERATION_ERROR, "当前写真产品不存在");
PhotoProductsSnapshot photoProductsSnapshot = new PhotoProductsSnapshot();
BeanUtils.copyProperties(photoProducts, photoProductsSnapshot);
// 计算订单总金额 // 计算订单总金额
BigDecimal price = photoProducts.getPrice(); BigDecimal price = photoProducts.getPrice();
Integer quantity = addAdvanceOrderRequest.getQuantity(); Integer quantity = addAdvanceOrderRequest.getQuantity();
@ -111,6 +143,8 @@ public class AdvanceOrderController {
AdvanceOrder advanceOrder = new AdvanceOrder(); AdvanceOrder advanceOrder = new AdvanceOrder();
BeanUtils.copyProperties(addAdvanceOrderRequest, advanceOrder); BeanUtils.copyProperties(addAdvanceOrderRequest, advanceOrder);
advanceOrder.setUserId(userId); advanceOrder.setUserId(userId);
advanceOrder.setSpecificDate(specificDate);
advanceOrder.setTimePoint(timePoint);
advanceOrder.setContactsSnapshot(contactsSnapshot); advanceOrder.setContactsSnapshot(contactsSnapshot);
advanceOrder.setPhotoProductsSnapshot(photoProductsSnapshot); advanceOrder.setPhotoProductsSnapshot(photoProductsSnapshot);
advanceOrder.setTotalAmount(totalAmount); advanceOrder.setTotalAmount(totalAmount);
@ -229,4 +263,76 @@ public class AdvanceOrderController {
} }
/**
* 小程序端校验写真产品立即预约
* @param commonRequest 写真产品id
* @return 产品是否通过校验
*/
@PostMapping ("/check/photoProducts")
@Operation(summary = "小程序端校验写真产品立即预约", description = "参数写真产品id权限所有人方法名cancelOrderById")
public BaseResponse<Boolean> checkPhotoProducts(@RequestBody CommonRequest commonRequest, HttpServletRequest request) {
if (commonRequest == null || commonRequest.getId() <= 0) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long id = commonRequest.getId();
userService.getLoginUser(request);
PhotoProducts photoProducts = photoProductsService.getById(id);
ThrowUtils.throwIf(photoProducts == null || photoProducts.getIsShelves() == 0, ErrorCode.OPERATION_ERROR, "当前写真产品不存在或者已下架");
// 判断当前写真产品是否存在预约时间段
// 获取所有写真预约类订单
Map<String, Integer> isOccupiedMap = new HashMap<>();
QueryWrapper<AdvanceOrder> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("orderStatus", OrderStatusConstant.PENDING_PAYMENT).or().eq("orderStatus", OrderStatusConstant.PENDING_SHIPMENT);
List<AdvanceOrder> advanceOrderList = advanceOrderService.list(queryWrapper);
for (AdvanceOrder advanceOrder : advanceOrderList) {
String specificDate = advanceOrder.getSpecificDate();
String timePoint = advanceOrder.getTimePoint();
isOccupiedMap.put(specificDate + "&" + timePoint, 1);
}
// 获取预约日期表
List<BookingDate> bookingDateList = commonService.findByFieldEqTargetField("photoProductId", id, bookingDateService);
// 获取预约时间表
List<BookingTime> bookingTimeList = commonService.findByFieldInTargetField(bookingDateList, bookingTimeService, BookingDate::getId, "bookingDateId");
boolean isExistAvailable = false;
for (BookingDate bookingDate : bookingDateList) {
Long bookingDateId = bookingDate.getId();
// 过滤掉没有空闲的预约日期
if (bookingDate.getIsAvailable() == 0) continue;
// 过滤掉已过期的预约日期
String specificDate = bookingDate.getSpecificDate();
String today = DateUtil.today();
int result = DateUtil.compare(DateUtil.parse(specificDate), DateUtil.parse(today));
if (result < 0) continue;
// 如果预约日期相同过滤掉预约时间以及被占用的时间
List<BookingTime> bookingTimes = bookingTimeList.stream().filter(bookingTime -> bookingTime.getBookingDateId().equals(bookingDateId)).toList();
if (result == 0) {
for (BookingTime bookingTime : bookingTimes) {
String point = bookingTime.getTimePoint();
String timePoint = point + ":00";
DateTime targetTime = DateUtil.parse(timePoint, "HH:mm:ss");
DateTime now = DateUtil.date();
DateTime currentTime = DateUtil.parse(now.toString("HH:mm:ss"), "HH:mm:ss");
isExistAvailable = currentTime.compareTo(targetTime) < 0 && isOccupiedMap.get(specificDate + "&" + point) == null;
if (isExistAvailable) break;
}
} else {
for (BookingTime bookingTime : bookingTimes) {
String timePoint = bookingTime.getTimePoint();
isExistAvailable = isOccupiedMap.get(specificDate + "&" + timePoint) == null;
if (isExistAvailable) break;
}
}
if (isExistAvailable) break;
}
ThrowUtils.throwIf(!isExistAvailable, ErrorCode.OPERATION_ERROR, "当前写真产品的所有时段已约满");
return ResultUtils.success(true);
}
} }

View File

@ -27,17 +27,17 @@ public class AdvanceOrderAddRequest implements Serializable {
/** /**
* 预约具体日期 * 预约日期id
*/ */
@Schema(description = "预约具体日期", example = "2024-11-18") @Schema(description = "预约日期id", example = "44")
private String specificDate; private Long bookingDateId;
/** /**
* 预约时间 * 预约时间id
*/ */
@Schema(description = "预约时间", example = "8:00-10:00") @Schema(description = "预约时间id", example = "33")
private String timePoint; private Long bookingTimeId;
/** /**

View File

@ -3,6 +3,7 @@ package com.cultural.heritage.service.good;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.cultural.heritage.model.dto.good.GoodQueryRequest; import com.cultural.heritage.model.dto.good.GoodQueryRequest;
import com.cultural.heritage.model.dto.order.BuySingleServiceGoodVerifyRequest;
import com.cultural.heritage.model.entity.*; import com.cultural.heritage.model.entity.*;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -69,4 +70,9 @@ public interface GoodService extends IService<Good> {
boolean checkServiceGoodCartBookingDetailIsProperly(Long goodId, String reservationDate, String timeSlot, Integer quantity, Map<String, PendingServiceGood> pendingServiceGoodMap, List<PendingServiceOrder> pendingServiceOrderList); boolean checkServiceGoodCartBookingDetailIsProperly(Long goodId, String reservationDate, String timeSlot, Integer quantity, Map<String, PendingServiceGood> pendingServiceGoodMap, List<PendingServiceOrder> pendingServiceOrderList);
/**
* 校验服务类商品预约参数
*/
void validServiceGoodBookingParameter(BuySingleServiceGoodVerifyRequest buySingleServiceGoodVerifyRequest);
} }

View File

@ -13,6 +13,7 @@ import com.cultural.heritage.mapper.CartRecordMapper;
import com.cultural.heritage.mapper.GoodMapper; import com.cultural.heritage.mapper.GoodMapper;
import com.cultural.heritage.model.dto.good.GoodQueryRequest; import com.cultural.heritage.model.dto.good.GoodQueryRequest;
import com.cultural.heritage.model.dto.order.BookingOrderQueryRequest; import com.cultural.heritage.model.dto.order.BookingOrderQueryRequest;
import com.cultural.heritage.model.dto.order.BuySingleServiceGoodVerifyRequest;
import com.cultural.heritage.model.entity.*; import com.cultural.heritage.model.entity.*;
import com.cultural.heritage.service.good.GoodService; import com.cultural.heritage.service.good.GoodService;
import com.cultural.heritage.service.order.PendingServiceGoodService; import com.cultural.heritage.service.order.PendingServiceGoodService;
@ -272,4 +273,20 @@ public class GoodServiceImpl extends ServiceImpl<GoodMapper, Good> implements Go
} }
/**
* 校验服务类商品预约参数
*/
@Override
public void validServiceGoodBookingParameter(BuySingleServiceGoodVerifyRequest buySingleServiceGoodVerifyRequest) {
Long goodId = buySingleServiceGoodVerifyRequest.getGoodId();
String reservationDate = buySingleServiceGoodVerifyRequest.getReservationDate();
String timeSlot = buySingleServiceGoodVerifyRequest.getTimeSlot();
Integer quantity = buySingleServiceGoodVerifyRequest.getQuantity();
ThrowUtils.throwIf(goodId == null, ErrorCode.OPERATION_ERROR, "商品id为null");
ThrowUtils.throwIf(StringUtils.isAnyBlank(reservationDate, timeSlot), ErrorCode.OPERATION_ERROR, "预约日期或预约时间段为空");
ThrowUtils.throwIf(quantity <= 0, ErrorCode.OPERATION_ERROR, "商品数量小于等于0");
}
} }