Forráskód Böngészése

富勒中订单和波次信息的统一 十分钟一次
波次详情中的取消的订单去掉,在该订单中的波次号置空(星号*?)

ajun 5 éve
szülő
commit
8ed9bdb487

+ 26 - 0
app/Console/Commands/ClearCancelledOrderTask.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\OracleDOCWaveDetails;
+use App\Services\OracleDocWaveDetailService;
+use Illuminate\Console\Command;
+
+class ClearCancelledOrderTask extends Command
+{
+
+    protected $signature = 'clear:cancelledOrder';
+
+
+    protected $description = 'Command description';
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+        app('OracleDocWaveDetailService')->clearCancelledOrderTask();
+    }
+}

+ 3 - 0
app/Console/Kernel.php

@@ -2,6 +2,7 @@
 
 namespace App\Console;
 
+use App\Console\Commands\ClearCancelledOrderTask;
 use App\Console\Commands\FluxOrderFix;
 use App\Console\Commands\InventoryDailyLoggingOwner;
 use App\Console\Commands\LogExpireDelete;
@@ -36,6 +37,7 @@ class Kernel extends ConsoleKernel
         SyncBatchTask::class,
         SyncWMSOrderTask::class,
         SyncWmsCommoditiesInformation::class,
+        ClearCancelledOrderTask::class
     ];
 
     /**
@@ -56,6 +58,7 @@ class Kernel extends ConsoleKernel
         $schedule->command('createOwnerAreaReport')->monthlyOn(25);
         $schedule->command('sync:batch')->everyMinute();
         $schedule->command('sync:order')->everyMinute();
+//        $schedule->command('clear:cancelledOrder')->everyTenMinutes();
     }
 
     /**

+ 8 - 0
app/Http/Controllers/TestController.php

@@ -57,6 +57,7 @@ use App\Services\LogisticService;
 use App\Services\LogService;
 use App\Services\OracleDocAsnHerderService;
 use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OracleDocWaveDetailService;
 use App\Services\OrderCommodityService;
 use App\Services\OrderPackageService;
 use App\Services\OrderService;
@@ -1381,4 +1382,11 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
             }
         }
     }
+
+    public function testCancelOrder()
+    {
+        $service = new OracleDocWaveDetailService();
+        $service->clearCancelledOrderTask();
+    }
+
 }

+ 8 - 2
app/OracleDOCOrderHeader.php

@@ -2,6 +2,7 @@
 
 namespace App;
 
+use App\Traits\HasCompositePrimaryKey;
 use App\Traits\ModelTimeFormat;
 use Illuminate\Database\Eloquent\Model;
 
@@ -11,18 +12,23 @@ class OracleDOCOrderHeader extends Model
 {
     use LogModelChanging;
 
-
     use ModelTimeFormat;
     protected $connection="oracle";
     protected $table="DOC_Order_Header";
     protected $primaryKey="ORDERNO";
     public $timestamps=false;
+    function getIncrementing()
+    {
+        return false;
+    }
+
+
     protected $appends=[
         'oracleBASCustomer_descr_c',
         'oracleBASCode_codename_c'
     ];
     protected $fillable=[
-        'NOTES','ReleaseStatus','SoStatus',
+        'NOTES','ReleaseStatus','SoStatus','WaveNo'
     ];
 
     /*

+ 6 - 1
app/OracleDOCWaveDetails.php

@@ -12,7 +12,12 @@ class OracleDOCWaveDetails extends Model
 
     protected $connection='oracle';
     protected $table='DOC_WAVE_DETAILS';
-
+    public $timestamps=false;
+    protected $primaryKey = 'OrdderNo';
+    function getIncrementing()
+    {
+        return false;
+    }
 
     static public function unpackedOrders($batchNumber){
         return OracleDOCWaveDetails::where('doc_wave_details.waveno', $batchNumber)->leftJoin('doc_order_header','doc_order_header.orderno','doc_wave_details.orderno')->where(function ($query){

+ 2 - 0
app/Providers/AppServiceProvider.php

@@ -22,6 +22,7 @@ use App\Services\OracleBasCustomerService;
 use App\Services\OracleBasSkuService;
 use App\Services\OracleDocAsnDetailService;
 use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OracleDocWaveDetailService;
 use App\Services\OrderCommodityService;
 use App\Services\OrderCommodityAssignService;
 use App\Services\OrderIssuePerformanceService;
@@ -147,6 +148,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('OracleBasSkuService',OracleBasSkuService::class);
         app()->singleton('OracleDocAsnDetailService',OracleDocAsnDetailService::class);
         app()->singleton('OracleDocOrderHeaderService',OracleDOCOrderHeaderService::class);
+        app()->singleton('OracleDocWaveDetailService',OracleDocWaveDetailService::class);
         app()->singleton('OrderIssueProcessLogService',OrderIssueProcessLogService::class);
         app()->singleton('OrderCommodityService',OrderCommodityService::class);
         app()->singleton('OrderCommodityAssignService',OrderCommodityAssignService::class);

+ 107 - 0
app/Services/OracleDocWaveDetailService.php

@@ -0,0 +1,107 @@
+<?php
+
+namespace App\Services;
+
+use App\OracleDOCOrderHeader;
+use App\OracleDOCWaveDetails;
+use App\ValueStore;
+use Carbon\Carbon;
+use Illuminate\Support\Facades\Cache;
+
+class OracleDocWaveDetailService
+{
+    public function clearCancelledOrder($orderHeaders)
+    {
+        if (!$orderHeaders) return;
+        $clearOrderNos = data_get($orderHeaders, '*.orderno');
+        OracleDOCWaveDetails::query()->whereIn('OrderNo', $clearOrderNos)->delete();
+        app('LogService')->log(__CLASS__, __METHOD__, 'Delete OracleDOCWaveDetails' . '  ' . json_encode($clearOrderNos) );
+    }
+
+    private function getSyncAt()
+    {
+        return Cache::remember('clear_cancel_order_sync_at', config('sync.clear_wave_order.cache_prefix.sync_at'), function () {
+            $valueStore = ValueStore::query()->where('name', 'last_cancel_order_sync_at')->first();
+            if(!$valueStore) $valueStore = ValueStore::query()->create(['name'=>'last_cancel_order_sync_at']);
+            if (!$valueStore->value) return (string)Carbon::now()->subMinutes(7);
+            return $valueStore->value;
+        });
+    }
+
+    private function getLastSyncStartAt()
+    {
+        return Cache::remember('clear_cancel_order_start_at', config('sync.clear_wave_order.cache_prefix.last_start_at'), function () {
+            $valueStore = ValueStore::query()->where('name', 'last_cancel_order_start_at')->first();
+            if(!$valueStore) $valueStore = ValueStore::query()->create(['name'=>'last_cancel_order_start_at']);
+            if ($valueStore->value) return (string)Carbon::now();
+            return null;
+        });
+    }
+
+    private function getLastSyncEndAt()
+    {
+        return Cache::remember('clear_cancel_order_start_at', config('sync.clear_wave_order.cache_prefix.last_end_at'), function () {
+            $valueStore = ValueStore::query()->where('name', 'last_cancel_order_end_at')->first();
+            if(!$valueStore) $valueStore = ValueStore::query()->create(['name'=>'last_cancel_order_end_at']);
+            if ($valueStore->value) return (string)Carbon::now();
+            return null;
+        });
+    }
+
+    private function setSyncAt($time)
+    {
+        Cache::put(config('clear_cancel_order_sync_at'), $time);
+        ValueStore::query()->where('name', 'last_cancel_order_sync_at')->update(['value'=>$time]);
+    }
+
+    private function setSyncStartAt($time)
+    {
+        Cache::put(config('clear_cancel_order_start_at'), $time);
+        ValueStore::query()->where('name', 'last_cancel_order_start_at')->update(['value'=>$time]);
+    }
+
+    private function setSyncEndAt($time)
+    {
+        Cache::put(config('clear_cancel_order_start_at'), $time);
+        ValueStore::query()->where('name', 'last_cancel_order_end_at')->update(['value'=>$time]);
+    }
+
+    public function clearCancelledOrderTask()
+    {
+        $enabled = config('sync.clear_wave_order.enabled');
+        if ($enabled == false) return;
+        $sync_at = $this->getSyncAt();
+        $last_start_at = $this->getLastSyncStartAt();
+        $last_end_at = $this->getLastSyncEndAt();
+        $restart = config('clear_wave_order.cache_prefix.restart');
+        $start_time = Carbon::now();
+
+        if (isset($last_start_at) && empty($last_end_at) && $start_time->diffInMinutes(Carbon::parse($last_start_at)) < $this->restart) return;
+        if (isset($last_start_at) && isset($last_end_at)
+            && Carbon::parse($last_end_at)->lt(Carbon::parse($last_start_at))
+            && $start_time->diffInMinutes(Carbon::parse($last_start_at)) < $restart)
+            return;
+
+        $orderHeaders = OracleDOCOrderHeader::query()
+            ->selectRaw('orderno,waveno')
+            ->where('editTime', '>=', Carbon::parse($sync_at)->subSeconds(1))
+            ->where('ERPCANCELFLAG', 'Y')
+            ->orderByDesc('editTime')->get();
+        $orderHeaderList = $orderHeaders->chunk(3000);
+        foreach ($orderHeaderList as $items) {
+            $this->clearCancelledOrder($items);
+            if ($orderHeaders->count() > 0) {
+                OracleDOCOrderHeader::query()->whereIn('orderNo', data_get($items, '*.orderno'))->update(['waveno' => '*']);
+                $json = json_encode($items->map(function ($orderHeader) {
+                    return ['orderno' => $orderHeader->orderno, 'waveno' => $orderHeader->waveno];
+                }));
+                app('LogService')->log(__CLASS__, __METHOD__, 'update OrderHeader' . '  ' . $json);
+            }
+        }
+        $end_time = (string)Carbon::now();
+        $sync_at = $orderHeaders->last()->editTime ?? $sync_at;
+        $this->setSyncAt($sync_at);
+        $this->setSyncStartAt((string)$start_time);
+        $this->setSyncEndAt($end_time);
+    }
+}

+ 2 - 2
app/Traits/HasCompositePrimaryKey.php

@@ -20,8 +20,8 @@ trait HasCompositePrimaryKey
     /**
      * Set the keys for a save update query.
      *
-     * @param  \Illuminate\Database\Eloquent\Builder $query
-     * @return \Illuminate\Database\Eloquent\Builder
+     * @param Builder $query
+     * @return Builder
      */
     protected function setKeysForSaveQuery(Builder $query)
     {

+ 12 - 1
config/sync.php

@@ -58,5 +58,16 @@ return [
             'newest_is_running' =>  'order_newest_task_is_running',     // 同步创建任务是否在进行 true 为正在进行
             'renewal_is_running' =>  'order_renewal_task_is_running',     // 同步更新任务是否在进行 true 为正在进行
         ]
-    ]
+    ],
+    'clear_wave_order' => [
+        'enabled' => true,
+        'interval' => 10,
+        'start_at' => '',
+        'cache_prefix' => [
+            'restart' => 20,
+            'last_start_at' => 'last_clear_order_task_start_at',
+            'last_end_at' => 'last_clear_order_task_end_at',
+            'sync_at' => 'last_cancel_order_sync_at'
+        ]
+    ],
 ];

+ 16 - 0
database/factories/OracleDocWaveDetailsFactory.php

@@ -0,0 +1,16 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\Model;
+use Faker\Generator as Faker;
+
+$factory->define(\App\OracleDOCWaveDetails::class, function (Faker $faker) {
+    return [
+        'WAVENO' => $faker->name,
+        'ORDERNO' => $faker->name,
+        'LineStatus' => 0,
+        'ADDTIME' => \Illuminate\Support\Carbon::now(),
+        'EDITTIME' => \Illuminate\Support\Carbon::now(),
+    ];
+});

+ 18 - 0
database/factories/OracleDocWaveHeaderFactory.php

@@ -0,0 +1,18 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\Model;
+use Faker\Generator as Faker;
+
+$factory->define(\App\OracleDOCWaveHeader::class, function (Faker $faker) {
+    return [
+        'waveno' => \Illuminate\Support\Str::random(5),
+        'addWho' => $faker->name,
+        'editWho'  => $faker->name,
+        'WaveStatus' => 40,
+        'RELEASESTATUS'=> 'a',
+        'addTime' => \Illuminate\Support\Carbon::now(),
+        'editTime' => \Illuminate\Support\Carbon::now(),
+    ];
+});

+ 18 - 25
database/factories/OrcaleDOCOrderHeaderFactory.php

@@ -7,30 +7,23 @@ use Faker\Generator as Faker;
 
 $factory->define(OracleDOCOrderHeader::class, function (Faker $faker) {
     return [
-        'orderno' => $faker->uuid,
-        'customerid' => $faker->name,
-        'waveno' => $faker->name,
-        'ordertime' =>$faker->time(),
-        'soreference1' => $faker->uuid,
-        'consigneeid' => $faker->name,
-        'c_contact' =>$faker->title(10),
-        'consigneename' => $faker->title(11),
-        'c_address1' => $faker->address,
-        'c_city' =>$faker->city,
-        'c_province' =>$faker->city,
-        'addtime' => $faker->date(),
-        'edittime' => $faker->date(),
-        'notes' => $faker->text(15),
-        'carriername'  =>'',
-        'lastshipmenttime' => $faker->date(),
-        'edisendflag' => "Y",
-        'soreference5' => $faker->uuid,
-        'c_tel2' => $faker->phoneNumber,
-        'transportation' => $faker->phoneNumber,
-        'warehouseid' => $faker->name,
-        'sostatus' => '99',
-        'c_tel1' => $faker->phoneNumber,
-        'c_district' => $faker->city,
-        'issuepartyname'=> $faker->date(),
+        'ORDERNO' =>  \Illuminate\Support\Str::random(5).'_test',
+        'CUSTOMERID' => 'test',
+        'WAVENO' => 'test'.(string)rand(0,1000),
+        'ORDERTIME' =>\Carbon\Carbon::now()->subSeconds(10),
+        'CONSIGNEEID' => 'test',
+        'ADDTIME' =>\Carbon\Carbon::now()->subSeconds(5),
+        'EDITTIME' => \Carbon\Carbon::now()->subSeconds(1),
+        'EDISENDFLAG' => 'Y',
+        'SOSTATUS' => '99',
+        'ISSUEPARTYNAME'=> 'test_issuepartyname',
+        'RELEASESTATUS' => 'N',
+        'ARCHIVEFLAG' => 'Y',
+        'CHANNEL' =>'test_CHANNEL',
+        'ALLOWSHIP' =>  'N' , //允许发运
+        'YW_EDISENDFLAG' => 'N',
+        'NOTES' => 'xx',
     ];
 });
+
+