Преглед изворни кода

[智价云] 医药城采集同步

tangyuanwang пре 1 месец
родитељ
комит
d325e503be

+ 20 - 0
app/Http/Controllers/Manager/CollectSync/Product.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers\Manager\CollectSync;
 use App\Http\Controllers\Controller;
 use App\Http\Requests\Manager\CollectSync\Product as Request;
 use App\Jobs\Manager\CollectData\Ysbang\YsbangProductJobs;
+use App\Jobs\Manager\CollectData\Yycheng\YychengProductJobs;
 
 /**
  * 采集数据同步
@@ -33,4 +34,23 @@ class Product extends Controller
         // 告知结果
         return             json_send(['code' => 'success', 'msg' => '执行成功']);
     }
+
+    /**
+     * 执行医药城采集数据同步
+     * @author    唐远望
+     * @version   1.0
+     * @date      2026-02-05
+     */
+    public function data_yycheng_sync(Request $request)
+    {
+        // 验证参数
+        $request->scene('data_yycheng_sync_syncning')->validate();
+        $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
+        $admin_id   = request('access_token.uid', 0); //用户ID
+        $message_data = ['page' => '1', 'limit' => 1000, 'admin_id' => $admin_id, 'is_admin' => $is_admin];
+        YychengProductJobs::dispatch($message_data);
+        // YychengProductJobs::dispatchSync($message_data);
+        // 告知结果
+        return             json_send(['code' => 'success', 'msg' => '执行成功']);
+    }
 }

+ 2 - 1
app/Http/Requests/Manager/CollectSync/Product.php

@@ -39,7 +39,8 @@ class Product extends BaseRequest
         'list'               => ['page', 'limit'],
         'add'                      => [],
         'edit'                      => [],
-        'data_cleadata_ysbang_syncning'  =>[]
+        'data_cleadata_ysbang_syncning'  =>[],
+        'data_yycheng_sync_syncning'  =>[]
     ];
 
     /**

+ 138 - 0
app/Jobs/Manager/CollectData/Yycheng/YychengProductDataJobs.php

@@ -0,0 +1,138 @@
+<?php
+
+namespace App\Jobs\Manager\CollectData\Yycheng;
+
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldBeUnique;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use App\Facades\Servers\Logs\Log;
+use App\Models\manager\Collect\ScrapeTmpData as ScrapeTmpDataModel;//临时采集数据表
+use App\Models\manager\Collect\ScrapeData as ScrapeDataModel;//采集数据表
+use Illuminate\Support\Facades\Cache;
+use App\Models\Manager\CollectData\Yycheng\Store as YychengStoreModel;
+use App\Models\Manager\Citys as CitysModel;
+
+/**
+ * 采集数据-医药城数据处理
+ * @author  唐远望
+ * @version 1.0
+ * @date  2026-02-05
+ */
+class YychengProductDataJobs implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+    protected $message_data;
+
+    /**
+     * Create a new job instance.
+     *
+     * @return void
+     */
+    public function __construct(array $message_data)
+    {
+        $this->message_data = $message_data;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+
+        try {
+            $CitysModel = new CitysModel();
+            $YychengStoreModel = new YychengStoreModel();
+            $city_id_data = $CitysModel->get_city_id_list();
+            $province_id_list = $CitysModel->get_province_id_list();
+            $item = $this->message_data;
+            $comStoreId = $item['comStoreId'];
+            if(!$comStoreId) return true;
+            $comStoreId = explode('_', $comStoreId);
+            $provider_id = $comStoreId[0];
+            $store_data = Cache::get('admin:store_data_log:' . $provider_id);
+            if (!$store_data) {
+                $store_data = $YychengStoreModel->where(['id' => $provider_id])->first(['id', 'name', 'company_id', 'company_name', 'province_name', 'city_name', 'addr', 'unified_code']);
+                if (!$store_data) return true;
+                $store_data = $store_data->toarray();
+                Cache::put('YychengStoreJobs:store_data_log:' . $provider_id, $store_data, 300);
+            }
+            $province_name = $store_data['province_name'];
+            if ($province_name && in_array($province_name, ['北京市', '天津市', '上海市', '重庆市'])) {
+                //移除市这个字符
+                $province_name = trim(str_replace('市', '', $province_name));
+            }
+
+            $ScrapeDataModel = new ScrapeDataModel();
+            $where_data = [
+                'platform_id' => '6', //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久
+                'province_id' => isset($province_id_list[$province_name]) ? $province_id_list[$province_name]['id'] : 0, //省份id
+                'city_id' => isset($city_id_data[$store_data['city_name']]) ? $city_id_data[$store_data['city_name']]['id'] : 0, //城市id
+                'province_name' => isset($store_data['province_name']) ? $store_data['province_name'] : '', //省份名称
+                'city_name' => isset($store_data['city_name']) ? $store_data['city_name'] : '', //城市名称
+                'area_info' => isset($store_data['addr']) ? $store_data['addr'] : '', //区县信息
+                'product_name' =>  $item['drugname'], //产品名称
+                'product_specs' => $item['specification'], //产品规格
+                'online_posting_count' => '1', //在线上架数量
+                'continuous_listing_count' => '1', //持续上架数量
+                'link_url' => $item['url'], //链接地址
+                'store_name' => $item['storeName'], //店铺名称
+                'company_name' => $item['manufacturer'], //公司名称
+                'qualification_number' => isset($store_data['unified_code']) ? $store_data['unified_code'] : '', //营业执照号码
+                'scrape_date' => date('Y-m-d H:i:s', $item['real_crawler_time']), //采集日期
+                'number' => '1', //盒数
+            ];
+            //校验$where_data 数据下是否存在空值的情况,如果存在跳过写入
+            foreach ($where_data as $key => $value) {
+                //如果字段名称不在范围内,才去校验值是否为空
+                if (!in_array($key, ['qualification_number']) && empty($value)) {
+                    return true;
+                }
+            }
+            //查询是否存在记录
+            $ScrapeTmpData = $ScrapeDataModel->where($where_data)->first();
+            if (empty($ScrapeTmpData)) {
+                $insert_data = [
+                    'platform_id' => '6', //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久
+                    'province_id' => isset($province_id_list[$province_name]) ? $province_id_list[$province_name]['id'] : 0, //省份id
+                    'city_id' => isset($city_id_data[$store_data['city_name']]) ? $city_id_data[$store_data['city_name']]['id'] : 0, //城市id
+                    'province_name' => isset($store_data['province_name']) ? $store_data['province_name'] : '', //省份名称
+                    'city_name' => isset($store_data['city_name']) ? $store_data['city_name'] : '', //城市名称
+                    'area_info' => isset($store_data['addr']) ? $store_data['addr'] : '', //区县信息
+                    'product_name' =>  $item['drugname'], //产品名称
+                    'product_specs' => $item['specification'], //产品规格
+                    'one_box_price' => round($item['minPrice'] / 100, 2), //一箱价格
+                    'online_posting_count' => '1', //在线上架数量
+                    'continuous_listing_count' => '1', //持续上架数量
+                    'link_url' => $item['url'], //链接地址
+                    'store_name' => $item['storeName'], //店铺名称
+                    'company_name' => $item['manufacturer'], //公司名称
+                    'qualification_number' => isset($store_data['unified_code']) ? $store_data['unified_code'] : '', //营业执照号码
+                    'scrape_date' => date('Y-m-d H:i:s', $item['real_crawler_time']), //采集日期
+                    'min_price' => round($item['minPrice'] / 100, 2), //最低价格
+                    'number' => '1', //盒数
+                    'insert_time' => date('Y-m-d H:i:s', time()),
+                ];
+                $ScrapeDataModel->insert($insert_data);
+            } else {
+                //如果存在且价格低于采集价格,则更新价格
+                if ($ScrapeTmpData->min_price > $this->message_data['min_price']) {
+                    $ScrapeTmpData->min_price = $this->message_data['min_price'];
+                    $ScrapeTmpData->one_box_price = $this->message_data['one_box_price'];
+                    $ScrapeTmpData->save();
+                }
+            }
+        } catch (\Exception $e) {
+            Log::info('job_error', '采集数据-医药城数据处理队列失败', ['data' => $this->message_data, 'error' => $e->getMessage()]);
+        }
+    }
+
+    public function failed(\Throwable $exception)
+    {
+        Log::info('job_error', '采集数据-医药城数据处理队列完全失败', ['data' => $this->message_data, 'error' => $exception]);
+    }
+}

+ 83 - 0
app/Jobs/Manager/CollectData/Yycheng/YychengProductJobs.php

@@ -0,0 +1,83 @@
+<?php
+
+namespace App\Jobs\Manager\CollectData\Yycheng;
+
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldBeUnique;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use App\Facades\Servers\Logs\Log;
+use App\Models\Manager\CollectData\Yycheng\Product as YychengProductModel;
+use App\Jobs\Manager\CollectData\Yycheng\YychengStoreJobs;
+
+/**
+ * 采集数据-医药城数据同步
+ * @author  唐远望
+ * @version 1.0
+ * @date  2026-02-06
+ */
+class YychengProductJobs implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+    protected $message_data;
+
+    /**
+     * Create a new job instance.
+     *
+     * @return void
+     */
+    public function __construct(array $message_data)
+    {
+        $this->message_data = $message_data;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+
+        $page = isset($this->message_data['page']) ? $this->message_data['page'] : 1;
+        $limit = isset($this->message_data['limit']) ? $this->message_data['limit'] : 50;
+        $field = [
+            'id', //ID
+            'manufacturer', //公司名称
+            'drugname', //药品名称
+            'specification', //规格
+            'approval', //批准文号
+            'comStoreId', //供应商(店铺)ID
+            'storeName', //供应商(店铺)名称
+            'minPrice', //最低价
+            'real_crawler_time', //真实采集时间
+            'url', //药品详情页url
+        ];
+        try {
+            $YychengProductModel = new YychengProductModel();
+            //获取分页数据,多个字段进行分组去重
+            $list_config_data = $YychengProductModel->where([['real_crawler_time', '<', time() - 86400]])
+                ->orderby('id', 'desc')->paginate($limit, $field, 'page', $page)->toarray();
+            if (!$list_config_data || empty($list_config_data['data'])) {
+                $totle_data = isset($this->message_data['total']) ? $this->message_data['total'] : 0;
+                Log::info('job_info', '采集数据-医药城数据同步队列,执行完毕', ['data' => ['page' => $page, 'limit' => $limit, 'totle' => $totle_data], 'message' => '没有数据可同步']);
+                return true;
+            }
+            $list_data = $list_config_data['data'];
+            $total = $list_config_data['total'];
+            YychengStoreJobs::dispatch($list_data);
+            // YychengStoreJobs::dispatchSync($list_data);
+            Log::info('job_info', '采集数据-医药城数据同步队列日志', ['data' => ['page' => $page, 'limit' => $limit, 'totle' => $total]]);
+
+            //继续执行下一页
+            $message_data['page'] = $page + 1;
+            $message_data['limit'] = $limit;
+            $message_data['total'] = $total;
+            $this->dispatch($message_data);
+        } catch (\Exception $e) {
+            Log::info('job_error', '采集数据-医药城数据同步队列失败', ['error' => $e->getMessage()]);
+        }
+    }
+}

+ 60 - 0
app/Jobs/Manager/CollectData/Yycheng/YychengStoreJobs.php

@@ -0,0 +1,60 @@
+<?php
+
+namespace App\Jobs\Manager\CollectData\Yycheng;
+
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldBeUnique;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use App\Facades\Servers\Logs\Log;
+use App\Jobs\Manager\CollectData\Yycheng\YychengProductDataJobs;
+
+/**
+ * 采集数据-药师帮店铺数据
+ * @author  唐远望
+ * @version 1.0
+ * @date  2026-02-06
+ */
+class YychengStoreJobs implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+    protected $message_data;
+
+    /**
+     * Create a new job instance.
+     *
+     * @return void
+     */
+    public function __construct(array $message_data)
+    {
+        $this->message_data = $message_data;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        
+        $list_data = $this->message_data;
+        if (empty($list_data)) return true;
+        try {
+            foreach ($list_data as $key => $item) {
+                YychengProductDataJobs::dispatch($item);
+                // YychengProductDataJobs::dispatchSync($item);
+            }
+        } catch (\Exception $e) {
+            Log::info('job_error', '采集数据-药师帮店铺数据同步队列失败', ['error' => $e->getMessage()]);
+        }
+    }
+
+
+    public function failed(\Throwable $exception)
+    {
+        Log::info('job_error', '采集数据-药师帮店铺数据同步队列完全失败', ['data' => $this->message_data, 'error' => $exception]);
+    }
+}

+ 25 - 0
app/Models/Manager/CollectData/Yycheng/Product.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace App\Models\Manager\CollectData\Yycheng;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 三九采集数据源-医药城-商品模型
+ * @author 唐远望
+ * @version 1.0
+ * @date 2026-02-06
+ */
+class Product extends Model
+{
+    use HasFactory;
+    // 与模型关联的表名
+    protected $table = 'yaoex_drug';
+    // 是否主动维护时间戳
+    public $timestamps = false;
+    protected   $connection = 'ysbang';
+    // 定义时间戳字段名
+    // const CREATED_AT = 'insert_time';
+    // const UPDATED_AT = 'update_time';
+}

+ 25 - 0
app/Models/Manager/CollectData/Yycheng/Store.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace App\Models\Manager\CollectData\Yycheng;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 三九采集数据源-医药城-店铺模型
+ * @author 唐远望
+ * @version 1.0
+ * @date 2026-02-06
+ */
+class Store extends Model
+{
+    use HasFactory;
+    // 与模型关联的表名
+    protected $table = 'yaoex_provider';
+    // 是否主动维护时间戳
+    public $timestamps = false;
+    protected   $connection = 'ysbang';
+    // 定义时间戳字段名
+    // const CREATED_AT = 'insert_time';
+    // const UPDATED_AT = 'update_time';
+}

+ 3 - 1
routes/manager.php

@@ -322,4 +322,6 @@ Route::any('external/company/set_status', [App\Http\Controllers\Manager\External
 Route::any('external/company/all', [App\Http\Controllers\Manager\External\Company::class, 'all']);
 
 //采集数据同步-药师帮
-Route::any('collect_sync/product/data_ysbang_sync', [App\Http\Controllers\Manager\CollectSync\Product::class, 'data_ysbang_sync']);
+Route::any('collect_sync/product/data_ysbang_sync', [App\Http\Controllers\Manager\CollectSync\Product::class, 'data_ysbang_sync']);
+//采集数据同步-医药城
+Route::any('collect_sync/product/data_yycheng_sync', [App\Http\Controllers\Manager\CollectSync\Product::class, 'data_yycheng_sync']);