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

Merge branch 'order_issue_rejected_bill' into zengjun

# Conflicts:
#	app/Http/Controllers/TestController.php
#	resources/views/order/issue/index.blade.php
ajun 5 лет назад
Родитель
Сommit
bb1099ccca

+ 19 - 10
app/Http/Controllers/OrderIssueController.php

@@ -24,6 +24,7 @@ use Illuminate\Http\Request;
 use Illuminate\Support\Arr;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Gate;
 use Illuminate\Support\Facades\Http;
 use Illuminate\Support\Facades\Validator;
@@ -209,7 +210,7 @@ class OrderIssueController extends Controller
             ]);
             $orderIssue = OrderIssue::query()->find($request->id);
             $orderIssue->update($data);
-            $orderIssue->同步退单状态();
+            $orderIssue->syncRejectingStatus();
             app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request));
             return  ['success' => true];
         } catch (Exception $e) {
@@ -636,18 +637,25 @@ class OrderIssueController extends Controller
                     $order_sku_amount.= ($commodities->amount ?? '').",\r\n";
                 });
             });
-            $rejected_logistic_number = $order_issue->rejectedBill->logistic_number_return ?? '';
+            $rejected_logistic_number = '';
 
             $rejected_Bill_remark = '';
             $rejected_is_checked = '';
             $rejected_name = ''; $rejected_barcode = '';$rejected_amount = '';
-            if($order_issue->rejectedBill){
-                $order_issue->rejectedBill->items->each(function($item)use(&$rejected_name,&$rejected_barcode, &$rejected_amount,&$rejected_Bill_remark,&$rejected_is_checked){
-                    $rejected_name.= $item->name_goods.",\r\n";
-                    $rejected_barcode.= $item->barcode_goods.",\r\n";
-                    $rejected_amount.= $item->amount.",\r\n";
-                    $rejected_Bill_remark.= $item->remark.",\r\n";
-                    $rejected_is_checked.= $item->quality->name.",\r\n";
+            if($order_issue->rejectedBills){
+                $order_issue->rejectedBills->each(function($rejectedBill)use(
+                    &$rejected_name,&$rejected_barcode, &$rejected_amount,&$rejected_Bill_remark,&$rejected_is_checked,&$rejected_logistic_number
+                    ) {
+                    $rejected_logistic_number.=$rejectedBill->logistic_number_return . ",\r\n";
+                    $rejectedBill->items->each(function($item)use(
+                        &$rejected_name,&$rejected_barcode, &$rejected_amount,&$rejected_Bill_remark,&$rejected_is_checked
+                    ){
+                        $rejected_name.= $item->name_goods.",\r\n";
+                        $rejected_barcode.= $item->barcode_goods.",\r\n";
+                        $rejected_amount.= $item->amount.",\r\n";
+                        $rejected_Bill_remark.= $item->remark.",\r\n";
+                        $rejected_is_checked.= $item->quality->name.",\r\n";
+                    });
                 });
             }
             $log_type = ''; $log_content = '';$log_user = '';
@@ -687,7 +695,7 @@ class OrderIssueController extends Controller
                 rtrim($order_sku_amount,",\r\n"),              //原始商品数量
 
                 //,'退单商品名','退单商品条码','退单商品数量','退单状态','退单备注'
-                $rejected_logistic_number,                      //退回单号
+                rtrim($rejected_logistic_number,",\r\n"),                      //退回单号
                 rtrim($rejected_name,",\r\n"),        // 退单商品名
                 rtrim($rejected_barcode,",\r\n") ,    // 退单商品条码
                 rtrim($rejected_amount,",\r\n"),      // 退单商品数量
@@ -785,4 +793,5 @@ class OrderIssueController extends Controller
         });
         return ['success' =>true];
     }
+
 }

+ 11 - 20
app/Http/Controllers/OrderIssueOnTopController.php

@@ -38,29 +38,20 @@ class OrderIssueOnTopController extends Controller
     }
 
     public function apiDestroy(Request $request){
-        if (!Gate::allows('订单管理-问题件-置顶')) {
-            ['success' => false, 'fail_info' => '没有对应权限'];
-        }
-        if (!$request->has('id')) {
-            return ['success' => false, 'fail_info' => '没有传入对应的id'];
-        }
-        OrderIssueOnTop::where('id', $request->input('id'))->delete();
-        return ['success' => true];
+        if (!Gate::allows('订单管理-问题件-置顶')) ['success' => false, 'fail_info' => '没有对应权限'];
+        if (!$request->has('id'))return ['success' => false, 'fail_info' => '没有传入对应的id'];
+
+        return ['success' => OrderIssueOnTop::query()->where('id', $request->input('id'))->delete()];
     }
 
     public function apiStore(Request $request){
-        if (!Gate::allows('订单管理-问题件-置顶')) {
-            return ['success' => false, 'fail_info' => '没有对应权限'];
-        }
-        if (!$request->filled('id')) {
-            return ['success' => false, 'fail_info' => '没有传入对应参数'];
-        } else if (!$request->filled('remark')) {
-            return ['success' => false, 'fail_info' => '没有写入备注'];
-        }
-        $orderIssueOnTop = OrderIssueOnTop::create(['order_issue_id' => $request->input('id'), 'remark' => $request->input('remark')]);
-        if ($orderIssueOnTop) {
-            return ['success' => true];
-        }
+        if (!Gate::allows('订单管理-问题件-置顶')) return ['success' => false, 'fail_info' => '没有对应权限'];
+        if (!$request->filled('id')) return ['success' => false, 'fail_info' => '没有传入对应参数'];
+        if (!$request->filled('remark')) return ['success' => false, 'fail_info' => '没有写入备注'];
+
+        $orderIssueOnTop = OrderIssueOnTop::query()->create(['order_issue_id' => $request->input('id'), 'remark' => $request->input('remark')]);
+        if ($orderIssueOnTop) return ['success' => true,'data'=>$orderIssueOnTop];
+
         return ['success' => false, 'fail_info' => '置顶失败'];
     }
 }

+ 50 - 0
app/Http/Controllers/OrderIssueRejectedBillController.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\OrderIssue;
+use App\Services\OrderIssueRejectedBillService;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Gate;
+
+class OrderIssueRejectedBillController extends Controller
+{
+    public function joinRejectedBillApi(Request $request)
+    {
+        if (!Gate::allows('订单管理-问题件-编辑')) return ['success'=>false,'error'=>'没有对应权限'];
+        if(!$request->has('logistic_number_return'))return ['success' => false,'error'=>'参数为空'];
+        /** @var OrderIssue $orderIssue */
+        $orderIssue = OrderIssue::query()->find($request['id']);
+        if(!$orderIssue)return ['success' =>false,'error'=>'参数为空'];
+        $result =  app(OrderIssueRejectedBillService::class)->joinRejectedBill($orderIssue,$request['logistic_number_return']);
+        if(is_null($result))return ['success' => false,'error' => '已有对应的关联关系'];
+        if(!$result)return ['success' => false,'error' => '创建关联关系时出现异常'];
+        return ['success' => true,'data' => ['orderIssueRejectedBill' => $result,'orderIssue' => $orderIssue]];
+    }
+
+    public function unJoinRejectedBillApi(Request $request)
+    {
+        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 =  app(OrderIssueRejectedBillService::class)->unJoinRejectedBill($orderIssue,$request['logistic_number_return']);
+        if(is_null($result))return ['success' => false,'message' => '没有相对应的连接关系!请刷新页面后重试'];
+        return ['success' => true , 'orderIssue' => $orderIssue];
+    }
+
+    public function reviseJoinRejectedBillApi(Request $request)
+    {
+        if (!Gate::allows('订单管理-问题件-编辑')) return ['success'=>false,'error'=>'没有对应权限'];
+        if (!$request->has('logistic_number_return_update'))
+            return ['success' => false,'error' => '退回单号为空'];
+        /** @var OrderIssue $orderIssue */
+        $orderIssue = OrderIssue::query()->where('id',$request->id)->first();
+        if(!$orderIssue)return ['success' => false,'error' => '没有找到对应的记录'];
+        $result = app(OrderIssueRejectedBillService::class)->unJoinRejectedBill($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]];
+    }
+}

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

@@ -96,9 +96,8 @@ class RejectedBillController extends Controller
         $rejectedBill=new RejectedBill($request->all());
         $rejectedBill['id_operator'] = Auth::user()['id'];
         $rejectedBill->save();
+        $rejectedBill->syncOrderIssue();
         app(RejectedBillService::class)->syncOrderIssue($rejectedBill);
-//        $rejectedBill->同步问题件退件状态();
-
         app('LogService')->log(__METHOD__,__FUNCTION__.'_'.$rejectedBill['id'],json_encode($request->toArray()),Auth::user()['id']);
         return ['success'=>'true','id'=>$rejectedBill['id']];
     }
@@ -118,9 +117,7 @@ class RejectedBillController extends Controller
         $rejectedBill=RejectedBill::find($request->input('id'));
         $rejectedBill->fill($request->all());
         $rejectedBill->save();
-        app(RejectedBillService::class)->syncOrderIssue($rejectedBill);
-//        $rejectedBill->同步问题件退件状态();
-
+        $rejectedBill->syncOrderIssue();
         app('LogService')->log(__METHOD__,__FUNCTION__.'_'.$rejectedBill['id'],json_encode($request->toArray()),Auth::user()['id']);
         return ['success'=>'true'];
     }
@@ -406,8 +403,9 @@ class RejectedBillController extends Controller
                 $rejectedBillItemService->insert($inner_items_params);
                 LogService::log(__METHOD__, "批量生成退货单详情", json_encode($inner_items_params), Auth::user()['id']);
             }
-            $rejectedBill_collect->each(function ($rejectedBill)use($service){
-                $service->syncOrderIssue($rejectedBill);
+            $rejectedBill_collect->each(function ($rejectedBill){
+                /** @var RejectedBill $rejectedBill */
+                $rejectedBill->syncOrderIssue();
             });
             return ['success'=>true];
         } catch (\Exception $e) {

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

@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
 
 use App\Commodity;
 use App\Events\InformWMSReceivedEvent;
+use App\OrderIssue;
 use App\Owner;
 use App\RejectedBill;
 use App\RejectedBillItem;
@@ -95,9 +96,7 @@ class RejectedBillItemController extends Controller
 
 
         $rejectedBill = RejectedBill::query()->where('id',$request->input('id_rejected_bill'))->first();
-        app(RejectedBillService::class)->syncOrderIssue($rejectedBill);
-//        $rejectedBIll->同步问题件();
-//        $rejectedBIll->同步问题件退件状态();
+        $rejectedBill->syncOrderIssue();     // 同步问题件 修改问题件退货状态
         app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
         return ['success'=>'true','id'=>$rejectedBillItem['id']];
     }
@@ -118,9 +117,9 @@ class RejectedBillItemController extends Controller
             $rejectedBillItem->fill($request->all());
             $rejectedBillItem->update();
             //$rejectedBillItem->injectCommodityName();  Haozi 2020-12-09
-            $rejectedBill = RejectedBill::query()->where('id',$rejectedBillItem->id_rejected_bill)->with('orderIssue')->first();
-//            $rejectedBill->同步问题件退件状态();
-            app(RejectedBillService::class)->syncOrderIssue($rejectedBill);
+            /** @var RejectedBill $rejectedBill */
+            $rejectedBill = RejectedBill::query()->where('id',$rejectedBillItem->id_rejected_bill)->first();
+            $rejectedBill->syncOrderIssue(); // 同步问题件 修改问题件退货状态
             app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
             return ['success'=>'true','id'=>$rejectedBillItem['id']];
         }
@@ -179,8 +178,7 @@ class RejectedBillItemController extends Controller
         }
         $item=$rejectedBillItems->first();
         $rejectedBill = RejectedBill::query()->find($item['id_rejected_bill']);
-        app(RejectedBillService::class)->syncOrderIssue($rejectedBill);
-//        $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);

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

@@ -1409,6 +1409,26 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         $service->clearCancelledOrderTask();
     }
 
+    public function processOrderIssueRejectedBill()
+    {
+        OrderIssue::query()->withTrashed()->whereNotNull('logistic_number_return')->chunkById(200,function($orderIssues){
+            $orderIssues->each(function($orderIssue){
+                if($orderIssue->logistic_number_return)
+                    $orderIssue->rejectedBills()->syncWithoutDetaching([trim($orderIssue->logistic_number_return)]);
+            });
+        });
+    }
+
+    public function testOrderIssueQuery()
+    {
+        $orderIssue = OrderIssue::query()->first();
+        $orderIssue->rejectedBills()->attach('200706000001');
+        $orderIssue->rejectedBills()->attach('200706000002');
+        $orderIssue->rejectedBills()->attach('200706000003');
+        $orderIssue->rejectedBills()->attach('200706000004');
+
+    }
+
     public function orderTrackingUpdate()
     {
         // 修改【安桥,锐活】 订单号

+ 5 - 1
app/Imports/OrderIssueImport.php

@@ -103,8 +103,12 @@ class OrderIssueImport implements ToCollection, WithHeadingRow, WithMultipleShee
                 if ($rejectedBill) {
                     $arr['rejected_bill_id'] = $rejectedBill['id'];
                 }
+
+                /** @var OrderIssue $orderIssue */
                 $orderIssue = OrderIssue::query()->create($arr);
-                $orderIssue->同步退单状态();
+                $orderIssue->syncRejectedBills();
+                $orderIssue->syncRejectingStatus();
+
                 if ($orderIssue) {
                     array_push($exception, ['订单' . $row['原始运单号'] . '问题件创建成功!']);
                     OrderIssueProcessLog::query()->create(['order_issue_id' => $orderIssue['id'], 'user_id' => Auth::user()['id'], 'content' => '', 'type' => '创建']);

+ 2 - 0
app/Imports/RejectedImport.php

@@ -80,6 +80,7 @@ class RejectedImport implements ToCollection, WithHeadingRow
                     ]);
                     $item->save();
                 }
+                $bill->syncOrderIssue();
             }else{
                 $bill=new RejectedBill([
                     'id_owner'=>$id_owner,
@@ -89,6 +90,7 @@ class RejectedImport implements ToCollection, WithHeadingRow
                     'is_loaded'=>0,
                 ]);
                 $bill->save();
+                $bill->syncOrderIssue();
                 $item=RejectedBillItem::where('id_rejected_bill',$bill['id'])
                     ->where('barcode_goods',trim($barcode))->where('id_quality_label',$id_quality_label)->first();
                 if($item){

+ 3 - 3
app/Order.php

@@ -29,9 +29,9 @@ class Order extends Model
      */
 
     protected $appends = [
-        'logisticNumbers',
-        'amount',
-        'commodityPackages'
+//        'logisticNumbers',
+//        'amount',
+//        'commodityPackages'
     ];
     public function cancel(){
         $this['status'] = '取消';

+ 148 - 23
app/OrderIssue.php

@@ -39,23 +39,21 @@ class OrderIssue extends Model
      * finance_confirm 财务确认
      * hidden_tag 隐藏标识
      */
-    protected $appends = [
-//        'secondLogisticNumber',
-//        'createLog',
-//        'endLog',
-//        'processingTime',
-//        'createUser',
-//        'endUser',
-    ];
+    protected $appends = [];
 
     public function order()
     {
         return $this->belongsTo(Order::class, 'order_id', 'id');
     }
 
-    public function rejectedBill()
+    public function rejectedBills()
     {
-        return $this->belongsTo(RejectedBill::class, 'logistic_number_return', 'logistic_number_return');
+        return $this->belongsToMany(RejectedBill::class,'order_issue_rejected_bill','order_issue_id','logistic_number_return','id','logistic_number_return');
+    }
+
+    public function orderIssueRejectedBills()
+    {
+        return $this->hasMany(OrderIssueRejectedBill::class);
     }
 
     public function issueType()
@@ -83,11 +81,6 @@ class OrderIssue extends Model
         return $this->hasOne('App\Order', 'client_code', 'second_client_no');
     }
 
-//    public function getSecondLogisticNumberAttribute()
-//    {
-//        return $this['secondOrder']['code'] ?? '';
-//    }
-
     public function getCreateLogAttribute()
     {
         return $this->logs->where('type', '创建')->first();
@@ -217,7 +210,109 @@ class OrderIssue extends Model
             $this->update(['rejecting_status' => '差异退回']);
     }
 
+    /**
+     * 同步退货状态
+     */
+    public function syncRejectingStatus()
+    {
+        if(!$this->order_id)return;
+        $rejectedItems = [];
+        $orderItems = [];
+        $rejectedBills = $this->rejectedBills;
+        if(!$rejectedBills)return;
+        $rejectedBillItems = RejectedBillItem::query()->with('quality')
+            ->whereIn('id_rejected_bill',function($query)use($rejectedBills){
+                $query->from('rejected_bills')->select('id')->whereIn('logistic_number_return',$rejectedBills->map(function($rejectedBil){
+                    return $rejectedBil->logistic_number_return;
+                }));
+        })->get();
 
+        if($rejectedBillItems->count()===0){
+            $this->update(['rejecting_status' => '未退回']);
+            return;
+        }
+
+        if($rejectedBillItems->where('quality.name','残次')->count()>0){
+            $this->update(['rejecting_status' => '差异退回']);
+            return;
+        }
+        $barcodeGoods = data_get($rejectedBillItems,'*.barcode_goods');
+        $commodityBarcodes = CommodityBarcode::query()->with('commodity')->whereIn('code',$barcodeGoods)->get();
+        $commodities = Commodity::query()->whereIn('sku',$barcodeGoods)->get();
+
+        foreach ($rejectedBillItems as $item) {
+            $barcode_goods = (string)$item->barcode_goods;
+            $commodity = $commodities->where('sku',$barcode_goods)->first();
+            if(!$commodity){
+                $commodityBarcode = $commodityBarcodes->where('code',$barcode_goods)->first();
+                $barcode_goods = $commodityBarcode->commodity->sku ?? $barcode_goods;
+            }
+            if (!isset($rejectedItems[$barcode_goods])){
+                $rejectedItems[$barcode_goods] = 0;
+            }
+            $rejectedItems[(string)$barcode_goods] += $item->amount;
+        }
+
+        $items = OrderPackageCommodities::query()->with('commodity')
+            ->whereIn('order_package_id',function($query){
+                $query->from('order_packages')->selectRaw('id')->where('order_id',$this->order_id);
+            })->get();
+
+        if(count($items) == 0){
+            $this->update(['rejecting_status' => '无']);
+            return;
+        }
+        if (count($items) > 0) {
+            foreach ($items as $item) {
+                $sku = $item['commodity']['sku'];
+                if (! isset($orderItems[$sku]) ?? false){
+                    $orderItems[$sku] = 0;
+                }
+                $orderItems[$sku] += $item->amount;
+            }
+        } else {
+            $this->update(['rejecting_status' => '无']);
+            return;
+        }
+        $rejectedExcess = 0;    // 退回差异
+        $rejectedReview = 0;    // 退回复核  $rejectedItems == $orderItems
+        foreach ($rejectedItems as $key => $items) {
+            if ($orderItems[$key] ?? false) {
+                if ($rejectedItems[$key] == $orderItems[$key])
+                    $rejectedReview++;
+            } else
+                $rejectedExcess++;
+        }
+        if ($rejectedExcess > 0) {
+            $this->update(['rejecting_status' => '差异退回']);
+            return;
+        }
+        // 全部退回 部分退回 超量退回 差异退回 未退回 无
+        $isExcess = 0; // 超量 $orderItems < $rejectedItems
+        $isDiff = 0;   // 部分 $orderItems > $rejectedItems
+        $isAccord = 0; // 相同 $orderItems == $rejectedItems
+        $isLack = 0;   // 缺少 $orderItems != $rejectedItems
+        foreach ($orderItems as $key => $item) {
+            if ($rejectedItems[$key] ?? false) {
+                if ($orderItems[$key] < $rejectedItems[$key])
+                    $isExcess++;
+                else if ($orderItems[$key] > $rejectedItems[$key])
+                    $isDiff++;
+                else if ($orderItems[$key] == $rejectedItems[$key])
+                    $isAccord++;
+            } else
+                $isLack++;
+        }
+
+        if($isAccord == $rejectedReview && $isLack == 0 && $isExcess == 0 && $isDiff==0 && $rejectedExcess == 0 )
+            $this->update(['rejecting_status' => '全部退回']);
+        else if($isExcess > 0 && $isAccord ==  $rejectedReview && $isDiff == 0 && $isLack == 0)
+            $this->update(['rejecting_status' => '超量退回']);
+        else if($isDiff >=0 && $isAccord == $rejectedReview && $isLack >=0 && $rejectedExcess ==0 && $isExcess==0)
+            $this->update(['rejecting_status' => '部分退回']);
+        else if($isLack >= 0 && $rejectedExcess>=0 && $isDiff>=0 && $isLack>=0 && $isExcess>=0 && $rejectedReview>=0)
+            $this->update(['rejecting_status' => '差异退回']);
+    }
 
     public function delete()
     {
@@ -231,16 +326,46 @@ class OrderIssue extends Model
         return parent::delete();
     }
 
-
-    // 同步退回单
-    public function syncRejectedBill()
+    /**
+     * 同步退货单号
+     */
+    public function syncRejectedBills()
     {
-        if(!isset($this['logistic_number_return'])){
-            $order = $this->order;
-            $rejectedBill = RejectedBill::query()->where('logistic_number','like','原单退回'.'%')->where('order_number',$order->client_code)->whereNotNull('order_number')->first();
-            if($rejectedBill){
-                $this->update(['logistic_number_return'=>$rejectedBill->logistic_number_return,'is_new_rejecting'=>'有']);
+        $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);
+                    $this->is_new_rejecting = '有';
+                }
             }
+            $this->save();
+        }
+    }
+
+    /**
+     * @param array|string $logistic_number
+     * @return array|void
+     */
+    public function joinRejectedBill($logistic_number)
+    {
+        if(!$logistic_number)return null;
+        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]);
     }
 }

+ 31 - 0
app/OrderIssueRejectedBill.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+
+use App\Traits\LogModelChanging;
+
+class OrderIssueRejectedBill extends Model
+{
+    use LogModelChanging;
+    protected $table='order_issue_rejected_bill';
+    protected $fillable = [
+        'order_issue_id','logistic_number_return'
+    ];
+
+    public function orderIssue()
+    {
+        return $this->belongsTo(OrderIssue::class,'order_issue_id','id');
+    }
+
+    public function rejectedBill()
+    {
+        return $this->belongsTo(RejectedBill::class,'logistic_number_return','logistic_number_return');
+    }
+
+    public static function isExit($order_issue_id,$logistic_number_return)
+    {
+        return OrderIssueRejectedBill::query()->where('order_issue_id',$order_issue_id)->where('logistic_number_return',$logistic_number_return)->exists();
+    }
+}

+ 2 - 0
app/Providers/AppServiceProvider.php

@@ -33,6 +33,7 @@ use App\Services\InventoryDailyLogService;
 use App\Services\LogisticService;
 use App\Services\OracleActAllocationDetailService;
 use App\Services\OrderIssueProcessLogService;
+use App\Services\OrderIssueRejectedBillService;
 use App\Services\OrderIssueService;
 use App\Services\OrderPackageService;
 use App\Services\OrderService;
@@ -154,6 +155,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('OrderIssueProcessLogService',OrderIssueProcessLogService::class);
         app()->singleton('OrderCommodityService',OrderCommodityService::class);
         app()->singleton('OrderCommodityAssignService',OrderCommodityAssignService::class);
+        app()->singleton('OrderIssueRejectedBillService',OrderIssueRejectedBillService::class);
         app()->singleton('OrderIssuePerformanceService',OrderIssuePerformanceService::class);
         app()->singleton('OrderIssueService',OrderIssueService::class);
         app()->singleton('OrderIssueWorkLoadService',OrderIssueWorkLoadService::class);

+ 42 - 47
app/RejectedBill.php

@@ -63,9 +63,16 @@ class RejectedBill extends Model
     function wmsReflectReceive(){
         return $this->belongsTo('App\WMSReflectReceive','id','id_rejected_bill');
     }
-    function orderIssue(){
-        return $this->hasOne( OrderIssue::class, 'logistic_number_return', 'logistic_number_return');
+
+    function orderIssue()
+    {
+        return $this->hasOneThrough(OrderIssue::class,OrderIssueRejectedBill::class,'logistic_number_return','id','logistic_number_return','order_issue_id');
+    }
+
+    function orderIssueRejectedBill(){
+        return $this->hasOne(OrderIssueRejectedBill::class,'logistic_number_return','logistic_number_return');
     }
+
     function setIsLoaded_toWaitConfirm(){
         if(config('api.jianshang_rejecteds_log_switch'))Controller::logS(__METHOD__,__FUNCTION__,"将待推单修改为待确认! 退单号:".$this['logistic_number_return'],Auth::user()['id']);
         $bill=RejectedBill::find($this['id']);
@@ -151,56 +158,44 @@ class RejectedBill extends Model
         return $this['is_loaded'];
     }
 
-    public function 同步问题件退件状态()
+    public function delete()
     {
-        $orderIssue = $this->orderIssue()->first();
-        if ($orderIssue ?? false) {
-//            $this->同步退单状态();
-            $orderIssue->update(['is_new_rejecting' => '有']);
-        } else {
-            OrderIssue::query()->where('logistic_number_return', $this->logistic_number_return)->update(['is_new_rejecting' => '有']);
+        /** @var OrderIssue $orderIssue */
+        $orderIssue = $this->orderIssue;
+        if($orderIssue){
+            $orderIssue->unJoinRejectedBill($this->logistic_number_return);
+            $orderIssue->update(['is_new_rejecting'=>'无']);
+            $orderIssue->syncRejectingStatus();
         }
+        return parent::delete(); // TODO: Change the autogenerated stub
     }
 
-    public function 同步问题件()
+    public function syncOrderIssue()
     {
-        $orderIssue = $this->orderIssue()->first();
-        if(!isset($orderIssue)){
-            if(isset($this->order_number)){
-                $orderNumber = $this->order_number;
-                $orderIssue = OrderIssue::query()->with('order')->whereHas('order',function($query)use($orderNumber){
-                    $query->where('client_code',$orderNumber);
-                })->first();
-            }
-            if(isset($this->logistic_number_return) && !isset($orderIssue)){
-                $logistic_number_return = $this->logistic_number_return;
-                $orderHeader = OracleDOCOrderHeader::query()->where('soreference1',function($query)use($logistic_number_return){
-                    $query->select('asnreference2')->from('DOC_ASN_HEADER')->where('asnreference3',$logistic_number_return)->first();
-                })->first();
-                $orderIssue = OrderIssue::query()->with('order')->whereHas('order',function($query)use($orderHeader){
-                    $query->where('code',$orderHeader->orderno);
-                })->first();
-            }
-        }
-        if(isset($orderIssue)){
-//            $orderIssue->同步退单状态();
-            $orderIssue->update(['is_new_rejecting' => '有']);
+        if(isset($this->orderIssue)){
+            $this->orderIssue->syncRejectingStatus();
+            return;
         }
-    }
-
-    private function 同步退单状态()
-    {
         /** @var OrderIssue $orderIssue */
-        $orderIssue =  $this->orderIssue()->first();
-        if($orderIssue ?? false)
-            $orderIssue->同步退单状态();
-    }
-
-    public function delete()
-    {
-        $orderIssue = $this->orderIssue;
-        if($orderIssue)$orderIssue->update(['is_new_rejecting'=>'无','logistic_number_return'=>null]);
-        return parent::delete(); // TODO: Change the autogenerated stub
-    }
-
+        $orderIssue = null;
+        // 原单退回
+        if($this->logistic_number === '原单退回'){
+            $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;
+        if(!OrderIssueRejectedBill::isExit($orderIssue->id,$this->logistic_number_return)) $orderIssue->update(['is_new_rejecting' => '有']);
+        $orderIssue->joinRejectedBill($this->logistic_number_return);
+        $orderIssue->syncRejectingStatus();
+     }
 }

+ 124 - 0
app/Services/OrderIssueRejectedBillService.php

@@ -0,0 +1,124 @@
+<?php
+
+namespace App\Services;
+
+use App\Http\Controllers\Controller;
+use App\OrderIssue;
+use App\OrderIssueRejectedBill;
+use App\RejectedBill;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\Model;
+
+Class OrderIssueRejectedBillService
+{
+    /**
+     * 添加连接
+     * @param OrderIssue $orderIssue
+     * @param $logistic_number_return
+     * @return Builder|Model|object|null|boolean
+     */
+    public function joinRejectedBill($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;
+        if(!OrderIssueRejectedBill::isExit($orderIssue->id,$logistic_number_return)) $orderIssue->update(['is_new_rejecting' => '有']);
+        $orderIssue->joinRejectedBill($logistic_number_return);
+        $orderIssue->syncRejectingStatus();      // 问题件同步订单状态
+        return OrderIssueRejectedBill::query()->with('rejectedBill.items')
+                ->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
+     */
+    public function unJoinRejectedBill($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;
+
+        $bool = $orderIssue->unJoinRejectedBill($logistic_number_return);
+        $orderIssue->syncRejectingStatus();      // 问题件同步订单状态
+        if($orderIssue->rejectedBills->count() == 0)$orderIssue->update(['is_new_rejecting' => '无']);
+        return $bool;
+    }
+
+    /**
+     * 修改连接
+     * @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)
+    {
+        $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);
+        $orderIssue->syncRejectingStatus();      // 问题件同步订单状态
+        return OrderIssueRejectedBill::query()->with('rejectedBill')
+                ->where('order_issue_id',$orderIssue->id)
+                ->where('logistic_number_return',$logistic_number_return)->first() ?? false;
+    }
+
+    /**
+     * 退回件同步问题件
+     * @param RejectedBill|Controller $rejectedBills
+     * @return void
+     */
+    public function syncOrderIssue($rejectedBills)
+    {
+        if(!$rejectedBills)return;
+        if(is_array($rejectedBills)){
+            foreach ($rejectedBills as $rejectedBill) {
+                $rejectedBill->syncOrderIssue();
+            }
+            return;
+        }
+        $rejectedBills->syncOrderIssue();
+    }
+
+    /**
+     * 问题件同步退回件
+     * @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);
+        $orderIssue->syncRejectingStatus();
+    }
+
+    /**
+     * 问题件更新退单状态
+     * @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) {
+                $orderIssue->syncRejectingStatus();
+            }
+            return;
+        }
+        $order_issues->syncRejectingStatus();
+    }
+
+
+
+}

+ 13 - 6
app/Services/OrderIssueService.php

@@ -48,7 +48,7 @@ class OrderIssueService
             $query->with(['shop', 'logistic', 'owner', 'packages.commodities.commodity' => function ($query) {
                 $query->with('barcodes');
             }]);
-        }, 'rejectedBill' => function ($query) {
+        }, 'orderIssueRejectedBills.rejectedBill' => function ($query) {
             $query->with(['items.quality']);
         }, 'secondOrder' => function ($query) {
             $query->with(['shop', 'logistic', 'owner', 'packages.commodities.commodity' => function ($query) {
@@ -371,8 +371,9 @@ class OrderIssueService
     {
         if(!$orderIssues)return;
         foreach ($orderIssues as $orderIssue) {
-            $orderIssue->syncRejectedBill();
-            $orderIssue->同步退单状态();
+            /**@var OrderIssue $orderIssue */
+            $orderIssue->syncRejectedBills();
+            $orderIssue->syncRejectingStatus();
         }
     }
 
@@ -407,8 +408,10 @@ class OrderIssueService
         ];
         $orderIssue = null;
         try {
+            /** @var OrderIssue $orderIssue */
             $orderIssue = OrderIssue::query()->create($arr);
-            $orderIssue->同步退单状态();
+            $orderIssue->syncRejectedBills();
+            $orderIssue->syncRejectingStatus();
             $orderIssue->order = $order;
             app('LogService')->log(__METHOD__, __FUNCTION__, '创建问题件' . json_encode($orderIssue));
         } catch (\Exception $e) {
@@ -452,6 +455,7 @@ class OrderIssueService
 
     public function create(array $arr)
     {
+        /** @var OrderIssue $orderIssue */
         $orderIssue = OrderIssue::query()->create($arr);
         if (!$arr['order_id']) {
             $order = app("OrderService")->createOrder($arr);
@@ -459,20 +463,23 @@ class OrderIssueService
             $orderIssue->save();
             app('LogService')->log(__METHOD__,__FUNCTION__,'创建 Order'.json_encode($order));
         }
-        $orderIssue->同步退单状态();
+        $orderIssue->syncRejectedBills();
+        $orderIssue->syncRejectingStatus();
         return $orderIssue;
     }
 
     public function createByLogisticNumber(array $arr)
     {
+        /** @var OrderIssue $orderIssue */
         $arr['code']='null_'.Uuid::uuid4();
         $order = app("OrderService")->createOrder($arr);
         app('LogService')->log(__METHOD__,__FUNCTION__,'创建 Order'.json_encode($order));
         $orderIssue = OrderIssue::query()->create($arr);
         $orderIssue['order_id'] = $order['id'];
         OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $arr['logistic_number_return']]);
-        $orderIssue->同步退单状态();
         $orderIssue->update(['order_id' => $order['id']]);
+        $orderIssue->syncRejectedBills();
+        $orderIssue->syncRejectingStatus();
         return $orderIssue;
     }
 

+ 5 - 36
app/Services/RejectedBillService.php

@@ -2,8 +2,6 @@
 
 namespace App\Services;
 
-use App\OracleDOCOrderHeader;
-use App\OrderIssue;
 use App\RejectedBill;
 use App\Services\common\BatchUpdateService;
 use App\Services\common\DataHandlerService;
@@ -30,42 +28,13 @@ Class RejectedBillService
         return RejectedBill::query()->create($params);
     }
 
+    /**
+     * 同步退回单号
+     * @param RejectedBill $rejectedBill
+     */
     public function syncOrderIssue($rejectedBill)
     {
-        /**
-         * @var OrderIssue $orderIssue
-         */
-        $orderIssue = $rejectedBill->orderIssue()->first();
-        if (!$orderIssue && $rejectedBill['logistic_number'] === '原单退回') {   // 原单退回
-            $orderIssue = OrderIssue::query()->with('order')->whereHas('order', function ($query) use ($rejectedBill) {
-                $query->where('client_code', $rejectedBill['order_number']);
-            })->first();
-        } else if (!$orderIssue && isset($rejectedBill->logistic_number_return)) {
-            $orderIssue = OrderIssue::query()->with('order.packages')->whereHas('order.packages', function ($query) use ($rejectedBill) {
-                $query->where('logistic_number', $rejectedBill->logistic_number_return);
-            })->first();
-        }
-        if (!isset($orderIssue)) { // 没有对应的问题发货订单
-            $orderHeader = OracleDOCOrderHeader::query()->where('soreference1', function ($query) use ($rejectedBill) {
-                $query->select('asnreference2')->from('DOC_ASN_HEADER')->where('asnreference3', $rejectedBill->logistic_number_return)->first();
-            })->first();
-//                $orderHeader = OracleDOCOrderHeader::query()->where('soreference1',function($query)use($rejectedBill){
-//                    $query->select('asnreference2')->from('DOC_ASN_HEADER')->where('asnreference3',$rejectedBill->logistic_number_return)->first();
-//                })->first();
-            if (!isset($orderHeader)) return;
-            $orderIssue = OrderIssue::query()->with('order')->whereHas('order', function ($query) use ($orderHeader) {
-                $query->where('code', $orderHeader->orderno);
-            })->first();
-        }
-        if (isset($orderIssue)) {
-            // 更新问题件的退回单号
-            if ($orderIssue['logistic_number_return'] != $rejectedBill['logistic_number_return'])
-                $orderIssue->update(['logistic_number_return' => $rejectedBill['logistic_number_return']]);
-            //确认问题件有的时候需要更新状态和提示
-            $orderIssue->同步退单状态();
-            $orderIssue->update(['is_new_rejecting' => '有']);
-            app('LogService')->log(__METHOD__, __FUNCTION__, '退回单同步问题件' . json_encode($rejectedBill) . json_encode($orderIssue));
-        }
+        $rejectedBill->syncOrderIssue();
     }
 
     public function syncLoadedStatusByAsnHerder($asnHerders)

+ 3 - 3
app/Services/RejectedService.php

@@ -21,9 +21,9 @@ class RejectedService
     private function conditionQuery(array $param)
     {
         $user = Auth::user();
-        $rejectedBills = RejectedBill::query()->with('user','owner', 'logistic', 'items.quality','orderIssue:logistic_number_return')
-            ->orderBy('rejected_bills.id', 'desc')->whereIn('rejected_bills.id_owner',
-            $user ? (app('UserService')->getPermittingOwnerIds($user) ?? []) : []);
+        $rejectedBills = RejectedBill::query()->with('user','owner', 'logistic', 'items.quality','orderIssueRejectedBill:logistic_number_return')
+            ->orderBy('rejected_bills.id', 'desc')
+            ->whereIn('rejected_bills.id_owner', $user ? (app('UserService')->getPermittingOwnerIds($user) ?? []) : []);
         $columnQueryRules = [
             'created_at_start' => ['alias' => 'created_at', 'startDate' => ' 00:00:00'],
             'created_at_end' => ['alias' => 'created_at', 'endDate' => ' 23:59:59'],

+ 43 - 0
database/migrations/2021_01_07_092258_create_order_issue_rejected_bill_table.php

@@ -0,0 +1,43 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+use App\OrderIssue;
+
+class CreateOrderIssueRejectedBillTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('order_issue_rejected_bill', function (Blueprint $table) {
+            $table->bigInteger('order_issue_id')->index();
+            $table->string('logistic_number_return')->index();
+        });
+        $this->processOrderIssueRejectedBill();
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('order_issue_rejected_bill');
+    }
+
+    public function processOrderIssueRejectedBill()
+    {
+        OrderIssue::query()->withTrashed()->whereNotNull('logistic_number_return')->chunkById(200,function($orderIssues){
+            $orderIssues->each(function($orderIssue){
+                if($orderIssue->logistic_number_return)
+                    $orderIssue->rejectedBills()->syncWithoutDetaching([$orderIssue->logistic_number_return]);
+            });
+        });
+    }
+}

Разница между файлами не показана из-за своего большого размера
+ 292 - 299
resources/views/order/issue/index.blade.php


+ 1 - 1
resources/views/rejected/search/general.blade.php

@@ -76,7 +76,7 @@
                         </td>
                         <td class="text-nowrap">
 {{--                            <span class="text-muted" style="opacity:0.7">@{{ i+1 }}</span> <span v-if="issueIds.includes(rejectedBill.id)" class="badge badge-pill badge-danger">问题件</span>--}}
-                            <span class="text-muted" style="opacity:0.7">@{{ i+1 }}</span> <span v-if="rejectedBill.order_issue" class="badge badge-pill badge-danger">问题件</span>
+                            <span class="text-muted" style="opacity:0.7">@{{ i+1 }}</span> <span v-if="rejectedBill.order_issue_rejected_bill" class="badge badge-pill badge-danger">问题件</span>
                         </td>
                         <td class="text-muted">
                             <span v-if="rejectedBill.is_checked==1" class="text-success">

+ 8 - 0
routes/apiLocal.php

@@ -33,6 +33,8 @@ Route::post('waybill/changeCharge', 'WaybillController@changeCharge');
 Route::post('rejectedBill/getRejectedByLogisticNumberReturn','RejectedController@apiGetRejectedByLogisticNumberReturn');
 
 Route::group(['prefix' => 'order'], function () {
+
+
     Route::group(['prefix'=>'issue'],function(){
 
         Route::post('orderIssueHasClientCode', 'OrderIssueController@apiOrderIssueHasClientCode');
@@ -55,6 +57,12 @@ Route::group(['prefix' => 'order'], function () {
         Route::match(['get','post'],'disposeImport','OrderIssueController@disposeImportApi');
         Route::post('financeConfirm','OrderIssueController@financeConfirmApi');
 
+        Route::group(['prefix'=>'rejectedBill'],function(){
+            Route::post('join','OrderIssueRejectedBillController@joinRejectedBillApi');
+            Route::post('unJoin','OrderIssueRejectedBillController@unJoinRejectedBillApi');
+            Route::post('reviseJoin','OrderIssueRejectedBillController@reviseJoinRejectedBillApi');
+        });
+
          Route::group(['prefix'=>'onTop'],function(){
             Route::post('/store', 'OrderIssueOnTopController@apiStore');
             Route::post('/cancelTop', 'OrderIssueOnTopController@apiDestroy');

Некоторые файлы не были показаны из-за большого количества измененных файлов