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

Merge branch 'master' into Haozi

# Conflicts:
#	app/Http/Controllers/TestController.php
haozi 4 лет назад
Родитель
Сommit
46bf4e8461
38 измененных файлов с 1296 добавлено и 704 удалено
  1. 1 0
      .gitignore
  2. 1 0
      app/Exceptions/ErrorException.php
  3. 4 0
      app/Exceptions/Exception.php
  4. 1 0
      app/Exceptions/Handler.php
  5. 8 0
      app/Feature.php
  6. 21 2
      app/Filters/OrderIssueFilters.php
  7. 0 1
      app/Http/Controllers/ControlPanelController.php
  8. 20 0
      app/Http/Controllers/CustomerController.php
  9. 332 226
      app/Http/Controllers/OrderController.php
  10. 2 1
      app/Http/Controllers/OrderIssueController.php
  11. 0 1
      app/Http/Controllers/OwnerFeeTotalController.php
  12. 0 3
      app/Http/Controllers/OwnerWaybillSettlementBillController.php
  13. 108 5
      app/Http/Controllers/TestController.php
  14. 12 8
      app/Http/Controllers/WorkOrderController.php
  15. 6 1
      app/Http/Requests/GateRequest.php
  16. 58 0
      app/Jobs/PackageCollectingAllocation.php
  17. 34 17
      app/Jobs/ResetInstantBill.php
  18. 20 0
      app/Order.php
  19. 5 4
      app/OrderPackage.php
  20. 4 1
      app/Services/DbOpenService.php
  21. 0 1
      app/Services/Express/CaiNiaoExpress.php
  22. 0 1
      app/Services/Express/PDDExpress.php
  23. 1 1
      app/Services/ForeignHaiRoboticsService.php
  24. 15 0
      app/Services/OrderIssueService.php
  25. 1 0
      app/Services/OrderPackageReceivedSyncService.php
  26. 116 55
      app/Services/OrderPackageService.php
  27. 347 321
      app/Services/OrderService.php
  28. 1 0
      app/Services/OwnerPriceOperationService.php
  29. 32 4
      app/Services/RejectedBillService.php
  30. 18 0
      app/Services/WorkOrderService.php
  31. 9 1
      app/Services/weight/WeightService.php
  32. 2 1
      app/Traits/ModelSearchWay.php
  33. 0 7
      bootstrap/cache/packages.php
  34. 36 38
      bootstrap/cache/services.php
  35. 32 0
      database/migrations/2021_09_26_095833_add_column_manual_collection_status_to_order_packages_table.php
  36. 38 3
      resources/views/order/index/delivering.blade.php
  37. 10 1
      resources/views/order/issue/index.blade.php
  38. 1 0
      routes/web.php

+ 1 - 0
.gitignore

@@ -35,3 +35,4 @@ yarn-error.log
 /serves/excelExportGo/go_build_main_go.exe
 /laravel-echo-server.lock
 /database/data
+/bootstrap/cache

+ 1 - 0
app/Exceptions/ErrorException.php

@@ -4,6 +4,7 @@
 namespace App\Exceptions;
 
 
+use Illuminate\Support\Facades\Auth;
 use Throwable;
 
 class ErrorException extends Exception

+ 4 - 0
app/Exceptions/Exception.php

@@ -19,6 +19,10 @@ class Exception extends \Exception
     }
     public function logging()
     {
+        \Illuminate\Support\Facades\Log::info("抓取内存耗尽错误",debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT,5));
+        if (substr($this->getFile(),-(strlen("FatalError.php")))==='FatalError.php'){
+            \Illuminate\Support\Facades\Log::emergency("FPM内存耗尽",["user"=>Auth::id(),"param"=>request()]);
+        }
         $exception=$this;
         list(
             $className,

+ 1 - 0
app/Exceptions/Handler.php

@@ -47,6 +47,7 @@ class Handler extends ExceptionHandler
 
     public function render( $request, Throwable $exception)
     {
+        \Illuminate\Support\Facades\Log::info("抓取内存耗尽错误",debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT,5));
         $errMsg='';
         try{
             if (substr($exception->getFile(),-(strlen("FatalError.php")))==='FatalError.php'){

+ 8 - 0
app/Feature.php

@@ -59,6 +59,14 @@ class Feature extends Model
             10=> 'packages.commodities.total',
             12=> "total",
             13=> "logistic.english_name",
+        ],
+        "rejected_bill" => [
+            0 => "items.name_goods",
+            5 => "items.remark",
+            7 => "remark",
+            8 => "items.amount",
+            10=> "items.total",
+            12=> "goods_amount",
         ]
     ];
 }

+ 21 - 2
app/Filters/OrderIssueFilters.php

@@ -14,6 +14,7 @@ use App\OrderPackageCommodities;
 use App\RejectedBill;
 use App\RejectedBillItem;
 use App\Shop;
+use App\WorkOrder;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
@@ -32,6 +33,7 @@ class OrderIssueFilters
     protected $rejectedBillItemQuery;
     protected $orderIssueProcessLogQuery;
     protected $shopQuery;
+    protected $workOrderQuery;
     protected $filters = [
         'log_content',
         'is_imported',
@@ -69,7 +71,8 @@ class OrderIssueFilters
         'archive_at_end',
         'result_explain',
         'is_intercept',
-        'orderCode'
+        'orderCode',
+        'is_work_order',
     ];
     protected $array_filter;
     protected $params = [];
@@ -144,6 +147,12 @@ class OrderIssueFilters
         return $this->shopQuery;
     }
 
+    private function getWorkOrderQuery(){
+        if(!$this->workOrderQuery)
+            $this->workOrderQuery = WorkOrder::query()->selectRaw('order_id');
+        return $this->workOrderQuery;
+    }
+
     public function apply($builder)
     {
         $this->queryBuilder = $builder;
@@ -211,6 +220,9 @@ class OrderIssueFilters
 
         if($this->orderIssueProcessLogQuery)
             $this->queryBuilder->whereIn('order_issues.id',$this->orderIssueProcessLogQuery);
+
+        if ($this->workOrderQuery)
+            $this->queryBuilder->whereIn('order_issues.order_id',$this->workOrderQuery);
     }
 
     private function isSearchLike($str)
@@ -226,7 +238,8 @@ class OrderIssueFilters
         if ($this->isSearchLike($param)) {
             $query->where($column, 'like', $param);
         } else {
-            $query->whereIn($column, array_filter(preg_split('/[,, ]+/is', $param)));
+            mb_regex_encoding('utf-8');
+            $query->whereIn($column, array_filter(preg_split('/[,, ]+/u', $param,-1,PREG_SPLIT_NO_EMPTY)));
         }
         return $query;
     }
@@ -468,4 +481,10 @@ class OrderIssueFilters
         $this->getOrderQuery();
         $this->searchWay($this->getOrderQuery(),$orderCode,'orders.code');
     }
+
+    // 是否有对应工单
+    public function is_work_order($is_work_order)
+    {
+        if ($is_work_order) $this->getWorkOrderQuery();
+    }
 }

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

@@ -247,7 +247,6 @@ COUNT(1) total FROM order_packages LEFT JOIN orders ON order_packages.order_id=o
 WHERE orders.wms_status != '订单取消'  {$where}
 AND order_packages.created_at like '{$date}%' GROUP BY date,order_packages.measuring_machine_id
 sql;
-            //todo 新写
             $info = DB::select(DB::raw($sql));
             if (empty($info)) return  $res;
             foreach ($info as $v){

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

@@ -11,6 +11,9 @@ use App\Owner;
 use App\OwnerAreaReport;
 use App\OwnerBillReport;
 use App\OwnerFeeDetail;
+use App\OwnerFeeLogistic;
+use App\OwnerFeeOperation;
+use App\OwnerFeeOperationDetail;
 use App\OwnerReport;
 use App\Services\LogService;
 use App\Services\OwnerAreaReportService;
@@ -521,6 +524,23 @@ class CustomerController extends Controller
         $details = OwnerFeeDetail::query()->where("worked_at",">=",$startData." 00:00:00");
         if ($endDate)$details->where("worked_at","<=",$endDate." 23:59:59");
         if (count($owner)>0)$details->whereIn("owner_id",$owner);
+
+        $fee = OwnerFeeDetail::query()->where("created_at",">=",$startData." 00:00:00");
+        if ($endDate)$fee->where("created_at","<=",$endDate." 23:59:59");
+        if (count($owner)>0)$fee->whereIn("owner_id",$owner);
+        $fee->delete();
+
+        $feeQuery = OwnerFeeOperation::query()->where("worked_at",">=",$startData);
+        if ($endDate)$feeQuery->where("worked_at","<=",$endDate);
+        if (count($owner)>0)$feeQuery->whereIn("owner_id",$owner);
+        OwnerFeeOperationDetail::query()->whereIn("owner_fee_operation_id",$feeQuery)->delete();
+        $feeQuery->delete();
+
+        $fee = OwnerFeeLogistic::query()->where("created_at",">=",$startData." 00:00:00");
+        if ($endDate)$fee->where("created_at","<=",$endDate." 23:59:59");
+        if (count($owner)>0)$fee->whereIn("owner_id",$owner);
+        $fee->delete();
+
         $details->get()->each(function ($detail){
             dispatch(new ResetInstantBill($detail));
         });

+ 332 - 226
app/Http/Controllers/OrderController.php

@@ -4,93 +4,105 @@ namespace App\Http\Controllers;
 
 use App\Components\Database;
 use App\Http\Requests\OrderDelivering;
+use App\OracleActAllocationDetails;
 use App\OracleDOCOrderHeader;
 use App\OracleDOCWaveDetails;
 use App\OrderIssueType;
+use App\OrderPackage;
 use App\Services\LogisticService;
 use App\Services\LogService;
+use App\Services\OrderPackageService;
 use App\Services\OrderService;
 use App\Services\RejectedBillItemService;
 use App\Services\RejectedBillService;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
+use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Gate;
 use Oursdreams\Export\Export;
+use function DeepCopy\deep_copy;
 
 class OrderController extends Controller
 {
     use Database;
 
-    public function delivering(OrderDelivering $request){
+    public function delivering(OrderDelivering $request)
+    {
         /** @var OrderService $orderService */
         $orderService = app('OrderService');
         $request = $request->input();
-        $owners = app('OwnerService')->getIntersectPermitting(['id','code']);
-        $service=app(LogisticService::class);
-        $logistics=$service->getSelection(['id','name']);
-        $codes = array_column($owners->toArray(),'code');
-        if ($request['customerid'] ?? false){
-            $arr = explode(',',$request['customerid']);
+        $owners = app('OwnerService')->getIntersectPermitting(['id', 'code']);
+        $service = app(LogisticService::class);
+        $logistics = $service->getSelection(['id', 'name']);
+        $codes = array_column($owners->toArray(), 'code');
+        if ($request['customerid'] ?? false) {
+            $arr = explode(',', $request['customerid']);
             $request['customerid'] = [];
-            foreach ($arr as $value){
-                if (in_array($value,$codes))$request['customerid'][] = $value;
+            foreach ($arr as $value) {
+                if (in_array($value, $codes)) $request['customerid'][] = $value;
             }
-            if (count($request['customerid']) < 1)$request['customerid'] = [''];
-        }else $request['customerid'] = $codes;
+            if (count($request['customerid']) < 1) $request['customerid'] = [''];
+        } else $request['customerid'] = $codes;
 
         $result = $orderService->paginate($request);
         $picktotraceids = $result['picktotraceids'];
         $orders = $result['orders'];
         $orderService->tagOrderByOrderIssue($orders);
+        app('WorkOrderService')->tagWorkOrder($orders);
         $commodities = $result['commodities'];
-        $customers=app('OracleBasCustomerService')->getCustomers($codes);
+        $customers = app('OracleBasCustomerService')->getCustomers($codes);
         $page = $request["page"] ?? 1;
-        $codes=DB::connection('oracle')->table('BAS_CODES')->select('code','codename_c')->where('codeid','SO_STS')->orderBy('code','asc')->get();
+        $codes = DB::connection('oracle')->table('BAS_CODES')->select('code', 'codename_c')->where('codeid', 'SO_STS')->orderBy('code', 'asc')->get();
         $orderIssueType = OrderIssueType::all();
-        return view('order/index/delivering',compact('orders','customers','request','codes','commodities','page','picktotraceids','orderIssueType','logistics'));
+        return view('order/index/delivering', compact('orders', 'customers', 'request', 'codes', 'commodities', 'page', 'picktotraceids', 'orderIssueType', 'logistics'));
     }
 
     //导出
-    public function export(Request $request){
+    public function export(Request $request)
+    {
         $is_merge = $request->is_merge ?? false;
         /** @var OrderService $orderService */
         $orderService = app('OrderService');
-        $req = ['type'=>'order'];
-        if ($is_merge && $is_merge == 'true')$req["createFormat"] = "merge";
-        if ($request->data){
-            $req["sql"] = $orderService->getSql(['data'=>$request->data]);
-        }else{
+        $req = ['type' => 'order'];
+        if ($is_merge && $is_merge == 'true') $req["createFormat"] = "merge";
+        if ($request->data) {
+            $req["sql"] = $orderService->getSql(['data' => $request->data]);
+        } else {
             $req["sql"] = $orderService->getSql($request->input());
         }
         $e = new Export();
         $e->setOracleConnection(config('database.connections.oracle.host'),
-            config('database.connections.oracle.port'),config('database.connections.oracle.database')
-        ,config('database.connections.oracle.username'),config('database.connections.oracle.password'));
-        if ($is_merge && $is_merge == 'true'){
+            config('database.connections.oracle.port'), config('database.connections.oracle.database')
+            , config('database.connections.oracle.username'), config('database.connections.oracle.password'));
+        if ($is_merge && $is_merge == 'true') {
             $e->setMergeFormat([
-                "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P",
-                "Q","R","S","Z","AA","AB","AC","AD"
+                "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P",
+                "Q", "R", "S", "Z", "AA", "AB", "AC", "AD"
             ]);
             $e->setDatum("ORDERNO");
         } else $e->setWarpTextFormat();
-        $e->setFileName("订单记录-".date('ymdHis'));
-        return $e->sql($req["sql"],[
-            "ORDERNO"=>"编号","ORDERCODENAME"=>"订单状态",
-            "NOTES"=>"备注","ADDTIME"=>"接口下发时间",
-            "ISSUEPARTYNAME"=>"店铺名称","CUSTOMER_DESCR_C"=>"客户",
-            "SOREFERENCE1"=>"客户订单号","CARRIERNAME"=>"承运人",
-            "SOREFERENCE5"=>"快递单号","C_CONTACT"=>"收货人名称","C_TEL2"=>"收货人电话",
-            "C_PROVINCE"=> "省","C_CITY"=>"市","C_DISTRICT"=>"区","C_ADDRESS1"=>"收货人地址",
-            "WAVENO"=>"波次编号","WAREHOUSEID"=>"仓库","EDISENDFLAG2"=>"快递获取标记","EDISENDTIME2"=>"快递获取时间",
-            "SKU"=>"产品代码","ALTERNATE_SKU1"=>"产品条码","ORDERDETAILCODENAME"=>"明细状态","DESCR_C"=> "产品名称",
-            "QTYORDERED"=>"订单数量","CHECKTIME"=>"复核时间","ERPCANCELFLAG"=>"接口取消标记",
-            "PICKING_PRINT_FLAG"=>"拣货单打印标记","EDISENDFLAG"=>"接口回传标记","EDIREMARKS2"=>"接口回传异常备注",
-            "RELEASESTATUS"=>"订单冻结"],["ADDTIME"=>"date","EDISENDTIME2"=>"date"])->direct();
+        $e->setFileName("订单记录-" . date('ymdHis'));
+        return $e->sql($req["sql"], [
+            "ORDERNO" => "编号", "ORDERCODENAME" => "订单状态",
+            "NOTES" => "备注", "ADDTIME" => "接口下发时间",
+            "ISSUEPARTYNAME" => "店铺名称", "CUSTOMER_DESCR_C" => "客户",
+            "SOREFERENCE1" => "客户订单号", "CARRIERNAME" => "承运人",
+            "SOREFERENCE5" => "快递单号", "C_CONTACT" => "收货人名称", "C_TEL2" => "收货人电话",
+            "C_PROVINCE" => "省", "C_CITY" => "市", "C_DISTRICT" => "区", "C_ADDRESS1" => "收货人地址",
+            "WAVENO" => "波次编号", "WAREHOUSEID" => "仓库", "EDISENDFLAG2" => "快递获取标记", "EDISENDTIME2" => "快递获取时间",
+            "SKU" => "产品代码", "ALTERNATE_SKU1" => "产品条码", "ORDERDETAILCODENAME" => "明细状态", "DESCR_C" => "产品名称",
+            "QTYORDERED" => "订单数量", "CHECKTIME" => "复核时间", "ERPCANCELFLAG" => "接口取消标记",
+            "PICKING_PRINT_FLAG" => "拣货单打印标记", "EDISENDFLAG" => "接口回传标记", "EDIREMARKS2" => "接口回传异常备注",
+            "RELEASESTATUS" => "订单冻结"], ["ADDTIME" => "date", "EDISENDTIME2" => "date"])->direct();
     }
 
-    public function createRejectedBill(Request $request){
-        if(!Gate::allows('订单管理-订单-生成退货单')){ return ['success'=>false,'data'=>'您无权操作!'];  }
+    public function createRejectedBill(Request $request)
+    {
+        if (!Gate::allows('订单管理-订单-生成退货单')) {
+            return ['success' => false, 'data' => '您无权操作!'];
+        }
         /** @var OrderService $orderService */
         $orderService = app('OrderService');
         $result = $orderService->get(['data' => $request->data]);
@@ -104,46 +116,46 @@ class OrderController extends Controller
         $commodities = $result['commodities'];
         $rejectedBillItems = [];
         //分箱号
-        $picktotraceids = json_decode($result['picktotraceids'],true);
+        $picktotraceids = json_decode($result['picktotraceids'], true);
         $rejectedBill_collect = collect();// 保存生成的rejectedBill
-        foreach ($result['orders'] as $order){
-            $blacklist = ["00","10","20","30","90"/*,"99"*/];
-            if (array_search($order->sostatus,$blacklist) !== false)return ['success'=>false,'data'=>'“'.$order->orderno."”状态异常,无法操作"];
+        foreach ($result['orders'] as $order) {
+            $blacklist = ["00", "10", "20", "30", "90"/*,"99"*/];
+            if (array_search($order->sostatus, $blacklist) !== false) return ['success' => false, 'data' => '“' . $order->orderno . "”状态异常,无法操作"];
         }
-        foreach ($result['orders'] as $order){
+        foreach ($result['orders'] as $order) {
             //不存在时将当前快递单号视为分箱号
-            if (!($picktotraceids[$order->orderno] ?? false))$picktotraceids[$order->orderno] = [$order->soreference5];
+            if (!($picktotraceids[$order->orderno] ?? false)) $picktotraceids[$order->orderno] = [$order->soreference5];
             //获取货主与快递方
             $owner = app('OwnerService')->firstOrCreate(['name' => $order->customer_descr_c],
                 ['name' => $order->customer_descr_c, 'code' => $order->customer_descr_c]);
             $logistic = app('LogisticService')->firstOrCreate(['name' => $order->carriername],
                 ['name' => $order->carriername, 'code' => $order->carriername]);
-            foreach ($picktotraceids[$order->orderno] as $orderno){
+            foreach ($picktotraceids[$order->orderno] as $orderno) {
                 $rejectedBill = $rejectedBillService->create([
                     'id_owner' => $owner->id,
                     'sender' => $order->c_contact,
                     'logistic_number_return' => $orderno,
                     'id_logistic_return' => $logistic->id,
                     'order_number' => $order->soreference1,
-                    'mobile_sender' => empty($order->c_tel2)?$order->c_tel1:$order->c_tel2,
+                    'mobile_sender' => empty($order->c_tel2) ? $order->c_tel1 : $order->c_tel2,
                     'logistic_number' => '原单退回',//$order->soreference1
                     'remark' => $order->notes,
-                    'is_loaded' =>0,
+                    'is_loaded' => 0,
                     "id_operator" => Auth::id(),
                 ]);
                 $rejectedBill_collect->push($rejectedBill);// 保存生成的rejectedBill
-                LogService::log(__METHOD__,"生成退货单",json_encode($order),Auth::user()['id']);
+                LogService::log(__METHOD__, "生成退货单", json_encode($order), Auth::user()['id']);
                 $cms = $commodities[$order->orderno] ?? [];
-                if (count($picktotraceids[$order->orderno]) > 0 && $cms){
+                if (count($picktotraceids[$order->orderno]) > 0 && $cms) {
                     $sql = <<<sql
  SELECT sum(QTY) qty,sku FROM ACT_ALLOCATION_DETAILS where ORDERNO = ? and PICKTOTRACEID = ? GROUP BY sku
 sql;
-                    $acts = DB::connection("oracle")->select(DB::raw($sql),[$order->orderno,$orderno]);
-                    $skus = array_column($acts,"sku");
-                    foreach ($cms as $orderCommodities){
-                        $index = array_search($orderCommodities["sku"],$skus);
-                        if ($index === false)continue;
-                        array_push($rejectedBillItems,[
+                    $acts = DB::connection("oracle")->select(DB::raw($sql), [$order->orderno, $orderno]);
+                    $skus = array_column($acts, "sku");
+                    foreach ($cms as $orderCommodities) {
+                        $index = array_search($orderCommodities["sku"], $skus);
+                        if ($index === false) continue;
+                        array_push($rejectedBillItems, [
                             'id_rejected_bill' => $rejectedBill->id,
                             'barcode_goods' => $orderCommodities['alternate_sku1'],
                             'name_goods' => $orderCommodities['descr_c'],
@@ -156,168 +168,198 @@ sql;
             }
         }
         $rejectedBillItemService->insert($rejectedBillItems);
-        LogService::log(__METHOD__,"批量生成退货单详情",json_encode($rejectedBillItems),Auth::user()['id']);
-        $rejectedBill_collect->each(function($rejectedBill)use($rejectedBillService){
+        LogService::log(__METHOD__, "批量生成退货单详情", json_encode($rejectedBillItems), Auth::user()['id']);
+        $rejectedBill_collect->each(function ($rejectedBill) use ($rejectedBillService) {
             $rejectedBillService->joinOrderIssue($rejectedBill);
             $rejectedBillService->syncOrderIssue($rejectedBill);
         });
-        return ['success'=>true];
+        return ['success' => true];
     }
 
-    public function isRejectedBillExist(Request $request){
-        if(!Gate::allows('订单管理-订单-生成退货单')){ return redirect(url('/'));  }
+    public function isRejectedBillExist(Request $request)
+    {
+        if (!Gate::allows('订单管理-订单-生成退货单')) {
+            return redirect(url('/'));
+        }
         /** @var RejectedBillService $rejectedBillService */
         $rejectedBillService = app('RejectedBillService');
         $rejectedBills = $rejectedBillService->get(['order_number' => $request->data]);
-        if (count($rejectedBills) == 0)return ['success'=>true];
-        return ['success'=>false, 'data'=>json_encode(array_column($rejectedBills->toArray(),'order_number'))];
+        if (count($rejectedBills) == 0) return ['success' => true];
+        return ['success' => false, 'data' => json_encode(array_column($rejectedBills->toArray(), 'order_number'))];
     }
 
     //批量备注追加
-    public function batchComments(Request $request){
-        if(!Gate::allows('订单管理-批量备注')){ return redirect(url('/'));  }
-        $checkData=$request->input('checkData');
-        $content=$request->input('content');
-        $ordersNotNull=OracleDOCOrderHeader::query()->select('OrderNo','Notes')->whereIn('orderno',$checkData)
+    public function batchComments(Request $request)
+    {
+        if (!Gate::allows('订单管理-批量备注')) {
+            return redirect(url('/'));
+        }
+        $checkData = $request->input('checkData');
+        $content = $request->input('content');
+        $ordersNotNull = OracleDOCOrderHeader::query()->select('OrderNo', 'Notes')->whereIn('orderno', $checkData)
             ->whereNotNull('notes')->get();
-        OracleDOCOrderHeader::query()->select('OrderNo','Notes')->whereIn('orderno',$checkData)
-            ->whereNull('notes')->update(['notes'=>$content]);
-        $ordersNotNullArr=array_column($ordersNotNull->toArray(),'orderno');
-        $ordersNullArr=array_diff($checkData,$ordersNotNullArr);
-        $data=[];
-        foreach ($ordersNotNull as $order){
-            OracleDOCOrderHeader::query()->where('orderno',$order->orderno)->update(["notes"=>($order->notes).",".$content]);
-            app('LogService')->log(__METHOD__,'批量备注追加修改'.__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
-            $order->notes=($order->notes).",".$content;
-            array_push($data,$order);
+        OracleDOCOrderHeader::query()->select('OrderNo', 'Notes')->whereIn('orderno', $checkData)
+            ->whereNull('notes')->update(['notes' => $content]);
+        $ordersNotNullArr = array_column($ordersNotNull->toArray(), 'orderno');
+        $ordersNullArr = array_diff($checkData, $ordersNotNullArr);
+        $data = [];
+        foreach ($ordersNotNull as $order) {
+            OracleDOCOrderHeader::query()->where('orderno', $order->orderno)->update(["notes" => ($order->notes) . "," . $content]);
+            app('LogService')->log(__METHOD__, '批量备注追加修改' . __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
+            $order->notes = ($order->notes) . "," . $content;
+            array_push($data, $order);
         }
-        foreach ($ordersNullArr as $order){
-            array_push($data,["orderno"=>$order,'notes'=>$content]);
+        foreach ($ordersNullArr as $order) {
+            array_push($data, ["orderno" => $order, 'notes' => $content]);
         }
         return $data;
     }
+
     //批量冻结
-    public function freezeAll(Request $request){
-        if(!Gate::allows('订单管理-编辑')){ return redirect(url('/'));  }
-        $checkData=$request->input('checkData')??'';
+    public function freezeAll(Request $request)
+    {
+        if (!Gate::allows('订单管理-编辑')) {
+            return redirect(url('/'));
+        }
+        $checkData = $request->input('checkData') ?? '';
         //冻结条件只局限于 分配完成sostatus=40  创建订单sostatus=00  拣货完成sostatus=60  播种完成sostatus=61
-        $sostatus=['40','00','60','61'];
-        $orders=OracleDOCOrderHeader::select('OrderNo','SoStatus')->whereIn('orderno',$checkData)->whereIn('SoStatus',$sostatus)->get();
-        if(count($checkData)!=count($orders))return ['success'=>false,'fail_info'=>"勾选订单有不可冻结订单"];
-        foreach ($orders as $order){
-            $waveno=OracleDOCOrderHeader::where('orderno',$order->orderno)->value('waveno');
-            if ($waveno && $waveno!='*'){
-                OracleDOCWaveDetails::where('waveno',$waveno)->where('orderno',$order->orderno)->delete();
-                app('LogService')->log(__METHOD__,'批量冻结删除波次号'.__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
+        $sostatus = ['40', '00', '60', '61'];
+        $orders = OracleDOCOrderHeader::select('OrderNo', 'SoStatus')->whereIn('orderno', $checkData)->whereIn('SoStatus', $sostatus)->get();
+        if (count($checkData) != count($orders)) return ['success' => false, 'fail_info' => "勾选订单有不可冻结订单"];
+        foreach ($orders as $order) {
+            $waveno = OracleDOCOrderHeader::where('orderno', $order->orderno)->value('waveno');
+            if ($waveno && $waveno != '*') {
+                OracleDOCWaveDetails::where('waveno', $waveno)->where('orderno', $order->orderno)->delete();
+                app('LogService')->log(__METHOD__, '批量冻结删除波次号' . __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
             }
-            $is_freeze=OracleDOCOrderHeader::where('orderno',$order->orderno)->update(['releasestatus'=>'H','waveno'=>'*']);
-            app('LogService')->log(__METHOD__,'批量冻结修改'.__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
-            if (!$is_freeze)return ['success'=>false,'fail_info'=>"数据 {$order['orderno']} 更新失败"];
+            $is_freeze = OracleDOCOrderHeader::where('orderno', $order->orderno)->update(['releasestatus' => 'H', 'waveno' => '*']);
+            app('LogService')->log(__METHOD__, '批量冻结修改' . __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
+            if (!$is_freeze) return ['success' => false, 'fail_info' => "数据 {$order['orderno']} 更新失败"];
         }
-        return ['success'=>true];
+        return ['success' => true];
     }
+
     //批量取消分配
-    public function deAllocationAll(Request $request){
-        if(!Gate::allows('订单管理-编辑')){ return redirect(url('/'));  }
-        $checkData=$request->input('checkData')??'';
+    public function deAllocationAll(Request $request)
+    {
+        if (!Gate::allows('订单管理-编辑')) {
+            return redirect(url('/'));
+        }
+        $checkData = $request->input('checkData') ?? '';
         //取消分配条件只局限于 分配完成sostatus=40 和 部分分配sostatus=30
-        $sostatus=['30','40'];
-        $orders=OracleDOCOrderHeader::select('OrderNo','SoStatus')->whereIn('orderno',$checkData)->whereIn('SoStatus',$sostatus)->get();
-        if(count($checkData)!=count($orders))return ['success'=>false,'fail_info'=>"勾选订单有不可取消分配订单"];
-        foreach ($orders as $order){
-            $is_deAllocation=$this->isDeAllocation($order->orderno);
-            $waveno=OracleDOCOrderHeader::where('orderno',$order->orderno)->value('waveno');
-            if ($waveno && $waveno!='*'){
-                OracleDOCWaveDetails::where('waveno',$waveno)->where('orderno',$order->orderno)->delete();
-                app('LogService')->log(__METHOD__,'批量取消分配删除波次号'.__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
+        $sostatus = ['30', '40'];
+        $orders = OracleDOCOrderHeader::select('OrderNo', 'SoStatus')->whereIn('orderno', $checkData)->whereIn('SoStatus', $sostatus)->get();
+        if (count($checkData) != count($orders)) return ['success' => false, 'fail_info' => "勾选订单有不可取消分配订单"];
+        foreach ($orders as $order) {
+            $is_deAllocation = $this->isDeAllocation($order->orderno);
+            $waveno = OracleDOCOrderHeader::where('orderno', $order->orderno)->value('waveno');
+            if ($waveno && $waveno != '*') {
+                OracleDOCWaveDetails::where('waveno', $waveno)->where('orderno', $order->orderno)->delete();
+                app('LogService')->log(__METHOD__, '批量取消分配删除波次号' . __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
             }
-            $deAllocation=OracleDOCOrderHeader::where('orderno',$order->orderno)->update(['sostatus'=>'00','waveno'=>'*']);
-            app('LogService')->log(__METHOD__,'批量取消分配'.__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
-            if (!$is_deAllocation||!$deAllocation)return ['success'=>false,'fail_info'=>"数据 {$order['orderno']} 更新失败"];
+            $deAllocation = OracleDOCOrderHeader::where('orderno', $order->orderno)->update(['sostatus' => '00', 'waveno' => '*']);
+            app('LogService')->log(__METHOD__, '批量取消分配' . __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
+            if (!$is_deAllocation || !$deAllocation) return ['success' => false, 'fail_info' => "数据 {$order['orderno']} 更新失败"];
         }
-        return ['success'=>true];
+        return ['success' => true];
     }
+
     //冻结
-    public function freeze(Request $request){
-        if(!Gate::allows('订单管理-编辑')){ return redirect(url('/'));  }
-        $orderno=$request->input('orderno');
-        $waveno=$request->input('waveno');
-        if ($waveno && $waveno!='*'){
-            OracleDOCWaveDetails::where('waveno',$waveno)->where('orderno',$orderno)->delete();
-            app('LogService')->log(__METHOD__,'冻结删除波次号'.__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
+    public function freeze(Request $request)
+    {
+        if (!Gate::allows('订单管理-编辑')) {
+            return redirect(url('/'));
+        }
+        $orderno = $request->input('orderno');
+        $waveno = $request->input('waveno');
+        if ($waveno && $waveno != '*') {
+            OracleDOCWaveDetails::where('waveno', $waveno)->where('orderno', $orderno)->delete();
+            app('LogService')->log(__METHOD__, '冻结删除波次号' . __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
         }
-        OracleDOCOrderHeader::where('orderno',$orderno)->update(['releasestatus'=>'H','waveno'=>'*']);
-        app('LogService')->log(__METHOD__,'冻结'.__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
-        return ['success'=>true];
+        OracleDOCOrderHeader::where('orderno', $orderno)->update(['releasestatus' => 'H', 'waveno' => '*']);
+        app('LogService')->log(__METHOD__, '冻结' . __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
+        return ['success' => true];
     }
-    public function thaw(Request $request){
-        if(!Gate::allows('订单管理-编辑')){ return redirect(url('/'));  }
+
+    public function thaw(Request $request)
+    {
+        if (!Gate::allows('订单管理-编辑')) {
+            return redirect(url('/'));
+        }
         $orderno = $request->orderno;
         if (!is_array($orderno)) {
             $orderno = [$orderno];
         }
-        OracleDOCOrderHeader::query()->whereIn('orderno',$orderno)->update(['releasestatus'=>'N']);
-        app('LogService')->log(__METHOD__,'解冻'.__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
-        return ['success'=>true];
+        OracleDOCOrderHeader::query()->whereIn('orderno', $orderno)->update(['releasestatus' => 'N']);
+        app('LogService')->log(__METHOD__, '解冻' . __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
+        return ['success' => true];
     }
 
     //重置快递获取标记
-    public function resetLogisticsGetMark(Request $request){
-        if(!Gate::allows('订单管理-编辑')){ return redirect(url('/'));  }
-        $orderno=$request->orderno;
-        OracleDOCOrderHeader::query()->whereIn('orderno',$orderno)->where('edisendflag2','W')->update(['edisendflag2'=>'N']);
-        app('LogService')->log(__METHOD__,'解冻'.__FUNCTION__,json_encode($orderno),Auth::user()['id']);
-        return ['success'=>true];
+    public function resetLogisticsGetMark(Request $request)
+    {
+        if (!Gate::allows('订单管理-编辑')) {
+            return redirect(url('/'));
+        }
+        $orderno = $request->orderno;
+        OracleDOCOrderHeader::query()->whereIn('orderno', $orderno)->where('edisendflag2', 'W')->update(['edisendflag2' => 'N']);
+        app('LogService')->log(__METHOD__, '解冻' . __FUNCTION__, json_encode($orderno), Auth::user()['id']);
+        return ['success' => true];
     }
 
     //取消分配
-    public function deAllocation(Request $request){
-        if(!Gate::allows('订单管理-编辑')){ return redirect(url('/'));  }
-        $orderno=$request->input('orderno');
-        $waveno=$request->input('waveno');
-        if ($waveno && $waveno!='*'){
-            OracleDOCWaveDetails::where('waveno',$waveno)->where('orderno',$orderno)->delete();
-            app('LogService')->log(__METHOD__,'取消分配删除波次号'.__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
+    public function deAllocation(Request $request)
+    {
+        if (!Gate::allows('订单管理-编辑')) {
+            return redirect(url('/'));
         }
-        OracleDOCOrderHeader::where('orderno',$orderno)->update(['sostatus'=>'00','waveno'=>'*']);
-        app('LogService')->log(__METHOD__,'取消分配'.__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
-        $is_deAllocation=$this->isDeAllocation($orderno);
-        if($is_deAllocation) return ['success'=>true];
+        $orderno = $request->input('orderno');
+        $waveno = $request->input('waveno');
+        if ($waveno && $waveno != '*') {
+            OracleDOCWaveDetails::where('waveno', $waveno)->where('orderno', $orderno)->delete();
+            app('LogService')->log(__METHOD__, '取消分配删除波次号' . __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
+        }
+        OracleDOCOrderHeader::where('orderno', $orderno)->update(['sostatus' => '00', 'waveno' => '*']);
+        app('LogService')->log(__METHOD__, '取消分配' . __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
+        $is_deAllocation = $this->isDeAllocation($orderno);
+        if ($is_deAllocation) return ['success' => true];
 
     }
+
     //调用sp取消选中订单的分配
-    public function isDeAllocation($orderno){
-        $username=config('database.connections.oracle.username');
-        $password=config('database.connections.oracle.password');
-        $host=config('database.connections.oracle.host');
-        $service_name=config('database.connections.oracle.service_name');
-        $conn=oci_connect($username,$password,$host.'/'.$service_name,'utf8'); //连接oracle数据库
-        $IN_Warehouse='';
-        $IN_Process_Action_C='' ;
-        $IN_Process_By_C='By OrderNO';
-        $IN_WaveNO_C='';
-        $IN_OrderNO_C=$orderno;
-        $IN_OrderLineNO_C='';
-        $IN_AllocationDetailsID='';
-        $IN_Language='';
-        $IN_UserID='';
-        $OUT_Return_Code='';
-        $sql_sp="begin SPSO_DEALLOCATION_PROCESS(:IN_Warehouse,:IN_Process_Action_C,:IN_Process_By_C,
+    public function isDeAllocation($orderno)
+    {
+        $username = config('database.connections.oracle.username');
+        $password = config('database.connections.oracle.password');
+        $host = config('database.connections.oracle.host');
+        $service_name = config('database.connections.oracle.service_name');
+        $conn = oci_connect($username, $password, $host . '/' . $service_name, 'utf8'); //连接oracle数据库
+        $IN_Warehouse = '';
+        $IN_Process_Action_C = '';
+        $IN_Process_By_C = 'By OrderNO';
+        $IN_WaveNO_C = '';
+        $IN_OrderNO_C = $orderno;
+        $IN_OrderLineNO_C = '';
+        $IN_AllocationDetailsID = '';
+        $IN_Language = '';
+        $IN_UserID = '';
+        $OUT_Return_Code = '';
+        $sql_sp = "begin SPSO_DEALLOCATION_PROCESS(:IN_Warehouse,:IN_Process_Action_C,:IN_Process_By_C,
         :IN_WaveNO_C,:IN_OrderNO_C,:IN_OrderLineNO_C,:IN_AllocationDetailsID,:IN_Language,:IN_UserID,:OUT_Return_Code); end;";
         $stmt = oci_parse($conn, $sql_sp);
-        oci_bind_by_name($stmt,':IN_Warehouse',$IN_Process_Action_C);
-        oci_bind_by_name($stmt,':IN_Process_Action_C',$IN_Warehouse);
-        oci_bind_by_name($stmt,':IN_Process_By_C',$IN_Process_By_C);
-        oci_bind_by_name($stmt,':IN_WaveNO_C',$IN_WaveNO_C);
-        oci_bind_by_name($stmt,':IN_OrderNO_C',$IN_OrderNO_C);
-        oci_bind_by_name($stmt,':IN_OrderLineNO_C',$IN_OrderLineNO_C);
-        oci_bind_by_name($stmt,':IN_AllocationDetailsID',$IN_AllocationDetailsID);
-        oci_bind_by_name($stmt,':IN_Language',$IN_Language);
-        oci_bind_by_name($stmt,':IN_UserID',$IN_UserID);
-        oci_bind_by_name($stmt,':OUT_Return_Code',$OUT_Return_Code,300);
+        oci_bind_by_name($stmt, ':IN_Warehouse', $IN_Process_Action_C);
+        oci_bind_by_name($stmt, ':IN_Process_Action_C', $IN_Warehouse);
+        oci_bind_by_name($stmt, ':IN_Process_By_C', $IN_Process_By_C);
+        oci_bind_by_name($stmt, ':IN_WaveNO_C', $IN_WaveNO_C);
+        oci_bind_by_name($stmt, ':IN_OrderNO_C', $IN_OrderNO_C);
+        oci_bind_by_name($stmt, ':IN_OrderLineNO_C', $IN_OrderLineNO_C);
+        oci_bind_by_name($stmt, ':IN_AllocationDetailsID', $IN_AllocationDetailsID);
+        oci_bind_by_name($stmt, ':IN_Language', $IN_Language);
+        oci_bind_by_name($stmt, ':IN_UserID', $IN_UserID);
+        oci_bind_by_name($stmt, ':OUT_Return_Code', $OUT_Return_Code, 300);
         oci_execute($stmt);
-        if (substr($OUT_Return_Code,0,3) != '000'){
-            app('LogService')->log(__METHOD__,'调用sp根据订单取消分配失败'.__FUNCTION__,"ORDERNO:".$orderno."ERROR:".$OUT_Return_Code);
+        if (substr($OUT_Return_Code, 0, 3) != '000') {
+            app('LogService')->log(__METHOD__, '调用sp根据订单取消分配失败' . __FUNCTION__, "ORDERNO:" . $orderno . "ERROR:" . $OUT_Return_Code);
             return false;
         }
         oci_close($conn);
@@ -326,32 +368,34 @@ sql;
 
     public function resetInterfaceReturnMark(Request $request)
     {
-        if(!Gate::allows('订单管理-编辑')){ return redirect(url('/'));  }
-        $orderno=$request->orderno;
-        $oldIds =OracleDOCOrderHeader::query()
+        if (!Gate::allows('订单管理-编辑')) {
+            return redirect(url('/'));
+        }
+        $orderno = $request->orderno;
+        $oldIds = OracleDOCOrderHeader::query()
             ->whereIn('orderno', $orderno)
             ->where('edisendflag', 'N')->pluck('orderno')->toArray();
 
         OracleDOCOrderHeader::query()
-            ->whereIn('orderno',$orderno)
-            ->where('sostatus','99')
-            ->whereIn('edisendflag',['R','W'])
-            ->where('addwho','EDI')
-            ->update(['edisendflag'=>'N']);
+            ->whereIn('orderno', $orderno)
+            ->where('sostatus', '99')
+            ->whereIn('edisendflag', ['R', 'W'])
+            ->where('addwho', 'EDI')
+            ->update(['edisendflag' => 'N']);
 
-        $failedOrdernos =OracleDOCOrderHeader::query()
+        $failedOrdernos = OracleDOCOrderHeader::query()
             ->whereIn('orderno', $orderno)
-                ->where('edisendflag', '!=', 'N')->pluck('orderno');
+            ->where('edisendflag', '!=', 'N')->pluck('orderno');
 
-        $successedOrdernos =OracleDOCOrderHeader::query()
-            ->whereIn('orderno', array_diff($orderno,$oldIds))
+        $successedOrdernos = OracleDOCOrderHeader::query()
+            ->whereIn('orderno', array_diff($orderno, $oldIds))
             ->where('edisendflag', 'N')->pluck('orderno');
 
-        app('LogService')->log(__METHOD__,'重置接口回传标记'.__FUNCTION__,json_encode($orderno),Auth::user()['id']);
-        if (count($failedOrdernos)==0) {
-            return ['success'=>true];
+        app('LogService')->log(__METHOD__, '重置接口回传标记' . __FUNCTION__, json_encode($orderno), Auth::user()['id']);
+        if (count($failedOrdernos) == 0) {
+            return ['success' => true];
         } else {
-            return ['success'=>false,'fail_info'=>"数据 {$failedOrdernos} 更新失败,数据{$successedOrdernos}更新成功"];
+            return ['success' => false, 'fail_info' => "数据 {$failedOrdernos} 更新失败,数据{$successedOrdernos}更新成功"];
         }
     }
 
@@ -362,65 +406,127 @@ sql;
      */
     public function manualBack(Request $request): array
     {
-        if(!Gate::allows('订单管理-订单-一键回传'))return["success"=>false,"data"=>"无权操作"];
+        if (!Gate::allows('订单管理-订单-一键回传')) return ["success" => false, "data" => "无权操作"];
         /** @var OrderService $orderService */
-        $orderService=app(OrderService::class);
-        $orderNos=$request->input('ordernos');
-        $failNo=array();
-        $successNo=array();
-        $docOrders=OracleDOCOrderHeader::query()
-            ->whereIn('orderno',$orderNos)
+        $orderService = app(OrderService::class);
+        $orderNos = $request->input('ordernos');
+        $failNo = array();
+        $successNo = array();
+        $docOrders = OracleDOCOrderHeader::query()
+            ->whereIn('orderno', $orderNos)
             ->get();
         /** @var OrderService $service */
-        $service=app("OrderService");
-        foreach ($docOrders as $order){
-            if ($order->sostatus=='00' || $order->sostatus=='10' || $order->sostatus=='20'){
-                $res = $service->allocation($order->orderno,null,$order->warehouseid);
-                if (mb_substr($res,0,3)!='000') {
-                    array_push($failNo,$order->orderno);
-                    app('LogService')->log(__METHOD__,'手动回传分配失败'.__FUNCTION__,json_encode($order->orderno),Auth::user()['id']);
+        $service = app("OrderService");
+        foreach ($docOrders as $order) {
+            if ($order->sostatus == '00' || $order->sostatus == '10' || $order->sostatus == '20') {
+                $res = $service->allocation($order->orderno, null, $order->warehouseid);
+                if (mb_substr($res, 0, 3) != '000') {
+                    array_push($failNo, $order->orderno);
+                    app('LogService')->log(__METHOD__, '手动回传分配失败' . __FUNCTION__, json_encode($order->orderno), Auth::user()['id']);
                 }
             }
         }
-        foreach ($orderNos as $no){
-            $res=$orderService->manualBack($no);
-            if (!$res){
-                array_push($failNo,$no);
-                app('LogService')->log(__METHOD__,'人工回传失败'.__FUNCTION__,json_encode($no),Auth::user()['id']);
-            }else{
-                array_push($successNo,$no);
+        foreach ($orderNos as $no) {
+            $res = $orderService->manualBack($no);
+            if (!$res) {
+                array_push($failNo, $no);
+                app('LogService')->log(__METHOD__, '人工回传失败' . __FUNCTION__, json_encode($no), Auth::user()['id']);
+            } else {
+                array_push($successNo, $no);
             }
         }
-        if (count($orderNos)>=count($failNo))return ["success"=>true,"successNo"=>$orderNos,"failNo"=>$failNo];
-        else return ["success"=>false,"failNo"=>$failNo];
+        if (count($orderNos) >= count($failNo)) return ["success" => true, "successNo" => $orderNos, "failNo" => $failNo];
+        else return ["success" => false, "failNo" => $failNo];
     }
 
-    public function allocation(Request $request):array
+    public function allocation(Request $request): array
     {
-        if(!Gate::allows('订单管理-编辑'))return["status"=>'fail',"msg"=>"无权操作"];
-        $list = $request->input("list",[]);
+        if (!Gate::allows('订单管理-编辑')) return ["status" => 'fail', "msg" => "无权操作"];
+        $list = $request->input("list", []);
         $error = [];
         /** @var OrderService $service */
-        $service=app("OrderService");
+        $service = app("OrderService");
         $conn = null;
-        foreach ($list as $item){
-            if (!$item["number"]){
+        foreach ($list as $item) {
+            if (!$item["number"]) {
                 $error[] = "'{$item["code"]}'尚未获取快递单号";
                 continue;
             }
-            if ((int)$item["status"]>30){
+            if ((int)$item["status"] > 30) {
                 $error[] = "'{$item["code"]}'已被分配";
                 continue;
             }
-            if (!$conn)$conn = $this->getFluxConnection();
-            $res = $service->allocation($item["code"],null,$item["warehouse"],$conn);
-            if (mb_substr($res,0,3)=='000')continue;
+            if (!$conn) $conn = $this->getFluxConnection();
+            $res = $service->allocation($item["code"], null, $item["warehouse"], $conn);
+            if (mb_substr($res, 0, 3) == '000') continue;
             $error[] = "'{$item["code"]}'{$res}";
         }
-        if ($conn)$this->releaseFluxConnection($conn);
-        if (!$error)return["status"=>'success'];
-        $txt = implode(",",$error);
-        return["status"=>'part',"msg"=>$txt];
+        if ($conn) $this->releaseFluxConnection($conn);
+        if (!$error) return ["status" => 'success'];
+        $txt = implode(",", $error);
+        return ["status" => 'part', "msg" => $txt];
+    }
+
+    /**
+     * 一键揽收分配
+     * @param Request $request
+     * @return array
+     */
+    public function collectUpload(Request $request): array
+    {
+        $inOrderno = $request->orderno;
+        $strict = $request->strict;
+        if (empty($inOrderno)) return ['success' => false, 'message' => '选择为空'];
+
+        $orderno = deep_copy($inOrderno);
+
+        /**
+         * 是否是严格模式
+         * 是
+         *          根据筛选条件
+         *           1. 状态 61 81
+         *           2. 承运商是中通
+         *           3. 有单号
+         *           4. 有复核,
+         *           5. 没揽收
+         * 否
+         * 筛选出快递单号
+         * 将快递单号调用一键揽收
+         *      如果返回异常,记录异常
+         * 调用分配
+         *  严格模式下:将入参与过滤结果取差集合,结果就是不复核的单号,作为错误提示返回
+         */
+
+        //严格模式,校验订单与包裹状态
+        /** @var OrderService $orderService */
+        $orderService = app('OrderService');
+        foreach ($orderno as $no)$orderService->manualBack($no);
+        $logisticNums = $orderService->getCollectUploadLogisticNumbers($strict, $orderno);
+        if (!$logisticNums)return ["success"=>"揽收失败","message"=>"订单不允许发起揽收"];
+        //调用一键揽收
+        /** @var OrderPackageService $orderPackageService */
+        $orderPackageService = app('OrderPackageService');
+        $collectUpLoadResult = $orderPackageService->collectUpload($logisticNums->toArray());
+
+        $error = [];
+        //揽收有异常记录
+        $collectFailed = (!$collectUpLoadResult['success']) ?? false;
+        if ($collectFailed) {
+            $error['collectUpload'] = $collectUpLoadResult['message'] ?? '';
+        }
+
+        $result = [];
+        if (!empty($error)) {
+            $result['success'] = false;
+            $result['error_message'] = $error;
+        } else if (!empty($errorOrderno)) {
+            $result['success'] = false;
+            $result['error_message'][] = $error;
+        } else {
+            $result['success'] = true;
+            $result['message'] = '一键揽收完成';
+        }
+        return $result;
     }
 
 }

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

@@ -36,13 +36,14 @@ use Oursdreams\Export\Export;
 class OrderIssueController extends Controller
 {
 
-    public function index(Request $request, OrderIssueFilters $filter)
+    public function index(Request $request, OrderIssueFilters $filter,OrderIssueService $service)
     {
         if (!Gate::allows('订单管理-问题件-查询')) {
             return redirect(url('/'));
         }
         $owners = app(OwnerService::class)->getAuthorizedOwners();
         $orderIssues = OrderIssue::query()->filter($filter)->defaultWith()->paginate($request['paginate'] ?? 50);
+        $service->tagWorkOrder($orderIssues);
         $orderIssueType = OrderIssueType::all();
         $qualityLabel = QualityLabel::all();
         $logistics = Logistic::all();

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

@@ -70,7 +70,6 @@ class OwnerFeeTotalController extends Controller implements \App\Interfaces\Sett
 
     public function export(Request $request)
     {
-        // TODO: Implement export() method.
     }
 
     public function confirmBill(Request $request): \Illuminate\Http\RedirectResponse

+ 0 - 3
app/Http/Controllers/OwnerWaybillSettlementBillController.php

@@ -9,16 +9,13 @@ class OwnerWaybillSettlementBillController extends Controller implements \App\In
     //
     public function index(Request $request)
     {
-        // TODO: Implement index() method.
     }
 
     public function confirmBill(Request $request): \Illuminate\Http\RedirectResponse
     {
-        // TODO: Implement confirmBill() method.
     }
 
     public function export(Request $request)
     {
-        // TODO: Implement export() method.
     }
 }

+ 108 - 5
app/Http/Controllers/TestController.php

@@ -101,6 +101,7 @@ use Laravel\Horizon\Events\JobFailed;
 use Monolog\Handler\IFTTTHandler;
 use phpDocumentor\Reflection\Types\Resource_;
 use PhpOffice\PhpSpreadsheet\Calculation\Web\Service;
+use Ramsey\Uuid\Uuid;
 use Symfony\Component\ErrorHandler\Error\FatalError;
 
 class TestController extends Controller
@@ -193,10 +194,42 @@ class TestController extends Controller
         }
         app("BatchService")->assignTasks($batches);
     }
-
+    /**
+     * 检查和处理揽收
+     *
+     * @param OrderPackage|\stdClass $package
+     */
+    public function checkingAndProcess(OrderPackage $package, int $lineNo)
+    {
+        //校验快递商 订单状态 复核标记 揽收标记
+        $package->loadMissing("order.logistic");
+        if ($package->collecting_status == '1' || !$package->logistic_number)dd(1);
+        if (strpos($package->order->logistic->code ?? '','ZTO') === false)dd(2);
+        $statusMapping = array_flip(Order::STATUS);
+        //if (($statusMapping[$package->order->wms_status] ?? 99) > 63)dd(3);
+        /** @var OrderPackageService $orderPackageService */
+        $orderPackageService = app('OrderPackageService');
+        $result = $orderPackageService->collectUpload([$package->logistic_number]);
+        dump($result);
+        if (!$result["success"]){
+            dd("自动揽收失败",["message"=>$result["message"],"param"=>$package->logistic_number]);
+        }
+        $result = app("OrderService")->allocation($package->order->code,$lineNo);
+        dump($result);
+        if (mb_substr($result,0,3)=='000'){
+            if (OrderPackage::query()->where("id",$package->id)
+                    ->where("collecting_status",'0')->update(["collecting_status"=>'1'])!=1)
+                dd("自动揽收异常",["message"=>"未能成功修改揽收标记","param"=>$package->toArray()]);
+        }else  dd("自动揽收失败",["message"=>"分配失败:{$result}","param"=>$package->order->code." : {$lineNo}"]);
+    }
     public function test()
     {
-        dd(Notification::send(User::query()->where("name","baoshi56")->get(),
+
+        $a = memory_get_usage();
+        $tmp = str_repeat('http://blog.huachen.me/', 4000);
+        $b = memory_get_usage();
+        dump($b-$a);
+        dd(Notification::send(User::query()->where("name","zhouzhendong")->get(),
             new RoutineNotification(SeeLog::query()->first()->toArray())));
         $user = Auth::user();
         $remark = "zengjunlj";
@@ -486,8 +519,8 @@ sql;
         /** @var OrderPackageService $service */
         $service = app('OrderPackageService');
        return $service->collectUpload([
-            '75803656098638',
-            '75803656098612'
+            '75810646867541',
+            '75810646197516'
         ]);
     }
 
@@ -579,7 +612,6 @@ sql;
             'value' => $date,
         ]);
     }
-
     public function clearCache()
     {
         $service = new StoreService();
@@ -609,8 +641,79 @@ sql;
             ->whereNotIn('id', $storeItemMaxIds)
             ->delete();
     }
+
     public function init_SettlementBillReportTask()
     {
         $this->dispatch(new SettlementBillReportJob('2021-08-01',[]));
     }
+    public function test2(){
+        $source_file ="E:\OneDrive\桌面\工作目录\文件库\\5.jpg";
+
+        $img = ImageCreateFromJpeg($source_file);
+        imagecolortransparent($img);//将某个颜色设置成透明色
+        imagecolorstotal($img);
+        header('Content-type:image/jpeg');
+        imagejpeg($img);
+        //dd($this->run('E:\OneDrive\桌面\工作目录\文件库\5.jpg', 'E:\OneDrive\桌面\工作目录\文件库\6.jpg'));
+    }
+
+
+    const FILE_NOT_FOUND = '-1';
+    const FILE_EXTNAME_ILLEGAL = '-2';
+
+    public function run($src1, $src2) {
+        if(!is_file($src1) || !is_file($src2)) exit(self::FILE_NOT_FOUND);
+        $hash1 = $this->getHashValue($src1);
+        $hash2 = $this->getHashValue($src2);
+        if(strlen($hash1) !== strlen($hash2)) return false;
+        $count = 0;
+        $len = strlen($hash1);
+        for($i = 0; $i < $len; $i++) if($hash1[$i] !== $hash2[$i]){
+            $count++;
+        }
+        dd($count);
+        return $count <= 10 ? true : false;
+    }
+
+    public function getImage($file) {
+        $extname = pathinfo($file, PATHINFO_EXTENSION);
+        if(!in_array($extname, ['jpg','jpeg','png','gif'])) exit(self::FILE_EXTNAME_ILLEGAL);
+        $img = call_user_func('imagecreatefrom'. ( $extname == 'jpg' ? 'jpeg' : $extname ) , $file);
+        return $img;
+    }
+    public function getHashValue($file) {
+        $w = 32;
+        $h = 32;
+        $img = imagecreatetruecolor($w, $h);
+        list($src_w, $src_h) = getimagesize($file);
+        $src = $this->getImage($file);
+        imagecopyresampled($img, $src, 0, 0, 0, 0, $w, $h, $src_w, $src_h);
+        imagedestroy($src);
+        $total = 0;
+        $array = array();
+        for( $y = 0; $y < $h; $y++) {
+            for ($x = 0; $x < $w; $x++) {
+                $rgb = imagecolorat($img, $x, $y);
+                $gray = $rgb & 0xFF;
+                /*dump([
+                    ($rgb >> 8) & 0xFF,
+                    ($rgb >> 16) & 0xFF,
+                    $rgb & 0xFF,
+                ]);*/
+                if(!isset($array[$y])) $array[$y] = array();
+                $array[$y][$x] = $gray;
+                $total += $gray;
+            }
+        }
+        imagedestroy($img);
+        $average = intval($total / ($w * $h * 2));
+        $hash = '';
+        for($y = 0; $y < $h; $y++) {
+            for($x = 0; $x < $w; $x++) {
+                $hash .= ($array[$y][$x] >= $average) ? '1' : '0';
+            }
+        }
+        dump($hash);
+        return $hash;
+    }
 }

+ 12 - 8
app/Http/Controllers/WorkOrderController.php

@@ -56,14 +56,18 @@ class WorkOrderController extends Controller
         if (OrderIssue::query()->whereIn('order_id',$work_orders->map(function($item){return $item['order_id'];}))->exists()){
             return ['success' => false, 'message' => '已有对应的问题件'];
         }
-        $result = $service->buildOrderIssue($work_orders);
-        if (!$result['success']) return $result;
-        $workOrders = WorkOrder::query()->with(['type', 'creator', 'order' => function ($query) {
-            /** @var $query Builder */
-            $query->with('packages', 'issue', 'logistic');
-        }, 'reviewer','issueType'])->whereIn(  'id',$request['ids'])->get();
-        $service->tags($workOrders);
-        return ['success' => true ,'data' => $workOrders];
+        try {
+            $result = $service->buildOrderIssue($work_orders);
+            if (!$result['success']) return $result;
+            $workOrders = WorkOrder::query()->with(['type', 'creator', 'order' => function ($query) {
+                /** @var $query Builder */
+                $query->with('packages', 'issue', 'logistic');
+            }, 'reviewer', 'issueType'])->whereIn('id', $request['ids'])->get();
+            $service->tags($workOrders);
+            return ['success' => true, 'data' => $workOrders];
+        } catch (\Exception $e) {
+            return  ['success' => true, 'message' => '创建问题件失败,检查对应问题件是否存在,刷新重试'];
+        }
     }
 
     // 创建工单 api

+ 6 - 1
app/Http/Requests/GateRequest.php

@@ -4,6 +4,8 @@ namespace App\Http\Requests;
 
 use App\Services\MenuService;
 use Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Log;
 
 class GateRequest extends FormRequest
 {
@@ -124,7 +126,10 @@ class GateRequest extends FormRequest
     {
         $url = null;
         //目标节点存在
-        if ($this->tracks)$url = $this->searchOrigin(app("MenuService")->getVisibleFunctionList());
+        if ($this->tracks){
+            $url = $this->searchOrigin(app("MenuService")->getVisibleFunctionList());
+            if ($url)Log::notice("同源策略跳转",["user"=>Auth::id(),"url"=>$url,"currentRoute"=>$this->currentRoute]);
+        }
         if (!$url)$url = 'denied';
         header('Location: /'.$url,true,301);
         die();

+ 58 - 0
app/Jobs/PackageCollectingAllocation.php

@@ -0,0 +1,58 @@
+<?php
+
+namespace App\Jobs;
+
+use App\OrderPackage;
+use App\Services\OrderPackageService;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Support\Facades\Log;
+
+class PackageCollectingAllocation implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable;
+
+    /** @var OrderPackage|\stdClass $orderPackage */
+    private $orderPackage;
+
+    /** @var int|null|string */
+    private $lineNo;
+
+    /**
+     * Create a new job instance.
+     *
+     * @return void
+     */
+    public function __construct(OrderPackage $package,int $lineNo)
+    {
+        $this->orderPackage = $package;
+        $this->lineNo = $lineNo;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        /** @var OrderPackageService $orderPackageService */
+        $orderPackageService = app('OrderPackageService');
+        $result = $orderPackageService->collectUpload([$this->orderPackage->logistic_number]);
+        if (!$result["success"]){
+            Log::warning("自动揽收失败",["message"=>$result["message"],"param"=>$this->orderPackage->logistic_number]);
+            return;
+        }
+        if (OrderPackage::query()->where("id",$this->orderPackage->id)
+                ->where("collecting_status",'0')->update(["collecting_status"=>'1'])!=1)
+            Log::warning("自动揽收异常",["message"=>"未能成功修改揽收标记","param"=>$this->orderPackage->toArray()]);
+        /*$result = app("OrderService")->allocation($this->orderPackage->order->code,$this->lineNo);
+        if (mb_substr($result,0,3)=='000'){
+            if (OrderPackage::query()->where("id",$this->orderPackage->id)
+                ->where("collecting_status",'0')->update(["collecting_status"=>'1'])!=1)
+                Log::warning("自动揽收异常",["message"=>"未能成功修改揽收标记","param"=>$this->orderPackage->toArray()]);
+        }else Log::warning("自动揽收失败",["message"=>"分配失败:{$result}","param"=>$this->orderPackage->order->code." : {$this->lineNo}"]);*/
+    }
+}

+ 34 - 17
app/Jobs/ResetInstantBill.php

@@ -7,12 +7,10 @@ use App\Order;
 use App\OwnerFeeDetail;
 use App\OwnerFeeDetailLogistic;
 use App\OwnerFeeExpress;
+use App\OwnerFeeLogistic;
 use App\Process;
-use App\Province;
 use App\RejectedBill;
-use App\Services\CacheService;
 use App\Services\OwnerPriceDirectLogisticService;
-use App\Services\OwnerPriceExpressService;
 use App\Services\OwnerPriceLogisticService;
 use App\Services\OwnerPriceOperationService;
 use App\Store;
@@ -22,12 +20,10 @@ use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;
 use Illuminate\Foundation\Bus\Dispatchable;
 use Illuminate\Queue\InteractsWithQueue;
-use Illuminate\Queue\SerializesModels;
-use Illuminate\Support\Facades\Cache;
 
 class ResetInstantBill implements ShouldQueue
 {
-    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+    use Dispatchable, InteractsWithQueue, Queueable;
 
     /** @var \stdClass $detail  */
     private $detail;
@@ -79,9 +75,8 @@ class ResetInstantBill implements ShouldQueue
                     "work_tax_fee"      => $workTaxFee,
                     "logistic_tax_fee"  => $logisticInfo["logisticTaxFee"],
                 ]);
-                //向指定表插入标记 TODO
-                //if ($logisticInfo["logisticFee"] && $logisticInfo["fee_info"])OwnerFeeExpress::query()->insert($logisticInfo["fee_info"]);
-                /*if ($money>0)app("StoreService")->constructFeeInfo([
+                if ($logisticInfo["logisticFee"] && $logisticInfo["fee_info"])OwnerFeeExpress::query()->insert($logisticInfo["fee_info"]);
+                if ($money>0)app("StoreService")->constructFeeInfo([
                     "worked_at" => $order->wms_edittime ?: $order->updated_at,
                     "owner_id" => $order->owner_id,
                     "model_id"  => $id,
@@ -91,7 +86,7 @@ class ResetInstantBill implements ShouldQueue
                     "total_fee"    =>0,
                     "tax_rate"     =>0,
                     "fee_description"=>'',
-                ]);*/
+                ]);
                 //后续处理
                 OwnerFeeDetailLogistic::query()->where("owner_fee_detail_id",$this->detail->id)->delete();
                 foreach ($logisticInfo["items"] as &$item)$item["owner_fee_detail_id"] = $this->detail->id;
@@ -132,7 +127,7 @@ class ResetInstantBill implements ShouldQueue
                     $service = app("OwnerPriceLogisticService");
                     list($fee,$taxFee) = $service->matching($waybill->carrier_weight_other,$owner_id,$waybill->logistic_id,
                         $waybill->carrier_weight_unit_id_other,$provinceId, $cityId);
-                    //$this->buildWaybillFeeInfo(); TODO
+                    if (isset($GLOBALS["FEE_INFO"])) OwnerFeeLogistic::query()->create($GLOBALS["FEE_INFO"]);
                 }else{
                     /** @var OwnerPriceDirectLogisticService $service */
                     $service = app("OwnerPriceDirectLogisticService");
@@ -162,7 +157,7 @@ class ResetInstantBill implements ShouldQueue
                     "owner_price_operation_id" => $id,
                     "work_tax_fee" => $taxFee,
                 ]);
-               /* if ($money>0)$this->constructFeeInfo([
+                if ($money>0)app("StoreService")->constructFeeInfo([
                     "worked_at" => $store->updated_at,
                     "owner_id" => $store->owner_id,
                     "model_id"  => $id,
@@ -172,15 +167,15 @@ class ResetInstantBill implements ShouldQueue
                     "total_fee"    =>0,
                     "tax_rate"     =>0,
                     "fee_description"=>'',
-                ]);*/
+                ]);
                 break;
             case "rejected_bills":
                 /** @var \stdClass $rejectedBill */
                 $number = array_column(StoreRejected::query()->where("logistic_number_return",$rejectedBill->logistic_number_return)->get()->toArray(),"store_id");
-
-                foreach (Store::query()->with("storeItems")->whereIn("id",$number)->get() as $store){
-                    /** @var OwnerPriceOperationService $service */
-                    $service = app("OwnerPriceOperationService");
+                $stores = Store::query()->with("storeItems")->whereIn("id",$number)->get();
+                /** @var OwnerPriceOperationService $service */
+                $service = app("OwnerPriceOperationService");
+                foreach ($stores as $store){
                     $GLOBALS["FEE_INFO"] = [];
                     list($id,$money,$taxFee) = $service->matching($store, Feature::MAPPING["store"], $store->owner_id, "入库",0);
                     app("StoreService")->clearFeeInfo($store->asn_code);
@@ -201,6 +196,28 @@ class ResetInstantBill implements ShouldQueue
                         "fee_description"=>'',
                     ]);
                 }
+                if ($stores->count())return;
+                $rejectedBill = RejectedBill::query()->find($this->detail->outer_id);
+                $rejectedBill->loadMissing("items");
+                $GLOBALS["FEE_INFO"] = [];
+                list($id,$money,$taxFee) = $service->matching($rejectedBill, Feature::MAPPING["rejected_bill"], $rejectedBill->id_owner, "入库",0);
+                $this->detail->update([
+                    "commodity_amount" => $rejectedBill->goods_amount,
+                    "work_fee" => $money,
+                    "owner_price_operation_id" => $id,
+                    "work_tax_fee" => $taxFee,
+                ]);
+                app("StoreService")->constructFeeInfo([
+                    "worked_at" => $rejectedBill->updated_at,
+                    "owner_id" => $rejectedBill->id_owner,
+                    "model_id"  => $id,
+                    "source_number"=> null,
+                    "doc_number"   => null,
+                    "commodity_id" => 0,
+                    "total_fee"    =>0,
+                    "tax_rate"     =>0,
+                    "fee_description"=>'',
+                ]);
         }
     }
 }

+ 20 - 0
app/Order.php

@@ -42,6 +42,26 @@ class Order extends Model
      * 仓库                 warehouse_id=>DOC_ORDER_HEADER['WAREHOUSEID']
      */
 
+    const STATUS = [
+        '00' => "创建订单",
+        '10' => "部分预配",
+        '20' => "预配完成",
+        '30' => "部分分配",
+        '40' => "分配完成",
+        '50' => "部分拣货",
+        '60' => "拣货完成",
+        '61' => "播种完成",
+        '62' => "部分装箱",
+        '63' => "完全装箱",
+        '65' => "部分装车",
+        '66' => "装车完成",
+        '70' => "部分发运",
+        '80' => "完全发运",
+        '90' => "订单取消",
+        '98' => "等待释放",
+        '99' => "订单完成",
+    ];
+
     public function cancel(){
         $this['status'] = '取消';
         $this->update();

+ 5 - 4
app/OrderPackage.php

@@ -39,10 +39,11 @@ class OrderPackage extends Model
         'transfer_status',
         'owner_id',
         'uploaded_to_wms',
-        'sync_routes_flag',
-        'is_manual_update',
-        'exception_status',
-        'is_delay_deliver',
+        'sync_routes_flag',//同步物流信息标记
+        'is_manual_update',//是否手动更新状态
+        'exception_status',//异常状态
+        'is_delay_deliver',//是否延时发货
+        'collecting_status',//手动揽收状态
     ];
 
     protected $casts = [

+ 4 - 1
app/Services/DbOpenService.php

@@ -5,6 +5,7 @@ namespace App\Services;
 use App\Components\ErrorPush;
 use App\Traits\ServiceAppAop;
 use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Facades\Log;
 
 
 class DbOpenService
@@ -34,6 +35,8 @@ class DbOpenService
 
         try {
             $response = httpPost(config('api_logistic.DB.prod.uri')['create_order'], $body, $header);
+            Log::info($body);
+            Log::info($response);
             if (!$response["result"])return null;
             return $response ?? '';
             //OracleDOCOrderHeader::query()->where('orderno', $order_no)->update(['edittime' => Carbon::now(), 'soreference5' => $mail_no]);
@@ -117,7 +120,7 @@ class DbOpenService
                 'totalWeight'       => $waybill->total_weight ?? '',
                 'totalVolume'       => '',
                 'packageService'    => $waybill->package_service ?? '',
-                'deliveryType'      => $waybill->deliveryType->name ?? '',
+                'deliveryType'      => $waybill->deliveryType->id ?? ''
             ],
             'gmtCommit'     =>  $date,
             'payType'       =>  $waybill->pay_type,

+ 0 - 1
app/Services/Express/CaiNiaoExpress.php

@@ -86,7 +86,6 @@ class CaiNiaoExpress implements expressinterface
 
     function searElectronicSingle()
     {
-        // TODO: Implement searElectronicSingle() method.
     }
 
     /**

+ 0 - 1
app/Services/Express/PDDExpress.php

@@ -6,7 +6,6 @@ namespace App\Services\Express;
 
 class PDDExpress implements ExpressInterface
 {
-    // TODO 目前获取快递单号请求参数
 
     private $app_key = '';
     private $sign_method = '';

+ 1 - 1
app/Services/ForeignHaiRoboticsService.php

@@ -500,7 +500,7 @@ class ForeignHaiRoboticsService
             $blacklist[] = $box->id;
         }
         if ($stationCollection->count()>0){
-            if (!$this->fetchGroup_multiLocation($stationCollection,$collection,'','立架出至缓存架')) return null;
+            if (!$this->fetchGroup_multiLocation($stationCollection,$collection,'','立架出至缓存架',20,false)) return null;
             app("StationService")->locationOccupyMulti($stationCollection->toArray());
             $stationCollection->each(function ($code){
                 app("CacheShelfService")->lightUp($code,'3','0',["title"=>"机器人取箱中,禁止操作"]);

+ 15 - 0
app/Services/OrderIssueService.php

@@ -12,6 +12,7 @@ use App\OrderIssueType;
 use App\OrderPackage;
 use App\Order;
 use App\RejectedBill;
+use App\WorkOrder;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
@@ -448,5 +449,19 @@ class OrderIssueService
         if (!$order_package) return;
         OrderIssue::query()->where('order_id',$order_package->order_id)->update(['is_intercept' => 1]);
     }
+
+    public function tagWorkOrder(&$orderIssues)
+    {
+        $orderIds = data_get($orderIssues->items(),'*.order_id');
+        $workOrders = WorkOrder::query()->whereIn('order_id',$orderIds)->get();
+        $tags = [];
+        $workOrders->each(function($workOrder)use(&$tags){
+            $tags[$workOrder->order_id] = true;
+        });
+        foreach ($orderIssues as &$orderIssue) {
+            if (array_key_exists($orderIssue->order_id,$tags))$orderIssue->is_work_order = true;
+            else $orderIssue->is_work_order = false;
+        }
+    }
 }
 

+ 1 - 0
app/Services/OrderPackageReceivedSyncService.php

@@ -148,6 +148,7 @@ class OrderPackageReceivedSyncService
         foreach ($logisticResponses as $logisticResponse) {
             if (empty($logisticResponse)) continue;
             $orderPackage = OrderPackage::query()->where('logistic_number', $logisticResponse['logistic_number'])->first();
+            if(empty($orderPackage)) continue;
             //如果已经收货,状态改为已签收
             if ($logisticResponse['received_at'] ?? false) {
                 $logisticResponse['status'] = '已签收';

+ 116 - 55
app/Services/OrderPackageService.php

@@ -2,6 +2,7 @@
 
 namespace App\Services;
 
+use App\Jobs\PackageCollectingAllocation;
 use App\Order;
 use App\OrderPackage;
 use App\OrderPackageCommodities;
@@ -12,7 +13,9 @@ use Carbon\Carbon;
 use App\Traits\ServiceAppAop;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Client\Response;
+use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\Http;
+use Illuminate\Support\Facades\Log;
 
 
 class OrderPackageService
@@ -279,13 +282,15 @@ class OrderPackageService
         $update_params[] = ['id', 'sent_at'];
         foreach ($packages as $package) {
             if ($package->sent_at) continue;
+            list($allocation,$orderHeader) = $map[$package->logistic_number];
             try {
-                $checktime = $map[$package->logistic_number];
+                $checktime = $allocation->checktime;
             } catch (\Exception $e) {
                 continue;
             }
             if ($checktime) {
-                $this->checkingAndProcess($package); //检查和处理揽收
+                //EDISENDFLAG
+                $this->checkingAndProcess($package,$allocation->orderlineno,$orderHeader); //检查和处理揽收
                 $update_params[] = [
                     'id' => $package->id,
                     'sent_at' => $checktime,
@@ -298,13 +303,26 @@ class OrderPackageService
     /**
      * 检查和处理揽收
      *
-     * @param OrderPackage $package
+     * @param OrderPackage|\stdClass $package
+     * @param int $lineNo
+     * @param \stdClass|mixed $orderHeader
      */
-    public function checkingAndProcess(OrderPackage $package)
+    public function checkingAndProcess(OrderPackage $package, int $lineNo, $orderHeader)
     {
-        //TODO 揽收与分配回馈时间不定 这里应该推进队列处理
-        //检查快递商来判断该快递商是否允许自动揽收发货
-        //检查揽收标记来判断是否已被揽收过
+        //校验快递商 订单状态 复核标记 揽收标记
+        $package->loadMissing("order.logistic");
+        if ($package->collecting_status == '1' || !$package->logistic_number)return;
+        if (strpos($package->order->logistic->code ?? '','ZTO') === false)return;
+        $statusMapping = array_flip(Order::STATUS);
+        if (($statusMapping[$package->order->wms_status] ?? 90) == 90){
+            Log::warning("自动揽收跳出",["status"=>$package->order->wms_status]);
+            return;
+        }
+        if ($orderHeader->edisendflag!='Y' && !app("OrderService")->manualBack($orderHeader->orderno)){
+            Log::warning("揽收回传失败",["status"=>$orderHeader->orderno]);
+            return;
+        }
+        dispatch(new PackageCollectingAllocation($package,$lineNo));
     }
 
     /**
@@ -318,7 +336,7 @@ class OrderPackageService
             $actAllocationDetails = $orderHeader->actAllocationDetails;
             foreach ($actAllocationDetails as $actAllocationDetail) {
                 $logistic_number = $actAllocationDetail->picktotraceid;
-                $map[$logistic_number] = $actAllocationDetail->checktime;
+                $map[$logistic_number] = [$actAllocationDetail,$orderHeader];
             }
         }
         return $map;
@@ -356,7 +374,7 @@ class OrderPackageService
     }
 
     /**
-     * 中通一键揽收上传
+     * 中通一键揽收
      * 由于中通接口只支持100条的操作,本接口支持100以上
      * 如果中途调用中通接口发生异常,本方法不会停止,但在最后会返回错误信息,将执行失败的单号和原因返回
      * @param $logistic_numbers array
@@ -371,65 +389,44 @@ class OrderPackageService
                 'message' => '输入快递单号为空',
             ];
         }
-//        $orderPackageCount = OrderPackage::query()->whereIn('logistic_number', $logistic_numbers)
-//            ->whereIn('order_id', function ($query) {
-//                $query->from('orders')->select('id')->whereIn('logistic_id', function ($query) {
-//                    $query->from('logistics')->select('id')->whereIn('code', [
-//                        'ZTO',
-//                        'ZTO-1',
-//                        'WPZTO',
-//                    ]);
-//                });
-//            })->count();
-//        if ($orderPackageCount !== count($logistic_numbers)) {
-//            return [
-//                'success' => false,
-//                'message' => '输入的快递单号异常,请检查承运商是否全部为中通',
-//            ];
-//        }
-
-        $url = env('APP_ENV') === 'production' ? config('api_logistic.collectUpload.ZTO.prod.url') : config('api_logistic.collectUpload.ZTO.test.url');
-        $xAppKey = env('APP_ENV') === 'production' ? config('api_logistic.collectUpload.ZTO.prod.x-appKey') : config('api_logistic.collectUpload.ZTO.test.x-appKey');
-        $appSecret = env('APP_ENV') === 'production' ? config('api_logistic.collectUpload.ZTO.prod.appSecret') : config('api_logistic.collectUpload.ZTO.test.appSecret');
-        $appId = env('APP_ENV') === 'production' ? config('api_logistic.collectUpload.ZTO.prod.appId') : config('api_logistic.collectUpload.ZTO.test.appId');
+        //根据环境获取中通接口参数
+        list($url, $xAppKey, $appSecret, $appId) = $this->getZOPCollectUploadApiParameters();
         //中通接口最大支持100条
         $logistic_numbers_chunked = array_chunk($logistic_numbers, 100);
         //中通接口返回异常信息数组
         $errorMessage = [];
         foreach ($logistic_numbers_chunked as $logistic_numbers_chunked_items) {
-            $orderPackages = OrderPackage::query()
-                ->select('weight', 'logistic_number')
-                ->whereIn('logistic_number', $logistic_numbers_chunked_items)->get();
-            //中通接口请求body
-            $collectUploadDTOS = [];
-            foreach ($orderPackages as $orderPackage) {
-                $collectUploadDTOS[] = [
-                    'billCode' => $orderPackage->logistic_number,
-                    'weight' => $orderPackage->weight ?? 0,
-                    'appId' => $appId,
-                    'importDate' => now()->toDateTimeString(),
-                ];
-            }
+            //根据单号获取包裹信息
+            $collectUploadDTOS = $this->getCollectUploadDTOS($logistic_numbers_chunked_items, $appId);
             try {
+                //调用中通接口
                 $response = $this->sentReqToZOP($collectUploadDTOS, $appSecret, $xAppKey, $url);
+                //接口返回的异常包装
+                $responseBody = json_decode($response->body());
+                //异常的接口返回
+                $errorResponseBody = $responseBody->statusCode === 'S210' ||//无权限
+                    $responseBody->statusCode === 'PARAM_ERROR' ||//揽收上传信息为空
+                    $responseBody->statusCode === 'SYSTEM_ERROR';//系统异常,请联系系统管理员
+                if ($errorResponseBody) {
+                    //有异常包装
+                    $errorMessage[] = [
+                        'status_code' => $responseBody->statusCode,
+                        'message' => $responseBody->message,
+                        'logistic_number' => $logistic_numbers_chunked_items,
+                    ];
+                } else {
+                    //没有异常将对应包裹标记为手动揽收
+                    $this->setCollectingStatus($logistic_numbers_chunked_items,1);
+                }
             } catch (\Exception $e) {
+                //调用异常,构建异常返回体
                 $errorMessage[] = [
-                    'status_code' => 'REQUEST_ERROR',
+                    'status_code' => 'HTTP_REQUEST_ERROR',
                     'message' => [$e->getMessage()],
                     'logistic_number' => $logistic_numbers_chunked_items,
                 ];
             }
-            $responseBody = json_decode($response->body());
-            if ($responseBody->statusCode === 'S210' ||//无权限
-                $responseBody->statusCode === 'PARAM_ERROR' ||//揽收上传信息为空
-                $responseBody->statusCode === 'SYSTEM_ERROR'//系统异常,请联系系统管理员
-            ) {
-                $errorMessage[] = [
-                    'status_code' => $responseBody->statusCode,
-                    'message' => $responseBody->message,
-                    'logistic_number' => $logistic_numbers_chunked_items,
-                ];
-            }
+
         }
         if (empty($errorMessage)) {
             return ['success' => true, 'message' => '一键揽收上传成功'];
@@ -459,4 +456,68 @@ class OrderPackageService
         ];
         return Http::withHeaders($headers)->withBody($body, 'application/json')->post($url);
     }
+
+    /**
+     * 根据环境获取中通一键揽收接口参数
+     * @return array
+     */
+    private function getZOPCollectUploadApiParameters(): array
+    {
+        $url = env('APP_ENV') === 'production' ? config('api_logistic.collectUpload.ZTO.prod.url') : config('api_logistic.collectUpload.ZTO.test.url');
+        $xAppKey = env('APP_ENV') === 'production' ? config('api_logistic.collectUpload.ZTO.prod.x-appKey') : config('api_logistic.collectUpload.ZTO.test.x-appKey');
+        $appSecret = env('APP_ENV') === 'production' ? config('api_logistic.collectUpload.ZTO.prod.appSecret') : config('api_logistic.collectUpload.ZTO.test.appSecret');
+        $appId = env('APP_ENV') === 'production' ? config('api_logistic.collectUpload.ZTO.prod.appId') : config('api_logistic.collectUpload.ZTO.test.appId');
+        return array($url, $xAppKey, $appSecret, $appId);
+    }
+
+    /**
+     * @param $logistic_numbers_chunked_items
+     * @param $appId
+     * @return array
+     */
+    private function getCollectUploadDTOS($logistic_numbers_chunked_items, $appId): array
+    {
+        $orderPackages = OrderPackage::query()
+            ->select('weight', 'logistic_number')
+            ->whereIn('logistic_number', $logistic_numbers_chunked_items)->get();
+        //中通接口请求body
+        $collectUploadDTOS = [];
+        foreach ($orderPackages as $orderPackage) {
+            $collectUploadDTOS[] = [
+                'billCode' => $orderPackage->logistic_number,
+                'weight' => $orderPackage->weight ?? 0,
+                'appId' => $appId,
+                'importDate' => now()->toDateTimeString(),
+            ];
+        }
+        return $collectUploadDTOS;
+    }
+
+    /**
+     * 根据快递单号设置揽收状态
+     * @param array $logistic_numbers_chunked_items
+     * @param int $status
+     */
+    private function setCollectingStatus(array $logistic_numbers_chunked_items,int $status): void
+    {
+        OrderPackage::query()
+            ->select('weight', 'logistic_number')
+            ->whereIn('logistic_number', $logistic_numbers_chunked_items)->update([
+                'collecting_status' => $status,
+            ]);
+    }
+
+    /**
+     * 根据快递单号查询orderno
+     * @param Collection $logisticNums
+     * @return Collection
+     */
+    public function getOrderCodesByLogisticNumbers(Collection $logisticNums): Collection
+    {
+        return OrderPackage::query()
+            ->whereIn('logistic_number', $logisticNums)
+            ->leftJoin('orders', 'order_id', '=', 'orders.id')
+            ->select('orders.code')
+            ->pluck('code');
+    }
 }

Разница между файлами не показана из-за своего большого размера
+ 347 - 321
app/Services/OrderService.php


+ 1 - 0
app/Services/OwnerPriceOperationService.php

@@ -422,6 +422,7 @@ class OwnerPriceOperationService
     {
         $need = "";
         foreach (Feature::TYPE_NODE as $index){
+            if (!isset($columnMapping[$index]))continue;
             if (!$need)$need=strstr($columnMapping[$index],".",true);
             $columnMapping[$index] = ltrim(strstr($columnMapping[$index],"."),".");
         }

+ 32 - 4
app/Services/RejectedBillService.php

@@ -349,10 +349,10 @@ class RejectedBillService
     {
         /** @var \stdClass $rejectedBill */
         $number = array_column(StoreRejected::query()->where("logistic_number_return",$rejectedBill->logistic_number_return)->get()->toArray(),"store_id");
-
-        foreach (Store::query()->with("storeItems")->whereIn("id",$number)->get() as $store){
-            /** @var OwnerPriceOperationService $service */
-            $service = app("OwnerPriceOperationService");
+        $stores = Store::query()->with("storeItems")->whereIn("id",$number)->get();
+        /** @var OwnerPriceOperationService $service */
+        $service = app("OwnerPriceOperationService");
+        foreach ($stores as $store){
             $GLOBALS["FEE_INFO"] = [];
             list($id,$money,$taxFee) = $service->matching($store, Feature::MAPPING["store"], $store->owner_id, "入库",0);
             $bill = OwnerFeeDetail::query()->where("outer_id",$store->id)->where("outer_table_name","stores")->first();
@@ -389,5 +389,33 @@ class RejectedBillService
                 "fee_description"=>'',
             ]);
         }
+        if ($stores->count())return;
+        $rejectedBill->loadMissing("items");
+        $GLOBALS["FEE_INFO"] = [];
+        list($id,$money,$taxFee) = $service->matching($rejectedBill, Feature::MAPPING["rejected_bill"], $rejectedBill->id_owner, "入库",0);
+        app("OwnerFeeDetailService")->create([
+            "owner_id" => $rejectedBill->id_owner,
+            "worked_at" => $rejectedBill->updated_at,
+            "type" => "收货",
+            "operation_bill" => null,
+            "commodity_amount" => $rejectedBill->goods_amount,
+            "work_fee" => $money,
+            "owner_price_operation_id" => $id,
+            "created_at" => date('Y-m-d H:i:s'),
+            "outer_id" => $rejectedBill->id,
+            "outer_table_name" => "rejected_bills",
+            "work_tax_fee" => $taxFee,
+        ]);
+        app("StoreService")->constructFeeInfo([
+            "worked_at" => $rejectedBill->updated_at,
+            "owner_id" => $rejectedBill->id_owner,
+            "model_id"  => $id,
+            "source_number"=> null,
+            "doc_number"   => null,
+            "commodity_id" => 0,
+            "total_fee"    =>0,
+            "tax_rate"     =>0,
+            "fee_description"=>'',
+        ]);
     }
 }

+ 18 - 0
app/Services/WorkOrderService.php

@@ -222,4 +222,22 @@ class WorkOrderService
         $order_issue_query = OrderIssueType::query()->select('id')->where('name', '拦截');
         return WorkOrder::query()->whereIn('order_id', $package_query)->whereIn('order_issue_type_id', $order_issue_query)->exists();
     }
+
+    public function tagWorkOrder(&$orders)
+    {
+        $orderNos = data_get($orders,'*.orderno');
+        $workOrders = WorkOrder::query()->with('order')->where('order_id',function($query)use($orderNos) {
+            $query->from('orders')->select('id')->whereIn('code', $orderNos);
+        })->get();
+        $tags = [];
+        $workOrders->each(function($workOrder)use(&$tags){
+            $order_code = $workOrder->order->code ?? null;
+            if ($order_code) $tags[$order_code]= true;
+        });
+
+        foreach ($orders as &$order) {
+            if (array_key_exists($order->orderno,$tags)) $order->is_work_order= true;
+            else $order->is_work_order = false;
+        }
+    }
 }

+ 9 - 1
app/Services/weight/WeightService.php

@@ -15,6 +15,8 @@ use App\Waybill;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Support\Carbon;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
 
 class WeightService
 {
@@ -77,7 +79,13 @@ class WeightService
 
 
         // 5、更新包裹信息
-        $bool = $this->updateOrderPackage($orderPackage, $params, $measuringMachine);
+        try {
+            $bool = $this->updateOrderPackage($orderPackage, $params, $measuringMachine);
+        } catch (\Exception $e) {
+            $result = DB::select('select * from information_schema.innodb_trx');
+            Log::warning("包裹称重",["message"=>json_encode($result),"param"=>json_encode($result)]);
+            return $this->getWeightMessage($orderPackage, $e->getMessage());
+        }
         // 6、称重时间
         if ($bool) $this->afterApply($orderPackage);
         else {

+ 2 - 1
app/Traits/ModelSearchWay.php

@@ -19,7 +19,8 @@ trait ModelSearchWay
         if ($this->isSearchLike($param)) {
             $query->where($column, 'like', $param);
         } else {
-            $query->whereIn($column, array_filter(preg_split('/[,, ]+/is', $param)));
+            mb_regex_encoding('utf-8');
+            $query->whereIn($column, array_filter(preg_split('/[,, ]+/u', $param)));
         }
         return $query;
     }

+ 0 - 7
bootstrap/cache/packages.php

@@ -1,11 +1,4 @@
 <?php return array (
-  'beyondcode/laravel-dump-server' => 
-  array (
-    'providers' => 
-    array (
-      0 => 'BeyondCode\\DumpServer\\DumpServerServiceProvider',
-    ),
-  ),
   'facade/ignition' => 
   array (
     'providers' => 

+ 36 - 38
bootstrap/cache/services.php

@@ -23,25 +23,24 @@
     19 => 'Illuminate\\Translation\\TranslationServiceProvider',
     20 => 'Illuminate\\Validation\\ValidationServiceProvider',
     21 => 'Illuminate\\View\\ViewServiceProvider',
-    22 => 'BeyondCode\\DumpServer\\DumpServerServiceProvider',
-    23 => 'Facade\\Ignition\\IgnitionServiceProvider',
-    24 => 'Fideloper\\Proxy\\TrustedProxyServiceProvider',
-    25 => 'Intervention\\Image\\ImageServiceProvider',
-    26 => 'Laravel\\Horizon\\HorizonServiceProvider',
-    27 => 'Laravel\\Ui\\UiServiceProvider',
-    28 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
-    29 => 'Carbon\\Laravel\\ServiceProvider',
-    30 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
-    31 => 'Oursdreams\\Export\\ExportServiceProvider',
-    32 => 'Overtrue\\LaravelPinyin\\ServiceProvider',
-    33 => 'Te7aHoudini\\LaravelTrix\\LaravelTrixServiceProvider',
-    34 => 'Yajra\\Oci8\\Oci8ServiceProvider',
-    35 => 'App\\Providers\\AppServiceProvider',
-    36 => 'App\\Providers\\AuthServiceProvider',
-    37 => 'App\\Providers\\BroadcastServiceProvider',
-    38 => 'App\\Providers\\EventServiceProvider',
-    39 => 'App\\Providers\\HorizonServiceProvider',
-    40 => 'App\\Providers\\RouteServiceProvider',
+    22 => 'Facade\\Ignition\\IgnitionServiceProvider',
+    23 => 'Fideloper\\Proxy\\TrustedProxyServiceProvider',
+    24 => 'Intervention\\Image\\ImageServiceProvider',
+    25 => 'Laravel\\Horizon\\HorizonServiceProvider',
+    26 => 'Laravel\\Ui\\UiServiceProvider',
+    27 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
+    28 => 'Carbon\\Laravel\\ServiceProvider',
+    29 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
+    30 => 'Oursdreams\\Export\\ExportServiceProvider',
+    31 => 'Overtrue\\LaravelPinyin\\ServiceProvider',
+    32 => 'Te7aHoudini\\LaravelTrix\\LaravelTrixServiceProvider',
+    33 => 'Yajra\\Oci8\\Oci8ServiceProvider',
+    34 => 'App\\Providers\\AppServiceProvider',
+    35 => 'App\\Providers\\AuthServiceProvider',
+    36 => 'App\\Providers\\BroadcastServiceProvider',
+    37 => 'App\\Providers\\EventServiceProvider',
+    38 => 'App\\Providers\\HorizonServiceProvider',
+    39 => 'App\\Providers\\RouteServiceProvider',
   ),
   'eager' => 
   array (
@@ -55,25 +54,24 @@
     7 => 'Illuminate\\Pagination\\PaginationServiceProvider',
     8 => 'Illuminate\\Session\\SessionServiceProvider',
     9 => 'Illuminate\\View\\ViewServiceProvider',
-    10 => 'BeyondCode\\DumpServer\\DumpServerServiceProvider',
-    11 => 'Facade\\Ignition\\IgnitionServiceProvider',
-    12 => 'Fideloper\\Proxy\\TrustedProxyServiceProvider',
-    13 => 'Intervention\\Image\\ImageServiceProvider',
-    14 => 'Laravel\\Horizon\\HorizonServiceProvider',
-    15 => 'Laravel\\Ui\\UiServiceProvider',
-    16 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
-    17 => 'Carbon\\Laravel\\ServiceProvider',
-    18 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
-    19 => 'Oursdreams\\Export\\ExportServiceProvider',
-    20 => 'Overtrue\\LaravelPinyin\\ServiceProvider',
-    21 => 'Te7aHoudini\\LaravelTrix\\LaravelTrixServiceProvider',
-    22 => 'Yajra\\Oci8\\Oci8ServiceProvider',
-    23 => 'App\\Providers\\AppServiceProvider',
-    24 => 'App\\Providers\\AuthServiceProvider',
-    25 => 'App\\Providers\\BroadcastServiceProvider',
-    26 => 'App\\Providers\\EventServiceProvider',
-    27 => 'App\\Providers\\HorizonServiceProvider',
-    28 => 'App\\Providers\\RouteServiceProvider',
+    10 => 'Facade\\Ignition\\IgnitionServiceProvider',
+    11 => 'Fideloper\\Proxy\\TrustedProxyServiceProvider',
+    12 => 'Intervention\\Image\\ImageServiceProvider',
+    13 => 'Laravel\\Horizon\\HorizonServiceProvider',
+    14 => 'Laravel\\Ui\\UiServiceProvider',
+    15 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
+    16 => 'Carbon\\Laravel\\ServiceProvider',
+    17 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
+    18 => 'Oursdreams\\Export\\ExportServiceProvider',
+    19 => 'Overtrue\\LaravelPinyin\\ServiceProvider',
+    20 => 'Te7aHoudini\\LaravelTrix\\LaravelTrixServiceProvider',
+    21 => 'Yajra\\Oci8\\Oci8ServiceProvider',
+    22 => 'App\\Providers\\AppServiceProvider',
+    23 => 'App\\Providers\\AuthServiceProvider',
+    24 => 'App\\Providers\\BroadcastServiceProvider',
+    25 => 'App\\Providers\\EventServiceProvider',
+    26 => 'App\\Providers\\HorizonServiceProvider',
+    27 => 'App\\Providers\\RouteServiceProvider',
   ),
   'deferred' => 
   array (

+ 32 - 0
database/migrations/2021_09_26_095833_add_column_manual_collection_status_to_order_packages_table.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddColumnManualCollectionStatusToOrderPackagesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->integer('collecting_status')->default(0)->comment('手动揽收标记 0:不是手动揽收 1:是手动揽收');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->dropColumn('collecting_status');
+        });
+    }
+}

+ 38 - 3
resources/views/order/index/delivering.blade.php

@@ -44,6 +44,10 @@
                         <button class="btn btn-sm ml-1 btn-success tooltipTarget" title="订单一键回传必须满足条件:订单状态为“分配完成,部分拣货,拣货完成,播种完成”;订单未冻结;订单有快递单号"
                                 @click="manualBack()">一键回传</button>
                     @endcan
+{{--                    @can('订单管理-订单-一键揽收')--}}
+                        <button class="btn btn-sm ml-1 btn-success tooltipTarget" title="订单一键揽收必须满足条件:承运商为:“中通” 订单状态未取消;订单未冻结;订单有快递单号,快递未揽收"
+                                @click="collectUpload()">一键揽收</button>
+{{--                    @endcan--}}
                 </div>
                 <div class="modal fade " style="top: 20%" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                     <div class="modal-dialog">
@@ -67,7 +71,7 @@
                             <input class="checkItem" type="checkbox" :value="order.orderno">
                         </td>
                         <td class="text-nowrap">
-                            <span>@{{ i+1 }}</span>
+                            <span >@{{ i+1 }}</span>
                             @can('订单管理-问题件')
                                 <a :href="'{{url("order/issue/index")}}'+'?orderCode='+order.orderno" target="order/issue/index?addtime=15">
                                     <span v-show="order.is_order_issue" class="badge badge-pill badge-danger">问题件</span>
@@ -75,6 +79,14 @@
                             @else
                                 <span v-show="order.is_order_issue" class="badge badge-pill badge-danger">问题件</span>
                             @endcan
+                            <br v-show="order.is_order_issue">
+                            @can('订单管理-工单处理')
+                                <a :href="'{{url("order/workOrder/index")}}'+'?client_code='+order.soreference1" target="order/workOrder/index">
+                                    <span v-show="order['is_work_order']" class="badge badge-pill badge-primary">工单</span>
+                                </a>
+                            @else
+                                <span v-show="order['is_work_order']" class="badge badge-pill badge-primary">工单</span>
+                            @endcan
                         </td>
                         <td class="text-dark font-weight-bold text-nowrap"><span>@{{ order.orderno }}</span></td>
                         <td class="text-muted text-nowrap"><span>@{{ order.ordercodename }}</span></td>
@@ -433,7 +445,8 @@
             methods:{
                 initData(){
                     this.orders.forEach((order)=>{
-                        if (order.c_contact && order.c_contact.length>50 && order.c_contact.substring(0,3)==='~Ag')order.is_encryption = true;
+                        if (order.c_contact && order.c_contact.length>50 && (order.c_contact.substring(0,3)==='~Ag' || order.c_contact.substring(0,1)==='#'))
+                            order.is_encryption = true;
                     });
                     let start = "{{$request["orderdate_start"] ?? ''}}";
                     let end = "{{$request["orderdate_end"] ?? ''}}";
@@ -1062,6 +1075,7 @@
                         if (res.data.success){
                             window.tempTip.showSuccess('工单生成成功');
                             $('#intercept-modal').modal('hide');
+                            this.tagWorkOrders(checkData);
                         } else {
                             window.tempTip.show(res.data.message ? res.data.message : '工单创建异常');
                         }
@@ -1069,6 +1083,13 @@
                         window.tempTip.show(err)
                     });
                 },
+                tagWorkOrders(orderNos){
+                    this.orders.forEach((item)=>{
+                        if (orderNos.includes(item.orderno)){
+                            item['is_work_order'] = true;
+                        }
+                    })
+                },
                 changeReceiveInfo() {
                     let url = '{{url('apiLocal/workOrder/editOrderReceiveInfo')}}';
                     let data = {
@@ -1076,10 +1097,10 @@
                         grad:this.grad,
                         remake:`${this.remark.name} ${this.remark.phone} ${this.remark.province} ${this.remark.city} ${this.remark.city} ${this.remark.district} ${this.remark.adder}`,
                     };
-                    console.log(data);
                     window.tempTip.setIndex('1999');
                     window.axios.post(url,data).then(res=>{
                         if (res.data.success){
+                            this.tagWorkOrders(checkData[0]);
                             window.tempTip.showSuccess('生成修改工单成功');
                             $('#intercept-modal').modal('hide');
                         } else{
@@ -1158,6 +1179,20 @@
                         window.tempTip.show("网络错误:" + err);
                     })
                 },
+                collectUpload(){
+                    if(checkData.length===0){tempTip.show('没有勾选记录');return;}
+                    const data = {
+                        'orderno': checkData,
+                        'strict': false,
+                    };
+                    window.axios.post("{{url('order/collectUpload')}}", data).then(res => {
+                        if (res.data.success) {
+                            tempTip.showSuccess(res.data.message)
+                        }else {
+                            tempTip.show(res.data.error_message);
+                        }
+                    });
+                },
                 isDB(item){
                     if(item.indexOf('德邦') == -1  || item.indexOf('京东') == -1) return false;
                     return  true;

+ 10 - 1
resources/views/order/issue/index.blade.php

@@ -207,8 +207,16 @@
                             </div>
                         </td>
                         <td class="child-layer-1 text-nowrap">
-                            @{{index+1}}
+                            <span>@{{index+1}}</span>
                             <span class="text-muted" v-show="orderIssue.finance_confirm === '是'">财务确认</span>
+                            <br v-if="orderIssue.finance_confirm">
+                            @can('订单管理-工单处理')
+                            <a :href="'{{url("order/workOrder/index")}}'+'?client_code='+orderIssue.order.client_code" target="order/workOrder/index">
+                                <span v-show="orderIssue['is_work_order']" class="badge badge-primary">工单</span>
+                            </a>
+                            @else
+                                <span v-show="orderIssue['is_work_order']" class="badge badge-primary">工单</span>
+                            @endcan
                         </td>
                         <td class="child-layer-1">
                             @{{ orderIssue.id }}
@@ -1218,6 +1226,7 @@
                             @endcannot
                         {name: 'is_handle', type: 'checkbox', tip: '是否已处理', data: [{name: 'ture', value: '已解决'}]},
                         {name: 'is_intercept', type: 'checkbox', tip: '是否已拦截', data: [{name: 'ture', value: '已拦截'}]},
+                        {name: 'is_work_order', type: 'checkbox', tip: '是否有对应工单', data: [{name: 'ture', value: '有对应工单'}]},
                     ]
                 ];
                 this.form = new query({

+ 1 - 0
routes/web.php

@@ -799,6 +799,7 @@ Route::group(['prefix'=>'package'],function(){
         Route::post('deAllocationAll','OrderController@deAllocationAll');
         Route::post('allocation','OrderController@allocation');
         Route::post('manualBack','OrderController@manualBack');
+        Route::post('collectUpload','OrderController@collectUpload');
         Route::post('resetLogisticsGetMark','OrderController@resetLogisticsGetMark');
         Route::post('resetInterfaceReturnMark','OrderController@resetInterfaceReturnMark');
         Route::post('createRejectedBill','OrderController@createRejectedBill');

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