vd/app/Domains/Real/Jobs/MongoSyncJob.php
2019-03-14 09:28:33 +08:00

111 lines
3.6 KiB
PHP

<?php
namespace App\Domains\Real\Jobs;
use Carbon\Carbon;
use App\Models\Card\Card;
use Illuminate\Support\Arr;
use App\Models\Mongo\TblCard;
use Illuminate\Bus\Queueable;
use MongoDB\BSON\UTCDateTime;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Dipper\Foundation\Bus\Dispatchable;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Domains\Card\Repositories\BlocRepository;
use App\Domains\Card\Repositories\CardRepository;
use App\Domains\Real\Repositories\CompanyRepository;
use App\Domains\Virtual\Repositories\OrderCardPartitionRepository;
class MongoSyncJob implements ShouldQueue
{
use Queueable, Dispatchable;
public $page;
public $limit;
public $utcDateTime;
protected static $carrierOperators = [1, 0, 2];
/**
* Undocumented function
*
* @param int $page
* @param int $limit
* @param UTCDateTime $utcDateTime
*/
public function __construct($page, $limit, UTCDateTime $utcDateTime)
{
$this->page = $page;
$this->limit = $limit;
$this->utcDateTime = $utcDateTime;
}
/**
*
*/
public function handle()
{
Log::info("MongoSyncJob #: utcDateTime {$this->utcDateTime} - page {$this->page}");
$query = TblCard::select(['cNo', 'bNo', 'iccid', 'imsi', 'comId', 'oType', 'saDate', 'sDate', 'oRDate'])
->where('pNo', 'No00000000768')
->where('oRDate', '>', $this->utcDateTime)
->where('sDate', 'exists', true)
->orderBy('sDate');
$res = $query->forPage($this->page, $this->limit)->get();
if (empty($res)) {
Log::notice('MongoSyncJob not result!');
return ;
}
$companies = app(CompanyRepository::class)->withTrashed()->get()->keyBy('sn');
$blocs = app(BlocRepository::class)->withTrashed()->get()->pluck('id', 'sn')->toArray();
$values = [];
foreach ($res as $key => $value) {
$activated_at = $value['saDate'] ? $value['saDate']->toDateTime()->format('Y-m-d H:i:s') : null;
if ($activated_at && Carbon::parse($activated_at) < Carbon::parse('2000-01-01 00:00:00')) {
$activated_at = null;
}
$sim = intval(preg_replace('/\D/', '', $value['cNo']));
$values[$sim] = [
'sim' => $sim,
'imsi' => $value['imsi'] ?? '',
'iccid' => $value['iccid'] ?? '',
'bloc_id' => $blocs[$value['comId']] ?? 0,
'carrier_operator' => self::$carrierOperators[$value['oType']] ?? 255,
'activated_at' => $activated_at,
'virtual_activated_at' => $activated_at,
'created_at' => $value['sDate'] ? $value['sDate']->toDateTime()->format('Y-m-d H:i:s') : null,
'updated_at' => date('Y-m-d H:i:s'),
];
}
$builder = Card::query()->toBase();
$sql = $builder->getGrammar()->compileInsert($builder, $values);
$sql .= ' on conflict (sim) do update set
activated_at=excluded.activated_at,
virtual_activated_at=COALESCE(cards.virtual_activated_at, excluded.activated_at)';
$builder->connection->insert($sql, Arr::flatten($values, 1));
app(CardRepository::class)->forgetCached();
$simArray = implode(',', array_keys($values));
DB::statement("select fix_timelines('{{$simArray}}'::INT8[]);");
app(OrderCardPartitionRepository::class)->forgetCached();
Log::info("MongoSyncJob END #: utcDateTime {$this->utcDateTime} - page {$this->page}");
}
}