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

Merge branch 'yang-logistic-fix' of ssh://was.baoshi56.com:10022/var/git/bswas

LD пре 5 година
родитељ
комит
2745b26567

+ 2 - 3
app/Filters/OrderPackageFilters.php

@@ -4,6 +4,7 @@
 namespace App\Filters;
 
 use App\Order;
+use App\Services\UserService;
 use Illuminate\Http\Request;
 use phpDocumentor\Reflection\Types\Boolean;
 
@@ -72,9 +73,7 @@ class OrderPackageFilters
     private function owner_id($owner_id)
     {
         $owner_ids = array_filter(preg_split('/[,, ]+/is', $owner_id));
-        $this->queryBuilder->whereIn('order_id',function($query)use($owner_ids){
-            $query->from('orders')->select('id')->whereIn('owner_id',$owner_ids);
-        });
+        $this->queryBuilder->whereIn('owner_id', $owner_ids);
     }
 
     private function sent_at_start($sent_at_start)

+ 1 - 0
app/Http/Controllers/LogisticController.php

@@ -3,6 +3,7 @@
 namespace App\Http\Controllers;
 
 use App\Logistic;
+use App\Services\UserService;
 use Exception;
 use Illuminate\Http\Request;
 use Illuminate\Http\Response;

+ 7 - 5
app/Http/Controllers/PackageLogisticController.php

@@ -6,13 +6,11 @@ use App\Filters\OrderPackageFilters;
 use App\Logistic;
 use App\OrderPackage;
 use App\Owner;
+use App\Services\UserService;
 use Illuminate\Http\Request;
 
 class PackageLogisticController extends Controller
 {
-    //
-
-
     /**
      * PackageLogisticsController constructor.
      */
@@ -23,12 +21,16 @@ class PackageLogisticController extends Controller
 
     public function index(Request $request,OrderPackageFilters $filters)
     {
+        /** @var UserService $userService */
+        $userService = app('UserService');
+        $owner_ids = $userService->getPermittingOwnerIds(auth()->user());
         $paginateParams = $request->input();
-        $orderPackages = OrderPackage::query()->filter($filters)->with(['order' => function ($query) {
+        $orderPackages = OrderPackage::query()->filter($filters)
+            ->whereIn('owner_id',$owner_ids)->with(['order' => function ($query) {
             $query->with(['logistic', 'owner', 'packages.commodities']);
         }])->orderByDesc('id')->paginate($request->paginate ?? 50);
         $logistics = Logistic::all();
-        $owners = Owner::all();
+        $owners = Owner::find($owner_ids);
         return view('package.logistic.index', compact('orderPackages', 'logistics', 'owners','paginateParams'));
     }
 }

+ 11 - 1
app/OrderPackage.php

@@ -9,6 +9,7 @@ use App\Services\OrderService;
 use App\Traits\ModelTimeFormat;
 use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
 use Illuminate\Support\Arr;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\DB;
@@ -22,12 +23,16 @@ class OrderPackage extends Model
     use ModelTimeFormat;
 
     protected $fillable = ['order_id','logistic_number','batch_number',
-        'batch_rule','bulk','weight','length','width','height','paper_box_id','measuring_machine_id','weighed_at','status','sent_at','received_at','exception','transfer_status','remark'];
+        'batch_rule','bulk','weight','length','width','height','paper_box_id','measuring_machine_id','weighed_at','status','sent_at','received_at','exception','transfer_status','remark','owner_id'];
 
     public function order(){
         return $this->belongsTo('App\Order','order_id','id');
     }
 
+    protected $casts = [
+        'transfer_status' => 'array',
+    ];
+
     public function commodities(){
         return $this->hasMany('App\OrderPackageCommodities','order_package_id','id');
     }
@@ -277,4 +282,9 @@ class OrderPackage extends Model
     {
         return $filters->apply($query);
     }
+
+    public function owner(): BelongsTo
+    {
+        return $this->belongsTo(Owner::class);
+    }
 }

+ 1 - 1
app/Services/OrderPackageReceivedSyncService.php

@@ -84,7 +84,7 @@ class OrderPackageReceivedSyncService
             if (isset($data['status'])) $orderPackage->status = $data['status'];
             if (isset($data['received_at'])) $orderPackage->received_at = $data['received_at'];
             if (isset($data['exception'])) $orderPackage->exception = $data['exception'];
-            if (isset($data['transfer_status'])) $orderPackage->transfer_status = $data['transfer_status'];
+            if (isset($data['transfer_status'])) $orderPackage->transfer_status = json_encode($data['transfer_status'],JSON_UNESCAPED_UNICODE);
             $orderPackage->save();
         }
     }

+ 50 - 1
app/Services/OrderPackageService.php

@@ -118,6 +118,7 @@ class OrderPackageService
         $orders = $orderService->getByWmsOrders($orderHeaders);
         $packages = $this->getByOrderNos(data_get($orderHeaders,'*.orderno'));          // 已有
         $this->createOrderPackage($orderHeaders,$orders,$packages);                     // 创建package
+        $this->updatePackage($orderHeaders,$packages);
         $this->deleteUnnecessaryPackage($orderHeaders,$packages);     // 删除package
         unset($orders,$packages);       // 手动清除
     }
@@ -161,15 +162,26 @@ class OrderPackageService
         $logistic_numbers = array_diff(array_unique(data_get($orderHeader->actAllocationDetails,'*.picktotraceid')),['','*']);
         $inner_params = [];
         $date = Carbon::now()->format('Y-m-d H:i:s');
+        $sentAtMap = [];
+        foreach ($orderHeader->actAllocationDetails as $item){
+            $sentAtMap[$item->picktotraceid] = $item;
+        }
         foreach ($logistic_numbers as $logistic_number){
             $package = $dataHandlerService->getKeyValue(['logistic_number'=>$logistic_number],$packages_maps);
             if(isset($package))continue;
+            try {
+                $data = $sentAtMap[$logistic_number];
+            } catch (\Exception $e) {
+                $data = null;
+            }
             $inner_params[] = [
                 'order_id' => $order->id,
                 'logistic_number' => $logistic_number,
                 'created_at' => $date,
                 'updated_at' => $date,
-                'status' =>'无'
+                'status' => '无',
+                'owner_id' => $order->owner_id,
+                'sent_at' => $data ? $data->checktime:null,
             ];
         }
         return $inner_params;
@@ -206,4 +218,41 @@ class OrderPackageService
         }
     }
 
+    private function updatePackage($orderHeaders, $packages)
+    {
+        $map = $this->getSentAtMap($orderHeaders);
+        $update_params = [];
+        $update_params[] = ['id','sent_at'];
+        foreach ($packages as $package) {
+            if ($package->sent_at) continue;
+            try {
+                $data = $map[$package->logistic_number];
+            } catch (\Exception $e) {
+                continue;
+            }
+            $update_params[] = [
+                'id'=>$package->id,
+                'sent_at' => $data->checktime,
+            ];
+        }
+        $this->batchUpdate($update_params);
+    }
+
+    /**
+     * @param $orderHeaders
+     * @return array
+     */
+    private function getSentAtMap($orderHeaders): array
+    {
+        $map = [];
+        foreach ($orderHeaders as $orderHeader) {
+            $actAllocationDetails = $orderHeader->actAllocationDetails;
+            foreach ($actAllocationDetails as $actAllocationDetail) {
+                $logistic_number = $actAllocationDetail->picktotraceid;
+                $map[$logistic_number] = $actAllocationDetail;
+            }
+        }
+        return $map;
+    }
+
 }

+ 6 - 10
app/Services/PackageService.php

@@ -16,17 +16,13 @@ Class PackageService
 {
     use ServiceAppAop;
     private function conditionQuery($params){
-        $packages = OrderPackage::query()->with(['order','paperBox','measuringMachine'])
-        ->whereHas("order",function ($query){
-            /** @var Builder $query */
-            $ownerIds=app('UserService')->getPermittingOwnerIds(Auth::user());
-            $query->with('owner','logistic')->whereIn("owner_id",$ownerIds ?? []);
-        })->orderBy(TABLE.'id','DESC');
+        $ownerIds=app('UserService')->getPermittingOwnerIds(Auth::user());
+        $packages = OrderPackage::query()->with(['order'=>function($query){
+            return  $query->with(['owner','logistic']);
+        },'paperBox','measuringMachine'])
+        ->whereIn('owner_id',$ownerIds)->orderBy(TABLE.'id','DESC');
         if ($params['owner_id'] ?? false){
-            $owner_id = explode(',',$params['owner_id']);
-            $packages->whereHas('order',function ($query)use($owner_id){
-                $query->whereIn('owner_id',$owner_id);
-            });
+            $packages->whereIn('owner_id', explode(',',$params['owner_id']));
             unset($params['owner_id']);
         }
         if ($params['logistic_number'] ?? false){

+ 2 - 1
database/factories/OracleActAllocationDetailsFactory.php

@@ -13,6 +13,7 @@ $factory->define(OracleActAllocationDetails::class, function (Faker $faker) {
         'qtyordered' => $faker->numberBetween(1,50),
         'qty_each' => $faker->numberBetween(1,50),
         'location' => $faker->md5,
-        'picktotraceid'  => $faker->uuid
+        'picktotraceid' => $faker->uuid,
+        'checktime' => now(),
     ];
 });

+ 16 - 16
database/factories/OrcaleDOCOrderHeaderFactory.php

@@ -7,22 +7,22 @@ use Faker\Generator as Faker;
 
 $factory->define(OracleDOCOrderHeader::class, function (Faker $faker) {
     return [
-        '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',
+        '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',
     ];
 });
 

+ 0 - 2
database/migrations/2020_12_16_114253_add_status_and_sent_and_at_and_received_at_and_execption_and_tarnsfer_status_and_remark_to_order_package.php

@@ -40,8 +40,6 @@ class AddStatusAndSentAndAtAndReceivedAtAndExecptionAndTarnsferStatusAndRemarkTo
             $table->dropColumn('exception');
             $table->dropColumn('transfer_status');
             $table->dropColumn('remark');
-            $table->dropIndex(['sent_at', 'exception']);
-            $table->dropIndex(['received_at', 'exception']);
         });
     }
 }

+ 1 - 1
database/migrations/2021_01_14_174209_create_order_issue_user_workgroup_table.php

@@ -27,6 +27,6 @@ class CreateOrderIssueUserWorkgroupTable extends Migration
      */
     public function down()
     {
-        Schema::dropIfExists('order_issue_user_work_group');
+        Schema::dropIfExists('order_issue_user_workgroup');
     }
 }

+ 61 - 0
database/migrations/2021_01_20_145822_add_owner_id_to_order_packages.php

@@ -0,0 +1,61 @@
+<?php
+
+use App\OrderPackage;
+use App\Services\OrderPackageService;
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddOwnerIdToOrderPackages extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_packages', function (Blueprint $table) {
+            //
+            $table->bigInteger('owner_id')->nullable()->index();
+
+        });
+
+        $this->changeOwnerId();
+
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('order_packages', function (Blueprint $table) {
+            //
+            $table->dropColumn('owner_id');
+        });
+    }
+
+    public function changeOwnerId()
+    {
+        /**
+         * @var OrderPackageService  $order_packages_service
+         */
+        $order_packages_service = app(OrderPackageService::class);
+        OrderPackage::query()->with('order')->chunkById(200,function($order_packages)use($order_packages_service){
+            $update_params = [];
+            $update_params[] = ['id','owner_id'];
+            foreach ($order_packages as $order_package) {
+                if($order_package->order && $order_package->order->owner_id){
+                    $update_params[] = [
+                        'id'=>$order_package->id,
+                        'owner_id'=>$order_package->order->owner_id
+                    ];
+                }
+            }
+            $order_packages_service->batchUpdate($update_params);
+        });
+    }
+}

+ 44 - 7
resources/views/package/logistic/index.blade.php

@@ -31,8 +31,20 @@
                     <td>@{{ package.weighed_at }}</td>
                     <td>@{{ package.exception }}</td>
                     <td>
-{{--                        <p v-for="log in getLogs(package.transfer_status)">@{{ log }}</p>--}}
-                        @{{ package.transfer_status | toObjected }}
+                        <div v-if="package.transfer_status && package.transfer_status.length>0" class="text-overflow-warp-200 up" :id="'route-'+i">
+                            <p v-for="route in package.transfer_status">
+                                @{{ route.accept_address+" "+ route.remark+" "+route.accept_time}}
+                            </p>
+                        </div>
+                        <div class="text-overflow-warp-200 " v-if=" package.transfer_status && !showList[i] && package.transfer_status.length > 0">
+                            @{{ package.transfer_status[0].accept_address+" "+ package.transfer_status[0].remark+" "+package.transfer_status[0].accept_time}}
+                        </div>
+                        <div @click="showRoute(i)" v-if="package.transfer_status && package.transfer_status.length > 1">
+                            <label class="text-center mt-0 p-0 cursor-pointer pull-left">
+                                <span class="fa" :class="package.isShowRoute ? 'fa-angle-double-down' : 'fa-angle-double-right'"></span>
+                                &nbsp;<span v-if="package.transfer_status && showList[i]">收起</span><span v-else>展开</span>&nbsp;@{{ package.transfer_status.length }} 条
+                            </label>
+                        </div>
                     </td>
                     <td>@{{ package.remark }}</td>
                 </tr>
@@ -51,7 +63,11 @@
         let vue = new Vue({
             el: "#list",
             data: {
-                packages: {!!  $orderPackages->toJson() !!}['data'],
+                packages: [
+                    @foreach($orderPackages as $package)
+                    {!! $package !!},
+                    @endforeach
+                ],
                 logistics: [
                         @foreach($logistics as $logistic)
                     {
@@ -66,10 +82,24 @@
                     },
                     @endforeach
                 ],
+                showList:{},
+            },
+            created(){
+                $.each(this.packages,function (index,item){
+                    if (item.transfer_status!=null&&item.transfer_status.length>1) {
+                        item.transfer_status.sort(function (item1, item2) {
+                            let date1 = new Date(item1.accept_time);
+                            let date2 = new Date(item2.accept_time);
+                            if (date1 - date2 > 0) return -1;
+                            if (date1 - date2 < 0) return 1;
+                            return 0;
+                        });
+                    }
+                });
             },
-
             mounted() {
                 let _this = this;
+                $(".up").slideUp();
                 let data = [
                     [
                         /*"","","","","","","","","","",""*/
@@ -136,9 +166,16 @@
                 _this.form.init();
             },
             methods:{
-                getLogs(value){
-                    return JSON.parse(value);
-                }
+                showRoute(id){
+                    if (this.showList[id]){
+                        this.$set(this.showList,id,false);
+                        $("#route-"+id).slideUp();
+                    }else{
+                        this.$set(this.showList,id,true);
+                        $("#route-"+id).slideDown();
+                    }
+                    this.$forceUpdate();
+                },
             },
             filters:{
                 toObjected:function(value){

+ 27 - 4
tests/Services/OrderPackageService/SyncOrderPackageTest.php

@@ -39,11 +39,11 @@ class SyncOrderPackageTest extends TestCase
         $this->orderHeaderService = app('OracleDocOrderHeaderService');
 
         $orderHeader = factory(OracleDOCOrderHeader::class)->make(['userdefine1' =>'TEST_OW' ]);
-        $order = factory(Order::class)->create(['code'=>$orderHeader['orderno'],]);
+        $order = factory(Order::class)->create(['code'=>$orderHeader['orderno'],'owner_id'=>1]);
         $basSku = factory(OracleBasSKU::class)->make(['customerid' => 'TEST_OW']);
-        $OracleActAllocationDetail1 = factory(OracleActAllocationDetails::class)->make(['orderno'=>$orderHeader->orderno,'customerid'=>'TEST_OW','sku'=>$basSku->sku]);
-        $OracleActAllocationDetail2 = factory(OracleActAllocationDetails::class)->make(['orderno'=>$orderHeader->orderno,'customerid'=>'TEST_OW','sku'=>$basSku->sku]);
-        $OracleActAllocationDetail3 = factory(OracleActAllocationDetails::class)->make(['orderno'=>$orderHeader->orderno,'customerid'=>'TEST_OW','sku'=>$basSku->sku]);
+        $OracleActAllocationDetail1 = factory(OracleActAllocationDetails::class)->make(['orderno'=>$orderHeader->orderno,'customerid'=>'TEST_OW','sku'=>$basSku->sku,'checktime'=>now()]);
+        $OracleActAllocationDetail2 = factory(OracleActAllocationDetails::class)->make(['orderno'=>$orderHeader->orderno,'customerid'=>'TEST_OW','sku'=>$basSku->sku,'checktime'=>now()]);
+        $OracleActAllocationDetail3 = factory(OracleActAllocationDetails::class)->make(['orderno'=>$orderHeader->orderno,'customerid'=>'TEST_OW','sku'=>$basSku->sku,'checktime'=>now()]);
         $OracleActAllocationDetails = collect([$OracleActAllocationDetail1,$OracleActAllocationDetail2,$OracleActAllocationDetail3]);
         $orderHeader->setRelation('actAllocationDetails',$OracleActAllocationDetails);
 
@@ -82,6 +82,29 @@ class SyncOrderPackageTest extends TestCase
         $this->service->syncOrderPackage($orderHeaders);
         $orderPackages = OrderPackage::query()->where('order_id',$this->data['order']['id'])->get();
         $this->assertEquals($orderPackages->count(),count($this->data['orderHeader']->actAllocationDetails));
+        foreach($orderPackages as $orderPackage) {
+            $this->assertEquals($orderPackage->owner_id,$this->data['order']['owner_id']);
+        }
+
+    }
+
+    /**
+     * @test
+     */
+    public function orderPackageSentAtUpdate() {
+        $actAllocationDetails = $this->data['orderHeader']->actAllocationDetails;
+        foreach ($actAllocationDetails as $actAllocationDetail) {
+            $actAllocationDetail->checktime = null;
+        }
+        $orderHeaders = collect([$this->data['orderHeader']]);
+        $this->service->syncOrderPackage($orderHeaders);
+        $actAllocationDetails = $this->data['orderHeader']->actAllocationDetails;
+        foreach ($actAllocationDetails as $actAllocationDetail) {
+            $actAllocationDetail->checktime = '2020-11-01';
+        }
+        $this->service->syncOrderPackage($orderHeaders);
+        $orderPackages = OrderPackage::query()->where('order_id',$this->data['order']['id'])->get();
+        $this->assertEquals('2020-11-01 00:00:00', $orderPackages->first()->sent_at);
     }
 
     /**