Parcourir la source

Merge branch 'zzd'

# Conflicts:
#	app/Http/Controllers/TestController.php
zhouzhendong il y a 4 ans
Parent
commit
8f394fb495

+ 96 - 12
app/Http/Controllers/StorageController.php

@@ -9,6 +9,7 @@ use App\MaterialBox;
 use App\MaterialBoxCommodity;
 use App\MaterialBoxModel;
 use App\Owner;
+use App\Services\LogService;
 use App\Station;
 use App\StationTask;
 use App\StationTaskMaterialBox;
@@ -29,6 +30,7 @@ class StorageController extends Controller
 
     public function putShelf()
     {
+        $this->error("停用缓存架上架,联系管理员开启");
         $this->gate("入库管理-入库-缓存架入库");
         $asn = \request("asn");
         $ide = \request("ide");
@@ -92,18 +94,10 @@ class StorageController extends Controller
         $item = app("StoreItemService")->getMaxAvailableDetail(request("asn"),request("barCode"));
         if (!$item)$this->error("无此单据记录");
         $models = CommodityMaterialBoxModel::query()->where("commodity_id",$item->commodity_id)->get();
-        if ($models->count()==0)$this->error("商品首入,请使用缓存架空箱入库");
+        if ($models->count()==0)$this->success(["material_box_model_id"=>null]);
         $map = [];
         foreach ($models as $model)$map[$model->material_box_model_id] = $model;
-        $models = app("MaterialBoxModelService")->getModelSortedByOwner($item->store->owner_id);
-        foreach ($models as $model){
-            if (!isset($map[$model->id]))continue;
-            $result = app("StorageService")->getHalfBoxLocation($map[$model->id],$item,request("asn"));
-            if (!$result)continue;
-            $result->maximum = $model->maximum-$result->amount;
-            $this->success($result);
-        }
-        $this->success(["need"=>$models[0]->maximum,"material_box_model_id"=>$models[0]->material_box_model_id,"commodity_id"=>$item->commodity_id]);
+        $this->getMaterBoxModel($item,$map);
     }
 
     /**
@@ -167,11 +161,12 @@ sql;
         $this->gate("入库管理-入库-半箱补货入库");
         $boxId = request("material_box_id");
         $modelId = request("material_box_model_id");
+        if (!$modelId)$this->error("商品未设定库存上限");
         //获取目标库位
         $station = app("StationService")->getMirrorMappingLocation(request("station"));
         if (!$station)$this->error("未知库位");
-        $occupyTask = StationTaskMaterialBox::query()->where("station_id",$station->id)->whereNotIn("status",["完成","取消"])->first();
-        if ($occupyTask)$this->error("库位存在任务未处理完成");
+        $isAvailable = app("StationService")->isAvailable($station);
+        if (!$isAvailable)$this->error("库存被占用或存在任务未处理");
         $amount = app("StorageService")->checkPutAmount(request("asn"),request("barCode"));
         if ($amount<request("amount"))$this->error("待上架数量不足,最大可上数量为{$amount}");
 
@@ -206,6 +201,7 @@ sql;
             DB::commit();
             //亮灯
             app("CacheShelfService")->lightUp($station->code,'2','1');
+            app("StationService")->locationOccupy($station->code);//占用库位
         };
         if ($boxId && app("MaterialBoxService")->checkUsableBox($boxId))$this->success($exe($boxId));
         $item = app("StoreItemService")->getMaxAvailableDetail(request("asn"),request("barCode"));
@@ -379,4 +375,92 @@ sql;
         $this->success(MaterialBox::query()->where("code",request("ide"))
             ->update(["material_box_model_id"=>request("material_box_model_id")]));
     }
+
+    public function commodityBindModel()
+    {
+        $models = MaterialBoxModel::query()->get();
+        return view("store.inStorage.commodityBindModel",compact("models"));
+    }
+
+    public function getModels()
+    {
+        $this->success(MaterialBoxModel::query()->select("id","code","description","maximum_kind")->get());
+    }
+
+    /**
+     * 设定料箱最大
+     */
+    public function settingModelMaximum()
+    {
+        $insert = function ($commodityId){
+            $in = [];
+            $map = [];
+            $ids = [];
+            foreach (request("models") as $model){
+                $insert[] = [
+                    "commodity_id" => $commodityId,
+                    "material_box_model_id" => $model["id"],
+                    "maximum" => $model["maximum"]
+                ];
+                $map[$model["id"]] = $model;
+                $ids[] = $model["id"];
+            }
+            return array($in,$map,$ids);
+        };
+        if (request("commodityId")){
+            list($in,$map,$ids) = $insert(request("commodityId"));
+            if ($ids){
+                $map = array_flip($ids);
+                foreach (CommodityMaterialBoxModel::query()->whereIn("id",$ids)->lockForUpdate()->get() as $model){
+                    $index = $map[$model->id];
+                    if ($model->maximum != $in[$index]["maximum"])$model->update(["maximum"=>$in[$index]["maximum"]]);
+                    unset($in[$index]);
+                }
+                $in = array_values($in);
+            }
+            if ($in){
+                LogService::log(__CLASS__,__METHOD__,json_encode($in));
+                CommodityMaterialBoxModel::query()->insert($in);
+            }
+            $this->success();
+        }
+        $item = StoreItem::query()->whereHas("store",function (Builder $query){
+            $query->where("asn_code",request("asn"));
+        })->whereHas("commodity",function (Builder $query){
+            $query->whereHas("barcodes",function (Builder $query){
+                $query->where("code",request("barCode"));
+            });
+        })->first();
+        if (!$item)$this->error("商品不存在");
+        list($in,$map,$ids) = $insert($item->store->commodity_id);
+        LogService::log(__CLASS__,__METHOD__,json_encode($in));
+        CommodityMaterialBoxModel::query()->insert($in);
+        $this->getMaterBoxModel($item,$map);
+    }
+
+    private function getMaterBoxModel($item,$map)
+    {
+        $models = app("MaterialBoxModelService")->getModelSortedByOwner($item->store->owner_id);
+        foreach ($models as $model){
+            if (!isset($map[$model->id]))continue;
+            $result = app("StorageService")->getHalfBoxLocation($map[$model->id],$item,$item->store->asn_code);
+            if (!$result)continue;
+            $result->maximum = $model->maximum-$result->amount;
+            $this->success($result);
+        }
+        $this->success(["need"=>$models[0]->maximum,"material_box_model_id"=>$models[0]->material_box_model_id,"commodity_id"=>$item->commodity_id]);
+    }
+
+    /**
+     * 根据条码检索商品
+     */
+    public function searchBarCode()
+    {
+        $commodities = Commodity::query()->whereHas("barcodes",function (Builder $query){
+            $query->where("code",request("barCode"));
+        })->get();
+        if (!$commodities->count())$this->error("库内无此商品信息");
+        if ($commodities->count()>1)$commodities->load("owner");
+        $this->success($commodities);
+    }
 }

+ 2 - 1
app/Http/Controllers/StoreController.php

@@ -448,6 +448,7 @@ class StoreController extends Controller
      */
     public function halfChestStorage()
     {
-        return \view("store.inStorage.halfChestStorage");
+        $stations = app("StationService")->getCacheShelf();
+        return \view("store.inStorage.halfChestStorage",compact("stations"));
     }
 }

+ 59 - 2
app/Services/StationService.php

@@ -7,6 +7,7 @@ namespace App\Services;
 use App\Events\BroadcastToStation;
 use App\Station;
 use App\StationTask;
+use App\StationTaskMaterialBox;
 use App\StationType;
 use Exception;
 use Illuminate\Database\Eloquent\Model;
@@ -98,7 +99,7 @@ class StationService
      *
      * @return Model|null
      */
-    public function getMirrorMappingLocation($mirrorLocation)
+    public function getMirrorMappingLocation(string $mirrorLocation):?Station
     {
         if (!$mirrorLocation)return null;
         return Station::query()->where("code",substr($mirrorLocation,2))->first();
@@ -113,7 +114,7 @@ class StationService
     public function isHalfBoxLocation(?Station $station):bool
     {
         if (!$station)return false;
-        return $station->parent_id==7;
+        return $station->station_type_id==5 && $station->parent_id;
     }
 
     /**
@@ -127,4 +128,60 @@ class StationService
     {
         return $station->station_type_id == 5;
     }
+
+    /**
+     * 获取缓存架
+     *
+     * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection
+     */
+    public function getCacheShelf()
+    {
+        return Station::query()->where("station_type_id",5)
+            ->whereNotNull("parent_id")->get();
+    }
+
+    /**
+     * 库位占用
+     * 为未执行的上架任务预定库位,禁止二次下发
+     *
+     * @param string $location
+     * @param int|null $boxId
+     *
+     * @return int
+     */
+    public function locationOccupy(string $location, ?int $boxId=null):int
+    {
+        $update = ["status"=>1];
+        if ($boxId)$update["material_box_id"]=$boxId;
+        return Station::query()->where("code",$location)->update($update);
+    }
+
+    /**
+     * 库位释放
+     *
+     * @param string $location
+     * @param int|null $boxId
+     *
+     * @return int
+     */
+    public function locationFreed(string $location, ?int $boxId=null):int
+    {
+        $update = ["status"=>0];
+        if ($boxId)$update["material_box_id"]=$boxId;
+        return Station::query()->where("code",$location)->update($update);
+    }
+
+    /**
+     * 检查库位是否可用
+     *
+     * @param mixed $station
+     *
+     * @return bool
+     */
+    public function isAvailable($station):bool
+    {
+        if (!is_a($station,Model::class)) $station = Station::query()->where("code",$station)->first();
+        $s = StationTaskMaterialBox::query()->selectRaw("1")->where("station_id",$station->id)->whereNotIn("status",["完成","取消"])->first();
+        return $station && $station->status==0 && !$s;
+    }
 }

+ 14 - 31
app/Services/StorageService.php

@@ -36,23 +36,17 @@ class StorageService
             Station::query()->where("id",$stationTaskMaterialBox->station_id)
                 ->update(["material_box_id"=>$stationTaskMaterialBox->material_box_id,"status"=>0]);
             $stationTaskMaterialBox->loadMissing("station");
-            //清理原有任务
-            if ($stationTaskMaterialBox->station){
-                switch ($stationTaskMaterialBox->station->parent_id){
-                    case 6:
-                        $this->clearTask([$stationTaskMaterialBox->station->code]);
-                        break;
-                    case 7:
-                        $task = TaskTransaction::query()->with("materialBox")->where("fm_station_id",$stationTaskMaterialBox->station_id)
-                            ->where("status",0)->first();
-                        if ($task)app("CacheShelfService")->lightUp($stationTaskMaterialBox->station->code,'1','0',[
-                            "title"=>$task->materialBox->code ?? '',
-                            "detail01"=>"{$task->doc_code}",
-                            "detail02"=>"商品条码:{$task->bar_code}",
-                            "detail03"=>"上架数量:{$task->amount}",
-                        ]);
-                        break;
-                }
+            //如果为半箱位置 清理原有任务
+            if ($stationTaskMaterialBox->station && app("StationService")->isHalfBoxLocation($stationTaskMaterialBox->station)){
+                $task = TaskTransaction::query()->selectRaw("1")->with("materialBox")->where("fm_station_id",$stationTaskMaterialBox->station_id)
+                    ->where("status",0)->first();
+                if ($task)app("CacheShelfService")->lightUp($stationTaskMaterialBox->station->code,'1','0',[
+                    "title"=>$task->materialBox->code ?? '',
+                    "detail01"=>"{$task->doc_code}",
+                    "detail02"=>"商品条码:{$task->bar_code}",
+                    "detail03"=>"上架数量:{$task->amount}",
+                ]);
+                else $this->clearTask([$stationTaskMaterialBox->station->code]);
             }
             DB::commit();
         }catch (\Exception $e){
@@ -68,10 +62,7 @@ class StorageService
     public function releaseOccupation($stationTaskMaterialBox)
     {
         if (!app("StationService")->isCacheShelfLocation($stationTaskMaterialBox->station))return;
-        $stationTaskMaterialBox->station->update([
-            "material_box_id" => null,
-            "status" => 0,
-        ]);
+        app("StationService")->locationFreed($stationTaskMaterialBox->station->code);
     }
 
     /**
@@ -121,7 +112,8 @@ class StorageService
                     return false;
                 }
                 $taskMaterialBox = $this->createWarehousingTask($station->id,$task->material_box_id);//建立入库任务
-                if (!$this->enterWarehouse($task->material_box_id,$task->commodity_id,$task->amount))throw new \Exception("库存异常"); //处理库存
+                //2021-07-27 取消WAS库存维护
+                //if (!$this->enterWarehouse($task->material_box_id,$task->commodity_id,$task->amount))throw new \Exception("库存异常"); //处理库存
                 $task->update([
                     "task_id" => $taskMaterialBox->id,
                     "status" => 1,
@@ -513,15 +505,6 @@ SQL;
                 "ks_bin_space_code" => null,"ks_bin_space_id"=>null,"orig_ks_bin_space_code"=>null,"orig_ks_bin_space_id"=>null,
                 "status"=>4,
             ]);
-        //WAS任务清除
-        $station = Station::query()->select("id")->whereIn("code",$stationCodes);
-        $task = StationTask::query()->select("id")->where("status","!=",'完成')->whereIn("station_id",$station);
-        StationTaskMaterialBox::query()->where("status","!=",'完成')->whereIn("station_task_id",$task)->update([
-            "status" => "完成"
-        ]);
-        StationTask::query()->where("status","!=",'完成')->whereIn("station_id",$station)->update([
-            "status" => "完成"
-        ]);
     }
 
     /**

+ 13 - 0
resources/views/station/monitor/visual.blade.php

@@ -5,6 +5,13 @@
     <div class="container-fluid d-none" id="container">
         <div class="row mt-5 mb-5 text-center">
             <div class="col-6 offset-3 row">
+                <b>总占有率:</b>
+                <div class="progress w-75">
+                    <div class="progress-bar bg-danger" :style="{width:val+'%'}">@{{ val+'%' }}</div>
+                    <div class="progress-bar bg-success" :style="{width:(100-val)+'%'}">@{{(100-val)+'%'}}</div>
+                </div>
+            </div>
+            <div class="col-6 offset-3 row mt-5">
                 <div class="col-1 bg-success"></div>
                 <div class="col-1">空箱</div>
                 <div class="col-1 bg-danger offset-5"></div>
@@ -45,6 +52,9 @@
                 details:{}, //详情池
                 detail:[],  //当前详情
                 loadStatus:false,
+                sum:0,
+                quantity:0,
+                val:0,
             },
             mounted() {
                 let data = [];
@@ -80,6 +90,9 @@
                     this.mapping.push(arr);
                     window.tempTip.postBasicRequest("{{url('station/monitor/visual/getData')}}",{arr:arr},res=>{
                         this.$set(this.data,index-1,res);
+                        this.sum += 100;
+                        this.quantity += res;
+                        this.val = Math.round((this.quantity/this.sum)*10000)/100;
                     });
                 },
                 loadDetail(index,j){

+ 28 - 0
resources/views/store/inStorage/_commodities.blade.php

@@ -0,0 +1,28 @@
+<div class="modal fade" tabindex="-1" role="dialog" id="commodities">
+    <div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
+        <div class="modal-content">
+            <div class="modal-header">
+                <div class="font-weight-bold h4">多商品选择</div>
+                <button type="button" class="close" data-dismiss="modal">&times;</button>
+            </div>
+            <div class="modal-body">
+                <table class="w-100 h-100 table table-bordered table-striped">
+                    <tr>
+                       <th>货主</th>
+                       <th>名称</th>
+                       <th>SKU</th>
+                       <th></th>
+                    </tr>
+                    <tr v-for="(commodity,index) in commodities">
+                        <td>@{{ commodity.owner.name }}</td>
+                        <td>@{{ commodity.name }}</td>
+                        <td>@{{ commodity.sku }}</td>
+                        <td>
+                            <button class="btn btn-sm btn-primary" @click="selectedCommodity(index)">选定</button>
+                        </td>
+                    </tr>
+                </table>
+            </div>
+        </div>
+    </div>
+</div>

+ 25 - 0
resources/views/store/inStorage/_setMaximum.blade.php

@@ -0,0 +1,25 @@
+<div class="modal fade" tabindex="-1" role="dialog" id="maximumModal">
+    <div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
+        <div class="modal-content">
+            <div class="modal-header">
+                <div class="font-weight-bold h4">上限设置</div>
+                <button type="button" class="close" data-dismiss="modal">&times;</button>
+            </div>
+            <div class="modal-body">
+                <div class="row mt-2" v-for="model in models">
+                    <div class="col-6" style="overflow: hidden">
+                        @{{ model.code }}:@{{ model.description }}
+                    </div>
+                    <div class="col-6">
+                        <input class="form-control" type="number" step="1" min="1" placeholder="最大上限"
+                        v-model="model.maximum">
+                    </div>
+                    <hr class="w-100">
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-success" @click="settingModelMaximum()">提交</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 2 - 1
resources/views/store/inStorage/androidIndex.blade.php

@@ -19,10 +19,11 @@
     <div class="text-center h-75">
         <div class="w-100 center h-75 row align-items-center justify-content-center">
             <div class="w-100">
-                <a href="{{url('store/inStorage/cacheRackStorage')}}"><button class="btn btn-info w-75 text-white" style="height: 60px"><h4>整箱入库</h4></button></a>
+<!--                <a href="{{url('store/inStorage/cacheRackStorage')}}"><button class="btn btn-info w-75 text-white" style="height: 60px"><h4>整箱入库</h4></button></a>-->
                 <a href="{{url('store/inStorage/halfChestStorage')}}"><button class="btn btn-info w-75 mt-3 text-white" style="height: 60px"><h4>半箱入库</h4></button></a>
                 <a href="{{url('store/inStorage/boxBindShelf')}}"><button class="btn btn-info w-75 mt-3 text-white" style="height: 60px"><h4>新箱上架</h4></button></a>
                 <a href="{{url('store/inStorage/boxBindModel')}}"><button class="btn btn-info w-75 mt-3 text-white" style="height: 60px"><h4>料箱型号</h4></button></a>
+                <a href="{{url('store/inStorage/commodityBindModel')}}"><button class="btn btn-info w-75 mt-3 text-white" style="height: 60px"><h4>商品型号</h4></button></a>
             </div>
         </div>
     </div>

+ 1 - 1
resources/views/store/inStorage/boxBindModel.blade.php

@@ -61,7 +61,7 @@
                     if (len<10)this.info.ide = this.before.ide.substr(0,10-len)+this.info.ide;
                     window.tempTip.postBasicRequest("{{url('store/inStorage/searchIde')}}",{ide:this.info.ide},res=>{
                         this.info.material_box_model_id = res;
-                    },true)
+                    })
                 },
                 submitBind(){
                     window.tempTip.postBasicRequest("{{url('store/inStorage/boxBindModel')}}",this.info,()=>{

+ 95 - 0
resources/views/store/inStorage/commodityBindModel.blade.php

@@ -0,0 +1,95 @@
+@extends('layouts.app')
+@section('title')商品绑定型号-入库管理@endsection
+
+@section('content')
+    <div class="container-fluid d-none" id="container">
+        <div class="mt-3 col-8 offset-2">
+            <div class="form-group row">
+                <label for="barCode">商品条码</label>
+                <input id="barCode" type="text" class="form-control" v-model="barCode"></input>
+            </div>
+            <div class="input-group row mt-5">
+                <button type="submit" id="submit" class="btn btn-info offset-2 col-10" @click="searchBarCode()">检索</button>
+            </div>
+        </div>
+        @include("store.inStorage._setMaximum")
+        @include("store.inStorage._commodities")
+    </div>
+@stop
+
+@section('lastScript')
+    <script type="text/javascript">
+        new Vue({
+            el:"#container",
+            data:{
+                models:[@foreach($models as $model)@json($model),@endforeach],
+                commodityIndex:0,
+                commodities:[],
+                isAndroid:false,
+                barCode:"",
+            },
+            mounted(){
+                if (navigator.userAgent.indexOf("Android")!==-1)this.isAndroid = true;
+                this.pageInit();
+                $("#container").removeClass("d-none");
+            },
+            methods:{
+                //页面初始化
+                pageInit(){
+                    if (!this.isAndroid)return;
+                    let element = document.getElementById("navbarSupportedContent").parentElement;
+                    element.className = "row";
+                    element.children[0].className += " col-5";
+                    element.children[0].href = "#";
+                    element.innerHTML = element.children[0].outerHTML;
+                    let e1 = document.getElementById("menu");
+                    let e2 = document.getElementById("demand-div");
+                    if (e1)e1.remove();
+                    if (e2)e2.remove();
+                    document.getElementById("container").style.height = (window.innerHeight-100)+"px";
+                },
+                searchBarCode(){
+                    if(!this.barCode)return;
+                    window.tempTip.postBasicRequest("{{url('store/inStorage/searchBarCode')}}",{barCode:this.barCode},res=>{
+                        console.log(res)
+                        this.commodities = res;
+                        if (res.length>1){
+                            $("#commodities").modal("show");
+                            return;
+                        }
+                        $("#maximumModal").modal("show");
+                    },true)
+                },
+                submitBind(){
+                    window.tempTip.postBasicRequest("{{url('store/inStorage/boxBindModel')}}",this.info,()=>{
+                        this.info = {};
+                        return "绑定成功";
+                    })
+                },
+                selectedCommodity(index){
+                    this.commodityIndex = index;
+                    $("#commodities").modal("hide");
+                    $("#maximumModal").modal("show");
+                },
+                settingModelMaximum(){
+                    let models = [];
+                    this.models.forEach(model=>{
+                        if (model.maximum)models.push(model);
+                    });
+                    if (models.length<1){
+                        window.tempTip.setDuration(3000);
+                        window.tempTip.setIndex(1099);
+                        window.tempTip.show("请至少设定一个上限型号");
+                        return;
+                    }
+                    window.tempTip.postBasicRequest("{{url('store/inStorage/setMaximum')}}",
+                        {models:models,commodityId:this.commodities[this.commodityIndex].id},res=>{
+                            this.barCode = "";
+                            $("#maximumModal").modal("hide");
+                            return "商品型号上限设定成功";
+                        },true);
+                }
+            },
+        });
+    </script>
+@stop

+ 113 - 3
resources/views/store/inStorage/halfChestStorage.blade.php

@@ -4,7 +4,7 @@
 @section('content')
     <div class="container-fluid d-none" id="container">
         <div class="row">
-            <div class="card offset-md-3 col-md-6 col-sm-12">
+            <div class="card offset-md-1 col-md-5 col-sm-12">
                 <div class="card-body">
                     <div class="form-group text-center mt-2" id="header_title">
                         <span class="font-weight-bold h4">入库信息</span>
@@ -47,6 +47,22 @@
                     </div>
                 </div>
             </div>
+            <div class="card col-md-5 col-sm-12">
+                <div class="card-body">
+                    <div class="mt-1 text-center">
+                        <button class="btn btn-primary" @click="submitBox()">为选中格口手动补充料箱</button>
+                        <button class="btn btn-sm btn-info text-white" @click="reverse()">全选/反选</button>
+                    </div>
+                    <div class="mt-2 h-75">
+                        <div class="w-100 text-center mt-2" style="cursor: pointer" :style="{height:(100/ides.length)+'%'}" v-for="arr in ides">
+                            <div class="row" style="height: 33.3%" v-for="a in arr">
+                                <div class="col-4 border border-dark" v-for="ide in a" :class="[shelfOccupy[ide] ? 'bg-danger' : 'bg-success',selectedBox[ide] ? 'box-shadow-dark' : '']"
+                                     @click="fillingBox(ide)">@{{ ide }}</div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
             <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">
@@ -70,6 +86,7 @@
                     </div>
                 </div>
             </div>
+            @include("store.inStorage._setMaximum")
         </div>
     </div>
 @stop
@@ -95,14 +112,31 @@
                     "asn","station","barCode","amount","submit"
                 ],
                 isAndroid:false,
+                shelfOccupy:{},
+                selectedBox:{},
+                ides:[
+                    [
+                        ["HAIB2-03-03","HAIB2-02-03","HAIB2-01-03"],
+                        ["HAIB2-03-02","HAIB2-02-02","HAIB2-01-02"],
+                        ["HAIB2-03-01","HAIB2-02-01","HAIB2-01-01"],
+                    ],
+                    [
+                        ["HAIB1-03-03","HAIB1-02-03","HAIB1-01-03"],
+                        ["HAIB1-03-02","HAIB1-02-02","HAIB1-01-02"],
+                        ["HAIB1-03-01","HAIB1-02-01","HAIB1-01-01"],
+                    ],
+                ],
+                models:null,
             },
             mounted(){
                 if (navigator.userAgent.indexOf("Android")!==-1)this.isAndroid = true;
+                @foreach($stations as $station)this.$set(this.shelfOccupy,"{{$station->code}}",!!{{$station->material_box_id}});@endforeach
                 //this.codeFocus();
                 //this.globalClick();
                 this.createBefore();
                 this.pageInit();
                 $("#container").removeClass("d-none");
+                this.showMaximumModal();
             },
             methods:{
                 //页面初始化
@@ -162,8 +196,7 @@
                 },
                 _exeTask(){
                     window.tempTip.postBasicRequest("{{url('store/inStorage/acquireBox')}}",this.info,()=>{
-                        //this.info = {};
-                        this.info.amount = '';
+                        this.info = {asn:this.info.asn};
                         this.errors = {};
                         return "上架成功!";
                     });
@@ -189,6 +222,10 @@
                 checkMaximum(){
                     if (!this.info.asn || !this.info.barCode || this.checkSign)return;
                     window.tempTip.postBasicRequest("{{url('store/inStorage/checkMaximum')}}",this.info,res=>{
+                        if (!res.material_box_model_id){
+                            this.showMaximumModal();
+                            return;
+                        }
                         this.info.maximum = res.maximum;
                         this.info.material_box_id = res.material_box_id;
                         this.info.material_box_model_id = res.material_box_model_id;
@@ -204,6 +241,79 @@
                     if (element)element.focus();
                     e.preventDefault();
                     return false;
+                },
+                //提交填充料箱
+                submitBox(){
+                    window.tempTip.setDuration(3000);
+                    if (JSON.stringify(this.selectedBox)==='{}'){window.tempTip.show("未选中格口");return;}
+                    window.tempTip.confirm("确定选中格口已无料箱存在?",()=>{
+                        window.tempTip.setDuration(99999);
+                        window.tempTip.waitingTip("调取料箱中,请稍等");
+                        let boxes = [];
+                        for (let key in this.selectedBox)if (this.selectedBox[key]) boxes.push(key);
+                        window.tempTip.postBasicRequest("{{url('store/inStorage/resetCacheShelf')}}",{boxes:boxes},res=>{
+                            window.tempTip.cancelWaitingTip();
+                            window.tempTip.setDuration(3000);
+                            for (let i=0;i<res.boxes.length;i++){
+                                this.$set(this.shelfOccupy,res.boxes[i],true);
+                                this.$set(this.selectedBox,res.boxes[i],true);
+                            }
+                            if (res.data){
+                                window.tempTip.show(res.data);
+                                return;
+                            }
+                            return "手动补充成功";
+                        },true);
+                    })
+                },
+                reverse(){
+                    let ides = [];
+                    this.ides.forEach(arr=>{
+                        arr.forEach(a=>{
+                            a.forEach(ide=>{
+                                ides.push(ide);
+                            })
+                        })
+                    });
+                    ides.forEach((ideCode)=>{
+                        this.$set(this.selectedBox,ideCode,this.selectedBox[ideCode] ? !this.selectedBox[ideCode] : true);
+                    });
+                },
+                //选中填充料箱
+                fillingBox(ideCode){
+                    this.$set(this.selectedBox,ideCode,this.selectedBox[ideCode] ? !this.selectedBox[ideCode] : true);
+                },
+                showMaximumModal(){
+                    if (this.models){
+                        $("#maximumModal").modal("show");
+                        return;
+                    }
+                    window.tempTip.postBasicRequest("{{url("store/inStorage/getModels")}}",{},res=>{
+                        this.models = res;
+                        $("#maximumModal").modal("show");
+                    })
+                },
+                settingModelMaximum(){
+                    let models = [];
+                    this.models.forEach(model=>{
+                       if (model.maximum)models.push(model);
+                    });
+                    if (models.length<1){
+                        window.tempTip.setDuration(3000);
+                        window.tempTip.setIndex(1099);
+                        window.tempTip.show("请至少设定一个上限型号");
+                        return;
+                    }
+                    window.tempTip.postBasicRequest("{{url('store/inStorage/setMaximum')}}",
+                        {models:models,asn:this.info.asn,barCode:this.info.barCode},res=>{
+                        this.info.maximum = res.maximum;
+                        this.info.material_box_id = res.material_box_id;
+                        this.info.material_box_model_id = res.material_box_model_id;
+                        this.info.commodity_id = res.commodity_id;
+                        if(!this.info.amount)this.info.amount = res.maximum;
+                        $("#maximumModal").modal("hide");
+                        return "该库位最大可上数为"+res.maximum;
+                    },true);
                 }
             },
         });

+ 4 - 0
routes/web.php

@@ -477,9 +477,13 @@ Route::group(['middleware'=>'auth'],function ($route){
             Route::post('android.login','StorageController@androidLogin');
             Route::get('boxBindShelf',function (){return view("store.inStorage.bindShelf");});
             Route::get('boxBindModel','StorageController@bindModelIndex');
+            Route::get('commodityBindModel','StorageController@commodityBindModel');
             Route::post('bindBox','StorageController@bindBox');
             Route::post('searchIde','StorageController@searchIde');
             Route::post('boxBindModel','StorageController@boxBindModel');
+            Route::post('getModels','StorageController@getModels');
+            Route::post('setMaximum','StorageController@settingModelMaximum');
+            Route::post('searchBarCode','StorageController@searchBarCode');
         });
         Route::group(['prefix'=>'handInStorage'],function() {
             Route::get('receive',function (){return view('store.handInStorage.receive');});//收货页面