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

Merge branch 'master' into Haozi

# Conflicts:
#	app/Http/Controllers/TestController.php
haozi 4 лет назад
Родитель
Сommit
0386f179af
58 измененных файлов с 1397 добавлено и 416 удалено
  1. 1 1
      app/Console/Kernel.php
  2. 1 1
      app/Filters/OrderPackageFilters.php
  3. 27 5
      app/Filters/WorkOrderFilters.php
  4. 12 1
      app/Http/Controllers/Auth/RegisterController.php
  5. 3 1
      app/Http/Controllers/MeasureMonitorController.php
  6. 8 1
      app/Http/Controllers/PackageLogisticController.php
  7. 5 2
      app/Http/Controllers/StoreController.php
  8. 158 5
      app/Http/Controllers/TestController.php
  9. 57 6
      app/Http/Controllers/UserController.php
  10. 4 5
      app/Http/Controllers/WaybillController.php
  11. 16 3
      app/Http/Controllers/WorkOrderController.php
  12. 1 6
      app/Http/Controllers/api/thirdPart/flux/SortingController.php
  13. 3 1
      app/Http/Controllers/api/thirdPart/goodscan/PackageController.php
  14. 2 0
      app/Http/Controllers/api/thirdPart/hengli/PackageController.php
  15. 2 0
      app/Http/Controllers/api/thirdPart/weight/PackageController.php
  16. 4 0
      app/Http/Controllers/api/thirdPart/weight/WeightBaseController.php
  17. 17 7
      app/Jobs/CacheShelfTaskJob.php
  18. 34 0
      app/Logging/CriticalFormatter.php
  19. 23 0
      app/Logging/DebugFormatter.php
  20. 34 0
      app/Logging/ErrorFormatter.php
  21. 16 0
      app/Logging/Handler/EmailHandler.php
  22. 18 0
      app/Logging/InfoFormatter.php
  23. 18 0
      app/Logging/WarningFormatter.php
  24. 0 1
      app/Providers/AppServiceProvider.php
  25. 7 5
      app/Services/CacheShelfService.php
  26. 7 3
      app/Services/ForeignHaiRoboticsService.php
  27. 3 3
      app/Services/LogisticSFService.php
  28. 4 0
      app/Services/OwnerStoragePriceModelService.php
  29. 1 1
      app/Services/StationTaskBatchService.php
  30. 1 3
      app/Services/StationTaskMaterialBoxService.php
  31. 0 1
      app/Services/UserWorkgroupService.php
  32. 16 0
      app/Services/WarehouseService.php
  33. 23 1
      app/Services/WorkOrderService.php
  34. 22 1
      app/User.php
  35. 10 0
      app/UserOwnerGroup.php
  36. 10 0
      app/UserWorkgroup.php
  37. 13 0
      app/Utils/helpers.php
  38. 15 0
      app/WeightLog.php
  39. 9 16
      app/WorkOrder.php
  40. 171 221
      composer.lock
  41. 42 8
      config/logging.php
  42. 33 0
      database/migrations/2021_09_02_133048_create_weight_logs_table.php
  43. 33 0
      database/migrations/2021_09_02_153438_create_user_authables_table.php
  44. 32 0
      database/migrations/2021_09_03_103000_change_waybills_subjoinfee_column.php
  45. 32 0
      database/migrations/2021_09_04_160531_add_column_owner_id_work_orders.php
  46. 32 0
      database/migrations/2021_09_06_095009_change_column_to_work_orders.php
  47. 1 1
      resources/js/vue/tree.vue
  48. 82 0
      resources/views/maintenance/user/create.blade.php
  49. 119 0
      resources/views/maintenance/user/edit.blade.php
  50. 27 0
      resources/views/order/workOrder/_edit_issue_type.blade.php
  51. 164 83
      resources/views/order/workOrder/index.blade.php
  52. 4 0
      resources/views/package/logistic/index.blade.php
  53. 1 8
      resources/views/package/measureMonitor/index.blade.php
  54. 3 3
      resources/views/transport/waybill/delivering.blade.php
  55. 10 9
      resources/views/transport/waybill/edit.blade.php
  56. 3 3
      resources/views/transport/waybill/index.blade.php
  57. 1 0
      routes/apiLocal.php
  58. 2 0
      routes/web.php

+ 1 - 1
app/Console/Kernel.php

@@ -71,7 +71,7 @@ class  Kernel extends ConsoleKernel
         $schedule->command('beforeCreateOwnerReport')->monthlyOn(1);
         $schedule->command('sync:batch')->everyMinute();
         $schedule->command('sync:order')->everyMinute();
-        $schedule->command('syncOrderPackageLogisticRouteTask')->dailyAt('1:20');//同步快递信息到orderPackage
+        $schedule->command('syncOrderPackageLogisticRouteTask')->dailyAt('6:01');//同步快递信息到orderPackage
         $schedule->command('syncOrderPackageLogisticRouteTask')->dailyAt('12:01');//同步快递信息到orderPackage
 //        $schedule->command('updateOrderPackageExceptionTypeCountingRecordTask')->dailyAt('2:20');//更新OrderPackageExceptionTypeCountingRecord
         $schedule->command('SyncWmsCommoditiesInformation')->everyMinute();

+ 1 - 1
app/Filters/OrderPackageFilters.php

@@ -146,7 +146,7 @@ class OrderPackageFilters
         $this->queryBuilder->whereIn('order_id', function ($query) {
             $query->from('orders')
                 ->select('id')
-                ->whereNotIn('logistic_id', [13, 24, 25, 26, 27, 30, 31, 32, 33, 34, 60, 63, 65, 66, 68, 70, 102, 105, 107, 116, 10, 87]);
+                ->whereNotIn('logistic_id', [13, 24, 25, 26, 27, 30, 31, 32, 33, 34, 60, 63, 65, 66, 68, 70, 102, 105, 107, 116, 10]);
         });
     }
 

+ 27 - 5
app/Filters/WorkOrderFilters.php

@@ -6,10 +6,13 @@ namespace App\Filters;
 use App\Order;
 use App\OrderIssue;
 use App\OrderPackage;
+use App\Services\OwnerService;
 use App\Traits\ModelSearchWay;
+use App\User;
 use App\WorkOrder;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
 
 class WorkOrderFilters
 {
@@ -30,7 +33,9 @@ class WorkOrderFilters
         'is_review',
         'logistic_number',
         'is_issue_order',
+        'order_issue_type',
         'grad',
+        'owner'
     ];
     protected $array_filter;
     protected $params = [];
@@ -63,6 +68,13 @@ class WorkOrderFilters
     {
         if(isset($this->params['data']))
             $this->id(explode(',',$this->params['data']));
+
+        if (!isset($this->params['owner'])){
+            $owners = app(OwnerService::class)->getAuthorizedOwners();
+            $this->getOrderQuery()->whereIn('owner_id',$owners->map(function($item){
+                return $item->id;
+            }));
+        }
     }
 
     public function beforeApply()
@@ -128,12 +140,10 @@ class WorkOrderFilters
         $this->queryBuilder->where('work_orders.review_at','<=',$review_at_end);
     }
     // 创建人
-    public function creator($id)
+    public function creator($creator)
     {
-        if (is_array($id))
-            $this->queryBuilder->whereIn('work_orders.creator_id',$id);
-        else
-            $this->queryBuilder->where('work_orders.creator_id',$id);
+        $userQuery = User::query()->select('id')->where('name','like',"%{$creator}%");;
+        $this->queryBuilder->whereIn('creator_id',$userQuery);
     }
     // 审核人
     public function reviewer($id)
@@ -154,6 +164,11 @@ class WorkOrderFilters
         else $this->workOrderTypeQuery->where('id',$word_order_types);
     }
 
+    public function order_issue_type($order_issue_type)
+    {
+        $this->queryBuilder->where('order_issue_type_id',$order_issue_type);
+    }
+
     // 快递单号
     public function logistic_number($logistic_number)
     {
@@ -182,4 +197,11 @@ class WorkOrderFilters
         $this->queryBuilder->where('grad',$grad);
     }
 
+    // 货主
+    public function owner($owner)
+    {
+        $this->searchWay($this->queryBuilder,$owner,'work_orders.owner_id');
+    }
+
+
 }

+ 12 - 1
app/Http/Controllers/Auth/RegisterController.php

@@ -79,7 +79,6 @@ class RegisterController extends Controller
     {
         $headTo=$request->input('headTo')??'';
         $this->validator($request->all())->validate();
-
         event(new Registered($user = $this->create($request->all())));
         $phone=$request->input('phone');
         if ($phone) UserDetail::query()->create([
@@ -109,6 +108,18 @@ class RegisterController extends Controller
         if ($userWorkgroupId){
             $user->userWorkgroups()->sync([$userWorkgroupId]);
         }
+
+        //工作组
+        $work_id = [];
+        $treeData = $request->input('treeData')??[];
+        foreach ($treeData as $v){
+            if (strrpos($v,'g') != 'FALSE') array_push($work_id, mb_substr($v,1));
+        }
+        if ($work_id)$user->workGroups()->sync($work_id);
+        //项目组
+        $owners = $request->input('ownerGroup')??'';
+        if ($owners)$user->ownerGroups()->sync($owners);
+
         app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),$user['id']);
         if($headTo){return redirect(url($headTo))->with('successTip',"录入用户 {$user->name} 成功");}
         return $this->registered($request, $user)

+ 3 - 1
app/Http/Controllers/MeasureMonitorController.php

@@ -40,7 +40,9 @@ class MeasureMonitorController extends Controller
     /** 获取快递面单的语音播报 */
     public function speech(Request $request,MeasureMonitorService $service): array
     {
-
+        if (app('WorkOrderService')->isIntercept($request['logistic_number'])){
+            return $service->getMp3Audio('拦截订单');
+        }
         if ( app('OrderIssueService')->isExists($request['logistic_number'])){
             return $service->getMp3Audio('拦截订单');
         }

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

@@ -33,7 +33,8 @@ class PackageLogisticController extends Controller
             ->filter($filters)
             ->with([
                 'order.logistic',
-                'order.OracleDOCOrderHeader:orderno,notes',
+                'order.batch:id,wms_type',
+                'order.OracleDOCOrderHeader:orderno,notes,WaveNo',
                 'rejectedBill' => function ($query) {
                     $query->select('id', 'logistic_number', 'logistic_number_return')->where('logistic_number', '原单退回');
                 },
@@ -119,9 +120,12 @@ class PackageLogisticController extends Controller
             '称重日期',
             '快递路由',
             '退件状态',
+            '订单备注',
             '客服备注',
             '情况说明',
             '问题类别',
+            '波次规则',
+            '波次号',
             '说明',
             '操作者',
             '时间',
@@ -163,9 +167,12 @@ class PackageLogisticController extends Controller
                 $orderPackage->weighed_at ?? '',//称重日期
                 $transfer_status ?? '',//快递路由
                 empty($orderPackage->rejectedBill) ? '无' : '有',//退件状态
+                $orderPackage->order->OracleDOCOrderHeader->notes ?? '',//订单备注
                 $remark ?? '',//客服备注
                 $orderPackage->order->issue->result_explain ?? '',//情况说明
                 $orderPackage->order->issue->issueType->name ?? '',//问题类别
+                $orderPackage->order->batch->wms_type ?? '',//波次规则
+                $orderPackage->order->OracleDOCOrderHeader->waveno ?? '',//波次号
                 $logsContent ?? '',//说明
                 $users ?? '',//操作者
                 $logCreatedAt ?? '',//时间

+ 5 - 2
app/Http/Controllers/StoreController.php

@@ -2,6 +2,7 @@
 
 namespace App\Http\Controllers;
 
+use App\Components\ErrorPush;
 use App\Depository;
 use App\Owner;
 use App\Services\common\BatchUpdateService;
@@ -28,6 +29,8 @@ use App\Http\Controllers\api\thirdPart\flux\StoreController as FStoreController;
 
 class StoreController extends Controller
 {
+    use ErrorPush;
+
     public function storage(Request $request)
     {
         if(!Gate::allows('入库管理-入库-查询')){ return redirect(url('/'));  }
@@ -218,12 +221,12 @@ class StoreController extends Controller
         $items = [];
         $toDay = Carbon::now()->toDateTimeString();
         $depositories = [];
-        $traceId = rand(100,999);
+        $traceId = 'W'.rand(0,9).date('ymd').substr($asnno,-4).rand(0,9);
         foreach ($details as $detail) {
             $result = $this->executeSP($detail,$asnno,$depository_code,$db,$quality,$conn,$sql_sp,$traceId);
             if (substr($result, 0, 3) != '000') {
                 oci_close($conn);
-                app('LogService')->log(__METHOD__,"快速入库-FLUX收货失败","ASNNO:".$asnno.";ERROR:".$result);
+                $this->push(__METHOD__."->".__LINE__,"快速入库-FLUX收货失败","ASNNO:".$asnno."Trace:{$traceId}".";ERROR:".$result);
                 return ['success' => false, 'data' => $detail->asnlineno.'收货失败,错误代码:'.$result];
             }
             if (!isset($depositories[$detail->lotatt05]) && $detail->lotatt05){

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

@@ -3,6 +3,7 @@
 namespace App\Http\Controllers;
 
 use App\Authority;
+use App\Batch;
 use App\Commodity;
 use App\CommodityMaterialBoxModel;
 use App\Components\AsyncResponse;
@@ -17,7 +18,6 @@ use App\Jobs\OrderCreateWaybill;
 use App\Jobs\SettlementBillReportTask;
 use App\Jobs\StoreCreateInstantBill;
 use App\Jobs\WeightUpdateInstantBill;
-use App\Log;
 use App\MaterialBox;
 use App\MaterialBoxModel;
 use App\Order;
@@ -34,6 +34,7 @@ use App\OwnerPriceOperation;
 use App\OrderPackageCountingRecord;
 use App\ProcurementCheckSheet;
 use App\RejectedBill;
+use App\Services\BatchService;
 use App\Services\CacheShelfService;
 use App\Services\ForeignHaiRoboticsService;
 use App\Services\OrderPackageReceivedSyncService;
@@ -56,6 +57,7 @@ use App\UserDetail;
 use App\UserDutyCheck;
 use App\ValueStore;
 use App\Waybill;
+use App\WorkOrder;
 use Carbon\Carbon;
 use Carbon\CarbonPeriod;
 use Decimal\Decimal;
@@ -69,8 +71,10 @@ use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cookie;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Http;
+use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Facades\URL;
 use Illuminate\Support\Facades\Validator;
+use Illuminate\Support\Str;
 use Laravel\Horizon\Events\JobFailed;
 use Monolog\Handler\IFTTTHandler;
 use PhpOffice\PhpSpreadsheet\Calculation\Web\Service;
@@ -90,13 +94,142 @@ class TestController extends Controller
     {
         return call_user_func([$this, $method], $request);
     }
+    private function valFormat($val):?string
+    {
+        if ($val!==null){
+            $ret = date("Y-m-d H:i:s",strtotime($val))===(string)$val;
+            if ($ret)$val = "to_date('".$val."','yyyy-mm-dd hh24:mi:ss')";
+            else $val = "'".$val."'";
+        }else $val = "null";
+        return $val;
+    }
+    public function test1($task,$amount){
+        DB::connection("oracle")->beginTransaction();
+        try {
+            $columns = '';
+            $values = '';
+            foreach ($task as $key => $val) {
+                if (Str::upper($key) == 'TASKID_SEQUENCE') {
+                    $taskMax = DB::connection("oracle")->selectOne(DB::raw("select MAX(TASKID_SEQUENCE) maxseq from TSK_TASKLISTS where taskid = ?"), [$task->taskid]);
+                    $val = $taskMax->maxseq + 1;
+                }
+                if (Str::upper($key) == 'FMQTY' || Str::upper($key) == 'FMQTY_EACH'
+                    || Str::upper($key) == 'PLANTOQTY' || Str::upper($key) == 'PLANTOQTY_EACH') {
+                    $val -= $amount;
+                    $task->$key = $amount;
+                }
+                $columns .= $key . ",";
+                $values .= $this->valFormat($val) . ",";
+            }
+            $columns = mb_substr($columns, 0, -1);
+            $values = mb_substr($values, 0, -1);
+            $sql = <<<sql
+    INSERT INTO TSK_TASKLISTS({$columns}) VALUES({$values})
+sql;
+            dd($sql);
+        }catch (\Exception $e){
+            dd($e);
+        }
+    }
 
     public function test()
     {
-        $a = 1;
-        if ($a > 2) dd(1);
-        else if ($a == 0) dd(2);
-        dd(3);
+        TaskTransaction::query()->where("id",">=",280)->delete();
+        /*$a= new StorageService();
+        $a->clearTask(["HAIB1-01-01"]);
+        $task = StationTaskMaterialBox::query()->find(90233);
+        $station = Station::query()->find(11);
+        $foreignHaiRoboticsService = new ForeignHaiRoboticsService();
+        $foreignHaiRoboticsService->putBinToStore_fromCacheShelf($task, $station);
+        dd(1);*/
+        /*$batchService = new BatchService();
+        $batches = Batch::query()->where("id",171829)->get();
+        $batchService->assignTasks($batches);
+        dd();*/
+        /*TaskTransaction::query()->where("id",">=",277)->delete();
+        StationTaskMaterialBox::query()->whereIn("id",[89685,89686,89687])->delete();
+        app("CacheShelfService")->_stationCacheLightOff("HAIB1-01-01");//灭灯
+        app("CacheShelfService")->_stationCacheLightOff("HAIB1-02-01");//灭灯
+        dd(1);*/
+        Station::query()->where("station_type_id",5)->update(["status"=>1]);
+        Cache::forget("CACHE_SHELF_AVAILABLE");
+        $station = ["HAIB1-01-01","HAIB1-02-01"];
+        $material = ["IDE0001824","IDE0001740","IDE0002710"];
+        Station::query()->whereIn("code",$station)->update(["status"=>0]);
+        $stations = Station::query()->whereIn("code",$station)->get();
+        $materials = MaterialBox::query()->whereIn("code",$material)->get();
+        $dateTime = date("Y-m-d H:i:s");
+        $task1 = StationTaskMaterialBox::query()->create([
+            'station_id'=>$stations[0]->id,
+            'material_box_id'=>$materials[0]->id,
+            'station_task_batch_id'=>1,
+            'status'=>'待处理'
+        ]);
+        $task2=StationTaskMaterialBox::query()->create([
+            'station_id'=>$stations[1]->id,
+            'material_box_id'=>$materials[1]->id,
+            'station_task_batch_id'=>1,
+            'status'=>'待处理'
+        ]);
+        $task3=StationTaskMaterialBox::query()->create([
+            'station_id'=>6,
+            'material_box_id'=>$materials[2]->id,
+            'station_task_batch_id'=>1,
+            'status'=>'待处理'
+        ]);
+        TaskTransaction::query()->insert([[
+            "doc_code" => "test",
+            "bar_code" => "test",
+            "to_station_id" => $stations[0]->id,
+            "material_box_id" => $materials[0]->id,
+            "task_id" => $task1->id,
+            "commodity_id" => 505012,//XUNI03
+            "amount" => 1,
+            "type" => "出库",
+            "status" => 0,
+            "mark" => 2,
+            "bin_number"=>1,
+            "created_at"=>$dateTime,
+            "updated_at"=>$dateTime,
+        ],[
+            "doc_code" => "test",
+            "bar_code" => "test",
+            "to_station_id" => $stations[1]->id,
+            "material_box_id" => $materials[1]->id,
+            "task_id" => $task2->id,
+            "commodity_id" => 505012,//XUNI03
+            "amount" => 1,
+            "type" => "出库",
+            "status" => 0,
+            "mark" => 2,
+            "bin_number"=>1,
+            "created_at"=>$dateTime,
+            "updated_at"=>$dateTime,
+        ],[
+            "doc_code" => "test",
+            "bar_code" => "test",
+            "to_station_id" => 6,
+            "material_box_id" => $materials[2]->id,
+            "task_id" => $task3->id,
+            "commodity_id" => 505012,//XUNI03
+            "amount" => 1,
+            "type" => "出库",
+            "status" => 3,
+            "mark" => 2,
+            "bin_number"=>1,
+            "created_at"=>$dateTime,
+            "updated_at"=>$dateTime,
+        ]]);
+        $foreignHaiRoboticsService = new ForeignHaiRoboticsService();
+        $toLocation = collect($station);
+        $taskMaterialBoxes = collect([$task1,$task2]);
+        $foreignHaiRoboticsService->
+        fetchGroup_multiLocation($toLocation, $taskMaterialBoxes, '', '立架出至缓存架',20,false);
+        foreach ($toLocation as $index=>$value){
+            app("CacheShelfService")->lightUp($value,'3','0',["title"=>"机器人取箱中,禁止操作"]);
+            Cache::forever("CACHE_SHELF_OCCUPANCY_{$stations[$index]->id}",true);
+        }
+        app("StationService")->locationOccupyMulti($toLocation->toArray());
     }
 
     public function update_order_packages_is_manual_update()
@@ -118,6 +251,26 @@ class TestController extends Controller
         }
     }
 
+    public function updateWorkOrder(){
+        $items = WorkOrder::query()->with('order.owner')->get();
+        $params = [];
+        $items->each(function($item)use(&$params){
+            if ($item->order){
+                $owner_id = $item->order->owner_id;
+
+                $params[] = [
+                    'id' => $item->id,
+                    'order_id' => $item->order->id,
+                    'owner_id' => $owner_id,
+                ];
+                $item->owner_id = $owner_id;
+                $item->save();
+            }
+        });
+    }
+
+
+
     public function testUpdateInv()
     {
         ini_set('max_execution_time', 0);

+ 57 - 6
app/Http/Controllers/UserController.php

@@ -3,16 +3,12 @@
 namespace App\Http\Controllers;
 
 use App\Components\AsyncResponse;
-use App\Owner;
-use App\OwnerGroup;
 use App\Role;
 use App\Supplier;
 use App\User;
 use App\UserDetail;
 use App\UserWorkgroup;
-use Doctrine\DBAL\Configuration;
 use Exception;
-use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
 use Illuminate\Http\Response;
 use Illuminate\Support\Facades\Auth;
@@ -81,7 +77,12 @@ class UserController extends Controller
         $logistics=app('LogisticService')->getSelection(["id","name"],"物流");
         $userWorkgroups=UserWorkgroup::query()->get();
         $suppliers=Supplier::query()->get();
-        return view('maintenance.user.create',['rolesAll'=>$roles,'logistics'=>$logistics,'userWorkgroups'=>$userWorkgroups,'suppliers'=>$suppliers]);
+
+        //工作组 项目组
+        /* @var $user User */
+        $workGroup = app('WarehouseService')->getTreeData();
+        $ownerGroup = app('UserOwnerGroupService')->getSelection();
+        return view('maintenance.user.create',['rolesAll'=>$roles,'logistics'=>$logistics,'userWorkgroups'=>$userWorkgroups,'suppliers'=>$suppliers, 'ownerGroup' => $ownerGroup, 'workGroup'=>$workGroup]);
     }
 
 
@@ -117,7 +118,19 @@ class UserController extends Controller
         $userWorkgroup=$user->userWorkgroups()->first();
         $supplierUser=$user->suppliers()->get();
         $suppliers=Supplier::query()->get();
-        return view('maintenance.user.edit',compact('user','rolesAll','roles','logistics','logisticUser','userWorkgroups','userWorkgroup','suppliers','supplierUser'));
+        //工作组 项目组
+        /* @var $user User */
+        $workGroup = app('WarehouseService')->getTreeData();
+        $group = $user->workGroups()->get();
+        $groups = [];
+        foreach ($group as $v){
+           array_push($groups,'g'.$v->id);
+           array_push($groups,'w'.$v->warehouse_id);
+        }
+        $workGroups = $groups;
+        $ownerGroup = app('UserOwnerGroupService')->getSelection();
+        $ownerGroups =  $user->ownerGroups->pluck('id');
+        return view('maintenance.user.edit',compact('user','rolesAll','roles','logistics','logisticUser','userWorkgroups','userWorkgroup','suppliers','supplierUser','workGroup','workGroups','ownerGroup','ownerGroups'));
     }
 
     /**
@@ -167,6 +180,18 @@ class UserController extends Controller
             if (!$user->userDetail) UserDetail::query()->create(['user_id'=>$user->id,'mobile_phone'=>$phone]);
             UserDetail::query()->where('user_id',$user->id) ->update(['mobile_phone'=>$phone]);
         }
+
+        //工作组
+        $work_id = [];
+        $treeData = $request->input('treeData')??[];
+        foreach ($treeData as $v){
+            if (strrpos($v,'g') === 0) array_push($work_id, mb_substr($v,1));
+        }
+        if ($work_id)$user->workGroups()->sync($work_id);
+        //项目组
+        $owners = $request->input('ownerGroup')??'';
+        if ($owners)$user->ownerGroups()->sync($owners);
+
         app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
         app("UserService")->clearUserCache($user);
         return redirect('maintenance/user/')->with('successTip',"成功修改用户“{$user['name']}”!");
@@ -200,4 +225,30 @@ class UserController extends Controller
         $user->update(["password" => Hash::make(request("pwd"))]);
         $this->success();
     }
+
+    //工作组
+    public function saveWorkGroups(Request $request)
+    {
+        if(!Gate::allows('用户-编辑')){ return redirect(url('/'));  }
+        $params = $request->all();
+        $work_id = [];
+        foreach ($params['workGroups'] as $v){
+            if (strrpos($v,'g') === 0 ) array_push($work_id, mb_substr($v,1));
+        }
+        /* @var $user User */
+        $user = User::query()->find($params['id']);
+        $user->workGroups()->sync($work_id);
+        return ['success'=>true];
+    }
+
+    //工作组
+    public function saveOwnerGroups(Request $request)
+    {
+        if(!Gate::allows('用户-编辑')){ return redirect(url('/'));  }
+        $params = $request->all();
+        /* @var $user User */
+        $user = User::query()->find($params['id']);
+        $user->ownerGroups()->sync($params['ownerGroups']);
+        return ['success'=>true];
+    }
 }

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

@@ -16,7 +16,6 @@ use App\Services\WaybillPayoffService;
 use App\Services\WaybillPriceModelService;
 use App\Services\WaybillService;
 use App\Traits\ModelLogChanging;
-use App\Terminal;
 use App\TerminalPrinter;
 use App\UploadFile;
 use App\WaybillAuditLog;
@@ -812,7 +811,6 @@ SQL;
     public function loadData(Request $request)
     {
         if (!Auth::user())$this->error("登录信息失效");
-//        dd($this->deliveringQuery($request)->orderByDesc("id")->get());
         $this->success($this->deliveringQuery($request)->orderByDesc("id")->get());
     }
     //承运商提交
@@ -1094,7 +1092,8 @@ SQL;
     //按日输入专线费
     public function dailyBilling(Request $request): array
     {
-        if(!Gate::allows('运输管理-运单-按日计算专线费')){return ['success'=>false,'message'=>'没有权限'];}
+        if(!Gate::allows('运输管理-运单-按日计算专线费')
+        && !Gate::allows('运输管理-承运商调度')){return ['success'=>false,'message'=>'没有权限'];}
         $dailyBilling=$request->input('param');
         $waybills=app('waybillService')->dailyBilling($dailyBilling);
         if ($waybills=='无数据')return ['success'=>false,'message'=>'当前选定发货日期没有任何记录'];
@@ -1393,12 +1392,12 @@ SQL;
 
     public function appendSubjoinFee()
     {
-        $this->gate("运输管理-编辑");
+        $this->gate("运输管理-承运商调度");
         $id = \request("id");
         $subjoinFee = \request("subjoinFee");
         if (!$id || !$subjoinFee)$this->error("非法参数");
         if (Waybill::query()->where("id",$id)->update(["subjoin_fee"=>$subjoinFee]) == 0)$this->error("修改失败,运单信息发送变更");
-        LogService::log("运输附加费","调度商添加","录入人:".Auth::id()." | 修改费用{$id}为:".$subjoinFee);
+        LogService::log("运输附加费","调度商添加","录入人:".Auth::id()." | 修改{$id}费用为:".$subjoinFee);
         $this->success();
     }
 }

+ 16 - 3
app/Http/Controllers/WorkOrderController.php

@@ -6,6 +6,7 @@ use App\Filters\WorkOrderFilters;
 use App\Logistic;
 use App\OrderIssue;
 use App\OrderIssueType;
+use App\Services\OwnerService;
 use App\Services\WorkOrderService;
 use App\WorkOrder;
 use Illuminate\Database\Eloquent\Builder;
@@ -18,12 +19,12 @@ class WorkOrderController extends Controller
     public function index(Request $request, WorkOrderFilters $filters, WorkOrderService $service)
     {
         if (Gate::denies('订单管理-工单处理-查询')) return redirect('/');
-
         $workOrders = WorkOrder::query()->filter($filters)->defaultWith()->orderBy('created_at')->orderByDesc('status')->paginate($request['paginate'] ?? 50);
         $logistics = Logistic::all();
-        $orderIssueTypes = OrderIssueType::all();
+        $orderIssueTypes = $service->getIssueType();
+        $owners = app('OwnerService')->getAuthorizedOwners();
         $service->tags($workOrders);
-        return view('order.workOrder.index', compact('workOrders', 'logistics', 'orderIssueTypes'));
+        return view('order.workOrder.index', compact('workOrders', 'logistics', 'orderIssueTypes','owners'));
     }
 
     // 审核 api
@@ -87,4 +88,16 @@ class WorkOrderController extends Controller
         WorkOrder::query()->where('id',$request['id'])->update(['order_issue_type_id' => $request['type_id']]);
         return ['success' => true];
     }
+
+    // 批量修改问题件类型
+    public function batchUpdateIssueTypeApi(Request $request,WorkOrderService $service): array
+    {
+        if (Gate::denies('订单管理-工单处理-审核'))
+            return ['success' => false,'message' => '没有对应权限'];
+        WorkOrder::query()->whereIn('id',$request['ids'])->update(['order_issue_type_id' => $request['type']]);
+        $items = WorkOrder::query()->defaultWith()->whereIn('id',$request['ids'])->get();
+        $service->tags($items);
+        return ['success' => true,'data' => $items];
+    }
+
 }

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

@@ -4,15 +4,11 @@ namespace App\Http\Controllers\api\thirdPart\flux;
 
 use App\Batch;
 use App\Http\Controllers\Controller;
-use App\OracleActAllocationDetails;
 use App\Order;
-use App\OrderBin;
 use App\OrderCommodity;
-use App\Owner;
-use App\Services\CommodityService;
-use Carbon\Carbon;
 use Illuminate\Http\Request;
 use Illuminate\Http\Response;
+use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Facades\Validator;
 use Zttp\Zttp;
 
@@ -179,7 +175,6 @@ class SortingController extends Controller
                 'bin'=>$order->bin()->first()['number']
             ];
         });
-        $response=null;
         try {
             $response=Zttp::post($apiUrl,$sendingData);
         }catch (\Exception $e){

+ 3 - 1
app/Http/Controllers/api/thirdPart/goodscan/PackageController.php

@@ -5,14 +5,16 @@ namespace App\Http\Controllers\api\thirdPart\goodscan;
 
 use App\Services\LogService;
 use App\Services\weight\GoodScanWeightService;
+use App\WeightLog;
 use Illuminate\Http\Request;
-use Illuminate\Support\Carbon;
 use Illuminate\Support\Facades\Validator;
 
 class PackageController
 {
     public function new_(Request $request)
     {
+        WeightLog::query()->create(['content' => json_encode($request->all()),'interface' => 'GoodScan']);
+
         app('LogService')->log(__METHOD__, 'GoodScan weightApi add' . __FUNCTION__, json_encode($request->getContent()));
         $requestInput = [];
         foreach ($request->input() as $key => $item) {

+ 2 - 0
app/Http/Controllers/api/thirdPart/hengli/PackageController.php

@@ -6,12 +6,14 @@ namespace App\Http\Controllers\api\thirdPart\hengli;
 use App\Http\Controllers\api\thirdPart\weight\WeightBaseController;
 use App\Services\LogService;
 use App\Services\weight\HengLiWeightService;
+use App\WeightLog;
 use Illuminate\Http\Request;
 
 class PackageController extends WeightBaseController
 {
     public function new_(Request $request)
     {
+        WeightLog::query()->create(['content' => json_encode($request->all()),'interface' => 'HengLi']);
         $errors = $this->validator($request);
         if(count($errors)>0){
             return json_encode(['success' => false,'message' => $errors],JSON_UNESCAPED_UNICODE);

+ 2 - 0
app/Http/Controllers/api/thirdPart/weight/PackageController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers\api\thirdPart\weight;
 use App\Http\Controllers\Controller;
 use App\Services\LogService;
 use App\Services\weight\HaoChuangWeightService;
+use App\WeightLog;
 use Illuminate\Http\Request;
 use Illuminate\Support\Carbon;
 use Illuminate\Support\Facades\Validator;
@@ -13,6 +14,7 @@ class PackageController extends Controller
 {
     public function new_(Request $requestInitial)
     {
+        WeightLog::query()->create(['content' => json_encode($requestInitial->all()),'interface' => 'HaoChuang']);
         $request = [];
         foreach ($requestInitial->all() as $k => $v) {
             $request[strtolower($k)] = $v;

+ 4 - 0
app/Http/Controllers/api/thirdPart/weight/WeightBaseController.php

@@ -406,6 +406,10 @@ class WeightBaseController
             if(strlen($a) == strlen($b))return 0;
             return strlen($a) < strlen($b) ? 1 : -1;
         });
+        if (count($codes) > 1){
+            $item = OrderPackage::query()->whereIn('logistic_number',$codes)->first();
+            if ($item)return $item->logistic_number;
+        }
         return $codes[0] ?? null;
     }
 

+ 17 - 7
app/Jobs/CacheShelfTaskJob.php

@@ -4,6 +4,7 @@ namespace App\Jobs;
 
 use App\Components\ErrorPush;
 use App\Services\ForeignHaiRoboticsService;
+use App\Services\LogService;
 use App\Station;
 use App\StationTaskMaterialBox;
 use App\TaskTransaction;
@@ -15,6 +16,7 @@ use Illuminate\Queue\InteractsWithQueue;
 use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
 
 class CacheShelfTaskJob implements ShouldQueue
 {
@@ -47,10 +49,12 @@ class CacheShelfTaskJob implements ShouldQueue
             case "CACHE_SHELF_AVAILABLE"://缓存架释放呼叫
                 //等待一定时间来合并同类请求至此
                 $available = Cache::get($this->key,0);
-                if ($this->count!==$available)return;
+                Log::debug("队列事务1",["当前数量:{$this->count}","缓存数量:$available"]);
+                if ($this->count!=$available)return;
                 Cache::forget($this->key); //无论是否开始分发 都清除本次缓存架的计数器
                 //获取可用缓存架
                 $stations = app("StationService")->getCacheShelf(true);
+                Log::debug("队列事务2",["可用缓存架:{$stations->count()}"]);
                 if ($stations->count()==0)break;
                 //检查事务 尝试分发任务 改变下方序列来控制分发顺序 逐级分发 一次成功就终止
                 if ($this->dispatchOutTask($stations,$service))break; //首先尝试向出库事务分发 分发成功跳出
@@ -60,7 +64,7 @@ class CacheShelfTaskJob implements ShouldQueue
                 if (!Cache::has($this->key))return;
                 /** @var Collection $task */
                 list($task,$location) = Cache::get($this->key);
-                if ($this->count!==$task->count())return;
+                if ($this->count!=$task->count())return;
                 $dataToPost = $service->makeJson_move_multi($task, '缓存架入立架', $location);
                 $controlSuccess = $service->controlHaiRobot($dataToPost,$task,'缓存架入立架');
                 $tIds = [];
@@ -105,14 +109,18 @@ class CacheShelfTaskJob implements ShouldQueue
                     $query->where("status","待处理");
                 })->where("status",3)->lockForUpdate()
                 ->where("mark",2)->groupBy("task_id")->get(); //检索等待的队列事务来获取对应任务
+            Log::debug("队列事务3",["队列出库任务:{$tasks->count()}"]);
+            if ($tasks->count()==0)return false;
             if ($this->dispatchTask($tasks,$stations,$service,function ($obj,$stationId,$time,&$updateTransaction){
                 if ($obj->ids!=$obj->id){
                     $ids = explode(",",$obj->ids);
                     foreach ($ids as $id)$updateTransaction[] = ["id"=>$id,"to_station_id"=>$stationId,"status"=>0,"updated_at"=>$time];
                 }else $updateTransaction[] = ["id"=>$obj->id,"to_station_id"=>$stationId,"status"=>0,"updated_at"=>$time];
             },function ($service,$toLocation,$task,$prefix){
-                return $service->fetchGroup_multiLocation($toLocation,$task,$prefix,'立架出至缓存架',20);
-            },"to_station_id")){DB::commit();return $stations->count()==0;} //缓存架用完 跳出,否则接着分发
+                return $service->fetchGroup_multiLocation($toLocation,$task,$prefix,'立架出至缓存架',20,false);
+            },"to_station_id")){
+                Log::debug("队列事务4",["缓存架剩余数量:{$stations->count()}"]);
+                DB::commit();return $stations->count()==0;} //缓存架用完 跳出,否则接着分发
             DB::rollBack();
         }catch (\Exception $e){
             DB::rollBack();
@@ -137,12 +145,14 @@ class CacheShelfTaskJob implements ShouldQueue
                     $query->where("status","待处理");
                 })->where("status",3)->lockForUpdate()
                 ->where("mark",1)->get(); //检索等待的队列事务来获取对应任务
-            if (!$tasks->count())return false;
+            Log::debug("队列事务3",["队列入库任务:{$tasks->count()}"]);
+            if ($tasks->count()==0)return false;
             if ($this->dispatchTask($tasks,$stations,$service,function ($obj,$stationId,$time,&$updateTransaction){
                 $updateTransaction[] = ["id"=>$obj->id,"fm_station_id"=>$stationId,"status"=>0,"updated_at"=>$time];
             },function ($service,$toLocation,$task,$prefix){
-                return $service->fetchGroup_multiLocation($toLocation,$task,'','立架出至缓存架');
+                return $service->fetchGroup_multiLocation($toLocation,$task,'','立架出至缓存架',20,false);
             },"fm_station_id")){
+                Log::debug("队列事务5",["缓存架剩余数量:{$stations->count()}"]);
                 DB::commit();return $stations->count()==0; //缓存架用完 跳出,否则接着分发
             }
             DB::rollBack();
@@ -178,7 +188,7 @@ class CacheShelfTaskJob implements ShouldQueue
         }
         app("BatchUpdateService")->batchUpdate("station_task_material_boxes",$updateTask);
         app("BatchUpdateService")->batchUpdate("task_transactions",$updateTransaction);
-        if ($execute($service,$toLocation,$task,$tasks[0]->station_task_batch_id)){
+        if ($execute($service,$toLocation,$task,$tasks[0]->station_task_batch_id ?: '')){
             foreach ($toLocation as $value){
                 app("CacheShelfService")->lightUp($value,'3','0',["title"=>"机器人取箱中,禁止操作"]);
                 Cache::forever("CACHE_SHELF_OCCUPANCY_{$map[$value]}",true);

+ 34 - 0
app/Logging/CriticalFormatter.php

@@ -0,0 +1,34 @@
+<?php
+
+
+namespace App\Logging;
+
+
+use Monolog\Logger;
+
+/**
+ * Handler some critical,alert,emergency events
+ *
+ * Class CriticalFormatter
+ * @package App\Logging
+ */
+class CriticalFormatter
+{
+    public function __invoke($logger)
+    {
+        /** @var Logger $logger */
+        //$logger->popHandler();
+
+        //也可以在前置或后置设置一些通知渠道
+        //$logger->setHandlers([new EmailHandler()]); //TODO 这里设置处理器
+        //上面设置完处理器会覆盖原有处理器,原来的默认是流式写入(I/O磁盘)
+        $logger->setExceptionHandler(function ($e){
+            //比如 异常$e->getMessage()中存在Permission denied就是文件权限异常
+            //用switch捕获各种写入失败场景
+            //普通日志也应做此处理,记录应该分级分块
+            //logs表考虑下是否启用
+            //写入失败时,会再此处处理下
+        });
+    }
+
+}

+ 23 - 0
app/Logging/DebugFormatter.php

@@ -0,0 +1,23 @@
+<?php
+
+
+namespace App\Logging;
+
+use Monolog\Logger;
+
+/**
+ * Handle debug events
+ *
+ * Class DebugFormatter
+ * @package App\Logging
+ */
+class DebugFormatter
+{
+    /**
+     * @param Logger|\Illuminate\Log\Logger $logger
+     */
+    public function __invoke($logger)
+    {
+        //if (env("APP_ENV","production")!='local')$logger->popHandler();
+    }
+}

+ 34 - 0
app/Logging/ErrorFormatter.php

@@ -0,0 +1,34 @@
+<?php
+
+
+namespace App\Logging;
+
+
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Log;
+use Monolog\Logger;
+
+/**
+ * Handler error events
+ *
+ * Class ErrorFormatter
+ * @package App\Logging
+ */
+class ErrorFormatter
+{
+    /**
+     * @param Logger|\Illuminate\Log\Logger $logger
+     */
+    public function __invoke($logger)
+    {
+        $logger->setExceptionHandler(function ($e) {
+            if (stripos($e->getMessage(),"Permission denied")){
+                try {
+                    if (PHP_OS != 'WINNT')exec("chmod 777 ".base_path("storage/logs/error-".date("Y-m-d").".log"),$output,$return);
+                }catch (\Exception $e){
+                    Log::critical("日志写入错误",["msg"=>$e->getMessage(),"user"=>Auth::id()]);
+                }
+            }
+        });
+    }
+}

+ 16 - 0
app/Logging/Handler/EmailHandler.php

@@ -0,0 +1,16 @@
+<?php
+
+
+namespace App\Logging\Handler;
+
+
+use Monolog\Handler\AbstractProcessingHandler;
+
+class EmailHandler extends AbstractProcessingHandler
+{
+
+    protected function write(array $record): void
+    {
+        dump($record);
+    }
+}

+ 18 - 0
app/Logging/InfoFormatter.php

@@ -0,0 +1,18 @@
+<?php
+
+
+namespace App\Logging;
+
+/**
+ * Handle info events
+ *
+ * Class InfoFormatter
+ * @package App\Logging
+ */
+class InfoFormatter
+{
+    public function __invoke($logger)
+    {
+
+    }
+}

+ 18 - 0
app/Logging/WarningFormatter.php

@@ -0,0 +1,18 @@
+<?php
+
+
+namespace App\Logging;
+
+/**
+ * Handle some Notice,Warning events
+ *
+ * Class WarningFormatter
+ * @package App\Logging
+ */
+class WarningFormatter
+{
+    public function __invoke($logger)
+    {
+
+    }
+}

+ 0 - 1
app/Providers/AppServiceProvider.php

@@ -181,7 +181,6 @@ use App\Services\RequirementUserService;
 use App\Services\WorkOrderService;
 use App\Services\WorkOrderTypeService;
 use App\Services\OrderPackageRemarkService;
-use App\Services\MeasureMonitorService;
 use App\Services\LaborCompanyService;
 
 class AppServiceProvider extends ServiceProvider

+ 7 - 5
app/Services/CacheShelfService.php

@@ -2,6 +2,7 @@
 
 namespace App\Services;
 
+use App\Components\ErrorPush;
 use App\Events\BroadcastToStation;
 use App\Exceptions\ErrorException;
 use App\Jobs\CacheShelfTaskJob;
@@ -15,7 +16,7 @@ use Illuminate\Database\Eloquent\Collection;
 
 class   CacheShelfService
 {
-    use ServiceAppAop;
+    use ServiceAppAop,ErrorPush;
 
     protected $modelClass = Station::class;
 
@@ -67,7 +68,6 @@ class   CacheShelfService
                 $this->lightUp($station->code,'1','0',['title'=>"操作完成,等待入库"]);
                 return ['success' => true];
             }
-            app("StationService")->locationFreed($station->code);
         }
         try {
             $bool = $this->putBinToStore($station);                         // 推送任务
@@ -97,7 +97,8 @@ class   CacheShelfService
 
         /** @var StationTaskMaterialBox $stationTaskMaterialBox */
         $stationTaskMaterialBox = app("StorageService")->createWarehousingTask($this->stationService->getStation_byType('立库')["id"],$station->materialBox->id);
-
+        $this->lightUp($station->code,'3','0',['title'=>"等待机器人拿走,请勿操作"]);
+        Cache::forever("CACHE_SHELF_OCCUPANCY_{$station->id}",true);
         return $this->foreignHaiRoboticsService->putBinToStore_fromCacheShelf($stationTaskMaterialBox, $station);
     }
 
@@ -211,9 +212,10 @@ class   CacheShelfService
      */
     public function boxHasBeenTaken($station)
     {
-        app("StationService")->locationFreed($station); //释放库位,解除绑定料箱
+        app("StationService")->locationFreed($station->code); //释放库位,解除绑定料箱
         $available=Cache::get("CACHE_SHELF_AVAILABLE",0)+1;//获取可用缓存架数量 plus当前
         Cache::forever("CACHE_SHELF_AVAILABLE",$available);
-        CacheShelfTaskJob::dispatch("CACHE_SHELF_AVAILABLE",$available)->delay(now()->addSeconds(config("haiRou.cacheShelf.outBinAwait")));
+        $this->_stationCacheLightOff($station->code);
+        CacheShelfTaskJob::dispatch("CACHE_SHELF_AVAILABLE",$available)->delay(now()->addSeconds(config("haiRou.cacheShelf.outBinAwait",3)));
     }
 }

+ 7 - 3
app/Services/ForeignHaiRoboticsService.php

@@ -8,6 +8,7 @@ use App\Components\ErrorPush;
 use App\Exceptions\ErrorException;
 use App\Exceptions\Exception;
 use App\Jobs\CacheShelfTaskJob;
+use App\Log;
 use App\MaterialBox;
 use App\Station;
 use App\StationTask;
@@ -141,10 +142,13 @@ class ForeignHaiRoboticsService
      * @param Collection $taskMaterialBoxes
      * @param string $groupIdPrefix
      * @param string $mode
+     * @param int $priority
+     * @param bool $isSequenced
      * @return bool
      * @throws ErrorException|Exception
      */
-    public function fetchGroup_multiLocation(Collection $toLocations, Collection $taskMaterialBoxes, $groupIdPrefix='', $mode='立架出至输送线', int $priority = 10): bool
+    public function fetchGroup_multiLocation(Collection $toLocations, Collection $taskMaterialBoxes,string $groupIdPrefix='',string
+        $mode='立架出至输送线', int $priority = 10, bool $isSequenced = true): bool
     {
         $dataToPost=$this->makeJson_move_multi(
             $taskMaterialBoxes,
@@ -152,7 +156,8 @@ class ForeignHaiRoboticsService
             null,
             $toLocations,
             $groupIdPrefix,
-            $priority
+            $priority,
+            $isSequenced ? 1 : 0
         );
         return $this->controlHaiRobot($dataToPost,$taskMaterialBoxes,$mode);
     }
@@ -408,7 +413,6 @@ class ForeignHaiRoboticsService
             $response = Http::post(config('api.haiq.storage.moveBin'), $dataToPost);
             if(isset($response->json()['code'])&&$response->json()['code']==500)
                 throw new ErrorException('机器人500错误:'.json_encode($response->json()));
-            LogService::log('海柔请求','runMany','波次任务分配6.r5f2c1.52:');
             LogService::log(__METHOD__,'runMany','波次任务分配6.r5f2c1.53:'.json_encode($response->json()));
         }catch (\Exception $e){
             LogService::log('海柔请求','runMany','波次任务分配6.r5f2c1.54:'.json_encode($dataToPost).$e->getMessage());

+ 3 - 3
app/Services/LogisticSFService.php

@@ -125,9 +125,9 @@ xml;
         }
         foreach ($routs as $route) {
             $route = get_object_vars($route)['@attributes'];
-            $data['accept_time'] = $route['accept_time'];
-            $data['accept_address'] = $route['accept_address'];
-            $data['remark'] = $route['remark'];
+            $data['accept_time'] = $route['accept_time']??'';
+            $data['accept_address'] = $route['accept_address']??'';
+            $data['remark'] = $route['remark']??'';
             $result[] = $data;
         }
         return $result;

+ 4 - 0
app/Services/OwnerStoragePriceModelService.php

@@ -111,6 +111,10 @@ class OwnerStoragePriceModelService
         if (!$model || !$area || $model->operation) return array(0,null);
         if ($area < $model->minimum_area) $area = $model->minimum_area;
 
+        if (!isset($GLOBALS["FEE_INFO"]))$GLOBALS["FEE_INFO"] = [
+            "fee_description" => "",
+            "tax_rate" => "",
+        ];
         $GLOBALS["FEE_INFO"]["fee_description"] .= "起租面积:".$model->minimum_area;
 
         switch ($model->discount_type){

+ 1 - 1
app/Services/StationTaskBatchService.php

@@ -197,7 +197,7 @@ class StationTaskBatchService
                     list($toLocation, $taskMaterialBoxes, $map) = $this->apportionLocation($taskMaterialBoxes);
                     if ($toLocation->count()>0){
                         $isFetchedFromRobotics = $this->foreignHaiRoboticsService->
-                        fetchGroup_multiLocation($toLocation, $taskMaterialBoxes, $groupPrefix, '立架出至缓存架',20);
+                        fetchGroup_multiLocation($toLocation, $taskMaterialBoxes, $groupPrefix, '立架出至缓存架',20,false);
                         foreach ($toLocation as $value){
                             app("CacheShelfService")->lightUp($value,'3','0',["title"=>"机器人取箱中,禁止操作"]);
                             Cache::forever("CACHE_SHELF_OCCUPANCY_{$map[$value]}",true);

+ 1 - 3
app/Services/StationTaskMaterialBoxService.php

@@ -155,10 +155,9 @@ class StationTaskMaterialBoxService
         $this->instant($this->cacheShelfService,'CacheShelfService');
         $this->instant($this->storageService,'StorageService');
         try{
-            LogService::log('海柔请求','markHasTaken1','');
             $taskType=$this->getServingTaskType($stationTaskMaterialBox);
             LogService::log('海柔请求','markHasTaken2',
-                json_encode($taskType));
+                json_encode($stationTaskMaterialBox));
             switch ($taskType){
                 case '分波次':
                     $this->markProcessing($stationTaskMaterialBox);
@@ -213,7 +212,6 @@ class StationTaskMaterialBoxService
     {
         $this->instant($this->cacheShelfService,'CacheShelfService');
         //$stationTaskMaterialBox->loadMissing("station");
-        $this->push("1","取出料箱通知","任务信息:".$stationTaskMaterialBox->toJson());
 
         //判断取出料箱是否是在缓存架
         $station = Station::query()->where("material_box_id",$stationTaskMaterialBox->material_box_id)

+ 0 - 1
app/Services/UserWorkgroupService.php

@@ -16,5 +16,4 @@ class UserWorkgroupService
         }
         return UserWorkgroup::query()->select($column)->get();
     }
-
 }

+ 16 - 0
app/Services/WarehouseService.php

@@ -94,5 +94,21 @@ Class WarehouseService
             return null;
         });
     }
+
+    // 树状结构
+    public function getTreeData(){
+        $data = Warehouse::with(['userWorkgroups'])->get();
+        $return = [];
+        foreach ($data as $v){
+            $child = [];
+            if ($v->userWorkgroups){
+                foreach ($v->userWorkgroups as $val){
+                     array_push($child, ['id'=>'g'.$val->id, 'name'=>$val->name]);
+                }
+            }
+            array_push($return, ['id' => 'w'.$v->id, 'name'=> $v->name, 'child' => $child]);
+        }
+        return $return;
+    }
 }
 

+ 23 - 1
app/Services/WorkOrderService.php

@@ -5,6 +5,7 @@ namespace App\Services;
 use App\Order;
 use App\OrderIssue;
 use App\OrderIssueType;
+use App\OrderPackage;
 use App\Traits\ServiceAppAop;
 use App\WorkOrder;
 use App\WorkOrderType;
@@ -27,6 +28,14 @@ class WorkOrderService
         '破损' => '快递破损',
     ];
 
+    /**
+     * 获取可生成工单的问题件类型
+     * @return Builder[]|\Illuminate\Database\Eloquent\Collection
+     */
+    public function getIssueType(){
+        return OrderIssueType::query()->whereIn('name',['拦截','信息更改','其他', '快递异常','错漏发','破损'])->get();
+    }
+
     /**
      * 生成工单
      * @param $params
@@ -59,7 +68,7 @@ class WorkOrderService
             }
             switch ($type_name) {
                 case '拦截':
-                    $remark = "拦截订单:".$order->client_code ?? '';
+                    $remark = "拦截订单";
                     break;
                 case '信息更改':
                 case '其他':
@@ -78,6 +87,7 @@ class WorkOrderService
                 'order_id' => $order['id'],
                 'creator_id' => $creator_id,
                 'work_order_type_id' => $work_order_type_id ?? 0,
+                'owner_id' => $order['owner_id'] ?? '',
                 'grad' => $param['grad'] ?? 1,
                 'remark' => $remark,
                 'outer_table_name' => 'orders',
@@ -187,4 +197,16 @@ class WorkOrderService
             else  $workOrder->is_issue_order= false;
         }
     }
+
+    /**
+     * 判断是否拦截工单
+     * @param $logistic_number
+     * @return bool
+     */
+    public function isIntercept($logistic_number): bool
+    {
+        $package_query = OrderPackage::query()->select('order_id')->where('logistic_number',$logistic_number);
+         $order_issue_query = OrderIssueType::query()->select('id')->where('name','拦截');
+        return WorkOrder::query()->whereIn('order_id',$package_query)->whereIn('order_issue_type_id',$order_issue_query)->exists();
+    }
 }

+ 22 - 1
app/User.php

@@ -119,8 +119,20 @@ class User extends Authenticatable
             });
             return $ownerIds;
         }
-        return array_column(DB::table("owner_role")->whereIn("role_id",
+        //原查询
+        $old_owner=  array_column(DB::table("owner_role")->whereIn("role_id",
             array_column($this->roles->toArray(),"id"))->get()->toArray(),"owner_id");
+        //兼容
+        $new_owner = $this->ownerGroups()->with(['owners:id,user_owner_group_id'])->get();
+        $new_work= $this->workGroups()->with(['owners:id,user_workgroup_id'])->get();
+
+        foreach ($new_owner as $v){
+            $ownerIds = array_merge($ownerIds, array_column($v->owners->toArray(),'id'));
+        }
+        foreach ($new_work as $v){
+            $ownerIds = array_merge($ownerIds, array_column($v->owners->toArray(),'id'));
+        }
+        return  array_unique(array_merge($ownerIds, $old_owner));
     }
     function getPermittingWorkgroupIds($allowAll=false){
         $workgroupIds=[];
@@ -156,4 +168,13 @@ class User extends Authenticatable
         });
         return array_unique($labor_company_ids);
     }
+
+    public function workGroups()
+    {
+        return $this->morphedByMany(UserWorkgroup::class, 'user_authable');
+    }
+    public function ownerGroups()
+    {
+        return $this->morphedByMany(UserOwnerGroup::class, 'user_authable');
+    }
 }

+ 10 - 0
app/UserOwnerGroup.php

@@ -13,4 +13,14 @@ class UserOwnerGroup extends Model
     protected $fillable = [
         "name"  //名称
     ];
+
+    public function usersFromAuth()
+    {
+        return $this->morphToMany(User::class, 'user_authable');
+    }
+
+    public function owners()
+    {
+        return $this->hasMany(Owner::class);
+    }
 }

+ 10 - 0
app/UserWorkgroup.php

@@ -45,4 +45,14 @@ class UserWorkgroup extends Model
     {
         return $this->belongsToMany(OrderIssue::class);
     }
+
+    public function usersFromAuth()
+    {
+        return $this->morphToMany(User::class, 'user_authable');
+    }
+
+    public function owners()
+    {
+        return $this->hasMany(Owner::class);
+    }
 }

+ 13 - 0
app/Utils/helpers.php

@@ -79,6 +79,7 @@ function httpPost($uri = '', $body = '', $header = ''):array
     return json_decode($data,  true);
 }
 
+//获取电脑的Mac地址
 function getMacAddr($type = PHP_OS):string
 {
     $return_array = []; $mac_addr = '';
@@ -109,3 +110,15 @@ function getMacAddr($type = PHP_OS):string
     unset($temp_array);
     return $mac_addr;
 }
+
+//2021-09-03 oracle 链接
+function getOciConnect()
+{
+    $username = config('database.connections.oracle.username');
+    $password = config('database.connections.oracle.password');
+    $host = config('database.connections.oracle.host');
+    $service_name = config('database.connections.oracle.service_name');
+    $charset = config('database.connections.oracle.charset');
+    return oci_connect($username,$password,$host.'/'.$service_name,$charset);
+}
+

+ 15 - 0
app/WeightLog.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+
+use App\Traits\ModelLogChanging;
+
+class WeightLog extends Model
+{
+    use ModelLogChanging;
+
+    //
+    protected $fillable = ['content','interface'];
+}

+ 9 - 16
app/WorkOrder.php

@@ -22,6 +22,7 @@ class WorkOrder extends Model
         'status',           // 状态
         'creator_id',       // 创建人
         'reviewer_id',      // 审核人
+        'owner_id',      // 货主
         'order_issue_type_id', // 问题件类型
         'work_order_type_id',  // 工单类型
         'grad',         // 紧急等级
@@ -105,6 +106,12 @@ class WorkOrder extends Model
         return $this->belongsTo(Order::class);
     }
 
+    // 关联货主
+    public function owner(): BelongsTo
+    {
+        return $this->belongsTo(Owner::class,'owner_id');
+    }
+
     // 工单类型
     public function type(): BelongsTo
     {
@@ -132,9 +139,9 @@ class WorkOrder extends Model
     /** 默认 with 参数 */
     public function scopeDefaultWith($query)
     {
-        $query->with(['type','issueType','creator','reviewer','order'=>function($query){
+        $query->with(['type','owner','issueType','creator','reviewer','order'=>function($query){
             /** @var $query Builder */
-            $query->with('packages','logistic');
+            $query->with('packages','logistic','owner');
         },'orderIssue'=>function($query){
             /** @var $query Builder */
             $query->with(['issueType','logs'=>function($query){
@@ -145,20 +152,6 @@ class WorkOrder extends Model
                 }
             }]);
         }]);
-
-        $query->with(['type', 'creator', 'order' => function ($query) {
-            /** @var $query Builder */
-            $query->with(['packages', 'issue'=>function($query){
-                /** @var $query Builder */
-                $query->with(['issueType','logs'=>function($query){
-                    if (Gate::denies('订单管理-问题件-客户不可见')){
-                        $query->with('user')->orderByDesc('created_at');
-                    } else{
-                        $query->with('user')->where('tag','=',0)->orderByDesc('created_at');
-                    }
-                }]);
-            }, 'logistic']);
-        }, 'reviewer','issueType']);
     }
 
 }

Разница между файлами не показана из-за своего большого размера
+ 171 - 221
composer.lock


+ 42 - 8
config/logging.php

@@ -41,10 +41,9 @@ return [
     'channels' => [
         'stack' => [
             'driver' => 'stack',
-            'channels' => ['daily'],
+            'channels' => ['critical',"error","warning","info","debug"],
             'ignore_exceptions' => false,
         ],
-
         'single' => [
             'driver' => 'single',
             'path' => storage_path('logs/laravel.log'),
@@ -53,9 +52,49 @@ return [
 
         'daily' => [
             'driver' => 'daily',
-            'path' => storage_path('logs/laravel.log'),
+            'path' => storage_path('logs/error.log'),
+            'level' => 'error',
+            //'permission' => '0666',
+            'days' => 14,
+        ],
+
+        'debug'=>[
+            'driver' => 'daily',
+            'tap' => [App\Logging\DebugFormatter::class],
+            'path' => storage_path('logs/debug.log'),
             'level' => 'debug',
+            //'permission' => '0666',
+            'days' => 7,
+        ],
+        'critical'=> [
+            'driver' => 'single',
+            'tap' => [App\Logging\CriticalFormatter::class],
+            'path' => storage_path('logs/critical.log'),
+            'level' => 'critical',
+            "bubble"=>false,
+        ],
+        'error'=>[
+            'driver' => 'daily',
+            'tap' => [App\Logging\ErrorFormatter::class],
+            'path' => storage_path('logs/error.log'),
+            'level' => 'error',
+            //'permission' => '0666',
             'days' => 14,
+            "bubble"=>false,
+        ],
+        'warning'=>[
+            'driver' => 'single',
+            'tap' => [App\Logging\WarningFormatter::class],
+            'path' => storage_path('logs/warning.log'),
+            'level' => 'warning',
+            "bubble"=>false,
+        ],
+        'info'=>[
+            'driver' => 'single',
+            'tap' => [App\Logging\InfoFormatter::class],
+            'path' => storage_path('logs/info.log'),
+            'level' => 'info',
+            "bubble"=>false,
         ],
 
         'slack' => [
@@ -89,11 +128,6 @@ return [
             'driver' => 'syslog',
             'level' => 'debug',
         ],
-
-        'errorlog' => [
-            'driver' => 'errorlog',
-            'level' => 'debug',
-        ],
     ],
 
 ];

+ 33 - 0
database/migrations/2021_09_02_133048_create_weight_logs_table.php

@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateWeightLogsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('weight_logs', function (Blueprint $table) {
+            $table->id();
+            $table->text('content')->comment('请求报文');
+            $table->string('interface')->index()->comment('接口');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('weight_logs');
+    }
+}

+ 33 - 0
database/migrations/2021_09_02_153438_create_user_authables_table.php

@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateUserAuthablesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('user_authables', function (Blueprint $table) {
+            $table->id();
+            $table->unsignedInteger('user_id');
+            $table->unsignedInteger('user_authable_id');
+            $table->string('user_authable_type');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('user_authables');
+    }
+}

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

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeWaybillsSubjoinfeeColumn extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('waybills', function (Blueprint $table) {
+            $table->string("subjoin_fee")->nullable()->comment("附加费")->change();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('waybills', function (Blueprint $table) {
+            $table->decimal("subjoin_fee",10,3)->default(0)->comment("附加费")->change();
+        });
+    }
+}

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

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

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

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeColumnToWorkOrders extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('work_orders', function (Blueprint $table) {
+            $table->integer('owner_id')->comment('货主')->change();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('work_orders', function (Blueprint $table) {
+            $table->tinyInteger('owner_id')->comment('货主')->change();
+        });
+    }
+}

+ 1 - 1
resources/js/vue/tree.vue

@@ -2,7 +2,7 @@
     <ul class="tree">
         <li v-for="item in list" :id="'li-'+item.id">
             <div class="custom-control custom-checkbox mb-3">
-                <input @change="checkedData(item.id,$event)" type="checkbox" class="custom-control-input" :value="item.id" :id="'check-'+item.id">
+                <input @change="checkedData(item.id,$event)" name="treeData[]" type="checkbox" class="custom-control-input" :value="item.id" :id="'check-'+item.id">
                 <label class="custom-control-label" :for="'check-'+item.id"></label>
                 <label style="cursor: pointer;" @click.prevent.stop="unfold(item.id)">{{item[column]}}&nbsp;
                 <i v-if="item.child && item.child.length>0" :id="'item-fa-'+item.id" class="fa fa-plus-circle"></i>

+ 82 - 0
resources/views/maintenance/user/create.blade.php

@@ -207,6 +207,58 @@
                                 </div>
                             </div>
 
+                            {{-- 工作组、项目组开始  --}}
+
+                            <div class="form-group row ">
+                                    <div class="col-6">
+                                        <div class="card-header row">
+                                            <div class="col-4">
+                                                <div class="pull-left h5 font-weight-bold mr-3">工作组</div>
+                                                <div class="pull-left text-muted">
+                                                    <div class="custom-control custom-checkbox">
+                                                        <input type="checkbox" class="custom-control-input" id="check-works" @change="hideNoSelected('workGroup',$event.target.checked)">
+                                                        <label class="custom-control-label ml-0" for="check-works">已拥有</label>
+                                                    </div>
+                                                </div>
+                                            </div>
+                                            <div class="col-5">
+                                                <div class="btn-group">
+                                                    <a class="btn border btn-primary" @click="expand(true)">展开全部</a>
+                                                    <a class="btn border btn-primary" @click="expand(false)">收起全部</a>
+                                                </div>
+                                            </div>
+                                        </div>
+                                        <div class="card-body overflow-scrollbar-200" style="max-height: 400px" id="workGroup">
+                                            <tree :list="workGroup" :column="'name'" ></tree>
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <div class="card-header row">
+                                            <div class="pull-left h5 font-weight-bold mr-3">项目组</div>
+                                            <div class="pull-left text-muted">
+                                                <div class="custom-control custom-checkbox">
+                                                    <input type="checkbox" class="custom-control-input" id="check-ownerGroups" @change="hideNoSelected('ownerGroup',$event.target.checked)">
+                                                    <label class="custom-control-label ml-0" for="check-ownerGroups">已拥有</label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                        <div class="card-body overflow-scrollbar-200" style="max-height: 400px">
+                                            <ul class="list-group">
+                                                <li class="list-group-item" v-for="owner in ownerGroup" v-show="!owner.hide">
+                                                    <div class="form-check">
+                                                        <label class="form-check-label w-100">
+                                                            <input type="checkbox" class="form-check-input" name="ownerGroup[]" v-model="ownerGroups"  :value="owner.id">@{{ owner.name }}
+                                                        </label>
+                                                    </div>
+                                                </li>
+                                            </ul>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            {{-- 工作组、项目组结束--}}
+
+
                             <input type="hidden" value="{{url('maintenance/user/create')}}">
                             <div class="form-group row mb-0">
                                 <div class="col-md-7 offset-md-4">
@@ -283,6 +335,13 @@
                 ],
                 supplier: [{{old('supplier')}}],
                 suppliersList: [],
+
+                workGroup: [@foreach($workGroup as $wg)@json($wg),@endforeach],
+                ownerGroup: [@foreach($ownerGroup as $group)@json($group),@endforeach],
+                ownerGroups: []
+            },
+            components:{
+                'tree':"url:{{asset("js/vue/tree.vue")}}"
             },
             mounted: function () {
                 $(".tooltipTarget").tooltip({ boundary: 'window' });
@@ -531,6 +590,29 @@
                         $(".tooltipTarget").tooltip({ boundary: 'window' });
                     }, 10 )
                 },
+
+                expand(isExpand){
+                    if (isExpand) $("#workGroup .up").slideDown();
+                    else $("#workGroup .up").slideUp();
+                },
+                hideNoSelected(type,isHide = true){
+                    switch (type) {
+                        case "ownerGroup":
+                            this.owners.forEach((owner,i)=>{
+                                let check =  isHide;
+                                if (owner.hide !== check)this.$set(this.owners[i],"hide",check);
+                            });
+                            break;
+                        case "workGroup":
+                            let nodes = document.getElementById("workGroup").getElementsByTagName("INPUT");
+                            for (let i=0;i<nodes.length;i++){
+                                if (!nodes[i].checked && isHide)nodes[i].parentElement.parentElement.className = "d-none";
+                                else nodes[i].parentElement.parentElement.className = "";
+                            }
+                            break;
+                        default: break;
+                    }
+                },
             },
         });
 

+ 119 - 0
resources/views/maintenance/user/edit.blade.php

@@ -140,6 +140,63 @@
                             </div>
                         </div>
                     </div>
+
+                    {{-- 工作组、项目组开始  --}}
+                    <hr class="col-8 offset-2 border-info">
+                    <div class="col-8 offset-2 border-info">
+                        <div class="form-group row ">
+                            <div class="col-6">
+                                <div class="card-header row">
+                                    <div class="col-4">
+                                        <div class="pull-left h5 font-weight-bold mr-3">工作组</div>
+                                        <div class="pull-left text-muted">
+                                            <div class="custom-control custom-checkbox">
+                                                <input type="checkbox" class="custom-control-input" id="check-works" @change="hideNoSelected('workGroup',$event.target.checked)">
+                                                <label class="custom-control-label ml-0" for="check-works">已拥有</label>
+                                            </div>
+                                        </div>
+                                    </div>
+                                    <div class="col-5">
+                                        <div class="btn-group">
+                                            <a class="btn border btn-primary" @click="expand(true)">展开全部</a>
+                                            <a class="btn border btn-primary" @click="expand(false)">收起全部</a>
+                                        </div>
+                                    </div>
+                                    <div class="col-3">
+                                        <a class="pull-right btn btn-outline-success" @click="saveWorkGroups()">保存</a>
+                                    </div>
+                                </div>
+                                <div class="card-body overflow-scrollbar-200" style="max-height: 400px" id="workGroup">
+                                    <tree :list="workGroup" :column="'name'" ></tree>
+                                </div>
+                            </div>
+                            <div class="col-6">
+                                <div class="card-header row">
+                                    <div class="pull-left h5 font-weight-bold mr-3">项目组</div>
+                                    <div class="pull-left text-muted">
+                                        <div class="custom-control custom-checkbox">
+                                            <input type="checkbox" class="custom-control-input" id="check-ownerGroups" @change="hideNoSelected('ownerGroup',$event.target.checked)">
+                                            <label class="custom-control-label ml-0" for="check-ownerGroups">已拥有</label>
+                                        </div>
+                                    </div>
+                                    <a class="pull-right btn btn-outline-success" @click="saveOwnerGroups()">保存</a>
+                                </div>
+                                <div class="card-body overflow-scrollbar-200" style="max-height: 400px">
+                                    <ul class="list-group">
+                                        <li class="list-group-item" v-for="owner in ownerGroup" v-show="!owner.hide">
+                                            <div class="form-check">
+                                                <label class="form-check-label w-100">
+                                                    <input type="checkbox" class="form-check-input" name="ownerGroup[]" v-model="ownerGroups"  :value="owner.id">@{{ owner.name }}
+                                                </label>
+                                            </div>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    {{-- 工作组、项目组结束--}}
+
                     <hr class="col-8 offset-2 border-info">
                     <div class="form-group row">
                         <div class="col-8 offset-2">
@@ -226,6 +283,16 @@
                     @endif
                 ],
                 suppliersList: [],
+
+                workGroup: [@foreach($workGroup as $wg)@json($wg),@endforeach],
+                workGroups: [@foreach($workGroups as $wgs)@json($wgs),@endforeach],
+
+                ownerGroup: [@foreach($ownerGroup as $group)@json($group),@endforeach],
+                ownerGroups: [@foreach($ownerGroups as $groups){!! "'".$groups."'" !!},@endforeach],
+                isFirst:0,
+            },
+            components:{
+                'tree':"url:{{asset("js/vue/tree.vue")}}"
             },
             mounted:function(){
                 $(".tooltipTarget").tooltip({'trigger':'hover'});
@@ -481,6 +548,58 @@
                         }
                     }
                 },
+
+                hideNoSelected(type,isHide = true){
+                    switch (type) {
+                        case "ownerGroup":
+                            this.owners.forEach((owner,i)=>{
+                                let check =  !this._includes(ownerGroups,owner.id) && isHide;
+                                if (owner.hide !== check)this.$set(this.owners[i],"hide",check);
+                            });
+                            break;
+                        case "workGroup":
+                            let nodes = document.getElementById("workGroup").getElementsByTagName("INPUT");
+                            for (let i=0;i<nodes.length;i++){
+                                if (!nodes[i].checked && isHide)nodes[i].parentElement.parentElement.className = "d-none";
+                                else nodes[i].parentElement.parentElement.className = "";
+                            }
+                            break;
+                        default: break;
+                    }
+                },
+                expand(isExpand){
+                    if (isExpand) $("#workGroup .up").slideDown();
+                    else $("#workGroup .up").slideUp();
+                },
+                _includes(arr,id){
+                    return !(arr.every(data=>{
+                        return !(data==id);
+                    }));
+                },
+                saveWorkGroups(){
+                    let workGroups = [];
+                    let nodes = document.getElementById("workGroup").getElementsByTagName("INPUT");
+                    for (let i=0;i<nodes.length;i++)if (nodes[i].checked)workGroups.push(nodes[i].value);
+                    window.tempTip.postBasicRequest("{{url('maintenance/user/saveWorkGroups')}}",{id:"{{$user->id}}",workGroups:workGroups},()=>{
+                        return "保存成功";
+                    });
+                },
+                saveOwnerGroups(){
+                    window.tempTip.postBasicRequest("{{url('maintenance/user/saveOwnerGroups')}}",{id:"{{$user->id}}",ownerGroups:this.ownerGroups},()=>{
+                        return "保存成功";
+                    });
+                },
+            },
+            updated() {
+                if (this.isFirst == 0){
+                    let nodes = document.getElementById("workGroup").getElementsByTagName("INPUT");
+                    for (let i=0;i<nodes.length;i++){
+                        let checked = this._includes(this.workGroups,nodes[i].value);
+                        if (nodes[i].checked!==checked)nodes[i].checked = checked;
+                        this.isFirst = 1;
+                    }
+                }
+
             }
         });
 

+ 27 - 0
resources/views/order/workOrder/_edit_issue_type.blade.php

@@ -0,0 +1,27 @@
+<div class="modal fade" id="edit-issue-type-type-modal" data-backdrop="static" data-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true" z-index="51">
+    <div class="modal-dialog">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="edit-issue-type-type">问题件类型修改</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <div class="form-group">
+                    <label for="">
+                        问题件类型
+                    </label>
+                    <select v-model="selectIssueType" class="form-control">
+                        <option value=""></option>
+                        <option v-for="type in orderIssueTypes" :value="type.name">@{{ type.value }}</option>
+                    </select>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button @click="selectIssueType = ''" type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
+                <button @click="editOrderIssueType" type="button" class="btn btn-primary">提交</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 164 - 83
resources/views/order/workOrder/index.blade.php

@@ -26,10 +26,21 @@
                         </button>
                         </span>
                     @endcan
+                    <span class="ml-1">
+                    <button type="button" class="btn btn-outline-dark btn-sm form-control-sm  tooltipTarget"
+                            @click="copyLogisticNumber()" style="background: #dad7e8;">批量复制单号</button>
+                    </span>
+                    @can('订单管理-工单处理-审核')
+                        <span class="ml-1">
+                        <button type="button" class="btn btn-outline-success btn-sm form-control-sm  tooltipTarget"
+                                @click="showEditIssueType">
+                            批量修改问题件类型
+                        </button>
+                        </span>
+                    @endcan
                 </div>
 
                 <div>
-
                     <table class="table table-sm table-striped table-hover table-bordered td-min-width-80" id="table">
                         <tbody class="">
                         <template v-for="(item,i) in workOrders">
@@ -43,18 +54,21 @@
                                 </td>
                                 <td class="text-center">
                                     @can('订单管理-订单问题件生成')
-                                        <button class="btn btn-sm btn-outline-primary" @click="createOrderIssue(item,true)" v-show="!item.is_issue_order ">
+                                        <button class="btn btn-sm btn-outline-primary"
+                                                @click="createOrderIssue(item,true)" v-show="!item.is_issue_order ">
                                             生成问题件
                                         </button>
                                     @endcan
                                     @can('订单管理-工单处理-审核')
-                                        <button class="btn btn-sm btn-outline-success" v-show="item.status !== '已处理'" @click="review(item,i)">
+                                        <button class="btn btn-sm btn-outline-success" v-show="item.status !== '已处理'"
+                                                @click="review(item,i)">
                                             审核
                                         </button>
                                     @endcan
                                 </td>
-                                <td>@{{item.type ? item.type.name : '' }}</td>
                                 <td class="text-center">@{{ item.status }}</td>
+                                <td class="text-center">@{{ item.owner ? item.owner.name : '' }}</td>
+                                <td class="text-center">@{{ item.order ? item.order.client_code : ''}}</td>
                                 <td>@{{item.order ? (item.order.logistic ? item.order.logistic.name : '') : '' }}</td>
                                 <td class="text-center">
                                     <template v-if="item.order">
@@ -88,9 +102,11 @@
                                         <select class="form-control form-control-sm"
                                                 :disabled="item.review_at || item.is_issue_order"
                                                 :value="item.order_issue_type_id"
-                                                @change="changeIssueType(item,$event)" >
+                                                @change="changeIssueType(item,$event)">
                                             <option value="0"></option>
-                                            <option  v-for="type in orderIssueTypes" :value="type.name">@{{ type.value }}</option>
+                                            <option v-for="type in orderIssueTypes" :value="type.name">@{{ type.value
+                                                }}
+                                            </option>
                                         </select>
                                     @else
                                         @{{ item.issue_type ?  item.issue_type.name : '' }}
@@ -99,7 +115,7 @@
                                 <td class="text-center">@{{ item.remark }}</td>
 
                                 <td class="text-center">
-                                        @{{ item.result_explain ?item.result_explain : '' }}
+                                    @{{ item.result_explain ?item.result_explain : '' }}
                                 </td>
                                 <td class="text-center">
                                     @{{ item.issue_order_type ?item.issue_order_type : '' }}
@@ -117,29 +133,30 @@
                                         </template>
                                         <template v-else>
                                             <transition name="fade">
-                                            <table class="table table-sm m-0" v-if="selectOrderIssue === item.id">
+                                                <table class="table table-sm m-0" v-if="selectOrderIssue === item.id">
 
                                                     <tr v-for="log in item.issue_logs">
                                                         <td>@{{ log.content }}</td>
                                                         <td>@{{ log.username }}</td>
                                                         <td>@{{ log.created_at }}</td>
                                                     </tr>
-                                            </table>
+                                                </table>
                                             </transition>
                                             <transition name="fade">
-                                            <table class="table table-sm m-0" v-if="electOrderIssue !== item.id">
-                                                <tr>
-                                                <td>@{{ item.issue_logs[0].content }}</td>
-                                                <td>@{{ item.issue_logs[0].username }}</td>
-                                                <td>@{{ item.issue_logs[0].created_at }}</td>
-                                                </tr>
-                                            </table>
+                                                <table class="table table-sm m-0" v-if="selectOrderIssue !== item.id">
+                                                    <tr>
+                                                        <td>@{{ item.issue_logs[0].content }}</td>
+                                                        <td>@{{ item.issue_logs[0].username }}</td>
+                                                        <td>@{{ item.issue_logs[0].created_at }}</td>
+                                                    </tr>
+                                                </table>
                                             </transition>
                                             <button class="btn btn-sm btn-outline-primary"
                                                     v-show="selectOrderIssue !== item.id"
                                                     @click="selectOrderIssue = item.id">展开
                                             </button>
-                                            <button class="btn btn-sm btn-outline-primary" v-show="selectOrderIssue === item.id"
+                                            <button class="btn btn-sm btn-outline-primary"
+                                                    v-show="selectOrderIssue === item.id"
                                                     @click="selectOrderIssue = null">收起
                                             </button>
                                         </template>
@@ -187,18 +204,22 @@
                     {{ $workOrders->withQueryString()->links() }}
                 </div>
             </div>
+            @can('订单管理-工单处理-审核')
+                @include('order.workOrder._edit_issue_type')
+            @endcan
         </div>
     </div>
 @endsection()
 
 @section("lastScript")
     <script type="text/javascript" src="{{asset('js/queryForm/queryForm.js')}}"></script>
-    <script type="text/javascript" src="{{asset('js/queryForm/header.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
     <style>
         .fade-enter-active, .fade-leave-active {
             transition: opacity .5s;
         }
-        .fade-enter, .fade-leave-to  {
+
+        .fade-enter, .fade-leave-to {
             opacity: 0;
         }
     </style>
@@ -216,17 +237,24 @@
                     },
                     @endforeach
                 ],
-                orderIssueTypes:[
-                    @foreach($orderIssueTypes as $type)
-                    {name:'{{$type->id}}',value:"{{$type->name}}"},
+                orderIssueTypes: [
+                        @foreach($orderIssueTypes as $type)
+                    {
+                        name: '{{$type->id}}', value: "{{$type->name}}"
+                    },
+                    @endforeach
+                ],
+                owners:[
+                    @foreach($owners as $owner)
+                    {name:'{{$owner->id}}',value:'{{$owner->name}}'},
                     @endforeach
                 ],
                 selectOrderPackage: null,
                 selectOrder: null,
-                selectOrderIssue:null,
+                selectOrderIssue: null,
+                selectIssueType: '',
             },
             mounted() {
-                console.log();
                 let data = [[
                     {name: 'created_at_start', type: 'time', tip: ['工单创建开始日期', '时间']},
                     {name: 'created_at_end', type: 'time', tip: ['工单创建结束日期', '时间']},
@@ -237,24 +265,26 @@
                         tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的承运商'],
                         placeholder: ['承运商', '定位或多选承运商']
                     },
-                    {name: 'logistic_number', type: 'input', placeholder: '快递单号'},
+                    @can('订单管理-订单问题件生成')
                     {
-                        name: 'grad',
-                        type: 'select',
-                        placeholder: '工单等级',
-                        data: [{name: 1, value: '一般'}, {name: 2, value: '重要'}, {name: 3, value: '紧急'}, {
-                            name: 4,
-                            value: '重要且紧急'
-                        },]
+                        name: 'owner',
+                        type: 'select_multiple_select',
+                        data: this.owners,
+                        tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的货主'],
+                        placeholder: ['货主', '定位或多选货主']
                     },
+                    @endcan
+                    {name: 'logistic_number', type: 'input', placeholder: '快递单号'},
                     {
                         name: 'is_issue_order',
                         type: 'select',
                         placeholder: '问题件',
                         data: [{name: 'true', value: '有'}, {name: 'false', value: '无'}]
                     },
+                    {name: 'creator', type: 'input', placeholder: '创建人'},
                 ], [{name: 'review_at_start', type: 'time', tip: ['工单审核开始日期', '时间']},
                     {name: 'review_at_end', type: 'time', tip: ['工单审核结束日期', '时间']},
+                    {name: 'order_issue_type', type: 'select', placeholder: '问题件类型', data: this.orderIssueTypes},
                     {name: 'is_review', type: 'checkbox', tip: '是否审核', data: [{name: 'true', value: '已审核'}]},
                 ]];
                 this.form = new query({
@@ -265,33 +295,37 @@
                 let column = [
                     {name: 'no', value: '序号', neglect: true},
                     {name: 'operation', value: '操作', neglect: true},
-                    {name: 'type', value: '相关类型'},
-                    {name: 'status', value: '状态'},
-                    {name: 'logisticName', value: '承运商'},
+                    {name: 'status', value: '状态',neglect: true},
+                    {name: 'owner', value: '货主',neglect: true},
+                    {name: 'client_code', value: '订单号',neglect: true},
+                    {name: 'logisticName', value: '承运商',neglect: true},
                     {name: 'logisticNumber', value: '快递单号'},
                     {name: 'issueType', value: '问题件类型'},
-                    {name: 'workOrderInfo', value: '问题描述'},
-                    {name:'result_explain',value:'情况说明'},
-                    {name:'orderIssueType',value:'问题件类别'},
-                    {name:'orderIssueProcessLogs',type:'multi',title:"处理结果",rows:[
-                            {value:"内容",col:"4"},
-                            {value:"操作人",col:"4"},
-                            {value:"时间",col:"4"},
-                    ]},
+                    {name: 'workOrderInfo', value: '问题描述',neglect: true},
+                    {name: 'result_explain', value: '情况说明',neglect: true},
+                    {name: 'orderIssueType', value: '问题件类别'},
+                    {
+                        name: 'orderIssueProcessLogs', type: 'multi', title: "处理结果", rows: [
+                            {value: "内容", col: "4"},
+                            {value: "操作人", col: "4"},
+                            {value: "时间", col: "4"},
+                        ],neglect: true
+                    },
                     {name: 'Info', value: '物流跟踪信息', neglect: true},
-                    {name: 'creator', value: '创建人'},
-                    {name: 'submit_at', value: '提交时间'},
-                    {name: 'reviewer', value: '审核人'},
-                    {name: 'review_at', value: '审核时间'},
+                    {name: 'creator', value: '创建人',neglect: true},
+                    {name: 'submit_at', value: '提交时间',neglect: true},
+                    {name: 'reviewer', value: '审核人',neglect: true},
+                    {name: 'review_at', value: '审核时间',neglect: true},
                 ];
 
                 new Header({
                     el: "table",
-                    name: "area",
+                    name: "workOrders",
                     column: column,
                     data: this.workOrders,
                     fixedTop: ($('#form_div').height()) + 2,
                 }).init();
+
                 $("#list").removeClass("d-none");
             },
             created() {
@@ -306,17 +340,17 @@
                 sortOrder(workOrder) {
                     let self = this;
                     if (!workOrder.order) return;
-                    if (workOrder.order_issue){
+                    if (workOrder.order_issue) {
                         workOrder.result_explain = workOrder.order_issue.result_explain;
-                        if (workOrder.order_issue.issue_type){
+                        if (workOrder.order_issue.issue_type) {
                             workOrder.issue_order_type = workOrder.order_issue.issue_type.name;
                         }
-                        if (workOrder.order_issue.logs){
-                            workOrder.issue_logs  = workOrder.order_issue.logs.map(item=>{
+                        if (workOrder.order_issue.logs) {
+                            workOrder.issue_logs = workOrder.order_issue.logs.map(item => {
                                 return {
-                                    username : item.user ? item.user.name : '',
+                                    username: item.user ? item.user.name : '',
                                     content: item.content,
-                                    created_at : item.created_at
+                                    created_at: item.created_at
                                 };
                             });
                         }
@@ -359,14 +393,14 @@
                     if (tag) data.ids = [item.id];
                     else data.ids = checkData;
                     if (!confirm('是否生成对应的问题件')) return;
-                    let _this =this;
+                    let _this = this;
                     window.axios.post(url, data).then(res => {
                         if (res.data.success) {
-                            res.data.data.forEach(item=>{
-                                this.workOrders.forEach((workOrder,i)=>{
-                                    if (item.id === workOrder.id){
+                            res.data.data.forEach(item => {
+                                this.workOrders.forEach((workOrder, i) => {
+                                    if (item.id === workOrder.id) {
                                         _this.sortOrder(item);
-                                        _this.$set(_this.workOrders,i,item);
+                                        _this.$set(_this.workOrders, i, item);
                                     }
                                 });
                             });
@@ -391,35 +425,40 @@
                         return selected.includes(item.id + '');
                     });
                 },
-                exportText(){
+                exportText() {
                     let items = this.getMessageWorkOrder();
-                    if (items == null) return ;
+                    if (items == null) return;
                     let text = '';
-                    items.forEach(item=>{
+                    items.forEach(item => {
                         if (item.order) text += this.getExportText(item);
                     });
-                    console.log(text);
                     this.copyText(text);
                 },
-                getExportText(item){
+                getExportText(item) {
                     if (!item.order) return '';
                     if (!item.order.packages) return '';
-                    switch (item.issue_order_type){
+                    let message = '';
+                    let issue_type = item.issue_type? item.issue_type.name : '';
+                    switch (issue_type) {
                         case '拦截':
-                            return this.interceptMessage(item);
-                        case '信息修改':
-                            return this.modificationMessage(item);
-                        default :
-                            return  this.getMessage(item);
+                            message = this.interceptMessage(item);
+                            break;
+                        case '信息更改':
+                            message = this.modificationMessage(item);
+                            break;
+                        default:
+                            message = this.getMessage(item);
+                            break;
                     }
+                    return message;
                 },
                 interceptMessage(item) {
-                    let message  = '';
+                    let message = '';
                     if (item.order.logistic.code.includes('SF') || item.order.logistic.code.includes('ZTO')) {
                         item.order.packages.forEach(node => {
                             message += node.logistic_number + '\n';
                         });
-                        message += message.trim('\n') +  ' ——拦截\n';
+                        message = message.trim('\n') + ' ——拦截\n';
                     } else {
                         let item_order_logistic_name = item.order.logistic.name;
                         let item_order_adder = item.order.consignee_name + ' '
@@ -428,7 +467,7 @@
                         item.order.packages.forEach(p => {
                             if (p) message += item_order_logistic_name + ' ' + p.logistic_number + ' ' + item_order_adder + '\n';
                         });
-                        message += message.trim('\n') +  ' ——拦截\n';
+                        message = message.trim('\n') + ' ——拦截\n';
                     }
                     return message;
                 },
@@ -437,6 +476,7 @@
                     let logistic_code = item.order.logistic.code;
                     let adder = item.order.consignee_name + ' ' + item.order.consignee_phone + ' '
                         + item.order.province + ' ' + item.order.city + ' ' + item.order.district + ' ' + item.order.address;
+
                     item.order.packages.forEach(node => {
                         if (logistic_code.includes('SF')) { // 顺丰订单
                             message += node.logistic_number + ' ——改信息: ' + item.remark + ',运费到付或月结' + '\n';
@@ -448,13 +488,13 @@
                     });
                     return message;
                 },
-                getMessage(item){
+                getMessage(item) {
                     let message = '';
                     if (!item.order.packages) return message;
                     let adder = item.order.consignee_name + ' ' + item.order.consignee_phone + ' '
                         + item.order.province + ' ' + item.order.city + ' ' + item.order.district + ' ' + item.order.address;
-                    item.order.packages.forEach(p=>{
-                        message+= p.logistic_number + '  '+ adder + ' ——描述 '+item.remark+'\n';
+                    item.order.packages.forEach(p => {
+                        message += p.logistic_number + '  ' + adder + ' ——描述 ' + item.remark + '\n';
                     });
                     return message;
                 },
@@ -498,23 +538,64 @@
                         window.tempTip.show(err);
                     })
                 },
-                changeIssueType(item,e){
+                changeIssueType(item, e) {
                     let url = '{{route('workOrder.updateIssueTypeApi')}}';
                     let data = {
-                        id:item.id,
+                        id: item.id,
                         type_id: $(e.target).val()
                     };
-                    window.axios.post(url,data).then(res=>{
-                        if (res.data.success){
+                    window.axios.post(url, data).then(res => {
+                        if (res.data.success) {
                             window.tempTip.showSuccess('修改成功');
                             item.order_issue_type_id = data.type_id;
-                        }else{
+                        } else {
                             window.tempTip.show(res.data.message ? res.data.message : '修改异常');
                         }
-                    }).catch(err=>{
+                    }).catch(err => {
                         window.tempTip.show(err);
                     });
-                }
+                },
+                copyLogisticNumber() {
+                    let items = this.getMessageWorkOrder();
+                    let logistic_numbers = '';
+                    items.forEach(item => {
+                        item.order.packages.forEach(node => {
+                            logistic_numbers += node.logistic_number + '\n';
+                        });
+                    })
+                    this.copyText(logistic_numbers);
+                },
+                showEditIssueType() {
+                    this.selectIssueType = 0;
+                    $("#edit-issue-type-type-modal").modal('show');
+                },
+                editOrderIssueType() {
+                    let url = '{{route('workOrder.batchUpdateIssueTypeApi')}}'
+                    let data = {ids: checkData, type: this.selectIssueType};
+                    let _this = this;
+                    window.tempTip.setIndex(1999);
+                    window.axios.post(url, data).then(res => {
+                        if (res.data.success) {
+                            window.tempTip.showSuccess('修改问题件类型成功');
+
+                            res.data.data.forEach(item => {
+                                _this.sortOrder(item);
+                                _this.workOrders.forEach((workOrder, i, array) => {
+                                    if (workOrder.id === item.id) {
+                                        array[i] = item;
+                                    }
+                                })
+                            });
+                            this.$forceUpdate();
+                            $("#edit-issue-type-type-modal").modal('hide');
+                            return;
+                        }
+                        window.tempTip.show(res.data.message ? res.data.message : '修改异常');
+                    }).catch(err => {
+                        window.tempTip.show(err)
+                    })
+                },
+
             },
         });
     </script>

+ 4 - 0
resources/views/package/logistic/index.blade.php

@@ -194,6 +194,8 @@
                     <td class="text-overflow-warp-200"><span
                             v-if="package.order && package.order.issue && package.order.issue.issue_type">@{{ package.order.issue.issue_type.name }}</span>
                     </td>
+                    <td class="text-overflow-warp-200">@{{ package.order && package.order.batch && package.order.batch.wms_type }}</td>
+                    <td class="text-overflow-warp-200">@{{ package.order.oracle_d_o_c_order_header.waveno??'' }}</td>
                     <td class="text-overflow-warp-200"><span
                             v-if="package.order && package.order.issue && package.order.issue.logs.length >0"><span
                                 v-for="log in package.order.issue.logs">@{{ log.content }}<br></span></span></td>
@@ -444,6 +446,8 @@
                     {name: 'remark', value: '客服备注'},
                     {name: 'result_explain', value: '情况说明'},
                     {name: 'issue_type', value: '问题类别'},
+                    {name: 'wms_type', value: '波次规则'},
+                    {name: 'wave_no', value: '波次号'},
                     {name: 'content', value: '说明'},
                     {name: 'operation_name', value: '操作者'},
                     {name: 'operation_date', value: '时间'},

+ 1 - 8
resources/views/package/measureMonitor/index.blade.php

@@ -128,14 +128,7 @@
                         this.updateData(item);
                         let logistic_name = item.order ? (item.order.logistic ? item.order.logistic.name : '') : '';
                         let logistic_number = item.logistic_number;
-                        if (this.logisticAudioURL[logistic_name]){
-                            audio.src=this.logisticAudioURL[logistic_name];
-                            setTimeout(()=>{
-                                audio.play();
-                            },0);
-                        } else {
-                            this.speech(logistic_name,logistic_number);
-                        }
+                        this.speech(logistic_name,logistic_number);
                         window.tempTip.setDuration(1000);
                         window.tempTip.showSuccess('刷新成功!');
                     }

+ 3 - 3
resources/views/transport/waybill/delivering.blade.php

@@ -87,11 +87,11 @@
                             <div class="mr-3 text-nowrap form-inline" v-if="!waybill.isBtn">
                                 <label :for="'subjoin_fee'+waybill.id">附加费:</label>
                                 <div class="input-group input-group-sm">
-                                    <input :id="'subjoin_fee'+waybill.id" :value="waybill.subjoin_fee" type="number" step="0.01"
+                                    <input :id="'subjoin_fee'+waybill.id" :value="waybill.subjoin_fee"
                                            class="form-control" style="width:150px">
-                                    <span class="input-group-append">
+<!--                                    <span class="input-group-append">
                                       <span class="input-group-text">元</span>
-                                    </span>
+                                    </span>-->
                                 </div>
                             </div>
                             <span class="mr-3 text-nowrap">

+ 10 - 9
resources/views/transport/waybill/edit.blade.php

@@ -744,15 +744,13 @@
                         });
                 },
                 dbwl:function () {
-                    this.waybill.logistic_id = 15;
-                    this.waybill.logistic_id = 15;
-                    this.waybill.amount = 1;
-                    this.waybill.amount_unit_id = 5;
-                    this.waybill.inquire_tel = '13761413262';
-                    this.waybill.dispatch_remark = '13761413262';
-                    let  date = new Date();
-                    this.waybill.deliver_at_date = date.getFullYear()+'-'+("0" + (date.getMonth() + 1)).slice(-2) + '-'+date.getDate();
-                    this.waybill.deliver_at_time = date.getHours()+':'+date.getMinutes();
+                    this.waybill.logistic_id = this.waybill.logistic_id ? this.waybill.logistic_id : 15;
+                    this.waybill.amount = this.waybill.amount ? this.waybill.amount : 1;
+                    this.waybill.amount_unit_id = this.waybill.amount_unit_id ? this.waybill.amount_unit_id : 5;
+                    this.waybill.inquire_tel = this.waybill.inquire_tel ? this.waybill.inquire_tel : '13761413262';
+                    let date = new Date();
+                    this.waybill.deliver_at_date = this.waybill.deliver_at_date ? this.waybill.deliver_at_date : date.getFullYear()+'-'+("0" + (date.getMonth() + 1)).slice(-2) + '-'+("0"+ date.getDate()).slice(-2);
+                    this.waybill.deliver_at_time = this.waybill.deliver_at_time ? this.waybill.deliver_at_time : ("0" + date.getHours()).slice(-2)+':'+("0"+date.getMinutes()).slice(-2);
                 }
             },
             created(){
@@ -762,6 +760,9 @@
                 this.waybill.pay_type = 2;
                 this.waybill.back_sign_bill = 0;
                 this.waybill.package_service = this.packageServices[4];
+                if(this.waybill.type == '德邦物流'){
+                    this.dbwl();
+                }
             }
         });
     </script>

+ 3 - 3
resources/views/transport/waybill/index.blade.php

@@ -842,7 +842,7 @@
                 rendingHeader(){
                     let column = [
                         {name:'operation',value: '操作', neglect: true, class:"td-operation"},
-                        {name:'onTop',value: '置顶', neglect: true, class:"td-operation"},
+                         @can('运输管理-运单-置顶'){name:'onTop',value: '置顶', neglect: true, class:"td-operation"},@endcan
                         {name:'status',value: '状态', class:"td-operation"},
                         {name:'express_face_list',value: '快递面单是否打印', class:"td-warm"},
                         {name:'index',value: '序号', neglect: true, class:"td-warm"},
@@ -1448,7 +1448,6 @@
          */
         function printEWaybill(data, serialNo, barcode, wayNum){
             //打印内容
-            console.log(barcode);
             var printHtml = htmlTemplateObj.find("div#expressPrintArea").html();
 
             LODOP.PRINT_INIT("二级模板");
@@ -1460,7 +1459,8 @@
             LODOP.ADD_PRINT_BARCODE("117mm","45mm","50mm","8mm","128Auto", barcode);
 
             //设定固定打印机
-            if(LODOP.SET_PRINTER_INDEX('EK100B'))LODOP.SET_PRINTER_INDEX('EK100B');
+            let print_name = "{{$print_name}}";
+            if(LODOP.SET_PRINTER_INDEX(print_name))LODOP.SET_PRINTER_INDEX(print_name);
 
             //打印
             // LODOP.PREVIEW();

+ 1 - 0
routes/apiLocal.php

@@ -266,4 +266,5 @@ Route::prefix('workOrder')->group(function(){
     Route::post('batchReview','WorkOrderController@batchReviewApi')->name('workOrder.batchReviewApi');  // 批量审核
     Route::post('buildOrderIssue','WorkOrderController@buildOrderIssueApi')->name('workOrder.buildOrderIssueApi');  // 生成问题件
     Route::post('updateIssueType','WorkOrderController@updateIssueTypeApi')->name('workOrder.updateIssueTypeApi'); // 修改问题类型
+    Route::post('batchUpdateIssueType','WorkOrderController@batchUpdateIssueTypeApi')->name('workOrder.batchUpdateIssueTypeApi'); // 修改问题类型
  });

+ 2 - 0
routes/web.php

@@ -290,6 +290,8 @@ Route::group(['middleware'=>'auth'],function ($route){
         /** 用户 */
         Route::group(['prefix'=>"user"],function (){
             Route::post("resetPassword",'UserController@resetPassword');
+            Route::post("saveWorkGroups",'UserController@saveWorkGroups');
+            Route::post("saveOwnerGroups",'UserController@saveOwnerGroups');
         });
         /** 项目耗材 */
         Route::group(['prefix'=>"ownerMaterial"],function (){

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