// +---------------------------------------------------------------------- namespace App\Services\Common; use App\Models\GoodsModel; use App\Models\PostLogModel; use App\Services\BaseService; use App\Services\Common\Querry\Szwego; use App\Services\RedisService; /** * 采集数据-服务类 * @author laravel开发员 * @since 2020/11/11 * Class QuerryService * @package App\Services\Common */ class QuerryService extends BaseService { // 静态对象 protected static $instance = null; /** * 构造函数 * @author laravel开发员 * @since 2020/11/11 * QuerryService constructor. */ public function __construct() { $this->model = new GoodsModel(); } /** * 静态入口 * @return static|null */ public static function make() { if (!self::$instance) { self::$instance = (new static()); } return self::$instance; } /** * 采集商品数据 * @return array */ public function querryData() { $params = request()->post(); $site = isset($params['site'])? trim($params['site']) : ''; switch($site){ case 'szwego': default: $datas = Szwego::make()->querryData($params); if(!$datas){ return message(Szwego::make()->getError(),false); } break; } return message(1010,true, $datas); } /** * 采集商品分类 * @return array */ public function querryTags() { $params = request()->post(); $url = isset($params['url'])? $params['url'] : ''; if(empty($url) || !preg_match("/^(http(s?):\/\/)/", $url)){ return message(2009,false); } $site = isset($params['site'])? trim($params['site']) : ''; switch($site){ case 'szwego': default: $datas = Szwego::make()->querryTags($params); if(!$datas){ return message(Szwego::make()->getError(),false); } break; } return message(1010,true, $datas); } /** * 推送数据 * @return array */ public function publishData() { $params = request()->post(); $url = isset($params['url'])? $params['url'] : ''; $apiKey = isset($params['api_key'])? $params['api_key'] : ''; $posts = isset($params['posts'])? $params['posts'] : []; if(empty($url) || !preg_match("/^(http(s?):\/\/)/", $url)){ return message(2012,false); } if(empty($apiKey)){ return message(2013,false); } if(empty($posts)){ return message(2014,false); } // 构建数据 $datas = []; $pushDatas = []; $apiUrl = preg_match("/\?/",$url)? $url."&api_key={$apiKey}": $url."?api_key={$apiKey}"; foreach ($posts as $item){ $checkId = $this->checkHasByGoodsId($item['goods_id'], $apiUrl); if(!$checkId){ $pushDatas[] = $item; $item['imgsSrc'] = $item['imgsSrc']? json_encode($item['imgsSrc'], 256) : ''; $item['push_at'] = date('Y-m-d H:i:s'); $item['api_url'] = $apiUrl; unset($item['id']); unset($item['create_time_text']); unset($item['tagsArr']); unset($item['is_push']); $datas[] = $item; } } if(empty($pushDatas)){ return message(2017,false); } $params['posts'] = $pushDatas; $result = httpRequest($apiUrl, $params,'post'); $success = isset($result['success'])? $result['success'] : ''; $msg = isset($result['msg'])? $result['msg'] : '推送失败'; RedisService::set("caches:push:{$apiKey}:".md5($apiUrl),['url'=>$apiUrl,'result'=>$result,'params'=>$params,'date'=>date('Y-m-d H:i:s')], 86400); // if($success == true && $datas){ if($success == true && $datas && GoodsModel::insert($datas)){ return message(lang('2015',['num'=> count($datas)]),true, ['result'=>$result,'params'=>$params,'datas'=>$datas]); } return message($msg? $msg : 2016,false,['result'=>$result]); } /** * 验证是否存在 * @param $goodsId * @return bool */ public function checkHasByGoodsId($goodsId, $apiUrl='') { if(empty($goodsId)){ return false; } $cacheKey = "caches:querryGoods:check_{$goodsId}_".md5($apiUrl); if($id = RedisService::get($cacheKey)){ return $id; } $where = ['goods_id'=> $goodsId,'mark'=>1]; if($apiUrl){ $where['api_url'] = $apiUrl; } if($id = GoodsModel::where($where)->value('id')){ RedisService::set($cacheKey, $id, 3 * 24 * 3600); return $id; } return false; } /** * 列表数据 * @param $params * @param int $pageSize * @return array */ public function history($params, $pageSize = 15) { $where = ['a.mark' => 1]; $status = isset($params['status']) ? $params['status'] : 0; if ($status > 0) { $where['a.status'] = $status; } $list = $this->model->from('goods as a') ->where($where) ->where(function ($query) use ($params) { $keyword = isset($params['keyword']) ? $params['keyword'] : ''; if ($keyword) { $query->where('a.title', 'like', "%{$keyword}%")->orWhere('a.goods_id', 'like', "%{$keyword}%")->orWhere('a.tags', 'like', "%{$keyword}%")->orWhere('a.api_url', 'like', "%{$keyword}%"); } }) ->select(['a.*']) ->orderBy('a.push_at', 'desc') ->orderBy('a.create_time', 'desc') ->orderBy('a.id', 'desc') ->paginate($pageSize > 0 ? $pageSize : 9999999); $list = $list ? $list->toArray() : []; if ($list) { foreach ($list['data'] as &$item) { $item['create_time'] = $item['create_time'] ? datetime($item['create_time'], 'Y-m-d H.i.s') : ''; $item['thumb'] = isset($item['thumb']) && $item['thumb'] ? get_image_url($item['thumb']) : ''; $item['imgsSrc'] = isset($item['imgsSrc']) && $item['imgsSrc'] ? json_decode($item['imgsSrc'], true) : []; $item['sku'] = isset($item['sku']) && $item['sku'] ? json_decode($item['sku'], true) : []; } } return [ 'pageSize' => $pageSize, 'total' => isset($list['total']) ? $list['total'] : 0, 'list' => isset($list['data']) ? $list['data'] : [] ]; } /** * 删除 * @return array */ public function delete() { GoodsModel::where(['mark'=>0])->where('update_time','<=', time() - 3600)->delete(); return parent::delete(); // TODO: Change the autogenerated stub } }