| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 | <?phpnamespace App\Console\Commands\ContentManage;use Dotenv\Store\StoreBuilder;use Illuminate\Console\Command;use Illuminate\Support\Facades\DB;class SaveBookSettlementMode extends Command{    /**     * The name and signature of the console command.     *     * @var string     */    protected $signature = 'ContentManage:SaveBookSettlementMode {--bid= : 书籍id}';    /**     * The console command description.     *     * @var string     */    protected $description = '保存书籍的结算模式,每天执行一次';    /**     * Execute the console command.     */    public function handle(): void    {        $maxBid = 0;        $bid = $this->option('bid');        while (true) {            $books = DB::table('books')                ->when($bid, function ($query, $bid) {                    return $query->where(['id' => $bid]);                })                ->select('id', 'settlement_type', 'bottomline')                ->orderBy('id', 'asc')                ->where('id', '>', $maxBid)                ->limit(300)                ->get();            $maxBid = $books->last()->id ?? 0;            if(0 == $maxBid) {                break;            }            $this->dealBooks($books);        }    }    private function dealBooks($books) {        $nowDate = date('Y-m-d');        $nowTime = date('Y-m-d H:i:s');        $bids = $books->pluck('id')->unique();        $bookLasteSettlementModeMap = $this->bookLasteSettlementModeMap($bids);        foreach ($books as $book) {            if($bookLasteSettlementModeMap->has($book->id)) {                $bookLasteSettlementMode = $bookLasteSettlementModeMap->get($book->id);                if($book->settlement_type == $bookLasteSettlementMode['settlement_mode'] &&                    $book->bottomline == $bookLasteSettlementMode['bottomline']) {                    continue;                }            }            DB::table('book_settlement_mode_history')                ->insert([                    'bid' => $book->id,                    'effective_date' => $nowDate,                    'settlement_mode' => $book->settlement_type,                    'bottomline' => $book->bottomline,                    'change_reason' => 'manual',                    'created_at' => $nowTime,                    'updated_at' => $nowTime                ]);        }    }    private function bookLasteSettlementModeMap($bids) {        $map = collect();        $history = DB::table('book_settlement_mode_history')            ->whereIn('bid', $bids)            ->where([                'is_enabled' => 1, 'change_reason' => 'manual'            ])->select('id', 'settlement_mode', 'bottomline', 'effective_date', 'bid')            ->orderBy('id', 'desc')            ->get();        foreach ($history as $h) {            if($map->has($h->bid)) {                $settlementMode = $map->get($h->bid);                if($settlementMode['effective_date'] >= $h->effective_date) {                    continue;                }            }            $map->put($h->bid, [                'effective_date' => $h->effective_date,                'settlement_mode' => $h->settlement_mode,                'bottomline' => $h->bottomline            ]);        }        return $map;    }}
 |