199 lines
7.2 KiB
PHP
199 lines
7.2 KiB
PHP
<?php
|
|
|
|
namespace App\Domains\Real\Commands\Sync;
|
|
|
|
use App\Dicts;
|
|
use Carbon\Carbon;
|
|
use App\Models\Real\Order;
|
|
use MongoDB\BSON\UTCDateTime;
|
|
use Illuminate\Support\Facades\DB;
|
|
use App\Domains\Real\Services\CommonService;
|
|
use App\Domains\Real\Repositories\OrderRepository;
|
|
|
|
class OrderCustomSync extends Command
|
|
{
|
|
protected $name = 'real:sync-custom-order';
|
|
|
|
protected $description = '同步RD企业订单数据';
|
|
|
|
protected $chunks = 1000;
|
|
|
|
public function handle()
|
|
{
|
|
$this->datetime = $this->getDateTime();
|
|
|
|
$orders = $this->getOrders();
|
|
$orders = array_keyBy($orders, 'order_id');
|
|
$orderItems = $this->getOrderItems(array_keys($orders));
|
|
|
|
$dataOrders = [];
|
|
$dataOrderCards = [];
|
|
|
|
foreach ($orderItems as $key => $value) {
|
|
$order = $orders[$value['order_id']];
|
|
|
|
if (!$order) {
|
|
throw new \Exception('未找到订单数据:' . $value['order_id']);
|
|
}
|
|
|
|
$dataOrders[$value['order_id']] = [
|
|
'id' => $value['order_id'],
|
|
'type' => $value['type'],
|
|
'company_id' => CommonService::parseCompanyId($order['company_id']),
|
|
'transaction_no' => $order['transaction_no'],
|
|
'pay_channel' => $order['pay_channel'],
|
|
'unit_price' => $order['unit_price'],
|
|
'counts' => $order['counts'],
|
|
'total_price' => $order['total_price'],
|
|
'order_at' => $order['order_at'],
|
|
'created_at' => date('Y-m-d H:i:s'),
|
|
'updated_at' => date('Y-m-d H:i:s'),
|
|
];
|
|
|
|
$dataOrderCards[$value['type']][$value['sim']] = [
|
|
'sim' => $value['sim'],
|
|
'order_id' => $value['order_id'],
|
|
'counts' => $value['item_counts'],
|
|
'unit_price' => $value['item_unit_price'],
|
|
];
|
|
|
|
$dataPackageCards[$value['type']][$value['sim']] = [
|
|
'package_id' => $value['package_id'],
|
|
'sim' => $value['sim'],
|
|
];
|
|
}
|
|
|
|
$this->line('插入订单数据,条数:'.count($dataOrders));
|
|
foreach (array_chunk($dataOrders, $this->chunks) as $data) {
|
|
echo '.';
|
|
Order::upsert($data, 'id');
|
|
}
|
|
app(OrderRepository::class)->forgetCached();
|
|
|
|
unset($dataOrders);
|
|
|
|
$this->line('插入订单关联数据,条数:'.count(array_collapse($dataOrderCards)));
|
|
$tables = [
|
|
'real_order_base_cards',
|
|
'real_order_renewal_cards',
|
|
'real_order_renewal_package_cards',
|
|
'real_order_flows_package_cards',
|
|
'real_order_optional_package_cards',
|
|
'real_order_additional_package_cards',
|
|
];
|
|
foreach ($dataOrderCards as $type => $orderCards) {
|
|
foreach (array_chunk($orderCards, $this->chunks) as $data) {
|
|
echo '.';
|
|
DB::table($tables[$type])->upsert($data, ['sim','order_id']);
|
|
}
|
|
}
|
|
unset($dataOrderCards);
|
|
$this->line('插入订单关联数据成功');
|
|
|
|
$this->line('插入套餐关联数据,条数:'.count(array_collapse($dataPackageCards)));
|
|
$tables = [
|
|
'',
|
|
'real_package_renewal_cards',
|
|
'real_package_renewal_package_cards',
|
|
'real_package_flows_package_cards',
|
|
'real_package_optional_package_cards',
|
|
'real_package_additional_package_cards',
|
|
];
|
|
foreach ($dataPackageCards as $type => $packageCards) {
|
|
foreach (array_chunk($packageCards, $this->chunks) as $data) {
|
|
echo '.';
|
|
DB::table($tables[$type])->upsert($data, ['sim','package_id']);
|
|
}
|
|
}
|
|
unset($dataPackageCards);
|
|
$this->line('插入套餐关联数据成功');
|
|
}
|
|
|
|
// 查询订单
|
|
protected function getOrders()
|
|
{
|
|
$this->line('查询订单记录');
|
|
|
|
$starttime = $this->datetime->copy()->startOfMonth()->startOfDay();
|
|
$endtime = $this->datetime->copy()->endOfMonth()->endOfDay();
|
|
|
|
$select = [
|
|
'id as order_id',
|
|
'sn as order_sn',
|
|
'custom_no as company_id',
|
|
'transaction_no',
|
|
'sim_count as counts',
|
|
'amount_money as total_price',
|
|
'paytype as pay_channel',
|
|
'create_time as order_at',
|
|
];
|
|
|
|
$orders = DB::connection('real')->table('jxc_custom_order')->select($select)->where('status', 3)
|
|
->where('create_time', '>=', $starttime->timestamp)
|
|
->where('create_time', '<=', $endtime->timestamp)
|
|
->orderBy('create_time')->get()->toArray();
|
|
|
|
$pay_channel = app(Dicts::class)->get('pay_channel');
|
|
$pay_channel = array_values($pay_channel);
|
|
|
|
foreach ($orders as &$item) {
|
|
$item = (array)$item;
|
|
$item['total_price'] = intval($item['total_price'] * 100);
|
|
$item['counts'] = !empty($item['counts']) ? $item['counts'] : 1;
|
|
$item['pay_channel'] = 0;
|
|
foreach ($pay_channel as $key => $value) {
|
|
if (in_array($item['pay_channel'], $value)) {
|
|
$item['pay_channel'] = $key;
|
|
}
|
|
}
|
|
|
|
$item['unit_price'] = floor($total_price/$item['counts']);
|
|
$item['order_at'] = date('Y-m-d H:i:s', $item['order_at']);
|
|
}
|
|
|
|
return $orders;
|
|
}
|
|
|
|
// 订单详情
|
|
protected function getOrderItems($order_ids)
|
|
{
|
|
$this->line('查询订单详情');
|
|
$select = [
|
|
'sn as order_id',
|
|
'sim',
|
|
'goods_no as package_id',
|
|
'goods_type as type',
|
|
'unit_price as item_unit_price',
|
|
'quantity as item_counts',
|
|
];
|
|
|
|
$orderItems = DB::connection('real')->table('jxc_custom_order_item')->select($select)
|
|
->whereIn('sn', $order_ids)->where('goods_type', '<', 6)->get()->toArray();
|
|
|
|
foreach ($orderItems as &$item) {
|
|
$item = (array)$item;
|
|
$item['item_unit_price'] = intval($item['item_unit_price'] * 100);
|
|
}
|
|
|
|
return $orderItems;
|
|
}
|
|
|
|
// 从MongoDB上获取卡数据
|
|
protected function getCards()
|
|
{
|
|
$starttime = new UTCDateTime($this->datetime->copy()->startOfDay()->startOfMonth()->timestamp * 1000);
|
|
$endtime = new UTCDateTime($this->datetime->copy()->endOfDay()->endOfMonth()->timestamp * 1000);
|
|
|
|
$select = ['cNo', 'bNo', 'sPCode', 'iccid', 'imsi', 'jBatchNo', 'exPCodes.cDate', 'exPCodes.pEffDate', 'exPCodes.oNo', 'exPCodes.pType', 'comId', 'oType'];
|
|
|
|
return DB::connection('mongo')->table('tblCard')->select($select)->where('pNo', 'No00000000768')->where('isDel', '<>', 1)->where('bNo', 'exists', true)
|
|
->where(function ($query) use ($starttime, $endtime) {
|
|
$query->where(function ($q) use ($starttime, $endtime) {
|
|
$q->where('exPCodes.cDate', '>=', $starttime)->where('exPCodes.cDate', '<=', $endtime)->where('exPCodes.oDate', 'exists', false);
|
|
})->orWhere(function ($q) use ($starttime, $endtime) {
|
|
$q->where('exPCodes.oDate', '>=', $starttime)->where('exPCodes.oDate', '<=', $endtime);
|
|
});
|
|
})->get()->toArray();
|
|
}
|
|
}
|