webman_ad/app/event/ShopifyOrders.php
2025-02-15 17:21:00 +08:00

325 lines
14 KiB
PHP

<?php
namespace app\event;
use DateTime;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use support\Redis;
use think\facade\Db as ThinkDb;
use Webman\Event\Event;
use Workerman\Crontab\Crontab;
class ShopifyOrders
{
const event = 'shopify:orders:event';
const event_customer = 'shopify:customers:event';
const SHOPIFY_API_URL = 'https://{storeName}.myshopify.com/admin/api/2024-07/orders.json';
const SHOPIFY_API_URL_CUSTOMER = 'https://{storeName}.myshopify.com/admin/api/2024-07/customers.json';
public function fetchCustomerIds($options = [])
{
$client = new Client();
$headers = [
'X-Shopify-Access-Token' => $options['token']
];
$customerIds = [];
$orderIdsNotOrderCount = $orderIdsOrderCountOne = $orderIdsOrderCountOther = [];
$pageInfo = "";
while (true) {
$params = [];
if ($pageInfo !== "") {
$params = [
'limit' => 200,
'page_info' => $pageInfo
];
} else {
$params = [
'limit' => 200,
'fields' => 'id,orders_count,total_spent,last_order_id,created_at',
// 'created_at_min' => '2025-02-1T00:00:00-08:00',
// 'created_at_max' => '2025-02-13T23:59:59-08:00',
'ids' => $options['aaa']
// 'created_at_min' => '2025-02-14T00:00:00+00:00',
// 'created_at_max' => '2025-02-14T23:59:59+00:00'
];
//
// $createdAtMin = new DateTime($params['created_at_min']);
// $createdAtMax = new DateTime($params['created_at_max']);
}
// dump($params,$headers);
dump(str_replace("{storeName}", $options['storeName'], self::SHOPIFY_API_URL_CUSTOMER));
try {
$response = $client->get(str_replace("{storeName}", $options['storeName'], self::SHOPIFY_API_URL_CUSTOMER), [
'headers' => $headers,
'query' => $params
]);
$data = json_decode($response->getBody(), true);
// dump($data);
// Loop through the orders and collect the order IDs
foreach ($data['customers'] as $customer) {
$customerIds[] = (string)$customer['id'];
// echo $order['id'] . PHP_EOL; // Log order ID
// 将日期时间字符串转换为 DateTime 对象
$customerCreatedAt = new DateTime($customer['created_at']);
$customerOrderCount = max($customer['orders_count'], 0);
// 判断 $orderCreatedAt 是否在 $createdAtMin 和 $createdAtMax 之间
// if ($customerOrderCount >= $createdAtMin && $orderCustomerCreatedAt <= $createdAtMax) {
// $orderIdsCreatedAt[] = (string)$order['id'];
// } else {
// $orderIdsNotCreatedAt[] = (string)$order['id'];
// }
// dump($customer['id'],$customerOrderCount);
if ($customerOrderCount == 0) {
$orderIdsNotOrderCount[] = (string)$customer['id'];
} else if ($customerOrderCount == 1) {
$orderIdsOrderCountOne[] = (string)$customer['id'];
} else {
$orderIdsOrderCountOther[] = (string)$customer['id'];
}
// if($order['customer'][''])
// $orderDatass[$customer['id']] = [
// 'id' => $order['id'],
// 'cus' => $order['customer']
// ];
}
$customerIds = array_unique($customerIds);
dump('Total number of customer IDs: ' . count($customerIds));
dump('customer IDs: ' . implode(',', $customerIds));
// dump('Total number of orderIdsCreatedAt IDs: ' . count($orderIdsCreatedAt));
// dump('orderIdsCreatedAt IDs: ' . implode(',', $orderIdsCreatedAt));
// dump('Total number of orderIdsNotCreatedAt IDs: ' . count($orderIdsNotCreatedAt));
// dump('orderIdsNotCreatedAt IDs: ' . implode(',', $orderIdsNotCreatedAt));
dump('Total number of customerIdsNotOrderCount IDs: ' . count($orderIdsNotOrderCount));
dump('customerIdsNotOrderCount IDs: ' . implode(',', $orderIdsNotOrderCount));
dump('Total number of customerIdsOrderCountOne IDs: ' . count($orderIdsOrderCountOne));
dump('customerIdsOrderCountOne IDs: ' . implode(',', $orderIdsOrderCountOne));
dump('Total number of customerOrderCountOther IDs: ' . count($orderIdsOrderCountOther));
dump('customerOrderCountOther IDs: ' . implode(',', $orderIdsOrderCountOther));
// dump($orderDatass);
// Check if there's a next page
if (isset($response->getHeader('link')[0]) && strpos($response->getHeader('link')[0], 'rel="next"')) {
preg_match('/page_info=([^&]*)/', $response->getHeader('link')[0], $matches);
$pageInfo = $matches[1];
} else {
break; // Exit loop if no more pages
}
} catch (GuzzleException $e) {
echo 'Error fetching Shopify orders: ' . $e->getMessage() . PHP_EOL;
break;
}
}
// echo 'Total number of order IDs: ' . count($orderIds) . PHP_EOL;
// dump('Total number of order IDs: ' . count($orderIds));
// dump('Order IDs: ' . implode(',', $orderIds));
return ;
}
// const SHOPIFY_API_URL = 'https://fefc94-67.myshopify.com/admin/api/2024-07/orders.json';
public function fetchOrderIds($options = [])
{
$client = new Client();
$headers = [
'X-Shopify-Access-Token' => $options['token']
];
$orderIds = [];
$pageInfo = "";
while (true) {
$params = [];
if ($pageInfo !== "") {
$params = [
'limit' => 200,
'page_info' => $pageInfo
];
} else {
$params = [
'limit' => 200,
'status' => 'any',
'fields' => 'id,customer',
'created_at_min' => '2025-02-13T00:00:00-08:00',
'created_at_max' => '2025-02-13T23:59:59-08:00'
// 'created_at_min' => '2025-02-14T00:00:00+00:00',
// 'created_at_max' => '2025-02-14T23:59:59+00:00'
];
$createdAtMin = new DateTime($params['created_at_min']);
$createdAtMax = new DateTime($params['created_at_max']);
}
// dump($params,$headers);
dump(str_replace("{storeName}", $options['storeName'], self::SHOPIFY_API_URL));
try {
$response = $client->get(str_replace("{storeName}", $options['storeName'], self::SHOPIFY_API_URL), [
'headers' => $headers,
'query' => $params
]);
$data = json_decode($response->getBody(), true);
// dump($data);
// Loop through the orders and collect the order IDs
foreach ($data['orders'] as $order) {
$orderIds[] = (string)$order['id'];
$customerIds[] = (string)$order['customer']['id'];
// echo $order['id'] . PHP_EOL; // Log order ID
// 将日期时间字符串转换为 DateTime 对象
// $orderCustomerCreatedAt = new DateTime($order['customer']['created_at']);
// $orderCustomerOrderCount = $order['customer']['orders_count']?? 0;
// 判断 $orderCreatedAt 是否在 $createdAtMin 和 $createdAtMax 之间
// if ($orderCustomerCreatedAt >= $createdAtMin && $orderCustomerCreatedAt <= $createdAtMax) {
// $orderIdsCreatedAt[] = (string)$order['id'];
// } else {
// $orderIdsNotCreatedAt[] = (string)$order['id'];
// }
// if($orderCustomerOrderCount == 0){
// $orderIdsNotOrderCount[] = (string)$order['id'];
// }else if($orderCustomerOrderCount == 1){
// $orderIdsOrderCountOne[] = (string)$order['id'];
// }else{
// $orderIdsOrderCountOther[] = (string)$order['id'];
// }
// if($order['customer'][''])
// $orderDatass[$order['id']] = [
// 'id' => $order['id'],
// 'cus' => $order['customer']
// ];
}
$customerIds = array_unique($customerIds);
$customerIdsStr = implode(',', $customerIds);
dump('Total number of customer IDs: ' . count($customerIds));
dump('customer IDs: ' . $customerIdsStr);
dump('Total number of order IDs: ' . count($orderIds));
dump('Order IDs: ' . implode(',', $orderIds));
Event::emit(ShopifyOrders::event_customer, ['storeName' => 'fefc94-67', 'token' => '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','aaa' => $customerIdsStr]);
// dump('Total number of orderIdsCreatedAt IDs: ' . count($orderIdsCreatedAt));
// dump('orderIdsCreatedAt IDs: ' . implode(',', $orderIdsCreatedAt));
// dump('Total number of orderIdsNotCreatedAt IDs: ' . count($orderIdsNotCreatedAt));
// dump('orderIdsNotCreatedAt IDs: ' . implode(',', $orderIdsNotCreatedAt));
// dump('orderIdsNotOrderCount IDs: ' . implode(',', $orderIdsNotOrderCount));
// dump('orderIdsOrderCountOne IDs: ' . implode(',', $orderIdsOrderCountOne));
// dump('orderIdsOrderCountOther IDs: ' . implode(',', $orderIdsOrderCountOther));
// dump($orderDatass);
// Check if there's a next page
if (isset($response->getHeader('link')[0]) && strpos($response->getHeader('link')[0], 'rel="next"')) {
preg_match('/page_info=([^&]*)/', $response->getHeader('link')[0], $matches);
$pageInfo = $matches[1];
} else {
break; // Exit loop if no more pages
}
} catch (GuzzleException $e) {
echo 'Error fetching Shopify orders: ' . $e->getMessage() . PHP_EOL;
break;
}
}
// echo 'Total number of order IDs: ' . count($orderIds) . PHP_EOL;
// dump('Total number of order IDs: ' . count($orderIds));
// dump('Order IDs: ' . implode(',', $orderIds));
return $orderIds;
}
// Method to save order data into bps.shopify_orders
private function saveShopifyOrder($orderData)
{
// Define the table name dynamically
$tableName = 'bps.shopify_orders';
$tableName = getenv('DB_PG_SCHEMA') ? getenv('DB_PG_SCHEMA') . '.' . $tableName : 'bps' . $tableName;
// Prepare data for insertion
$data = [
'id' => $orderData['id'],
'admin_graphql_api_id' => $orderData['admin_graphql_api_id'],
'browser_ip' => $orderData['browser_ip'],
'buyer_accepts_marketing' => $orderData['buyer_accepts_marketing'],
'cancel_reason' => $orderData['cancel_reason'],
'cancelled_at' => $orderData['cancelled_at'],
'created_at' => $orderData['created_at'],
'currency' => $orderData['currency'],
'current_subtotal_price' => $orderData['current_subtotal_price'],
'current_total_discounts' => $orderData['current_total_discounts'],
'current_total_price' => $orderData['current_total_price'],
'customer_email' => $orderData['customer_email'],
'customer_name' => $orderData['customer_name'],
'customer_phone' => $orderData['customer_phone']
];
// SQL statement for inserting or updating order data
$sql = "
INSERT INTO {$tableName} (
id,
admin_graphql_api_id,
browser_ip,
buyer_accepts_marketing,
cancel_reason,
cancelled_at,
created_at,
currency,
current_subtotal_price,
current_total_discounts,
current_total_price,
customer_email,
customer_name,
customer_phone
)
VALUES (
:id,
:admin_graphql_api_id,
:browser_ip,
:buyer_accepts_marketing,
:cancel_reason,
:cancelled_at,
:created_at,
:currency,
:current_subtotal_price,
:current_total_discounts,
:current_total_price,
:customer_email,
:customer_name,
:customer_phone
)
ON CONFLICT (id)
DO UPDATE SET
admin_graphql_api_id = EXCLUDED.admin_graphql_api_id,
browser_ip = EXCLUDED.browser_ip,
buyer_accepts_marketing = EXCLUDED.buyer_accepts_marketing,
cancel_reason = EXCLUDED.cancel_reason,
cancelled_at = EXCLUDED.cancelled_at,
created_at = EXCLUDED.created_at,
currency = EXCLUDED.currency,
current_subtotal_price = EXCLUDED.current_subtotal_price,
current_total_discounts = EXCLUDED.current_total_discounts,
current_total_price = EXCLUDED.current_total_price,
customer_email = EXCLUDED.customer_email,
customer_name = EXCLUDED.customer_name,
customer_phone = EXCLUDED.customer_phone
";
// Execute the SQL query
ThinkDb::execute($sql, $data);
}
}