Ver código fonte

订单管理-自动冻结,允许设立街道,乡镇等行政区域

Zhouzhendong 5 anos atrás
pai
commit
9faddbf4fe

+ 21 - 7
app/Http/Controllers/OrderFreezeController.php

@@ -11,7 +11,7 @@ class OrderFreezeController extends Controller
     public function index()
     {
         $this->gate("订单管理-自动冻结");
-        $freezes = OrderFreeze::query()->with(["logistic:id,name","province:id,name","city:id,name","location:id,name"])
+        $freezes = OrderFreeze::query()->with(["logistic:id,name","province:id,name","city:id,name","district:id,name","town:id,name","street:id,name"])
             ->orderByDesc("id")->where("status",0)
             ->paginate(request("paginate") ?? 50);
         return view("order.index.freeze",compact("freezes"));
@@ -20,24 +20,38 @@ class OrderFreezeController extends Controller
     public function store()
     {
         $this->gate("订单管理-自动冻结");
-        $freeze = OrderFreeze::query()->where("logistic_id",request("logistic_id"))
-            ->where("province_id",request("province_id"))
-            ->where("city_id",request("city_id"))->where("status",0)
-            ->where("location_id",request("location_id"))->first();
+        $freeze = OrderFreeze::query()->where("logistic_id",request("logistic_id"))->where("status",0);
+        if (request("province_id"))$freeze->where("province_id",request("province_id"));
+        else $freeze->whereNull("province_id");
 
+        if (request("city_id"))$freeze->where("city_id",request("city_id"));
+        else $freeze->whereNull("city_id");
+
+        if (request("district_id"))$freeze->where("district_id",request("district_id"));
+        else $freeze->whereNull("district_id");
+
+        if (request("town_id"))$freeze->where("town_id",request("town_id"));
+        else $freeze->whereNull("town_id");
+
+        if (request("street_id"))$freeze->where("street_id",request("street_id"));
+        else $freeze->whereNull("street_id");
+
+        $freeze = $freeze->first();
         if ($freeze && $freeze->id!=request("id"))$this->error("已存在冻结选项,无需重复录入");
         $obj = [
             "logistic_id"   => request("logistic_id"),
             "province_id"   => request("province_id"),
             "city_id"       => request("city_id"),
-            "location_id"   => request("location_id"),
+            "district_id"   => request("district_id"),
+            "town_id"       => request("town_id"),
+            "street_id"     => request("street_id"),
         ];
         if (request("id")){
             $freeze = OrderFreeze::query()->find(request("id"));
             $freeze->update($obj);
         }else $freeze = OrderFreeze::query()->create($obj);
         app("OrderFreezeService")->refreshFreezes();
-        $freeze->load(["logistic:id,name","province:id,name","city:id,name","location:id,name"]);
+        $freeze->load(["logistic:id,name","province:id,name","city:id,name","district:id,name","town:id,name","street:id,name"]);
         $this->success($freeze);
     }
 

+ 19 - 1
app/Http/Controllers/RegionController.php

@@ -13,7 +13,7 @@ class RegionController extends Controller
     {
         $type = request("type");
         $regions = Region::query();
-        if (!$type)$regions->where("type",$type);
+        if ($type)$regions->where("type",$type);
         $this->success($regions->get());
     }
 
@@ -23,4 +23,22 @@ class RegionController extends Controller
         $regions = Region::withTrashed()->get();
         return view("maintenance.region.index",compact("regions"));
     }
+
+    public function store()
+    {
+        $parent = request("parent_id");
+        $type = request("type");
+        if (!$type)$this->error("非法参数");
+
+        $name = app("RegionService")->formatName(request("name"),$type);
+        if (!$name)$this->error("非法参数");
+
+        $region = Region::withTrashed()->where("name",$name)->where("type",$type)->first();
+        if ($region)$this->error("已经存在,无需重复录入");
+        $this->success(Region::query()->create([
+            "name" => $name,
+            "type" => $type,
+            "parent_id" => $parent
+        ]));
+    }
 }

+ 9 - 52
app/Http/Controllers/TestController.php

@@ -165,58 +165,15 @@ sql;
         });
     }
     public function test1(){
-        $a = [1,2,3];
-        $b = [2,3];
-        dd(array_diff($a,$b));
-   /*     $sql = <<<sql
-    select * from DOC_ORDER_HEADER WHERE ORDERNO in ('SO190628006175','SO190628006415',
-'SO190628007767','SO190628007535','SO190628007503','SO190628006567','SO190628006569','SO190628006995')
-sql;
-
-        DB::connection("oracle")->select(DB::raw($sql));*/
-   $a = new SyncWMSOrderTask();
-   $a->handle();
-        /*$order = new  OracleDOCOrderHeaderService();
-        $arr = $order->getOrderInfoByOrderNos(['SO190628006175','SO190628006415',
-            'SO190628007767','SO190628007535','SO190628007503','SO190628006567','SO190628006569','SO190628006995']);
-        dump($arr[0]);
-        app("OrderService")->syncOrder($arr);*/
-    }
-
-    public function test2(){
-        $a = new SyncBatchTask();
-        $a->handle();
-        //DB::connection("oracle")->select(DB::raw("select * from DOC_WAVE_DETAILS where waveno = 'W210121000004'"));
-    }
-
-
-    public function zzd()
-    {
-         $province = [
-             "a"=>["安徽","澳门"],
-             "b"=>["北京"],
-             "c"=>["重庆"],
-             "f"=>["福建"],
-             "g"=>["广东","甘肃","广西","贵州"],
-             "h"=>["河北","湖北","黑龙江","湖南","河南","海南"],
-             "j"=>["吉林","江苏","江西"],
-             "l"=>["辽宁"],
-             "n"=>["内蒙古","宁夏"],
-             "q"=>["青海"],
-             "s"=>["四川","山东","上海","陕西","山西"],
-             "t"=>["天津","台湾"],
-             "x"=>["香港","新疆","西藏"],
-             "y"=>["云南"],
-             "z"=>["浙江"],
-         ];
-         foreach ($province as $arr){
-             foreach ($arr as $name){
-                 Region::query()->create([
-                     "name" => $name,
-                     "type" => 1,
-                 ]);
-             }
-         }
+        $cities = City::query()->with("province")->where("province_id","!=",0)->get();
+        foreach ($cities as $city){
+            if ($city->name=='汕头/汕尾'){
+                app("RegionService")->getCity("汕头",$city->province->name);
+                app("RegionService")->getCity("汕尾",$city->province->name);
+                continue;
+            }
+            app("RegionService")->getCity($city->name,$city->province->name);
+        }
     }
 
     public function sync()

+ 3 - 1
app/Jobs/OrderFreeze.php

@@ -67,7 +67,9 @@ class OrderFreeze implements ShouldQueue
             if ($pool["logistic_id"]!=$param["logistic_id"])continue;
             if ($pool["province_name"] && (mb_strpos($param["province"],$pool["province_name"]) === false))continue;
             if ($pool["city_name"] && (mb_strpos($param["city"],$pool["city_name"]) === false))continue;
-            if ($pool["location_name"] && (mb_strpos($param["district"],$pool["location_name"]) === false))continue;
+            if ($pool["district_name"] && (mb_strpos($param["district"],$pool["district_name"]) === false))continue;
+            if ($pool["town_name"] && (mb_strpos($param["address"],$pool["town_name"]) === false))continue;
+            if ($pool["street_name"] && (mb_strpos($param["address"],$pool["street_name"]) === false))continue;
             return true;
         }
         return false;

+ 14 - 6
app/OrderFreeze.php

@@ -13,7 +13,7 @@ class OrderFreeze extends Model
     use ModelTimeFormat;
 
     protected $fillable = [
-        "status","logistic_id","province_id","city_id","location_id"
+        "status","logistic_id","province_id","city_id","district_id","town_id","street_id"
     ];
 
     const status=[
@@ -27,14 +27,22 @@ class OrderFreeze extends Model
     }
     public function province()
     {   //省
-        return $this->belongsTo(Province::class);
+        return $this->belongsTo(Region::class)->where("type",1);
     }
     public function city()
     {   //市
-        return $this->belongsTo(City::class);
+        return $this->belongsTo(Region::class)->where("type",2);
     }
-    public function location()
-    {   //区
-        return $this->belongsTo(City::class)->where("type","3");
+    public function district()
+    {   //区县
+        return $this->belongsTo(Region::class)->where("type",3);
+    }
+    public function town()
+    {   //乡镇
+        return $this->belongsTo(Region::class)->where("type",4);
+    }
+    public function street()
+    {   //村街
+        return $this->belongsTo(Region::class)->where("type",5);
     }
 }

+ 22 - 22
app/Services/OrderFreezeService.php

@@ -16,16 +16,7 @@ class OrderFreezeService
     public function getFreezes()
     {
         return app(CacheService::class)->getOrExecute("order_freeze_condition_pool",function (){
-            return \App\OrderFreeze::query()
-                ->with(["logistic:id,name","province:id,name","city:id,name","location:id,name"])
-                ->where("status",0)
-                ->get(["logistic_id","province_id","city_id","location_id"])->each(function (&$freeze){
-                    $freeze["logistic_name"] = $freeze->logistic ? $freeze->logistic->name : '';
-                    $freeze["province_name"] = $freeze->province ? $freeze->province->name : '';
-                    $freeze["city_name"]     = $freeze->city ? $freeze->city->name : '';
-                    $freeze["location_name"] = $freeze->location ? $freeze->location->name : '';
-                    unset($freeze->logistic,$freeze->province,$freeze->city,$freeze->location);
-                })->toArray();
+            return $this->get();
         },config("cache.expirations.rarelyChange"));
     }
 
@@ -34,17 +25,26 @@ class OrderFreezeService
      */
     public function refreshFreezes()
     {
-        if (Cache::has("order_freeze_condition_pool")){
-            $val = \App\OrderFreeze::query()
-                ->with(["logistic:id,name", "province:id,name", "city:id,name", "location:id,name"])
-                ->where("status", 0)
-                ->get()->each(function (&$freeze) {
-                    $freeze["logistic_name"] = $freeze->logistic ? $freeze->logistic->name : '';
-                    $freeze["province_name"] = $freeze->province ? $freeze->province->name : '';
-                    $freeze["city_name"] = $freeze->city ? $freeze->city->name : '';
-                    $freeze["location_name"] = $freeze->location ? $freeze->location->name : '';
-                });
-            Cache::put("order_freeze_condition_pool",$val);
-        }
+        if (Cache::has("order_freeze_condition_pool")) Cache::put("order_freeze_condition_pool",$this->get());
+    }
+
+    /**
+     * 获取所有冻结条件
+     *
+     */
+    public function get()
+    {
+        return \App\OrderFreeze::query()
+            ->with(["logistic:id,name","province:id,name","city:id,name","district:id,name","town:id,name","street:id,name"])
+            ->where("status",0)
+            ->get(["logistic_id","province_id","city_id","district_id","town_id","street_id"])->each(function (&$freeze){
+                $freeze["logistic_name"] = $freeze->logistic ? $freeze->logistic->name : '';
+                $freeze["province_name"] = $freeze->province ? $freeze->province->name : '';
+                $freeze["city_name"]     = $freeze->city ? $freeze->city->name : '';
+                $freeze["district_name"] = $freeze->district ? $freeze->district->name : '';
+                $freeze["town_name"] = $freeze->town ? $freeze->town->name : '';
+                $freeze["street_name"] = $freeze->street ? $freeze->street->name : '';
+                unset($freeze->logistic,$freeze->province,$freeze->city,$freeze->district,$freeze->town,$freeze->street);
+            })->toArray();
     }
 }

+ 30 - 6
app/Services/RegionService.php

@@ -9,6 +9,33 @@ class RegionService
 {
     use ServiceAppAop;
 
+
+    /**
+     * 根据行政级别格式化地域名,提取关键字
+     *
+     * @param string $name
+     * @param int $type
+     *
+     * @return string
+     */
+    public function formatName($name, $type)
+    {
+        switch ($type){
+            case 1:
+                $pool = ["省","自治区","市","特别行政"];
+                break;
+            case 2:
+                $pool = ["市","区","自治州"/*,"州"*/,"盟"];
+                break;
+            case 3:
+                $pool = ["市","区","自治县","县","自治旗","旗","特区","林区"];
+                break;
+            default:
+                $pool = [];
+        }
+        return $this->extractKeyword($name,$pool);
+    }
+
     /**
      * 根据省份获取ID
      *
@@ -18,8 +45,7 @@ class RegionService
      */
     public function getProvince(string $province):int
     {
-        $pool = ["省","自治区","市","特别行政"];
-        $province = $this->extractKeyword($province,$pool);
+        $province = $this->formatName($province,1);
         $region = Region::withTrashed()->where("name","like",$province."%")
             ->where("type",1)->first();
         if (!$region)$region = Region::query()->create([
@@ -39,8 +65,7 @@ class RegionService
      */
     public function getCity(string $city, $parent = null):int
     {
-        $pool = ["市","区","自治州","州","盟"];
-        $city = $this->extractKeyword($city,$pool);
+        $city = $this->formatName($city,2);
         $region = Region::withTrashed()->where("name","like",$city."%")
             ->where("type",2)->first();
         if (!$region){
@@ -67,8 +92,7 @@ class RegionService
      */
     public function getDistrict(string $district, $parent = null):int
     {
-        $pool = ["市","区","自治县","县","自治旗","旗","特区","林区"];
-        $district = $this->extractKeyword($district,$pool);
+        $district = $this->formatName($district,3);
         $region = Region::withTrashed()->where("name","like",$district."%")
             ->where("type",3)->first();
         if (!$region){

+ 36 - 0
database/migrations/2021_01_22_112931_change_order_freeze_table.php

@@ -0,0 +1,36 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeOrderFreezeTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_freezes', function (Blueprint $table) {
+            $table->renameColumn("location_id","district_id");
+            $table->bigInteger("town_id")->nullable()->comment("外键乡镇");
+            $table->bigInteger("street_id")->nullable()->comment("外键村街");
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('order_freezes', function (Blueprint $table) {
+            $table->renameColumn("district_id","location_id");
+            $table->dropColumn("town_id");
+            $table->dropColumn("street_id");
+        });
+    }
+}

+ 39 - 8
resources/views/order/index/_freezeModal.blade.php

@@ -21,7 +21,7 @@
                     <select class="col-5 form-control form-control-sm"
                             :class="errors.province_id ? 'is-invalid' : ''" id="province_id" type="text"
                             v-model="freeze.province_id">
-                        <option v-for="province in data.provinces" :value="province.id">@{{ province.name }}</option>
+                        <option v-for="province in mapping['0']" :value="province.id">@{{ province.name }}</option>
                     </select>
                     <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.province_id">
                         <strong>@{{ errors.province_id[0] }}</strong>
@@ -32,21 +32,52 @@
                     <select class="col-5 form-control form-control-sm"
                             :class="errors.city_id ? 'is-invalid' : ''" id="city_id" type="text"
                             v-model="freeze.city_id">
-                        <option v-for="city in data.cities" :value="city.id" v-if="city.province_id == freeze.province_id">@{{ city.name }}</option>
+                        <option v-for="city in mapping[freeze.province_id]" :value="city.id">@{{ city.name }}</option>
                     </select>
                     <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.city_id">
                         <strong>@{{ errors.city_id[0] }}</strong>
                     </span>
                 </div>
                 <div class="row mt-2">
-                    <label class="col-2 offset-1" for="location_id">区/县</label>
+                    <label class="col-2 offset-1" for="district_id">区/县</label>
                     <select class="col-5 form-control form-control-sm"
-                            :class="errors.location_id ? 'is-invalid' : ''" id="location_id" type="text"
-                            v-model="freeze.location_id">
-                        <option v-for="district in data.districts" :value="district.id" v-if="district.parent_id == freeze.city_id">@{{ district.name }}</option>
+                            :class="errors.district_id ? 'is-invalid' : ''" id="district_id" type="text"
+                            v-model="freeze.district_id">
+                        <option v-for="district in mapping[freeze.city_id]" :value="district.id">@{{ district.name }}</option>
                     </select>
-                    <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.location_id">
-                        <strong>@{{ errors.location_id[0] }}</strong>
+                    <label class="col-4">
+                        <input class="ml-1 form-control form-control-sm rounded-pill" @keydown.13="addRegion($event,3)" placeholder="此处输入回车添加新区/县">
+                    </label>
+                    <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.district_id">
+                        <strong>@{{ errors.district_id[0] }}</strong>
+                    </span>
+                </div>
+                <div class="row mt-2">
+                    <label class="col-2 offset-1" for="town_id">乡/镇</label>
+                    <select class="col-5 form-control form-control-sm"
+                            :class="errors.town_id ? 'is-invalid' : ''" id="town_id" type="text"
+                            v-model="freeze.town_id">
+                        <option v-for="town in mapping[freeze.district_id]" :value="town.id">@{{ town.name }}</option>
+                    </select>
+                    <label class="col-4">
+                        <input class="ml-1 form-control form-control-sm rounded-pill" @keydown.13="addRegion($event,4)" placeholder="此处输入回车添加新乡/镇">
+                    </label>
+                    <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.town_id">
+                        <strong>@{{ errors.town_id[0] }}</strong>
+                    </span>
+                </div>
+                <div class="row mt-2">
+                    <label class="col-2 offset-1" for="street_id">村/街</label>
+                    <select class="col-5 form-control form-control-sm"
+                            :class="errors.street_id ? 'is-invalid' : ''" id="street_id" type="text"
+                            v-model="freeze.street_id">
+                        <option v-for="street in mapping[freeze.town_id]" :value="street.id">@{{ street.name }}</option>
+                    </select>
+                    <label class="col-4">
+                        <input class="ml-1 form-control form-control-sm rounded-pill" @keydown.13="addRegion($event,5)" placeholder="此处输入回车添加新村/街">
+                    </label>
+                    <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.street_id">
+                        <strong>@{{ errors.street_id[0] }}</strong>
                     </span>
                 </div>
             </div>

+ 67 - 17
resources/views/order/index/freeze.blade.php

@@ -18,7 +18,9 @@
                         <th>承运商</th>
                         <th>省</th>
                         <th>市</th>
-                        <th>区</th>
+                        <th>区/县</th>
+                        <th>乡/镇</th>
+                        <th>村/街</th>
                         <th></th>
                     </tr>
                     <tr v-for="(freeze,i) in freezes">
@@ -26,7 +28,9 @@
                         <td>@{{ freeze.logistic ? freeze.logistic.name : '' }}</td>
                         <td>@{{ freeze.province ? freeze.province.name : '' }}</td>
                         <td>@{{ freeze.city ? freeze.city.name : '' }}</td>
-                        <td>@{{ freeze.location ? freeze.location.name : '' }}</td>
+                        <td>@{{ freeze.district ? freeze.district.name : '' }}</td>
+                        <td>@{{ freeze.town ? freeze.town.name : '' }}</td>
+                        <td>@{{ freeze.street ? freeze.street.name : '' }}</td>
                         <td>
                             <button class="btn btn-sm btn-outline-danger" @click="deleteFreeze(freeze,i)">删除</button>
                             <button class="btn btn-sm btn-outline-info" @click="openModal(freeze,i)">编辑</button>
@@ -52,6 +56,7 @@
                 data:{},
                 freeze:{},
                 errors : {},
+                mapping:{},
             },
             methods:{
                 openModal(model = null,index = null){
@@ -70,22 +75,17 @@
                             this.$set(this.data,'logistics',res);
                         });
                     }
-                    if (!this.data.provinces){
-                        let url = "{{url('maintenance/province/get')}}";
-                        window.tempTip.postBasicRequest(url,{},res=>{
-                            this.$set(this.data,'provinces',res);
-                        });
-                    }
-                    if (!this.data.cities){
-                        let url = "{{url('maintenance/city/get')}}";
-                        window.tempTip.postBasicRequest(url,{},res=>{
-                            this.$set(this.data,'cities',res);
-                        });
-                    }
-                    if (!this.data.districts){
+                    if (!this.data.regions){
                         let url = "{{url('maintenance/region/get')}}";
-                        window.tempTip.postBasicRequest(url,{type:3},res=>{
-                            this.$set(this.data,'districts',res);
+                        window.tempTip.postBasicRequest(url,{},res=>{
+                            this.$set(this.data,'regions',res);
+                            let mapping = {};
+                            res.forEach(region=>{
+                                if (!region["parent_id"])region["parent_id"] = 0;
+                                if (mapping[region["parent_id"]]) mapping[region["parent_id"]].push(region);
+                                else mapping[region["parent_id"]] = [region];
+                            });
+                            this.mapping = mapping;
                         });
                     }
                 },
@@ -116,6 +116,56 @@
                         })
                     });
                 },
+                addRegion(e,type){
+                   let val = e.target.value;
+                   if (!val)return;
+                    window.tempTip.setDuration(3000);
+                    window.tempTip.setIndex(1099);
+                    let prent = "";
+                    let msg = "";
+                    let map = {2:"城市",3:"区/县",4:"乡/镇",5:"村/街"};
+                    switch (type) {
+                        case 3:
+                            prent = this.freeze.city_id;
+                            msg = map[2];
+                            break;
+                        case 4:
+                            prent = this.freeze.district_id;
+                            msg = map[3];
+                            break;
+                        case 5:
+                            prent = this.freeze.town_id;
+                            msg = map[4];
+                            break;
+                    }
+                   if (!prent){
+                       window.tempTip.show("尚未选择所属"+msg);
+                       return;
+                   }
+                   let params = {
+                       parent_id:prent,
+                       name:val,
+                       type:type,
+                   };
+                   window.tempTip.postBasicRequest("{{url('maintenance/region/store')}}",params,res=>{
+                       let arr = [];
+                       if (this.mapping[prent])arr=this.mapping[prent];
+                       arr.push(res);
+                       this.$set(this.mapping,prent,arr);
+                       switch (type) {
+                           case 3:
+                               this.freeze.district_id = res.id;
+                               break;
+                           case 4:
+                               this.freeze.town_id = res.id;
+                               break;
+                           case 5:
+                               this.freeze.street_id = res.id;
+                               break;
+                       }
+                       return "新增"+map[type]+"成功";
+                   })
+                },
             },
         });
     </script>

+ 1 - 0
routes/web.php

@@ -195,6 +195,7 @@ Route::group(['prefix'=>'maintenance'],function(){
     });
     Route::group(['prefix'=>"region"],function (){
         Route::post("get",'RegionController@get');
+        Route::post("store",'RegionController@store');
     });
 
     Route::get('syncRedisLogs','LogController@syncRedisLogs');