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

Merge branch 'master' into yang

ANG YU 4 лет назад
Родитель
Сommit
fdef0c444c
55 измененных файлов с 3229 добавлено и 1463 удалено
  1. 14 0
      app/Console/Commands/stubs/model.stub
  2. 15 0
      app/Console/Commands/stubs/test.controller.stub
  3. 37 0
      app/Console/Commands/stubs/test.service.stub
  4. 27 0
      app/DepartmentObligationOwner.php
  5. 96 78
      app/Filters/WorkOrderFilters.php
  6. 17 2
      app/Http/Controllers/CustomerController.php
  7. 0 1
      app/Http/Controllers/DeliveryAppointmentController.php
  8. 18 2
      app/Http/Controllers/OrderPackageCommoditiesController.php
  9. 60 88
      app/Http/Controllers/TestController.php
  10. 319 67
      app/Http/Controllers/WorkOrderController.php
  11. 85 0
      app/Http/Controllers/WorkOrderLogController.php
  12. 21 3
      app/Http/Requests/WorkOrder/WorkOrderRequest.php
  13. 21 0
      app/Obligation.php
  14. 7 0
      app/Owner.php
  15. 7 1
      app/Providers/AppServiceProvider.php
  16. 8 1
      app/Services/DeliveryAppointmentService.php
  17. 114 0
      app/Services/ObligationService.php
  18. 12 0
      app/Services/OrderIssueTypeService.php
  19. 5 3
      app/Services/OrderPackageCommoditiesService.php
  20. 39 47
      app/Services/OrderPackageService.php
  21. 1 1
      app/Services/OrderService.php
  22. 60 4
      app/Services/OwnerService.php
  23. 12 5
      app/Services/StoreItemService.php
  24. 30 4
      app/Services/WorkOrderCommoditiesService.php
  25. 34 24
      app/Services/WorkOrderImageService.php
  26. 28 0
      app/Services/WorkOrderLogService.php
  27. 174 51
      app/Services/WorkOrderService.php
  28. 125 156
      app/WorkOrder.php
  29. 7 2
      app/WorkOrderCommodities.php
  30. 1 1
      app/WorkOrderImage.php
  31. 60 0
      app/WorkOrderLog.php
  32. 101 156
      composer.lock
  33. 12 0
      database/factories/WorkOrderLogFactory.php
  34. 32 0
      database/migrations/2021_10_26_132735_work_orders_add_colunms_logistic_id.php
  35. 43 0
      database/migrations/2021_10_26_132927_add_colunms_to_work_order_commodities.php
  36. 35 0
      database/migrations/2021_10_28_090804_create_work_order_logs_table.php
  37. 32 0
      database/migrations/2021_11_05_095410_work_order_commodities__add_columns_bao_shi_check_amount.php
  38. 16 0
      database/seeds/WorkOrderLogSeeder.php
  39. 65 6
      resources/views/customer/project/create.blade.php
  40. 25 5
      resources/views/customer/project/index.blade.php
  41. 49 7
      resources/views/customer/project/part/_two.blade.php
  42. 172 0
      resources/views/order/index/_workOrkerInfoModal.blade.php
  43. 33 19
      resources/views/order/index/_work_order_modal.blade.php
  44. 218 65
      resources/views/order/index/delivering.blade.php
  45. 80 0
      resources/views/order/workOrder/_bao_shi_review.blade.php
  46. 94 0
      resources/views/order/workOrder/_baoshi_fill_work_order.blade.php
  47. 1 1
      resources/views/order/workOrder/_edit_issue_type.blade.php
  48. 1 1
      resources/views/order/workOrder/_fill_loss_work_order.blade.php
  49. 82 0
      resources/views/order/workOrder/_logistic_fill_work_order.blade.php
  50. 150 0
      resources/views/order/workOrder/_owner_fill_work_order.blade.php
  51. 170 148
      resources/views/order/workOrder/_work_order_details.blade.php
  52. 330 502
      resources/views/order/workOrder/index.blade.php
  53. 8 7
      resources/views/rejected/search/general.blade.php
  54. 1 0
      resources/views/store/deliveryAppointment/list.blade.php
  55. 25 5
      routes/apiLocal.php

+ 14 - 0
app/Console/Commands/stubs/model.stub

@@ -0,0 +1,14 @@
+<?php
+
+namespace {{ namespace }};
+
+use Illuminate\Database\Eloquent\Model;
+
+use App\Traits\ModelLogChanging;
+
+class {{ class }} extends Model
+{
+    use ModelLogChanging;
+
+    //
+}

+ 15 - 0
app/Console/Commands/stubs/test.controller.stub

@@ -0,0 +1,15 @@
+<?php
+
+namespace {{ namespace }};
+
+use Tests\TestCase;
+
+class {{ class }} extends TestCase
+{
+
+    public function testExample()
+    {
+    {{ class }};
+        $this->assertTrue(true);
+    }
+}

+ 37 - 0
app/Console/Commands/stubs/test.service.stub

@@ -0,0 +1,37 @@
+<?php
+
+namespace {{ namespace }};
+use App\Services\{{ serviceName }};
+use Tests\TestCase;
+use App\{{ modelNameUc }};
+use App\Traits\TestMockSubServices;
+
+class {{ class }} extends TestCase
+{
+    use TestMockSubServices;
+    /** @var {{ serviceName }} $service */
+    public $service;
+    private $data;
+    private $amount=2;
+    function setUp(): void
+    {
+        parent::setUp();
+        $this->service = app('{{ serviceName }}');
+        $this->data['{{ modelNamePlural }}']
+            = factory({{ modelNameUc }}::class, $this->amount)
+            ->create();
+    }
+
+    public function testReturned()
+    {
+        $this->assertTrue(true);
+    }
+
+    function tearDown(): void
+    {
+        {{ modelNameUc }}::query()
+            ->whereIn('id',data_get($this->data['{{ modelNamePlural }}'],'*.id')??[])
+            ->delete();
+        parent::tearDown();
+    }
+}

+ 27 - 0
app/DepartmentObligationOwner.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+use App\Traits\ModelLogChanging;
+
+class DepartmentObligationOwner extends Model
+{
+    use ModelLogChanging;
+
+    use ModelTimeFormat;
+    public $timestamps=false;
+
+    protected $table='department_obligation_owner';
+
+    protected $fillable=[
+        'department_id','obligation_id', 'owner_id', 'valid_time','create_time', 'update_time','delete_flag','failure_time'
+    ];
+
+    public function department()
+    {   //面积报表
+        return $this->hasOne(UserWorkgroup::class,"id","department_id");
+    }
+}

+ 96 - 78
app/Filters/WorkOrderFilters.php

@@ -5,8 +5,8 @@ namespace App\Filters;
 
 use App\Order;
 use App\OrderIssue;
+use App\OrderIssueType;
 use App\OrderPackage;
-use App\Services\OwnerService;
 use App\Traits\ModelSearchWay;
 use App\User;
 use App\WorkOrder;
@@ -19,14 +19,15 @@ class WorkOrderFilters
 {
     use ModelSearchWay;
 
+    /** @var Builder $queryBuilder */
     protected $request;
     protected $queryBuilder;
     protected $filters = [
         'ids',
         'creator',
         'remake',
-        'created_at_start','created_at_end',
-        'review_at_start','review_at_end',
+        'created_at_start', 'created_at_end',
+        'review_at_start', 'review_at_end',
         'reviewer',
         'word_order_types',
         'word_order_child_types',
@@ -35,9 +36,9 @@ class WorkOrderFilters
         'logistic_number',
         'is_issue_order',
         'order_issue_type',
-        'grad',
         'owner',
         'client_code',
+        'is_end'
     ];
     protected $array_filter;
     protected $params = [];
@@ -45,6 +46,7 @@ class WorkOrderFilters
     protected $workOrderTypeQuery;
     protected $orderQuery;
     protected $orderPackageQuery;
+    protected $issueTypeQuery;
 
     public function __construct(Request $request)
     {
@@ -68,25 +70,18 @@ class WorkOrderFilters
 
     public function afterApply()
     {
-        if(isset($this->params['data']))
-            $this->id(explode(',',$this->params['data']));
+        if (isset($this->params['data']))
+            $this->id(explode(',', $this->params['data']));
 
-        if (!isset($this->params['owner'])){
-            $this->getOrderQuery()->whereIn('owner_id', app('UserService')->getPermittingOwnerIds(Auth::user())??[]);
+        if (Gate::allows('订单管理-工单处理-货主编辑') || Gate::allows('订单管理-工单处理-客服编辑')) {
+            $this->queryBuilder->whereIn('owner_id', app('UserService')->getPermittingOwnerIds(Auth::user()) ?? []);
         }
 
-//        $user = Auth::user();
-//        $logistic_ids = App('LogisticService')->getPermittingLogisticIds($user);
-//        $owner_id = app('UserService')->getPermittingOwnerIds($user);
-//
-//        $this->getOrderQuery()->where(function($query)use ($owner_id,$logistic_ids){
-//            $query->whereIn('owner_id',$owner_id)->orWhereIn('logistic_id',$logistic_ids);
-//        });
         $this->afterFilter();
     }
 
-    private function afterFilter(){
-        $orderQuery = $this->getOrderQuery();
+    private function afterFilter()
+    {
 
         $user = Auth::user();
 
@@ -94,57 +89,73 @@ class WorkOrderFilters
 
         $owner_ids = app('UserService')->getPermittingOwnerIds($user);
 
-        $this->afterFilterLogistic($orderQuery,$owner_ids,$logistic_ids);
+        $this->afterFilterLogistic($logistic_ids);
+
+        $this->afterFilterOwner($owner_ids);
 
-        $this->afterFilterOwner($orderQuery,$owner_ids);
+        $this->afterFileIssueType();
+
+        $this->filterWorkOrderStatus();
     }
 
-    // 可见货主过滤
-    private function afterFilterOwner($orderQuery,$owner_ids)
+    private function filterWorkOrderStatus()
     {
-        $orderQuery->whereIn('owner_id',$owner_ids);
-//        if(Gate::allows('订单管理-工单处理-客服编辑') || Gate::allows('订单管理-工单处理-承运商编辑')){
-//
-//        }else if(Gate::allows('订单管理-工单处理-货主编辑')){
-//            $orderQuery->whereIn('owner_id',$owner_ids);
-//        }
+        if (isset($this->params['is_end'])) return;
+        $this->queryBuilder->where('status', '!=', 5);      // 过滤已完成
+        $status = [];
+        if (Gate::allows('订单管理-工单处理-客服编辑')) {
+            $status[]=  4;
+        }
+        if (Gate::allows('订单管理-工单处理-承运商编辑')) {
+            $status[]=  3;
+        }
+        if (Gate::allows('订单管理-工单处理-货主编辑')) {
+            $status[]=  1;
+        }
+        $this->queryBuilder->whereIn('status',$status);
     }
 
-    // 可见承运商过滤
-    private function afterFilterLogistic($orderQuery,$owner_ids,$logistic_ids)
+    private function afterFilterOwner($owner_ids)
     {
-        if(Gate::allows('订单管理-工单处理-客服编辑') || Gate::allows('订单管理-工单处理-货主编辑')){
-            if (!isset($this->params['owner'])){
-                $this->getOrderQuery()->whereIn('owner_id', $owner_ids);
-            }
-        } else if (Gate::allows('订单管理-工单处理-承运商编辑')){
-            $orderQuery->whereIn('logistic_id',array_values($logistic_ids));
+        if (Gate::allows('订单管理-工单处理-货主编辑') || Gate::allows('订单管理-工单处理-客服编辑')) {
+            $this->queryBuilder->whereIn('owner_id', $owner_ids);
+        }
+    }
+
+    private function afterFilterLogistic($logistic_ids)
+    {
+        if (Gate::allows('订单管理-工单处理-承运商编辑')) {
+            $this->queryBuilder->whereIn('logistic_id', array_values($logistic_ids));
+        }
+    }
+
+    public function afterFileIssueType()
+    {
+        if (Gate::allows('订单管理-工单处理-客服编辑') || Gate::allows('订单管理-工单处理-货主编辑')) {
+            $this->getOrderIssueQuery()->whereIn('name', ['拦截', '信息更改', '其他', '快递异常', '错漏发', '破损', '快递丢件']);
+        } else if (Gate::allows('订单管理-工单处理-承运商编辑')) {
+            $this->getOrderIssueQuery()->whereIn('name', ['拦截', '信息更改', '破损', '快递丢件', '快递异常']);
         }
     }
 
     public function beforeApply()
     {
-        if ($this->orderPackageQuery){
-            $this->getOrderQuery()->whereIn('id',$this->orderPackageQuery);
+        if ($this->orderPackageQuery) {
+            $this->queryBuilder->whereIn('order_id', $this->orderPackageQuery);
         }
 
         if ($this->orderQuery) {
-            $this->queryBuilder->whereIn('order_id',$this->getOrderQuery());
+            $this->queryBuilder->whereIn('order_id', $this->orderQuery);
         }
 
-        // 审核 默认为 待审核
-        if (isset($this->params['is_review'])){
-            $this->queryBuilder->where('status','2');
-            $this->queryBuilder->whereHas('orderIssue')->orderBydesc('work_orders.created_at');
-        } else {
-            $work_order_query = WorkOrder::query()->select('id')->where('status','2')->whereHas('orderIssue');
-            $this->queryBuilder->whereNotIn('id',$work_order_query);
+        if ($this->issueTypeQuery) {
+            $this->queryBuilder->whereIn('order_issue_type_id', $this->issueTypeQuery);
         }
     }
 
     public function getOrderQuery(): Builder
     {
-        if (!$this->orderQuery){
+        if (!$this->orderQuery) {
             $this->orderQuery = Order::query()->select('id');
         }
         return $this->orderQuery;
@@ -152,106 +163,113 @@ class WorkOrderFilters
 
     public function getOrderPackageQuery(): Builder
     {
-        if (!$this->orderPackageQuery){
+        if (!$this->orderPackageQuery) {
             $this->orderPackageQuery = OrderPackage::query()->select('order_id');
         }
         return $this->orderPackageQuery;
     }
 
+    public function getOrderIssueQuery(): Builder
+    {
+        if (!$this->issueTypeQuery) {
+            $this->issueTypeQuery = OrderIssueType::query()->select('id');
+        }
+        return $this->issueTypeQuery;
+    }
+
     public function id($id)
     {
-        if(is_array($id))$this->queryBuilder->whereIn('work_orders.id',$id);
-        else $this->queryBuilder->where('work_orders.id',$id);
+        if (is_array($id)) $this->queryBuilder->whereIn('work_orders.id', $id);
+        else $this->queryBuilder->where('work_orders.id', $id);
     }
 
     // 创建开始时间
     public function created_at_start($create_at_start)
     {
-        $this->queryBuilder->where('work_orders.created_at','>=',$create_at_start);
+        $this->queryBuilder->where('work_orders.created_at', '>=', $create_at_start);
     }
+
     // 创建结束时间
     public function created_at_end($created_at_end)
     {
-        $this->queryBuilder->where('work_orders.created_at','<=',$created_at_end);
+        $this->queryBuilder->where('work_orders.created_at', '<=', $created_at_end);
     }
-    // 审核开始时间
+
+    // 终审开始时间
     public function review_at_start($review_at_start)
     {
-        $this->queryBuilder->where('work_orders.review_at','>=',$review_at_start);
+        $this->queryBuilder->where('work_orders.review_at', '>=', $review_at_start);
     }
-    // 审核结束时间
+
+    // 终审结束时间
     public function review_at_end($review_at_end)
     {
-        $this->queryBuilder->where('work_orders.review_at','<=',$review_at_end);
+        $this->queryBuilder->where('work_orders.review_at', '<=', $review_at_end);
     }
+
     // 创建人
     public function creator($creator)
     {
-        $userQuery = User::query()->select('id')->where('name','like',"%{$creator}%");;
-        $this->queryBuilder->whereIn('creator_id',$userQuery);
+        $userQuery = User::query()->select('id')->where('name', 'like', "%{$creator}%");;
+        $this->queryBuilder->whereIn('creator_id', $userQuery);
     }
-    // 审核人
+
+    // 终审人
     public function reviewer($id)
     {
         if (is_array($id))
-            $this->queryBuilder->whereIn('work_orders.reviewer_id',$id);
+            $this->queryBuilder->whereIn('work_orders.reviewer_id', $id);
         else
-            $this->queryBuilder->where('work_orders.reviewer_id',$id);
+            $this->queryBuilder->where('work_orders.reviewer_id', $id);
     }
 
     // 类型
     public function word_order_types($word_order_types)
     {
-        if(!$this->workOrderTypeQuery)
+        if (!$this->workOrderTypeQuery)
             $this->workOrderTypeQuery = WorkOrder::query()->select('id');
         if (is_array($word_order_types))
-            $this->workOrderTypeQuery->whereIn('id',$word_order_types);
-        else $this->workOrderTypeQuery->where('id',$word_order_types);
+            $this->workOrderTypeQuery->whereIn('id', $word_order_types);
+        else $this->workOrderTypeQuery->where('id', $word_order_types);
     }
 
     public function order_issue_type($order_issue_type)
     {
-        $this->queryBuilder->where('order_issue_type_id',$order_issue_type);
+        $this->queryBuilder->where('order_issue_type_id', $order_issue_type);
     }
 
     // 快递单号
     public function logistic_number($logistic_number)
     {
-        $this->searchWay($this->getOrderPackageQuery(),$logistic_number,'order_packages.logistic_number');
+        $this->searchWay($this->getOrderPackageQuery(), $logistic_number, 'order_packages.logistic_number');
     }
 
     // 对应问题件
     public function is_issue_order($is_issue_order)
     {
-        $orderIssueQuery = OrderIssue::query()->select('order_id')->whereIn('order_id',WorkOrder::query()->select('order_id'));
-        if($is_issue_order == 'true'){
-            $this->queryBuilder->whereIn('order_id',$orderIssueQuery);
+        $orderIssueQuery = OrderIssue::query()->select('order_id')->whereIn('order_id', WorkOrder::query()->select('order_id'));
+        if ($is_issue_order == 'true') {
+            $this->queryBuilder->whereIn('order_id', $orderIssueQuery);
         } else {
-            $this->queryBuilder->whereNotIn('order_id',$orderIssueQuery);
+            $this->queryBuilder->whereNotIn('order_id', $orderIssueQuery);
         }
     }
 
     // 承运商筛选
     public function logistic($logistic)
     {
-        $orderQuery = $this->getOrderQuery()->whereIn('id',WorkOrder::query()->select('order_id'));
-        $this->searchWay($orderQuery,$logistic,'logistic_id');
-    }
-
-    public function grad($grad)
-    {
-        $this->queryBuilder->where('grad',$grad);
+        $this->searchWay($this->queryBuilder, $logistic, 'logistic_id');
     }
 
     // 货主
     public function owner($owner)
     {
-        $this->searchWay($this->queryBuilder,$owner,'work_orders.owner_id');
+        $this->searchWay($this->queryBuilder, $owner, 'work_orders.owner_id');
     }
 
     public function client_code($client_code)
     {
-        $this->searchWay($this->getOrderQuery(),$client_code,'orders.client_code');
+        $this->searchWay($this->getOrderQuery(), $client_code, 'orders.client_code');
     }
 
 }

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

@@ -20,6 +20,7 @@ use App\OwnerFeeStorage;
 use App\OwnerPriceSystem;
 use App\OwnerReport;
 use App\Services\LogService;
+use App\Services\ObligationService;
 use App\Services\OwnerAreaReportService;
 use App\Services\OwnerBillReportService;
 use App\Services\OwnerReportService;
@@ -100,8 +101,9 @@ class CustomerController extends Controller
         if(!Gate::allows('项目管理-项目-查询')){ return redirect('denied');  }
         /** @var OwnerService $service */
         $service = app('OwnerService');
-        $owners = $service->paginate(request()->input(),['customer',"userOwnerGroup","userWorkGroup",
+        $owners = $service->paginate(request()->input(),['customer',"userOwnerGroup","userWorkGroup",'departmentObligationOwner.department',
             "ownerStoragePriceModels","storageAudit","operationAudit","expressAudit","logisticAudit","directLogisticAudit","systemAudit"]);
+        $owners=app('OwnerService')->combineOwners($owners);
         $models = app('OwnerService')->getIntersectPermitting();
         $customers = app('CustomerService')->getSelection();
         $ownerGroups = app('UserOwnerGroupService')->getSelection();
@@ -186,6 +188,9 @@ class CustomerController extends Controller
             "subjection"            => request("subjection"),
             "is_tax_exist"          => request("is_tax_exist") ? 'Y' : 'N',
         ]);
+        /** @var ObligationService $service*/
+        $service= app('ObligationService');
+        $owner=$service->createOrUpdate(request()->input());
         $this->success($owner);
     }
 
@@ -205,7 +210,17 @@ class CustomerController extends Controller
     {
         if(!Gate::allows('项目管理-项目-编辑')){ return redirect('denied');  }
         /** @var Owner $owner */
-        $owner = app('OwnerService')->find($id);
+        $owner = app('OwnerService')->find($id,['departmentObligationOwner']);
+        $departmentObligationOwner=$owner->departmentObligationOwner??[];
+        if (count($departmentObligationOwner)>0){
+            foreach ($departmentObligationOwner as $item){
+                if ($item->obligation_code=='kc')$owner->kc=$item->department_id;
+                if ($item->obligation_code=='jg')$owner->jg=$item->department_id;
+                if ($item->obligation_code=='th')$owner->th=$item->department_id;
+                if ($item->obligation_code=='sh')$owner->sh=$item->department_id;
+                if ($item->obligation_code=='fh')$owner->fh=$item->department_id;
+            }
+        }
         $owner->loadCount(["ownerStoragePriceModels","ownerPriceOperations","ownerPriceExpresses","ownerPriceLogistics","ownerPriceDirectLogistics","ownerPriceSystem"]);
         $isExist = false;
         /** @var \stdClass $owner */

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

@@ -10,7 +10,6 @@ use App\Events\DeliveryAppointmentEvent;
 use App\Imports\AppointmentDetail;
 use App\Jobs\DeliveryAppointmentCheck;
 use App\Logistic;
-use App\Services\common\ExportService;
 use App\Store;
 use App\Warehouse;
 use Carbon\Carbon;

+ 18 - 2
app/Http/Controllers/OrderPackageCommoditiesController.php

@@ -10,11 +10,27 @@ use Illuminate\Http\Request;
 
 class OrderPackageCommoditiesController extends Controller
 {
-    public function getCommoditiesApi(Request $request,OrderService $orderService,OrderPackageCommoditiesService $orderPackageCommoditiesService)
+    public function getCommoditiesApi(Request $request, OrderService $orderService, OrderPackageCommoditiesService $orderPackageCommoditiesService): array
     {
         $code = $request->input(['orderNo']);
+
         $orderService->syncOrderByCodes([$code]);
-        return $orderPackageCommoditiesService->getCommodities($code);
+
+        $commodities = $orderPackageCommoditiesService->getCommodities($code);
+
+        $data = $commodities->map(function ($item) {
+            return [
+                'sku' => $item->commodity->sku ?? '',
+                'commodity_id' => $item->id,
+                'amount' => $item->amount,
+                'name' => $item->commodity->name ?? '',
+                'logistic_number' => $item->package->logistic_number ?? '',
+                'check_amount' => 0,
+                'abnormal_amount' => 0,
+            ];
+        })->toArray();
+
+        return ['success' => true, 'data' => $data];
     }
 
 }

+ 60 - 88
app/Http/Controllers/TestController.php

@@ -75,6 +75,7 @@ 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;
@@ -158,97 +159,29 @@ class TestController extends Controller
             dd("方法不存在");
         }
     }
-    function process(Request $request){
-        $token = trim($request->input('token'));
-        $station_id = 'test';
-        $batch_id = 'W211111001514-6';
-
-        $childIndex = null;
-        $arr = explode('-',$batch_id);
-        if (count($arr)==2){
-            $batch_id = $arr[0];
-            $childIndex = (int)$arr[1];
-            $request->offsetSet("batch_id",$batch_id);
-        }
 
-        /** @var Batch|\stdClass $batch */
-        $batch=Batch::query()->where('code',$batch_id)->orderBy('id','desc')->first();
-        $data=[
-            'result'=>'success',
-            'station_id'=>$station_id,
-            'batch_id'=>$batch_id,
-            'orders'=>[]
-        ];
-        if ($childIndex!==null && $batch->split_size){
-            $start = (($childIndex-1)*$batch->split_size)+1;
-            $end = $childIndex*$batch->split_size;
-            $sql = <<<SQL
-SELECT ORDERNO
-FROM (SELECT T.ORDERNO, ROWNUM AS NO
-FROM (SELECT ORDERNO FROM DOC_WAVE_DETAILS WHERE WAVENO = '{$batch_id}' ORDER BY SEQNO) T)
-WHERE NO BETWEEN {$start} AND {$end}
-SQL;
-            dd($sql);
-            $waves = DB::connection("oracle")->select(DB::raw($sql));
-            $codes = array_column($waves,'orderno');
-            $orders = Order::query()->with(["bin","owner","orderCommodities.commodity.barcodes"])->whereIn("code",$codes)->get();
-        }else $orders = $batch->orders()->with(["bin","owner","orderCommodities.commodity.barcodes"])->get();
-
-        $ordersSorted=$orders->sortBy(function(Order $order){
-            return $order->bin->number;
-        });
-        $ordersSorted->each(function(Order $order)use(&$data,$request,$childIndex,$batch){
-            if($order['status']=='取消')return;
-            $orderData=[
-                'order_id'=>$order['code'],
-                'owner'=>$order->owner->code,
-                'status'=>$order['status']=='未处理'?'available':$order['status'],
-                'created_at'=>$order['created_at']->toDateTimeString(),
-                'bin'=>(function()use($order,$childIndex,$batch){
-                    $bin=$order->bin->number??'';
-                    if(!$bin){
-                        $bin=OracleDOCWaveDetails::query()->where('orderno', 'SO201230003574')->get('seqno')->first()['seqno']??'';
-                        LogService::log(__METHOD__,__FUNCTION__,'bin缺失补查:'.$bin.'. order:'.$order->toJson());
-                        return $childIndex!==null ? $bin-(($childIndex-1)*$batch->split_size) : $bin;
-                    }
-                    return $childIndex!==null ? $bin-(($childIndex-1)*$batch->split_size) : $bin;
-                })(),
-                'barcodes'=>[]
-            ];
-            $order->orderCommodities->each(function(OrderCommodity $orderCommodity)use(&$orderData,$request){
-                $commodity=$orderCommodity->commodity;
-                if(!$commodity){
-                    app('LogService')->log(__METHOD__, 'error' . __FUNCTION__, '播种位数据准备出错,找不到订单对应的Commodity id的对象'.$orderCommodity['commodity_id'].',是否表数据在波次生成后丢失?'.json_encode($request->all()));
-                    return;
-                }
-                $barcodeStr=$commodity->barcodes->map(function(CommodityBarcode $barcode){
-                    return $barcode['code'];
-                })->filter(function($code){
-                    return $code&&(!preg_match('/[\x{4e00}-\x{9fa5}]/u',$code));
-                })->join(',');
-                $orderData['barcodes'][]=[
-                    'id'=>$orderCommodity['id']??'',
-                    'barcode_id'=>$barcodeStr??'',
-                    'name'=>$commodity['name']??'',
-                    'sku'=>$commodity['sku']??'',
-                    'amount'=>$orderCommodity['amount']??'',
-                    'location'=>$orderCommodity['location']??'',
-                ];
-            });
-            $data['orders'][]=$orderData;
-        });
-        return $data;
+    public function format(array $arr,$newRes):array
+    {
+        $result = [];
+        foreach ($arr as $index=>$item){
+            if (isset($result[$item["sku_name"]])){
+                if (array_search($item["self_uid"],$result[$item["sku_name"]])!==false){
+                    $result[$item["sku_name"]][] = $item["next_uid"];
+                }else $result[$index] = $index;
+            }else $result[$item["sku_name"]] = [$item["self_uid"],$item["next_uid"]];
+        }
+        $recursion = [];
+        foreach ($result as $item){
+            if (is_array($item))$newRes[] = $item;
+            else $recursion[$item] = $arr[$item];
+        }
+        if (count($recursion)>0)$newRes = $this->format($recursion,$newRes);
+        return $newRes;
     }
-
     public function test(Request $request)
     {
-        dd(1);
-
-        dd($this->process($request));
-        $batch = Batch::query()->where("code","W211111001514")->first();
-        dd($batch->orders()->with("bin")->first());
         $path = '';
-        $id = 109;
+        $id = 115;
 
         $file = fopen($path, "r");
         $user=array();
@@ -737,7 +670,46 @@ sql;
 
     public function testZhenCang()
     {
-        $batches=Batch::query()->where('id',161071)->get();
-        BroadcastBatchToZhengCangJob::dispatch($batches);
+//        $batches=Batch::query()->where('id',161071)->get();
+//        BroadcastBatchToZhengCangJob::dispatch($batches);
+//        $sql = <<<sql
+//select department_id,obligation_id,owner_id,max(valid_time) from department_obligation_owner group by obligation_id,owner_id,department_id
+//sql;
+//        $info = DB::select(DB::raw($sql));
+//        dd($info);
+//        $owner=Owner::query()->with(['departmentObligationOwner'])->find(403);
+//        dd($owner);
+//        $a=app('ObligationService')->recombineCodeIdArr();
+        $now=Carbon::now()->subMonths(-1)->startOfMonth()->startOfDay()->toDateTimeString();
+        dd($now);
+    }
+
+    public function syncOrderIssue()
+    {
+        /** @var OrderIssue $orderIssue */
+        $orderIssue = OrderIssue::query()->find('48798');
+        $orderIssue->syncRejectingStatus();
+    }
+
+    public function test123()
+    {
+
+        $reflection = new \ReflectionClass(new OrderIssue());
+        dump($reflection->getMethods());
+        dump($reflection->getConstants());
+        dump($reflection->getInterfaces());
+    }
+
+    public function syncWorkOrder()
+    {
+        $workOrders = WorkOrder::query()->with('order')->get();
+        foreach ($workOrders as $workOrder) {
+            $workOrder->owner_id = $workOrder->order->owner_id;
+            $workOrder->logistic_id = $workOrder->order->logistic_id;
+            if ($workOrder->review_at){
+                $workOrder->status = 5;
+            }
+            $workOrder->save();
+        }
     }
 }

+ 319 - 67
app/Http/Controllers/WorkOrderController.php

@@ -6,6 +6,10 @@ use App\Filters\WorkOrderFilters;
 use App\Http\Requests\WorkOrder\WorkOrderRequest;
 use App\Logistic;
 use App\OrderIssue;
+use App\Services\OrderService;
+use App\Services\OwnerService;
+use App\Services\WorkOrderCommoditiesService;
+use App\Services\WorkOrderLogService;
 use App\Services\WorkOrderService;
 use App\WorkOrder;
 use Illuminate\Http\Request;
@@ -14,161 +18,409 @@ use Illuminate\Support\Facades\Gate;
 class WorkOrderController extends Controller
 {
 
-    public function index(Request $request, WorkOrderFilters $filters, WorkOrderService $service)
+    /**
+     * @var WorkOrderService $service
+     * @var WorkOrderCommoditiesService $commoditiesService
+     * @var WorkOrderLogService $logService
+     * @var OrderService $orderService
+     * @var OwnerService $ownerService
+     */
+    public $service;
+    public $commoditiesService;
+    public $logService;
+    public $orderService;
+    public $ownerService;
+
+    public function __construct(
+        WorkOrderService $service,
+        WorkOrderCommoditiesService $commoditiesService,
+        WorkOrderLogService $logService,
+        OrderService $orderService,
+        OwnerService $ownerService)
+    {
+        $this->service = $service;
+        $this->commoditiesService = $commoditiesService;
+        $this->logService = $logService;
+        $this->orderService = $orderService;
+        $this->ownerService = $ownerService;
+    }
+
+    public function index(Request $request, WorkOrderFilters $filters)
     {
         if (Gate::denies('订单管理-工单处理-查询')) return redirect('/');
+
         $workOrders = WorkOrder::query()->filter($filters)->defaultWith()->orderBy('created_at')->orderByDesc('status')->paginate($request['paginate'] ?? 50);
+
         $logistics = Logistic::all();
-        $orderIssueTypes = $service->getIssueType();
-        $owners = app('OwnerService')->getAuthorizedOwners();
-        $service->tags($workOrders);
-        return view('order.workOrder.index', compact('workOrders', 'logistics', 'orderIssueTypes','owners'));
+
+        $orderIssueTypes = $this->service->getIssueType();
+
+        $owners = $this->ownerService->getAuthorizedOwners();
+
+        $this->service->tags($workOrders);
+
+        return view('order.workOrder.index', compact('workOrders', 'logistics', 'orderIssueTypes', 'owners'));
     }
 
     // 审核 api
-    public function reviewApi(Request $request, WorkOrderService $service): array
+    public function reviewApi(Request $request): array
     {
         if (Gate::denies('订单管理-工单处理-审核')) return ['success' => false, 'message' => '没有对应的编辑权限'];
+
         $workOrder = WorkOrder::query()->find($request['id']);
-        return $service->review($workOrder);
+
+        return $this->service->review($workOrder);
     }
 
     // 批量审核 api
-    public function batchReviewApi(Request $request,WorkOrderService  $service): array
+    public function batchReviewApi(Request $request): array
     {
-        if(Gate::denies('订单管理-工单处理-审核'))return ['success' => false, 'message' => '没有对应的编辑权限'];
-        if (WorkOrder::query()->whereIn('id',$request['ids'])->whereNotNull('review_at')->exists())
+        if (Gate::denies('订单管理-工单处理-审核')) {
+            return ['success' => false, 'message' => '没有对应的编辑权限'];
+        }
+
+        if (WorkOrder::query()->whereIn('id', $request['ids'])->whereNotNull('review_at')->exists())
             return ['success' => false, 'message' => '选中的工单已有审核完成,刷新页面重试'];
-        $work_orders = WorkOrder::query()->whereIn('id',$request['ids'])->get();
-        $service->tags($work_orders);
-        return $service->batchReview($work_orders);
+
+        $work_orders = WorkOrder::query()->whereIn('id', $request['ids'])->get();
+
+        $this->service->tags($work_orders);
+
+        return $this->service->batchReview($work_orders);
     }
 
-    // 生成问题件 api
-    public function buildOrderIssueApi(Request $request, WorkOrderService $service): array
+    public function buildOrderIssueApi(Request $request): array
     {
         if (Gate::denies('订单管理-订单问题件生成'))
             return ['success' => false, 'message' => '没有对应权限'];
+
         $work_orders = WorkOrder::query()->whereIn('id', $request['ids'])->get();
+
         if (count($work_orders) == 0) return ['success' => false, 'message' => '刷新当前页面重试'];
-        if (OrderIssue::query()->whereIn('order_id',$work_orders->map(function($item){return $item['order_id'];}))->exists()){
+
+        if (OrderIssue::query()->whereIn('order_id', $work_orders->map(function ($item) {
+            return $item['order_id'];
+        }))->exists()) {
             return ['success' => false, 'message' => '已有对应的问题件'];
         }
-        $result = $service->buildOrderIssue($work_orders);
+
+        $result = $this->service->buildOrderIssue($work_orders);
+
         if (!$result['success']) return $result;
-        $workOrders = WorkOrder::query()->defaultWith()->whereIn('id',$request['ids'])->get();
-        $service->tags($workOrders);
-        return ['success' => true ,'data' => $workOrders];
+
+        $workOrders = WorkOrder::query()->defaultWith()->whereIn('id', $request['ids'])->get();
+
+        $this->service->tags($workOrders);
+
+        return ['success' => true, 'data' => $workOrders];
     }
 
-    // 创建工单 api
-    public function storeApi(Request $request, WorkOrderService $service):array
+    public function storeApi(Request $request): array
     {
         if (Gate::denies('订单管理-订单-生成工单'))
             return ['success' => false, 'message' => '没有对应权限'];
         $params = $request->all();
-        if (count($params) == 0) return ['success' => false,'message' => '参数异常'];
-        app('OrderService')->syncOrderByCodes(array_map(function($param){
+        if (count($params) == 0) return ['success' => false, 'message' => '参数异常'];
+        app('OrderService')->syncOrderByCodes(array_map(function ($param) {
             return $param['order_no'];
-        },$params));
-        return  $service->build($params);
+        }, $params));
+        return $this->service->build($params);
+    }
+
+    public function interceptApi(WorkOrderRequest $request):array
+    {
+        if (Gate::denies('订单管理-订单-生成工单'))
+            return ['success' => false, 'message' => '没有对应权限'];
+
+        $orderNos = $request->input('orderNos',[]);
+
+        $this->orderService->syncOrderByCodes($orderNos);
+
+        $remark = $request->input('remark','拦截工单');
+
+        foreach ($orderNos as $item) {
+            $this->service->createInterceptWorkOrder(['order_no'=>$item,'remark' => $remark]);
+        }
+        return ['success' => true];
+    }
+
+    public function informationChangeApi(WorkOrderRequest $request): array
+    {
+        if (Gate::denies('订单管理-订单-生成工单'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $orderNo = $request->input('order_no','');
+
+        $this->orderService->syncOrderByCodes([$orderNo]);
+
+        $this->service->createInformationChangeWorkOrder(['order_no'=>$orderNo,'remark' => $request->input('remark')]);
+        return ['success' => true];
     }
 
-    // 破损工单
-    public function damagedApi(WorkOrderRequest $request, WorkOrderService $service): array
+    public function lossApi(WorkOrderRequest $request): array
     {
         if (Gate::denies('订单管理-订单-生成工单'))
             return ['success' => false, 'message' => '没有对应权限'];
-        app('OrderService')->syncOrderByCodes([$request->input('order_no')]);
 
-        $workOrder =  $service->createDamagedWorkOrder($request->all());
+        $orderNo = $request->input('order_no','');
+
+        $this->orderService->syncOrderByCodes([$orderNo]);
+
+        $this->service->createLossWorkOrder($request->all());
+
+        return ['success' => true];
+    }
+
+    public function damagedApi(WorkOrderRequest $request): array
+    {
+        if (Gate::denies('订单管理-订单-生成工单'))
+            return ['success' => false, 'message' => '没有对应权限'];
+
+        $this->orderService->syncOrderByCodes([$request->input('order_no')]);
+
+        $workOrder = $this->service->createDamagedWorkOrder($request->all());
+
 
         if ($workOrder) return ['success' => true];
-        else return  ['success' => false];
+        else return ['success' => false];
+    }
+
+    public function expressAbnormalApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-订单-生成工单'))
+            return ['success' => false, 'message' => '没有对应权限'];
+
+        $this->orderService->syncOrderByCodes([$request->input('order_no')]);
+
+        $this->service->createExpressAbnormalWorkOrder($request->all());
+
+        return ['success' => true];
+    }
+
+    public function mistakeApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-订单-生成工单'))
+            return ['success' => false, 'message' => '没有对应权限'];
+
+        $this->orderService->syncOrderByCodes([$request->input('order_no')]);
+
+        $this->service->createMistakeWorkOrder($request->all());
+
+        return ['success' => true];
+    }
+
+    public function fillLossApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-订单-宝时编辑') || Gate::denies('订单管理-订单-货主编辑')){
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+
+        $workOrder = $this->service->find($request->input('id'));
+
+        $this->service->fillLossWorkOrder($workOrder,$request->all());
+
+        $workOrder->loadDefaultWith();
+
+        return ['success' => true,'data' => $workOrder];
     }
 
-    // 货主 遗失工单信息 填充
-    public function updateLossApi(Request $request, WorkOrderService $service): array
+    public function updateLossApi(Request $request): array
     {
         if (Gate::denies('订单管理-工单处理-货主编辑'))
             return ['success' => false, 'message' => '没有对应权限'];
 
-        /** @var WorkOrder $workOrder */
-        $workOrder = WorkOrder::query()->where('id',$request->input('id'))->first();
+        $workOrder = $this->service->find($request->input('id'));
+
+        if (!$workOrder) return ['success' => false, 'message' => '参数异常'];
 
-        if (!$workOrder) return ['success' => false,'message' => '参数异常'];
+        $workOrder = $this->service->fillLossWorkOrder($workOrder, $request->all());
 
-        $workOrder = $service->fillLossWorkOrder($workOrder,$request->all());
+        if (!$workOrder) return ['success' => false, 'message' => '创建异常'];
 
-        if(!$workOrder) return ['success' => false,'message' => '创建异常'];
+        $workOrder->loadDefaultWith();
 
         return ['success' => true, 'data' => $workOrder];
     }
 
-    // 修改问题类型
     public function updateIssueTypeApi(Request $request): array
     {
         if (Gate::denies('订单管理-工单处理-审核'))
-            return ['success' => false,'message' => '没有对应权限'];
+            return ['success' => false, 'message' => '没有对应权限'];
+
+        WorkOrder::query()->where('id', $request['id'])->update(['order_issue_type_id' => $request['type_id']]);
 
-        WorkOrder::query()->where('id',$request['id'])->update(['order_issue_type_id' => $request['type_id']]);
         return ['success' => true];
     }
 
-    // 批量修改问题件类型
-    public function batchUpdateIssueTypeApi(Request $request,WorkOrderService $service): array
+    public function batchUpdateIssueTypeApi(Request $request): array
     {
         if (Gate::denies('订单管理-工单处理-审核'))
-            return ['success' => false,'message' => '没有对应权限'];
-        WorkOrder::query()->whereIn('id',$request['ids'])->update(['order_issue_type_id' => $request['type']]);
-        $items = WorkOrder::query()->defaultWith()->whereIn('id',$request['ids'])->get();
-        $service->tags($items);
-        return ['success' => true,'data' => $items];
+            return ['success' => false, 'message' => '没有对应权限'];
+
+        WorkOrder::query()->whereIn('id', $request['ids'])->update(['order_issue_type_id' => $request['type']]);
+
+        $items = WorkOrder::query()->defaultWith()->whereIn('id', $request['ids'])->get();
+
+        $this->service->tags($items);
+
+        return ['success' => true, 'data' => $items];
     }
 
-    // 删除
     public function destroyApi($id): array
     {
         if (Gate::denies('订单管理-工单处理-删除'))
-            return ['success' => false,'message' => '没有对应权限'];
-        $workOrder = WorkOrder::query()->where('id',$id)->first();
-        if (! $workOrder)
-            return ['success' => false,'message' => '对应工单信息未找到'];
-        if ($workOrder->status == '已处理'){
-            return ['success' => false,'message' => '对应工单已处理,拒绝删除'];
-        }
-        WorkOrder::query()->where('id',$id)->Delete();
+            return ['success' => false, 'message' => '没有对应权限'];
+
+        $workOrder = $this->service->find($id);
+
+        if (!$workOrder)
+            return ['success' => false, 'message' => '对应工单信息未找到'];
+        if ($workOrder->status == '已处理') {
+            return ['success' => false, 'message' => '对应工单已处理,拒绝删除'];
+        }
+        WorkOrder::query()->where('id', $id)->Delete();
         return ['success' => true];
     }
 
-    // 宝时 修改工单状态
     public function updateWorkOrderStatusApi(Request $request): array
     {
         if (Gate::denies('订单管理-工单处理-宝时编辑'))
-            return  ['success' => false,'message' => '没有对应权限'];
+            return ['success' => false, 'message' => '没有对应权限'];
         try {
-            $workOrder = WorkOrder::query()->find($request['id']);
+            $workOrder = $this->service->find($request->input('id'));
+
             $workOrder->work_order_status = $request['work_order_status'];
+
             $workOrder->update();
         } catch (\Exception $e) {
-            return ['success' => false,'message' => '编辑工单状态失败'];
+            return ['success' => false, 'message' => '编辑工单状态失败'];
         }
         return ['success' => true];
     }
 
-    // 承运商处理工单状态
-    public function logisticUpdateWorkOrderStatusApi(Request $request):array
+    public function logisticUpdateWorkOrderStatusApi(Request $request): array
     {
         if (Gate::denies('订单管理-工单处理-承运商编辑'))
-            return  ['success' => false,'message' => '没有对应权限'];
+            return ['success' => false, 'message' => '没有对应权限'];
         try {
-            $workOrder = WorkOrder::query()->find($request['id']);
+            $workOrder = $this->service->find($request->input('id'));
+
             $workOrder->work_order_status = $request['work_order_status'];
+
             $workOrder->update();
         } catch (\Exception $e) {
-            return ['success' => false,'message' => '编辑工单状态失败'];
+            return ['success' => false, 'message' => '编辑工单状态失败'];
+        }
+        return ['success' => true];
+    }
+
+    public function ownerUpdateCommoditiesApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-货主编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+
+        $workOrder = $this->service->find($request->input('id'));
+
+        if (!$workOrder) return ['success' => false, 'message' => '参数异常'];
+
+        $this->commoditiesService->updateWorkOrderCommoditiesByJsonArray($workOrder, $request->input('commodities'));
+
+        if(($workOrder->issueType->name ?? '') == '快递丢件'){
+            $this->logService->createLog($workOrder,'处理','货主填充数据');
+            $workOrder->changeStatus('宝时处理');
+        }
+
+        $workOrder->loadDefaultWith();
+
+        return ['success' => true, 'data' => $workOrder];
+    }
+
+    public function logisticUpdateCommoditiesApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-承运商编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        $workOrder = $this->service->find($request->input('id'));
+
+        if (!$workOrder) return ['success' => false, 'message' => '参数异常'];
+
+        $this->commoditiesService->updateWorkOrderCommoditiesByJsonArray($workOrder, $request->input('commodities'));
+
+        $workOrder->loadDefaultWith();
+        $issueType = $workOrder->issueType->name ?? '';
+        if (in_array($issueType,['破损','快递异常','快递丢件'])){
+            $workOrder->changeStatus('宝时终审');
+            $this->logService->createLog($workOrder,'处理','承运商处理');
+
+        } else if (in_array($issueType,['拦截','信息更改'])){
+            $workOrder->changeStatus('完成');
+            $this->logService->createLog($workOrder,'完结','承运商完成');
         }
-        return ['success'=> true];
+
+
+        return ['success' => true, 'data' => $workOrder];
     }
 
+    public function baoShiUpdateCommoditiesApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-宝时编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        $workOrder = $this->service->find($request->input('id'));
+
+        if (!$workOrder) return ['success' => false, 'message' => '参数异常'];
+
+        $this->commoditiesService->updateWorkOrderCommoditiesByJsonArray($workOrder, $request->input('commodities'));
+
+        $workOrder->loadDefaultWith();
+
+        if (($workOrder->issueType->name ?? '') === '错漏发') {
+            $workOrder->changeStatus('完成');
+            $this->logService->createLog($workOrder, '完结', '错漏发完结');
+        }
+
+        return ['success' => true, 'data' => $workOrder];
+    }
+
+    public function logisticEndApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-承运商编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        $workOrder = $this->service->find($request->input('id'));
+
+        if (!$workOrder) return ['success' => false, 'message' => '参数错误,刷新重试'];
+
+        $this->service->logisticEnd($workOrder);
+
+        $workOrder->loadDefaultWith();
+
+        return ['success' => true, 'data' => $workOrder];
+    }
+
+    public function baoShiReviewApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-客服编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        $workOrder = $this->service->find($request->input('id'));
+
+        $this->service->baoShiReview($workOrder,$request->input('commodities'));
+
+        $workOrder->loadDefaultWith();
+
+        return ['success' => true,'data' => $workOrder];
+    }
+
+    public function checkWorkOrderApi(Request $request): array
+    {
+        $nos = $request->input('no','');
+
+        if (is_string($nos)){
+            $nos = [$nos];
+        }
+
+        $data = $this->service->checkWorkOrder($nos);
+        return ['success' => true,'data' => $data];
+    }
 }

+ 85 - 0
app/Http/Controllers/WorkOrderLogController.php

@@ -0,0 +1,85 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\WorkOrderLog;
+use Illuminate\Http\Request;
+
+class WorkOrderLogController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index()
+    {
+        //
+    }
+
+    /**
+     * Show the form for creating a new resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function create()
+    {
+        //
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\Response
+     */
+    public function store(Request $request)
+    {
+        //
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  \App\WorkOrderLog  $workOrderLog
+     * @return \Illuminate\Http\Response
+     */
+    public function show(WorkOrderLog $workOrderLog)
+    {
+        //
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     *
+     * @param  \App\WorkOrderLog  $workOrderLog
+     * @return \Illuminate\Http\Response
+     */
+    public function edit(WorkOrderLog $workOrderLog)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \App\WorkOrderLog  $workOrderLog
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, WorkOrderLog $workOrderLog)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  \App\WorkOrderLog  $workOrderLog
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy(WorkOrderLog $workOrderLog)
+    {
+        //
+    }
+}

+ 21 - 3
app/Http/Requests/WorkOrder/WorkOrderRequest.php

@@ -31,6 +31,8 @@ class WorkOrderRequest extends FormRequest
         switch ($routeName ){
             case 'workOrder.damagedApi':
                 return $this->damagedApiRule();
+            case 'worKOrder.workOrder.interceptApi':
+                return $this->interceptApiRule();
             default:
                 return [];
         }
@@ -42,6 +44,8 @@ class WorkOrderRequest extends FormRequest
         switch ($routeName ){
             case 'workOrder.damagedApi':
                 return $this->damagedApiMessage();
+            case 'worKOrder.workOrder.interceptApi':
+                return $this->interceptApiMessage();
             default:
                 return [];
         }
@@ -50,7 +54,6 @@ class WorkOrderRequest extends FormRequest
     public function damagedApiRule(): array
     {
         return [
-            'type' => 'required|string',
             'order_no' => 'required|string',
             'packageImages' => 'required|array',
             'commodityImages' => 'required|array',
@@ -61,8 +64,6 @@ class WorkOrderRequest extends FormRequest
     public function damagedApiMessage(): array
     {
         return [
-            'type.required' => '未指定工单类型',
-            'type.string' => '工单类型格式不正确',
             'order_no.required' => '未指定订单',
             'order_no.string' => '订单数据格式不正确',
             'packageImages.required' => '未上传外包装图片',
@@ -73,4 +74,21 @@ class WorkOrderRequest extends FormRequest
             'dealImages.array' => '交易图片按数组格式上传',
         ];
     }
+
+    public function interceptApiRule():array
+    {
+        return [
+            'orderNos' => 'required|array',
+            'remark' => 'string',
+        ];
+    }
+
+    public function interceptApiMessage(): array
+    {
+        return [
+            'orderNos.required' => '参数异常',
+            'orderNos.array' => '参数异常',
+            'remark.string' => '参数异常',
+        ];
+    }
 }

+ 21 - 0
app/Obligation.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+use App\Traits\ModelLogChanging;
+
+class Obligation extends Model
+{
+    use ModelLogChanging;
+
+    use ModelTimeFormat;
+    protected $table='obligation';
+    public $timestamps=false;
+
+    protected $fillable=[
+        'name','code', 'create_time', 'update_time','delete_flag'
+    ];
+}

+ 7 - 0
app/Owner.php

@@ -118,6 +118,13 @@ class Owner extends Model
     {   //面积报表
         return $this->hasOne(OwnerAreaReport::class,"owner_id","id");
     }
+    public function departmentObligationOwner()
+    {   //部门职能关联
+        return $this->hasMany(DepartmentObligationOwner::class,"owner_id","id")
+            ->selectRaw('obligation_code,obligation_id,owner_id,department_id,max(valid_time)')
+            ->groupBy('obligation_id','owner_id','department_id')
+            ->whereNull('failure_time');
+    }
     public function ownerStoragePriceModels()
     {   //仓储计费
         $query = OwnerStoragePriceModel::query()->select("target_id")

+ 7 - 1
app/Providers/AppServiceProvider.php

@@ -190,7 +190,10 @@ use App\Services\WorkOrderImageService;
 use App\Services\WorkOrderProcessLogService;
 use App\Services\LaborApplyService;
 use App\Services\SyriusTaskService;
+use App\Services\WorkOrderLogService;
+use App\Services\OrderIssueTypeService;
 use App\Services\ReplenishmentService;
+use App\Services\ObligationService;
 
 class AppServiceProvider extends ServiceProvider
 {
@@ -275,6 +278,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('MenuService',MenuService::class);
         app()->singleton('NewOrderCountingRecordService',NewOrderCountingRecordService::class);
         app()->singleton('NotificationService',NotificationService::class);
+        app()->singleton('ObligationService',ObligationService::class);
         app()->singleton('OracleActAllocationDetailService', OracleActAllocationDetailService::class);
         app()->singleton('OracleBasCustomerService', OracleBasCustomerService::class);
         app()->singleton('OracleBasSkuService', OracleBasSkuService::class);
@@ -288,6 +292,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('OrderIssueProcessLogService', OrderIssueProcessLogService::class);
         app()->singleton('OrderIssueRejectedBillService', OrderIssueRejectedBillService::class);
         app()->singleton('OrderIssueService', OrderIssueService::class);
+        app()->singleton('OrderIssueTypeService',OrderIssueTypeService::class);
         app()->singleton('OrderIssueWorkLoadService', OrderIssueWorkLoadService::class);
         app()->singleton('OrderPackageCommoditiesService', OrderPackageCommoditiesService::class);
         app()->singleton('OrderPackageCommoditySerialNumberService', OrderPackageCommoditySerialNumberService::class);
@@ -346,6 +351,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('RejectedBillItemService', RejectedBillItemService::class);
         app()->singleton('RejectedBillService', RejectedBillService::class);
         app()->singleton('RejectedService', RejectedService::class);
+        app()->singleton('ReplenishmentService',ReplenishmentService::class);
         app()->singleton('RequirementService',RequirementService::class);
         app()->singleton('RequirementUserService',RequirementUserService::class);
         app()->singleton('ReviewService',ReviewService::class);
@@ -389,10 +395,10 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('WorkOrderCommoditiesService',WorkOrderCommoditiesService::class);
         app()->singleton('WorkOrderDetailService',WorkOrderDetailService::class);
         app()->singleton('WorkOrderImageService',WorkOrderImageService::class);
+        app()->singleton('WorkOrderLogService',WorkOrderLogService::class);
         app()->singleton('WorkOrderProcessLogService',WorkOrderProcessLogService::class);
         app()->singleton('WorkOrderService',WorkOrderService::class);
         app()->singleton('WorkOrderTypeService',WorkOrderTypeService::class);
-        app()->singleton('ReplenishmentService',ReplenishmentService::class);
     }
 
     private function registerObserver()

+ 8 - 1
app/Services/DeliveryAppointmentService.php

@@ -29,7 +29,14 @@ class DeliveryAppointmentService
     public function query(array $params)
     {
         $owners = app("UserService")->getPermittingOwnerIds(Auth::user());
-        return app(QueryService::class)->query($params,DeliveryAppointment::query(),[
+        $query = DeliveryAppointment::query();
+        if ($params["appointment_number"] ?? false){
+            $query->whereHas("cars",function ($query)use($params){
+                $query->where("appointment_number",'like',$params["appointment_number"]."%");
+            });
+            unset($params["appointment_number"]);
+        }
+        return app(QueryService::class)->query($params,$query,[
             'created_at_start' => ['alias' => 'created_at' , 'startDate' => ' 00:00:00'],
             'appointment_date_start' => ['alias' => 'appointment_date' , 'startDate' => ' 00:00:00'],
             'created_at_end' => ['alias' => 'created_at' , 'endDate' => ' 23:59:59'],

+ 114 - 0
app/Services/ObligationService.php

@@ -0,0 +1,114 @@
+<?php
+
+namespace App\Services;
+
+use App\DepartmentObligationOwner;
+use App\Owner;
+use App\Traits\ServiceAppAop;
+use App\Obligation;
+use Carbon\Carbon;
+
+class ObligationService
+{
+    use ServiceAppAop;
+    protected $modelClass=Obligation::class;
+
+    public function getSelection($column = ['id','code'])
+    {
+        return Obligation::query()->select($column)->get();
+    }
+    public function recombineCodeIdArr(){
+        $obligations=$this->getSelection()->toArray();
+        return array_combine(array_column($obligations, 'code'), array_column($obligations, 'id'));
+    }
+    public function createOrUpdate(array $param){
+        $obligation=$this->recombineCodeIdArr();
+        $owner=Owner::query()->with('departmentObligationOwner')->find($param['id']);
+        $departmentObligationOwner=$owner->departmentObligationOwner->toArray()??[];
+        $time=Carbon::now()->subMonths(-1)->startOfMonth()->startOfDay()->toDateTimeString();
+        if (empty($departmentObligationOwner)){//第一次新增 部门和职能及货主关联
+           $insert_param=[];
+            $insert_param[]=['department_id'=>$param['kc'],'obligation_id'=>$obligation['kc'],'obligation_code'=>'kc','owner_id'=>$param['id'],'valid_time'=>$time];
+            $insert_param[]=['department_id'=>$param['jg'],'obligation_id'=>$obligation['jg'],'obligation_code'=>'jg','owner_id'=>$param['id'],'valid_time'=>$time];
+            $insert_param[]=['department_id'=>$param['th'],'obligation_id'=>$obligation['th'],'obligation_code'=>'th','owner_id'=>$param['id'],'valid_time'=>$time];
+            $insert_param[]=['department_id'=>$param['sh'],'obligation_id'=>$obligation['sh'],'obligation_code'=>'sh','owner_id'=>$param['id'],'valid_time'=>$time];
+            $insert_param[]=['department_id'=>$param['fh'],'obligation_id'=>$obligation['fh'],'obligation_code'=>'fh','owner_id'=>$param['id'],'valid_time'=>$time];
+            DepartmentObligationOwner::query()->insert($insert_param);
+        }else{//修改货主中的 仓库组, 加工组, 发货组, 收货组, 退货组信息
+            $kc=DepartmentObligationOwner::query()
+                ->where('obligation_id',$obligation['kc'])
+                ->where('owner_id',$param['id'])
+                ->where('valid_time',$time)->first();
+            if ($kc){
+                $kc->update(['department_id'=>$param['kc']]);
+            }else{
+                DepartmentObligationOwner::query()
+                    ->orderByDesc('id')
+                    ->where('obligation_id',$obligation['kc'])
+                    ->where('owner_id',$param['id'])
+                    ->update(['failure_time'=>$time]);
+                DepartmentObligationOwner::query()->insert(['department_id'=>$param['kc'],'obligation_id'=>$obligation['kc'],'obligation_code'=>'kc','owner_id'=>$param['id'],'valid_time'=>$time]);
+            }
+            $jg=DepartmentObligationOwner::query()
+                ->where('obligation_id',$obligation['jg'])
+                ->where('owner_id',$param['id'])
+                ->where('valid_time',$time)->first();
+            if ($jg){
+                $jg->update(['department_id'=>$param['jg']]);
+            }else{
+                DepartmentObligationOwner::query()
+                    ->orderByDesc('id')
+                    ->where('obligation_id',$obligation['jg'])
+                    ->where('owner_id',$param['id'])
+                    ->update(['failure_time'=>$time]);
+                DepartmentObligationOwner::query()->insert(['department_id'=>$param['jg'],'obligation_id'=>$obligation['jg'],'obligation_code'=>'jg','owner_id'=>$param['id'],'valid_time'=>$time]);
+            }
+
+            $th=DepartmentObligationOwner::query()
+                ->where('obligation_id',$obligation['th'])
+                ->where('owner_id',$param['id'])
+                ->where('valid_time',$time)->first();
+            if ($th){
+                $th->update(['department_id'=>$param['th']]);
+            }else{
+                DepartmentObligationOwner::query()
+                    ->orderByDesc('id')
+                    ->where('obligation_id',$obligation['th'])
+                    ->where('owner_id',$param['id'])
+                    ->update(['failure_time'=>$time]);
+                DepartmentObligationOwner::query()->insert(['department_id'=>$param['th'],'obligation_id'=>$obligation['th'],'obligation_code'=>'th','owner_id'=>$param['id'],'valid_time'=>$time]);
+            }
+
+            $sh=DepartmentObligationOwner::query()
+                ->where('obligation_id',$obligation['sh'])
+                ->where('owner_id',$param['id'])
+                ->where('valid_time',$time)->first();
+            if ($sh){
+                $sh->update(['department_id'=>$param['sh']]);
+            }else{
+                DepartmentObligationOwner::query()
+                    ->orderByDesc('id')
+                    ->where('obligation_id',$obligation['sh'])
+                    ->where('owner_id',$param['id'])
+                    ->update(['failure_time'=>$time]);
+                DepartmentObligationOwner::query()->insert(['department_id'=>$param['sh'],'obligation_id'=>$obligation['sh'],'obligation_code'=>'sh','owner_id'=>$param['id'],'valid_time'=>$time]);
+            }
+
+            $fh=DepartmentObligationOwner::query()
+                ->where('obligation_id',$obligation['fh'])
+                ->where('owner_id',$param['id'])
+                ->where('valid_time',$time)->first();
+            if ($fh){
+                $fh->update(['department_id'=>$param['fh']]);
+            }else{
+                DepartmentObligationOwner::query()
+                    ->orderByDesc('id')
+                    ->where('obligation_id',$obligation['fh'])
+                    ->where('owner_id',$param['id'])
+                    ->update(['failure_time'=>$time]);
+                DepartmentObligationOwner::query()->insert(['department_id'=>$param['fh'],'obligation_id'=>$obligation['fh'],'obligation_code'=>'fh','owner_id'=>$param['id'],'valid_time'=>$time]);
+            }
+        }
+        return Owner::query()->with('departmentObligationOwner')->find($param['id']);
+    }
+}

+ 12 - 0
app/Services/OrderIssueTypeService.php

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

+ 5 - 3
app/Services/OrderPackageCommoditiesService.php

@@ -726,10 +726,12 @@ class OrderPackageCommoditiesService
         }
      }
 
+
+
     public function getCommodities($orderNo)
     {
-        $orderQuery = Order::query()->where('id')->where('code',$orderNo);
-        $orderPackageQuery = OrderPackage::query()->select('id')->where('order_id',$orderQuery);
-        return OrderPackageCommodities::query()->with('commodity')->whereIn('order_package_id',$orderPackageQuery)->get();
+        $orderQuery = Order::query()->select('id')->where('code',$orderNo);
+        $orderPackageQuery = OrderPackage::query()->select('id')->whereIn('order_id',$orderQuery);
+        return OrderPackageCommodities::query()->with('commodity','package')->whereIn('order_package_id',$orderPackageQuery)->get();
     }
 }

+ 39 - 47
app/Services/OrderPackageService.php

@@ -29,20 +29,43 @@ class OrderPackageService
     const ZT_COLLECT_UPLOAD_DEFAULT_WEIGHT = 0.01; //中通自动揽收默认重量
     protected $modelClass = OrderPackage::class;
 
-    public function batchUpdate(array $params)
+    /**
+     * @var LogisticService $logisticService
+     * @var DataHandlerService $dataHandlerService
+     * @var OrderTrackingService $orderTrackingService
+     * @var OrderPackageCommoditiesService $orderPackageCommoditiesService
+     * @var BatchUpdateService $batchUpdateService
+     */
+    public $logisticService;
+    public $dataHandlerService;
+    public $orderTrackingService;
+    public $orderPackageCommoditiesService;
+    public $batchUpdateService;
+
+    public function __construct(LogisticService $logisticService,
+                                DataHandlerService $dataHandlerService,
+                                OrderTrackingService $orderTrackingService,
+                                OrderPackageCommoditiesService $orderPackageCommoditiesService,
+                                BatchUpdateService $batchUpdateService)
     {
-        return app(BatchUpdateService::class)->batchUpdate('order_packages', $params);
+        $this->logisticService = $logisticService;
+        $this->dataHandlerService = $dataHandlerService;
+        $this->orderTrackingService = $orderTrackingService;
+        $this->orderPackageCommoditiesService = $orderPackageCommoditiesService;
+        $this->batchUpdateService = $batchUpdateService;
     }
 
-    /** @var OrderTrackingService $orderTrackingService */
-    public $orderTrackingService;
+    public function batchUpdate(array $params)
+    {
+        return $this->batchUpdateService->batchUpdate('order_packages', $params);
+    }
 
     /**
      * @param string $logistic_number
      * @param array $values
      * @return OrderPackage $package
      */
-    public function firstOrCreate($logistic_number, array $values)
+    public function firstOrCreate($logistic_number, array $values): OrderPackage
     {
         /** @var $package OrderPackage */
         $package = OrderPackage::query()->where('logistic_number', $logistic_number)->first();
@@ -77,10 +100,6 @@ class OrderPackageService
     {
         $order_nos = data_get($orderHeaders, '*.orderno');
         return $this->getByOrderNos($order_nos);
-//        return OrderPackage::query()->with('order')
-//            ->whereIn('order_id', function ($query) use ($order_nos) {
-//                $query->from('orders')->select('id')->whereIn('code', $order_nos);
-//            })->get();
     }
 
     public function create(array $params)
@@ -88,9 +107,7 @@ class OrderPackageService
         if (count($params) == 0) return null;
         try {
             $this->insert($params);
-            app('LogService')->log(__METHOD__, __FUNCTION__, '批量生成 orderPackage' . count($params) . json_encode($params));
         } catch (\Exception $e) {
-            app('LogService')->log(__METHOD__, __FUNCTION__, '批量生成 orderPackage error ' . json_encode($params) . $e->getMessage() . $e->getTraceAsString());
         } finally {
             $logistic_numbers = data_get($params, '*.logistic_number');
             unset($params);
@@ -119,10 +136,6 @@ class OrderPackageService
             }
         }
         return $orderPackages ?? new Collection();
-//        return OrderPackage::query()->with('order.logistic')
-//            ->whereIn('order_id', function ($query) use ($orderNos) {
-//                $query->from('orders')->select('id')->whereIn('code', $orderNos);
-//            })->get();
     }
 
     public function update($orderClientNo, $logisticNumber)
@@ -187,20 +200,14 @@ class OrderPackageService
                 $inner_array = array_chunk($inner_params, 200);
                 foreach ($inner_array as $params) {
                     $bool = $this->insert($params);
-                    $bool ? LogService::log(__METHOD__, __FUNCTION__, '批量添加 OrderPackage ' . count($inner_params) . ' || ' . json_encode($inner_params)) : null;
                 }
             } catch (\Exception $e) {
-                LogService::log(__METHOD__, __FUNCTION__, '批量添加 OrderPackage error ' . count($inner_params) . ' || ' . json_encode($e->getMessage()) . json_encode($inner_params) . json_encode($e->getTraceAsString()));
             }
         }
     }
 
     public function getInnerParams($orderHeader, $order, $packages_maps, $logistic): array
     {
-        /**
-         * @var DataHandlerService $dataHandlerService
-         */
-        $dataHandlerService = app('DataHandlerService');
         $logistic_numbers = array_diff(array_unique(data_get($orderHeader->actAllocationDetails, '*.picktotraceid')), ['', '*']);
         $date = Carbon::now()->format('Y-m-d H:i:s');
         $inner_params = [];
@@ -222,8 +229,15 @@ class OrderPackageService
             $sentAtMap[$orderHeader['soreference5']] = $orderHeader->actAllocationDetails->first() ?? null;
         }
 
+        /** 唯品顺丰速运承运商定制 */
+        if ($orderHeader['userdefine1'] === 'WPSFSY'){
+            $logistic_numbers = [$orderHeader['soreference5']];
+            $sentAtMap[$orderHeader['soreference5']] = $orderHeader->actAllocationDetails->first() ?? null;
+        }
+
+
         foreach ($logistic_numbers as $logistic_number) {
-            $package = $dataHandlerService->getKeyValue(['logistic_number' => $logistic_number], $packages_maps);
+            $package = $this->dataHandlerService->getKeyValue(['logistic_number' => $logistic_number], $packages_maps);
 
             if (isset($package)) continue;
             try {
@@ -248,20 +262,13 @@ class OrderPackageService
 
     public function deleteUnnecessaryPackage($orderHeaders, $packages)
     {
-        /**
-         * @var DataHandlerService $dataHandlerService
-         * @var OrderTrackingService $orderTrackingService
-         * @var OrderPackageCommoditiesService $orderPackageCommoditiesService
-         */
-        $dataHandlerService = app(DataHandlerService::class);
-        $orderPackageCommoditiesService = app('OrderPackageCommoditiesService');
 
         $logistic_numbers = array();
         foreach ($orderHeaders as $orderHeader) {
             if ($orderHeader['sostatus'] == '90') {
                 if ($orderHeader['soreference5'] == '') $logistic_numbers[$orderHeader['orderno']] = $orderHeader['orderno'];
                 else $logistic_numbers[$orderHeader['soreference5']] = $orderHeader['soreference5'];
-            } elseif ($orderHeader['userdefine1'] == 'JDKD') {
+            } elseif ($orderHeader['userdefine1'] == 'JDKD' || $orderHeader['userdefine1'] == 'WPSFSY') {
                 $logistic_numbers[$orderHeader['soreference5']] = $orderHeader['soreference5'];
             } else {
                 foreach ($orderHeader->actAllocationDetails as $actAllocationDetail) {
@@ -275,7 +282,7 @@ class OrderPackageService
         $logistic_numbers = array_diff($logistic_numbers, ['', ' ', '*']);
 
         /** WAS数据库中已有的快递单号*/
-        $packages_maps = $dataHandlerService->dataHeader(['logistic_number'], $packages);
+        $packages_maps = $this->dataHandlerService->dataHeader(['logistic_number'], $packages);
         $exits_number = data_get($packages, '*.logistic_number');
 
         /** WMS快递单号 和 WAS的快递单号 的差集*/
@@ -284,21 +291,13 @@ class OrderPackageService
 
         /** 记录差集对应的OrderPackage的id*/
         foreach ($diff_number as $number) {
-            $package = $dataHandlerService->getKeyValue(['logistic_number' => $number], $packages_maps);
+            $package = $this->dataHandlerService->getKeyValue(['logistic_number' => $number], $packages_maps);
             if ($package ?? false) $packages[] = $package->id;
         }
 
         /** 删除 OrderPackage 和 OrderPackageCommodities*/
         if (count($packages) == 0) return;
         $this->deleteIds($packages);
-//        try {
-//            $bool = OrderPackage::query()->whereIn('id', $packages)->delete();
-//            $orderPackageCommodities = OrderPackageCommodities::query()->whereIn('order_package_id', $packages)->get();
-//            $orderPackageCommoditiesService->deleteOrderCommodities($orderPackageCommodities);
-//            $bool ? LogService::log(__METHOD__, __FUNCTION__, '删除多余包裹 ids:' . json_encode($packages)) : null;
-//        } catch (\Exception $e) {
-//            LogService::log(__METHOD__, __FUNCTION__, '删除多余包裹 ids:' . json_encode($packages) . $e->getMessage());
-//        }
     }
 
     public function deleteIds($ids)
@@ -383,17 +382,10 @@ class OrderPackageService
      */
     public function processCancelOrderPackages(&$orderHeaders)
     {
-        $this->instant($this->orderTrackingService, 'OrderTrackingService');
-
         $cancelOrder = $orderHeaders->filter(function ($orderHeader) {
             return $orderHeader->sostatus == '90';
         });
-
         $orderPackages = $this->getByWmsOrders($cancelOrder);
-//        $orderPackages = OrderPackage::query()->whereIn('order_id', function ($query) use ($cancelOrder) {
-//            /** @var Builder $query */
-//            $query->from((new Order())->getTable())->selectRaw('id')->whereIn('code', data_get($cancelOrder, '*.orderno'));
-//        })->get();
 
         if ($orderPackages == null ||  count($orderPackages) == 0) return;
 

+ 1 - 1
app/Services/OrderService.php

@@ -283,7 +283,7 @@ SQL;
                 $sql .= ")";
             }
         }
-        if ($edisendflag2) $sql .= " and edisendflag2 like '" . $edisendflag2 . "%'";
+        if ($edisendflag2) $sql .= " AND (edisendflag2 = '" . $edisendflag2 . "' OR edisendflag3 = '".$edisendflag2."')";
         if ($edisendflag) $sql .= " and edisendflag like '" . $edisendflag . "%'";
         if ($manualflag) $sql .= " and manualflag = '" . $manualflag . "'";
         if ($soreference1) {

+ 60 - 4
app/Services/OwnerService.php

@@ -124,8 +124,8 @@ class OwnerService implements UserFilter
     }
 
     public function firstOrCreate(array $params, array $values = null){
-        if (!$values) return Owner::query()->firstOrCreate($params);
-        return Owner::query()->firstOrCreate($params,$values);
+        if (!$values) return Owner::query()->whereNull("deleted_at")->firstOrCreate($params);
+        return Owner::query()->whereNull("deleted_at")->firstOrCreate($params,$values);
     }
 
 
@@ -270,8 +270,38 @@ class OwnerService implements UserFilter
                 else $builder->where('owner_id',$param);
                 continue;
             }
-            if ($column == 'user_work_group'){
-                $builder->where("user_workgroup_id",$param);
+//            if ($column == 'user_work_group'){
+//                $builder->where("user_workgroup_id",$param);
+//                continue;
+//            }
+            if ($column == 'kcGroup'){
+                $builder->whereHas("departmentObligationOwner",function($query)use($param){
+                    $query->where('obligation_code','kc')->where('department_id',$param);
+                });
+                continue;
+            }
+            if ($column == 'jgGroup'){
+                $builder->whereHas("departmentObligationOwner",function($query)use($param){
+                    $query->where('obligation_code','jg')->where('department_id',$param);
+                });
+                continue;
+            }
+            if ($column == 'fhGroup'){
+                $builder->whereHas("departmentObligationOwner",function($query)use($param){
+                    $query->where('obligation_code','fh')->where('department_id',$param);
+                });
+                continue;
+            }
+            if ($column == 'thGroup'){
+                $builder->whereHas("departmentObligationOwner",function($query)use($param){
+                    $query->where('obligation_code','th')->where('department_id',$param);
+                });
+                continue;
+            }
+            if ($column == 'shGroup'){
+                $builder->whereHas("departmentObligationOwner",function($query)use($param){
+                    $query->where('obligation_code','sh')->where('department_id',$param);
+                });
                 continue;
             }
             if (is_array($param))$builder->whereIn($column,$param);
@@ -561,4 +591,30 @@ sql;
         }
         return $query->whereNull("deleted_at");
     }
+
+    public function combineOwners($owners)
+    {
+        foreach ($owners as $owner){
+            $departmentObligationOwner=$owner->departmentObligationOwner??false;
+            if (!$departmentObligationOwner)continue;
+            foreach ($departmentObligationOwner as $item){
+                if ($item->obligation_code=='kc'){
+                    $owner->kc=$item->department_id;$owner->kcGroup=$item->department?$item->department->name:'';
+                }
+                if ($item->obligation_code=='jg'){
+                    $owner->jg=$item->department_id;$owner->jgGroup=$item->department?$item->department->name:'';
+                }
+                if ($item->obligation_code=='th'){
+                    $owner->th=$item->department_id;$owner->thGroup=$item->department?$item->department->name:'';
+                }
+                if ($item->obligation_code=='sh'){
+                    $owner->sh=$item->department_id;$owner->shGroup=$item->department?$item->department->name:'';
+                }
+                if ($item->obligation_code=='fh'){
+                    $owner->fh=$item->department_id;$owner->fhGroup=$item->department?$item->department->name:'';
+                }
+            }
+        }
+        return $owners;
+    }
 }

+ 12 - 5
app/Services/StoreItemService.php

@@ -35,11 +35,18 @@ class StoreItemService
 
     public function getAsnDetailsByAsnHerder($asnHerders)
     {
-        return OracleDOCASNDetail::query()
-            ->with(['lineStatus', 'qualityStatus'])
-            ->whereIn('asnno',array_unique(data_get($asnHerders, '*.asnno')))
-            ->select('asnno','asnlineno','customerid','sku','skudescrc','linestatus','lotatt08','lotatt05','receivedqty','expectedqty','addtime','edittime')
-            ->get();
+        $asnnos=array_unique(data_get($asnHerders, '*.asnno'));
+        $collect=collect();
+        foreach (array_chunk($asnnos,1000) as $item){
+            $res= OracleDOCASNDetail::query()
+                ->with(['lineStatus', 'qualityStatus'])
+                ->whereIn('asnno',$item)
+                ->select('asnno','asnlineno','customerid','sku','skudescrc','linestatus','lotatt08','lotatt05','receivedqty','expectedqty','addtime','edittime')
+                ->get();
+            $collect->merge($res);
+        }
+        return $collect;
+
     }
 
     public function createStoreItem($asnDetails)

+ 30 - 4
app/Services/WorkOrderCommoditiesService.php

@@ -2,7 +2,6 @@
 
 namespace App\Services;
 
-use App\Commodity;
 use App\Traits\ServiceAppAop;
 use App\WorkOrder;
 use App\WorkOrderCommodities;
@@ -16,9 +15,17 @@ class WorkOrderCommoditiesService
     public function createWorkOrderCommodityByJson(WorkOrder $workOrder, $json)
     {
         $obj = json_decode($json);
-        $owner_id = $workOrder->order->owner_id ?? '';
-        $commodity = Commodity::query()->where('owner_id', $owner_id)->where('sku', $obj->sku)->first();
-        $workOrder->commodities()->create(['sku' => $obj->sku, 'amount' => $obj->amount, 'commodity_id' => $commodity->id ?? '']);
+        $workOrder->commodities()->create([
+            'commodity_id' => $obj->commodity_id ?? '',
+            'sku' => $obj->sku,
+            'amount' => $obj->amount ?? '',
+            'logistic_number' => $obj->logistic_number ?? '',
+            'abnormal_amount' => $obj->abnormal_amount ?? '',
+            'check_amount' => $obj->check_amount ?? '',
+            'bao_shi_check_amount' => $obj->bao_shi_check_amount ?? '',
+            'check_result' => $obj->check_result ?? '',
+            'process_result' => $commodity->process_result ?? '',
+        ]);
     }
 
     /**
@@ -32,4 +39,23 @@ class WorkOrderCommoditiesService
             $this->createWorkOrderCommodityByJson($workOrder, $json);
         }
     }
+
+    public function updateWorkOrderCommoditiesByJsonArray(WorkOrder $workOrder, $array)
+    {
+        foreach ($array as $json) {
+            $this->updateWorkOrderCommoditiesByJson($workOrder, $json);
+        }
+    }
+
+    public function updateWorkOrderCommoditiesByJson(WorkOrder $workOrder, $json)
+    {
+        $obj = json_decode($json);
+        $workOrder->commodities()->where('id', $obj->id)->update([
+            'check_amount' => $obj->check_amount ?? '',
+            'bao_shi_check_amount' => $obj->bao_shi_check_amount ?? '',
+            'check_result' => $obj->check_result ?? '',
+            'process_result' => $obj->process_result ?? '',
+        ]);
+    }
+
 }

+ 34 - 24
app/Services/WorkOrderImageService.php

@@ -15,15 +15,13 @@ class WorkOrderImageService
      * 外包装
      * @param $workOrder
      * @param $images
-     * @param bool $isLoadMissing
      */
-    public function createWorkOrderPackageImages($workOrder,$images, bool $isLoadMissing = true)
+    public function createWorkOrderPackageImages($workOrder,$images)
     {
         foreach ($images as $image) {
            $this->createWorkOrderPackageImage($workOrder,$image);
         }
-        if ($isLoadMissing)$workOrder->loadMissing('packageImages');
-    }
+     }
 
     /**
      * @param $workOrder
@@ -32,9 +30,9 @@ class WorkOrderImageService
     public function createWorkOrderPackageImage($workOrder,$image)
     {
         /** @var UploadedFile  $image */
-        $count = $workOrder->packageImages()->count();
+        $count = $workOrder->images()->where('type',1)->count();
         /** @var WorkOrderImage $workOrderImage */
-        $workOrderImage = $workOrder->packageImages()->create(['type' => 1, 'number' => ++$count]);
+        $workOrderImage = $workOrder->images()->create(['type' => 1, 'number' => ++$count]);
         $workOrderImage->saveFile($image);
     }
 
@@ -42,15 +40,13 @@ class WorkOrderImageService
      * 工单商品
      * @param $workOrder
      * @param $images
-     * @param bool $isLoadMissing
      */
-    public function createWorkOrderCommodityImages($workOrder,$images, bool $isLoadMissing = true)
+    public function createWorkOrderCommodityImages($workOrder,$images)
     {
         foreach ($images as $image) {
             $this->createWorkOrderCommodityImage($workOrder,$image);
         }
-        if ($isLoadMissing)$workOrder->loadMissing('commodityImages');
-    }
+     }
 
     /**
      * @param $workOrder
@@ -59,9 +55,9 @@ class WorkOrderImageService
     public function createWorkOrderCommodityImage($workOrder,$image)
     {
         /** @var UploadedFile  $image */
-        $count = $workOrder->commodityImages()->count();
+        $count = $workOrder->images()->where('type',2)->count();
         /** @var WorkOrderImage $workOrderImage */
-        $workOrderImage = $workOrder->commodityImages()->create(['type' => 2, 'number' => ++$count]);
+        $workOrderImage = $workOrder->images()->create(['type' => 2, 'number' => ++$count]);
         $workOrderImage->saveFile($image);
     }
 
@@ -69,22 +65,20 @@ class WorkOrderImageService
      * 交易截图
      * @param $workOrder
      * @param $images
-     * @param bool $isLoadMissing
      */
-    public function createWorkOrderDealImages($workOrder,$images, bool $isLoadMissing = true)
+    public function createWorkOrderDealImages($workOrder,$images)
     {
         foreach ($images as $image) {
             $this->createWorkOrderDealImage($workOrder,$image);
         }
-        if ($isLoadMissing)$workOrder->loadMissing('dealImages');
-    }
+     }
 
     public function createWorkOrderDealImage($workOrder,$image)
     {
         /** @var UploadedFile  $image */
-        $count = $workOrder->dealImages()->count();
+        $count = $workOrder->images()->where('type',3)->count();
         /** @var WorkOrderImage $workOrderImage */
-        $workOrderImage = $workOrder->dealImages()->create(['type' => 3, 'number' => ++$count]);
+        $workOrderImage = $workOrder->images()->create(['type' => 3, 'number' => ++$count]);
         $workOrderImage->saveFile($image);
     }
 
@@ -92,22 +86,38 @@ class WorkOrderImageService
      * 退款截图
      * @param $workOrder
      * @param $images
-     * @param bool $isLoadMissing
      */
-    public function createWorkOrderRefundImages($workOrder, $images, bool $isLoadMissing = true)
+    public function createWorkOrderRefundImages($workOrder, $images)
     {
         foreach ($images as $image) {
             $this->createWorkOrderRefundImage($workOrder,$image);
         }
-        if ($isLoadMissing)$workOrder->loadMissing('refundImages');
-    }
+     }
 
     public function createWorkOrderRefundImage($workOrder,$image)
     {
         /** @var UploadedFile  $image */
-        $count = $workOrder->refundImages()->count();
+        $count = $workOrder->images()->where('type',4)->count();
         /** @var WorkOrderImage $workOrderImage */
-        $workOrderImage = $workOrder->refundImages()->create(['type' => 4, 'number' => ++$count]);
+        $workOrderImage = $workOrder->images()->create(['type' => 4, 'number' => ++$count]);
         $workOrderImage->saveFile($image);
     }
+
+
+    public function createImages($workOrder,$package_images = null,$commodity_images = null,$deal_images = null,$refund_images = null)
+    {
+        if ($package_images) $this->createWorkOrderPackageImages($workOrder,$package_images);
+        if ($commodity_images) $this->createWorkOrderCommodityImages($workOrder,$commodity_images);
+        if ($deal_images) $this->createWorkOrderDealImages($workOrder,$deal_images);
+        if ($refund_images) $this->createWorkOrderRefundImages($workOrder,$refund_images);
+    }
+
+    public function createWorkOrderImages($workOrder,$params)
+    {
+        $package_images=  $params['packageImages'] ?? [];
+        $commodity_images = $params['commodityImages'] ?? [];
+        $deal_images  = $params['dealImages'] ?? [];
+        $refund_images = $params['refundImages'] ?? [];
+        $this->createImages($workOrder,$package_images,$commodity_images,$deal_images,$refund_images);
+    }
 }

+ 28 - 0
app/Services/WorkOrderLogService.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace App\Services;
+
+use App\Traits\ServiceAppAop;
+use App\WorkOrder;
+use App\WorkOrderLog;
+use Illuminate\Support\Facades\Auth;
+
+class WorkOrderLogService
+{
+    use ServiceAppAop;
+
+    protected $modelClass = WorkOrderLog::class;
+
+    public function createLog(WorkOrder $workOrder, $type, $content)
+    {
+        $user = Auth::user();
+        $log = new WorkOrderLog([
+            'work_order_id' => $workOrder->id,
+            'type' => $type,
+            'creator_id' => $user['id'] ?? '',
+            'content' => $content
+        ]);
+        $log->save();
+    }
+
+}

+ 174 - 51
app/Services/WorkOrderService.php

@@ -8,6 +8,7 @@ use App\OrderIssueType;
 use App\OrderPackage;
 use App\Traits\ServiceAppAop;
 use App\WorkOrder;
+use App\WorkOrderProcessLog;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Support\Carbon;
@@ -20,6 +21,36 @@ 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;
+    private $detailService;
+    private $issueTypeService;
+    private $orderService;
+
+    public function __construct(WorkOrderLogService $logService,
+                                WorkOrderImageService $imageService,
+                                WorkOrderCommoditiesService $commoditiesService,
+                                WorkOrderDetailService $detailService,
+                                OrderIssueTypeService $issueTypeService,
+                                OrderService $orderService)
+    {
+        $this->logService = $logService;
+        $this->imageService = $imageService;
+        $this->commoditiesService = $commoditiesService;
+        $this->detailService = $detailService;
+        $this->issueTypeService = $issueTypeService;
+        $this->orderService = $orderService;
+    }
+
     /**
      * 获取可生成工单的问题件类型
      * @return Builder[]|Collection
@@ -29,7 +60,7 @@ class WorkOrderService
         if (Gate::allows('订单管理-工单处理-客服编辑') || Gate::allows('订单管理-工单处理-货主编辑')) {
             return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '其他', '快递异常', '错漏发', '破损', '快递丢件'])->get();
         } else if (Gate::allows('订单管理-工单处理-承运商编辑')) {
-            return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '破损', '快递丢件'])->get();
+            return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '破损', '快递丢件', '快递异常'])->get();
         }
         return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '其他', '快递异常', '错漏发', '破损', '快递丢件'])->get();
     }
@@ -62,22 +93,30 @@ class WorkOrderService
         return ['success' => true];
     }
 
-    public function createAndNotification($order, $orderIssueType, $remark): WorkOrder
+    public function createWorkOrder($order, $issueType, $remark)
     {
         $user = Auth::user();
-        /** @var WorkOrder $workOrder */
-        $workOrder = WorkOrder::query()->create([
+
+        return WorkOrder::query()->create([
             'order_id' => $order->id,
-            'creator_id' => $user["id"],
-            'owner_id' => $order->owner_id,
+            'logistic_id' => $order->logistic_id ?? '',
+            'owner_id' => $order->owner_id ?? '',
+            'creator_id' => $user['id'] ?? '',
             'remark' => $remark,
             'outer_table_name' => 'orders',
-            'order_issue_type_id' => $orderIssueType->id,
+            'order_issue_type_id' => $issueType->id,
             'uniquely_tag' => $order->code,
-            'status' => 1,
-            'work_order_status' => 1
+            'status' => 0,
         ]);
+    }
+
+    public function createAndNotification($order, $orderIssueType, $remark): WorkOrder
+    {
+        /** @var WorkOrder $workOrder */
+        $workOrder = $this->createWorkOrder($order, $orderIssueType, $remark);
+
         $workOrder->notification();
+
         return $workOrder;
     }
 
@@ -86,10 +125,19 @@ class WorkOrderService
      */
     public function createInterceptWorkOrder($param): WorkOrder
     {
-        $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '拦截']);
-        $order = Order::query()->where('code', $param['order_no'])->first();
-        $remark = $param['remark'] ?? '';
-        return $this->createAndNotification($order, $orderIssueType, $remark);
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '拦截']);
+
+        $order = $this->orderService->first(['code' => $param['order_no']]);
+
+        $remark = $param['remark'] ?? '拦截工单';
+
+        $workOrder = $this->createAndNotification($order, $issueType, $remark);
+
+        $workOrder->changeStatus('承运商处理');
+
+        $this->logService->createLog($workOrder, '创建', '创建');
+
+        return $workOrder;
     }
 
     /**
@@ -97,10 +145,17 @@ class WorkOrderService
      */
     public function createMistakeWorkOrder($param): WorkOrder
     {
-        $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '错漏发']);
-        $order = Order::query()->where('code', $param['order_no'])->first();
-        $remark = $param['remark'] ?? '';
-        return $this->createAndNotification($order, $orderIssueType, $remark);
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '错漏发']);
+
+        $order = $this->orderService->first(['code' => $param['order_no']]);
+
+        $workOrder = $this->createAndNotification($order, $issueType, $param['remark'] ?? '');
+
+        $this->commoditiesService->createWorkOrderCommoditiesByJsonArray($workOrder, $param['commodities']);
+
+        $workOrder->changeStatus('宝时处理');
+
+        return $workOrder;
     }
 
     /**
@@ -108,25 +163,21 @@ class WorkOrderService
      */
     public function createDamagedWorkOrder($param): WorkOrder
     {
-        $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '破损']);
-        $order = Order::query()->where('code', $param['order_no'])->first();
-        $remark = $param['remark'] ?? '';
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '破损']);
 
-        $workOrderImageService = app('WorkOrderImageService');
+        $order = $this->orderService->first(['code' => $param['order_no']]);
 
-        $workOrder = $this->createAndNotification($order, $orderIssueType, $remark);
+        $workOrder = $this->createAndNotification($order, $issueType, $param['remark'] ?? '');
 
-        $workOrderImageService->createWorkOrderPackageImages($workOrder, $param['packageImages']);
+        $this->imageService->createWorkOrderImages($workOrder, $param);
 
-        $workOrderImageService->createWorkOrderCommodityImages($workOrder, $param['commodityImages']);
+        $this->detailService->createWorkOrderDetail($workOrder, $param);
 
-        $workOrderImageService->createWorkOrderDealImages($workOrder, $param['dealImages']);
+        $this->commoditiesService->createWorkOrderCommoditiesByJsonArray($workOrder, $param['commodities']); // 登记商品信息
 
-        app('WorkOrderDetailService')->createWorkOrderDetail($workOrder, $param);
+        $workOrder->changeStatus('承运商处理');
 
-        app('WorkOrderCommoditiesService')->createWorkOrderCommoditiesByJsonArray($workOrder, $param['commodities']); // 登记商品信息
-
-        $workOrder->update(['work_order_status' => 2]); // 标记信息已填写
+        $this->logService->createLog($workOrder, '创建', '创建工单');
 
         return $workOrder;
     }
@@ -136,10 +187,21 @@ class WorkOrderService
      */
     public function createExpressAbnormalWorkOrder($param): WorkOrder
     {
-        $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '快递异常']);
-        $order = Order::query()->where('code', $param['order_no'])->first();
-        $remark = $param['remark'] ?? '';
-        return $this->createAndNotification($order, $orderIssueType, $remark);
+        $order = $this->orderService->first(['code' => $param['order_no']]);
+
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '快递异常']);
+
+        $workOrder = $this->createAndNotification($order, $issueType, $param['remark'] ?? '');
+
+        $this->imageService->createWorkOrderImages($workOrder, $param);
+
+        $this->commoditiesService->createWorkOrderCommoditiesByJsonArray($workOrder, $param['commodities']);
+
+        $workOrder->changeStatus('承运商处理');
+
+        $this->logService->createLog($workOrder, '创建', '创建工单');
+
+        return $workOrder;
     }
 
     /***
@@ -147,12 +209,15 @@ class WorkOrderService
      */
     public function createInformationChangeWorkOrder($param): WorkOrder
     {
-        $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '信息更改']);
-        $order = Order::query()->where('code', $param['order_no'])->first();
-        $remark = $param['remark'] ?? '';
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '信息更改']);
+
+        $order = $this->orderService->first(['code' => $param['order_no']]);
+
+        $workOrder = $this->createAndNotification($order, $issueType, $param['remark'] ?? '');
 
-        $workOrder = $this->createAndNotification($order, $orderIssueType, $remark);
-//        $workOrder->update(['work_order_status' => ]); // 标记信息已填写
+        $workOrder->changeStatus('承运商处理');
+
+        $this->logService->createLog($workOrder, '创建', '创建工单');
 
         return $workOrder;
     }
@@ -162,10 +227,11 @@ class WorkOrderService
      */
     public function createDefaultWorkOrder($param): WorkOrder
     {
-        $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '其他']);
-        $order = Order::query()->where('code', $param['order_no'])->first();
-        $remark = $param['remark'] ?? '';
-        return $this->createAndNotification($order, $orderIssueType, $remark);
+        $orderIssueType = $this->issueTypeService->firstOrCreate(['name' => '其他']);
+
+        $order = $this->orderService->first(['code' => $param['order_no']]);
+
+        return $this->createAndNotification($order, $orderIssueType, $param['remark'] ?? '');
     }
 
     /**
@@ -173,11 +239,16 @@ class WorkOrderService
      */
     public function createLossWorkOrder($param): WorkOrder
     {
-        $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '快递丢件']);
-        $order = Order::query()->where('code', $param['order_no'])->first();
-        $remark = $param['remark'] ?? '';
-        $workOrder = $this->createAndNotification($order, $orderIssueType, $remark);
-        $workOrder->update(['work_order_status' => 1]); // 标记信息未填写
+        $orderIssueType = $this->issueTypeService->firstOrCreate(['name' => '快递丢件']);
+
+        $order = $this->orderService->first(['code' => $param['order_no']]);
+
+        $workOrder = $this->createAndNotification($order, $orderIssueType, $param['remark'] ?? '');
+
+        $workOrder->changeStatus('货主处理');
+
+        $this->logService->createLog($workOrder, '创建', '创建工单');
+
         return $workOrder;
     }
 
@@ -187,13 +258,39 @@ class WorkOrderService
     public function fillLossWorkOrder(WorkOrder $workOrder, $param): WorkOrder
     {
         $workOrder->saveWorkOrderDetail($param);        // 收方信息 丢件价值 补发单号
-        $workOrder->addDealImage($param['dealImages']); // 交易截图
-        $workOrder->addRefundImage($param['refundImages'] ?? []); // 退款截图
-        $workOrder->update(['work_order_status' => 2]); // 标记信息填写
-        $workOrder->loadDefaultWith();
+
+        $this->imageService->createWorkOrderImages($workOrder, $param);
+
+        $workOrder->changeStatus('承运商处理');
+
+        $this->logService->createLog($workOrder, '处理', '填充丢件信息');
+
+        $this->commoditiesService->createWorkOrderCommoditiesByJsonArray($workOrder, $param['commodities'] ?? '');
+
         return $workOrder;
     }
 
+    public function end(WorkOrder $workOrder)
+    {
+        $workOrder->end();
+
+        $this->logService->createLog($workOrder, '完结', '完结工单');
+    }
+
+    public function logisticEnd(WorkOrder $workOrder)
+    {
+        $workOrder->changeStatus('完成');
+        $this->logService->createLog($workOrder, '完结', '承运商完结工单');
+    }
+
+    public function find($id): WorkOrder
+    {
+        /** @var WorkOrder $item */
+        $item = WorkOrder::query()->where('id', $id)->first();
+        return $item;
+    }
+
+
     /**
      * 工单审核
      * @param $wordOrder
@@ -202,11 +299,25 @@ class WorkOrderService
     public function review($wordOrder): array
     {
         $wordOrder->update(['reviewer_id' => Auth::user()['id'], 'review_at' => Carbon::now(), 'status' => '2',]);
+
         $workOrders = WorkOrder::query()->defaultWith()->whereIn('id', [$wordOrder['id']])->get();
+
         $this->tags($workOrders);
+
         return ['success' => true, 'data' => $workOrders->first()];
     }
 
+    public function baoShiReview(WorkOrder $workOrder,$params)
+    {
+        $user = Auth::user();
+
+        $workOrder->update(['reviewer_id' => $user['id'], 'review_at' => Carbon::now(), 'status' => '5']);
+
+        $this->logService->createLog($workOrder,'终审','终审完成');
+
+        $this->commoditiesService->updateWorkOrderCommoditiesByJsonArray($workOrder,$params);
+    }
+
     /**
      * 批量审核工单
      * @param $workOrders
@@ -314,4 +425,16 @@ class WorkOrderService
             else $order->is_work_order = false;
         }
     }
+
+    public function checkWorkOrder($nos)
+    {
+        return  WorkOrder::query()->defaultWith()->whereIn('order_id', function ($query) use ($nos) {
+            $query->from('orders')->selectRaw('id');
+            if (is_array($nos))
+                $query->whereIn('code', $nos);
+            else {
+                $query->where('code', $nos);
+            }
+        })->get();
+    }
 }

+ 125 - 156
app/WorkOrder.php

@@ -24,41 +24,45 @@ class WorkOrder extends Model
 
     // 工单 信息
     protected $fillable = [
+        'owner_id',      // 货主
+        'logistic_id',      // 承运商
+        'order_issue_type_id', // 问题件类型
         'status',           // 审核状态
         'creator_id',       // 创建人
         'reviewer_id',      // 审核人
-        'owner_id',      // 货主
-        'order_issue_type_id', // 问题件类型
-        'work_order_type_id',  // 工单类型
-        'grad',         // 紧急等级
-        'remark',       // 工单信息描述
-        'outer_table_name',     // 链接表名
         'review_at',            // 审核时间
         'order_id',             // 订单id
         'uniquely_tag',         // 唯一标识
-        'work_order_status', // 工单状态
+        'remark',       // 工单信息描述
+//        'work_order_type_id',  // 工单类型
+//        'grad',         // 紧急等级
+//        'outer_table_name',     // 链接表名
+//        'work_order_status', // 工单状态
     ];
 
     static public $enums = [
         'status' => [
             '' => 0,
-            '待审核' => 1,
-            '已处理' => 2,
-        ],
-        'work_order_status' => [
-            '' => 0,
-            '创建' => 1,
-            '信息已填写' => 2,
-            '快递已处理' => 3,
-            '工单完成' => 4,
-        ],
-        'grad' => [
-            '' => 0,
-            '一般' => 1,
-            '重要' => 2,
-            '紧急' => 3,
-            '重要且紧急' => 4,
+            '宝时处理' => 1,
+            '货主处理' => 2,
+            '承运商处理' => 3,
+            '宝时终审' => 4,
+            '完成' => 5,
         ],
+//        'work_order_status' => [
+//            '' => 0,
+//            '创建' => 1,
+//            '信息已填写' => 2,
+//            '快递已处理' => 3,
+//            '工单完成' => 4,
+//        ],
+//        'grad' => [
+//            '' => 0,
+//            '一般' => 1,
+//            '重要' => 2,
+//            '紧急' => 3,
+//            '重要且紧急' => 4,
+//        ],
     ];
 
     function __construct(array $attributes = [])
@@ -77,7 +81,7 @@ class WorkOrder extends Model
 
     public function setStatusAttribute($value)
     {
-        if (!$value) return ;
+        if (!$value) return;
         if (is_numeric($value)) {
             $this->attributes['status'] = $value;
         } else {
@@ -85,36 +89,54 @@ class WorkOrder extends Model
         }
     }
 
-    public function getWorkOrderStatusAttribute($value)
-    {
-        if (!$value) return '';
-        return self::$enums['work_order_status'][$value];
-    }
+//    public function getWorkOrderStatusAttribute($value)
+//    {
+//        if (!$value) return '';
+//        return self::$enums['work_order_status'][$value];
+//    }
+//
+//    public function setWorkOrderStatusAttribute($value)
+//    {
+//        if (!$value) return ;
+//        if (is_numeric($value)) {
+//            $this->attributes['work_order_status'] = $value;
+//        } else {
+//            $this->attributes['work_order_status'] = self::$enums['work_order_status'][$value];
+//        }
+//    }
+//
+//    public function getGradAttribute($value)
+//    {
+//        if (!$value) return '';
+//        return self::$enums['grad'][$value];
+//    }
+//
+//    public function setGradAttribute($value)
+//    {
+//        if (!$value) return ;
+//        if (is_numeric($value)) {
+//            $this->attributes['grad'] = $value;
+//        } else {
+//            $this->attributes['grad'] = self::$enums['grad'][$value];
+//        }
+//    }
 
-    public function setWorkOrderStatusAttribute($value)
+    // 关联订单
+    public function order(): BelongsTo
     {
-        if (!$value) return ;
-        if (is_numeric($value)) {
-            $this->attributes['work_order_status'] = $value;
-        } else {
-            $this->attributes['work_order_status'] = self::$enums['work_order_status'][$value];
-        }
+        return $this->belongsTo(Order::class);
     }
 
-    public function getGradAttribute($value)
+    // 关联货主
+    public function owner(): BelongsTo
     {
-        if (!$value) return '';
-        return self::$enums['grad'][$value];
+        return $this->belongsTo(Owner::class, 'owner_id');
     }
 
-    public function setGradAttribute($value)
+    // 关联承运商
+    public function logistic(): BelongsTo
     {
-        if (!$value) return ;
-        if (is_numeric($value)) {
-            $this->attributes['grad'] = $value;
-        } else {
-            $this->attributes['grad'] = self::$enums['grad'][$value];
-        }
+        return $this->belongsTo(Logistic::class);
     }
 
     // 创建人
@@ -129,18 +151,6 @@ class WorkOrder extends Model
         return $this->belongsTo(User::class, 'reviewer_id');
     }
 
-    // 关联订单
-    public function order(): BelongsTo
-    {
-        return $this->belongsTo(Order::class);
-    }
-
-    // 关联货主
-    public function owner(): BelongsTo
-    {
-        return $this->belongsTo(Owner::class, 'owner_id');
-    }
-
     // 工单类型
     public function type(): BelongsTo
     {
@@ -153,42 +163,39 @@ class WorkOrder extends Model
         return $this->belongsTo(OrderIssueType::class, 'order_issue_type_id');
     }
 
-    /** 对应问题件 */
+    // 对应问题件
     public function orderIssue(): BelongsTo
     {
         return $this->belongsTo(OrderIssue::class, 'order_id', 'order_id');
     }
 
     // 图片
-    public function image(): HasMany
+    public function images(): HasMany
     {
         return $this->hasMany(WorkOrderImage::class);
     }
 
-    // 外包装图片
-    public function packageImages(): HasMany
+    public function getPackageImagesAttribute()
     {
-        return $this->hasMany(WorkOrderImage::class)->where('type', 1);
+        return $this->images->where('type', 1);
     }
 
-    // 内物破损图片
-    public function commodityImages(): HasMany
+    public function getCommodityImagesAttribute()
     {
-        return $this->hasMany(WorkOrderImage::class)->where('type', 2);
+        return $this->images->where('type', 2);
     }
 
-    // 交易图片
-    public function dealImages(): HasMany
+    public function getDealImagesAttribute()
     {
-        return $this->hasMany(WorkOrderImage::class)->where('type', 3);
+        return $this->images->where('type', 3);
     }
 
-    // 退款图片
-    public function refundImages(): HasMany
+    public function getRefundImagesAttribute()
     {
-        return $this->hasMany(WorkOrderImage::class)->where('type', 4);
+        return $this->images->where('type', 4);
     }
 
+
     // 工单详情
     public function details(): HasMany
     {
@@ -201,16 +208,25 @@ class WorkOrder extends Model
         return $this->hasMany(WorkOrderCommodities::class);
     }
 
-    // 宝时处理日志
-    public function processLog(): HasOne
+    // 处理日志
+    public function processLogs(): HasMany
+    {
+        return $this->hasMany(WorkOrderProcessLog::class);
+    }
+
+    public function baoShiLog()
+    {
+        return $this->processLogs->where('type', 1);
+    }
+
+    public function logisticLog()
     {
-        return $this->hasOne(WorkOrderProcessLog::class)->where('type','1');
+        return $this->processLogs->where('type', 2);
     }
 
-    // 承运商处理日志
-    public function logisticLog(): HasOne
+    public function logs(): HasMany
     {
-        return $this->hasOne(WorkOrderProcessLog::class)->where('type','2');
+        return $this->hasMany(WorkOrderLog::class);
     }
 
     public function scopeFilter($query, $filters)
@@ -218,48 +234,35 @@ class WorkOrder extends Model
         return $filters->apply($query);
     }
 
-
     /** 默认 with 参数 */
     public function scopeDefaultWith($query)
     {
-        $query->with(['type', 'owner', 'issueType', 'creator','details','commodities.commodity',
-            'processLog.creator',
-            'logisticLog.creator',
-            'packageImages.uploadFile',
-            'commodityImages.uploadFile',
-            'dealImages.uploadFile',
-            'refundImages.uploadFile',
+        $query->with(['type', 'owner', 'logistic', 'issueType', 'creator', 'details', 'commodities.commodity','logs.creator',
+            'processLogs.creator',
+            'images.uploadFile',
             'reviewer',
-            'order' => function ($query) {
-            /** @var Builder $query  */
-            $query->with('packages', 'logistic', 'owner');
-        }, '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');
-                }
+            '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');
+                    }
+                }]);
             }]);
-        }]);
     }
 
     public function loadDefaultWith()
     {
-        $this->loadMissing(['owner','type', 'issueType', 'creator','details','commodities.commodity',
-            'processLog.creator',
-            'logisticLog.creator',
-            'packageImages.uploadFile',
-            'commodityImages.uploadFile',
-            'dealImages.uploadFile',
-            'refundImages.uploadFile',
+        $this->loadMissing(['type', 'owner', 'logistic', 'issueType', 'creator', 'details', 'commodities.commodity','logs.creator',
+            'processLogs.creator',
+            'images.uploadFile',
             'reviewer',
-            'order' => function ($query) {
-                /** @var Builder $query  */
-                $query->with('packages', 'logistic', 'owner');
-            }, 'orderIssue' => function ($query) {
-                /** @var Builder $query  */
+            'order.packages',
+            'orderIssue' => function ($query) {
+                /** @var Builder $query */
                 $query->with(['issueType', 'logs' => function ($query) {
                     if (Gate::denies('订单管理-问题件-客户不可见')) {
                         $query->with('user')->orderByDesc('created_at');
@@ -281,56 +284,22 @@ class WorkOrder extends Model
         NotificationService::SingleRegister($msg, $clientCode, "订单管理-问题件");
     }
 
-    public function addPackageImage($images)
-    {       // 外包装图
-        foreach ($images as $image) {
-            /** @var UploadedFile  $image */
-            $count = $this->packageImages()->count();
-            /** @var WorkOrderImage $workOrderImage */
-            $workOrderImage = $this->packageImages()->create(['type' => 0, 'amount' => ++$count]);
-            $workOrderImage->saveFile($image);
-        }
-        $this->loadMissing('packageImages');
-    }
-
-    public function addCommodityImage($images)
-    {       // 内物破损图
-        foreach ($images as $image) {
-            $count = $this->commodityImages()->count();
-            /** @var WorkOrderImage $workOrderImage */
-            $workOrderImage = $this->commodityImages()->create(['type' => 1, 'amount' => ++$count]);
-            $workOrderImage->saveFile($image);
-        }
-        $this->loadMissing('commodityImages');
-    }
-
-    public function addDealImage($images)
-    {       // 交易截图
-        foreach ($images as $image) {
-            $count = $this->dealImages()->count();
-            /** @var WorkOrderImage $workOrderImage */
-            $workOrderImage = $this->dealImages()->create(['type' => 2, 'amount' => ++$count]);
-            $workOrderImage->saveFile($image);
-        }
-        $this->loadMissing('dealImages');
-    }
-
-    public function addRefundImage($images)
-    {        // 退款截图
-        foreach ($images as $image) {
-            $count = $this->refundImages()->count();
-            /** @var WorkOrderImage $workOrderImage */
-            $workOrderImage = $this->refundImages()->create(['type' => 3, 'amount' => ++$count]);
-            $workOrderImage->saveFile($image);
-        }
-        $this->loadMissing('dealImages');
-    }
-
     public function saveWorkOrderDetail($params)
     {
-        $param  = (new WorkOrderDetail($params))->getAttributes();
+        $param = (new WorkOrderDetail($params))->getAttributes();
         $this->details()->create($param);
         $this->loadMissing('details');
     }
 
+    // 工单完结
+    public function end()
+    {
+        $this->update(['status'  => 4]);
+    }
+
+    public function changeStatus($status)
+    {
+        $this->status = $status;
+        $this->update();
+    }
 }

+ 7 - 2
app/WorkOrderCommodities.php

@@ -13,12 +13,17 @@ class WorkOrderCommodities extends Model
     use ModelLogChanging;
     use ModelTimeFormat;
 
-    //
     protected $fillable = [
         'work_order_id',
         'commodity_id',
         'sku',
-        'amount',
+        'logistic_number',      // 快递单号数量
+        'check_amount',         // 复核数量
+        'bao_shi_check_amount', // 宝时复核数量
+        'abnormal_amount',      // 异常数量
+        'amount',               // 订单数量
+        'check_result',         // 核实结果
+        'process_result',       // 处理结果
     ];
 
     public function workOrder(): BelongsTo

+ 1 - 1
app/WorkOrderImage.php

@@ -87,7 +87,7 @@ class WorkOrderImage extends Model
         $fileSuffix = $image->getClientOriginalExtension();
 
         if (!is_uploaded_file($tmpFile)) return false;
-        if ($image->getSize() > 5 * 1024 * 1024) return false;
+//        if ($image->getSize() > 5 * 1024 * 1024) return false;
         if (!in_array($fileSuffix,[ 'gif','image','jpeg','jpg','png','svg'])) return false;
         return true;
     }

+ 60 - 0
app/WorkOrderLog.php

@@ -0,0 +1,60 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+use App\Traits\ModelLogChanging;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
+
+class WorkOrderLog extends Model
+{
+    use ModelTimeFormat;
+
+    protected $fillable = ['work_order_id','content','type','creator_id'];
+
+    static public $enums = [
+        'type' => [
+            '' => 0,
+            '创建' => 1,
+            '处理' => 2,
+            '终审' => 3,
+            '完结' => 4,
+        ],
+    ];
+
+    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 workOrder(): BelongsTo
+    {
+        return $this->belongsTo(WorkOrder::class);
+    }
+
+    public function creator(): BelongsTo
+    {
+        return $this->belongsTo(User::class);
+    }
+}

+ 101 - 156
composer.lock

@@ -18,7 +18,13 @@
                 "type": "zip",
                 "url": "https://api.github.com/repos/topclaudy/compoships/zipball/df6a9eb558d03c2c8be2ebb07e277568eb3302c0",
                 "reference": "df6a9eb558d03c2c8be2ebb07e277568eb3302c0",
-                "shasum": ""
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
             },
             "require": {
                 "illuminate/database": ">=5.6 <9.0"
@@ -1219,16 +1225,16 @@
         },
         {
             "name": "facade/ignition",
-            "version": "2.15.0",
+            "version": "2.16.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/facade/ignition.git",
-                "reference": "3ee6e94815462bcf09bca0efc1c9069685df8da3"
+                "reference": "23400e6cc565c9dcae2c53704b4de1c4870c0697"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/facade/ignition/zipball/3ee6e94815462bcf09bca0efc1c9069685df8da3",
-                "reference": "3ee6e94815462bcf09bca0efc1c9069685df8da3",
+                "url": "https://api.github.com/repos/facade/ignition/zipball/23400e6cc565c9dcae2c53704b4de1c4870c0697",
+                "reference": "23400e6cc565c9dcae2c53704b4de1c4870c0697",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -1298,7 +1304,7 @@
                 "issues": "https://github.com/facade/ignition/issues",
                 "source": "https://github.com/facade/ignition"
             },
-            "time": "2021-10-11T15:24:06+00:00"
+            "time": "2021-10-28T11:47:23+00:00"
         },
         {
             "name": "facade/ignition-contracts",
@@ -1425,16 +1431,16 @@
         },
         {
             "name": "firebase/php-jwt",
-            "version": "v5.4.0",
+            "version": "v5.5.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/firebase/php-jwt.git",
-                "reference": "d2113d9b2e0e349796e72d2a63cf9319100382d2"
+                "reference": "83b609028194aa042ea33b5af2d41a7427de80e6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d2113d9b2e0e349796e72d2a63cf9319100382d2",
-                "reference": "d2113d9b2e0e349796e72d2a63cf9319100382d2",
+                "url": "https://api.github.com/repos/firebase/php-jwt/zipball/83b609028194aa042ea33b5af2d41a7427de80e6",
+                "reference": "83b609028194aa042ea33b5af2d41a7427de80e6",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -1482,9 +1488,9 @@
             ],
             "support": {
                 "issues": "https://github.com/firebase/php-jwt/issues",
-                "source": "https://github.com/firebase/php-jwt/tree/v5.4.0"
+                "source": "https://github.com/firebase/php-jwt/tree/v5.5.1"
             },
-            "time": "2021-06-23T19:00:23+00:00"
+            "time": "2021-11-08T20:18:51+00:00"
         },
         {
             "name": "guzzlehttp/guzzle",
@@ -2794,16 +2800,16 @@
         },
         {
             "name": "markbaker/complex",
-            "version": "2.0.3",
+            "version": "3.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/MarkBaker/PHPComplex.git",
-                "reference": "6f724d7e04606fd8adaa4e3bb381c3e9db09c946"
+                "reference": "ab8bc271e404909db09ff2d5ffa1e538085c0f22"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/6f724d7e04606fd8adaa4e3bb381c3e9db09c946",
-                "reference": "6f724d7e04606fd8adaa4e3bb381c3e9db09c946",
+                "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/ab8bc271e404909db09ff2d5ffa1e538085c0f22",
+                "reference": "ab8bc271e404909db09ff2d5ffa1e538085c0f22",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -2825,51 +2831,7 @@
             "autoload": {
                 "psr-4": {
                     "Complex\\": "classes/src/"
-                },
-                "files": [
-                    "classes/src/functions/abs.php",
-                    "classes/src/functions/acos.php",
-                    "classes/src/functions/acosh.php",
-                    "classes/src/functions/acot.php",
-                    "classes/src/functions/acoth.php",
-                    "classes/src/functions/acsc.php",
-                    "classes/src/functions/acsch.php",
-                    "classes/src/functions/argument.php",
-                    "classes/src/functions/asec.php",
-                    "classes/src/functions/asech.php",
-                    "classes/src/functions/asin.php",
-                    "classes/src/functions/asinh.php",
-                    "classes/src/functions/atan.php",
-                    "classes/src/functions/atanh.php",
-                    "classes/src/functions/conjugate.php",
-                    "classes/src/functions/cos.php",
-                    "classes/src/functions/cosh.php",
-                    "classes/src/functions/cot.php",
-                    "classes/src/functions/coth.php",
-                    "classes/src/functions/csc.php",
-                    "classes/src/functions/csch.php",
-                    "classes/src/functions/exp.php",
-                    "classes/src/functions/inverse.php",
-                    "classes/src/functions/ln.php",
-                    "classes/src/functions/log2.php",
-                    "classes/src/functions/log10.php",
-                    "classes/src/functions/negative.php",
-                    "classes/src/functions/pow.php",
-                    "classes/src/functions/rho.php",
-                    "classes/src/functions/sec.php",
-                    "classes/src/functions/sech.php",
-                    "classes/src/functions/sin.php",
-                    "classes/src/functions/sinh.php",
-                    "classes/src/functions/sqrt.php",
-                    "classes/src/functions/tan.php",
-                    "classes/src/functions/tanh.php",
-                    "classes/src/functions/theta.php",
-                    "classes/src/operations/add.php",
-                    "classes/src/operations/subtract.php",
-                    "classes/src/operations/multiply.php",
-                    "classes/src/operations/divideby.php",
-                    "classes/src/operations/divideinto.php"
-                ]
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -2889,22 +2851,22 @@
             ],
             "support": {
                 "issues": "https://github.com/MarkBaker/PHPComplex/issues",
-                "source": "https://github.com/MarkBaker/PHPComplex/tree/2.0.3"
+                "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.1"
             },
-            "time": "2021-06-02T09:44:11+00:00"
+            "time": "2021-06-29T15:32:53+00:00"
         },
         {
             "name": "markbaker/matrix",
-            "version": "2.1.3",
+            "version": "3.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/MarkBaker/PHPMatrix.git",
-                "reference": "174395a901b5ba0925f1d790fa91bab531074b61"
+                "reference": "c66aefcafb4f6c269510e9ac46b82619a904c576"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/174395a901b5ba0925f1d790fa91bab531074b61",
-                "reference": "174395a901b5ba0925f1d790fa91bab531074b61",
+                "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/c66aefcafb4f6c269510e9ac46b82619a904c576",
+                "reference": "c66aefcafb4f6c269510e9ac46b82619a904c576",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -2930,25 +2892,7 @@
             "autoload": {
                 "psr-4": {
                     "Matrix\\": "classes/src/"
-                },
-                "files": [
-                    "classes/src/Functions/adjoint.php",
-                    "classes/src/Functions/antidiagonal.php",
-                    "classes/src/Functions/cofactors.php",
-                    "classes/src/Functions/determinant.php",
-                    "classes/src/Functions/diagonal.php",
-                    "classes/src/Functions/identity.php",
-                    "classes/src/Functions/inverse.php",
-                    "classes/src/Functions/minors.php",
-                    "classes/src/Functions/trace.php",
-                    "classes/src/Functions/transpose.php",
-                    "classes/src/Operations/add.php",
-                    "classes/src/Operations/directsum.php",
-                    "classes/src/Operations/subtract.php",
-                    "classes/src/Operations/multiply.php",
-                    "classes/src/Operations/divideby.php",
-                    "classes/src/Operations/divideinto.php"
-                ]
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -2969,9 +2913,9 @@
             ],
             "support": {
                 "issues": "https://github.com/MarkBaker/PHPMatrix/issues",
-                "source": "https://github.com/MarkBaker/PHPMatrix/tree/2.1.3"
+                "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.0"
             },
-            "time": "2021-05-25T15:42:17+00:00"
+            "time": "2021-07-01T19:01:15+00:00"
         },
         {
             "name": "monolog/monolog",
@@ -3146,16 +3090,16 @@
         },
         {
             "name": "nesbot/carbon",
-            "version": "2.53.1",
+            "version": "2.54.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/briannesbitt/Carbon.git",
-                "reference": "f4655858a784988f880c1b8c7feabbf02dfdf045"
+                "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f4655858a784988f880c1b8c7feabbf02dfdf045",
-                "reference": "f4655858a784988f880c1b8c7feabbf02dfdf045",
+                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/eed83939f1aed3eee517d03a33f5ec587ac529b5",
+                "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -3172,6 +3116,7 @@
                 "symfony/translation": "^3.4 || ^4.0 || ^5.0"
             },
             "require-dev": {
+                "doctrine/dbal": "^2.0 || ^3.0",
                 "doctrine/orm": "^2.7",
                 "friendsofphp/php-cs-fixer": "^3.0",
                 "kylekatarnls/multi-tester": "^2.0",
@@ -3242,20 +3187,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-09-06T09:29:23+00:00"
+            "time": "2021-11-01T21:22:20+00:00"
         },
         {
             "name": "nikic/php-parser",
-            "version": "v4.13.0",
+            "version": "v4.13.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/nikic/PHP-Parser.git",
-                "reference": "50953a2691a922aa1769461637869a0a2faa3f53"
+                "reference": "63a79e8daa781cac14e5195e63ed8ae231dd10fd"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/50953a2691a922aa1769461637869a0a2faa3f53",
-                "reference": "50953a2691a922aa1769461637869a0a2faa3f53",
+                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/63a79e8daa781cac14e5195e63ed8ae231dd10fd",
+                "reference": "63a79e8daa781cac14e5195e63ed8ae231dd10fd",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -3302,9 +3247,9 @@
             ],
             "support": {
                 "issues": "https://github.com/nikic/PHP-Parser/issues",
-                "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.0"
+                "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.1"
             },
-            "time": "2021-09-20T12:20:58+00:00"
+            "time": "2021-11-03T20:52:16+00:00"
         },
         {
             "name": "opis/closure",
@@ -3721,16 +3666,16 @@
         },
         {
             "name": "phpoffice/phpspreadsheet",
-            "version": "1.18.0",
+            "version": "1.19.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
-                "reference": "418cd304e8e6b417ea79c3b29126a25dc4b1170c"
+                "reference": "a9ab55bfae02eecffb3df669a2e19ba0e2f04bbf"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/418cd304e8e6b417ea79c3b29126a25dc4b1170c",
-                "reference": "418cd304e8e6b417ea79c3b29126a25dc4b1170c",
+                "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/a9ab55bfae02eecffb3df669a2e19ba0e2f04bbf",
+                "reference": "a9ab55bfae02eecffb3df669a2e19ba0e2f04bbf",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -3755,8 +3700,8 @@
                 "ext-zlib": "*",
                 "ezyang/htmlpurifier": "^4.13",
                 "maennchen/zipstream-php": "^2.1",
-                "markbaker/complex": "^2.0",
-                "markbaker/matrix": "^2.0",
+                "markbaker/complex": "^3.0",
+                "markbaker/matrix": "^3.0",
                 "php": "^7.2 || ^8.0",
                 "psr/http-client": "^1.0",
                 "psr/http-factory": "^1.0",
@@ -3825,9 +3770,9 @@
             ],
             "support": {
                 "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
-                "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.18.0"
+                "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.19.0"
             },
-            "time": "2021-05-31T18:21:15+00:00"
+            "time": "2021-10-31T15:09:20+00:00"
         },
         {
             "name": "phpoption/phpoption",
@@ -4070,16 +4015,16 @@
         },
         {
             "name": "psr/container",
-            "version": "1.1.1",
+            "version": "1.1.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-fig/container.git",
-                "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
+                "reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
-                "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
+                "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
+                "reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -4089,7 +4034,7 @@
                 ]
             },
             "require": {
-                "php": ">=7.2.0"
+                "php": ">=7.4.0"
             },
             "type": "library",
             "autoload": {
@@ -4118,9 +4063,9 @@
             ],
             "support": {
                 "issues": "https://github.com/php-fig/container/issues",
-                "source": "https://github.com/php-fig/container/tree/1.1.1"
+                "source": "https://github.com/php-fig/container/tree/1.1.2"
             },
-            "time": "2021-03-05T17:36:06+00:00"
+            "time": "2021-11-05T16:50:12+00:00"
         },
         {
             "name": "psr/event-dispatcher",
@@ -4936,16 +4881,16 @@
         },
         {
             "name": "symfony/console",
-            "version": "v5.3.7",
+            "version": "v5.3.10",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a"
+                "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/8b1008344647462ae6ec57559da166c2bfa5e16a",
-                "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a",
+                "url": "https://api.github.com/repos/symfony/console/zipball/d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3",
+                "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -5021,7 +4966,7 @@
                 "terminal"
             ],
             "support": {
-                "source": "https://github.com/symfony/console/tree/v5.3.7"
+                "source": "https://github.com/symfony/console/tree/v5.3.10"
             },
             "funding": [
                 {
@@ -5037,7 +4982,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-08-25T20:02:16+00:00"
+            "time": "2021-10-26T09:30:15+00:00"
         },
         {
             "name": "symfony/css-selector",
@@ -5588,16 +5533,16 @@
         },
         {
             "name": "symfony/http-foundation",
-            "version": "v5.3.7",
+            "version": "v5.3.10",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-foundation.git",
-                "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5"
+                "reference": "9f34f02e8a5fdc7a56bafe011cea1ce97300e54c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e36c8e5502b4f3f0190c675f1c1f1248a64f04e5",
-                "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9f34f02e8a5fdc7a56bafe011cea1ce97300e54c",
+                "reference": "9f34f02e8a5fdc7a56bafe011cea1ce97300e54c",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -5647,7 +5592,7 @@
             "description": "Defines an object-oriented layer for the HTTP specification",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/http-foundation/tree/v5.3.7"
+                "source": "https://github.com/symfony/http-foundation/tree/v5.3.10"
             },
             "funding": [
                 {
@@ -5663,20 +5608,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-08-27T11:20:35+00:00"
+            "time": "2021-10-11T15:41:55+00:00"
         },
         {
             "name": "symfony/http-kernel",
-            "version": "v5.3.9",
+            "version": "v5.3.10",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-kernel.git",
-                "reference": "ceaf46a992f60e90645e7279825a830f733a17c5"
+                "reference": "703e4079920468e9522b72cf47fd76ce8d795e86"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ceaf46a992f60e90645e7279825a830f733a17c5",
-                "reference": "ceaf46a992f60e90645e7279825a830f733a17c5",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/703e4079920468e9522b72cf47fd76ce8d795e86",
+                "reference": "703e4079920468e9522b72cf47fd76ce8d795e86",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -5765,7 +5710,7 @@
             "description": "Provides a structured process for converting a Request into a Response",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/http-kernel/tree/v5.3.9"
+                "source": "https://github.com/symfony/http-kernel/tree/v5.3.10"
             },
             "funding": [
                 {
@@ -5781,7 +5726,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-09-28T10:25:11+00:00"
+            "time": "2021-10-29T08:36:48+00:00"
         },
         {
             "name": "symfony/mime",
@@ -7249,16 +7194,16 @@
         },
         {
             "name": "symfony/string",
-            "version": "v5.3.7",
+            "version": "v5.3.10",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/string.git",
-                "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5"
+                "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/string/zipball/8d224396e28d30f81969f083a58763b8b9ceb0a5",
-                "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5",
+                "url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c",
+                "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -7318,7 +7263,7 @@
                 "utf8"
             ],
             "support": {
-                "source": "https://github.com/symfony/string/tree/v5.3.7"
+                "source": "https://github.com/symfony/string/tree/v5.3.10"
             },
             "funding": [
                 {
@@ -7334,20 +7279,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-08-26T08:00:08+00:00"
+            "time": "2021-10-27T18:21:46+00:00"
         },
         {
             "name": "symfony/translation",
-            "version": "v5.3.9",
+            "version": "v5.3.10",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/translation.git",
-                "reference": "6e69f3551c1a3356cf6ea8d019bf039a0f8b6886"
+                "reference": "6ef197aea2ac8b9cd63e0da7522b3771714035aa"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/translation/zipball/6e69f3551c1a3356cf6ea8d019bf039a0f8b6886",
-                "reference": "6e69f3551c1a3356cf6ea8d019bf039a0f8b6886",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/6ef197aea2ac8b9cd63e0da7522b3771714035aa",
+                "reference": "6ef197aea2ac8b9cd63e0da7522b3771714035aa",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -7419,7 +7364,7 @@
             "description": "Provides tools to internationalize your application",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/translation/tree/v5.3.9"
+                "source": "https://github.com/symfony/translation/tree/v5.3.10"
             },
             "funding": [
                 {
@@ -7435,7 +7380,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-08-26T08:22:53+00:00"
+            "time": "2021-10-10T06:43:24+00:00"
         },
         {
             "name": "symfony/translation-contracts",
@@ -7523,16 +7468,16 @@
         },
         {
             "name": "symfony/var-dumper",
-            "version": "v5.3.8",
+            "version": "v5.3.10",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/var-dumper.git",
-                "reference": "eaaea4098be1c90c8285543e1356a09c8aa5c8da"
+                "reference": "875432adb5f5570fff21036fd22aee244636b7d1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/eaaea4098be1c90c8285543e1356a09c8aa5c8da",
-                "reference": "eaaea4098be1c90c8285543e1356a09c8aa5c8da",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/875432adb5f5570fff21036fd22aee244636b7d1",
+                "reference": "875432adb5f5570fff21036fd22aee244636b7d1",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -7597,7 +7542,7 @@
                 "dump"
             ],
             "support": {
-                "source": "https://github.com/symfony/var-dumper/tree/v5.3.8"
+                "source": "https://github.com/symfony/var-dumper/tree/v5.3.10"
             },
             "funding": [
                 {
@@ -7613,7 +7558,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-09-24T15:59:58+00:00"
+            "time": "2021-10-26T09:30:15+00:00"
         },
         {
             "name": "te7a-houdini/laravel-trix",
@@ -8460,16 +8405,16 @@
         },
         {
             "name": "maximebf/debugbar",
-            "version": "v1.17.2",
+            "version": "v1.17.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/maximebf/php-debugbar.git",
-                "reference": "3541f09f09c003c4a9ff7ddb0eb3361a7f14d418"
+                "reference": "e8ac3499af0ea5b440908e06cc0abe5898008b3c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/3541f09f09c003c4a9ff7ddb0eb3361a7f14d418",
-                "reference": "3541f09f09c003c4a9ff7ddb0eb3361a7f14d418",
+                "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/e8ac3499af0ea5b440908e06cc0abe5898008b3c",
+                "reference": "e8ac3499af0ea5b440908e06cc0abe5898008b3c",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -8525,9 +8470,9 @@
             ],
             "support": {
                 "issues": "https://github.com/maximebf/php-debugbar/issues",
-                "source": "https://github.com/maximebf/php-debugbar/tree/v1.17.2"
+                "source": "https://github.com/maximebf/php-debugbar/tree/v1.17.3"
             },
-            "time": "2021-10-18T09:39:00+00:00"
+            "time": "2021-10-19T12:33:27+00:00"
         },
         {
             "name": "mockery/mockery",

+ 12 - 0
database/factories/WorkOrderLogFactory.php

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

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

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class WorkOrdersAddColunmsLogisticId extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('work_orders', function (Blueprint $table) {
+            $table->integer('logistic_id')->index()->comment('承运商');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('work_orders', function (Blueprint $table) {
+            $table->dropColumn('logistic_id');
+        });
+    }
+}

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

@@ -0,0 +1,43 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddColunmsToWorkOrderCommodities extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('work_order_commodities', function (Blueprint $table) {
+            $table->string('logistic_number')->comment('快递单号');
+
+
+            $table->string('check_result')->comment('核实结果');
+            $table->string('process_result')->comment('处理结果');
+
+            $table->integer('check_amount')->comment('核实数量');
+            $table->integer('abnormal_amount')->comment('异常数量');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('work_order_commodities', function (Blueprint $table) {
+            $table->dropColumn('check_result');
+            $table->dropColumn('process_result');
+            $table->dropColumn('logistic_number');
+            $table->dropColumn('check_amount');
+            $table->dropColumn('abnormal_amount');
+        });
+    }
+}

+ 35 - 0
database/migrations/2021_10_28_090804_create_work_order_logs_table.php

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateWorkOrderLogsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('work_order_logs', function (Blueprint $table) {
+            $table->id();
+            $table->integer('work_order_id')->index()->comment('工单');
+            $table->string('content')->comment('详情');
+            $table->integer('type')->comment('类型');
+            $table->integer('creator_id')->comment('创建人');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('work_order_logs');
+    }
+}

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

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class WorkOrderCommoditiesAddColumnsBaoShiCheckAmount extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('work_order_commodities', function (Blueprint $table) {
+            $table->integer('bao_shi_check_amount')->comment('宝时审核数量');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('work_order_commodities', function (Blueprint $table) {
+            $table->dropColumn('');
+        });
+    }
+}

+ 16 - 0
database/seeds/WorkOrderLogSeeder.php

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

+ 65 - 6
resources/views/customer/project/create.blade.php

@@ -97,6 +97,11 @@
                     waring_line_on : "{{$owner->waring_line_on ?? ''}}",
                     subjection : "{{$owner->subjection ?? ''}}",
                     is_tax_exist : "{{$owner->is_tax_exist ?? ''}}"==='Y',
+                    kc :"{{$owner->kc ?? ''}}",
+                    jg :"{{$owner->jg ?? ''}}",
+                    th :"{{$owner->th ?? ''}}",
+                    sh :"{{$owner->sh ?? ''}}",
+                    fh :"{{$owner->fh ?? ''}}",
                 },
                 ownerTemp : {},
                 customers : [
@@ -482,7 +487,12 @@
                     if (!this.owner.customer_id) error["customer_id"] = ["必须选择客户"];
                     if (!this.owner.owner_group_id) error["owner_group_id"] = ["必须选择项目小组"];
                     if (!this.owner.warehouse_id) error["warehouse_id"] = ["必须选择仓库"];
-                    if (!this.owner.user_workgroup_id) error["user_workgroup_id"] = ["必须选择仓库小组"];
+                    // if (!this.owner.user_workgroup_id) error["user_workgroup_id"] = ["必须选择仓库小组"];
+                    if (!this.owner.kc) error["kc"] = ["必须选择库存组"];
+                    if (!this.owner.jg) error["jg"] = ["必须选择加工组"];
+                    if (!this.owner.th) error["th"] = ["必须选择退货组"];
+                    if (!this.owner.sh) error["sh"] = ["必须选择收货组"];
+                    if (!this.owner.fh) error["fh"] = ["必须选择发货组"];
                     //if (!this.owner.tax_rate_id) error["tax_rate_id"] = ["必须选择税率"];
                     if (JSON.stringify(error) !== "{}"){
                         this.errors = error;
@@ -494,7 +504,11 @@
                     let old = this.ownerTemp;
                     if (params.customer_id !== old.customer_id ||
                     params.owner_group_id !== old.owner_group_id ||
-                    params.user_workgroup_id !== old.user_workgroup_id ||
+                    params.kc !== old.kc ||
+                    params.jg !== old.jg ||
+                    params.th !== old.th ||
+                    params.sh !== old.sh ||
+                    params.fh !== old.fh ||
                     params.warehouse_id !== old.warehouse_id ||
                     params.tax_rate_id !== old.tax_rate_id ||
                     params.waring_line_on !== old.waring_line_on ||
@@ -512,7 +526,12 @@
                             this.errors = [];
                             this.ownerTemp.customer_id = res.customer_id;
                             this.ownerTemp.owner_group_id = res.owner_group_id;
-                            this.ownerTemp.user_workgroup_id = res.user_workgroup_id;
+                            // this.ownerTemp.user_workgroup_id = res.user_workgroup_id;
+                            if (res.department_obligation_owner.obligation_code==='kc')this.ownerTemp.kc = res.department_obligation_owner.obligation_id;
+                            if (res.department_obligation_owner.obligation_code==='jg')this.ownerTemp.jg = res.department_obligation_owner.obligation_id;
+                            if (res.department_obligation_owner.obligation_code==='th')this.ownerTemp.th = res.department_obligation_owner.obligation_id;
+                            if (res.department_obligation_owner.obligation_code==='sh')this.ownerTemp.sh = res.department_obligation_owner.obligation_id;
+                            if (res.department_obligation_owner.obligation_code==='fh')this.ownerTemp.fh = res.department_obligation_owner.obligation_id;
                             this.ownerTemp.warehouse_id = res.warehouse_id;
                             this.ownerTemp.tax_rate_id = res.tax_rate_id;
                             this.ownerTemp.waring_line_on = res.waring_line_on;
@@ -2059,12 +2078,52 @@
                         }
                     });
                 },
-                filterUserGroup(e){
+                filterkc(e){
                     let value = e.target.value;
-                    if (!value)this.owner.user_workgroup_id = "";
+                    if (!value)this.owner.kc = "";
                     this.userGroups.some(userGroup=>{
                         if (userGroup.name.indexOf(value)!==-1){
-                            this.owner.user_workgroup_id = userGroup.id;
+                            this.owner.kc = userGroup.id;
+                            return true;
+                        }
+                    });
+                },
+                filterjg(e){
+                    let value = e.target.value;
+                    if (!value)this.owner.jg = "";
+                    this.userGroups.some(userGroup=>{
+                        if (userGroup.name.indexOf(value)!==-1){
+                            this.owner.jg = userGroup.id;
+                            return true;
+                        }
+                    });
+                },
+                filterth(e){
+                    let value = e.target.value;
+                    if (!value)this.owner.th = "";
+                    this.userGroups.some(userGroup=>{
+                        if (userGroup.name.indexOf(value)!==-1){
+                            this.owner.th = userGroup.id;
+                            return true;
+                        }
+                    });
+                },
+                filtersh(e){
+                    let value = e.target.value;
+                    if (!value)this.owner.sh = "";
+                    this.userGroups.some(userGroup=>{
+                        if (userGroup.name.indexOf(value)!==-1){
+                            this.owner.sh = userGroup.id;
+                            return true;
+                        }
+                    });
+                },
+                filterfh(e){
+                    let value = e.target.value;
+                    if (!value)this.owner.fh = "";
+                    this.userGroups.some(userGroup=>{
+                        if (userGroup.name.indexOf(value)!==-1){
+                            this.owner.fh = userGroup.id;
                             return true;
                         }
                     });

+ 25 - 5
resources/views/customer/project/index.blade.php

@@ -64,7 +64,12 @@
                     <td><span>@{{ owner.name }}</span></td>
                     <td><span>@{{ owner.customer_name }}</span></td>
                     <td><span>@{{ owner.user_owner_group_name }}</span></td>
-                    <td><span>@{{ owner.user_work_group_name }}</span></td>
+{{--                    <td><span>@{{ owner.user_work_group_name }}</span></td>--}}
+                    <td><span>@{{ owner.kcGroup }}</span></td>
+                    <td><span>@{{ owner.jgGroup }}</span></td>
+                    <td><span>@{{ owner.thGroup }}</span></td>
+                    <td><span>@{{ owner.shGroup }}</span></td>
+                    <td><span>@{{ owner.fhGroup }}</span></td>
                     <td><span><b>@{{owner.relevance ? owner.relevance.length : 0}}</b>/6&nbsp;<span class="badge badge-success" v-if="owner.audit_count>0">@{{ owner.audit_count }}项待审</span></span></td>
                     <td><span>@{{ owner.created_at }}</span></td>
                     <td><span>@{{ owner.customer_company_name }}</span></td>
@@ -108,7 +113,13 @@
                         is_activation : "{{$owner->deleted_at ? '否' : '是'}}",
                         ownerStoragePriceModels : {!! $owner->ownerStoragePriceModels !!},
                         audit_count:"{{count($owner->storageAudit)+count($owner->operationAudit)+count($owner->expressAudit)+count($owner->logisticAudit)+count($owner->directLogisticAudit)+($owner->systemAudit ? 1 : 0)}}",
-                        a:"{{$owner}}"
+                        a:"{{$owner}}",
+                        kc:"{{$owner->kc}}", kcGroup:"{{$owner->kcGroup}}",
+                        jg:"{{$owner->jg}}", jgGroup:"{{$owner->jgGroup}}",
+                        th:"{{$owner->th}}", thGroup:"{{$owner->thGroup}}",
+                        sh:"{{$owner->sh}}", shGroup:"{{$owner->shGroup}}",
+                        fh:"{{$owner->fh}}", fhGroup:"{{$owner->fhGroup}}",
+
                     },
                     @endforeach
                 ],
@@ -140,8 +151,10 @@
                 let data=[
                     [
                         {name:'user_owner_group_id',type:'select',tip:'项目小组',placeholder: '项目小组',data:this.ownerGroups},
-                        {name:'user_work_group',type:'select',tip: '仓库小组搜索',placeholder: '仓库小组',data:this.user_work_groups},
-
+                        // {name:'user_work_group',type:'select',tip: '仓库小组搜索',placeholder: '仓库小组',data:this.user_work_groups},
+                        {name:'kcGroup',type:'select',tip: '库存组搜索',placeholder: '库存组',data:this.user_work_groups},
+                        {name:'jgGroup',type:'select',tip: '加工组搜索',placeholder: '加工组',data:this.user_work_groups},
+                        {name:'shGroup',type:'select',tip: '收货组搜索',placeholder: '收货组',data:this.user_work_groups},
                         {name:'created_at_start',type:'time',tip:['选择显示创建日期的起始时间','']},
                         {name:'ids',type:'select_multiple_select',tip:['输入关键词快速定位下拉列表,回车确定','选择要显示的项目'],
                             placeholder:['项目','定位或多选项目'],data:this.models},
@@ -149,6 +162,8 @@
                     ],[
                         {name:'customers',type:'select_multiple_select',tip:['客户','定位或多选项目'],placeholder: ['客户','定位或多选项目'],data:this.customers},
                         {name:'using_type',type:'select',placeholder: '用仓类型',data:[{name:"常温",value:"常温"},{name:"恒温",value:"恒温"}]},
+                        {name:'thGroup',type:'select',tip: '退货组搜索',placeholder: '退货组',data:this.user_work_groups},
+                        {name:'fhGroup',type:'select',tip: '发货组搜索',placeholder: '发货组',data:this.user_work_groups},
                         {name:'created_at_end',type:'time',tip:['选择显示创建日期的结束时间','']},
                     ],
                 ];
@@ -162,7 +177,12 @@
                     {name:'name',value: '项目'},
                     {name:'customer',value: '客户'},
                     {name:'user_owner_group_name',value: '项目小组'},
-                    {name:'user_work_group_name',value: '仓库小组'},
+                    // {name:'user_work_group_name',value: '仓库小组'},
+                    {name:'kc',value: '库存组'},
+                    {name:'jg',value: '加工组'},
+                    {name:'th',value: '退货组'},
+                    {name:'sh',value: '收货组'},
+                    {name:'fh',value: '发货组'},
                     {name:'relevance', neglect: true,value: '计费模型填写情况'},
                     {name:'created_at',value: '创建日期'},
                     {name:'customer_full_name',value: '公司全称'},

+ 49 - 7
resources/views/customer/project/part/_two.blade.php

@@ -9,11 +9,11 @@
     </span>
 </div>
 <div class="row mt-3">
-    <label for="owner_group_id" class="col-2 text-info">项目组</label>
+    <label for="owner_group_id" class="col-2 text-info">项目组</label>
     <select id="owner_group_id" v-model="owner.owner_group_id" @change="selectGroup()" class="form-control form-control-sm col-4 mb-0" :class="errors.owner_group_id ? 'is-invalid' : ''" >
         <option v-for="ownerGroup in ownerGroups" :value="ownerGroup.id">@{{ ownerGroup.name }}</option>
     </select>
-    <label class="col-2"><input type="text" class="form-control form-control-sm rounded-pill" placeholder="输入关键字项目组" @input="filterOwnerGroup($event)"></label>
+    <label class="col-2"><input type="text" class="form-control form-control-sm rounded-pill" placeholder="输入关键字项目组" @input="filterOwnerGroup($event)"></label>
     <span class="invalid-feedback offset-2 mt-0" role="alert" v-if="errors.owner_group_id">
         <strong>@{{ errors.owner_group_id[0] }}</strong>
     </span>
@@ -27,16 +27,58 @@
         <strong>@{{ errors.warehouse_id[0] }}</strong>
     </span>
 </div>
+
 <div class="row mt-3">
-    <label for="user_workgroup_id" class="col-2 text-info">仓库小组</label>
-    <select id="user_workgroup_id" v-model="owner.user_workgroup_id" @change="selectGroup()" class="form-control form-control-sm col-4 mb-0" :class="errors.user_workgroup_id ? 'is-invalid' : ''" >
+    <label for="kc" class="col-2 text-info">库存组</label>
+    <select id="kc" v-model="owner.kc" @change="selectKcGroup()"   class="form-control form-control-sm col-4 mb-0" :class="errors.kc ? 'is-invalid' : ''" >
         <option v-for="userGroup in userGroups" :value="userGroup.id" v-if="userGroup.warehouse_id == owner.warehouse_id">@{{ userGroup.name }}</option>
     </select>
-    <label class="col-2"><input type="text" class="form-control form-control-sm rounded-pill" placeholder="输入关键字项目小组" @change="filterUserGroup($event)"></label>
-    <span class="invalid-feedback offset-2 mt-0" role="alert" v-if="errors.user_workgroup_id">
-        <strong>@{{ errors.user_workgroup_id[0] }}</strong>
+    <label class="col-2"><input type="text" class="form-control form-control-sm rounded-pill" placeholder="输入关键字库存组" @change="filterkc($event)"></label>
+    <span class="invalid-feedback offset-2 mt-0" role="alert" v-if="errors.kc">
+        <strong>@{{ errors.kc[0] }}</strong>
     </span>
 </div>
+<div class="row mt-3">
+    <label for="jg" class="col-2 text-info">加工组</label>
+    <select id="jg" v-model="owner.jg"  class="form-control form-control-sm col-4 mb-0" :class="errors.jg ? 'is-invalid' : ''" >
+        <option v-for="userGroup in userGroups" :value="userGroup.id" v-if="userGroup.warehouse_id == owner.warehouse_id">@{{ userGroup.name }}</option>
+    </select>
+    <label class="col-2"><input type="text" class="form-control form-control-sm rounded-pill" placeholder="输入关键字加工组" @change="filterjg($event)"></label>
+    <span class="invalid-feedback offset-2 mt-0" role="alert" v-if="errors.jg">
+        <strong>@{{ errors.jg[0] }}</strong>
+    </span>
+</div>
+<div class="row mt-3">
+    <label for="th" class="col-2 text-info">退货组</label>
+    <select id="th" v-model="owner.th"  class="form-control form-control-sm col-4 mb-0" :class="errors.th ? 'is-invalid' : ''" >
+        <option v-for="userGroup in userGroups" :value="userGroup.id" v-if="userGroup.warehouse_id == owner.warehouse_id">@{{ userGroup.name }}</option>
+    </select>
+    <label class="col-2"><input type="text" class="form-control form-control-sm rounded-pill" placeholder="输入关键字退货组" @change="filterth($event)"></label>
+    <span class="invalid-feedback offset-2 mt-0" role="alert" v-if="errors.th">
+        <strong>@{{ errors.th[0] }}</strong>
+    </span>
+</div>
+<div class="row mt-3">
+    <label for="sh" class="col-2 text-info">收货组</label>
+    <select id="sh" v-model="owner.sh"  class="form-control form-control-sm col-4 mb-0" :class="errors.sh ? 'is-invalid' : ''" >
+        <option v-for="userGroup in userGroups" :value="userGroup.id" v-if="userGroup.warehouse_id == owner.warehouse_id">@{{ userGroup.name }}</option>
+    </select>
+    <label class="col-2"><input type="text" class="form-control form-control-sm rounded-pill" placeholder="输入关键字收货组" @change="filtersh($event)"></label>
+    <span class="invalid-feedback offset-2 mt-0" role="alert" v-if="errors.sh">
+        <strong>@{{ errors.sh[0] }}</strong>
+    </span>
+</div>
+<div class="row mt-3">
+    <label for="fh" class="col-2 text-info">发货组</label>
+    <select id="fh" v-model="owner.fh"  class="form-control form-control-sm col-4 mb-0" :class="errors.fh ? 'is-invalid' : ''" >
+        <option v-for="userGroup in userGroups" :value="userGroup.id" v-if="userGroup.warehouse_id == owner.warehouse_id">@{{ userGroup.name }}</option>
+    </select>
+    <label class="col-2"><input type="text" class="form-control form-control-sm rounded-pill" placeholder="输入关键字发货组" @change="filterfh($event)"></label>
+    <span class="invalid-feedback offset-2 mt-0" role="alert" v-if="errors.fh">
+        <strong>@{{ errors.fh[0] }}</strong>
+    </span>
+</div>
+
 <div class="row mt-3">
     <label for="subjection" class="col-2">主体公司</label>
     <select id="subjection" v-model="owner.subjection" class="form-control form-control-sm col-4 mb-0" >

+ 172 - 0
resources/views/order/index/_workOrkerInfoModal.blade.php

@@ -0,0 +1,172 @@
+<div class="modal fade " id="work-order-info" tabindex="-1" role="dialog" aria-labelledby="checkModalLabel"
+     aria-hidden="true">
+    <div class="modal-dialog modal-xl modal-dialog-centered">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="work-order-info-modal">已有工单详情</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="alert alert-light mb-0 border border-top">
+                    <div class="">
+                        <div>
+                            <span class="text-monospace">客户订单号:</span>
+                            <span v-text="workOrderInfo.clientCode"></span>
+                        </div>
+                        <div>
+                            <span class="text-monospace">工单类型:</span>
+                            <span v-text="workOrderInfo.type"></span>
+                        </div>
+                        <div>
+                            <span class="text-monospace">内容:</span>
+                            <span v-text="workOrderInfo.remark"></span>
+                        </div>
+                    </div>
+
+                    <div class="">
+                        <span class="text-monospace">当前工单号:</span>
+                        <span v-text="workOrderInfo.id"></span>
+                    </div>
+
+                    <div class=""
+                         v-if="workOrderInfo?.logistic_numbers.length >0 ">
+                        <span class="text-monospace">快递单号:</span>
+                        <span v-for="logistic_number in (workOrderInfo?.logistic_numbers || [])"
+                              v-text="logistic_number"></span>
+                    </div>
+
+                    <div class="" v-if="workOrderInfo?.details.length > 0">
+                        <div class="" v-for="detail in (workOrderInfo?.details || [])">
+                            <div>
+                                <span class="text-monospace">价值:</span>
+                                <span v-text="detail.price"></span>
+                            </div>
+                            <div v-if="detail.return_logistic_number">
+                                <span class="text-monospace">退回单号:</span>
+                                <span v-text="detail.return_logistic_number"></span>
+                            </div>
+                            <div v-if="detail.reissue_logistic_number">
+                                <span class="text-monospace">补发单号:</span>
+                                <span v-text="detail.reissue_logistic_number"></span>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class=""
+                         v-if="workOrderInfo.packagesImages && workOrderInfo.packagesImages.length > 0">
+                        <div class="col-12">
+                            <span class="text-monospace">外包装截图</span>
+                        </div>
+                        <div class="card-body col-sm-6"
+                             v-for="image in workOrderInfo.packagesImages">
+                            <div class="">
+                                <img class="image-w" style="width: 100%"
+                                     :src="image.src"
+                                     alt="外包装截图">
+                            </div>
+                        </div>
+                    </div>
+
+
+                    <div class="" v-if="workOrderInfo.commodityImages && workOrderInfo.commodityImages.length > 0">
+                        <div class="col-12">
+                            <span class="text-monospace">内物破损图</span>
+                        </div>
+                        <div class="card-body col-sm-6"
+                             v-for="image in workOrderInfo.commodityImages">
+                            <div class="">
+                                <img class="image-w" style="width: 100%"
+                                     :src="image.src"
+                                     alt="内物破损图">
+                            </div>
+                        </div>
+                    </div>
+
+
+                    <div class="" v-if="workOrderInfo.dealImages  && workOrderInfo.dealImages.length > 0">
+                        <div class="col-12">
+                            <span class="text-monospace">交易截图</span>
+                        </div>
+                        <div class="card-body col-sm-6"
+                             v-for="image in workOrderInfo.dealImages">
+                            <div class="">
+                                <img class="image-w" style="width: 100%"
+                                     :src="image.src"
+                                     alt="交易截图">
+                            </div>
+                        </div>
+                    </div>
+
+
+                    <div class="" v-if="workOrderInfo.refundImages && workOrderInfo.refundImages.length > 0">
+                        <div class="col-12">
+                            <span class="text-monospace">退款截图</span>
+                        </div>
+                        <div class="card-body col-sm-6"
+                             v-for="image in workOrderInfo.refundImages">
+                            <div class="">
+                                <img class="image-w" style="width: 100%"
+                                     :src="image.src"
+                                     alt="退款截图">
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="" v-if="workOrderInfo.commodities && workOrderInfo.commodities.length > 0">
+                        <table class="table">
+                            <thead>
+                            <tr class="text-center">
+                                <td>快递单号</td>
+                                <td>sku</td>
+                                <td>商品名称</td>
+                                <td>订单数量</td>
+                                <td>异常数量</td>
+                                <td>核实数量</td>
+                                <td>核实原因</td>
+                                <td>处理结果</td>
+                            </tr>
+                            </thead>
+                            <tbody>
+                            <tr class="text-center" v-for="commodity in workOrderInfo.commodities">
+                                <td v-text="commodity.logistic_number"></td>
+                                <td v-text="commodity.sku"></td>
+                                <td v-text="commodity.name"></td>
+                                <td v-text="commodity.amount"></td>
+                                <td v-text="commodity.abnormal_amount"></td>
+                                <td v-text="commodity.check_amount"></td>
+                                <td v-text="commodity.check_result"></td>
+                                <td v-text="commodity.process_result"></td>
+                            </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+
+                <div class="container">
+                    <div class="row">
+                        <div class="col-sm-4 col-sm-offset-4">
+                            <button class="btn btn-sm btn-outline-primary"
+                                    @click="selectWorkOrderIndex(workOrderIndex-1)">
+                                上一单
+                            </button>
+                            <button class="btn btn-sm btn-outline-primary" @click="selectWorkOrderIndex(workOrderIndex+1)">
+                                下一单
+                            </button>
+                            <span  v-text="workOrderIndex+1"></span>/<span v-text="workOrderInfos.length"></span>
+                        </div>
+                    </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" @click="showCreateWorkOrder">继续生成工单
+                </button>
+            </div>
+        </div>
+    </div>
+</div>

+ 33 - 19
resources/views/order/index/_work_order_modal.blade.php

@@ -51,9 +51,9 @@
 
 
                 {{--信息更改--}}
-                <div class="form-group row" v-if="'信息更改' === workOrder.orderIssueType ">
+                <div class="form-group row" v-if="['信息更改'].includes(workOrder.orderIssueType) ">
                     <hr>
-                    <label for="order_issue_type" class="col-sm-2 col-form-label">新的收方信息</label>
+                    <label for="order_issue_type" class="col-sm-2 col-form-label text-right">新的收方信息</label>
                     <div class="col-sm-10">
                         <textarea class="form-control" name="" id="remake_info" cols="30" rows="5"
                                   v-model="workOrder.remark.info"></textarea>
@@ -104,9 +104,8 @@
                     </div>
                 </div>
 
-
-                <hr v-if="'破损' === workOrder.orderIssueType">
-                <div class="form-group row" v-if="'破损' === workOrder.orderIssueType">
+                <hr v-if=" ['破损','快递异常'].includes(workOrder.orderIssueType)">
+                <div class="form-group row" v-if="['破损','快递异常'].includes(workOrder.orderIssueType) ">
                     <label for="deal-image" class="col-sm-2 col-form-label text-right text-primary">交易截图</label>
                     <div class="col-sm-10">
                         <div class="border border-secondary h-auto" id="deal-image" style="min-height: 75px"
@@ -127,30 +126,45 @@
                     </div>
                 </div>
 
-                <hr v-if="'破损' === workOrder.orderIssueType">
-                <div class="form-group row" v-if="'破损' === workOrder.orderIssueType">
+                <hr v-if="['破损','错漏发','快递异常'].includes(workOrder.orderIssueType)">
+                <div class="form-group row" v-if="['破损','错漏发','快递异常'].includes(workOrder.orderIssueType)">
                     <label for="work-order-sku-amount"
-                           class="col-sm-2 col-form-label text-right text-primary">破损sku信息</label>
+                           class="col-sm-2 col-form-label text-right text-primary">商品信息</label>
                     <div class="col-sm-10">
                         <table class="table table-sm table-active table-grid-row">
-                            <tr class="text-center">
-                                <th>商品编码</th>
-                                <th>商品名称</th>
-                                <th>数量</th>
-                                <th>选中</th>
+                            <thead>
+                            <tr>
+                                <td class="text-center">快递单号</td>
+                                <td class="text-center">商品条码</td>
+                                <td class="text-center" v-if="['破损',].includes(workOrder.orderIssueType)">异常类型</td>
+                                <td class="text-center">商品名称</td>
+                                <td class="text-center">订单数量</td>
+                                <td class="text-center">异常数量</td>
+                                <td></td>
                             </tr>
-                            <tr v-for="(item,i) in workOrder.commodities" :key="i" class="text-center">
-                                <td><span v-text="item.sku"></span></td>
-                                <td><span v-text="item.name"></span></td>
+                            </thead>
+                            <tbody>
+                            <tr v-for="(commodity,i) in workOrder.commodities" class="text-center">
+                                <td><span v-text="commodity.logistic_number"></span></td>
+                                <td><span v-text="commodity.sku"></span></td>
+                                <td v-if="['破损',].includes(workOrder.orderIssueType)">
+                                    <span v-if="workOrder.orderIssueType === '破损'"
+                                          :data="commodity.abnormal_type = '破损'" >破损</span>
+{{--                                    <span v-if="workOrder.orderIssueType === '错漏发'"--}}
+{{--                                          :data="commodity.abnormal_type = '错漏发'"  >错漏发</span>--}}
+                                </td>
+                                <td><span v-text="commodity.name"></span></td>
+                                <td><span v-text="commodity.amount"></span></td>
                                 <td>
-                                    <input type="number" class="form-control form-control-sm" v-model="item.amount">
+                                    <input type="number" class="form-control form-control-sm" v-model="commodity.abnormal_amount">
                                 </td>
                                 <td>
-                                    <button type="button" class="btn btn-sm btn-outline-danger"
-                                            @click="workOrder.commodities.splice(i,1)">删除
+                                    <button type="button" class="close" @click="workOrder.commodities.splice(i,1)">
+                                        <span aria-hidden="true" class="text-danger">&times;</span>
                                     </button>
                                 </td>
                             </tr>
+                            </tbody>
                         </table>
                     </div>
                 </div>

+ 218 - 65
resources/views/order/index/delivering.blade.php

@@ -57,7 +57,7 @@
 
                     <button class="btn btn-sm ml-1 btn-primary" @click="copyLogisticNumber()">复制快递单号</button>
                     @can('订单管理-订单-生成工单')
-                        <button class="btn btn-sm ml-1 btn-outline-success" @click="showInterceptModel()">生成工单</button>
+                        <button class="btn btn-sm ml-1 btn-outline-success" @click="checkWorkOrderOrCreateWorkOrder">生成工单</button>
                     @endcan
                     @can('订单管理-订单-一键回传')
                         <button class="btn btn-sm ml-1 btn-success tooltipTarget"
@@ -325,6 +325,7 @@
                 </div>
                 @can('订单管理-订单-生成工单')
                     @include('order.index._work_order_modal')
+                    @include('order.index._workOrkerInfoModal')
                 @endcan
                 <textarea id="clipboardDiv" style="opacity:0"></textarea>
             </div>
@@ -411,6 +412,21 @@
                     {name: '重要且紧急', value: '4'},
                 ],
                 exeSign: {},
+                workOrderInfos:[],
+                workOrderIndex:null,
+                workOrderInfo:{
+                    id:'',
+                    type:'',
+                    clientCode:'',
+                    logistic_numbers:[],
+                    details:[],
+                    commodities:[],
+                    packagesImages:[],
+                    commodityImages:[],
+                    dealImages:[],
+                    refundImages:[],
+                    remark:'',
+                },
             },
             mounted: function () {
                 this.initData();
@@ -624,10 +640,13 @@
                 },
                 'workOrder.orderIssueType':function(newValue){
                     if (newValue === null) return;
-                    if (newValue === '破损'){
+                    if (['破损','错漏发','快递异常'].includes(newValue)){
                         this.fillWorkOrderCommodity();
                     }
                 },
+            },
+            computed:{
+
             },
             methods: {
                 initData() {
@@ -1213,6 +1232,30 @@
                     }
                     return char;
                 },
+                checkWorkOrderOrCreateWorkOrder(){
+                    window.tempTip.setIndex(1999);
+                    window.tempTip.waitingTip('校验是否有对应工单');
+                    this.checkWorkOrder().then(res=>{
+                        window.tempTip.cancelWaitingTip();
+                        if (res) {
+                            window.tempTip.confirm('当前勾选订单已有工单是否查看',()=>{
+                                this.workOrderInfo = this.workOrderInfos[0];
+                                this.workOrderIndex = 0;
+                                $('#work-order-info').modal('show');
+                            },()=>{
+                                this.showInterceptModel();
+                            },'查看','跳过');
+                        } else {
+                            this.showInterceptModel();
+                        }
+                    }).catch(err=>{
+                        window.tempTip.cancelWaitingTip();
+                    })
+                },
+                showCreateWorkOrder(){
+                    $("#work-order-info").modal('hide');
+                    $("#intercept-modal").modal('show');
+                },
                 showInterceptModel() {
                     this.workOrder.grad = 1;
                     if (checkData.length < 1) {
@@ -1229,7 +1272,7 @@
                     this.workOrder.remark.info = '';
                     this.workOrder.commodities = [];
                     this.workOrder.logistic_number = null;
-                    $('#intercept-modal').modal('show');
+                    $("#intercept-modal").modal('show');
                 },
                 checkOrderIssue(name) {  //
                     let types = this.orderIssueType.filter(item => {
@@ -1271,33 +1314,83 @@
                     }
                     if ('拦截' === this.workOrder.orderIssueType) {
                         this.createInterceptWorkOrder();
+                    }  else if ('信息更改' === this.workOrder.orderIssueType) {
+                        this.createInformationChangeWorkOrder();
+                    } else if ('快递丢件' === this.workOrder.orderIssueType) {
+                        this.createLossWorkOrder();
                     } else if ('快递异常' === this.workOrder.orderIssueType) {
                         this.createExpressAbnormalWorkOrder();
-                    } else if ('信息更改' === this.workOrder.orderIssueType) {
-                        this.createInformationChangeWorkOrder();
                     } else if ('错漏发' === this.workOrder.orderIssueType) {
                         this.createMistakeWorkOrder();
                     } else if ('破损' === this.workOrder.orderIssueType) {
                         this.createDamagedWorkOrder();
-                    }else if ('快递丢件' === this.workOrder.orderIssueType) {
-                        this.createLossWorkOrder();
-                    }  else {
+                    } else {
                         this.createDefaultWorkOrder();
                     }
                 },
+                createInterceptWorkOrder() {        // 拦截
+                    let formData = new FormData();
+                    checkData.forEach(e=>{
+                        formData.append('orderNos[]',e);
+                    });
+                    formData.append('remark',this.workOrder?.remark?.info || '');
+                    let url = "{{route('workOrder.interceptApi')}}";
+                    this.createWorkOrder(formData,url);
+                },
                 createInformationChangeWorkOrder() { // 信息修改
                     let data = this.getCreateWorkOrderData();
-                    this.createWorkOrder(data);
+                    if (data.length > 1){
+                        window.tempTip.setIndex(1999);
+                        window.tempTip.show('信息修改仅支持单个订单修改');
+                    }
+                    let url = "{{route('workOrder.informationChangeApi')}}";
+                    this.createWorkOrder(data[0],url);
                 },
-                createDefaultWorkOrder() { // 其他
+                createLossWorkOrder(){  // 快递丢件
                     let data = this.getCreateWorkOrderData();
-                    this.createWorkOrder(data);
+                    let formData = new FormData();
+                    formData.append('order_no', data[0]['order_no']);
+                    formData.append('remark', this.workOrder.remark.info);
+                    let url = "{{route('workOrder.lossApi')}}";
+                    this.createWorkOrder(formData,url);
                 },
-                createExpressAbnormalWorkOrder() { // 快递异常
+                createExpressAbnormalWorkOrder(){ // 快递异常
+                    let url = "{{route('workOrder.expressAbnormalApi')}}";
+                    let data = this.getCreateWorkOrderData();
+                    let formData = new FormData();
+                    formData.append('order_no', data[0]['order_no']);
+                    formData.append('remark', this.workOrder.remark.info);
+                    let dealImages = this.getImages(this.workOrder.dealImages);
+                    this.setFormDataImagePrefix(formData, 'dealImages', dealImages);
+                    this.setFormDataCommodities(formData);
+                    this.createWorkOrder(formData, url);
+                },
+                createMistakeWorkOrder() { // 错漏发
+                    let url = "{{route('workOrder.mistakeApi')}}";
+                    let data = this.getCreateWorkOrderData();
+                    let formData = new FormData();
+                    formData.append('order_no', data[0]['order_no']);
+                    formData.append('remark', data[0]['remark']);
+                    formData.append('logistic_number', data[0]['logistic_number']);
+                    let dealImages = this.getImages(this.workOrder.dealImages);
+                    this.setFormDataImagePrefix(formData, 'dealImages', dealImages);
+                    this.setFormDataCommodities(formData);
+                    this.createWorkOrder(formData, url);
+                },
+                createDefaultWorkOrder() {              // 其他
                     let data = this.getCreateWorkOrderData();
                     this.createWorkOrder(data);
                 },
-                checkWorkOrderImage(packageImages,commodityImages,dealImages){
+                createDamagedWorkOrder() { //破损工单创建
+                    let packageImages = this.getImages(this.workOrder.packageImages);                   // 外包装破损图片
+                    let commodityImages = this.getImages(this.workOrder.commodityImages);               // 内物破损图片
+                    let dealImages = this.getImages(this.workOrder.dealImages);                         // 交易截图
+                    if (!this.checkDamagedWorkOrder(packageImages,commodityImages,dealImages)) return;
+                    let formData = this.getDamagedFormData(packageImages,commodityImages,dealImages);
+                    let url = "{{route('workOrder.damagedApi')}}";
+                    this.createWorkOrder(formData, url);
+                },
+                checkWorkOrderImage(packageImages,commodityImages,dealImages) {
                     let message = null;
                     if (0 === packageImages.length) {
                         message = '请选择外包图片';
@@ -1313,34 +1406,25 @@
                     let data = this.getCreateWorkOrderData();
                     formData.append('order_no', data[0]['order_no']);
                     formData.append('remark', data[0]['remark']);
-                    formData.append('type', '破损');
-                    formData.append('logistic_number', this.workOrder.logistic_number);
+                    formData.append('logistic_number', data[0]['logistic_number']);
                     formData.append('price', this.workOrder.price);
-                    this.setFormDataImagePrefix(formData, 'packageImages', packageImages);
-                    this.setFormDataImagePrefix(formData, 'commodityImages', commodityImages);
-                    this.setFormDataImagePrefix(formData, 'dealImages', dealImages);
+
+                    this.setFormDataImagePrefix(formData,'packageImages',packageImages);
+                    this.setFormDataImagePrefix(formData,'commodityImages',commodityImages);
+                    this.setFormDataImagePrefix(formData,'dealImages',dealImages);
                     this.setFormDataCommodities(formData);
                     return formData;
                 },
-                createDamagedWorkOrder() { //破损工单创建
-                    if (!this.checkDamagedWorkOrder())return;
-                    let packageImages = this.getImages(this.workOrder.packageImages);                   // 外包装破损图片
-                    let commodityImages = this.getImages(this.workOrder.commodityImages);               // 内物破损图片
-                    let dealImages = this.getImages(this.workOrder.dealImages);                         // 交易截图
-                    let message = this.checkWorkOrderImage(packageImages,commodityImages,dealImages);   // 校验工单图片不能为空
-                    if (message) {
-                        window.tempTip.setIndex(1999);
-                        window.tempTip.show(message)
-                        return;
-                    }
-                    let formData = this.getDamagedFormData(packageImages,commodityImages,dealImages);
-                    let url = "{{route('workOrder.damagedApi')}}";
-
-                    this.createWorkOrder(formData, url);
-                },
                 setFormDataCommodities(formData){
                      this.workOrder.commodities.map(commodity=>{
-                         let item = {sku:commodity.sku,amount:commodity.amount};
+                         let item = {
+                             sku:commodity.sku,
+                             amount:commodity.amount,
+                             commodity_id:commodity['commodity_id'],
+                             abnormal_type:commodity['abnormal_type'],
+                             logistic_number:commodity['logistic_number'],
+                             abnormal_amount:commodity['abnormal_amount'],
+                         };
                          formData.append('commodities[]',JSON.stringify(item)) ;
                     });
                 },
@@ -1354,14 +1438,17 @@
                         return item.file;
                     })
                 },
-                checkDamagedWorkOrder(){
+                checkDamagedWorkOrder(packageImages,commodityImages,dealImages){
                     let message = null;
                     if (!this.checkPrice()){
                         message = '商品价值需大于0';
                     }
+                    if (!message){
+                        message = this.checkWorkOrderImage(packageImages,commodityImages,dealImages);
+                    }
                     if (message){
                         window.tempTip.setIndex(1999);
-                        window.tempTip.show("sku数量和录入sku信息数量不符合");
+                        window.tempTip.show(message);
                         return false;
                     }
                     return true;
@@ -1369,22 +1456,11 @@
                 checkPrice(){
                     return parseInt(this.workOrder.price) !== 0;
                 },
-                createMistakeWorkOrder() { // 错漏发
-                    let data = this.getCreateWorkOrderData();
-                    this.createWorkOrder(data);
-                },
-                createInterceptWorkOrder() {// 拦截
-                    let data = this.getCreateWorkOrderData();
-                    this.createWorkOrder(data);
-                },
-                createLossWorkOrder(){  // 丢件
-                    let data = this.getCreateWorkOrderData();
-                    this.createWorkOrder(data);
-                },
-                createWorkOrder(data, url = null) {
-                    if (!url) url = '{{route('workOrder.storeApi')}}';
+                createWorkOrder(data, url) {
                     window.tempTip.setIndex(1999);
+                    window.tempTip.waitingTip('生成工单中');
                     window.axios.post(url, data, {'Content-Type': 'multipart/form-data'}).then(res => {
+                        window.tempTip.cancelWaitingTip();
                         if (res.data.success) {
                             window.tempTip.showSuccess('工单生成成功');
                             $('#intercept-modal').modal('hide');
@@ -1400,6 +1476,7 @@
                             }
                         }
                     }).catch(err => {
+                        window.tempTip.cancelWaitingTip();
                         window.tempTip.show(err)
                     });
                 },
@@ -1414,8 +1491,8 @@
                     this.workOrder.packageImages = [];
                     this.workOrder.dealImages = [];
                     this.workOrder.commodities = [];
-                    this.workOrder.price = [];
-                    this.workOrder.logisticNumber = [];
+                    this.workOrder.price = '';
+                    this.workOrder.logisticNumber = '';
                     this.workOrder.orderIssueType = 0;
                 },
                 getCreateWorkOrderData() {
@@ -1540,18 +1617,16 @@
                     });
                 },
                 fillWorkOrderCommodity(){
-                    const {commodities} = this;
-                    let orderNo = checkData[0];
-                    let orderCommodities = commodities[orderNo];
-                    this.workOrder.commodities = [];
-                    orderCommodities.forEach(item=>{
-                        this.workOrder.commodities.push({
-                            sku:item.sku,
-                            name:item['descr_c'],
-                            amount:item['qtyordered'],
-                            selected:false,
-                        });
-                    });
+                    let url = "{{route('order.commodity.getCommoditiesApi')}}";
+                    let data = {orderNo:checkData[0]};
+                    window.axios.post(url,data).then(res=>{
+                        if (res.data.success){
+                            this.workOrder.commodities = res.data.data;
+                        } else {
+
+                        }
+                    }).catch(err=>{
+                    })
                 },
                 pasteImage(event,imageArray){
                     for (let i = 0; i < event.clipboardData.items.length; i++) {
@@ -1581,6 +1656,84 @@
                         };
                     });
                 },
+                checkWorkOrder(){
+                    return new Promise((resolve, reject)=>{
+                        let no = checkData;
+                        let url = '{{route('workOrder.checkApi')}}';
+                        window.axios.post(url,{no:no}).then(res=>{
+                            if (res.data.success){
+                                if (res.data.data.length > 0){
+                                    res.data.data.forEach((e,i)=>{
+                                        this.workOrderInfos[i] = this.conversionWorkOrder(e);
+                                    });
+                                    resolve(true) ;
+                                } else{
+                                    this.workOrderInfos = [];
+                                    resolve(false);
+                                }
+
+                            } else {
+                                this.workOrderInfos = [];
+                            }
+                        }).catch(err=>{
+                            reject(err);
+                        });
+                    });
+                },
+                conversionWorkOrder(workOrder){
+                    return {
+                        id:workOrder?.id,
+                        type:workOrder?.issue_type?.name,
+                        clientCode:workOrder?.order?.client_code,
+                        logistic_numbers:this.getLogisticNumbers(workOrder),
+                        details:this.getDetails(workOrder),
+                        commodities:this.getCommodities(workOrder),
+                        packagesImages:this.getImageList(workOrder.images,'1'),
+                        commodityImages:this.getImageList(workOrder.images,'2'),
+                        dealImages:this.getImageList(workOrder.images,'3'),
+                        refundImages:this.getImageList(workOrder.images,'4'),
+                        remark:workOrder.remark,
+                    };
+                },
+                getLogisticNumbers(workOrder){
+                    let packages = workOrder?.order?.packages || [];
+                    return packages.map(e=>{return e.logistic_number});
+                },
+                getDetails(workOrder){
+                    let details = workOrder?.details;
+                    return details.map(e=>{return e;});
+                },
+                getCommodities(workOrder){
+                    return (workOrder?.commodities ||[]).map(item=>{
+                        item.name = item?.commodity?.name;
+                        return item;
+                    });
+                },
+                getImageList(images,type){
+                    let filePrefix = "{{asset("/storage")}}";
+                    let imageList = images.filter(e=>{
+                        return parseInt(e.type) === parseInt(type);
+                    });
+                    return imageList.map(e=>{
+                        return {
+                            src:filePrefix+e?.upload_file?.url+'.'+e?.upload_file?.type,
+                        };
+                    });
+                },
+                selectWorkOrderIndex(index){
+                    if (index < 0)index = this.workOrderInfos.length-1;
+                    if (index >= this.workOrderInfos.length) index = 0;
+                    this.workOrderIndex = index;
+                    this.workOrderInfo = this.workOrderInfos[index];
+                },
+                showParentWorkOrder(){
+                    if (parseInt(this.workOrderIndex) === 0) return false;
+                    return this.workOrderIndex < this.workOrderInfos -1;
+                },
+                showNextWorkOrder(){
+                    if (parseInt(this.workOrderIndex) === (this.workOrderInfos.length -1)) return false;
+                    return this.workOrderIndex  < this.workOrderInfos.length -1;
+                }
             },
         });
     </script>

+ 80 - 0
resources/views/order/workOrder/_bao_shi_review.blade.php

@@ -0,0 +1,80 @@
+{{--快递处理丢件工单--}}
+<div class="modal fade " id="bao-shi-review-modal" tabindex="-1" role="dialog" aria-labelledby="checkModalLabel"
+     aria-hidden="true">
+    <div class="modal-dialog modal-xl modal-dialog-centered">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="bao-shi-work-order-modal">终审(宝时)</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>
+                    <table class="table">
+                        <thead>
+                        <tr class="text-center">
+                            <td>快递单号</td>
+                            <td>商品</td>
+                            <td>商品条码</td>
+                            <td>订单数量</td>
+                            <td>异常数量</td>
+                            <td>核实数量</td>
+                            <td>宝时审核数量</td>
+                            <td>核实结果</td>
+                            <td>处理结果</td>
+                        </tr>
+                        </thead>
+                        <tbody v-if="fillWorkOrder">
+                        <tr v-for="(item) in reviewWorkOrder?.commodities || [] " class="text-center">
+                            <td>
+                                <span v-text="item.logistic_number"></span>
+                            </td>
+                            <td>
+                                <span v-text="item?.commodity?.name || ''"></span>
+                            </td>
+                            <td>
+                                <span v-text="item?.commodity?.sku || ''"></span>
+                            </td>
+                            <td>
+                                <span v-text="item.amount"></span>
+                            </td>
+                            <td>
+                                <span v-text="item.abnormal_amount"></span>
+                            </td>
+                            <td>
+                                <span v-text="item.check_amount"></span>
+                            </td>
+                            <td>
+                                <input type="number" class="form-control form-control-sm" v-model="item.bao_shi_check_amount">
+                            </td>
+                            <td>
+                                <span v-text="item.check_result"></span>
+                            </td>
+                            <td>
+                                 <select class="form-control form-control-sm"
+                                         v-if="['破损','快递异常','快递丢件'].includes(reviewWorkOrder.issue_type_name)"
+                                         v-model="item.process_result">
+                                    <option v-for="type in damagedProcessResults"
+                                            :value="type" v-text="type"></option>
+                                </select>
+                                <select class="form-control form-control-sm"
+                                        v-else-if="'错漏发' === reviewWorkOrder.issue_type_name "
+                                        v-model="item.process_result" >
+                                    <option
+                                        v-for="type in mistakeProcessResults"
+                                        :value="type" v-text="type"></option>
+                                </select>
+                            </td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </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" @click="review">终审</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 94 - 0
resources/views/order/workOrder/_baoshi_fill_work_order.blade.php

@@ -0,0 +1,94 @@
+{{--快递处理丢件工单--}}
+<div class="modal fade " id="baoshi-fill-work-order-modal" tabindex="-1" role="dialog" aria-labelledby="checkModalLabel"
+     aria-hidden="true">
+    <div class="modal-dialog modal-xl modal-dialog-centered">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="baoshi-work-order-modal">错漏发信息填充(宝时)</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>
+                    <table class="table">
+                        <thead>
+                        <tr class="text-center">
+                            <td>快递单号</td>
+                            <td>商品</td>
+                            <td>商品条码</td>
+                            <td>订单数量</td>
+                            <td>异常数量</td>
+                            <td>宝时核实数量</td>
+                            <td>核实结果</td>
+                            <td>处理结果</td>
+                        </tr>
+                        </thead>
+                        <tbody v-if="fillWorkOrder">
+                        <tr v-for="(item) in fillWorkOrder?.commodities || [] " class="text-center">
+                            <td>
+                                <span v-text="item.logistic_number"></span>
+                            </td>
+                            <td>
+                                <span v-text="item?.commodity?.name || ''"></span>
+                            </td>
+                            <td>
+                                <span v-text="item?.commodity?.sku || ''"></span>
+                            </td>
+                            <td>
+                                <span v-text="item.amount"></span>
+                            </td>
+                            <td>
+                                <span v-text="item.abnormal_amount"></span>
+                            </td>
+                            <td>
+                                <input type="number" class="form-control form-control-sm" v-model="item.bao_shi_check_amount">
+                            </td>
+                            <td>
+                                <select class="form-control form-control-sm"
+                                        v-if="fillWorkOrder.issue_type_name === '破损'"
+                                        v-model="item.check_result" >
+                                    <option v-for="type in damagedResults"
+                                            :value="type" v-text="type"></option>
+                                </select>
+
+                                <select class="form-control form-control-sm"
+                                        v-if="['快递异常','快递丢件'].includes(fillWorkOrder.issue_type_name)"
+                                        v-model="item.check_result" >
+                                    <option v-for="type in ['已拦截']" :value="type" v-text="type"></option>
+                                </select>
+
+                                <select class="form-control form-control-sm"
+                                        v-if="'错漏发' === fillWorkOrder.issue_type_name"
+                                        v-model="item.check_result" >
+                                    <option v-for="type in mistakeResults"
+                                            :value="type" v-text="type"></option>
+                                </select>
+                            </td>
+                            <td>
+                                <select class="form-control form-control-sm"
+                                        v-if="'错漏发' === fillWorkOrder.issue_type_name"
+                                        v-model="item.process_result">
+                                    <option v-for="type in mistakeProcessResults"
+                                        :value="type" v-text="type"></option>
+                                </select>
+                                <select class="form-control form-control-sm"
+                                        v-else
+                                        v-model="item.process_result" >
+                                    <option
+                                        v-for="type in processResults"
+                                        :value="type" v-text="type"></option>
+                                </select>
+                            </td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </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" @click="baoShiUpdateCommodities">提交</button>
+            </div>
+        </div>
+    </div>
+</div>

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

@@ -1,4 +1,4 @@
-<div class="modal fade" id="edit-issue-type-type-modal" data-backdrop="static" data-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true" z-index="51">
+<div class="modal fade" id="edit-issue-type-modal" data-backdrop="static" data-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true" z-index="51">
     <div class="modal-dialog">
         <div class="modal-content">
             <div class="modal-header">

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

@@ -97,7 +97,7 @@
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭
                 </button>
                 {{--填充工单--}}
-                <button type="button" class="btn btn-outline-primary" @click="updateLossWorkOrder">提交
+{{--                <button type="button" class="btn btn-outline-primary" @click="updateLossWorkOrder">提交--}}
                 </button>
             </div>
         </div>

+ 82 - 0
resources/views/order/workOrder/_logistic_fill_work_order.blade.php

@@ -0,0 +1,82 @@
+{{--快递处理丢件工单--}}
+<div class="modal fade " id="logistic-fill-work-order-modal" tabindex="-1" role="dialog" aria-labelledby="checkModalLabel"
+     aria-hidden="true">
+    <div class="modal-dialog modal-xl modal-dialog-centered">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="logistic-work-order-modal" v-if="fillWorkOrder">
+                    <span v-text="fillWorkOrder.issue_type_name + '工单'+'(承运商)'">
+                    </span>
+                </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>
+                    <table class="table">
+                        <thead>
+                        <tr>
+                            <td>快递单号</td>
+                            <td>商品</td>
+                            <td>商品条码</td>
+                            <td>订单数量</td>
+                            <td>异常数量</td>
+                            <td>核实数量</td>
+                            <td>核实结果</td>
+{{--                            <td>处理结果</td>--}}
+                        </tr>
+                        </thead>
+                        <tbody v-if="fillWorkOrder">
+                        <tr v-for="(item) in fillWorkOrder?.commodities || [] ">
+                            <td>
+                                <span v-text="item.logistic_number"></span>
+                            </td>
+                            <td>
+                                <span v-text="item?.commodity?.name || ''"></span>
+                            </td>
+                            <td>
+                                <span v-text="item?.commodity?.sku || ''"></span>
+                            </td>
+                            <td>
+                                <span v-text="item.amount"></span>
+                            </td>
+                            <td>
+                                <span v-text="item.abnormal_amount"></span>
+                            </td>
+                            <td>
+                                <input type="number" class="form-control form-control-sm" v-model="item.check_amount">
+                            </td>
+                            <td>
+                                <select class="form-control form-control-sm"
+                                        v-if="fillWorkOrder.issue_type_name === '破损'"
+                                        v-model="item.check_result" >
+                                    <option v-for="type in ['核实破损','核实未破损']"
+                                            :value="type" v-text="type"></option>
+                                </select>
+
+                                <select class="form-control form-control-sm"
+                                        v-if="['快递异常','快递丢件'].includes(fillWorkOrder.issue_type_name)"
+                                        v-model="item.check_result" >
+                                    <option v-for="type in ['已拦截']" :value="type" v-text="type"></option>
+                                </select>
+                            </td>
+{{--                            <td>--}}
+{{--                                <select class="form-control form-control-sm" v-model="item.process_result">--}}
+{{--                                    <option--}}
+{{--                                        v-for="type in (['赔偿','不赔偿'])"--}}
+{{--                                        :value="type" v-text="type"></option>--}}
+{{--                                </select>--}}
+{{--                            </td>--}}
+                        </tr>
+                        </tbody>
+                    </table>
+                </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" @click="logisticUpdateCommodities">提交</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 150 - 0
resources/views/order/workOrder/_owner_fill_work_order.blade.php

@@ -0,0 +1,150 @@
+{{--快递处理丢件工单--}}
+<div class="modal fade " id="owner-fill-work-order-modal" tabindex="-1" role="dialog" aria-labelledby="checkModalLabel"
+     aria-hidden="true">
+    <div class="modal-dialog modal-xl modal-dialog-centered">
+        <div class="modal-content" v-if="fillWorkOrder">
+            <div class="modal-header">
+                <h5 class="modal-title" id="checkModalLabel">信息填写(货主)</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="modal-body">
+                    <div class="form-group row">
+                        <div class="col-sm-2"></div>
+                        <div class="col-sm-10  text-primary">
+                            补发单号,退款成功截图 二选一
+                        </div>
+                    </div>
+                    {{--破损商品价格--}}
+                    <div class="form-group row">
+                        <label for="work-order-price"
+                               class="col-sm-2 col-form-label text-right text-primary">丢件价值</label>
+                        <div class="col-sm-10">
+                            <input type="number" id="work-order-price" class="form-control"
+                                   v-model="fillWorkOrder.price"
+                                   placeholder="破损商品价格">
+                        </div>
+                    </div>
+                    {{--快递单号--}}
+                    <div class="form-group row">
+                        <label for="work-order-logistic-number"
+                               class="col-sm-2 col-form-label text-right">丢件快递单号</label>
+                        <div class="col-sm-10">
+                            <input type="text" id="work-order-logistic-number" class="form-control"
+                                   v-model="fillWorkOrder['logistic_number']" placeholder="快递单号">
+                        </div>
+                    </div>
+                    {{--补发快递--}}
+                    <div class="form-group row"
+                         v-show="fillWorkOrder.dealImages && fillWorkOrder.dealImages.length === 0">
+                        <label for="work-order-reissue-logistic-number"
+                               class="col-sm-2 col-form-label text-right">补发快递单号</label>
+                        <div class="col-sm-10">
+                            <input type="text" id="work-order-reissue-logistic-number" class="form-control"
+                                   v-model="fillWorkOrder['reissue_logistic_number']" placeholder="快递单号">
+                        </div>
+                    </div>
+                    {{--信息更改--}}
+                    <div class="form-group row">
+                        <hr>
+                        <label for="order_issue_type" class="col-sm-2 col-form-label text-right">收方信息</label>
+                        <div class="col-sm-10">
+                        <textarea class="form-control" name="" id="remake_info" cols="30" rows="2"
+                                  v-model="fillWorkOrder.remake"></textarea>
+                        </div>
+                    </div>
+
+                    <hr>
+                    <div class="form-group row">
+                        <label for="deal-image" class="col-sm-2 col-form-label text-right text-primary">交易截图</label>
+                        <div class="col-sm-10">
+                            <div class="border border-secondary h-auto" id="deal-image" style="min-height: 75px"
+                                 contenteditable="true"
+                                 @paste="pasteImage($event,fillWorkOrder.dealImages)">
+                                <div v-for="(image,i) in fillWorkOrder.dealImages"
+                                     class="d-inline-block col-4 position-relative card">
+                                    <div class="card-body">
+                                        <img :src="image.src" class="card-img-top" :alt="image.file.name">
+                                        <div class="float-right position-relative">
+                                            <button type="button" class="btn btn-sm btn-outline-danger"
+                                                    @click="spliceImage(i,fillWorkOrder.dealImages)">取消
+                                            </button>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <hr>
+                    <div class="form-group row" v-show="!fillWorkOrder['reissue_logistic_number']">
+                        <label for="refund-image" class="col-sm-2 col-form-label text-right text-primary">退款成功截图</label>
+                        <div class="col-sm-10">
+                            <div class="border border-secondary h-auto" id="refund-image" style="min-height: 75px"
+                                 contenteditable="true"
+                                 @paste="pasteImage($event,fillWorkOrder.refundImages)">
+                                <div v-for="(image,i) in fillWorkOrder.refundImages"
+                                     class="d-inline-block col-4 position-relative card">
+                                    <div class="card-body">
+                                        <img :src="image.src" class="card-img-top" :alt="image.file.name">
+                                        <div class="float-right position-relative">
+                                            <button type="button" class="btn btn-sm btn-outline-danger"
+                                                    @click="spliceImage(i,fillWorkOrder.refundImages)">取消
+                                            </button>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div>
+                        <table class="table">
+                            <thead>
+                            <tr class="text-center">
+                                <td>快递单号</td>
+                                <td>商品</td>
+                                <td>商品条码</td>
+                                <td>订单数量</td>
+                                <td>异常数量</td>
+                                <td></td>
+                            </tr>
+                            </thead>
+                            <tbody>
+                            <tr v-for="(item,i) in  fillWorkOrder.commodities" class="text-center">
+                                <td>
+                                    <span v-text="item.logistic_number"></span>
+                                </td>
+                                <td>
+                                    <span v-text="item.name || ''"></span>
+                                </td>
+                                <td>
+                                    <span v-text="item.sku || ''"></span>
+                                </td>
+                                <td>
+                                    <span v-text="item.amount"></span>
+                                </td>
+                                <td>
+                                    <input type="number" class="form-control form-control-sm" v-model="item.abnormal_amount">
+                                </td>
+                                <td>
+                                    <button type="button" class="close" @click="fillWorkOrder.commodities.splice(i,1)">
+                                        <span aria-hidden="true" class="text-danger">&times;</span>
+                                    </button>
+                                </td>
+                            </tr>
+                            </tbody>
+                        </table>
+                    </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" @click="ownerUpdateWorkOrder">提交
+                    </button>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

+ 170 - 148
resources/views/order/workOrder/_work_order_details.blade.php

@@ -1,9 +1,9 @@
-{{-- 工单详情 --}}
-<div v-if="item.details.length > 0" class="alert alert-light mb-0">
+<div class="alert alert-light mb-0">
     <div class="header-alert">
         <span class="text-monospace">工单详情</span>
         <button type="button" class="btn btn-sm btn-outline-primary float-right"
                 v-show="selectDetailId !== item.id"
+                v-if="(item.images && item.images.length > 0) || (item.commodities && item.commodities.length>0)"
                 @click="selectDetailId = item.id">显示
         </button>
         <button type="button" class="btn btn-sm btn-outline-primary float-right"
@@ -11,155 +11,177 @@
                 @click="selectDetailId = null">隐藏
         </button>
     </div>
-    <transition name="fade">
-        <div class="body-alert" v-if="selectDetailId === item.id">
-            <div class="card-body row col-12 mb-0 pb-0"
-                 v-for="(detail,i) in item.details">
-                {{-- 快递丢件工单详情 --}}
-                <div v-if="item['issue_type']['name'] === '快递丢件'">
-                    <div v-if="detail.logistic_number">
-                        <span class="mr-3">丢件快递单号:</span>
-                        <span class="text-truncate"
-                              v-text="detail.logistic_number"></span>
-                    </div>
-                    <div>
-                        <span class="mr-3">丢件价值:</span>
-                        <span class="text-truncate"
-                              v-text="detail.price"></span>
-                    </div>
-                    {{-- 工单登记商品详情 --}}
-                    <div v-for="(item,i) in item.commodities">
-                        <span class="mr-2">sku</span>
-                        <span v-text="item.sku"></span>
-                        <span class="mr-2">商品名</span>
-                        <span
-                            v-text="item.commodity ? item.commodity.name : ''"></span>
-                        <span class="mr-2">数量</span>
-                        <span v-text="item.amount"></span>
-                    </div>
-                </div>
+</div>
+<transition name="fade">
+    <div class="alert alert-light mb-0 border border-top"
+         v-show="selectDetailId === item.id"
+         v-if="item.details && item.details.length > 0 && selectDetailId === item.id">
+        <div>
+            <span class="text-monospace" v-text="'商品价值'"></span>
+        </div>
+        <div class="card-body row col-12 mb-0 pb-0"
+             v-for="(detail) in item.details">
+            <div class="col-12">
+                <span v-text="detail.price"></span>
+            </div>
+        </div>
+    </div>
+</transition>
+<transition name="fade">
+    <div class="alert alert-light mb-0 border border-top"
+         v-show="selectDetailId === item.id"
+         v-if="item.deal_images && item.deal_images.length > 0">
+        <div class="col-12">
+            <span class="text-monospace" v-text="'交易截图'"></span>
+        </div>
+        <div class="card-body col-sm-6"
+             v-for="(dealImage,i) in item.deal_images">
+            <div class="">
+                <a  target="_blank"
+                    v-if="dealImage.upload_file"
+                    :href="filePrefix+dealImage.upload_file.url + '.'+dealImage.upload_file.type">
+                    <img class="image-w"
+                         :src="filePrefix+dealImage.upload_file.url + '.'+dealImage.upload_file.type"
+                         alt="交易截图">
+                </a>
+            </div>
+        </div>
+    </div>
+</transition>
+
+<transition name="fade">
+    <div class="alert alert-light mb-0 border border-top"
+         v-show="selectDetailId === item.id"
+         v-if="item.refund_image && item.refund_image.length > 0">
+        <div class="col-12">
+           <span class="text-monospace" v-text="'交易截图'"></span>
+        </div>
+        <div class="card-body col-sm-6"
+             v-for="(refund_image,i) in item.refund_image">
+            <div class="">
+                <a  target="_blank"
+                    v-if="dealImage.upload_file"
+                    :href="filePrefix+refund_image.upload_file.url + '.'+refund_image.upload_file.type">
+                    <img class="image-w"
+                         :src="filePrefix+refund_image.upload_file.url + '.'+refund_image.upload_file.type"
+                         alt="交易截图">
+                </a>
+            </div>
+        </div>
+    </div>
+</transition>
+
+<transition name="fade">
+    <div class="alert alert-light mb-0 border border-top"
+         v-show="selectDetailId === item.id"
+         v-if="item.refund_image && item.refund_image.length > 0">
+        <div class="col-12">
+           <span class="text-monospace" v-text="'交易截图'"></span>
+        </div>
+        <div class="card-body col-sm-6"
+             v-for="(refund_image,i) in item.refund_image">
+            <div class="">
+                <a  target="_blank"
+                    v-if="dealImage.upload_file"
+                    :href="filePrefix+refund_image.upload_file.url + '.'+refund_image.upload_file.type">
+                    <img class="image-w"
+                         :src="filePrefix+refund_image.upload_file.url + '.'+refund_image.upload_file.type"
+                         alt="交易截图">
+                </a>
+            </div>
+        </div>
+    </div>
+</transition>
 
-                {{-- 破损工单详情 --}}
-                <div v-if="item['issue_type']['name'] === '破损'">
-                    <div>
-                        <div>
-                            <span class="mr-3">破损sku数:</span>
-                            <span class="text-truncate"
-                                  v-text="detail.sku_amount"></span>
-                        </div>
-                        <div>
-                            <span class="mr-3">快递单号:</span>
-                            <span class="text-truncate"
-                                  v-text="detail.logistic_number !== 'null' ? detail.logistic_number : ''"></span>
-                        </div>
-                        <div>
-                            <span class="mr-3">破损商品价值:</span>
-                            <span v-text="detail.price"></span>
-                        </div>
-                    </div>
+<transition name="fade">
+    <div class="alert alert-light mb-0  border border-top"
+         v-show="selectDetailId === item.id"
+         v-if="item['package_images'] && item['package_images'].length > 0">
+        <div class="col-12">
+           <span class="text-monospace" v-text="'外包装截图'"></span>
+        </div>
+        <div class="card-body col-sm-6"
+             v-for="(packageImage,i) in item['package_images']">
+            <a target="_blank"
+               v-if="packageImage.upload_file"
+               :href="filePrefix+packageImage.upload_file.url + '.'+packageImage.upload_file.type">
+                <img class="image-w"
+                     :src="filePrefix+packageImage.upload_file.url + '.'+packageImage.upload_file.type"
+                     alt="外包装截图">
+            </a>
+        </div>
+    </div>
+</transition>
+
+<transition name="fade">
+    <div class="alert alert-light mb-0 border border-top"
+         v-show="selectDetailId === item.id"
+         v-if="item['commodity_images'] && item['commodity_images'].length > 0">
+        <div class="col-12">
+           <span class="text-monospace" v-text="'内物破损图片'"></span>
+        </div>
+        <div class="card-body col-sm-6"
+             v-for="(commodityImage,i) in item['commodity_images']">
+            <a target="_blank"
+               v-if="commodityImage.upload_file"
+               :href="filePrefix+commodityImage.upload_file.url  + '.'+commodityImage.upload_file.type">
+                <img class="image-w"
+                     :src="filePrefix+commodityImage.upload_file.url + '.'+commodityImage.upload_file.type"
+                     alt="内物破损图片">
+            </a>
+        </div>
+    </div>
+</transition>
+<transition name="fade">
+    {{-- 破损商品详情 --}}
+    <div class="alert alert-light mb-0  border border-top"
+        v-show="selectDetailId === item.id"
+        v-if="item.commodities && item.commodities.length > 0">
 
-                </div>
-                {{-- 交易截图 --}}
-                <div class="row"
-                     v-if="item['deal_images'] && item['deal_images'].length > 0">
-                    <div class="col-12">
-                        <hr>
-                        <span class="text-monospace" v-text="'交易截图'"></span>
-                    </div>
-                    <div class="card-body col-sm-6"
-                         v-for="(dealImage,i) in item['deal_images']">
-                        <div class="">
-                            <a  target="_blank"
-                                v-if="dealImage.upload_file"
-                                :href="filePrefix+dealImage.upload_file.url + '.'+dealImage.upload_file.type">
-                                <img class="image-w"
-                                     :src="filePrefix+dealImage.upload_file.url + '.'+dealImage.upload_file.type"
-                                     alt="交易截图">
-                            </a>
-                        </div>
-                    </div>
-                </div>
-                {{-- 退款截图 --}}
-                <div class="row"
-                     v-if="item['refund_image'] && item['refund_image'].length > 0">
-                    <div class="col-12">
-                        <hr>
-                        <span class="text-monospace" v-text="'退款截图'"></span>
-                    </div>
-                    <div class="card-body col-sm-6"
-                         v-for="(refundImage,i) in item['refund_images']">
-                        <a target="_blank"
-                           v-if="refundImage.upload_file"
-                           :href="filePrefix+refundImage.upload_file.url + '.'+refundImage.upload_file.type">
-                            <img class="image-w"
-                                 :src="filePrefix+refundImage.upload_file.url + '.'+refundImage.upload_file.type"
-                                 alt="退款截图">
-                        </a>
-                    </div>
-                </div>
-                {{-- 外包装截图 --}}
-                <div class="row"
-                     v-if="item['package_images'] && item['package_images'].length > 0">
-                    <div class="col-12">
-                        <hr>
-                        <span class="text-monospace" v-text="'外包装截图'"></span>
-                    </div>
-                    <div class="card-body col-sm-6"
-                         v-for="(packageImage,i) in item['package_images']">
-                        <a target="_blank"
-                           v-if="packageImage.upload_file"
-                           :href="filePrefix+packageImage.upload_file.url + '.'+packageImage.upload_file.type">
-                            <img class="image-w"
-                                 :src="filePrefix+packageImage.upload_file.url + '.'+packageImage.upload_file.type"
-                                 alt="外包装截图">
-                        </a>
-                    </div>
-                </div>
-                {{-- 内物破损图片 --}}
-                <div class="row"
-                     v-if="item['commodity_images'] && item['commodity_images'].length > 0">
-                    <div class="col-12">
-                        <hr>
-                        <span class="text-monospace" v-text="'内物破损图片'"></span>
-                    </div>
-                    <div class="card-body col-sm-6"
-                         v-for="(commodityImage,i) in item['commodity_images']">
-                        <a target="_blank"
-                           v-if="commodityImage.upload_file"
-                           :href="filePrefix+commodityImage.upload_file.url  + '.'+commodityImage.upload_file.type">
-                            <img class="image-w"
-                                 :src="filePrefix+commodityImage.upload_file.url + '.'+commodityImage.upload_file.type"
-                                 alt="内物破损图片">
-                        </a>
-                    </div>
-                </div>
+        <div class="col-12">
+           <div class="text-monospace">异常商品详情</div>
+        </div>
+        <div class="card-body col-12"
+             v-for="(commodity,i) in item.commodities">
+            <div>
+                <span class="mr-3">SKU:</span>
+                <span class="text-truncate" v-text="commodity.sku"></span>
+            </div>
+            <div>
+                <span class="mr-3">商品名称:</span>
+                <span class="text-truncate"
+                      v-text="commodity.commodity ?.name || '' "></span>
+            </div>
+            <div>
+                <span class="mr-3">数量:</span>
+                <span class="text-truncate"
+                      v-text="commodity.amount"></span>
             </div>
 
-            {{-- 破损商品详情 --}}
-            <div class="row"
-                 v-if="item['issue_type']['name'] === '破损'">
-                <div class="col-12">
-                    <hr>
-                    <div class="text-monospace">破损商品详情</div>
-                </div>
-                <div class="card-body col-12"
-                     v-for="(commodity,i) in item.commodities">
-                    <div>
-                        <span class="mr-3">SKU:</span>
-                        <span class="text-truncate" v-text="commodity.sku"></span>
-                    </div>
-                    <div>
-                        <span class="mr-3">商品名称:</span>
-                        <span class="text-truncate"
-                              v-text="commodity.commodity ? commodity.commodity.name : '' "></span>
-                    </div>
-                    <div>
-                        <span class="mr-3">数量:</span>
-                        <span class="text-truncate"
-                              v-text="commodity.amount"></span>
-                    </div>
-                </div>
+            <div v-if="item.issue_type_name !== '错漏发'">
+                <span class="mr-3">核实数量:</span>
+                <span class="text-truncate"
+                      v-text="commodity.check_amount"></span>
+            </div>
+
+            <div >
+                <span class="mr-3">宝时核实数量:</span>
+                <span class="text-truncate"
+                      v-text="commodity.bao_shi_check_amount"></span>
+            </div>
+
+            <div>
+                <span class="mr-3">核实:</span>
+                <span class="text-truncate"
+                      v-text="commodity.check_result"></span>
+            </div>
+
+
+            <div>
+                <span class="mr-3">处理结果:</span>
+                <span class="text-truncate"
+                      v-text="commodity.process_result"></span>
             </div>
         </div>
-    </transition>
-</div>
+    </div>
+</transition>

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


+ 8 - 7
resources/views/rejected/search/general.blade.php

@@ -88,14 +88,14 @@
                         @can('退货管理-查询-客户定义-爱奇艺')<td class="text-muted"><span>@{{rejectedBill.common_01}}</span></td>@endcan
                         @cannot('退货管理-客户不可见')<td class="text-muted">@{{rejectedBill.common_02}}</td>@endcannot
                         <td class="text-muted"><span>@{{rejectedBill.goods_amount}}</span></td>
-                        <td style="min-width: 1000px">
-                            <div class="w-100 " :class="rejectedBill.items.length>1 ? 'up' : ''" :id="'rejected-'+rejectedBill.id" >
-                                <div class="row" v-for="(item,i) in rejectedBill.items">
+                        <td style="min-width: 1500px">
+                            <div class="w-100 p-0" :class="rejectedBill.items.length>1 ? 'up' : ''" :id="'rejected-'+rejectedBill.id" >
+                                <div class="row m-0 p-0" v-for="(item,i) in rejectedBill.items">
                                     @if($ownerSign)
                                     <div class="col-1 border border-1" style="overflow-x: hidden">
                                         <div class="w-100 text-overflow-warp-200 warp-min-200">@{{ (item.barcode && item.barcode.commodity) ? item.barcode.commodity.sku : '' }}</div>
                                     </div>@endif
-                                        <div title="双击展开全部" @dblclick="barcodeGoodsLength(item)"  class="border border-1" :class="item.barcode_goods_show_long ? 'col-auto' : 'col-1'" style="overflow-x: hidden">
+                                        <div title="双击展开全部" @dblclick="barcodeGoodsLength(item)"  class="border border-1" :class="item.barcode_goods_show_long ? 'col-auto' : '@if($ownerSign)col-2 @else col-3 @endif'" style="overflow-x: hidden">
                                             <div class="w-100 text-overflow-warp-200 warp-min-200">@{{item.barcode_goods}}</div>
                                         </div>
                                     <div title="双击展开全部" @dblclick="goodsNameLength(item)"  class="border border-1" :class="item.name_goods_show_long ? 'col-auto' : 'col-1'" style="overflow-x: hidden">
@@ -106,7 +106,7 @@
                                     <div class="col-1 border border-1">@{{item.batch_number}}</div>
                                     <div class="col-1 border border-1">@{{item.made_at}}</div>
                                     <div class="col-1 border border-1">@{{item.validity_at}}</div>
-                                    <div class="col-2 border border-1">
+                                    <div class="col-1 border border-1">
                                         <div align="center" @mouseleave="removeCommonImg('common_img_'+item.id)" @mouseenter="commonImg('img_'+item.id,item.upload_files)">
                                             <div :id="'img_'+item.id">
                                                 <img v-for="uploadFile in item.upload_files"  :src="imgPrefix+uploadFile.url+'-thumbnail.'+uploadFile.type">
@@ -260,14 +260,15 @@
                         @cannot('退货管理-客户不可见'){name:'common_02',value: '重量'},@endcannot
                     {name:'goods_amount',value: '商品总数'},
                     {name:"goods",type:"multi",title:"商品信息",rows:[
-                            {value:"商品条码",col:"2"},
+                            @if($ownerSign){value:"商品SKU",col:"1"},{value:"商品条码",col:"2"},
+                                @else{value:"商品条码",col:"3"},@endif
                             {value:"商品名称",col:"1"},
                             {value:"数量",col:"1"},
                             {value:"质量",col:"1"},
                             {value:"批次号",col:"1"},
                             {value:"产期",col:"1"},
                             {value:"效期",col:"1"},
-                            {value:"照片",col:"2"},
+                            {value:"照片",col:"1"},
                             {value:"备注",col:"2"},
                         ]},
                     {name:'remark',value: '退单备注'},

+ 1 - 0
resources/views/store/deliveryAppointment/list.blade.php

@@ -227,6 +227,7 @@
                             {name:'owner_id',type:'select_multiple_select',tip:['输入关键词快速定位下拉列表,回车确定','选择要显示的客户'],
                                 placeholder:['货主','定位或多选货主'],data:this.owners},
                             {name:'status',type:'select',placeholder: '状态',data:this.status},
+                            {name:'appointment_number',type:'input',tip:'预约号,模糊搜索可在左侧增加百分号(%)进行',placeholder:'预约号'},
                         ],
                         [
                             {name:'created_at_end',type:'dateTime',tip:"选择显示创建日期的结束时间"},

+ 25 - 5
routes/apiLocal.php

@@ -272,19 +272,39 @@ Route::group(['prefix' => 'print'],function (){
 });
 
 Route::prefix('workOrder')->group(function(){
-    Route::post('store','WorkOrderController@storeApi')->name('workOrder.storeApi'); // 创建
-    Route::post('damaged','WorkOrderController@damagedApi')->name('workOrder.damagedApi'); // 创建 破损
-    Route::post('loss','WorkOrderController@updateLossApi')->name('workOrder.lossApi'); // 客户提供丢件信息
-    Route::post('status','WorkOrderController@updateWorkOrderStatusApi')->name('workOrder.updateStatusApi');
+
+    Route::post('intercept','WorkOrderController@interceptApi')->name('workOrder.interceptApi');                        // 拦截
+    Route::post('informationChange','WorkOrderController@informationChangeApi')->name('workOrder.informationChangeApi'); // 改信息
+    Route::post('loss','WorkOrderController@lossApi')->name('workOrder.lossApi');                        // 快递丢件
+    Route::post('fillLoss','WorkOrderController@fillLossApi')->name('workOrder.fillLossApi');            // 快递丢件填充
+    Route::post('damaged','WorkOrderController@damagedApi')->name('workOrder.damagedApi');               // 快递破损
+    Route::post('expressAbnormal','WorkOrderController@expressAbnormalApi')->name('workOrder.expressAbnormalApi');            // 快递异常
+    Route::post('mistake','WorkOrderController@mistakeApi')->name('workOrder.mistakeApi');               // 错漏发
+
+
+    Route::post('updateLoss','WorkOrderController@updateLossApi')->name('workOrder.updateLossApi'); // 客户提供丢件信息
+    Route::post('status','WorkOrderController@updateWorkOrderStatusApi')->name('workOrder.updateStatusApi');        // 修改状态
     Route::post('status/logistic','WorkOrderController@logisticUpdateWorkOrderStatusApi')->name('workOrder.logisticUpdateStatusApi');
-    Route::post('store','WorkOrderController@storeApi')->name('workOrder.storeApi'); // 创建
+
+
     Route::post('review','WorkOrderController@reviewApi')->name('workOrder.reviewApi'); // 审核
+    Route::post('review/baoShi','WorkOrderController@baoShiReviewApi')->name('workOrder.baoShi.reviewApi');
+
     Route::post('batchReview','WorkOrderController@batchReviewApi')->name('workOrder.batchReviewApi');  // 批量审核
     Route::post('buildOrderIssue','WorkOrderController@buildOrderIssueApi')->name('workOrder.buildOrderIssueApi');  // 生成问题件
     Route::post('updateIssueType','WorkOrderController@updateIssueTypeApi')->name('workOrder.updateIssueTypeApi'); // 修改问题类型
     Route::post('batchUpdateIssueType','WorkOrderController@batchUpdateIssueTypeApi')->name('workOrder.batchUpdateIssueTypeApi'); // 修改问题类型
     Route::delete('/{id}','WorkOrderController@destroyApi')->name('workOrder.destroyApi');
 
+    Route::post('check','WorkOrderController@checkWorkOrderApi')->name('workOrder.checkApi');
+
+    Route::post('logistic/end',"WorkOrderController@logisticEndApi")->name('workOrder.logistic.endApi');
+    Route::prefix('commodity')->group(function(){
+        Route::post("updateCommodities/owner","WorkOrderController@ownerUpdateCommoditiesApi")->name("workOrder.commodity.ownerUpdateApi");
+        Route::post("updateCommodities/logistic","WorkOrderController@logisticUpdateCommoditiesApi")->name("workOrder.commodity.logisticUpdateApi");
+        Route::post("updateCommodities/baoshi","WorkOrderController@baoShiUpdateCommoditiesApi")->name("workOrder.commodity.baoShiUpdateCommodities");
+    });
+
     Route::prefix('process')->group(function (){
         Route::post('log/logistic','WorkOrderProcessLogController@logisticStoreApi')->name('workOrderProcessLog.logisticLogApi');
         Route::post('log','WorkOrderProcessLogController@storeApi')->name('workOrderProcessLog.LogApi');

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