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

Merge branch 'work_order_version6' into zengjun

# Conflicts:
#	app/Services/OrderPackageCommoditiesService.php
ajun 4 лет назад
Родитель
Сommit
74dfaaa03a

+ 37 - 13
app/Filters/WorkOrderFilters.php

@@ -13,6 +13,7 @@ use App\WorkOrder;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Gate;
 
 class WorkOrderFilters
 {
@@ -70,22 +71,44 @@ class WorkOrderFilters
         if(isset($this->params['data']))
             $this->id(explode(',',$this->params['data']));
 
-        if (!isset($this->params['owner'])){
-            $this->getOrderQuery()->whereIn('owner_id', app('UserService')->getPermittingOwnerIds(Auth::user())??[]);
-        }
+
+        $this->afterFilter();
+    }
+
+    private function afterFilter(){
+        $orderQuery = $this->getOrderQuery();
 
         $user = Auth::user();
+
         $logistic_ids = App('UserService')->getPermittingLogisticIds($user);
-        $owner_id = app('UserService')->getPermittingOwnerIds($user);
-        if (count($logistic_ids)>=0 && count($owner_id) == 0){
-            $orderIssueIds = OrderIssue::query()->select('id')->whereIn('name',['破损','快递丢件'])->get()->toArray();
-            $orderIssueIds = array_intersect($orderIssueIds,$this->array_filter['order_issue_type']);
-            if (count($orderIssueIds) == 0) unset($this->array_filter['order_issue_type']);
-            else $this->array_filter['order_issue_type'] = $orderIssueIds;
+
+        $owner_ids = app('UserService')->getPermittingOwnerIds($user);
+
+        $this->afterFilterLogistic($orderQuery,$owner_ids,$logistic_ids);
+
+        $this->afterFilterOwner($orderQuery,$owner_ids,);
+    }
+
+    // 可见货主过滤
+    private function afterFilterOwner($orderQuery,$owner_ids)
+    {
+        if(Gate::allows('订单管理-工单处理-客服编辑') || Gate::allows('订单管理-工单处理-承运商编辑')){
+
+        }else if(Gate::allows('订单管理-工单处理-货主编辑')){
+            $orderQuery->whereIn('owner_id',$owner_ids);
+        }
+    }
+
+    // 可见承运商过滤
+    private function afterFilterLogistic($orderQuery,$owner_ids,$logistic_ids)
+    {
+        if(Gate::allows('订单管理-工单处理-客服编辑') || Gate::allows('订单管理-工单处理-货主编辑')){
+            if (!isset($this->params['owner'])){
+                $this->getOrderQuery()->whereIn('owner_id', $owner_ids);
+            }
+        } else if (Gate::allows('订单管理-工单处理-承运商编辑')){
+            $orderQuery->whereIn('logistic_id',array_values($logistic_ids));
         }
-        $this->getOrderQuery()->where(function($query)use ($owner_id,$logistic_ids){
-            $query->whereIn('owner_id',$owner_id)->orWhereIn('logistic_id',$logistic_ids);
-        });
     }
 
     public function beforeApply()
@@ -196,7 +219,8 @@ class WorkOrderFilters
             $this->queryBuilder->whereNotIn('order_id',$orderIssueQuery);
         }
     }
-    // 承运商
+
+    // 承运商筛选
     public function logistic($logistic)
     {
         $orderQuery = $this->getOrderQuery()->whereIn('id',WorkOrder::query()->select('order_id'));

+ 9 - 1
app/Http/Controllers/OrderPackageCommoditiesController.php

@@ -2,11 +2,19 @@
 
 namespace App\Http\Controllers;
 
+use App\Order;
 use App\OrderPackageCommodities;
+use App\Services\OrderPackageCommoditiesService;
+use App\Services\OrderService;
 use Illuminate\Http\Request;
 
 class OrderPackageCommoditiesController extends Controller
 {
-
+    public function getCommoditiesApi(Request $request,OrderService $orderService,OrderPackageCommoditiesService $orderPackageCommoditiesService)
+    {
+        $code = $request->input(['orderNo']);
+        $orderService->syncOrderByCodes([$code]);
+        return $orderPackageCommoditiesService->getCommodities($code);
+    }
 
 }

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

@@ -74,7 +74,7 @@ class UserController extends Controller
     {
         if(!Gate::allows('用户-录入')){ return redirect(url('/'));  }
         $roles=Role::all();
-        $logistics=app('LogisticService')->getSelection(["id","name"],"物流");
+        $logistics=app('LogisticService')->getSelection(["id","name"],null);
         $userWorkgroups=UserWorkgroup::query()->get();
         $suppliers=Supplier::query()->get();
 
@@ -112,7 +112,7 @@ class UserController extends Controller
         $user=$user->loadMissing('userDetail');
         $rolesAll=Role::all();
         $roles=$user->roles()->get();
-        $logistics=app('LogisticService')->getSelection(["id","name"],"物流");
+        $logistics=app('LogisticService')->getSelection(["id","name"],null);
         $logisticUser=$user->logistics()->get();
         $userWorkgroups=UserWorkgroup::query()->get();
         $userWorkgroup=$user->userWorkgroups()->first();

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

@@ -87,7 +87,7 @@ class WorkOrderController extends Controller
         else return  ['success' => false];
     }
 
-    // 遗失工单信息 填充
+    // 货主 遗失工单信息 填充
     public function updateLossApi(Request $request, WorkOrderService $service): array
     {
         if (Gate::denies('订单管理-工单处理-货主编辑'))
@@ -141,6 +141,7 @@ class WorkOrderController extends Controller
         return ['success' => true];
     }
 
+    // 宝时 修改工单状态
     public function updateWorkOrderStatusApi(Request $request): array
     {
         if (Gate::denies('订单管理-工单处理-宝时编辑'))
@@ -155,4 +156,19 @@ class WorkOrderController extends Controller
         return ['success' => true];
     }
 
+    // 承运商处理工单状态
+    public function logisticUpdateWorkOrderStatusApi(Request $request):array
+    {
+        if (Gate::denies('订单管理-工单处理-承运商编辑'))
+            return  ['success' => false,'message' => '没有对应权限'];
+        try {
+            $workOrder = WorkOrder::query()->find($request['id']);
+            $workOrder->work_order_status = $request['work_order_status'];
+            $workOrder->update();
+        } catch (\Exception $e) {
+            return ['success' => false,'message' => '编辑工单状态失败'];
+        }
+        return ['success'=> true];
+    }
+
 }

+ 8 - 0
app/Services/OrderPackageCommoditiesService.php

@@ -9,6 +9,7 @@ use App\OracleDOCOrderDetail;
 use App\OracleDOCOrderHeader;
 use App\Order;
 use App\OrderPackage;
+use App\OrderCommodity;
 use App\OrderPackageCommodities;
 use App\OrderTracking;
 use App\Owner;
@@ -709,4 +710,11 @@ class OrderPackageCommoditiesService
         }
         unset($orderCommodities);
     }
+
+    public function getCommodities($orderNo)
+    {
+        $orderQuery = Order::query()->where('id')->where('code',$orderNo);
+        $orderPackageQuery = OrderPackage::query()->select('id')->where('order_id',$orderQuery);
+        return OrderPackageCommodities::query()->with('commodity')->whereIn('order_package_id',$orderPackageQuery)->get();
+    }
 }

+ 11 - 7
app/Services/WorkOrderCommoditiesService.php

@@ -2,6 +2,7 @@
 
 namespace App\Services;
 
+use App\Commodity;
 use App\Traits\ServiceAppAop;
 use App\WorkOrder;
 use App\WorkOrderCommodities;
@@ -9,23 +10,26 @@ use App\WorkOrderCommodities;
 class WorkOrderCommoditiesService
 {
     use ServiceAppAop;
-    protected $modelClass=WorkOrderCommodities::class;
 
-    public function createWorkOrderCommodityByJson(WorkOrder  $workOrder,$json)
+    protected $modelClass = WorkOrderCommodities::class;
+
+    public function createWorkOrderCommodityByJson(WorkOrder $workOrder, $json)
     {
-        $obj =  json_decode($json);
-        $workOrder->commodities()->create(['sku'=>$obj->sku,'amount'=>$obj->amount,'commodity_id'=>$obj->commodity_id]);
+        $obj = json_decode($json);
+        $owner_id = $workOrder->order->owner_id ?? '';
+        $commodity = Commodity::query()->where('owner_id', $owner_id)->where('sku', $obj->sku)->first();
+        $workOrder->commodities()->create(['sku' => $obj->sku, 'amount' => $obj->amount, 'commodity_id' => $commodity->id ?? '']);
     }
 
     /**
      * 工单详情
-     * @param $workOrder
+     * @param $workOrder $workOrder
      * @param $array
      */
-    public function createWorkOrderCommoditiesByJsonArray($workOrder,$array)
+    public function createWorkOrderCommoditiesByJsonArray(WorkOrder $workOrder, $array)
     {
         foreach ($array as $json) {
-            $this->createWorkOrderCommodityByJson($workOrder,$json);
+            $this->createWorkOrderCommodityByJson($workOrder, $json);
         }
     }
 }

+ 17 - 11
app/Services/WorkOrderService.php

@@ -12,6 +12,7 @@ use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Support\Carbon;
 use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Gate;
 
 class WorkOrderService
 {
@@ -25,12 +26,12 @@ class WorkOrderService
      */
     public function getIssueType()
     {
-        $user = Auth::user();
-        $logistic_ids = App('UserService')->getPermittingLogisticIds($user);
-        if ($user->isSuperAdmin() || count($logistic_ids) == 0) {
+        if (Gate::allows('订单管理-工单处理-客服编辑') || Gate::allows('订单管理-工单处理-货主编辑')) {
             return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '其他', '快递异常', '错漏发', '破损', '快递丢件'])->get();
+        } else if (Gate::allows('订单管理-工单处理-承运商编辑')) {
+            return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '破损', '快递丢件'])->get();
         }
-        return OrderIssueType::query()->whereIn('name', ['破损', '快递丢件'])->get();
+        return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '其他', '快递异常', '错漏发', '破损', '快递丢件'])->get();
     }
 
     /**
@@ -74,6 +75,7 @@ class WorkOrderService
             'order_issue_type_id' => $orderIssueType->id,
             'uniquely_tag' => $order->code,
             'status' => 1,
+            'work_order_status' => 1
         ]);
         $workOrder->notification();
         return $workOrder;
@@ -148,7 +150,11 @@ class WorkOrderService
         $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '信息更改']);
         $order = Order::query()->where('code', $param['order_no'])->first();
         $remake = $param['remark'] ?? '';
-        return $this->createAndNotification($order, $orderIssueType, $remake);
+
+        $workOrder = $this->createAndNotification($order, $orderIssueType, $remake);
+//        $workOrder->update(['work_order_status' => ]); // 标记信息已填写
+
+        return $workOrder;
     }
 
     /**
@@ -233,7 +239,7 @@ class WorkOrderService
         try {
             return app('OrderIssueService')->buildOrderIssue($inner_params);
         } catch (\Exception $e) {
-            return ['success'=>false,'message' => '刷新页面后重试'];
+            return ['success' => false, 'message' => '刷新页面后重试'];
         }
     }
 
@@ -293,18 +299,18 @@ class WorkOrderService
 
     public function tagWorkOrder(&$orders)
     {
-        $orderNos = data_get($orders,'*.orderno');
-        $workOrders = WorkOrder::query()->with('order')->where('order_id',function($query)use($orderNos) {
+        $orderNos = data_get($orders, '*.orderno');
+        $workOrders = WorkOrder::query()->with('order')->whereIn('order_id', function ($query) use ($orderNos) {
             $query->from('orders')->select('id')->whereIn('code', $orderNos);
         })->get();
         $tags = [];
-        $workOrders->each(function($workOrder)use(&$tags){
+        $workOrders->each(function ($workOrder) use (&$tags) {
             $order_code = $workOrder->order->code ?? null;
-            if ($order_code) $tags[$order_code]= true;
+            if ($order_code) $tags[$order_code] = true;
         });
 
         foreach ($orders as &$order) {
-            if (array_key_exists($order->orderno,$tags)) $order->is_work_order= true;
+            if (array_key_exists($order->orderno, $tags)) $order->is_work_order = true;
             else $order->is_work_order = false;
         }
     }

+ 1 - 1
app/User.php

@@ -174,7 +174,7 @@ class User extends Authenticatable
         return array_unique($labor_company_ids);
     }
 
-    // 用户可见货主
+    // 用户可见承运商
     public function getPermittingLogisticIdsAttribute(): array
     {
         if ($this->isSuperAdmin()){

+ 1 - 1
app/WorkOrder.php

@@ -47,7 +47,7 @@ class WorkOrder extends Model
         ],
         'work_order_status' => [
             '' => 0,
-            '信息未填写' => 1,
+            '创建' => 1,
             '信息已填写' => 2,
             '快递已处理' => 3,
             '工单完成' => 4,

+ 4 - 4
app/WorkOrderDetail.php

@@ -15,10 +15,10 @@ class WorkOrderDetail extends Model
 
     protected $fillable = [
         'work_order_id',
-        'price',  // 商品价值
-        'sku_amount', // 破损sku数
-        'receive_address', // 收方信息
-        'reissue_logistic_number', // 补发单号
+        'price',                    // 商品价值
+        'sku_amount',               // 破损sku数
+        'receive_address',          // 收方信息
+        'reissue_logistic_number',  // 补发单号
         'return_logistic_number',   // 退回单号
         'logistic_number',
     ];

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

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class WorkOrderDetailsDropColumnSkuAmount extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('work_order_details', function (Blueprint $table) {
+            $table->dropColumn('sku_amount');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('work_order_details', function (Blueprint $table) {
+            $table->tinyInteger('sku_amount')->comment('破损sku数量');
+        });
+    }
+}

+ 9 - 32
resources/views/order/index/_work_order_modal.blade.php

@@ -41,7 +41,7 @@
                 {{--快递单号--}}
                 <div class="form-group row" v-if="'破损' === workOrder.orderIssueType">
                     <label for="work-order-logistic-number"
-                           class="col-sm-2 col-form-label text-right text-primary">快递单号</label>
+                           class="col-sm-2 col-form-label text-right text-primary">退回单号</label>
                     <div class="col-sm-10">
                         <input type="text" id="work-order-logistic-number" class="form-control"
                                v-model="workOrder['logistic_number']" placeholder="快递单号">
@@ -126,14 +126,6 @@
                     </div>
                 </div>
 
-                <div class="form-group row" v-if="'破损' === workOrder.orderIssueType">
-                    <label for="work-order-sku-amount"
-                           class="col-sm-2 col-form-label text-right text-primary">破损sku编号数量</label>
-                    <div class="col-sm-10">
-                        <input type="number" id="work-order-sku-amount" class="form-control"
-                               v-model="workOrder['sku_amount']" placeholder="破损sku编号数量">
-                    </div>
-                </div>
                 <hr v-if="'破损' === workOrder.orderIssueType">
                 <div class="form-group row" v-if="'破损' === workOrder.orderIssueType">
                     <label for="work-order-sku-amount"
@@ -141,39 +133,24 @@
                     <div class="col-sm-10">
                         <table class="table table-sm table-active table-grid-row">
                             <tr class="text-center">
-                                <th>sku</th>
+                                <th>商品编码</th>
                                 <th>商品名称</th>
                                 <th>数量</th>
-                                <th>操作</th>
+                                <th>选中</th>
                             </tr>
                             <tr v-for="(item,i) in workOrder.commodities" :key="i" class="text-center">
-                                <td>@{{ item.sku }}</td>
-                                <td>@{{ item.commodity.name }}</td>
-                                <td>@{{ item.amount }}</td>
+                                <td><span v-text="item.sku"></span></td>
+                                <td><span v-text="item.name"></span></td>
                                 <td>
-                                    <button type="button" class="btn btn-sm btn-danger"
-                                            @click="workOrder.commodities.splice(i,1)">取消
-                                    </button>
+                                    <input type="number" class="form-control form-control-sm" v-model="item.amount">
+                                </td>
+                                <td>
+                                    <button type="button" class="btn btn-sm btn-outline-danger" @click="workOrder.commodities.splice(i,1)">删除</button>
                                 </td>
                             </tr>
                         </table>
                     </div>
                 </div>
-                <div class="form-group row" v-if="'破损' === workOrder.orderIssueType">
-                    <label for="work-order-sku-amount" class="col-sm-2 col-form-label text-right "> 添加</label>
-                    <div class="col-sm-10  col-sm-offset-2 form-group form-inline">
-                        <div class="col-4">
-                            <input type="text" class="form-control" placeholder="sku编号" name="sku" id="commodity-sku" ref="commodity-sku">
-                         </div>
-                        <div class="col-4">
-                            <input type="number" class="form-control form-control-static" placeholder="数量" name="amount" ref="commodity-amount"
-                               id="commodity-amount">
-                        </div>
-                        <div class="col-4">
-                            <button type="button" class="btn btn-sm btn-outline-success col-4" @click="addCommodity">添加</button>
-                        </div>
-                    </div>
-                </div>
             </div>
             <hr v-if="'破损' === workOrder.orderIssueType">
             <div class="modal-footer">

+ 27 - 68
resources/views/order/index/delivering.blade.php

@@ -402,7 +402,6 @@
                     dealImages: [], // 交易截图
                     commodities: [],
                     logistic_number: null, // 快递单号
-                    sku_amount: 0, // sku商品总数
                     price: null,
                 },
                 grads: [
@@ -620,7 +619,13 @@
                 result_explain: function () {
                     this.setLogisticInfo();
                     this.setMerchantInfo();
-                }
+                },
+                'workOrder.orderIssueType':function(newValue){
+                    if (newValue === null) return;
+                    if (newValue === '破损'){
+                        this.fillWorkOrderCommodity();
+                    }
+                },
             },
             methods: {
                 initData() {
@@ -1211,12 +1216,11 @@
                 showInterceptModel() {
                     this.workOrder.grad = 1;
                     if (checkData.length < 1) {
+                        window.tempTip.setDuration(1500);
                         window.tempTip.show('未选中任何订单');
                         return;
                     }
                     this.workOrder.orderIssueType = null;
-                    //this.workOrder.remark.info = null;
-                    // this.workOrder.info = null;
                     this.workOrder.price = null;
                     this.workOrder.refundImages = [];
                     this.workOrder.packageImages = [];
@@ -1225,7 +1229,6 @@
                     this.workOrder.remark.info = '';
                     this.workOrder.commodities = [];
                     this.workOrder.logistic_number = null;
-                    this.workOrder.sku_amount = 0;
                     $('#intercept-modal').modal('show');
                 },
                 checkOrderIssue(name) {  //
@@ -1313,7 +1316,6 @@
                     formData.append('type', '破损');
                     formData.append('logistic_number', this.workOrder.logistic_number);
                     formData.append('price', this.workOrder.price);
-                    formData.append('sku_amount', this.workOrder.sku_amount);
                     this.setFormDataImagePrefix(formData, 'packageImages', packageImages);
                     this.setFormDataImagePrefix(formData, 'commodityImages', commodityImages);
                     this.setFormDataImagePrefix(formData, 'dealImages', dealImages);
@@ -1322,10 +1324,10 @@
                 },
                 createDamagedWorkOrder() { //破损工单创建
                     if (!this.checkDamagedWorkOrder())return;
-                    let packageImages = this.getImages(this.workOrder.packageImages);  // 外包装破损图片
-                    let commodityImages = this.getImages(this.workOrder.commodityImages); // 内物破损图片
-                    let dealImages = this.getImages(this.workOrder.dealImages); // 交易截图
-                    let message = this.checkWorkOrderImage(packageImages,commodityImages,dealImages); // 校验工单图片不能为空
+                    let packageImages = this.getImages(this.workOrder.packageImages);                   // 外包装破损图片
+                    let commodityImages = this.getImages(this.workOrder.commodityImages);               // 内物破损图片
+                    let dealImages = this.getImages(this.workOrder.dealImages);                         // 交易截图
+                    let message = this.checkWorkOrderImage(packageImages,commodityImages,dealImages);   // 校验工单图片不能为空
                     if (message) {
                         window.tempTip.setIndex(1999);
                         window.tempTip.show(message)
@@ -1338,7 +1340,7 @@
                 },
                 setFormDataCommodities(formData){
                      this.workOrder.commodities.map(commodity=>{
-                         let item = {sku:commodity.sku,amount:commodity.amount,commodity_id:commodity.commodity.id};
+                         let item = {sku:commodity.sku,amount:commodity.amount};
                          formData.append('commodities[]',JSON.stringify(item)) ;
                     });
                 },
@@ -1356,8 +1358,6 @@
                     let message = null;
                     if (!this.checkPrice()){
                         message = '商品价值需大于0';
-                    } else if (!this.checkSkuAmount()){
-                        message = "sku数量和录入sku信息数量不符合";
                     }
                     if (message){
                         window.tempTip.setIndex(1999);
@@ -1369,9 +1369,6 @@
                 checkPrice(){
                     return parseInt(this.workOrder.price) !== 0;
                 },
-                checkSkuAmount(){
-                    return parseInt(this.workOrder.sku_amount) === this.workOrder.commodities.length;
-                },
                 createMistakeWorkOrder() { // 错漏发
                     let data = this.getCreateWorkOrderData();
                     this.createWorkOrder(data);
@@ -1420,7 +1417,6 @@
                     this.workOrder.price = [];
                     this.workOrder.logisticNumber = [];
                     this.workOrder.orderIssueType = 0;
-                    this.workOrder.sku_amount = 0;
                 },
                 getCreateWorkOrderData() {
                     return checkData.map(item => {
@@ -1525,57 +1521,6 @@
                         window.tempTip.show("网络错误:" + err);
                     });
                 },
-                addCommodity(){
-                    let sku = this.$refs['commodity-sku'].value;
-                    let amount = this.$refs['commodity-amount'].value;
-                    window.tempTip.setIndex(1999);
-                    window.tempTip.setDuration(1999);
-                    if (amount<=0) {
-                        window.tempTip.show('数量登记异常');
-                        return;
-                    }
-                    if (this.hasWorkOrderCommodity(sku)){
-                        this.addWorkOrderCommodityAmount(sku,amount);
-                        return ;
-                    }
-                    this.checkSkuAndPushWorkOrderCommodity(sku,amount);
-                },
-                hasWorkOrderCommodity(sku){
-                    let count = this.workOrder.commodities.filter(item=>{
-                        return item.sku === sku;
-                    }).length;
-                    return count>0;
-                },
-                addWorkOrderCommodityAmount(sku,amount){
-                    this.workOrder.commodities.forEach(item=>{
-                        if (item.sku === sku){
-                            item.amount = parseInt(item.amount) + parseInt(amount);
-                        }
-                    });
-                },
-                pushWorkOrderCommodities(sku,amount,commodity){
-                    this.workOrder.commodities.push({sku:sku,amount:amount,commodity:commodity});
-                },
-                checkSkuAndPushWorkOrderCommodity(sku,amount){
-                    let url = "{{route('commodity.getCommodityApi')}}";
-                    let order = this.orders.find(item=>{
-                        return item.orderno === checkData[0];
-                    });
-                    let data = {
-                        sku:sku,
-                        owner_name:order['customer_descr_c']
-                    };
-                    window.tempTip.setIndex(1999);
-                    window.axios.post(url,data).then(res=>{
-                        if (res.data.success){
-                            this.pushWorkOrderCommodities(sku,amount,res.data.data);
-                            return;
-                        }
-                        window.tempTip.show(res.data.message ? res.data.message : "校验sku失败");
-                    }).catch(err=>{
-                        window.tempTip.show("校验sku异常:"+err);
-                    })
-                },
                 isDB(item) {
                     if (item.indexOf('德邦') == -1 || item.indexOf('京东') == -1) return false;
                     return true;
@@ -1594,6 +1539,20 @@
                         }
                     });
                 },
+                fillWorkOrderCommodity(){
+                    const {commodities} = this;
+                    let orderNo = checkData[0];
+                    let orderCommodities = commodities[orderNo];
+                    this.workOrder.commodities = [];
+                    orderCommodities.forEach(item=>{
+                        this.workOrder.commodities.push({
+                            sku:item.sku,
+                            name:item['descr_c'],
+                            amount:item['qtyordered'],
+                            selected:false,
+                        });
+                    });
+                },
             },
         });
     </script>

+ 122 - 69
resources/views/order/workOrder/index.blade.php

@@ -87,17 +87,46 @@
                                                 :disabled="item['work_order_status'] === '工单完成'"
                                                 @change="updateWorkOrderStatus(item,$event)">
                                             <option value="">无</option>
-                                            <option :value="status" v-for="status in workOrderStatus"
+                                            <option v-for="status in workOrderStatus"
+                                                    :value="status"
+                                                    v-text="status"></option>
+                                        </select>
+                                    @elsecan('订单管理-工单处理-承运商编辑')
+                                        <select class="form-control form-control-sm"
+                                                v-if="['拦截','信息更改'].includes(item['issue_type']['name'])"
+                                                :value="item['work_order_status']"
+                                                @change="logisticUpdateWorkOrderStatus(item,$event)">
+                                            <option v-for="status in ['创建','快递已处理','工单完成']"
+                                                    :disabled="item['work_order_status'] === '工单完成'"
+                                                    :value="status"
+                                                    v-text="status"></option>
+                                        </select>
+                                        <select class="form-control form-control-sm"
+                                                v-else-if="'快递丢件' === item['issue_type']['name']"
+                                                :value="item['work_order_status']"
+                                                @change="logisticUpdateWorkOrderStatus(item,$event)">
+                                            <option v-for="status in ['创建','信息已填充','快递已处理','工单完成']"
+                                                    :disabled="item['work_order_status'] === '工单完成'"
+                                                    :value="status"
+                                                    v-text="status"></option>
+                                        </select>
+                                        <select class="form-control form-control-sm"
+                                                v-else-if="'破损' === item['issue_type']['name']"
+                                                :value="item['work_order_status']"
+                                                @change="logisticUpdateWorkOrderStatus(item,$event)">
+                                            <option v-for="status in ['创建','信息已填充','快递已处理','工单完成']"
+                                                    :disabled="item['work_order_status'] === '工单完成'"
+                                                    :value="status"
                                                     v-text="status"></option>
                                         </select>
                                     @else
-                                        @{{ item.work_order_status }}
+                                        <span v-text="item.work_order_status"></span>
                                     @endcan
                                 </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" v-text="item.status"></td>
+                                <td class="text-center" v-text="item.owner ?.name "></td>
+                                <td class="text-center" v-text="item.order ?.client_code "></td>
+                                <td v-text="item.order ?.['logistic'] ?.name "></td>
                                 <td class="text-center">
                                     <div v-if="item.order">
                                         <p v-if="item.order.packages && item.order.packages.length === 1"
@@ -105,8 +134,8 @@
                                         </p>
                                         <div v-else-if="item.order.packages && item.order.packages.length > 0">
                                             <div v-if="selectOrder === item.order.id">
-                                                <p v-for="(package,index) in item.order.packages"
-                                                   v-text="package.logistic_number"></p>
+                                                <p v-for="(data) in item.order.packages"
+                                                   v-text="data.logistic_number"></p>
                                             </div>
                                             <div v-else>
                                                 <p v-text="item.order.packages[0].logistic_number"></p>
@@ -185,7 +214,7 @@
                                                 </div>
                                                 <div v-if="item['process_log']['is_indemnity'] === '否'">
                                                     <span class="text-muted">不赔偿理由:</span>
-                                                    <span class="ml-2" v-text=" item['process_log']['remark']"></span>
+                                                    <span class="ml-2" v-text="item['process_log']['remark']"></span>
                                                 </div>
                                             </div>
                                         </transition>
@@ -199,6 +228,9 @@
                                         <template v-if="item.status === '已处理' && item.is_issue_order">
                                             @include('order.workOrder._work_order_details')
                                         </template>
+                                        <template v-else-if="item['issue_type'] && item['issue_type'].name === '破损'">
+                                            @include('order.workOrder._work_order_details')
+                                        </template>
                                     @elsecan('订单管理-工单处理-货主编辑')
                                         @include('order.workOrder._work_order_details')
                                     @endcan
@@ -216,24 +248,26 @@
                                             </option>
                                         </select>
                                     @else
-                                        <span v-text="item['issue_type'] ?  item['issue_type'].name : ''"></span>
+                                        <span v-text="item['issue_type'] ?.name"></span>
                                     @endcan
                                 </td>
-                                <td class="text-center">@{{ item.remark }}</td>
                                 <td class="text-center">
-                                    @{{ item.result_explain ?item.result_explain : '' }}
+                                    <span v-text="item.remark"></span>
+                                </td>
+                                <td class="text-center">
+                                    <span v-text="item.result_explain"></span>
                                 </td>
                                 <td class="text-center">
-                                    @{{ item.issue_order_type ?item.issue_order_type : '' }}
+                                    <span v-text="item.issue_order_type"></span>
                                 </td>
                                 <td class="text-center p-0">
                                     <template v-if="item.issue_logs">
                                         <template v-if="item.issue_logs.length === 1">
                                             <table class="table table-sm m-0">
                                                 <tr class="table table-sm">
-                                                    <td>@{{ item.issue_logs[0].content }}</td>
-                                                    <td>@{{ item.issue_logs[0].username }}</td>
-                                                    <td>@{{ item.issue_logs[0].created_at | dataTime}}</td>
+                                                    <td v-text="item.issue_logs[0].content"></td>
+                                                    <td v-text="item.issue_logs[0].username"></td>
+                                                    <td>@{{ item.issue_logs[0].created_at | dataTime }}</td>
                                                 </tr>
                                             </table>
                                         </template>
@@ -241,18 +275,18 @@
                                             <transition name="fade">
                                                 <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 | dataTime}}</td>
+                                                        <td v-text="log.content"></td>
+                                                        <td v-text="log.username"></td>
+                                                        <td>@{{ log.created_at | dataTime }}</td>
                                                     </tr>
                                                 </table>
                                             </transition>
                                             <transition name="fade">
                                                 <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 | dataTime}}</td>
+                                                        <td v-text="item.issue_logs[0].content"></td>
+                                                        <td v-text="item.issue_logs[0].username"></td>
+                                                        <td>@{{ item.issue_logs[0].created_at | dataTime }}</td>
                                                     </tr>
                                                 </table>
                                             </transition>
@@ -274,15 +308,10 @@
                                                 v-if="package.transfer_status && package.transfer_status.length > 0">
                                                 <div v-if="selectOrderPackage === package.id">
                                                     <template v-for="transfer in package.transfer_status">
-                                                        <p>@{{
-                                                            transfer['accept_time']+':'+transfer['accept_address']
-                                                            }}</p>
+                                                        <p v-text="transfer['accept_time']+':'+transfer['accept_address']"></p>
                                                     </template>
                                                 </div>
-                                                <div v-else>
-                                                    @{{
-                                                    package.transfer_status[0]['accept_time']+':'+package.transfer_status[0]['accept_address']
-                                                    }}
+                                                <div v-else v-text="package.transfer_status[0]['accept_time']+':'+package.transfer_status[0]['accept_address']">
                                                 </div>
                                                 <button class="btn btn-sm btn-outline-primary"
                                                         v-if="selectOrderPackage !== package.id"
@@ -295,10 +324,10 @@
                                         </template>
                                     </div>
                                 </td>
-                                <td class="text-center">@{{ item.creator ? item.creator.name : '' }}</td>
-                                <td class="text-center">@{{ item.created_at}}</td>
-                                <td>@{{ item.reviewer ? item.reviewer.name : ''}}</td>
-                                <td>@{{ item.review_at}}</td>
+                                <td class="text-center" v-text="item.creator ?.name || ''"></td>
+                                <td class="text-center" v-text="item.created_at"></td>
+                                <td v-text="item.reviewer ?.name || ''"></td>
+                                <td v-text="item.review_at"></td>
                                 @can('订单管理-工单处理-删除')
                                     <td>
                                         <button class="btn btn-sm btn-outline-danger"
@@ -389,7 +418,7 @@
                     remark: null,
                     indemnitor: null, // 赔偿方
                 },
-                workOrderStatus: ['信息未填写', '信息已填写', '快递已处理', '工单完成'],
+                workOrderStatus: ['创建', '信息已填写', '快递已处理', '工单完成'],
                 selectTr: null,
                 selectOrderPackage: null,
                 selectOrder: null,
@@ -498,7 +527,6 @@
             },
             methods: {
                 sortOrder(workOrder) {
-                    if (!workOrder.order) return;
                     if (workOrder['order_issue']) {
                         workOrder.result_explain = workOrder['order_issue'].result_explain;
                         if (workOrder['order_issue']['issue_type']) {
@@ -516,7 +544,7 @@
                 mapLogs(logs) {
                     return logs.map(item => {
                         return {
-                            username: item.user ? item.user.name : '',
+                            username: item.user ?.name || '',
                             content: item.content,
                             created_at: item.created_at
                         };
@@ -592,8 +620,7 @@
                         return null;
                     }
                     return this.workOrders.filter((item) => {
-                        if (!item.order) return false;
-                        if (!item.order.packages) return false;
+                        if (!item.order || !item.order.packages) return false;
                         return selected.includes(item.id + '');
                     });
                 },
@@ -607,10 +634,9 @@
                     this.copyText(text);
                 },
                 getExportText(item) {
-                    if (!item.order) return '';
-                    if (!item.order.packages) return '';
+                    if (!item.order || !item.order.packages) return '';
                     let message = '';
-                    let issue_type = item['issue_type'] ? item['issue_type'].name : '';
+                    let issue_type = item['issue_type'] ?.name || '';
                     switch (issue_type) {
                         case '拦截':
                             message = this.interceptMessage(item);
@@ -626,35 +652,43 @@
                 },
                 interceptMessage(item) {
                     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';
-                    } else {
-                        let item_order_logistic_name = item.order['logistic']['name'];
-                        let item_order_adder = item.order['consignee_name'] + ' '
-                            + item.order['consignee_phone'] + ' '
-                            + ' ' + item.order.address;
-                        item.order.packages.forEach(p => {
-                            if (p) message += item_order_logistic_name + ' ' + p.logistic_number + ' ' + item_order_adder + '\n';
-                        });
-                        message = message.trim('\n') + ' ——拦截\n';
-                    }
+                    let order = item.order;
+                    let order_packages = item.order ?.packages || [];
+                    let logistic_code = item.order ?.['logistic'] ?.code || ''; // 承运商编码
+                    let logistic_name = item.order ?.['logistic'] ?.name || ''; // 承运商名称
+
+                    let {consignee_name,consignee_phone,address} = order;
+                    let order_adder = `${consignee_name}  ${consignee_phone}  ${address}`;
+
+                    order_packages.forEach(item=>{
+                        let logistic_number = item.logistic_number;
+                        if (logistic_code.includes('SF') || logistic_code.includes('ZTO')) {
+                            message += `${logistic_number}\n`;
+                        } else {
+                            if (item) message += `${logistic_name}  ${logistic_number}  ${order_adder}\n`;
+                        }
+                    });
+
+                    message = message.trim('\n') + ' ——拦截\n';
                     return message;
                 },
                 modificationMessage(item) {
                     let message = '';
-                    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 => {
+                    let {remark,order} = item;
+                    let order_packages = item.order ?.packages || [];
+                    let logistic_code = item.order ?.['logistic'] ?.code || '';
+
+                    const {consignee_name,consignee_phone,province,city,district,address} = order;
+                    let adder = `${consignee_name}  ${consignee_phone}  ${province}  ${city}  ${district}  ${address}`;
+
+                    order_packages.forEach(node => {
+                        let logistic_number = node.logistic_number;
                         if (logistic_code.includes('SF')) { // 顺丰订单
-                            message += node['logistic_number'] + ' ——改信息: ' + item.remark + ',运费到付或月结' + '\n';
+                            message += `${logistic_number}   ——改信息:${remark},运费到付或月结\n`;
                         } else if (logistic_code.includes('ZTO')) {
-                            message += node['logistic_number'] + ' ——改信息:' + item.remark + '\n';
+                            message += `${logistic_number} ——改信息${remark}`;
                         } else {
-                            message += node['logistic_number'] + ' ' + adder + ' ——改地址' + item.remark + '\n';
+                            message += `${logistic_number}  ${adder}  ——改地址 ${remark}\n`;
                         }
                     });
                     return message;
@@ -662,10 +696,11 @@
                 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';
+                    let {order,remark} = item.order;
+                    let {consignee_name,consignee_phone,province,city,district,address} = order;
+                    let adder = `${consignee_name}  ${consignee_phone}  ${province}  ${city}  ${district}  ${address}`;
+                    order.packages.forEach(p => {
+                        message += `${p.logistic_number}  ${adder}  ——描述 ${remark}\n`;
                     });
                     return message;
                 },
@@ -732,7 +767,7 @@
                     let logistic_numbers = '';
                     items.forEach(item => {
                         item.order.packages.forEach(node => {
-                            logistic_numbers += node.logistic_number + '\n';
+                            logistic_numbers += `${node.logistic_number}\n`;
                         });
                     })
                     this.copyText(logistic_numbers);
@@ -915,7 +950,7 @@
                     });
                 },
                 updateWorkOrderStatus(item, e, i) {
-                    let url = "{{route('workOrder.updateWorkOrderStatusApi')}}";
+                    let url = "{{route('workOrder.updateStatusApi')}}";
                     let data = {
                         id: item.id,
                         work_order_status: e.target.value
@@ -958,6 +993,24 @@
                         }
                     }
                     return true;
+                },
+                logisticUpdateWorkOrderStatus(item,e){
+                    let url = "{{route('workOrder.logisticUpdateStatusApi')}}";
+                    let data = {id: item.id, work_order_status: e.target.value};
+                    window.tempTip.waitingTip('处理中......');
+                    window.tempTip.setDuration('1999');
+                    window.axios.post(url, data).then(res => {
+                        window.tempTip.cancelWaitingTip();
+                        window.tempTip.setDuration('1999');
+                        if (res.data.success) {
+                            item.work_order_status = data.work_order_status;
+                            window.tempTip.showSuccess('修改成功');
+                            return;
+                        }
+                        window.tempTip.show(res.data.message ? res.data.message : '修改失败');
+                    }).catch(err => {
+                        window.tempTip.show('修饰异常:' + err);
+                    });
                 }
             },
         });

+ 7 - 1
routes/apiLocal.php

@@ -107,6 +107,11 @@ Route::group(['prefix' => 'order'], function () {
         Route::post('userWorkgroups/add','OrderIssueController@addUserWorkgroup');
         Route::post('userWorkgroups/delete','OrderIssueController@destroyUserWorkgroup');
         Route::post('batchOthers','OrderIssueController@batchOthers');
+
+    });
+
+    Route::prefix('commodity')->group(function(){
+        Route::post('/commodities','OrderPackageCommoditiesController@getCommoditiesApi')->name('order.commodity.getCommoditiesApi');
     });
 
     Route::group(['prefix'=>'tracking'],function (){
@@ -268,7 +273,8 @@ Route::prefix('workOrder')->group(function(){
     Route::post('store','WorkOrderController@storeApi')->name('workOrder.storeApi'); // 创建
     Route::post('damaged','WorkOrderController@damagedApi')->name('workOrder.damagedApi'); // 创建 破损
     Route::post('loss','WorkOrderController@updateLossApi')->name('workOrder.lossApi'); // 客户提供丢件信息
-    Route::post('workOrderStatus','WorkOrderController@updateWorkOrderStatusApi')->name('workOrder.updateWorkOrderStatusApi');
+    Route::post('status','WorkOrderController@updateWorkOrderStatusApi')->name('workOrder.updateStatusApi');
+    Route::post('status/logistic','WorkOrderController@logisticUpdateWorkOrderStatusApi')->name('workOrder.logisticUpdateStatusApi');
     Route::post('store','WorkOrderController@storeApi')->name('workOrder.storeApi'); // 创建
     Route::post('review','WorkOrderController@reviewApi')->name('workOrder.reviewApi'); // 审核
     Route::post('batchReview','WorkOrderController@batchReviewApi')->name('workOrder.batchReviewApi');  // 批量审核