diff --git a/app/Console/Commands/Dealer/ManageSubsidySettleCommand.php b/app/Console/Commands/Dealer/ManageSubsidySettleCommand.php new file mode 100644 index 00000000..b19b1d6e --- /dev/null +++ b/app/Console/Commands/Dealer/ManageSubsidySettleCommand.php @@ -0,0 +1,158 @@ +day >= 20) { + $startAt = $tz->copy()->setDay(5)->startOfDay(); + $endAt = $tz->copy()->setDay(19)->endOfDay(); + } elseif ($tz->day >= 5) { + $startAt = $tz->copy()->subMonthNoOverflow()->set('day', 20)->startOfDay(); + $endAt = $tz->copy()->set('day', 4)->endOfDay(); + } else { + $startAt = $tz->copy()->subMonthNoOverflow()->setDay(5)->startOfDay(); + $endAt = $startAt->copy()->subMonthNoOverflow()->setDay(19)->endOfDay(); + } + + $head = '【'.$startAt->format('Y/m/d').'-'.$endAt->format('Y/m/d').'】'; + + // 如果不是强制执行,则需检查是否已结算过 + if (! $this->option('force') && Cache::has($this->cacheKey($startAt, $endAt))) { + return $this->warn("{$head}管理津贴已结算"); + } + + $this->info("{$head}------------[开始]管理津贴结算------------"); + + if ($this->option('force')) { + $this->info("{$head}正在删除旧数据..."); + DealerManageSubsidy::where('start_at', $startAt)->where('end_at', $endAt)->delete(); + $this->info("{$head}数据删除成功"); + } + + $this->info("{$head}数据写入中..."); + $this->settle($startAt, $endAt); + $this->info("{$head}写入成功, 总耗时: ".$this->formatDuration($tz->diffInMilliseconds(now(), false))); + + $this->info("{$head}------------[结束]管理津贴结算------------".PHP_EOL); + + Cache::put($this->cacheKey($startAt, $endAt), 1, 24*3600*22); + + return 0; + } + + /** + * 管理津贴结算结算 + * + * @param \Illuminate\Support\Carbon $startAt + * @param \Illuminate\Support\Carbon $endAt + * @return void + */ + protected function settle(Carbon $startAt, Carbon $endAt): void + { + $subsidies = DealerManageSubsidyLog::select('user_id', DB::raw('sum(total_amount) as total_amount')) + ->whereBetween('order_completed_at', [$startAt, $endAt]) + ->groupBy('user_id') + ->get(); + + $data = []; + + $time = now()->toDateTimeString(); + + foreach ($subsidies as $key => $subsidy) { + if ($key > 0 && $key%500 === 0) { + DealerManageSubsidy::insert($data); + + $data = []; + $time = now()->toDateTimeString(); + } + + $data[] = [ + 'user_id' => $subsidy->user_id, + 'start_at' => $startAt, + 'end_at' => $endAt, + 'total_amount' => $subsidy->total_amount, + 'status' => DealerManageSubsidyStatus::Pending, + 'created_at' => $time, + 'updated_at' => $time, + ]; + } + + if (count($data) > 0) { + DealerManageSubsidy::insert($data); + } + } + + /** + * 生成缓存的 key + * + * @param \Illuminate\Support\Carbon $startAt + * @param \Illuminate\Support\Carbon $endAt + * @return void + */ + protected function cacheKey(Carbon $startAt, Carbon $endAt) + { + $startAt->format('Ymd').'_'.$endAt->format('Ymd').'_dealer_manage_subsidy'; + } + + /** + * 格式化时间 + * + * @param float $milliseconds + * @return string + */ + protected function formatDuration($milliseconds): string + { + if ($milliseconds < 0.01) { + return round($milliseconds * 1000) . 'μs'; + } elseif ($milliseconds >= 1000) { + return round($milliseconds / 1000, 2) . 's'; + } + + return $milliseconds . 'ms'; + } +} diff --git a/app/Enums/DealerManageSubsidyStatus.php b/app/Enums/DealerManageSubsidyStatus.php new file mode 100644 index 00000000..2a6ed321 --- /dev/null +++ b/app/Enums/DealerManageSubsidyStatus.php @@ -0,0 +1,8 @@ + 'datetime', + 'end_at' => 'datetime', + 'status' => DealerManageSubsidyStatus::class, + 'completed_at' => 'datetime', + ]; + + protected $fillable = [ + 'user_id', + 'total_amount', + 'start_at', + 'end_at', + 'status', + 'completed_at', + ]; +} diff --git a/database/migrations/2022_01_14_172541_create_dealer_manage_subsidies_table.php b/database/migrations/2022_01_14_172541_create_dealer_manage_subsidies_table.php new file mode 100644 index 00000000..897bbbf6 --- /dev/null +++ b/database/migrations/2022_01_14_172541_create_dealer_manage_subsidies_table.php @@ -0,0 +1,40 @@ +id(); + $table->unsignedBigInteger('user_id'); + $table->unsignedDecimal('total_amount', 10, 2)->comment('补贴总金额'); + $table->timestamp('start_at')->comment('结算开始时间'); + $table->timestamp('end_at')->comment('结算结束时间'); + $table->tinyInteger('status')->default(0)->comment('状态: 0 待处理, 5 已付款'); + $table->timestamp('completed_at')->nullable()->comment('完成时间'); + $table->timestamps(); + + $table->unique(['user_id', 'start_at', 'end_at']); + $table->index(['start_at', 'end_at']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('dealer_manage_subsidies'); + } +}