Zhouzhendong 5 лет назад
Родитель
Сommit
c14dc5f2df

+ 4 - 2
app/Console/Commands/MakeServiceCommand.php

@@ -54,9 +54,11 @@ class MakeServiceCommand extends Command
                 .PHP_EOL
                 .'use App\Traits\ServiceAppAop;'
                 .PHP_EOL
-                .'Class '.$fileName
                 .PHP_EOL
-                .'{ '
+                .'class '.$fileName
+                .PHP_EOL
+                .'{'
+                .PHP_EOL
                 .'    use ServiceAppAop;'
                 .PHP_EOL
                 .PHP_EOL.

+ 41 - 0
app/Http/Controllers/OrderFreezeController.php

@@ -2,10 +2,51 @@
 
 namespace App\Http\Controllers;
 
+use App\Components\AsyncResponse;
+use App\OrderFreeze;
+
 class OrderFreezeController extends Controller
 {
+    use AsyncResponse;
     public function index()
     {
+        $this->gate("订单管理-自动冻结");
+        $freezes = OrderFreeze::query()->with(["logistic:id,name","province:id,name","city:id,name","location:id,name"])
+            ->orderByDesc("id")->where("status",0)
+            ->paginate(request("paginate") ?? 50);
+        return view("order.index.freeze",compact("freezes"));
+    }
+
+    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();
 
+        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"),
+        ];
+        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"]);
+        $this->success($freeze);
+    }
+
+    public function delFreeze()
+    {
+        $this->gate("订单管理-自动冻结");
+        if (!request("id"))$this->error("非法参数");
+        OrderFreeze::query()->where("id",request("id"))->update(["status"=>1]);
+        app("OrderFreezeService")->refreshFreezes();
+        $this->success();
     }
 }

+ 18 - 0
app/Http/Controllers/RegionController.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Components\AsyncResponse;
+use App\Region;
+
+class RegionController extends Controller
+{
+    use AsyncResponse;
+    public function get()
+    {
+        $type = request("type");
+        $regions = Region::query();
+        if (!$type)$regions->where("type",$type);
+        $this->success($regions->get());
+    }
+}

+ 18 - 3
app/Http/Controllers/TestController.php

@@ -215,9 +215,24 @@ sql;
 
     public function zzd1()
     {
-        $a = [1,2];
-        $b = [2];
-        dd(array_diff($b,$a));
+        $freezeOrders = ["SO190628000050","SO190628000001"];
+        $this->pushWMS($freezeOrders);
+    }
+    private function pushWMS($freezeOrders)
+    {
+/*        if (!$freezeOrders)return;
+        $where = "''";
+        foreach ($freezeOrders as $f)$where .= ",'{$f}'";
+        $sql = <<<sql
+UPDATE DOC_ORDER_HEADER SET notes = CASE WHEN notes IS NULL THEN '停运' ELSE  notes||',停运' END where ORDERNO in ({$where})
+sql;*/
+        DB::connection("oracle")->update(DB::raw("update doc_order_header set userdefine1 = ? where orderno = ?"),['123',"SO190628000050"]);
+        return;
+        $sql = DB::raw(<<<sql
+    update BAS_CUSTOMER set ACTIVE_FLAG = ?,EDITTIME = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),EDITWHO = ? where CUSTOMERID = ? and CUSTOMER_TYPE = ?
+sql
+        );
+        DB::connection("oracle")->update($sql,['N',"2021-01-15",'WAS-'.(Auth::user() ? Auth::user()['name'] : 'SYSTEM'),"2021-01-15-test",'OW']);
     }
 
     public function mergeCarrier()

+ 80 - 0
app/Jobs/OrderFreeze.php

@@ -0,0 +1,80 @@
+<?php
+
+namespace App\Jobs;
+
+use App\OracleDOCOrderHeader;
+use App\Services\CacheService;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Support\Facades\DB;
+
+class OrderFreeze implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    protected $params;
+    protected $pool;
+    /**
+     * Create a new job instance.
+     * @param array $params
+     * @return void
+     */
+    public function __construct(array $params)
+    {
+        $this->params = $params;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        if (!$this->params)return;
+        $this->pool = app("OrderFreezeService")->getFreezes();
+        if (isset($this->params[0][0]))$this->processUpdate();
+        $this->processCreate();
+    }
+
+    protected function processUpdate()
+    {
+        unset($this->params[0]);
+    }
+
+    protected function processCreate()
+    {
+        $freezeOrders = [];
+        foreach ($this->params as $param){
+            if (!$param["logistic_id"])continue;
+            if ($this->isFreeze($param))$freezeOrders[] = $param["code"];
+        }
+        $this->pushWMS($freezeOrders);
+    }
+
+    private function isFreeze($param)
+    {
+        foreach ($this->pool as $pool){
+            if ($pool["location_id"]!=$param["location_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;
+            return true;
+        }
+        return false;
+    }
+
+    private function pushWMS($freezeOrders)
+    {
+        if (!$freezeOrders)return;
+        $where = "''";
+        foreach ($freezeOrders as $f)$where .= ",'{$f}'";
+        $sql = <<<sql
+UPDATE DOC_ORDER_HEADER SET notes = CASE WHEN notes IS NULL THEN '停运' ELSE  notes||',停运' END where ORDERNO in ({$where})
+sql;
+        DB::connection("oracle")->update($sql);
+    }
+}

+ 29 - 3
app/OrderFreeze.php

@@ -2,13 +2,39 @@
 
 namespace App;
 
+use App\Traits\ModelTimeFormat;
 use Illuminate\Database\Eloquent\Model;
 
-use App\Traits\LogChanging;
+use App\Traits\LogModelChanging;
 
 class OrderFreeze extends Model
 {
-    use LogChanging;
+    use LogModelChanging;
+    use ModelTimeFormat;
 
-    //
+    protected $fillable = [
+        "status","logistic_id","province_id","city_id","location_id"
+    ];
+
+    const status=[
+        0 => "冻结",
+        1 => "解冻",
+    ];
+
+    public function logistic()
+    {  //承运商
+        return $this->belongsTo(Logistic::class);
+    }
+    public function province()
+    {   //省
+        return $this->belongsTo(Province::class);
+    }
+    public function city()
+    {   //市
+        return $this->belongsTo(City::class);
+    }
+    public function location()
+    {   //区
+        return $this->belongsTo(City::class)->where("type","3");
+    }
 }

+ 3 - 1
app/Providers/AppServiceProvider.php

@@ -76,6 +76,7 @@ use App\Services\UserService;
 use App\Services\WarehouseService;
 use App\Services\WaybillFinancialService;
 use App\Services\WeighExceptedService;
+use App\Services\OrderFreezeService;
 use Illuminate\Queue\Events\JobFailed;
 use Illuminate\Support\Facades\Queue;
 use Illuminate\Support\Facades\Schema;
@@ -155,9 +156,10 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('OracleDocWaveDetailService',OracleDocWaveDetailService::class);
         app()->singleton('OrderCommodityAssignService',OrderCommodityAssignService::class);
         app()->singleton('OrderCommodityService',OrderCommodityService::class);
-        app()->singleton('OrderIssueRejectedBillService',OrderIssueRejectedBillService::class);
+        app()->singleton('OrderFreezeService',OrderFreezeService::class);
         app()->singleton('OrderIssuePerformanceService',OrderIssuePerformanceService::class);
         app()->singleton('OrderIssueProcessLogService',OrderIssueProcessLogService::class);
+        app()->singleton('OrderIssueRejectedBillService',OrderIssueRejectedBillService::class);
         app()->singleton('OrderIssueService',OrderIssueService::class);
         app()->singleton('OrderIssueWorkLoadService',OrderIssueWorkLoadService::class);
         app()->singleton('OrderPackageCommoditiesService',OrderPackageCommoditiesService::class);

+ 34 - 0
app/Region.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+
+use App\Traits\LogModelChanging;
+
+/**
+ * 留存:目前仅当作区级使用 后续将省市表并入此表
+ */
+class Region extends Model
+{
+    use LogModelChanging;
+
+    public $timestamps=false;
+    protected $fillable = ["parent_id","name","type","code"];
+
+    const type=[
+        1 => "省",
+        2 => "市",
+        3 => "区县",
+    ];
+
+    public function parent()
+    {   //父级
+        return $this->belongsTo(Region::class,"parent_id","id");
+    }
+
+    public function city()
+    {   //市
+        return $this->belongsTo(City::class,"parent_id","id");
+    }
+}

+ 50 - 0
app/Services/OrderFreezeService.php

@@ -0,0 +1,50 @@
+<?php 
+
+namespace App\Services;
+
+use App\Traits\ServiceAppAop;
+use Illuminate\Support\Facades\Cache;
+
+class OrderFreezeService
+{
+    use ServiceAppAop;
+
+
+    /**
+     * 获取冻结信息
+     */
+    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();
+        },config("cache.expirations.rarelyChange"));
+    }
+
+    /**
+     * 刷新冻结信息
+     */
+    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);
+        }
+    }
+}

+ 34 - 0
database/migrations/2021_01_15_114628_create_regions_table.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateRegionsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('regions', function (Blueprint $table) {
+            $table->id();
+            $table->bigInteger("parent_id")->nullable()->index()->comment("父级");
+            $table->string("name")->comment("名称");
+            $table->tinyInteger("type")->default(1)->comment("类型(行政区划)");
+            $table->string("code")->nullable()->comment("邮编");
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('regions');
+    }
+}

+ 58 - 0
resources/views/order/index/_freezeModal.blade.php

@@ -0,0 +1,58 @@
+<div class="modal fade" tabindex="-1" role="dialog" id="modal">
+    <div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal">&times;</button>
+            </div>
+            <div class="modal-body">
+                <div class="row">
+                    <label class="col-2 offset-1" for="logistic_id"><span class="text-danger">*&nbsp;</span>承运商</label>
+                    <select class="col-5 form-control form-control-sm"
+                            :class="errors.logistic_id ? 'is-invalid' : ''" id="logistic_id" type="text"
+                            v-model="freeze.logistic_id">
+                            <option v-for="logistic in data.logistics" :value="logistic.id">@{{ logistic.name }}</option>
+                    </select>
+                    <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.logistic_id">
+                        <strong>@{{ errors.logistic_id[0] }}</strong>
+                    </span>
+                </div>
+                <div class="row mt-2">
+                    <label class="col-2 offset-1" for="province_id">省</label>
+                    <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>
+                    </select>
+                    <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.province_id">
+                        <strong>@{{ errors.province_id[0] }}</strong>
+                    </span>
+                </div>
+                <div class="row mt-2">
+                    <label class="col-2 offset-1" for="city_id">市</label>
+                    <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>
+                    </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>
+                    <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="city.parent_id == freeze.city_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>
+                    </span>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-success" @click="submit()">提交</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 122 - 0
resources/views/order/index/freeze.blade.php

@@ -0,0 +1,122 @@
+@extends("layouts.app")
+@section('title')订单管理-自动冻结@endsection
+
+@section('content')
+    @component('order.index.menu')@endcomponent
+    <div class="card" id="container">
+        <div class="card-body">
+            <div class="container-fluid">
+
+                @include("order.index._freezeModal")
+
+                <div class="pull-left">
+                    <button class="btn btn-outline-info mb-1 mr-3" @click="openModal()"><span class="fa fa-plus"></span>&nbsp;新&nbsp;&nbsp;增</button>
+                </div>
+                <table class="table table-striped table-borderless rounded">
+                    <tr>
+                        <th>序号</th>
+                        <th>承运商</th>
+                        <th>省</th>
+                        <th>市</th>
+                        <th>区</th>
+                        <th></th>
+                    </tr>
+                    <tr v-for="(freeze,i) in freezes">
+                        <td>@{{ i+1 }}</td>
+                        <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>
+                            <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>
+                        </td>
+                    </tr>
+                </table>
+                {{$freezes->links()}}
+            </div>
+        </div>
+    </div>
+@stop
+
+@section("lastScript")
+    <script>
+        new Vue({
+            el:"#container",
+            data:{
+                freezes:[
+                    @foreach($freezes as $freeze)
+                    {!! $freeze !!},
+                    @endforeach
+                ],
+                data:{},
+                freeze:{},
+                errors : {},
+            },
+            methods:{
+                openModal(model = null,index = null){
+                    if (!model)this.freeze = {};
+                    else {
+                        model.index = index;
+                        this.freeze = model;
+                    }
+                    this._load();
+                    $("#modal").modal("show");
+                },
+                _load(){
+                    if (!this.data.logistics){
+                        let url = "{{url('maintenance/logistic/get')}}";
+                        window.tempTip.postBasicRequest(url,{},res=>{
+                            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){
+                        let url = "{{url('maintenance/region/get')}}";
+                        window.tempTip.postBasicRequest(url,{type:3},res=>{
+                            this.$set(this.data,'districts',res);
+                        });
+                    }
+                },
+                submit(){
+                    if (!this.freeze.logistic_id){
+                        window.tempTip.setIndex(1099);
+                        window.tempTip.setDuration(3000);
+                        window.tempTip.show("必须选择承运商");
+                        return;
+                    }
+                    let url = "{{url('order/index/freeze')}}";
+                    window.tempTip.postBasicRequest(url,this.freeze,res=>{
+                        let msg = "新增冻结选项成功!";
+                        if (this.freeze.id){
+                            msg = "修改冻结选项成功!";
+                            this.freezes[this.freeze.index] = res;
+                        } else this.freezes.unshift(res);
+                        $("#modal").modal("hide");
+                        return msg;
+                    },true)
+                },
+                deleteFreeze(freeze,index){
+                    let url = "{{url('order/index/freeze/delFreeze')}}";
+                    window.tempTip.confirm("确定要解除该冻结条件吗?",()=>{
+                        window.tempTip.postBasicRequest(url,freeze,res=>{
+                            this.$delete(this.freezes,index);
+                            return "删除成功!";
+                        })
+                    });
+                },
+            },
+        });
+    </script>
+@stop

+ 7 - 0
routes/web.php

@@ -193,6 +193,9 @@ Route::group(['prefix'=>'maintenance'],function(){
     Route::group(['prefix'=>"logistic"],function (){
         Route::post("get",'LogisticController@get');
     });
+    Route::group(['prefix'=>"region"],function (){
+        Route::post("get",'RegionController@get');
+    });
 
     Route::get('syncRedisLogs','LogController@syncRedisLogs');
     Route::resource('log', 'LogController');
@@ -539,6 +542,10 @@ Route::group(['prefix'=>'order'],function(){
         Route::group(['prefix'=>'commodityAssign'],function(){
             Route::post('import','OrderCommodityAssignController@import');
         });
+
+        Route::group(['prefix'=>'freeze'],function(){
+            Route::post('delFreeze','OrderFreezeController@delFreeze');
+        });
         Route::resource('freeze','OrderFreezeController');
     });
     /** 创建 */