diff --git a/backend/app/Platform/Tmall/EntityParse/Refund.php b/backend/app/Platform/Tmall/EntityParse/Refund.php index 2d5a93a..06201b9 100644 --- a/backend/app/Platform/Tmall/EntityParse/Refund.php +++ b/backend/app/Platform/Tmall/EntityParse/Refund.php @@ -8,6 +8,7 @@ use App\Constants\RefundStatus; use App\Constants\RefundType; use App\Platform\Tmall\Constants\RefundStatus as TmallRefundStatus; use App\Model\Company; +use App\Model\Order; use App\Model\Store; use App\Entity\Parse\EntityParse; use Carbon\Carbon; @@ -172,9 +173,90 @@ class Refund extends EntityParse ]; } + return $this->fillOrderDates($items); + } + + /** + * 根据退款子项的 store_id + platform_order_id 查询订单, + * 将 order_created_date 和 order_paid_date 填入 $items 数组 + * + * 订单搜索范围:[退款 created_date - 3个月, 退款 created_date] + * + * @param array $items 退款子项数据数组 + * @return array 填充了订单日期的退款子项数组 + */ + protected function fillOrderDates(array $items): array + { + $lookups = []; + foreach ($items as $item) { + $key = $item['store_id'] . ':' . $item['platform_order_id']; + if (!isset($lookups[$key])) { + $lookups[$key] = [ + 'store_id' => $item['store_id'], + 'platform_order_id' => $item['platform_order_id'], + 'created_date' => $item['created_date'], + ]; + } + } + + if (empty($lookups)) { + return $items; + } + + $orderDatesMap = $this->queryOrderDates($lookups); + + dump("Matched " . count($orderDatesMap) . " orders for " . count($lookups) . " refund item lookups"); + + foreach ($items as &$item) { + $key = $item['store_id'] . ':' . $item['platform_order_id']; + if (isset($orderDatesMap[$key])) { + $item['order_created_date'] = $orderDatesMap[$key]['order_created_date']; + $item['order_paid_date'] = $orderDatesMap[$key]['order_paid_date']; + } + } + unset($item); + return $items; } + /** + * 根据 store_id + platform_order_id 批量查询订单的创建时间和付款时间 + * + * 订单搜索范围:[退款 created_date - 3个月, 退款 created_date] + * + * @param array $lookups [key => ['store_id', 'platform_order_id', 'created_date']] + * @return array [store_id:platform_order_id => ['order_created_date' => ..., 'order_paid_date' => ...]] + */ + protected function queryOrderDates(array $lookups): array + { + $orders = Order::query() + ->where(function ($query) use ($lookups) { + foreach ($lookups as $lookup) { + $createdDate = Carbon::parse($lookup['created_date']); + $query->orWhere(function ($q) use ($lookup, $createdDate) { + $q->where('store_id', $lookup['store_id']) + ->where('platform_order_id', $lookup['platform_order_id']) + ->whereBetween('created_date', [ + $createdDate->copy()->subMonths(3), + $createdDate, + ]); + }); + } + }) + ->get(['store_id', 'platform_order_id', 'created_date', 'paid_date']); + + $map = []; + foreach ($orders as $order) { + $key = $order->store_id . ':' . $order->platform_order_id; + $map[$key] = [ + 'order_created_date' => $order->created_date, + 'order_paid_date' => $order->paid_date, + ]; + } + + return $map; + } + /** * 将 Tmall 退款状态映射为系统退款状态 ID *