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

Merge branch 'master' into haozi

eric2h 4 лет назад
Родитель
Сommit
735c141c7b
98 измененных файлов с 3790 добавлено и 1221 удалено
  1. 1 0
      .gitignore
  2. 47 0
      app/Console/Commands/LoginListenerCommand.php
  3. 1 1
      app/Console/Kernel.php
  4. 25 11
      app/Filters/OrderIssueFilters.php
  5. 43 3
      app/Filters/WorkOrderFilters.php
  6. 17 5
      app/Http/ApiControllers/LoginController.php
  7. 2 2
      app/Http/Controllers/Auth/LoginController.php
  8. 17 2
      app/Http/Controllers/DeliveryAppointmentController.php
  9. 33 4
      app/Http/Controllers/KpiController.php
  10. 8 0
      app/Http/Controllers/LaborApplyController.php
  11. 5 4
      app/Http/Controllers/OrderController.php
  12. 38 0
      app/Http/Controllers/OrderDetailController.php
  13. 288 271
      app/Http/Controllers/OrderIssueController.php
  14. 38 26
      app/Http/Controllers/OrderIssueRejectedBillController.php
  15. 8 0
      app/Http/Controllers/PackageLogisticController.php
  16. 64 23
      app/Http/Controllers/ReceivingTaskController.php
  17. 13 8
      app/Http/Controllers/RejectedBillController.php
  18. 11 6
      app/Http/Controllers/RejectedBillItemController.php
  19. 80 74
      app/Http/Controllers/TestController.php
  20. 33 34
      app/Http/Controllers/WorkOrderController.php
  21. 3 7
      app/Http/Controllers/WorkOrderExpressAbnormalController.php
  22. 5 9
      app/Http/Controllers/WorkOrderInterceptController.php
  23. 2 2
      app/Http/Controllers/WorkOrderLossController.php
  24. 2 2
      app/Http/Controllers/WorkOrderProcessLogController.php
  25. 84 0
      app/Http/Controllers/WorkOrderRelationRejectedBillController.php
  26. 1 1
      app/Http/Controllers/api/thirdPart/flux/WaybillController.php
  27. 11 1
      app/Http/Middleware/AuthorizingApi.php
  28. 1 2
      app/Http/Requests/Api/ReceivingTaskRequest.php
  29. 22 23
      app/Imports/OrderIssueImport.php
  30. 6 5
      app/Imports/RejectedImport.php
  31. 42 0
      app/Jobs/SyncOrderRejectingStatusJob.php
  32. 43 0
      app/Jobs/SyncRejectedBillRejectingStatusJob.php
  33. 9 1
      app/Order.php
  34. 23 0
      app/OrderDetail.php
  35. 138 130
      app/OrderIssue.php
  36. 11 5
      app/OrderIssueRejectedBill.php
  37. 2 2
      app/OrderPackage.php
  38. 5 0
      app/OrderPackageExpressRoute.php
  39. 6 0
      app/Providers/AppServiceProvider.php
  40. 55 53
      app/RejectedBill.php
  41. 1 1
      app/Services/OracleDOCOrderHeaderService.php
  42. 4 1
      app/Services/OracleDocAsnHerderService.php
  43. 13 0
      app/Services/OrderDetailService.php
  44. 34 67
      app/Services/OrderIssueRejectedBillService.php
  45. 125 121
      app/Services/OrderIssueService.php
  46. 36 4
      app/Services/OrderPackageReceivedSyncService.php
  47. 137 0
      app/Services/OrderRejectedBillRelationService.php
  48. 117 0
      app/Services/OrderRejectingStatusService.php
  49. 3 32
      app/Services/OrderService.php
  50. 2 2
      app/Services/ReceivingTaskService.php
  51. 18 19
      app/Services/RejectedBillService.php
  52. 17 17
      app/Services/RejectedService.php
  53. 16 0
      app/Services/UserService.php
  54. 5 2
      app/Services/WaybillService.php
  55. 46 11
      app/Services/WorkOrderCancelInterceptService.php
  56. 58 15
      app/Services/WorkOrderDamageService.php
  57. 69 19
      app/Services/WorkOrderExpressAbnormalService.php
  58. 59 16
      app/Services/WorkOrderInformationChangeService.php
  59. 71 26
      app/Services/WorkOrderInterceptService.php
  60. 54 12
      app/Services/WorkOrderLossService.php
  61. 87 22
      app/Services/WorkOrderMistakeService.php
  62. 4 1
      app/Services/WorkOrderProcessLogService.php
  63. 22 7
      app/Services/WorkOrderService.php
  64. 4 0
      app/User.php
  65. 1 2
      app/Utils/helpers.php
  66. 15 2
      app/WorkOrder.php
  67. 1 0
      app/WorkOrderProcessLog.php
  68. 1 0
      composer.json
  69. 70 1
      composer.lock
  70. 4 4
      config/database.php
  71. 0 0
      config/octane.php
  72. 12 0
      database/factories/OrderDetailFactory.php
  73. 33 0
      database/migrations/2022_01_13_152810_work_orders_add_column_rejecting_status.php
  74. 32 0
      database/migrations/2022_01_13_161829_orders_add_column_pay_at.php
  75. 32 0
      database/migrations/2022_01_17_094642_work_order_process_logs_add_column_type.php
  76. 44 0
      database/migrations/2022_01_17_133350_create_order_details_table.php
  77. 16 0
      database/seeds/OrderDetailSeeder.php
  78. 165 0
      resources/js/utilities/drawCheckbox.js
  79. 19 0
      resources/js/utilities/h2can.min.js
  80. 5 0
      resources/js/utilities/jcanvas.min.js
  81. 64 17
      resources/views/equipment/index.blade.php
  82. 238 0
      resources/views/kpi/logisticsPunctuality/index.blade.php
  83. 230 0
      resources/views/kpi/orderOperationLog/index.blade.php
  84. 170 0
      resources/views/kpi/ownerPcsReport/index.blade.php
  85. 3 3
      resources/views/order/index/delivering.blade.php
  86. 50 15
      resources/views/order/issue/index.blade.php
  87. 2 0
      resources/views/order/scanInfo/index.blade.php
  88. 4 1
      resources/views/order/workOrder/_edit_process_log.blade.php
  89. 3 2
      resources/views/order/workOrder/_logistic_fill_work_order_modal.blade.php
  90. 39 0
      resources/views/order/workOrder/_order_commodity_info.blade.php
  91. 1 1
      resources/views/order/workOrder/_work_order_show.blade.php
  92. 226 52
      resources/views/order/workOrder/index.blade.php
  93. 2 1
      resources/views/personnel/laborApply/dispatch/index.blade.php
  94. 1 1
      resources/views/rejected/search/general.blade.php
  95. 41 3
      resources/views/store/receivingTasks/create.blade.php
  96. 16 3
      routes/apiLocal.php
  97. 4 1
      routes/web.php
  98. 1 0
      runServes.sh

+ 1 - 0
.gitignore

@@ -37,3 +37,4 @@ yarn-error.log
 /database/data
 /bootstrap/cache/*
 /public/vendor/horizon
+/start_for_win.bat

+ 47 - 0
app/Console/Commands/LoginListenerCommand.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Illuminate\Console\Command;
+use Illuminate\Support\Facades\Log;
+use Workerman\Worker;
+
+class LoginListenerCommand extends Command
+{
+    protected $signature = 'workman {action} {--d}';
+
+    protected $description = 'Start a Workerman server.';
+
+    public function handle()
+    {
+        global $argv;
+        $action = $this->argument('action');
+
+        $argv[0] = 'wk';
+        $argv[1] = $action;
+        $argv[2] = $this->option('d') ? '-d' : '';
+        $ws_worker = new Worker('websocket://0.0.0.0:2346');
+
+        // Emitted when new connection come
+        /*$ws_worker->onConnect = function ($connection) {
+        };*/
+
+        // Emitted when data received
+        $ws_worker->onMessage = function ($connection, $data) {
+            try {
+                $data = json_decode($data);
+                $_SERVER['HTTP_USER_AGENT'] = $data->userAgent;
+                $connection->send(app("UserService")->verifySingleTag($data->user, $data->token) ? "true" : "false");
+            }catch (\Exception $e){
+                Log::error("SOCKET连接恶意信息",[$e->getMessage(),$data]);
+            }
+        };
+
+        // Emitted when connection closed
+        $ws_worker->onClose = function ($connection) {
+        };
+
+        // Run worker
+        Worker::runAll();
+    }
+}

+ 1 - 1
app/Console/Kernel.php

@@ -94,7 +94,7 @@ class  Kernel extends ConsoleKernel
         //$schedule->command('check:cacheRack')->everyMinute();
         $schedule->command('AccordingToOwnersManualBack')->everyThirtyMinutes()->between('9:00','16:30')->runInBackground();
 
-        $schedule->job(new LaborApplyRecordJob(false))->dailyAt(LaborApplyService::TIME_OUT_HOUR.':00')->runInBackground();//生成临时工派遣数据
+        $schedule->job(new LaborApplyRecordJob(false))->dailyAt(LaborApplyService::TIME_OUT_HOUR.':01')->runInBackground();//生成临时工派遣数据
 
         $schedule->job(new CalculationArrivedManNumJob(now()->subDays(2)->startOfDay()))->dailyAt('01:01')->runInBackground();//生成实际到岗人数数据
 

+ 25 - 11
app/Filters/OrderIssueFilters.php

@@ -6,6 +6,7 @@ namespace App\Filters;
 
 use App\Commodity;
 use App\Order;
+use App\OrderDetail;
 use App\OrderIssue;
 use App\OrderIssueProcessLog;
 use App\OrderIssueRejectedBill;
@@ -36,6 +37,7 @@ class OrderIssueFilters
     protected $orderIssueProcessLogQuery;
     protected $shopQuery;
     protected $workOrderQuery;
+    protected $orderDetailQuery;
     protected $filters = [
         'log_content',
         'is_imported',
@@ -93,70 +95,78 @@ class OrderIssueFilters
         return $this->orderQuery;
     }
 
-    private function getCommodityQuery()
+    private function getCommodityQuery(): Builder
     {
         if (!$this->commodityQuery)
             $this->commodityQuery = Commodity::query()->selectRaw('id');
         return $this->commodityQuery;
     }
 
-    private function getOrderPackageQuery()
+    private function getOrderPackageQuery(): Builder
     {
         if (is_null($this->orderPackageQuery))
             $this->orderPackageQuery = OrderPackage::query()->selectRaw('order_packages.order_id');
         return $this->orderPackageQuery;
     }
 
-    private function getRejectedBillQuery()
+    private function getRejectedBillQuery(): Builder
     {
         if (!$this->rejectedBillQuery)
             $this->rejectedBillQuery = RejectedBill::query()->selectRaw('logistic_number_return');
         return $this->rejectedBillQuery;
     }
 
-    private function getRejectedBillItemQuery()
+    private function getRejectedBillItemQuery(): Builder
     {
         if (!$this->rejectedBillItemQuery)
             $this->rejectedBillItemQuery = RejectedBillItem::query()->selectRaw('id_rejected_bill');
         return $this->rejectedBillItemQuery;
     }
 
-    private function getOrderPackageCommodityQuery()
+    private function getOrderPackageCommodityQuery(): Builder
     {
         if (!$this->orderPackageCommodityQuery)
             $this->orderPackageCommodityQuery = OrderPackageCommodities::query()->selectRaw('order_package_commodities.order_package_id');
         return $this->orderPackageCommodityQuery;
     }
 
-    private function getOrderIssueRejectedBillQuery()
+    private function getOrderIssueRejectedBillQuery(): Builder
     {
         if (!$this->orderIssueRejectedBIllQuery)
             $this->orderIssueRejectedBIllQuery = OrderIssueRejectedBill::query()->selectRaw('order_issue_id');
         return $this->orderIssueRejectedBIllQuery;
     }
 
-    private function getOrderIssueProcessLogQuery()
+    private function getOrderIssueProcessLogQuery(): Builder
     {
         if (!$this->orderIssueProcessLogQuery)
             $this->orderIssueProcessLogQuery = OrderIssueProcessLog::query()->selectRaw('order_issue_id');
         return $this->orderIssueProcessLogQuery;
     }
 
-    private function getShopQuery()
+    private function getShopQuery(): Builder
     {
         if (!$this->shopQuery)
             $this->shopQuery = Shop::query()->selectRaw('id');
         return $this->shopQuery;
     }
 
-    private function getWorkOrderQuery()
+    private function getWorkOrderQuery(): Builder
     {
         if (!$this->workOrderQuery)
             $this->workOrderQuery = WorkOrder::query()->selectRaw('order_id');
         return $this->workOrderQuery;
     }
 
-    public function apply($builder)
+    private function getOrderDetailQuery(): Builder
+    {
+        if (!$this->orderDetailQuery){
+            $this->orderDetailQuery = OrderDetail::query()->select('order_id');
+        }
+        return $this->orderDetailQuery;
+    }
+
+    public function apply($builder): Builder
     {
         $this->queryBuilder = $builder;
         $this->beforeApply();
@@ -209,6 +219,10 @@ class OrderIssueFilters
         if ($this->shopQuery)
             $this->getOrderQuery()->whereIn('shop_id', $this->shopQuery);
 
+        if ($this->orderDetailQuery){
+            $this->getOrderQuery()->whereIn('order_id',$this->orderDetailQuery);
+        }
+
         if ($this->orderQuery)
             $this->queryBuilder->whereIn('order_issues.order_id', $this->orderQuery);
 
@@ -488,7 +502,7 @@ class OrderIssueFilters
     public function is_work_order($is_work_order)
     {
         if ($is_work_order == '1') {
-            $this->queryBuilder->whereIn('order_id',$this->getWorkOrderQuery());
+            $this->queryBuilder->whereIn('order_id', $this->getWorkOrderQuery());
         } else if ($is_work_order == '2') {
             $this->queryBuilder->whereNotIn('order_id', $this->getWorkOrderQuery());
         }

+ 43 - 3
app/Filters/WorkOrderFilters.php

@@ -8,9 +8,11 @@ use App\OrderIssue;
 use App\OrderIssueProcessLog;
 use App\OrderIssueType;
 use App\OrderPackage;
+use App\Shop;
 use App\Traits\ModelSearchWay;
 use App\User;
 use App\WorkOrder;
+use App\WorkOrderProcessLog;
 use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
@@ -45,7 +47,9 @@ class WorkOrderFilters
         'process_progress',
         'order_issue_log',
         'log_content',
-        'tags'
+        'tags',
+        'shop_name',
+        'work_order_process_log',
     ];
     protected $array_filter;
     protected $params = [];
@@ -56,8 +60,8 @@ class WorkOrderFilters
     protected $issueTypeQuery;
     protected $orderIssueLogQuery;
     protected $orderIssueQuery;
-
-
+    protected $shopQuery;
+    protected $workOrderProcessLogQuery;
 
     public function __construct(Request $request)
     {
@@ -158,6 +162,11 @@ class WorkOrderFilters
 
     public function beforeApply()
     {
+
+        if ($this->shopQuery){
+            $this->getOrderQuery()->whereIn('orders.shop_id',$this->shopQuery);
+        }
+
         if ($this->orderPackageQuery) {
             $this->queryBuilder->whereIn('order_id', $this->orderPackageQuery);
         }
@@ -173,6 +182,11 @@ class WorkOrderFilters
         if ($this->orderIssueQuery){
             $this->queryBuilder->whereIn('work_orders.order_id', $this->orderIssueQuery);
         }
+
+        if($this->workOrderProcessLogQuery){
+            $this->queryBuilder->whereIn('work_orders.id', $this->workOrderProcessLogQuery);
+        }
+
         $this->orderByTag();
     }
 
@@ -230,6 +244,22 @@ class WorkOrderFilters
         return $this->orderIssueLogQuery;
     }
 
+    public function getShopQuery(): Builder
+    {
+        if (!$this->shopQuery) {
+            $this->shopQuery = Shop::query()->select('id');
+        }
+        return $this->shopQuery;
+    }
+
+    public function getWorkOrderProcessLogQuery(): Builder
+    {
+        if (!$this->workOrderProcessLogQuery){
+            $this->workOrderProcessLogQuery = WorkOrderProcessLog::query()->select('work_order_id');
+        }
+        return $this->workOrderProcessLogQuery;
+    }
+
     public function id($id)
     {
         if (is_array($id)) $this->queryBuilder->whereIn('work_orders.id', $id);
@@ -383,4 +413,14 @@ class WorkOrderFilters
             $this->queryBuilder->where('logistic_tag',$tag);
         }
     }
+
+    public function shop_name($shop_name)
+    {
+        $this->searchWay($this->getShopQuery(),$shop_name,'shops.name');
+    }
+
+    public function work_order_process_log($work_order_process_log)
+    {
+        $this->searchWay($this->getWorkOrderProcessLogQuery(),$work_order_process_log,'work_order_process_logs.content');
+    }
 }

+ 17 - 5
app/Http/ApiControllers/LoginController.php

@@ -4,7 +4,7 @@
 namespace App\Http\ApiControllers;
 
 
-use Illuminate\Foundation\Auth\User;
+use App\User;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
@@ -12,6 +12,7 @@ use Illuminate\Support\Facades\Hash;
 
 class LoginController
 {
+
     /**
      * @api {post} /login 登录接口
      * @apiName login
@@ -40,15 +41,22 @@ class LoginController
     {
         $userName = $request->get('username','');
         $password = $request->get('password','');
-        $user = User::query()->where("name",$userName)->orWhereHas("userDetail",function ($query)use($userName){
+        $users = User::query()->where("name",$userName)->orWhereHas("userDetail",function ($query)use($userName){
             $query->where("mobile_phone",$userName);
-        })->first();
+        })->get();
         $response = [
             'message' => '请求成功',
             'status_code' => 200,
         ];
+        $user = null;
+        foreach ($users as $item){
+            if (Hash::check(base64_decode($password),$item->password)){
+                $user = $item;
+                break;
+            }
+        }
         //验证用户登录
-        if (!$user || !Hash::check(base64_decode($password),$user->password)){
+        if (!$user){
             $response["message"] = "用户名或密码错误";
             $response["status_code"] = 410;
             return response()->json($response);
@@ -65,7 +73,11 @@ class LoginController
         }
 
         try {
-            $response["data"] = ["token"=>app("UserService")->getJWTToken($user,$privateKey),
+            $token = app("UserService")->getJWTToken($user,$privateKey);
+
+            //单点登录标记
+            app("UserService")->setSingleTag($user->id,$token);
+            $response["data"] = ["token"=>$token,
                 "menu"=>$this->getMenu($user),"info"=>["id"=>$user->id,"name"=>$user->name]];
             app("UserService")->setOrRefreshCache($user);
             return response()->json($response);

+ 2 - 2
app/Http/Controllers/Auth/LoginController.php

@@ -10,8 +10,6 @@ use Illuminate\Http\RedirectResponse;
 use Illuminate\Http\Request;
 use Illuminate\Http\Response;
 use Illuminate\Support\Facades\Auth;
-use Illuminate\Support\Facades\Cache;
-use Illuminate\Support\Facades\Session;
 use Illuminate\Support\Facades\Validator;
 use Illuminate\Validation\ValidationException;
 
@@ -87,6 +85,7 @@ class LoginController extends Controller
         }
 
         if ($this->attemptLogin($request)) {
+//            Auth::logoutOtherDevices($request->input('password'));
             if(env('DB_USERNAME')!='developer')
                 app('LogService')->log(__METHOD__,__FUNCTION__,'',Auth::user()['id']);
             if($request['is_json']){
@@ -101,6 +100,7 @@ class LoginController extends Controller
             if ($user){
                 $request->offsetSet("name",$user->name);
                 if ($this->attemptLogin($request)) {
+//                    Auth::logoutOtherDevices($user->password);
                     if($request['is_json']){
                         return ['success'=>true,'url'=>url($redirectTo),'menus'=>app("MenuService")->getVisibleFunctionList()];
                     }

+ 17 - 2
app/Http/Controllers/DeliveryAppointmentController.php

@@ -117,6 +117,19 @@ class DeliveryAppointmentController extends Controller
         $this->success($list);
     }
 
+    private function checkAndGetAsn($codes){
+        if ($codes){
+            $codes = array_filter(array_unique(preg_split('/[,, ]+/u', $codes)));
+            if (count($codes)>0){
+                $asnCount = Store::query()->where("asn_code",$codes)->count();
+                $codes = count($codes)===$asnCount ? implode(",",$codes) : null;
+            }else{
+                $codes = null;
+            }
+        }
+        return $codes;
+    }
+
     /**
      * 确定预约
      */
@@ -128,13 +141,15 @@ class DeliveryAppointmentController extends Controller
         $details = request("details");
         $errors = $this->appointmentValidator($model)->errors();
         if (count($errors)>0)$this->success(["errors"=>$errors]);
+        $asnCodes = $this->checkAndGetAsn($model["asn_number"] ?? null);
+        if (!$asnCodes)$this->error("ASN单据错误");
         $errors = Validator::make($selectDate,[
             "date" => ["required","date","after_or_equal:today"],
             "time" => ["required","integer"],
         ])->errors();
         if (count($errors)>0)$this->error("未选定预约日期");
 
-        DB::transaction(function ()use($model,$selectDate,$details,&$appointment){
+        DB::transaction(function ()use($model,$selectDate,$details,&$appointment,$asnCodes){
             $result = DeliveryAppointment::query()->selectRaw("appointment_date,date_period,SUM(capacity) AS capacity")
                 ->where("appointment_date",$selectDate["date"])
                 ->where("date_period",$selectDate["time"])
@@ -157,7 +172,7 @@ class DeliveryAppointmentController extends Controller
                 "user_id"               => Auth::id(),
                 "owner_id"              => $model["owner_id"],
                 "procurement_number"    => $model["procurement_number"] ?? null,
-                "asn_number"            => $model["asn_number"] ?? null,
+                "asn_number"            => $asnCodes,
                 "logistic_number"       => $model["logistic_number"] ?? null,
                 "logistic_id"           => $model["logistic_id"] ?? null,
                 "warehouse_id"          => $model["warehouse_id"],

+ 33 - 4
app/Http/Controllers/KpiController.php

@@ -3,6 +3,8 @@
 namespace App\Http\Controllers;
 
 use App\Services\UserService;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Http\Request;
 
 class KpiController extends Controller
@@ -24,10 +26,7 @@ class KpiController extends Controller
 
     public function dayDetailCustomer()
     {
-        /** @var UserService $userService */
-        $userService = app('UserService');
-        $ownerIds =  $userService->getPermittingOwnerIds(auth()->user());
-        $owners = \App\Owner::query()->select(['id', 'name', 'code'])->whereIn('id', $ownerIds)->get();
+        $owners = $this->getOwners();
         return view('kpi.dayDetailCustomer.index', compact('owners'));
     }
 
@@ -35,6 +34,36 @@ class KpiController extends Controller
     {
         $userWorkgroups = \App\UserWorkgroup::query()->select(["id", "name"])->get();
         return view('kpi.workCoefficientDayStat.index', compact('userWorkgroups'));
+    }
+
+    public function ownerPcsReport()
+    {
+        $ownerCodes = $this->getOwners()->pluck('code');
+        return view('kpi.ownerPcsReport.index', compact('ownerCodes'));
+
+    }
+
+    public function logisticsPunctuality()
+    {
+        $ownerIds = $this->getOwners()->pluck('id');
+        return view('kpi.logisticsPunctuality.index', compact('ownerIds'));
+    }
+
+    public function orderOperationLog()
+    {
+        $ownerIds = $this->getOwners()->pluck('id');
+        return view('kpi.orderOperationLog.index', compact('ownerIds'));
+    }
 
+    /**
+     * @return Builder[]|Collection
+     */
+    public function getOwners()
+    {
+        /** @var UserService $userService */
+        $userService = app('UserService');
+        $ownerIds = $userService->getPermittingOwnerIds(auth()->user());
+        $owners = \App\Owner::query()->select(['id', 'name', 'code'])->whereIn('id', $ownerIds)->get();
+        return $owners;
     }
 }

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

@@ -57,6 +57,14 @@ class LaborApplyController extends Controller
 
     public function store(LaborApplyRequest $request, LaborApply $laborApply)
     {
+        //超时提交报错
+        /** @var LaborApplyService $service */
+        $service = app('LaborApplyService');
+        $can_create_status = $service->getCanCreateStatus();
+        if ($can_create_status == 2) {
+            return redirect(route('laborApply.index'))->with('danger', '申请失败,已经超过提交时间');
+        }
+        //提交频率过高
         if (Cache::has(self::LABOR_APPLY_STORE_LIMIT . \auth()->id())) {
             return redirect(route('laborApply.create'))->with('warning', "提交频率过高,请等待" . self::LABOR_APPLY_STORE_LIMIT_TTL . "s以上再试!");
         }

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

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

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

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

+ 288 - 271
app/Http/Controllers/OrderIssueController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
 use App\Events\AddOrUpdateOrderIssues;
 use App\Filters\OrderIssueFilters;
 use App\Imports\OrderIssueImport;
+use App\Jobs\SyncRejectedBillRejectingStatusJob;
 use App\Logistic;
 use App\OracleDOCOrderHeader;
 use App\Order;
@@ -15,11 +16,15 @@ use App\OrderIssueType;
 use App\Owner;
 use App\QualityLabel;
 use App\RejectedBill;
+use App\Services\LogService;
 use App\Services\OrderIssueProcessLogService;
 use App\Services\OrderIssueService;
 use App\Services\OrderIssueTypeService;
+use App\Services\OrderRejectedBillRelationService;
 use App\Services\OrderService;
 use App\Services\OwnerService;
+use App\Services\OrderRejectingStatusService;
+use App\Services\RejectedService;
 use App\Shop;
 use App\UserOwnerGroup;
 use App\UserWorkgroup;
@@ -35,29 +40,48 @@ use Oursdreams\Export\Export;
 
 class OrderIssueController extends Controller
 {
-    /**
-     * @var OrderIssueTypeService $orderIssueTypeService;
-     */
-    private $orderIssueTypeService ;
-    public function __construct()
-    {
-        $this->orderIssueTypeService = app(OrderIssueTypeService::class);
-    }
-
-    public function index(Request $request, OrderIssueFilters $filter,OrderIssueService $service)
+    private $service;
+    private $orderService;
+    private $ownerService;
+    private $orderIssueProcessLogService;
+    private $orderIssueTypeService;
+    private $rejectedBillSyncOrderService;
+    private $orderRejectedBillRelationService;
+    private $logService;
+
+    public function __construct(OrderIssueService $service,
+                                OwnerService $ownerService,
+                                OrderIssueProcessLogService $orderIssueProcessLogService,
+                                OrderService $orderService,
+                                OrderIssueTypeService $orderIssueTypeService,
+                                OrderRejectingStatusService $rejectedBillSyncOrderService,
+                                OrderRejectedBillRelationService $orderRejectedBillRelationService,
+                                LogService $logService)
+    {
+        $this->service = $service;
+        $this->ownerService = $ownerService;
+        $this->orderIssueProcessLogService = $orderIssueProcessLogService;
+        $this->orderService = $orderService;
+        $this->orderIssueTypeService = $orderIssueTypeService;
+        $this->rejectedBillSyncOrderService = $rejectedBillSyncOrderService;
+        $this->orderRejectedBillRelationService = $orderRejectedBillRelationService;
+        $this->logService = $logService;
+    }
+
+    public function index(Request $request, OrderIssueFilters $filter)
     {
         if (!Gate::allows('订单管理-问题件-查询')) {
             return redirect(url('/'));
         }
-        $owners = app(OwnerService::class)->getAuthorizedOwners();
+        $owners = $this->ownerService->getAuthorizedOwners();
         $orderIssues = OrderIssue::query()->filter($filter)->defaultWith()->paginate($request['paginate'] ?? 50);
-        $service->tagWorkOrder($orderIssues);
+        $this->service->tagWorkOrder($orderIssues);
         $orderIssueType = $this->orderIssueTypeService->getAllOrderIssueTypes();
         $qualityLabel = QualityLabel::all();
         $logistics = Logistic::all();
         $userWorkgroup = UserWorkgroup::all();
         $userOwnerGroups = UserOwnerGroup::all();
-        return view('order/issue/index', compact('owners', 'orderIssues', 'orderIssueType', 'qualityLabel','userWorkgroup','logistics','userOwnerGroups'));
+        return view('order/issue/index', compact('owners', 'orderIssues', 'orderIssueType', 'qualityLabel', 'userWorkgroup', 'logistics', 'userOwnerGroups'));
     }
 
     public function create()
@@ -78,19 +102,17 @@ class OrderIssueController extends Controller
         if (!Gate::allows('订单管理-订单问题件生成')) {
             return redirect(url('/'));
         }
-        /**
-         * @var OrderIssueService $orderIssueService
-         * @var OrderIssue $orderIssue
-         */
-        $orderIssueService = app('OrderIssueService');
-        $orderIssueService->validatorCreate($request)->validate();
-        $orderIssue = $orderIssueService->create($request->all());
+        $this->service->validatorCreate($request)->validate();
+        $orderIssue = $this->service->create($request->all());
         event(new AddOrUpdateOrderIssues([$orderIssue['order_id']]));
-        if($request->has('logistic_number_return') && !OrderIssueRejectedBill::isExit($orderIssue->id,$request['logistic_number_return'])){
-            $orderIssue->joinRejectedBill($request['logistic_number_return']);
+        if ($request->has('logistic_number_return') && !OrderIssueRejectedBill::isExit($orderIssue->order_id, $request['logistic_number_return'])) {
+            OrderIssueRejectedBill::query()->create([
+                'order_id' => $orderIssue->order_id,
+                'logistic_number_return' => $request->input('logistic_number_return'),
+                'order_issue_id' => $orderIssue->id,
+            ]);
         }
-        $orderIssue->loadMissing('orderIssueRejectedBills');
-        $orderIssue->syncRejectingStatus();
+        SyncRejectedBillRejectingStatusJob::dispatch($orderIssue->order);
         OrderIssueProcessLog::query()->create(['order_issue_id' => $orderIssue['id'], 'user_id' => Auth::user()['id'], 'content' => $request['content'], 'type' => '创建']);
         return redirect('order/issue/index');
     }
@@ -100,7 +122,7 @@ class OrderIssueController extends Controller
         if (!Gate::allows('订单管理-问题件-编辑')) {
             return redirect(url('/'));
         }
-        $orderIssue = OrderIssue::query()->with(['order','secondOrder.packages.commodities.commodity'])->where('id', $id)->first();
+        $orderIssue = OrderIssue::query()->with(['order', 'secondOrder.packages.commodities.commodity'])->where('id', $id)->first();
         $order = $orderIssue->order;
         $secondOrder = $orderIssue->secondOrder;
         $rejectedBill = RejectedBill::query()->where('id', $orderIssue->rejected_bill_id)->first();
@@ -110,7 +132,7 @@ class OrderIssueController extends Controller
         $owners = Owner::all();
         $shops = Shop::all();
         $logistics = Logistic::all();
-        return view('order/issue/edit', compact('orderIssue', 'owners', 'userWorkgroup', 'shops', 'logistics', 'orderIssueType', 'order', 'secondOrder', 'rejectedBill','userOwnerGroups'));
+        return view('order/issue/edit', compact('orderIssue', 'owners', 'userWorkgroup', 'shops', 'logistics', 'orderIssueType', 'order', 'secondOrder', 'rejectedBill', 'userOwnerGroups'));
     }
 
     public function batchImport(Request $request)
@@ -134,7 +156,7 @@ class OrderIssueController extends Controller
                 for ($i = 0; $i < count($exception); $i++) {
                     $a .= implode(',', $exception[$i]) . '&#10';
                 };
-                app('LogService')->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
+                $this->logService->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
                 return '<h1 class="text-danger">导入Excel成功<br><textarea style="width: 50%;height: 50%">' . $a . '</textarea></h1>';
             }
         } else {
@@ -158,13 +180,11 @@ class OrderIssueController extends Controller
         if (!$request->input('orderNos')) {
             return ['success' => false, 'fail_info' => '没有传入的订单编号'];
         }
-        /** @var OrderIssueService $service */
-        $service = app(OrderIssueService::class);
-        $exits_orderNos = $service->校验问题件是否存在_WMS订单号_返回存在的订单号($request->input('orderNos'));
-        if(count($exits_orderNos)>0) return ['success'=>false,'fail_info'=>'标记问题件存在已有订单号','exitsOrderNos' =>$exits_orderNos];
-        $soft_delete_order_nos = $service->checkOrderIssueIsExistAndSoftDelete($request['orderNos']);
-        if(count($soft_delete_order_nos)>0) return ['success'=>false,'fail_info'=>'订单对应问题件存在回收站,如需要请从回收站恢复','exitsOrderNos' =>$soft_delete_order_nos];
-        return $service->orderIssueTag($request->all());
+        $exits_orderNos = $this->service->校验问题件是否存在_WMS订单号_返回存在的订单号($request->input('orderNos'));
+        if (count($exits_orderNos) > 0) return ['success' => false, 'fail_info' => '标记问题件存在已有订单号', 'exitsOrderNos' => $exits_orderNos];
+        $soft_delete_order_nos = $this->service->checkOrderIssueIsExistAndSoftDelete($request['orderNos']);
+        if (count($soft_delete_order_nos) > 0) return ['success' => false, 'fail_info' => '订单对应问题件存在回收站,如需要请从回收站恢复', 'exitsOrderNos' => $soft_delete_order_nos];
+        return $this->service->orderIssueTag($request->all());
     }
 
     public function apiDestroy(Request $request)
@@ -178,7 +198,7 @@ class OrderIssueController extends Controller
         $orderIssue = OrderIssue::query()->where('id', $request->input('id'))->first();
         $bool = $orderIssue->delete();
         if ($bool) {
-            app('LogService')->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
+            $this->logService->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
             return ['success' => 'true'];
         } else {
             return ['success' => 'false', 'fail_info' => '删除问题单出现异常,请联系管理员'];
@@ -191,18 +211,18 @@ class OrderIssueController extends Controller
             return ['success' => false, 'fail_info' => '没有对应权限'];
         }
         try {
-            $data =  $request->only([
-                'order_issue_type_id','owner_id','logistic_id', 'logistic_number_return','result_explain','final_status','second_order_id','second_client_no',
-                'logistic_indemnity_money','logistic_express_remission','baoshi_indemnity_money','baoshi_express_remission','user_workgroup_id','user_owner_group_id'
+            $data = $request->only([
+                'order_issue_type_id', 'owner_id', 'logistic_id', 'logistic_number_return', 'result_explain', 'final_status', 'second_order_id', 'second_client_no',
+                'logistic_indemnity_money', 'logistic_express_remission', 'baoshi_indemnity_money', 'baoshi_express_remission', 'user_workgroup_id', 'user_owner_group_id'
             ]);
             $orderIssue = OrderIssue::query()->find($request->id);
             $orderIssue->update($data);
-            $orderIssue->syncRejectingStatus();
-            app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request));
-            return  ['success' => true];
+            SyncRejectedBillRejectingStatusJob::dispatch($orderIssue->order);
+            $this->logService->log(__METHOD__, __FUNCTION__, json_encode($request));
+            return ['success' => true];
         } catch (Exception $e) {
-            app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request)."||".$e->getMessage().'||'.$e->getTraceAsString());
-            return  ['success' => false ,'fail_info' => $e->getMessage()];
+            $this->logService->log(__METHOD__, __FUNCTION__, json_encode($request) . "||" . $e->getMessage() . '||' . $e->getTraceAsString());
+            return ['success' => false, 'fail_info' => $e->getMessage()];
         }
     }
 
@@ -222,7 +242,7 @@ class OrderIssueController extends Controller
             foreach ($request->input('ids') as $id) {
                 OrderIssueProcessLog::query()->create(['order_issue_id' => $id, 'user_id' => Auth::user()['id'], 'type' => '结束', 'content' => '完结订单']);
             }
-            app('LogService')->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
+            $this->logService->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
             return ['success' => true];
         }
     }
@@ -239,11 +259,11 @@ class OrderIssueController extends Controller
             OrderIssue::query()
                 ->where('id', $request->input('id'))
                 ->update(['is_new_rejecting' => '已处理']);
-            app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->getContent()));
-            return ['success'=>true];
+            $this->logService->log(__METHOD__, __FUNCTION__, json_encode($request->getContent()));
+            return ['success' => true];
         } catch (Exception $e) {
-            app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->getContent())."||".$e->getMessage()."||".$e->getTraceAsString());
-            return ['success' => false,'fail_info' => $e->getMessage()];
+            $this->logService->log(__METHOD__, __FUNCTION__, json_encode($request->getContent()) . "||" . $e->getMessage() . "||" . $e->getTraceAsString());
+            return ['success' => false, 'fail_info' => $e->getMessage()];
         }
     }
 
@@ -252,10 +272,10 @@ class OrderIssueController extends Controller
         if (!$request->filled('clientNo')) {
             return ['success' => false, 'fail_info' => '缺失WMS订单参数无法查询'];
         }
-        $orderInfo = app(OrderService::class)->findOrCreateByClientCode($request->input('clientNo'));
+        $orderInfo = $this->orderService->findOrCreateByClientCode($request->input('clientNo'));
         if (!$orderInfo) {
             return ['success' => true, 'message' => '没有对应的订单信息'];
-        }else{
+        } else {
             return ['success' => true, 'data' => $orderInfo];
         }
     }
@@ -265,23 +285,21 @@ class OrderIssueController extends Controller
         if (!$request->filled('clientCode')) {
             return ['success' => false, 'fail_info' => '缺少对应的参数或条件'];
         }
-        /** @var $orderService OrderService*/
-        $orderService = app('OrderService');
         $clientCode = $request->input('clientCode');
         $order = Order::query()->where('client_code', $clientCode)->first();
         if ($order) {
             if (OrderIssue::query()->where('order_id', $order['id'])->count()) {
                 return ['success' => false, 'fail_info' => '该客户订单号已有对应的订单问题件'];
             }
-            $order = $orderService->findOrCreateByClientCode($clientCode);
+            $order = $this->orderService->findOrCreateByClientCode($clientCode);
             return ['success' => true, 'order' => $order];
         } else {
             $orderHeader = OracleDOCOrderHeader::query()->where('SOReference1', $clientCode)->first();
             if (!$orderHeader) {
                 return ['success' => false, 'fail_info' => '该客户订单号没有对应的订单信息'];
             } else {
-                $order = $orderService->findOrCreateByClientCode($clientCode);
-                $rejectedBill = $orderService->getRejectedBillOfClientCode($clientCode);
+                $order = $this->orderService->findOrCreateByClientCode($clientCode);
+                $rejectedBill = $this->orderService->getRejectedBillOfClientCode($clientCode);
                 return ['success' => true, 'order' => $order, 'rejectedBill' => $rejectedBill];
             }
         }
@@ -293,57 +311,58 @@ class OrderIssueController extends Controller
             return ['success' => false, 'fail_info' => '缺少对应的参数或条件'];
         }
         $rejectedBill = RejectedBill::query()->with('items')->where('logistic_number_return', $request['logisticNumberReturn'])->first();
-        if(!$rejectedBill) return ['success' => true, 'message' => '没有对应的退回单号,不与WMS同步'];
-        $exists = OrderIssueRejectedBill::query()->where('logistic_number_return',$request['logisticNumberReturn'])->exists();
-        if($exists)return ['success' => false, 'fail_info' => '该退回单号已有对应的问题件'];
+        if (!$rejectedBill) return ['success' => true, 'message' => '没有对应的退回单号,不与WMS同步'];
+        $exists = OrderIssueRejectedBill::query()->where('logistic_number_return', $request['logisticNumberReturn'])->exists();
+        if ($exists) return ['success' => false, 'fail_info' => '该退回单号已有对应的问题件'];
         return ['success' => true, 'rejectedBill' => $rejectedBill];
     }
 
-    public function isExistByOrderNoApi(Request $request){
+    public function isExistByOrderNoApi(Request $request)
+    {
         if (!Gate::allows('订单管理-订单问题件生成')) {
-            return ['success'=>false,'fail_info' => '没有对应权限'];
+            return ['success' => false, 'fail_info' => '没有对应权限'];
         }
         $orderNos = $request->input('orderNos');
-        $orderIssues =OrderIssue::query()->with('order')
-            ->whereIn('order_id',function($query) use ($orderNos){
-                $query->from('orders')->select('id')->whereIn('code',$orderNos);
+        $orderIssues = OrderIssue::query()->with('order')
+            ->whereIn('order_id', function ($query) use ($orderNos) {
+                $query->from('orders')->select('id')->whereIn('code', $orderNos);
             })->get();
 
-        if($orderIssues->count() == 0){
-            return ['success'=>true ];
-        }else{
+        if ($orderIssues->count() == 0) {
+            return ['success' => true];
+        } else {
             $is_exist_orderNos = '';
             foreach ($orderIssues as $orderIssue) {
-                $is_exist_orderNos.= $orderIssue->order->code.',';
+                $is_exist_orderNos .= $orderIssue->order->code . ',';
             }
-            $is_exist_orderNos = rtrim($is_exist_orderNos,',');
+            $is_exist_orderNos = rtrim($is_exist_orderNos, ',');
             $is_exist_orderNos .= ';';
-            return ['success'=>false,'fail_info'=>'选中的订单已有存在的问题件:'.$is_exist_orderNos];
+            return ['success' => false, 'fail_info' => '选中的订单已有存在的问题件:' . $is_exist_orderNos];
         }
     }
 
-    public function updateColumnApi(Request $request,OrderIssueService $service): array
+    public function updateColumnApi(Request $request, OrderIssueService $service): array
     {
         if (!Gate::allows('订单管理-问题件-编辑')) {
-            return ['success'=>false,'fail_info' => '没有对应权限'];
+            return ['success' => false, 'fail_info' => '没有对应权限'];
         }
 
-        if($request['column']=='final_status'  && $request['value'] == '已归档'){
-            $orderIssues = OrderIssue::query()->where('id',$request['id'])->get();
+        if ($request['column'] == 'final_status' && $request['value'] == '已归档') {
+            $orderIssues = OrderIssue::query()->where('id', $request['id'])->get();
             $service->archive($orderIssues);
-            return ['success' =>true];
+            return ['success' => true];
         }
         try {
             OrderIssue::query()
                 ->where('id', $request->input('id'))
                 ->update([$request->input('column') => $request->input('value')]);
-            app('LogService')->log(__METHOD__,'更新问题件',json_encode($request->getContent()));
+            $this->logService->log(__METHOD__, '更新问题件', json_encode($request->getContent()));
             if ($request->input('column') == 'order_issue_type_id') {
                 event(new AddOrUpdateOrderIssues([$request->input('id')]));
             }
             return ['success' => true];
         } catch (Exception $e) {
-            app('LogService')->log(__METHOD__,'更新问题件error',json_encode($request->getContent()).'||'.$e->getMessage().'||'.$e->getTraceAsString());
+            $this->logService->log(__METHOD__, '更新问题件error', json_encode($request->getContent()) . '||' . $e->getMessage() . '||' . $e->getTraceAsString());
             return ['success' => false, $e->getMessage()];
         }
     }
@@ -351,15 +370,15 @@ class OrderIssueController extends Controller
     public function batchDestroyApi(Request $request)
     {
         if (!Gate::allows('订单管理-问题件-删除')) {
-            return ['success'=>false,'fail_info' => '没有对应权限'];
+            return ['success' => false, 'fail_info' => '没有对应权限'];
         }
         try {
             OrderIssue::query()->whereIn('id', $request->input('ids'))->delete();
-            app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->getContent()));
+            $this->logService->log(__METHOD__, __FUNCTION__, json_encode($request->getContent()));
             return ['success' => true];
         } catch (Exception $e) {
-            app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->getContent())."||".$e->getMessage()."||".$e->getTraceAsString());
-            return ['success' => false,'fail_info' => $e->getMessage()];
+            $this->logService->log(__METHOD__, __FUNCTION__, json_encode($request->getContent()) . "||" . $e->getMessage() . "||" . $e->getTraceAsString());
+            return ['success' => false, 'fail_info' => $e->getMessage()];
         }
     }
 
@@ -387,77 +406,75 @@ class OrderIssueController extends Controller
         ]);
     }
 
-    public function apiUpdateValidatorRejectedBill(array $arr){
+    public function apiUpdateValidatorRejectedBill(array $arr)
+    {
         return Validator::make($arr, [
-            'logistic_number_return'=>['required'],
-            'id_logistic_return'=>['required'],
+            'logistic_number_return' => ['required'],
+            'id_logistic_return' => ['required'],
         ], [
             'required' => [':attribute 为必填项', ':attribute'],
         ], [
-            'logistic_number_return'=> '退回单号',
-            'id_logistic_return'=> '退回单号承运商',
+            'logistic_number_return' => '退回单号',
+            'id_logistic_return' => '退回单号承运商',
         ]);
     }
 
     public function endOrderIssuesApi(Request $request): array
     {
         if (!Gate::allows('订单管理-问题件-编辑')) {
-            return ['success'=>false,'fail_info' => '没有对应权限'];
+            return ['success' => false, 'fail_info' => '没有对应权限'];
         }
         $orderIssue_ids = $request->input('ids');
-        $bool = app(OrderIssueService::class)->isExistOrderIssueTypeIsEnd($orderIssue_ids);
-        if($bool)return ['success'=>false,'fail_info'=> '需要完结的订单问题件中已有完结的订单问题件'];
-        $bool = app(OrderIssueService::class)->endOrderIssues($orderIssue_ids);
-        if($bool == 0) return ['success'=>false,'fail_info' => '操作失败'];
-        $params = ['ids'=>$orderIssue_ids,'content'=>'完结订单','type'=>'结束'];
-        $logs = app(OrderIssueProcessLogService::class)->create($params);
-        return ['success'=>true,'logs'=>$logs];
+        $bool = $this->service->isExistOrderIssueTypeIsEnd($orderIssue_ids);
+        if ($bool) return ['success' => false, 'fail_info' => '需要完结的订单问题件中已有完结的订单问题件'];
+        $bool = $this->service->endOrderIssues($orderIssue_ids);
+        if ($bool == 0) return ['success' => false, 'fail_info' => '操作失败'];
+        $params = ['ids' => $orderIssue_ids, 'content' => '完结订单', 'type' => '结束'];
+        $logs = $this->orderIssueProcessLogService->create($params);
+        return ['success' => true, 'logs' => $logs];
     }
 
     public function editSecondClientNoApi(Request $request): array
     {
-        if(!Gate::allows('订单管理-问题件-编辑')){
-            return ['success'=>false,'fail_info'=>'没有对应权限'];
+        if (!Gate::allows('订单管理-问题件-编辑')) {
+            return ['success' => false, 'fail_info' => '没有对应权限'];
         }
         try {
-            app(OrderIssueService::class)->editOrderIssueSecondClientNo($request['id'],$request['secondClientNo']);
-            $order = Order::query()->with(['packages.commodities.commodity','logistic'])->where('client_code',$request['secondClientNo'])->first();
+            $this->service->editOrderIssueSecondClientNo($request['id'], $request['secondClientNo']);
+            $order = Order::query()->with(['packages.commodities.commodity', 'logistic'])->where('client_code', $request['secondClientNo'])->first();
             if (!$order) {
                 return ['success' => true, 'message' => '二次客户单号已修改,没有对应的订单信息'];
             } else {
-               return ['success' => true, 'order' => $request['secondClientNo'] == '' ? null : $order];
+                return ['success' => true, 'order' => $request['secondClientNo'] == '' ? null : $order];
             }
         } catch (Exception $e) {
-            app('LogService')->log(__METHOD__, __FUNCTION__, json_encode($request->getContent()).$e->getMessage().$e->getTraceAsString());
-            return  ['success' =>false ,'fail_info' => $e->getMessage()];
+            $this->logService->log(__METHOD__, __FUNCTION__, json_encode($request->getContent()) . $e->getMessage() . $e->getTraceAsString());
+            return ['success' => false, 'fail_info' => $e->getMessage()];
         }
     }
 
     public function editSecondLogisticNumberApi(Request $request): array
     {
-        if(!Gate::allows('订单管理-问题件-编辑'))
-            return ['success'=>false,'fail_info'=>'没有对应权限'];
-        /** @var OrderIssueService $service */
-        $service = app(OrderIssueService::class);
+        if (!Gate::allows('订单管理-问题件-编辑'))
+            return ['success' => false, 'fail_info' => '没有对应权限'];
         try {
-            $message = $service->updateSecondLogisticNumber($request->input('id'), $request->logistic_number);
-            return $message;
+            return $this->service->updateSecondLogisticNumber($request->input('id'), $request->logistic_number);
         } catch (Exception $e) {
-            return ['success'=>false,'message' =>$e->getMessage()];
+            return ['success' => false, 'message' => $e->getMessage()];
         }
     }
 
     public function disposeImportApi(Request $request): array
     {
-        if(!Gate::allows('订单管理-问题件-编辑'))
-            return ['success'=>false,'fail_info'=>'没有对应权限'];
-        return app(OrderIssueService::class)->disposeImport($request->input('ids'));
+        if (!Gate::allows('订单管理-问题件-编辑'))
+            return ['success' => false, 'fail_info' => '没有对应权限'];
+        return $this->service->disposeImport($request->input('ids'));
     }
 
     public function importPasteDataApi(Request $request): array
     {
         if (!Gate::allows('订单管理-问题件-导入-文本导入'))
-            return ['success'=>false,'fail_info'=>'没有对应权限'];
+            return ['success' => false, 'fail_info' => '没有对应权限'];
         $rows = $request->input('rows');
         $logistic_numbers = [];
         $types = [];
@@ -468,90 +485,85 @@ class OrderIssueController extends Controller
         foreach ($orderIssueTypes as $orderIssueType) {
             $orderIssueType_map[$orderIssueType->name] = $orderIssueType;
         }
-        $array = explode("\n",$request->input('pasteDataText')); //拆分行
-        /** @var OrderIssueService $service */
-        $service =  app(OrderIssueService::class);
+        $array = explode("\n", $request->input('pasteDataText')); //拆分行
         foreach ($array as $i => $str) {
-//            $string= preg_replace('/[\s,\,\,]+/','*++*',$str);
-//            $items = explode('*++*',$string);
-            $items=[];
-
+            $items = [];
             preg_match('/^(\w*?)[\s,,;;]([\x{4e00}-\x{9fa5}]*?)[\s,,;;](.*?)[\s,,;;](\w*?)$/u', $str, $items);
-            if(count($items) == 0){
+            if (count($items) == 0) {
                 preg_match('/^(\w*?)[\s,,;;]([\x{4e00}-\x{9fa5}]*?)[\s,,;;](.*?)$/u', $str, $items);
             }
             array_shift($items);
-            $head = '第'.($i+1).'行';
-            if(count($items)<count($rows)-1){
+            $head = '第' . ($i + 1) . '行';
+            if (count($items) < count($rows) - 1) {
                 $errors[$head] = ['数据不完整'];
                 unset($items);
                 continue;
             }
             $map = [];
-            foreach ($rows as $index=>$row) {
-                if($row === '原始运单号'){
-                    if(!$items[$index]){
-                        $errors[$head][]='快递单号为空';
-                        $map =[];
+            foreach ($rows as $index => $row) {
+                if ($row === '原始运单号') {
+                    if (!$items[$index]) {
+                        $errors[$head][] = '快递单号为空';
+                        $map = [];
                     }
                     $logistic_numbers = [$items[$index]];
-                    $exist_logistic =  $service->校验问题件是否存在_快递单号_返回存在的快递单号($logistic_numbers);
-                    $orderHeaders=OracleDOCOrderHeader::query()->with('actAllocationDetails')->whereHas('actAllocationDetails',function($query)use($logistic_numbers){
-                        $query->whereIn('picktotraceid',$logistic_numbers);
+                    $exist_logistic = $this->service->校验问题件是否存在_快递单号_返回存在的快递单号($logistic_numbers);
+                    $orderHeaders = OracleDOCOrderHeader::query()->with('actAllocationDetails')->whereHas('actAllocationDetails', function ($query) use ($logistic_numbers) {
+                        $query->whereIn('picktotraceid', $logistic_numbers);
                     })->get();
-                    if(count($exist_logistic) > 0){
-                        $errors[$head][]='快递单号存在对应的问题件';
-                        $map =[];
-                    }else if($orderHeaders->count()==0){
-                        $errors[$head][]='快递单号不存在对应的发运订单';
-                        $map =[];
+                    if (count($exist_logistic) > 0) {
+                        $errors[$head][] = '快递单号存在对应的问题件';
+                        $map = [];
+                    } else if ($orderHeaders->count() == 0) {
+                        $errors[$head][] = '快递单号不存在对应的发运订单';
+                        $map = [];
                     }
                     $logistic_numbers[] = $items[$index];
                     $map['logistic_number'] = $items[$index];
                 }
-                if($row==='情况说明'){
-                    if(!$items[$index]){
-                        $errors[$head][]='情况说明为空';
-                        $map =[];
+                if ($row === '情况说明') {
+                    if (!$items[$index]) {
+                        $errors[$head][] = '情况说明为空';
+                        $map = [];
                     }
                     $map['result_explain'] = $items[$index];
                 }
-                if($row==='自定义订单号'){
-                    if($items[$index]??false){
+                if ($row === '自定义订单号') {
+                    if ($items[$index] ?? false) {
                         $map['custom_code'] = $items[$index];
                     }
                 }
-                if($row==='问题类别'){
-                    if(!$items[$index]){
-                        $errors[$head][]='问题类别为空';
+                if ($row === '问题类别') {
+                    if (!$items[$index]) {
+                        $errors[$head][] = '问题类别为空';
                         $map = [];
-                    }else{
-                        $type =  $orderIssueType_map[$items[$index]] ?? null;
-                        if(!$type){
-                            $errors[$head][]='问题类型不存在';
+                    } else {
+                        $type = $orderIssueType_map[$items[$index]] ?? null;
+                        if (!$type) {
+                            $errors[$head][] = '问题类型不存在';
                             $map = [];
                         }
                     }
-                    $types[] =$items[$index];
+                    $types[] = $items[$index];
                     $map['type'] = $items[$index];
                 }
             }
-            if(count($map)!==0)$maps[] = $map;
+            if (count($map) !== 0) $maps[] = $map;
         }
 
-        if(count($errors)>0) return ['success'=>false,'fail_info'=>$errors];
+        if (count($errors) > 0) return ['success' => false, 'fail_info' => $errors];
         try {
             foreach ($maps as $map) {
                 $logistic_number = $map['logistic_number'];
                 $result_explain = $map['result_explain'];
                 $type = $map['type'];
                 $custom_code = $map['custom_code'] ?? null;
-                $service->createOrderIssue($logistic_number, $type, $result_explain,'导入未处理',$custom_code,$request['hiddenTag'] ?? null);
+                $this->service->createOrderIssue($logistic_number, $type, $result_explain, '导入未处理', $custom_code, $request['hiddenTag'] ?? null);
             }
-            return ['success'=>true];
+            return ['success' => true];
         } catch (Exception $e) {
-            app('LogService')->log(__METHOD__,__FUNCTION__,'文本导入问题件失败'.json_encode($request->getContent().$e->getMessage().$e->getTraceAsString()));
-            return ['success'=>false,'fail_info'=>$e->getMessage()];
+            $this->logService->log(__METHOD__, __FUNCTION__, '文本导入问题件失败' . json_encode($request->getContent() . $e->getMessage() . $e->getTraceAsString()));
+            return ['success' => false, 'fail_info' => $e->getMessage()];
         }
     }
 
@@ -564,78 +576,89 @@ class OrderIssueController extends Controller
         return $this->getJson($order_Issues);
     }
 
-    public function getJson($order_Issues){
+    public function getJson($order_Issues)
+    {
         $json = [];
         $row = [
-            '登记日期','创建日期','客户','客户订单号','原始承运商','收货人','收货电话','省','市','区','收货人地址',
-            '原始运单号','原始商品','原始商品名称','原始商品数量',
-            '退回单号', '退单商品名','退单商品条码','退单商品数量','是否正品','退单状态','退单备注',
-            '操作类型','说明','操作者','情况说明','问题类别',
-            '二次订单号','二次承运商','二次运单号','二次商品条码','二次商品名','二次商品数量',
-            '最终状态', '承运商赔偿金额', '承运商快递减免', '宝时赔偿金额', '宝时快递减免','事故责任方','完结时间'
+            '登记日期', '创建日期', '客户', '客户订单号', '原始承运商', '收货人', '收货电话', '省', '市', '区', '收货人地址',
+            '原始运单号', '原始商品', '原始商品名称', '原始商品数量',
+            '退回单号', '退单商品名', '退单商品条码', '退单商品数量', '是否正品', '退单状态', '退单备注',
+            '操作类型', '说明', '操作者', '情况说明', '问题类别',
+            '二次订单号', '二次承运商', '二次运单号', '二次商品条码', '二次商品名', '二次商品数量',
+            '最终状态', '承运商赔偿金额', '承运商快递减免', '宝时赔偿金额', '宝时快递减免', '事故责任方', '完结时间'
         ];
-        foreach ($order_Issues as $order_issue){
-            $order =  $order_issue->order;
+        foreach ($order_Issues as $order_issue) {
+            $order = $order_issue->order;
             $orderPackages = $order_issue->order->packages ?? collect();
-            $logistic_numbers = '';$order_sku  = '';$order_sku_name  = '';$order_sku_amount  = '';
-            $orderPackages->each(function($package,$index)use(&$logistic_numbers,&$order_sku,&$order_sku_name,&$order_sku_amount){
-                if(!str_starts_with('null',$package->logistic_number))$logistic_numbers.=$package->logistic_number.",\r\n";
-                $package->commodities->each(function($commodities)use(&$order_sku,&$order_sku_name,&$order_sku_amount){
+            $logistic_numbers = '';
+            $order_sku = '';
+            $order_sku_name = '';
+            $order_sku_amount = '';
+            $orderPackages->each(function ($package, $index) use (&$logistic_numbers, &$order_sku, &$order_sku_name, &$order_sku_amount) {
+                if (!str_starts_with('null', $package->logistic_number)) $logistic_numbers .= $package->logistic_number . ",\r\n";
+                $package->commodities->each(function ($commodities) use (&$order_sku, &$order_sku_name, &$order_sku_amount) {
                     $commodity = $commodities->commodity ?? '';
-                    $order_sku.= ($commodity->sku ?? '').",\r\n";
-                    $order_sku_name.= ($commodity->name ?? '').",\r\n";
-                    $order_sku_amount.= ($commodities->amount ?? '').",\r\n";
+                    $order_sku .= ($commodity->sku ?? '') . ",\r\n";
+                    $order_sku_name .= ($commodity->name ?? '') . ",\r\n";
+                    $order_sku_amount .= ($commodities->amount ?? '') . ",\r\n";
                 });
             });
             $rejected_logistic_number = '';
 
             $rejected_Bill_remark = '';
             $rejected_is_checked = '';
-            $rejected_name = ''; $rejected_barcode = '';$rejected_amount = '';
-            if($order_issue->rejectedBills){
-                $order_issue->rejectedBills->each(function($rejectedBill)use(
-                    &$rejected_name,&$rejected_barcode, &$rejected_amount,&$rejected_Bill_remark,&$rejected_is_checked,&$rejected_logistic_number
+            $rejected_name = '';
+            $rejected_barcode = '';
+            $rejected_amount = '';
+            if ($order_issue->rejectedBills) {
+                $order_issue->rejectedBills->each(function ($rejectedBill) use (
+                    &$rejected_name, &$rejected_barcode, &$rejected_amount, &$rejected_Bill_remark, &$rejected_is_checked, &$rejected_logistic_number
+                ) {
+                    $rejected_logistic_number .= $rejectedBill->logistic_number_return . ",\r\n";
+                    $rejectedBill->items->each(function ($item) use (
+                        &$rejected_name, &$rejected_barcode, &$rejected_amount, &$rejected_Bill_remark, &$rejected_is_checked
                     ) {
-                    $rejected_logistic_number.=$rejectedBill->logistic_number_return . ",\r\n";
-                    $rejectedBill->items->each(function($item)use(
-                        &$rejected_name,&$rejected_barcode, &$rejected_amount,&$rejected_Bill_remark,&$rejected_is_checked
-                    ){
-                        $rejected_name.= $item->name_goods.",\r\n";
-                        $rejected_barcode.= $item->barcode_goods.",\r\n";
-                        $rejected_amount.= $item->amount.",\r\n";
-                        $rejected_Bill_remark.= $item->remark.",\r\n";
-                        $rejected_is_checked.= $item->quality->name.",\r\n";
+                        $rejected_name .= $item->name_goods . ",\r\n";
+                        $rejected_barcode .= $item->barcode_goods . ",\r\n";
+                        $rejected_amount .= $item->amount . ",\r\n";
+                        $rejected_Bill_remark .= $item->remark . ",\r\n";
+                        $rejected_is_checked .= $item->quality->name . ",\r\n";
                     });
                 });
             }
-            $log_type = ''; $log_content = '';$log_user = '';
-            $order_issue->logs->each(function($log)use(&$log_type, &$log_content,&$log_user){
-                $log_type.=$log->type.",\r\n";
-                $log_content.=$log->content.",\r\n";
-                isset($log->user->name) ? $log_user.=$log->user->name.",\r\n" : null;
+            $log_type = '';
+            $log_content = '';
+            $log_user = '';
+            $order_issue->logs->each(function ($log) use (&$log_type, &$log_content, &$log_user) {
+                $log_type .= $log->type . ",\r\n";
+                $log_content .= $log->content . ",\r\n";
+                isset($log->user->name) ? $log_user .= $log->user->name . ",\r\n" : null;
             });
-            $send_order = $order_issue->secondOrder ??  new Order();
-            $send_order_numbers = '';$send_order_sku ='';$send_order_name ='';$send_order_amount = '';
-            $send_order->packages->each(function($package)use(&$send_order_numbers ,&$send_order_sku ,&$send_order_name ,&$send_order_amount ){
-                $send_order_numbers.=($package->logistic_number).",\r\n";
-                $package->commodities->each(function ($commodities)use( &$send_order_sku ,&$send_order_name ,&$send_order_amount ){
+            $send_order = $order_issue->secondOrder ?? new Order();
+            $send_order_numbers = '';
+            $send_order_sku = '';
+            $send_order_name = '';
+            $send_order_amount = '';
+            $send_order->packages->each(function ($package) use (&$send_order_numbers, &$send_order_sku, &$send_order_name, &$send_order_amount) {
+                $send_order_numbers .= ($package->logistic_number) . ",\r\n";
+                $package->commodities->each(function ($commodities) use (&$send_order_sku, &$send_order_name, &$send_order_amount) {
                     $commodity = $commodities->commodity;
-                    $send_order_sku.=$commodity->sku.",\r\n";
-                    $send_order_name.=$commodity->name.",\r\n";
-                    $send_order_amount.=$commodities->amount.",\r\n";
+                    $send_order_sku .= $commodity->sku . ",\r\n";
+                    $send_order_name .= $commodity->name . ",\r\n";
+                    $send_order_amount .= $commodities->amount . ",\r\n";
                 });
             });
             $userWorkgroupsName = '';
-            $order_issue->userWorkgroups->each(function ($userWorkgroup)use (&$userWorkgroupsName) {
-                $userWorkgroupsName.=($userWorkgroup->name).",\r\n";
+            $order_issue->userWorkgroups->each(function ($userWorkgroup) use (&$userWorkgroupsName) {
+                $userWorkgroupsName .= ($userWorkgroup->name) . ",\r\n";
             });
-            if (isset($order_issue->userOwnerGroup->name))$userWorkgroupsName.=$order_issue->userOwnerGroup->name.",\r\n";
-            $endLog = $order_issue->logs->where('type','结束')->last() ?? null;
+            if (isset($order_issue->userOwnerGroup->name)) $userWorkgroupsName .= $order_issue->userOwnerGroup->name . ",\r\n";
+            $endLog = $order_issue->logs->where('type', '结束')->last() ?? null;
             $end_at = $endLog ? $endLog->created_at : null;
-            if ($end_at != null ) $end_at = $end_at->format(\Carbon\Carbon::DEFAULT_TO_STRING_FORMAT);
+            if ($end_at != null) $end_at = $end_at->format(\Carbon\Carbon::DEFAULT_TO_STRING_FORMAT);
             $json[] = [
-                isset($order_issue->created_at) ? str_split($order_issue->created_at,10)[0] :'',       // 登记日期
-                isset($order->created_at) ? str_split($order->created_at,10)[0] :'',             // 创建日期
+                isset($order_issue->created_at) ? str_split($order_issue->created_at, 10)[0] : '',       // 登记日期
+                isset($order->created_at) ? str_split($order->created_at, 10)[0] : '',             // 创建日期
                 $order->owner->name ?? '',      // 客户
                 $order->client_code,              // 客户订单号
                 $order->logistic->name ?? '',   // 原始承运商
@@ -646,25 +669,25 @@ class OrderIssueController extends Controller
                 $order->district,               // 区
                 $order->address,                // 收货人地址
 
-                rtrim($logistic_numbers,",\r\n"),              //原始运单号
-                rtrim($order_sku,",\r\n"),                     //原始商品
-                rtrim($order_sku_name,",\r\n"),                //原始商品名称
-                rtrim($order_sku_amount,",\r\n"),              //原始商品数量
+                rtrim($logistic_numbers, ",\r\n"),              //原始运单号
+                rtrim($order_sku, ",\r\n"),                     //原始商品
+                rtrim($order_sku_name, ",\r\n"),                //原始商品名称
+                rtrim($order_sku_amount, ",\r\n"),              //原始商品数量
 
                 //,'退单商品名','退单商品条码','退单商品数量','退单状态','退单备注'
-                rtrim($rejected_logistic_number,",\r\n"),                      //退回单号
-                rtrim($rejected_name,",\r\n"),        // 退单商品名
-                rtrim($rejected_barcode,",\r\n") ,    // 退单商品条码
-                rtrim($rejected_amount,",\r\n"),      // 退单商品数量
-                rtrim($rejected_is_checked,",\r\n"),  // 是否正品
-                rtrim($rejected_Bill_remark,",\r\n"),   // 退单备注
+                rtrim($rejected_logistic_number, ",\r\n"),                      //退回单号
+                rtrim($rejected_name, ",\r\n"),        // 退单商品名
+                rtrim($rejected_barcode, ",\r\n"),    // 退单商品条码
+                rtrim($rejected_amount, ",\r\n"),      // 退单商品数量
+                rtrim($rejected_is_checked, ",\r\n"),  // 是否正品
+                rtrim($rejected_Bill_remark, ",\r\n"),   // 退单备注
 
-                $order_issue->rejecting_status ,                                // 退单状态
+                $order_issue->rejecting_status,                                // 退单状态
 
                 // '操作类型','情况说明','问题类别',
-                rtrim($log_type,",\r\n"),                        //操作类型
-                rtrim($log_content,",\r\n"),                     //情况说明
-                rtrim($log_user,",\r\n"),                        //操作者
+                rtrim($log_type, ",\r\n"),                        //操作类型
+                rtrim($log_content, ",\r\n"),                     //情况说明
+                rtrim($log_user, ",\r\n"),                        //操作者
 
                 // '情况说明','问题类别',
                 $order_issue->result_explain,                               // 情况说明
@@ -673,23 +696,23 @@ class OrderIssueController extends Controller
                 // '二次订单号','二次承运商','二次运单号','二次商品条码','二次商品名','二次商品数量',
                 $order_issue->secondOrder->client_code ?? '',                //二次订单号
                 $order_issue->secondOrder->logistic->name ?? '',             //二次承运商
-                rtrim($send_order_numbers,",\r\n") ,                                        //二次运单号
-                rtrim($send_order_sku,",\r\n"),                                             // 二次商品条码
-                rtrim($send_order_name,",\r\n"),                                            // 二次商品名
-                rtrim($send_order_amount,",\r\n"),                                          // 二次商品数量
+                rtrim($send_order_numbers, ",\r\n"),                                        //二次运单号
+                rtrim($send_order_sku, ",\r\n"),                                             // 二次商品条码
+                rtrim($send_order_name, ",\r\n"),                                            // 二次商品名
+                rtrim($send_order_amount, ",\r\n"),                                          // 二次商品数量
 
                 //'最终状态', '承运商赔偿金额', '承运商快递减免', '宝时赔偿金额', '宝时快递减免','事故责任方'
-                $order_issue->final_status??'',
-                $order_issue->logistic_indemnity_money ,
+                $order_issue->final_status ?? '',
+                $order_issue->logistic_indemnity_money,
                 $order_issue->logistic_express_remission,
                 $order_issue->baoshi_indemnity_money,
                 $order_issue->baoshi_express_remission,
-                rtrim($userWorkgroupsName,",\r\n"),
+                rtrim($userWorkgroupsName, ",\r\n"),
 //                $order_issue->userOwnerGroup->name ?? '',
                 $end_at
             ];
         }
-        return Export::make($row,$json,"订单问题件");
+        return Export::make($row, $json, "订单问题件");
     }
 
     public function recycleBin(Request $request)
@@ -697,40 +720,33 @@ class OrderIssueController extends Controller
         if (!Gate::allows('订单管理-问题件-删除')) {
             return redirect(url('/'));
         }
-        /**
-         * @var OrderIssueService $service
-         */
-        $service = app('OrderIssueService');
-        $orderIssues = $service->getRecycleBinPaginate($request->input());
+
+        $orderIssues = $this->service->getRecycleBinPaginate($request->input());
         $paginate = $request['paginate'] ?? 50;
-        return view('order.issue.recycle',compact('orderIssues','paginate'));
+        return view('order.issue.recycle', compact('orderIssues', 'paginate'));
     }
 
     public function recoverOrderIssueApi(Request $request): array
     {
         if (!Gate::allows('订单管理-问题件-删除')) {
-            return ['success'=>false,'error'=>'没有对应权限'];
+            return ['success' => false, 'error' => '没有对应权限'];
         }
-        /**
-         * @var OrderIssueService $service
-         */
-        $service = app('OrderIssueService');
-        return  $service->recoverOrderIssue($request['ids']);
+        return $this->service->recoverOrderIssue($request['ids']);
     }
 
     public function financeConfirmApi(Request $request): array
     {
         if (!Gate::allows('订单管理-问题件-财务确认')) {
-            return ['success'=>false,'error'=>'没有对应权限'];
+            return ['success' => false, 'error' => '没有对应权限'];
         }
         try {
             $bool = OrderIssue::query()->whereIn('id', $request['ids'])->update(['finance_confirm' => $request->flag]);
-            if($bool==false)return ['success'=>false,'error'=>'财务确认失败'];
-            app('LogService')->log(__METHOD__, __FUNCTION__,'财务确认'. json_encode($request->getContent()), Auth::user()['id']);
-            return ['success'=>true];
+            if ($bool == false) return ['success' => false, 'error' => '财务确认失败'];
+            $this->logService->log(__METHOD__, __FUNCTION__, '财务确认' . json_encode($request->getContent()), Auth::user()['id']);
+            return ['success' => true];
         } catch (Exception $e) {
-            app('LogService')->log(__METHOD__,'Error'. __FUNCTION__,'财务确认 Error'. json_encode($request->getContent()).' || '.json_encode($e->getMessage()).' || '.json_encode($e->getTraceAsString()), Auth::user()['id']);
-            return ['success'=>false,'error'=>$e->getMessage()];
+            $this->logService->log(__METHOD__, 'Error' . __FUNCTION__, '财务确认 Error' . json_encode($request->getContent()) . ' || ' . json_encode($e->getMessage()) . ' || ' . json_encode($e->getTraceAsString()), Auth::user()['id']);
+            return ['success' => false, 'error' => $e->getMessage()];
         }
     }
 
@@ -741,26 +757,26 @@ class OrderIssueController extends Controller
      * @param OrderIssueService $service
      * @return array|bool[]
      */
-    public function archiveOrderIssueApi(Request $request,OrderIssueService $service): array
+    public function archiveOrderIssueApi(Request $request, OrderIssueService $service): array
     {
-        if (!Gate::allows('订单管理-问题件-编辑')) return ['success'=>false,'error'=>'没有对应权限'];
+        if (!Gate::allows('订单管理-问题件-编辑')) return ['success' => false, 'error' => '没有对应权限'];
 
-        if(!$request->has('ids'))return ['success'=>false,'error'=>'没有勾选问题件'];
+        if (!$request->has('ids')) return ['success' => false, 'error' => '没有勾选问题件'];
 
-        $orderIssues = OrderIssue::query()->whereIn('id',$request['ids'])->get();
+        $orderIssues = OrderIssue::query()->whereIn('id', $request['ids'])->get();
 
-        $archiveOrderIssues = $orderIssues->where('final_status','已归档');
+        $archiveOrderIssues = $orderIssues->where('final_status', '已归档');
 
-        if($archiveOrderIssues->count() > 0){
-            $archiveIds = $archiveOrderIssues->map(function($archiveOrderIssue){
+        if ($archiveOrderIssues->count() > 0) {
+            $archiveIds = $archiveOrderIssues->map(function ($archiveOrderIssue) {
                 return $archiveOrderIssue->id;
             });
-            return ['success' =>false,'error' => "选中问题件Id{$archiveIds}已有归档信息,请取消选中或刷新页面重试"];
+            return ['success' => false, 'error' => "选中问题件Id{$archiveIds}已有归档信息,请取消选中或刷新页面重试"];
         }
 
         $service->archive($orderIssues);
 
-        return ['success' =>true];
+        return ['success' => true];
     }
 
     public function addUserWorkgroup(Request $request): array
@@ -770,16 +786,17 @@ class OrderIssueController extends Controller
         try {
             OrderIssue::query()->find($orderIssueId)->userWorkgroups()->attach($userWorkgroupId);
         } catch (QueryException $e) {
-            return ['success' => false,'data' =>'事故责任方已存在'];
+            return ['success' => false, 'data' => '事故责任方已存在'];
         }
-        return ['success' => true,'data' =>UserWorkgroup::find($userWorkgroupId)];
+        return ['success' => true, 'data' => UserWorkgroup::find($userWorkgroupId)];
     }
+
     public function destroyUserWorkgroup(Request $request): array
     {
         $orderIssueId = $request->orderIssueId;
         $userWorkgroupId = $request->userWorkgroupId;
         OrderIssue::query()->find($orderIssueId)->userWorkgroups()->detach($userWorkgroupId);
-        return ['success' => true,'data' =>UserWorkgroup::find($userWorkgroupId)];
+        return ['success' => true, 'data' => UserWorkgroup::find($userWorkgroupId)];
     }
 
     public function batchOthers(Request $request)
@@ -798,7 +815,7 @@ class OrderIssueController extends Controller
         if ($request->input("baoshi_express_remission")) {
             $data['baoshi_express_remission'] = $request->input("baoshi_express_remission");
         }
-        OrderIssue::query()->whereIn('id',$orderIssueIds)->update($data);
+        OrderIssue::query()->whereIn('id', $orderIssueIds)->update($data);
         $userWorkGroupIds = $request->input("userWorkGroupIds");
         if (isset($userWorkGroupIds)) {
             $orderIssues = OrderIssue::query()->whereIn('id', $orderIssueIds)->get();
@@ -811,35 +828,35 @@ class OrderIssueController extends Controller
 
     public function destroySecondLogisticNumberApi(Request $request): array
     {
-        if (!Gate::allows('订单管理-问题件-编辑')) return ['success'=>false,'error'=>'没有对应权限'];
-        $count = OrderIssue::query()->where("id",$request->id)->update(["second_logistic_number"=>'']);
-        if($count == 1){
-            return ['success'=>true];
-        }else{
-            return ['success'=>false,'error'=>'删除失败'];
+        if (!Gate::allows('订单管理-问题件-编辑')) return ['success' => false, 'error' => '没有对应权限'];
+        $count = OrderIssue::query()->where("id", $request->id)->update(["second_logistic_number" => '']);
+        if ($count == 1) {
+            return ['success' => true];
+        } else {
+            return ['success' => false, 'error' => '删除失败'];
         }
     }
 
-    public function batchUpdateFinalStatusApi(Request $request,OrderIssueService $service): array
+    public function batchUpdateFinalStatusApi(Request $request, OrderIssueService $service): array
     {
-        if (!Gate::allows('订单管理-问题件-编辑')) return ['success'=>false,'error'=>'没有对应权限'];
+        if (!Gate::allows('订单管理-问题件-编辑')) return ['success' => false, 'error' => '没有对应权限'];
         try {
             $service->batchUpdateFinalStatus($request->input('ids', []), $request->input('final_status'));
-            return ['success'=>true];
+            return ['success' => true];
         } catch (Exception $e) {
-            return ['success'=>false,'message' => '批量修改异常'];
+            return ['success' => false, 'message' => '批量修改异常'];
         }
 
     }
 
-    public function batchIssueTypeApi(Request $request,OrderIssueService $service): array
+    public function batchIssueTypeApi(Request $request, OrderIssueService $service): array
     {
-        if (!Gate::allows('订单管理-问题件-编辑')) return ['success'=>false,'error'=>'没有对应权限'];
+        if (!Gate::allows('订单管理-问题件-编辑')) return ['success' => false, 'error' => '没有对应权限'];
         try {
             $service->batchUpdateIssueType($request->input('ids', []), $request->input('order_issue_type_id'));
-            return ['success'=>true];
+            return ['success' => true];
         } catch (Exception $e) {
-            return ['success'=>false,'message' => '批量修改异常'];
+            return ['success' => false, 'message' => '批量修改异常'];
         }
 
     }

+ 38 - 26
app/Http/Controllers/OrderIssueRejectedBillController.php

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

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

@@ -37,6 +37,10 @@ class PackageLogisticController extends Controller
         $orderPackages = OrderPackage::query()
             ->filter($filters)
             ->whereIn('owner_id', $owner_ids)
+            //订单取消的不显示
+            ->whereIn('order_id', function ($query) {
+                $query->from('orders')->select('id')->where('wms_status', '!=','订单取消');
+            })
             ->with([
                 'order.logistic',
                 'orderPackageExpressRoute',
@@ -133,6 +137,10 @@ class PackageLogisticController extends Controller
         $owner_ids = $userService->getPermittingOwnerIds(auth()->user());
         $query = OrderPackage::query()
             ->whereIn('owner_id', $owner_ids)
+            //订单取消的不显示
+            ->whereIn('order_id', function ($query) {
+                $query->from('orders')->select('id')->where('wms_status', '!=','订单取消');
+            })
             ->filter($filters)
             ->with([
                 'order.logistic',

+ 64 - 23
app/Http/Controllers/ReceivingTaskController.php

@@ -5,34 +5,34 @@ namespace App\Http\Controllers;
 use App\DeliveryAppointmentCar;
 use App\Filters\ReceivingTaskFilters;
 use App\Http\Requests\Api\ReceivingTaskRequest;
-use App\Owner;
 use App\ReceivingTask;
+use App\ReceivingTaskItem;
 use App\Services\OwnerService;
 use App\Services\ReceivingTaskService;
 use App\Warehouse;
 use Illuminate\Support\Facades\Gate;
-use Illuminate\Support\Facades\Request;
+use Illuminate\Http\Request;
 
 class ReceivingTaskController extends Controller
 {
     public $service;
     public $ownerService;
 
-    public function __construct(ReceivingTaskService $service,OwnerService  $ownerService)
+    public function __construct(ReceivingTaskService $service, OwnerService $ownerService)
     {
         $this->service = $service;
         $this->ownerService = $ownerService;
     }
 
-    public function index(Request $request,ReceivingTaskFilters $filter)
+    public function index(Request $request, ReceivingTaskFilters $filter)
     {
         if (Gate::denies('入库管理-开单入库-查询')) {
             return redirect('/');
         }
-        $receivingTasks = ReceivingTask::query()->with(['items','owner','wareHouse','file','deliveryAppointmentCar'])->filter($filter)->orderByDesc('created_at')->paginate(50);
-        $owners = $this->ownerService->getQuery()->select('id','name')->get();
-        $warehouses  = Warehouse::query()->get();
-        return view("store.receivingTasks.index",compact('receivingTasks','owners','warehouses'));
+        $receivingTasks = ReceivingTask::query()->with(['items', 'owner', 'wareHouse', 'file', 'deliveryAppointmentCar'])->filter($filter)->orderByDesc('created_at')->paginate(50);
+        $owners = $this->ownerService->getQuery()->select('id', 'name')->get();
+        $warehouses = Warehouse::query()->get();
+        return view("store.receivingTasks.index", compact('receivingTasks', 'owners', 'warehouses'));
     }
 
 
@@ -42,40 +42,81 @@ class ReceivingTaskController extends Controller
             return redirect('/');
         }
         $wareHouse = Warehouse::query()->get();
-        $owners = $this->ownerService->getQuery()->select("id","code","name")->get();
-        return view("store.receivingTasks.create",compact('wareHouse','owners'));
+        $owners = $this->ownerService->getQuery()->select("id", "code", "name")->get();
+        return view("store.receivingTasks.create", compact('wareHouse', 'owners'));
     }
 
 
     public function storeApi(ReceivingTaskRequest $request): array
     {
-        if(Gate::denies('入库管理-开单入库-创建')){
-            return ['success' => false,'message' => '没有对应权限'];
+        if (Gate::denies('入库管理-开单入库-创建')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        $appointment_number = $request->input('appointment_number', null);
+
+        $delivery_appointment_car = DeliveryAppointmentCar::query()->with('deliveryAppointment')->where('appointment_number', $appointment_number)->first();
+
+        if (!$delivery_appointment_car || !$delivery_appointment_car->deliveryAppointment) {
+            return ['success' => false, 'errors' => ['appointment_number' => ['对应预约号未找到']]];
         }
-        $appointment_number = $request->input('appointment_number',null);
 
-        $delivery_appointment_car = DeliveryAppointmentCar::query()->with('deliveryAppointment')->where('appointment_number',$appointment_number)->first();
+        $ans_number_string = $delivery_appointment_car->deliveryAppointment->asn_number ?? '';
+        $ans_numbers = array_filter(preg_split('/[,, ]+/is', $ans_number_string));
 
-        if (!$delivery_appointment_car){
-            return ['success' => false,'errors' =>['appointment_number' => ['对应预约号未找到']]];
+        if (count($ans_numbers) === 0 && count($request->input('asn_no',[])) == 0) {
+            return ['success' => false, 'errors' => ['appointment_number' => ['预约号没有对应的Asn号']]];
         }
-        if (!$delivery_appointment_car->deliveryAppointment){
-            return ['success' => false,'errors' =>['appointment_number' => ['对应预约号未找到']]];
+
+        $asn_nos = array_unique(array_merge($ans_numbers, $request->input('asn_nos') ?? []));
+
+        if (count($asn_nos) == 0){
+            return ['success' => false, 'errors' => ['appointment_number' => ['预约号没有对应的Asn号']]];
         }
 
-        if ($delivery_appointment_car->deliveryAppointment->owner_id != $request->input('owner_id')){
-            return ['success' => false,'errors' =>['appointment_number' => ['预约号与货主未对应']]];
+        $receiving_task_items = ReceivingTaskItem::query()->whereIn('asn_no',$request->input('asn_nos') ?? [])->get()->map(function($item){
+            return $item->asn_no;
+        })->toArray();
+        if (count($receiving_task_items) >0 ){
+            return [
+                'success' => false,'errors' => ['appointment_number' => ['勾选的asn号'.json_encode($receiving_task_items).'已再其他开单入库中有关联']]
+            ];
         }
-        if (ReceivingTask::query()->where('delivery_appointment_car_id',$delivery_appointment_car->id)->exists()){
-            return ['success' => false, 'errors' =>['appointment_number' => ['预约号已有对应的任务']]];
+
+        if ($delivery_appointment_car->deliveryAppointment->owner_id != $request->input('owner_id')) {
+            return ['success' => false, 'errors' => ['appointment_number' => ['预约号与货主未必填项']]];
         }
+
+        if (ReceivingTask::query()->where('delivery_appointment_car_id', $delivery_appointment_car->id)->exists()) {
+            return ['success' => false, 'errors' => ['appointment_number' => ['预约号已有对应的任务']]];
+        }
+
         try {
             $receiving_task = $this->service->createReceivingTask($delivery_appointment_car, $request->all());
             if (!$receiving_task->id) return ['success' => false, 'message' => '生成入库单任务失败,请重新尝试'];
-            $receiving_task->loadMissing(['wareHouse','owner','deliveryAppointmentCar']);
+            $receiving_task->loadMissing(['wareHouse', 'owner', 'deliveryAppointmentCar']);
             return ['success' => true, 'data' => $receiving_task];
         } catch (\Exception $e) {
             return ['success' => false, 'message' => '生成入库单任务失败,请重新尝试'];
         }
     }
+
+    /**
+     * 根据预约号获取Asn单号
+     * @param Request $request
+     * @return array
+     */
+    public function getAsnByAppointmentNumberApi(Request $request): array
+    {
+        $appointment_number = $request->input('appointment_number');
+        if (!$appointment_number) {
+            return ['success' => false, 'errors' => ['appointment_number' => '预约号不能为空']];
+        }
+        $delivery_appointment_car = DeliveryAppointmentCar::query()->with('deliveryAppointment')->where('appointment_number', $appointment_number)->first();
+        if (ReceivingTask::query()->where('delivery_appointment_car_id', $delivery_appointment_car->id)->exists()) {
+            return ['success' => false, 'errors' => ['appointment_number' => ['预约号已有对应的任务']]];
+        }
+        $ans_number_string = $delivery_appointment_car->deliveryAppointment->asn_number ?? '';
+        $ans_numbers = array_filter(preg_split('/[,, ]+/is', $ans_number_string));
+        return ['success' => true, 'data' => $ans_numbers];
+    }
 }

+ 13 - 8
app/Http/Controllers/RejectedBillController.php

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

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

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

+ 80 - 74
app/Http/Controllers/TestController.php

@@ -2,17 +2,34 @@
 
 namespace App\Http\Controllers;
 
-use App\Batch;
 use App\Components\AsyncResponse;
 use App\Components\Database;
 use App\Components\ErrorPush;
+use App\MaterialBox;
+use App\MaterialBoxModel;
 use App\Order;
-use App\OrderBin;
-use App\Services\WorkOrderService;
+use App\OrderDetail;
+use App\OrderIssue;
+use App\OrderIssueRejectedBill;
+use App\RejectedBill;
+use App\Services\common\BatchUpdateService;
+use App\Services\OrderRejectedBillRelationService;
+use App\Services\OrderRejectingStatusService;
+use App\Services\RejectedService;
+use App\Services\WaybillService;
+use App\User;
+use App\Waybill;
 use App\WorkOrder;
+use Illuminate\Database\Capsule\Manager;
+use Illuminate\Database\DatabaseManager;
+use Illuminate\Foundation\Auth\AuthenticatesUsers;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\DB;
-
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Facades\Log;
+use Oursdreams\Export\Export;
+use Workerman\Worker;
 
 class TestController extends Controller
 {
@@ -33,86 +50,75 @@ class TestController extends Controller
             dd("方法不存在");
         }
     }
+    public function test(Request $request){
+        dd(array_filter(array_unique(preg_split('/[,, ]+/u', "125,456,888, 6 ,  ,"))));
+    }
 
-    public function assignBatch($code)
+    public function testOrder()
     {
-        $batches = Batch::query()->where("code",$code)->get();
-        if (!$batches->count()){
-            $wave = DB::connection("oracle")->selectOne(DB::raw("select * from DOC_WAVE_HEADER where WAVENO = ?"),[$code]);
-            if (!$wave){
-                dd("FLUX无波次");
-            }
-            $owner = app("OwnerService")->codeGetOwner($wave->customerid);
-            $obj = [
-                "wms_status" => $this->wms_status($wave),
-                "wms_type"=>$wave->descr,
-                "created_at"=>date("Y-m-d H:i:s"),
-                "wms_created_at"=>$wave->addtime,
-                "updated_at"=>$wave->edittime,
-                "owner_id"=>$owner->id,
-            ];
-            $wave = Batch::query()->where("code",$code)->first();
-            if (!$wave){
-                $obj["code"] = $code;
-                $wave = Batch::query()->create($obj);
-            }else{
-                Batch::query()->where("code",$code)->update($obj);
-            }
-            $ordernos = array_column(DB::connection("oracle")->select(DB::raw("select orderno from DOC_WAVE_DETAILS where WAVENO = ?"),[$code]),"orderno");
-            Order::query()->whereIn("code",$ordernos)->update([
-                "batch_id"=>$wave->id
-            ]);
-            Order::query()->with(["batch","bin"])->whereIn("code",$ordernos)->get()->each(function ($order){
-                if (!$order->bin){
-                    $bin = DB::connection("oracle")->selectOne(DB::raw("select seqno from DOC_WAVE_DETAILS where waveno = ? and orderno = ?"),[$order->batch->code,$order->code]);
-                    if ($bin){
-                        OrderBin::query()->create([
-                            'order_id' => $order->id,
-                            'number' => $bin->seqno,
-                        ]);
-                    }
-                }
-            });
-            $batches = Batch::query()->where("code",$code)->get();
-        }
-        app("BatchService")->assignTasks($batches);
+        /** @var OrderRejectedBillRelationService $service */
+        $service = app('OrderRejectedBillRelationService');
+        $service->orderSyncRejectedBill(Order::query()->find(12));
     }
 
-    public function syncWorkOrder(){
-
-        WorkOrder::query()
-            ->where('work_order_status','1')
-            ->where('bao_shi_tag', 1)
-            ->update(['bao_shi_tag' => 3]);
-        WorkOrder::query()
-            ->whereIn('status',[1,4] )
-            ->where('work_order_status','<>','1')
-            ->update(['bao_shi_tag' => 2]);
+    public function testRejectedBill()
+    {
+        /** @var OrderRejectedBillRelationService $service */
+        $service = app(OrderRejectedBillRelationService::class);
+        /** @var RejectedBill $item */
+        $item = RejectedBill::query()->find(2);
+        $service->rejectedBillSyncOrder($item);
+    }
 
+    public function getOrder()
+    {
 
-        WorkOrder::query()
-            ->where('work_order_status','1')
-            ->where('owner_tag', 1)
-            ->update(['owner_tag' => 3]);
-        WorkOrder::query()
-            ->whereIn('status',[2,6] )
-            ->where('work_order_status','<>','1')
-            ->update(['bao_shi_tag' => 2]);
+        $query = Order::query()->select('id')->where('client_code','22011700000161');
+        dd(OrderDetail::query()->whereIn('order_id',$query)->get());
+    }
 
+    public function sync_order_issue()
+    {
+        $items = OrderIssueRejectedBill::query()->with('orderIssue')->get();
+        $item_array = $items->chunk(500);
+        foreach ($item_array as $items){
+            $insert_params = [];
+            $update_params = [['logistic_number_return','order_id']];
+            foreach ($items as $item){
+                if (!$item->orderIssue) continue;
+                $insert_params[$item->orderIssue->order_id] = [
+                    'order_id' => $item->orderIssue->order_id,
+                    'is_new_rejecting' => $item->orderIssue->is_new_rejecting,
+                    'rejecting_status' => $item->orderIssue->rejecting_status
+                ];
+                $update_params[] = ['logistic_number_return' => $item->logistic_number_return,'order_id' => $item->orderIssue->order_id];
+            }
+            $this->batchOrderIssueRejectedBIll($update_params);
+            $items = OrderDetail::query()->whereIn('order_id',array_keys($insert_params))->get()->map(function($item){
+                return  $item->order_id;
+            })->toArray();
+            $insert_params = array_filter($insert_params,function($item)use($items){
+                return !in_array($item['order_id'],$items) && !is_null($item['order_id']);
+            });
+            if (count($insert_params) == 0) continue;
+            OrderDetail::query()->insert(array_values($insert_params));
+        }
+    }
 
-        WorkOrder::query()
-            ->where('work_order_status','1')
-            ->where('logistic_tag', 1)
-            ->update(['logistic_tag' => 3]);
-        WorkOrder::query()
-            ->whereIn('status',[3] )
-            ->where('work_order_status','<>','1')
-            ->update(['logistic_tag' => 2]);
 
+    public function batchOrderIssueRejectedBIll($array)
+    {
+        /** @var BatchUpdateService $service */
+        $service = app(BatchUpdateService::class);
+        $service->batchUpdate('order_issue_rejected_bill',$array);
     }
-    public function baoHandler(){
-        $service = new WorkOrderService();
-        $service->timingTask();
+
+    public function testQuery()
+    {
+        /** @var WorkOrder $item */
+        $item = WorkOrder::query()->with('orderIssueRejectedBills')->find(9);
+        $item->orderIssueRejectedBills()->where('logistic_number_return','75810638245215')->delete();
+        dd($item);
     }
 }
 

+ 33 - 34
app/Http/Controllers/WorkOrderController.php

@@ -19,16 +19,6 @@ use Illuminate\Support\Facades\Gate;
 
 class WorkOrderController extends Controller
 {
-
-    /**
-     * @var WorkOrderService $service
-     * @var WorkOrderCommoditiesService $commoditiesService
-     * @var WorkOrderDetailService $detailService
-     * @var WorkOrderLogService $logService
-     * @var OrderService $orderService
-     * @var OwnerService $ownerService
-     * @var OrderIssueTypeService $orderIssueTypeService
-     */
     public $service;
     public $detailService;
     public $commoditiesService;
@@ -37,15 +27,23 @@ class WorkOrderController extends Controller
     public $ownerService;
     public $orderIssueTypeService;
 
-    public function __construct()
+    public function __construct(
+        WorkOrderService $service,
+        WorkOrderCommoditiesService $commoditiesService,
+        WorkOrderDetailService $detailService,
+        WorkOrderLogService $logService,
+        OrderService $orderService,
+        OwnerService $ownerService,
+        OrderIssueTypeService $orderIssueTypeService
+    )
     {
-        $this->service = app(WorkOrderService::class);
-        $this->detailService = app(WorkOrderDetailService::class);
-        $this->commoditiesService = app(WorkOrderCommoditiesService::class);
-        $this->logService = app(WorkOrderLogService::class);
-        $this->orderService = app(OrderService::class);
-        $this->ownerService = app(OwnerService::class);
-        $this->orderIssueTypeService = app(OrderIssueTypeService::class);
+        $this->service = $service;
+        $this->detailService = $detailService;
+        $this->commoditiesService = $commoditiesService;
+        $this->logService = $logService;
+        $this->orderService = $orderService;
+        $this->ownerService = $ownerService;
+        $this->orderIssueTypeService = $orderIssueTypeService;
     }
 
     /**
@@ -58,10 +56,10 @@ class WorkOrderController extends Controller
         if (Gate::denies('订单管理-工单处理-承运商编辑'))
             return ['success' => false, 'message' => '没有对应权限'];
         $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
-        if($detail->status === '完成') return ['success' => false, 'message' => '工单已完成,请刷新重试'];
+        if ($detail->status === '完成') return ['success' => false, 'message' => '工单已完成,请刷新重试'];
         $this->service->logisticHandlerTag($detail);
         $data = $this->service->getDefaultWith($detail->work_order_id);
-        return ['success' => true,'data' => $data];
+        return ['success' => true, 'data' => $data];
     }
 
     public function index(Request $request, WorkOrderFilters $filters)
@@ -72,12 +70,13 @@ class WorkOrderController extends Controller
 
         $logistics = Logistic::all();
 
-        $orderIssueTypes =  $this->orderIssueTypeService->getWorkOrderIssueType();
+        $orderIssueTypes = $this->orderIssueTypeService->getWorkOrderIssueType();
 
         $owners = $this->ownerService->getAuthorizedOwners();
 
+
         $this->service->tags($workOrders);
-         return view('order.workOrder.index', compact('workOrders', 'logistics', 'orderIssueTypes', 'owners'));
+        return view('order.workOrder.index', compact('workOrders', 'logistics', 'orderIssueTypes', 'owners'));
     }
 
     /**
@@ -123,7 +122,7 @@ class WorkOrderController extends Controller
 
         $workOrder = $this->service->find($id);
 
-        if (!$workOrder){
+        if (!$workOrder) {
             return ['success' => false, 'message' => '对应工单信息未找到'];
         } else {
             if ($workOrder->status == '已处理') {
@@ -142,12 +141,12 @@ class WorkOrderController extends Controller
      */
     public function checkWorkOrderApi(Request $request): array
     {
-        $nos = $request->input('no','');
-        if (is_string($nos)){
+        $nos = $request->input('no', '');
+        if (is_string($nos)) {
             $nos = [$nos];
         }
         $data = $this->service->checkWorkOrder($nos);
-        return ['success' => true,'data' => $data];
+        return ['success' => true, 'data' => $data];
     }
 
     /**
@@ -160,15 +159,15 @@ class WorkOrderController extends Controller
         if (Gate::denies('订单管理-工单处理-货主编辑'))
             return ['success' => false, 'message' => '没有对应权限'];
         $detail_id = $request->input('detail_id');
-        $detail = WorkOrderDetail::query()->with('workOrder')->where('id',$detail_id)->first();
-        if (!$detail || !$detail->workOrder){
-            return ['success'=>false,'message' => '参数异常'];
+        $detail = WorkOrderDetail::query()->with('workOrder')->where('id', $detail_id)->first();
+        if (!$detail || !$detail->workOrder) {
+            return ['success' => false, 'message' => '参数异常'];
         }
         try {
             $this->service->ownerEndWorkOrderDetail($detail);
-            return ['success'=>true];
+            return ['success' => true];
         } catch (\Exception $e) {
-            return ['success' => false,'message' => '工单完结异常'];
+            return ['success' => false, 'message' => '工单完结异常'];
         }
     }
 
@@ -181,11 +180,11 @@ class WorkOrderController extends Controller
     {
         if (Gate::denies('订单管理-工单处理-货主编辑'))
             return ['success' => false, 'message' => '没有对应权限'];
-        $detail_ids = $request->input('detail_ids',[]);
-        if (count($detail_ids) == 0) return ['success' => false,'message' => '参数异常'];
+        $detail_ids = $request->input('detail_ids', []);
+        if (count($detail_ids) == 0) return ['success' => false, 'message' => '参数异常'];
 
         $details = WorkOrderDetail::query()->find($detail_ids);
-        if (count($details) == 0 ) return ['success' => false,'message' => '参数异常'];
+        if (count($details) == 0) return ['success' => false, 'message' => '参数异常'];
         try {
             $this->service->ownerBatchEndWorkOrderDetails($details);
             return ['success' => true];

+ 3 - 7
app/Http/Controllers/WorkOrderExpressAbnormalController.php

@@ -11,17 +11,13 @@ use Illuminate\Support\Facades\Gate;
 
 class WorkOrderExpressAbnormalController extends Controller
 {
-    /**
-     * @var WorkOrderExpressAbnormalService $service
-     * @var OrderService $orderService
-     */
     private $service;
     private $orderService;
 
-    public function __construct()
+    public function __construct(WorkOrderExpressAbnormalService $service,OrderService $orderService)
     {
-        $this->service = app('WorkOrderExpressAbnormalService');
-        $this->orderService = app('OrderService');
+        $this->service = $service;
+        $this->orderService = $orderService;
     }
 
     public function storeApi(Request $request): array

+ 5 - 9
app/Http/Controllers/WorkOrderInterceptController.php

@@ -11,17 +11,14 @@ use Illuminate\Support\Facades\Gate;
 
 class WorkOrderInterceptController extends Controller
 {
-    /**
-     * @var WorkOrderInterceptService $service
-     * @var OrderService orderService
-     */
+
     private $service;
     private $orderService;
 
-    public function __construct()
+    public function __construct( WorkOrderInterceptService $service,OrderService $orderService)
     {
-        $this->service = app("WorkOrderInterceptService");
-        $this->orderService = app("OrderService");
+        $this->service = $service;
+        $this->orderService = $orderService;
     }
 
     public function storeApi(Request $request): array
@@ -127,7 +124,6 @@ class WorkOrderInterceptController extends Controller
         $this->service->baoShiReviewIntercept($detail, $request->all());
 
         $data = WorkOrder::query()->defaultWith()->find($detail->work_order_id);
-
         return ['success' => true, 'data' => $data];
     }
 
@@ -157,7 +153,7 @@ class WorkOrderInterceptController extends Controller
         $data = WorkOrder::query()->defaultWith()->find($details->map(function ($item) {
             return $item->work_order_id;
         })->toArray());
-
+        $this->service->tags($data);
         return ['success' => true, 'data' => $data];
     }
 }

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

@@ -33,7 +33,6 @@ class WorkOrderLossController extends Controller
 
         if ($this->service->checkWorkOrder($request->input('order_no')))
             return ['success' => false, 'message' => '当前订单已有相同类型的工单'];
-
         $this->service->store($request->all());
         return ['success' => true];
     }
@@ -62,8 +61,9 @@ class WorkOrderLossController extends Controller
         $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
         $workOrder = $detail->workOrder;
         if (!$detail||!$workOrder) return ['success' => false, 'message' => '参数异常'];
+        if($workOrder->status  === '待货主完结') return ['success' => false, 'message' => '工单当前状态为`待货主完成`,请刷新页面重试'];
         $this->service->baoShiReview($detail,$request->all());
-        $data = WorkOrder::query()->defaultWith()->find($request->input('detail_id'));
+        $data = $this->service->getDefaultWith($detail->work_order_id);
         return ['success' => true,'data' => $data];
     }
 }

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

@@ -25,7 +25,7 @@ class WorkOrderProcessLogController extends Controller
 
     public function storeApi(Request $request): array
     {
-        if (Gate::denies('订单管理-工单处理-宝时编辑') ||
+        if (Gate::denies('订单管理-工单处理-宝时编辑') &&
             Gate::denies('订单管理-工单处理-承运商编辑')) {
             return ['success' => false, 'message' => '没有对应的权限'];
         }
@@ -110,7 +110,7 @@ class WorkOrderProcessLogController extends Controller
             Gate::denies('订单管理-工单处理-承运商编辑')) {
             return ['success' => false, 'message' => '没有对应的权限'];
         }
-        if ($request->has(['ids', 'content'])) {
+        if (!$request->has(['ids', 'content'])) {
             return ['success' => false, 'message' => '参数缺失'];
         }
         $workOrders = WorkOrder::query()->where('status', '!=', 5)->find($request->ids);

+ 84 - 0
app/Http/Controllers/WorkOrderRelationRejectedBillController.php

@@ -0,0 +1,84 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Order;
+use App\OrderIssueRejectedBill;
+use App\Services\OrderRejectedBillRelationService;
+use App\WorkOrder;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Gate;
+
+class WorkOrderRelationRejectedBillController extends Controller
+{
+
+    private $orderRejectedBillRelationService;
+
+    public function __construct(OrderRejectedBillRelationService $orderRejectedBillRelationService)
+    {
+        $this->orderRejectedBillRelationService = $orderRejectedBillRelationService;
+    }
+
+    public function storeApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-宝时编辑') && Gate::denies('订单管理-工单处理-承运商编辑') && Gate::denies('订单管理-工单处理-商家编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        } else if (!$request->has('order_id', 'logistic_number_return')) {
+            return ['success' => false, 'message' => '参数异常'];
+        }
+        $order = Order::query()->with('issue')->where('id', $request->input('order_id'))->first();
+        if (!$order) ['success' => false, 'message' => '参数异常'];
+        $query = OrderIssueRejectedBill::query()->where('order_id', $request->input('order_id'))->where('logistic_number_return', $request->input('logistic_number_return'));
+        $relation = $query->first();
+        if (!$relation) {
+            OrderIssueRejectedBill::query()->create(
+                ['order_id' => $order->id, 'order_issue_id' => $order->issue->id ?? null, 'logistic_number_return' => $request->input('logistic_number_return')]
+            );
+        } else if ($order->issue ?? false) {
+            $query->update(['order_issue_id' => $order->issue->id]);
+        }
+        $this->orderRejectedBillRelationService->orderSyncRejectedBill($order);
+        $data = WorkOrder::query()->defaultWith()->where('order_id', $request->input('order_id'))->first();
+        return ['success' => true, 'data' => $data];
+    }
+
+    public function destroyApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-宝时编辑') && Gate::denies('订单管理-工单处理-承运商编辑') && Gate::denies('订单管理-工单处理-商家编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        } else if (!$request->has('order_id', 'logistic_number_return')) {
+            return ['success' => false, 'message' => '参数异常'];
+        }
+        $order = Order::query()->with('issue')->where('id', $request->input('order_id'))->first();
+        if (!$order) ['success' => false, 'message' => '参数异常'];
+        $query = OrderIssueRejectedBill::query()->where('order_id', $request->input('order_id'))->where('logistic_number_return', $request->input('logistic_number_return'));
+        $relation = $query->first();
+        if (!$relation) {
+            return ['success' => false, 'message' => '参数异常'];
+        }
+        $query->delete();
+        $this->orderRejectedBillRelationService->orderSyncRejectedBill($order);
+        $data = WorkOrder::query()->defaultWith()->where('order_id', $request->input('order_id'))->first();
+        return ['success' => true, 'data' => $data];
+    }
+
+    public function resetRelationApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-宝时编辑') && Gate::denies('订单管理-工单处理-承运商编辑') && Gate::denies('订单管理-工单处理-商家编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        } else if ($request->has('order_id', 'logistic_number_return', 'update_logistic_number_return')) {
+            return ['success' => false, 'message' => '参数异常'];
+        }
+        $order = Order::query()->with('issue')->where('id', $request->input('order_id'))->first();
+        if (!$order) ['success' => false, 'message' => '参数异常'];
+        $query = OrderIssueRejectedBill::query()->where('order_id', $order->id)->where('logistic_number_return', $request->input('logistic_number_return'));
+        $relation = $query->first();
+        if (!$relation) {
+            return ['success' => false, 'message' => '参数异常,刷新页面重试'];
+        }
+        $query->update(['logistic_number_return' => $request->input('update_logistic_number_return')]);
+        $this->orderRejectedBillRelationService->orderSyncRejectedBill($order);
+        $data = WorkOrder::query()->defaultWith()->where('order_id', $request->input('order_id'))->first();
+        return ['success' => true, 'data' => $data];
+    }
+}

+ 1 - 1
app/Http/Controllers/api/thirdPart/flux/WaybillController.php

@@ -105,7 +105,6 @@ class WaybillController extends Controller
                 $order = app("OrderService")->first(["code"=>$waybill->wms_bill_number]);
                 if ($order){
                     $waybill->order_id = $order->id;
-                    app("WaybillService")->autoGetDBBill($waybill);
                 }
             }
             WaybillAuditLog::query()->create([
@@ -131,6 +130,7 @@ class WaybillController extends Controller
             //回传FLUX
             if ($prefix != 'BSDB') $this->accomplishToWMS($waybill);
         }
+        app("WaybillService")->autoGetDBBill($waybill);
         return response()->json(['response'=>['return'=>['returnFlag'=>'1','returnCode'=>'0000','returnDesc'=>'正确接收','resultInfo'=>'']]])
             ->setEncodingOptions(JSON_UNESCAPED_UNICODE);
     }

+ 11 - 1
app/Http/Middleware/AuthorizingApi.php

@@ -2,6 +2,7 @@
 
 namespace App\Http\Middleware;
 
+use App\Services\UserService;
 use Closure;
 use Firebase\JWT\ExpiredException;
 use Firebase\JWT\JWT;
@@ -21,6 +22,10 @@ class AuthorizingApi
     public function handle(Request $request, Closure $next)
     {
         $token = $request->header("token");
+        /**
+         * @var UserService $service
+         */
+        $service = app("UserService");
         if (!$token) return response()->json([
                         'message' => '没有认证,请前去认证',
                         'status_code' => 401,
@@ -37,7 +42,12 @@ class AuthorizingApi
         }
         try {
             $payload = JWT::decode($token, $publicKey, ['RS256']);
-            $user = app("UserService")->getOrRefreshCache($payload->data->id,$payload->exp);
+            $user = $service->getOrRefreshCache($payload->data->id,$payload->exp);
+            if (!$service->verifySingleTag($user->id, $token)){
+                $response["status_code"] = 407;
+                $response["message"] = "账号已在别处登录";
+                return response()->json($response);
+            }
         }catch (ExpiredException $e){
             $response["status_code"] = 401;
             $response["message"] = "token失效";

+ 1 - 2
app/Http/Requests/Api/ReceivingTaskRequest.php

@@ -36,7 +36,7 @@ class ReceivingTaskRequest extends FormRequest
             'provide_list' => 'required',
             'receiving_type' => 'required',
             'driving_license_image' => 'required|image',
-            'asn_nos' => 'required|array'
+            'asn_nos' => 'array'
         ];
     }
 
@@ -54,7 +54,6 @@ class ReceivingTaskRequest extends FormRequest
             'receiving_type.required' => "收货类型为必选项",
             'driving_license_image.required' => "驾驶证扫描件不能为空",
             'driving_license_image.image' => "驾驶证扫描件格式错误",
-            'asn_nos.required' => "勾选入库单",
             'asn_nos.array' => "入库单号参数类型错误"
         ];
     }

+ 22 - 23
app/Imports/OrderIssueImport.php

@@ -3,6 +3,7 @@
 namespace App\Imports;
 
 use App\Events\AddOrUpdateOrderIssues;
+use App\Jobs\SyncRejectedBillRejectingStatusJob;
 use App\OracleActAllocationDetails;
 use App\OracleDOCOrderHeader;
 use App\Order;
@@ -24,14 +25,20 @@ HeadingRowFormatter::default('none');
 
 class OrderIssueImport implements ToCollection, WithHeadingRow, WithMultipleSheets
 {
+    /** @var  OrderService $orderService*/
+    private $orderService;
+    /** @var RejectedService  $rejectedService */
+    private $rejectedService;
+
 
     public function Collection(Collection $collection)
     {
-        /** @var OrderService $orderService */
-        $orderService = app('OrderService');
+
+        $this->orderService = app(OrderService::class);
+        $this->rejectedService = app(RejectedService::class);
 
         $endIS = false;
-        $headerRow =  $collection->toArray()[0];
+        $headerRow = $collection->toArray()[0];
         if (!isset($headerRow['原始运单号']) || !isset($headerRow['情况说明']) || !isset($headerRow['问题类别'])) {
             Cache::put('error', '请检查您第一行标题是否存在原始运单号,情况说明,问题类别');
         } else {
@@ -39,7 +46,6 @@ class OrderIssueImport implements ToCollection, WithHeadingRow, WithMultipleShee
         }
         $exception = [];
         $sum = 2;
-        $rejectedService = new RejectedService();
         if ($endIS) {
             foreach ($collection as $row) {
                 $logistic_number = trim($row['原始运单号'], ' ');
@@ -68,16 +74,11 @@ class OrderIssueImport implements ToCollection, WithHeadingRow, WithMultipleShee
                     $sum++;
                     continue;
                 }
-                $orderPackage = OrderPackage::query()->where('logistic_number', $logistic_number)->first();
-                if ($orderPackage) {
-                    $order = Order::query()->where('id', $orderPackage['order_id'])->first();
-                    if ($order) {
-                        $orderIssue = OrderIssue::query()->where('order_id', $order['id'])->first();
-                        if ($orderIssue) {
-                            array_push($exception, ['原始运单号' . $row['原始运单号'] . '对应的问题件已存在']);
-                            continue;
-                        }
-                    }
+                $query = OrderPackage::query()->select('order_id')->where('logistic_number', $logistic_number);
+                $order_issue_exists = OrderIssue::query()->whereIn('order_id', $query)->exists();
+                if ($order_issue_exists) {
+                    array_push($exception, ['原始运单号' . $row['原始运单号'] . '对应的问题件已存在']);
+                    continue;
                 }
                 $client_no = null;
                 $order_nos = [];
@@ -91,26 +92,24 @@ class OrderIssueImport implements ToCollection, WithHeadingRow, WithMultipleShee
                     $client_no = $orderHeader['soreference1'];
                     $order_nos[] = $orderHeader['orderno'];
                 }
-                $orderService->syncOrderInfoByWmsOrderNos($order_nos);
-                $order = Order::query()->where('code',$order_nos[0])->first();
-                $orderIssue = OrderIssue::query()->where('order_id', $order['id'])->first();
-                $rejectedBill = $rejectedService->getRejectedByClientNo($client_no);
+                $this->orderService->syncOrderInfoByWmsOrderNos($order_nos);
+                $query = Order::query()->where('code', $order_nos[0]);
+                $orderIssue = OrderIssue::query()->where('order_id', $query)->first();
+                $rejectedBill = $this->rejectedService->getRejectedByClientNo($client_no);
                 if ($orderIssue) {
                     array_push($exception, ['原始运单号' . $row['原始运单号'] . '对应的问题件已存在']);
                     $sum++;
                     continue;
                 }
-                $arr = ['order_id' => $order['id'], 'order_issue_type_id' => $order_type['id'],'result_explain'=>$row['情况说明'],'imported_status'=>'导入未处理'];
+                $arr = ['order_id' => $orderIssue->order_id, 'order_issue_type_id' => $order_type['id'], 'result_explain' => $row['情况说明'], 'imported_status' => '导入未处理'];
                 if ($rejectedBill) {
                     $arr['rejected_bill_id'] = $rejectedBill['id'];
                 }
 
                 /** @var OrderIssue $orderIssue */
                 $orderIssue = OrderIssue::query()->create($arr);
-                event(new AddOrUpdateOrderIssues([$order['id']]));
-                $orderIssue->syncRejectedBills();
-                $orderIssue->syncRejectingStatus();
-
+                event(new AddOrUpdateOrderIssues([$orderIssue->order_id]));
+                SyncRejectedBillRejectingStatusJob::dispatch($orderIssue->order);
                 if ($orderIssue) {
                     array_push($exception, ['订单' . $row['原始运单号'] . '问题件创建成功!']);
                     OrderIssueProcessLog::query()->create(['order_issue_id' => $orderIssue['id'], 'user_id' => Auth::user()['id'], 'content' => '', 'type' => '创建']);

+ 6 - 5
app/Imports/RejectedImport.php

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

+ 42 - 0
app/Jobs/SyncOrderRejectingStatusJob.php

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

+ 43 - 0
app/Jobs/SyncRejectedBillRejectingStatusJob.php

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

+ 9 - 1
app/Order.php

@@ -6,6 +6,7 @@ use App\Traits\ModelTimeFormat;
 use Illuminate\Database\Eloquent\Model;
 use App\Traits\ModelLogChanging;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Database\Eloquent\Relations\HasOne;
 
 class Order extends Model
 {
@@ -32,7 +33,8 @@ class Order extends Model
         'wms_edittime',
         'wms_status',
         'order_type',
-        'frozen'
+        'frozen',
+        'pay_at',
     ];
 
     /*
@@ -106,6 +108,11 @@ class Order extends Model
         return $this->belongsTo('App\Batch', 'batch_id','id');
     }
 
+    public function detail(): HasOne
+    {
+        return $this->hasOne(OrderDetail::class);
+    }
+
     public function getLogisticNumbersAttribute()
     {
         $packages = $this->packages;
@@ -189,6 +196,7 @@ class Order extends Model
         $this['frozen'] = $order['frozen'];
         $this['order_type'] = $order['order_type'];
         $this['created_at'] =$order['created_at'];
+        $this['pay_at'] =$order['pay_at'];
     }
 
     public static function getFrozen($string): string

+ 23 - 0
app/OrderDetail.php

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

+ 138 - 130
app/OrderIssue.php

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

+ 11 - 5
app/OrderIssueRejectedBill.php

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

+ 2 - 2
app/OrderPackage.php

@@ -34,8 +34,8 @@ class OrderPackage extends Model
         'measuring_machine_id',
         'weighed_at',
         'status',
-        'sent_at',
-        'received_at',
+        'sent_at', //复核时间
+        'received_at',//签收时间
         'owner_id',
         'uploaded_to_wms',
         'sync_routes_flag',//同步物流信息标记

+ 5 - 0
app/OrderPackageExpressRoute.php

@@ -13,6 +13,11 @@ class OrderPackageExpressRoute extends Model
     protected $fillable = [
         'order_package_express_routes',
         'logistics_number',
+        'issue_time',
+        'check_time',
+        'pickup_time',
+        'transfer_time',
+        'receive_time',
     ];
 
     protected $casts = [

+ 6 - 0
app/Providers/AppServiceProvider.php

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

+ 55 - 53
app/RejectedBill.php

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

+ 1 - 1
app/Services/OracleDOCOrderHeaderService.php

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

+ 4 - 1
app/Services/OracleDocAsnHerderService.php

@@ -43,7 +43,8 @@ class OracleDocAsnHerderService
                 $query->with(['lineStatus', 'qualityStatus', 'basSku']);
             }])
             ->whereIn("AsnStatus", ['00', '30'])
-            ->where('CustomerId', $customId)->orderByDesc('addtime')->forPage($page,$perGage)->get();
+            ->whereIn('asnType',['B2BRK','CGRK','CSKC','DBRK','F10','F21','F31','F32','HHRK','QTRK'])
+            ->where('CustomerId', $customId)->orderByDesc('addTime')->forPage($page,$perGage)->get();
     }
 
     public function getToBeProcessAsnCountByCustomId($customId): int
@@ -53,6 +54,8 @@ class OracleDocAsnHerderService
                 $query->with(['lineStatus', 'qualityStatus', 'basSku']);
             }])
             ->whereIn("AsnStatus", ['00', '30'])
+
+            ->whereIn('asnType',['B2BRK','CGRK','CSKC','DBRK','F10','F21','F31','F32','HHRK','QTRK'])
             ->where('CustomerId', $customId)->count();
     }
 

+ 13 - 0
app/Services/OrderDetailService.php

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

+ 34 - 67
app/Services/OrderIssueRejectedBillService.php

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

+ 125 - 121
app/Services/OrderIssueService.php

@@ -3,6 +3,7 @@
 namespace App\Services;
 
 use App\Events\AddOrUpdateOrderIssues;
+use App\Jobs\SyncRejectedBillRejectingStatusJob;
 use App\OracleActAllocationDetails;
 use App\OracleDOCASNHeader;
 use App\OracleDOCOrderHeader;
@@ -24,19 +25,38 @@ use App\Traits\ServiceAppAop;
 class OrderIssueService
 {
     use ServiceAppAop;
-    protected $modelClass=OrderIssue::class;
+
+    protected $modelClass = OrderIssue::class;
+
+    protected $orderService;
+    protected $rejectedBillSyncOrderService;
+    protected $oracleDocOrderHeaderService;
+    protected $orderIssueProcessLogService;
+    protected $logService;
+
+    public function __construct(OrderService $orderService,
+                                OrderRejectingStatusService $rejectedBillSyncOrderService,
+                                OracleDocOrderHeaderService $oracleDocOrderHeaderService,
+                                OrderIssueProcessLogService $orderIssueProcessLogService,
+                                LogService $logService
+    )
+    {
+        $this->orderService = $orderService;
+        $this->rejectedBillSyncOrderService = $rejectedBillSyncOrderService;
+        $this->oracleDocOrderHeaderService = $oracleDocOrderHeaderService;
+        $this->orderIssueProcessLogService = $orderIssueProcessLogService;
+        $this->logService = $logService;
+    }
 
     public function insert($params)
     {
         OrderIssue::query()->insert($params);
     }
 
-    public function orderIssueTag(array $params)
+    public function orderIssueTag(array $params): array
     {
         $orderNos = $params['orderNos'];
-        /** @var OracleDOCOrderHeaderService $orderHeaderService */
-        $orderHeaderService = app('OracleDocOrderHeaderService');
-        $orderHeaders = $orderHeaderService->getQuery()->whereIn('orderNo', $orderNos)->get();
+        $orderHeaders = $this->oracleDocOrderHeaderService->getQuery()->whereIn('orderNo', $orderNos)->get();
         $bool = $this->createOrderIssueByWmsOrder($orderHeaders, $params['typeId'], $params['result_explain']);
         if ($bool) {
             return ['success' => $bool];
@@ -47,19 +67,19 @@ class OrderIssueService
 
     /**
      * 生成问题件
-     * @param  array $params
+     * @param array $params
      * @return array|false[]
      */
     public function buildOrderIssue(array $params): array
     {
         $data = Carbon::now();
-        foreach ($params as $param){
+        foreach ($params as $param) {
             $inner_params[] = [
                 'order_id' => $param['order_id'],
-                'result_explain'=> $param['result_explain'] ?? '',
-                'imported_status'=> $param['imported_status'] ?? '正常',
-                'custom_code'=> $param['custom_code'] ?? null ,
-                'hidden_tag'=> $param['hidden_tag'] ?? null,
+                'result_explain' => $param['result_explain'] ?? '',
+                'imported_status' => $param['imported_status'] ?? '正常',
+                'custom_code' => $param['custom_code'] ?? null,
+                'hidden_tag' => $param['hidden_tag'] ?? null,
                 'order_issue_type_id' => $param['order_issue_type_id'] ?? '',
                 'created_at' => $data,
                 'updated_at' => $data,
@@ -67,32 +87,34 @@ class OrderIssueService
         }
         if (!isset($inner_params)) return ['success' => false];
         $bool = OrderIssue::query()->insert($inner_params);
-        if (!$bool) return ['success' => false,'message' => '创建问题件异常'];
+        if (!$bool) return ['success' => false, 'message' => '创建问题件异常'];
         $ordersIssues = OrderIssue::query()->whereIn('order_id', data_get($inner_params, '*.order_id'))->get();
-        event(new AddOrUpdateOrderIssues(data_get($ordersIssues,'*.order_id')));
-        $this->同步退单状态($ordersIssues);
+        event(new AddOrUpdateOrderIssues(data_get($ordersIssues, '*.order_id')));
+        $ordersIssues->each(function ($item){
+            SyncRejectedBillRejectingStatusJob::dispatch($item->order);
+        });
+//        $this->同步退单状态($ordersIssues);
         $param = [
             'ids' => data_get($ordersIssues, '*.id'),
             'content' => '',
             'user_id' => Auth::user()['id'],
             'type' => '创建'
         ];
-        app(OrderIssueProcessLogService::class)->create($param);
+        $this->orderIssueProcessLogService->create($param);
         return ['success' => true];
     }
 
-    public function createOrderIssueByWmsOrder($orderHeaders, $order_issue_type_id, $result_explain, $imported_status = '正常', $custom_code = null,$hiddenTag = null)
+    public function createOrderIssueByWmsOrder($orderHeaders, $order_issue_type_id, $result_explain, $imported_status = '正常', $custom_code = null, $hiddenTag = null)
     {
         /** @var OrderService $orderService */
-        $orderService = app('OrderService');
-        $orderService->syncOrderInfo($orderHeaders);
-        $orders = Order::query()->whereIn('code',data_get($orderHeaders,'*.orderno'))->whereHas('packages')->get();
-        if($orders->count()==0)return false;
+        $this->orderService->syncOrderInfo($orderHeaders);
+        $orders = Order::query()->whereIn('code', data_get($orderHeaders, '*.orderno'))->whereHas('packages')->get();
+        if ($orders->count() == 0) return false;
         $innerParams = [];
         $data = Carbon::now()->format('Y-m-d H:i:s');
         foreach ($orderHeaders as $orderHeader) {
-            $order = $orders->where('code',$orderHeader->orderno)->first();
-            if($order==null)$order = Order::query()->where('code',$orderHeader->orderno)->first();
+            $order = $orders->where('code', $orderHeader->orderno)->first();
+            if ($order == null) $order = Order::query()->where('code', $orderHeader->orderno)->first();
             $innerParams[] = [
                 'order_id' => $order->id,
                 'order_issue_type_id' => $order_issue_type_id,
@@ -107,33 +129,26 @@ class OrderIssueService
         try {
             $this->insert($innerParams);
             $ordersIssues = OrderIssue::query()->whereIn('order_id', data_get($innerParams, '*.order_id'))->get();
-            event(new AddOrUpdateOrderIssues(data_get($ordersIssues,'*.order_id')));
-            $this->同步退单状态($ordersIssues);
+            event(new AddOrUpdateOrderIssues(data_get($ordersIssues, '*.order_id')));
+            $ordersIssues->each(function ($item){
+                SyncRejectedBillRejectingStatusJob::dispatch($item->order);
+            });
+//            $this->同步退单状态($ordersIssues);
             $param = [
                 'ids' => data_get($ordersIssues, '*.id'),
                 'content' => '',
                 'user_id' => Auth::user()['id'],
                 'type' => '创建'
             ];
-            app(OrderIssueProcessLogService::class)->create($param);
-            app('LogService')->log(__METHOD__, __FUNCTION__, '创建问题件' . count($innerParams) . json_encode($innerParams));
+            $this->orderIssueProcessLogService->create($param);
+            $this->logService->log(__METHOD__, __FUNCTION__, '创建问题件' . count($innerParams) . json_encode($innerParams));
             return true;
         } catch (\Exception $e) {
-            app('LogService')->log(__METHOD__, __FUNCTION__, '创建问题件 error' . count($innerParams) . json_encode($innerParams) .json_encode($e->getMessage())  .json_encode($e->getTraceAsString())) ;
+            $this->logService->log(__METHOD__, __FUNCTION__, '创建问题件 error' . count($innerParams) . json_encode($innerParams) . json_encode($e->getMessage()) . json_encode($e->getTraceAsString()));
             return false;
         }
     }
 
-    public function 同步退单状态($orderIssues)
-    {
-        if(!$orderIssues)return;
-        foreach ($orderIssues as $orderIssue) {
-            /**@var OrderIssue $orderIssue */
-            $orderIssue->syncRejectedBills();
-            $orderIssue->syncRejectingStatus();
-        }
-    }
-
     public function createOrFindByOrderNo($orderNo)
     {
         $orderHeader = OracleDOCOrderHeader::query()->where('orderNo', $orderNo)->first();
@@ -145,13 +160,11 @@ class OrderIssueService
 
     public function createOrFind($clientCode)
     {
-        /** @var OrderService $orderService */
-        $orderService = app('OrderService');
         $orderHeader = OracleDOCOrderHeader::query()->where('SOReference1', $clientCode)->first();
         if ($orderHeader === null) {
             return null;
         }
-        $order = $orderService->findOrCreateByClientCode($clientCode);
+        $order = $this->orderService->findOrCreateByClientCode($clientCode);
         $rejectedBill = RejectedBill::query()->where('order_number', $orderHeader['soreference1'])->first();
         if ($rejectedBill === null) {
             $asnHeader = OracleDOCASNHeader::query()->where('ASNReference2', $orderHeader['soreference1'])->first();
@@ -167,13 +180,13 @@ class OrderIssueService
         try {
             /** @var OrderIssue $orderIssue */
             $orderIssue = OrderIssue::query()->create($arr);
-            $orderIssue->syncRejectedBills();
-            $orderIssue->syncRejectingStatus();
             $orderIssue->order = $order;
             event(new AddOrUpdateOrderIssues([$orderIssue['order_id']]));
-            app('LogService')->log(__METHOD__, __FUNCTION__, '创建问题件' . json_encode($orderIssue));
+            SyncRejectedBillRejectingStatusJob::dispatch($order);
+
+            $this->logService->log(__METHOD__, __FUNCTION__, '创建问题件' . json_encode($orderIssue));
         } catch (\Exception $e) {
-            app('LogService')->log(__METHOD__, __FUNCTION__, '创建问题件error' . json_encode($arr) . $e->getMessage() . $e->getTraceAsString());
+            $this->logService->log(__METHOD__, __FUNCTION__, '创建问题件error' . json_encode($arr) . $e->getMessage() . $e->getTraceAsString());
         } finally {
             unset($orderHeader, $rejectedBill, $order);
             return $orderIssue;
@@ -216,28 +229,26 @@ class OrderIssueService
         /** @var OrderIssue $orderIssue */
         $orderIssue = OrderIssue::query()->create($arr);
         if (!$arr['order_id']) {
-            $order = app("OrderService")->createOrder($arr);
+            $order = $this->orderService->createOrder($arr);
             $orderIssue->order_id = $order['id'];
             $orderIssue->save();
-            app('LogService')->log(__METHOD__,__FUNCTION__,'创建 Order'.json_encode($order));
+            SyncRejectedBillRejectingStatusJob::dispatch($order);
+            $this->logService->log(__METHOD__, __FUNCTION__, '创建 Order' . json_encode($order));
         }
-        $orderIssue->syncRejectedBills();
-        $orderIssue->syncRejectingStatus();
         return $orderIssue;
     }
 
     public function createByLogisticNumber(array $arr)
     {
         /** @var OrderIssue $orderIssue */
-        $arr['code']='null_'.Uuid::uuid4();
-        $order = app("OrderService")->createOrder($arr);
-        app('LogService')->log(__METHOD__,__FUNCTION__,'创建 Order'.json_encode($order));
+        $arr['code'] = 'null_' . Uuid::uuid4();
+        $order = $this->orderService->createOrder($arr);
+        $this->logService->log(__METHOD__, __FUNCTION__, '创建 Order' . json_encode($order));
         $orderIssue = OrderIssue::query()->create($arr);
         $orderIssue['order_id'] = $order['id'];
         OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $arr['logistic_number_return']]);
         $orderIssue->update(['order_id' => $order['id']]);
-        $orderIssue->syncRejectedBills();
-        $orderIssue->syncRejectingStatus();
+        SyncRejectedBillRejectingStatusJob::dispatch($order);
         event(new AddOrUpdateOrderIssues([$orderIssue['order_id']]));
         return $orderIssue;
     }
@@ -246,10 +257,10 @@ class OrderIssueService
     {
         try {
             $bool = OrderIssue::query()->whereIn('id', $ids)->delete();
-            app('LogService')->log(__METHOD__, __FUNCTION__, json_encode($ids));
+            $this->logService->log(__METHOD__, __FUNCTION__, json_encode($ids));
             return ['success' => $bool];
         } catch (\Exception $e) {
-            app('LogService')->log(__METHOD__, __FUNCTION__, 'error' . json_decode($ids) . '||' . $e->getMessage() . '||' . $e->getTraceAsString());
+            $this->logService->log(__METHOD__, __FUNCTION__, 'error' . json_decode($ids) . '||' . $e->getMessage() . '||' . $e->getTraceAsString());
             return ['success' => false];
         }
     }
@@ -261,28 +272,26 @@ class OrderIssueService
 
     public function isExistOrderIssueTypeIsEnd($ids): bool
     {
-        return OrderIssueProcessLog::query()->whereIn('order_issue_id',$ids)->where('type','结束')->exists();
+        return OrderIssueProcessLog::query()->whereIn('order_issue_id', $ids)->where('type', '结束')->exists();
     }
 
     public function editOrderIssueSecondClientNo($id, $secondClientNo, &$order = null): bool
     {
-        $orderService = app(OrderService::class);
-        $orderHeaderService = app('OracleDocOrderHeaderService');
-        $orderHeaders = $orderHeaderService->getQuery()->where('SoReference1', $secondClientNo)->get();
-        $orderService->syncOrderInfo($orderHeaders,false);
+        $orderHeaders = $this->oracleDocOrderHeaderService->getQuery()->where('SoReference1', $secondClientNo)->get();
+        $this->orderService->syncOrderInfo($orderHeaders, false);
         return OrderIssue::query()->where('id', $id)->update(['second_client_no' => $secondClientNo]) > 0;
     }
 
     public function updateSecondLogisticNumber($id, $logisticNumber): array
     {
-        $orderIssue = OrderIssue::query()->where('id',$id)->first();
+        $orderIssue = OrderIssue::query()->where('id', $id)->first();
         // 有填写二次订单号 并没有对应的订单号
-        if($orderIssue->second_client_no){
-            if(!$orderIssue->secondOrder){
-                $orderIssue->update(['second_logistic_number'=>$logisticNumber]);
-                return ['success' => true,'second_logistic_number' => $logisticNumber];
-            }else{
-                return ['success' => false,'message' => '二次客户订单号对应的订单已存在,无法更改快递单号'];
+        if ($orderIssue->second_client_no) {
+            if (!$orderIssue->secondOrder) {
+                $orderIssue->update(['second_logistic_number' => $logisticNumber]);
+                return ['success' => true, 'second_logistic_number' => $logisticNumber];
+            } else {
+                return ['success' => false, 'message' => '二次客户订单号对应的订单已存在,无法更改快递单号'];
             }
         }
 //        // 没有填写二次订单号
@@ -294,46 +303,40 @@ class OrderIssueService
 //        $orderIssue->update(['second_client_no' => $order->client_code]);
 
         $orderIssue->second_logistic_number = $logisticNumber;
-        $order_package = OrderPackage::query()->selectRaw('order_id')->where('logistic_number',$logisticNumber);
-        if($order_package){
+        $order_package = OrderPackage::query()->selectRaw('order_id')->where('logistic_number', $logisticNumber);
+        if ($order_package) {
             $order = Order::query()->with(['packages.commodities.commodity', 'logistic'])
                 ->whereIn('id', $order_package)->first();
-            if($order)$orderIssue->second_client_no = $order->client_code;
+            if ($order) $orderIssue->second_client_no = $order->client_code;
             $orderIssue->save();
             return ['success' => true, 'order' => $order];
         }
-        /**
-         * @var OracleDOCOrderHeaderService $orderHeaderService
-         * @var OrderService $orderService
-         */
-        $orderHeaderService = app(OracleDOCOrderHeaderService::class);
-        $orderService = app(OrderService::class);
-        $orderHeader = $orderHeaderService->getQuery()->where("DOC_Order_Header.SOReference5",$logisticNumber)->get();
-        if(count($orderHeader) == 0){
-            $actAllocationQuery = OracleActAllocationDetails::query()->selectRaw("OrderNo")->where("PickToTraceId",$logisticNumber);
-            $orderHeader = $orderHeaderService->getQuery()->whereIn("DOC_Order_Header.OrderNo",$actAllocationQuery)->get();
+        $orderHeader = $this->oracleDocOrderHeaderService->getQuery()->where("DOC_Order_Header.SOReference5", $logisticNumber)->get();
+        if (count($orderHeader) == 0) {
+            $actAllocationQuery = OracleActAllocationDetails::query()->selectRaw("OrderNo")->where("PickToTraceId", $logisticNumber);
+            $orderHeader = $this->oracleDocOrderHeaderService->getQuery()->whereIn("DOC_Order_Header.OrderNo", $actAllocationQuery)->get();
         }
-        if(count($orderHeader)>0){
-            $orderService->syncOrder($orderHeader);
-            $order = Order::query()->with(['packages.commodities.commodity', 'logistic'])->where("code",$orderHeader->first()->orderno)->first();
-            if($order){
-                $orderIssue->update(['second_client_no'=>$order->client_code]);
+        if (count($orderHeader) > 0) {
+            $this->orderService->syncOrder($orderHeader);
+            $order = Order::query()->with(['packages.commodities.commodity', 'logistic'])->where("code", $orderHeader->first()->orderno)->first();
+            if ($order) {
+                $orderIssue->update(['second_client_no' => $order->client_code]);
                 return ['success' => true, 'order' => $order];
             }
         }
-        $orderIssue->update(['second_logistic_number'=>$logisticNumber]);
+        $orderIssue->update(['second_logistic_number' => $logisticNumber]);
         return ['success' => true, 'order' => null];
 
     }
 
-    public function createOrderIssue($logisticNumber, $type, $result_explain, $importedStatus = '正常', $custom_code = null,$hiddenTag = null): bool
+    public function createOrderIssue($logisticNumber, $type, $result_explain, $importedStatus = '正常', $custom_code = null, $hiddenTag = null): bool
     {
-        $orderHeaders = OracleDOCOrderHeader::query()->with(['oracleDOCOrderDetails', 'actAllocationDetails', 'oracleBASCode','orderType'])
+        $orderHeaders = OracleDOCOrderHeader::query()->with(['oracleDOCOrderDetails', 'actAllocationDetails', 'oracleBASCode', 'orderType'])
             ->whereHas('actAllocationDetails', function ($query) use ($logisticNumber) {
                 $query->where('picktotraceid', $logisticNumber);
             })->get();
         $orderIssueType = OrderIssueType::query()->where('name', $type)->first();
-        return $this->createOrderIssueByWmsOrder($orderHeaders, $orderIssueType->id, $result_explain, $importedStatus, $custom_code,$hiddenTag);
+        return $this->createOrderIssueByWmsOrder($orderHeaders, $orderIssueType->id, $result_explain, $importedStatus, $custom_code, $hiddenTag);
     }
 
     /**
@@ -364,8 +367,8 @@ class OrderIssueService
 
     public function checkOrderIssueIsExistAndSoftDelete($orderNos): array
     {
-        $orderIssues = OrderIssue::query()->onlyTrashed()->whereIn('order_id',function($query)use($orderNos){
-            $query->from('orders')->selectRaw('id')->whereIn('code',$orderNos);
+        $orderIssues = OrderIssue::query()->onlyTrashed()->whereIn('order_id', function ($query) use ($orderNos) {
+            $query->from('orders')->selectRaw('id')->whereIn('code', $orderNos);
         })->get();
         $exits_logistic_number = array_diff(array_unique(data_get($orderIssues, '*.order.code')), ['', null]);
         return array_intersect($exits_logistic_number, $orderNos);
@@ -379,42 +382,43 @@ class OrderIssueService
     public function disposeImport(array $ids): array
     {
         $orderIssues = OrderIssue::query()->with('order')->whereIn('id', $ids)->get();
-        if ($orderIssues->count()<count($ids)) {
+        if ($orderIssues->count() < count($ids)) {
             $is_exits_ids = array_diff($ids, data_get($orderIssues, '*.code'));
             return ['success' => false, 'fail_info' => json_encode($is_exits_ids) . '没有存在对应的问题件'];
         }
         if ($orderIssues->where('imported_status', '导入已梳理')->count() > 0) {
-             $is_dispose_orderNos = data_get($orderIssues->where('imported_status', '导入已梳理'), '*.order.code');
+            $is_dispose_orderNos = data_get($orderIssues->where('imported_status', '导入已梳理'), '*.order.code');
             return ['success' => false, 'fail_info' => json_encode($is_dispose_orderNos) . '导入已处理'];
         }
         try {
             OrderIssue::query()->whereIn('id', $ids)->update(['imported_status' => '导入已梳理']);
-            app('LogService')->log(__METHOD__,__FUNCTION__,'导入处理 '.json_encode($ids).'导入处理');
+            $this->logService->log(__METHOD__, __FUNCTION__, '导入处理 ' . json_encode($ids) . '导入处理');
             return ['success' => true];
         } catch (\Exception $e) {
-            app('LogService')->log(__METHOD__,__FUNCTION__,'导入处理 error'.json_encode($e->getMessage()).$e->getTraceAsString());
-            return ['success' => false,'fail_info'=>$e->getMessage()];
+            $this->logService->log(__METHOD__, __FUNCTION__, '导入处理 error' . json_encode($e->getMessage()) . $e->getTraceAsString());
+            return ['success' => false, 'fail_info' => $e->getMessage()];
         }
     }
 
-    public function getRecycleBinPaginate($params){
+    public function getRecycleBinPaginate($params)
+    {
         return OrderIssue::query()
-            ->with(['order'=>function($query){
-                $query->with(['logistic','shop','owner','packages'=>function($query){
-                $query->with('commodities');
-            }]);
-        },'orderIssueRejectedBills.rejectedBill.items','issueType','secondOrder.packages.commodities'])->onlyTrashed()->paginate($params['paginate'] ?? 50);
+            ->with(['order' => function ($query) {
+                $query->with(['logistic', 'shop', 'owner', 'packages' => function ($query) {
+                    $query->with('commodities');
+                }]);
+            }, 'orderIssueRejectedBills.rejectedBill.items', 'issueType', 'secondOrder.packages.commodities'])->onlyTrashed()->paginate($params['paginate'] ?? 50);
     }
 
     public function recoverOrderIssue($ids): array
     {
         try {
             $bool = OrderIssue::query()->withTrashed()->whereIn('id', $ids)->restore();
-            app('LogService')->log(__METHOD__, __FUNCTION__, '恢复问题件 ids = ' . json_encode($ids));
-            return ['success'=>$bool];
+            $this->logService->log(__METHOD__, __FUNCTION__, '恢复问题件 ids = ' . json_encode($ids));
+            return ['success' => $bool];
         } catch (\Exception $e) {
-            app('LogService')->log(__METHOD__, 'ERROR '.__FUNCTION__, '恢复问题件 Error' . json_encode($ids).' || '.json_encode($e->getMessage()).' || '.json_encode($e->getTraceAsString()));
-            return ['success'=>false,'error'=>$e->getMessage()];
+            $this->logService->log(__METHOD__, 'ERROR ' . __FUNCTION__, '恢复问题件 Error' . json_encode($ids) . ' || ' . json_encode($e->getMessage()) . ' || ' . json_encode($e->getTraceAsString()));
+            return ['success' => false, 'error' => $e->getMessage()];
         }
     }
 
@@ -424,8 +428,8 @@ class OrderIssueService
      */
     public function archive($orderIssues)
     {
-        $updateParams = ['final_status'=>'已归档','archive_at' =>  Carbon::now()->format('Y-m-d H:i:s')];
-        $orderIssues->each(function($orderIssue)use($updateParams){
+        $updateParams = ['final_status' => '已归档', 'archive_at' => Carbon::now()->format('Y-m-d H:i:s')];
+        $orderIssues->each(function ($orderIssue) use ($updateParams) {
             $orderIssue->update($updateParams);
         });
     }
@@ -437,41 +441,41 @@ class OrderIssueService
      */
     public function isExists($logistic_number): bool
     {
-        $order_package_query = OrderPackage::query()->select('order_id')->whereIn('logistic_number',[$logistic_number]);
-        $order_issue_type_query = OrderIssueType::query()->select('id')->where('name' ,'拦截');
-        return OrderIssue::query()->whereIn('order_id',$order_package_query)->whereIn('order_issue_type_id',$order_issue_type_query)->count() ;
+        $order_package_query = OrderPackage::query()->select('order_id')->whereIn('logistic_number', [$logistic_number]);
+        $order_issue_type_query = OrderIssueType::query()->select('id')->where('name', '拦截');
+        return OrderIssue::query()->whereIn('order_id', $order_package_query)->whereIn('order_issue_type_id', $order_issue_type_query)->count();
     }
 
     // 已拦截 在 问题件 的显示
     public function intercept($logistic_number)
     {
-        $order_package = OrderPackage::query()->select('order_id')->where('logistic_number',$logistic_number)->first();
+        $order_package = OrderPackage::query()->select('order_id')->where('logistic_number', $logistic_number)->first();
         if (!$order_package) return;
-        OrderIssue::query()->where('order_id',$order_package->order_id)->update(['is_intercept' => 1]);
+        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();
+        $orderIds = data_get($orderIssues->items(), '*.order_id');
+        $workOrders = WorkOrder::query()->whereIn('order_id', $orderIds)->get();
         $tags = [];
-        $workOrders->each(function($workOrder)use(&$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;
+            if (array_key_exists($orderIssue->order_id, $tags)) $orderIssue->is_work_order = true;
             else $orderIssue->is_work_order = false;
         }
     }
 
-    public function batchUpdateFinalStatus($ids,$status)
+    public function batchUpdateFinalStatus($ids, $status)
     {
-        OrderIssue::query()->whereIn('id',$ids)->update(['final_status'=>$status]);
+        OrderIssue::query()->whereIn('id', $ids)->update(['final_status' => $status]);
     }
 
-    public function batchUpdateIssueType($ids,$orderIssueTypeID)
+    public function batchUpdateIssueType($ids, $orderIssueTypeID)
     {
-        OrderIssue::query()->whereIn('id',$ids)->update(['order_issue_type_id'=>$orderIssueTypeID]);
+        OrderIssue::query()->whereIn('id', $ids)->update(['order_issue_type_id' => $orderIssueTypeID]);
     }
 }
 

+ 36 - 4
app/Services/OrderPackageReceivedSyncService.php

@@ -9,11 +9,13 @@ use App\Jobs\LogisticSFSync;
 use App\Jobs\LogisticYDSync;
 use App\Jobs\LogisticYTOSync;
 use App\Jobs\LogisticZopSync;
+use App\Order;
 use App\OrderPackage;
 use App\OrderPackageExpressRoute;
 use Carbon\Carbon;
 use Exception;
 use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Str;
 
 class OrderPackageReceivedSyncService
@@ -198,14 +200,44 @@ class OrderPackageReceivedSyncService
             /** @var OrderPackage $orderPackage */
             $orderPackage = OrderPackage::query()->where('logistic_number', $logisticResponse['logistic_number'])->first();
             if (isset($logisticResponse['transfer_status']) && isset($logisticResponse['logistic_number'])) {
+                $orderPackageExpressRouteArr = [
+                    'order_package_express_routes' => $logisticResponse['transfer_status'],
+                    'logistics_number' => $logisticResponse['logistic_number'],
+                ];
+                try {
+                    $issue_time = $orderPackage->order->created_at ?? null;
+                    $check_time = $orderPackage->sent_at ?? null;
+                    $pickup_time = $orderPackageExpressRouteArr['order_package_express_routes'][0]['accept_time'] ?? null;
+                    $array_filter = array_filter($orderPackageExpressRouteArr['order_package_express_routes'], function ($item) {
+                            return (
+                                str_contains($item['remark'], '已发出')//中通
+                                || str_contains($item['accept_address'], '已发出')//中通
+                                || str_contains($item['remark'], '转运')//中通
+                                || str_contains($item['remark'], '完成分拣')//顺丰
+                                || str_contains($item['accept_address'], '转运')//圆通
+                                || str_contains($item['remark'], '已发往')//中通
+                                || str_contains($item['accept_address'], '已发往')//中通
+                                || str_contains($item['remark'], '中心')
+                                || str_contains($item['accept_address'], '中心'));
+                        }) ?? null;
+                    $transfer_time = null;
+                    if ($array_filter != null) {
+                        $transfer_time = $array_filter[array_key_first($array_filter)]['accept_time'] ?? null;
+                    }
+                    $receive_time = $logisticResponse['received_at'] ?? null;
+                    $orderPackageExpressRouteArr['issue_time'] = $issue_time;
+                    $orderPackageExpressRouteArr['check_time'] = $check_time;
+                    $orderPackageExpressRouteArr['pickup_time'] = $pickup_time;
+                    $orderPackageExpressRouteArr['transfer_time'] = $transfer_time;
+                    $orderPackageExpressRouteArr['receive_time'] = $receive_time;
+                } catch (Exception $e) {
+                    Log::error("快递同步异常", ["msg" => $e->getMessage(), "json" => $orderPackageExpressRouteArr]);
+                }
                 $orderPackageExpressRoute = OrderPackageExpressRoute::query()->updateOrCreate(
                     [
                         'logistics_number' => $logisticResponse['logistic_number'],
                     ],
-                    [
-                        'order_package_express_routes' => $logisticResponse['transfer_status'],
-                        'logistics_number' => $logisticResponse['logistic_number'],
-                    ]);
+                    $orderPackageExpressRouteArr);
                 $orderPackage->order_package_express_route_id = $orderPackageExpressRoute->id;
                 $orderPackage->save();
             }

+ 137 - 0
app/Services/OrderRejectedBillRelationService.php

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

+ 117 - 0
app/Services/OrderRejectingStatusService.php

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

+ 3 - 32
app/Services/OrderService.php

@@ -664,35 +664,6 @@ SQL;
         ];
     }
 
-//    /**
-//     * @param App/Order $order
-//     * @param App/OracleDOCOrderHeader $orderHeader
-//     */
-//    public function updateOrderByOrderHeader($order,$orderHeader)
-//    {
-//        if(!$orderHeader){return ;}
-//        if($orderHeader->orderno == $order->code){
-//            return ;
-//        }else if($orderHeader->soreference1 != $order->client_code){
-//            return ;
-//        }
-//        $params = $this->getParamByOrderHeader($orderHeader);
-//
-//        $data = [
-//                'code'=>$order->code ?? $params['code'],
-//                'owner_id'=>$order->code ?? $params['owner_id'],
-//                'shop_id'=>$order->code ?? $params['shop_id'],
-//                'logistic_id'=>$order->code ?? $params['logistic_id'],
-//                'consignee_name'=>$order->code ?? $params['consignee_name'],
-//                'province'=>$order->code ?? $params['province'],
-//                'city'=>$order->code ?? $params['city'],
-//                'district'=>$order->code ?? $params['district'],
-//                'address'=>$order->code ?? $params['address'],
-//                'wms_edittime'=>$order->code ?? $params['wms_edittime'],
-//                'wms_status'=>$order->code ?? $params['wms_status'],
-//        ];
-//        Order::query()->where('id',$order->id)->update($data);
-//    }
 
     public function getOrderByLogisticNumber($logisticNumber)
     {
@@ -704,7 +675,7 @@ SQL;
         if (!$orderHeaders) return null;
         $this->syncOrderInfo($orderHeaders);
         $code = $orderHeaders->first()->code;
-        return $order = Order::query()->with('packages.commodities.commodity')->where('code', $code)->first();
+        return Order::query()->with('packages.commodities.commodity')->where('code', $code)->first();
     }
 
     /**
@@ -802,7 +773,6 @@ SQL;
         }
 
         unset($batch_codes);
-
         // 转换插入 3s
         $this->pushOrderCreatedCountCache($created_params);
         if (count($created_params) > 0) {
@@ -910,7 +880,8 @@ SQL;
             'order_type' => $orderHeader->orderType->codename_c ?? '',
             'frozen' => Order::getFrozen($orderHeader->releasestatus),
             'updated_at' => $date,
-            'created_at' => $orderHeader['addtime']
+            'created_at' => $orderHeader['addtime'],
+            'pay_at' => $orderHeader['h_edi_20'] ?? $orderHeader['h_edi_03'],
         ];
     }
 

+ 2 - 2
app/Services/ReceivingTaskService.php

@@ -59,9 +59,9 @@ class ReceivingTaskService
         DB::transaction(function () use ($deliveryAppointmentCar, $params, &$receivingTask) {
             $receivingTask->save();
             if ($receivingTask->id) {
-                $ans_number_string = $deliveryAppointmentCar->deliveryAppointment->asn_number ?? [];
+                $ans_number_string = $deliveryAppointmentCar->deliveryAppointment->asn_number ?? '';
                 $ans_numbers = array_filter(preg_split('/[,, ]+/is', $ans_number_string));
-                $ans_numbers = array_merge($ans_numbers, $params['asn_nos'] ?? []);
+                $ans_numbers = array_unique(array_merge($ans_numbers, $params['asn_nos'] ?? []));
                 $this->itemService->createItems($receivingTask, $ans_numbers);
                 $this->saveImage($receivingTask, $params['driving_license_image']);
             }

+ 18 - 19
app/Services/RejectedBillService.php

@@ -22,7 +22,6 @@ use App\Traits\ServiceAppAop;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Query\Builder;
 use Overtrue\LaravelPinyin\Facades\Pinyin;
-use function Symfony\Component\String\s;
 
 
 class RejectedBillService
@@ -47,26 +46,26 @@ class RejectedBillService
     {
         return RejectedBill::query()->create($params);
     }
+//
+//    /**
+//     * 连接问题件
+//     *
+//     * @param RejectedBill $rejectedBill
+//     */
+//    public function joinOrderIssue($rejectedBill)
+//    {
+//        $rejectedBill->joinOrderIssue();
+//    }
 
-    /**
-     * 连接问题件
-     *
-     * @param RejectedBill $rejectedBill
-     */
-    public function joinOrderIssue($rejectedBill)
-    {
-        $rejectedBill->joinOrderIssue();
-    }
 
-
-    /**
-     * 同步退回单号
-     * @param RejectedBill $rejectedBill
-     */
-    public function syncOrderIssue(RejectedBill $rejectedBill)
-    {
-        $rejectedBill->syncOrderIssue();
-    }
+//    /**
+//     * 同步退回单号
+//     * @param RejectedBill $rejectedBill
+//     */
+//    public function syncOrderIssue(RejectedBill $rejectedBill)
+//    {
+//        $rejectedBill->syncOrderIssue();
+//    }
 
     public function syncLoadedStatusByAsnHerder($asnHerders)
     {

+ 17 - 17
app/Services/RejectedService.php

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

+ 16 - 0
app/Services/UserService.php

@@ -12,6 +12,7 @@ use Illuminate\Database\Eloquent\Model;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
 use App\Traits\ServiceAppAop;
+use Illuminate\Support\Facades\Log;
 
 
 class UserService
@@ -178,4 +179,19 @@ class UserService
         $this->setOrRefreshCache($user,$time>0 ? $time : 7200);
         return $user;
     }
+
+    public function setSingleTag($key, $token)
+    {
+        $val = $token."#".md5($_SERVER['HTTP_USER_AGENT']);
+        Cache::tags(User::ANDROID_SINGLE_TAG)->put($key,$val,
+            config("api.timeliness_limits.token","7200"));
+    }
+
+    public function verifySingleTag($key, $token):bool
+    {
+        $tV = Cache::tags(User::ANDROID_SINGLE_TAG)->get($key);
+        if ($tV===null)return true;
+        $userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? "#".md5($_SERVER['HTTP_USER_AGENT']) : "";
+        return $tV===($token.$userAgent);
+    }
 }

+ 5 - 2
app/Services/WaybillService.php

@@ -3,6 +3,7 @@
 namespace App\Services;
 
 use App\Http\Controllers\api\thirdPart\flux\WaybillController;
+use App\Logistic;
 use App\Order;
 use App\OwnerFeeDetail;
 use App\OwnerFeeLogistic;
@@ -367,10 +368,10 @@ class WaybillService
         $controller = new WaybillController();
         if ($controller->accomplishToWMS($w)){
             $sql = <<<SQL
-UPDATE ACT_ALLOCATION_DETAILS SET PICKTOTRACEID = ?,DROPID = ? WHERE ORDERNO = ? AND  PICKTOTRACEID = ? AND DROPID = ?
+UPDATE ACT_ALLOCATION_DETAILS SET PICKTOTRACEID = ?,DROPID = ? WHERE ORDERNO = ?
 SQL;
             $updateRow = DB::connection("oracle")->update($sql,[
-                $waybill->carrier_bill,$waybill->carrier_bill,$waybill->wms_bill_number,$waybill->wms_bill_number,$waybill->wms_bill_number
+                $waybill->carrier_bill,$waybill->carrier_bill,$waybill->wms_bill_number
             ]);
             if ($updateRow!=1)Log::warning("德邦单号修改分配失败",["param"=>$w,"row"=>$updateRow]);
             return true;
@@ -414,6 +415,8 @@ SQL;
             $update["station_no"] = $bill['stationNo'];
             $update["arrived_org_simple_name"] = $bill['arrivedOrgSimpleName'];
             $update["much_higher_delivery"] = $bill['muchHigherDelivery'];
+            $logistic = Logistic::query()->where("code","DBWL")->first();
+            $update["logistic_id"] = $logistic->id ?? null;
             $waybill->update($update);
             if (!app("WaybillService")->notifyFlux($waybill)){
                 Log::error("德邦单号回传FLUX失败",["no"=>$waybill->waybill_number,"info"=>$bill]);

+ 46 - 11
app/Services/WorkOrderCancelInterceptService.php

@@ -5,6 +5,7 @@ namespace App\Services;
 use App\Order;
 use App\WorkOrder;
 use App\WorkOrderDetail;
+use Illuminate\Support\Facades\Auth;
 
 class WorkOrderCancelInterceptService extends WorkOrderService
 {
@@ -15,10 +16,13 @@ class WorkOrderCancelInterceptService extends WorkOrderService
         WorkOrderCommoditiesService $commoditiesService,
         WorkOrderDetailService $detailService,
         OrderIssueTypeService $issueTypeService,
-        OrderService $orderService
+        OrderService $orderService,
+        OrderIssueService $orderIssueService,
+        OrderIssueProcessLogService $orderIssueProcessLogService
+
     )
     {
-        parent::__construct($logService,$imageService,$commoditiesService,$detailService,$issueTypeService,$orderService);
+        parent::__construct($logService,$imageService,$commoditiesService,$detailService,$issueTypeService,$orderService,$orderIssueService,$orderIssueProcessLogService);
     }
 
     public function checkWorkOrder($nos)
@@ -48,22 +52,32 @@ class WorkOrderCancelInterceptService extends WorkOrderService
         $issueType = $this->issueTypeService->firstOrCreate(['name' => '取消拦截']);
         $order = $this->syncOrder($params['order_no']);
         $workOrder = $this->createAndNotification($order, $issueType, $params['remark'] ?? '');
+        $process_progress = '商家创建';
         $workOrder->update([
             'status'=> WorkOrder::$LOGISTIC_HANDLER_STATUS,
-            'process_progress' => '商家创建',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
             'logistic_tag' => WorkOrder::$NEW_TAG,
             'owner_tag' => WorkOrder::$DEFAULT_TAG,
             'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
             'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
         ]);
         $detail = $this->detailService->createWorkOrderDetail($workOrder, $params);
         $detail->update([
             'status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
-            'process_progress' => '商家创建',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
             'logistic_handle_tag' =>0,
         ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress.'-取消拦截',
+            'status' => '未同步',
+            'type' => '创建',
+        ]);
         $this->logService->createLog($detail, '创建', '创建工单');
     }
 
@@ -82,24 +96,34 @@ class WorkOrderCancelInterceptService extends WorkOrderService
     public function logisticHandle(WorkOrderDetail $detail, $params)
     {
         $this->detailService->updateDetail($detail, $params);
+        $process_progress = $params['process_progress'];
+
         $detail->update([
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
             'logistic_handle_tag' =>0,
         ]);
 
         $detail->workOrder()->update([
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
             'bao_shi_tag' => WorkOrder::$STRAND_TAG,
             'owner_tag' => WorkOrder::$DEFAULT_TAG,
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
             'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
         ]);
-        $this->syncOrderIssueProcessLogs($detail);
-        $this->logService->createLog($detail, '处理', $params['process_progress'].'-承运商处理');
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress,
+            'status' => '未同步',
+            'type' => '处理',
+        ]);
+        $this->logService->createLog($detail, '处理', $process_progress.'-承运商处理');
     }
 
     /**
@@ -122,22 +146,33 @@ class WorkOrderCancelInterceptService extends WorkOrderService
     public function baoShiReview(WorkOrderDetail $detail, $params)
     {
         $this->detailService->updateDetail($detail, $params);
+        $process_progress = $params['process_progress'];
         $detail->update([
             'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
             'logistic_handle_tag' =>0,
         ]);
         $detail->workOrder()->update([
             'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
             'owner_tag' => WorkOrder::$STRAND_TAG,
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
             'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
             'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
+        ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress.'-完结',
+            'status' => '未同步',
+            'type' => '结束',
         ]);
-        $this->logService->createLog($detail, '终审', $params['process_progress'].'-宝时终审');
+        $this->endOrderIssueAndSyncProcessLogs($detail);
+        $this->logService->createLog($detail, '终审', $process_progress.'-宝时终审');
     }
 
     /**

+ 58 - 15
app/Services/WorkOrderDamageService.php

@@ -5,6 +5,7 @@ namespace App\Services;
 use App\Order;
 use App\WorkOrder;
 use App\WorkOrderDetail;
+use Illuminate\Support\Facades\Auth;
 
 /**
  * 处理 破损 工单
@@ -19,7 +20,9 @@ class WorkOrderDamageService extends WorkOrderService
         WorkOrderCommoditiesService $commoditiesService,
         WorkOrderDetailService $detailService,
         OrderIssueTypeService $issueTypeService,
-        OrderService $orderService
+        OrderService $orderService,
+        OrderIssueService $orderIssueService,
+        OrderIssueProcessLogService $orderIssueProcessLogService
     )
     {
         parent::__construct($logService,
@@ -27,7 +30,9 @@ class WorkOrderDamageService extends WorkOrderService
             $commoditiesService,
             $detailService,
             $issueTypeService,
-            $orderService
+            $orderService,
+            $orderIssueService,
+            $orderIssueProcessLogService
         );
     }
 
@@ -54,22 +59,32 @@ class WorkOrderDamageService extends WorkOrderService
         $issueType = $this->issueTypeService->firstOrCreate(['name' => '破损']);
         $order = $this->syncOrder($params['order_no']);
         $workOrder = $this->createAndNotification($order, $issueType, $params['remark'] ?? '');
+        $process_progress = '商家创建';
         $workOrder->update([
             'status'=> WorkOrder::$LOGISTIC_HANDLER_STATUS,
-            'process_progress' => '商家创建',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
             'logistic_tag' => WorkOrder::$NEW_TAG,
             'owner_tag' => WorkOrder::$DEFAULT_TAG,
             'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
+            'last_handler_id' => Auth::id(),
         ]);
         $detail = $this->detailService->createWorkOrderDetail($workOrder, $params);
         $detail->update([
             'status'=> WorkOrder::$LOGISTIC_HANDLER_STATUS,
-            'process_progress' => '商家创建',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
             'work_order_status' => 0,
             'logistic_handle_tag' =>0,
         ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress.'-破损',
+            'status' => '未同步',
+            'type' => '创建',
+        ]);
         $this->logService->createLog($detail, '创建', '创建工单');
     }
 
@@ -81,17 +96,27 @@ class WorkOrderDamageService extends WorkOrderService
     public function ownerEdit(WorkOrderDetail $detail,$params)
     {
         $this->detailService->updateDetail($detail, $params);
+        $process_progress = '商家创建';
         $detail->update([
             'status'=> WorkOrder::$LOGISTIC_HANDLER_STATUS,
-            'process_progress' => '商家创建',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
             'logistic_handle_tag' =>0,
         ]);
         $detail->workOrder()->update([
             'status'=> WorkOrder::$LOGISTIC_HANDLER_STATUS,
-            'process_progress' => '商家创建',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
             'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
+        ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => '商家重编辑',
+            'status' => '未同步',
+            'type' => '处理',
         ]);
         $this->logService->createLog($detail, '处理', '货主编辑');
 
@@ -105,25 +130,33 @@ class WorkOrderDamageService extends WorkOrderService
     public function logisticHandle(WorkOrderDetail $detail, $params)
     {
         $this->detailService->updateDetail($detail, $params);
-
+        $process_progress = $params['process_progress'];
         $detail->update([
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
             'logistic_handle_tag' =>0,
         ]);
 
         $detail->workOrder()->update([
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
             'bao_shi_tag' => WorkOrder::$STRAND_TAG,
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
             'owner_tag' => WorkOrder::$DEFAULT_TAG,
             'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
         ]);
-
-        $this->logService->createLog($detail, '处理', $params['process_progress'].'-承运商处理');
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress,
+            'status' => '未同步',
+            'type' => '处理',
+        ]);
+        $this->logService->createLog($detail, '处理', $process_progress.'-承运商处理');
     }
 
     /**
@@ -134,24 +167,34 @@ class WorkOrderDamageService extends WorkOrderService
     public function baoShiReview(WorkOrderDetail $detail, $params)
     {
         $this->detailService->updateDetail($detail, $params);
+        $process_progress = $params['process_progress'];
         $detail->update([
             'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
             'logistic_handle_tag' =>0,
         ]);
 
         $detail->workOrder()->update([
             'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
             'owner_tag' => WorkOrder::$STRAND_TAG,
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
             'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
             'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
+        ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress.'-完结',
+            'status' => '未同步',
+            'type' => '完结',
         ]);
-        $this->syncOrderIssueProcessLogs($detail);
-        $this->logService->createLog($detail, '终审', $params['process_progress'].'-宝时终审');
+        $this->endOrderIssueAndSyncProcessLogs($detail);
+        $this->logService->createLog($detail, '终审', $process_progress.'-宝时终审');
     }
 
 }

+ 69 - 19
app/Services/WorkOrderExpressAbnormalService.php

@@ -9,6 +9,7 @@ namespace App\Services;
 use App\Order;
 use App\WorkOrder;
 use App\WorkOrderDetail;
+use Illuminate\Support\Facades\Auth;
 
 class WorkOrderExpressAbnormalService extends WorkOrderService
 {
@@ -19,10 +20,20 @@ class WorkOrderExpressAbnormalService extends WorkOrderService
         WorkOrderCommoditiesService $commoditiesService,
         WorkOrderDetailService $detailService,
         OrderIssueTypeService $issueTypeService,
-        OrderService $orderService
+        OrderService $orderService,
+        OrderIssueService $orderIssueService,
+        OrderIssueProcessLogService $orderIssueProcessLogService
     )
     {
-        parent::__construct($logService,$imageService,$commoditiesService,$detailService,$issueTypeService,$orderService);
+        parent::__construct(
+            $logService,
+            $imageService,
+            $commoditiesService,
+            $detailService,
+            $issueTypeService,
+            $orderService,
+            $orderIssueService,
+            $orderIssueProcessLogService);
     }
 
     public function checkWorkOrder($nos)
@@ -51,21 +62,31 @@ class WorkOrderExpressAbnormalService extends WorkOrderService
     {
         $order = $this->syncOrder($params['order_no']);
         $issueType = $this->issueTypeService->firstOrCreate(['name' => '快递异常']);
-        $workOrder = $this->createOrResetWorkOrder($order, $issueType, $params['remark'] ?? '', $params['type']);
-        $workOrder->update([
+        $work_order = $this->createOrResetWorkOrder($order, $issueType, $params['remark'] ?? '', $params['type']);
+        $process_progress = '商家创建';
+        $work_order->update([
             'status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
-            'process_progress' => '商家创建',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
             'logistic_tag' => WorkOrder::$NEW_TAG,
             'owner_tag' => WorkOrder::$DEFAULT_TAG,
             'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
+            'last_handler_id' => Auth::id(),
         ]);
-        $detail = $this->detailService->createWorkOrderDetail($workOrder, $params);
+        $detail = $this->detailService->createWorkOrderDetail($work_order, $params);
         $detail->update([
             'status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
-            'process_progress' => '商家创建',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
-            'logistic_handle_tag' =>0,
+            'logistic_handle_tag' => 0,
+        ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress.'-快递异常',
+            'status' => '未同步',
+            'type' => '创建',
         ]);
         $this->logService->createLog($detail, '创建', '创建工单');
     }
@@ -78,17 +99,26 @@ class WorkOrderExpressAbnormalService extends WorkOrderService
     public function ownerEdit(WorkOrderDetail $detail, $params)
     {
         $this->detailService->updateDetail($detail, $params);
-
+        $process_progress = '商家创建';
         $detail->update([
             'status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
-            'process_progress' => '商家创建',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
         ]);
 
         $detail->workOrder()->update([
             'status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
-            'process_progress' => '商家创建',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
+            'last_handler_id' => Auth::id(),
+        ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => '商家重编辑',
+            'status' => '未同步',
+            'type' => '处理',
         ]);
         $this->logService->createLog($detail, '处理', '商家编辑');
     }
@@ -101,22 +131,31 @@ class WorkOrderExpressAbnormalService extends WorkOrderService
     public function logisticHandle(WorkOrderDetail $detail, $params)
     {
         $this->detailService->updateDetail($detail, $params);
+        $process_progress= $params['process_progress'];
         $detail->update([
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
         ]);
 
         $detail->workOrder()->update([
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
             'bao_shi_tag' => WorkOrder::$STRAND_TAG,
             'owner_tag' => WorkOrder::$DEFAULT_TAG,
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
+            'last_handler_id' => Auth::id(),
         ]);
-
-        $this->logService->createLog($detail, '处理', $params['process_progress'] . '-承运商处理');
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress,
+            'status' => '未同步',
+            'type' => '处理',
+        ]);
+        $this->logService->createLog($detail, '处理', $process_progress . '-承运商处理');
     }
 
     /**
@@ -127,21 +166,32 @@ class WorkOrderExpressAbnormalService extends WorkOrderService
     public function baoShiReview(WorkOrderDetail $detail, $params)
     {
         $this->detailService->updateDetail($detail, $params);
+        $process_progress= $params['process_progress'];
+
         $detail->update([
             'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
         ]);
         $detail->workOrder()->update([
             'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
             'owner_tag' => WorkOrder::$STRAND_TAG,
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
             'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
+            'last_handler_id' => Auth::id(),
+        ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress.'-完结',
+            'status' => '未同步',
+            'type' => '结束',
         ]);
-        $this->syncOrderIssueProcessLogs($detail);
-        $this->logService->createLog($detail, '终审', $params['process_progress'] . '-宝时终审');
+        $this->endOrderIssueAndSyncProcessLogs($detail);
+        $this->logService->createLog($detail, '终审', $process_progress . '-宝时终审');
     }
 
 }

+ 59 - 16
app/Services/WorkOrderInformationChangeService.php

@@ -5,6 +5,7 @@ namespace App\Services;
 use App\Order;
 use App\WorkOrder;
 use App\WorkOrderDetail;
+use Illuminate\Support\Facades\Auth;
 
 /**
  * 处理  信息修改 工单
@@ -19,11 +20,15 @@ class WorkOrderInformationChangeService extends WorkOrderService
         WorkOrderCommoditiesService $commoditiesService,
         WorkOrderDetailService $detailService,
         OrderIssueTypeService $issueTypeService,
-        OrderService $orderService
+        OrderService $orderService,
+        OrderIssueService $orderIssueService,
+        OrderIssueProcessLogService $orderIssueProcessLogService
     )
     {
-        parent::__construct($logService, $imageService, $commoditiesService, $detailService, $issueTypeService, $orderService);
-
+        parent::__construct($logService, $imageService,
+            $commoditiesService, $detailService,
+            $issueTypeService, $orderService, $orderIssueService,
+            $orderIssueProcessLogService);
     }
 
     public function checkWorkOrder($nos)
@@ -51,26 +56,38 @@ class WorkOrderInformationChangeService extends WorkOrderService
     public function store($params)
     {
         $issueType = $this->issueTypeService->firstOrCreate(['name' => '信息更改']);
+
         $order = $this->syncOrder($params['order_no']);
 
         $workOrder = $this->createAndNotification($order, $issueType, $params['remark'] ?? '');
-
+        $process_progress = '商家创建';
         $workOrder->update([
             'status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
-            'process_progress' => '商家创建',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
             'logistic_tag' => WorkOrder::$NEW_TAG,
             'owner_tag' => WorkOrder::$DEFAULT_TAG,
             'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
+            'last_handler_id' => Auth::id(),
         ]);
 
         $detail = $this->detailService->createWorkOrderDetail($workOrder, $params);
 
         $detail->update([
             'status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
-            'process_progress' => '商家创建',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
         ]);
+
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress.'-信息更改',
+            'status' => '未同步',
+            'type' => '创建',
+        ]);
+
         $this->logService->createLog($detail, '创建', '创建工单');
     }
 
@@ -81,9 +98,17 @@ class WorkOrderInformationChangeService extends WorkOrderService
      */
     public function ownerEdit(WorkOrderDetail $detail, $params)
     {
-        $this->logService->createLog($detail, '处理', '商家编辑');
         $detail->update(['remark' => $params['remark']]);
         $detail->workOrder()->update(['remark' => $params['remark']]);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => '商家重编辑',
+            'status' => '未同步',
+            'type' => '处理',
+        ]);
+        $this->logService->createLog($detail, '处理', '商家编辑');
     }
 
     /**
@@ -93,23 +118,32 @@ class WorkOrderInformationChangeService extends WorkOrderService
      */
     public function logisticHandler(WorkOrderDetail $detail, $params)
     {
-
+        $process_progress = $params['process_progress'];
         $detail->update([
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
         ]);
 
         $detail->workOrder()->update([
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
             'bao_shi_tag' => WorkOrder::$STRAND_TAG,
             'owner_tag' => WorkOrder::$DEFAULT_TAG,
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
             'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
         ]);
-        $this->logService->createLog($detail, '处理', '承运商处理-' . $params['process_progress']);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress,
+            'status' => '未同步',
+            'type' => '处理',
+        ]);
+        $this->logService->createLog($detail, '处理', '承运商处理-'.$process_progress);
     }
 
     /**
@@ -131,23 +165,32 @@ class WorkOrderInformationChangeService extends WorkOrderService
      */
     public function baoShiReview(WorkOrderDetail $detail, $params)
     {
+        $process_progress = $params['process_progress'];
         $detail->update([
             'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
         ]);
         $detail->workOrder()->update([
             'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
             'owner_tag' => WorkOrder::$STRAND_TAG,
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
             'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
             'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
         ]);
-
-        $this->syncOrderIssueProcessLogs($detail);
-        $this->logService->createLog($detail, '终审', '宝时终审-' . $params['process_progress']);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress.'-完结',
+            'status' => '未同步',
+            'type' => '结束',
+        ]);
+        $this->endOrderIssueAndSyncProcessLogs($detail);
+        $this->logService->createLog($detail, '终审', '宝时终审-' . $process_progress);
     }
 
     /**

+ 71 - 26
app/Services/WorkOrderInterceptService.php

@@ -3,8 +3,10 @@
 namespace App\Services;
 
 use App\Order;
+use App\OrderIssueProcessLog;
 use App\WorkOrder;
 use App\WorkOrderDetail;
+use Illuminate\Support\Facades\Auth;
 
 /**
  * 处理 拦截 工单
@@ -13,23 +15,25 @@ use App\WorkOrderDetail;
  */
 class WorkOrderInterceptService extends WorkOrderService
 {
-
     public function __construct(
         WorkOrderLogService $logService,
         WorkOrderImageService $imageService,
         WorkOrderCommoditiesService $commoditiesService,
         WorkOrderDetailService $detailService,
         OrderIssueTypeService $issueTypeService,
-        OrderService $orderService
+        OrderService $orderService,
+        OrderIssueService $orderIssueService,
+        OrderIssueProcessLogService $orderIssueProcessLogService
     )
     {
-        parent::__construct( $logService,
-             $imageService,
-             $commoditiesService,
-             $detailService,
-             $issueTypeService,
-             $orderService);
-
+        parent::__construct($logService,
+            $imageService,
+            $commoditiesService,
+            $detailService,
+            $issueTypeService,
+            $orderService,
+            $orderIssueService,
+            $orderIssueProcessLogService);
     }
 
     public function checkWorkOrder($nos)
@@ -69,11 +73,12 @@ class WorkOrderInterceptService extends WorkOrderService
     {
         $issueType = $this->issueTypeService->firstOrCreate(['name' => '拦截']);
         $order = $this->syncOrder($params['order_no']);
-        $workOrder = $this->createAndNotification($order, $issueType, $params['remark'] ?? '拦截工单');
-        $detail = $this->detailService->createWorkOrderDetail($workOrder, $params);
-        $workOrder->update([
+        $work_order = $this->createAndNotification($order, $issueType, $params['remark'] ?? '拦截工单');
+        $detail = $this->detailService->createWorkOrderDetail($work_order, $params);
+        $process_progress = '商家创建';
+        $work_order->update([
             'status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
-            'process_progress' => '商家创建',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
             'logistic_tag' => WorkOrder::$NEW_TAG,
             'owner_tag' => WorkOrder::$DEFAULT_TAG,
@@ -84,8 +89,16 @@ class WorkOrderInterceptService extends WorkOrderService
         $detail->update([
             'status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
-            'process_progress' => '商家创建',
-            'logistic_handle_tag' =>0,
+            'process_progress' => $process_progress,
+            'logistic_handle_tag' => 0,
+        ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $work_order->id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => $work_order->creator_id,
+            'content' => $process_progress.'-拦截',
+            'status' => '未同步',
+            'type' => '创建',
         ]);
         $this->logService->createLog($detail, '创建', '创建');
     }
@@ -109,22 +122,32 @@ class WorkOrderInterceptService extends WorkOrderService
     public function logisticHandler(WorkOrderDetail $detail, $params)
     {
         $detail->cancelLogisticTagHandle();         // 取消承运商处理标记
+        $process_progress = $params['process_progress'];
         $detail->update([
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
-            'logistic_handle_tag' =>0,
+            'logistic_handle_tag' => 0,
         ]);
         $detail->workOrder()->update([
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
             'owner_tag' => WorkOrder::$DEFAULT_TAG,
             'bao_shi_tag' => WorkOrder::$STRAND_TAG,
             'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
         ]);
-        $this->logService->createLog($detail, '处理', '承运商处理-' . $params['process_progress']);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress,
+            'status' => '未同步',
+            'type' => '处理',
+        ]);
+        $this->logService->createLog($detail, '处理', '承运商处理-' . $process_progress);
     }
 
     /**
@@ -146,23 +169,35 @@ class WorkOrderInterceptService extends WorkOrderService
      */
     public function baoShiReviewIntercept(WorkOrderDetail $detail, $params)
     {
+        $process_progress = $params['process_progress'];
         $detail->update([
             'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'logistic_handle_tag' =>0,
+            'logistic_handle_tag' => 0,
         ]);
         $detail->workOrder()->update([
             'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
             'owner_tag' => WorkOrder::$STRAND_TAG,
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
             'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
             'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
         ]);
-        $this->syncOrderIssueProcessLogs($detail);
-        $this->logService->createLog($detail, '终审', '宝时终审-' . $params['process_progress']);
+
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress.'-拦截工单',
+            'status' => '未同步',
+            'type' => '结束',
+        ]);
+
+        $this->endOrderIssueAndSyncProcessLogs($detail);
+        $this->logService->createLog($detail, '终审', '宝时终审-' . $process_progress);
     }
 
     /**
@@ -193,7 +228,7 @@ class WorkOrderInterceptService extends WorkOrderService
             'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
             'process_progress' => $process_progress,
             'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'logistic_handle_tag' =>0,
+            'logistic_handle_tag' => 0,
         ]);
         $detail->workOrder()->update([
             'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
@@ -203,8 +238,18 @@ class WorkOrderInterceptService extends WorkOrderService
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
             'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
             'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
+        ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => $workOrder->creator_id,
+            'content' => $process_progress.'-完结',
+            'status' => '未同步',
+            'type' => '结束',
         ]);
-        $this->logService->createLog($detail, '终审', '自动终审' . $process_progress);
+        $this->endOrderIssueAndSyncProcessLogs($detail);
+        $this->logService->createLog($detail, '终审', '自动终审-' . $process_progress);
     }
 
 }

+ 54 - 12
app/Services/WorkOrderLossService.php

@@ -6,6 +6,7 @@ namespace App\Services;
 use App\Order;
 use App\WorkOrder;
 use App\WorkOrderDetail;
+use Illuminate\Support\Facades\Auth;
 
 /**
  * 处理 快递丢件 工单
@@ -20,10 +21,12 @@ class WorkOrderLossService extends WorkOrderService
         WorkOrderCommoditiesService $commoditiesService,
         WorkOrderDetailService $detailService,
         OrderIssueTypeService $issueTypeService,
-        OrderService $orderService
+        OrderService $orderService,
+        OrderIssueService $orderIssueService,
+        OrderIssueProcessLogService $orderIssueProcessLogService
     )
     {
-        parent::__construct($logService,$imageService,$commoditiesService,$detailService,$issueTypeService,$orderService);
+        parent::__construct($logService,$imageService,$commoditiesService,$detailService,$issueTypeService,$orderService,$orderIssueService,$orderIssueProcessLogService);
     }
 
     public function checkWorkOrder($nos)
@@ -48,24 +51,42 @@ class WorkOrderLossService extends WorkOrderService
     public function store($params)
     {
         $orderIssueType = $this->issueTypeService->firstOrCreate(['name' => '快递丢件']);
+
         $order = $this->syncOrder($params['order_no']);
-        $workOrder = $this->createAndNotification($order, $orderIssueType, $params['remark'] ?? '','宝时创建');
-        $workOrder->update([
+
+        $work_order = $this->createAndNotification($order, $orderIssueType, $params['remark'] ?? '','宝时创建');
+
+        $process_progress = '宝时创建';
+
+        $work_order->update([
             'status'=> WorkOrder::$OWNER_HANDLER_STATUS,
-            'process_progress' => '宝时创建',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
             'owner_tag' => WorkOrder::$NEW_TAG,
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
             'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
+            'last_handler_id' => Auth::id(),
         ]);
-        $detail = $this->detailService->createWorkOrderDetail($workOrder, $params);
+
+        $detail = $this->detailService->createWorkOrderDetail($work_order, $params);
+
         $detail->update([
             'status'=> WorkOrder::$OWNER_HANDLER_STATUS,
-            'process_progress' => '宝时创建',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
             'work_order_status' => 0,
             'logistic_handle_tag' =>0,
         ]);
+
+        $detail->processLogs()->create([
+            'work_order_id' => $work_order->id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => $work_order->creator_id,
+            'content' => $process_progress.'-快递丢件',
+            'status' => '未同步',
+            'type' => '创建',
+        ]);
+
         $this->logService->createLog($detail, '创建', '创建工单');
     }
 
@@ -77,22 +98,33 @@ class WorkOrderLossService extends WorkOrderService
     public function ownerFillDetail(WorkOrderDetail $detail,$params)
     {
         $this->detailService->fillLossDetail($detail, $params);
+        $process_progress = '待终审';
         $detail->update([
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'process_progress' => '待终审',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$OWNER_HANDLER_STATUS,
             'logistic_handle_tag' =>0,
         ]);
         $detail->workOrder()->update([
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'process_progress' => '待终审',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$OWNER_HANDLER_STATUS,
             'bao_shi_tag' => WorkOrder::$STRAND_TAG,
             'owner_tag' => WorkOrder::$DEFAULT_TAG,
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
             'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
+
+        ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress.'-填充丢件信息',
+            'status' => '未同步',
+            'type' => '处理',
         ]);
-        $this->logService->createLog($detail, '处理', '待终审'.'-填充丢件信息');
+        $this->logService->createLog($detail, '处理', $process_progress.'-填充丢件信息');
     }
 
     /**
@@ -118,8 +150,18 @@ class WorkOrderLossService extends WorkOrderService
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
             'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
             'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
+
+        ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress.'-完结',
+            'status' => '未同步',
+            'type' => '结束',
         ]);
-        $this->syncOrderIssueProcessLogs($detail);
-        $this->logService->createLog($detail, '终审', '终审完成'.'-宝时终审');
+        $this->endOrderIssueAndSyncProcessLogs($detail);
+        $this->logService->createLog($detail, '终审', $process_progress.'-宝时终审');
     }
 }

+ 87 - 22
app/Services/WorkOrderMistakeService.php

@@ -5,6 +5,7 @@ namespace App\Services;
 use App\Order;
 use App\WorkOrder;
 use App\WorkOrderDetail;
+use Illuminate\Support\Facades\Auth;
 
 /**
  * 处理 错漏发 工单
@@ -19,10 +20,14 @@ class WorkOrderMistakeService extends WorkOrderService
         WorkOrderCommoditiesService $commoditiesService,
         WorkOrderDetailService $detailService,
         OrderIssueTypeService $issueTypeService,
-        OrderService $orderService
+        OrderService $orderService,
+        OrderIssueService $orderIssueService,
+        OrderIssueProcessLogService $orderIssueProcessLogService
     )
     {
-        parent::__construct($logService,$imageService,$commoditiesService,$detailService,$issueTypeService,$orderService);
+        parent::__construct($logService,$imageService,$commoditiesService,
+            $detailService,$issueTypeService,$orderService,
+            $orderIssueService,$orderIssueProcessLogService);
     }
 
     public function checkWorkOrder($nos)
@@ -47,22 +52,32 @@ class WorkOrderMistakeService extends WorkOrderService
     {
         $issueType = $this->issueTypeService->firstOrCreate(['name' => '错漏发']);
         $order = $this->syncOrder($params['order_no']);
-        $workOrder = $this->createAndNotification($order, $issueType, $params['remark'] ?? '', '商家已创建');
-        $detail = $this->detailService->createWorkOrderDetail($workOrder, $params);
-        $workOrder->update([
+        $work_order = $this->createAndNotification($order, $issueType, $params['remark'] ?? '', '商家已创建');
+        $detail = $this->detailService->createWorkOrderDetail($work_order, $params);
+        $process_progress = '商家创建';
+        $work_order->update([
             'status'=> WorkOrder::$BAO_SHI_HANDLER_STATUS,
-            'process_progress' => '商家创建',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
             'bao_shi_tag' => WorkOrder::$NEW_TAG,
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
             'owner_tag' => WorkOrder::$DEFAULT_TAG,
             'logistic_handle_tag' =>0,
+            'last_handler_id' => Auth::id(),
         ]);
         $detail->update([
             'status'=> WorkOrder::$BAO_SHI_HANDLER_STATUS,
-            'process_progress' => '商家创建',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
         ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $work_order->id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => $work_order->creator_id,
+            'content' => $process_progress.'-错漏发',
+            'status' => '未同步',
+            'type' => '创建',
+        ]);
         $this->logService->createLog($detail, '创建', '商家创建');
     }
 
@@ -74,17 +89,28 @@ class WorkOrderMistakeService extends WorkOrderService
     public function ownerEdit(WorkOrderDetail $detail, $params)
     {
         $this->detailService->updateDetail($detail, $params);
+        $process_progress = $params['process_progress'];
         $detail->update([
             'status' => WorkOrder::$BAO_SHI_HANDLER_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
             'logistic_handle_tag' =>0,
         ]);
         $detail->workOrder()->update([
             'status' => WorkOrder::$BAO_SHI_HANDLER_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
             'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
+
+        ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress,
+            'status' => '未同步',
+            'type' => '处理',
         ]);
         $this->logService->createLog($detail, '处理', '商家修改');
     }
@@ -97,20 +123,31 @@ class WorkOrderMistakeService extends WorkOrderService
     public function baoShiCheckMistake(WorkOrderDetail $detail, $params)
     {
         $this->detailService->updateDetail($detail, $params);
+        $process_progress = '已核实';
         $detail->update([
             'status' => WorkOrder::$OWNER_HANDLER_STATUS,
-            'process_progress' => '已核实',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$BAO_SHI_HANDLER_STATUS,
             'logistic_handle_tag' =>0,
         ]);
         $detail->workOrder()->update([
             'status' => WorkOrder::$OWNER_HANDLER_STATUS,
-            'process_progress' => '已核实',
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$BAO_SHI_HANDLER_STATUS,
             'owner_tag' => WorkOrder::$STRAND_TAG,
             'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
             'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
+
+        ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress,
+            'status' => '未同步',
+            'type' => '处理',
         ]);
         $this->logService->createLog($detail, '处理', '已核实'.'-宝时处理');
     }
@@ -123,24 +160,31 @@ class WorkOrderMistakeService extends WorkOrderService
     public function ownerReview(WorkOrderDetail $detail, $params)
     {
         $this->detailService->updateDetail($detail, $params);
-
+        $process_progress = $params['process_progress'];
         $detail->update([
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$OWNER_HANDLER_STATUS,
             'logistic_handle_tag' =>0,
         ]);
-
         $detail->workOrder()->update([
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$OWNER_HANDLER_STATUS,
             'bao_shi_tag' => WorkOrder::$STRAND_TAG,
             'owner_tag' => WorkOrder::$DEFAULT_TAG,
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
             'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
+        ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress,
+            'status' => '未同步',
+            'type' => '处理',
         ]);
-
         $this->logService->createLog($detail, '处理', $params['process_progress'].'-货主处理');
     }
 
@@ -152,18 +196,27 @@ class WorkOrderMistakeService extends WorkOrderService
     public function ownerEditReview(WorkOrderDetail $detail, $params)
     {
         $this->detailService->updateDetail($detail, $params);
-
+        $process_progress = $params['process_progress'];
         $detail->update([
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$OWNER_HANDLER_STATUS,
             'logistic_handle_tag' =>0,
         ]);
         $detail->workOrder()->update([
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$OWNER_HANDLER_STATUS,
             'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
+        ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress,
+            'status' => '未同步',
+            'type' => '处理',
         ]);
         $this->logService->createLog($detail, '处理', $params['process_progress'].'-货主编辑');
     }
@@ -176,22 +229,34 @@ class WorkOrderMistakeService extends WorkOrderService
     public function baoShiReview($detail, $params)
     {
         $this->detailService->updateDetail($detail, $params);
+        $process_progress = $params['process_progress'];
         $detail->update([
             'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
             'logistic_handle_tag' =>0,
         ]);
+
         $detail->workOrder()->update([
             'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
-            'process_progress' => $params['process_progress'],
+            'process_progress' => $process_progress,
             'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
             'owner_tag' => WorkOrder::$STRAND_TAG,
             'logistic_tag' => WorkOrder::$DEFAULT_TAG,
             'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
             'work_order_status' => 0,
         ]);
-        $this->syncOrderIssueProcessLogs($detail);
+
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $process_progress.'-完结',
+            'status' => '未同步',
+            'type' => '结束',
+        ]);
+
+        $this->endOrderIssueAndSyncProcessLogs($detail);
         $this->logService->createLog($detail, '终审', $params['process_progress'].'-宝时终审');
     }
 

+ 4 - 1
app/Services/WorkOrderProcessLogService.php

@@ -62,8 +62,11 @@ class WorkOrderProcessLogService
     {
         $user = Auth::user();
         $process_logs = [];
+        /** @var WorkOrder $workOrder */
         foreach ($workOrders as $workOrder) {
-            $detail = $workOrders->toBeProcessDetail();
+            /** @var WorkOrderDetail $detail */
+            $detail = $workOrder->details()->where('order_issue_type_id',$workOrder->order_issue_type_id)->orderByDesc('created_at')->first();
+            if (!$detail) continue;
             $process_logs[] = $this->createProcessLog($detail, $params, $user);
         }
         return $process_logs;

+ 22 - 7
app/Services/WorkOrderService.php

@@ -2,6 +2,7 @@
 
 namespace App\Services;
 
+use App\Jobs\SyncRejectedBillRejectingStatusJob;
 use App\OrderIssue;
 use App\OrderIssueProcessLog;
 use App\OrderIssueRejectedBill;
@@ -24,6 +25,8 @@ class WorkOrderService
     public $detailService;
     public $issueTypeService;
     public $orderService;
+    public $orderIssueService;
+    public $orderIssueProcessLogService;
 
     public function __construct(
         WorkOrderLogService $logService,
@@ -31,7 +34,9 @@ class WorkOrderService
         WorkOrderCommoditiesService $commoditiesService,
         WorkOrderDetailService $detailService,
         OrderIssueTypeService $issueTypeService,
-        OrderService $orderService
+        OrderService $orderService,
+        OrderIssueService $orderIssueService,
+        OrderIssueProcessLogService $orderIssueProcessLogService
     )
     {
         $this->logService = $logService;
@@ -40,6 +45,8 @@ class WorkOrderService
         $this->detailService = $detailService;
         $this->issueTypeService = $issueTypeService;
         $this->orderService = $orderService;
+        $this->orderIssueService = $orderIssueService;
+        $this->orderIssueProcessLogService = $orderIssueProcessLogService;
     }
 
     public function createOrResetWorkOrder($order, $issueType, $remark, $process_progress = '商家创建')
@@ -80,6 +87,7 @@ class WorkOrderService
         /** @var WorkOrder $workOrder */
         $workOrder = $this->createOrResetWorkOrder($order, $orderIssueType, $remark, $process_progress);
         $workOrder->notification();
+        SyncRejectedBillRejectingStatusJob::dispatch($workOrder->order);
         return $workOrder;
     }
 
@@ -199,11 +207,10 @@ class WorkOrderService
             return $item->order_id;
         });
         $order_issues = OrderIssue::query()->whereIn('order_id', $order_ids)->get();
-
+        $codes = [];
         foreach ($order_issues as $order_issue) {
             $codes[$order_issue->order_id] = true;
         }
-        if (!isset($codes)) return;
         foreach ($workOrders as &$workOrder) {
             if (array_key_exists($workOrder->order_id, $codes)) $workOrder->is_issue_order = true;
             else  $workOrder->is_issue_order = false;
@@ -284,7 +291,7 @@ class WorkOrderService
             'status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
             'process_progress' => '承运商处理中',
             'last_status' => $last_status,
-            'logistic_handle_tag' =>1,
+            'logistic_handle_tag' => 1,
         ]);
         $detail->workOrder()->update([
             'status' => WorkOrder::$LOGISTIC_HANDLER_STATUS,
@@ -295,6 +302,14 @@ class WorkOrderService
             'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
             'work_order_status' => WorkOrder::$DEFAULT_TAG,
         ]);
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => '承运商标记在处理',
+            'status' => '未同步',
+            'type' => '处理',
+        ]);
         app(WorkOrderLogService::class)->createLog($detail, '处理', '标记处理中');
     }
 
@@ -341,7 +356,7 @@ class WorkOrderService
      * 同步处理日志到问题件
      * @param WorkOrderDetail $detail
      */
-    public function syncOrderIssueProcessLogs(WorkOrderDetail $detail)
+    public function endOrderIssueAndSyncProcessLogs(WorkOrderDetail $detail)
     {
         /**
          * @var OrderIssue $order_issue
@@ -356,8 +371,6 @@ class WorkOrderService
                 'imported_status' => '正常',
                 'order_issue_type_id' => $detail->order_issue_type_id,
             ]);
-            OrderIssueProcessLog::query()
-                ->create(['order_issue_id' => $order_issue->id, 'content' => '创建', 'user_id' => Auth::id(), 'type' => '创建','created_at' => $detail->workOrder->created_at]);
         }
         $process_logs = $detail->processLogs()->where('status', '未同步')->get();
         $order_issue->logs()->insert($process_logs->map((function ($process_log) use ($order_issue) {
@@ -367,8 +380,10 @@ class WorkOrderService
                 'content' => $process_log->content,
                 'created_at' => $process_log->created_at,
                 'updated_at' => $process_log->updated_at,
+                'type' => $process_log->type,
             ];
         }))->toArray());
+        $this->orderIssueService->endOrderIssues([$order_issue->id]);
         $detail->processLogs()->where('status', '未同步')->update(['status' => '同步']);
     }
 

+ 4 - 0
app/User.php

@@ -20,6 +20,10 @@ class User extends Authenticatable
     use Notifiable;
     use SoftDeletes;
 
+    /**
+     * 安卓单点登录记录标识
+     */
+    const ANDROID_SINGLE_TAG = "ANDROID_SINGLE";
     /**
      * The attributes that are mass assignable.
      *

+ 1 - 2
app/Utils/helpers.php

@@ -111,7 +111,7 @@ function getMacAddr($type = PHP_OS):string
     return $mac_addr;
 }
 
-//2021-09-03 oracle 链接
+//2021-09-03 oracle 链接+
 function getOciConnect()
 {
     $username = config('database.connections.oracle.username');
@@ -121,4 +121,3 @@ function getOciConnect()
     $charset = config('database.connections.oracle.charset');
     return oci_connect($username,$password,$host.'/'.$service_name,$charset);
 }
-

+ 15 - 2
app/WorkOrder.php

@@ -47,6 +47,7 @@ class WorkOrder extends Model
         'owner_tag',                // 待货主处理标记    0 为默认状态 1无 2 滞 3新
         "is_new_rejecting",         // 回库标记
         'created_at',
+        'rejecting_status',         // 退回状态
     ];
     /**
      * @var int 默认
@@ -228,11 +229,21 @@ class WorkOrder extends Model
         return $this->hasMany(WorkOrderDetail::class);
     }
 
+    public function orderDetail(): BelongsTo
+    {
+        return $this->belongsTo(OrderDetail::class,'order_id','order_id');
+    }
+
     public function scopeFilter($query, $filters)
     {
         return $filters->apply($query);
     }
 
+    public function orderIssueRejectedBills(): HasMany
+    {
+        return $this->hasMany(OrderIssueRejectedBill::class,'order_id','order_id');
+    }
+
     /** 默认 with 参数 */
     public function scopeDefaultWith($query)
     {
@@ -241,7 +252,7 @@ class WorkOrder extends Model
 
     public function defaultWith(): array
     {
-        return ['owner', 'logistic', 'issueType', 'creator', 'lastHandler', 'details' => function ($query) {
+        return ['owner', 'logistic', 'issueType', 'creator', 'lastHandler','orderDetail','orderIssueRejectedBills', 'details' => function ($query) {
             return $query->with(['commodities.commodity', 'logs' => function ($query) {
                 return $query->with('creator')->orderByDesc('created_at');
             }, 'images.uploadFile', 'issueType', 'processLogs' => function ($query) {
@@ -249,7 +260,9 @@ class WorkOrder extends Model
             }]);
         },
             'reviewer',
-            'order.packages',
+            'order'=> function($query){
+                return $query->with('packages.commodities.commodity','shop');
+            },
             'orderIssue' => function ($query) {
                 /** @var Builder $query */
                 $query->with(['issueType', 'logs' => function ($query) {

+ 1 - 0
app/WorkOrderProcessLog.php

@@ -19,6 +19,7 @@ class WorkOrderProcessLog extends Model
         'user_id',
         'content',
         'status',
+        'type', // 创建 处理 完结
     ];
 
 

+ 1 - 0
composer.json

@@ -35,6 +35,7 @@
         "predis/predis": "^1.1",
         "pusher/pusher-php-server": "^4.1",
         "te7a-houdini/laravel-trix": "^2.0",
+        "workerman/workerman": "^4.0",
         "yajra/laravel-oci8": "7.0"
     },
     "require-dev": {

+ 70 - 1
composer.lock

@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "a8a45b0f4001cb3c8e61821f0cc50383",
+    "content-hash": "ce83f90582d55cf364dba2352b7cb12d",
     "packages": [
         {
             "name": "awobaz/compoships",
@@ -7904,6 +7904,75 @@
             ],
             "time": "2020-11-12T00:07:28+00:00"
         },
+        {
+            "name": "workerman/workerman",
+            "version": "v4.0.26",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/walkor/workerman.git",
+                "reference": "27573e9f985f9ec0665b1f9924308d359bd0fdaa"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/walkor/workerman/zipball/27573e9f985f9ec0665b1f9924308d359bd0fdaa",
+                "reference": "27573e9f985f9ec0665b1f9924308d359bd0fdaa",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3"
+            },
+            "suggest": {
+                "ext-event": "For better performance. "
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Workerman\\": "./"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "walkor",
+                    "email": "walkor@workerman.net",
+                    "homepage": "http://www.workerman.net",
+                    "role": "Developer"
+                }
+            ],
+            "description": "An asynchronous event driven PHP framework for easily building fast, scalable network applications.",
+            "homepage": "http://www.workerman.net",
+            "keywords": [
+                "asynchronous",
+                "event-loop"
+            ],
+            "support": {
+                "email": "walkor@workerman.net",
+                "forum": "http://wenda.workerman.net/",
+                "issues": "https://github.com/walkor/workerman/issues",
+                "source": "https://github.com/walkor/workerman",
+                "wiki": "http://doc.workerman.net/"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/walkor",
+                    "type": "open_collective"
+                },
+                {
+                    "url": "https://www.patreon.com/walkor",
+                    "type": "patreon"
+                }
+            ],
+            "time": "2021-12-21T03:39:14+00:00"
+        },
         {
             "name": "yajra/laravel-oci8",
             "version": "v7.0.0",

+ 4 - 4
config/database.php

@@ -89,9 +89,9 @@ return [
             'url' => env('DATABASE_URL'),
             'host' => 'rm-uf6f5v208b07hp198bo.mysql.rds.aliyuncs.com',
             'port' => '3306',
-            'database' => env('DB_DATABASE', 'forge'),
-            'username' => env('DB_USERNAME', 'forge'),
-            'password' => 'wasBaoshi56!',
+            'database' => 'swms',
+            'username' => 'swms',
+            'password' => 'baoshiSWMS123!',
             'unix_socket' => env('DB_SOCKET', ''),
             'charset' => 'utf8mb4',
             'collation' => 'utf8mb4_unicode_ci',
@@ -100,7 +100,7 @@ return [
             'strict' => false,
             'engine' => null,
             'options' => extension_loaded('pdo_mysql') ? array_filter([
-                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
+                \PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
             ]) : [],
         ],
 

+ 0 - 0
config/octane.php


+ 12 - 0
database/factories/OrderDetailFactory.php

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

+ 33 - 0
database/migrations/2022_01_13_152810_work_orders_add_column_rejecting_status.php

@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class WorkOrdersAddColumnRejectingStatus extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('work_orders', function (Blueprint $table) {
+            $table->enum('rejecting_status',['无', '未退回', '全部退回', '部分退回', '差异退回', '超量退回'])
+                ->default('无')->comment('退回件状态');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('work_orders', function (Blueprint $table) {
+            $table->dropColumn('rejecting_status');
+        });
+    }
+}

+ 32 - 0
database/migrations/2022_01_13_161829_orders_add_column_pay_at.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class OrdersAddColumnPayAt extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('orders', function (Blueprint $table) {
+            $table->timestamp('pay_at')->nullable()->comment('付款时间');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('orders', function (Blueprint $table) {
+            $table->dropColumn('pay_at');
+        });
+    }
+}

+ 32 - 0
database/migrations/2022_01_17_094642_work_order_process_logs_add_column_type.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class WorkOrderProcessLogsAddColumnType extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('work_order_process_logs', function (Blueprint $table) {
+            $table->enum('type',['创建', '结束', '处理'])->comment('类别');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('work_order_process_logs', function (Blueprint $table) {
+            $table->dropColumn('type');
+        });
+    }
+}

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

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

+ 16 - 0
database/seeds/OrderDetailSeeder.php

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

+ 165 - 0
resources/js/utilities/drawCheckbox.js

@@ -0,0 +1,165 @@
+$(function(){
+    let canvas = $("#bg_canvas");
+    if (canvas.length===0){
+        let canvas = $("<canvas id='bg_canvas' style='position: absolute;z-index: 500;left: 0;top: 0;width: 100%;height: 100%'></canvas>");
+        $("body").append(canvas);
+    }
+    var clientWidth = document.documentElement.clientWidth || document.body.clientWidth
+    var clientHeight = document.documentElement.clientHeight || document.body.clientHeight
+    // 更新canvas宽高
+    $("#bg_canvas").attr("width", clientWidth);
+    $("#bg_canvas").attr("height", clientHeight);
+    $("#bg_canvas").hide();
+});
+
+/**
+ * 默认画笔线宽
+ * @type {number}
+ */
+var defaultStrokeWidth = 1; //画矩形选取框的线宽
+
+var canvasExt = {
+    /**
+     *  画矩形
+     * @param canvasId canvasId
+     * @param penColor 画笔颜色
+     * @param strokeWidth 线宽
+     */
+    drawRect: function (canvasId, penColor, strokeWidth) {
+        var that = this;
+
+        that.penColor = penColor;
+        that.penWidth = strokeWidth;
+        var canvas = document.getElementById(canvasId);
+        //canvas 的矩形框
+        var canvasRect = canvas.getBoundingClientRect();
+        //canvas 矩形框的左上角坐标
+        var canvasLeft = canvasRect.left;
+        var canvasTop = canvasRect.top;
+
+        // 要画的矩形的起点 xy
+        var x = 0;
+        var y = 0;
+
+        //鼠标点击按下事件,画图准备
+        canvas.onmousedown = function(e) {
+
+            //设置画笔颜色和宽度
+            var color = that.penColor;
+            var penWidth = that.penWidth;
+            // 确定起点
+            x = e.clientX - canvasLeft;
+            y = e.clientY - canvasTop;
+            // 添加layer
+            $("#"+canvasId).addLayer({
+                type: 'rectangle',
+                strokeStyle: color,
+                strokeWidth: penWidth,
+                name:'areaLayer',
+                fromCenter: false,
+                x: x, y: y,
+                width: 1,
+                height: 1
+            });
+            // 绘制
+            $("#"+canvasId).drawLayers();
+            $("#"+canvasId).saveCanvas();
+
+            //鼠标移动事件,画图
+            canvas.onmousemove = function(e){
+
+                // 要画的矩形的宽高
+                var width = e.clientX-canvasLeft - x;
+                var height = e.clientY-canvasTop - y;
+
+                // 清除之前画的
+                $("#"+canvasId).removeLayer('areaLayer');
+
+                $("#"+canvasId).addLayer({
+                    type: 'rectangle',
+                    strokeStyle: color,
+                    strokeWidth: penWidth,
+                    name:'areaLayer',
+                    fromCenter: false,
+                    x: x, y: y,
+                    width: width,
+                    height: height
+                });
+
+                $("#"+canvasId).drawLayers();
+            }
+        };
+        //鼠标抬起
+        canvas.onmouseup=function(e){
+
+            var color = that.penColor;
+            var penWidth = that.penWidth;
+
+            canvas.onmousemove = null;
+
+            var width = e.clientX - canvasLeft - x;
+            var height = e.clientY- canvasTop - y;
+
+            $("#"+canvasId).removeLayer('areaLayer');
+
+            $("#"+canvasId).addLayer({
+                type: 'rectangle',
+                strokeStyle: color,
+                strokeWidth: penWidth,
+                name:'areaLayer',
+                fromCenter: false,
+                x: x, y: y,
+                width: width,
+                height: height
+            });
+
+            $("#"+canvasId).drawLayers();
+            $("#"+canvasId).saveCanvas();
+
+            // 把body转成canvas
+            html2canvas(document.body, {
+                scale: 1,
+                // allowTaint: true,
+                useCORS: true  //跨域使用
+            }).then(canvas => {
+                var capture_x, capture_y
+                if (width > 0) {
+                    //从左往右画
+                    capture_x = x + that.penWidth
+                }else {
+                    //从右往左画
+                    capture_x = x + width + that.penWidth
+                }
+                if (height > 0) {
+                    //从上往下画
+                    capture_y = y + that.penWidth
+                }else {
+                    //从下往上画
+                    capture_y = y + height + that.penWidth
+                }
+                clipInfo = {
+                    "x":capture_x,
+                    "y":capture_y,
+                    "w":Math.abs(width),
+                    "h":Math.abs(height),
+                };
+                afterExt();
+            });
+            // 移除画的选取框
+            $("#"+canvasId).removeLayer('areaLayer');
+            // 隐藏用于华画取框的canvas
+            $("#"+canvasId).hide()
+        }
+    }
+};
+
+var afterExt = function (){};
+var clipInfo = {};
+/**
+ * 选取截屏
+ * @param canvasId
+ */
+function clipScreenshots(){
+    $("#bg_canvas").show()
+    canvasExt.drawRect("bg_canvas", "red", defaultStrokeWidth);
+}

Разница между файлами не показана из-за своего большого размера
+ 19 - 0
resources/js/utilities/h2can.min.js


Разница между файлами не показана из-за своего большого размера
+ 5 - 0
resources/js/utilities/jcanvas.min.js


+ 64 - 17
resources/views/equipment/index.blade.php

@@ -57,6 +57,13 @@
         #loading{position:fixed;top:0;left:0;width:100%;height:100%;background:#f8f8f8;opacity:0.6;z-index:15000;}
         #loading i{position:absolute;top:50%;left:50%;font-size:33px;margin-top:-15px;margin-left:-40px;}
         #loading p{position:absolute;top:55%;left:48%;width:33px;height:33px;margin-top:-15px;margin-left:-15px;}
+
+        .equipment{
+            border-width:1px;
+            border-color: #0070C0;
+            border-style: dashed;
+            cursor: pointer
+        }
     </style>
 </head>
 <body>
@@ -221,8 +228,9 @@
                                      :x="element.x" :y="element.y" :z="element.index">
                         <div :class="coordsMapping[element.coords]">@{{ element.name }}</div>
                     </vue-drag-resize>
-                    <vue-drag-resize style="border-width:1px;border-color: #0070C0;border-style: dashed;cursor: pointer"
+                    <vue-drag-resize class="equipment"
                                      v-for="(element,index) in equipmentElements" @clicked="showDetail(element)"
+                                     :id="'eq-'+index"
                                      v-if="!element.removeSign"
                                      :is-resizable="false" :snap-to-grid="grid" :grid-x="40" :grid-y="30"
                                      :style="[{backgroundColor:element.color}]"
@@ -250,11 +258,15 @@
 </div>
 </body>
 <script src="{{ mix('js/app.js') }}"></script>
+<script src="{{ asset('js/utilities/drawCheckbox.js') }}"></script>
+<script src="{{ asset('js/utilities/h2can.min.js') }}"></script>
+<script src="{{ asset('js/utilities/jcanvas.min.js') }}"></script>
 <script src="{{ asset('js/utilities/toast.js') }}"></script>
 <script type="text/javascript">
     var vue = new Vue({
         el:"#container",
         data:{
+            increment:true,
             group:[],//库区列表
             ws:[],//仓库列表
             locationMapping:{},//库位的信息映射
@@ -283,11 +295,13 @@
             equipments:[                                                //备选设备池
                 {id:1,w:1.2,h:2.4,grid:2,layer:4,color:"RGB(252,228,214)",describe:"4层高位货架,可设八个标准托盘位"},
                 {id:2,w:1.2,h:2.4,grid:2,layer:5,color:"RGB(255,255,255)",describe:"5层高位货架,可设十个标准托盘位"},
-                {id:3,w:1.2,h:2.4,grid:1,layer:3,color:"RGB(169,208,142)",describe:"叉车通道,可设三个标准托盘位"},
-                {id:4,w:1.2,h:2.4,grid:2,layer:3,color:"RGB(221,235,247)",describe:"叉车通道,可设六个标准托盘位"},
+                {id:3,w:1.2,h:3.3,grid:3,layer:1,color:"RGB(169,208,142)",describe:"叉车通道,可设三个标准托盘位"},
+                {id:4,w:1.2,h:3.3,grid:3,layer:2,color:"RGB(221,235,247)",describe:"叉车通道,可设六个标准托盘位"},
                 {id:5,w:1.2,h:1.2,grid:1,layer:4,color:"RGB(255,255,0)",describe:"半组货架,可设四层高四个标准托盘位"},
-                {id:6,w:1.2,h:1.2,grid:2,layer:1,color:"RGB(189,215,238)",describe:"叉车通道,顶上两个托盘位"},
+                {id:6,w:1.2,h:2.4,grid:2,layer:1,color:"RGB(189,215,238)",describe:"叉车通道,顶上两个托盘位"},
                 {id:7,w:1.2,h:1.2,grid:1,layer:5,color:"RGB(255,255,5)",describe:"半组货架,可设五层高五个标准托盘位"},
+                {id:8,w:1.2,h:3.3,grid:3,layer:4,color:"RGB(146,208,80)",describe:"4层高位货架,可设十二个标准托盘位"},
+                {id:9,w:1.2,h:2.4,grid:2,layer:2,color:"RGB(228,243,211)",describe:"叉车通道,可设四个标准托盘位"},
             ],
             currentEq:{                                                 //选中的设备
                 el:null,
@@ -340,15 +354,17 @@
                 }
                 if(key===86  && e.ctrlKey){
                     let val = $('#clipboardDiv').val();
-                    if (!val)return;
+                    if (!val || JSON.stringify(val)==="{}")return;
                     let toolWid = document.getElementById("tool").offsetWidth;
-                    let obj = JSON.parse(val);
+                    let obj = Object.assign({},JSON.parse(val));
                     obj.x = this.client.x-toolWid+content.scrollLeft;
                     obj.y = this.client.y+content.scrollTop;
                     obj.children = [];
                     for (let i=0;i<obj.layer;i++)obj.children.push({});
                     if (this.currentEl.eqId){
                         obj.eqId = undefined;
+                        this.current = obj;
+                        this.currentEl = obj;
                         this.showAddModal(obj);
                     }else{
                         this.elements.push(obj);
@@ -357,6 +373,32 @@
             };
         },
         methods:{
+            //检索所有元素,获取在指定范围内的元素
+            searchingSelectEq(){
+                afterExt = function (){
+                    new Promise(function(resolve, reject) {
+                        let result = [];
+                        let els = $(".equipment");
+                        for (let i=0;i<els.length;i++){
+                            let client = els[i].getBoundingClientRect();
+                            if (client.x<0 || client.y<0){
+                                continue;
+                            }
+                            //四个角全部包含在此区域内 将元素下标加入结果数组
+                            if (client.x>=clipInfo.x && client.y>=clipInfo.y && client.x<=(clipInfo.x+clipInfo.w) && client.y<=(clipInfo.y+clipInfo.h)
+                                && (client.x+client.width)<=(clipInfo.x+clipInfo.w) && (client.y+client.height)<=(clipInfo.y+clipInfo.h)){
+                                result.push(els[i].id.split('-')[1]);
+                            }
+                        }
+                        resolve(result);
+                    }).then(indexArr=>{
+                        indexArr.forEach(index=>{
+                            console.log(vue.equipmentElements[index].code);
+                        });
+                    });
+                }
+                clipScreenshots();
+            },
             buildComponent(eq){
                 let component = {
                     "x":eq.x,"y":eq.y,"width":eq.turn ? eq.w : eq.h,"height":eq.turn ? eq.h : eq.w,"name":"","color":eq.color,
@@ -425,9 +467,17 @@
                     let size = result.val.toString().length;
                     let val;
                     if(result.type==="CHAR"){
-                        val=this.charArr[result.val+index];
+                        if (this.increment){
+                            val=this.charArr[result.val+index];
+                        }else{
+                            val=this.charArr[result.val-index];
+                        }
                     }else{
-                        val=Number(result.val)+index;
+                        if (this.increment){
+                            val=Number(result.val)+index;
+                        }else{
+                            val=Number(result.val)-index;
+                        }
                         if (val.toString().length<size){
                             val = (Array(size).join('0') + val).slice(-size);
                         }
@@ -482,7 +532,9 @@
                 })
             },
             copyEle(){
-                $('#clipboardDiv').text(JSON.stringify(this.currentEl));
+                if (this.currentEl!=null && JSON.stringify(this.currentEl)!=="{}"){
+                    $('#clipboardDiv').text(JSON.stringify(this.currentEl));
+                }
             },
             delEquipment(){
                 this.equipmentElements.some((el,index)=>{
@@ -511,7 +563,7 @@
                     }else if (equipment.updateCoords){
                         equipments.push({
                             id:equipment.eqId,
-                            info:JSON.stringify({x:equipment.x,y:equipment.y,id:equipment.id})
+                            info:JSON.stringify({x:equipment.x,y:equipment.y,id:equipment.id,turn:equipment.turn})
                         });
                     }
                 });
@@ -616,15 +668,10 @@
                     let children = [];
                     for (let i=0;i<this.currentEq.obj.layer;i++)children.push({});
                     let newEquipment = Object.assign({children:children,x:x,y:y}, this.currentEq.obj);
-                    if (this.turn){
-                        let wid = newEquipment.w;
-                        newEquipment.w = newEquipment.h;
-                        newEquipment.h = wid;
-                        newEquipment.turn = this.turn;
-                        this.showAddModal(newEquipment);
-                    }
+                    newEquipment.turn = this.turn;
                     newEquipment.width = newEquipment.w;
                     newEquipment.depth = newEquipment.h;
+                    this.showAddModal(newEquipment);
                 }
                 this.currentEq.obj = null;
             },

+ 238 - 0
resources/views/kpi/logisticsPunctuality/index.blade.php

@@ -0,0 +1,238 @@
+@extends('layouts.app')
+@section('title')承运商时效表@endsection
+@section('content')
+    <div class="d-none" id="list">
+        <!--查询            -->
+        <div class="row m-3" style="background-color: #fff;">
+            <div class="form-group m-2">
+                <select class="form-control selectpicker" title="分页大小" v-model="size">
+                    <option value="50">50</option>
+                    <option value="100">100</option>
+                    <option value="200">200</option>
+                    <option value="500">500</option>
+                    <option value="1000">1000</option>
+                </select>
+            </div>
+            <div class="form-group m-2" data-toggle="tooltip" data-placement="top" title="承运商">
+                <input v-model="search.logisticName" class="form-control" type="text" step="01" placeholder="承运商">
+            </div>
+            <div class="form-group m-2" data-toggle="tooltip" data-placement="top" title="货主">
+                <input v-model="search.customerName" class="form-control" type="text" step="01" placeholder="货主">
+            </div>
+            <div class="form-group m-2" data-toggle="tooltip" data-placement="top" title="起始日期">
+                <input v-model="search.startTime" class="form-control" type="date" step="01">
+            </div>
+            <div class="form-group m-2" data-toggle="tooltip" data-placement="top" title="截止日期">
+                <input v-model="search.endTime" class="form-control" type="date" step="01">
+            </div>
+            <div class="form-group m-2">
+                <select class="form-control selectpicker" title="是否收货" v-model="search.receiveStatus">
+                    <option value="1">全部</option>
+                    <option value="2">是</option>
+                </select>
+            </div>
+            <div class="form-group m-2">
+                <button class="form-control btn btn-sm btn-info" @click="searchData()">查询</button>
+            </div>
+
+            <div class="form-group m-2">
+                <button class="form-control btn btn-sm btn-success" @click="downExcel()">导出EXCEL</button>
+            </div>
+        </div>
+
+        <!--            导出-->
+        <span class="dropdown"></span>
+        <!--            表格-->
+        <table class="table table-striped table-bordered table-hover text-nowrap waybill-table td-min-width-80"
+               style="background: #fff;" id="table">
+            <tr v-for="(item,i) in details.data" :key="i">
+                <td class="td-warm text-muted"><span>@{{ i+1 }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.customerName }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.logisticName }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.province }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.t0 }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.t1 }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.t2 }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.t3 }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.t4 }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.t5 }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.orderTotalAmount }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.orderHaveRouteAmount }}</span></td>
+            </tr>
+        </table>
+
+        <nav aria-label="...">
+            <ul class="pagination">
+                <li class="page-item" :class="current===1?'disabled':''">
+                    <button class="page-link" @click="pagination('pre')">上一页</button>
+                </li>
+                <li class="page-item" :class="current===details.pages?'disabled':''">
+                    <button class="page-link" @click="pagination('next')">下一页</button>
+                </li>
+            </ul>
+        </nav>
+    </div>
+
+
+@endsection
+
+@section('lastScript')
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版2--}}
+    <script>
+        let vue = new Vue({
+            el: "#list",
+            data: {
+                selectTr: null,
+                details: {
+                    data: [],
+                },
+                search: {
+                    startTime: null,
+                    endTime: null,
+                    logisticName: null,
+                    customerName: null,
+                    ownerIdList: {!! $ownerIds !!}
+                },
+                size: 50,
+                current: 1,
+            },
+            created() {
+                let url = this.getBaseUrl();
+                url += `/api/report/logisticsPunctuality/list?size=${this.size}&current=${this.current}`;
+
+                var day1 = new Date();
+                day1.setTime(day1.getTime() - 24 * 60 * 60 * 1000);
+                var s1 = day1.getFullYear() + "-" + ((day1.getMonth() + 1) >= 10 ? (day1.getMonth() + 1) : ('0' + (day1.getMonth() + 1))) + "-" + (day1.getDate() >= 10 ? day1.getDate() : ('0' + day1.getDate()));
+
+                //今天的时间
+                var day2 = new Date();
+                day2.setTime(day2.getTime());
+                var s2 = day2.getFullYear() + "-" + ((day2.getMonth() + 1) >= 10 ? (day2.getMonth() + 1) : ('0' + (day2.getMonth() + 1))) + "-" + (day2.getDate() >= 10 ? day2.getDate() : ('0' + day2.getDate()));
+                this.search.startTime = s1;
+                this.search.endTime = s2;
+                let search = Object.assign({}, this.search);
+                search.startTime += ' 00:00:00';
+                search.endTime += ' 23:59:59';
+                tempTip.showSuccess('开始查询,请稍后!');
+                axios.post(url, search).then(res => {
+                    tempTip.showSuccess('查询成功!');
+                    if (res.data.data === undefined) {
+                        this.details.data = [];
+                        this.details.total = 0
+                        this.details.current = 1
+                        this.details.pages = 0
+                        this.details.size = 50;
+                    } else {
+                        this.details.data = res.data.data.list;
+                        this.details.total = res.data.data.page.total;
+                        this.details.current = res.data.data.page.pageNum;
+                        this.details.pages = res.data.data.page.pages
+                        this.details.size = res.data.data.page.pageSize;
+                    }
+                });
+            },
+            mounted: function () {
+                $('#list').removeClass('d-none');
+                let column = [
+                    {name: 'customerName', value: '货主'},
+                    {name: 'logisticName', value: '承运商'},
+                    {name: 'province', value: '省份'},
+                    {name: 't0', value: '付款-推单-小时'},
+                    {name: 't1', value: '推单-出库(库内)-小时'},
+                    {name: 't2', value: '出库-揽收(月台)-小时'},
+                    {name: 't3', value: '揽收-中转(站点)-小时'},
+                    {name: 't4', value: '中转-签收(途中)-日'},
+                    {name: 't5', value: ' 推单-签收(全部)-日'},
+                    {name: 'case6Amount', value: '总单量'},
+                    {name: 'case7Amount', value: '总有路由信息单量'},
+
+                ];
+                new Header({
+                    el: "table",
+                    name: "details",
+                    column: column,
+                    data: this.details.data,
+                    restorationColumn: 'addtime',
+                    fixedTop: ($('#form_div').height()) + ($('#btn').height()) + 1,
+                }).init();
+            },
+            methods: {
+                searchData() {
+                    this.current = 1;
+                    this.pagination();
+                },
+                //根据环境获取不同的url
+                getBaseUrl() {
+                    let url = null;
+                    let env = "{{ config('app.env') }}";
+                    if (env === 'local') {
+                        url = 'http://127.0.0.1:8111'
+                    } else if (env === 'production') {
+                        url = 'https://stat.baoshi56.com'
+                    }
+                    return url;
+                },
+                pagination(flag) {
+                    if (flag === 'pre' && this.current > 1) {
+                        this.current--;
+                    } else if (flag === 'next' && this.current < this.details.pages) {
+                        this.current++;
+                    }
+                    let url = this.getBaseUrl();
+                    url += `/api/report/logisticsPunctuality/list?size=${this.size}&current=${this.current}`;
+                    let search = Object.assign({}, this.search);
+                    search.startTime += ' 00:00:00';
+                    search.endTime += ' 23:59:59';
+                    tempTip.showSuccess('开始查询,请稍后!');
+                    axios.post(url, search).then(res => {
+                        if (res.data.code !== 200) {
+                            Object.keys(res.data.data).forEach(k => {
+                                tempTip.show(res.data.data[k]);
+                            })
+                        } else {
+                            tempTip.showSuccess('查询成功!');
+                            if (res.data.data === undefined) {
+                                this.details.data = [];
+                                this.details.total = 0
+                                this.details.current = 1
+                                this.details.pages = 0
+                                this.details.size = 50;
+                            } else {
+                                this.details.data = res.data.data.list;
+                                this.details.total = res.data.data.page.total;
+                                this.details.current = res.data.data.page.pageNum;
+                                this.details.pages = res.data.data.page.pages
+                                this.details.size = res.data.data.page.pageSize;
+                            }
+                        }
+                    });
+                },
+                downExcel() {
+                    let url = this.getBaseUrl();
+                    url += '/api/report/logisticsPunctuality/export';
+                    let search = Object.assign({}, this.search);
+                    search.startTime += ' 00:00:00';
+                    search.endTime += ' 23:59:59';
+                    axios.post(url, search).then(res => {
+                        if (res.data.code === 200) {
+                            let filename = res.data.data;
+                            let downUrl = this.getBaseUrl() + '/api/report/logisticsPunctuality/export/' + filename;
+                            let link = document.createElement('a');
+                            link.style.display = 'none';
+                            link.href = downUrl;
+                            link.download = `${filename}.xlsx`;
+                            document.body.appendChild(link);
+                            link.click();
+                            document.body.removeChild(link);
+                            tempTip.showSuccess('导出成功!');
+                        } else {
+                            tempTip.setDuration(3000);
+                            tempTip.show(res.data.data);
+                        }
+                    })
+                }
+            },
+
+        });
+    </script>
+@endsection

+ 230 - 0
resources/views/kpi/orderOperationLog/index.blade.php

@@ -0,0 +1,230 @@
+@extends('layouts.app')
+@section('title')订单操作日志@endsection
+@section('content')
+    <div class="d-none" id="list">
+        <!--查询            -->
+        <div class="row m-3" style="background-color: #fff;">
+            <div class="form-group m-2">
+                <select class="form-control selectpicker" title="分页大小" v-model="size">
+                    <option value="50">50</option>
+                    <option value="100">100</option>
+                    <option value="200">200</option>
+                    <option value="500">500</option>
+                    <option value="1000">1000</option>
+                </select>
+            </div>
+            <div class="form-group m-2" data-toggle="tooltip" data-placement="top" title="货主">
+                <input v-model="search.customerName" class="form-control" type="text" step="01" placeholder="货主">
+            </div>
+            <div class="form-group m-2" data-toggle="tooltip" data-placement="top" title="起始日期">
+                <input v-model="search.startTime" class="form-control" type="date" step="01">
+            </div>
+            <div class="form-group m-2" data-toggle="tooltip" data-placement="top" title="截止日期">
+                <input v-model="search.endTime" class="form-control" type="date" step="01">
+            </div>
+            <div class="form-group m-2">
+                <button class="form-control btn btn-sm btn-info" @click="searchData()">查询</button>
+            </div>
+
+            <div class="form-group m-2">
+                <button class="form-control btn btn-sm btn-success" @click="downExcel()">导出EXCEL</button>
+            </div>
+        </div>
+
+        <!--            导出-->
+        <span class="dropdown"></span>
+        <!--            表格-->
+        <table class="table table-striped table-bordered table-hover text-nowrap waybill-table td-min-width-80"
+               style="background: #fff;" id="table">
+            <tr v-for="(item,i) in details.data" :key="i">
+                <td class="td-warm text-muted"><span>@{{ i+1 }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.ownerName }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.erpOrderNo }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.logisticNumber }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.province }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.warehouseCode }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.payTime }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.issueTime }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.checkTime }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.logisticBranch }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.pickupTime }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.transferTime }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.receiveTime }}</span></td>
+            </tr>
+        </table>
+
+        <nav aria-label="...">
+            <ul class="pagination">
+                <li class="page-item" :class="current===1?'disabled':''">
+                    <button class="page-link" @click="pagination('pre')">上一页</button>
+                </li>
+                <li class="page-item" :class="current===details.pages?'disabled':''">
+                    <button class="page-link" @click="pagination('next')">下一页</button>
+                </li>
+            </ul>
+        </nav>
+    </div>
+
+
+@endsection
+
+@section('lastScript')
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版2--}}
+    <script>
+        let vue = new Vue({
+            el: "#list",
+            data: {
+                selectTr: null,
+                details: {
+                    data: [],
+                },
+                search: {
+                    startTime: null,
+                    endTime: null,
+                    customerName: null,
+                    ownerIdList: {!! $ownerIds !!}
+                },
+                size: 50,
+                current: 1,
+            },
+            created() {
+                let url = this.getBaseUrl();
+                url += `/api/report/orderOperationLog/list?size=${this.size}&current=${this.current}`;
+
+                var day1 = new Date();
+                day1.setTime(day1.getTime() - 24 * 60 * 60 * 1000);
+                var s1 = day1.getFullYear() + "-" + ((day1.getMonth() + 1) >= 10 ? (day1.getMonth() + 1) : ('0' + (day1.getMonth() + 1))) + "-" + (day1.getDate() >= 10 ? day1.getDate() : ('0' + day1.getDate()));
+
+                //今天的时间
+                var day2 = new Date();
+                day2.setTime(day2.getTime());
+                var s2 = day2.getFullYear() + "-" + ((day2.getMonth() + 1) >= 10 ? (day2.getMonth() + 1) : ('0' + (day2.getMonth() + 1))) + "-" + (day2.getDate() >= 10 ? day2.getDate() : ('0' + day2.getDate()));
+                this.search.startTime = s1;
+                this.search.endTime = s2;
+                let search = Object.assign({}, this.search);
+                search.startTime += ' 00:00:00';
+                search.endTime += ' 23:59:59';
+                tempTip.showSuccess('开始查询,请稍后!');
+                axios.post(url, search).then(res => {
+                    tempTip.showSuccess('查询成功!');
+                    if (res.data.data === undefined) {
+                        this.details.data = [];
+                        this.details.total = 0
+                        this.details.current = 1
+                        this.details.pages = 0
+                        this.details.size = 50;
+                    } else {
+                        this.details.data = res.data.data.list;
+                        this.details.total = res.data.data.page.total;
+                        this.details.current = res.data.data.page.pageNum;
+                        this.details.pages = res.data.data.page.pages
+                        this.details.size = res.data.data.page.pageSize;
+                    }
+                });
+            },
+            mounted: function () {
+                $('#list').removeClass('d-none');
+                let column = [
+                    {name: 'ownerName', value: '货主'},
+                    {name: 'erpOrderNo', value: 'erp订单号'},
+                    {name: 'logisticNumber', value: '快递单号'},
+                    {name: 'province', value: '省份'},
+                    {name: 'warehouseCode', value: '仓库代码'},
+                    {name: 'payTime', value: '顾客付款时间'},
+                    {name: 'issueTime', value: '订单推送时间'},
+                    {name: 'checkTime', value: '订单复核时间'},
+                    {name: 'logisticBranch', value: ' 网点信息'},
+                    {name: 'pickupTime', value: '包裹揽收时间'},
+                    {name: 'transferTime', value: '包裹中转时间'},
+                    {name: 'receiveTime', value: '包裹签收时间'},
+
+                ];
+                new Header({
+                    el: "table",
+                    name: "details",
+                    column: column,
+                    data: this.details.data,
+                    restorationColumn: 'addtime',
+                    fixedTop: ($('#form_div').height()) + ($('#btn').height()) + 1,
+                }).init();
+            },
+            methods: {
+                searchData() {
+                    this.current = 1;
+                    this.pagination();
+                },
+                //根据环境获取不同的url
+                getBaseUrl() {
+                    let url = null;
+                    let env = "{{ config('app.env') }}";
+                    if (env === 'local') {
+                        url = 'http://127.0.0.1:8111'
+                    } else if (env === 'production') {
+                        url = 'https://stat.baoshi56.com'
+                    }
+                    return url;
+                },
+                pagination(flag) {
+                    if (flag === 'pre' && this.current > 1) {
+                        this.current--;
+                    } else if (flag === 'next' && this.current < this.details.pages) {
+                        this.current++;
+                    }
+                    let url = this.getBaseUrl();
+                    url += `/api/report/orderOperationLog/list?size=${this.size}&current=${this.current}`;
+                    let search = Object.assign({}, this.search);
+                    search.startTime += ' 00:00:00';
+                    search.endTime += ' 23:59:59';
+                    tempTip.showSuccess('开始查询,请稍后!');
+                    axios.post(url, search).then(res => {
+                        if (res.data.code !== 200) {
+                            Object.keys(res.data.data).forEach(k => {
+                                tempTip.show(res.data.data[k]);
+                            })
+                        } else {
+                            tempTip.showSuccess('查询成功!');
+                            if (res.data.data === undefined) {
+                                this.details.data = [];
+                                this.details.total = 0
+                                this.details.current = 1
+                                this.details.pages = 0
+                                this.details.size = 50;
+                            } else {
+                                this.details.data = res.data.data.list;
+                                this.details.total = res.data.data.page.total;
+                                this.details.current = res.data.data.page.pageNum;
+                                this.details.pages = res.data.data.page.pages
+                                this.details.size = res.data.data.page.pageSize;
+                            }
+                        }
+                    });
+                },
+                downExcel() {
+                    let url = this.getBaseUrl();
+                    url += '/api/report/orderOperationLog/export';
+                    let search = Object.assign({}, this.search);
+                    search.startTime += ' 00:00:00';
+                    search.endTime += ' 23:59:59';
+                    axios.post(url, search).then(res => {
+                        if (res.data.code === 200) {
+                            let filename = res.data.data;
+                            let downUrl = this.getBaseUrl() + '/api/report/orderOperationLog/export/' + filename;
+                            let link = document.createElement('a');
+                            link.style.display = 'none';
+                            link.href = downUrl;
+                            link.download = `${filename}.xlsx`;
+                            document.body.appendChild(link);
+                            link.click();
+                            document.body.removeChild(link);
+                            tempTip.showSuccess('导出成功!');
+                        } else {
+                            tempTip.setDuration(3000);
+                            tempTip.show(res.data.data);
+                        }
+                    })
+                }
+            },
+
+        });
+    </script>
+@endsection

+ 170 - 0
resources/views/kpi/ownerPcsReport/index.blade.php

@@ -0,0 +1,170 @@
+@extends('layouts.app')
+@section('title')客单件报表@endsection
+@section('content')
+    <div class="d-none" id="list">
+        <!--查询            -->
+        <div class="row m-3" style="background-color: #fff;">
+            <!--货主名称-->
+            <div class="form-group m-2" data-toggle="tooltip" data-placement="top" title="货主名称">
+                <input v-model="search.customerName" class="form-control" type="text" placeholder="货主名称">
+            </div>
+
+            <div class="form-group m-2" data-toggle="tooltip" data-placement="top" title="起始日期">
+                <input v-model="search.startTime" class="form-control" type="date" step="01">
+            </div>
+
+            <div class="form-group m-2" data-toggle="tooltip" data-placement="top" title="截止日期">
+                <input v-model="search.endTime" class="form-control" type="date" step="01">
+            </div>
+
+            <div class="form-group m-2">
+                <button class="form-control btn btn-sm btn-info" @click="searchData()">查询</button>
+            </div>
+
+            <div class="form-group m-2">
+                <button class="form-control btn btn-sm btn-success" @click="resetSearch()">重置</button>
+            </div>
+
+            <div class="form-group m-2">
+                <button class="form-control btn btn-sm btn-success" @click="downExcel()">导出EXCEL</button>
+            </div>
+        </div>
+
+        <!--            导出-->
+        <span class="dropdown"></span>
+        <!--            表格-->
+        <table class="table table-striped table-bordered table-hover text-nowrap waybill-table td-min-width-80"
+               style="background: #fff;" id="table">
+            <tr v-for="(item,i) in details.data" :key="i">
+                <td class="td-warm text-muted"><span>@{{ i+1 }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.customerName }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.case1Amount }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.case2Amount }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.case3Amount }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.case4Amount }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.case5Amount }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.case6Amount }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.case7Amount }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.case8Amount }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.moreThan9Amount }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.avg }}</span></td>
+            </tr>
+        </table>
+    </div>
+
+
+@endsection
+
+@section('lastScript')
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版2--}}
+    <script>
+        let vue = new Vue({
+            el: "#list",
+            data: {
+                selectTr: null,
+                details: {
+                    data: [],
+                },
+                search: {
+                    startTime: null,
+                    endTime: null,
+                    customerName: null,
+                    customerCodes: {!! $ownerCodes !!}
+                },
+            },
+            created() {
+                let url = this.getBaseUrl();
+                url += '/api/report/customerOrderQty/listGrouped';
+
+                axios.post(url, this.search).then(res => {
+                    this.details.data = res.data.data;
+                });
+            },
+            mounted: function () {
+                $('#list').removeClass('d-none');
+                let column = [
+                    {name: 'customerName', value: '货主名称'},
+                    {name: 'case1Amount', value: '1pcs'},
+                    {name: 'case2Amount', value: '2pcs'},
+                    {name: 'case3Amount', value: '3pcs'},
+                    {name: 'case4Amount', value: '4pcs'},
+                    {name: 'case5Amount', value: '5pcs'},
+                    {name: 'case6Amount', value: '6pcs'},
+                    {name: 'case7Amount', value: '7pcs'},
+                    {name: 'case8Amount', value: '8pcs'},
+                    {name: 'moreThan9Amount', value: '>=9pcs'},
+                    {name: 'avg', value: '单均客单数'}
+
+                ];
+                new Header({
+                    el: "table",
+                    name: "details",
+                    column: column,
+                    data: this.details.data,
+                    restorationColumn: 'addtime',
+                    fixedTop: ($('#form_div').height()) + ($('#btn').height()) + 1,
+                }).init();
+            },
+            methods: {
+                resetSearch() {
+                    this.search = {
+                        startTime: null,
+                        endTime: null,
+                        customerName: null,
+                    };
+                },
+                searchData() {
+                    this.pagination();
+                },
+                //根据环境获取不同的url
+                getBaseUrl() {
+                    let url = null;
+                    let env = "{{ config('app.env') }}";
+                    if (env === 'local') {
+                        url = 'http://127.0.0.1:8111'
+                    } else if (env === 'production') {
+                        url = 'https://stat.baoshi56.com'
+                    }
+                    return url;
+                },
+                pagination(flag) {
+                    let url = this.getBaseUrl();
+                    url += '/api/report/customerOrderQty/listGrouped';
+                    let search = Object.assign({}, this.search);
+                    search.startTime += ' 00:00:00';
+                    search.endTime += ' 00:00:00';
+                    axios.post(url, search).then(res => {
+                        if (res.data.data === undefined) {
+                            this.details.data = [];
+                        } else {
+                            this.details.data = res.data.data;
+                        }
+                    });
+                },
+                downExcel() {
+                    let url = this.getBaseUrl();
+                    url += '/api/report/scanInfo/export';
+                    let search = this.getSearch();
+                    axios.post(url, search).then(res => {
+                        if (res.data.code === 200) {
+                            let filename = res.data.data;
+                            let downUrl = this.getBaseUrl() + '/api/report/scanInfo/export/' + filename;
+                            let link = document.createElement('a');
+                            link.style.display = 'none';
+                            link.href = downUrl;
+                            link.download = `${filename}.xlsx`;
+                            document.body.appendChild(link);
+                            link.click();
+                            document.body.removeChild(link);
+                            tempTip.showSuccess('导出成功!');
+                        } else {
+                            tempTip.setDuration(3000);
+                            tempTip.show(res.data.data);
+                        }
+                    })
+                }
+            },
+
+        });
+    </script>
+@endsection

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

@@ -65,10 +65,10 @@
                                 @click="manualBack()">一键回传
                         </button>
                     @endcan
-{{--                    @can('订单管理-订单-一键揽收')--}}
+                    @can('订单管理-订单-一键揽收')
                         <button class="btn btn-sm ml-1 btn-success tooltipTarget" title="目前仅中通可用,默认重量0.01kg,默认揽收不需要任何条件"
                                 @click="collectUpload()">一键揽收</button>
-{{--                    @endcan--}}
+                    @endcan
                 </div>
                 <div class="modal fade " style="top: 20%" id="myModal" tabindex="-1" role="dialog"
                      aria-labelledby="myModalLabel" aria-hidden="true">
@@ -1516,7 +1516,7 @@
                     let filter = this.workOrder.commodities.filter(e=>{
                         return Number(e.price) <=0 || Number(e.abnormal_amount) <= 0;
                     })
-                    if (filter.length > 0){
+                    if (filter.length > 0 && !this.isBaoShi){
                         message = '破损商品的数量和价格不能为0';
                     }
                     if (message){

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

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

+ 2 - 0
resources/views/order/scanInfo/index.blade.php

@@ -64,6 +64,7 @@
                 <td class="td-warm text-muted"><span>@{{ item.createTime }}</span></td>
                 <td class="td-warm text-muted"><span>@{{ item.recheckTime }}</span></td>
                 <td class="td-warm text-muted"><span>@{{ item.recheckUsername }}</span></td>
+                <td class="td-warm text-muted"><span>@{{ item.workstation }}</span></td>
             </tr>
         </table>
         <nav aria-label="...">
@@ -148,6 +149,7 @@
                     {name: 'createTime', value: '打包时间'},
                     {name: 'recheckTime', value: '复核时间'},
                     {name: 'recheckUsername', value: '复核人'},
+                    {name: 'workstation', value: '工作站'},
                 ];
                 new Header({
                     el: "table",

+ 4 - 1
resources/views/order/workOrder/_edit_process_log.blade.php

@@ -10,7 +10,10 @@
     </div>
     <div slot="footer" class="dialog-footer">
         <el-button @click="dialogProcessLogVisible = false">关 闭</el-button>
-        <el-button type="primary" @click="storeProcessLog">
+        <el-button type="primary" @click="storeProcessLog" v-show="processLogs.select_id">
+            提交
+        </el-button>
+        <el-button type="primary" @click="batchStoreProcessLogs" v-show="!processLogs.select_id">
             提交
         </el-button>
     </div>

+ 3 - 2
resources/views/order/workOrder/_logistic_fill_work_order_modal.blade.php

@@ -76,7 +76,7 @@
                         <td class="text-wrap" v-text="item.commodity ? item.commodity.sku : ''"></td>
                         <td v-text="item.amount"></td>
                         <td v-text="item.abnormal_amount"></td>
-                        <td v-text="item.price"></td>
+                        <td v-text="Number(item.price) === 0?'待提供' : item.price"></td>
                         <td>
                             <input type="number" class="form-control form-control-sm"
                                    v-model="item.check_amount" @input="logisticDamageWorkOrderAuto(item)">
@@ -125,7 +125,8 @@
 
     <div slot="footer" class="dialog-footer">
         <el-button @click="dialogShowLogisticVisible = false">关 闭</el-button>
-        <el-button type="primary" @click="logisticEdit">提交</el-button>
+        <el-button type="primary" @click="logisticEdit" v-show="'破损' === logisticEditWorkOrder.issue_type_name && logisticCheckDamage()">提交</el-button>
+        <el-button type="primary" @click="logisticEdit" v-show="'破损' !== logisticEditWorkOrder.issue_type_name">提交</el-button>
     </div>
 </el-dialog>
 

+ 39 - 0
resources/views/order/workOrder/_order_commodity_info.blade.php

@@ -0,0 +1,39 @@
+<el-dialog :visible.sync="dialogOrderCommoditiesVisible" width="75%">
+    <div slot="title">
+        商品详情
+    </div>
+    <el-table
+        :key="order_info_commodityes_key"
+        :data="orderInfo.commodities"
+        row-key="order_commodities_id"
+        border
+        size="small"
+        style="width: 100%; margin-top: 20px">
+
+        <el-table-column
+            prop="logistic_number"
+            label="快递单号"
+            width="180">
+        </el-table-column>
+
+        <el-table-column
+            prop="name"
+            label="商品">
+        </el-table-column>
+
+        <el-table-column
+            prop="sku"
+            label="商品编码">
+        </el-table-column>
+
+        <el-table-column
+            prop="amount"
+            label="数量">
+        </el-table-column>
+    </el-table>
+
+    <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogOrderCommoditiesVisible = false">关 闭</el-button>
+    </div>
+</el-dialog>
+

+ 1 - 1
resources/views/order/workOrder/_work_order_show.blade.php

@@ -118,7 +118,7 @@
                         <td v-text="item.abnormal_type"></td>
                         <td class="text-wrap" v-text="item.commodity ? item.commodity.name : ''"></td>
                         <td v-text="item.amount"></td>
-                        <td v-text="item.price"></td>
+                        <td v-text="Number(item.price) === 0 ? '待提供' : item.price"></td>
                         <td v-text="item.abnormal_amount"></td>
                     </tr>
                     </tbody>

+ 226 - 52
resources/views/order/workOrder/index.blade.php

@@ -2,6 +2,7 @@
 @section('title','处理工单')
 @section('head')
     <link href="{{ mix('css/element-ui.css') }}" rel="stylesheet">
+    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
 @endsection
 
 @section("content")
@@ -29,6 +30,10 @@
                                 class="ml-1 btn btn-outline-primary btn-sm"
                                 @click="baoShiBatchHandler">宝时批量处理
                         </button>
+                        <button type="button"
+                                class="ml-1 btn btn-outline-primary btn-sm"
+                                @click="showBatchStoreProcessLogs">批量处理日志
+                        </button>
                     @endcan
                     @can('订单管理-问题件-编辑')
                         <button type="button"
@@ -58,30 +63,46 @@
                             <tr @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
                                 <td>
                                     <label><input name="checkData" type="checkbox" :value="item.id"></label>
-                                    <span v-show="isNewWorkOrder(item)" class="badge text-white bg-primary">新</span>
+                                    <span v-show="isNewWorkOrder(item)" class="badge  bg-primary text-white ">新</span>
                                     @can( '订单管理-工单处理-宝时编辑')
                                         <span v-show="isStrandWorkOrder(item)"
-                                              class="badge badge-danger bg-warning text-break"
+                                              class="badge  badge-danger bg-warning text-break"
                                               @click="showStoreProcessLog(item,i)">滞</span>
-                                        @elsecan('订单管理-工单处理-承运商编辑')
-                                    @else
+                                    @elsecan('订单管理-工单处理-承运商编辑')
                                         <span v-show="isStrandWorkOrder(item)"
-                                              class="badge badge-danger bg-warning text-break">滞</span>
+                                              class="badge  badge-danger bg-warning text-break">滞</span>
                                     @endcan
-                                    <span v-show="isLogisticHandler(item)" class="badge badge-success">承</span>
-                                    <span v-show="item.is_new_rejecting ==='回库'" class="badge badge-danger">退</span>
+
+                                    <template>
+                                        <span class="badge badge-success" v-show="isLogisticHandler(item)">承</span>
+                                        <span v-show="item.order_detail && ['有','已处理'].includes(item.order_detail.is_new_rejecting)"
+                                            class="badge badge-primary">退</span>
+                                    </template>
+
+                                    <template >
+                                        <br v-show="item.is_issue_order">
+                                        <a :href="'{{url("order/issue/index")}}'+'?is_handle=ture&orderCode='+item.orderno"
+                                           v-show="item.is_issue_order"
+                                           target="order/issue/index?addtime=15">
+                                            <span class="badge badge-danger ">问题件</span>
+                                        </a>
+                                    </template>
+
+                                    <template v-show="item.order_detail">
+                                        <br>
+                                        <span class="badge  badge-light"
+                                            v-text="item.order_detail ? item.order_detail.rejecting_status : ''"></span>
+                                    </template>
                                 </td>
                                 <td>
                                     <span v-text="item.id"></span>
-                                    <br v-show="item.is_issue_order">
-                                    <a :href="'{{url("order/issue/index")}}'+'?orderCode='+item.orderno"
-                                       target="order/issue/index?addtime=15"
-                                       v-show="item.is_issue_order">
-                                        <span class="badge badge-primary">问题件</span>
-                                    </a>
                                     <br>
-                                    <button class="btn btn-sm btn-outline-dark"
-                                            @click="showWorkOrderItem(item)">详情
+                                    <button class="btn btn-sm btn-outline-secondary"
+                                            @click="showWorkOrderItem(item)">工单详情
+                                    </button>
+                                    <br>
+                                    <button class="btn btn-sm btn-outline-secondary"
+                                            @click="showOrderCommoditiesInfo(item)">商品详情
                                     </button>
                                 </td>
                                 <td>
@@ -170,21 +191,50 @@
                                 </td>
                                 <td>
                                     <span v-text="item['last_handler_name'] + ':' + item.process_progress"></span>
-                                    <span class="badge badge-pill badge-warning" v-if="'快递异常' === item.issue_type_name"
+                                    <span class="badge  badge-warning" v-if="'快递异常' === item.issue_type_name"
                                           v-text="item.type"></span>
                                 </td>
-                                <td v-text="item.created_at"></td>
-                                <td v-text="item.status"></td>
-                                <td v-text="item.owner? item.owner.name : ''"></td>
-                                <td v-text="item.order? item.order.client_code : ''"></td>
+                                <td v-text="item.shop_name"></td>
+                                <td v-text="item.owner_name"></td>
+                                <td v-text="item.order_client_code"></td>
+                                <td v-text="item.logisitc_name"></td>
                                 <td>
                                     <div v-for="logistic_number in item.logistic_numbers">
                                         <span v-text="logistic_number"></span>
                                     </div>
                                 </td>
-                                <td v-text="item.logistic ? item.logistic.name : ''"></td>
+
+                                <td v-text="item.created_at"></td>
+                                <td v-text="item.status"></td>
                                 <td v-text="item.creator ? item.creator.name : ''"></td>
                                 <td v-text="item.result_explain ? item.result_explain: item.remark"></td>
+                                <td class="text-muted child-layer-3-hide" >
+                                    <div class="form-inline">
+                                        <div class="form-group">
+                                            <input type="text" class="form-control form-text form-control-sm mr-1">
+                                            <button class="btn btn-sm btn-primary"
+                                                    @click="joinLogisticNumberReturn(item,$event,i)"
+                                            >添加
+                                            </button>
+                                        </div>
+                                    </div>
+                                    <div v-if="item.order_issue_rejected_bills">
+                                        <div class="form-inline"
+                                             v-for="relation in item.order_issue_rejected_bills">
+                                            <input type="text" class="form-control form-control-sm mt-1 mr-1"
+                                                   :value="relation.logistic_number_return"
+{{--                                                       @change="reviseJoinRejectedBill(item,orderIssueRejectedBill.logistic_number_return,$event)"--}}
+                                                   @focus="displayDelBtn(true,$event)"
+                                                   @blur="displayDelBtn(false,$event)">
+                                            <button type="button" class="btn btn-sm btn-outline-danger mt-1 d-none"
+                                                    @click="unJoinLogisticNumberReturn(item,relation.logistic_number_return,i)"
+                                            >
+                                                删
+                                            </button>
+                                        </div>
+                                    </div>
+                                </td>
+
                                 <td class="log-td"
                                     v-on:mouseover="showAddBtn($event)"
                                     v-on:mouseleave="hideAddBtn($event)">
@@ -241,13 +291,16 @@
         @include('order.workOrder._batch_edit_work_order')
         @include('order.workOrder._edit_order_issue_log')
         @include('order.workOrder._edit_process_log')
+        @include('order.workOrder._order_commodity_info')
     </div>
 @endsection()
 
 @section("lastScript")
     <script type="text/javascript" src="{{asset('js/queryForm/queryForm.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
-    <script src="{{ mix('js/element-ui.js') }}"></script>
+    <script type="text/javascript" src="{{mix('js/element-ui.js') }}"></script>
+{{--    <script src="https://unpkg.com/element-ui/lib/index.js"></script>--}}
+
     <style>
         .fade-enter-active {
             transition: opacity .3s;
@@ -451,11 +504,12 @@
                 dialogShowOrderWorkVisible: false,           // 工单详情
                 dialogBatchEditOrderIssueLogVisible: false,  // 问题件日志
                 dialogProcessLogVisible: false,              // 工单处理日志
+                dialogOrderCommoditiesVisible: false,              // 订单商品详情
 
                 showProcessLogId: null,         // workOrder->id
                 showAddDetailProcessLog: null,        // workOrderDetail->ids
-                showAddProcessLogFrom:null,     //
-                showAddProcessLogBtn:null,
+                showAddProcessLogFrom: null,     //
+                showAddProcessLogBtn: null,
 
                 batchHandlerWorkOrder: {
                     issue_type_name: '',
@@ -466,7 +520,11 @@
                     select_id: '',
                     select_index: '',
                     content: '',
-                }
+                },
+                orderInfo: {
+                    commodities: [],
+                },
+                order_info_commodityes_key: 1,
             },
             computed: {},
             mounted() {
@@ -571,13 +629,16 @@
                             }
                         }],
                     },
-                    {name:'tags',type:'select',placeholder: '`新`,`滞`,`无`标签筛选',
+                    {
+                        name: 'tags', type: 'select', placeholder: '`新`,`滞`,`无`标签筛选',
                         data: [
-                            {name:3, value:'新'},
-                            {name:2, value:'滞'},
-                            {name:1, value:'无'},
+                            {name: 3, value: '新'},
+                            {name: 2, value: '滞'},
+                            {name: 1, value: '无'},
                         ],
                     },
+                    {name: 'shop_name', type: 'input', placeholder: '商铺名'},
+                    {name: 'work_order_process_log', type: 'input', placeholder: '工单处理日志'},
                 ]];
                 this.form = new query({
                     el: '#form_div',
@@ -590,14 +651,17 @@
                     {name: 'operation', value: '操作', neglect: true},
                     {name: 'work_type', value: '工单类型', neglect: true},
                     {name: 'process_progress', value: '当前进度', neglect: true},
+
+                    {name: 'shop_name', value: '店铺名称'},
+                    {name: 'owner', value: '客户', neglect: true},
+                    {name: 'client_no', value: '客户订单号'},
+                    {name: 'logistic_name', value: '承运人'},
+                    {name: 'logistic_numbers', value: '快递单号'},
                     {name: 'created_at', value: '创建时间', neglect: true},
                     {name: 'status', value: '当前处理人', neglect: true},
-                    {name: 'owner', value: '货主', neglect: true},
-                    {name: 'order_code', value: '订单号', neglect: true},
-                    {name: 'logistic_numbers', value: '快递单号'},
-                    {name: 'logistic', value: '承运商'},
                     {name: 'creator', value: '创建人'},
                     {name: 'remark', value: '情况说明'},
+                    {name: 'return_logistic_number', value: '退回单号'},
                     {name: 'process_logs', value: '处理日志'},
                         @can('订单管理-工单处理-宝时编辑')
                     {
@@ -714,7 +778,7 @@
                         $(e.target).text("记录共" + orderIssue.logs.length + "条,点击展开");
                     }
                 },
-                toggleWorkOrderLogs(item,e,index){
+                toggleWorkOrderLogs(item, e, index) {
                     if (item.log_is_show === false) {
                         item.log_is_show = true;
                         $(e.target).text('点击收起');
@@ -735,11 +799,34 @@
                     workOrder.commodities = this.groupCommodities(workOrder);
                     workOrder.issue_type_name = workOrder.issue_type ? workOrder.issue_type.name : '';  // 工单类型
                     workOrder.pending_detail = this.groupPendingDetail(workOrder);
-                    workOrder.order_issue ? (workOrder.order_issue.log_is_show = false) : '';
                     workOrder.logistic_numbers = this.groupLogisticNumber(workOrder);
                     workOrder.orderno = workOrder.order ? workOrder.order.code : '';
                     workOrder.process_logs = this.groupProcess_logs(workOrder.pending_detail);
                     workOrder.log_is_show = false;
+                    workOrder.shop_name = workOrder.order ? (workOrder.order.shop ? workOrder.order.shop.name : '') : '';
+                    workOrder.owner_name = workOrder.owner ? workOrder.owner.name : '';
+                    workOrder.logisitc_name = workOrder.logistic ? workOrder.logistic.name : '';
+                    workOrder.order_client_code = workOrder.order ? workOrder.order.client_code : '';
+                    workOrder.order_commodities = this.groupOrderPackageCommodities(workOrder);
+                    workOrder.is_issue_order = workOrder.order_issue !== null;
+                    if (workOrder.order_issue !== null) workOrder.order_issue.log_is_show = 'order_issue' in workOrder;
+                },
+                groupOrderPackageCommodities(workOrder) {
+                    let order_packages = workOrder.order ? workOrder.order.packages : [];
+                    if (order_packages.length === 0) return [];
+                    return order_packages.map(e => {
+                        let commodities = e.commodities ? e.commodities : [];
+                        return commodities.map(item => {
+                            return {
+                                logistic_number: e.logistic_number,
+                                order_commodities_id: item.id,
+                                commodity_id: item.commodity_id,
+                                name: item.commodity ? item.commodity.name : '',
+                                sku: item.commodity ? item.commodity.sku : '',
+                                amount: item.amount,
+                            };
+                        })
+                    }).reduce((p, n) => (p ? p : []).concat(n ? n : []));
                 },
                 groupPendingDetail(workOrder) {
                     let details = workOrder.details.filter(item => {
@@ -823,11 +910,13 @@
                 },
                 groupImages(workOrder, type) {
                     let images = [];
+
                     workOrder.details.forEach(detail => {
                         let imageList = detail.images.map(item => {
                             item.issue_type_name = detail.issue_type ? detail.issue_type.name : '';
                             return item;
                         }).filter(item => {
+                            if (!item.upload_file) return false;
                             return item.type === type;
                         }).map(e => {
                             let {url, type} = e['upload_file'];
@@ -911,6 +1000,7 @@
                         if (data[e.id]) {
                             let item = data[e.id];
                             this.sortOrder(item);
+                            item.is_issue_order = item.order_issue ? true : false;
                             this.$set(this.workOrders, i, item);
                         }
                     });
@@ -1460,6 +1550,7 @@
                         window.tempTip.cancelWaitingTip();
                         if (res.data.success) {
                             this.sortOrder(res.data.data);
+                            res.data.data.is_issue_order = 'order_issue' in res.data.data;
                             this.$set(this.workOrders, this.selectIndex, res.data.data);
                             this.successTempTip('处理完成');
                             if (this.baoShiEditWorkOrder.is_edit) this.dialogEditBaoShiVisible = false
@@ -1734,6 +1825,11 @@
                         this.dialogShowLogisticVisible = true;
                     }
                 },
+                logisticCheckDamage() {
+                    let {commodities} = this.logisticEditWorkOrder;
+                    commodities.forEach(e => console.log(Number(e.price) === 0));
+                    return commodities.filter(e => Number(e.price) === 0).length === 0;
+                },
                 logisticEdit() {
                     let {issue_type_name, commodities, detail_id, process_progress} = this.logisticEditWorkOrder;
                     if (issue_type_name === '拦截') {
@@ -1760,6 +1856,10 @@
                             this.errorTempTip(res.message);
                             return;
                         }
+                        if (!this.logisticCheckDamage()) {
+                            this.errorTempTip('破损商待补充,工单暂不可修改');
+                            return;
+                        }
                         let url = '{{route('workOrder.damage.logistic.handlerApi')}}';
                         let formData = new FormData();
                         formData.append('detail_id', detail_id);
@@ -3085,7 +3185,7 @@
                     this.processLogs.select_id = item.id;
                     this.processLogs.select_index = index;
                 },
-                formStoreProcessLog(work_order_detail_id,worK_order_id){
+                formStoreProcessLog(work_order_detail_id, worK_order_id) {
                     let url = "{{route('workOrder.processLog.storeApi')}}";
                     let data = {
                         id: worK_order_id,
@@ -3097,7 +3197,7 @@
                         if (res.data.success) {
                             this.pushProcessLog(res.data.data);
                             this.successTempTip('处理完成');
-                            this.showAddDiv('addWorkOrderProcessLogForm'+work_order_detail_id);
+                            this.showAddDiv('addWorkOrderProcessLogForm' + work_order_detail_id);
                             this.$forceUpdate();
                             return;
                         }
@@ -3120,8 +3220,10 @@
                         if (res.data.success) {
                             this.pushProcessLog(res.data.data);
                             this.successTempTip('处理完成');
-                            if (this.dialogProcessLogVisible)this.dialogProcessLogVisible = false;
-
+                            if (this.dialogProcessLogVisible) this.dialogProcessLogVisible = false;
+                            this.processLogs.select_id = null;
+                            this.selectIndex = null;
+                            this.content = null;
                             return;
                         }
                         this.errorTempTip(res.data.message ? res.data.message : '处理出现异常,请刷新页面重试');
@@ -3130,8 +3232,15 @@
                         this.errorTempTip(err);
                     })
                 },
+                showBatchStoreProcessLogs() {
+                    if (checkData.length === 0) {
+                        this.errorTempTip('请选择需要处理工单')
+                        return;
+                    }
+                    this.dialogProcessLogVisible = true;
+                },
                 batchStoreProcessLogs() {
-                    let url = "{{route('workOrder.processLog.batchStore')}}}";
+                    let url = "{{route('workOrder.processLog.batchStore')}}";
                     let data = {
                         ids: checkData,
                         content: this.processLogs.content,
@@ -3140,8 +3249,8 @@
                     window.axios.post(url, data).then(res => {
                         window.tempTip.cancelWaitingTip();
                         if (res.data.success) {
+                            this.successTempTip('处理完成')
                             this.pushProcessLogs(res.data.data);
-                            window.tempTip.successTempTip('处理完成')
                             this.dialogProcessLogVisible = false;
                             return;
                         }
@@ -3164,35 +3273,100 @@
                         if (has) {
                             this.workOrders[index]['process_logs'].unshift(process_log);
                             if (this.isBaoShi) {
-                                 this.workOrders[index]['bao_shi_tag'] = '1'
+                                this.workOrders[index]['bao_shi_tag'] = '1'
                             } else if (this.isLogistic) {
-                                 this.workOrders[index]['logistic_tag'] = '1';
+                                this.workOrders[index]['logistic_tag'] = '1';
                             } else if (this.isOwner) {
-                                 this.workOrders[index]['owner_tag'] = '1';
+                                this.workOrders[index]['owner_tag'] = '1';
                             }
                         }
                     });
                 },
-                destroyProcessLog(item,log,index){
-                    if(!confirm('是否删除当前记录'))return;
+                destroyProcessLog(item, log, index) {
+                    if (!confirm('是否删除当前记录')) return;
                     let url = "{{route('workOrder.processLog.destroyApi')}}"
                     let data = {
-                        id:log.id
+                        id: log.id
                     };
                     this.waitingTempTip('处理中');
-                    window.axios.post(url,data).then(res=>{
+                    window.axios.post(url, data).then(res => {
                         window.tempTip.cancelWaitingTip()
-                        if (res.data.success){
+                        if (res.data.success) {
                             this.successTempTip('处理完成');
-                            item.process_logs.splice(index,1);
+                            item.process_logs.splice(index, 1);
                             this.$forceUpdate();
                             return;
                         }
-                        this.errorTempTip(res.data.message ?res.data.message :'处理异常刷新后重试');
-                    }).catch(err=>{
+                        this.errorTempTip(res.data.message ? res.data.message : '处理异常刷新后重试');
+                    }).catch(err => {
                         window.tempTip.cancelWaitingTip()
                         this.errorTempTip(err)
                     })
+                },
+
+
+                showOrderCommoditiesInfo(item) {
+                    this.dialogOrderCommoditiesVisible = true;
+                    this.orderInfo.commodities = item.order_commodities;
+                },
+
+                displayDelBtn(bool, e) {
+                    if (bool) $(e.target).next().removeClass('d-none');
+                    else {
+                        setTimeout(function () {
+                            $(e.target).next().addClass('d-none');
+                        }, 100);
+                    }
+                },
+
+                joinLogisticNumberReturn(item,e,index){
+                    let logistic_number_return = $(e.target).prev().val();
+                    console.log(logistic_number_return);
+                    if (logistic_number_return.trim().length === 0){
+                        this.errorTempTip('请输入退回单号进行添加');
+                        return;
+                    }
+                    let url = "{{route('workOrder.rejectedBill.storeApi')}}";
+                    let data = {order_id:item.order_id,logistic_number_return:logistic_number_return};
+                    this.waitingTempTip('处理中');
+                    window.axios.post(url,data).then(res=>{
+                        window.tempTip.cancelWaitingTip();
+                        if (res.data.success){
+                            this.sortOrder(res.data.data);
+                            this.$set(this.workOrders,index,res.data.data);
+                            this.successTempTip('处理完成');
+                            this.$forceUpdate();
+                            $(e.target).prev().val('');
+                            return ;
+                        }
+                        this.errorTempTip(res.data.message ? res.data.message : '处理出现异常' )
+                    }).catch(err=>{
+                        window.tempTip.cancelWaitingTip();
+                        this.errorTempTip(err);
+                    });
+                },
+                unJoinLogisticNumberReturn(item,logistic_number_return,index){
+                    if (logistic_number_return.trim().length === 0){
+                        this.errorTempTip('请输入退回单号进行添加');
+                        return;
+                    }
+                    let url = "{{route('workOrder.rejectedBill.destroyApi')}}";
+                    let data = {order_id:item.order_id,logistic_number_return:logistic_number_return};
+                    this.waitingTempTip('处理中');
+                    window.axios.post(url,data).then(res=>{
+                        window.tempTip.cancelWaitingTip();
+                        if (res.data.success){
+                            this.sortOrder(res.data.data);
+                            this.$set(this.workOrders,index,res.data.data);
+                            this.successTempTip('处理完成');
+                            this.$forceUpdate();
+                            return ;
+                        }
+                        this.errorTempTip(res.data.message ? res.data.message : '处理出现异常' )
+                    }).catch(err=>{
+                        window.tempTip.cancelWaitingTip();
+                        this.errorTempTip(err);
+                    });
                 }
             },
         });

+ 2 - 1
resources/views/personnel/laborApply/dispatch/index.blade.php

@@ -9,7 +9,8 @@
             <table class="table table-striped table-bordered table-hover card-body td-min-width-80" id="table">
                 <tr v-for="(labor_company_dispatch,i) in labor_company_dispatches"
                     @click="selectTr===i+1?selectTr=0:selectTr=i+1"
-                    :class="selectTr===i+1?'focusing' : ''">
+                    :class="selectTr===i+1?'focusing' : ''"
+                    :style="(labor_company_dispatch.man_num==0 && labor_company_dispatch.woman_num==0)?'background-color: #DCDCDC !important':''">
                     <td>
                         <input class="checkItem" type="checkbox" :value="labor_company_dispatch.id">
                     </td>

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

@@ -55,7 +55,7 @@
                             <label><input type="checkbox" :value="rejectedBill.id"/></label>
                         </td>
                         <td class="text-nowrap">
-                            <span class="text-muted" style="opacity:0.7">@{{ i+1 }}</span> <span v-if="rejectedBill.order_issue_rejected_bill" class="badge badge-pill badge-danger">问题件</span>
+                                <span class="text-muted" style="opacity:0.7">@{{ i+1 }}</span> <span v-if="rejectedBill.order_issue_rejected_bill" class="badge badge-pill badge-danger">问题件</span>
                         </td>
                         <td class="text-muted text-center">
                             <span v-if="rejectedBill.is_checked==1">

+ 41 - 3
resources/views/store/receivingTasks/create.blade.php

@@ -57,17 +57,21 @@
                                     <span class="text-danger">*</span>
                                     货主</label>
                                 <div class="form-inline col-8">
-                                    <select class="form-control form-control-sm col-12" name="owner_id" id="owner_id"
+                                    <select class="form-control form-control-sm col-8" name="owner_id" id="owner_id"
                                             :class="{'is-invalid':errors.owner_id}"
                                             @change="getASNDetails"
                                             @input="clearError('owner_id')"
                                             v-model="receiving_task.owner_id">
-                                        <option v-for="item in owners" :value="item.id" v-text="item.name"></option>
+                                        <option v-for="item in filterOwners" :value="item.id" v-text="item.name"></option>
                                     </select>
                                     <div id="validation-owner-id" class="invalid-feedback" v-show="errors.owner_id">
                                         <span v-text="errors.owner_id"></span>
                                     </div>
+                                    <div class="form-inline col-3">
+                                        <input type="text" name="owner_search" id="owner_search" v-model="owner_search" class="form-control form-control-sm">
+                                    </div>
                                 </div>
+
                             </div>
                         </div>
 
@@ -115,6 +119,7 @@
                                     <input type="text" class="form-control form-control-sm col-12" placeholder=""
                                            name="appointment_number" id="appointment_number"
                                            :class="{'is-invalid':errors.appointment_number}"
+{{--                                           @keydown.enter="getAnsNo"--}}
                                            @change="clearError('appointment_number')"
                                            v-model="receiving_task.appointment_number">
                                     <div id="validation-delivery-appointment-number" class="invalid-feedback"
@@ -418,6 +423,7 @@
                     @endforeach
                 ],
                 driving_license_image: null,
+                owner_search:null,
                 page_size: 20,
                 pager_count: 0,
                 current_page: 0,
@@ -462,11 +468,27 @@
                 printerList: [],
                 print_setting: {
                     printer_index: 0,
-                }
+                },
+                appointment_number_asn_nos:[], // 预约号对应的ans号
             },
             mounted() {
                 $("#list").removeClass('d-none');
             },
+            computed:{
+                filterOwners(){
+                    let owners = JSON.parse(JSON.stringify(this.owners));
+                    let owner_name = this.owner_search ? this.owner_search.trim() : '';
+                    if (owner_name === '') return owners;
+                    owners = owners.filter(e=>{
+                        return e.name.includes(owner_name);
+                    });
+                    setTimeout(()=>{
+                        let owner = owners.find(e=>e);
+                        owner ?  this.$set(this.receiving_task,'owner_id',owner.id) : null;
+                    },200);
+                    return owners;
+                },
+            },
             methods: {
                 waitingTempTip(message) {
                     window.tempTip.setIndex(2005);
@@ -567,6 +589,22 @@
                         this.errorTempTip(err);
                     });
                 },
+                getAnsNo(){
+                    let url = "{{route('store.receivingMask.getAsnNumberApi')}}";
+                    this.appointment_number_asn_nos = [];
+                    let data = {
+                        'appointment_number':this.receiving_task.appointment_number,
+                    };
+                    window.axios.post(url,data).then(res => {
+                        if (res.data.success) {
+                            this.appointment_number_asn_nos = res.data.data;
+                            return;
+                        }
+                        this.errorTempTip(res.data.message ? res.data.message : '校验预约号出现异常');
+                    }).catch(err => {
+                        this.errorTempTip(err);
+                    });
+                },
                 formatAsnHeaderDetails(asnHeaderDetails) {
                     return asnHeaderDetails.map(e => this.formatAsnHeaderDetail(e));
                 },

+ 16 - 3
routes/apiLocal.php

@@ -66,6 +66,8 @@ Route::group(['prefix' => 'personnel'], function () {
 Route::prefix('store')->group(function(){
     Route::prefix('receivingMask')->group(function(){
         Route::post("/createApi","ReceivingTaskController@storeApi")->name("store.receivingMask.storeApi");
+        Route::post('/deliveryAppointment/asnNumber','ReceivingTaskController@getAsnByAppointmentNumberApi')
+            ->name('store.receivingMask.getAsnNumberApi');
     });
 });
 Route::prefix('oracle')->group(function(){
@@ -103,9 +105,9 @@ Route::group(['prefix' => 'order'], function () {
         Route::post('financeConfirm','OrderIssueController@financeConfirmApi');
 
         Route::group(['prefix'=>'rejectedBill'],function(){
-            Route::post('join','OrderIssueRejectedBillController@joinRejectedBillApi');
-            Route::post('unJoin','OrderIssueRejectedBillController@unJoinRejectedBillApi');
-            Route::post('reviseJoin','OrderIssueRejectedBillController@reviseJoinRejectedBillApi');
+            Route::post('join','OrderIssueRejectedBillController@joinRejectedBillApi')->name('order.issue.join.rejectedBillApi');
+            Route::post('unJoin','OrderIssueRejectedBillController@unJoinRejectedBillApi')->name('order.issue.unJoin.rejectedBillApi');
+            Route::post('reviseJoin','OrderIssueRejectedBillController@reviseJoinRejectedBillApi')->name('order.issue.reviseJoin.rejectedBillApi');
         });
 
          Route::group(['prefix'=>'onTop'],function(){
@@ -145,6 +147,11 @@ Route::group(['prefix' => 'order'], function () {
         Route::any('updateStatus','OrderTrackingOwnerController@updateStatusApi');
     });
 
+    Route::prefix('detail')->group(function(){
+        Route::post('/','OrderDetailController@updateApi')->name('order.detail.updateApi');
+        Route::post('/dispose','OrderDetailController@disposeApi')->name('order.detail.disposeApi');
+    });
+
 });
 
 Route::group(['prefix'=>'maintenance'],function (){
@@ -359,6 +366,12 @@ Route::prefix('workOrder')->group(function(){
         Route::post("/logistic","WorkOrderCommoditiesController@logisticUpdateCommoditiesApi")->name("workOrder.commodity.logisticUpdateApi"); // 承运商 更新商品 处理信息
         Route::post("/baoShi","WorkOrderCommoditiesController@baoShiUpdateCommoditiesApi")->name("workOrder.commodity.baoShiUpdateApi");       // 宝时客服 更新丢件信息
     });
+
+    Route::prefix('rejectedBill/relation')->group(function(){
+        Route::post('/store',"WorkOrderRelationRejectedBillController@storeApi")->name('workOrder.rejectedBill.storeApi');
+        Route::post('/destroy',"WorkOrderRelationRejectedBillController@destroyApi")->name('workOrder.rejectedBill.destroyApi');
+        Route::post('/resetRelation',"WorkOrderRelationRejectedBillController@resetRelationApi")->name('workOrder.rejectedBill.resetRelationApi');
+    });
 });
 /*出库*/
 Route::group(['prefix'=>'storeOut'],function(){

+ 4 - 1
routes/web.php

@@ -1195,6 +1195,9 @@ Route::group(['middleware' => 'auth'], function ($route) {
         Route::get('dayDetailCustomer', 'KpiController@dayDetailCustomer');
         Route::resource('workCoefficient', 'WorkCoefficientController')->only(['index', 'create', 'update']);
         Route::get('workCoefficientDayStat', 'KpiController@workCoefficientDayStatIndex');
-   });
+        Route::get('ownerPcsReport', 'KpiController@ownerPcsReport');
+        Route::get('logisticsPunctuality', 'KpiController@logisticsPunctuality');
+        Route::get('orderOperationLog', 'KpiController@orderOperationLog');
+    });
 });
 

+ 1 - 0
runServes.sh

@@ -6,6 +6,7 @@ sudo ps -aux|grep laravel-echo-server |grep -v grep|awk '{print $2}'|sudo xargs
 cd /var/www/was
 nohup sudo su root -c "laravel-echo-server start" >/dev/null 2>&1 &
 nohup sudo su baoshi -c "sudo supervisord -c /var/www/was/horizon.conf" >/dev/null 2>&1 &
+nohup sudo su baoshi -c "php artisan workman start --d" >/dev/null 2>&1 &
 #nohup sudo su baoshi -c "php artisan queue:work --tries=2 --delay=2" >/dev/null 2>&1 &
 # nohup sudo ./serves/goExports >/dev/null 2>&1 &
 

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