<?php
// +----------------------------------------------------------------------
// | likeshop开源商城系统
// +----------------------------------------------------------------------
// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
// | gitee下载:https://gitee.com/likeshop_gitee
// | github下载:https://github.com/likeshop-github
// | 访问官网:https://www.likeshop.cn
// | 访问社区:https://home.likeshop.cn
// | 访问手册:http://doc.likeshop.cn
// | 微信公众号:likeshop技术社区
// | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
// |  likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
// | 禁止对系统程序代码以任何目的,任何形式的再发布
// | likeshop团队版权所有并拥有最终解释权
// +----------------------------------------------------------------------
// | author: likeshop.cn.team
// +----------------------------------------------------------------------

namespace app\common\command;


use app\common\enum\LiveGoodsEnum;
use app\common\model\live\LiveGoods;
use app\common\server\WxMnpLiveServer;
use think\console\Command;
use think\console\Output;
use think\console\Input;
use think\facade\Log;


class WechatLiveGoods extends Command
{

    protected function configure()
    {
        $this->setName('wechat_live_goods')
            ->setDescription('微信小程序直播商品状态同步');
    }


    protected function execute(Input $input, Output $output)
    {
        try {
            $liveGoodsModel = new LiveGoods();
            // 系统待微信审核的商品
            $localGoods = $liveGoodsModel->where([
                'del' => 0,
                'sys_audit_status' => LiveGoodsEnum::SYS_AUDIT_STATUS_WAIT_WECHAT
            ])
                ->select()->toArray();

            if (empty($localGoods)) {
                return true;
            }

            // 切分为20个一组,获取每组的商品状态更新
            $localGoods = array_chunk($localGoods, 20);
            foreach ($localGoods as $localGoodsItem) {
                $goodsIds = array_column($localGoodsItem, 'wx_goods_id');
                $wxGoodsData = $this->getGoods($goodsIds);
                $wxGoodsData = $wxGoodsData['goods'] ?? [];
                $wxGoodsDataColumn = array_column($wxGoodsData, null,'goods_id');

                $updateData = [];
                foreach ($localGoodsItem as $goods) {
                    $wxGoodsId = $goods['wx_goods_id'];
                    if (!isset($wxGoodsDataColumn[$wxGoodsId])) {
                        continue;
                    }
                    $wxGoods = $wxGoodsDataColumn[$wxGoodsId];
                    $data = [
                        'id' => $goods['id'],
                        'wx_audit_status' => $wxGoods['audit_status'],
                        'audit_remark' => LiveGoodsEnum::getWxAuditStatusDesc($wxGoods['audit_status']),
                    ];
                    if ($wxGoods['audit_status'] == LiveGoodsEnum::WX_AUDIT_STATUS_SUCCESS) {
                        $data['sys_audit_status'] = LiveGoodsEnum::SYS_AUDIT_STATUS_SUCCESS;
                    }
                    if ($wxGoods['audit_status'] == LiveGoodsEnum::WX_AUDIT_STATUS_FAIL) {
                        $data['sys_audit_status'] = LiveGoodsEnum::SYS_AUDIT_STATUS_FAIL;
                    }
                    $updateData[] = $data;
                }

                if (!empty($updateData)) {
                    $liveGoodsModel->saveAll($updateData);
                }
            }

            return true;
        } catch (\Exception $e) {
            Log::write('更新直播商品状态失败:' . $e->getMessage());
            return false;
        }
    }


    /**
     * @notes 获取商品
     * @param $goodsIds
     * @return array
     * @throws \Exception
     * @author 段誉
     * @date 2023/2/17 19:24
     */
    protected function getGoods($goodsIds)
    {
        $result = (new WxMnpLiveServer())->handle('getGoodsWarehouse', $goodsIds);
        if (0 != $result['errcode']) {
            return [];
        }
        return $result;
    }

}