PHP脚本示例

/**
     * @desc 清理产品商品无效数据
     * @param Input $input
     * php think goods -m Clear -a clearGoods --endTime='2020-01-01' -vvv
     * @return void
     * @author 陈龙
     * @date 2024-04-02 9:45
     */
    public function clearGoods(Input $input)
    {
        $options = $input->getOptions();
        $start_time = microtime(true);
        $clearTime = strtotime($options['endTime'] ?? '') ?: strtotime(date('2020-01-01'));
        $where = [
            'completetime' => ['<', $clearTime],
            'retread_time' => ['<', $clearTime]
        ];
        $data = Goods::where($where)->column('goods_spu');
        $this->output->writeln(Goods::getLastSql());
        $data = array_unique($data);
        $dataCount = count($data);
        $limit = 1000;
        $totalPage = ceil($dataCount / $limit);
        $this->output->writeln("总数据量:{$dataCount}");
        $this->output->writeln("每次查询:{$limit}");
        $this->output->writeln("总页数:{$totalPage}");
        if (empty($dataCount)) {
            $this->output->writeln('查无数据');
            return;
        }

        for ($pageNo = 1; $pageNo <= $totalPage; $pageNo++) {
            $this->output->info("第 {$pageNo} 页");
            $spus = array_slice($data, ($pageNo - 1) * $limit, $limit);
            $this->output->writeln('开始处理数据');
            $result = ClearService::instance()->dealClearGoods($spus);
            $message = $result['message'] ?? ($result['messages'] ?? '');
            $this->_showMsg($message);
            $this->output->info("第 {$pageNo} 页处理完成");
        }

        $this->output->writeln("执行时间:" . (microtime(true) - $start_time));
    }
    /**
     * @desc 消息提示抽离
     * @param array|string $message 消息内容
     * @return void
     * @author 陈龙
     * @date 2020/11/20 14:47:09
     */
    private function _showMsg($message)
    {
        if (is_array($message)) {
            foreach ($message as $key => $value) {
                $this->output->writeln("{$key}:" . (is_array($value) ? json_encode($value) : $value));
            }
        } else {
            $this->output->writeln($message);
        }
    }

    public function dealClearGoods($goods_spus)
    {
        if (empty($goods_spus)) return back(0, "SPU为空");
        //1.根据spu查出所有sku,看近90天是否有库存,有销量
        $skus_arr = DevGoodsSku::where(['goods_spu' => ['IN', $goods_spus]])->column('goods_sku');
        //有库存的skus
        $stock_break_skus = $this->checkStockBySkus($skus_arr);
        //有销量的skus
        $sale_break_skus = $this->checkSalesBySkus($skus_arr);
        $all_break_skus = sep_unique_str(array_merge($stock_break_skus, $sale_break_skus));
        //获取需要剔除的spu
        $need_break_spus = DevGoodsSku::where(['goods_sku' => ['IN', $all_break_skus]])->group('goods_spu')->column('goods_spu');
        $this->output->writeln("需要剔除的spu总数:".count($need_break_spus));
        //去除后需要更新的skus
        $need_up_spus = array_diff($goods_spus, $need_break_spus);
        $this->output->writeln("需要更新的spu总数:".count($need_up_spus));
        //开始更新数据
        $this->updateIsClear($need_up_spus,1);
        return back(1, '执行完成');
    }

你可能感兴趣的:(php)