|
@@ -395,6 +395,7 @@ public class ApiOrderServiceImpl implements ApiOrderService {
|
|
|
orderReq.setOrderSn(SnCodeUtils.createSn());
|
|
|
orderReq.setAmount(orderReq.getProductAmount());
|
|
|
OrderVo orderVo = OrderEntityUtils.createOrderVo(orderReq, delivery, deliveryConfig.isTest());
|
|
|
+
|
|
|
orderVo.setIsMine(delivery.getIsMine());
|
|
|
if (DeliveryTypeEnums.FENG_NIAO.getType().equals(delivery.getType()) || DeliveryTypeEnums.MEI_TUAN.getType().equals(delivery.getType())) {
|
|
|
ShopDelivery shopDelivery = iShopDeliveryService.findOne(shopId, delivery.getId());
|
|
@@ -551,10 +552,10 @@ public class ApiOrderServiceImpl implements ApiOrderService {
|
|
|
Object resp = "fail";
|
|
|
Order order = iOrderService.getById(orderId);
|
|
|
if (order == null) {
|
|
|
- throw new CustomWebException("订单不存在!");
|
|
|
+ throw new CustomAppException("订单不存在!", 500);
|
|
|
}
|
|
|
if (order.getDadaDspType() != null) {
|
|
|
- throw new CustomWebException("达达配送商模式订单不支持加小费!");
|
|
|
+ throw new CustomAppException("达达配送商模式订单不支持加小费!", 500);
|
|
|
}
|
|
|
List<OrderDelivery> orderDeliverys = iOrderDeliveryService.list(new QueryWrapper<OrderDelivery>().eq("order_sn", order.getOrderSn()));
|
|
|
if(orderDeliverys!=null&&orderDeliverys.size() ==1 &&"-1".equals(orderDeliverys.get(0).getOutTradeNo())){
|
|
@@ -606,7 +607,7 @@ public class ApiOrderServiceImpl implements ApiOrderService {
|
|
|
iOrderService.updateById(updateOrder);
|
|
|
//扣钱
|
|
|
iMemberService.updateAmount(member.getId(), tipAmount.negate());
|
|
|
- iMemberBalanceLogService.saveLog(loginId, LogTypeEnum.REDUCE.type, "加小费", LogSourceEnum.CONSUMPTION.status, tipAmount, order.getMerchantId(),order.getId(), orderTip.getPayType());
|
|
|
+ iMemberBalanceLogService.saveLog(loginId, LogTypeEnum.REDUCE.type, "加小费", LogSourceEnum.CONSUMPTION.status, tipAmount, order.getMerchantId(),order.getId(), orderTip.getPayType(), member.getAmount());
|
|
|
resp = "ok";
|
|
|
tipScheduledExecutorService.schedule(new TipsTask(order, null, iOrderService, iDspDeliveryService, client, tipAmount, iOrderDeliveryService, iShopDeliveryService,iShopDeliveryBindService), 1, TimeUnit.SECONDS);
|
|
|
} else if (PaymentTypeEnum.ZHI_FU_BAO.type.equals(paymentType) && order.getPayAmount().compareTo(BigDecimal.ZERO) > 0) {
|
|
@@ -984,6 +985,20 @@ public class ApiOrderServiceImpl implements ApiOrderService {
|
|
|
.stream()
|
|
|
.collect(Collectors.groupingBy(item -> item.getShopId() + "-" + item.getWaimaiId()));
|
|
|
}
|
|
|
+ // 待接单状态下获取运力
|
|
|
+ Map<String, List<OrderDelivery>> deliveryMap = new HashMap<>();
|
|
|
+ if ((request.getSearchType() != null && request.getSearchType() == 0 && request.getStatus() == OrderListRequest.OrderListSearchStatusEnum.ORDERS_TO_BE_RECEIVED)
|
|
|
+ || (request.getSearchType() != null && request.getSearchType() == 1)
|
|
|
+ || (request.getSearchType() != null && request.getSearchType() == 2 && request.getSearchStatusItem().isToBeReceivedOrder())) {
|
|
|
+ List<String> orderSns = list.stream().filter(item -> item.getOrderSn() != null && item.getDeliveryStatus() == 1).map(OrderListDto::getOrderSn).collect(Collectors.toList());
|
|
|
+ if (CollectionUtils.isNotEmpty(orderSns)) {
|
|
|
+ deliveryMap = iOrderDeliveryService.list(new QueryWrapper<OrderDelivery>()
|
|
|
+ .in("order_sn", orderSns)
|
|
|
+ .eq("deleted", 0))
|
|
|
+ .stream()
|
|
|
+ .collect(Collectors.groupingBy(OrderDelivery::getOrderSn));
|
|
|
+ }
|
|
|
+ }
|
|
|
for (OrderListDto dto : list) {
|
|
|
if (dto.getWaimaiOrderId() != null) {
|
|
|
DspWaimai waiMai = iDspWaimaiService.getById(dto.getWaimaiId());
|
|
@@ -999,6 +1014,12 @@ public class ApiOrderServiceImpl implements ApiOrderService {
|
|
|
Shop shop = iShopService.getById(dto.getShopId());
|
|
|
dto.setShopName(Objects.isNull(shop) ? "" : shop.getName());
|
|
|
}
|
|
|
+ // 设置运力logo
|
|
|
+ if (deliveryMap != null && CollectionUtils.isNotEmpty(deliveryMap.get(dto.getOrderSn()))) {
|
|
|
+ List<OrderDelivery> orderDeliveries = deliveryMap.get(dto.getOrderSn());
|
|
|
+ List<String> logos = orderDeliveries.stream().map(OrderDelivery::getDeliveryLogo).collect(Collectors.toList());
|
|
|
+ dto.setDeliveryLogos(logos);
|
|
|
+ }
|
|
|
// 设置外卖门店名称
|
|
|
if (shopWaiMaiMap != null && shopWaiMaiMap.size() > 0 && dto.getShopId() != null && dto.getWaimaiId() != null) {
|
|
|
List<ShopWaimai> shopWaimais = shopWaiMaiMap.get(dto.getShopId() + "-" + dto.getWaimaiId());
|
|
@@ -1291,7 +1312,7 @@ public class ApiOrderServiceImpl implements ApiOrderService {
|
|
|
String searchStatusStr = request.getSearchStatusStr();
|
|
|
if (request.getSearchType() != null && request.getSearchType() == 2) {
|
|
|
// 查询日期默认90天
|
|
|
- if (request.getStartDate() == null || request.getEndDate() == null) {
|
|
|
+ if (StringUtils.isEmpty(request.getStartDate()) || StringUtils.isEmpty(request.getEndDate())) {
|
|
|
String startDateBeginTime = DateUtils.parseToBeginTime(DateUtils.addDaysToTimeStr(new Date(), -90, DateUtils.YYYY_MM_DD));
|
|
|
request.setStartDate(startDateBeginTime);
|
|
|
String endDateBeginTime = DateUtils.parseToTomorrowBeginTime(DateUtils.dateTime(new Date()));
|
|
@@ -2254,4 +2275,224 @@ public class ApiOrderServiceImpl implements ApiOrderService {
|
|
|
return dto;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> pullNewOrder(Long loginId, List<Integer> orderIds, Integer status, String searchShopIdStr) {
|
|
|
+ List<OrderDetailDto> list = new ArrayList<>();
|
|
|
+ Member member = iMemberService.getById(loginId);
|
|
|
+ if (Objects.isNull(member)) {
|
|
|
+ throw new CustomAppException("用户不存在!");
|
|
|
+ }
|
|
|
+ Long shopId = member.getShopId();
|
|
|
+ Long merchant = null;
|
|
|
+ if (member.getMemberType().equals(MemberTypeEnum.MERCHANT.type)) {
|
|
|
+ merchant = member.getMerchantId();
|
|
|
+ }
|
|
|
+ if(status == null || DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status.equals(status)
|
|
|
+ || DeliveryStatusEnum.APPOINTMENT.status.equals(status)) {
|
|
|
+ String shopNewOrderListKey = "shop" + shopId + "";
|
|
|
+ if (member.getShopId() != null && merchant == null && redisCache.hasKey(shopNewOrderListKey)) {
|
|
|
+ Long size = redisCache.getListSize(shopNewOrderListKey);
|
|
|
+ log.info("外卖新订单数量:" + size);
|
|
|
+ for (int i = 0; i < size.intValue(); i++) {
|
|
|
+ list.add((OrderDetailDto) redisCache.rPop(shopNewOrderListKey));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String merchantNewOrderListKey = "merchant" + merchant + "";
|
|
|
+ if (merchant != null && redisCache.hasKey(merchantNewOrderListKey)) {
|
|
|
+ Long size = redisCache.getListSize(merchantNewOrderListKey);
|
|
|
+ log.info("商家外卖新订单数量:" + size);
|
|
|
+ for (int i = 0; i < size.intValue(); i++) {
|
|
|
+ list.add((OrderDetailDto) redisCache.rPop(merchantNewOrderListKey));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status.equals(status)){
|
|
|
+ String shopReceivedOrderListKey = "shop_received" + shopId + "";
|
|
|
+ if (shopId != null && merchant == null && redisCache.hasKey(shopReceivedOrderListKey)) {
|
|
|
+ Long size = redisCache.getListSize(shopReceivedOrderListKey);
|
|
|
+ log.info("外卖待接单数量:" + size);
|
|
|
+ for (int i = 0; i < size.intValue(); i++) {
|
|
|
+ list.add((OrderDetailDto) redisCache.rPop(shopReceivedOrderListKey));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String merchantReceivedOrderListKey = "merchant_received" + merchant + "";
|
|
|
+ if (merchant != null && redisCache.hasKey(merchantReceivedOrderListKey)) {
|
|
|
+ Long size = redisCache.getListSize(merchantReceivedOrderListKey);
|
|
|
+ log.info("商家待接单数量:" + size);
|
|
|
+ for (int i = 0; i < size.intValue(); i++) {
|
|
|
+ list.add((OrderDetailDto) redisCache.rPop(merchantReceivedOrderListKey));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 过滤已选门店的订单
|
|
|
+ if (StringUtils.isNotEmpty(searchShopIdStr)) {
|
|
|
+ List<Long> searchShopIds = Lists.newArrayList();
|
|
|
+ String[] split = searchShopIdStr.split(",");
|
|
|
+ for (String item : split) {
|
|
|
+ searchShopIds.add(Long.valueOf(item));
|
|
|
+ }
|
|
|
+ if (CollectionUtils.isNotEmpty(searchShopIds) && CollectionUtils.isNotEmpty(list)) {
|
|
|
+ list = list.stream().filter(item -> searchShopIds.contains(item.getShopId())).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ List<Long> ids = new ArrayList<>();
|
|
|
+ if (CollectionUtils.isNotEmpty(orderIds)) {
|
|
|
+ if(DeliveryStatusEnum.APPOINTMENT.status.equals(status)){
|
|
|
+ status = DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status;
|
|
|
+ }
|
|
|
+ List<Order> orderList = iOrderService.list(new QueryWrapper<Order>().in("id", orderIds).ne("delivery_status", status));
|
|
|
+ ids = orderList.stream().map(Order::getId).collect(Collectors.toList());
|
|
|
+ // 待接单状态下缓存过滤
|
|
|
+ list = list.stream().filter(item -> !orderIds.contains(item.getId().intValue())).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+ log.info("原始新订单: {}", JSONObject.toJSONString(list));
|
|
|
+ List<OrderListDto> result = this.buildNewOrderList(list, loginId, status);
|
|
|
+ log.info("处理后新订单: {}", JSONObject.toJSONString(result));
|
|
|
+ map.put("newList", result);
|
|
|
+ map.put("deliveryList", ids);
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<OrderListDto> buildNewOrderList(List<OrderDetailDto> list, Long memberId, Integer status) {
|
|
|
+ List<OrderListDto> result = Lists.newArrayList();
|
|
|
+ if (CollectionUtils.isEmpty(list)) {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ // 获取订单日志信息
|
|
|
+ Map<Long, List<OrderLog>> orderLogMap = new HashMap<>();
|
|
|
+ // 获取订单延迟发单信息
|
|
|
+ Map<Long, List<OrderDelay>> orderDelayMap = new HashMap<>();
|
|
|
+ if (CollectionUtils.isNotEmpty(list)){
|
|
|
+ List<Long> orderIds = list.stream().map(OrderDetailDto::getId).collect(Collectors.toList());
|
|
|
+ List<OrderLog> orderLogs = iOrderLogService.getOrderLogByOrderIds(orderIds);
|
|
|
+ orderLogMap = orderLogs.stream().collect(Collectors.groupingBy(OrderLog::getOrderId));
|
|
|
+
|
|
|
+ orderDelayMap = iOrderDelayService.list(new QueryWrapper<OrderDelay>()
|
|
|
+ .in("order_id", orderIds)
|
|
|
+ .eq("deleted", 0)).stream().collect(Collectors.groupingBy(OrderDelay::getOrderId));
|
|
|
+ }
|
|
|
+ List<Long> waimaiOrderIds = list.stream().map(OrderDetailDto::getWaimaiOrderId).collect(Collectors.toList());
|
|
|
+ // 外卖订单
|
|
|
+ Map<Long, List<WaimaiOrder>> waiMaiOrderMap = new HashMap<>();
|
|
|
+ // 外卖商品
|
|
|
+ Map<Long, List<WaimaiOrderDetail>> orderDetailMap = new HashMap<>();
|
|
|
+ if (CollectionUtils.isNotEmpty(waimaiOrderIds)) {
|
|
|
+ waiMaiOrderMap = iWaimaiOrderService.list(new QueryWrapper<WaimaiOrder>()
|
|
|
+ .in("id", waimaiOrderIds))
|
|
|
+ .stream()
|
|
|
+ .collect(Collectors.groupingBy(WaimaiOrder::getId));
|
|
|
+
|
|
|
+ orderDetailMap = iWaimaiOrderDetailService.list(new QueryWrapper<WaimaiOrderDetail>()
|
|
|
+ .in("waimai_order_id", waimaiOrderIds)
|
|
|
+ .eq("deleted", 0))
|
|
|
+ .stream()
|
|
|
+ .collect(Collectors.groupingBy(WaimaiOrderDetail::getWaimaiOrderId));
|
|
|
+ }
|
|
|
+ // 获取外卖门店
|
|
|
+ List<Long> shopIds = list.stream().filter(item -> item.getShopId() != null).map(OrderDetailDto::getShopId).collect(Collectors.toList());
|
|
|
+ Map<String, List<ShopWaimai>> shopWaiMaiMap = new HashMap<>();
|
|
|
+ if (CollectionUtils.isNotEmpty(shopIds)) {
|
|
|
+ shopWaiMaiMap = iShopWaimaiService.list(new QueryWrapper<ShopWaimai>()
|
|
|
+ .in("shop_id", shopIds)
|
|
|
+ .eq("bind_status", 1)
|
|
|
+ .eq("deleted", 0))
|
|
|
+ .stream()
|
|
|
+ .collect(Collectors.groupingBy(item -> item.getShopId() + "-" + item.getWaimaiId()));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 待接单状态下获取运力
|
|
|
+ Map<String, List<OrderDelivery>> deliveryMap = new HashMap<>();
|
|
|
+ if (DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status.equals(status)) {
|
|
|
+ List<String> orderSns = list.stream().filter(item -> item.getOrderSn() != null && item.getDeliveryStatus() == 1).map(OrderDetailDto::getOrderSn).collect(Collectors.toList());
|
|
|
+ if (CollectionUtils.isNotEmpty(orderSns)) {
|
|
|
+ deliveryMap = iOrderDeliveryService.list(new QueryWrapper<OrderDelivery>()
|
|
|
+ .in("order_sn", orderSns)
|
|
|
+ .eq("deleted", 0))
|
|
|
+ .stream()
|
|
|
+ .collect(Collectors.groupingBy(OrderDelivery::getOrderSn));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (OrderDetailDto detailDto : list) {
|
|
|
+ OrderListDto dto = new OrderListDto();
|
|
|
+ BeanUtils.copyProperties(detailDto, dto);
|
|
|
+ // 外卖订单
|
|
|
+ if (waiMaiOrderMap != null && CollectionUtils.isNotEmpty(waiMaiOrderMap.get(dto.getWaimaiOrderId()))){
|
|
|
+ List<WaimaiOrder> waimaiOrderList = waiMaiOrderMap.get(dto.getWaimaiOrderId());
|
|
|
+ WaimaiOrder waimaiOrder = waimaiOrderList.get(0);
|
|
|
+ if (waimaiOrder != null && dto.getWaimaiOrderId() != null) {
|
|
|
+ dto.setWaimaiOrderId(waimaiOrder.getId());
|
|
|
+ dto.setWaimaiId(waimaiOrder.getWaimaiId());
|
|
|
+ dto.setWmstatus(waimaiOrder.getStatus());
|
|
|
+ dto.setWmDeliveryTime(waimaiOrder.getDeliveryTime());
|
|
|
+ dto.setOrderType(waimaiOrder.getOrderType());
|
|
|
+ dto.setProductAmount(waimaiOrder.getTotalPrice());
|
|
|
+ dto.setOrderTime(waimaiOrder.getOrderTime());
|
|
|
+ DspWaimai waiMai = iDspWaimaiService.getById(waimaiOrder.getWaimaiId());
|
|
|
+ dto.setLogo(Objects.isNull(waiMai) ? "" : waiMai.getLogo());
|
|
|
+ } else {
|
|
|
+ dto.setLogo(AppConstant.LIE_BAO_LOGO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (dto.getShopId() != null && StringUtils.isNull(dto.getShopName())) {
|
|
|
+ Shop shop = iShopService.getById(dto.getShopId());
|
|
|
+ dto.setShopName(Objects.isNull(shop) ? "" : shop.getName());
|
|
|
+ }
|
|
|
+ // 设置运力logo
|
|
|
+ if (deliveryMap != null && CollectionUtils.isNotEmpty(deliveryMap.get(dto.getOrderSn()))) {
|
|
|
+ List<OrderDelivery> orderDeliveries = deliveryMap.get(dto.getOrderSn());
|
|
|
+ List<String> logos = orderDeliveries.stream().map(OrderDelivery::getDeliveryLogo).collect(Collectors.toList());
|
|
|
+ dto.setDeliveryLogos(logos);
|
|
|
+ }
|
|
|
+ // 设置外卖门店名称
|
|
|
+ if (shopWaiMaiMap != null && shopWaiMaiMap.size() > 0 && dto.getShopId() != null && dto.getWaimaiId() != null) {
|
|
|
+ List<ShopWaimai> shopWaimais = shopWaiMaiMap.get(dto.getShopId() + "-" + dto.getWaimaiId());
|
|
|
+ if (CollectionUtils.isNotEmpty(shopWaimais) && shopWaimais.get(0) != null) {
|
|
|
+ dto.setWaimaiShopName(shopWaimais.get(0).getThirdShopName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 设置外卖订单件数
|
|
|
+ if (orderDetailMap != null && CollectionUtils.isNotEmpty(orderDetailMap.get(dto.getWaimaiOrderId()))){
|
|
|
+ List<WaimaiOrderDetail> orderDetailList = orderDetailMap.get(dto.getWaimaiOrderId());
|
|
|
+ long totalNum = orderDetailList.stream().mapToLong(WaimaiOrderDetail::getQuantity).sum();
|
|
|
+ dto.setSkuNum(orderDetailList.size());
|
|
|
+ dto.setTotalNum(totalNum);
|
|
|
+ }
|
|
|
+ // 计算外卖单用户期望送达时间
|
|
|
+ if (dto.getWmDeliveryTime() != null && dto.getWmDeliveryTime() != 0) {
|
|
|
+ dto.setExceptTime(new Date(dto.getWmDeliveryTime() * 1000L));
|
|
|
+ }
|
|
|
+ // 设置相关操作时间
|
|
|
+ if (orderLogMap.size() > 0) {
|
|
|
+ this.setOrderTime(dto, orderLogMap);
|
|
|
+ }
|
|
|
+ // 设置发件详细地址(发单计价用)
|
|
|
+ if (dto.getSendStreet() == null && dto.getSendAddressId() != null && DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(dto.getDeliveryStatus())) {
|
|
|
+ MemberAddress memberAddress = iMemberAddressService.findById(memberId, dto.getSendAddressId());
|
|
|
+ dto.setSendStreet(memberAddress != null ? memberAddress.getStreet() : "");
|
|
|
+ }
|
|
|
+ // 设置收件详细地址(发单计价用)
|
|
|
+ if (dto.getReceiptStreet() == null && dto.getReceiptAddressId() != null && DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(dto.getDeliveryStatus())) {
|
|
|
+ MemberAddress memberAddress = iMemberAddressService.findById(memberId, dto.getReceiptAddressId());
|
|
|
+ dto.setReceiptStreet(memberAddress != null ? memberAddress.getStreet() : "");
|
|
|
+ }
|
|
|
+ OrderDelay orderDelay = null;
|
|
|
+ if (orderDelayMap != null && CollectionUtils.isNotEmpty(orderDelayMap.get(dto.getId()))) {
|
|
|
+ List<OrderDelay> orderDelays = orderDelayMap.get(dto.getId());
|
|
|
+ if (CollectionUtils.isNotEmpty(orderDelays) && orderDelays.get(0) != null) {
|
|
|
+ orderDelay = orderDelays.get(0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 外卖预约单
|
|
|
+ if (dto.getTakeType() > 0 && dto.getWaimaiOrderId() != null) {
|
|
|
+ this.setDelayTime(orderDelay, dto, null);
|
|
|
+ }
|
|
|
+ // 设置按钮状态
|
|
|
+ dto.setButtonStatus(this.getButtonStatus(dto));
|
|
|
+ result.add(dto);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
}
|