|
@@ -1,36 +1,41 @@
|
|
|
package com.izouma.dingdong.service;
|
|
package com.izouma.dingdong.service;
|
|
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
|
|
+import cn.hutool.core.bean.copier.CopyOptions;
|
|
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
import com.izouma.dingdong.converter.StringArrayConverter;
|
|
import com.izouma.dingdong.converter.StringArrayConverter;
|
|
|
-import com.izouma.dingdong.domain.OrderGoodsSpec;
|
|
|
|
|
import com.izouma.dingdong.domain.OrderInfo;
|
|
import com.izouma.dingdong.domain.OrderInfo;
|
|
|
|
|
+import com.izouma.dingdong.domain.ShoppingCart;
|
|
|
|
|
+import com.izouma.dingdong.domain.User;
|
|
|
import com.izouma.dingdong.domain.merchant.Goods;
|
|
import com.izouma.dingdong.domain.merchant.Goods;
|
|
|
-import com.izouma.dingdong.domain.merchant.Merchant;
|
|
|
|
|
import com.izouma.dingdong.domain.merchant.MerchantSettings;
|
|
import com.izouma.dingdong.domain.merchant.MerchantSettings;
|
|
|
|
|
+import com.izouma.dingdong.domain.user.Address;
|
|
|
import com.izouma.dingdong.domain.user.Coupon;
|
|
import com.izouma.dingdong.domain.user.Coupon;
|
|
|
-import com.izouma.dingdong.dto.GoodsSpecDTO;
|
|
|
|
|
import com.izouma.dingdong.dto.UserOrderDTO;
|
|
import com.izouma.dingdong.dto.UserOrderDTO;
|
|
|
-import com.izouma.dingdong.enums.CouponType;
|
|
|
|
|
import com.izouma.dingdong.enums.MerchantStatus;
|
|
import com.izouma.dingdong.enums.MerchantStatus;
|
|
|
|
|
+import com.izouma.dingdong.enums.RiderStatus;
|
|
|
import com.izouma.dingdong.exception.BusinessException;
|
|
import com.izouma.dingdong.exception.BusinessException;
|
|
|
import com.izouma.dingdong.repo.OrderGoodsSpecRepo;
|
|
import com.izouma.dingdong.repo.OrderGoodsSpecRepo;
|
|
|
import com.izouma.dingdong.repo.OrderInfoRepo;
|
|
import com.izouma.dingdong.repo.OrderInfoRepo;
|
|
|
|
|
+import com.izouma.dingdong.repo.ShoppingCartRepo;
|
|
|
|
|
+import com.izouma.dingdong.repo.UserRepo;
|
|
|
import com.izouma.dingdong.repo.merchant.GoodsRepo;
|
|
import com.izouma.dingdong.repo.merchant.GoodsRepo;
|
|
|
import com.izouma.dingdong.repo.merchant.MerchantRepo;
|
|
import com.izouma.dingdong.repo.merchant.MerchantRepo;
|
|
|
import com.izouma.dingdong.repo.merchant.MerchantSettingsRepo;
|
|
import com.izouma.dingdong.repo.merchant.MerchantSettingsRepo;
|
|
|
|
|
+import com.izouma.dingdong.repo.user.AddressRepo;
|
|
|
import com.izouma.dingdong.repo.user.CouponRepo;
|
|
import com.izouma.dingdong.repo.user.CouponRepo;
|
|
|
import com.izouma.dingdong.service.merchant.GoodsService;
|
|
import com.izouma.dingdong.service.merchant.GoodsService;
|
|
|
|
|
+import com.izouma.dingdong.service.merchant.MerchantService;
|
|
|
import com.izouma.dingdong.service.merchant.MerchantSettingsService;
|
|
import com.izouma.dingdong.service.merchant.MerchantSettingsService;
|
|
|
import lombok.AllArgsConstructor;
|
|
import lombok.AllArgsConstructor;
|
|
|
|
|
+import me.chanjar.weixin.mp.bean.card.enums.BusinessServiceType;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
-import java.math.BigDecimal;
|
|
|
|
|
import java.time.DayOfWeek;
|
|
import java.time.DayOfWeek;
|
|
|
import java.time.LocalDate;
|
|
import java.time.LocalDate;
|
|
|
import java.time.LocalDateTime;
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.LocalTime;
|
|
import java.time.LocalTime;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
-import java.util.Objects;
|
|
|
|
|
|
|
|
|
|
@Service
|
|
@Service
|
|
|
@AllArgsConstructor
|
|
@AllArgsConstructor
|
|
@@ -41,17 +46,24 @@ public class OrderInfoService {
|
|
|
private OrderGoodsSpecRepo orderGoodsSpecRepo;
|
|
private OrderGoodsSpecRepo orderGoodsSpecRepo;
|
|
|
private GoodsRepo goodsRepo;
|
|
private GoodsRepo goodsRepo;
|
|
|
private GoodsService goodsService;
|
|
private GoodsService goodsService;
|
|
|
- private MerchantRepo merchantRepo;
|
|
|
|
|
private MerchantSettingsRepo merchantSettingsRepo;
|
|
private MerchantSettingsRepo merchantSettingsRepo;
|
|
|
- private MerchantSettingsService merchantSettingsService;
|
|
|
|
|
|
|
+ private ShoppingCartRepo shoppingCartRepo;
|
|
|
|
|
+ private AddressRepo addressRepo;
|
|
|
|
|
+ private UserRepo userRepo;
|
|
|
|
|
+ private MerchantService merchantService;
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
用户下单
|
|
用户下单
|
|
|
*/
|
|
*/
|
|
|
- public void userOrder(UserOrderDTO userOrderDTO) {
|
|
|
|
|
|
|
+ public OrderInfo userOrder(UserOrderDTO userOrderDTO) {
|
|
|
|
|
+
|
|
|
|
|
+ ShoppingCart cart = shoppingCartRepo.findById(userOrderDTO.getShoppingCartId()).orElseThrow(new BusinessException("不存在"));
|
|
|
|
|
+
|
|
|
|
|
+ //商家
|
|
|
|
|
+ MerchantSettings merchantSettings = merchantSettingsRepo.findByMerchantId(cart.getMerchantId()).orElseThrow(new BusinessException("无商家"));
|
|
|
//商家
|
|
//商家
|
|
|
- Merchant merchant = merchantRepo.findById(userOrderDTO.getMerchantId()).orElseThrow(new BusinessException("无商家"));
|
|
|
|
|
- MerchantSettings merchantSettings = merchantSettingsRepo.findByMerchantId(userOrderDTO.getMerchantId()).orElseThrow(new BusinessException("无商家"));
|
|
|
|
|
|
|
+// Merchant merchant = merchantRepo.findById(userOrderDTO.getMerchantId()).orElseThrow(new BusinessException("无商家"));
|
|
|
|
|
+// MerchantSettings merchantSettings = merchantSettingsRepo.findByMerchantId(userOrderDTO.getMerchantId()).orElseThrow(new BusinessException("无商家"));
|
|
|
|
|
|
|
|
LocalTime startTime = merchantSettings.getStartTime();
|
|
LocalTime startTime = merchantSettings.getStartTime();
|
|
|
LocalTime endTime = merchantSettings.getEndTime();
|
|
LocalTime endTime = merchantSettings.getEndTime();
|
|
@@ -67,76 +79,103 @@ public class OrderInfoService {
|
|
|
|
|
|
|
|
OrderInfo orderInfo = new OrderInfo();
|
|
OrderInfo orderInfo = new OrderInfo();
|
|
|
BeanUtil.copyProperties(userOrderDTO, orderInfo);
|
|
BeanUtil.copyProperties(userOrderDTO, orderInfo);
|
|
|
|
|
+ BeanUtil.copyProperties(cart, orderInfo);
|
|
|
orderInfo.setMerchantStatus(MerchantStatus.NOT_RECEIVED);
|
|
orderInfo.setMerchantStatus(MerchantStatus.NOT_RECEIVED);
|
|
|
orderInfo.setCancel(false);
|
|
orderInfo.setCancel(false);
|
|
|
orderInfo.setOrderTime(now);
|
|
orderInfo.setOrderTime(now);
|
|
|
- orderInfoRepo.save(orderInfo);
|
|
|
|
|
|
|
+ orderInfo.setEnabled(true);
|
|
|
|
|
+
|
|
|
|
|
+ //使用优惠券(满减优惠券)
|
|
|
|
|
+ if (ObjectUtil.isNotNull(userOrderDTO.getCouponId())) {
|
|
|
|
|
+ Coupon coupon = couponRepo.findById(userOrderDTO.getCouponId()).orElseThrow(new BusinessException("优惠券不存在"));
|
|
|
|
|
+ //未过期,未使用
|
|
|
|
|
+ if (coupon.getEndDate().isAfter(now.toLocalDate()) && !coupon.getIsUsed()) {
|
|
|
|
|
+ if (coupon.getFullAmount().compareTo(cart.getGoodsTotal()) <= 0) {
|
|
|
|
|
+ //订单金额,优惠券Id
|
|
|
|
|
+ orderInfo.setPackingPrice(coupon.getAmount());
|
|
|
|
|
+ orderInfo.setCouponId(coupon.getId());
|
|
|
|
|
+ orderInfo.setRealAmount(orderInfo.getRealAmount().subtract(orderInfo.getPackingPrice()));
|
|
|
|
|
+
|
|
|
|
|
+ coupon.setIsUsed(true);
|
|
|
|
|
+ coupon.setUsedTime(now);
|
|
|
|
|
+ couponRepo.save(coupon);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- //详细商品信息
|
|
|
|
|
- userOrderDTO.getGoodsSpecs().forEach(goodsSpecDTO -> {
|
|
|
|
|
- //查库存是否足够
|
|
|
|
|
- Goods goods = goodsService.buy(goodsSpecDTO.getGoodsId(), goodsSpecDTO.getNum());
|
|
|
|
|
|
|
+ //用户地址
|
|
|
|
|
+ Address address = addressRepo.findById(userOrderDTO.getAddressId()).orElseThrow(new BusinessException("地址不存在"));
|
|
|
|
|
+ orderInfo.setUserAddress(address.getAddressName());
|
|
|
|
|
+
|
|
|
|
|
+ OrderInfo save = orderInfoRepo.save(orderInfo);
|
|
|
|
|
|
|
|
|
|
+ cart.getOrderGoodsSpecs().forEach(s -> {
|
|
|
|
|
+ //查库存是否足够
|
|
|
|
|
+ Goods goods = goodsService.buy(s.getGoodsId(), s.getNum());
|
|
|
//商品销售时间内
|
|
//商品销售时间内
|
|
|
if (goods.getStartTime().compareTo(nowTime) >= 0 || goods.getEndTime().compareTo(nowTime) <= 0) {
|
|
if (goods.getStartTime().compareTo(nowTime) >= 0 || goods.getEndTime().compareTo(nowTime) <= 0) {
|
|
|
throw new BusinessException("非营业时间");
|
|
throw new BusinessException("非营业时间");
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- //保存规格
|
|
|
|
|
- orderGoodsSpecRepo.save(OrderGoodsSpec.builder()
|
|
|
|
|
- .goodsId(goodsSpecDTO.getGoodsId())
|
|
|
|
|
- .goodsPrice(goodsSpecDTO.getGoodsPrice())
|
|
|
|
|
- .num(goodsSpecDTO.getNum())
|
|
|
|
|
- .specification(goodsSpecDTO.getSpecification().toString())
|
|
|
|
|
- .orderId(orderInfo.getId())
|
|
|
|
|
- .build());
|
|
|
|
|
-
|
|
|
|
|
//查商品数据,加商品销量,减商品库存
|
|
//查商品数据,加商品销量,减商品库存
|
|
|
- goods.setInventory(goods.getInventory() - goodsSpecDTO.getNum());
|
|
|
|
|
- goods.setTotalSales(goods.getTotalSales() + goodsSpecDTO.getNum());
|
|
|
|
|
|
|
+ goods.setInventory(goods.getInventory() - s.getNum());
|
|
|
|
|
+ goods.setTotalSales(goods.getTotalSales() + s.getNum());
|
|
|
goodsRepo.save(goods);
|
|
goodsRepo.save(goods);
|
|
|
|
|
+
|
|
|
|
|
+ s.setOrderId(save.getId());
|
|
|
|
|
+ orderGoodsSpecRepo.save(s);
|
|
|
}
|
|
}
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
|
|
+// //详细商品信息
|
|
|
|
|
+// userOrderDTO.getGoodsSpecs().forEach(goodsSpecDTO -> {
|
|
|
|
|
+// //查库存是否足够
|
|
|
|
|
+// Goods goods = goodsService.buy(goodsSpecDTO.getGoodsId(), goodsSpecDTO.getNum());
|
|
|
|
|
+//
|
|
|
|
|
+// //商品销售时间内
|
|
|
|
|
+// if (goods.getStartTime().compareTo(nowTime) >= 0 || goods.getEndTime().compareTo(nowTime) <= 0) {
|
|
|
|
|
+// throw new BusinessException("非营业时间");
|
|
|
|
|
+// }
|
|
|
|
|
+//
|
|
|
|
|
+// //保存规格
|
|
|
|
|
+// orderGoodsSpecRepo.save(OrderGoodsSpec.builder()
|
|
|
|
|
+// .goodsId(goodsSpecDTO.getGoodsId())
|
|
|
|
|
+// .goodsPrice(goodsSpecDTO.getGoodsPrice())
|
|
|
|
|
+// .num(goodsSpecDTO.getNum())
|
|
|
|
|
+// .specification(goodsSpecDTO.getSpecification().toString())
|
|
|
|
|
+// .orderId(orderInfo.getId())
|
|
|
|
|
+// .build());
|
|
|
|
|
+//
|
|
|
|
|
+// //查商品数据,加商品销量,减商品库存
|
|
|
|
|
+// goods.setInventory(goods.getInventory() - goodsSpecDTO.getNum());
|
|
|
|
|
+// goods.setTotalSales(goods.getTotalSales() + goodsSpecDTO.getNum());
|
|
|
|
|
+// goodsRepo.save(goods);
|
|
|
|
|
+// }
|
|
|
|
|
+// );
|
|
|
|
|
+
|
|
|
//商家是否自动接单
|
|
//商家是否自动接单
|
|
|
- if (merchant.getAutomaticOrder()) {
|
|
|
|
|
- receiveOrder(orderInfo.getId(), true);
|
|
|
|
|
|
|
+ if (merchantSettings.getAutomaticOrder()) {
|
|
|
|
|
+ merReceiveOrder(save.getId(), true);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /*
|
|
|
|
|
- 计算价钱
|
|
|
|
|
- */
|
|
|
|
|
- private void sumAmount(OrderInfo orderInfo) {
|
|
|
|
|
-
|
|
|
|
|
- Coupon coupon = couponRepo.findById(orderInfo.getCouponId()).orElseThrow(new BusinessException("优惠卷不存在"));
|
|
|
|
|
- CouponType type = coupon.getType();
|
|
|
|
|
- BigDecimal goodsAmount = orderInfo.getTotalAmount();
|
|
|
|
|
- if (type == CouponType.REDUCTION) {
|
|
|
|
|
- if (goodsAmount.compareTo(coupon.getFullAmount()) >= 0) {
|
|
|
|
|
- goodsAmount = goodsAmount.subtract(coupon.getAmount());
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ return orderInfo;
|
|
|
|
|
|
|
|
- coupon.setUsedTime(LocalDateTime.now());
|
|
|
|
|
- coupon.setIsUsed(true);
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
/*
|
|
/*
|
|
|
商家接单
|
|
商家接单
|
|
|
*/
|
|
*/
|
|
|
- public OrderInfo receiveOrder(Long orderId, Boolean pass) {
|
|
|
|
|
|
|
+ public void merReceiveOrder(Long orderId, Boolean pass) {
|
|
|
OrderInfo orderInfo = orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("无订单"));
|
|
OrderInfo orderInfo = orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("无订单"));
|
|
|
if (pass) {
|
|
if (pass) {
|
|
|
orderInfo.setMerchantStatus(MerchantStatus.RECEIVED);
|
|
orderInfo.setMerchantStatus(MerchantStatus.RECEIVED);
|
|
|
|
|
+ //通知骑手
|
|
|
} else {
|
|
} else {
|
|
|
orderInfo.setMerchantStatus(MerchantStatus.REJECTED);
|
|
orderInfo.setMerchantStatus(MerchantStatus.REJECTED);
|
|
|
orderInfo.setCancel(true);
|
|
orderInfo.setCancel(true);
|
|
|
//退款流程
|
|
//退款流程
|
|
|
}
|
|
}
|
|
|
- return orderInfoRepo.save(orderInfo);
|
|
|
|
|
|
|
+ orderInfoRepo.save(orderInfo);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -153,5 +192,32 @@ public class OrderInfoService {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
|
+ 骑手接单
|
|
|
|
|
+ */
|
|
|
|
|
+ public void ridReceiveOrder(Long riderId, Long orderId, Boolean pass) {
|
|
|
|
|
+ OrderInfo orderInfo = orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("无订单"));
|
|
|
|
|
+ if (pass) {
|
|
|
|
|
+ orderInfo.setRiderId(riderId);
|
|
|
|
|
+ orderInfo.setRiderStatus(RiderStatus.RECEIVED);
|
|
|
|
|
+ orderInfoRepo.save(orderInfo);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /*
|
|
|
|
|
+ 我的订单
|
|
|
|
|
+ */
|
|
|
|
|
+ public List<OrderInfo> my(Long userId) {
|
|
|
|
|
+ User user = userRepo.findById(userId).orElseThrow(new BusinessException("无用户"));
|
|
|
|
|
+ switch (user.getIdentity()) {
|
|
|
|
|
+ case USER:
|
|
|
|
|
+ return orderInfoRepo.findAllByUserId(userId);
|
|
|
|
|
+ case MERCHANT:
|
|
|
|
|
+ Long merchantId = merchantService.findMerchantId(userId);
|
|
|
|
|
+ return orderInfoRepo.findAllByMerchantId(merchantId);
|
|
|
|
|
+ // case RIDER:
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
}
|
|
}
|