zengjun 4 년 전
부모
커밋
b7adb47e7a

+ 5 - 6
app/Http/Controllers/WorkOrderDamageController.php

@@ -92,7 +92,7 @@ class WorkOrderDamageController extends Controller
 
     public function checkLogisticNumberApi(Request $request){
         $logisticNumbers = array_unique(array_filter(preg_split('/[,, \n]+/u', $request->input('logistic_numbers'))));
-        $result = $this->service->check($logisticNumbers, '快递异常');
+        $result = $this->service->check($logisticNumbers, '破损');
         if(!$result['success']){
             return $result;
         }
@@ -100,23 +100,22 @@ class WorkOrderDamageController extends Controller
         $orders = Order::query()->with('packages.commodities')->whereIn('id',$orderPackageQuery)->get();
         $params = [];
         foreach ($orders as $order){
-            $param = [];
             $packages = $order->packages ?? [];
             $param['order_no'] = $order->code ?? '';
+            $commodityParams = [];
             foreach ($packages as $package){
                 $commodities = $package->commodities ?? [];
-                $commodityParams = [];
                 foreach($commodities as $commodity){
                     $commodityParams[] = [
                         'logistic_number' => $package->logistic_number ?? '',
                         'amount' => $commodity->amount ?? '',
                         'commodity_id' => $commodity->id ?? '',
-                        'sku' => $commodity->sku ?? '',
-                        'sku_name' => $commodity->name ?? '',
+                        'sku' => $commodity->commodity->sku ?? '',
+                        'sku_name' => $commodity->commodity->name ?? '',
                     ];
                 }
-                $param['commodities'] = $commodities;
             }
+            $param['commodities'] = $commodityParams;
             $params[] = $param;
         }
         return ['success' => true,'data' => $params];

+ 9 - 0
app/Http/Controllers/WorkOrderInterceptController.php

@@ -177,4 +177,13 @@ class WorkOrderInterceptController extends Controller
         $this->service->batchStore($params);
         return ['success' => true];
     }
+
+    public function checkLogisticNumberApi(Request $request){
+        $logisticNumbers  = array_unique(array_filter(preg_split('/[,, \n]+/u', $request->input('logistic_numbers'))));
+        $result = $this->service->check($logisticNumbers, '拦截');
+        if (!$result['success']) {
+            return $result;
+        }
+        return ['success' => true];
+    }
 }

+ 9 - 9
app/Services/WorkOrderService.php

@@ -443,34 +443,34 @@ class WorkOrderService
 
     public function check($logisticNumbers,$orderIssueType)
     {
-        $orderPackages = OrderPackage::query()->select(["id","logistic_number"])->whereIn("logistic_number",$logisticNumbers)->get();
+        $orderPackages = OrderPackage::query()->select(["id",'order_id',"logistic_number"])->whereIn("logistic_number",$logisticNumbers)->get();
         if(count($orderPackages) != count($logisticNumbers)){
             $array = array_diff($logisticNumbers,$orderPackages->map(function($item){return $item->logistic_number;})->toArray());
             return ['success' => false,'message'=> '未找到对应的订单快递单号:'.join(",",$array) ];
         }
-        $orderIds = $orderPackages->map(function ($item){return $item->id;})->toArray();
+        $orderIds = $orderPackages->map(function ($item){return $item->order_id;})->toArray();
         $workOrders = WorkOrder::query()->whereIn('order_id',$orderIds)->get();
         $issueType = $this->issueTypeService->firstOrCreate(['name' => $orderIssueType]);
+
         $workOrderDetails = WorkOrderDetail::query()->whereIn('work_order_id',$workOrders->map(function($item){
-            return $item->work_order_id;
+            return $item->id;
         }))->where('order_issue_type_id',$issueType->id)->get();
-
         if(count($workOrderDetails) > 0 ){
             $workOrderDetailIds = $workOrderDetails->map(function($item){
                 return $item->work_order_id;
             })->toArray();
-            $workOrders = $workOrders->filter(function($item)use($workOrderDetailIds){
+            $checkOrderIds = $workOrders->filter(function($item)use($workOrderDetailIds){
                 return in_array($item->id,$workOrderDetailIds);
             })->map(function ($item){
                 return $item->order_id;
             })->toArray();
 
-            $items = $orderPackages->filter(function($item)use($workOrders){
-                return in_array($item->order_id,$workOrders);
+            $items = $orderPackages->filter(function($item)use($checkOrderIds){
+                return in_array($item->order_id,$checkOrderIds);
             })->map(function($item){
-                return $item->logistic_numbers;
+                return $item->logistic_number;
             })->toArray();
-            return ['success' => false,"message" => "已有对应的拦截工单:".join(",",$items)];
+            return ['success' => false,"message" => "已有对应的".$orderIssueType."工单:".join(",",$items)];
         }
         return ['success' => true];
     }

+ 174 - 40
resources/views/order/workOrder/batch/index.blade.php

@@ -150,11 +150,17 @@
         <div class="form-group" id="damage-edit" v-if="'破损' === issueType">
             <p class="text-dark">破损信息</p>
             <div class="alert alert-info" v-for="(item,index) in damages">
-                <div class="form-row">
-                    <label>订单:</label>
-                    <p  class="text-dark" v-text="item.order_no"></p>
+                <div class="form-row ">
+                    <label class="">订单:</label>
+                    <label class="text-dark" v-text="item.order_no"></label>
+                </div>
+                <div class="form-row mb-2">
+                    <label class="">破损商品价格:</label>
+                    <div class="col-sm-4">
+                        <input type="number" class="form-control form-control-sm" v-model="item.price">
+                    </div>
                 </div>
-                <div class="damage-table">
+                <div class="damage-table form-row form-group">
                     <table class="table table-bordered bg-white">
                         <thead>
                         <tr>
@@ -171,60 +177,64 @@
                         <tr v-for="(commodity,i) in item.commodities">
                             <td v-text="commodity.logistic_number"></td>
                             <td v-text="commodity.sku"></td>
+                            <th v-text="commodity.abnormal_type"></th>
                             <td v-text="commodity.sku_name"></td>
                             <td v-text="commodity.amount"></td>
-                            <td v-text="commodity.abnormal_amount"></td>
-                            <td v-text="commodity.price"></td>
+                            <td>
+                                <input type="number" class="form-control form-control-sm"
+                                       v-model="commodity.abnormal_amount" @change="computerPrice(item)">
+                            </td>
+                            <td>
+                                <input type="number" class="form-control form-control-sm"
+                                       v-model="commodity.price" @change="computerPrice(item)">
+                            </td>
                         </tr>
                         </tbody>
                     </table>
                 </div>
                 <div class="form-row">
-                    <div class="col-sm-2">
-
-                    </div>
-                    <div class="col-sm-3 ">
+                    <div class="col-sm-4">
                         <label class="text-dark"><span class="text-danger">*</span>外包装图片</label>
-                        <div class="h-auto border border-secondary bg-white rounded" id="package-image"
-                             style="min-height: 75px"
+                        <div class="h-auto border border-secondary bg-white rounded"
+                             style="min-height: 100px"
                              contenteditable="true"
-                             @paste="pasteImage($event,item.dealImages)">
-                            <div v-for="(image,i) in  item.dealImages"
+                             @paste="pasteImage($event,item.packageImages)">
+                            <div v-for="(image,i) in  item.packageImages"
                                  class="d-inline-block col-4 position-relative card">
                                 <div class="card-body">
                                     <img :src="image.src" class="card-img-top" :alt="image.file.name">
                                     <div class="float-right position-relative">
                                         <button type="button" class="btn btn-sm btn-outline-danger"
-                                                @click="spliceImage(i,item.dealImages)">取消
+                                                @click="spliceImage(i,item.packageImages)">取消
                                         </button>
                                     </div>
                                 </div>
                             </div>
                         </div>
                     </div>
-                    <div class="col-sm-3 ">
+                    <div class="col-sm-4">
                         <label class="text-dark"><span class="text-danger">*</span>内物破损图</label>
-                        <div class="h-auto border border-secondary bg-white rounded" id="package-image"
-                             style="min-height: 75px"
+                        <div class="h-auto border border-secondary bg-white rounded"
+                             style="min-height: 100px"
                              contenteditable="true"
-                             @paste="pasteImage($event,item.dealImages)">
-                            <div v-for="(image,i) in  item.dealImages"
+                             @paste="pasteImage($event,item.commodityImages)">
+                            <div v-for="(image,i) in  item.commodityImages"
                                  class="d-inline-block col-4 position-relative card">
                                 <div class="card-body">
                                     <img :src="image.src" class="card-img-top" :alt="image.file.name">
                                     <div class="float-right position-relative">
                                         <button type="button" class="btn btn-sm btn-outline-danger"
-                                                @click="spliceImage(i,item.dealImages)">取消
+                                                @click="spliceImage(i,item.commodityImages)">取消
                                         </button>
                                     </div>
                                 </div>
                             </div>
                         </div>
                     </div>
-                    <div class="col-sm-3 ">
+                    <div class="col-sm-4">
                         <label class="text-dark"><span class="text-danger">*</span>交易截图</label>
-                        <div class="h-auto border border-secondary bg-white rounded" id="package-image"
-                             style="min-height: 75px"
+                        <div class="h-auto border border-secondary bg-white rounded"
+                             style="min-height: 100px"
                              contenteditable="true"
                              @paste="pasteImage($event,item.dealImages)">
                             <div v-for="(image,i) in  item.dealImages"
@@ -246,7 +256,7 @@
         </div>
 
         <div class="form-group" id="submit-div">
-            <button class="btn btn-primary" @click="submit">提交</button>
+            <button class="btn btn-primary" @click="submit" >提交</button>
         </div>
 
     </div>
@@ -265,7 +275,7 @@
                 infoChange: [],
                 mistakes: [],
                 expressAbnormalData: [],
-                damages:[],
+                damages: [],
             },
             computed: {
                 showRemarkDiv() {
@@ -280,8 +290,10 @@
                         this.getMistakeData();
                     } else if (val === "快递异常") {
                         this.getExpressAbnormalData();
-                    } else if(val === "破损"){
+                    } else if (val === "破损") {
                         this.getDamages();
+                    } else if(val==="拦截"){
+                        this.getIntercept();
                     }
                 }
             },
@@ -301,7 +313,6 @@
                         }
                     } else if (issueType === "信息更改") {
                         if (!this.checkInfoChange()) {
-                            this.errorTempTip("信息更改项不能为空,且列不能为空")
                             return false;
                         }
                     } else if (issueType === "错漏发") {
@@ -312,6 +323,10 @@
                         if (!this.checkExpressAbnormal()) {
                             return false;
                         }
+                    } else if (issueType === "破损") {
+                        if (!this.checkDamage()) {
+                            return false;
+                        }
                     }
                     return true;
                 },
@@ -329,6 +344,8 @@
                         this.mistake()
                     } else if (issueType === "快递异常") {
                         this.expressAbnormal()
+                    } else if (issueType === "破损") {
+                        this.damage();
                     }
                 },
                 loss() {
@@ -396,12 +413,12 @@
                 },
                 informationChange() {
                     let url = '{{route('workOrder.informationChange.createBatchApi')}}';
-                    let {logisticNumbers, infoChange, remark} = this;
+                    let {logisticNumbers, infoChange} = this;
                     let data = {
                         logistic_numbers: logisticNumbers,
-                        remark: remark,
                         data: infoChange,
                     };
+                    this.waitingTempTip("处理中");
                     axios.post(url, data).then(res => {
                         this.cancelWaitingTempTip();
                         if (res.data.success === true) {
@@ -460,13 +477,13 @@
                         data.append('type', expressAbnormal.abnormal_type);
                         data.append('process_progress', expressAbnormal.abnormal_type);
                         packages = packages.filter(item => item.select);
-                        packages.forEach(e=>{
-                            data.append('commodities[]',JSON.stringify({logistic_number:e.logistic_number}));
+                        packages.forEach(e => {
+                            data.append('commodities[]', JSON.stringify({logistic_number: e.logistic_number}));
                         })
                         let dealImages = this.getImages(expressAbnormal.dealImages);
                         this.setFormDataImagePrefix(data, 'dealImages', dealImages);
-                        this.syncExpressAbnormal(data).then(res=>{
-                            if(i === (expressAbnormalData.length -1)){
+                        this.syncExpressAbnormal(data).then(res => {
+                            if (i === (expressAbnormalData.length - 1)) {
                                 this.cancelWaitingTempTip();
                                 this.cancelSubData();
                             }
@@ -490,6 +507,73 @@
                         })
                     });
                 },
+                damage() {
+                    let {damages, remark} = this;
+                    let message = '';
+                    this.waitingTempTip("处理中");
+                    for (let i = 0; i < damages.length; i++) {
+                        let fromData = new FormData();
+                        let damage = damages[i];
+                        let price = damage.price;
+                        let commodities = damage.commodities ? damage.commodities : [];
+                        fromData.append('order_no', damage.order_no);
+                        fromData.append('price', price);
+                        fromData.append('remark', remark);
+                        let packageImages = this.getImages(damage.packageImages ? damage.packageImages : []);
+                        this.setFormDataImagePrefix(fromData, 'packageImages', packageImages);
+                        let dealImages = this.getImages(damage.dealImages ? damage.dealImages : []);
+                        this.setFormDataImagePrefix(fromData, 'dealImages', dealImages);
+                        let commodityImages = this.getImages(damage.commodityImages ? damage.commodityImages : []);
+                        this.setFormDataImagePrefix(fromData, 'commodityImages', commodityImages);
+                        commodities.filter(item=>{
+                            return Number(item.abnormal_amount) !== 0;
+                        }).forEach(e => {
+                            fromData.append('commodities[]', JSON.stringify(e));
+                        });
+                        this.syncDamage(fromData).then(res => {
+                            if (i === (damages.length - 1)) {
+                                this.cancelWaitingTempTip();
+                                this.cancelSubData();
+                            }
+                            this.successTempTip(`${damage.order_no}创建完成`);
+                        }).catch(err => {
+                            message += err + '\\n';
+                        });
+                    }
+                },
+                syncDamage(data) {
+                    let url = "{{route('workOrder.damage.storeApi')}}";
+                    return new Promise((resolve, reject) => {
+                        axios.post(url, data).then(res => {
+                            if (res.data.success) {
+                                resolve(true)
+                            } else {
+                                reject(res.data.message ? res.data.message : '创建工单异常');
+                            }
+                        }).catch(err => {
+                            reject(err);
+                        })
+                    });
+                },
+                getIntercept(){
+                    let url = '{{route('workOrder.intercept.checkLogisticNumberApi')}}';
+                    let data = {
+                        'logistic_numbers': this.logisticNumbers,
+                    };
+                    axios.post(url, data).then(res => {
+                        if (res.data.success) {
+                            this.infoChange = res.data.data.map(item => {
+                                item.remark = '';
+                                return item;
+                            });
+                        } else {
+                            this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
+                        }
+                    }).catch(err => {
+                        this.errorTempTip(err);
+                    });
+
+                },
                 getInfoChangeData() {
                     let url = '{{route('workOrder.informationChange.checkLogisticNumberApi')}}';
                     let data = {
@@ -557,21 +641,41 @@
                         this.errorTempTip(err);
                     });
                 },
-                getDamages(){
+                getDamages() {
                     let url = '{{route('workOrder.damage.checkLogisticNumberApi')}}';
                     let data = {
                         'logistic_numbers': this.logisticNumbers
                     };
-                    axios.post(url,data).then(res=>{
-                        if(res.data.data){
+                    axios.post(url, data).then(res => {
+                        if (res.data.data) {
+                            res.data.data.forEach(item => {
+                                item.commodities.forEach(i => {
+                                    i.abnormal_type = "破损";
+                                    i.abnormal_amount = i.amount;
+                                    i.price = 0;
+                                });
+                                item.commodityImages = [];
+                                item.dealImages = [];
+                                item.packageImages = [];
+                                item.price = 0;
+                            })
                             this.damages = res.data.data;
                         } else {
                             this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
                         }
-                    }).catch(err=>{
+                    }).catch(err => {
                         this.errorTempTip(err);
                     });
                 },
+                computerPrice(item) {
+                    let {commodities} = item;
+                    item.price = commodities.map(item => {
+                        let {price, abnormal_amount} = item;
+                        return price * abnormal_amount;
+                    }).reduce((perv, next) => {
+                        return perv + next
+                    });
+                },
                 waitingTempTip(message) {
                     window.tempTip.setIndex(2005);
                     window.tempTip.setDuration(9999);
@@ -655,11 +759,22 @@
                     this.infoChange = [];
                     this.mistakes = [];
                     this.expressAbnormalData = [];
+                    this.damages = [];
                 },
                 checkInfoChange() {
                     let {infoChange} = this;
-                    if (infoChange.length === 0) return false;
-                    return infoChange.filter(item => item.remark == null || item.remark === "" || item.remark.trim().length === 0).length !== 0;
+                    if(infoChange.length === 0){
+                        this.errorTempTip("请检查信息");
+                        return false;
+                    }
+                    for (let i = 0; i < infoChange.length; i++) {
+                        let info = infoChange[i];
+                        let {remark} = info;
+                        if(remark == null || remark === "" || remark.trim().length === 0){
+                            this.errorTempTip("收方信息未必填项");
+                        }
+                    }
+                    return true;
                 },
                 checkMistakes() {
                     let {mistakes} = this;
@@ -697,6 +812,25 @@
                     }
                     return true;
                 },
+                checkDamage() {
+                    let {damages} = this;
+                    for (let i = 0; i < damages.length; i++) {
+                        let damage = damages[i];
+                        let {commodities,order_no} = damage;
+                        if(commodities.length === 0){
+                            this.errorTempTip(`订单${order_no}无商品详情`);
+                            return false;
+                        }
+                        let count =  commodities.filter(item=>{
+                            return Number(item.abnormal_amount) === 0;
+                        }).length;
+                        if(count === commodities.length){
+                            this.errorTempTip(`${order_no}未填写破损数量`);
+                            return false;
+                        }
+                    }
+                    return true;
+                },
                 pasteImage(event, imageArray) {
                     for (let i = 0; i < event.clipboardData.items.length; i++) {
                         let item = event.clipboardData.items[i];

+ 1 - 0
routes/apiLocal.php

@@ -318,6 +318,7 @@ Route::prefix('workOrder')->group(function(){
         Route::post('logistic/batchHeader','WorkOrderInterceptController@logisticBatchHandlerApi')->name('workOrder.intercept.logistic.batchHandlerApi');        // 承运商批量处理
         Route::post('baoShi/review','WorkOrderInterceptController@baoShiReviewApi')->name('workOrder.intercept.baoShi.reviewApi');                // 宝时终审
         Route::post('baoShi/batchReview','WorkOrderInterceptController@baoShiBatchReviewApi')->name('workOrder.intercept.baoShi.batchReviewApi'); // 宝时批量终审
+        Route::post('baoShi/batchReview','WorkOrderInterceptController@checkLogisticNumberApi')->name('workOrder.intercept.checkLogisticNumberApi'); // 宝时批量终审
     });
     Route::prefix('cancelIntercept')->group(function(){     // 取消拦截
         Route::post('batch','WorkOrderCancelInterceptController@createBatchApi')->name("workOrder.cancelIntercept.createBatchApi");                           // 批量创建