Kaynağa Gözat

单料箱多商品

Zhouzhendong 4 yıl önce
ebeveyn
işleme
1c993b43b6

+ 16 - 0
app/Http/Controllers/MaterialBoxModelController.php

@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
 
 use App\Components\AsyncResponse;
 use App\MaterialBoxModel;
+use App\Owner;
 use Illuminate\Support\Facades\Validator;
 
 class MaterialBoxModelController extends Controller
@@ -47,4 +48,19 @@ class MaterialBoxModelController extends Controller
     {
         $this->success(MaterialBoxModel::destroy(request("id")));
     }
+
+    public function ownerSequence()
+    {
+        $owners = app("OwnerService")->getIntersectPermitting(["id","name","model_sequence"]);
+        $models = MaterialBoxModel::query()->get();
+        return view("maintenance.materialBoxModel.modelSequence",compact("owners","models"));
+    }
+
+    public function updateModelSequence()
+    {
+        $sequence = request("sequence");
+        $this->success(Owner::query()->where("id",request("id"))->update([
+            "model_sequence" => $sequence ?: null
+        ]));
+    }
 }

+ 2 - 1
app/Owner.php

@@ -36,7 +36,8 @@ class Owner extends Model
         "user_workgroup_id",    //仓库小组(工作组)
         "relevance",            //关联模型的JSON数组
         'subjection',           //主体公司
-        'is_tax_exist'          //是否必填税率
+        'is_tax_exist',         //是否必填税率
+        'model_sequence'        //调箱序列(优先级匹配)
     ];
     //relevance说明 0:仓储 1:作业 2:快递 3:物流 4:直发 5:系统 存储示例:["0","1"]存在仓储与作业计费
     protected $casts = [

+ 2 - 0
app/Providers/AppServiceProvider.php

@@ -151,6 +151,7 @@ use App\Services\SettlementBillsAreaFeeService;
 use App\Services\DbOpenService;
 use App\Services\DeliveryTypeService;
 use App\Services\ErrorPushService;
+use App\Services\MaterialBoxModelService;
 
 class AppServiceProvider extends ServiceProvider
 {
@@ -264,6 +265,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('LogisticYTOService', LogisticYTOService::class);
         app()->singleton('LogisticZopService', LogisticZopService::class);
         app()->singleton('LogisticZopService', LogisticZopService::class);
+        app()->singleton('MaterialBoxModelService',MaterialBoxModelService::class);
         app()->singleton('MaterialBoxService', MaterialBoxService::class);
         app()->singleton('MenuService',MenuService::class);
         app()->singleton('NewOrderCountingRecordService',NewOrderCountingRecordService::class);

+ 39 - 0
app/Services/MaterialBoxModelService.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Services;
+
+use App\Owner;
+use App\Traits\ServiceAppAop;
+use App\MaterialBoxModel;
+use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Support\Facades\DB;
+
+class MaterialBoxModelService
+{
+    use ServiceAppAop;
+    protected $modelClass=MaterialBoxModel::class;
+
+    /**
+     * 获取货主的模型序列
+     *
+     * @param int|null $owner
+     *
+     * @return Collection
+     */
+    public function getModelSortedByOwner(?int $owner):Collection
+    {
+        $sequence = [];
+        $sql = "(CASE id ";
+        if (!$owner){
+            $owner = Owner::query()->find($owner);
+            if ($owner){
+                $sequence = explode(",",$owner->model_sequence);
+                foreach ($sequence as $index=>$s)$sql .= " WHEN {$s} THEN {$index}";
+                $sql .= " END)";
+            }
+        }
+        $query = MaterialBoxModel::query();
+        if ($sequence)$query->whereIn("id",$sequence)->orderBy(DB::raw($sql));
+        return $query->get();
+    }
+}

+ 32 - 0
database/migrations/2021_07_16_093026_change_owners_add_model_sequence_column.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeOwnersAddModelSequenceColumn extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('owners', function (Blueprint $table) {
+            $table->string("model_sequence")->nullable()->comment("模型序列");
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('owners', function (Blueprint $table) {
+            $table->dropColumn("model_sequence");
+        });
+    }
+}

+ 143 - 0
resources/views/maintenance/materialBoxModel/modelSequence.blade.php

@@ -0,0 +1,143 @@
+@extends('layouts.app')
+@section('title')货主定制序列-料箱型号@endsection
+
+@section('content')
+    <div class="container-fluid d-none" id="container">
+        <div class="row">
+            <div class="col-6 card">
+                <div class="card-header">
+                    <label class="pull-left h5 font-weight-bold">货主列表</label>
+                    <label class="pull-right"><input type="text" class="form-control form-control-sm rounded-pill" placeholder="检索" @keydown.enter="seekOwner()"></label>
+                </div>
+                <div class="card-body p-0" style="cursor: pointer">
+                    <ul class="list-group">
+                        <li class="list-group-item" :class="selectedOwner===owner.id ? 'bg-info' : ''" v-for="(owner,i) in owners" v-show="!owner.hide" @click="loadModel(owner)">
+                            @{{ owner.name }}
+                        </li>
+                    </ul>
+                </div>
+            </div>
+            <div class="col-6 card card-body pt-0">
+                <div class="card">
+                    <div class="card-header">
+                        <div class="pull-left h5 font-weight-bold mr-3">料箱型号</div>
+                        <button class="btn btn-sm btn-outline-info" @click="checkAll()">全选</button>
+                        <button class="pull-right btn border border-2" :class="isSaveSort ? 'btn-success' : 'text-secondary border-secondary'" :disabled="!isSaveSort" @click="saveModel()">保存</button>
+                    </div>
+                    <div class="card-body p-0">
+                        <ul class="list-group" style="cursor: move;">
+                            <li class="list-group-item" v-for="model in sequenceModels" :id="'model-'+model.id" draggable="true"
+                                @drop="drop($event)" @dragover="dragover($event,dragoverId!==model.id)" @dragstart.stop="dragstart(model.id)">
+                                <div class="form-check">
+                                    <label class="form-check-label">
+                                        <input type="checkbox" name="model" class="form-check-input" @change="isSaveSort=true" v-model="model.checked" :value="model.id">@{{ model.description }}
+                                    </label>
+                                </div>
+                            </li>
+                        </ul>
+                        <li id="dragover-container" class="border-dashed-red" v-show="isDragover" @drop="drop($event)" @dragover="dragover($event,false)">
+                            <div class='w-100 text-center text-secondary'>拖拽至此</div>
+                        </li>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+@stop
+
+@section("lastScript")
+    <script type="text/javascript">
+        new Vue({
+            el:"#container",
+            data:{
+                owners:[@foreach($owners as $owner)@json($owner),@endforeach],
+                models:{@foreach($models as $model)"{{$model->id}}":@json($model),@endforeach},
+                selectedOwner:"",
+                sequenceModels:[],
+                dragoverId:"",
+                isDragover:false,
+                isSaveSort:false,
+                checked:false,
+            },
+            mounted(){
+                $("#container").removeClass("d-none");
+            },
+            methods:{
+                checkAll(){
+                    this.sequenceModels.forEach((m,i)=>{
+                        this.$set(this.sequenceModels[i],'checked',!this.checked);
+                    });
+                    this.checked = !this.checked;
+                },
+                seekOwner(){
+                    let val = event.target.value;
+                    this.owners.forEach((owner,i)=>{
+                        if (owner.name.indexOf(val)===-1)this.$set(this.owners[i],'hide',true);
+                        else this.$set(this.owners[i],'hide',false);
+                    });
+                },
+                loadModel(owner){
+                    if (this.selectedOwner === owner.id)return;
+                    this.selectedOwner = owner.id;
+                    this.isSaveSort = false;
+                    let arr = [];
+                    if (owner.model_sequence)arr = owner.model_sequence.split(",");
+                    let sequenceModels = [];
+                    arr.forEach(id=>{
+                        let model = Object.assign({},this.models[id]);
+                        model.checked = true;
+                        sequenceModels.push(model);
+                    });
+                    for (let key in this.models){
+                        if (!arr.includes(this.models[key].id.toString())){
+                            let model = Object.assign({},this.models[key]);
+                            model.checked = false;
+                            sequenceModels.push(model);
+                        }
+                    }
+                    this.sequenceModels = sequenceModels;
+                },
+                drop(e){
+                    e.preventDefault();
+                    e.stopPropagation();
+                    $("#dragover-container").after($("#model-"+this.dragoverId));
+                    this.dragoverId = "";
+                    this.isDragover = false;
+                    this.isSaveSort = true;
+                },
+                dragover(e, isAllow = true){
+                    e.preventDefault();
+                    e.stopPropagation();
+                    if (isAllow) e.currentTarget.after(document.getElementById("dragover-container"))
+                },
+                dragstart(id){
+                    $("#model-"+id).after($("#dragover-container"));
+                    this.dragoverId = id;
+                    this.isDragover = true;
+                },
+                saveModel(){
+                    if (!this.isSaveSort)return;
+                    let element = document.getElementsByName("model");
+                    let val = "";
+                    for (let i=0;i<element.length;i++){
+                        if (element[i].checked===true)val += element[i].value+",";
+                    }
+                    val = val.substring(0,val.length-1);
+                    let index = null;
+                    this.owners.some((owner,i)=>{
+                        if (owner.id===this.selectedOwner){
+                            index = i;
+                            return true;
+                        }
+                    });
+                    this.isSaveSort = false;
+                    if (this.owners[index].model_sequence === val)return;
+                    window.tempTip.postBasicRequest("{{url('maintenance/materialBoxModel/updateModelSequence')}}",{id:this.selectedOwner,sequence:val},()=>{
+                        this.$set(this.owners[index],"model_sequence",val);
+                        return "模型序列已更新";
+                    })
+                },
+            },
+        });
+    </script>
+@stop

+ 2 - 0
routes/web.php

@@ -84,6 +84,8 @@ Route::group(['middleware'=>'auth'],function ($route){
         Route::group(['prefix'=>"materialBoxModel"],function (){
             Route::post("save","MaterialBoxModelController@save");
             Route::post("destroy","MaterialBoxModelController@destroy");
+            Route::post("updateModelSequence","MaterialBoxModelController@updateModelSequence");
+            Route::get("ownerSequence","MaterialBoxModelController@ownerSequence");
         });
         /** 菜单 */
         Route::get('menu', 'MenuController@index');