Explorar el Código

Merge branch 'master' into yang

yuang hace 4 años
padre
commit
17b325e6b6
Se han modificado 48 ficheros con 1760 adiciones y 669 borrados
  1. 17 3
      app/Filters/WorkOrderFilters.php
  2. 248 0
      app/Http/ApiControllers/InventoryController.php
  3. 14 3
      app/Http/Controllers/OrderController.php
  4. 10 3
      app/Http/Controllers/OrderIssueController.php
  5. 5 0
      app/Http/Controllers/RejectedController.php
  6. 35 85
      app/Http/Controllers/TestController.php
  7. 68 0
      app/Http/Controllers/WorkOrderCancelInterceptController.php
  8. 52 33
      app/Http/Controllers/WorkOrderController.php
  9. 4 0
      app/Http/Controllers/WorkOrderDamageController.php
  10. 4 0
      app/Http/Controllers/WorkOrderExpressAbnormalController.php
  11. 4 1
      app/Http/Controllers/WorkOrderInformationChangeController.php
  12. 7 3
      app/Http/Controllers/WorkOrderInterceptController.php
  13. 4 0
      app/Http/Controllers/WorkOrderLossController.php
  14. 40 19
      app/Http/Controllers/WorkOrderMistakeController.php
  15. 12 2
      app/Http/Controllers/api/thirdPart/weixin/ProcurementController.php
  16. 4 4
      app/Imports/StoreCheckingReceiveImport.php
  17. 4 0
      app/InventoryAccount.php
  18. 1 1
      app/OracleBasSKU.php
  19. 1 1
      app/OracleDOCASNDetail.php
  20. 0 2
      app/OrderIssueType.php
  21. 4 0
      app/Providers/AppServiceProvider.php
  22. 76 0
      app/Services/AndroidInventoryService.php
  23. 1 25
      app/Services/ForeignZhenCangService.php
  24. 61 20
      app/Services/ObligationService.php
  25. 46 1
      app/Services/OrderIssueTypeService.php
  26. 0 4
      app/Services/OrderService.php
  27. 77 0
      app/Services/WorkOrderCancelInterceptService.php
  28. 25 5
      app/Services/WorkOrderDamageService.php
  29. 36 6
      app/Services/WorkOrderExpressAbnormalService.php
  30. 37 9
      app/Services/WorkOrderInformationChangeService.php
  31. 28 8
      app/Services/WorkOrderInterceptService.php
  32. 15 4
      app/Services/WorkOrderLossService.php
  33. 40 11
      app/Services/WorkOrderMistakeService.php
  34. 31 73
      app/Services/WorkOrderService.php
  35. 28 0
      app/WorkOrder.php
  36. 49 15
      app/WorkOrderDetail.php
  37. 52 0
      database/migrations/2021_12_16_141128_work_order_add_new_tag.php
  38. 1 1
      resources/views/order/index/_work_order_modal.blade.php
  39. 12 5
      resources/views/order/index/delivering.blade.php
  40. 15 0
      resources/views/order/workOrder/_bao_shi_review_modal.blade.php
  41. 32 0
      resources/views/order/workOrder/_logistic_fill_work_order_modal.blade.php
  42. 1 10
      resources/views/order/workOrder/_owner_fill_work_order_modal.blade.php
  43. 250 181
      resources/views/order/workOrder/_work_order_show.blade.php
  44. 293 131
      resources/views/order/workOrder/index.blade.php
  45. 1 0
      resources/views/store/checkingReceive/show.blade.php
  46. 1 0
      resources/views/store/handInStorage/receiveDetailPage.blade.php
  47. 7 0
      routes/api.php
  48. 7 0
      routes/apiLocal.php

+ 17 - 3
app/Filters/WorkOrderFilters.php

@@ -141,9 +141,9 @@ class WorkOrderFilters
     public function afterFileIssueType()
     {
         if (Gate::allows('订单管理-工单处理-客服编辑') || Gate::allows('订单管理-工单处理-货主编辑')) {
-            $this->getOrderIssueQuery()->whereIn('name', ['拦截', '信息更改', '其他', '快递异常', '错漏发', '破损', '快递丢件']);
+            $this->getOrderIssueQuery()->whereIn('name', ['拦截','取消拦截', '信息更改', '其他', '快递异常', '错漏发', '破损', '快递丢件']);
         } else if (Gate::allows('订单管理-工单处理-承运商编辑')) {
-            $this->getOrderIssueQuery()->whereIn('name', ['拦截', '信息更改', '破损', '快递丢件', '快递异常']);
+            $this->getOrderIssueQuery()->whereIn('name', ['拦截','取消拦截', '信息更改', '破损', '快递丢件', '快递异常']);
         }
     }
 
@@ -160,6 +160,20 @@ class WorkOrderFilters
         if ($this->issueTypeQuery) {
             $this->queryBuilder->whereIn('order_issue_type_id', $this->issueTypeQuery);
         }
+        $this->orderByTag();
+    }
+
+    public function orderByTag()
+    {
+        $this->queryBuilder->orderByDesc('work_order_status');
+        if (Gate::allows('订单管理-工单处理-客服编辑')){
+            $this->queryBuilder->orderByDesc("bao_shi_tag");
+        } else if (Gate::allows('订单管理-工单处理-货主编辑')){
+            $this->queryBuilder->orderByDesc("owner_tag");
+        } else if (Gate::allows('订单管理-工单处理-承运商编辑')){
+            $this->queryBuilder->orderByDesc("logistic_tag");
+        }
+        $this->queryBuilder->orderBy('created_at');
     }
 
     public function getOrderQuery(): Builder
@@ -283,7 +297,7 @@ class WorkOrderFilters
 
     public function process_progress($process_progress)
     {
-        $this->searchWay($this->queryBuilder,$process_progress,'work_order.process_progress');
+        $this->searchWay($this->queryBuilder,$process_progress,'work_orders.process_progress');
     }
 
     public function status($status){

+ 248 - 0
app/Http/ApiControllers/InventoryController.php

@@ -0,0 +1,248 @@
+<?php
+
+
+namespace App\Http\ApiControllers;
+
+
+use App\Components\ApiResponse;
+use App\InventoryAccount;
+use App\InventoryAccountMission;
+use App\Services\AndroidInventoryService;
+use App\Services\InventoryAccountService;
+use Illuminate\Http\Request;
+
+class InventoryController
+{
+    use ApiResponse;
+
+    /**
+     * @api {get} /inventory/inventoryTask 获取盘点任务数据
+     * @apiName inventoryTasks
+     * @apiGroup inventory
+     *
+     * @apiParam {int} taskId 盘点任务号
+     *
+     * @apiSuccess {string} message 响应描述
+     * @apiSuccess {int} status_code HTTP响应码
+     * @apiSuccess {array} data 数据列表
+     * @apiSuccess {int} data.sameDayInventoryCount 员工当日盘点数
+     * @apiSuccess {int} data.stocktakingTask 当前盘点任务信息
+     * @apiSuccess {int} data.notStocktakingList 未盘任务列表
+     *
+     * @apiSuccessExample {json} Success-Response:
+     *     HTTP/1.1 200 OK
+     *     {
+     *       "message": "请求成功",
+     *       "status_code": "200"
+     *       "data":[
+     *          "sameDayInventoryCount" => 0,
+     *          "inventoryTask" => {
+     *              "id" =>"盘点任务号",
+     *              "created_at"   =>"任务创建时间",
+     *              "end_at"     =>"库位最后操作时间",
+     *              "type"=>"任务类型",
+     *              "total"=>"盘点任务数",
+     *              "processed"=>"盘点数",
+     *          },
+     *          "notStocktakingList"=> [
+     *            {
+     *              "location"   =>"库位",
+     *              "count"   =>"未盘商品数",
+     *             }
+     *           ]
+     *        ]
+     *     }
+     */
+    public function getInventoryTask(Request $request)
+    {
+        $taskId = $request->input("taskId");
+        /** @var AndroidInventoryService $service */
+        $service=app('AndroidInventoryService');
+        if (!$taskId) $this->response(null,410,"未获取到任务号");
+        $stocktakingTask = InventoryAccount::query()
+            ->whereIn('status',['待盘点','盘点中','复盘中'])
+            ->where('id',$taskId)
+            ->first();
+        if (!$stocktakingTask) $this->response(null,410,"未查询到盘点任务");
+        $notStocktakingList=$service->getUnInventoryTaskList($taskId);
+        $sameDayInventoryCount=$service->getStaffSameDayInvCount();
+        $this->response(['stocktakingTask' => $stocktakingTask,
+            'notStocktakingList' => $notStocktakingList,
+            'sameDayInventoryCount'=>$sameDayInventoryCount
+        ]);
+    }
+
+
+    /**
+     * @api {post} /inventory/locationInvPro 当前库位下盘点比例
+     * @apiName locationInvPro
+     * @apiGroup inventory
+     *
+     * @apiParam {int} taskId 盘点任务号
+     * @apiParam {string} location 库位
+     *
+     * @apiSuccess {string} message 响应描述
+     * @apiSuccess {int} status_code HTTP响应码
+     * @apiSuccess {object} data
+     *
+     * @apiSuccessExample {json} Success-Response:
+     *     HTTP/1.1 200 OK
+     *     {
+     *       "message": "请求成功",
+     *       "status_code": "200"
+     *       "data":{
+     *              "total" =>"库位盘点任务总条数",
+     *              "invCount"   =>"已盘条数"
+     *           }
+     *     }
+     */
+    public function locationInvPro(Request $request)
+    {
+        $taskId = $request->input("taskId");
+        $location = $request->input("location");
+        $res=app('AndroidInventoryService')->getLocInvPro($taskId,$location);
+        $this->response($res);
+    }
+
+    /**
+     * @api {post} /inventory/getInventoryDetail 根据盘点任务号,库位,条码 获取盘点明细
+     * @apiName getInventoryDetail
+     * @apiGroup inventory
+     *
+     * @apiParam {int} taskId 盘点任务号
+     * @apiParam {string} location 库位
+     * @apiParam {string} barcode 条码
+     *
+     * @apiSuccess {string} message 响应描述
+     * @apiSuccess {int} status_code HTTP响应码
+     * @apiSuccess {object} data
+     *
+     * @apiSuccessExample {json} Success-Response:
+     *     HTTP/1.1 200 OK
+     *     {
+     *       "message": "请求成功",
+     *       "status_code": "200"
+     *       "data":{
+     *              "id" =>"盘点任务明细号",
+     *              "verified_amount" =>"已盘数量",
+     *              "produced_at"=>"生产日期",
+     *              "valid_at"=>"失效日期",
+     *              "batch_number"=>"批号",
+     *              "erp_type_position"=>"属性仓",
+     *              "quality"=>"质量状态",
+     *           }
+     *     }
+     */
+    public function getInventoryDetail(Request $request)
+    {
+        $taskId = $request->input("taskId");
+        $location = $request->input("location");
+        $barcode = $request->input("barcode");
+        $inventoryDetail=app('AndroidInventoryService')->getInventoryDetail($taskId,$location,$barcode);
+        if ($inventoryDetail) {
+            $this->response($inventoryDetail);
+        }else{
+            $this->response(null,410,'未检测到指定盘点任务');
+        }
+    }
+    /**
+     * @api {post} /inventory/stockInventory 盘点
+     * @apiName stockInventory
+     * @apiGroup inventory
+     *
+     * @apiParam {int} taskId 盘点任务号
+     * @apiParam {string} location 库位
+     * @apiParam {string} barcode 条码
+     * @apiParam {int} amount 盘点数量
+     *
+     * @apiSuccess {string} message 响应描述
+     * @apiSuccess {int} status_code HTTP响应码
+     * @apiSuccess {array} data 数据列表
+     *
+     * @apiSuccessExample {json} Success-Response:
+     *     HTTP/1.1 200 OK
+     *     {
+     *       "message": "请求成功",
+     *       "status_code": "200"
+     *       "data":[
+     *          "notStocktakingList"=>[
+     *                  {
+     *                        "id"=>"盘点任务明细号",
+     *                        "location"=>"库位",
+     *                  }
+     *              ]
+     *        ]
+     *     }
+     */
+    public function stockInventory(Request $request)
+    {
+        $task_item_id = $request->input("task_item_id");
+        $verified_amount = $request->input("verified_amount");
+        /**
+         * @var AndroidInventoryService $service
+         *@var InventoryAccountService $stockService
+         */
+        $service=app('AndroidInventoryService');
+        $stockService=app('InventoryAccountService');
+        $inventoryAccountMission=InventoryAccountMission::query()->find($task_item_id);
+        if (!$inventoryAccountMission)$this->response(null,410,'未查询到盘点明细');
+        $task_id=$inventoryAccountMission->inventory_account_id;
+        if (!$request->has('produced_at')&&!$request->has('valid_at')&&!$request->has('batch_number')){
+            $stockService->盘点($task_id,$verified_amount,$inventoryAccountMission);
+        }else{
+            $stockService->盘点生产日期_失效日期_批号有改动任务($task_item_id, $verified_amount, $task_id,
+                $request->input('produced_at')??'', $request->input('valid_at')??'',
+                $request->input('batch_number')??'');
+            $stockService->updateInventory($task_id);
+        }
+        $notStocktakingList=$service->getUnInventoryTaskList($task_id);
+        $this->response([
+            "notStocktakingList" => $notStocktakingList,
+        ]);
+    }
+
+    /**
+     * @api {post} /inventory/skipInventory 跳过盘点
+     * @apiName skipInventory
+     * @apiGroup inventory
+     *
+     * @apiParam {int} inventoryDetailId 盘点任务明细id
+     *
+     * @apiSuccess {string} message 响应描述
+     * @apiSuccess {int} status_code HTTP响应码
+     * @apiSuccess {array} data 数据列表
+     *
+     * @apiSuccessExample {json} Success-Response:
+     *     HTTP/1.1 200 OK
+     *     {
+     *       "message": "请求成功",
+     *       "status_code": "200"
+     *       "data":[
+     *          inventoryTaskDetails=>[
+     *                  {
+     *                        "id"=>"盘点任务明细号",
+     *                        "location"=>"库位",
+     *                  }
+     *              ]
+     *          sameDayInventoryCount=>“当日盘点行数”
+     *        ]
+     *     }
+     */
+    public function skipInventory(Request $request)
+    {
+        $inventoryDetailId = $request->input("inventoryDetailId");
+        /** @var AndroidInventoryService $service */
+        $service=app('AndroidInventoryService');
+        $inv=$service->skipInventory($inventoryDetailId);
+        if ($inv){
+            $inventoryTaskDetails=$service->getUnInventoryTaskList($inv->inventory_account_id);
+            $sameDayInventoryCount=$service->getStaffSameDayInvCount();
+            $this->response([
+                'inventoryTaskDetails' => $inventoryTaskDetails, 'sameDayInventoryCount'=>$sameDayInventoryCount
+            ]);
+        }else{
+            $this->response(null,410,'跳过失败!');
+        }
+
+    }
+}

+ 14 - 3
app/Http/Controllers/OrderController.php

@@ -6,9 +6,10 @@ use App\Components\Database;
 use App\Http\Requests\OrderDelivering;
 use App\OracleDOCOrderHeader;
 use App\OracleDOCWaveDetails;
-use App\OrderIssueType;
+use App\OrderIssue;
 use App\Services\LogisticService;
 use App\Services\LogService;
+use App\Services\OrderIssueTypeService;
 use App\Services\OrderPackageService;
 use App\Services\OrderService;
 use App\Services\OwnerService;
@@ -26,6 +27,17 @@ class OrderController extends Controller
 {
     use Database;
 
+    /**
+     * @var OrderIssueTypeService $orderIssueTypeService
+     */
+    private $orderIssueTypeService;
+
+    public function __construct()
+    {
+        $this->orderIssueTypeService = app(OrderIssueTypeService::class);
+    }
+
+
     public function delivering(OrderDelivering $request)
     {
         /** @var OrderService $orderService */
@@ -36,13 +48,12 @@ class OrderController extends Controller
         $result = $orderService->paginate($request);
         $picktotraceids = $result['picktotraceids'];
         $orders = $result['orders'];
-        $orderService->tagOrderByOrderIssue($orders);
         app('WorkOrderService')->tagWorkOrder($orders);
         $commodities = $result['commodities'];
         $customers = app(OwnerService::class)->getQuery()->select("code","name")->get();
         $page = $request["page"] ?? 1;
         $codes = DB::connection('oracle')->table('BAS_CODES')->select('code', 'codename_c')->where('codeid', 'SO_STS')->orderBy('code', 'asc')->get();
-        $orderIssueType = OrderIssueType::all();
+        $orderIssueType = $this->orderIssueTypeService->getOwnerOrderIssueType();
         return view('order/index/delivering', compact('orders', 'customers', 'request', 'codes', 'commodities', 'page', 'picktotraceids', 'orderIssueType', 'logistics'));
     }
 

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

@@ -15,9 +15,9 @@ use App\OrderIssueType;
 use App\Owner;
 use App\QualityLabel;
 use App\RejectedBill;
-use App\Services\common\ExportService;
 use App\Services\OrderIssueProcessLogService;
 use App\Services\OrderIssueService;
+use App\Services\OrderIssueTypeService;
 use App\Services\OrderService;
 use App\Services\OwnerService;
 use App\Shop;
@@ -26,7 +26,6 @@ use App\UserWorkgroup;
 use Exception;
 use Illuminate\Database\QueryException;
 use Illuminate\Http\Request;
-use Illuminate\Support\Carbon;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\Gate;
@@ -36,6 +35,14 @@ use Oursdreams\Export\Export;
 
 class OrderIssueController extends Controller
 {
+    /**
+     * @var OrderIssueTypeService $orderIssueTypeService;
+     */
+    private $orderIssueTypeService ;
+    public function __construct()
+    {
+        $this->orderIssueTypeService = app(OrderIssueTypeService::class);
+    }
 
     public function index(Request $request, OrderIssueFilters $filter,OrderIssueService $service)
     {
@@ -45,7 +52,7 @@ class OrderIssueController extends Controller
         $owners = app(OwnerService::class)->getAuthorizedOwners();
         $orderIssues = OrderIssue::query()->filter($filter)->defaultWith()->paginate($request['paginate'] ?? 50);
         $service->tagWorkOrder($orderIssues);
-        $orderIssueType = OrderIssueType::all();
+        $orderIssueType = $this->orderIssueTypeService->getOrderIssueTypes();
         $qualityLabel = QualityLabel::all();
         $logistics = Logistic::all();
         $userWorkgroup = UserWorkgroup::all();

+ 5 - 0
app/Http/Controllers/RejectedController.php

@@ -434,6 +434,11 @@ class RejectedController extends Controller
             config('database.connections.mysql.port'),config('database.connections.mysql.database')
             ,config('database.connections.mysql.username'),config('database.connections.mysql.password'));
         $e->setFileName("退货单列表-".date('ymdHis'));
+        $e->setDatum("id");
+        $e->setMergeFormat([
+            "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "P",
+            "Q", "R"
+        ]);
         return $e->sql($sql,[
             "created_at"=>"日期","checked_numbers"=>"审核号",
             "owner_name"=>"客户名称","order_number"=>"订单号",

+ 35 - 85
app/Http/Controllers/TestController.php

@@ -23,6 +23,8 @@ use App\Http\Controllers\api\thirdPart\syrius\units\Signature;
 use App\Http\Controllers\api\thirdPart\syrius\units\StorageTypeAttribute;
 use App\Http\Requests\AndroidGateRequest;
 use App\Http\Requests\OrderDelivering;
+use App\InventoryAccount;
+use App\InventoryAccountMission;
 use App\Jobs\BatchTaskJob;
 use App\Jobs\BroadcastBatchToZhengCangJob;
 use App\Jobs\CacheShelfTaskJob;
@@ -66,9 +68,11 @@ use App\OwnerPriceOperation;
 use App\OrderPackageCountingRecord;
 use App\OwnerReport;
 use App\ProcurementCheckSheet;
+use App\ProcurementDeliverie;
 use App\ReceiveRecord;
 use App\RejectedBill;
 use App\SeeLog;
+use App\Services\AndroidInventoryService;
 use App\Services\AuthorityService;
 use App\Services\BatchService;
 use App\Services\CacheShelfService;
@@ -223,6 +227,12 @@ class TestController extends Controller
         }
     }
 
+    public function test123(){
+
+        dd(Str::contains('承运商处理','承运商',));
+//        dd(WorkOrderDetail::query()->orderByDesc('id')->first());
+    }
+
 
     public function assignBatch($code)
     {
@@ -268,95 +278,35 @@ class TestController extends Controller
         app("BatchService")->assignTasks($batches);
     }
 
+    public function inventory()
+    {
+        $location='H05-35-04';
+        $inventoryAccountId=792;
+        $barcode='6973244250033';
+        $inventoryAccountMission=InventoryAccountMission::with(['commodity.barcodes','stockInventoryPersons'])
+            ->whereHas('commodity',function($query)use($barcode){
+            $query->whereHas('barcodes',function($sql)use($barcode){
+                $sql->where('code','=',$barcode);
+            });
+        })->where('location',$location)->where('inventory_account_id',$inventoryAccountId)->toSql();
+        dd($inventoryAccountMission);
 
-}
-class Worker{
-    //监听socket
-    protected $socket = NULL;
-
-    //所有的socket连接
-    protected $allSockets = array();
-
-    //连接事件回调
-    public $onConnect = NULL;
-
-    //断线事件回调
-    public $onClose = NULL;
-
-    //接收消息事件回调
-    public $onMessage = NULL;
-
-    public function __construct($socket_address) {
-        //创建一个socket监听
-        $this->socket = stream_socket_server($socket_address);
-
-        //设置为非阻塞
-        stream_set_blocking($this->socket, 0);
-
-        //将socket监听加入allSockets
-        $this->allSockets[(int)$this->socket] = $this->socket;
     }
 
-    public function run() {
-        while(true) {
-            //不监听可写事件与带外数据事件
-            $write = $except = array();
-            //监听所有的socket事件
-            $read = $this->allSockets;
-            //整个进程阻塞在这里,持续监听可读事件
-            //此处参数均为引用传递,在函数中会改变传值
-            stream_select($read, $write, $except, 60);
-
-            //处理所有可读事件
-            foreach ($read as $index => $socket) {
-                //如果是监听socket,此处表示有新的连接
-                if ($socket === $this->socket) {
-                    //通过stream_socket_accept获取新的连接
-                    $new_conn_socket = stream_socket_accept($socket);
-
-                    if ($this->onConnect) {
-                        //触发连接事件的回调,并将当前连接传递给回掉函数
-                        call_user_func($this->onConnect, $socket);
-                    }
-                    //记录此socket连接,以便于sream_select监听可读事件
-                    $this->allSockets[(int)$new_conn_socket] = $new_conn_socket;
-                } else
-                    //如果可读事件不为监听socket,则表示对应客户端有数据发过来
-                {
-                    //从连接中读取数据
-                    $buffer = fread($socket, 65535);
-                    //如果数据为空,表示客户端已经断开连接
-                    if ('' === $buffer || false === $buffer) {
-                        //尝试触发onClose回调
-                        if ($this->onClose) {
-                            call_user_func($this->onClose, $socket);
-                        }
-                        fclose($socket);
-                        //关闭socket连接并从allSockets中删除
-                        unset($this->allSockets[(int)$socket]);
-                        continue;
-                    }
-                    //表示一个正常的连接,已经读取到消息,交给回掉函数处理
-                    if ($this->onMessage) {
-                        call_user_func($this->onMessage, $socket, $buffer);
-                    }
-                }
-            }
-        }
+    public function testZC()
+    {
+//        $batches=Batch::query()->where('id',1)->get();
+//        BroadcastBatchToZhengCangJob::dispatch($batches);    //在这里为波次注册队列任务!
+        $taskId=792;
+        $location='H05-35-04';
+        $barcode='6931481255587';
+        /** @var AndroidInventoryService $service */
+        $service=app('AndroidInventoryService');
+        $inventoryAccountMission=$service->getInventoryDetail($taskId,$location,$barcode);
+        dd($inventoryAccountMission->stockInventoryPersons);
     }
 
-    public function asnTest(){
-        $service = new StoreItemService();
-        $docAsns = OracleDOCASNHeader::query()->whereIn('asnno',['ASN2112080434','ASN2112080435'])->get();
-        $storeItems = $service->getAsnDetailsByAsnHerder($docAsns);
-        dd($storeItems);
-    }
 
-    public function testSyncOrder(){
-        $order_no = 'SO211124008523';
-        $service = new OracleDOCOrderHeaderService();
-        $order_headers = $service->getQuery()->where('OrderNo',$order_no)->get();
-        $order_tracking_service = new OrderTrackingService();
-        $order_tracking_service->createByWmsOrderHeader($order_headers);
-    }
+
 }
+

+ 68 - 0
app/Http/Controllers/WorkOrderCancelInterceptController.php

@@ -0,0 +1,68 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Services\OrderService;
+use App\Services\WorkOrderCancelInterceptService;
+use App\WorkOrderDetail;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Gate;
+
+class WorkOrderCancelInterceptController extends Controller
+{
+    /**
+     *  处理 破损 工单
+     * @var WorkOrderCancelInterceptService $service
+     * @var OrderService $orderService
+     */
+    private $service;
+    private $orderService;
+
+    public function __construct()
+    {
+        $this->service = app(WorkOrderCancelInterceptService::class);
+        $this->orderService = app(OrderService::class );
+    }
+
+    public function storeApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-订单-生成工单'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $this->orderService->syncOrderByCodes([$request->input('order_no')]);
+
+        if ($this->service->checkWorkOrder($request->input('order_no')))
+            return ['success' => false, 'message' => '当前订单已有相同类型的工单'];
+
+        try {
+            $this->service->store($request->all());
+            return ['success' => true];
+        } catch (\Exception $e) {
+            return ['success' => false,'message' => $e->getMessage()];
+        }
+    }
+
+    public function logisticHandlerApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-承运商编辑'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
+        $workOrder = $detail->workOrder;
+        if (!$detail || !$workOrder) return ['success' => false,'message' => '参数异常'];
+        $this->service->logisticHandle($detail,$request->all());
+        $workOrder->loadDefaultWith();
+        return ['success' => true,'data' => $workOrder];
+    }
+
+    public function baoShiReviewApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-宝时编辑'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
+        $workOrder = $detail->workOrder;
+        if (!$detail || !$workOrder) return ['success' => false,'message' => '参数异常'];
+        $this->service->baoShiReviewDamage($detail,$request->all());
+        $workOrder->loadDefaultWith();
+        return ['success' => true,'data' => $workOrder];
+    }
+
+}

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

@@ -3,9 +3,9 @@
 namespace App\Http\Controllers;
 
 use App\Filters\WorkOrderFilters;
-use App\Http\Requests\WorkOrder\WorkOrderRequest;
 use App\Logistic;
 use App\OrderIssue;
+use App\Services\OrderIssueTypeService;
 use App\Services\OrderService;
 use App\Services\OwnerService;
 use App\Services\WorkOrderCommoditiesService;
@@ -13,6 +13,7 @@ use App\Services\WorkOrderDetailService;
 use App\Services\WorkOrderLogService;
 use App\Services\WorkOrderService;
 use App\WorkOrder;
+use App\WorkOrderDetail;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Gate;
 
@@ -26,6 +27,7 @@ class WorkOrderController extends Controller
      * @var WorkOrderLogService $logService
      * @var OrderService $orderService
      * @var OwnerService $ownerService
+     * @var OrderIssueTypeService $orderIssueTypeService
      */
     public $service;
     public $detailService;
@@ -33,26 +35,44 @@ class WorkOrderController extends Controller
     public $logService;
     public $orderService;
     public $ownerService;
+    public $orderIssueTypeService;
 
     public function __construct()
     {
         $this->service = app(WorkOrderService::class);
-        $this->detailService = app('WorkOrderDetailService');
+        $this->detailService = app(WorkOrderDetailService::class);
         $this->commoditiesService = app(WorkOrderCommoditiesService::class);
         $this->logService = app(WorkOrderLogService::class);
         $this->orderService = app(OrderService::class);
         $this->ownerService = app(OwnerService::class);
+        $this->orderIssueTypeService = app(OrderIssueTypeService::class);
+    }
+
+    /**
+     * 承运商标记处理中
+     * @param Request $request
+     * @return array
+     */
+    public function logisticHandlerTagApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-承运商编辑'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
+        if($detail->status === '完成') return ['success' => false, 'message' => '工单已完成,请刷新重试'];
+        $this->service->logisticHandlerTag($detail);
+        $data = $this->service->getDefaultWith($detail->work_order_id);
+        return ['success' => true,'data' => $data];
     }
 
     public function index(Request $request, WorkOrderFilters $filters)
     {
         if (Gate::denies('订单管理-工单处理-查询')) return redirect('/');
 
-        $workOrders = WorkOrder::query()->filter($filters)->defaultWith()->orderByDesc('work_order_status')->orderBy('created_at')->paginate($request['paginate'] ?? 50);
+        $workOrders = WorkOrder::query()->filter($filters)->defaultWith()->paginate($request['paginate'] ?? 50);
 
         $logistics = Logistic::all();
 
-        $orderIssueTypes = $this->service->getIssueType();
+        $orderIssueTypes =  $this->orderIssueTypeService->getWorkOrderIssueType();
 
         $owners = $this->ownerService->getAuthorizedOwners();
 
@@ -92,30 +112,6 @@ class WorkOrderController extends Controller
         return ['success' => true, 'data' => $workOrders];
     }
 
-    public function updateIssueTypeApi(Request $request): array
-    {
-        if (Gate::denies('订单管理-工单处理-审核'))
-            return ['success' => false, 'message' => '没有对应权限'];
-
-        WorkOrder::query()->where('id', $request['id'])->update(['order_issue_type_id' => $request['type_id']]);
-
-        return ['success' => true];
-    }
-
-    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();
-
-        $this->service->tags($items);
-
-        return ['success' => true, 'data' => $items];
-    }
-
     public function destroyApi($id): array
     {
         if (Gate::denies('订单管理-工单处理-删除'))
@@ -123,11 +119,14 @@ class WorkOrderController extends Controller
 
         $workOrder = $this->service->find($id);
 
-        if (!$workOrder)
+        if (!$workOrder){
             return ['success' => false, 'message' => '对应工单信息未找到'];
-        if ($workOrder->status == '已处理') {
-            return ['success' => false, 'message' => '对应工单已处理,拒绝删除'];
+        } else {
+            if ($workOrder->status == '已处理') {
+                return ['success' => false, 'message' => '对应工单已处理,拒绝删除'];
+            }
         }
+
         WorkOrder::query()->where('id', $id)->Delete();
         return ['success' => true];
     }
@@ -136,12 +135,32 @@ class WorkOrderController extends Controller
     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];
     }
+
+    /**
+     * 货主完结工单
+     * @param Request $request
+     * @return array
+     */
+    public function ownerEndWorkOrderApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-货主编辑'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $detail_id = $request->input('detail_id');
+        $detail = WorkOrderDetail::query()->with('workOrder')->where('id',$detail_id)->first();
+        if (!$detail || !$detail->workOrder){
+            return ['success'=>false,'message' => '参数异常'];
+        }
+        try {
+            $this->service->ownerEndWorkOrderDetail($detail);
+            return ['success'=>true,'message' => '参数异常'];
+        } catch (\Exception $e) {
+            return ['success' => false,'message' => '工单完结异常'];
+        }
+    }
 }

+ 4 - 0
app/Http/Controllers/WorkOrderDamageController.php

@@ -29,6 +29,10 @@ class WorkOrderDamageController extends Controller
         if (Gate::denies('订单管理-订单-生成工单'))
             return ['success' => false, 'message' => '没有对应权限'];
         $this->orderService->syncOrderByCodes([$request->input('order_no')]);
+
+        if ($this->service->checkWorkOrder($request->input('order_no')))
+            return ['success' => false, 'message' => '当前订单已有相同类型的工单'];
+
         try {
             $this->service->store($request->all());
             return ['success' => true];

+ 4 - 0
app/Http/Controllers/WorkOrderExpressAbnormalController.php

@@ -27,6 +27,10 @@ class WorkOrderExpressAbnormalController extends Controller
         if (Gate::denies('订单管理-订单-生成工单'))
             return ['success' => false, 'message' => '没有对应权限'];
         $this->orderService->syncOrderByCodes([$request->input('order_no')]);
+
+        if ($this->service->checkWorkOrder($request->input('order_no')))
+            return ['success' => false, 'message' => '当前订单已有相同类型的工单'];
+
         $this->service->store($request->all());
         return ['success' => true];
     }

+ 4 - 1
app/Http/Controllers/WorkOrderInformationChangeController.php

@@ -5,7 +5,6 @@ namespace App\Http\Controllers;
 use App\Services\OrderService;
 use App\Services\WorkOrderInformationChangeService;
 use App\WorkOrderDetail;
-
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Gate;
 
@@ -30,6 +29,10 @@ class WorkOrderInformationChangeController extends Controller
             return ['success' => false, 'message' => '没有对应权限'];
         $orderNo = $request->input('order_no', '');
         $this->orderService->syncOrderByCodes([$orderNo]);
+
+        if ($this->service->checkWorkOrder($request->input('order_no')))
+            return ['success' => false, 'message' => '当前订单已有相同类型的工单'];
+
         $this->service->store($request->all());
         return ['success' => true];
     }

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

@@ -2,10 +2,8 @@
 
 namespace App\Http\Controllers;
 
-
 use App\Services\OrderService;
 use App\Services\WorkOrderInterceptService;
-use App\WorkOrder;
 use App\WorkOrderDetail;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Gate;
@@ -28,11 +26,17 @@ class WorkOrderInterceptController extends Controller
     {
         if (Gate::denies('订单管理-订单-生成工单'))
             return ['success' => false, 'message' => '没有对应权限'];
-        $this->orderService->syncOrderByCodes([$request->input('orderNos')]);
+        $this->orderService->syncOrderByCodes([$request->input('order_no')]);
+
+        if ($this->service->checkWorkOrder($request->input('order_no')))
+            return ['success' => false, 'message' => '当前订单已有相同类型的工单'];
+
         $this->service->store($request->all());
         return ['success' => true];
     }
 
+
+
     public function logisticHandlerApi(Request $request):array
     {
         if (Gate::denies('订单管理-工单处理-承运商编辑'))

+ 4 - 0
app/Http/Controllers/WorkOrderLossController.php

@@ -29,6 +29,10 @@ class WorkOrderLossController extends Controller
         if (Gate::denies('订单管理-订单-生成工单'))
             return ['success' => false, 'message' => '没有对应权限'];
         $this->orderService->syncOrderByCodes([$request->input('order_no','')]);
+
+        if ($this->service->checkWorkOrder($request->input('order_no')))
+            return ['success' => false, 'message' => '当前订单已有相同类型的工单'];
+
         $this->service->store($request->all());
         return ['success' => true];
     }

+ 40 - 19
app/Http/Controllers/WorkOrderMistakeController.php

@@ -16,6 +16,7 @@ class WorkOrderMistakeController extends Controller
      */
     private $service;
     private $orderService;
+
     public function __construct()
     {
         $this->service = app('WorkOrderMistakeService');
@@ -27,6 +28,11 @@ class WorkOrderMistakeController extends Controller
         if (Gate::denies('订单管理-订单-生成工单'))
             return ['success' => false, 'message' => '没有对应权限'];
         $this->orderService->syncOrderByCodes([$request->input('order_no')]);
+
+        if ($this->service->checkWorkOrder($request->input('order_no'))){
+            return ['success' => false, 'message' => '当前订单已有相同类型的工单'];
+        }
+
         $this->service->store($request->all());
         return ['success' => true];
     }
@@ -37,11 +43,14 @@ class WorkOrderMistakeController extends Controller
             return ['success' => false, 'message' => '没有对应权限'];
         $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
         $workOrder = $detail->workOrder;
-        if (!$detail || !$workOrder) return ['success' => false,'message' => '参数异常'];
-        if ($detail->status ==='完成') return ['success' => false,'message' => '处理失败,刷新当前页面重试'];
-        $this->service->ownerEdit($detail,$request->all());
+        if (!$detail || !$workOrder){
+            return ['success' => false, 'message' => '参数异常'];
+        } else if ($detail->status === '完成'){
+            return ['success' => false, 'message' => '处理失败,刷新当前页面重试'];
+        }
+        $this->service->ownerEdit($detail, $request->all());
         $workOrder->loadDefaultWith();
-        return ['success' => true,'data' => $workOrder];
+        return ['success' => true, 'data' => $workOrder];
     }
 
     public function baoShiHandleApi(Request $request): array
@@ -50,11 +59,14 @@ class WorkOrderMistakeController extends Controller
             return ['success' => false, 'message' => '没有对应权限'];
         $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
         $workOrder = $detail->workOrder;
-        if (!$detail || !$workOrder) return ['success' => false,'message' => '参数异常'];
-        if ($detail->status ==='完成' || $detail->status === '宝时终审') return ['success' => false,'message' => '处理失败,刷新当前页面重试'];
-        $this->service->baoShiReviewMistake($detail,$request->all());
+        if (!$detail || !$workOrder){
+            return ['success' => false, 'message' => '参数异常'];
+        } else if ($detail->status === '完成' || $detail->status === '宝时终审'){
+            return ['success' => false, 'message' => '处理失败,刷新当前页面重试'];
+        }
+        $this->service->baoShiCheckMistake($detail, $request->all());
         $workOrder->loadDefaultWith();
-        return ['success' => true,'data' => $workOrder];
+        return ['success' => true, 'data' => $workOrder];
 
     }
 
@@ -64,11 +76,15 @@ class WorkOrderMistakeController extends Controller
             return ['success' => false, 'message' => '没有对应权限'];
         $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
         $workOrder = $detail->workOrder;
-        if (!$detail || !$workOrder) return ['success' => false,'message' => '参数异常'];
-        if ($detail->status ==='完成') return ['success' => false,'message' => '处理失败,刷新当前页面重试'];
-        $this->service->ownerReviewMistake($detail,$request->all());
+        if (!$detail || !$workOrder) {
+            return ['success' => false, 'message' => '参数异常'];
+        }
+        else if ($detail->status === '完成') {
+            return ['success' => false, 'message' => '处理失败,刷新当前页面重试'];
+        }
+        $this->service->ownerReview($detail, $request->all());
         $workOrder->loadDefaultWith();
-        return ['success' => true,'data' => $workOrder];
+        return ['success' => true, 'data' => $workOrder];
     }
 
     public function ownerEndEditApi(Request $request): array
@@ -77,11 +93,14 @@ class WorkOrderMistakeController extends Controller
             return ['success' => false, 'message' => '没有对应权限'];
         $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
         $workOrder = $detail->workOrder;
-        if (!$detail || !$workOrder) return ['success' => false,'message' => '参数异常'];
-        if ($detail->status ==='完成') return ['success' => false,'message' => '处理失败,刷新当前页面重试'];
-        $this->service->ownerEndEdit($detail,$request->all());
+        if (!$detail || !$workOrder) {
+            return ['success' => false, 'message' => '参数异常'];
+        } else if ($detail->status === '宝时审核') {
+            return ['success' => false, 'message' => '处理失败,刷新当前页面重试'];
+        }
+        $this->service->ownerEditReview($detail, $request->all());
         $workOrder->loadDefaultWith();
-        return ['success' => true,'data' => $workOrder];
+        return ['success' => true, 'data' => $workOrder];
     }
 
     public function baoShiReviewApi(Request $request): array
@@ -90,10 +109,12 @@ class WorkOrderMistakeController extends Controller
             return ['success' => false, 'message' => '没有对应权限'];
         $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
         $workOrder = $detail->workOrder;
-        if (!$detail || !$workOrder) return ['success' => false,'message' => '参数异常'];
-        $this->service->baoShiReview($detail,$request->all());
+        if (!$detail || !$workOrder) {
+            return ['success' => false, 'message' => '参数异常'];
+        }
+        $this->service->baoShiReview($detail, $request->all());
         $workOrder->loadDefaultWith();
-        return ['success' => true,'data' => $workOrder];
+        return ['success' => true, 'data' => $workOrder];
     }
 
 

+ 12 - 2
app/Http/Controllers/api/thirdPart/weixin/ProcurementController.php

@@ -17,6 +17,7 @@ use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\DB;
+use Monolog\Handler\IFTTTHandler;
 
 class ProcurementController extends Controller
 {
@@ -259,9 +260,14 @@ class ProcurementController extends Controller
             'created_at'=>Carbon::now()->toDateTimeString(),
             'signed_at'=>Carbon::now()->toDateString()]
         );
-        $procurementDelivery->procurement->update(['status'=>6]);
+        $procurementDeliveryCount=ProcurementDeliverie::query()
+            ->where('procurement_id',$procurementDelivery->procurement['id'])->sum('receipt_amount');
+        if ($procurementDeliveryCount==$procurementDelivery->procurement['quantity']){
+            $procurementDelivery->procurement->update(['status'=>6]);//待确定
+        }
         if ($procurementDelivery) return $this->success($procurementDelivery);
     }
+    //供应商确认账单
     public function supplierDeliverConfirm(Request $request): \Illuminate\Http\JsonResponse
     {
         $procurementDelivery=ProcurementDeliverie::query()
@@ -272,7 +278,11 @@ class ProcurementController extends Controller
             && $procurementDelivery->procurement->type!=2
             && $procurementCheckSheet)
         $procurementCheckSheet->update(['status'=>1,'account_payable'=>($procurementDelivery->receipt_amount*$procurementDelivery->procurement->cost_price)]);
-        $procurementDelivery->procurement->update(['status'=>7]);//待出账
+        $procurementDeliveryCount=ProcurementDeliverie::query()
+            ->where('procurement_id',$procurementDelivery->procurement['id'])->sum('receipt_amount');
+        if ($procurementDeliveryCount==$procurementDelivery->procurement['quantity']){
+            $procurementDelivery->procurement->update(['status'=>7]);//待出账
+        }
         if ($procurementDelivery) return $this->success($procurementDelivery);
     }
 }

+ 4 - 4
app/Imports/StoreCheckingReceiveImport.php

@@ -88,6 +88,7 @@ class StoreCheckingReceiveImport implements ToCollection,WithHeadingRow
                 }
                 if ($sign) continue;
             }
+            $barcode = (string)rtrim(ltrim($item["条码"]));
             array_push($items,[
                 "imported_amount" => $item["数量"],
                 "produced_at" => $item["生产日期"],
@@ -96,16 +97,15 @@ class StoreCheckingReceiveImport implements ToCollection,WithHeadingRow
                 "unique_code" => $item["唯一码"],
                 "SKU" => $item["SKU"],
                 "商品名称" => $item["商品名称"],
-                "条码" => rtrim(ltrim($item["条码"])),
+                "条码" => $barcode,
             ]);
             if ($isUniqueCommodity){
-                array_push($commodities[$item["条码"]], count($items)-1);
+                array_push($commodities[$barcode], count($items)-1);
             }else{
                 $commodities[$item["条码"]] = [count($items)-1] ;
-                array_push($barcodes,$item["条码"]);
+                array_push($barcodes,$barcode);
             }
         }
-
         //不存在货主
         if (!$owner_name){
             Cache::put("storeCheckingReceive",["success"=>false, "data"=>"货主为空,不允许录入,至少为一行标明货主!"],86400);

+ 4 - 0
app/InventoryAccount.php

@@ -67,4 +67,8 @@ class InventoryAccount extends Model
             'mark'=>Auth::user()['name'],
         ]);
     }
+    public function getOwnerNameAttribute()
+    {
+        return $this->relations["owner"]["name"] ?? "";
+    }
 }

+ 1 - 1
app/OracleBasSKU.php

@@ -12,7 +12,7 @@ use App\Traits\ModelTimeFormat;
 use App\Traits\ModelLogChanging;
 class OracleBasSKU extends Model
 {
-//    use \Awobaz\Compoships\Compoships;
+    use \Awobaz\Compoships\Compoships;
     use ModelLogChanging;
 
     use ModelTimeFormat;

+ 1 - 1
app/OracleDOCASNDetail.php

@@ -9,7 +9,7 @@ use App\Traits\ModelLogChanging;
 
 class OracleDOCASNDetail extends Model
 {
-//    use \Awobaz\Compoships\Compoships;
+    use \Awobaz\Compoships\Compoships;
     use ModelLogChanging;
 
     use ModelTimeFormat;

+ 0 - 2
app/OrderIssueType.php

@@ -10,10 +10,8 @@ use App\Traits\ModelLogChanging;
 class OrderIssueType extends Model
 {
     use ModelLogChanging;
-
     //
     use ModelTimeFormat;
-
     protected $fillable = ['name'];
 
     public function orderIssue(){

+ 4 - 0
app/Providers/AppServiceProvider.php

@@ -202,6 +202,8 @@ use App\Services\WorkOrderExpressAbnormalService;
 use App\Services\WorkOrderMistakeService;
 use App\Services\WorkOrderDamageService;
 use App\Services\WorkOrderLossService;
+use App\Services\AndroidInventoryService;
+use App\Services\WorkOrderCancelInterceptService;
 
 class AppServiceProvider extends ServiceProvider
 {
@@ -230,6 +232,7 @@ class AppServiceProvider extends ServiceProvider
 
     private function loadingService(){
         app()->singleton('AllInventoryService',AllInventoryService::class);
+        app()->singleton('AndroidInventoryService',AndroidInventoryService::class);
         app()->singleton('AuthorityService',AuthorityService::class);
         app()->singleton('BatchService',BatchService::class);
         app()->singleton('BatchUpdateService', BatchUpdateService::class);
@@ -400,6 +403,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('WaybillFinancialService', WaybillFinancialService::class);
         app()->singleton('WaybillService', WaybillService::class);
         app()->singleton('WeighExceptedService', WeighExceptedService::class);
+        app()->singleton('WorkOrderCancelInterceptService',WorkOrderCancelInterceptService::class);
         app()->singleton('WorkOrderCommoditiesService',WorkOrderCommoditiesService::class);
         app()->singleton('WorkOrderDamageService',WorkOrderDamageService::class);
         app()->singleton('WorkOrderDetailService',WorkOrderDetailService::class);

+ 76 - 0
app/Services/AndroidInventoryService.php

@@ -0,0 +1,76 @@
+<?php
+
+namespace App\Services;
+
+use App\InventoryAccount;
+use App\InventoryAccountMission;
+use App\Sign;
+use App\Traits\ServiceAppAop;
+use Carbon\Carbon;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Cache;
+
+class AndroidInventoryService
+{
+    use ServiceAppAop;
+
+    //未盘任务列表
+    public function getUnInventoryTaskList($taskId)
+    {
+        return  InventoryAccountMission::query()
+            ->select('location')->selectRaw("count(*) count")
+            ->where('inventory_account_id', $taskId)
+            ->where('checked', '否')->groupBy("location")
+            ->get();
+    }
+    //根据员工姓名获取当日盘点行数
+    public function getStaffSameDayInvCount(): int
+    {
+         return Sign::query()
+            ->where('signable_type', 'inventory_account_missions')
+            ->where('field', '盘点人')
+            ->where('created_at', 'like', Carbon::now()->toDateString() . '%')
+            ->where('mark', Auth::user()['name'])->count();
+    }
+    public function getLocInvPro($taskId,$location): array
+    {
+        $ins=InventoryAccountMission::query()
+            ->where('inventory_account_id',$taskId)
+            ->where('location',$location)->get();
+        //库位盘点任务总条数
+        $total=$ins->count();
+        //已盘数
+        $invCount=$ins->where('checked','<>','否')->count();
+        return ['total'=>$total,'invCount'=>$invCount];
+    }
+    //根据盘点任务号,库位,条码 查询指定盘点任务
+    public function getInventoryDetail($taskId,$location,$barcode)
+    {
+        return Cache::remember($taskId.'_'.$location.'_'.$barcode, 300, function ()use($taskId,$location,$barcode) {
+            return InventoryAccountMission::with(['commodity.barcodes','stockInventoryPersons'])
+                ->whereHas('commodity',function($query)use($barcode){
+                    $query->whereHas('barcodes',function($sql)use($barcode){
+                        $sql->where('code','=',$barcode);
+                    });
+                })->where('location',$location)
+                ->where('inventory_account_id',$taskId)
+                ->where('checked','否')
+                ->first();
+        });
+    }
+    public function skipInventory($inventoryDetailId)
+    {
+        $inventoryAccountMission=InventoryAccountMission::query()->find($inventoryDetailId);
+        if (!$inventoryAccountMission)return null;
+        $inventoryAccountMission->checked='跳过';
+        $inventoryAccountMission->update();
+        if ($inventoryAccountMission->checked=='跳过'){
+            /** @var InventoryAccountService $inventoryService */
+            $inventoryService = app('inventoryAccountService');
+            $inventoryService->updateInventory($inventoryAccountMission->inventory_account_id);
+        }
+        return $inventoryAccountMission;
+    }
+
+
+}

+ 1 - 25
app/Services/ForeignZhenCangService.php

@@ -13,28 +13,6 @@ class ForeignZhenCangService
 
     public function broadcastBatch($batches)
     {
-//        $body=[];
-//        $body['id']=$batches->code;
-//        $body['orders'] = [];
-//        foreach ($batches->orders as $order){
-//            $orderArr = [];
-//            $orderArr['id']=$order->code??'';
-//            $orderArr['createdAt']=Carbon::parse($order->created_at)->toDateTimeString()??'';
-//            $orderArr['barcodes'] = [];
-//            foreach ($order->orderCommodities as $orderCommodity){
-//                $barcode=[];
-//                $barcode['id']=$orderCommodity->id;
-//                $barcode['barcode']=$orderCommodity->commodity ? ($orderCommodity->commodity->barcodes?$orderCommodity->commodity->barcodes->first()['code']:'') : '';
-//                $barcode['name']=$orderCommodity->commodity->name??'';
-//                $barcode['sku']=$orderCommodity->commodity->sku??'';
-//                $barcode['amount']=$orderCommodity->amount??'';
-//                $barcode['location']=$orderCommodity->location??'';
-//                $orderArr['barcodes'][]=$barcode;
-//            }
-//            $body['orders'][] = $orderArr;
-//        }
-
-        //12.13
         $body=[];
         $body['id']=$batches->code;
         $body['slots'] = [];
@@ -61,8 +39,6 @@ class ForeignZhenCangService
         }
         $body['slots']=array_values($result);
         dd($body);
-        $response = Http::withHeaders([
-            'Host' => 'zc-it.com',
-        ])->post('http://1.116.164.201:8080/api/createBatch',$body);
+        $response = Http::post('http://zc-it.cn/api/createBatch',$body);
     }
 }

+ 61 - 20
app/Services/ObligationService.php

@@ -42,12 +42,21 @@ class ObligationService
             if ($kc){
                 $kc->update(['department_id'=>$param['kc']]);
             }else{
-                DepartmentObligationOwner::query()
-                    ->orderByDesc('id')
+                $kcHis=DepartmentObligationOwner::query()
                     ->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]);
+                    ->where('department_id',$param['kc'])
+                    ->whereNull('failure_time')
+                    ->first();
+                if (!$kcHis){
+                    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'])
@@ -56,12 +65,20 @@ class ObligationService
             if ($jg){
                 $jg->update(['department_id'=>$param['jg']]);
             }else{
-                DepartmentObligationOwner::query()
-                    ->orderByDesc('id')
+                $jgHis=DepartmentObligationOwner::query()
                     ->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]);
+                    ->where('department_id',$param['jg'])
+                    ->whereNull('failure_time')
+                    ->first();
+                if (!$jgHis){
+                    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()
@@ -71,12 +88,20 @@ class ObligationService
             if ($th){
                 $th->update(['department_id'=>$param['th']]);
             }else{
-                DepartmentObligationOwner::query()
-                    ->orderByDesc('id')
+                $thHis=DepartmentObligationOwner::query()
                     ->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]);
+                    ->where('department_id',$param['th'])
+                    ->whereNull('failure_time')
+                    ->first();
+                if (!$thHis){
+                    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()
@@ -86,12 +111,20 @@ class ObligationService
             if ($sh){
                 $sh->update(['department_id'=>$param['sh']]);
             }else{
-                DepartmentObligationOwner::query()
-                    ->orderByDesc('id')
+                $shHis=DepartmentObligationOwner::query()
                     ->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]);
+                    ->where('department_id',$param['sh'])
+                    ->whereNull('failure_time')
+                    ->first();
+                if (!$shHis){
+                    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()
@@ -101,12 +134,20 @@ class ObligationService
             if ($fh){
                 $fh->update(['department_id'=>$param['fh']]);
             }else{
-                DepartmentObligationOwner::query()
-                    ->orderByDesc('id')
+                $fhHis=DepartmentObligationOwner::query()
                     ->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]);
+                    ->where('department_id',$param['fh'])
+                    ->whereNull('failure_time')
+                    ->first();
+                if (!$fhHis){
+                    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']);

+ 46 - 1
app/Services/OrderIssueTypeService.php

@@ -4,9 +4,54 @@ namespace App\Services;
 
 use App\Traits\ServiceAppAop;
 use App\OrderIssueType;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Support\Facades\Gate;
 
 class OrderIssueTypeService
 {
     use ServiceAppAop;
-    protected $modelClass=OrderIssueType::class;
+
+    protected $modelClass = OrderIssueType::class;
+
+    /**
+     * 订单管理 问题件类型
+     * @return Builder[]|\Illuminate\Database\Eloquent\Collection
+     */
+    public function getOrderIssueType()
+    {
+        return OrderIssueType::query()->whereIn('name',[
+            '联系不上','其他','仓库问题','撤销丢件','二次加工','全检问题','系统问题','延迟发货','仓库丢件','快递方式更改','无记录','双面单'
+        ])->get();
+    }
+
+    /**
+     * @return Builder[]|\Illuminate\Database\Eloquent\Collection
+     */
+    public function getOwnerOrderIssueType(){
+        return OrderIssueType::query()->whereIn('name', ['拦截','取消拦截', '信息更改', '快递异常', '错漏发', '破损'])->get();
+    }
+
+
+    /**
+     * 生成工单问题
+     * @return Builder[]|\Illuminate\Database\Eloquent\Collections
+     */
+    public function getWorkOrderIssueType(){
+        if (Gate::allows('订单管理-工单处理-客服编辑')) {
+            return OrderIssueType::query()->whereIn('name', ['拦截','取消拦截', '信息更改', '快递异常', '错漏发', '破损', '快递丢件'])->get();
+        } else if (Gate::allows('订单管理-工单处理-货主编辑')) {
+            return OrderIssueType::query()->whereIn('name', ['拦截','取消拦截', '信息更改', '快递异常', '错漏发', '破损',])->get();
+        } else if (Gate::allows('订单管理-工单处理-承运商编辑')) {
+            return OrderIssueType::query()->whereIn('name', ['拦截','取消拦截', '信息更改', '破损', '快递异常'])->get();
+        }
+        return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '快递异常', '错漏发', '破损', '快递丢件'])->get();
+
+    }
+
+    public function getOrderIssueTypes(){
+        return OrderIssueType::query()->whereIn('name',[
+            '拦截', '信息更改', '快递异常', '错漏发', '破损', '快递丢件',
+            '联系不上','其他','仓库问题','撤销丢件','二次加工','全检问题','系统问题','延迟发货','仓库丢件','快递方式更改','无记录','双面单','取消拦截'
+        ])->get();
+    }
 }

+ 0 - 4
app/Services/OrderService.php

@@ -831,7 +831,6 @@ SQL;
     {
         /** @var DataHandlerService $dataHandlerService */
         $dataHandlerService = app('DataHandlerService');
-
         $warehouse_map = $dataHandlerService->dataHeader(['code'], $warehouses);
         $owner_map = $dataHandlerService->dataHeader(['code'], $owners);
         $logistic_map = $dataHandlerService->dataHeader(['code'], $logistics);
@@ -891,9 +890,6 @@ SQL;
             $shop_name = str_replace("\n", ' ', $orderHeader['issuepartyname']);
             $shop = $dataHandlerService->getKeyValue(['name' => $shop_name ?? '', 'owner_id' => $owner->id ?? ''], $shop_map);
         }
-        if (!$batch['id'] && !($orderHeader['status'] == 90 || $orderHeader['status'] == 00) && $orderHeader['wave_no'] != '*') {
-            LogService::log(__METHOD__, __FUNCTION__, '波次为空: code=' . $orderHeader['orderno']);
-        }
         return [
             'code' => $orderHeader['orderno'],
             'batch_id' => $batch['id'] ?? null,

+ 77 - 0
app/Services/WorkOrderCancelInterceptService.php

@@ -0,0 +1,77 @@
+<?php
+
+namespace App\Services;
+
+use App\Order;
+use App\WorkOrder;
+use App\WorkOrderDetail;
+
+class WorkOrderCancelInterceptService extends WorkOrderService
+{
+    /**
+     * @var WorkOrderLogService $logService
+     * @var WorkOrderDetailService $detailService
+     * @var OrderIssueTypeService $issueTypeService
+     */
+    private $logService;
+    private $detailService;
+    private $issueTypeService;
+
+    public function __construct()
+    {
+        parent::__construct();
+        $this->logService = app('WorkOrderLogService');
+        $this->detailService = app('WorkOrderDetailService');
+        $this->issueTypeService = app('OrderIssueTypeService');
+    }
+
+    public function checkWorkOrder($nos)
+    {
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '取消拦截']);
+        $orderQuery = Order::query()->select('id')->where('code',$nos);
+        $workOrder = WorkOrder::query()->select('id')->whereIn('order_id',$orderQuery)->first();
+        if (!$workOrder) return false;
+        return WorkOrderDetail::query()
+            ->where('order_issue_type_id',$issueType['id'])
+            ->where('work_order_id',$workOrder['id'])->exists();
+    }
+
+    public function store($params)
+    {
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '取消拦截']);
+        $order = $this->syncOrder($params['order_no']);
+        $workOrder = $this->createAndNotification($order, $issueType, $params['remark'] ?? '');
+        $workOrder->change('承运商处理','商家创建','');
+        $detail = $this->detailService->createWorkOrderDetail($workOrder, $params);
+        $detail->change('承运商处理','商家创建','');
+        $this->logService->createLog($detail, '创建', '创建工单');
+    }
+
+    /**
+     * 承运商处理 和 编辑
+     * @param WorkOrderDetail $detail
+     * @param $params
+     */
+    public function logisticHandle(WorkOrderDetail $detail, $params)
+    {
+        $this->detailService->updateDetail($detail, $params);
+        $detail->change('宝时终审', $params['process_progress'],'承运商处理');
+        $detail->workOrder->change('宝时终审', $params['process_progress'],'承运商处理');
+        $detail->workOrder->clearWorkOrderStatus();
+        $this->logService->createLog($detail, '处理', '承运商处理');
+    }
+
+    /**
+     * 宝时终审
+     * @param WorkOrderDetail $detail
+     * @param $params
+     */
+    public function baoShiReviewDamage(WorkOrderDetail $detail, $params)
+    {
+        $this->detailService->updateDetail($detail, $params);
+        $this->logService->createLog($detail, '终审', '宝时终审');
+        $detail->change('待货主完结', $params['process_progress'],'宝时终审');
+        $detail->workOrder->change('待货主完结', $params['process_progress'],'宝时终审');
+    }
+
+}

+ 25 - 5
app/Services/WorkOrderDamageService.php

@@ -2,6 +2,8 @@
 
 namespace App\Services;
 
+use App\Order;
+use App\WorkOrder;
 use App\WorkOrderDetail;
 
 /**
@@ -28,6 +30,17 @@ class WorkOrderDamageService extends WorkOrderService
         $this->issueTypeService = app('OrderIssueTypeService');
     }
 
+    public function checkWorkOrder($nos)
+    {
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '破损']);
+        $orderQuery = Order::query()->select('id')->where('code',$nos);
+        $workOrder = WorkOrder::query()->select('id')->whereIn('order_id',$orderQuery)->first();
+        if (!$workOrder) return false;
+        return WorkOrderDetail::query()
+            ->where('order_issue_type_id',$issueType['id'])
+            ->where('work_order_id',$workOrder['id'])->exists();
+    }
+
     /*
      * 破损工单处理流程
      * 1:创建工单
@@ -43,7 +56,6 @@ class WorkOrderDamageService extends WorkOrderService
         $workOrder->change('承运商处理','商家创建','');
         $detail = $this->detailService->createWorkOrderDetail($workOrder, $params);
         $detail->change('承运商处理','商家创建','');
-
         $this->logService->createLog($detail, '创建', '创建工单');
     }
 
@@ -61,6 +73,11 @@ class WorkOrderDamageService extends WorkOrderService
 
     }
 
+    /**
+     * 承运商处理 和 编辑
+     * @param WorkOrderDetail $detail
+     * @param $params
+     */
     public function logisticHandle(WorkOrderDetail $detail, $params)
     {
         $this->detailService->updateDetail($detail, $params);
@@ -70,14 +87,17 @@ class WorkOrderDamageService extends WorkOrderService
         $this->logService->createLog($detail, '处理', '承运商处理');
     }
 
+    /**
+     * 宝时终审
+     * @param WorkOrderDetail $detail
+     * @param $params
+     */
     public function baoShiReviewDamage(WorkOrderDetail $detail, $params)
     {
         $this->detailService->updateDetail($detail, $params);
         $this->logService->createLog($detail, '终审', '宝时终审');
-        $this->logService->createLog($detail, '完结', '完结');
-        $detail->change('完成', $params['process_progress'],'宝时终审');
-        $detail->workOrder->change('完成', $params['process_progress'],'宝时终审');
-        $this->detailService->endDetail($detail);
+        $detail->change('待货主完结', $params['process_progress'],'宝时终审');
+        $detail->workOrder->change('待货主完结', $params['process_progress'],'宝时终审');
     }
 
 }

+ 36 - 6
app/Services/WorkOrderExpressAbnormalService.php

@@ -5,6 +5,9 @@ namespace App\Services;
 /**
  * 处理 快递异常 工单
  */
+
+use App\Order;
+use App\WorkOrder;
 use App\WorkOrderDetail;
 
 class WorkOrderExpressAbnormalService extends WorkOrderService
@@ -26,6 +29,17 @@ class WorkOrderExpressAbnormalService extends WorkOrderService
         $this->issueTypeService = app('OrderIssueTypeService');
     }
 
+    public function checkWorkOrder($nos)
+    {
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '快递异常']);
+        $orderQuery = Order::query()->select('id')->where('code',$nos);
+        $workOrder = WorkOrder::query()->select('id')->whereIn('order_id',$orderQuery)->first();
+        if (!$workOrder) return false;
+        return WorkOrderDetail::query()
+            ->where('order_issue_type_id',$issueType['id'])
+            ->where('work_order_id',$workOrder['id'])->exists();
+    }
+
     /*
      * 快递异常处理流程
      * 1:创建
@@ -33,6 +47,10 @@ class WorkOrderExpressAbnormalService extends WorkOrderService
      * 3: 完成
      * */
 
+    /**
+     * 快递异常 工单创建
+     * @param $params
+     */
     public function store($params)
     {
         $order = $this->syncOrder($params['order_no']);
@@ -47,6 +65,11 @@ class WorkOrderExpressAbnormalService extends WorkOrderService
         $this->logService->createLog($detail, '创建', '创建工单');
     }
 
+    /**
+     * 创建后编辑
+     * @param WorkOrderDetail $detail
+     * @param $params
+     */
     public function ownerEdit(WorkOrderDetail $detail,$params)
     {
         $this->detailService->updateDetail($detail,$params);
@@ -56,6 +79,11 @@ class WorkOrderExpressAbnormalService extends WorkOrderService
         $this->logService->createLog($detail, '处理', '商家编辑');
     }
 
+    /**
+     * 承运商处理 和 编辑
+     * @param WorkOrderDetail $detail
+     * @param $params
+     */
     public function logisticHandle(WorkOrderDetail $detail,$params)
     {
         $this->detailService->updateDetail($detail,$params);
@@ -65,15 +93,17 @@ class WorkOrderExpressAbnormalService extends WorkOrderService
         $this->logService->createLog($detail, '处理', '承运商处理');
     }
 
+    /**
+     * 宝时终审
+     * @param WorkOrderDetail $detail
+     * @param $params
+     */
     public function baoShiReviewExpressAbnormal(WorkOrderDetail $detail,$params)
     {
         $this->detailService->updateDetail($detail,$params);
-        $this->logService->createLog($detail, '终审', '终审');
-        $this->logService->createLog($detail, '完结', '完结');
-        $detail->change('完成',$params['process_progress'],'宝时终审');
-        $detail->workOrder->change('完成',$params['process_progress'],'宝时终审');
-        $this->detailService->endDetail($detail);
-
+        $this->logService->createLog($detail, '终审', '宝时终审');
+        $detail->change('待货主完结',$params['process_progress'],'宝时终审');
+        $detail->workOrder->change('待货主完结',$params['process_progress'],'宝时终审');
     }
 
 }

+ 37 - 9
app/Services/WorkOrderInformationChangeService.php

@@ -2,6 +2,8 @@
 
 namespace App\Services;
 
+use App\Order;
+use App\WorkOrder;
 use App\WorkOrderDetail;
 
 /**
@@ -27,6 +29,17 @@ class WorkOrderInformationChangeService extends WorkOrderService
         $this->issueTypeService = app('OrderIssueTypeService');
     }
 
+    public function checkWorkOrder($nos)
+    {
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '信息更改']);
+        $orderQuery = Order::query()->select('id')->where('code',$nos);
+        $workOrder = WorkOrder::query()->select('id')->whereIn('order_id',$orderQuery)->first();
+        if (!$workOrder)return false;
+        return WorkOrderDetail::query()
+            ->where('order_issue_type_id',$issueType['id'])
+            ->where('work_order_id',$workOrder->id)->exists();
+    }
+
     /*
      * 处理流程:
      * 1:创建
@@ -34,6 +47,10 @@ class WorkOrderInformationChangeService extends WorkOrderService
      * 2:完结工单
      */
 
+    /**
+     * 创建信息更改工单
+     * @param $params
+     */
     public function store($params)
     {
         $issueType = $this->issueTypeService->firstOrCreate(['name' => '信息更改']);
@@ -46,6 +63,11 @@ class WorkOrderInformationChangeService extends WorkOrderService
         $this->logService->createLog($detail, '创建', '创建工单');
     }
 
+    /**
+     * 创建后编辑
+     * @param WorkOrderDetail $detail
+     * @param $params
+     */
     public function ownerEdit(WorkOrderDetail $detail,$params)
     {
         $this->logService->createLog($detail, '处理', '商家编辑');
@@ -53,22 +75,28 @@ class WorkOrderInformationChangeService extends WorkOrderService
         $detail->workOrder->update(['remark' => $params['remark']]);
     }
 
+    /**
+     * 承运商处理
+     * @param WorkOrderDetail $detail
+     * @param $params
+     */
     public function logisticHandler(WorkOrderDetail $detail,$params){
         $this->logService->createLog($detail, '处理', '承运商处理');
-        $detail->workOrder->clearWorkOrderStatus();
-
         $detail->change('宝时终审',$params['process_progress'],'承运商处理');
         $detail->workOrder->change('宝时终审',$params['process_progress'],'承运商处理');
+        $detail->cancelLogisticTagHandle();
+        $detail->workOrder->clearWorkOrderStatus();
     }
 
-
+    /**
+     * 宝时终审
+     * @param WorkOrderDetail $detail
+     * @param $params
+     */
     public function baoShiReviewInformationChange(WorkOrderDetail $detail,$params)
     {
-        $this->logService->createLog($detail, '完结', '宝时完结');
-
-        $detail->change('完成',$params['process_progress'],'宝时终审');
-        $detail->workOrder->change('完成',$params['process_progress'],'宝时终审');
-
-        $this->detailService->endDetail($detail);
+        $this->logService->createLog($detail, '终审', '宝时终审');
+        $detail->change('待货主完结',$params['process_progress'],'宝时终审');
+        $detail->workOrder->change('待货主完结',$params['process_progress'],'宝时终审');
     }
 }

+ 28 - 8
app/Services/WorkOrderInterceptService.php

@@ -2,6 +2,8 @@
 
 namespace App\Services;
 
+use App\Order;
+use App\WorkOrder;
 use App\WorkOrderDetail;
 
 /**
@@ -28,6 +30,17 @@ class WorkOrderInterceptService extends WorkOrderService
         $this->issueTypeService = app('OrderIssueTypeService');
     }
 
+    public function checkWorkOrder($nos)
+    {
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '拦截']);
+        $orderQuery = Order::query()->select('id')->where('code',$nos);
+        $workOrder = WorkOrder::query()->select('id')->whereIn('order_id',$orderQuery)->first();
+        if (!$workOrder) return false;
+        return WorkOrderDetail::query()
+            ->where('order_issue_type_id',$issueType['id'])
+            ->where('work_order_id',$workOrder['id'])->exists();
+    }
+
     /*
     * 拦截工单处理流程
     * 1:创建
@@ -35,11 +48,14 @@ class WorkOrderInterceptService extends WorkOrderService
     * 3:宝时终审     [拦截成功,拦截失败]
     */
 
-
+    /**
+     * 拦截 工单创建
+     * @param $params
+     */
     public function store($params)
     {
         $issueType = $this->issueTypeService->firstOrCreate(['name' => '拦截']);
-        $order = $this->syncOrder($params['orderNos']);
+        $order = $this->syncOrder($params['order_no']);
         $workOrder = $this->createAndNotification($order, $issueType, $params['remark'] ?? '拦截工单');
         $workOrder->change('承运商处理','商家创建','');
         $detail = $this->detailService->createWorkOrderDetail($workOrder, $params);
@@ -47,21 +63,25 @@ class WorkOrderInterceptService extends WorkOrderService
         $this->logService->createLog($detail, '创建', '创建');
     }
 
+
+
     public function logisticHandler(WorkOrderDetail $detail,$params)
     {
+        $this->logService->createLog($detail, '处理', '承运商处理');
+        $detail->workOrder->clearWorkOrderStatus();                     // 清除创建标记
+
+        $detail->cancelLogisticTagHandle();
+
         $detail->change('宝时终审',$params['process_progress'],'承运商处理');
         $detail->workOrder->change('宝时终审',$params['process_progress'],'承运商处理');
-        $detail->workOrder->clearWorkOrderStatus();                     // 清除创建标记
-        $this->logService->createLog($detail, '处理', '承运商处理');
     }
 
     public function baoShiReviewIntercept(WorkOrderDetail $detail,$params)
     {
-        $this->logService->createLog($detail, '完结', '宝时完结');
-        $detail->change('完成',$params['process_progress'],'宝时终审');
-        $detail->workOrder->change('完成',$params['process_progress'],'宝时终审');
+        $this->logService->createLog($detail, '终审', '宝时终审');
+        $detail->change('待货主完结',$params['process_progress'],'宝时终审');
+        $detail->workOrder->change('待货主完结',$params['process_progress'],'宝时终审');
         $detail->workOrder->clearWorkOrderStatus();                     // 清除创建标记
-        $this->detailService->endDetail($detail);                       // 标记为处理过
     }
 
 }

+ 15 - 4
app/Services/WorkOrderLossService.php

@@ -3,6 +3,7 @@
 namespace App\Services;
 
 
+use App\Order;
 use App\WorkOrder;
 use App\WorkOrderDetail;
 
@@ -31,6 +32,17 @@ class WorkOrderLossService extends WorkOrderService
         $this->issueTypeService = app('OrderIssueTypeService');
     }
 
+    public function checkWorkOrder($nos)
+    {
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '快递丢件']);
+        $orderQuery = Order::query()->select('id')->where('code',$nos);
+        $workOrder = WorkOrder::query()->select('id')->whereIn('order_id',$orderQuery)->first();
+        if (!$workOrder) return false;
+        return WorkOrderDetail::query()
+            ->where('order_issue_type_id',$issueType['id'])
+            ->where('work_order_id',$workOrder['id'])->exists();
+    }
+
    /*
    * 快递丢件处理流程
    * 1: 创建 (限定宝时创建)
@@ -63,10 +75,9 @@ class WorkOrderLossService extends WorkOrderService
     // 宝时审核
     public function baoShiReviewLoss(WorkOrderDetail $detail,$params)
     {
-        $this->logService->createLog($detail, '完结', '宝时完结');
+        $this->logService->createLog($detail, '终审', '宝时终审');
         $this->detailService->updateLossDetail($detail,$params);
-        $detail->change('完成','完结',"宝时终审");
-        $detail->workOrder->change('完成','完结',"宝时终审");
-        $this->detailService->endDetail($detail);
+        $detail->change('待货主完结','终审完成',"宝时终审");
+        $detail->workOrder->change('待货主完结','终审完成',"宝时终审");
     }
 }

+ 40 - 11
app/Services/WorkOrderMistakeService.php

@@ -2,6 +2,8 @@
 
 namespace App\Services;
 
+use App\Order;
+use App\WorkOrder;
 use App\WorkOrderDetail;
 
 /**
@@ -27,6 +29,18 @@ class WorkOrderMistakeService extends WorkOrderService
         $this->detailService = app('WorkOrderDetailService');
         $this->issueTypeService = app('OrderIssueTypeService');
     }
+
+    public function checkWorkOrder($nos)
+    {
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '信息更改']);
+        $orderQuery = Order::query()->select('id')->where('code',$nos);
+        $workOrder= WorkOrder::query()->select('id')->whereIn('order_id',$orderQuery)->first();
+        if (!$workOrder) return false;
+        return WorkOrderDetail::query()
+            ->where('order_issue_type_id',$issueType['id'])
+            ->where('work_order_id',$workOrder->id)->exists();
+    }
+
     /*
      * 错漏发处理流程
      * 1:创建错漏发工单
@@ -58,7 +72,12 @@ class WorkOrderMistakeService extends WorkOrderService
         $this->logService->createLog($detail, '处理','商家修改');
     }
 
-    public function baoShiReviewMistake(WorkOrderDetail $detail,$params)
+    /**
+     * 宝时复核
+     * @param WorkOrderDetail $detail
+     * @param $params
+     */
+    public function baoShiCheckMistake(WorkOrderDetail $detail,$params)
     {
         $this->detailService->updateDetail($detail,$params);
         $detail->change('货主处理','已核实','宝时处理');
@@ -67,7 +86,12 @@ class WorkOrderMistakeService extends WorkOrderService
         $this->logService->createLog($detail, '处理', '承运商处理');
     }
 
-    public function ownerReviewMistake(WorkOrderDetail $detail,$params)
+    /**
+     * 货主审核宝时复核结果
+     * @param WorkOrderDetail $detail
+     * @param $params
+     */
+    public function ownerReview(WorkOrderDetail $detail,$params)
     {
         $this->detailService->updateDetail($detail,$params);
 
@@ -77,7 +101,12 @@ class WorkOrderMistakeService extends WorkOrderService
         $this->logService->createLog($detail, '处理', '货主处理');
     }
 
-    public function ownerEndEdit(WorkOrderDetail $detail,$params)
+    /**
+     * 货主编辑
+     * @param WorkOrderDetail $detail
+     * @param $params
+     */
+    public function ownerEditReview(WorkOrderDetail $detail,$params)
     {
         $this->detailService->updateDetail($detail,$params);
 
@@ -87,17 +116,17 @@ class WorkOrderMistakeService extends WorkOrderService
         $this->logService->createLog($detail, '处理', '货主编辑');
     }
 
+    /**
+     * 宝时终审
+     * @param $detail
+     * @param $params
+     */
     public function baoShiReview($detail,$params)
     {
         $this->detailService->updateDetail($detail,$params);
-        $this->logService->createLog($detail,'完结','宝时完结');
-
-        $detail->change('完成',$params['process_progress'],'宝时终审');
-        $detail->workOrder->change('完成',$params['process_progress'],'宝时终审');
-
-        $this->detailService->endDetail($detail);
+        $this->logService->createLog($detail,'终审','宝时终审');
+        $detail->change('待货主完结',$params['process_progress'],'宝时终审');
+        $detail->workOrder->change('待货主完结',$params['process_progress'],'宝时终审');
     }
 
-
-
 }

+ 31 - 73
app/Services/WorkOrderService.php

@@ -8,9 +8,6 @@ use App\OrderPackage;
 use App\Traits\ServiceAppAop;
 use App\WorkOrder;
 use App\WorkOrderDetail;
-use Illuminate\Database\Eloquent\Builder;
-use Illuminate\Database\Eloquent\Collection;
-use Illuminate\Support\Carbon;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Gate;
 
@@ -45,23 +42,6 @@ class WorkOrderService
         $this->orderService = app(OrderService::class);
     }
 
-    /**
-     * 获取可生成工单的问题件类型
-     * @return Builder[]|Collection
-     */
-    public function getIssueType()
-    {
-        if (Gate::allows('订单管理-工单处理-客服编辑')) {
-            return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '快递异常', '错漏发', '破损', '快递丢件'])->get();
-        } else if (Gate::allows('订单管理-工单处理-货主编辑')) {
-            return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '快递异常', '错漏发', '破损',])->get();
-        } else if (Gate::allows('订单管理-工单处理-承运商编辑')) {
-            return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '破损', '快递异常'])->get();
-        }
-        return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '其他', '快递异常', '错漏发', '破损', '快递丢件'])->get();
-    }
-
-
     public function createOrResetWorkOrder($order, $issueType, $remark, $process_progress = '商家创建')
     {
         $user = Auth::user();
@@ -77,6 +57,7 @@ class WorkOrderService
                 'process_progress' => $process_progress,
                 'type' => $process_progress,
                 'last_handler_id' => $user['id'] ?? '',
+                'created_at' => now(),
             ]);
             return $workOrder;
         }
@@ -115,11 +96,24 @@ class WorkOrderService
     public function end(WorkOrder $workOrder, WorkOrderDetail $detail)
     {
         $this->detailService->endDetail($detail);
-        $this->logService->createLog($detail, '完结', '完结工单');
         $workOrder->clearWorkOrderStatus();
+        $this->logService->createLog($detail, '完结', '完结工单');
         $workOrder->changeStatus('完成');
     }
 
+    /**
+     * 商家完结工单
+     * @param WorkOrderDetail $detail
+     */
+    public function ownerEndWorkOrderDetail(WorkOrderDetail $detail)
+    {
+        $this->logService->createLog($detail, '完结', '货主完结');
+        $detail->change('完成','完成','待货主完结');
+        $detail->workOrder->change('完成','完成','待货主完结');
+        $detail->workOrder->clearWorkOrderStatus();                     // 清除创建标记
+        $this->detailService->endDetail($detail);                       // 标记为处理过
+    }
+
     /**
      * @param WorkOrder $workOrder
      * @param WorkOrderDetail $detail
@@ -144,56 +138,6 @@ class WorkOrderService
         return WorkOrder::query()->defaultWith()->find($id);
     }
 
-    /**
-     * 工单审核
-     * @param $wordOrder
-     * @return array
-     */
-    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()];
-    }
-
-//    /**
-//     * 终审
-//     * @param WorkOrder $workOrder
-//     * @param WorkOrderDetail $detail
-//     * @param $params
-//     */
-//    public function baoShiReview(WorkOrder $workOrder,WorkOrderDetail $detail, $params)
-//    {
-//        $user = Auth::user();
-//
-//        $workOrder->update(['reviewer_id' => $user['id'], 'review_at' => Carbon::now(), 'status' => '5']);
-//
-//        $this->commoditiesService->updateWorkOrderCommoditiesByJsonArray($detail, $params);
-//
-//        $this->logService->createLog($detail,'终审', '终审完成');
-//
-//        $this->detailService->endDetail($detail);
-//    }
-
-    /**
-     * 批量审核工单
-     * @param $workOrders
-     * @return array
-     */
-    public function batchReview($workOrders): array
-    {
-        $ids = $workOrders->map(function ($item) {
-            return $item->id;
-        })->toArray();
-        WorkOrder::query()->whereIn('id', $ids)->update(['review_at' => Carbon::now(), 'reviewer_id' => Auth::user()['id'], 'status' => '2']);
-        $wordOrders = WorkOrder::query()->defaultWith()->whereIn('id', $ids)->get();
-        return ['success' => true, 'data' => $wordOrders];
-    }
-
 
     /**
      * 生成问题件
@@ -258,7 +202,7 @@ class WorkOrderService
     }
 
     /**
-     * 判断是否拦截工单
+     * 判断是否拦截工单 称重
      * @param $logistic_number
      * @return bool
      */
@@ -293,7 +237,7 @@ class WorkOrderService
     }
 
     /**
-     * 校验工单是否存在c
+     * 校验工单是否存在
      * @param $nos
      * @return mixed
      */
@@ -309,8 +253,22 @@ class WorkOrderService
         })->get();
     }
 
+    /**
+     * 同步订单
+     * @param $order_no
+     * @return mixed
+     */
     public function syncOrder($order_no)
     {
         return $this->orderService->first(['code' => $order_no]);
     }
+
+    /**
+     * 承运商标记在处理
+     * @param WorkOrderDetail $detail
+     */
+    public function logisticHandlerTag(WorkOrderDetail $detail)
+    {
+        $detail->logisticTagHandle();
+    }
 }

+ 28 - 0
app/WorkOrder.php

@@ -15,6 +15,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
 use Illuminate\Http\UploadedFile;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Gate;
+use Illuminate\Support\Str;
 
 class WorkOrder extends Model
 {
@@ -44,6 +45,9 @@ class WorkOrder extends Model
         'uniquely_tag',             // 唯一标识
         'remark',                   // 工单信息描述
         'work_order_status',        // 1 为创建状态 0 为处理状态
+        'logistic_tag',             // 待承运商处理标记
+        'bao_shi_tag',              // 待宝时处理标记
+        'owner_tag',                // 待货主处理标记
     ];
 
     static public $process_progress = [
@@ -259,6 +263,7 @@ class WorkOrder extends Model
         $this->status = $status;
         $this->process_progress = $process_progress;
         $this->last_handler_id = $user['id'] ?? '';
+        $this->computedTag();
         $this->update();
     }
 
@@ -268,4 +273,27 @@ class WorkOrder extends Model
     public function clearWorkOrderStatus(){
         $this->update(['work_order_status' => 0]);
     }
+
+    public function computedTag()
+    {
+        $status = $this->status;
+        if (Str::contains($status,'宝时')){
+            $this->bao_shi_tag = 1;
+            $this->logistic_tag = 0;
+            $this->owner_tag = 0;
+        } else if (Str::contains($status,'承运商')){
+            $this->logistic_tag = 1;
+            $this->owner_tag = 0;
+            $this->bao_shi_tag = 0;
+        } else if (Str::contains($status,'货主')){
+            $this->owner_tag = 1;
+            $this->bao_shi_tag = 0;
+            $this->logistic_tag = 0;
+        } else if ('完成' === $status){
+            $this->owner_tag = 0;
+            $this->logistic_tag = 0;
+            $this->bao_shi_tag = 0;
+        }
+    }
+
 }

+ 49 - 15
app/WorkOrderDetail.php

@@ -18,7 +18,6 @@ class WorkOrderDetail extends Model
     protected $fillable = [
         'work_order_id',
         'order_issue_type_id',      // 工单异常类型
-        'type',                     // 工单
         'price',                    // 商品价值
         'sku_amount',               // 破损sku数
         'type',                     // 快递异常填写:在途异常,签收未收到
@@ -26,13 +25,13 @@ class WorkOrderDetail extends Model
         'reissue_logistic_number',  // 补发单号
         'return_logistic_number',   // 退回单号 (错漏发:商家填写) (破损:创建时填写)
         'process_progress',         // 处理进度 -----------------------------------
-                                    // 拦截:       承运商->[已处理,已签收]         宝时审核->[拦截成功,拦截失败]
-                                    // 信息更改:    承运商->[已处理,无法更改]       宝时审核->[更改成功,更改失败]
-                                    // 快递异常:    承运商->[已处理,已拦截]         宝时审核->[丢件赔偿,签收成功]
-                                    // 错漏发:      宝时处理->[已核实]            商家处理->[补发,不补发]
-                                    // 破损:       承运商->[核实全部破损,核实部分破损,核实未破损]   宝时终审->[核实全部破损,核实部分破损,核实未破损]
-                                    // 快递丢件:    待商家处理   待终审 完结
-                                    // -----------------------------------
+        // 拦截:       承运商->[已处理,已签收]         宝时审核->[拦截成功,拦截失败]
+        // 信息更改:    承运商->[已处理,无法更改]       宝时审核->[更改成功,更改失败]
+        // 快递异常:    承运商->[已处理,已拦截]         宝时审核->[丢件赔偿,签收成功]
+        // 错漏发:      宝时处理->[已核实]            商家处理->[补发,不补发]
+        // 破损:       承运商->[核实全部破损,核实部分破损,核实未破损]   宝时终审->[核实全部破损,核实部分破损,核实未破损]
+        // 快递丢件:    待商家处理   待终审 完结
+        // -----------------------------------
         'logistic_number',          // 快递单号
         'status',                   // 当前状态
         'remark',                   // 创建工单时的问题标记
@@ -41,6 +40,8 @@ class WorkOrderDetail extends Model
         'return_address',           // 退回单 寄件人地址
         'return_phone',             // 退回单 寄件人联系号码
         'return_name',              // 退回单 寄件人姓名
+
+        'logistic_handle_tag',      // 承运商在处理标记
     ];
 
     static public $enums = [
@@ -72,7 +73,12 @@ class WorkOrderDetail extends Model
             '商家' => 1,
             '承运商' => 2,
             '宝时' => 3,
-        ]
+        ],
+        'logistic_handle_tag' => [
+            '' => 0,
+            '承运商处理中' => 1,
+            '取消标记' => 2
+        ],
     ];
 
     function __construct(array $attributes = [])
@@ -83,6 +89,22 @@ class WorkOrderDetail extends Model
         parent::__construct($attributes);
     }
 
+    public function getLogisticHandleTagAttribute($value)
+    {
+        if (!$value) return '';
+        return self::$enums['logistic_handle_tag'][$value];
+    }
+
+    public function setLogisticHandleTagAttribute($value)
+    {
+        if (!$value) return;
+        if (is_numeric($value)) {
+            $this->attributes['logistic_handle_tag'] = $value;
+        } else {
+            $this->attributes['logistic_handle_tag'] = self::$enums['logistic_handle_tag'][$value];
+        }
+    }
+
     public function getStatusAttribute($value)
     {
         if (!$value) return '';
@@ -139,7 +161,7 @@ class WorkOrderDetail extends Model
 
     public function issueType(): BelongsTo
     {
-        return $this->belongsTo(OrderIssueType::class,'order_issue_type_id');
+        return $this->belongsTo(OrderIssueType::class, 'order_issue_type_id');
     }
 
     // 图片
@@ -179,14 +201,16 @@ class WorkOrderDetail extends Model
     }
 
     // 未完成历史标记
-    public function undoneTag(){
-        if ($this->tag != '完成'){
+    public function undoneTag()
+    {
+        if ($this->tag != '完成') {
             $this->update(['tag' => 2]);
         }
     }
 
     // 完成标记
-    public function end(){
+    public function end()
+    {
         $this->status = 5;
         $this->tag = 1;
         $this->update();
@@ -209,9 +233,9 @@ class WorkOrderDetail extends Model
      * @param $process_progress
      * @param $last_status
      */
-    public function change($status,$process_progress,$last_status)
+    public function change($status, $process_progress, $last_status)
     {
-        $user =Auth::user();
+        $user = Auth::user();
         $this->status = $status;
         $this->last_status = $last_status;
         $this->process_progress = $process_progress;
@@ -219,4 +243,14 @@ class WorkOrderDetail extends Model
         $this->update();
     }
 
+    public function logisticTagHandle()
+    {
+        $this->update(['logistic_handle_tag' => 1]);
+    }
+
+    public function cancelLogisticTagHandle()
+    {
+        $this->logistic_handle_tag = '取消标记';
+        $this->update();
+    }
 }

+ 52 - 0
database/migrations/2021_12_16_141128_work_order_add_new_tag.php

@@ -0,0 +1,52 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class WorkOrderAddNewTag extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('work_order_details', function (Blueprint $table) {
+            $table->integer("logistic_handle_tag")->comment("承运商在处理标记");
+
+        });
+
+        Schema::table('work_orders', function (Blueprint $table) {
+            $table->integer("logistic_tag")->comment('承运商标记');
+            $table->integer("bao_shi_tag")->comment('宝时标记');
+            $table->integer("owner_tag")->comment('货主标记');
+        });
+
+        if(!\App\OrderIssueType::query()->where('name','取消拦截')->first()){
+            \App\OrderIssueType::query()->create(['name' => '取消拦截']);
+        }
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('work_order_details', function (Blueprint $table) {
+            $table->dropColumn('logistic_handle_tag');
+        });
+
+        Schema::table('work_orders', function (Blueprint $table) {
+            $table->dropColumn("logistic_tag");
+            $table->dropColumn("bao_shi_tag");
+            $table->dropColumn("owner_tag");
+        });
+        if(\App\OrderIssueType::query()->where('name','取消拦截')->first()){
+            \App\OrderIssueType::query()->where('name' , '取消拦截')->delete();
+        }
+    }
+}

+ 1 - 1
resources/views/order/index/_work_order_modal.blade.php

@@ -22,7 +22,7 @@
                 </div>
                 {{--其他--}}
                 <div class="form-group row"
-                     v-if="['其他',null,'快递异常','错漏发','破损','快递丢件','拦截'].includes(workOrder.orderIssueType)">
+                     v-if="['其他',null,'快递异常','错漏发','破损','快递丢件','拦截','取消拦截'].includes(workOrder.orderIssueType)">
                     <hr>
                     <label for="remake_info" class="col-sm-2 col-form-label text-right">问题描述</label>
                     <div class="col-sm-10">

+ 12 - 5
resources/views/order/index/delivering.blade.php

@@ -388,9 +388,9 @@
                 workOrder: {
                     types:
                         @can("订单管理-工单处理-客服编辑")
-                            ['拦截', '信息更改', '快递异常', '错漏发', '破损', '快递丢件']
+                            ['拦截','取消拦截', '信息更改', '快递异常', '错漏发', '破损', '快递丢件']
                         @elsecan("订单管理-工单处理-货主编辑")
-                            ['拦截', '信息更改', '快递异常', '错漏发', '破损']
+                            ['拦截','取消拦截','信息更改', '快递异常', '错漏发', '破损']
                         @else
                             ['']
                         @endcan
@@ -1332,17 +1332,24 @@
                         this.createMistakeWorkOrder();
                     } else if ('破损' === this.workOrder.orderIssueType) {
                         this.createDamagedWorkOrder();
-                    } else {
-                        this.createDefaultWorkOrder();
+                    } else if('取消拦截') {
+                        this.createCancelInterceptWorkOrder();
                     }
                 },
                 createInterceptWorkOrder() {        // 拦截
                     let formData = new FormData();
-                    formData.append('orderNos',checkData[0]);
+                    formData.append('order_no',checkData[0]);
                     formData.append('remark',this.workOrder ? (this.workOrder.remark ? this.workOrder.remark.info : '') : '');
                     let url = "{{route('workOrder.intercept.storeApi')}}";
                     this.createWorkOrder(formData,url);
                 },
+                createCancelInterceptWorkOrder(){
+                    let formData = new FormData();
+                    formData.append('order_no',checkData[0]);
+                    formData.append('remark',this.workOrder ? (this.workOrder.remark ? this.workOrder.remark.info : '') : '');
+                    let url = "{{route('workOrder.cancelIntercept.storeApi')}}";
+                    this.createWorkOrder(formData,url);
+                },
                 createInformationChangeWorkOrder() { // 信息修改
                     let data = this.getCreateWorkOrderData();
                     if (data.length > 1){

+ 15 - 0
resources/views/order/workOrder/_bao_shi_review_modal.blade.php

@@ -25,6 +25,21 @@
             </div>
         </template>
 
+        <template
+            v-if="'取消拦截'=== baoShiEditWorkOrder.issue_type_name">
+            <div class="form-group row">
+                <label for="process_progress" class="col-sm-2 col-form-label text-right text-primary">
+                    <span class="text-danger">*</span>
+                    处理
+                </label>
+                <div class="col-sm-10">
+                    <select class="form-control" v-model="baoShiEditWorkOrder.process_progress">
+                        <option v-for="item in getBaoShiProcessProgress()"
+                                :value="item" v-text="item"></option>
+                    </select>
+                </div>
+            </div>
+        </template>
         <template
              v-else-if="'快递丢件' === baoShiEditWorkOrder.issue_type_name">
             <div>

+ 32 - 0
resources/views/order/workOrder/_logistic_fill_work_order_modal.blade.php

@@ -19,6 +19,22 @@
             </div>
         </template>
 
+        <template v-if="'取消拦截' === logisticEditWorkOrder.issue_type_name">
+            <div class="form-group row">
+                <label class="col-sm-2 col-form-label text-primary text-right">
+                    <span class="text-danger">*</span>
+                    处理
+                </label>
+                <div class="col-sm-10">
+                    <select class="form-control form-control-sm" v-model="logisticEditWorkOrder.process_progress">
+                        <option
+                            v-for="item in getLogisticProcessProgress()"
+                            :value="item" v-text="item"></option>
+                    </select>
+                </div>
+            </div>
+        </template>
+
         <template v-else-if="'信息更改' === logisticEditWorkOrder.issue_type_name">
             <div class="form-group row">
                 <label class="col-sm-2 col-form-label text-primary text-right">
@@ -149,6 +165,22 @@
             </div>
         </template>
 
+        <template v-if="'取消拦截' === logisticEditWorkOrder.issue_type_name">
+            <div class="form-group row">
+                <label class="col-sm-2 col-form-label text-primary text-right">
+                    <span class="text-danger">*</span>
+                    处理
+                </label>
+                <div class="col-sm-10">
+                    <select class="form-control form-control-sm" v-model="logisticEditWorkOrder.process_progress">
+                        <option
+                            v-for="item in getLogisticProcessProgress()"
+                            :value="item" v-text="item"></option>
+                    </select>
+                </div>
+            </div>
+        </template>
+
         <template v-else-if="'破损' === logisticEditWorkOrder.issue_type_name">
             <div>
                 <table class="table border">

+ 1 - 10
resources/views/order/workOrder/_owner_fill_work_order_modal.blade.php

@@ -602,15 +602,6 @@
         </template>
 
         <template v-else-if="'快递异常' === ownerEditWorkOrder.issue_type_name">
-            {{--            <div class="form-group row">--}}
-            {{--                <hr>--}}
-            {{--                <label for="owner-work-order-edit-remark"--}}
-            {{--                       class="col-sm-2 col-form-label text-right">问题描述</label>--}}
-            {{--                <div class="col-sm-10">--}}
-            {{--                        <textarea class="form-control form-control-sm" id="remake_info" cols="30" rows="2"--}}
-            {{--                                  v-model="ownerEditWorkOrder.remark"></textarea>--}}
-            {{--                </div>--}}
-            {{--            </div>--}}
             <div class="form-group row">
                 <label for="work-order-edit-type" class="col-sm-2 col-form-label text-right text-primary">
                     <span class="text-danger">*</span>
@@ -640,7 +631,7 @@
                                 <img v-else :src="image.src" class="card-img-top">
                                 <div class="float-right position-relative">
                                     <button type="button" class="btn btn-sm btn-outline-danger"
-                                            @click="ownerEditWorkOrderSpliceImage(i,ownerEditWorkOrder.refundImages)">
+                                            @click="ownerEditWorkOrderSpliceImage(i,ownerEditWorkOrder.dealImages)">
                                         取消
                                     </button>
                                 </div>

+ 250 - 181
resources/views/order/workOrder/_work_order_show.blade.php

@@ -9,6 +9,15 @@
             </div>
         </div>
 
+        <div class="modal-body" v-if="'取消拦截' === showWorkOrder.issue_type_name">
+            <div class="form-group row">
+                <label for="show-work-order-package-images" class="col-form-label col-sm-2 text-right">
+                    当前进度
+                </label>
+                <label class="col-form-label col-sm-10 text-monospace" v-text="showWorkOrder.process_progress"></label>
+            </div>
+        </div>
+
         <div class="modal-body" v-if="'信息更改' === showWorkOrder.issue_type_name">
             <div class="form-group row">
                 <label for="show-work-order-package-images" class="col-form-label col-sm-2 text-right">
@@ -251,206 +260,266 @@
                 </table>
             </div>
 
-            <div class="form-group row" v-else-if="'宝时终审' === showWorkOrder.status">
-                <table class="table table-sm table-bordered">
-                    <thead>
-                    <tr>
-                        <th>快递单号</th>
-                        <th>商品条码</th>
-                        <th>商品名</th>
-                        <th>订单数量</th>
-                        <th>异常类型</th>
-                        <th>客户实收数量</th>
-                        <th>宝时复核数量</th>
-                        <th>复核结果</th>
-                        <th>商家处理</th>
-                        <th>商家详情</th>
-                    </tr>
-                    </thead>
-                    <tbody>
-                    <template v-for="item in showWorkOrder.commodities">
+            <template v-else-if="'宝时终审' === showWorkOrder.status">
+                <div class="form-group row">
+                    <table class="table table-sm table-bordered">
+                        <thead>
                         <tr>
-                            <td class="align-middle"
-                                v-if="item.count"
-                                :rowspan="item.count"
-                                v-text="item.logistic_number"
-                            ></td>
-                            <td v-text="item.sku"></td>
-                            <td v-text="item.commodity ? item.commodity.name : ''"></td>
-                            <td v-text="item.amount"></td>
-                            <td v-text="item.abnormal_type"></td>
-                            <td v-text="item.abnormal_amount"></td>
-                            <td v-text="item.bao_shi_check_amount"></td>
-                            <td v-text="item.check_result"></td>
-                            <td class="text-wrap" v-text="item.process_result"></td>
-                            <td class="text-wrap" v-text="item.process_result_info"></td>
+                            <th>快递单号</th>
+                            <th>商品条码</th>
+                            <th>商品名</th>
+                            <th>订单数量</th>
+                            <th>异常类型</th>
+                            <th>客户实收数量</th>
+                            <th>宝时复核数量</th>
+                            <th>复核结果</th>
+                            <th>商家处理</th>
+                            <th>商家详情</th>
                         </tr>
-                        <tr v-if="hasOutInNumber(item)">
-                            <td colspan="9" class="row">
-                                <label for="" class="col-form-label col-sm-3 text-right">出库订单号:</label>
-                                <label class="col-form-label col-sm-9 text-monospace"
-                                       v-text="item.out_order_number"></label>
-                            </td>
-                        </tr>
-                        <tr v-else-if="hasStoreNumber(item)">
-                            <td colspan="5">
-                                <div class="row">
-                                    <label for="" class="col-form-label col-sm-3 text-right">入库单号:</label>
-                                    <label class="col-form-label col-sm-9 text-monospace text-success"
-                                           v-text="item.store_in_number"></label>
-                                </div>
-                            </td>
-                            <td colspan="4">
-                                <div class="row">
-                                    <label for="" class="col-form-label col-sm-3 text-right">入库数量:</label>
+                        </thead>
+                        <tbody>
+                        <template v-for="item in showWorkOrder.commodities">
+                            <tr>
+                                <td class="align-middle"
+                                    v-if="item.count"
+                                    :rowspan="item.count"
+                                    v-text="item.logistic_number"
+                                ></td>
+                                <td v-text="item.sku"></td>
+                                <td v-text="item.commodity ? item.commodity.name : ''"></td>
+                                <td v-text="item.amount"></td>
+                                <td v-text="item.abnormal_type"></td>
+                                <td v-text="item.abnormal_amount"></td>
+                                <td v-text="item.bao_shi_check_amount"></td>
+                                <td v-text="item.check_result"></td>
+                                <td class="text-wrap" v-text="item.process_result"></td>
+                                <td class="text-wrap" v-text="item.process_result_info"></td>
+                            </tr>
+                            <tr v-if="hasOutInNumber(item)">
+                                <td colspan="9" class="row">
+                                    <label for="" class="col-form-label col-sm-3 text-right">出库订单号:</label>
                                     <label class="col-form-label col-sm-9 text-monospace"
-                                           v-text="item.store_in_amount"></label>
-                                </div>
-                            </td>
-                        </tr>
-                    </template>
-                    </tbody>
-                </table>
-            </div>
+                                           v-text="item.out_order_number"></label>
+                                </td>
+                            </tr>
+                            <tr v-else-if="hasStoreNumber(item)">
+                                <td colspan="5">
+                                    <div class="row">
+                                        <label for="" class="col-form-label col-sm-3 text-right">入库单号:</label>
+                                        <label class="col-form-label col-sm-9 text-monospace text-success"
+                                               v-text="item.store_in_number"></label>
+                                    </div>
+                                </td>
+                                <td colspan="4">
+                                    <div class="row">
+                                        <label for="" class="col-form-label col-sm-3 text-right">入库数量:</label>
+                                        <label class="col-form-label col-sm-9 text-monospace"
+                                               v-text="item.store_in_amount"></label>
+                                    </div>
+                                </td>
+                            </tr>
+                        </template>
+                        </tbody>
+                    </table>
+                </div>
+                <template v-if="hasReturnAddressInfo(showWorkOrder.commodities)">
+                    <div class="form-group row">
+                        <label class="col-form-label col-2 text-right">寄件人</label>
+                        <label class="col-form-label col-10 text-monospace" v-text="showWorkOrder.return_name"></label>
+                    </div>
+                    <div class="form-group row">
+                        <label class="col-form-label col-2 text-right">寄件号码</label>
+                        <label class="col-form-label col-10 text-monospace" v-text="showWorkOrder.return_phone"></label>
+                    </div>
+                    <div class="form-group row">
+                        <label class="col-form-label col-2 text-right">寄件地址</label>
+                        <label class="col-form-label col-10 text-monospace"
+                               v-text="showWorkOrder.return_address"></label>
+                    </div>
+                </template>
 
-            <div class="form-group row" v-else-if="'完成' === showWorkOrder.status">
-                <table class="table table-sm table-bordered">
-                    <thead>
-                    <tr>
-                        <th>快递单号</th>
-                        <th>商品条码</th>
-                        <th>商品名</th>
-                        <th>订单数量</th>
-                        <th>异常类型</th>
-                        <th>客户实收数量</th>
-                        <th>宝时复核数量</th>
-                        <th>复核结果</th>
-                        <th>商家处理</th>
-                        <th>商家详情</th>
-                        <th>最后确认</th>
-                    </tr>
-                    </thead>
-                    <tbody>
-                    <template v-for="item in showWorkOrder.commodities">
+                <template v-if="hasReturnLogisticNumber(showWorkOrder.commodities)">
+                    <div class="form-group row">
+                        <label class="col-form-label col-2 text-right">退回单号</label>
+                        <label class="col-form-label col-10 text-monospace text-success"
+                               v-text="showWorkOrder.return_logistic_number"></label>
+                    </div>
+                </template>
+            </template>
+
+            <template v-else-if="'完成' === showWorkOrder.status">
+                <div class="form-group row">
+                    <table class="table table-sm table-bordered">
+                        <thead>
                         <tr>
-                            <td class="align-middle"
-                                v-if="item.count"
-                                :rowspan="item.count"
-                                v-text="item.logistic_number"
-                            ></td>
-                            <td class="text-wrap" v-text="item.sku"></td>
-                            <td class="text-wrap" v-text="item.commodity ? item.commodity.name : ''"></td>
-                            <td v-text="item.amount"></td>
-                            <td v-text="item.abnormal_type"></td>
-                            <td v-text="item.abnormal_amount"></td>
-                            <td v-text="item.bao_shi_check_amount"></td>
-                            <td v-text="item.check_result"></td>
-                            <td class="text-wrap" v-text="item.process_result"></td>
-                            <td class="text-wrap" v-text="item.process_result_info"></td>
-                            <td class="text-wrap" v-text="item.end_handle_result"></td>
-                        </tr>
-                        <tr v-if="hasReissueLogisticNumber(item)">
-                            <td colspan="10">
-                                <div class="row">
-                                    <label for="" class="col-form-label col-3 text-right">补发快递单号: </label>
-                                    <label for="" class="col-form-label col-9 text-monospace text-success"
-                                           v-text="item.reissue_logistic_number"> </label>
-                                </div>
-                            </td>
-                        </tr>
-                        <tr v-if="hasStoreNumber(item)">
-                            <td colspan="5">
-                                <div class="row">
-                                    <label for="" class="col-form-label col-6 text-right">入库单号: </label>
-                                    <label for="" class="col-form-label col-6 text-monospace text-success"
-                                           v-text="item.store_in_number"></label>
-                                </div>
-                            </td>
-                            <td colspan="5">
-                                <div class="row">
-                                    <label for="" class="col-form-label col-6 text-right">入库数量: </label>
-                                    <label for="" class="col-form-label col-6 text-monospace"
-                                           v-text="item.store_in_amount"> </label>
-                                </div>
-                            </td>
-                        </tr>
-                        <tr v-if="hasOutInNumber(item)">
-                            <td colspan="5">
-                                <div class="row">
-                                    <label for="" class="col-form-label col-6 text-right">出库订单号: </label>
-                                    <label for="" class="col-form-label col-6 text-monospace text-success"
-                                           v-text="item.out_order_number"> </label>
-                                </div>
-                            </td>
+                            <th>快递单号</th>
+                            <th>商品条码</th>
+                            <th>商品名</th>
+                            <th>订单数量</th>
+                            <th>异常类型</th>
+                            <th>客户实收数量</th>
+                            <th>宝时复核数量</th>
+                            <th>复核结果</th>
+                            <th>商家处理</th>
+                            <th>商家详情</th>
+                            <th>最后确认</th>
                         </tr>
-                    </template>
-                    </tbody>
-                </table>
-            </div>
+                        </thead>
+                        <tbody>
+                        <template v-for="item in showWorkOrder.commodities">
+                            <tr>
+                                <td class="align-middle"
+                                    v-if="item.count"
+                                    :rowspan="item.count"
+                                    v-text="item.logistic_number"
+                                ></td>
+                                <td class="text-wrap" v-text="item.sku"></td>
+                                <td class="text-wrap" v-text="item.commodity ? item.commodity.name : ''"></td>
+                                <td v-text="item.amount"></td>
+                                <td v-text="item.abnormal_type"></td>
+                                <td v-text="item.abnormal_amount"></td>
+                                <td v-text="item.bao_shi_check_amount"></td>
+                                <td v-text="item.check_result"></td>
+                                <td class="text-wrap" v-text="item.process_result"></td>
+                                <td class="text-wrap" v-text="item.process_result_info"></td>
+                                <td class="text-wrap" v-text="item.end_handle_result"></td>
+                            </tr>
+                            <tr v-if="hasReissueLogisticNumber(item)">
+                                <td colspan="10">
+                                    <div class="row">
+                                        <label for="" class="col-form-label col-3 text-right">补发快递单号: </label>
+                                        <label for="" class="col-form-label col-9 text-monospace text-success"
+                                               v-text="item.reissue_logistic_number"> </label>
+                                    </div>
+                                </td>
+                            </tr>
+                            <tr v-if="hasStoreNumber(item)">
+                                <td colspan="5">
+                                    <div class="row">
+                                        <label for="" class="col-form-label col-6 text-right">入库单号: </label>
+                                        <label for="" class="col-form-label col-6 text-monospace text-success"
+                                               v-text="item.store_in_number"></label>
+                                    </div>
+                                </td>
+                                <td colspan="5">
+                                    <div class="row">
+                                        <label for="" class="col-form-label col-6 text-right">入库数量: </label>
+                                        <label for="" class="col-form-label col-6 text-monospace"
+                                               v-text="item.store_in_amount"> </label>
+                                    </div>
+                                </td>
+                            </tr>
+                            <tr v-if="hasOutInNumber(item)">
+                                <td colspan="5">
+                                    <div class="row">
+                                        <label for="" class="col-form-label col-6 text-right">出库订单号: </label>
+                                        <label for="" class="col-form-label col-6 text-monospace text-success"
+                                               v-text="item.out_order_number"> </label>
+                                    </div>
+                                </td>
+                            </tr>
+                        </template>
+                        </tbody>
+                    </table>
+                </div>
+                <template v-if="hasReturnAddressInfo(showWorkOrder.commodities)">
+                    <div class="form-group row">
+                        <label class="col-form-label col-2 text-right">寄件人</label>
+                        <label class="col-form-label col-10 text-monospace" v-text="showWorkOrder.return_name"></label>
+                    </div>
+                    <div class="form-group row">
+                        <label class="col-form-label col-2 text-right">寄件号码</label>
+                        <label class="col-form-label col-10 text-monospace" v-text="showWorkOrder.return_phone"></label>
+                    </div>
+                    <div class="form-group row">
+                        <label class="col-form-label col-2 text-right">寄件地址</label>
+                        <label class="col-form-label col-10 text-monospace"
+                               v-text="showWorkOrder.return_address"></label>
+                    </div>
+                </template>
 
+                <template v-if="hasReturnLogisticNumber(showWorkOrder.commodities)">
+                    <div class="form-group row">
+                        <label class="col-form-label col-2 text-right">退回单号</label>
+                        <label class="col-form-label col-10 text-monospace text-success"
+                               v-text="showWorkOrder.return_logistic_number"></label>
+                    </div>
+                </template>
+            </template>
         </div>
 
         <div class="modal-body" v-if="'快递丢件' === showWorkOrder.issue_type_name">
-            <div class="form-group row">
-                <label for="" class="col-form-label col-2 text-right">补发单号: </label>
-                <label for="" class="col-form-label col-10 text-monospace text-success"
-                       v-text="showWorkOrder.reissue_logistic_number"> </label>
-            </div>
+            <template v-if="'货主处理'=== showWorkOrder.status">
+                <div class="form-group row" >
+                    <label  class="col-form-label col-12 text-center text-secondary" style="font-size: 28px">
+                        待商家填充丢件信息详情
+                    </label>
+                </div>
+            </template>
+            <template v-else>
 
-            <div class="form-group row">
-                <label class="col-form-label col-sm-2 text-right">
-                    交易截图
-                </label>
-                <div class="col-sm-10">
-                    <div class="card-group">
-                        <div class="card-body col-sm-6" v-for="item in showWorkOrder.deal_images">
-                            <a target="_blank" :href="item.fileUrl">
-                                <img class="image-w border" :src="item.fileUrl">
-                            </a>
+                <div class="form-group row">
+                    <label for="" class="col-form-label col-2 text-right">补发单号: </label>
+                    <label for="" class="col-form-label col-10 text-monospace text-success"
+                           v-text="showWorkOrder.reissue_logistic_number"> </label>
+                </div>
+
+                <div class="form-group row">
+                    <label class="col-form-label col-sm-2 text-right">
+                        交易截图
+                    </label>
+                    <div class="col-sm-10">
+                        <div class="card-group">
+                            <div class="card-body col-sm-6" v-for="item in showWorkOrder.deal_images">
+                                <a target="_blank" :href="item.fileUrl">
+                                    <img class="image-w border" :src="item.fileUrl">
+                                </a>
+                            </div>
                         </div>
                     </div>
                 </div>
-            </div>
-            <div class="form-group row" v-if="showWorkOrder.refund_images && showWorkOrder.refund_images.length > 0">
-                <label class="col-form-label col-sm-2 text-right">
-                    退款截图
-                </label>
-                <div class="col-sm-10">
-                    <div class="card-group">
-                        <div class="card-body col-sm-6" v-for="item in showWorkOrder.refund_images">
-                            <a target="_blank" :href="item.fileUrl">
-                                <img class="image-w border" :src="item.fileUrl">
-                            </a>
+                <div class="form-group row" v-if="showWorkOrder.refund_images && showWorkOrder.refund_images.length > 0">
+                    <label class="col-form-label col-sm-2 text-right">
+                        退款截图
+                    </label>
+                    <div class="col-sm-10">
+                        <div class="card-group">
+                            <div class="card-body col-sm-6" v-for="item in showWorkOrder.refund_images">
+                                <a target="_blank" :href="item.fileUrl">
+                                    <img class="image-w border" :src="item.fileUrl">
+                                </a>
+                            </div>
                         </div>
                     </div>
                 </div>
-            </div>
-            <div class="form-group">
-                <div class="from-group row">
-                    <label class="col-form-label col-sm-2 text-right">异常快递单号</label>
-                    <div class="col-sm-10">
-                        <table class="table table-sm table-bordered table-hover text-center">
-                            <thead>
-                            <tr>
-                                <th>快递单号</th>
-                                <th v-if="'宝时终审'===showWorkOrder.status">丢件数量</th>
-                                <th v-if="'完成'===showWorkOrder.status">丢件数量</th>
-                                <th v-if="'完成'===showWorkOrder.status">处理结果</th>
-                            </tr>
-                            </thead>
-                            <tbody>
-                            <tr v-for="item in showWorkOrder.commodities">
-                                <td v-text="item.logistic_number"></td>
-                                <td v-if="'宝时终审'===showWorkOrder.status" v-text="item.abnormal_amount"></td>
-                                <td v-if="'完成'===showWorkOrder.status" v-text="item.abnormal_amount"></td>
-                                <td v-if="'完成'===showWorkOrder.status" v-text="item.process_result"></td>
-                            </tr>
-                            </tbody>
-                        </table>
+                <div class="form-group">
+                    <div class="from-group row">
+                        <label class="col-form-label col-sm-2 text-right">异常快递单号</label>
+                        <div class="col-sm-10">
+                            <table class="table table-sm table-bordered table-hover text-center">
+                                <thead>
+                                <tr>
+                                    <th>快递单号</th>
+                                    <th v-if="'宝时终审'===showWorkOrder.status">丢件数量</th>
+                                    <th v-if="'完成'===showWorkOrder.status">丢件数量</th>
+                                    <th v-if="'完成'===showWorkOrder.status">处理结果</th>
+                                </tr>
+                                </thead>
+                                <tbody>
+                                <tr v-for="item in showWorkOrder.commodities">
+                                    <td v-text="item.logistic_number"></td>
+                                    <td v-if="'宝时终审'===showWorkOrder.status" v-text="item.abnormal_amount"></td>
+                                    <td v-if="'完成'===showWorkOrder.status" v-text="item.abnormal_amount"></td>
+                                    <td v-if="'完成'===showWorkOrder.status" v-text="item.process_result"></td>
+                                </tr>
+                                </tbody>
+                            </table>
+                        </div>
                     </div>
+
                 </div>
+            </template>
 
-            </div>
         </div>
 
         <div class="modal-body" v-if="'快递异常' === showWorkOrder.issue_type_name">
@@ -499,7 +568,7 @@
                             <td class="text-center" v-if="'完成' === showWorkOrder.status"
                                 v-text="item.check_result"></td>
                             <td class="text-center" v-if="'完成' === showWorkOrder.status"
-                                v-text="item.check_result"></td>
+                                v-text="item.process_result"></td>
                         </tr>
                         </tbody>
                     </table>

+ 293 - 131
resources/views/order/workOrder/index.blade.php

@@ -40,6 +40,14 @@
                             <tr @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
                                 <td>
                                     <label><input type="checkbox" :value="item.id"></label>
+
+                                    <span v-show="isNewProcessedWorkOrder(item)" class="badge text-white bg-primary">
+                                        新
+                                    </span>
+
+                                    <span v-show="isLogisticHandler(item)" class="badge badge-success">
+                                        承
+                                    </span>
                                 </td>
                                 <td>
                                     <span v-text="item.id"></span>
@@ -47,10 +55,7 @@
                                        target="order/issue/index?addtime=15">
                                         <span v-show="item.is_issue_order" class="badge badge-primary">问题件</span>
                                     </a>
-                                    <span v-if="item.work_order_status === '1'" class="badge text-white bg-info">
-                                        新
-                                    </span>
-                                    <button class="btn btn-sm btn-outline-secondary"
+                                    <button class="btn btn-sm btn-outline-dark"
                                             @click="showWorkOrderItem(item)">详情
                                     </button>
                                 </td>
@@ -75,6 +80,12 @@
                                         >
                                             重新编辑
                                         </button>
+                                        <button class="btn btn-sm"
+                                                style="background-color: #13b6af;color: #FFFFFF;border-color: #079e74"
+                                                v-show="canOwnerEnd(item)"
+                                                @click="ownerEndWorkOrder(item,i)">
+                                            商家完结
+                                        </button>
                                     @endcan
                                     @can('订单管理-工单处理-承运商编辑')
                                         <button class="btn btn-sm"
@@ -89,6 +100,13 @@
                                                 @click="logisticShowEdit(item,i)">
                                             重新编辑
                                         </button>
+                                        <button
+                                            class="btn btn-sm"
+                                            style="background-color:#d96a46;color: #FFFFFF;border-color: #e55c2d"
+                                            v-show="canTagWorkOrder(item)"
+                                            @click="tagWorkOrderHandler(item,i)">
+                                            标记处理
+                                        </button>
                                     @endcan
                                     @can('订单管理-工单处理-宝时编辑')
                                         <button class="btn btn-sm"
@@ -112,19 +130,7 @@
                                     @endcan
                                 </td>
                                 <td>
-                                    @can('订单管理-工单处理-审核')
-                                        <select class="form-control form-control-sm"
-                                                :value="item.order_issue_type_id"
-                                                @change="changeIssueType(item,$event)">
-                                            <option value="0"></option>
-                                            <option v-for="type in orderIssueTypes"
-                                                    :value="type.name"
-                                                    v-text="type.value">
-                                            </option>
-                                        </select>
-                                    @else
-                                        <span v-text="item.issue_type_name"></span>
-                                    @endcan
+                                    <span v-text="item.issue_type_name"></span>
                                 </td>
                                 <td>
                                     <span v-text="item['last_handler_name'] + ':' + item.process_progress"></span>
@@ -186,10 +192,10 @@
         <div class="row">
             @include('order.workOrder._work_order_show')
         </div>
-            @include('order.workOrder._bao_shi_review_modal')
-            @include('order.workOrder._bao_shi_fill_work_order_modal')
-            @include('order.workOrder._logistic_fill_work_order_modal')
-            @include('order.workOrder._owner_fill_work_order_modal')
+        @include('order.workOrder._bao_shi_review_modal')
+        @include('order.workOrder._bao_shi_fill_work_order_modal')
+        @include('order.workOrder._logistic_fill_work_order_modal')
+        @include('order.workOrder._owner_fill_work_order_modal')
     </div>
 @endsection()
 
@@ -292,6 +298,9 @@
         let vue = new Vue({
             el: "#list",
             data: {
+                isLogistic: false,
+                isOwner: false,
+                isBaoShi: false,
                 orderIssueVue: orderIssueVue,
                 workOrders: {!! $workOrders->toJson() !!}['data'],
                 form: null,
@@ -374,7 +383,7 @@
                     return_address: null,
                     return_phone: null,
                     process_progress: null,
-                    type:null,
+                    type: null,
                 },
                 selectTr: null,                 // table 行
                 selectDetailId: null,           // 详情
@@ -385,13 +394,13 @@
                 selectLog: null,                // 工单日志
                 selectIndex: null,              // 选中工单
                 filePrefix: "{{asset("/storage")}}",
-                dialogShowBaoShiVisible:false,
-                dialogEditBaoShiVisible:false,
-                dialogShowOwnerVisible:false,
-                dialogEditOwnerVisible:false,
-                dialogShowLogisticVisible:false,
-                dialogEditLogisticVisible:false,
-                dialogShowOrderWorkVisible:false,
+                dialogShowBaoShiVisible: false,
+                dialogEditBaoShiVisible: false,
+                dialogShowOwnerVisible: false,
+                dialogEditOwnerVisible: false,
+                dialogShowLogisticVisible: false,
+                dialogEditLogisticVisible: false,
+                dialogShowOrderWorkVisible: false,
             },
             computed: {},
             mounted() {
@@ -410,8 +419,8 @@
                         name: 'owner',
                         type: 'select_multiple_select',
                         data: this.owners,
-                        tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的货主'],
-                        placeholder: ['货主', '定位或多选货主']
+                        tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的商家'],
+                        placeholder: ['商家', '定位或多选商家']
                     },
                         @endcan
                     {
@@ -522,6 +531,17 @@
                 this.workOrders.forEach(item => {
                     this.sortOrder(item);
                 });
+                this.isLogistic = @can('订单管理-工单处理-承运商编辑') true
+                @else false @endcan;
+                this.isOwner = @can('订单管理-工单处理-货主编辑')  true
+                @else false @endcan;
+                this.isBaoShi = @can('订单管理-工单处理-客服编辑') true
+                @else false @endcan;
+                if (this.isBaoShi) {
+                    this.isLogistic = false;
+                    this.isOwner = false;
+                }
+                this.sortOrderWorkOrders();
             },
             filters: {
                 dataTime: function (value) {
@@ -532,6 +552,64 @@
                 },
             },
             methods: {
+                sortOrderWorkOrders() {
+                    this.workOrders.sort((prev, curr) => {
+                        if (this.isLogistic) {
+                            return this.logisticSortWorkOrders(prev, curr);
+                        } else if (this.isOwner) {
+                            return this.ownerSortWorkOrders(prev, curr);
+                        } else if (this.isBaoShi) {
+                            return this.baoShiSortWorkOrders(prev, curr);
+                        }
+                    });
+                },
+                logisticSortWorkOrders(prev, curr) {
+                    let prev_count = 0, curr_count = 0,
+                        prev_work_order_status = prev['work_order_status'],
+                        curr_work_order_status = curr['work_order_status'],
+                        prev_pending_detail = prev.pending_detail,
+                        curr_pending_detail = curr.pending_detail;
+                    // let prev_issue_type_name = prev_pending_detail ? prev_pending_detail.issue_type_name : prev.issue_type_name,
+                    //     curr_issue_type_name = curr_pending_detail ? curr_pending_detail.issue_type_name : curr.issue_type_name;
+                    // 是否是最新的工单
+                    if (prev_work_order_status === '1') prev_count += 32;
+                    if (curr_work_order_status === '1') curr_count += 32;
+                    if (prev_pending_detail.logistic_handle_tag === '') prev_count += 16;
+                    if (curr_pending_detail.logistic_handle_tag === '') curr_count += 16;
+                    if (prev.status === '承运商处理') prev_count += 4
+                    if (curr.status === '承运商处理') curr_count += 4;
+                    if (prev.issue_type_name === '拦截') prev_count += 2;
+                    if (curr.issue_type_name === '拦截') curr_count += 2;
+                    if (prev.status === '完成'|| prev.status.indexOf("承运商") < 0) prev_count = 0;
+                    if (curr.status === '完成'|| prev.status.indexOf("承运商") < 0) curr_count = 0;
+                    return curr_count - prev_count;
+                },
+                ownerSortWorkOrders(prev, curr) {
+                    let prev_count = 0, curr_count = 0,
+                        prev_work_order_status = prev['work_order_status'],
+                        curr_work_order_status = curr['work_order_status'];
+                    if (prev_work_order_status === '1') prev_count += 32;
+                    if (curr_work_order_status === '1') curr_count += 32;
+                    if (prev.status.indexOf("货主") >= 0) prev_count += 4
+                    if (curr.status.indexOf("货主") >= 0) curr_count += 4;
+                    if (prev.issue_type_name === '拦截') prev_count += 2;
+                    if (curr.issue_type_name === '拦截') curr_count += 2;
+                    if (prev.status === '完成' || prev.status.indexOf("货主") < 0) prev_count = 0;
+                    if (curr.status === '完成' || curr.status.indexOf("货主") < 0) curr_count = 0;
+                    return curr_count - prev_count;
+                },
+                baoShiSortWorkOrders(prev, curr){
+                    let prev_count = 0, curr_count = 0,
+                        prev_work_order_status = prev['work_order_status'],
+                        curr_work_order_status = curr['work_order_status'];
+                    if (prev_work_order_status === '1') prev_count += 32;
+                    if (curr_work_order_status === '1') curr_count += 32;
+                    if (prev.status.indexOf("宝时") >= 0) prev_count += 32;
+                    if (curr.status.indexOf("宝时") >= 0) curr_count += 32;
+                    if (prev.status === '完成' || prev.status.indexOf("宝时") < 0) prev_count = 0;
+                    if (curr.status === '完成' || curr.status.indexOf("宝时") < 0) curr_count = 0;
+                    return curr_count - prev_count;
+                },
                 waitingTempTip(message) {
                     window.tempTip.setIndex(2005);
                     window.tempTip.waitingTip(message);
@@ -609,10 +687,14 @@
                     workOrder.logistic_numbers = this.groupLogisticNumber(workOrder);
                 },
                 groupPendingDetail(workOrder) {
-                    let detail = workOrder.details.find(item => {
+
+                    let details = workOrder.details.filter(item => {
                         return !['完成', '标记'].includes(item.tag);
+                    }).sort((prev, curr) => {
+                        return new Date(prev.created_at) > new Date(curr.created_at);
                     });
-                    if (!detail) return null;
+                    if (!details) return null;
+                    let detail = details.find(e => true);
                     return {
                         id: workOrder.id,
                         detail_id: detail.id,
@@ -629,6 +711,7 @@
                         return_phone: detail.return_phone,
                         return_name: detail.return_name,
                         images: detail.images,
+                        logistic_handle_tag: detail.logistic_handle_tag,
                     };
                 },
                 groupCommodities(workOrder, isCurrent = true) {
@@ -728,9 +811,9 @@
                     let {commodities} = detail;
                     let logistic_numbers = new Set();
                     commodities.forEach(e => logistic_numbers.add(e.logistic_number));
-                    if (logistic_numbers.size === 0){
-                        if (workOrder.order && workOrder.order.packages){
-                            workOrder.order.packages.forEach(e=>logistic_numbers.add(e.logistic_number));
+                    if (logistic_numbers.size === 0) {
+                        if (workOrder.order && workOrder.order.packages) {
+                            workOrder.order.packages.forEach(e => logistic_numbers.add(e.logistic_number));
                         }
                     }
                     return new Array(...logistic_numbers);
@@ -877,28 +960,6 @@
                         tempTip.showSuccess('复制失败:' + e)
                     }
                 },
-
-                changeIssueType(item, e) {
-                    let url = '{{route('workOrder.updateIssueTypeApi')}}';
-                    let data = {
-                        id: item.id,
-                        type_id: $(e.target).val()
-                    };
-                    window.tempTip.waitingTip('修改中.........');
-                    window.axios.post(url, data).then(res => {
-                        if (res.data.success) {
-                            window.tempTip.cancelWaitingTip();
-                            window.tempTip.showSuccess('修改成功');
-                            item.order_issue_type_id = data.type_id;
-                        } else {
-                            window.tempTip.cancelWaitingTip();
-                            window.tempTip.show(res.data.message ? res.data.message : '修改异常');
-                        }
-                    }).catch(err => {
-                        window.tempTip.cancelWaitingTip();
-                        window.tempTip.show(err);
-                    });
-                },
                 copyLogisticNumber() {
                     let items = this.getMessageWorkOrder();
                     let logistic_numbers = '';
@@ -909,26 +970,6 @@
                     })
                     this.copyText(logistic_numbers);
                 },
-                showEditIssueType() {
-                    this.selectIssueType = 0;
-                    $("edit-issue-type-modal").modal('show');
-                },
-                editOrderIssueType() {
-                    let url = '{{route('workOrder.batchUpdateIssueTypeApi')}}'
-                    let data = {ids: checkData, type: this.selectIssueType};
-                    window.tempTip.setIndex(1999);
-                    window.axios.post(url, data).then(res => {
-                        if (res.data.success) {
-                            window.tempTip.showSuccess('修改问题件类型成功');
-                            this.replaceWorkOrder(res.data.data);
-                            $("#edit-issue-type-type-modal").modal('hide');
-                            return;
-                        }
-                        window.tempTip.show(res.data.message ? res.data.message : '修改异常');
-                    }).catch(err => {
-                        window.tempTip.show(err)
-                    })
-                },
                 destroy(item, i) {
                     window.tempTip.confirm('是否删除当前工单', () => {
                         let url = '{{url('apiLocal/workOrder/')}}' + '/' + item.id;
@@ -1001,7 +1042,7 @@
                     }
                     event.preventDefault();
                 },
-                editOwnerReissueLogisticNumber(){
+                editOwnerReissueLogisticNumber() {
                     let reissue_logistic_number = this.$refs['refund-image-edit-reissue_logistic_number'].innerHTML;
                     if (this.ownerEditWorkOrder.refundImages.length === 0) this.ownerEditWorkOrder.reissue_logistic_number = reissue_logistic_number;
                     else {
@@ -1174,6 +1215,8 @@
                         if ('宝时处理' === status) this.baoShiEditWorkOrder.process_progress = '核实未错漏发';
                         this.baoShiEditWorkOrder.commodities = this.countCommoditiesByLogisticNumber(commodities);
                         this.dialogShowBaoShiVisible = true
+                    } else if ('取消拦截'=== issue_type_name){
+                        this.dialogShowBaoShiVisible = true
                     }
                 },
                 baoShiEdit() {
@@ -1281,6 +1324,15 @@
                                 this.baoShiEditProcess(url, formData);
                             }
                         }
+                    } else if ('取消拦截' === issue_type_name){
+                        let res = this.checkBaoShiEditWorkOrder();
+                        if (!res.success) {
+                            this.errorTempTip(res.message);
+                            return;
+                        }
+                        let url = "{{route('workOrder.cancelIntercept.baoShi.reviewApi')}}";
+                        let formData = {detail_id: detail_id, process_progress: process_progress}
+                        this.baoShiEditProcess(url, formData);
                     }
                 },
                 checkBaoShiEditWorkOrder() {
@@ -1361,7 +1413,8 @@
                 getBaoShiProcessProgress() {
                     let {issue_type_name} = this.baoShiEditWorkOrder;
                     let items = [
-                        {issue_type_name: '拦截', option: ['拦截成功', '拦截失败']},
+                        {issue_type_name: '拦截', option: ['拦截成功,不赔偿', '拦截失败,赔偿']},
+                        {issue_type_name: '取消拦截', option: ['已签收', '已退回']},
                         {issue_type_name: '信息更改', option: ['更改成功', '更改失败'],},
                         {issue_type_name: '快递异常', option: ['丢件赔偿', '签收成功']},
                         {issue_type_name: '错漏发', option: ['已补发', '已入库'],},
@@ -1378,12 +1431,12 @@
                         {issue_type_name: '快递异常', option: ['赔偿', '不赔偿'],},
                         {issue_type_name: '错漏发', option: ['核实少发', '核实多发', '核实未错漏发']},
                         {issue_type_name: '破损', option: ['核实全部破损', '核实部分破损', '核实未破损'],},
-                        {issue_type_name: '快递丢件', option: ['赔偿', '不赔偿'],},
+                        {issue_type_name: '快递丢件', option: ['拦截成功', '丢件赔偿'],},
                     ];
                     let item = items.find(e => e.issue_type_name === issue_type_name);
                     return item ? item.option : [];
                 },
-                getBaoShiProcessResultByItem(item){
+                getBaoShiProcessResultByItem(item) {
 
                 },
                 getBaoShiEndHandleResult(commodity) {
@@ -1476,8 +1529,8 @@
                         let {end_handle_result} = e;
                         if (end_handle_result.indexOf('补发') >= 0 || end_handle_result.indexOf('出库') >= 0) reissue++;
                         else if (end_handle_result.indexOf('退回') >= 0 || end_handle_result.indexOf('完成') >= 0) store++;
-                        else if (end_handle_result.indexOf('已完成入库') >= 0 ) store++;
-                        else if (end_handle_result.indexOf('完成出库') >= 0 ) reissue++;
+                        else if (end_handle_result.indexOf('已完成入库') >= 0) store++;
+                        else if (end_handle_result.indexOf('完成出库') >= 0) reissue++;
                         else if (end_handle_result.indexOf('确认未错漏发') >= 0) all++;
                     });
                     if (reissue > 0) process_progress = '已补发';
@@ -1491,10 +1544,10 @@
                     let index = 0;
                     let logistic_number = items[0]['logistic_number'];
                     let count = 0;
-                    items.forEach(e=>e.count=0);
+                    items.forEach(e => e.count = 0);
                     items.forEach((e, i) => {
                         let cur_logistic_number = e.logistic_number,
-                            {process_result_info,end_handle_result} = e,
+                            {process_result_info, end_handle_result} = e,
                             isAdd = false, isAddRow = false;
                         if (process_result_info) {
                             if (process_result_info.indexOf('补发') >= 0 ||
@@ -1525,12 +1578,12 @@
                 // 承运商
                 isLogisticDispose(item) {
                     let {issue_type_name, status} = item;
-                    return ['拦截', '信息更改', '快递异常', '破损', '快递丢件'].includes(issue_type_name) && status === '承运商处理';
+                    return ['拦截', '信息更改', '快递异常', '破损', '快递丢件','取消拦截'].includes(issue_type_name) && status === '承运商处理';
                 },
                 canLogisticEdit(item) {
                     let {issue_type_name, last_status, status} = item;
                     if (status === '完成') return false;
-                    else return ['拦截', '信息更改', '快递异常', '破损', '快递丢件'].includes(issue_type_name) && last_status === '承运商处理';
+                    else return ['拦截', '信息更改', '快递异常', '破损', '快递丢件','取消拦截'].includes(issue_type_name) && last_status === '承运商处理';
                 },
                 logisticShowEdit(item, index) {
                     let {issue_type_name, detail_id, commodities} = item.pending_detail;
@@ -1550,6 +1603,8 @@
                         this.countByCommodities(commodities);
                         this.logisticEditWorkOrder.commodities = commodities;
                         this.dialogEditLogisticVisible = true;
+                    }else if ('取消拦截' === issue_type_name){
+                        this.dialogEditLogisticVisible = true;
                     }
                 },
                 logisticShowDispose(item, index) {
@@ -1604,6 +1659,13 @@
                         });
                         this.logisticEditWorkOrder.commodities = this.countCommoditiesByLogisticNumber(commodities);
                         this.dialogShowLogisticVisible = true;
+                    } else if('取消拦截'){
+                        this.selectIndex = index;
+                        this.logisticEditWorkOrder.detail_id = detail_id;
+                        this.logisticEditWorkOrder.issue_type_name = issue_type_name;
+                        this.logisticEditWorkOrder.status = status;
+                        this.logisticEditWorkOrder.process_progress = null;
+                        this.dialogShowLogisticVisible = true;
                     }
                 },
                 logisticEdit() {
@@ -1654,6 +1716,17 @@
                             formData.append('commodities[]', JSON.stringify(e));
                         });
                         this.logisticEditProcess(formData, url);
+                    } else if ('取消拦截' === issue_type_name){
+                        let res = this.checkLogisticEditWorkOrder();
+                        if (!res.success) {
+                            this.errorTempTip(res.message);
+                            return;
+                        }
+                        let url = '{{route('workOrder.cancelIntercept.logistic.handlerApi')}}';
+                        let formData = new FormData();
+                        formData.append('detail_id', detail_id);
+                        formData.append('process_progress', process_progress);
+                        this.logisticEditProcess(formData, url);
                     }
                 },
                 logisticEditProcess(data, url) {
@@ -1666,7 +1739,7 @@
                             this.successTempTip('处理完成');
                             if (this.logisticEditWorkOrder.is_edit) this.dialogEditLogisticVisible = false;
                             else this.dialogShowLogisticVisible = false;
-                         } else {
+                        } else {
                             this.errorTempTip(res.data.message ? res.data.message : '处理出现异常,刷新当前页面重试');
                         }
                     }).catch(err => {
@@ -1699,10 +1772,11 @@
                 getLogisticProcessProgress() {
                     let {issue_type_name} = this.logisticEditWorkOrder;
                     let items = [
-                        {issue_type_name: '拦截', option: ['已处理', '已签收']},
+                        {issue_type_name: '拦截', option: ['拦截失败', '拦截退回中']},
                         {issue_type_name: '信息更改', option: ['已处理', '无法更改']},
                         {issue_type_name: '快递异常', option: ['已处理', '已拦截']},
                         {issue_type_name: '破损', option: ['核实全部破损', '核实部分破损', '核实未破损']},
+                        {issue_type_name: '取消拦截', option: ['正常派送', '无法取消拦截']},
                     ];
                     let item = items.find(e => e.issue_type_name === issue_type_name);
                     return item ? item.option : [];
@@ -1735,6 +1809,37 @@
                     else if (data.partiallyDamage > 0 || (data.partiallyDamage > 0 || data.notDamage > 0)) this.logisticEditWorkOrder.process_progress = '核实部分破损';
                     else if (data.allDamage > 0 && data.partiallyDamage === 0 && data.notDamage === 0) this.logisticEditWorkOrder.process_progress = '核实全部破损'
                 },
+                canTagWorkOrder(item) {
+                    let {pending_detail, status, issue_type_name} = item;
+                    if (status !== '承运商处理')return false;
+                    if (!['拦截','取消拦截','信息更改'].includes(issue_type_name)) return false;
+                    let {logistic_handle_tag} = pending_detail;
+                    return logistic_handle_tag !== '承运商处理中';
+                },
+                isLogisticHandler(item) {
+                    if (item.status !== '承运商处理' && item.issue_type_name !== '拦截') return false;
+                    let logistic_handle_tag = item.pending_detail ? item.pending_detail.logistic_handle_tag : '';
+                    return logistic_handle_tag === '承运商处理中';
+                },
+                tagWorkOrderHandler(item, index) {
+                    let url = '{{route('workOrder.logistic.handlerTagApi')}}';
+                    let data = {detail_id: item.pending_detail.detail_id};
+                    this.waitingTempTip('处理中');
+                    window.axios.post(url, data).then(res => {
+                        window.tempTip.cancelWaitingTip();
+                        if (res.data.success) {
+                            this.successTempTip('标记处理中');
+                            this.sortOrder(res.data.data);
+                            this.$set(this.workOrders, index, res.data.data);
+                        } else {
+                            this.errorTempTip(res.data.message ? res.data.message : '处理工单出现异常');
+                        }
+                    }).catch(err => {
+                        window.tempTip.cancelWaitingTip();
+                        this.errorTempTip(err.message)
+                    });
+                },
+
                 // 商家
                 isOwnerDispose(item) {
                     let {issue_type_name, status} = item;
@@ -1752,6 +1857,9 @@
                     else if (issue_type_name === '错漏发' && status === '宝时处理') return true;
                     return false;
                 },
+                canOwnerEnd(item) {
+                    return item.status === '待货主完结';
+                },
                 ownerShowDispose(item, index) {
                     let issue_type_name = item.issue_type_name;
                     this.selectIndex = index;
@@ -1781,7 +1889,7 @@
                             this.ownerEditWorkOrder.logistic_number = null;                         //
                             this.ownerEditWorkOrder.refundImages = [];                              // 退款截图
                             this.ownerEditWorkOrder.dealImages = [];                                // 交易截图
-                           this.dialogShowOwnerVisible = true;
+                            this.dialogShowOwnerVisible = true;
                         }).catch(err => {
                             window.tempTip.cancelWaitingTip();
                             this.errorTempTip('获取数据异常')
@@ -1804,7 +1912,7 @@
                 ownerShowEdit(item, index) {
                     this.selectIndex = index;
                     let {issue_type_name, logistic_number, pending_detail, type, remark, status} = item;
-                    let {price, remake, images,reissue_logistic_number} = pending_detail;
+                    let {price, remake, images, reissue_logistic_number} = pending_detail;
                     this.ownerEditWorkOrder.is_edit = true;
                     this.ownerEditWorkOrder.status = status;
                     this.ownerEditWorkOrder.price = price;
@@ -1882,7 +1990,7 @@
                             this.ownerEditWorkOrder.commodities = this.countCommoditiesByLogisticNumber(work_order_commodities);
                             this.dialogEditOwnerVisible = true;
                         }
-                    }else if ('破损' === issue_type_name){
+                    } else if ('破损' === issue_type_name) {
                         work_order_commodities.forEach(e => {
                             e.created = false;
                             e.tag = false;
@@ -1911,9 +2019,9 @@
                             window.tempTip.cancelWaitingTip();
                             this.errorTempTip(err)
                         });
-                    } else if(['拦截','信息更改'].includes(issue_type_name)){
+                    } else if (['拦截', '信息更改'].includes(issue_type_name)) {
                         this.dialogEditOwnerVisible = true;
-                    } else if ('快递丢件'.includes(issue_type_name)){
+                    } else if ('快递丢件'.includes(issue_type_name)) {
                         work_order_commodities.forEach(e => {
                             e.created = false;
                             e.tag = false;
@@ -2076,6 +2184,7 @@
                             let url = '{{route('workOrder.expressAbnormal.owner.editApi')}}';
                             formData.append('detail_id', detail_id);
                             formData.append('is_edit', true);
+                            delete_image_ids.forEach(e => formData.append("delete_image_ids[]", JSON.stringify(e)))
                             commodities.filter(e => e.selected && e.is_created).forEach(e => formData.append("commodities[]", JSON.stringify(e)));
                             commodities.filter(e => e.is_created === false && !e.selected).forEach(e => formData.append("delete_commodity_ids[]", e.id));
                             dealImages = this.getImages(dealImages.filter(e => e.file));
@@ -2104,13 +2213,13 @@
                             this.setFormDataImagePrefix(formData, 'dealImages', this.getImages(dealImages.filter(e => e.file)));
                             this.ownerEditProcess(formData, url);
                         }
-                    } else if ('信息更改' === issue_type_name){
-                            let formData = new FormData();
-                            let {detail_id,remark} = this.ownerEditWorkOrder;
-                            formData.append('detail_id',detail_id);
-                            formData.append('remark',remark);
-                            let url = "{{route('workOrder.informationChange.owner.editApi')}}";
-                            this.ownerEditProcess(formData,url);
+                    } else if ('信息更改' === issue_type_name) {
+                        let formData = new FormData();
+                        let {detail_id, remark} = this.ownerEditWorkOrder;
+                        formData.append('detail_id', detail_id);
+                        formData.append('remark', remark);
+                        let url = "{{route('workOrder.informationChange.owner.editApi')}}";
+                        this.ownerEditProcess(formData, url);
                     }
                 },
                 ownerEditProcess(data, url) {
@@ -2168,9 +2277,9 @@
                                 }
                             }
                             let message = null
-                            this.ownerEditWorkOrder.commodities.forEach(e=>{
-                                if (!message){
-                                    if(this.hasStoreNumber(e) && !e.store_in_number){
+                            this.ownerEditWorkOrder.commodities.forEach(e => {
+                                if (!message) {
+                                    if (this.hasStoreNumber(e) && !e.store_in_number) {
                                         message = '入库单号不能未空';
                                     }
                                 }
@@ -2198,9 +2307,9 @@
                             }
                         }
                         let message = null
-                        this.ownerEditWorkOrder.commodities.forEach(e=>{
-                            if (!message){
-                                if(this.hasStoreNumber(e) && !e.store_in_number){
+                        this.ownerEditWorkOrder.commodities.forEach(e => {
+                            if (!message) {
+                                if (this.hasStoreNumber(e) && !e.store_in_number) {
                                     message = '入库单号不能未空';
                                 }
                             }
@@ -2260,29 +2369,29 @@
                     return {success: true};
                 },
                 ownerAutoComputeMistake() {
-                    let store_in = 0, out_in = 0,noMistake = 0; //  store_in 不补发 out_in 补发
+                    let store_in = 0, out_in = 0, noMistake = 0; //  store_in 不补发 out_in 补发
                     this.ownerEditWorkOrder.commodities.forEach(e => {
                         let {process_result} = e;
-                        if (process_result.indexOf('少发,宝时补发')>=0) out_in++;
-                        else if (e.process_result.indexOf('多发,客户买下') >=0 ) out_in++;
-                        else if (e.process_result.indexOf('多发,客户退回')>=0 ) store_in++;
-                        else if (e.process_result.indexOf('少发,不补发') >=0) store_in++;
-                        else if (e.process_result.indexOf('核实未错漏发') >= 0 ) noMistake++;
+                        if (process_result.indexOf('少发,宝时补发') >= 0) out_in++;
+                        else if (e.process_result.indexOf('多发,客户买下') >= 0) out_in++;
+                        else if (e.process_result.indexOf('多发,客户退回') >= 0) store_in++;
+                        else if (e.process_result.indexOf('少发,不补发') >= 0) store_in++;
+                        else if (e.process_result.indexOf('核实未错漏发') >= 0) noMistake++;
                     });
                     // 补发 不补发
                     let process_progress = null;
                     if (out_in > store_in) process_progress = '补发';
                     else if (out_in < store_in) process_progress = '不补发';
                     else if (out_in > store_in > 0 && store_in > 0 && store_in === out_in) process_progress = '补发';
-                    else if (noMistake > 0)process_progress = '核实未错漏发';
+                    else if (noMistake > 0) process_progress = '核实未错漏发';
                     this.ownerEditWorkOrder.process_progress = process_progress;
                 },
                 autoComputeOwnerMistake() {
                     let store_in = 0, out_in = 0; //  store_in 不补发 out_in 补发
                     this.ownerEditWorkOrder.commodities.forEach(e => {
                         let {process_result} = e;
-                        if (process_result.indexOf('少发,宝时补发')>=0) out_in++;
-                        else if (e.process_result.indexOf() ) out_in++;
+                        if (process_result.indexOf('少发,宝时补发') >= 0) out_in++;
+                        else if (e.process_result.indexOf()) out_in++;
                         else if (e.process_result === '多发,客户退回') store_in++;
                         else if (e.process_result === '少发,不补发') out_in++;
                         else if (e.process_result === '核实未错漏发') store_in++;
@@ -2294,10 +2403,10 @@
                 },
                 ownerEditWorkOrderSpliceImage(index, images = []) {
                     if (!confirm('是否删除当前图片')) return;
-                    let imageitem = images.find((e, i) => Number(index) === Number(i));
-                    if (!imageitem) return;
-                    if (imageitem.upload_file) {
-                        this.ownerEditWorkOrder.delete_image_ids.push(imageitem.id);
+                    let imageItem = images.find((e, i) => Number(index) === Number(i));
+                    if (!imageItem) return;
+                    if (imageItem.upload_file) {
+                        this.ownerEditWorkOrder.delete_image_ids.push(imageItem.id);
                     }
                     images.splice(index, 1);
                 },
@@ -2374,6 +2483,27 @@
                 ownerDamageWorkOrderTag(item) {
                     item.tag = true;
                 },
+                ownerEndWorkOrder(item, index) {
+                    let url = "{{route('workOrder.owner.endApi')}}";
+                    let data = {
+                        detail_id: item.pending_detail.detail_id,
+                    }
+                    this.waitingTempTip('处理中');
+                    window.axios.post(url, data).then(res => {
+                        window.tempTip.cancelWaitingTip();
+                        if (res.data.success) {
+                            this.successTempTip('完结成功');
+                            item.status = "完成";
+                            item.owner_tag = "";
+                        } else {
+                            this.errorTempTip(res.data.message ? res.data.message : '完结工单异常');
+                        }
+                    }).catch(err => {
+                        window.tempTip.cancelWaitingTip();
+                        this.errorTempTip(err.getMessage());
+                    });
+                },
+
                 getProcessResult(check_result, item) {
                     let results = null;
                     if (check_result === '核实少发') {
@@ -2386,16 +2516,15 @@
                     }
                     return results;
                 },
-
-                checkWorkOrderCommodityMistake(item){
-                    if (this.hasStoreNumber(item)){
+                checkWorkOrderCommodityMistake(item) {
+                    if (this.hasStoreNumber(item)) {
                         item.reissue_logistic_number = null;
                         item.out_order_numbere = null;
-                    } else if (this.hasOutInNumber(item)){
+                    } else if (this.hasOutInNumber(item)) {
                         item.reissue_logistic_number = null;
                         item.store_in_number = null;
                         item.store_in_amount = null;
-                    } else if (this.hasReissueLogisticNumber(item)){
+                    } else if (this.hasReissueLogisticNumber(item)) {
                         item.store_in_number = null;
                         item.store_in_amount = null;
                         item.out_order_numbere = null;
@@ -2431,8 +2560,22 @@
                     if (!detail) {
                         return;
                     }
-                    let {images, commodities, issue_type, price, status,reissue_logistic_number
-                        ,return_logistic_number,return_address,return_phone,return_name,type,process_progress,remark} = detail;
+                    let {
+                        images,
+                        commodities,
+                        issue_type,
+                        price,
+                        status,
+                        reissue_logistic_number
+                        ,
+                        return_logistic_number,
+                        return_address,
+                        return_phone,
+                        return_name,
+                        type,
+                        process_progress,
+                        remark
+                    } = detail;
                     this.showWorkOrder.issue_type_name = issue_type.name ? issue_type.name : '';
                     this.showWorkOrder.process_progress = process_progress;
                     this.showWorkOrder.price = price;
@@ -2440,7 +2583,8 @@
                     this.showWorkOrder.remark = remark;
                     this.showWorkOrder.status = status;
                     this.showWorkOrder.reissue_logistic_number = reissue_logistic_number;
-                    if (reissue_logistic_number){
+                    this.showWorkOrder.return_logistic_number = return_logistic_number;
+                    if (reissue_logistic_number) {
 
                     }
                     this.showWorkOrder.return_address = return_address;
@@ -2469,7 +2613,7 @@
                     let commodities = JSON.parse(JSON.stringify(items));
                     commodities.sort((prev, curr) => prev.logistic_number > curr.logistic_number ? 1 : -1);
                     let index = 0, count = 0, logistic_number = commodities[0] ? commodities[0]['logistic_number'] : '';
-                    commodities.forEach(e=>e.count = 0);
+                    commodities.forEach(e => e.count = 0);
                     commodities.forEach((e, i, array) => {
                         e.commodity_name = e.commodity ? e.commodity.name : '';
                         let current_logistic_number = e.logistic_number;
@@ -2500,7 +2644,7 @@
                     let item = copy_items.find(e => e);
                     if (!item) return [];
                     let {logistic_number} = item, index = 0, count = 0;
-                    copy_items.forEach(e=>e.count = 0);
+                    copy_items.forEach(e => e.count = 0);
                     copy_items.forEach((e, i) => {
                         let current_logistic_number = e.logistic_number;
                         let add_flag = false;
@@ -2523,6 +2667,24 @@
                 autoComputeStoreInAmount(item) {
                     item.store_in_amount = Number(item.amount) - Number(item.bao_shi_check_amount);
                 },
+                isNewWorkOrder(item) {
+                    let {work_order_status} = item;
+                    return work_order_status === '1';
+                },
+                isNewProcessedWorkOrder(item) {
+                    let logistic = @can('订单管理-工单处理-承运商编辑') true
+                    @else false @endcan;
+                    let owner = @can('订单管理-工单处理-货主编辑')  true
+                    @else false @endcan;
+                    let baoShi = @can('订单管理-工单处理-客服编辑') true
+                    @else false @endcan;
+                    let {logistic_tag, bao_shi_tag, owner_tag} = item;
+                    if (logistic && logistic_tag === '1') return true;
+                    if (owner && owner_tag === '1') return true;
+                    if (baoShi && bao_shi_tag === '1') return true;
+                    return false;
+                },
+
             },
         });
     </script>

+ 1 - 0
resources/views/store/checkingReceive/show.blade.php

@@ -90,6 +90,7 @@
         <div class="d-none d-sm-block">
             <table class="table table-striped table-sm text-nowrap table-hover mt-1 td-min-width-80" id="table">
                 <tr v-for="(storeCheckingReceiveItem,i) in storeCheckingReceiveItems" @click="selectedColor(storeCheckingReceiveItem.id)" :class="selectTr==storeCheckingReceiveItem.id ? 'focusing' : ''">
+                    <td><input class="checkItem" type="checkbox" :value="storeCheckingReceiveItem.id"></td>
                     <td><span>@{{ i+1 }}</span></td>
                     <td><span>@{{ storeCheckingReceiveItem.bin_number }}</span></td>
                     <td><span>@{{ storeCheckingReceiveItem.commodity_name }}</span></td>

+ 1 - 0
resources/views/store/handInStorage/receiveDetailPage.blade.php

@@ -268,6 +268,7 @@
                     let error = {};
                     if (!this.info.sku)error.sku = ["条码必填"];
                     if (!this.info.amount)error.amount = ["实收数量必填"];
+                    if (this.info.amount==0)error.amount = ["实收数量不可为零"];
                     if (!this.info.trackNumber)error.trackNumber = ["容器号必填"];
                     if (this.info.amount && ((Number(this.info.amount)+Number(this.info.receivedqty))>Number(this.info.expectedqty)))error.amount = ["总数不能超过预期数"];
                     if (this.basSku.lot_id && this.basSku.lot_id.lotkey01==='Y' && !this.info.lotatt01) error.lotatt01=["生产日期为选"];

+ 7 - 0
routes/api.php

@@ -32,6 +32,13 @@ Route::prefix("v1")->group(function (){
             Route::prefix("order")->group(function () {
                 Route::GET('batchRecover', 'OrderController@recoverBatch');
             });
+            Route::prefix("inventory")->group(function () {
+                Route::get('inventoryTask', 'InventoryController@getInventoryTask');
+                Route::POST('locationInvPro', 'InventoryController@locationInvPro');
+                Route::POST('getInventoryDetail', 'InventoryController@getInventoryDetail');
+                Route::POST('stockInventory', 'InventoryController@stockInventory');
+                Route::POST('skipInventory', 'InventoryController@skipInventory');
+            });
         });
 });
 

+ 7 - 0
routes/apiLocal.php

@@ -275,11 +275,18 @@ Route::group(['prefix' => 'print'],function (){
 });
 
 Route::prefix('workOrder')->group(function(){
+    Route::post('end','WorkOrderController@ownerEndWorkOrderApi')->name('workOrder.owner.endApi');                      // 承运商完结工单
+    Route::post('logisticTag','WorkOrderController@logisticHandlerTagApi')->name('workOrder.logistic.handlerTagApi');      // 承运商处理标记
     Route::prefix('intercept')->group(function(){           // 拦截
         Route::post('store','WorkOrderInterceptController@storeApi')->name('workOrder.intercept.storeApi');                                     // 拦截订单创建
         Route::post('logistic/header','WorkOrderInterceptController@logisticHandlerApi')->name('workOrder.intercept.logistic.handlerApi');        // 承运商处理
         Route::post('baoShi/review','WorkOrderInterceptController@baoShiReviewApi')->name('workOrder.intercept.baoShi.reviewApi');              // 宝时终审
     });
+    Route::prefix('cancelIntercept')->group(function(){           // 拦截
+        Route::post('store','WorkOrderCancelInterceptController@storeApi')->name('workOrder.cancelIntercept.storeApi');                                     // 拦截订单创建
+        Route::post('logistic/header','WorkOrderCancelInterceptController@logisticHandlerApi')->name('workOrder.cancelIntercept.logistic.handlerApi');        // 承运商处理
+        Route::post('baoShi/review','WorkOrderCancelInterceptController@baoShiReviewApi')->name('workOrder.cancelIntercept.baoShi.reviewApi');              // 宝时终审
+    });
     Route::prefix('informationChange')->group(function(){   // 信息修改
         Route::post('store','WorkOrderInformationChangeController@storeApi')->name('workOrder.informationChange.storeApi');                         // 创建
         Route::post('owner/edit','WorkOrderInformationChangeController@ownerEditApi')->name('workOrder.informationChange.owner.editApi');     // 信息修改