diff --git a/app/Domains/Virtual/Commands/Sync/CardSync.1.php b/app/Domains/Virtual/Commands/Sync/CardSync.1.php deleted file mode 100644 index f3bb354d..00000000 --- a/app/Domains/Virtual/Commands/Sync/CardSync.1.php +++ /dev/null @@ -1,391 +0,0 @@ - 0, 11 => 1, 12 => 2]; - protected static $payChannels = [10 => 'wx', 11 => 'alipay', 12 => 'bank']; - - protected $blocs; - protected $packages; - protected $products; - - protected $limit = 1; - - const FILENAME = 'app/command/sync-card.json'; - const INIT_ID = 0; - - public function handle() - { - $contents = $this->getFile(); - $maxId = $contents['maxId']; - $nextId = $contents['maxId']; - - $this->saveFile(1, $maxId); - - $query = DB::connection('vd_old')->table('ckb_custom') - ->select(['id', 'custom_no', 'imsi', 'carrieroperator', 'iccid', 'card_number', 'card_from', 'iccid', 'company', 'custom_state', 'create_time' ,'update_time']) - ->where('id', '>', $maxId); - - $logQuery = DB::connection('vd_old')->table('ckb_custom_handle_log') - ->select(['type', 'company', 'pay_type', 'content', 'valid_start_time', 'valid_end_time', 'sale_account', 'order_account', 'create_time']); - - $total = $query->count(); - - $this->line('待同步条数:' . $total); - - if ($total) { - $this->blocs = app(BlocRepository::class)->get()->pluck('id', 'shorthand')->toArray(); - $this->packages = app(PackageRepository::class)->get()->keyBy('sn'); - $this->products = app(ProductRepository::class)->get()->keyBy('sn'); - } - - $page = 1; - - while ($total) { - echo $page . PHP_EOL; - $value = $query->offset(($page - 1) * $this->limit)->limit($this->limit)->get()->first(); - - if (!$value) { - break; - } - - $value = (array)$value; - - $logs = $logQuery->where('custom_no', $value['custom_no'])->get()->collect(); - $existed = Card::where('sim', $value['card_number'])->first(); - - DB::beginTransaction(); - - try { - $card = $this->handleCard($value, $logs, $existed); - $this->handleOrder($card, $logs, $existed); - $this->handleRenewals($card, $logs, $existed); - $this->handleRenewalPackages($card, $logs, $existed); - $this->handleFlows($card, $logs, $existed); - - DB::commit(); - } catch (\Exception $e) { - DB::rollback(); - throw $e; - } - - $nextId = $value['id']; - - if ($page * $this->limit >= $total) { - break; - } - - $page++; - } - - app(CardRepository::class)->forgetCached(); - - $this->saveFile(0, $nextId); - } - - // 卡数据转换 - protected function handleCard($value, $logs, $existed) - { - // 判断卡类型 - $type = ($value['card_number'][3] >= 5) ? 1 : ($existed ? 0 : 2); - - // 激活记录 - $activateLog = $logs->where('type', 10)->first(); - $activated_at = $activateLog ? date('Y-m-d H:i:s', $activateLog['valid_start_time']) : null; - - $cardData = [ - 'sim' => $value['card_number'], - 'imsi' => $value['imsi'], - 'iccid' => $value['iccid'], - 'bloc_id' => $this->blocs[$value['card_from']] ?? 0, - 'carrier_operator' => self::$carrierOperators[$value['carrieroperator']], - 'activated_at' => $existed['activated_at'] ?? $activated_at, - 'virtual_activated_at' => $activated_at, - 'type' => $type, - 'cancelled_at' => ($value['custom_state'] === 13) ? date('Y-m-d H:i:s', $value['update_time']) : null, - 'created_at' => date('Y-m-d H:i:s', $value['create_time']), - 'updated_at' => date('Y-m-d H:i:s', $value['update_time']), - ]; - - if ($existed) { - $card = Card::where('sim', $card['sim'])->update($cardData); - } else { - $card = Card::create($cardData); - } - - return $card; - } - - // 销售记录 - protected function handleOrder($card, $logs, $existed) - { - if (!$res = $logs->where('type', 13)->first()) { - return null; - } - - $package = $this->getPackage($res['content']); - - $unit_price = floatval($res['sale_account']) * 100; - $custom_price = floatval($res['order_account']) * 100; - - $product = $this->getProduct($package, $res['company'], $unit_price); - - // 按规则生成订单编号 (月+公司+产品) - $sn = date('Ym', $res['create_time']) . sprintf('%08d', $custom_price) . sprintf('%04d', $product['id']); - - $orderData = [ - 'sn' => $sn, - 'source' => 1, - 'type' => 0, - 'company_id' => $res['company'], - 'package_id' => $package['id'], - 'product_id' => $product['id'], - 'pay_channel' => self::$payChannels[$res['pay_type']], - 'unit_price' => $unit_price, - 'counts' => 1, - 'total_price' => $unit_price, - 'custom_price' => $custom_price, - 'order_at' => date('Y-m-d H:i:s', $res['create_time']), - 'order_status' => 4, - 'transaction_status' => 1, - 'created_at' => date('Y-m-d H:i:s', $res['create_time']), - ]; - - if ($order = Order::where('sn', $orderData['sn'])->first()) { - $order->counts = $order->counts + 1; - $order->total_price = $order->total_price + $unit_price; - $order->custom_price = $order->custom_price + $custom_price; - $order->save(); - } else { - $order = Order::create($orderData); - } - - OrderCard::upsert([ - 'sim' => $card['sim'], - 'order_id' => $order['id'], - 'company_id' => $order['company_id'], - 'package_id' => $order['package_id'], - ], ['sim', 'order_id']); - } - - // 续费记录 - protected function handleRenewals($card, $logs, $existed) - { - $res = $logs->where('type', 11)->values()->all(); - - if (empty($res)) { - return ; - } - - $array = []; - - foreach ($res as $item) { - $package = $this->getPackage($item['content']); - $unit_price = floatval($item['sale_account']) * 100; - $custom_price = floatval($item['order_account']) * 100; - - $sn = date('Ym', $item['create_time']) . sprintf('%04d', $item['company']) . sprintf('%04d', $package['id']) . sprintf('%04d', $custom_price); - - if (!$array[$sn]) { - $array[$sn] = [ - 'sn' => $sn, - 'type' => 1, - 'company_id' => $item['company'], - 'package_id' => $package->id, - 'unit_price' => $unit_price, - 'counts' => 1, - 'total_price' => $unit_price, - 'custom_price' => $custom_price, - 'order_at' => date('Y-m-d H:i:s', $item['create_time']), - ]; - } else { - $array[$sn] = []; - } - - - - if ($order = Order::where('sn', $orderData['sn'])->first()) { - $order->counts = $order->counts + 1; - $order->total_price = $order->total_price + $unit_price; - $order->custom_price = $order->custom_price + $custom_price; - $order->save(); - } else { - $order = Order::create($orderData); - } - - if ($orderRenewalCard = OrderRenewalCard::where('sim', $card['sim'])->where('order_id', $order->id)->first()) { - $orderRenewalCard->count = $orderRenewalCard->count + 1; - $orderRenewalCard->save(); - } else { - OrderRenewalCard::upsert([ - 'sim' => $card->sim, - 'order_id' => $order->id, - 'company_id' => $order->company_id, - 'package_id' => $order->package_id, - 'counts' => 1, - 'unit_price' => $order->unit_price - ], ['sim', 'order_id']); - } - } - } - - // 续费包记录 - protected function handleRenewalPackages($card, $logs, $existed) - { - $res = $logs->where('type', 14)->values()->all(); - - if (empty($res)) { - return ; - } - - foreach ($res as $item) { - $package = $this->getPackage($item['content']); - $unit_price = floatval($item['sale_account']) * 100; - $custom_price = floatval($item['order_account']) * 100; - - $sn = date('Ym', $item['create_time']) . sprintf('%04d', $item['company']) . sprintf('%04d', $package['id']) . sprintf('%04d', $custom_price); - - $array[] = [ - 'sn' => $sn, - 'type' => 2, - 'company_id' => $item['company'], - 'unit_price' => $unit_price, - 'counts' => DB::raw('counts + 1'), - 'total_price' => DB::raw("total_price + {$unit_price}"), - 'custom_price' => DB::raw("custom_price + {$custom_price}"), - 'order_at' => date('Y-m-d H:i:s', $item['create_time']), - ]; - } - } - - // 加油包记录 - protected function handleFlows($card, $logs, $existed) - { - $res = $logs->where('type', 15)->values()->all(); - - if (empty($res)) { - return ; - } - - - foreach ($res as $item) { - $package = $this->getPackage($item['content']); - $unit_price = floatval($item['sale_account']) * 100; - $custom_price = floatval($item['order_account']) * 100; - - $sn = date('Ym', $item['create_time']) . sprintf('%04d', $item['company']) . sprintf('%04d', $package['id']) . sprintf('%04d', $custom_price); - - $array[] = [ - 'sn' => $sn, - 'type' => 3, - 'company_id' => $item['company'], - 'unit_price' => $unit_price, - 'counts' => DB::raw('counts + 1'), - 'total_price' => DB::raw("total_price + {$unit_price}"), - 'custom_price' => DB::raw("custom_price + {$custom_price}"), - 'order_at' => date('Y-m-d H:i:s', $item['create_time']), - ]; - } - } - - /** - * 获取套餐 - * - * @param string $sn - * @return void - */ - protected function getPackage($sn) - { - if (!$package = $this->packages[$sn]) { - throw new \Exception('套餐不存在'); - } - - return $package; - } - - /** - * 获取定价 - * - * @param string $sn - * @return void - */ - protected function getProduct($package, $companyId, $price) - { - $sn = strtoupper($package['sn'] . '_' . $companyId . '_' . $price); - - if (!$product = $this->products[$sn]) { - $product = app(ProductService::class)->store([ - 'name' => $package['name'] . '' . $price, - 'company_id' => $companyId, - 'package_id' => $package['id'], - 'base_price' => $price, - 'renewal_price' => $price, - ]); - $this->products[$sn] = $product; - } - - return $product; - } - - /** - * 获取文件内容 - * - * @return void - */ - protected function getFile() - { - $file = storage_path(self::FILENAME); - - if (!file_exists($file)) { - $dir = dirname($file); - if (null !== $dir && !is_dir($dir)) { - mkdir($dir, 0777, true); - } - - $this->saveFile(0, self::INIT_ID); - } - - $contents = file_get_contents($file); - - return json_decode($contents, 256); - } - - /** - * 写入文件 - * - * @param integer $status 状态 1运行中 0运行结束 - * @param integer $maxId 最后查询的ID - * @return void - */ - protected function saveFile(int $status, int $maxId) - { - $file = storage_path(self::FILENAME); - - $contents = json_encode([ - 'status' => $status, - 'maxId' => $maxId, - ]); - - file_put_contents($file, $contents); - } -} diff --git a/app/Domains/Virtual/Commands/Sync/CardSync.php b/app/Domains/Virtual/Commands/Sync/CardSync.php index 339512e3..031937b4 100644 --- a/app/Domains/Virtual/Commands/Sync/CardSync.php +++ b/app/Domains/Virtual/Commands/Sync/CardSync.php @@ -63,7 +63,7 @@ class CardSync extends Command 'imsi' => $value['imsi'], 'iccid' => $value['iccid'], 'bloc_id' => $this->blocs[$value['card_from']] ?? 0, - 'carrier_operator' => self::$carrierOperators[$value['carrieroperator']], + 'carrier_operator' => self::$carrierOperators[$value['carrieroperator']] ?? 255, 'type' => ($value['card_number'][3] >= 5) ? 1 : 0, 'activated_at' => date('Y-m-d H:i:s', $value['card_cycle_start']), 'virtual_activated_at' => date('Y-m-d H:i:s', $value['card_cycle_start']), diff --git a/app/Domains/Virtual/Commands/Sync/LogSync.php b/app/Domains/Virtual/Commands/Sync/LogSync.php index c3e2758f..c94e1b41 100644 --- a/app/Domains/Virtual/Commands/Sync/LogSync.php +++ b/app/Domains/Virtual/Commands/Sync/LogSync.php @@ -4,11 +4,14 @@ namespace App\Domains\Virtual\Commands\Sync; use Carbon\Carbon; use App\Models\Card\Card; -use MongoDB\BSON\UTCDateTime; +use App\Models\Virtual\Order; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Artisan; +use App\Domains\Virtual\Services\ProductService; use App\Domains\Card\Repositories\BlocRepository; use App\Domains\Card\Repositories\CardRepository; +use App\Domains\Virtual\Repositories\PackageRepository; +use App\Domains\Virtual\Repositories\ProductRepository; class LogSync extends Command { @@ -16,31 +19,40 @@ class LogSync extends Command protected $description = '同步VD订单数据'; + protected static $types = [11 => 1, 13 => 0, 14 => 2, 15 => 3]; protected static $carrierOperators = [10 => 0, 11 => 1, 12 => 2]; protected static $payChannels = [10 => 'wx', 11 => 'alipay', 12 => 'bank']; + protected static $orderClasses = [ + \App\Models\Virtual\OrderCard::class, + \App\Models\Virtual\OrderRenewalCard::class, + \App\Models\Virtual\OrderRenewalPackageCard::class, + \App\Models\Virtual\OrderFlowPackageCards::class, + ]; + protected $limit = 1000; protected $filename = 'sync-log.json'; - protected $initCursor = 946656000000; // '2000-01-01 00:00:00' + protected $initCursor = 0; // '2000-01-01 00:00:00' + + protected $blocs; + protected $packages; + protected $products; public function handle() { $contents = $this->getFile(); - $microtime = $contents['cursor']; - $now_microtime = intval(microtime(true) * 1000); + $nextId = $maxId = $contents['cursor']; - $this->saveFile(1, $microtime); + $this->saveFile(1, $maxId); - $utcDateTime = new UTCDateTime($microtime); + $this->blocs = app(BlocRepository::class)->get()->pluck('id', 'shorthand')->toArray(); + $this->packages = app(PackageRepository::class)->get()->keyBy('sn'); + $this->products = app(ProductRepository::class)->get()->keyBy('sn'); - Artisan::call('real:sync-bloc'); - $blocs = app(BlocRepository::class)->get()->pluck('id', 'sn')->toArray(); - - $query = DB::connection('mongo')->table('tblCard') - ->select(['cNo', 'iccid', 'imsi', 'comId', 'oType', 'saDate', 'sDate']) - ->where('isDel', '<>', 1) - ->where('sDate', '>', $utcDateTime); + $query = DB::connection('vd_old')->table('logs') + ->where('type', '<>', 10) + ->where('create_time', '>', $timestamp); $total = $query->count(); @@ -52,24 +64,74 @@ class LogSync extends Command echo $page . PHP_EOL; $res = $query->offset(($page - 1) * $this->limit)->limit($this->limit)->get(); - $values = []; + DB::beginTransaction(); foreach ($res as $key => $value) { - $activated_at = $value['saDate'] ? $value['saDate']->toDateTime()->format('Y-m-d H:i:s') : 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, - 'created_at' => $value['sDate']->toDateTime()->format('Y-m-d H:i:s'), - 'updated_at' => date('Y-m-d H:i:s'), + $package = $this->getPackage($value['content']); + $unit_price = floatval($value['sale_account']) * 100; + $custom_price = floatval($value['order_account']) * 100; + $product = $this->getProduct($package, $value['company'], $unit_price); + $type = self::$types[$value['type']]; + $pay_channel = self::$payChannels[$value['pay_type']]; + + // 按规则生成订单编号 (月6+类型1+公司3+套餐4+价格6) + $sn = date('Ym', $value['create_time']) . $type . sprintf('%03d', $value['company']) . sprintf('%04d', $package['id']) . sprintf('%06d', $custom_price); + + $data = [ + 'sn' => $sn, + 'source' => 1, + 'type' => $type, + 'company_id' => $value['company'], + 'package_id' => $package['id'], + 'product_id' => $product['id'], + 'pay_channel' => $pay_channel, + 'unit_price' => $unit_price, + 'counts' => 1, + 'total_price' => $unit_price, + 'custom_price' => $custom_price, + 'order_at' => date('Y-m-d H:i:s', $res['create_time']), + 'order_status' => 4, + 'transaction_status' => 1, + 'created_at' => date('Y-m-d H:i:s', $res['create_time']), ]; + + $relationData = [ + 'sim' => $value['sim'], + 'order_id' => $order->id, + 'company_id' => $order->company_id, + 'package_id' => $order->package_id, + 'counts' => 1, + 'unit_price' => $order->unit_price + ]; + + try { + if ($order = Order::where('sn', $data['sn'])->first()) { + $order->count = $order->count + 1; + $order->total_price = $order->total_price + $unit_price; + $order->custom_price = $order->custom_price + $custom_price; + $order->save(); + } else { + $order = Order::create($data); + } + + $query = (new $orderClasses[$type])->query(); + + if ($relation = $query->where('sim', $value['sim'])->where('order_id', $order->id)->first()) { + $relation->count = $relation->count + 1; + $relation->save(); + } else { + $relation = $query->create($relationData); + } + } catch (\Exception $e) { + DB::rollback(); + throw $e; + } } - Card::upsert($values, 'sim', true); + DB::commit(); + + $nextId = $value['id']; + $this->saveFile(0, $nextId); if ($page * $this->limit >= $total) { break; @@ -77,9 +139,44 @@ class LogSync extends Command $page++; } + } - app(CardRepository::class)->forgetCached(); + /** + * 获取套餐 + * + * @param string $sn + * @return void + */ + protected function getPackage($sn) + { + if (!$package = $this->packages[$sn]) { + throw new \Exception('套餐不存在'); + } - $this->saveFile(0, $now_microtime); + return $package; + } + + /** + * 获取定价 + * + * @param string $sn + * @return void + */ + protected function getProduct($package, $companyId, $price) + { + $sn = strtoupper($package['sn'] . '_' . $companyId . '_' . $price); + + if (!$product = $this->products[$sn]) { + $product = app(ProductService::class)->store([ + 'name' => $package['name'] . '' . $price, + 'company_id' => $companyId, + 'package_id' => $package['id'], + 'base_price' => $price, + 'renewal_price' => $price, + ]); + $this->products[$sn] = $product; + } + + return $product; } } diff --git a/app/Domains/Virtual/Providers/VirtualServiceProvider.php b/app/Domains/Virtual/Providers/VirtualServiceProvider.php index cf5ca19e..369fcb6c 100644 --- a/app/Domains/Virtual/Providers/VirtualServiceProvider.php +++ b/app/Domains/Virtual/Providers/VirtualServiceProvider.php @@ -26,6 +26,7 @@ class VirtualServiceProvider extends ServiceProvider \App\Domains\Virtual\Commands\Sync\PackageSync::class, \App\Domains\Virtual\Commands\Sync\ProductSync::class, \App\Domains\Virtual\Commands\Sync\CardSync::class, + \App\Domains\Virtual\Commands\Sync\LogSync::class, ]); } diff --git a/app/Models/Virtual/OrderFlowPackageCards.php b/app/Models/Virtual/OrderFlowPackageCards.php index a426bffd..261a6360 100644 --- a/app/Models/Virtual/OrderFlowPackageCards.php +++ b/app/Models/Virtual/OrderFlowPackageCards.php @@ -6,7 +6,7 @@ use App\Core\Model; use Illuminate\Database\Eloquent\SoftDeletes; use App\Models\Virtual\Relations\OrderRelations; -class OrderRenewalPackageCard extends Model +class OrderFlowPackageCards extends Model { use SoftDeletes, OrderRelations; diff --git a/database/migrations/2018_12_24_164779_create_virtual_orders_table.php b/database/migrations/2018_12_24_164779_create_virtual_orders_table.php index 15aa1241..dc23a563 100644 --- a/database/migrations/2018_12_24_164779_create_virtual_orders_table.php +++ b/database/migrations/2018_12_24_164779_create_virtual_orders_table.php @@ -52,8 +52,6 @@ class CreateVirtualOrdersTable extends Migration $table->index('order_at'); $table->comment('VD订单'); }); - - } /** diff --git a/database/migrations/2018_12_24_170946_create_virtual_order_cards_tables.php b/database/migrations/2018_12_24_170946_create_virtual_order_cards_tables.php index 96f7e098..e9e2d51a 100644 --- a/database/migrations/2018_12_24_170946_create_virtual_order_cards_tables.php +++ b/database/migrations/2018_12_24_170946_create_virtual_order_cards_tables.php @@ -30,7 +30,6 @@ class CreateVirtualOrderCardsTables extends Migration $table->integer('company_id')->unsigned()->default(0)->comment('企业ID'); $table->integer('package_id')->unsigned()->default(0)->comment('套餐ID'); $table->integer('counts')->unsigned()->default(1)->comment('数量'); - $table->integer('unit_price')->unsigned()->default(0)->comment('单价'); $table->primary(['order_id', 'sim']); $table->comment($table_comment); });