Browse Source

工单处理 图片上传

ajun 4 years ago
parent
commit
dd3bf7bea0

+ 11 - 4
app/Http/Controllers/WorkOrderController.php

@@ -58,10 +58,7 @@ class WorkOrderController extends Controller
         }
         $result = $service->buildOrderIssue($work_orders);
         if (!$result['success']) return $result;
-        $workOrders = WorkOrder::query()->with(['type', 'creator', 'order' => function ($query) {
-            /** @var $query Builder */
-            $query->with('packages', 'issue', 'logistic');
-        }, 'reviewer','issueType'])->whereIn(  'id',$request['ids'])->get();
+        WorkOrder::query()->defaultWith()->whereIn(  'id',$request['ids'])->get();
         $service->tags($workOrders);
         return ['success' => true ,'data' => $workOrders];
     }
@@ -79,6 +76,16 @@ class WorkOrderController extends Controller
         return  $service->build($request['params']);
     }
 
+    public function damagedApi(Request $request, WorkOrderService $service)
+    {
+        if (Gate::denies('订单管理-订单-生成工单'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        app('OrderService')->syncOrderByCodes([$request->input('order_no')]);
+
+        $workOrder =  $service->createDamagedWorkOrder($request->all());
+
+    }
+
     // 修改问题类型
     public function updateIssueTypeApi(Request $request): array
     {

+ 3 - 3
app/Services/WorkOrderService.php

@@ -104,9 +104,9 @@ class WorkOrderService
         $order = Order::query()->where('code', $param['order_no'])->first();
         $remake = $param['remark'] ?? '';
         $workOrder = $this->createAndNotification($order, $orderIssueType, $remake);
-        $workOrder->addPackageImages($param['packageImages']); // 外包装图片
-        $workOrder->addCommodityImage($param['commodityImage']); // 内物破损图片
-        $workOrder->addDealImages($param['dealImages']); // 交易图片
+        $workOrder->addPackageImages($param['packageImages']);      // 外包装图片
+        $workOrder->addCommodityImage($param['commodityImages']);    // 内物破损图片
+        $workOrder->addDealImages($param['dealImages']);            // 交易图片
         return $workOrder;
     }
 

+ 2 - 1
app/WorkOrder.php

@@ -11,6 +11,7 @@ use App\Traits\ModelLogChanging;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
 use Illuminate\Database\Eloquent\Relations\HasMany;
 use Illuminate\Database\Eloquent\SoftDeletes;
+use Illuminate\Http\UploadedFile;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Gate;
 
@@ -199,10 +200,10 @@ class WorkOrder extends Model
         NotificationService::SingleRegister($msg, $clientCode, "订单管理-问题件");
     }
 
-
     public function addPackageImages($images)
     {
         foreach ($images as $image) {
+            /** @var UploadedFile  $image */
             $count = $this->packageImages()->count();
             /** @var WorkOrderImage $workOrderImage */
             $workOrderImage = WorkOrderImage::query()->create(['type' => 0, 'amount' => ++$count]);

+ 7 - 14
app/WorkOrderImage.php

@@ -7,7 +7,7 @@ use Illuminate\Database\Eloquent\Model;
 use App\Traits\ModelLogChanging;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
 use Illuminate\Database\Eloquent\Relations\HasOne;
-use Illuminate\Support\Str;
+use Illuminate\Http\UploadedFile;
 use Intervention\Image\Facades\Image;
 use Ramsey\Uuid\Uuid;
 
@@ -64,27 +64,21 @@ class WorkOrderImage extends Model
         return $this->hasOne(UploadFile::class,'table_id','id')->where('table_name','work_order_image');
     }
 
-    public function saveFile($image): bool
+    public function saveFile(UploadedFile $image): bool
     {
         if (!$this->checkFile($image)) return false;
         $tmpFile = $image->getRealPath();
         $fileSuffix = $image->getClientOriginalExtension();
         $dirPath = $this->getStorageDirPath();
         $fileName = date('ymd') . '-' . Uuid::uuid1();
-        $pathName = $dirPath . $fileName . $fileSuffix;
-        if ($image->height() > $image->width()) {
-            $image->heighten(250)->save($pathName);
-        } else {
-            $image->widen(250)->save($pathName);
-        }
+        $pathName = $dirPath . $fileName .'.' . $fileSuffix;
         $result = move_uploaded_file($tmpFile, $pathName);
-
-        $img = Image::make($result);
-        $img->heighten(250)->save($pathName);
+        if ($result) return false;
+        $img = Image::make($pathName);
+        $img->save($pathName);
         $this->uploadFile()->create(
             ['table_name' => $this->getTable(), 'table_id' => $this['id'], 'url' => '/files/workOrder/'.$fileName, 'type' => $fileSuffix]
         );
-//        UploadFile::query()->create(['table_name' => $this->getTable(), 'table_id' => $this['id'], 'url' => '/files/workOrder/'.$fileName, 'type' => $fileSuffix]);
         return true;
     }
 
@@ -103,11 +97,10 @@ class WorkOrderImage extends Model
         $path = ['app','public','files','workOrder'];
         $path = join(DIRECTORY_SEPARATOR,$path);
         $dirPath = storage_path($path);
-
         if (!file_exists($dirPath)) {
             mkdir($dirPath);
         }
-        return $dirPath;
+        return $dirPath.DIRECTORY_SEPARATOR;
     }
 
     public function updateFile($image)

+ 76 - 13
resources/views/order/index/_work_order_modal.blade.php

@@ -1,5 +1,5 @@
 <div class="modal fade " id="intercept-modal" tabindex="-1" role="dialog" aria-labelledby="checkModalLabel" aria-hidden="true">
-    <div class="modal-dialog modal-dialog-centered">
+    <div class="modal-dialog modal-xl modal-dialog-centered">
         <div class="modal-content">
             <div class="modal-header">
                 <h5 class="modal-title" id="checkModalLabel" >创建工单</h5>
@@ -9,9 +9,9 @@
             </div>
             <div class="modal-body">
                 {{--工单类型--}}
-                <div class="form-group">
-                    <label for="order_issue_type">工单类型</label>
-                    <div class="pl-1">
+                <div class="form-group row">
+                    <label for="order_issue_type" class="col-sm-2 col-form-label">工单类型</label>
+                    <div class="col-sm-10">
                         <select name="type" id="order_issue_type" class="form-control" v-model="workOrder.orderIssueType">
                             <option value=""></option>
                             <option v-for="type in workOrder.types" :value="type">@{{ type }}</option>
@@ -19,21 +19,84 @@
                     </div>
                 </div>
                 {{--其他--}}
-                <template v-if="['其他',null,'快递异常','错漏发','破损'].includes(workOrder.orderIssueType)">
+                <div class="form-group row" v-if="['其他',null,'快递异常','错漏发','破损'].includes(workOrder.orderIssueType)">
                     <hr>
-                    <label for="remake_info">问题描述</label>
-                    <div class="pl-1">
-                        <textarea class="form-control" name="" id="remake_info" cols="30" rows="5" v-model="workOrder.remark.info"></textarea>
+                    <label for="remake_info" class="col-sm-2 col-form-label">问题描述</label>
+                    <div class="col-sm-10">
+                        <textarea class="form-control" name="" id="remake_info" cols="30" rows="2" v-model="workOrder.remark.info"></textarea>
                     </div>
-                </template>
+                </div>
                 {{--信息更改--}}
-                <template v-else-if="workOrder.orderIssueType === '信息更改'">
+                <div class="form-group row" v-else-if="'信息更改' === workOrder.orderIssueType ">
                     <hr>
-                    <label for="remake_info">新的收方信息</label>
-                    <div class="pl-1">
+                    <label for="order_issue_type" class="col-sm-2 col-form-label">新的收方信息</label>
+                    <div class="col-sm-10">
                         <textarea class="form-control" name="" id="remake_info" cols="30" rows="5" v-model="workOrder.remark.info"></textarea>
                     </div>
-                </template>
+                </div>
+
+                <div class="form-group " v-if="'破损' === workOrder.orderIssueType">
+                    <div class="pl-1 custom-file">
+                        <input type="file" id="package-images" name="package-images" multiple class="custom-file-input" accept="image/*" @change="pushImagesAndShow($event,workOrder.packageImages)">
+                        <label class="custom-file-label" for="package-images">点击添加外包装破损图片</label>
+                    </div>
+                    <div class="border-dark mt-1">
+                        <div v-for="(image,i) in  workOrder.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,workOrder.packageImages)">删除</button>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group " v-if="'破损' === workOrder.orderIssueType">
+                    <div class="pl-1 custom-file">
+                        <input type="file" id="commodity-images" name="package-images" multiple class="custom-file-input" accept="image/*" @change="pushImagesAndShow($event,workOrder.commodityImage)">
+                        <label class="custom-file-label" for="commodity-images">点击添加内物破损图片</label>
+                    </div>
+                    <div class="border-dark mt-1">
+                        <div v-for="(image,i) in  workOrder.commodityImage" 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,workOrder.commodityImage)">删除</button>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group " v-if="'破损' === workOrder.orderIssueType">
+                    <div class="pl-1 custom-file">id
+                        <input type="file" id="deal-images" name="package-images" multiple class="custom-file-input" accept="image/*" @change="pushImagesAndShow($event,workOrder.dealImages)">
+                        <label class="custom-file-label" for="deal-images">点击添加外交易截图</label>
+                    </div>
+                    <div class="border-dark mt-1">
+                        <div v-for="(image,i) in  workOrder.dealImages" class="d-inline-block col-4 position-relative card">
+                            <div class="card-body">
+                                <img :src="image.src" class="card-img-top" :alt="image.file.name">
+                                <div class="float-right position-relative">
+                                    <button type="button" class="btn btn-sm btn-outline-danger" @click="spliceImage(i,workOrder.dealImages)">删除</button>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                {{--破损商品价格--}}
+                <div class="form-group row" v-if="'破损' === workOrder.orderIssueType">
+                    <label for="work-order-price" class="col-sm-2 col-form-label">破损商品价格</label>
+                    <div class="col-sm-10">
+                        <input type="number" id="work-order-price" class="form-control" v-model="workOrder.price" placeholder="破损商品价格">
+                    </div>
+                </div>
+                {{--快递单号--}}
+                <div class="form-group row" v-if="'破损' === workOrder.orderIssueType">
+                    <label for="work-order-logistic-number" class="col-sm-2 col-form-label">新的收方信息</label>
+                    <div class="col-sm-10">
+                        <input type="text" id="work-order-logistic-number" class="form-control" v-model="workOrder.logisticNumber" placeholder="快递单号">
+                    </div>
+                </div>
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭

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

@@ -224,7 +224,6 @@
                                         <button type="button" class="btn btn-sm btn-outline-primary" @click="copyMerchantInfo">复制</button>
                                     </div>
                                 </div>
-
                             </div>
 
                             <div class="modal-footer">
@@ -291,7 +290,6 @@
                     merchantInfo:'',
                 },
                 upList:{},
-
                 workOrder:{
                     types:['拦截','快递异常','信息更改','错漏发', '破损'],
                     orderIssueType:0,
@@ -305,6 +303,11 @@
                         adder:null,     // 详细地址
                         info:null,
                     },
+                    packageImages:[], // 外包装图片
+                    commodityImage:[], // 内物破损图片
+                    dealImages:[], // 交易截图
+                    commodities:[],
+                    price:null,
                 },
                 grads:[
                     {name:'一般',value:'1'},
@@ -1016,20 +1019,30 @@
                     if (types.length === 0 ) return false;
                     return this.workOrder.orderIssueType === types[0].id
                 },
+                pushImagesAndShow(e,images){
+                     for (let i = 0; i < e.target.files.length; i++) {
+                        let src = window.URL.createObjectURL(e.target.files[i]);
+                        images.push({src:src,file:e.target.files[i]});
+                    }
+                },
+                spliceImage(i,images){
+                    if(!confirm('是否取消选择该图片'))return;
+                    images.splice(i,1);
+                },
                 buildWorkOrder(){  // 生成工单
                     if (this.workOrder.orderIssueType === '信息更改' && checkData.length !== 1){
                         window.tempTip.show('不能批量创建信息修改工单');
                         return ;
                     }
-                    if (this.workOrder.orderIssueType === '拦截' ){
+                    if ('拦截' === this.workOrder.orderIssueType){
                         this.createInterceptWorkOrder();
-                    } else if (this.workOrder.orderIssueType === '快递异常'){
+                    } else if ('快递异常' === this.workOrder.orderIssueType){
                         this.createExpressAbnormalWorkOrder();
-                    } else if (this.workOrder.orderIssueType === '信息更改'){
+                    } else if ('信息更改' === this.workOrder.orderIssueType  ){
                         this.createInformationChangeWorkOrder();
-                    } else if (this.workOrder.orderIssueType === '错漏发'){
+                    } else if ('错漏发'===  this.workOrder.orderIssueType  ){
                         this.createMistakeWorkOrder();
-                    } else if (this.workOrder.orderIssueType === '破损'){
+                    } else if ('破损' === this.workOrder.orderIssueType  ){
                         this.createDamagedWorkOrder();
                     } else {
                         this.createDefaultWorkOrder();
@@ -1048,8 +1061,39 @@
                     this.createWorkOrder(data);
                 },
                 createDamagedWorkOrder(){ //破损
+
                     let data = this.getCreateWorkOrderData();
-                    this.createWorkOrder(data);
+                    let packageImages = this.getImages(this.workOrder.packageImages);  // 外包装破损图片
+                    let commodityImages = this.getImages(this.workOrder.commodityImage); // 内物破损图片
+                    let dealImages  = this.getImages(this.workOrder.dealImages); // 交易截图
+                    let message = null;
+
+                    if (0 === packageImages.length){message = '请选择外包图片';
+                    } else if (0 === commodityImages.length){message = '请选择内物装破损图片';
+                    } else if (0 === dealImages.length ){message = '请选择交易截图'}
+
+                    if(message){
+                        window.tempTip.setIndex(1999);
+                        window.tempTip.show(message)
+                        return;
+                    }
+                    let formData = new FormData();
+                    formData.append('order_no',data[0]['order_no']);
+                    formData.append('remark',data[0]['remark']);
+                    formData.append('type','破损');
+                    this.setFormDataImagePrefix(formData,'packageImages',packageImages);
+                    this.setFormDataImagePrefix(formData,'commodityImages',commodityImages);
+                    this.setFormDataImagePrefix(formData,'dealImages',dealImages);
+                    let url = "{{route('workOrder.damagedApi')}}";
+                    this.createWorkOrder(formData,url);
+                },
+                setFormDataImagePrefix(formData,prefix,images){
+                    images.forEach((item,i)=>{
+                        formData.append(`${prefix}[]`,item);
+                    });
+                },
+                getImages(images){
+                    return images.map((item)=>{return item.file;})
                 },
                 createMistakeWorkOrder(){ // 错漏发
                     let data = this.getCreateWorkOrderData();
@@ -1059,10 +1103,10 @@
                     let data = this.getCreateWorkOrderData();
                     this.createWorkOrder(data);
                 },
-                createWorkOrder(data){
-                    let url = '{{route('workOrder.storeApi')}}';
+                createWorkOrder(data,url = null){
+                    if (!url) url = '{{route('workOrder.storeApi')}}';
                     window.tempTip.setIndex(1999);
-                    window.axios.post(url,{params:data}).then(res=>{
+                    window.axios.post(url,data,{'Content-Type': 'multipart/form-data',}).then(res=>{
                         if (res.data.success){
                             window.tempTip.showSuccess('工单生成成功');
                             $('#intercept-modal').modal('hide');
@@ -1075,7 +1119,7 @@
                 },
                 getCreateWorkOrderData(){
                     return checkData.map(item=>{
-                        return {order_no: item,order_issue_type:this.workOrder.orderIssueType, remark:this.workOrder.remark.info,};
+                        return {order_no: item,order_issue_type:this.workOrder.orderIssueType, remark:this.workOrder.remark.info};
                     });
                 },
                 changeReceiveInfo() {

+ 2 - 0
routes/apiLocal.php

@@ -261,6 +261,8 @@ Route::group(['prefix' => 'print'],function (){
 });
 
 Route::prefix('workOrder')->group(function(){
+    Route::post('store','WorkOrderController@storeApi')->name('workOrder.storeApi'); // 创建
+    Route::post('damaged','WorkOrderController@damagedApi')->name('workOrder.damagedApi'); // 创建 破损
     Route::post('store','WorkOrderController@storeApi')->name('workOrder.storeApi'); // 创建
     Route::post('review','WorkOrderController@reviewApi')->name('workOrder.reviewApi'); // 审核
     Route::post('batchReview','WorkOrderController@batchReviewApi')->name('workOrder.batchReviewApi');  // 批量审核