Просмотр исходного кода

Merge branch 'master' into yang

# Conflicts:
#	app/Console/Kernel.php
#	app/Http/Controllers/TestController.php
ANG YU 5 лет назад
Родитель
Сommit
a2ffa06b8a

+ 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();
+    }
+}

+ 1 - 1
app/Console/Commands/SyncBatchTask.php

@@ -139,7 +139,7 @@ sql;
                 $this->detailExe($details);
                 $this->disposeDetail($details[count($details)-1]->edittime);
             }else{
-                $sql = "SELECT ORDERNO,WAVENO,SEQNO FROM DOC_WAVE_DETAILS WHERE EDITTIME >= TO_DATE(?,'yyyy-mm-dd hh24:mi:ss')";
+                $sql = "SELECT ORDERNO,WAVENO,SEQNO,EDITTIME FROM DOC_WAVE_DETAILS WHERE EDITTIME >= TO_DATE(?,'yyyy-mm-dd hh24:mi:ss')";
                 $details = DB::connection("oracle")->select(DB::raw($sql),[$date]);
                 $this->detailExe($details);
             }

+ 1 - 1
app/Console/Commands/SyncWmsCommoditiesInformation.php

@@ -54,7 +54,7 @@ class SyncWmsCommoditiesInformation extends Command
     {
         $this->init();
         if($this->is_enabled==false)return;
-        sleep(rand(2,3));
+        sleep(rand(5,20));
         $start_time =  Cache::remember($this->task_start_at,null,function (){
             return ValueStore::query()->firstOrCreate(['name'=>$this->task_start_at])->first()->value;
         });

+ 80 - 0
app/Console/Commands/TestMakeCommand.php

@@ -0,0 +1,80 @@
+<?php
+
+
+namespace App\Console\Commands;
+
+
+use Illuminate\Filesystem\Filesystem;
+use Symfony\Component\Console\Input\InputArgument;
+
+class TestMakeCommand extends \Illuminate\Foundation\Console\TestMakeCommand
+{
+    protected $signature = 'make:test {name : The name of the class}
+    {--unit : Create a unit test}
+    {--controller : Create a controller test}
+    {--controllers : Create a controllers test}
+    {--service : Create a service test}
+    {--services : Create a services test}
+    ';
+    protected function getDefaultNamespace($rootNamespace)
+    {
+        if ($this->option('controller')
+            ||$this->option('controllers')) {
+            return $rootNamespace.'\Controllers';
+        }
+        if ($this->option('services')
+            ||$this->option('service')) {
+            return $rootNamespace.'\Services\\'
+                .ucfirst($this->getServiceName())
+                ;
+        }
+        if ($this->option('unit')) {
+            return $rootNamespace.'\Unit';
+        } else {
+            return $rootNamespace.'\Feature';
+        }
+    }
+
+    protected function getNameInput()
+    {
+        $input= trim($this->argument('name'));
+        $inputs = explode(':', $input);
+        return $inputs[1]
+            ?$this->getMethodName()
+            :$inputs[0]
+            ;
+    }
+    protected function getServiceName()
+    {
+        $input= trim($this->argument('name'));
+        return ucfirst(explode(':',$input)[0]);
+    }
+    protected function getMethodName()
+    {
+        $input= trim($this->argument('name'));
+        return '\Test'.ucfirst(explode(':',$input)[1]);
+    }
+
+    protected function getStub()
+    {
+        if ($this->option('controller')
+            ||$this->option('controllers')) {
+            return __DIR__.('/stubs/test.controller.stub');
+        }
+        if ($this->option('services')
+            ||$this->option('service')) {
+            return __DIR__.('/stubs/test.service.stub');
+        }
+        return $this->option('unit')
+            ? $this->resolveStubPath('/stubs/test.unit.stub')
+            : $this->resolveStubPath('/stubs/test.stub');
+    }
+    protected function replaceClass($stub, $name)
+    {
+        $class = str_replace($this->getNamespace($name).'\\', '', $this->getMethodName());
+        $class = str_replace('\\', '', $class);
+        $stub = str_replace(['{{ serviceName }}', '{{serviceName}}'], $this->getServiceName(), $stub);
+
+        return str_replace(['DummyClass', '{{ class }}', '{{class}}'], $class, $stub);
+    }
+}

+ 1 - 0
app/Console/Commands/WASSyncWMSOrderInformation.php

@@ -42,6 +42,7 @@ class WASSyncWMSOrderInformation extends Command
      */
     public function handle()
     {
+        sleep(rand(15,30));
         $this->WasSyncWmsOrder();
     }
 

+ 1 - 1
app/Console/Commands/WasSyncWmsAsnInformation.php

@@ -54,7 +54,7 @@ class WasSyncWmsAsnInformation extends Command
     {
         $this->init();
         if($this->is_enabled==false)return;
-        sleep(rand(2,3));
+        sleep(rand(10,25));
         $start_time =  Cache::remember($this->task_start_at,null,function (){
             return ValueStore::query()->firstOrCreate(['name'=>$this->task_start_at])->first()->value;
         });

+ 15 - 0
app/Console/Commands/stubs/test.controller.stub

@@ -0,0 +1,15 @@
+<?php
+
+namespace {{ namespace }};
+
+use PHPUnit\Framework\TestCase;
+
+class {{ class }} extends TestCase
+{
+
+    public function testExample()
+    {
+    {{ class }};
+        $this->assertTrue(true);
+    }
+}

+ 28 - 0
app/Console/Commands/stubs/test.service.stub

@@ -0,0 +1,28 @@
+<?php
+
+namespace {{ namespace }};
+use App\Services\{{ serviceName }};
+
+use PHPUnit\Framework\TestCase;
+
+class {{ class }} extends TestCase
+{
+
+    /** @var {{ serviceName }} $service */
+    public $service;
+    function setUp(): void
+    {
+        parent::setUp();
+        $this->service = app('{{ serviceName }}');
+    }
+
+    public function testReturned()
+    {
+        $this->assertTrue(true);
+    }
+
+    function tearDown(): void
+    {
+        parent::tearDown();
+    }
+}

+ 4 - 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;
@@ -38,6 +39,7 @@ class Kernel extends ConsoleKernel
         SyncWMSOrderTask::class,
 //        SyncOrderPackageLogisticRouteTask::class,
         SyncWmsCommoditiesInformation::class,
+        ClearCancelledOrderTask::class
     ];
 
     /**
@@ -59,6 +61,8 @@ class Kernel extends ConsoleKernel
         $schedule->command('sync:batch')->everyMinute();
         $schedule->command('sync:order')->everyMinute();
 //        $schedule->command('syncOrderPackageLogisticRouteTask')->dailyAt('00:00')();//同步快递信息到orderPackage
+        $schedule->command('SyncWmsCommoditiesInformation')->everyMinute();
+        $schedule->command('clear:cancelledOrder')->everyTenMinutes();
     }
 
     /**

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

@@ -58,6 +58,7 @@ use App\Services\LogisticZopService;
 use App\Services\LogService;
 use App\Services\OracleDocAsnHerderService;
 use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OracleDocWaveDetailService;
 use App\Services\OrderCommodityService;
 use App\Services\OrderPackageReceivedSyncService;
 use App\Services\OrderPackageService;
@@ -1454,4 +1455,11 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
        $result = $service->get([]);
        dd($result);
     }
+
+    public function testCancelOrder()
+    {
+        $service = new OracleDocWaveDetailService();
+        $service->clearCancelledOrderTask();
+    }
+
 }

+ 0 - 2
app/OracleDOCASNHeader.php

@@ -32,6 +32,4 @@ class OracleDOCASNHeader extends Model
         return $this->hasMany(OracleDOCASNDetail::class,'asnno','asnno')
             ->select('asnno','asnlineno','customerid','sku','skudescrc','linestatus','lotatt08','lotatt05','receivedqty','expectedqty','addtime','edittime');
     }
-
-
 }

+ 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);

+ 8 - 0
app/RejectedBill.php

@@ -195,4 +195,12 @@ class RejectedBill extends Model
         if($orderIssue ?? false)
             $orderIssue->同步退单状态();
     }
+
+    public function delete()
+    {
+        $orderIssue = $this->orderIssue;
+        if($orderIssue)$orderIssue->update(['is_new_rejecting'=>'无','logistic_number_return'=>null]);
+        return parent::delete(); // TODO: Change the autogenerated stub
+    }
+
 }

+ 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',
     ];
 });
+
+

+ 32 - 0
database/migrations/2020_12_30_142332_change_column_index_add_method_of_logs.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeColumnNameMethodTypeOfLogs extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('logs', function (Blueprint $table) {
+            $table->index(['created_at','method']);
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('logs', function (Blueprint $table) {
+            $table->dropIndex(['created_at','method']);
+        });
+    }
+}