|
@@ -0,0 +1,221 @@
|
|
|
|
|
+package com.poyee.facade.impl;
|
|
|
|
|
+
|
|
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
|
|
+import cn.hutool.core.lang.Assert;
|
|
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
|
|
+import com.github.pagehelper.PageInfo;
|
|
|
|
|
+import com.google.common.collect.Maps;
|
|
|
|
|
+import com.poyee.api.product.ProductFeignClient;
|
|
|
|
|
+import com.poyee.constant.OrderConstant;
|
|
|
|
|
+import com.poyee.domain.OrderAddress;
|
|
|
|
|
+import com.poyee.domain.OrderBase;
|
|
|
|
|
+import com.poyee.domain.OrderItem;
|
|
|
|
|
+import com.poyee.domain.OrderLogistics;
|
|
|
|
|
+import com.poyee.enums.AddressTypeEnum;
|
|
|
|
|
+import com.poyee.enums.ItemTypeEnum;
|
|
|
|
|
+import com.poyee.enums.SalesOrderStatusEnum;
|
|
|
|
|
+import com.poyee.enums.WhetherEnum;
|
|
|
|
|
+import com.poyee.facade.IOrderBaseFacade;
|
|
|
|
|
+import com.poyee.mapstruct.OrderBaseMapstruct;
|
|
|
|
|
+import com.poyee.req.OrderAddressAuditReq;
|
|
|
|
|
+import com.poyee.req.OrderBaseSearchReq;
|
|
|
|
|
+import com.poyee.req.OrderDeliveryReq;
|
|
|
|
|
+import com.poyee.req.client.product.ProductItemSearchReq;
|
|
|
|
|
+import com.poyee.res.OrderBaseListRes;
|
|
|
|
|
+import com.poyee.res.client.product.ProductItemListRes;
|
|
|
|
|
+import com.poyee.service.OrderAddressService;
|
|
|
|
|
+import com.poyee.service.OrderBaseService;
|
|
|
|
|
+import com.poyee.service.OrderItemService;
|
|
|
|
|
+import com.poyee.service.OrderLogisticsService;
|
|
|
|
|
+import com.poyee.utils.ApiUtils;
|
|
|
|
|
+import com.poyee.utils.LocaleTimeZoneUtil;
|
|
|
|
|
+import com.poyee.utils.ServletUtils;
|
|
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
+
|
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
|
|
+import java.util.*;
|
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
+
|
|
|
|
|
+@Slf4j
|
|
|
|
|
+@Component
|
|
|
|
|
+@AllArgsConstructor
|
|
|
|
|
+public class OrderBaseFacade implements IOrderBaseFacade {
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ private final OrderBaseService orderBaseService;
|
|
|
|
|
+ private final OrderBaseMapstruct orderBaseMapstruct;
|
|
|
|
|
+ private final OrderLogisticsService orderLogisticsService;
|
|
|
|
|
+ private final OrderAddressService orderAddressService;
|
|
|
|
|
+ private final OrderItemService orderItemService;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public PageInfo<OrderBaseListRes> list(OrderBaseSearchReq orderBaseSearchReq) {
|
|
|
|
|
+ LambdaQueryWrapper<OrderBase> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ queryWrapper.eq(OrderBase::getDeleteFlag, WhetherEnum.NO.getCode());
|
|
|
|
|
+ if (StrUtil.isNotBlank(orderBaseSearchReq.getOrderNo())) {
|
|
|
|
|
+ queryWrapper.eq(OrderBase::getOrderNo, orderBaseSearchReq.getOrderNo());
|
|
|
|
|
+ }
|
|
|
|
|
+ if (Objects.nonNull(orderBaseSearchReq.getOrderStatus())) {
|
|
|
|
|
+ queryWrapper.eq(OrderBase::getOrderStatus, orderBaseSearchReq.getOrderStatus());
|
|
|
|
|
+ }
|
|
|
|
|
+ if (StrUtil.isNotBlank(orderBaseSearchReq.getProductName())) {
|
|
|
|
|
+ List<OrderItem> orderItems = orderItemService.lambdaQuery()
|
|
|
|
|
+ .eq(OrderItem::getRelationTable, OrderConstant.ORDER)
|
|
|
|
|
+ .likeRight(OrderItem::getProductName, orderBaseSearchReq.getProductName())
|
|
|
|
|
+ .list();
|
|
|
|
|
+ if (CollUtil.isEmpty(orderItems)) {
|
|
|
|
|
+ return PageInfo.of(Collections.emptyList());
|
|
|
|
|
+ }
|
|
|
|
|
+ queryWrapper.in(OrderBase::getOrderNo, orderItems.stream().map(OrderItem::getRelationNo).collect(Collectors.toList()));
|
|
|
|
|
+ }
|
|
|
|
|
+ PageInfo<OrderBase> orderBasePageInfo = new PageInfo<>(this.orderBaseService.list(queryWrapper));
|
|
|
|
|
+ if (CollUtil.isEmpty(orderBasePageInfo.getList())) {
|
|
|
|
|
+ return PageInfo.of(Collections.emptyList());
|
|
|
|
|
+ }
|
|
|
|
|
+ List<String> orderNoList = orderBasePageInfo.getList().stream()
|
|
|
|
|
+ .map(OrderBase::getOrderNo)
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ // 批量查 orderItem,按 relationNo 分组取第一条
|
|
|
|
|
+ Map<String, OrderItem> orderItemMap = orderItemService.lambdaQuery()
|
|
|
|
|
+ .eq(OrderItem::getRelationTable, OrderConstant.ORDER)
|
|
|
|
|
+ .in(OrderItem::getRelationNo, orderNoList)
|
|
|
|
|
+ .list()
|
|
|
|
|
+ .stream()
|
|
|
|
|
+ .collect(Collectors.toMap(OrderItem::getRelationNo, item -> item, (a, b) -> a));
|
|
|
|
|
+ // 查有效地址 valid=0
|
|
|
|
|
+ List<OrderAddress> addressList = orderAddressService.lambdaQuery()
|
|
|
|
|
+ .eq(OrderAddress::getRelationTable, OrderConstant.ORDER)
|
|
|
|
|
+ .in(OrderAddress::getRelationNo, orderNoList)
|
|
|
|
|
+ .eq(OrderAddress::getValid, WhetherEnum.NO.getCode())
|
|
|
|
|
+ .eq(OrderAddress::getDeleteFlag, WhetherEnum.NO.getCode())
|
|
|
|
|
+ .list();
|
|
|
|
|
+ Map<String, OrderAddress> buyerAddressMap = addressList.stream()
|
|
|
|
|
+ .filter(address -> Objects.equals(address.getType(), AddressTypeEnum.BUYER.getCode()))
|
|
|
|
|
+ .collect(Collectors.toMap(OrderAddress::getRelationNo, address -> address));
|
|
|
|
|
+ Map<String, OrderAddress> sellerAddressMap = addressList.stream()
|
|
|
|
|
+ .filter(address -> Objects.equals(address.getType(), AddressTypeEnum.SELLER.getCode()))
|
|
|
|
|
+ .collect(Collectors.toMap(OrderAddress::getRelationNo, address -> address));
|
|
|
|
|
+ // 查待审核地址 valid=1
|
|
|
|
|
+ Set<String> pendingAddressOrderNoSet = orderAddressService.lambdaQuery()
|
|
|
|
|
+ .eq(OrderAddress::getRelationTable, OrderConstant.ORDER)
|
|
|
|
|
+ .in(OrderAddress::getRelationNo, orderNoList)
|
|
|
|
|
+ .eq(OrderAddress::getValid, WhetherEnum.YES.getCode())
|
|
|
|
|
+ .list()
|
|
|
|
|
+ .stream()
|
|
|
|
|
+ .map(OrderAddress::getRelationNo)
|
|
|
|
|
+ .collect(Collectors.toSet());
|
|
|
|
|
+ List<OrderBaseListRes> orderBaseListResList = orderBasePageInfo.getList().stream()
|
|
|
|
|
+ .map(orderBase -> {
|
|
|
|
|
+ OrderItem orderItem = orderItemMap.get(orderBase.getOrderNo());
|
|
|
|
|
+ OrderAddress buyerAddress = buyerAddressMap.get(orderBase.getOrderNo());
|
|
|
|
|
+ OrderAddress sellerAddress = sellerAddressMap.get(orderBase.getOrderNo());
|
|
|
|
|
+ OrderBaseListRes res = orderBaseMapstruct.toListRes(orderBase, null);
|
|
|
|
|
+ if (Objects.nonNull(orderItem)) {
|
|
|
|
|
+ res.setItemType(orderItem.getItemType());
|
|
|
|
|
+ res.setItemName(orderItem.getProductName());
|
|
|
|
|
+ res.setSpec(orderItem.getSpec());
|
|
|
|
|
+ res.setQuantity(orderItem.getQuantity());
|
|
|
|
|
+ }
|
|
|
|
|
+ if (Objects.nonNull(buyerAddress)) {
|
|
|
|
|
+ String fullAddress = String.format("%s%s%s%s%s",
|
|
|
|
|
+ StrUtil.nullToEmpty(buyerAddress.getCountry()),
|
|
|
|
|
+ StrUtil.nullToEmpty(buyerAddress.getProvince()),
|
|
|
|
|
+ StrUtil.nullToEmpty(buyerAddress.getCity()),
|
|
|
|
|
+ StrUtil.nullToEmpty(buyerAddress.getArea()),
|
|
|
|
|
+ StrUtil.nullToEmpty(buyerAddress.getAddress()));
|
|
|
|
|
+ res.setAddress(fullAddress);
|
|
|
|
|
+ res.setPhone(Objects.nonNull(buyerAddress.getPhone()) ? StrUtil.toString(buyerAddress.getPhone()) : null);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (Objects.nonNull(sellerAddress)) {
|
|
|
|
|
+ res.setSellerNickname(sellerAddress.getBuyerUser());
|
|
|
|
|
+ res.setSellerPhone(Objects.nonNull(sellerAddress.getPhone()) ? StrUtil.toString(sellerAddress.getPhone()) : null);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (pendingAddressOrderNoSet.contains(orderBase.getOrderNo())) {
|
|
|
|
|
+ res.setAddressModificationFlag(Boolean.TRUE);
|
|
|
|
|
+ }
|
|
|
|
|
+ return res;
|
|
|
|
|
+ })
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ return PageInfo.of(orderBaseListResList);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Transactional
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Boolean delivery(OrderDeliveryReq orderBaseSearchReq) {
|
|
|
|
|
+ OrderBase orderBase = orderBaseService.lambdaQuery().eq(OrderBase::getOrderNo, orderBaseSearchReq.getOrderNo()).one();
|
|
|
|
|
+ Assert.notNull(orderBase, "order_not_found");
|
|
|
|
|
+ Assert.isTrue(Objects.equals(orderBase.getOrderStatus(), SalesOrderStatusEnum.PENDING_SHIPMENT.getCode()),
|
|
|
|
|
+ "only_supports_shipping_for_flash_purchase_orders");
|
|
|
|
|
+ List<OrderItem> orderItemList = orderItemService.lambdaQuery().eq(OrderItem::getRelationTable, OrderConstant.ORDER).eq(OrderItem::getRelationNo, orderBaseSearchReq.getOrderNo()).list();
|
|
|
|
|
+ boolean noneMatch = orderItemList.stream().noneMatch(item -> Objects.equals(item.getItemType(), ItemTypeEnum.FLASH_SALE.getCode()));
|
|
|
|
|
+ Assert.isTrue(noneMatch, "only_supports_shipping_for_flash_purchase_orders");
|
|
|
|
|
+ List<OrderAddress> list = orderAddressService.lambdaQuery().eq(OrderAddress::getRelationNo, orderBase.getOrderNo())
|
|
|
|
|
+ .eq(OrderAddress::getRelationTable, OrderConstant.ORDER)
|
|
|
|
|
+ .eq(OrderAddress::getValid, WhetherEnum.YES.getCode()).list();
|
|
|
|
|
+ Assert.isTrue(CollUtil.isEmpty(list), "order_with_address_modification_request_Please_approve_and_redo_the_operation");
|
|
|
|
|
+ orderBase.setOrderStatus(SalesOrderStatusEnum.SHIPPED.getCode());
|
|
|
|
|
+ OrderLogistics orderLogistics = OrderLogistics.builder()
|
|
|
|
|
+ .relationNo(orderBase.getOrderNo())
|
|
|
|
|
+ .relationTable(OrderConstant.ORDER)
|
|
|
|
|
+ .logisticsName(orderBaseSearchReq.getLogisticsName())
|
|
|
|
|
+ .logisticsCode(orderBaseSearchReq.getLogisticsCode())
|
|
|
|
|
+ .trackingNo(orderBaseSearchReq.getTrackingNo())
|
|
|
|
|
+ .logisticsTime(LocaleTimeZoneUtil.nowUtc())
|
|
|
|
|
+ .createTime(LocaleTimeZoneUtil.nowUtc())
|
|
|
|
|
+ .createBy(Objects.nonNull(ServletUtils.getCurrentUser()) ? ServletUtils.getCurrentUser().getString("sub") : null)
|
|
|
|
|
+ .build();
|
|
|
|
|
+ orderLogisticsService.save(orderLogistics);
|
|
|
|
|
+ return this.orderBaseService.updateById(orderBase);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Transactional
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Boolean approveAddress(OrderAddressAuditReq req) {
|
|
|
|
|
+ String operator = Objects.nonNull(ServletUtils.getCurrentUser()) ? ServletUtils.getCurrentUser().getString("sub") : null;
|
|
|
|
|
+ LocalDateTime now = LocaleTimeZoneUtil.nowUtc();
|
|
|
|
|
+ OrderAddress pending = orderAddressService.lambdaQuery()
|
|
|
|
|
+ .eq(OrderAddress::getRelationTable, req.getOrderNo())
|
|
|
|
|
+ .eq(OrderAddress::getRelationTable, OrderConstant.ORDER)
|
|
|
|
|
+ .eq(OrderAddress::getValid, WhetherEnum.YES.getCode())
|
|
|
|
|
+ .one();
|
|
|
|
|
+ Assert.notNull(pending, "no_pending_address_modification_request");
|
|
|
|
|
+ OrderAddress old = orderAddressService.lambdaQuery()
|
|
|
|
|
+ .eq(OrderAddress::getRelationNo, req.getOrderNo())
|
|
|
|
|
+ .eq(OrderAddress::getRelationTable, OrderConstant.ORDER)
|
|
|
|
|
+ .eq(OrderAddress::getValid, WhetherEnum.NO.getCode())
|
|
|
|
|
+ .eq(OrderAddress::getType, pending.getType())
|
|
|
|
|
+ .one();
|
|
|
|
|
+ if (Objects.nonNull(old)) {
|
|
|
|
|
+ old.setDeleteFlag(WhetherEnum.YES.getCode());
|
|
|
|
|
+ old.setUpdateTime(now);
|
|
|
|
|
+ old.setUpdateBy(operator);
|
|
|
|
|
+ orderAddressService.updateById(old);
|
|
|
|
|
+ }
|
|
|
|
|
+ pending.setValid(WhetherEnum.NO.getCode());
|
|
|
|
|
+ pending.setUpdateTime(now);
|
|
|
|
|
+ pending.setUpdateBy(operator);
|
|
|
|
|
+ return orderAddressService.updateById(pending);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Transactional
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Boolean rejectAddress(OrderAddressAuditReq req) {
|
|
|
|
|
+ OrderAddress pending = orderAddressService.lambdaQuery()
|
|
|
|
|
+ .eq(OrderAddress::getRelationNo, req.getOrderNo())
|
|
|
|
|
+ .eq(OrderAddress::getRelationTable, OrderConstant.ORDER)
|
|
|
|
|
+ .eq(OrderAddress::getValid, WhetherEnum.YES.getCode())
|
|
|
|
|
+ .one();
|
|
|
|
|
+ Assert.notNull(pending, "no_pending_address_modification_request");
|
|
|
|
|
+ String operator = Objects.nonNull(ServletUtils.getCurrentUser()) ? ServletUtils.getCurrentUser().getString("sub") : null;
|
|
|
|
|
+ pending.setValid(2);//审核拒绝
|
|
|
|
|
+ pending.setUpdateTime(LocaleTimeZoneUtil.nowUtc());
|
|
|
|
|
+ pending.setUpdateBy(operator);
|
|
|
|
|
+ return orderAddressService.updateById(pending);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|