cqpCow 1 year ago
parent
commit
cb25cfd86e

+ 12 - 0
app/Http/Controllers/Api/AssetController.php

@@ -73,4 +73,16 @@ class AssetController extends BaseController
             return $this->json_return(201,$data);
             return $this->json_return(201,$data);
         }
         }
     }
     }
+
+    public function updateData(Request $request)
+    {
+        $service = new AssetService();
+        list($status,$data) = $service->updateData($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
 }
 }

+ 120 - 0
app/Jobs/AssetDeviceJob.php

@@ -0,0 +1,120 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Model\Asset;
+use App\Service\InOutOptionService;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Redis;
+use Symfony\Component\Console\Output\ConsoleOutput;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class AssetDeviceJob implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    protected $data;
+
+    /**
+     * Create a new job instance
+     *
+     * @return void
+     */
+    public function __construct($data)
+    {
+        $this->data = $data;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        try{
+            DB::beginTransaction();
+
+            $this->settle();
+
+            DB::commit();
+            //输出信息 测试
+            $this->echoMessage(new ConsoleOutput());
+        }catch (\Exception $exception){
+            DB::rollBack();
+            file_put_contents('record_error.txt',date("Y-m-d H:i:s",time()).json_encode($this->data) . PHP_EOL.$exception->getMessage()."line" . $exception->getLine().PHP_EOL,8);
+        }
+    }
+
+    public function settle(){
+        $data = $this->data;
+        if(empty($data)){
+            file_put_contents('record_data.txt',date("Y-m-d H:i:s",time())."原数据:".json_encode($data).PHP_EOL,8);
+            return;
+        }
+
+        if(empty($data['assetOas'])) {
+            file_put_contents('record_data.txt',date("Y-m-d H:i:s",time())."数据结构错误".PHP_EOL,8);
+            return;
+        }
+
+        //内存设置
+        ini_set('memory_limit', -1);
+
+        //软删除
+        $time = time();
+        Asset::where('del_time',0)->update(['del_time' => $time]);
+
+        $batchSize = 100;
+        $totalAssets = count($data['assetOas']);
+        for ($i = 0; $i < $totalAssets; $i += $batchSize) {
+            $batch = array_slice($data['assetOas'], $i, $batchSize);
+
+            // 对每个批次的数据进行处理
+            foreach ($batch as $value) {
+                if(empty($value['singleCode'])) continue;
+
+                // 进行您的操作
+                Asset::updateOrCreate(
+                    ['singleCode' => $value['singleCode']], //查询条件
+                    [
+                        "assetCode" => $value['assetCode'] ?? "",
+                        "assetNo" => $value['assetNo'] ?? "",
+                        "assetType" => $value['assetType'] ?? "",
+                        "brand" => $value['brand'] ?? "",
+                        "expectedLife" => $value['expectedLife'] ?? "",
+                        "gs1" => $value['gs1'] ?? "",
+                        "isKey" => $value['isKey'] ?? "",
+                        "kind" => $value['kind'] ?? "",
+                        "located" => $value['located'] ?? "",
+                        "name" => $value['name'] ?? "",
+                        "nextCalibrationTime" => $value['nextCalibrationTime'] ?? "",
+                        "originalValue" => $value['originalValue'] ?? "",
+                        "purchaseTime" => $value['purchaseTime'] ?? "",
+                        "remark" => $value['remark'] ?? "",
+                        "singleCode" => $value['singleCode'] ?? "",
+                        "startUseDate" => $value['startUseDate'] ?? "",
+                        "type" => $value['type'] ?? "",
+                        "useDept" => $value['useDept'] ?? "",
+                        "userName" => $value['userName'] ?? "",
+                        "version" => $value['version'] ?? "",
+                        "del_time" => 0
+                    ]  //添加或者修改的数据
+                );
+            }
+
+            // 在处理完每个批次后,进行一些内存清理操作
+            unset($batch);
+        }
+    }
+
+    protected function echoMessage(OutputInterface $output)
+    {
+        $output->writeln($this->data);
+    }
+}

+ 2 - 1
app/Model/Asset.php

@@ -6,9 +6,10 @@ use Illuminate\Database\Eloquent\Model;
 
 
 class Asset extends Model
 class Asset extends Model
 {
 {
+    protected $guarded = [];
     protected $table = "asset"; //指定表
     protected $table = "asset"; //指定表
     const CREATED_AT = 'crt_time';
     const CREATED_AT = 'crt_time';
     const UPDATED_AT = 'upd_time';
     const UPDATED_AT = 'upd_time';
     protected $dateFormat = 'U';
     protected $dateFormat = 'U';
-
+    const Key_Queue = "update_asset_queue";
 }
 }

+ 13 - 0
app/Model/Settings.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Settings extends Model
+{
+    protected $table = "settings"; //指定表
+    const CREATED_AT = null;
+    const UPDATED_AT = null;
+    protected $dateFormat = 'U';
+}

+ 48 - 0
app/Service/AssetService.php

@@ -3,9 +3,12 @@
 namespace App\Service;
 namespace App\Service;
 
 
 
 
+use App\Jobs\AssetDeviceJob;
 use App\Model\Asset;
 use App\Model\Asset;
 use App\Model\InventoryOrder;
 use App\Model\InventoryOrder;
 use App\Model\InventoryOrderAsset;
 use App\Model\InventoryOrderAsset;
+use App\Model\Settings;
+use Illuminate\Support\Facades\Redis;
 
 
 class AssetService extends Service
 class AssetService extends Service
 {
 {
@@ -131,4 +134,49 @@ class AssetService extends Service
 
 
         return [true,['located' => $located,'dep' => $dep]];
         return [true,['located' => $located,'dep' => $dep]];
     }
     }
+
+    public function updateData($data){
+        list($status,$msg) = $this->rule($data);
+        if(! $status) return [false, 'IP未入白名单'];
+
+        dispatch(new AssetDeviceJob($data))->onQueue(Asset::Key_Queue);
+
+        return [true,''];
+    }
+
+    public function rule($data){
+        // 获取用户的IP地址
+        $userIP = $_SERVER['REMOTE_ADDR'];
+        // 获取设置的IP地址
+        $allowedIPs = $this->allowedIPs();
+
+        if(empty($allowedIPs)) return [false, $userIP];
+        // 校验用户IP是否在允许的范围内
+        $isValidIP = false;
+        foreach ($allowedIPs as $allowedIP) {
+            if (strpos($allowedIP, '/') !== false) {
+                // IP段表示法校验
+                list($subnet, $mask) = explode('/', $allowedIP);
+                if ((ip2long($userIP) & ~((1 << (32 - $mask)) - 1)) == ip2long($subnet)) {
+                    $isValidIP = true;
+                    break;
+                }
+            } else {
+                // 单个IP地址校验
+                if ($allowedIP === $userIP) {
+                    $isValidIP = true;
+                    break;
+                }
+            }
+        }
+
+        return [$isValidIP, $userIP];
+    }
+
+    public function allowedIPs(){
+        $allowedIPs = Settings::where('name','allowedIPs')->first();
+        if(empty($allowedIPs) || empty($allowedIPs->value)) return [];
+
+        return explode(',',$allowedIPs->value);
+    }
 }
 }

+ 1 - 1
routes/api.php

@@ -18,7 +18,7 @@ Route::middleware('auth:api')->get('/user', function (Request $request) {
 });
 });
 
 
 Route::any('login', 'Api\LoginController@login');
 Route::any('login', 'Api\LoginController@login');
-Route::any('acceptData', 'Api\TestController@test');
+Route::any('acceptData', 'Api\AssetController@updateData');
 
 
 Route::group(['middleware'=> ['checkLogin']],function ($route){
 Route::group(['middleware'=> ['checkLogin']],function ($route){
     //操作日志
     //操作日志