Procházet zdrojové kódy

客户管理-计费模型

Zhouzhendong před 5 roky
rodič
revize
8355a36e72

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

@@ -80,4 +80,8 @@ class CitiesController extends Controller
         ]);
         return $validator;
     }
+
+    public function get(){
+        return City::query()->select("id","name")->get();
+    }
 }

+ 18 - 1
app/Http/Controllers/PriceModelController.php

@@ -11,6 +11,7 @@ use App\OwnerPriceLogistic;
 use App\OwnerPriceOperation;
 use App\Services\OwnerOutStorageRuleService;
 use App\Services\OwnerPriceOperationService;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\Gate;
@@ -506,7 +507,7 @@ class PriceModelController extends Controller
     public function logisticIndex()
     {
         if(!Gate::allows('计费模型-物流-查询')){ return redirect('denied');  }
-        $models = app("OwnerPriceLogisticService")->paginate();
+        $models = app("OwnerPriceLogisticService")->paginate()->append(["unit_range_json","other_unit_range_json"]);
         return response()->view('maintenance.priceModel.logistic.index',compact("models"));
     }
 
@@ -574,6 +575,22 @@ class PriceModelController extends Controller
         return response()->redirectTo("maintenance/priceModel/logistic")->with("successTip","修改“".$request->input("name")."”成功");
     }
 
+    public function logisticGetDetail(Request $request)
+    {
+        if(!Gate::allows('计费模型-物流-查询')){ return ["success"=>false,"data"=>"无权操作"];  }
+        $model = new OwnerPriceLogistic();
+        $model->id = $request->input("id");
+        $model->load(["details"=>function($query){
+            /** @var Builder $query */
+            $query->with(["unit","province","city"]);
+        }]);
+        return ["success"=>true,"data"=>$model->details];
+    }
+
+    public function expressExport($id)
+    {
+    }
+
     private function logisticValidator(array $params,$id = null)
     {
         return Validator::make($params,[

+ 13 - 0
app/OwnerPriceLogistic.php

@@ -18,6 +18,19 @@ class OwnerPriceLogistic extends Model
         "service_price",    //信息服务费
     ];
 
+    public function getUnitRangeJsonAttribute()
+    {
+        return json_encode(explode(",",$this->unit_range));
+    }
+    public function getOtherUnitRangeJsonAttribute()
+    {
+        return json_encode(explode(",",$this->other_unit_range));
+    }
+
+    public function details()
+    {
+        return $this->hasMany(OwnerPriceLogisticDetail::class,"owner_price_logistic_id","id");
+    }
     public function unit()
     {   //单位一
         return $this->hasOne(Unit::class,"id","unit_id");

+ 1 - 1
resources/views/maintenance/priceModel/express/_detailModal.blade.php

@@ -5,7 +5,7 @@
                 <div class="row w-100">
                     <input id="file" type="file" style="display:none" accept=".csv, .xlsx, .xls" @change="importDetail($event)"/>
                     @can("计费模型-作业-录入")<button type="button" class="btn btn-sm btn-outline-info col-1" @click="selectFile()">导入</button>@endcan
-                    <button type="button" class="btn btn-sm btn-outline-dark col-1">导出</button>
+                    <button type="button" class="btn btn-sm btn-outline-dark col-1" @click="exportDetail()">导出</button>
                     <div class="font-weight-bolder offset-3">“<label class="text-primary">@{{ name }}</label>”模型收费标准</div>
                 </div>
             </div>

+ 3 - 0
resources/views/maintenance/priceModel/express/index.blade.php

@@ -227,6 +227,9 @@
                 edit(id){
                     window.location.href = "{{url('maintenance/priceModel/express')}}/"+id+"/edit";
                 },
+                exportDetail(){
+                   window.open("{{url('maintenance/priceModel/express/export')}}/"+this.id);
+                }
             },
         });
     </script>

+ 109 - 0
resources/views/maintenance/priceModel/logistic/_detailModal.blade.php

@@ -0,0 +1,109 @@
+<div class="modal fade" tabindex="-1" role="dialog" id="detailModal">
+    <div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
+        <div class="modal-content">
+            <div class="modal-header">
+                <div class="row w-100">
+                    <input id="file" type="file" style="display:none" accept=".csv, .xlsx, .xls" @change="importDetail($event)"/>
+                    @can("计费模型-物流-录入")<button type="button" class="btn btn-sm btn-outline-info col-1" @click="selectFile()">导入</button>@endcan
+                    <button type="button" class="btn btn-sm btn-outline-dark col-1">导出</button>
+                    <div class="font-weight-bolder offset-3">“<label class="text-primary">@{{ name }}</label>”物流收费标准</div>
+                </div>
+            </div>
+            <div class="modal-body">
+                <div class="w-100 text-center mb-1" v-if="errors.length > 0">
+                    <button class="btn btn-sm btn-danger mb-1" @click="isShowError = true" v-if="!isShowError">@{{ errors.length }}条错误,点击展开</button>
+                    <button class="btn btn-sm btn-dark mb-1" @click="isShowError = false" v-else>收起错误展示</button>
+                    <div v-if="isShowError" class="container-fluid text-danger font-weight-bolder">
+                        <div class="row text-left">
+                            <div class="col-6" v-for="error in errors">@{{ error }}</div>
+                        </div>
+                    </div>
+                </div>
+                <table class="table table-sm table-bordered">
+                    <tr class="text-success">
+                        <th>操作</th>
+                        <th>计价单位</th>
+                        <th>计价区间</th>
+                        <th>省份</th>
+                        <th>市</th>
+                        <th>单价</th>
+                        <th>送货费</th>
+                        <th>起始计费</th>
+                        <th>起始计数</th>
+                        <th>费率</th>
+                        <th>操作</th>
+                    </tr>
+                    <tr v-for="(detail,i) in details[id]">
+                        <td>
+                            <div v-if="detail.edit">
+                                <button type="button" class="btn btn-sm btn-success" @click="submitDetail(detail)">确定</button>
+                                <button type="button" class="btn btn-sm btn-danger" @click="delDetail(detail,i)">取消</button>
+                            </div>
+                            <div v-else>
+                                @can("计费模型-作业-录入")<button type="button" class="btn btn-sm btn-outline-info" @click="addDetail()" v-if="i == 0">新增</button>@endcan
+                                @can("计费模型-作业-编辑")<button type="button" class="btn btn-sm btn-outline-primary" v-if="detail.id" @click="updateDetail(detail)">修改</button>@endcan
+                            </div>
+                        </td>
+                        <td>
+                            <label v-if="detail.edit && !detail.id">
+                                <select id="unit_id" class="form-control form-control-sm col-6" v-model="detail.unit_id">
+                                    <option v-for="unit in units" :value="unit.id">@{{ unit.name }}</option>
+                                </select>
+                            </label>
+                            <label v-else>@{{ detail.unit ? detail.unit.name : '' }}</label>
+                        </td>
+                        <td>
+                            <label v-if="detail.edit"><input type="text" class="form-control form-control-sm" :id="'range-'+detail.id"
+                                                             v-model="detail.range" :data="detail.range"></label>
+                            <label v-else>@{{ detail.range }}</label>
+                        </td>
+                        <td>
+                            <label v-if="detail.edit && !detail.id">
+                                <select class="form-control form-control-sm" v-model="detail.province_id">
+                                    <option v-for="province in provinces" :value="province.id">@{{ province.name }}</option>
+                                </select>
+                            </label>
+                            <label v-else>@{{ detail.province ? detail.province.name : '' }}</label>
+                        </td>
+                        <td>
+                            <label v-if="detail.edit && !detail.id">
+                                <select class="form-control form-control-sm" v-model="detail.city_id">
+                                    <option v-for="city in cities" :value="city.id">@{{ city.name }}</option>
+                                </select>
+                            </label>
+                            <label v-else>@{{ detail.city ? detail.city.name : '' }}</label>
+                        </td>
+                        <td>
+                            <label v-if="detail.edit"><input type="number" min="0" step="0.001" class="form-control form-control-sm" :id="'unit_price-'+detail.id"
+                                                             v-model="detail.unit_price" :data="detail.unit_price"></label>
+                            <label v-else>@{{ detail.unit_price }}</label>
+                        </td>
+                        <td>
+                            <label v-if="detail.edit"><input type="number" min="0" step="0.001" class="form-control form-control-sm" :id="'delivery_fee-'+detail.id"
+                                                             v-model="detail.delivery_fee" :data="detail.delivery_fee"></label>
+                            <label v-else>@{{ detail.delivery_fee }}</label>
+                        </td>
+                        <td>
+                            <label v-if="detail.edit"><input type="number" min="0" step="0.001" class="form-control form-control-sm" :id="'initial_fee-'+detail.id"
+                                                             v-model="detail.initial_fee" :data="detail.initial_fee"></label>
+                            <label v-else>@{{ detail.initial_fee }}</label>
+                        </td>
+                        <td>
+                            <label v-if="detail.edit"><input type="number" min="0" class="form-control form-control-sm" :id="'initial_amount-'+detail.id"
+                                                             v-model="detail.initial_amount" :data="detail.initial_amount"></label>
+                            <label v-else>@{{ detail.initial_amount }}</label>
+                        </td>
+                        <td>
+                            <label v-if="detail.edit"><input type="number" min="0" step="0.001" class="form-control form-control-sm" :id="'rate-'+detail.id"
+                                                             v-model="detail.rate" :data="detail.rate"></label>
+                            <label v-else>@{{ detail.rate }}</label>
+                        </td>
+                        <td>
+                            @can("计费模型-物流-编辑")<button type="button" class="btn btn-sm btn-outline-danger" @click="deletePriceModel(detail.id,i)" v-if="detail.id">删</button>@endcan
+                        </td>
+                    </tr>
+                </table>
+            </div>
+        </div>
+    </div>
+</div>

+ 2 - 2
resources/views/maintenance/priceModel/logistic/create.blade.php

@@ -57,7 +57,7 @@
                     <strong>@{{ errors.unit_id[0] }}</strong>
                 </span>
                 <label for="unit_range" class="col-2 text-right"><b class="text-danger">*</b>区间值</label>
-                <input id="unit_range" type="text" placeholder="文字描述区间逗号(,)间隔,示例:0-5,10-30,30-"
+                <input id="unit_range" type="text" placeholder="文字描述区间逗号(,)间隔,示例:0-5,10-30,30-" required
                        v-model="model.unit_range" name="unit_range" class="col-3 form-control" :class="errors.unit_range ? 'is-invalid' : ''">
                 <span class="invalid-feedback mt-0 offset-6" role="alert" v-if="errors.unit_range">
                     <strong>@{{ errors.unit_range[0] }}</strong>
@@ -73,7 +73,7 @@
                     <strong>@{{ errors.other_unit_id[0] }}</strong>
                 </span>
                 <label for="other_unit_range" class="col-2 text-right"><b class="text-danger">*</b>区间值</label>
-                <input id="other_unit_range" type="text" placeholder="文字描述区间逗号(,)间隔,示例:0-5,10-30,30-"
+                <input id="other_unit_range" type="text" placeholder="文字描述区间逗号(,)间隔,示例:0-5,10-30,30-" required
                        v-model="model.other_unit_range" name="other_unit_range" class="col-3 form-control" :class="errors.other_unit_range ? 'is-invalid' : ''">
                 <span class="invalid-feedback mt-0 offset-6" role="alert" v-if="errors.other_unit_range">
                     <strong>@{{ errors.other_unit_range[0] }}</strong>

+ 40 - 5
resources/views/maintenance/priceModel/logistic/index.blade.php

@@ -7,6 +7,7 @@
         @component('maintenance.priceModel.logistic.menu')@endcomponent
     </div>
     <div class="container-fluid mt-2" id="container">
+        @include("maintenance.priceModel.logistic._detailModal")
         @if(Session::has('successTip'))
             <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
         @endif
@@ -30,8 +31,7 @@
             <tr v-for="(model,i) in models">
                 <td>@{{ i+1 }}</td>
                 <td>
-                    <button v-if="id != model.id" class="btn btn-sm btn-info" @click="showDetailModal(model.id)">维护详情</button>
-                    <button v-if="id == model.id" class="btn btn-sm btn-dark" @click="id = ''">关闭详情</button>
+                    <button class="btn btn-sm btn-info" @click="showDetailModal(model)">维护详情</button>
                 </td>
                 <td>@{{ model.name }}</td>
                 <td>
@@ -70,9 +70,9 @@
                     @foreach($models as $model)
                     {   id:"{{$model->id}}",
                         name:"{{$model->name}}",
-                        unitRange:"{{$model->unit_range}}",
+                        unitRange:{!! $model->unit_range_json !!},
                         unitName:"{{$model->unit ? $model->unit->name : ''}}",
-                        otherUnitRange:"{{$model->other_unit_range}}",
+                        otherUnitRange:{!! $model->other_unit_range_json !!},
                         otherUnitName:"{{$model->otherUnit ? $model->otherUnit->name : ''}}",
                         pickUpPrice:"{{$model->pick_up_price}}",
                         fuelPrice:"{{$model->fuel_price}}",
@@ -84,16 +84,51 @@
                     @endforeach
                 ],
                 id:'',
+                name:"",
+                details : [],
+                units : null,
+                provinces : null,
+                cities : null,
+                errors:{!! $errors !!}
             },
             methods:{
+                _dataReady(){
+                    if (this.units === null){
+                        window.axios.post("{{url('maintenance/unit/getUnits')}}")
+                            .then(res=>{
+                                if (res.data.success){
+                                    this.units = res.data.data;
+                                    return;
+                                }
+                                window.tempTip.setDuration(3000);
+                                window.tempTip.show(res.data.data);
+                            }).catch(err=>{
+                            window.tempTip.setDuration(3000);
+                            window.tempTip.show("网络错误:"+err);
+                        });
+                    }
+                    if (this.provinces === null){
+                        window.axios.post('{{url('maintenance/province/get')}}')
+                            .then(res=>{
+                                this.provinces = res.data;
+                            });
+                    }
+                    if (this.cities === null){
+                        window.axios.post('{{url('maintenance/city/get')}}')
+                            .then(res=>{
+                                this.cities = res.data;
+                            });
+                    }
+                },
                 showDetailModal(model){
+                    this._dataReady();
                     this.id = model.id;
                     this.name = model.name;
                     if (this.details[model.id]){
                         $("#detailModal").modal("show");
                         return;
                     }
-                    window.axios.post("{{url('maintenance/priceModel/express/getDetail')}}", {id:model.id})
+                    window.axios.post("{{url('maintenance/priceModel/logistic/getDetail')}}", {id:model.id})
                         .then(res=>{
                             if (res.data.success){
                                 this.details[model.id] = res.data.data;

+ 5 - 0
routes/web.php

@@ -114,6 +114,7 @@ Route::group(['prefix'=>'maintenance'],function(){
             Route::delete('{id}','PriceModelController@expressDestroy');
             Route::get('{id}/edit','PriceModelController@expressEdit');
             Route::post('{id}/edit','PriceModelController@expressUpdate');
+            Route::get('export/{id}','PriceModelController@expressExport');
         });
         Route::get('express','PriceModelController@expressIndex');
         Route::post('express','PriceModelController@expressStore');
@@ -123,6 +124,7 @@ Route::group(['prefix'=>'maintenance'],function(){
             Route::delete('{id}','PriceModelController@logisticDestroy');
             Route::get('{id}/edit','PriceModelController@logisticEdit');
             Route::post('{id}/edit','PriceModelController@logisticUpdate');
+            Route::post('getDetail','PriceModelController@logisticGetDetail');
         });
         Route::get('logistic','PriceModelController@logisticIndex');
         Route::post('logistic','PriceModelController@logisticStore');
@@ -138,6 +140,9 @@ Route::group(['prefix'=>'maintenance'],function(){
     Route::group(['prefix'=>'province'],function(){
         Route::post('get','ProvincesController@get');
     });
+    Route::group(['prefix'=>'city'],function(){
+        Route::post('get','CitiesController@get');
+    });
 
     Route::get('syncRedisLogs','LogController@syncRedisLogs');
     Route::resource('log', 'LogController');