Browse Source

临时提交

loustwo 4 years ago
parent
commit
16ccd42376
33 changed files with 864 additions and 589 deletions
  1. 5 4
      app/Http/Controllers/OrderController.php
  2. 38 0
      app/Http/Controllers/OrderDetailController.php
  3. 2 2
      app/Http/Controllers/OrderIssueController.php
  4. 7 7
      app/Http/Controllers/OrderIssueRejectedBillController.php
  5. 10 7
      app/Http/Controllers/RejectedBillController.php
  6. 11 6
      app/Http/Controllers/RejectedBillItemController.php
  7. 19 32
      app/Http/Controllers/TestController.php
  8. 2 2
      app/Imports/OrderIssueImport.php
  9. 6 5
      app/Imports/RejectedImport.php
  10. 11 7
      app/Jobs/SyncOrderRejectingStatusJob.php
  11. 43 0
      app/Jobs/SyncRejectedBillRejectingStatusJob.php
  12. 6 0
      app/Order.php
  13. 23 0
      app/OrderDetail.php
  14. 135 130
      app/OrderIssue.php
  15. 11 5
      app/OrderIssueRejectedBill.php
  16. 6 2
      app/Providers/AppServiceProvider.php
  17. 54 52
      app/RejectedBill.php
  18. 1 1
      app/Services/OracleDOCOrderHeaderService.php
  19. 13 0
      app/Services/OrderDetailService.php
  20. 31 70
      app/Services/OrderIssueRejectedBillService.php
  21. 15 15
      app/Services/OrderIssueService.php
  22. 136 0
      app/Services/OrderRejectedBillRelationService.php
  23. 109 0
      app/Services/OrderRejectingStatusService.php
  24. 18 18
      app/Services/RejectedBillService.php
  25. 0 191
      app/Services/RejectedBillSyncOrderService.php
  26. 17 17
      app/Services/RejectedService.php
  27. 6 1
      app/WorkOrder.php
  28. 12 0
      database/factories/OrderDetailFactory.php
  29. 44 0
      database/migrations/2022_01_17_133350_create_order_details_table.php
  30. 16 0
      database/seeds/OrderDetailSeeder.php
  31. 50 14
      resources/views/order/issue/index.blade.php
  32. 2 1
      resources/views/order/workOrder/index.blade.php
  33. 5 0
      routes/apiLocal.php

+ 5 - 4
app/Http/Controllers/OrderController.php

@@ -4,9 +4,9 @@ namespace App\Http\Controllers;
 
 use App\Components\Database;
 use App\Http\Requests\OrderDelivering;
+use App\Jobs\SyncOrderRejectingStatusJob;
 use App\OracleDOCOrderHeader;
 use App\OracleDOCWaveDetails;
-use App\OrderIssue;
 use App\Services\LogisticService;
 use App\Services\LogService;
 use App\Services\OrderIssueTypeService;
@@ -173,9 +173,10 @@ sql;
         }
         $rejectedBillItemService->insert($rejectedBillItems);
         LogService::log(__METHOD__, "批量生成退货单详情", json_encode($rejectedBillItems), Auth::user()['id']);
-        $rejectedBill_collect->each(function ($rejectedBill) use ($rejectedBillService) {
-            $rejectedBillService->joinOrderIssue($rejectedBill);
-            $rejectedBillService->syncOrderIssue($rejectedBill);
+        $rejectedBill_collect->each(function ($rejectedBill) {
+            SyncOrderRejectingStatusJob::dispatch($rejectedBill);
+//            $rejectedBillService->joinOrderIssue($rejectedBill);
+//            $rejectedBillService->syncOrderIssue($rejectedBill);
         });
         return ['success' => true];
     }

+ 38 - 0
app/Http/Controllers/OrderDetailController.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\OrderDetail;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+
+class OrderDetailController extends Controller
+{
+    public function updateApi(Request $request): array
+    {
+        if (!Auth::check()){
+            return ['success' => false,'message' => '没有对应权限'];
+        }
+        if (!$request->has(['order_id','rejecting_status'])){
+            return ['success' => false,'message' => '参数异常'];
+        }
+        $order_detail = OrderDetail::query()->where('order_id',$request->input('order_id'))->first();
+        $order_detail->update(['rejecting_status' => $request->input('rejecting_status')]);
+        return ['success' => true,'data' => $order_detail];
+    }
+
+    public function disposeApi(Request $request): array
+    {
+        if (!Auth::check()){
+            return ['success' => false,'message' => '没有对应权限'];
+        }
+        if (!$request->has(['order_id'])){
+            return ['success' => false,'message' => '参数异常'];
+        }
+
+        $order_detail = OrderDetail::query()->where('order_id',$request->input('order_id'))->first();
+
+        $order_detail->update(['is_new_rejecting' => '已处理']);
+        return ['success' => success,'data' => $order_detail];
+    }
+}

+ 2 - 2
app/Http/Controllers/OrderIssueController.php

@@ -21,7 +21,7 @@ use App\Services\OrderIssueService;
 use App\Services\OrderIssueTypeService;
 use App\Services\OrderService;
 use App\Services\OwnerService;
-use App\Services\RejectedBillSyncOrderService;
+use App\Services\OrderRejectingStatusService;
 use App\Shop;
 use App\UserOwnerGroup;
 use App\UserWorkgroup;
@@ -50,7 +50,7 @@ class OrderIssueController extends Controller
                                 OrderIssueProcessLogService $orderIssueProcessLogService,
                                 OrderService $orderService,
                                 OrderIssueTypeService $orderIssueTypeService,
-                                RejectedBillSyncOrderService $rejectedBillSyncOrderService,
+                                OrderRejectingStatusService $rejectedBillSyncOrderService,
                                 LogService $logService)
     {
         $this->service = $service;

+ 7 - 7
app/Http/Controllers/OrderIssueRejectedBillController.php

@@ -3,8 +3,9 @@
 namespace App\Http\Controllers;
 
 use App\OrderIssue;
+use App\OrderIssueRejectedBill;
 use App\Services\OrderIssueRejectedBillService;
-use App\Services\RejectedBillSyncOrderService;
+use App\Services\OrderRejectingStatusService;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Gate;
 
@@ -15,13 +16,13 @@ class OrderIssueRejectedBillController extends Controller
     private $rejectedBillSyncOrderService;
 
     public function __construct(OrderIssueRejectedBillService $service,
-                                RejectedBillSyncOrderService $rejectedBillSyncOrderService)
+                                OrderRejectingStatusService $rejectedBillSyncOrderService)
     {
         $this->service = $service;
         $this->rejectedBillSyncOrderService = $rejectedBillSyncOrderService;
     }
 
-    public function joinRejectedBillApi(Request $request)
+    public function joinRejectedBillApi(Request $request): array
     {
         if (!Gate::allows('订单管理-问题件-编辑')) return ['success' => false, 'error' => '没有对应权限'];
         if (!$request->has('logistic_number_return')) return ['success' => false, 'error' => '参数为空'];
@@ -34,11 +35,10 @@ class OrderIssueRejectedBillController extends Controller
         return ['success' => true, 'data' => ['orderIssueRejectedBill' => $result, 'orderIssue' => $orderIssue]];
     }
 
-    public function unJoinRejectedBillApi(Request $request)
+    public function unJoinRejectedBillApi(Request $request): array
     {
         if (!Gate::allows('订单管理-问题件-编辑')) return ['success' => false, 'error' => '没有对应权限'];
         if (!$request->has('logistic_number_return') || !$request->has('id')) return ['success' => false, 'error' => '参数为空'];
-        /** @var OrderIssue $orderIssue */
         $orderIssue = OrderIssue::query()->where('id', $request->id)->first();
         if (!$orderIssue) return ['success' => false, 'message' => '没有找到对应的记录'];
         $result = $this->service->unJoinRejectedBill($orderIssue, $request['logistic_number_return']);
@@ -46,7 +46,7 @@ class OrderIssueRejectedBillController extends Controller
         return ['success' => true, 'orderIssue' => $orderIssue];
     }
 
-    public function reviseJoinRejectedBillApi(Request $request)
+    public function reviseJoinRejectedBillApi(Request $request): array
     {
         if (!Gate::allows('订单管理-问题件-编辑')) return ['success' => false, 'error' => '没有对应权限'];
         if (!$request->has('logistic_number_return_update'))
@@ -54,7 +54,7 @@ class OrderIssueRejectedBillController extends Controller
         /** @var OrderIssue $orderIssue */
         $orderIssue = OrderIssue::query()->where('id', $request->id)->first();
         if (!$orderIssue) return ['success' => false, 'error' => '没有找到对应的记录'];
-        $result = $this->service->unJoinRejectedBill($orderIssue, $request['logistic_number_return'], $request['logistic_number_return_update']);
+        $result = $this->service->reviseJoinRejectedBill($orderIssue, $request['logistic_number_return'], $request['logistic_number_return_update']);
         if (is_null($result)) return ['success' => false, 'error' => '需更新的对应关系不存在!请刷新页面后重试'];
         if (!$result) return ['success' => false, 'error' => '更新关联关系时出现异常'];
         return ['success' => true, 'data' => ['orderIssueRejectedBill' => $result, 'orderIssue' => $orderIssue]];

+ 10 - 7
app/Http/Controllers/RejectedBillController.php

@@ -3,6 +3,7 @@
 namespace App\Http\Controllers;
 
 use App\Http\Controllers\api\thirdPart\flux\ReceiveController;
+use App\Jobs\SyncOrderRejectingStatusJob;
 use App\Logistic;
 use App\OracleActAllocationDetails;
 use App\OracleBasSKU;
@@ -13,7 +14,7 @@ use App\RejectedBill;
 use App\Services\LogService;
 use App\Services\RejectedBillItemService;
 use App\Services\RejectedBillService;
-use App\Services\RejectedBillSyncOrderService;
+use App\Services\OrderRejectingStatusService;
 use App\Services\WorkOrderService;
 use Illuminate\Contracts\View\Factory;
 use Illuminate\Http\RedirectResponse;
@@ -29,7 +30,7 @@ class RejectedBillController extends Controller
 {
     private $rejectedBillSyncOrderService;
 
-    function __construct(RejectedBillSyncOrderService $rejectedBillSyncOrderService)
+    function __construct(OrderRejectingStatusService $rejectedBillSyncOrderService)
     {
         $this->rejectedBillSyncOrderService = $rejectedBillSyncOrderService;
 //        app()->bind('OrderPackageCommoditiesService',OrderPackageCommoditiesService::class);
@@ -96,8 +97,9 @@ class RejectedBillController extends Controller
         /**
          * @var RejectedBillService $rejectedBillService
          */
-        $rejectedBillService=app(RejectedBillService::class);
-        $rejectedBillService->joinOrderIssue($rejectedBill);
+//        $rejectedBillService=app(RejectedBillService::class);
+//        $rejectedBillService->joinOrderIssue($rejectedBill);
+        SyncOrderRejectingStatusJob::dispatch($rejectedBill);
         $rejectedBillService->updateCheckedStatusByWms($request->input('logistic_number_return'));
         app('LogService')->log(__METHOD__,__FUNCTION__.'_'.$rejectedBill['id'],json_encode($request->toArray()),Auth::user()['id']);
         return ['success'=>'true','id'=>$rejectedBill['id']];
@@ -123,8 +125,9 @@ class RejectedBillController extends Controller
          * @var WorkOrderService $workOrderService
          */
         $rejectedBillService=app(RejectedBillService::class);
-        $rejectedBillService->joinOrderIssue($rejectedBill);
-        $rejectedBillService->syncOrderIssue($rejectedBill);
+        SyncOrderRejectingStatusJob::dispatch($rejectedBill);
+//        $rejectedBillService->joinOrderIssue($rejectedBill);
+//        $rejectedBillService->syncOrderIssue($rejectedBill);
         $rejectedBillService->updateCheckedStatusByWms($rejectedBill->logistic_number_return);
 
         app('LogService')->log(__METHOD__,__FUNCTION__.'_'.$rejectedBill['id'],json_encode($request->toArray()),Auth::user()['id']);
@@ -458,7 +461,7 @@ class RejectedBillController extends Controller
                 LogService::log(__METHOD__, "批量生成退货单详情", json_encode($inner_items_params), Auth::user()['id']);
             }
             $rejectedBill_collect->each(function ($rejectedBill){
-                $this->rejectedBillSyncOrderService->syncRejectingStatus($rejectedBill);
+                SyncOrderRejectingStatusJob::dispatch($rejectedBill);
             });
             return ['success'=>true];
         } catch (\Exception $e) {

+ 11 - 6
app/Http/Controllers/RejectedBillItemController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
 
 use App\Components\AsyncResponse;
 use App\Events\InformWMSReceivedEvent;
+use App\Jobs\SyncOrderRejectingStatusJob;
 use App\Log;
 use App\Owner;
 use App\RejectedBill;
@@ -81,8 +82,9 @@ class RejectedBillItemController extends Controller
 
         /** @var RejectedBill $rejectedBill */
         $rejectedBill = RejectedBill::query()->where('id',$request->input('id_rejected_bill'))->first();
-        $rejectedBill->updateIsNewRejecting();
-        $rejectedBill->syncOrderIssue();     // 同步问题件 修改问题件退货状态
+        SyncOrderRejectingStatusJob::dispatch($rejectedBill);
+//        $rejectedBill->updateIsNewRejecting();
+//        $rejectedBill->syncOrderIssue();     // 同步问题件 修改问题件退货状态
         app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
         return ['success'=>'true','id'=>$rejectedBillItem['id']];
     }
@@ -116,8 +118,9 @@ class RejectedBillItemController extends Controller
             //$rejectedBillItem->injectCommodityName();  Haozi 2020-12-09
             /** @var RejectedBill $rejectedBill */
             $rejectedBill = RejectedBill::query()->where('id',$rejectedBillItem->id_rejected_bill)->first();
-            $rejectedBill->updateIsNewRejecting();
-            $rejectedBill->syncOrderIssue(); // 同步问题件 修改问题件退货状态
+            SyncOrderRejectingStatusJob::dispatch($rejectedBill);
+//            $rejectedBill->updateIsNewRejecting();
+//            $rejectedBill->syncOrderIssue(); // 同步问题件 修改问题件退货状态
             app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
             return ['success'=>'true','id'=>$rejectedBillItem['id']];
         }
@@ -176,7 +179,8 @@ class RejectedBillItemController extends Controller
         }
         $item=$rejectedBillItems->first();
         $rejectedBill = RejectedBill::query()->find($item['id_rejected_bill']);
-        $rejectedBill->syncOrderIssue();    // 同步问题件 修改问题件退货状态
+        SyncOrderRejectingStatusJob::dispatch($rejectedBill);
+//        $rejectedBill->syncOrderIssue();    // 同步问题件 修改问题件退货状态
         if(config('api.jianshang_rejecteds_log_switch'))Controller::logS(__METHOD__,__FUNCTION__,'请求处理退单:'.$rejectedBill['logistic_number_return'],Auth::user()['id']);
         $downloadedSkus = WMSReflectReceive::downloadedSkus($rejectedBill['logistic_number_return'],true);
         $isGotMoreThenDownloaded=WMSReflectReceiveSku::isItemsOverDownloadedSkus($rejectedBillItems,$downloadedSkus);
@@ -350,7 +354,8 @@ class RejectedBillItemController extends Controller
         /** @var RejectedBill $rejectedBill */
         $rejectedBill = RejectedBill::query()->where('id',$rejectedBillItem->id_rejected_bill)->first();
         if(!$rejectedBill)return ['success'=>'false','id'=>$request->input('id')];
-        $rejectedBill->syncOrderIssue(); // 同步问题件 修改问题件退货状态
+        SyncOrderRejectingStatusJob::dispatch($rejectedBill);
+//        $rejectedBill->syncOrderIssue(); // 同步问题件 修改问题件退货状态
         app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($rejectedBillItem),Auth::user()['id']);
         return ['success'=>'true','id'=>$request->input('id')];
     }

+ 19 - 32
app/Http/Controllers/TestController.php

@@ -7,9 +7,12 @@ use App\Components\Database;
 use App\Components\ErrorPush;
 use App\MaterialBox;
 use App\MaterialBoxModel;
+use App\Order;
+use App\OrderDetail;
 use App\OrderIssue;
 use App\RejectedBill;
-use App\Services\RejectedBillSyncOrderService;
+use App\Services\OrderRejectedBillRelationService;
+use App\Services\OrderRejectingStatusService;
 use App\Services\RejectedService;
 use App\User;
 use App\Waybill;
@@ -95,48 +98,32 @@ values(?,?,null,?,?,?,?,?,?,2)",[$code,$a->id,$item->depth,$item->width,$item->h
         $a3 = 32 + 30;
     }
     use AuthenticatesUsers;
+
     public function test3($request){
         dd(Hash::make("wangyan"));
     }
 
-    public function get(){
-        dd($this->get0() ?? $this->get1() ?? $this->get2()) ;
-    }
-
-    public function get0()
+    public function testOrder()
     {
-        dump(1);
-        return null;
+        /** @var OrderRejectedBillRelationService $service */
+        $service = app('OrderRejectedBillRelationService');
+        $service->orderSyncRejectedBill(Order::find(3));
     }
 
-    public function get1()
-    {
-        dump(2);
-        return null;
-    }
-    public function get2()
+    public function testRejectedBill()
     {
-        dump(3);
-        return null;
+        /** @var OrderRejectedBillRelationService $service */
+        $service = app(OrderRejectedBillRelationService::class);
+        /** @var RejectedBill $item */
+        $item = RejectedBill::query()->orderByDesc('id')->first();
+        $service->rejectedBillSyncOrder($item);
     }
 
-    public function OrderSync(){
-        $order_issue = OrderIssue::query()->where('id',67982)->first();
-        $service = new RejectedBillSyncOrderService();
-        dd($service->getOrderRejectingStatus($order_issue->order));
-    }
-
-    public function rejectedSync(){
-        $item = RejectedBill::query()->where('logistic_number_return','YT3186326829104')->first();
-        $service = new RejectedBillSyncOrderService();
-        $service->syncRejectingStatus($item);
-    }
+    public function getOrder()
+    {
 
-    public function orderIssue(){
-        $orderIssue = OrderIssue::query()->find(1);
-        $service = new RejectedBillSyncOrderService();
-        $service->orderIssueSyncRejectedBills($orderIssue);
+        $query = Order::query()->select('id')->where('client_code','22011700000161');
+        dd(OrderDetail::query()->whereIn('order_id',$query)->get());
     }
-
 }
 

+ 2 - 2
app/Imports/OrderIssueImport.php

@@ -12,7 +12,7 @@ use App\OrderIssueType;
 use App\OrderPackage;
 use App\Services\OrderIssueRejectedBillService;
 use App\Services\OrderService;
-use App\Services\RejectedBillSyncOrderService;
+use App\Services\OrderRejectingStatusService;
 use App\Services\RejectedService;
 use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\Auth;
@@ -34,7 +34,7 @@ class OrderIssueImport implements ToCollection, WithHeadingRow, WithMultipleShee
     public function __construct(OrderService $orderService,
                                 OrderIssueRejectedBillService $orderIssueRejectedBillService,
                                 RejectedService $rejectedService,
-                                RejectedBillSyncOrderService $rejectedBillSyncOrderService)
+                                OrderRejectingStatusService $rejectedBillSyncOrderService)
     {
         $this->orderService = $orderService;
         $this->orderIssueRejectedBillService = $orderIssueRejectedBillService;

+ 6 - 5
app/Imports/RejectedImport.php

@@ -4,6 +4,7 @@ namespace App\Imports;
 
 use App\Http\Controllers\api\thirdPart\jianshang\RejectedController;
 use App\Http\Controllers\Controller;
+use App\Jobs\SyncOrderRejectingStatusJob;
 use App\Logistic;
 use App\Owner;
 use App\Rejected;
@@ -69,7 +70,7 @@ class RejectedImport implements ToCollection, WithHeadingRow
                     ]);
                     $item->save();
                 }
-                $bill->syncOrderIssue();
+//                $bill->syncOrderIssue();
             }else{
                 $bill=new RejectedBill([
                     'id_owner'=>$owner['id'],
@@ -79,8 +80,8 @@ class RejectedImport implements ToCollection, WithHeadingRow
                     'is_loaded'=>0,
                 ]);
                 $bill->save();
-                $bill->joinOrderIssue();
-                $bill->syncOrderIssue();
+//                $bill->joinOrderIssue();
+//                $bill->syncOrderIssue();
                 $item=RejectedBillItem::query()->where('id_rejected_bill',$bill['id'])
                     ->where('barcode_goods',trim($barcode))->where('id_quality_label',$id_quality_label)->first();
                 if($item){
@@ -97,7 +98,7 @@ class RejectedImport implements ToCollection, WithHeadingRow
                     $item->save();
                 }
             }
-
+            SyncOrderRejectingStatusJob::dispatch($bill);
             $lastBill = Session::get('jianshangLastImportedBill');
             if($owner['name']=='笕尚'&&$lastBill&&$lastBill !=trim($logistic_number_return)){
                 $this->submitToApi($bill);
@@ -120,7 +121,7 @@ class RejectedImport implements ToCollection, WithHeadingRow
                 $owner = Owner::query()->find($rejectedBill['id_owner']);
                 if(strstr($owner->name??'','笕尚')){
                     $rejected=new Rejected();
-                    app('LogService')->log(__METHOD__,'找不到表','132行');
+                    app('LogService')->log(__METHOD__,'找不到表','124行');
                     $rejected->fill($rejectedBill->toArray());
                     $rejected->fill($item->toArray());
                     $rejectedJianshang=new RejectedController();

+ 11 - 7
app/Jobs/SyncOrderRejectingStatusJob.php

@@ -2,7 +2,7 @@
 
 namespace App\Jobs;
 
-use App\Services\RejectedBillSyncOrderService;
+use App\Services\OrderRejectedBillRelationService;
 use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;
 use Illuminate\Foundation\Bus\Dispatchable;
@@ -13,16 +13,20 @@ class SyncOrderRejectingStatusJob implements ShouldQueue
 {
     use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
 
-    protected $logistic_number_return;
+    /**
+     * 退货关联订单 推算退回状态
+     */
+
+    protected $rejectedBill;
 
     /**
      * Create a new job instance.
      *
      * @return void
      */
-    public function __construct($logistic_number_return)
+    public function __construct($rejectedBill)
     {
-        $this->$logistic_number_return = $logistic_number_return;
+        $this->rejectedBill = $rejectedBill->withoutRelations();
     }
 
     /**
@@ -30,9 +34,9 @@ class SyncOrderRejectingStatusJob implements ShouldQueue
      *
      * @return void
      */
-    public function handle(RejectedBillSyncOrderService $service)
+    public function handle(OrderRejectedBillRelationService $service)
     {
-        if (!$this->logistic_number_return)return;
-        $service->syncRejectingStatusByReturnLogisticNumber($this->logistic_number_return);
+        if (!$this->rejectedBill) return;
+        $service->rejectedBillSyncOrder($this->rejectedBill);
     }
 }

+ 43 - 0
app/Jobs/SyncRejectedBillRejectingStatusJob.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Services\OrderRejectedBillRelationService;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+
+class SyncRejectedBillRejectingStatusJob implements ShouldQueue
+{
+
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    /**
+     * 订单关联退货 退算退回状态
+     */
+
+    private $order;
+
+    /**
+     * Create a new job instance.
+     *
+     * @return void
+     */
+    public function __construct($order)
+    {
+        $this->order = $order->withoutRelations();
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle(OrderRejectedBillRelationService $service)
+    {
+        if (!$this->order) return;
+        $service->orderSyncRejectedBill($this->order);
+    }
+}

+ 6 - 0
app/Order.php

@@ -6,6 +6,7 @@ use App\Traits\ModelTimeFormat;
 use Illuminate\Database\Eloquent\Model;
 use App\Traits\ModelLogChanging;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Database\Eloquent\Relations\HasOne;
 
 class Order extends Model
 {
@@ -107,6 +108,11 @@ class Order extends Model
         return $this->belongsTo('App\Batch', 'batch_id','id');
     }
 
+    public function detail(): HasOne
+    {
+        return $this->hasOne(OrderDetail::class);
+    }
+
     public function getLogisticNumbersAttribute()
     {
         $packages = $this->packages;

+ 23 - 0
app/OrderDetail.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
+
+class OrderDetail extends Model
+{
+    use ModelTimeFormat;
+
+    protected $fillable = [
+        'order_id', 'is_new_rejecting', 'rejecting_status',
+    ];
+
+    public function order(): BelongsTo
+    {
+        return $this->belongsTo(Order::class);
+    }
+
+}

+ 135 - 130
app/OrderIssue.php

@@ -68,7 +68,7 @@ class OrderIssue extends Model
 
     public function orderIssueRejectedBills(): HasMany
     {
-        return $this->hasMany(OrderIssueRejectedBill::class);
+        return $this->hasMany(OrderIssueRejectedBill::class,'order_id','order_id');
     }
 
     public function issueType(): BelongsTo
@@ -101,6 +101,11 @@ class OrderIssue extends Model
         return $this->hasOne('App\Order', 'client_code', 'second_client_no');
     }
 
+    public function orderDetail(): HasOne
+    {
+        return $this->hasOne(OrderDetail::class,'order_id','order_id');
+    }
+
     public function getCreateLogAttribute()
     {
         return $this->logs->where('type', '创建')->first();
@@ -134,76 +139,76 @@ class OrderIssue extends Model
         return $createLog->user->name ?? '';
     }
 
-    /**
-     * 同步退货状态
-     */
-    public function syncRejectingStatus()
-    {
-        $this->syncRejectedBillStatus($this);
-    }
-
-    public function syncRejectedBillStatus($orderIssue)
-    {
-        if (!$orderIssue->order_id) return;
-        $orderIssueMap = [];
-        $rejectedMap = [];
-        $owner_id = $orderIssue->order->owner_id;
-
-        // 获取对应订单的所有商品
-        $orderPackageQuery = OrderPackage::query()->selectRaw("id")->where('order_id', $orderIssue->order_id);
-        $orderPackageCommodities = OrderPackageCommodities::query()->with('commodity')->whereIn('order_package_id', $orderPackageQuery)->get();
-        foreach ($orderPackageCommodities as $orderPackageCommodity) {
-            $code = $orderPackageCommodity->commodity->sku;
-            if (empty($orderIssueMap[$code])) $orderIssueMap[$code] = $orderPackageCommodity->amount;
-            else $orderIssueMap[$code] += $orderPackageCommodity->amount;
-        }
-
-        // 获取对应退回单的所有商品
-        $orderIssueRejectedBillQuery = OrderIssueRejectedBill::query()->selectRaw("logistic_number_return")->where("order_issue_id", $orderIssue->id);
-        $RejectedBills = RejectedBill::query()->with('items.quality')->whereIn("logistic_number_return", $orderIssueRejectedBillQuery)->get();
-        /** @var RejectedBill $rejectedBill */
-        foreach ($RejectedBills as $rejectedBill) {
-            foreach ($rejectedBill->items as $item) {
-                $code = $item->barcode_goods;
-                $exists = Commodity::query()->where("sku", $code)->where('owner_id',$owner_id)->exists();
-                if (!$exists) {
-                    $commodityBarcodeQuery = CommodityBarcode::query()->select('commodity_id')->where('code',$code);
-                    $commodity = Commodity::query()->where('owner_id',$owner_id)->whereIn('id',$commodityBarcodeQuery)->first();
-                    if ($commodity)$code = $commodity->sku;
-                }
-                $qualityName = $item->quality->name;
-                if (empty($rejectedMap[$code]) || empty($rejectedMap[$code][$qualityName])) $rejectedMap[$code][$qualityName] = $item->amount;
-                else $rejectedMap[$code][$qualityName] += $item->amount;
-            }
-        }
-        // 比较
-        $status = $this->getRejectingStatus($orderIssueMap, $rejectedMap);
-        $this->update(['rejecting_status' => $status]);
-        $this->syncWorkOrder();
-    }
-
-    private function getRejectingStatus($orderIssueMap, $rejectedMap): string
-    {
-        //未退回,差异退回,全部退回,超量退回,部分退回
-        if (count($rejectedMap) == 0) return "未退回";
-        $equal = 0;
-        $portion = 0;
-        foreach ($rejectedMap as $key => $map) {
-            if (isset($map['残次']) && $map['残次'] > 0) return "差异退回";
-            if (empty($orderIssueMap[$key])) return "差异退回";
-            if(isset($rejectedMap[$key]['正品']) && isset($orderIssueMap[$key])){
-                if ( $rejectedMap[$key]['正品'] < $orderIssueMap[$key]) $portion += 1;
-                if ( $rejectedMap[$key]['正品'] > $orderIssueMap[$key]) return "超量退回";                                 // 超量退回
-                if ( $rejectedMap[$key]['正品'] == $orderIssueMap[$key]) $equal += 1;
-            }
-        }
-        if ($equal == count($orderIssueMap) && $equal == count($rejectedMap)  && $portion == 0) return "全部退回";        // 全部退回
-        if ($portion > 0) return "部分退回";                                                                              // 部分退回
-        // 部分退回
-        if (count(array_diff_key($orderIssueMap,$rejectedMap)) > 0)return '部分退回';
-        if (count(array_diff_key($rejectedMap,$orderIssueMap)) > 0)return '差异退回';
-        return "无";
-    }
+//    /**
+//     * 同步退货状态
+//     */
+//    public function syncRejectingStatus()
+//    {
+//        $this->syncRejectedBillStatus($this);
+//    }
+
+//    public function syncRejectedBillStatus($orderIssue)
+//    {
+//        if (!$orderIssue->order_id) return;
+//        $orderIssueMap = [];
+//        $rejectedMap = [];
+//        $owner_id = $orderIssue->order->owner_id;
+//
+//        // 获取对应订单的所有商品
+//        $orderPackageQuery = OrderPackage::query()->selectRaw("id")->where('order_id', $orderIssue->order_id);
+//        $orderPackageCommodities = OrderPackageCommodities::query()->with('commodity')->whereIn('order_package_id', $orderPackageQuery)->get();
+//        foreach ($orderPackageCommodities as $orderPackageCommodity) {
+//            $code = $orderPackageCommodity->commodity->sku;
+//            if (empty($orderIssueMap[$code])) $orderIssueMap[$code] = $orderPackageCommodity->amount;
+//            else $orderIssueMap[$code] += $orderPackageCommodity->amount;
+//        }
+//
+//        // 获取对应退回单的所有商品
+//        $orderIssueRejectedBillQuery = OrderIssueRejectedBill::query()->selectRaw("logistic_number_return")->where("order_issue_id", $orderIssue->id);
+//        $RejectedBills = RejectedBill::query()->with('items.quality')->whereIn("logistic_number_return", $orderIssueRejectedBillQuery)->get();
+//        /** @var RejectedBill $rejectedBill */
+//        foreach ($RejectedBills as $rejectedBill) {
+//            foreach ($rejectedBill->items as $item) {
+//                $code = $item->barcode_goods;
+//                $exists = Commodity::query()->where("sku", $code)->where('owner_id',$owner_id)->exists();
+//                if (!$exists) {
+//                    $commodityBarcodeQuery = CommodityBarcode::query()->select('commodity_id')->where('code',$code);
+//                    $commodity = Commodity::query()->where('owner_id',$owner_id)->whereIn('id',$commodityBarcodeQuery)->first();
+//                    if ($commodity)$code = $commodity->sku;
+//                }
+//                $qualityName = $item->quality->name;
+//                if (empty($rejectedMap[$code]) || empty($rejectedMap[$code][$qualityName])) $rejectedMap[$code][$qualityName] = $item->amount;
+//                else $rejectedMap[$code][$qualityName] += $item->amount;
+//            }
+//        }
+//        // 比较
+//        $status = $this->getRejectingStatus($orderIssueMap, $rejectedMap);
+//        $this->update(['rejecting_status' => $status]);
+//        $this->syncWorkOrder();
+//    }
+
+//    private function getRejectingStatus($orderIssueMap, $rejectedMap): string
+//    {
+//        //未退回,差异退回,全部退回,超量退回,部分退回
+//        if (count($rejectedMap) == 0) return "未退回";
+//        $equal = 0;
+//        $portion = 0;
+//        foreach ($rejectedMap as $key => $map) {
+//            if (isset($map['残次']) && $map['残次'] > 0) return "差异退回";
+//            if (empty($orderIssueMap[$key])) return "差异退回";
+//            if(isset($rejectedMap[$key]['正品']) && isset($orderIssueMap[$key])){
+//                if ( $rejectedMap[$key]['正品'] < $orderIssueMap[$key]) $portion += 1;
+//                if ( $rejectedMap[$key]['正品'] > $orderIssueMap[$key]) return "超量退回";                                 // 超量退回
+//                if ( $rejectedMap[$key]['正品'] == $orderIssueMap[$key]) $equal += 1;
+//            }
+//        }
+//        if ($equal == count($orderIssueMap) && $equal == count($rejectedMap)  && $portion == 0) return "全部退回";        // 全部退回
+//        if ($portion > 0) return "部分退回";                                                                              // 部分退回
+//        // 部分退回
+//        if (count(array_diff_key($orderIssueMap,$rejectedMap)) > 0)return '部分退回';
+//        if (count(array_diff_key($rejectedMap,$orderIssueMap)) > 0)return '差异退回';
+//        return "无";
+//    }
 
     public function delete()
     {
@@ -217,64 +222,64 @@ class OrderIssue extends Model
         return parent::delete();
     }
 
-    /**
-     * 同步退货单号
-     */
-    public function syncRejectedBills()
-    {
-        $order_packages = $this->order->packages;
-        if($order_packages){
-            foreach ($order_packages as $order_package) {
-                $logistic_number = $order_package->logistic_number;
-                $rejectedBill = RejectedBill::query()->where('logistic_number_return',$logistic_number)->first();
-                if($rejectedBill){
-                    if(OrderIssueRejectedBill::isExit($this->id,$logistic_number))continue;
-                    $this->joinRejectedBill($logistic_number);
-                    if(isset($rejectedBill->items))
-                        $this->is_new_rejecting = '有';
-                }
-            }
-            $this->save();
-        }
-    }
-
-    public function syncRejected($logistic_number)
-    {
-        $query = RejectedBill::query()->selectRaw('id');
-        if(is_array($logistic_number)){
-            $query->whereIn('logistic_number_return',$logistic_number);
-        }elseif (is_string($logistic_number)){
-            $query->where('logistic_number_return',$logistic_number);
-        }else return;
-        $items = RejectedBillItem::query()->whereIn('id_rejected_bill',$query);
-        if($items->count() > 0) $this->update(['is_new_rejecting'=>'有']);
-        elseif($items->count() == 0) $this->update(['is_new_rejecting'=>'无']);
-    }
-
-
-    /**
-     * @param array|string $logistic_number
-     * @return array|void
-     */
-    public function joinRejectedBill($logistic_number)
-    {
-        if(!$logistic_number)return null;
-        $this->syncRejected($logistic_number);
-        if(is_array($logistic_number)){
-            return $this->rejectedBills()->sync($logistic_number,false);
-        }
-        return $this->rejectedBills()->attach($logistic_number);
-    }
-
-    public function unJoinRejectedBill($logistic_number)
-    {
-        return $this->rejectedBills()->detach($logistic_number);
-    }
-
-    public function reviseJoinRejectedBill($logistic_number,$logistic_number_update)
-    {
-        return $this->rejectedBills()->updateExistingPivot($logistic_number,['logistic_number_return'=>$logistic_number_update]);
-    }
+//    /**
+//     * 同步退货单号
+//     */
+//    public function syncRejectedBills()
+//    {
+//        $order_packages = $this->order->packages;
+//        if($order_packages){
+//            foreach ($order_packages as $order_package) {
+//                $logistic_number = $order_package->logistic_number;
+//                $rejectedBill = RejectedBill::query()->where('logistic_number_return',$logistic_number)->first();
+//                if($rejectedBill){
+//                    if(OrderIssueRejectedBill::isExit($this->id,$logistic_number))continue;
+//                    $this->joinRejectedBill($logistic_number);
+//                    if(isset($rejectedBill->items))
+//                        $this->is_new_rejecting = '有';
+//                }
+//            }
+//            $this->save();
+//        }
+//    }
+
+//    public function syncRejected($logistic_number)
+//    {
+//        $query = RejectedBill::query()->selectRaw('id');
+//        if(is_array($logistic_number)){
+//            $query->whereIn('logistic_number_return',$logistic_number);
+//        }elseif (is_string($logistic_number)){
+//            $query->where('logistic_number_return',$logistic_number);
+//        }else return;
+//        $items = RejectedBillItem::query()->whereIn('id_rejected_bill',$query);
+//        if($items->count() > 0) $this->update(['is_new_rejecting'=>'有']);
+//        elseif($items->count() == 0) $this->update(['is_new_rejecting'=>'无']);
+//    }
+
+
+//    /**
+//     * @param array|string $logistic_number
+//     * @return array|void
+//     */
+//    public function joinRejectedBill($logistic_number)
+//    {
+//        if(!$logistic_number)return null;
+//        $this->syncRejected($logistic_number);
+//        if(is_array($logistic_number)){
+//            return $this->rejectedBills()->sync($logistic_number,false);
+//        }
+//        return $this->rejectedBills()->attach($logistic_number);
+//    }
+//
+//    public function unJoinRejectedBill($logistic_number)
+//    {
+//        return $this->rejectedBills()->detach($logistic_number);
+//    }
+//
+//    public function reviseJoinRejectedBill($logistic_number,$logistic_number_update)
+//    {
+//        return $this->rejectedBills()->updateExistingPivot($logistic_number,['logistic_number_return'=>$logistic_number_update]);
+//    }
 
     public function scopeFilter($query, $filters)
     {
@@ -306,7 +311,7 @@ class OrderIssue extends Model
             $query->with(['shop', 'logistic', 'owner', 'packages.commodities.commodity.barcodes']);
         },'orderIssueRejectedBills.rejectedBill'=>function($query){
             $query->with(['owner','logistic','user','items.quality']);
-        },'userWorkgroups','userOwnerGroup']);
+        },'userWorkgroups','userOwnerGroup','orderDetail']);
 
     }
 

+ 11 - 5
app/OrderIssueRejectedBill.php

@@ -4,23 +4,29 @@ namespace App;
 
 use Illuminate\Database\Eloquent\Model;
 
-use App\Traits\ModelLogChanging;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
 
 class OrderIssueRejectedBill extends Model
 {
-    use ModelLogChanging;
     protected $table='order_issue_rejected_bill';
+
     public $timestamps = false;
+
     protected $fillable = [
-        'order_issue_id','logistic_number_return'
+        'order_issue_id','logistic_number_return','order_id'
     ];
 
-    public function orderIssue()
+    public function order(): BelongsTo
+    {
+        return $this->belongsTo(Order::class);
+    }
+
+    public function orderIssue(): BelongsTo
     {
         return $this->belongsTo(OrderIssue::class,'order_issue_id','id');
     }
 
-    public function rejectedBill()
+    public function rejectedBill(): BelongsTo
     {
         return $this->belongsTo(RejectedBill::class,'logistic_number_return','logistic_number_return');
     }

+ 6 - 2
app/Providers/AppServiceProvider.php

@@ -206,7 +206,9 @@ use App\Services\AndroidInventoryService;
 use App\Services\WorkOrderCancelInterceptService;
 use App\Services\ReceivingTaskService;
 use App\Services\ReceivingTaskItemService;
-use App\Services\RejectedBillSyncOrderService;
+use App\Services\OrderRejectingStatusService;
+use App\Services\OrderDetailService;
+use App\Services\OrderRejectedBillRelationService;
 
 class AppServiceProvider extends ServiceProvider
 {
@@ -302,6 +304,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('OracleDocWaveDetailService', OracleDocWaveDetailService::class);
         app()->singleton('OrderCommodityAssignService', OrderCommodityAssignService::class);
         app()->singleton('OrderCommodityService', OrderCommodityService::class);
+        app()->singleton('OrderDetailService',OrderDetailService::class);
         app()->singleton('OrderFreezeService', OrderFreezeService::class);
         app()->singleton('OrderIssuePerformanceService', OrderIssuePerformanceService::class);
         app()->singleton('OrderIssueProcessLogService', OrderIssueProcessLogService::class);
@@ -317,6 +320,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('OrderPackageReceivedSyncService', OrderPackageReceivedSyncService::class);
         app()->singleton('OrderPackageRemarkService',OrderPackageRemarkService::class);
         app()->singleton('OrderPackageService', OrderPackageService::class);
+        app()->singleton('OrderRejectedBillRelationService',OrderRejectedBillRelationService::class);
         app()->singleton('OrderService', OrderService::class);
         app()->singleton('OrderTrackingService', OrderTrackingService::class);
         app()->singleton('OwnerAreaReportService', OwnerAreaReportService::class);
@@ -365,9 +369,9 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('ReceivingTaskItemService',ReceivingTaskItemService::class);
         app()->singleton('ReceivingTaskService',ReceivingTaskService::class);
         app()->singleton('RegionService', RegionService::class);
-        app()->singleton('RejectedBillSyncOrderService',RejectedBillSyncOrderService::class);
         app()->singleton('RejectedBillItemService', RejectedBillItemService::class);
         app()->singleton('RejectedBillService', RejectedBillService::class);
+        app()->singleton('RejectedBillSyncOrderService',OrderRejectingStatusService::class);
         app()->singleton('RejectedService', RejectedService::class);
         app()->singleton('ReplenishmentService',ReplenishmentService::class);
         app()->singleton('RequirementService',RequirementService::class);

+ 54 - 52
app/RejectedBill.php

@@ -4,6 +4,8 @@ namespace App;
 
 use App\Http\Controllers\Controller;
 use App\Http\Controllers\LogisticNumberFeatureController;
+use App\Jobs\SyncOrderRejectingStatusJob;
+use App\Jobs\SyncRejectedBillRejectingStatusJob;
 use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\SoftDeletes;
@@ -161,60 +163,60 @@ class RejectedBill extends Model
     public function delete()
     {
         /** @var OrderIssue $orderIssue */
-        $orderIssue = $this->orderIssue;
-        if($orderIssue){
-            $orderIssue->unJoinRejectedBill($this->logistic_number_return);
-            $orderIssue->update(['is_new_rejecting'=>'无']);
-            $orderIssue->syncRejectingStatus();
+        $order_issue_rejected_bill = OrderIssueRejectedBill::query()->select('logistic_number_return')
+            ->where('logistic_number_return',$this->logistic_number_return)->first();
+        if ($order_issue_rejected_bill){
+            $order_issue_rejected_bill->delete();
+            SyncOrderRejectingStatusJob::dispatch($this);
         }
         return parent::delete();
     }
 
-    public function joinOrderIssue()
-    {
-        if(isset($this->orderIssueRejectedBill)){
-            return;
-        }
-        /** @var OrderIssue $orderIssue */
-        $orderIssue = $this->orderIssueRejectedBill->orderIssue ?? null;
-        if($orderIssue){
-            $orderIssue->joinRejectedBill($this->logistic_number_return);
-            return;
-        }
-
-        // 获取是否有快递单号对应问题件订单存在
-        $orderIssue = OrderIssue::query()->where('order_id',function ($query){
-            $query->from('order_packages')->selectRaw('order_id')->where('logistic_number',$this->logistic_number_return);
-        })->first();
-
-        if(!$orderIssue){
-            $orderHeader = OracleDOCOrderHeader::query()->selectRaw('OrderNO')->where('SoReference1', function ($query) {
-                $query->select('AsnReference2')->from('DOC_ASN_HEADER')->where('AsnReference3', $this->logistic_number_return)->first();
-            })->first();
-            if(!$orderHeader)return;
-            $orderIssue = OrderIssue::query()->where('order_id',function($query)use($orderHeader){
-                $query->from('orders')->select('id')->where('code',$orderHeader->orderno);
-            })->first();
-        }
-        if(!$orderIssue)return;
-        $orderIssue->joinRejectedBill($this->logistic_number_return);
-        $orderIssue->syncRejectingStatus();
-    }
-
-    public function syncOrderIssue()
-    {
-        if(isset($this->orderIssueRejectedBill)){
-            if(isset($this->orderIssueRejectedBill->orderIssue)){
-                /** @var OrderIssue $orderIssue */
-                $orderIssue = $this->orderIssueRejectedBill->orderIssue;
-                $orderIssue->syncRejectingStatus();
-            }
-        }
-    }
-
-    public function updateIsNewRejecting()
-    {
-        $orderIssue = $this->orderIssueRejectedBill->orderIssue ?? null;
-        if($orderIssue) $orderIssue->update(['is_new_rejecting' => '有']);
-    }
+//    public function joinOrderIssue()
+//    {
+//        if(isset($this->orderIssueRejectedBill)){
+//            return;
+//        }
+//        /** @var OrderIssue $orderIssue */
+//        $orderIssue = $this->orderIssueRejectedBill->orderIssue ?? null;
+//        if($orderIssue){
+//            $orderIssue->joinRejectedBill($this->logistic_number_return);
+//            return;
+//        }
+//
+//        // 获取是否有快递单号对应问题件订单存在
+//        $orderIssue = OrderIssue::query()->where('order_id',function ($query){
+//            $query->from('order_packages')->selectRaw('order_id')->where('logistic_number',$this->logistic_number_return);
+//        })->first();
+//
+//        if(!$orderIssue){
+//            $orderHeader = OracleDOCOrderHeader::query()->selectRaw('OrderNO')->where('SoReference1', function ($query) {
+//                $query->select('AsnReference2')->from('DOC_ASN_HEADER')->where('AsnReference3', $this->logistic_number_return)->first();
+//            })->first();
+//            if(!$orderHeader)return;
+//            $orderIssue = OrderIssue::query()->where('order_id',function($query)use($orderHeader){
+//                $query->from('orders')->select('id')->where('code',$orderHeader->orderno);
+//            })->first();
+//        }
+//        if(!$orderIssue)return;
+//        $orderIssue->joinRejectedBill($this->logistic_number_return);
+//        $orderIssue->syncRejectingStatus();
+//    }
+
+//    public function syncOrderIssue()
+//    {
+//        if(isset($this->orderIssueRejectedBill)){
+//            if(isset($this->orderIssueRejectedBill->orderIssue)){
+//                /** @var OrderIssue $orderIssue */
+//                $orderIssue = $this->orderIssueRejectedBill->orderIssue;
+//                $orderIssue->syncRejectingStatus();
+//            }
+//        }
+//    }
+
+//    public function updateIsNewRejecting()
+//    {
+//        $orderIssue = $this->orderIssueRejectedBill->orderIssue ?? null;
+//        if($orderIssue) $orderIssue->update(['is_new_rejecting' => '有']);
+//    }
 }

+ 1 - 1
app/Services/OracleDOCOrderHeaderService.php

@@ -26,7 +26,7 @@ class OracleDOCOrderHeaderService
         'DOC_Order_Header.SOReference5', 'DOC_Order_Header.C_Tel2','DOC_Order_Header.Transportation',
         'DOC_Order_Header.WareHouseId','DOC_Order_Header.SOStatus','DOC_Order_Header.C_Tel1','DOC_Order_Header.C_District',
         'DOC_Order_Header.IssuePartyName','DOC_Order_Header.OrderType','DOC_Order_Header.WaveNo',
-        'DOC_Order_Header.ReleaseStatus','DOC_Order_Header.h_edi_20','DOC_Order_Header.h_edi_03'
+        'DOC_Order_Header.ReleaseStatus','DOC_Order_Header.h_edi_20','DOC_Order_Header.h_edi_03',
     ];
 
     public function getQuery(){

+ 13 - 0
app/Services/OrderDetailService.php

@@ -0,0 +1,13 @@
+<?php 
+
+namespace App\Services;
+
+use App\Traits\ServiceAppAop;
+use App\OrderDetail;
+
+class OrderDetailService
+{
+    use ServiceAppAop;
+    protected $modelClass=OrderDetail::class;
+
+}

+ 31 - 70
app/Services/OrderIssueRejectedBillService.php

@@ -9,12 +9,13 @@ use App\RejectedBill;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 
-Class OrderIssueRejectedBillService
+class OrderIssueRejectedBillService
 {
-    private $rejectedBillSyncOrderService;
-    public function __construct(RejectedBillSyncOrderService  $rejectedBillSyncOrderService)
+    private $orderRejectedBillRelationService;
+
+    public function __construct(OrderRejectedBillRelationService  $orderRejectedBillRelationService)
     {
-        $this->rejectedBillSyncOrderService = $rejectedBillSyncOrderService;
+        $this->orderRejectedBillRelationService = $orderRejectedBillRelationService;
     }
 
     /**
@@ -23,55 +24,48 @@ Class OrderIssueRejectedBillService
      * @param $logistic_number_return
      * @return Builder|Model|object|null|boolean
      */
-    public function joinRejectedBill($orderIssue,$logistic_number_return)
+    public function joinRejectedBill(OrderIssue $orderIssue, $logistic_number_return)
     {
-        $orderIssueRejectedBill = OrderIssueRejectedBill::query()
-            ->where('order_issue_id',$orderIssue->id)
-            ->where('logistic_number_return',$logistic_number_return)->first();
-        if($orderIssueRejectedBill)return null;
-        $orderIssue->joinRejectedBill($logistic_number_return);
-        $this->rejectedBillSyncOrderService->orderIssueSyncRejectingStatus($orderIssue);
+        OrderIssueRejectedBill::query()->create(
+            ['order_id' => $orderIssue->order_id,'order_issue_id' => $orderIssue->id,'logistic_number_return' => $logistic_number_return]
+        );
+        $this->orderRejectedBillRelationService->orderSyncRejectedBill($orderIssue->order);
         return OrderIssueRejectedBill::query()->with('rejectedBill.items')
-                ->where('order_issue_id',$orderIssue->id)
-                ->where('logistic_number_return',$logistic_number_return)->first() ?? false;
+                ->where('order_issue_id', $orderIssue->id)
+                ->where('logistic_number_return', $logistic_number_return)->first() ?? false;
     }
 
     /**
      * 删除连接
      * @param OrderIssue $orderIssue
      * @param $logistic_number_return
-     * @return void|null|boolean
+     * @return boolean
      */
-    public function unJoinRejectedBill($orderIssue,$logistic_number_return)
+    public function unJoinRejectedBill(OrderIssue $orderIssue, $logistic_number_return): bool
     {
-        $orderIssueRejectedBill = OrderIssueRejectedBill::query()
-            ->where('order_issue_id',$orderIssue->id)
-            ->where('logistic_number_return',$logistic_number_return)->first();
-        if(!$orderIssueRejectedBill)return null;
-
-        $bool = $orderIssue->unJoinRejectedBill($logistic_number_return);
-        $this->rejectedBillSyncOrderService->orderIssueSyncRejectingStatus($orderIssue);
-        if($orderIssue->rejectedBills->count() == 0)$orderIssue->update(['is_new_rejecting' => '无']);
-        return $bool;
+        OrderIssueRejectedBill::query()
+            ->where('order_id', $orderIssue->order_id)
+            ->where('logistic_number_return', $logistic_number_return)->delete();
+        $this->orderRejectedBillRelationService->orderSyncRejectedBill($orderIssue->order);
+        if ($orderIssue->rejectedBills()->count() == 0) $orderIssue->update(['is_new_rejecting' => '无']);
+        return true;
     }
 
     /**
      * 修改连接
-     * @param  OrderIssue $orderIssue
+     * @param OrderIssue $orderIssue
      * @param $logistic_number_return
      * @param $logistic_number_return_update
      * @return null|boolean|Builder|Model|object
      */
-    public function reviseJoinRejectedBill($orderIssue,$logistic_number_return,$logistic_number_return_update)
+    public function reviseJoinRejectedBill(OrderIssue $orderIssue, $logistic_number_return, $logistic_number_return_update)
     {
-        $orderIssueRejectedBill = OrderIssueRejectedBill::query()->where('order_issue_id',$orderIssue->id)
-            ->where('logistic_number_return',$logistic_number_return)->first();
-        if($orderIssueRejectedBill) return null;
-        $orderIssue->reviseJoinRejectedBill($logistic_number_return,$logistic_number_return_update);
-        $this->rejectedBillSyncOrderService->orderIssueSyncRejectingStatus($orderIssue);
+        OrderIssueRejectedBill::query()->where('logistic_number_return' , $logistic_number_return)
+            ->update(['logistic_number_return'=>$logistic_number_return_update]);
+        $this->orderRejectedBillRelationService->orderSyncRejectedBill($orderIssue->order);
         return OrderIssueRejectedBill::query()->with('rejectedBill')
-                ->where('order_issue_id',$orderIssue->id)
-                ->where('logistic_number_return',$logistic_number_return)->first() ?? false;
+                ->where('order_issue_id', $orderIssue->id)
+                ->where('logistic_number_return', $logistic_number_return_update)->first() ?? false;
     }
 
     /**
@@ -81,46 +75,13 @@ Class OrderIssueRejectedBillService
      */
     public function syncOrderIssue($rejectedBills)
     {
-        if(!$rejectedBills)return;
-        if(is_array($rejectedBills)){
+        if (!$rejectedBills) return;
+        if (is_array($rejectedBills)) {
             foreach ($rejectedBills as $rejectedBill) {
-                $this->rejectedBillSyncOrderService->syncRejectingStatus($rejectedBill);
-            }
-            return;
-        }
-        $this->rejectedBillSyncOrderService->syncRejectingStatus($rejectedBills);
-    }
-
-    /**
-     * 问题件同步退回件
-     * @param OrderIssue $orderIssue
-     */
-    public function syncRejectedBill($orderIssue)
-    {
-        if(!$orderIssue)return;
-        $order_packages = $orderIssue->order->packages ?? collect();
-        if(!$order_packages)return;
-        $logistic_number_return = RejectedBill::query()->whereIn('logistic_number_return',$order_packages->map(function($rejectedBill){
-            return $rejectedBill->logistic_number_return;
-        }))->get();
-        $orderIssue->joinRejectedBill($logistic_number_return);
-        $this->rejectedBillSyncOrderService->orderIssueSyncRejectingStatus($orderIssue);
-    }
-
-    /**
-     * 问题件更新退单状态
-     * @param OrderIssue|Controller $order_issues
-     */
-    public function syncOrderIssueRejectingStatus($order_issues)
-    {
-        /**@var OrderIssue $orderIssue */
-        if(!$order_issues)return;
-        if(is_array($order_issues)){
-            foreach ($order_issues as $orderIssue) {
-                $this->rejectedBillSyncOrderService->orderIssueSyncRejectingStatus($orderIssue);
+                $this->orderRejectedBillRelationService->rejectedBillSyncOrder($rejectedBill);
             }
             return;
         }
-        $this->rejectedBillSyncOrderService->orderIssueSyncRejectingStatus($order_issues);
+        $this->orderRejectedBillRelationService->rejectedBillSyncOrder($rejectedBills);
     }
 }

+ 15 - 15
app/Services/OrderIssueService.php

@@ -3,6 +3,7 @@
 namespace App\Services;
 
 use App\Events\AddOrUpdateOrderIssues;
+use App\Jobs\SyncRejectedBillRejectingStatusJob;
 use App\OracleActAllocationDetails;
 use App\OracleDOCASNHeader;
 use App\OracleDOCOrderHeader;
@@ -34,7 +35,7 @@ class OrderIssueService
     protected $logService;
 
     public function __construct(OrderService $orderService,
-                                RejectedBillSyncOrderService $rejectedBillSyncOrderService,
+                                OrderRejectingStatusService $rejectedBillSyncOrderService,
                                 OracleDocOrderHeaderService $oracleDocOrderHeaderService,
                                 OrderIssueProcessLogService $orderIssueProcessLogService,
                                 LogService $logService
@@ -52,7 +53,7 @@ class OrderIssueService
         OrderIssue::query()->insert($params);
     }
 
-    public function orderIssueTag(array $params)
+    public function orderIssueTag(array $params): array
     {
         $orderNos = $params['orderNos'];
         $orderHeaders = $this->oracleDocOrderHeaderService->getQuery()->whereIn('orderNo', $orderNos)->get();
@@ -89,7 +90,10 @@ class OrderIssueService
         if (!$bool) return ['success' => false, 'message' => '创建问题件异常'];
         $ordersIssues = OrderIssue::query()->whereIn('order_id', data_get($inner_params, '*.order_id'))->get();
         event(new AddOrUpdateOrderIssues(data_get($ordersIssues, '*.order_id')));
-        $this->同步退单状态($ordersIssues);
+        $ordersIssues->each(function ($item){
+            SyncRejectedBillRejectingStatusJob::dispatch($item->order);
+        });
+//        $this->同步退单状态($ordersIssues);
         $param = [
             'ids' => data_get($ordersIssues, '*.id'),
             'content' => '',
@@ -126,7 +130,10 @@ class OrderIssueService
             $this->insert($innerParams);
             $ordersIssues = OrderIssue::query()->whereIn('order_id', data_get($innerParams, '*.order_id'))->get();
             event(new AddOrUpdateOrderIssues(data_get($ordersIssues, '*.order_id')));
-            $this->同步退单状态($ordersIssues);
+            $ordersIssues->each(function ($item){
+                SyncRejectedBillRejectingStatusJob::dispatch($item->order);
+            });
+//            $this->同步退单状态($ordersIssues);
             $param = [
                 'ids' => data_get($ordersIssues, '*.id'),
                 'content' => '',
@@ -142,15 +149,6 @@ class OrderIssueService
         }
     }
 
-    public function 同步退单状态($orderIssues)
-    {
-        if (!$orderIssues) return;
-        foreach ($orderIssues as $orderIssue) {
-            /**@var OrderIssue $orderIssue */
-            $this->rejectedBillSyncOrderService->orderIssueSyncRejectingStatus($orderIssue);
-        }
-    }
-
     public function createOrFindByOrderNo($orderNo)
     {
         $orderHeader = OracleDOCOrderHeader::query()->where('orderNo', $orderNo)->first();
@@ -182,9 +180,10 @@ class OrderIssueService
         try {
             /** @var OrderIssue $orderIssue */
             $orderIssue = OrderIssue::query()->create($arr);
-            $this->rejectedBillSyncOrderService->orderIssueSyncRejectingStatus($orderIssue);
             $orderIssue->order = $order;
             event(new AddOrUpdateOrderIssues([$orderIssue['order_id']]));
+            SyncRejectedBillRejectingStatusJob::dispatch($order);
+
             $this->logService->log(__METHOD__, __FUNCTION__, '创建问题件' . json_encode($orderIssue));
         } catch (\Exception $e) {
             $this->logService->log(__METHOD__, __FUNCTION__, '创建问题件error' . json_encode($arr) . $e->getMessage() . $e->getTraceAsString());
@@ -233,6 +232,7 @@ class OrderIssueService
             $order = $this->orderService->createOrder($arr);
             $orderIssue->order_id = $order['id'];
             $orderIssue->save();
+            SyncRejectedBillRejectingStatusJob::dispatch($order);
             $this->logService->log(__METHOD__, __FUNCTION__, '创建 Order' . json_encode($order));
         }
         return $orderIssue;
@@ -248,7 +248,7 @@ class OrderIssueService
         $orderIssue['order_id'] = $order['id'];
         OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $arr['logistic_number_return']]);
         $orderIssue->update(['order_id' => $order['id']]);
-        $this->rejectedBillSyncOrderService->orderIssueSyncRejectingStatus($orderIssue);
+        SyncRejectedBillRejectingStatusJob::dispatch($order);
         event(new AddOrUpdateOrderIssues([$orderIssue['order_id']]));
         return $orderIssue;
     }

+ 136 - 0
app/Services/OrderRejectedBillRelationService.php

@@ -0,0 +1,136 @@
+<?php
+
+namespace App\Services;
+
+use App\OracleDOCASNHeader;
+use App\OracleDOCOrderHeader;
+use App\Order;
+use App\OrderIssue;
+use App\OrderIssueRejectedBill;
+use App\OrderPackage;
+use App\RejectedBill;
+
+class OrderRejectedBillRelationService
+{
+    private $service;
+
+    public function __construct(OrderRejectingStatusService $service)
+    {
+        $this->service = $service;
+    }
+
+    public function rejectedBillSyncOrder(RejectedBill $rejectedBill)
+    {
+        $order = $this->getOrder($rejectedBill);
+        if (!$order) return;
+        $order_issue = OrderIssue::query()->where('order_id', $order->id)->first();
+        $item = OrderIssueRejectedBill::query()->where('logistic_number_return', $rejectedBill->logistic_number_return)->first();
+        if ($item) {
+            OrderIssueRejectedBill::query()->where('logistic_number_return', $rejectedBill->logistic_number_return)->update(
+                ['order_id' => $order->id,'order_issue_id' => $order_issue->id ?? null]
+            );
+        } else {
+            OrderIssueRejectedBill::query()->create(
+                ['order_id' => $order->id, 'order_issue_id' => $order_issue->id ?? null, 'logistic_number_return' => $rejectedBill->logistic_number_return]
+            );
+        }
+        $this->service->syncRejectingStatus($order);
+    }
+
+
+    private function getOrder(RejectedBill $rejectedBill)
+    {
+        return $this->getOrderByLogisticNumber($rejectedBill) ?? $this->getOrderByOracleOrderHeader($rejectedBill);
+    }
+
+    private function getOrderByLogisticNumber(RejectedBill $rejectedBill)
+    {
+        return Order::query()->whereHas('packages', function ($query) use ($rejectedBill) {
+            $query->where('logistic_number', $rejectedBill->logistic_number_return);
+        })->first();
+    }
+
+    private function getOrderByOracleOrderHeader(RejectedBill $rejectedBill)
+    {
+        $order_header = OracleDOCOrderHeader::query()->selectRaw('OrderNO')->where('SoReference1', function ($query) use ($rejectedBill) {
+            $query->select('AsnReference2')->from('DOC_ASN_HEADER')->where('AsnReference3', $rejectedBill->logistic_number_return)->first();
+        })->first();
+        return $order_header ? Order::query()->where('code', $order_header->orderno)->first() : null;
+    }
+
+    // 问题件同步
+    public function orderSyncRejectedBill(Order $order)
+    {
+        $logistic_number_returns = array_unique(
+            array_merge($this->getOrderPackagesLogisticNumbers($order), $this->getOracleOrderHeaderRelationLogisticNumbers($order))
+        );
+
+        $logistic_number_returns = $this->filtersCanBeJoinLogisticNumberReturns($order, $logistic_number_returns);
+
+        OrderIssueRejectedBill::query()->insert(array_map(function($item)use($order){
+            return ['order_id' => $order->id,'logistic_number_return' => $item];
+        },$logistic_number_returns));
+
+        $this->service->syncRejectingStatus($order);
+    }
+
+    private function getOrderPackagesLogisticNumbers(Order $order): array
+    {
+        return OrderPackage::query()->where('order_id', $order->id)->get()->map(function ($orderPackages) {
+            return $orderPackages->logistic_number;
+        })->toArray();
+    }
+
+    private function getOracleOrderHeaderRelationLogisticNumbers(Order $order): array
+    {
+        $query = OracleDOCOrderHeader::query()->select('SoReference1')->where('orderNo', $order->code);
+        return OracleDOCASNHeader::query()->select('AsnReference3')->whereIn('AsnReference2', $query)->get()->map(function ($asnHeader) {
+            return $asnHeader->asnreference3;
+        })->toArray();
+    }
+
+    /**
+     * @param Order $order
+     * @param array $logistic_numbers
+     * @return array
+     */
+    public function geExistRelationLogisticNumberReturn(Order $order, array $logistic_numbers): array
+    {
+        return OrderIssueRejectedBill::query()
+            ->select('logistic_number_return')->where('order_id', $order->id)
+            ->whereIn('logistic_number_return', $logistic_numbers)->get()
+            ->map(function ($item) {
+                return $item->logistic_number_return;
+            })->toArray();
+    }
+
+    /**
+     * @param array $logistic_numbers
+     * @return array
+     */
+    public function getExistRejectedBIllLogisticNumberReturn(array $logistic_numbers): array
+    {
+        return RejectedBill::query()->select('logistic_number_return')
+            ->whereIn('logistic_number_return', $logistic_numbers)->get()
+            ->map(function ($item) {
+                return $item->logistic_number_return;
+            })->toArray();
+    }
+
+    /**
+     * @param Order $order
+     * @param array $logistic_number_returns
+     * @return array
+     */
+    public function filtersCanBeJoinLogisticNumberReturns(Order $order, array $logistic_number_returns): array
+    {
+        $order_issue_rejected_bill_logistic_number_returns = $this->geExistRelationLogisticNumberReturn($order, $logistic_number_returns);
+
+        $logistic_number_returns = array_diff($logistic_number_returns, $order_issue_rejected_bill_logistic_number_returns);
+
+        $rejected_bill_logistic_number_return = $this->getExistRejectedBIllLogisticNumberReturn($logistic_number_returns);
+
+        return array_intersect($logistic_number_returns, $rejected_bill_logistic_number_return);
+    }
+
+}

+ 109 - 0
app/Services/OrderRejectingStatusService.php

@@ -0,0 +1,109 @@
+<?php
+
+namespace App\Services;
+
+use App\Commodity;
+use App\CommodityBarcode;
+use App\Order;
+use App\OrderDetail;
+use App\OrderIssueRejectedBill;
+use App\RejectedBill;
+use App\RejectedBillItem;
+
+class OrderRejectingStatusService
+{
+    //计算退回件问题
+    public function rejectedBillSyncRejectingStatus(RejectedBill $rejectedBill)
+    {
+        $query = OrderIssueRejectedBill::query()->select('order_id')->where('logistic_number_return',$rejectedBill->logistic_number_return);
+        $order = Order::query()->whereIn('id',$query)->first();
+        $this->syncRejectingStatus($order);
+    }
+
+    /**
+     * 订单同步退回状态
+     */
+    public function syncRejectingStatus($order)
+    {
+        if (!$order) return;
+        $rejecting_status = $this->getOrderRejectingStatus($order);
+
+        OrderDetail::query()->updateOrCreate(
+            ['order_id' => $order->id,],
+            ['rejecting_status' => $rejecting_status,'is_new_rejecting' => $rejecting_status === '无' ? '无' : '有']
+        );
+    }
+
+    public function getOrderRejectingStatus(Order $order): string
+    {
+        $rejected_bill_item_map = $this->getRejectedBillMaps($order);
+        $order_commodity_map = $this->getOrderCommodityMap($order);
+        return $this->computerRejectingStatus($rejected_bill_item_map, $order_commodity_map);
+    }
+
+    private function getRejectedBillItems(Order $order)
+    {
+        $query = OrderIssueRejectedBill::query()->select('logistic_number_return')->where('order_id', $order->id);
+        $query = RejectedBill::query()->select('id')->whereIn('logistic_number_return', $query);
+        return RejectedBillItem::query()->with('quality')->whereIn('id_rejected_bill', $query)->get();
+    }
+
+    private function getRejectedBillMaps($order): array
+    {
+        $rejected_bill_items = $this->getRejectedBillItems($order);
+        $map = [];
+        if(count($rejected_bill_items) == 0) return $map;
+        foreach ($rejected_bill_items as $item) {
+            $code = $item->barcode_goods;
+            $amount = $item->amount;
+            if (!Commodity::query()->where("sku", $code)->where('owner_id', $order->owner_id)->exists()) {
+                $query = CommodityBarcode::query()->select('commodity_id')->where('code', $code);
+                $commodity = Commodity::query()->where('owner_id', $order->owner_id)->whereIn('id', $query)->first();
+                if ($commodity) $code = $commodity->sku;
+            }
+            $quality_name = $item->quality->name;
+            if ($map[$code][$quality_name] ?? false) $map[$code][$quality_name] += $amount;
+            else $map[$code][$quality_name] = $amount;
+        }
+        return $map;
+    }
+
+    private function getOrderCommodityMap(Order $order): array
+    {
+        $map = [];
+        $order->packages->each(function ($package) use ($order, &$map) {
+            $package->commodities->map(function ($item) use ($order, &$map) {
+                $sku = $item->commodity->sku ?? null;
+                if ($sku) {
+                    $amount = $item->amount;
+                    empty($map[$sku]) ? $map[$sku] = $amount : $map[$sku] += $amount;
+                }
+            });
+        });
+        return $map;
+    }
+
+    private function computerRejectingStatus(array $rejected_bill_item_map, array $order_commodity_map): string
+    {
+        //未退回,差异退回,全部退回,超量退回,部分退回
+        if (count($rejected_bill_item_map) == 0) return "未退回";
+        $equal = 0;     // 相等sku
+        $portion = 0;   // 相等的sku
+        foreach ($rejected_bill_item_map as $key => $map) {
+            if (isset($map['残次']) && $map['残次'] > 0) return "差异退回";
+            if (empty($order_commodity_map[$key])) return "差异退回";
+            if (isset($map['正品']) && isset($order_commodity_map[$key])) {
+                if ($map['正品'] < $order_commodity_map[$key]) $portion += 1;
+                if ($map['正品'] > $order_commodity_map[$key]) return "超量退回";
+                if ($map['正品'] == $order_commodity_map[$key]) $equal += 1;
+            }
+        }
+        if ($equal == count($rejected_bill_item_map)
+            && $equal == count($rejected_bill_item_map)
+            && $portion == 0) return "全部退回";        // 全部退回
+        if ($portion > 0) return "部分退回";
+        if (count(array_diff_key($rejected_bill_item_map, $order_commodity_map)) > 0) return '部分退回';
+        if (count(array_diff_key($order_commodity_map, $rejected_bill_item_map)) > 0) return '差异退回';
+        return "无";
+    }
+}

+ 18 - 18
app/Services/RejectedBillService.php

@@ -46,26 +46,26 @@ class RejectedBillService
     {
         return RejectedBill::query()->create($params);
     }
+//
+//    /**
+//     * 连接问题件
+//     *
+//     * @param RejectedBill $rejectedBill
+//     */
+//    public function joinOrderIssue($rejectedBill)
+//    {
+//        $rejectedBill->joinOrderIssue();
+//    }
 
-    /**
-     * 连接问题件
-     *
-     * @param RejectedBill $rejectedBill
-     */
-    public function joinOrderIssue($rejectedBill)
-    {
-        $rejectedBill->joinOrderIssue();
-    }
 
-
-    /**
-     * 同步退回单号
-     * @param RejectedBill $rejectedBill
-     */
-    public function syncOrderIssue(RejectedBill $rejectedBill)
-    {
-        $rejectedBill->syncOrderIssue();
-    }
+//    /**
+//     * 同步退回单号
+//     * @param RejectedBill $rejectedBill
+//     */
+//    public function syncOrderIssue(RejectedBill $rejectedBill)
+//    {
+//        $rejectedBill->syncOrderIssue();
+//    }
 
     public function syncLoadedStatusByAsnHerder($asnHerders)
     {

+ 0 - 191
app/Services/RejectedBillSyncOrderService.php

@@ -1,191 +0,0 @@
-<?php
-
-namespace App\Services;
-
-use App\Commodity;
-use App\CommodityBarcode;
-use App\OracleDOCOrderHeader;
-use App\Order;
-use App\OrderIssue;
-use App\OrderIssueRejectedBill;
-use App\OrderPackage;
-use App\RejectedBill;
-use App\RejectedBillItem;
-use App\WorkOrder;
-
-class RejectedBillSyncOrderService
-{
-    public function syncRejectingStatusByReturnLogisticNumber($returnLogisticNumber){
-        /** @var RejectedBill $rejected_bill */
-        $rejected_bill = RejectedBill::query()->where('logistic_number_return',$returnLogisticNumber)->first();
-        if(!$rejected_bill) return;
-        $this->rejectedBillSyncOrderIssue($rejected_bill);
-        $this->syncRejectingStatus($rejected_bill);
-    }
-
-
-    public function syncRejectingStatus(RejectedBill $rejectedBill)
-    {
-        /** @var Order $order */
-        $order = $this->getCorrespondOrder($rejectedBill);
-        if(!$order) return;
-        $rejecting_status = $this->getOrderRejectingStatus($order);
-        $this->syncOrderRejectingStatus($order,$rejecting_status);
-    }
-
-    private function syncOrderRejectingStatus(Order $order,$rejecting_status){
-        OrderIssue::query()->where('order_id',$order->id)->update(['rejecting_status' => $rejecting_status,'is_new_rejecting' => 1]);
-        WorkOrder::query()->where('order_id',$order->id)->update(['rejecting_status' => $rejecting_status,'is_new_rejecting' => 1]);
-    }
-
-    public function orderIssueSyncRejectingStatus(OrderIssue $orderIssue){
-        $order = $orderIssue->order;
-        if (!$order) return;
-        $this->orderIssueSyncRejectedBills($orderIssue);
-        $rejecting_status = $this->getOrderRejectingStatus($order);
-        $this->syncOrderRejectingStatus($order,$rejecting_status);
-    }
-
-    public function getOrderRejectingStatus(Order $order): string
-    {
-        $rejected_bill_items = $this->getRejectedBillItems($order);
-        $rejected_bill_item_map = $this->getRejectedBillMaps($rejected_bill_items,$order);
-        $order_commodity_map = $this->getOrderCommodityMap($order);
-        return $this->computerRejectingStatus($rejected_bill_item_map,$order_commodity_map);
-    }
-
-    private function getCorrespondOrder(RejectedBill $rejectedBill)
-    {
-        return $this->getCorrespondOrderByRejectedBill($rejectedBill) ??
-            ($this->getCorrespondOrderByOrderIssueRejectedBill($rejectedBill) ??
-             $this->getCorrespondOrderByOracleOrderHeader($rejectedBill));
-    }
-
-    private function getCorrespondOrderByRejectedBill(RejectedBill $rejectedBill)
-    {
-        return Order::query()->with('packages.commodities.commodity')->whereHas('packages', function ($query) use ($rejectedBill) {
-            $query->where('logistic_number', $rejectedBill->logistic_number_return);
-        })->first();
-    }
-
-    private function getCorrespondOrderByOrderIssueRejectedBill(RejectedBill $rejectedBill)
-    {
-        if (!$rejectedBill) return null;
-        $order_issue_rejected_bill_query = OrderIssueRejectedBill::query()
-            ->select('order_issue_id')->where('logistic_number_return',$rejectedBill->logistic_number_return);
-        $order_issue_query = OrderIssue::query()
-            ->select('order_id')->whereIn('order_issue_id',$order_issue_rejected_bill_query);
-        return Order::query()->with('packages.commodities.commodity')->whereIn('id', $order_issue_query)->first();
-    }
-
-    private function getCorrespondOrderByOracleOrderHeader(RejectedBill $rejectedBill)
-    {
-        if (!$rejectedBill) return null;
-        $orderHeader = OracleDOCOrderHeader::query()->selectRaw('OrderNO')->where('SoReference1', function ($query) use ($rejectedBill) {
-            $query->select('AsnReference2')->from('DOC_ASN_HEADER')->where('AsnReference3', $rejectedBill->logistic_number_return)->first();
-        })->first();
-        if (!$orderHeader) return null;
-        return Order::query()->with('packages.commodities.commodity')->where('code', $orderHeader->orderno)->first();
-    }
-
-    private function getRejectedBillItems(Order $order)
-    {
-        $query = OrderIssue::query()->select('id')->where('order_id',$order->id);
-        $query = OrderIssueRejectedBill::query()->select('logistic_number_return')->whereIn('order_issue_id',$query);
-        $query = RejectedBill::query()->select('id')->whereIn('logistic_number_return',$query);
-        return RejectedBillItem::query()->with('quality')->whereIn('id_rejected_bill',$query)->get();
-    }
-
-    private function getRejectedBillMaps($rejectedBillItems,$order): array
-    {
-        $map = [];
-        if(!$rejectedBillItems) return $map;
-        foreach ($rejectedBillItems as $item) {
-            $code = $item->barcode_goods;
-            $amount = $item->amount;
-            if (!Commodity::query()->where("sku", $code)->where('owner_id',$order->owner_id)->exists()) {
-                $query = CommodityBarcode::query()->select('commodity_id')->where('code',$code);
-                $commodity = Commodity::query()->where('owner_id',$order->owner_id)->whereIn('id',$query)->first();
-                if ($commodity)$code = $commodity->sku;
-            }
-            $quality_name = $item->quality->name;
-            if($map[$code][$quality_name] ?? false) $map[$code][$quality_name] += $amount;
-            else $map[$code][$quality_name] = $amount;
-        }
-        return $map;
-    }
-
-    private function getOrderCommodityMap(Order $order): array
-    {
-        $map = [];
-        $order->packages->each(function ($package)use($order,&$map){
-            $package->commodities->map(function($item) use($order,&$map){
-                $sku = $item->commodity->sku ?? null;
-                if ($sku) {
-                    $amount = $item->amount;
-                    empty($map[$sku]) ?  $map[$sku] = $amount : $map[$sku]+=$amount ;
-                }
-            });
-        });
-        return $map;
-    }
-
-    private function computerRejectingStatus(array $rejected_bill_item_map, array $order_commodity_map):string
-    {
-        //未退回,差异退回,全部退回,超量退回,部分退回
-        if (count($rejected_bill_item_map) == 0) return "未退回";
-        $equal = 0;     // 相等sku
-        $portion = 0;   // 相等的sku
-        foreach ($rejected_bill_item_map as $key => $map) {
-            if (isset($map['残次']) && $map['残次'] > 0) return "差异退回";
-            if (empty($order_commodity_map[$key])) return "差异退回";
-            if(isset($map['正品']) && isset($order_commodity_map[$key])){
-                if ( $map['正品'] < $order_commodity_map[$key]) $portion += 1;
-                if ( $map['正品'] > $order_commodity_map[$key]) return "超量退回";
-                if ( $map['正品'] == $order_commodity_map[$key]) $equal += 1;
-            }
-        }
-        if ($equal == count($rejected_bill_item_map)
-            && $equal == count($rejected_bill_item_map)
-            && $portion == 0) return "全部退回";        // 全部退回
-        if ($portion > 0) return "部分退回";
-        if (count(array_diff_key($rejected_bill_item_map,$order_commodity_map)) > 0)return '部分退回';
-        if (count(array_diff_key($order_commodity_map,$rejected_bill_item_map)) > 0)return '差异退回';
-        return "无";
-    }
-
-
-    public function orderIssueSyncRejectedBills(OrderIssue $orderIssue)
-    {
-        $logistic_numbers = OrderPackage::query()->where('order_id',$orderIssue->order_id)->get()->map(function($item){
-            return $item->logistic_number;
-        })->toArray();
-
-        $rejected_bills = RejectedBill::query()->select('logistic_number_return')
-            ->whereIn('logistic_number_return',$logistic_numbers)
-            ->get()->map(function($item){
-                return $item->logistic_number_return;
-            })->toArray();
-        if(count($rejected_bills) === 0) return;
-
-        $order_issue_rejected_bills = OrderIssueRejectedBill::query()->where('order_issue_id',$orderIssue->id)->get()->map(function ($item){
-            return $item->logistic_number_return;
-        })->toArray();
-
-        $insert_param = array_map(function($item)use($orderIssue){
-            return ['order_issue_id' => $orderIssue->id,'logistic_number_return' => $item];
-        },array_diff($rejected_bills,$order_issue_rejected_bills));
-
-        OrderIssueRejectedBill::query()->insert($insert_param);
-    }
-
-    public function rejectedBillSyncOrderIssue(RejectedBill $rejectedBill){
-        $reaction_exists = OrderIssueRejectedBill::query()->where('logistic_number_return',$rejectedBill->logistic_number_return)->exists();
-        if ($reaction_exists) return;
-        $query = Order::query()->select('id')->whereHas('packages',function($query)use($rejectedBill){
-            $query->where('logistic_number',$rejectedBill->logistic_number_return);
-        });
-        $order_issue = OrderIssue::query()->whereIn('order_id',$query)->first();
-        OrderIssueRejectedBill::query()->create(['order_issue_id' => $order_issue->id,'logistic_number_return' => $rejectedBill->logistic_number_return]);
-    }
-}

+ 17 - 17
app/Services/RejectedService.php

@@ -160,23 +160,23 @@ class RejectedService
         return $rejectedBills;
     }
 
-    public function syncOrderIssue($rejectedBillId)
-    {
-        $rejectedBIll = RejectedBill::where('id', $rejectedBillId)->first();
-        $ASNHeader = OracleDOCASNHeader::where('asnreference3', $rejectedBIll->logistic_number_return)->first();
-        if (!$ASNHeader) {
-            return;
-        }
-        $orderHeader = OracleDOCOrderHeader::where('soreference1', $ASNHeader->asnreference2)->first();
-        if (!$orderHeader) {
-            return;
-        }
-        $order = app("OrderService")->first(['code'=>$orderHeader->orderno]);
-        if (!$order) {
-            return;
-        }
-        OrderIssue::where('order_id', $order->id)->where('is_new_rejecting', '<>', 2)->update('is_new_rejecting', 2);
-    }
+    //    public function syncOrderIssue($rejectedBillId)
+//    {
+//        $rejectedBIll = RejectedBill::where('id', $rejectedBillId)->first();
+//        $ASNHeader = OracleDOCASNHeader::where('asnreference3', $rejectedBIll->logistic_number_return)->first();
+//        if (!$ASNHeader) {
+//            return;
+//        }
+//        $orderHeader = OracleDOCOrderHeader::where('soreference1', $ASNHeader->asnreference2)->first();
+//        if (!$orderHeader) {
+//            return;
+//        }
+//        $order = app("OrderService")->first(['code'=>$orderHeader->orderno]);
+//        if (!$order) {
+//            return;
+//        }
+//        OrderIssue::where('order_id', $order->id)->where('is_new_rejecting', '<>', 2)->update('is_new_rejecting', 2);
+//    }
 
     public function getRejectedByClientNo($clientNo){
         $orderHeader = OracleDOCOrderHeader::where('SOREFERENCE1',$clientNo)->first();

+ 6 - 1
app/WorkOrder.php

@@ -229,6 +229,11 @@ class WorkOrder extends Model
         return $this->hasMany(WorkOrderDetail::class);
     }
 
+    public function orderDetail(): BelongsTo
+    {
+        return $this->belongsTo(OrderDetail::class,'order_id','order_id');
+    }
+
     public function scopeFilter($query, $filters)
     {
         return $filters->apply($query);
@@ -242,7 +247,7 @@ class WorkOrder extends Model
 
     public function defaultWith(): array
     {
-        return ['owner', 'logistic', 'issueType', 'creator', 'lastHandler', 'details' => function ($query) {
+        return ['owner', 'logistic', 'issueType', 'creator', 'lastHandler','orderDetail', 'details' => function ($query) {
             return $query->with(['commodities.commodity', 'logs' => function ($query) {
                 return $query->with('creator')->orderByDesc('created_at');
             }, 'images.uploadFile', 'issueType', 'processLogs' => function ($query) {

+ 12 - 0
database/factories/OrderDetailFactory.php

@@ -0,0 +1,12 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\OrderDetail;
+use Faker\Generator as Faker;
+
+$factory->define(OrderDetail::class, function (Faker $faker) {
+    return [
+        //
+    ];
+});

+ 44 - 0
database/migrations/2022_01_17_133350_create_order_details_table.php

@@ -0,0 +1,44 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateOrderDetailsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('order_details', function (Blueprint $table) {
+            $table->id();
+            $table->bigInteger('order_id')->unique()->comment('订单');
+            $table->enum('is_new_rejecting',['无', '有', '已处理']);
+            $table->enum('rejecting_status',['无', '未退回', '全部退回', '部分退回', '差异退回', '超量退回'])->comment('退回状态');
+            $table->timestamps();
+        });
+
+        Schema::table('order_issue_rejected_bill',function (Blueprint $table) {
+            $table->bigInteger('order_id')->index()->nullable()->comment('订单');
+            $table->bigInteger('order_issue_id')->nullable()->change();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('order_details');
+
+        Schema::table('order_issue_rejected_bill',function (Blueprint $table) {
+            $table->dropColumn('order_id');
+            $table->bigInteger('order_issue_id')->nullable(false)->change();
+        });
+    }
+}

+ 16 - 0
database/seeds/OrderDetailSeeder.php

@@ -0,0 +1,16 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class OrderDetailSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        //
+    }
+}

+ 50 - 14
resources/views/order/issue/index.blade.php

@@ -317,7 +317,8 @@
                             <td class="child-layer-1">
                                 @can('订单管理-问题件-编辑')
                                     <button type="button" class="btn btn-sm btn-outline-secondary"
-                                            v-if="orderIssue.is_new_rejecting === '有'"
+                                            v-show="orderIssue.order_detail"
+                                            v-if="orderIssue.order_detail && orderIssue.order_detail.is_new_rejecting === '有'"
                                             @click="disposeOrderIssue(orderIssue)">有
                                     </button>
                                     <span v-else v-text="orderIssue.is_new_rejecting"></span>
@@ -350,14 +351,14 @@
                                 @can('订单管理-问题件-编辑')
                                     <label>
                                         <select class="form-control form-control-sm"
-                                                :value="orderIssue.rejecting_status"
-                                                @change="updateOrderIssue(orderIssue,'rejecting_status',$event)">
+                                                :value="orderIssue.order_detail ? orderIssue.order_detail.rejecting_status : ''"
+                                                @change="updateRejectingStatus(orderIssue,$event,index)">
                                             <option v-for="item in rejectingStatus" :value="item.name"
                                                     v-text="item.value"></option>
                                         </select>
                                     </label>
                                 @else
-                                    <span v-text="orderIssue.rejecting_status"></span>
+                                    <span v-text="orderIssue.order_detail ? orderIssue.order_detail.rejecting_status : ''"></span>
                                 @endcan
                             </td>
                         @endcannot
@@ -1731,19 +1732,19 @@
                     tempTip.show('没有勾选订单');
                 },
                 disposeOrderIssue(orderIssue) {
-                    let data = {id: orderIssue.id};
-                    axios.post('{{url('apiLocal/order/issue/disposeOrderIssue')}}', data).then(function (res) {
+                    let url = "{{route('order.detail.disposeApi')}}";
+                    let data = {order_id: orderIssue.order_id};
+                    axios.post(url, data).then(res=> {
                         if (res.data.success) {
-                            orderIssue.is_new_rejecting = '已处理'
-                            tempTip.setDuration(3000);
-                            tempTip.showSuccess('订单已处理');
+                            this.successTempTip('处理完成');
+                            orderIssue.order_detail = res.data.data;
                             return;
                         }
-                        tempTip.setDuration(3000);
-                        tempTip.show(res.data.fail_info);
-                    }).catch(function (err) {
+                        this.errorTempTip(res.data.message ? res.data.message : '处理异常,刷新页面后再操作');
+                    }).catch(err=> {
+                        console.log(err);
                         tempTip.setDuration(4000);
-                        tempTip.show('网路链接异常' + err);
+                        this.errorTempTip(err);
                     });
                 },
                 endOrderIssueById(id) {
@@ -2465,7 +2466,42 @@
                     }).catch(err=>{
                         window.tempTip.cancelWaitingTip();
                         window.tempTip.show("修改异常");
-                    });                }
+                    });
+                },
+                updateRejectingStatus(item,e,index){
+                    let url = "{{route('order.detail.updateApi')}}";
+                    let data = {
+                        order_id:item.order_id,
+                        rejecting_status:$(e.target).val(),
+                    }
+                    window.tempTip.waitingTip('处理中');
+                    window.axios.post(url,data).then(res=>{
+                        window.tempTip.cancelWaitingTip();
+                        if (res.data.success){
+                            this.successTempTip('处理完成');
+                            this.$set(this.orderIssues[index],'order_detail',res.data.data);
+                            return ;
+                        }
+                        this.errorTempTip(res.data.message ? res.data.message : '处理异常刷新后重试');
+                    }).catch(err=>{
+                        window.tempTip.cancelWaitingTip();
+                        this.errorTempTip(err);
+                    });
+                },
+                waitingTempTip(message) {
+                    window.tempTip.setIndex(2005);
+                    window.tempTip.waitingTip(message);
+                },
+                successTempTip(message) {
+                    window.tempTip.setDuration(1500);
+                    window.tempTip.setIndex(2005);
+                    window.tempTip.showSuccess(message);
+                },
+                errorTempTip(message) {
+                    window.tempTip.setDuration(2000);
+                    window.tempTip.setIndex(2005);
+                    window.tempTip.show(message);
+                },
             },
             filters: {
                 date: function (value) {

+ 2 - 1
resources/views/order/workOrder/index.blade.php

@@ -76,7 +76,8 @@
                                     <span v-show="isLogisticHandler(item)" class="badge badge-success">承</span>
                                     <span v-show="item.is_new_rejecting ==='回库'" class="badge badge-danger">退</span>
                                     <br>
-                                    <span class="badge badge-info" v-show="item.rejecting_status!=='无'" v-text="item.rejecting_status"></span>
+                                    <span class="badge badge-info" v-show="item.order_detail"
+                                          v-text="item.order_detail ? item.order_detail.rejecting_status : ''"></span>
                                 </td>
                                 <td>
                                     <span v-text="item.id"></span>

+ 5 - 0
routes/apiLocal.php

@@ -147,6 +147,11 @@ Route::group(['prefix' => 'order'], function () {
         Route::any('updateStatus','OrderTrackingOwnerController@updateStatusApi');
     });
 
+    Route::prefix('detail')->group(function(){
+        Route::post('/','OrderDetailController@updateApi')->name('order.detail.updateApi');
+        Route::post('/dispose','OrderDetailController@disposeApi')->name('order.detail.disposeApi');
+    });
+
 });
 
 Route::group(['prefix'=>'maintenance'],function (){