Prechádzať zdrojové kódy

库外箱入库
料箱型号维护

Zhouzhendong 4 rokov pred
rodič
commit
3a956b8221

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

@@ -0,0 +1,38 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\MaterialBoxModel;
+use Illuminate\Support\Facades\Validator;
+
+class MaterialBoxModelController extends Controller
+{
+    public function index()
+    {
+        $models = MaterialBoxModel::query()->get();
+        return view("maintenance.materialBoxModel.index",compact("models"));
+    }
+
+    public function save()
+    {
+        $id = request("id");
+        $errors = Validator::make(request()->input(), [
+            'code'=>['required',$id?"unique:material_box_models,code,$id":"unique:material_box_models,code"],
+            'maximum_kind'=>['required',"integer","min:1"],
+            'description'=>['nullable'],
+        ],[
+            'integer'=>':attribute 非法参数',
+            'required'=>':attribute 必填',
+            'unique'=>':attribute 已存在',
+        ],[
+            'code'=>'编码',
+            'maximum_kind'=>'最大商品种类',
+            'description'=>'说明',
+        ]);
+        if (!$id){
+            MaterialBoxModel::query()->create([
+
+            ]);
+        }
+    }
+}

+ 87 - 0
app/Http/Controllers/StorageController.php

@@ -15,6 +15,7 @@ use App\Storage;
 use App\StoreItem;
 use App\TaskTransaction;
 use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\Model;
 use Illuminate\Foundation\Auth\AuthenticatesUsers;
 use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\Auth;
@@ -304,4 +305,90 @@ sql;
     {
         return 'name';
     }
+
+    /**
+     * 库外箱绑定至库位
+     */
+    public function bindBox()
+    {
+        $location = request("location");
+        $box = request("ide");
+        if (!$location || !$box)$this->error("参数传递错误");
+        $task = StationTaskMaterialBox::query()->select("id")->where(function ($query)use($location,$box){
+            /** @var Builder $query */
+            $query->whereHas("station",function ($query)use($location){
+                /** @var Builder $query */
+                $query->where("code",$location);
+            })->orWhereHas("materialBox",function ($query)use($box){
+                /** @var Builder $query */
+                $query->where("code",$box);
+            });
+        })->whereNotIn("status",["完成","取消"])->first();
+        if ($task)$this->error("库位或料箱存在任务待执行,无法放置料箱");
+        $ks = DB::connection("mysql_haiRobotics")->table("ks_bin")->select(DB::raw("1"))
+            ->where("ks_bin_code",$box)->where("status",4)->first();
+        if (!$ks)$this->error("海柔料箱状态异常");
+        DB::beginTransaction();
+        try {
+            $storages = Storage::query()->whereHas("station",function ($query)use($location){
+                /** @var Builder $query */
+                $query->where("code",$location);
+            })->orWhereHas("materialBox",function ($query)use($box){
+                /** @var Builder $query */
+                $query->where("code",$box);
+            })->lockForUpdate()->first();
+            $station = Station::query()->where("code",$location)->first();
+            $box = MaterialBox::query()->where("code",$box)->first();
+            if (!$station || !$box)$this->error("库位或料箱未在WAS记录");
+            switch ($storages->count()){
+                case 0:
+                    Storage::query()->create([
+                        "station_id" => $station->id,
+                        "material_box_id" => $box->id,
+                    ]);
+                    break;
+                case 1:
+                    $storage = $storages->first();
+                    if ($storage->status==1)$this->error("库存占用中");
+                    //已经映射库位 跳出
+                    if ($storage->station_id==$station->id && $storage->material_box_id==$box->id)break;
+                    //库存中 仅有库位信息
+                    if ($storage->station_id==$station->id){
+                        //料箱信息存在且有库存-》新建库位映射,将此料箱库位清空
+                        if ($storage->material_box_id && $storage->amount){
+                            Storage::query()->create([
+                                "station_id" => $station->id,
+                                "material_box_id" => $box->id,
+                            ]);
+                            $storage->update(["station_id"=>null]);
+                            //料箱信息不存在或没有库存信息 映射到当前库位
+                        }else $storage->update(["material_box_id"=>$box->id,"commodity_id"=>null,"amount"=>0]);
+                    }else $storage->update(["station_id"=>$station->id]);
+                    break;
+                case 2:
+                    //ls:库位库存 bs:料箱库存
+                    $ls = null;
+                    $bs = null;
+                    foreach ($storages as $storage){
+                        if ($storage->station_id==$station->id)$ls = $storage;
+                        else $bs = $storage;
+                    }
+                    //其一不存在说明库存中重复记录 需要人工筛查
+                    if (!$ls || !$bs)$this->error("库存中重复库位记录或料箱记录");
+                    //库位库存存在有效库存 库位置空 否则删除库存记录
+                    if ($ls->material_box_id && $ls->amount)$ls->update(["station_id"=>null]);
+                    else $ls->delete();
+                    //料箱映射库位改至当前库位
+                    $bs->update(["station_id"=>$station->id]);
+                    break;
+                default:
+                    $this->error("库存信息异常,料箱或库位未完全释放");
+            }
+            DB::commit();
+            $this->success();
+        }catch (\Exception $e){
+            DB::rollBack();
+            $this->error($e->getMessage());
+        }
+    }
 }

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

@@ -149,22 +149,9 @@ class TestController extends Controller
     }
     public function test()
     {
-        $a = function ($a){
-          dump($a);
-        };
-        $a(true);
-        dd(2);
-        $fee = OwnerFeeDetail::query()->with(["order.logistic","order.shop",
-            "order.packages.commodities.commodity","order.batch"])
-            ->find(3183469);
-
-        $rule = OwnerPriceOperation::query()->with(["items"=>function($query){
-            /** @var Builder $query */
-            $query->orderByRaw("CASE strategy  WHEN '起步' THEN 1 WHEN '默认' THEN 2 WHEN '特征' THEN 3 END DESC,priority");
-        }])->find(82);dd($rule->toArray());
-        $units = app("UnitService")->getUnitMapping(["件","单","箱","m³","T","kg"]); //获取单位映射集
-        $money = app("OwnerPriceOperationService")->matchItem($rule,Feature::MAPPING["order"],$fee->order,$units,2,[0=>true]);
-        dd($money);
+        $a = 1;
+        $b = 1;
+        dd(!!$a|!!$b);
     }
     public function orderCreateBill()
     {

+ 0 - 3
app/Services/MaterialBoxService.php

@@ -5,12 +5,9 @@ namespace App\Services;
 
 
 use App\MaterialBox;
-use App\Station;
 use App\StationTaskMaterialBox;
 use App\Storage;
 use Illuminate\Database\Eloquent\Builder;
-use Illuminate\Support\Collection;
-use Illuminate\Support\Facades\Cache;
 use App\Traits\ServiceAppAop;
 use Illuminate\Support\Facades\DB;
 

+ 39 - 0
resources/views/maintenance/materialBoxModel/_modal.blade.php

@@ -0,0 +1,39 @@
+<div class="modal fade" tabindex="-1" role="dialog" id="modal">
+    <div class="modal-dialog modal-lg modal-dialog-centered">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="font-weight-bold">新增</h5>
+                <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="code"><b class="text-danger">*&nbsp;</b>编码</label>
+                    <input class="col-5 form-control" :class="errors.code ? 'is-invalid' : ''" id="code" type="text"
+                           onpaste="return false" ondragenter="return false" oncontextmenu="return false;" style="ime-mode:disabled"
+                           v-model="model.code">
+                    <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.code">
+                        <strong>@{{ errors.code[0] }}</strong>
+                    </span>
+                </div>
+                <div class="row mt-2">
+                    <label class="col-2 offset-1" for="maximum_kind"><b class="text-danger">*&nbsp;</b>最大商品种类</label>
+                    <input class="col-5 form-control" :class="errors.maximum_kind ? 'is-invalid' : ''" id="maximum_kind" type="number" step="1" min="1" v-model="model.maximum_kind">
+                    <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.maximum_kind">
+                        <strong>@{{ errors.maximum_kind[0] }}</strong>
+                    </span>
+                </div>
+                <div class="row mt-2">
+                    <label class="col-2 offset-1" for="description">说明</label>
+                    <textarea class="col-5 form-control" :class="errors.description ? 'is-invalid' : ''" id="description" v-model="model.description">
+                    </textarea>
+                    <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.maximum_kind">
+                        <strong>@{{ errors.maximum_kind[0] }}</strong>
+                    </span>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-success" @click="submitModel()">  提  交  </button>
+            </div>
+        </div>
+    </div>
+</div>

+ 62 - 0
resources/views/maintenance/materialBoxModel/index.blade.php

@@ -0,0 +1,62 @@
+@extends('layouts.app')
+@section('title')料箱型号@endsection
+
+@section('content')
+    <div class="container-fluid card" id="container">
+        @include("maintenance.materialBoxModel._modal")
+        <div class="card-body">
+            <button class="btn btn-outline-info mb-1 mr-3" @click="openModal()"><span class="fa fa-plus"></span>&nbsp;新&nbsp;&nbsp;增</button>
+            <table class="table table-bordered table-striped">
+                <tr>
+                    <th>编码</th>
+                    <th>说明</th>
+                    <th>最大商品种类</th>
+                    <th>操作</th>
+                </tr>
+                <tr v-for="model in models">
+                    <td>@{{ model.code }}</td>
+                    <td>@{{ model.description }}</td>
+                    <td>@{{ model.maximum_kind }}</td>
+                    <td>
+                        <button class="btn btn-sm btn-outline-primary" @click="edit(city.id)">改</button>
+                        <button class="btn btn-sm btn-outline-dark" @click="destroy(city)">删</button>
+                    </td>
+                </tr>
+            </table>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script>
+        new Vue({
+            el:"#container",
+            data:{
+                models:[@foreach($models as $model)@json($model),@endforeach],
+                model:{},
+                errors:{},
+            },
+            methods:{
+                openModal(model= {maximum_kind:1}){
+                    this.model = model;
+                    $("#modal").modal("show");
+                },
+                submitModel(){
+                    window.tempTip.postBasicRequest("{{url('maintenance/materialBoxModel/save')}}",this.model,res=>{
+                        if (!this.model.id){
+                            this.models.unshift(res);
+                            return "新增成功";
+                        }
+                        this.models.some((model,index)=>{
+                            if (model.id===res.id){
+                                this.$set(this.models,index,res);
+                                return true;
+                            }
+                        });
+                        return "修改成功";
+                    });
+                },
+            }
+        });
+    </script>
+@endsection

+ 27 - 2
resources/views/store/inStorage/bindShelf.blade.php

@@ -4,8 +4,13 @@
 @section('content')
     <div class="container-fluid d-none" id="container">
         <div class="row h-100">
-            <div class="col-4 border border-dark bg-info" v-for="location in locations">
-                <span class="small">@{{ location }}</span>
+            <div class="col-4 border border-dark bg-white text-center p-0"
+                 v-for="(location,key) in locations" :class="selected===location ? 'box-shadow-dark' : ''"
+                 @click="selectedLocation(key)">
+                <div class="h-25 small">@{{ location }}</div>
+                <div class="w-100 h-75 center row align-items-center justify-content-center p-0">
+                    <div contentEditable='true' :id="'box-'+key" class="w-75 h-50 ml-4 text-success" @keydown.enter="submitBind(key)"></div>
+                </div>
             </div>
         </div>
     </div>
@@ -26,6 +31,7 @@
                     "HAIB1-03-02","HAIB1-02-02","HAIB1-01-02",
                     "HAIB1-03-01","HAIB1-02-01","HAIB1-01-01",
                 ],
+                selected:"",
             },
             mounted(){
                 if (navigator.userAgent.indexOf("Android")!==-1)this.isAndroid = true;
@@ -51,6 +57,25 @@
                 createBefore(){
                     this.before.ide = 'IDE000000';
                 },
+                selectedLocation(index){
+                    this.selected = this.locations[index];
+                    let element = document.getElementById("box-"+index);
+                    element.innerText = "";
+                    element.focus();
+                },
+                submitBind(index){
+                    event.preventDefault();
+                    let val = event.target.innerText;
+                    if (!val)return;
+                    if (val.length<10){
+                        val = this.before.ide.substr(0,10-val.length)+val;
+                        event.target.innerText = val;
+                    }
+                    window.tempTip.postBasicRequest("{{url('store/inStorage/bindBox')}}",{location:this.locations[index],ide:val},()=>{
+                        if (index!==this.locations.length-1)this.selectedLocation(index+1);
+                        return "绑定成功";
+                    },true)
+                },
             },
         });
     </script>

+ 4 - 0
routes/web.php

@@ -79,6 +79,9 @@ Route::group(['middleware'=>'auth'],function ($route){
     $route->post('getMenu','MenuController@get');
     /** 基础设置 */
     $route->group(['prefix'=>'maintenance'],function(){
+        /** 料箱型号 */
+        Route::get("materialBoxModel","MaterialBoxModelController@index");
+        Route::get("save","MaterialBoxModelController@save");
         /** 菜单 */
         Route::get('menu', 'MenuController@index');
         Route::group(['prefix'=>"menu"],function (){
@@ -467,6 +470,7 @@ Route::group(['middleware'=>'auth'],function ($route){
             Route::get('android.index',function (){return view('store.inStorage.androidIndex');});
             Route::post('android.login','StorageController@androidLogin');
             Route::get('boxBindShelf',function (){return view("store.inStorage.bindShelf");});
+            Route::post('bindBox','StorageController@bindBox');
         });
         Route::group(['prefix'=>'fast'],function() {
             Route::resource('storeItem','StoreItemController');