Jelajahi Sumber

工单 批量处理 生成问题件同步处理日志

loustwo 4 tahun lalu
induk
melakukan
9cc21f19cf
26 mengubah file dengan 724 tambahan dan 593 penghapusan
  1. 27 1
      app/Filters/WorkOrderFilters.php
  2. 1 1
      app/Http/Controllers/OrderIssueProcessLogController.php
  3. 0 3
      app/Http/Controllers/OrderPackageCommoditiesController.php
  4. 37 142
      app/Http/Controllers/TestController.php
  5. 1 2
      app/Http/Controllers/WorkOrderController.php
  6. 1 1
      app/Http/Controllers/WorkOrderInterceptController.php
  7. 108 2
      app/Http/Controllers/WorkOrderProcessLogController.php
  8. 4 3
      app/Services/WorkOrderCancelInterceptService.php
  9. 14 4
      app/Services/WorkOrderDamageService.php
  10. 2 2
      app/Services/WorkOrderExpressAbnormalService.php
  11. 3 2
      app/Services/WorkOrderInformationChangeService.php
  12. 6 6
      app/Services/WorkOrderInterceptService.php
  13. 2 2
      app/Services/WorkOrderLossService.php
  14. 10 7
      app/Services/WorkOrderMistakeService.php
  15. 58 78
      app/Services/WorkOrderProcessLogService.php
  16. 61 31
      app/Services/WorkOrderService.php
  17. 41 35
      app/WorkOrder.php
  18. 6 8
      app/WorkOrderDetail.php
  19. 11 91
      app/WorkOrderProcessLog.php
  20. 53 0
      database/migrations/2022_01_07_150835_work_order_process_logs_edit_table.php
  21. 0 32
      database/migrations/2022_01_07_150835_work_order_process_logs_eidt_table.php
  22. 16 76
      resources/views/order/workOrder/_edit_process_log.blade.php
  23. 67 0
      resources/views/order/workOrder/_process_logs.blade.php
  24. 1 1
      resources/views/order/workOrder/_work_order_show.blade.php
  25. 188 61
      resources/views/order/workOrder/index.blade.php
  26. 6 2
      routes/apiLocal.php

+ 27 - 1
app/Filters/WorkOrderFilters.php

@@ -44,7 +44,8 @@ class WorkOrderFilters
         'status',
         'process_progress',
         'order_issue_log',
-        'log_content'
+        'log_content',
+        'tags'
     ];
     protected $array_filter;
     protected $params = [];
@@ -357,4 +358,29 @@ class WorkOrderFilters
         }
         $this->queryBuilder->whereIn('status',$status_list);
     }
+
+    public function tags($tag){
+        $status = $this->array_filter['status'] ?? null;
+        if ($status){
+            switch ($status){
+                case '宝时处理':
+                    $this->queryBuilder->where('bao_shi_tag',$tag);
+                    break;
+                case '货主处理':
+                    $this->queryBuilder->where('owner_tag',$tag);
+                    break;
+                case '承运商处理':
+                    $this->queryBuilder->where('logistic_tag',$tag);
+                    break;
+            }
+            return ;
+        }
+        if (Gate::allows('订单管理-工单处理-宝时编辑')){
+            $this->queryBuilder->where('bao_shi_tag',$tag);
+        } else if (Gate::allows('订单管理-工单处理-货主编辑')){
+            $this->queryBuilder->where('owner_tag',$tag);
+        } else if (Gate::allows('订单管理-工单处理-承运商编辑')){
+            $this->queryBuilder->where('logistic_tag',$tag);
+        }
+    }
 }

+ 1 - 1
app/Http/Controllers/OrderIssueProcessLogController.php

@@ -39,7 +39,7 @@ class OrderIssueProcessLogController extends Controller
                     'order_issue_id' => $request->input('id'),
                     'content' => $request->input('content'),
                     'tag' => $request->input('tag'),
-                    'user_id' => Auth::user()['id'],
+                    'user_id' => Auth::id(),
                     'type' => '处理',
                 ]);
                 $log->loadMissing('user');

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

@@ -13,11 +13,8 @@ class OrderPackageCommoditiesController extends Controller
     public function getCommoditiesApi(Request $request, OrderService $orderService, OrderPackageCommoditiesService $orderPackageCommoditiesService): array
     {
         $code = $request->input(['orderNo']);
-
         $orderService->syncOrderByCodes([$code]);
-
         $commodities = $orderPackageCommoditiesService->getCommodities($code);
-
         $data = $commodities->map(function ($item) {
             return [
                 'sku' => $item->commodity->sku ?? '',

+ 37 - 142
app/Http/Controllers/TestController.php

@@ -2,163 +2,23 @@
 
 namespace App\Http\Controllers;
 
-use App\Authority;
 use App\Batch;
-use App\Commodity;
-use App\CommodityBarcode;
-use App\CommodityMaterialBoxModel;
 use App\Components\AsyncResponse;
 use App\Components\Database;
 use App\Components\ErrorPush;
-use App\DeliveryAppointmentCar;
-use App\ErrorTemp;
-use App\Feature;
-use App\Http\ApiControllers\LoginController;
-use App\Http\Controllers\api\thirdPart\haochuang\SortingController;
-use App\Http\Controllers\api\thirdPart\syrius\beans\StorageTypeCell;
-use App\Http\Controllers\api\thirdPart\syrius\beans\StorageTypeRelation;
-use App\Http\Controllers\api\thirdPart\syrius\beans\Task;
-use App\Http\Controllers\api\thirdPart\syrius\beans\TaskItem;
-use App\Http\Controllers\api\thirdPart\syrius\producer\StorageTypeController;
-use App\Http\Controllers\api\thirdPart\syrius\units\Signature;
 use App\Http\Controllers\api\thirdPart\syrius\units\StorageTypeAttribute;
-use App\Http\Requests\AndroidGateRequest;
-use App\Http\Requests\OrderDelivering;
-use App\InventoryAccount;
-use App\InventoryAccountMission;
-use App\Jobs\BatchTaskJob;
-use App\Jobs\BroadcastBatchToZhengCangJob;
-use App\Jobs\CacheShelfTaskJob;
-use App\Jobs\OrderCreateInstantBill;
-use App\Jobs\OrderCreateWaybill;
-use App\Jobs\SettlementBillReportJob;
-use App\Jobs\StoreCreateInstantBill;
-use App\Jobs\TestJob;
-use App\Jobs\WeightUpdateInstantBill;
-use App\LaborCompanyDispatch;
-use App\LaborReport;
-use App\LaborReportStatus;
-use App\Logistic;
-use App\MaterialBox;
-use App\MaterialBoxModel;
-use App\Notifications\RoutineNotification;
 use App\Observers\WaybillObserver;
-use App\OracleDOCASNDetail;
-use App\OracleDOCASNHeader;
-use App\OracleDOCOrderHeader;
-use App\OracleDocOrderPackingSummary;
-use App\OracleDOCWaveDetails;
 use App\Order;
 use App\OrderBin;
-use App\OrderCommodity;
-use App\OrderIssue;
-use App\OrderIssueProcessLog;
-use App\OrderIssueType;
-use App\OrderPackage;
-use App\Owner;
-use App\OwnerAreaReport;
-use App\OwnerBillReport;
-use App\OwnerFeeDetail;
-use App\OwnerFeeDetailLogistic;
-use App\OwnerFeeExpress;
-use App\OwnerFeeLogistic;
-use App\OwnerFeeOperation;
-use App\OwnerFeeOperationDetail;
-use App\OwnerFeeStorage;
-use App\OwnerPriceExpress;
-use App\OwnerPriceOperation;
-use App\OrderPackageCountingRecord;
-use App\OwnerReport;
-use App\ProcurementCheckSheet;
-use App\ProcurementDeliverie;
-use App\ReceiveRecord;
 use App\RejectedBill;
-use App\SeeLog;
-use App\Services\AndroidInventoryService;
-use App\Services\AuthorityService;
-use App\Services\BatchService;
-use App\Services\CacheShelfService;
-use App\Services\common\BatchUpdateService;
-use App\Services\ForeignHaiRoboticsService;
-use App\Services\ForeignZhenCangService;
-use App\Services\LogisticService;
-use App\Services\LogService;
-use App\Services\MenuService;
-use App\Services\NotificationService;
-use App\Services\OracleDOCOrderHeaderService;
-use App\Services\OrderPackageCommoditiesService;
-use App\Services\OrderPackageReceivedSyncService;
-use App\Services\OrderPackageService;
-use App\Services\OrderService;
-use App\Services\OrderTrackingService;
-use App\Services\OwnerFeeTotalService;
-use App\Services\OwnerLogisticFeeReportService;
-use App\Services\OwnerPriceOperationService;
-use App\Services\OwnerService;
-use App\Services\OwnerStoreFeeReportService;
-use App\Services\OwnerStoreOutFeeReportService;
-use App\Services\ReceivingTaskService;
 use App\Services\RejectedBillService;
-use App\Services\ReplenishmentService;
-use App\Services\ReviewService;
-use App\Services\StationService;
-use App\Services\StorageService;
-use App\Services\StoreItemService;
-use App\Services\StoreService;
-use App\Services\SyriusTaskService;
-use App\Services\UserService;
 use App\Services\WorkOrderService;
-use App\SortingStation;
-use App\Station;
-use App\StationTask;
-use App\StationTaskMaterialBox;
-use App\Store;
-use App\StoreItem;
-use App\TaskTransaction;
-use App\Unit;
-use App\User;
-use App\UserDetail;
-use App\UserDutyCheck;
-use App\ValueStore;
 use App\Waybill;
 use App\WorkOrder;
-use App\WorkOrderCommodities;
-use App\WorkOrderDetail;
-use App\WorkOrderImage;
-use App\WorkOrderLog;
-use Carbon\Carbon;
-use Carbon\CarbonPeriod;
-use Decimal\Decimal;
-use Doctrine\DBAL\Driver\AbstractDB2Driver;
-use Doctrine\DBAL\Exception;
-use Firebase\JWT\ExpiredException;
-use Firebase\JWT\JWT;
-use Illuminate\Database\Eloquent\Builder;
-use Illuminate\Database\Eloquent\Collection;
-use Illuminate\Database\Eloquent\HigherOrderBuilderProxy;
 use Illuminate\Database\Eloquent\Model;
-use Illuminate\Database\QueryException;
-use Illuminate\Foundation\Http\FormRequest;
 use Illuminate\Http\Request;
-use Illuminate\Support\Facades\Broadcast;
-use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\Auth;
-use Illuminate\Support\Facades\Cookie;
 use Illuminate\Support\Facades\DB;
-use Illuminate\Support\Facades\Hash;
-use Illuminate\Support\Facades\Http;
-use Illuminate\Support\Facades\Log;
-use Illuminate\Support\Facades\Notification;
-use Illuminate\Support\Facades\URL;
-use Illuminate\Support\Facades\Validator;
-use Illuminate\Support\Str;
-use Laravel\Horizon\Events\JobFailed;
-use Monolog\Handler\IFTTTHandler;
-use phpDocumentor\Reflection\Types\Resource_;
-use PhpOffice\PhpSpreadsheet\Calculation\Web\Service;
-use PhpParser\Node\Stmt\DeclareDeclare;
-use Ramsey\Uuid\Uuid;
-use Symfony\Component\ErrorHandler\Error\FatalError;
 
 class TestController extends Controller
 {
@@ -416,8 +276,43 @@ class TestController extends Controller
         return json_encode($request->header(),JSON_UNESCAPED_UNICODE) ;
     }
 
-    public function rejectedSync(){
-        $rejectedBillService=app(RejectedBillService::class);
+    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]);
+
+
+        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]);
+
+
+        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 baoHandler(){
+//        dd(Auth::id());
+        $service = new WorkOrderService();
+        $service->timingTask();
     }
 
 }

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

@@ -77,8 +77,7 @@ class WorkOrderController extends Controller
         $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'));
     }
 
     /**

+ 1 - 1
app/Http/Controllers/WorkOrderInterceptController.php

@@ -62,8 +62,8 @@ class WorkOrderInterceptController extends Controller
             return ['success' => false, 'message' => '没有对应权限'];
         $detail = WorkOrderDetail::query()->find($request->input('detail_id'));
         $workOrder = $detail->workOrder;
-
         if (!$detail || !$workOrder) return ['success' => false, 'message' => '参数异常'];
+
         if ($detail->status === '完成') return ['success' => false, 'message' => '工单已完成,请刷新重试'];
 
         $this->service->logisticHandler($detail, $request->all());

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

@@ -3,12 +3,118 @@
 namespace App\Http\Controllers;
 
 use App\Services\WorkOrderProcessLogService;
-use App\WorkOrderProcessLog;
+use App\Services\WorkOrderService;
+use App\WorkOrder;
+use App\WorkOrderDetail;
 use Illuminate\Http\Request;
-use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Gate;
 
 class WorkOrderProcessLogController extends Controller
 {
 
+    private $service;
+    private $workOrderService;
+
+    public function __construct(WorkOrderProcessLogService $service,
+                                WorkOrderService $workOrderService)
+    {
+        $this->service = $service;
+        $this->workOrderService = $workOrderService;
+    }
+
+    public function storeApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-宝时编辑') ||
+            Gate::denies('订单管理-工单处理-承运商编辑')) {
+            return ['success' => false, 'message' => '没有对应的权限'];
+        }
+        if (!$request->has(['id', 'content'])) {
+            return ['success' => false, 'message' => '参数缺失'];
+        }
+
+        /** @var WorkOrder $workOrder */
+        $workOrder = WorkOrder::query()->where('status', '!=', 5)->find($request->id);
+        if (!$workOrder) {
+            return ['success' => false, 'message' => '找不到对应的工单,或对应的工单已完结'];
+        }
+        /** @var WorkOrderDetail $detail */
+        $detail = $workOrder->details()->where('order_issue_type_id', $workOrder->order_issue_type_id)
+            ->whereIn('status', [1, 2, 3, 4, 5])
+            ->orderByDesc('created_at')->first();
+        if (!$detail) {
+            return ['success' => false, 'message' => '工单当前没有待处理的项'];
+        }
+        $data = $this->service->createProcessLog($detail, $request->all());
+        return ['success' => true, 'data' => $data];
+    }
+
+    public function logisticApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-承运商编辑')) {
+            return ['success' => false, 'message' => '没有对应的权限'];
+        }
+        if (!$request->has(['id', 'content'])) {
+            return ['success' => false, 'message' => '参数缺失'];
+        }
+
+        /** @var WorkOrder $workOrder */
+        $workOrder = WorkOrder::query()->where('status', '!=', 5)->find($request->id);
+        if (!$workOrder) {
+            return ['success' => false, 'message' => '找不到对应的工单,或对应的工单已完结'];
+        }
+        /** @var WorkOrderDetail $detail */
+        $detail = $workOrder->details()->where('order_issue_type_id', $workOrder->order_issue_type_id)
+            ->whereIn('status', [1, 2, 3, 4, 5])
+            ->orderByDesc('created_at')->first();
+        if (!$detail) {
+            return ['success' => false, 'message' => '工单当前没有待处理的项'];
+        }
+        $data = $this->service->createProcessLog($detail, $request->all());
+        return ['success' => true, 'data' => $data];
+    }
+
+    public function baoShiStoreApi(Request $request): array
+    {
+
+        if (Gate::denies('订单管理-工单处理-承运商编辑')) {
+            return ['success' => false, 'message' => '没有对应的权限'];
+        }
+        if (!$request->has(['id', 'content'])) {
+            return ['success' => false, 'message' => '参数缺失'];
+        }
+
+        /** @var WorkOrder $workOrder */
+        $workOrder = WorkOrder::query()->where('status', '!=', 5)->find($request->id);
+        if (!$workOrder) {
+            return ['success' => false, 'message' => '找不到对应的工单,或对应的工单已完结'];
+        }
+        /** @var WorkOrderDetail $detail */
+        $detail = $workOrder->details()->where('order_issue_type_id', $workOrder->order_issue_type_id)
+            ->whereIn('status', [1, 2, 3, 4, 5])
+            ->orderByDesc('created_at')->first();
+        if (!$detail) {
+            return ['success' => false, 'message' => '工单当前没有待处理的项'];
+        }
+        $data = $this->service->createProcessLog($detail, $request->all());
+        return ['success' => true, 'data' => $data];
+    }
+
+
+    public function batchStoreApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-宝时编辑') ||
+            Gate::denies('订单管理-工单处理-承运商编辑')) {
+            return ['success' => false, 'message' => '没有对应的权限'];
+        }
+        if ($request->has(['ids', 'content'])) {
+            return ['success' => false, 'message' => '参数缺失'];
+        }
+        $workOrders = WorkOrder::query()->where('status', '!=', 5)->find($request->ids);
+        if (count($workOrders) < count($request->ids)) {
+            return ['success' => false, 'message' => '参数异常'];
+        }
+        $data = $this->service->batchCreateProcessLog($workOrders, $request->all());
+        return ['success' => true, 'data' => $data];
+    }
+
 }

+ 4 - 3
app/Services/WorkOrderCancelInterceptService.php

@@ -81,11 +81,12 @@ class WorkOrderCancelInterceptService extends WorkOrderService
         $this->detailService->updateDetail($detail, $params);
         $detail->change('宝时终审', $params['process_progress'], '承运商处理');
         $detail->workOrder->change('宝时终审', $params['process_progress'], '承运商处理');
-        $detail->workOrder->update([
-            'owner_tag' => 2,
+        $detail->workOrder()->update([
+            'owner_tag' => 0,
             'logistic_tag' => 0,
-            'bao_shi_tag' => 0
+            'bao_shi_tag' => 2,
         ]);
+        $this->syncOrderIssueProcessLogs($detail);
         $this->logService->createLog($detail, '处理', '承运商处理');
     }
 

+ 14 - 4
app/Services/WorkOrderDamageService.php

@@ -55,9 +55,9 @@ class WorkOrderDamageService extends WorkOrderService
         $workOrder = $this->createAndNotification($order, $issueType, $params['remark'] ?? '');
         $workOrder->change('承运商处理','商家创建','');
         $workOrder->update([
-            'owner_tag' => 3,
+            'logistic_tag' => 3,
+            'owner_tag' => 0,
             'bao_shi_tag' => 0,
-            'logistic_tag' => 0,
         ]);
         $detail = $this->detailService->createWorkOrderDetail($workOrder, $params);
         $detail->change('承运商处理','商家创建','');
@@ -88,7 +88,11 @@ class WorkOrderDamageService extends WorkOrderService
         $this->detailService->updateDetail($detail, $params);
         $detail->change('宝时终审', $params['process_progress'],'承运商处理');
         $detail->workOrder->change('宝时终审', $params['process_progress'],'承运商处理');
-        $detail->workOrder->clearWorkOrderStatus();
+        $detail->workOrder()->update([
+            'bao_shi_tag' => 2,
+            'logistic_tag' => 0,
+            'owner_tag' => 0,
+        ]);
         $this->logService->createLog($detail, '处理', '承运商处理');
     }
 
@@ -100,9 +104,15 @@ class WorkOrderDamageService extends WorkOrderService
     public function baoShiReview(WorkOrderDetail $detail, $params)
     {
         $this->detailService->updateDetail($detail, $params);
-        $this->logService->createLog($detail, '终审', '宝时终审');
         $detail->change('待货主完结', $params['process_progress'],'宝时终审');
         $detail->workOrder->change('待货主完结', $params['process_progress'],'宝时终审');
+        $detail->workOrder()->update([
+            'owner_tag' => 2,
+            'logistic_tag' => 0,
+            'bao_shi_tag' => 0,
+        ]);
+        $this->syncOrderIssueProcessLogs($detail);
+        $this->logService->createLog($detail, '终审', '宝时终审');
     }
 
 }

+ 2 - 2
app/Services/WorkOrderExpressAbnormalService.php

@@ -92,10 +92,9 @@ class WorkOrderExpressAbnormalService extends WorkOrderService
     public function logisticHandle(WorkOrderDetail $detail,$params)
     {
         $this->detailService->updateDetail($detail,$params);
-        $detail->workOrder->clearWorkOrderStatus();
         $detail->change('宝时终审',$params['process_progress'],'承运商处理');
         $detail->workOrder->change('宝时终审',$params['process_progress'],'承运商处理');
-        $detail->workOrder->update([
+        $detail->workOrder()->update([
             'bao_shi_tag' => 2,
             'owner_tag' => 0,
             'logistic_tag' => 0,
@@ -118,6 +117,7 @@ class WorkOrderExpressAbnormalService extends WorkOrderService
             'logistic_tag' => 0,
             'bao_shi_tag' => 0,
         ]);
+        $this->syncOrderIssueProcessLogs($detail);
         $this->logService->createLog($detail, '终审', '宝时终审');
     }
 

+ 3 - 2
app/Services/WorkOrderInformationChangeService.php

@@ -87,10 +87,10 @@ class WorkOrderInformationChangeService extends WorkOrderService
      */
     public function logisticHandler(WorkOrderDetail $detail, $params)
     {
+
         $detail->change('宝时终审', $params['process_progress'], '承运商处理');
         $detail->workOrder->change('宝时终审', $params['process_progress'], '承运商处理');
         $detail->cancelLogisticTagHandle();
-        $detail->workOrder->clearWorkOrderStatus();
         $detail->workOrder->update([
             'bao_shi_tag' => 2,
             'owner_tag' => 0,
@@ -118,7 +118,6 @@ class WorkOrderInformationChangeService extends WorkOrderService
      */
     public function baoShiReview(WorkOrderDetail $detail, $params)
     {
-        $this->logService->createLog($detail, '终审', '宝时终审');
         $detail->change('待货主完结', $params['process_progress'], '宝时终审');
         $detail->workOrder->change('待货主完结', $params['process_progress'], '宝时终审');
         $detail->workOrder->update([
@@ -126,6 +125,8 @@ class WorkOrderInformationChangeService extends WorkOrderService
             'bao_shi_tag' => 0,
             'logistic_tag' => 0,
         ]);
+        $this->syncOrderIssueProcessLogs($detail);
+        $this->logService->createLog($detail, '终审', '宝时终审');
     }
 
     /**

+ 6 - 6
app/Services/WorkOrderInterceptService.php

@@ -93,12 +93,11 @@ class WorkOrderInterceptService extends WorkOrderService
      */
     public function logisticHandler(WorkOrderDetail $detail, $params)
     {
-        $this->logService->createLog($detail, '处理', '承运商处理');
-        $detail->workOrder->clearWorkOrderStatus();                     // 清除创建标记
-        $detail->cancelLogisticTagHandle();
+        $detail->cancelLogisticTagHandle();         // 取消承运商处理标记
         $detail->change('宝时终审', $params['process_progress'], '承运商处理');
         $detail->workOrder->change('宝时终审', $params['process_progress'], '承运商处理');
-        $detail->workOrder->update(['logistic_tag' => 0, 'owner_tag' => 0, 'bao_shi_tag' => 2]);
+        $detail->workOrder()->update(['logistic_tag' => 0, 'owner_tag' => 0, 'bao_shi_tag' => 2]);
+        $this->logService->createLog($detail, '处理', '承运商处理');
     }
 
     /**
@@ -120,7 +119,6 @@ class WorkOrderInterceptService extends WorkOrderService
      */
     public function baoShiReviewIntercept(WorkOrderDetail $detail, $params)
     {
-        $this->logService->createLog($detail, '终审', '宝时终审');
         $detail->change('待货主完结', $params['process_progress'], '宝时终审');
         $detail->workOrder->change('待货主完结', $params['process_progress'], '宝时终审');
         $detail->workOrder->update([
@@ -128,6 +126,8 @@ class WorkOrderInterceptService extends WorkOrderService
             'owner_tag' => 2,
             'bao_shi_tag' => 0,
         ]);
+        $this->syncOrderIssueProcessLogs($detail);
+        $this->logService->createLog($detail, '终审', '宝时终审');
     }
 
     /**
@@ -153,10 +153,10 @@ class WorkOrderInterceptService extends WorkOrderService
         if ($workOrder->order_issue_type_id != $issueType->id) return;
         $detail = $workOrder->details()->where('order_issue_type_id', $issueType->id)->where('status', '宝时终审')->orderByDesc('created_at')->first();
         if (!$detail) return;
-        $this->logService->createLog($detail, '终审', '自动终审');
         $detail->change('待货主完结', '成功已退回,不赔偿', '宝时终审');
         $detail->workOrder->change('待货主完结', '成功已退回,不赔偿', '宝时终审');
         $detail->workOrder->update(['logistic_tag' => 0, 'owner_tag' => 2, 'bao_shi_tag' => 0]);
+        $this->logService->createLog($detail, '终审', '自动终审');
     }
 
 }

+ 2 - 2
app/Services/WorkOrderLossService.php

@@ -75,7 +75,6 @@ class WorkOrderLossService extends WorkOrderService
     public function ownerFillDetail(WorkOrderDetail $detail,$params)
     {
         $this->detailService->fillLossDetail($detail, $params);
-        $detail->workOrder->clearWorkOrderStatus();
         $detail->change('宝时终审','待终审','货主处理');
         $detail->workOrder->change('宝时终审','待终审','货主处理');
         $detail->workOrder->update([
@@ -93,7 +92,6 @@ class WorkOrderLossService extends WorkOrderService
      */
     public function baoShiReview(WorkOrderDetail $detail,$params)
     {
-        $this->logService->createLog($detail, '终审', '宝时终审');
         $this->detailService->updateLossDetail($detail,$params);
         $detail->change('待货主完结','终审完成',"宝时终审");
         $detail->workOrder->change('待货主完结','终审完成',"宝时终审");
@@ -102,5 +100,7 @@ class WorkOrderLossService extends WorkOrderService
             'logistic_tag' => 0,
             'bao_shi_tag' => 0,
         ]);
+        $this->syncOrderIssueProcessLogs($detail);
+        $this->logService->createLog($detail, '终审', '宝时终审');
     }
 }

+ 10 - 7
app/Services/WorkOrderMistakeService.php

@@ -54,14 +54,12 @@ 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->change('宝时处理', '商家创建', '');
         $workOrder->update([
-            'owner_tag' => 3,
+            'bao_shi_tag' => 3,
+            'owner_tag' => 0,
             'logistic_tag' => 0,
-            'bao_shi_tag' => 0,
         ]);
         $detail->change('宝时处理', '商家创建', '');
         $this->logService->createLog($detail, '创建', '商家创建');
@@ -90,7 +88,12 @@ class WorkOrderMistakeService extends WorkOrderService
         $this->detailService->updateDetail($detail, $params);
         $detail->change('货主处理', '已核实', '宝时处理');
         $detail->workOrder->change('货主处理', '已核实', '宝时处理');
-        $this->logService->createLog($detail, '处理', '承运商处理');
+        $detail->workOrder()->update([
+            'bao_shi_tag' => 0,
+            'owner_tag' => 2,
+            'logistic_tag' => 0,
+        ]);
+        $this->logService->createLog($detail, '处理', '宝时处理');
     }
 
     /**
@@ -119,7 +122,6 @@ class WorkOrderMistakeService extends WorkOrderService
     public function ownerEditReview(WorkOrderDetail $detail, $params)
     {
         $this->detailService->updateDetail($detail, $params);
-
         $detail->change('宝时终审', $params['process_progress'], '货主处理');
         $detail->workOrder->change('宝时终审', $params['process_progress'], '货主处理');
         $this->logService->createLog($detail, '处理', '货主编辑');
@@ -133,7 +135,6 @@ class WorkOrderMistakeService extends WorkOrderService
     public function baoShiReview($detail, $params)
     {
         $this->detailService->updateDetail($detail, $params);
-        $this->logService->createLog($detail, '终审', '宝时终审');
         $detail->change('待货主完结', $params['process_progress'], '宝时终审');
         $detail->workOrder->change('待货主完结', $params['process_progress'], '宝时终审');
         $detail->workOrder->update([
@@ -141,6 +142,8 @@ class WorkOrderMistakeService extends WorkOrderService
             'logistic_tag' => 0,
             'bao_shi_tag' => 0,
         ]);
+        $this->syncOrderIssueProcessLogs($detail);
+        $this->logService->createLog($detail, '终审', '宝时终审');
     }
 
 }

+ 58 - 78
app/Services/WorkOrderProcessLogService.php

@@ -2,101 +2,81 @@
 
 namespace App\Services;
 
+use App\OrderIssue;
 use App\Traits\ServiceAppAop;
-use App\WorkOrderProcessLog;
+use App\User;
+use App\WorkOrder;
+use App\WorkOrderDetail;
+use Illuminate\Database\Eloquent\Model;
 use Illuminate\Support\Facades\Auth;
 
 class WorkOrderProcessLogService
 {
     use ServiceAppAop;
 
-    protected $modelClass = WorkOrderProcessLog::class;
-
-    public function hasLogisticProcessLog($workOrderId): bool
+    /**
+     * 创建 处理日志
+     * @param WorkOrderDetail $detail
+     * @param $params
+     * @param User|null $user
+     * @return Model
+     */
+    public function createProcessLog(WorkOrderDetail $detail, $params,User $user = null): Model
     {
-        return WorkOrderProcessLog::query()
-            ->where('work_order_id', $workOrderId)
-            ->where('type', '2')->exists();
-    }
+        $user = $user ?? Auth::user();
+        $process_log = $detail->processLogs()->create([
+            'work_order_detail_id' => $detail->id,
+            'work_order_id' => $detail->work_order_id,
+            'content' => $params['content'],
+            'user_id' => Auth::id(),
+        ]);
 
-    public function hasBaoShiProcessLog($workOrderId): bool
-    {
-        return WorkOrderProcessLog::query()
-            ->where('work_order_id', $workOrderId)
-            ->where('type', '1')->exists();
-    }
+        /** @var WorkOrder $work_order */
+        $work_order = $detail->workOrder;
 
-    public function createLogisticProcessLog($params)
-    {
-        // 赔偿方  是否赔偿
-        if ($params['is_indemnity'] == 1) {  // 赔偿
-            $params = [
-                'work_order_id' => $params['work_order_id'],
-                'is_indemnity' => $params['is_indemnity'],
-                'indemnity' => $params['indemnity'],
-                'indemnitor' => 1,
-                'remark' => $params['remark'],
-                'type' => 2,
-            ];
-        } else if ($params['is_indemnity'] == 2){ // 不赔偿
-            $params = [
-                'work_order_id' => $params['work_order_id'],
-                'is_indemnity' => $params['is_indemnity'],
-                'remark' => $params['remark'],
-                'indemnitor' => 0,
-            ];
+        if (in_array($work_order->status,['宝时处理','宝时终审']) && $work_order->bao_shi_tag != 1){
+            $detail->workOrder()->whereIn('status',[1,4])->update(['bao_shi_tag' => 1]);
+        } else if (in_array($work_order->status,['承运商处理']) && $work_order->logistic_tag != 1){
+            $detail->workOrder()->where('status',3)->update(['logistic_tag' => 1]);
+        } else if (in_array($work_order->status,['货主处理','待货主完结']) && $work_order->owner_tag != 1){
+            $detail->workOrder()->whereIn('status',[2,6])->update(['owner_tag' => 1]);
         }
-
-        $params['creator_id'] = Auth::user()['id'];
-        $params['type'] = '2';
-        $log = WorkOrderProcessLog::query()->create($params);
-        $log->workOrder()->update(['work_order_status' => '3']);
-        $this->syncOrderIssueIndemnity($log);
-        $log->loadMissing('creator');
-        return $log;
+        $process_log->setAttribute('user',$user);
+        return $process_log;
     }
 
-    public function createBaoShiProcessLog($params)
+    /**
+     * 批量创建处理日志
+     * @param $workOrders
+     * @param $params
+     * @return array
+     */
+    public function batchCreateProcessLog($workOrders,$params): array
     {
-        if ($params['is_indemnity'] == 1){  // 赔偿
-            $params = [
-                'work_order_id' => $params['work_order_id'],
-                'is_indemnity' => $params['is_indemnity'],
-                'indemnitor' => $params['indemnitor'],
-                'indemnity' => $params['indemnity'],
-            ];
-        } else if ($params['is_indemnity'] == 2){ // 不赔偿
-            $params = [
-                'work_order_id' => $params['work_order_id'],
-                'is_indemnity' => $params['is_indemnity'],
-                'remark' => $params['remark'],
-                'indemnity' => $params['indemnity'],
-            ];
+        $user = Auth::user();
+        $process_logs = [];
+        foreach ($workOrders as $workOrder){
+            $detail = $workOrders->toBeProcessDetail();
+            $process_logs[] = $this->createProcessLog($detail,$params,$user);
         }
-        $params['creator_id'] = Auth::user()['id'];
-        $params['type'] = 1;
-        if ($params['is_indemnity'] == 2) $params['indemnity'] = 0;
-        $log = WorkOrderProcessLog::query()->create($params);
-        $this->syncOrderIssueIndemnity($log);
-        $log->loadMissing('creator');
-        return $log;
+        return $process_logs;
     }
 
-    public function syncOrderIssueIndemnity($log)
+    /**
+     * 将工单的处理结果同步到问题件的处理结果
+     * @param OrderIssue $orderIssue
+     * @param WorkOrderDetail $detail
+     */
+    public function syncOrderIssue(OrderIssue $orderIssue,WorkOrderDetail $detail)
     {
-        if ($log->is_indemnity == '否') return;
-        $orderIssue = $log->workOrder->orderIssue;
-        if ($log->isBaoShiLog()) {
-            if ($log->indemnitor == '宝时'){
-                if ($orderIssue->baoshi_indemnity_money) return ;
-                $orderIssue->update(['baoshi_indemnity_money'=>$log->indemnity]);
-            } else if ($log->indemnitor == '承运商'){
-                if ($orderIssue->logistic_indemnity_money) return ;
-                $orderIssue->update(['logistic_indemnity_money'=>$log->indemnity]);
-            }
-        } else if ($log->isLogisticLog()){
-            if ($orderIssue->logistic_indemnity_money) return ;
-            $orderIssue->update(['logistic_indemnity_money'=>$log->indemnity]);
-        }
+        $logs = $detail->processLogs()->where('status', '未同步')->get();
+        $orderIssue->logs()->insert($logs->map(function($log)use($orderIssue){
+            return [
+                'order_issue_id' => $orderIssue->id,
+                'context' => $log->context,
+                'user_id' => $log->user_id,
+                'create_at' => $log->created_at,
+            ];
+        })->toArray());
     }
 }

+ 61 - 31
app/Services/WorkOrderService.php

@@ -3,9 +3,11 @@
 namespace App\Services;
 
 use App\OrderIssue;
+use App\OrderIssueProcessLog;
 use App\OrderIssueRejectedBill;
 use App\OrderIssueType;
 use App\OrderPackage;
+use App\Traits\ModelLogChanging;
 use App\Traits\ServiceAppAop;
 use App\WorkOrder;
 use App\WorkOrderDetail;
@@ -17,14 +19,6 @@ class WorkOrderService
 
     protected $modelClass = WorkOrder::class;
 
-    /**
-     * @var WorkOrderLogService $logService
-     * @var WorkOrderImageService $imageService
-     * @var WorkOrderCommoditiesService $commoditiesService
-     * @var WorkOrderDetailService $detailService
-     * @var OrderIssueTypeService $issueTypeService
-     * @var OrderService $orderService
-     */
     private $logService;
     private $imageService;
     private $commoditiesService;
@@ -124,8 +118,9 @@ class WorkOrderService
      * 商家批量完结工单
      * @param $details
      */
-    public function ownerBatchEndWorkOrderDetails($details){
-        foreach ($details as $detail){
+    public function ownerBatchEndWorkOrderDetails($details)
+    {
+        foreach ($details as $detail) {
             $this->ownerEndWorkOrderDetail($detail);
         }
     }
@@ -273,16 +268,15 @@ class WorkOrderService
     public function logisticHandlerTag(WorkOrderDetail $detail)
     {
         $detail->logisticTagHandle();
-        app(WorkOrderLogService::class)->createLog($detail,'处理','处理中');
-        $last_status = $detail->last_status;
-        $detail->change('承运商处理','承运商处理中',$last_status);
-        $detail->workOrder->change('承运商处理','承运商处理中',$last_status);
-        if ($detail->workOrder->work_order_status === '1'){
-            $detail->workOrder->update([
-                'work_order_status' => 0,
-                'owner_tag' => 2,
+        app(WorkOrderLogService::class)->createLog($detail, '处理', '处理中');
+        $detail->change('承运商处理', '承运商处理中', $detail->last_status);
+        $detail->workOrder->change('承运商处理', '承运商处理中', $detail->last_status);
+        if ($detail->workOrder->work_order_status === '1') {
+            $detail->workOrder()->update([
+                'logistic_tag' => 1,
+                'owner_tag' => 0,
                 'bao_shi_tag' => 0,
-                'logistic_tag' => 0,
+                'work_order_status' => 0,
             ]);
         }
     }
@@ -290,39 +284,75 @@ class WorkOrderService
     public function syncWorkOrder($rejectedBill)
     {
         /** @var OrderIssue $order_issue */
-        $orderIssueRejectedBill = OrderIssueRejectedBill::query()->where('logistic_number_return',$rejectedBill['logistic_number_return'])->first();
+        $orderIssueRejectedBill = OrderIssueRejectedBill::query()->where('logistic_number_return', $rejectedBill['logistic_number_return'])->first();
         $order_issue = OrderIssue::query()->find($orderIssueRejectedBill->order_issue_id);
-        if (!$order_issue || $order_issue->rejecting_status !== '全部退回') return ;
+        if (!$order_issue || $order_issue->rejecting_status !== '全部退回') return;
         /** @var WorkOrderInterceptService $workOrderInterceptService */
         $workOrderInterceptService = app(WorkOrderInterceptService::class);
         /** @var WorkOrder $workOrder */
-        $workOrder = WorkOrder::query()->where('order_id',$order_issue->order_id)->orderByDesc('created_at')->first();
-        if (!$workOrder)return ;
+        $workOrder = WorkOrder::query()->where('order_id', $order_issue->order_id)->orderByDesc('created_at')->first();
+        if (!$workOrder) return;
         $workOrderInterceptService->autoReviewIntercept($workOrder);
     }
 
     /**
      * 每日工单定时任务timingTask
      */
-    public function timingTask(){
+    public function timingTask()
+    {
         $this->updateBaoShiHandlerTask();
         $this->updateLogisticHandlerTask();
     }
 
-    private function updateLogisticHandlerTask(){
+    private function updateLogisticHandlerTask()
+    {
         // 将当日承运商处理过 且 状态为`无`的 标记为滞留状态 `滞`
-        WorkOrder::query()->where('status',3)
-            ->where('logistic_tag',1)
+        WorkOrder::query()->where('status', 3)
+            ->where('logistic_tag', 1)
             ->update(['logistic_tag' => 2]);
     }
 
-    private function updateBaoShiHandlerTask(){
+    private function updateBaoShiHandlerTask()
+    {
         // 将当日宝时处理过 且 状态为`无`的 标记为滞留状态 `滞`
-        WorkOrder::query()->whereIn('status',[1,4])
-            ->where('bao_shi_tag',1)
+        WorkOrder::query()->whereIn('status', [1, 4])
+            ->where('bao_shi_tag', 1)
             ->update(['bao_shi_tag' => 2]);
     }
 
-
+    /**
+     * 同步处理日志到问题件
+     * @param WorkOrderDetail $detail
+     */
+    public function syncOrderIssueProcessLogs(WorkOrderDetail $detail)
+    {
+        /**
+         * @var OrderIssue $order_issue
+         * @var WorkOrder $work_order
+         */
+        $work_order = $detail->workOrder;
+        $order_issue = OrderIssue::query()->where('order_id', $work_order->order_id)->first();
+        if (!$order_issue) {
+            $order_issue = OrderIssue::query()->create([
+                'order_id' => $work_order->order_id,
+                'result_explain' => $work_order->remark,
+                '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) {
+            return [
+                'order_issue_id' => $order_issue->id,
+                'user_id' => $process_log->user_id,
+                'content' => $process_log->content,
+                'created_at' => $process_log->created_at,
+                'updated_at' => $process_log->updated_at,
+            ];
+        }))->toArray());
+        $detail->processLogs()->where('status', '未同步')->update(['status' => '同步']);
+    }
 
 }

+ 41 - 35
app/WorkOrder.php

@@ -13,7 +13,6 @@ use Illuminate\Database\Eloquent\Relations\HasMany;
 use Illuminate\Database\Eloquent\SoftDeletes;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Gate;
-use Illuminate\Support\Str;
 
 class WorkOrder extends Model
 {
@@ -30,13 +29,13 @@ class WorkOrder extends Model
         'last_handler_id',          // 上一个处理人
         'order_issue_type_id',      // 问题件类型
         'process_progress',         // 处理进度 -----------------------------------
-                                    // 拦截:       承运商->[已处理,已签收]         宝时审核->[`无法拦截`,`成功已退回,不赔偿`,`拦截在途丢件,赔偿`]
-                                    // 信息更改:    承运商->[已处理,无法更改]       宝时审核->[更改成功,更改失败]
-                                    // 快递异常:    承运商->[已处理,已拦截]         宝时审核->[丢件赔偿,签收成功]
-                                    // 错漏发:      宝时处理->[已核实]            商家处理->[补发,不补发]
-                                    // 破损:       承运商->[核实全部破损,核实部分破损,核实未破损]   宝时终审->[核实全部破损,核实部分破损,核实未破损]
-                                    // 快递丢件:    待商家处理   待终审 完结
-                                    // -----------------------------------
+        // 拦截:       承运商->[已处理,已签收]         宝时审核->[`无法拦截`,`成功已退回,不赔偿`,`拦截在途丢件,赔偿`]
+        // 信息更改:    承运商->[已处理,无法更改]       宝时审核->[更改成功,更改失败]
+        // 快递异常:    承运商->[已处理,已拦截]         宝时审核->[丢件赔偿,签收成功]
+        // 错漏发:      宝时处理->[已核实]            商家处理->[补发,不补发]
+        // 破损:       承运商->[核实全部破损,核实部分破损,核实未破损]   宝时终审->[核实全部破损,核实部分破损,核实未破损]
+        // 快递丢件:    待商家处理   待终审 完结
+        // -----------------------------------
         'type',                     // 快递异常填写:在途异常,签收未收到
         'status',                   // 审核状态
         'review_at',                // 审核时间
@@ -47,6 +46,7 @@ class WorkOrder extends Model
         'bao_shi_tag',              // 待宝时处理标记    0 为默认状态 1无 2 滞 3新
         'owner_tag',                // 待货主处理标记    0 为默认状态 1无 2 滞 3新
         "is_new_rejecting",         // 回库标记
+        'created_at',
     ];
 
     static public $enums = [
@@ -68,7 +68,7 @@ class WorkOrder extends Model
             '完成' => 5,
             '待货主完结' => 6,
         ],
-        'is_new_rejecting'=> [
+        'is_new_rejecting' => [
             '' => 0,
             '回库' => 1,
         ],
@@ -156,7 +156,7 @@ class WorkOrder extends Model
 
     public function lastHandler(): BelongsTo
     {
-        return $this->belongsTo(User::class,'last_handler_id');
+        return $this->belongsTo(User::class, 'last_handler_id');
     }
 
     // 审核人
@@ -195,21 +195,23 @@ class WorkOrder extends Model
 
     public function defaultWith(): array
     {
-        return  ['owner', 'logistic', 'issueType', 'creator', 'lastHandler','details' => function ($query) {
-            return $query->with('commodities.commodity', 'logs.creator', 'images.uploadFile','issueType');
+        return ['owner', 'logistic', 'issueType', 'creator', 'lastHandler', 'details' => function ($query) {
+            return $query->with(['commodities.commodity', 'logs.creator', 'images.uploadFile', 'issueType', 'processLogs' => function ($query) {
+                return $query->with('user')->orderByDesc('created_at');
+            }]);
         },
             'reviewer',
             'order.packages',
             'orderIssue' => function ($query) {
-            /** @var Builder $query */
-            $query->with(['issueType', 'logs' => function ($query) {
-                if (Gate::denies('订单管理-问题件-客户不可见')) {
-                    $query->with('user')->orderByDesc('created_at');
-                } else {
-                    $query->with('user')->where('tag', '=', 0)->orderByDesc('created_at');
-                }
-            }]);
-        }];
+                /** @var Builder $query */
+                $query->with(['issueType', 'logs' => function ($query) {
+                    if (Gate::denies('订单管理-问题件-客户不可见')) {
+                        $query->with('user')->orderByDesc('created_at');
+                    } else {
+                        $query->with('user')->where('tag', '=', 0)->orderByDesc('created_at');
+                    }
+                }]);
+            }];
     }
 
     public function loadDefaultWith()
@@ -238,7 +240,7 @@ class WorkOrder extends Model
     // 工单完结
     public function end()
     {
-        $this->update(['status' => 5,'work_order_status' => 0]);
+        $this->update(['status' => 5, 'work_order_status' => 0]);
     }
 
     /**
@@ -253,7 +255,8 @@ class WorkOrder extends Model
     /**
      * 处理进度
      */
-    public function changeProcessProgress($process_progress){
+    public function changeProcessProgress($process_progress)
+    {
         $this->update(['process_progress' => $process_progress]);
     }
 
@@ -263,27 +266,30 @@ class WorkOrder extends Model
      * @param $process_progress
      * @param $last_status
      */
-    public function change($status,$process_progress,$last_status){
-        $user = Auth::user();
+    public function change($status, $process_progress, $last_status)
+    {
         $this->last_status = $last_status;
         $this->status = $status;
         $this->process_progress = $process_progress;
-        $this->last_handler_id = $user['id'] ?? '';
+        $this->last_handler_id = Auth::id();
         $this->update();
     }
 
-    public function syncIntercept(){
-        if ($this->status === '完成') return ;
+    public function syncIntercept()
+    {
+        if ($this->status === '完成') return;
         /** @var WorkOrderDetail $detail */
-        $detail = $this->details()
-            ->where('order_issue_type_id',$this->order_issue_type_id)
-            ->where('status','!=','5')->where('status','!=',4)
+        $detail = $this->details()->where('order_issue_type_id', $this->order_issue_type_id)
+            ->whereIn('status', [1, 2, 3, 4, 5])
             ->orderByDesc('created_at')->first();
         if (!$detail) return;
         app(WorkOrderLogService::class)->createLog($detail, '终审', '自动终审');
-        $detail->change('待货主完结','成功已退回,不赔偿','宝时终审');
-        $this->change('待货主完结','成功已退回,不赔偿','宝时终审');
-        $this->clearWorkOrderStatus();
+        $detail->change('待货主完结', '成功已退回,不赔偿', '宝时终审');
+        $this->change('待货主完结', '成功已退回,不赔偿', '宝时终审');
+        $this->update([
+            'owner_tag' => 2,
+            'logistic_tag' => 0,
+            'bao_shi_tag' => 0,
+        ]);
     }
-
 }

+ 6 - 8
app/WorkOrderDetail.php

@@ -24,14 +24,7 @@ class WorkOrderDetail extends Model
         'last_handler_id',             // 上一个处理人
         'reissue_logistic_number',  // 补发单号
         'return_logistic_number',   // 退回单号 (错漏发:商家填写) (破损:创建时填写)
-        'process_progress',         // 处理进度 -----------------------------------
-        // 拦截:       承运商->[已处理,已签收]         宝时审核->[拦截成功,拦截失败]
-        // 信息更改:    承运商->[已处理,无法更改]       宝时审核->[更改成功,更改失败]
-        // 快递异常:    承运商->[已处理,已拦截]         宝时审核->[丢件赔偿,签收成功]
-        // 错漏发:      宝时处理->[已核实]            商家处理->[补发,不补发]
-        // 破损:       承运商->[核实全部破损,核实部分破损,核实未破损]   宝时终审->[核实全部破损,核实部分破损,核实未破损]
-        // 快递丢件:    待商家处理   待终审 完结
-        // -----------------------------------
+        'process_progress',         // 处理进度
         'logistic_number',          // 快递单号
         'status',                   // 当前状态
         'remark',                   // 创建工单时的问题标记
@@ -200,6 +193,11 @@ class WorkOrderDetail extends Model
         return $this->hasMany(WorkOrderCommodities::class);
     }
 
+    public function processLogs(): HasMany
+    {
+        return $this->hasMany(WorkOrderProcessLog::class,'work_order_detail_id','id');
+    }
+
     // 未完成历史标记
     public function undoneTag()
     {

+ 11 - 91
app/WorkOrderProcessLog.php

@@ -2,119 +2,39 @@
 
 namespace App;
 
+use App\Traits\ModelTimeFormat;
 use Illuminate\Database\Eloquent\Model;
 
-use App\Traits\ModelLogChanging;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
 
 
 
 class WorkOrderProcessLog extends Model
 {
-    use ModelLogChanging;
 
-    //
+    use ModelTimeFormat;
     protected $fillable = [
-        'work_order_id',  // 工单
-        'type',           // 处理类型 0 无 1宝时 2 承运商
-        'is_indemnity',   // 是否赔偿 0 无 1是 2否
-        'indemnitor',   // 赔偿人 0 无 1宝时 2承运商
-        'indemnity',      // 赔偿金
-        'creator_id',     // 创建人
-        'remark',         // 描述
+        'work_order_id',
+        'work_order_detail_id',
+        'user_id',
+        'content',
+        'status',
     ];
 
-    static public $enums = [
-        'type' => [
-            '' => 0,
-            '宝时' => 1,
-            '承运商' => 2,
-        ],
-        'is_indemnity' => [
-            '' => 0,
-            '是' => 1,
-            '否' => 2,
-        ],
-        'indemnitor'=> [
-            '' => 0,
-            '宝时' => 1,
-            '承运商' => 2,
-        ],
-    ];
-
-    function __construct(array $attributes = [])
-    {
-        foreach (self::$enums as &$enum) {
-            $enum = $enum + array_flip($enum);
-        }
-        parent::__construct($attributes);
-    }
-
-    public function getTypeAttribute($value)
-    {
-        if (!$value) return '';
-        return self::$enums['type'][$value];
-    }
-
-    public function setTypeAttribute($value)
-    {
-        if (!$value) return ;
-        if (is_numeric($value)) {
-            $this->attributes['type'] = $value;
-        } else {
-            $this->attributes['type'] = self::$enums['type'][$value];
-        }
-    }
-
-    public function getIsIndemnityAttribute($value)
-    {
-        if (!$value) return '';
-        return self::$enums['is_indemnity'][$value];
-    }
-
-    public function setIsIndemnityAttribute($value)
-    {
-        if (!$value) return ;
-        if (is_numeric($value)) {
-            $this->attributes['is_indemnity'] = $value;
-        } else {
-            $this->attributes['is_indemnity'] = self::$enums['is_indemnity'][$value];
-        }
-    }
-
-    public function getIndemnitorAttribute($value)
-    {
-        if (!$value) return '';
-        return self::$enums['indemnitor'][$value];
-    }
-
-    public function setIndemnitorAttribute($value)
-    {
-        if (!$value) return ;
-        if (is_numeric($value)) {
-            $this->attributes['indemnitor'] = $value;
-        } else {
-            $this->attributes['indemnitor'] = self::$enums['indemnitor'][$value];
-        }
-    }
 
     public function workOrder(): BelongsTo
     {
         return $this->belongsTo(WorkOrder::class);
     }
 
-    public function creator(): BelongsTo
+    public function workOrderDetail():BelongsTo
     {
-        return $this->belongsTo(User::class);
+        return $this->belongsTo(WorkOrderDetail::class);
     }
 
-    public function isLogisticLog(): bool
+    public function user(): BelongsTo
     {
-        return $this->type == "承运商";
+        return $this->belongsTo(User::class);
     }
 
-    public function isBaoShiLog(): bool
-    {
-        return $this->type == "宝时";
-    }
 }

+ 53 - 0
database/migrations/2022_01_07_150835_work_order_process_logs_edit_table.php

@@ -0,0 +1,53 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class WorkOrderProcessLogsEditTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('work_order_process_logs', function (Blueprint $table) {
+            $table->bigInteger('work_order_detail_id')->index()->comment('处理详情');
+            $table->string('content')->comment('处理内容');
+            $table->string('user_id')->index()->comment('用户id');
+            $table->enum('status' ,['未同步','同步'])->default('未同步')->comment('同步问题件处理详情标记');
+
+            $table->dropColumn('type');
+            $table->dropColumn('is_indemnity');
+            $table->dropColumn('indemnitor');
+            $table->dropColumn('indemnity');
+            $table->dropColumn('creator_id');
+            $table->dropColumn('remark');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('work_order_process_logs', function (Blueprint $table) {
+            $table->dropColumn('work_order_detail_id');
+            $table->dropColumn('context');
+            $table->dropColumn('user_id');
+            $table->dropColumn('status');
+
+//            $table->integer('work_order_id')->index()->comment('工单');
+            $table->tinyInteger('type')->index()->comment('类型 0无 1宝时 2承运商');
+            $table->tinyInteger('indemnitor')->index()->comment('赔偿方 0无 1宝时 2承运商');
+            $table->tinyInteger('is_indemnity')->comment('是否赔偿 0无 1是 2否');
+            $table->decimal('indemnity',11,3)->comment('赔偿金额');
+            $table->integer('creator_id')->comment('创建人');
+            $table->string('remark')->nullable()->comment('理由');
+        });
+    }
+}

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

@@ -1,32 +0,0 @@
-<?php
-
-use Illuminate\Database\Migrations\Migration;
-use Illuminate\Database\Schema\Blueprint;
-use Illuminate\Support\Facades\Schema;
-
-class WorkOrderProcessLogsEidtTable extends Migration
-{
-    /**
-     * Run the migrations.
-     *
-     * @return void
-     */
-    public function up()
-    {
-        Schema::table('work_order_process_logs', function (Blueprint $table) {
-            //
-        });
-    }
-
-    /**
-     * Reverse the migrations.
-     *
-     * @return void
-     */
-    public function down()
-    {
-        Schema::table('work_order_process_logs', function (Blueprint $table) {
-            //
-        });
-    }
-}

+ 16 - 76
resources/views/order/workOrder/_edit_process_log.blade.php

@@ -1,77 +1,17 @@
-<div class="modal fade " id="work-order-process-log-modal" tabindex="-1" role="dialog" aria-labelledby="checkModalLabel"
-     aria-hidden="true">
-    <div class="modal-dialog modal-lg modal-dialog-centered">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title" id="checkModalLabel">@{{ processLog.type === '1' ? '宝时处理' : '承运商处理' }}</h5>
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">&times;</span>
-                </button>
-            </div>
-            <div class="modal-body">
-                {{--是否赔偿--}}
-                <div class="form-group row">
-                    <label for="work-order-logistic-number" class="text-primary col-sm-2 col-form-label text-right">是否赔偿</label>
-                    <div class="col-sm-10">
-                        <div class="custom-control custom-radio">
-                            <input type="radio" id="is-indemnity-yes" name="isIndemnity" class="custom-control-input"
-                                   value="1"
-                                   v-model="processLog['is_indemnity']">
-                            <label class="custom-control-label" for="is-indemnity-yes">赔偿</label>
-                        </div>
-                        <div class="custom-control custom-radio">
-                            <input type="radio" id="is-indemnity-no" name="isIndemnity" class="custom-control-input"
-                                   value="2"
-                                   v-model="processLog['is_indemnity']">
-                            <label class="custom-control-label" for="is-indemnity-no">不赔偿</label>
-                        </div>
-                    </div>
-                </div>
-                {{-- 宝时处理 确认赔偿方 --}}
-                <div class="form-group row" v-show="processLog['is_indemnity'] === '1' &&  processLog.type === 1">
-                    <label for="process-log-indemnity" class="text-primary col-sm-2 col-form-label text-right">赔偿方</label>
-                    <div class="col-sm-10">
-                        <div class="custom-control custom-radio">
-                            <input type="radio" id="indemnitor-baoshi" name="indemnitor" class="custom-control-input"
-                                   value="1"
-                                   v-model="processLog['indemnitor']">
-                            <label class="custom-control-label" for="indemnitor-baoshi">宝时</label>
-                        </div>
-                        <div class="custom-control custom-radio">
-                            <input type="radio" id="indemnitor-logistic" name="indemnitor" class="custom-control-input"
-                                   value="2"
-                                   v-model="processLog['indemnitor']">
-                            <label class="custom-control-label" for="indemnitor-logistic">承运商</label>
-                        </div>
-                    </div>
-                </div>
-                {{--描述--}}
-                <div class="form-group row" v-show="processLog['is_indemnity'] === '2'">
-                    <label for="process-log-remark" class="text-primary col-sm-2 col-form-label text-right ">理由</label>
-                    <div class="col-sm-10">
-                        <textarea name="process-log-remark" id="process-log-remark" cols="30" rows="5" class="form-control"
-                                  v-model="processLog.remark" ref="process-log-remark"></textarea>
-                    </div>
-                </div>
-                {{--赔偿金额--}}
-                <div class="form-group row" v-show="processLog['is_indemnity'] === '1'">
-                    <label for="process-log-indemnity" class="text-primary col-sm-2 col-form-label text-right">赔偿金额</label>
-                    <div class="col-sm-10">
-                        <input type="number" id="process-log-indemnity" class="form-control"
-                               v-model="processLog.indemnity" placeholder="赔偿金额" ref="process-log-indemnity">
-                    </div>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭
-                </button>
-
-                {{--填充工单--}}
-                {{--宝时--}}
-                <button type="button" class="btn btn-outline-primary"   v-show="processLog['type'] === 1" @click="storeProcessLog">提交</button>
-                {{--承运商--}}
-                <button type="button" class="btn btn-outline-primary"   v-show="processLog['type'] === 2" @click="storeLogisticProcessLog">提交</button>
-            </div>
-        </div>
+<el-dialog :visible.sync="dialogProcessLogVisible" width="75%">
+    <div slot="title">
+        处理日志
     </div>
-</div>
+    <div class="form-group row">
+        <label class="col-sm-2 col-form-label text-right text-primary">
+            处理日志
+        </label>
+        <textarea class="form-control col-sm-10" rows="3" v-model="processLogs.content"></textarea>
+    </div>
+    <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogProcessLogVisible = false">关 闭</el-button>
+        <el-button type="primary" @click="storeProcessLog">
+            提交
+        </el-button>
+    </div>
+</el-dialog>

+ 67 - 0
resources/views/order/workOrder/_process_logs.blade.php

@@ -0,0 +1,67 @@
+<div>
+    @can('订单管理-工单处理-承运商编辑')
+    <div class="add-btn"
+         style="position: absolute;display: none;margin-top: -35px;z-index: 51"
+         :id="'AddProcessLogBtn'+item.pending_detail.id">
+        <button type="button" class="btn btn-primary"
+                @click="showAddDiv('addWorkOrderProcessLogForm'+item.pending_detail.id)">新
+        </button>
+    </div>
+
+    <div class="addLogDiv row m-0 p-0 form-group" style="display: none;"
+         :id="'addWorkOrderProcessLogForm'+item.pending_detail.id">
+        <input type="hidden" name="id" :value="item.pending_detail.id">
+        <div style="width: 45px"></div>
+        <div class="form-inline m-2">
+            <input type="text" name="content" :id="'addWorkOrderProcessLogFormInput_'+item.pending_detail.id"
+                   class="form-control m-0 p-0"
+                   style="width: 275px"
+                   required>
+            <button type="button"
+                    class="btn btn-primary ml-2 m-0 p-0"
+                    style="width: 50px"
+                    @click="formStoreProcessLog(item.pending_detail.id,item.id)">添加
+            </button>
+        </div>
+    </div>
+    @endcan
+    <template class="p-0 m-0" v-if="item.process_logs.length > 0">
+        <table class="table table-sm p-0 m-0 " :id="'logs'+item.pending_detail.id">
+            <tr class="align-center position-static"
+                v-for="(log,logIndex) in item.process_logs"
+                @click="removeFocusing($event)" v-on:mouseover="showDelBtn($event)"
+                v-on:mouseleave="hideDelBtn($event)">
+                <template v-if="logIndex < 2|| item.log_is_show === true">
+                    <td style="max-width: 175px;min-width: 175px;">
+                        <span v-text="log.content"></span>
+                    </td>
+                    <td class="text-muted" style="max-width: 55px;min-width: 55px;">
+                        <span v-if="log.user" v-text="log.user.name"></span>
+                    </td>
+                    <td class="text-muted" style="max-width: 95px;min-width: 95px;">
+                        <span v-text="log.created_at"></span>
+                    </td>
+                    @can('订单管理-工单处理-承运商编辑')
+                    <td style="max-width: 35px;min-width: 35px;" class="m-0 p-0 border-0">
+                        <button type="button"
+                                class="btn btn-sm btn-outline-danger m-0 del-btn invisible"
+                                @click="orderIssueVue.destroyLog(log,item.process_logs,logIndex)">
+                            删
+                        </button>
+                    </td>
+                    @endcan
+                </template>
+            </tr>
+        </table>
+        <div class="d-flex justify-content-center">
+            <button type="button" class="btn btn-sm btn-outline-primary align-middle mt-1 center-block"
+                    v-if="item.process_logs.length > 2"
+                    @click="toggleWorkOrderLogs(item,$event)"
+                    v-text="'记录共'+item.process_logs.length +'条,点击展开'"></button>
+        </div>
+
+    </template>
+    <div v-else class="" style="height:50px">
+    </div>
+</div>
+

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

@@ -347,7 +347,7 @@
                 </template>
             </template>
 
-            <template v-else-if="'完成' === showWorkOrder.status">
+            <template v-else-if="['待货主完结','完成'].includes(showWorkOrder.status)">
                 <div class="form-group row">
                     <table class="table table-sm table-bordered">
                         <thead>

+ 188 - 61
resources/views/order/workOrder/index.blade.php

@@ -6,7 +6,6 @@
 
 @section("content")
     <div class="container-fluid d-none" id="list">
-
         <div>
             <div class="">
                 <div id="form_div" style="min-width: 1220px;"></div>
@@ -21,18 +20,16 @@
                             class="ml-1 btn btn-outline-primary btn-sm  "
                             @click="exportText()">导出文本
                     </button>
-
                     <button type="button"
                             class="ml-1 btn btn-outline-dark btn-sm"
                             @click="copyLogisticNumber()" style="background: #dad7e8;">批量复制单号
                     </button>
-
-                        @can('订单管理-工单处理-宝时编辑')
-                            <button type="button"
-                                    class="ml-1 btn btn-outline-dark btn-sm"
-                                    @click="baoShiBatchHandler">宝时批量处理
-                            </button>
-                        @endcan
+                    @can('订单管理-工单处理-宝时编辑')
+                        <button type="button"
+                                class="ml-1 btn btn-outline-primary btn-sm"
+                                @click="baoShiBatchHandler">宝时批量处理
+                        </button>
+                    @endcan
                     @can('订单管理-问题件-编辑')
                         <button type="button"
                                 class="ml-1 btn btn-outline-dark btn-sm"
@@ -42,13 +39,13 @@
 
                     @can('订单管理-工单处理-货主编辑')
                         <button type="button"
-                                class="ml-1 btn btn-outline-dark btn-sm"
+                                class="ml-1 btn btn-outline-success btn-sm"
                                 @click="batchEndWorkOrder">商家批量完结
                         </button>
                     @endcan
                     @can('订单管理-工单处理-承运商编辑')
                         <button type="button"
-                                class="ml-1 btn btn-outline-dark btn-sm"
+                                class="ml-1 btn btn-outline-info btn-sm"
                                 @click="logisticBatchHandler">承运商批量处理
                         </button>
                     @endcan
@@ -61,18 +58,18 @@
                             <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="isNewProcessedWorkOrder(item)" class="badge text-white bg-primary">
-                                        
-                                    </span>
-
-                                    <span v-show="isLogisticHandler(item)" class="badge badge-success">
-                                    
-                                    </span>
-
-                                    <span v-show="item.is_new_rejecting ==='回库'" class="badge badge-danger">
-                                        退
-                                    </span>
+                                    <span v-show="isNewWorkOrder(item)" class="badge text-white bg-primary">新</span>
+                                    @can( '订单管理-工单处理-宝时编辑')
+                                        <span v-show="isStrandWorkOrder(item)"
+                                              class="badge badge-danger bg-warning text-break"
+                                              @click="showStoreProcessLog(item,i)">滞</span>
+                                        @elsecan('订单管理-工单处理-承运商编辑')
+                                    @else
+                                        <span v-show="isStrandWorkOrder(item)"
+                                              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>
                                 </td>
                                 <td>
                                     <span v-text="item.id"></span>
@@ -80,7 +77,6 @@
                                     <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>
@@ -137,8 +133,6 @@
                                             重新编辑
                                         </button>
                                         <br v-show="canLogisticEdit(item)">
-
-
                                         <button
                                             class="btn btn-sm"
                                             style="background-color:#d96a46;color: #FFFFFF;border-color: #e55c2d"
@@ -191,6 +185,11 @@
                                 <td v-text="item.logistic ? item.logistic.name : ''"></td>
                                 <td v-text="item.creator ? item.creator.name : ''"></td>
                                 <td v-text="item.result_explain ? item.result_explain: item.remark"></td>
+                                <td class="log-td"
+                                    v-on:mouseover="showAddBtn($event)"
+                                    v-on:mouseleave="hideAddBtn($event)">
+                                    @include('order.workOrder._process_logs')
+                                </td>
                                 @can('订单管理-工单处理-宝时编辑')
                                     <td class="log-td" colspan=""
                                         v-on:mouseover="showAddBtn($event)"
@@ -241,6 +240,7 @@
         @include('order.workOrder._owner_fill_work_order_modal')
         @include('order.workOrder._batch_edit_work_order')
         @include('order.workOrder._edit_order_issue_log')
+        @include('order.workOrder._edit_process_log')
     </div>
 @endsection()
 
@@ -430,7 +430,6 @@
                     return_address: null,
                     return_phone: null,
                     process_progress: null,
-                    type: null,
                 },
                 selectTr: null,                 // table 行
                 selectDetailId: null,           // 详情
@@ -450,16 +449,24 @@
                 dialogEditLogisticVisible: false,            // 承运商编辑
                 dialogLogisticBatchHandlerVisible: false,    // 承运商批量处理
                 dialogShowOrderWorkVisible: false,           // 工单详情
-                 dialogBatchEditOrderIssueLogVisible: false,  // 问题件日志
-                batchEditWorkOrder: {
-                    TypeName: '',
-                    process_progress: '',
-                },
+                dialogBatchEditOrderIssueLogVisible: false,  // 问题件日志
+                dialogProcessLogVisible: false,              // 工单处理日志
+
+                showProcessLogId: null,         // workOrder->id
+                showAddDetailProcessLog: null,        // workOrderDetail->ids
+                showAddProcessLogFrom:null,     //
+                showAddProcessLogBtn:null,
+
                 batchHandlerWorkOrder: {
                     issue_type_name: '',
                     process_progress: '',
                     prev_process_progress: '',
                 },
+                processLogs: {
+                    select_id: '',
+                    select_index: '',
+                    content: '',
+                }
             },
             computed: {},
             mounted() {
@@ -562,7 +569,14 @@
                                     required_without_all_if: ['created_at_start', 'created_at_end']
                                 }
                             }
-                        }]
+                        }],
+                    },
+                    {name:'tags',type:'select',placeholder: '`新`,`滞`,`无`标签筛选',
+                        data: [
+                            {name:3, value:'新'},
+                            {name:2, value:'滞'},
+                            {name:1, value:'无'},
+                        ],
                     },
                 ]];
                 this.form = new query({
@@ -584,6 +598,7 @@
                     {name: 'logistic', value: '承运商'},
                     {name: 'creator', value: '创建人'},
                     {name: 'remark', value: '情况说明'},
+                    {name: 'process_logs', value: '处理日志'},
                         @can('订单管理-工单处理-宝时编辑')
                     {
                         name: 'order_issue_log', value: '处理结果'
@@ -758,6 +773,15 @@
                         $(e.target).text("记录共" + orderIssue.logs.length + "条,点击展开");
                     }
                 },
+                toggleWorkOrderLogs(item,e,index){
+                    if (item.log_is_show === false) {
+                        item.log_is_show = true;
+                        $(e.target).text('点击收起');
+                    } else {
+                        item.log_is_show = false;
+                        $(e.target).text("记录共" + item.process_logs.length + "条,点击展开");
+                    }
+                },
                 sortOrder(workOrder) {
                     workOrder.last_handler_name = workOrder.last_handler ? workOrder.last_handler.name : '';
                     workOrder.detail_infos = this.groupDetails(workOrder);                          // 工单详情
@@ -773,6 +797,8 @@
                     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;
                 },
                 groupPendingDetail(workOrder) {
                     let details = workOrder.details.filter(item => {
@@ -799,6 +825,7 @@
                         return_name: detail ? detail.return_name : '',
                         images: detail ? detail.images : '',
                         logistic_handle_tag: detail ? detail.logistic_handle_tag : '',
+                        process_logs: detail ? detail.process_logs : ''
                     };
                 },
                 groupCommodities(workOrder, isCurrent = true) {
@@ -905,6 +932,12 @@
                     }
                     return new Array(...logistic_numbers);
                 },
+                groupProcess_logs(pending_detail) {
+                    return pending_detail.process_logs ? pending_detail.process_logs.map(e => {
+                        e.log_is_show = false;
+                        return e;
+                    }) : [];
+                },
                 createOrderIssue(item, tag) { // 生成问题件
                     let url = '{{route('workOrder.buildOrderIssueApi')}}';
                     let data = {};
@@ -2587,8 +2620,9 @@
                             this.successTempTip('完结成功');
                             item.status = "完成";
                             item.owner_tag = "";
-                            this.$delete(this.workOrders,index);
-                            $("input:checkbox[name='checkData']").attr('checked',false);
+                            this.$delete(this.workOrders, index);
+                            $("input:checkbox[name='checkData']").attr('checked', false);
+                            checkData = [];
                         } else {
                             this.errorTempTip(res.data.message ? res.data.message : '完结工单异常');
                         }
@@ -2760,24 +2794,25 @@
                     item.store_in_amount = Number(item.amount) - Number(item.bao_shi_check_amount);
                 },
                 isNewWorkOrder(item) {
-                    let {work_order_status} = item;
-                    return work_order_status === '1';
-                },
-                isNewProcessedWorkOrder(item) {
-                    let logistic = @can('订单管理-工单处理-承运商编辑') true
-                    @else false @endcan;
-                    let owner = @can('订单管理-工单处理-货主编辑')  true
-                    @else false @endcan;
-                    let baoShi = @can('订单管理-工单处理-客服编辑') true
-                    @else false @endcan;
                     let {logistic_tag, bao_shi_tag, owner_tag} = item;
-                    if (logistic && logistic_tag === '1') {
-                        let logistic_handle_tag = item.pending_detail ? item.pending_detail.logistic_handle_tag : '';
-                        if ('承运商处理中' === logistic_handle_tag) return false;
-                        return '取消标记' !== logistic_handle_tag;
+                    if (this.isBaoShi) {
+                        return `${bao_shi_tag}` === '3'
+                    } else if (this.isLogistic) {
+                        return `${logistic_tag}` === '3';
+                    } else if (this.isOwner) {
+                        return `${owner_tag}` === '3';
+                    }
+                    return false;
+                },
+                isStrandWorkOrder(item) {
+                    let {logistic_tag, bao_shi_tag, owner_tag} = item;
+                    if (this.isBaoShi) {
+                        return `${bao_shi_tag}` === '2'
+                    } else if (this.isLogistic) {
+                        return `${logistic_tag}` === '2';
+                    } else if (this.isOwner) {
+                        return `${owner_tag}` === '2';
                     }
-                    if (owner && owner_tag === '1') return true;
-                    if (baoShi && bao_shi_tag === '1') return true;
                     return false;
                 },
                 // 问题件批处理日志
@@ -2811,7 +2846,6 @@
                                         }
                                     }
                                 })
-
                             });
                             this.successTempTip('处理完成');
                             this.dialogBatchEditOrderIssueLogVisible = false;
@@ -2863,7 +2897,7 @@
                                     this.$delete(this.workOrders, index);
                                 }
                             });
-                            $("input:checkbox[name='checkData']").attr('checked',false);
+                            $("input:checkbox[name='checkData']").attr('checked', false);
                             checkData = [];
                         } else {
                             this.errorTempTip(res.data.message);
@@ -2880,7 +2914,6 @@
                     let item = items.find(e => e);
                     return item.status;
                 },
-
                 // 承运商批量处理
                 checkDataIsSingleStatus(items) { //校验items内的status是否相同
                     let status = this.getItemsStatus(items)
@@ -2914,9 +2947,9 @@
                     if (!this.checkDataHasSize()) return;
                     let selected_items = this.getSelectedWorkOrders();
                     let issue_type_name = this.getItemsIssueTypeName(selected_items);
-                    if (!['拦截','取消拦截','信息更改'].includes(issue_type_name)){
+                    if (!['拦截', '取消拦截', '信息更改'].includes(issue_type_name)) {
                         this.errorTempTip('批量处理只支持`拦截`,`取消拦截`,`信息更改`');
-                        return ;
+                        return;
                     }
                     if (!this.checkDataIsSingleIssueType(selected_items)) return;
                     if (!this.checkDataIsSingleStatus(selected_items)) return;
@@ -3004,9 +3037,9 @@
                     if (!this.checkDataHasSize()) return;
                     let selected_items = this.getSelectedWorkOrders();
                     let issue_type_name = this.getItemsIssueTypeName(selected_items);
-                    if (!['拦截','取消拦截','信息更改'].includes(issue_type_name)){
+                    if (!['拦截', '取消拦截', '信息更改'].includes(issue_type_name)) {
                         this.errorTempTip('批量处理只支持`拦截`,`取消拦截`,`信息更改`');
-                        return ;
+                        return;
                     }
                     let prev_process_progress = this.getPrevProcessProgress(selected_items);
                     if (!this.checkDataIsBaoShiHandler(selected_items)) return;
@@ -3070,6 +3103,8 @@
                             this.successTempTip('修改成功');
                             this.replaceWorkOrder(res.data.data);
                             this.dialogBaoShiBatchHandlerVisible = false;
+                            $("input:checkbox[name='checkData']").attr('checked', false);
+                            checkData = [];
                             return;
                         }
                         this.errorTempTip(res.data.message ? res.data.message : '处理异常刷新后重试');
@@ -3086,9 +3121,9 @@
                             filed: ['无法拦截'],
                         },
                     }, {
-                        name: '信息更改', options: {success: ['更改成功'],filed: ['更改失败'],},
+                        name: '信息更改', options: {success: ['更改成功'], filed: ['更改失败'],},
                     }, {
-                        name:'取消拦截' ,options:['已签收','已退回'],
+                        name: '取消拦截', options: ['已签收', '已退回'],
                     }];
                     let processProgressObj = editWorkOrderProcessProgressObj.find(e => issue_type_name === e.name);
                     let {options, name} = processProgressObj;
@@ -3104,8 +3139,100 @@
                     }
                     return option;
                 },
-            },
+                showStoreProcessLog(item, index) {
+                    this.dialogProcessLogVisible = true;
+                    this.processLogs.select_id = item.id;
+                    this.processLogs.select_index = index;
+                },
+                formStoreProcessLog(work_order_detail_id,worK_order_id){
+                    let url = "{{route('workOrder.processLog.storeApi')}}";
+                    let data = {
+                        id: worK_order_id,
+                        content: document.getElementById('addWorkOrderProcessLogFormInput_' + work_order_detail_id).value,
+                    };
+                    this.waitingTempTip('处理中');
+                    window.axios.post(url, data).then(res => {
+                        window.tempTip.cancelWaitingTip();
+                        if (res.data.success) {
+                            this.pushProcessLog(res.data.data);
+                            this.successTempTip('处理完成');
+                            this.showAddDiv('addWorkOrderProcessLogForm'+work_order_detail_id);
+                            this.$forceUpdate();
+                            return;
+                        }
+                        this.errorTempTip(res.data.message ? res.data.message : '处理出现异常,请刷新页面重试');
+                    }).catch(err => {
+                        window.tempTip.cancelWaitingTip();
+                        this.errorTempTip(err);
+                    })
+                },
+                storeProcessLog() {
+                    let url = "{{route('workOrder.processLog.storeApi')}}";
+                    let {select_id, select_index, content} = this.processLogs;
+                    let data = {
+                        id: select_id,
+                        content: content,
+                    };
+                    this.waitingTempTip('处理中');
+                    window.axios.post(url, data).then(res => {
+                        window.tempTip.cancelWaitingTip();
+                        if (res.data.success) {
+                            this.pushProcessLog(res.data.data);
+                            this.successTempTip('处理完成');
+                            if (this.dialogProcessLogVisible)this.dialogProcessLogVisible = false;
 
+                            return;
+                        }
+                        this.errorTempTip(res.data.message ? res.data.message : '处理出现异常,请刷新页面重试');
+                    }).catch(err => {
+                        window.tempTip.cancelWaitingTip();
+                        this.errorTempTip(err);
+                    })
+                },
+                batchStoreProcessLogs() {
+                    let url = "{{route('workOrder.processLog.batchStore')}}}";
+                    let data = {
+                        ids: checkData,
+                        content: this.processLogs.content,
+                    };
+                    this.waitingTempTip('处理中');
+                    window.axios.post(url, data).then(res => {
+                        window.tempTip.cancelWaitingTip();
+                        if (res.data.success) {
+                            this.pushProcessLogs(res.data.data);
+                            window.tempTip.successTempTip('处理完成')
+                            this.dialogProcessLogVisible = false;
+                            return;
+                        }
+                        this.errorTempTip(res.data.message ? res.data.message : '处理出现异常,请刷新页面重试');
+                    }).catch(err => {
+                        window.tempTip.cancelWaitingTip();
+                        this.errorTempTip(err);
+                    })
+                },
+                pushProcessLogs(process_logs) {
+                    process_logs.forEach(e => {
+                        this.pushProcessLog(e)
+                    });
+                    this.$forceUpdate();
+                },
+                pushProcessLog(process_log) {
+                    let {work_order_detail_id} = process_log;
+                    this.workOrders.forEach((e, index) => {
+                        let has = e.details.filter(detail => `${detail.id}` === `${work_order_detail_id}`).length > 0;
+                        if (has) {
+                            this.workOrders[index]['process_logs'].unshift(process_log);
+                            if (this.isBaoShi) {
+                                 this.workOrders[index]['bao_shi_tag'] = '1'
+                            } else if (this.isLogistic) {
+                                 this.workOrders[index]['logistic_tag'] = '1';
+                            } else if (this.isOwner) {
+                                 this.workOrders[index]['owner_tag'] = '1';
+                            }
+                        }
+                    });
+                },
+            },
         });
     </script>
 @endsection

+ 6 - 2
routes/apiLocal.php

@@ -340,9 +340,13 @@ Route::prefix('workOrder')->group(function(){
         Route::post('owner/handler','WorkOrderMistakeController@ownerHandleApi')->name('workOrder.mistake.owner.handlerApi');                   // 商家处理并完结订单
         Route::post('edit/owner/end','WorkOrderMistakeController@ownerEndEditApi')->name('workOrder.mistake.logistic.end.handlerApi');          // 承运商处理
         Route::post('review/baoShi','WorkOrderMistakeController@baoShiReviewApi')->name('workOrder.mistake.baoShi.reviewApi');                  // 宝时处理
-
     });
-
+    Route::prefix('processLog')->group(function(){ // 处理日志
+        Route::post('/store','WorkOrderProcessLogController@storeApi')->name('workOrder.processLog.storeApi');
+        Route::post('/store/logistic','WorkOrderProcessLogController@logisticStoreApi')->name('workOrder.processLog.logisticStoreApi');
+        Route::post('/store/baoShi','WorkOrderProcessLogController@baoShiStoreApi')->name('workOrder.processLog.baoShiStoreApi');
+        Route::post('/batchStore','WorkOrderProcessLogController@batchStoreApi')->name('workOrder.processLog.batchStore');
+    });
 
     Route::post('updateIssueType','WorkOrderController@updateIssueTypeApi')->name('workOrder.updateIssueTypeApi');                // 修改问题类型
     Route::post('batchUpdateIssueType','WorkOrderController@batchUpdateIssueTypeApi')->name('workOrder.batchUpdateIssueTypeApi'); // 修改问题类型