// +---------------------------------------------------------------------- namespace App\Services\Api; use App\Models\AgentModel; use App\Models\GoodsModel; use App\Models\MemberModel; use App\Models\MerchantModel; use App\Models\OrderModel; use App\Models\ShopModel; use App\Models\TradeModel; use App\Services\BaseService; use App\Services\ConfigService; use App\Services\RedisService; use App\Services\SupplyService; use BN\Red; use Illuminate\Support\Facades\DB; /** * 商品管理-服务类 * @author laravel开发员 * @since 2020/11/11 * Class GoodsService * @package App\Services\Api */ class GoodsService extends BaseService { // 静态对象 protected static $instance = null; /** * 构造函数 * @author laravel开发员 * @since 2020/11/11 * GoodsService 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; } /** * 商品列表 * @param $params * @param int $pageSize * @param int $userId * @return array */ public function getDataList($params, $pageSize=12, $userId=0) { $list = $this->model->from('goods as a') ->where(['a.status'=>1,'a.mark'=>1]) ->where('a.cost_price','>',0) ->where(function ($query) use($params){ $supplyType = isset($params['supply_type'])? intval($params['supply_type']) : 0; if($supplyType>0){ $query->where('a.supply_type',$supplyType); } }) ->where(function ($query) use($params){ $keyword = isset($params['kw'])? $params['kw'] : ''; if($keyword){ $query->where('a.goods_name','like',"%{$keyword}%") ->orWhere('a.spu_name','like',"%{$keyword}%") ->orWhere('a.tag','like',"%{$keyword}%"); } }) ->select(['a.*']) ->orderBy('a.sales','desc') ->orderBy('a.create_time','desc') ->paginate($pageSize > 0 ? $pageSize : 9999999); $list = $list? $list->toArray() :[]; if($list) { $locale = RedisService::get("caches:locale:lang_{$userId}"); $locale = $locale ? $locale : session('locale_lang'); $locale = $locale ? $locale : 'zh-cn'; $supplyList = config('goods.supplyList'); foreach ($list['data'] as &$item) { $item['supply_name'] = isset($supplyList[$item['supply_type']])? $supplyList[$item['supply_type']] : ''; } unset($item); }else{ $this->updateGoods(); } return [ 'total'=> isset($list['total'])? $list['total'] : 9, 'pageSize'=> $pageSize, 'list'=> isset($list['data'])? $list['data'] : [], ]; } /** * 更新商品SKU数据到本地 * @param int $pageSize * @param $params 参数 * @return array|false */ public function updateGoodsSku($pageSize=50,$params=[]) { $cacheKey = "caches:supply:goods_sku_update_{$pageSize}"; if(RedisService::get($cacheKey)){ $this->error = 1047; return false; } $lastTime = $this->model->where(['mark'=>1])->orderBy('create_time','desc')->value('create_time'); $params = [ 'limit'=> $pageSize>0?$pageSize : 50, 'page'=> 1, 'status'=> isset($params['status'])? $params['status'] : 1, // 状态:0-全部,1-上架的,2-下架的 'supply_type'=> isset($params['supply_type'])? $params['supply_type'] : 0, // 渠道商 'title'=> isset($params['title'])? $params['title'] : '', // 标题关键词 'cate_id'=> isset($params['cate_id'])? $params['cate_id'] : '', // 分类ID 'begin_time'=> $lastTime? $lastTime : '', // 开始时间 ]; $goods = []; $updated = 0; $datas = SupplyService::make()->getApiData('getGoodsList', $params); if($datas && $datas['list']){ foreach ($datas['list'] as &$item){ $goodsId = isset($item['goods_id'])? $item['goods_id'] : 0; if($goodsId && !$this->checkGoods($goodsId)){ $goods[] = [ 'goods_id'=> $goodsId, 'supply_type'=> isset($item['supply_type'])? $item['supply_type'] : 0, 'spu_sn'=> isset($item['spu_sn'])? $item['spu_sn'] : '', 'goods_name'=> isset($item['goods_name'])? $item['goods_name'] : '', 'tag'=> isset($item['tag'])? json_encode($item['tag'],256) : '', 'status'=> isset($item['status'])? intval($item['status']) : 1, 'cate_id'=> isset($item['cate_id'])? intval($item['cate_id']) : 0, 'last_update_at'=> isset($item['time'])? $item['time'] : date('Y-m-d H:i:s'), 'create_time'=> time(), ]; }else{ $updated++; } } unset($item); } if($goods){ RedisService::set($cacheKey, $goods, rand(5, 10)); $this->model->insert($goods); } return ['count'=> count($goods),'updated'=> $updated]; } /** * * @param int $pageSize * @param $params 参数 * @return array|false */ public function updateGoods($pageSize=50,$params=[]) { $cacheKey = "caches:supply:goods_list_update_{$pageSize}"; if(RedisService::get($cacheKey)){ $this->error = 1047; return false; } $lastTime = $this->model->where(['mark'=>1])->orderBy('create_time','desc')->value('create_time'); $params = [ 'limit'=> $pageSize>0?$pageSize : 50, 'page'=> 1, 'status'=> isset($params['status'])? $params['status'] : 1, // 状态:0-全部,1-上架的,2-下架的 'supply_type'=> isset($params['supply_type'])? $params['supply_type'] : 0, // 渠道商 'title'=> isset($params['title'])? $params['title'] : '', // 标题关键词 'cate_id'=> isset($params['cate_id'])? $params['cate_id'] : '', // 分类ID 'begin_time'=> $lastTime? $lastTime : '', // 开始时间 ]; $goods = []; $updated = 0; $error =0; $datas = SupplyService::make()->getApiData('getGoodsList', $params); if($datas && $datas['list']){ foreach ($datas['list'] as &$item){ $goodsId = isset($item['goods_id'])? $item['goods_id'] : 0; if($goodsId && !$this->checkGoods($goodsId)){ $info = $this->getApiInfo($goodsId); if($info){ $goods[] = [ 'goods_id'=> $goodsId, 'supply_type'=> isset($item['supply_type'])? $item['supply_type'] : 0, 'spu_sn'=> isset($item['spu_sn'])? $item['spu_sn'] : '', 'spu_name'=> isset($info['spu_name'])? $item['spu_name'] : '', 'main_img'=> isset($info['main_img'])? $item['main_img'] : '', 'detail_img'=> isset($info['detail_img'])? $item['detail_img'] : '', 'goods_name'=> isset($item['goods_name'])? $item['goods_name'] : '', 'brand_name'=> isset($info['brand_name'])? $info['brand_name'] : '', 'limit_num'=> isset($info['limit_num'])? intval($info['limit_num']) : 0, 'lowest_num'=> isset($info['lowest_num'])? intval($info['lowest_num']) : 1, 'cost_price'=> isset($info['cost_price'])? floatval($info['cost_price']) : 0, 'retail_price'=> isset($info['retail_price'])? floatval($info['retail_price']) : 0, 'profit'=> isset($info['profit'])? floatval($info['profit']) : 0, 'sku_list'=> isset($info['sku_list'])? json_encode($info['sku_list'], 256) : '', 'sku_total'=> isset($info['sku_total'])? intval($info['sku_total']) : 0, 'tag'=> isset($item['tag'])? json_encode($item['tag'],256) : '', 'status'=> isset($info['status'])? intval($info['status']) : 1, 'cate_id'=> isset($item['cate_id'])? intval($item['cate_id']) : 0, 'last_update_at'=> isset($info['update_time'])? $info['update_time'] : (isset($item['time']) && $item['time']? $item['time'] : date('Y-m-d H:i:s')), 'create_time'=> time(), ]; }else{ $error++; } }else{ $updated++; } } unset($item); } if($goods){ RedisService::set($cacheKey, $goods, rand(5, 10)); $this->model->insert($goods); } return ['count'=> count($goods),'updated'=> $updated,'errorCount'=> $error]; } /** * 验证 * @param $goodsId * @return bool */ public function checkGoods($goodsId) { $cacheKey ="caches:goods:check_{$goodsId}"; if(RedisService::get($cacheKey) || RedisService::exists($cacheKey)){ return true; } $data = $this->model->where(['goods_id'=> $goodsId,'mark'=>1])->value('id'); RedisService::set($cacheKey, $data, rand(30,60)); return $data; } /** * 接口商品详情 * @param $goodsId 商品ID * @param int $isReal 是否实时数据,0-是,1-否 * @param int $type 数据类型:0-详情,1-仅SKU数据 * @return array|false|mixed|string */ public function getApiInfo($goodsId, $isReal=0, $type=0) { $cacheKey ="caches:goods:detail_{$goodsId}_{$isReal}_{$type}"; $info = RedisService::get($cacheKey); if(empty($info)){ $params = [ 'goods_id'=> $goodsId, 'is_real'=> $isReal, 'type'=> $type ]; $info = SupplyService::make()->getApiData('getGoodsDetail',$params); if($info){ RedisService::set($cacheKey, $info, rand(5,10)); } } return $info; } public function apiCategory($num) { } }