Procházet zdrojové kódy

Merge branch 'zzd' of ssh://was.baoshi56.com:10022/var/git/bswas

 Conflicts:
	app/Http/Controllers/TestController.php
LD před 5 roky
rodič
revize
8c82d39b5d

+ 2 - 2
.gitignore

@@ -4,8 +4,8 @@
 /public/js
 /public/css
 /public/images
-/public/images/QRCodeIMG/*
-/resources/images/QRCodeIMG/*
+/public/images/QRCodeIMG/*.png
+/resources/images/QRCodeIMG/*.png
 /public/mix-manifest.json
 /public/js/app.js
 /public/css/app.csscd

+ 43 - 4
app/Console/Commands/SyncBatchTask.php

@@ -2,6 +2,8 @@
 
 namespace App\Console\Commands;
 
+use App\Order;
+use App\OrderBin;
 use App\Services\BatchService;
 use App\Services\CacheService;
 use App\Services\common\BatchUpdateService;
@@ -99,14 +101,51 @@ class SyncBatchTask extends Command
             $valueStore = ValueStore::query()->where("name","wave_detail_last_sync_date")->first();
             return $valueStore->value ?? Carbon::now()->subSeconds(65)->toDateTimeString();
         });
-        $sql = "SELECT WM_CONCAT(ORDERNO) orderno,WAVENO FROM DOC_WAVE_DETAILS WHERE EDITTIME > TO_DATE(?,'yyyy-mm-dd hh24:mi:ss')  GROUP BY WAVENO";
+        $sql = "SELECT ORDERNO,WAVENO,SEQNO FROM DOC_WAVE_DETAILS WHERE EDITTIME > TO_DATE(?,'yyyy-mm-dd hh24:mi:ss')";
         $details = DB::connection("oracle")->select(DB::raw($sql),[$date]);
         if (count($details) < 1)return;
         $map = [];
         $nos = [];
+        $orderCodes = [];
+        $seqnos = [];
         foreach ($details as $detail){
-            $map[$detail->waveno] = explode(",",$detail->orderno);
-            $nos[] = $detail->waveno;
+            if (isset($map[$detail->waveno]))$map[$detail->waveno][] = $detail->orderno;
+            else {
+                $map[$detail->waveno] = [$detail->orderno];
+                $nos[] = $detail->waveno;
+            }
+            $orderCodes[] = $detail->orderno;
+            $seqnos[$detail->orderno] = $detail->seqno;
+        }
+        $orders = Order::query()->select("id","code")->whereIn("code",$orderCodes)->get();
+        if (count($orderCodes) != count($orders)){
+            $orderIds = [];
+            $orderMap = [];
+            foreach ($orders as $order){
+                $orderIds[] = $order->id;
+                $orderMap[$order->id] = $seqnos[$order->code];
+            }
+            $updateBin = [["id","number"]];
+            $insertBin = [];
+            $orderBins = OrderBin::query()->select("id","order_id","number")->whereIn("order_id",$orderIds)->get();
+            foreach ($orderBins as $orderBin){
+                if ($orderBin->number != $orderMap[$orderBin->order_id])$updateBin[]=["id"=>$orderBin->id,"number"=>$orderMap[$orderBin->order_id]];
+                unset($orderMap[$orderBin->order_id]);
+            }
+            foreach ($orderMap as $orderId=>$binNumber){
+                $insertBin[]=[
+                    "order_id"=>$orderId,
+                    "number"=>$binNumber
+                ];
+            }
+            if (count($updateBin)>1){
+                app(BatchUpdateService::class)->batchUpdate("order_bins",$updateBin);
+                LogService::log(__METHOD__,"波次同步-更新订单格口号",json_encode($updateBin));
+            }
+            if ($insertBin){
+                OrderBin::query()->insert($insertBin);
+                LogService::log(__METHOD__,"波次同步-录入订单格口号",json_encode($insertBin));
+            }
         }
         $batches = $this->batchService->get(["code"=>$nos]);
         foreach ($batches as $batch){
@@ -141,7 +180,7 @@ class SyncBatchTask extends Command
 //        $this->batchService->assignTasks($batches);
 
 
-        ValueStore::query()->where("name","wave_last_sync_date")->update(["value"=>Carbon::now()->subSeconds(1)->toDateTimeString()]);
+        ValueStore::query()->where("name","wave_detail_last_sync_date")->update(["value"=>Carbon::now()->subSeconds(1)->toDateTimeString()]);
     }
 
     /**

+ 35 - 0
app/Events/BroadcastToStation.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace App\Events;
+
+use Illuminate\Broadcasting\Channel;
+use Illuminate\Broadcasting\PresenceChannel;
+use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
+
+class BroadcastToStation implements ShouldBroadcast
+{
+    public $json;
+    private $id;
+    /**
+     * Create a new event instance.
+     *
+     * @param int $id
+     * @param string $json
+     * @return void
+     */
+    public function __construct(int $id, string $json)
+    {
+        $this->id = $id;
+        $this->json = $json;
+    }
+
+    /**
+     * Get the channels the event should broadcast on.
+     *
+     * @return Channel|array
+     */
+    public function broadcastOn()
+    {
+        return new PresenceChannel('station-'.$this->id);
+    }
+}

+ 6 - 1
app/Http/Controllers/StationController.php

@@ -3,6 +3,8 @@
 namespace App\Http\Controllers;
 
 use App\Station;
+use App\StationTypeBinMonitor;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
 
 class StationController extends Controller
@@ -19,6 +21,7 @@ class StationController extends Controller
     public function monitorIndex()
     {
         $stations = Station::query()->with('type:name','parent:name')->whereHas('type',function($query){
+            /** @var Builder $query */
             $query->where('name','料箱监视器');
         })->paginate(100);
         return view('station.monitor.index',compact('stations'));
@@ -51,7 +54,9 @@ class StationController extends Controller
     }
     public function monitorShow(Station $station)
     {
-        return view('station.monitor.show',compact('station'));
+        $wall = StationTypeBinMonitor::query()->where("station_id",$station->id)->first();
+        if (!$wall)$wall = factory(StationTypeBinMonitor::class)->make(StationTypeBinMonitor::$default);
+        return view('station.monitor.show',compact('station',"wall"));
     }
 
     /**

+ 23 - 0
app/Http/Controllers/TestController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
 
 use App\Authority;
 use App\Batch;
+use App\Carrier;
 use App\Commodity;
 use App\CommodityBarcode;
 use App\Console\Commands\SyncWMSOrderTask;
@@ -36,7 +37,11 @@ use App\RejectedBillItem;
 use App\Services\CacheService;
 use App\Services\common\BatchUpdateService;
 use App\Services\common\DataHandlerService;
+use App\Services\DocWaveHeaderService;
+use App\Services\FeatureService;
 use App\Services\InventoryCompareService;
+use App\Services\LogisticService;
+use App\Services\LogService;
 use App\Services\OracleDocAsnHerderService;
 use App\Services\OracleDOCOrderHeaderService;
 use App\Services\OrderPackageService;
@@ -44,10 +49,14 @@ use App\Services\OrderService;
 use App\Services\OrderTrackingOwnerService;
 use App\Services\OrderTrackingService;
 use App\Services\OwnerService;
+use App\Services\ShopService;
 use App\Services\StoreService;
 use App\Services\WarehouseService;
+use App\StoreCheckingReceiveItem;
 use App\User;
 use App\Warehouse;
+use App\Waybill;
+use App\WaybillPriceModel;
 use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Support\Facades\Auth;
@@ -93,6 +102,20 @@ class TestController extends Controller
             app(BatchUpdateService::class)->batchUpdate('inventory_accounts',$updateParams);
         }
     }
+    public function zzd()
+    {
+        $a = DB::connection("oracle")->select(DB::raw("select * from DOC_WAVE_DETAILS where WAVENO = 'W201210000112'"));
+        $str="";
+        $a = array_column($a,"orderno");
+        foreach ($a as $t){
+            $str.="'".$t."',";
+        }
+        dd($str);
+        $str = rtrim($str,",");
+        $c = DB::connection("oracle")->select(DB::raw("select SUM(qtyordered) s from DOC_ORDER_DETAILS where ORDERNO IN (".$str.")"));
+        dd($c);
+    }
+
     public function mergeCarrier(){
         $carriers = Carrier::query()->get();
         $logistics = [];

+ 19 - 5
app/Services/StationService.php

@@ -4,9 +4,9 @@
 namespace App\Services;
 
 
+use App\Events\BroadcastToStation;
 use App\Station;
 use App\StationTask;
-use App\StationTaskCommodity;
 use App\StationType;
 use Exception;
 use Illuminate\Support\Facades\Cache;
@@ -29,19 +29,33 @@ class StationService
     }
 
     function broadcast($station_id, $json_data){
+        broadcast(new BroadcastToStation($station_id,$json_data));
+    }
+
+    function broadcastBinMonitor($station_id, StationTask $stationTask){
+        $stationTask->loadMissing(["taskCommodities.commodity.barcodes","taskCommodities.materialBox","taskBatches.batch"/*,"taskMaterialBoxes.box"*/]);
+        $stationTask->toJson();
+        $this->broadcast($station_id, $stationTask->toJson());
         //...
-        //event(new BroadcastToStation($station_id,$json_data))
+        //$stationTask->stationTaskBatch
+        //$stationTask->stationTaskMaterialBox
+        //$stationTask->stationTaskCommodities   //'待处理',   '处理中' blue,'完成',green
+        //$batch= $stationTask->stationTaskBatch->batch
+        //$orders= $batch->....
+        //.....
+        //$json_data=['batch','stationCommodities','stationMaterialBin','$currentStationTaskCommodity']
+        //$this->broadcast($station_id, $json_data)
     }
 
-    function broadcastBinMonitor($station_id, StationTask $stationTask,StationTaskCommodity $stationTaskCommodity){
+    function broadcastBinChange($station_id, StationTask $stationTask, int $currentStationTaskCommodity_id){
         //...
         //$stationTask->stationTaskBatch
         //$stationTask->stationTaskMaterialBox
-        //$stationTask->stationCommodities
+        //$stationTask->stationTaskCommodities   //'待处理',   '处理中' blue,'完成',green
         //$batch= $stationTask->stationTaskBatch->batch
         //$orders= $batch->....
         //.....
-        //$json_data=['batch','stationCommodities','stationMaterialBin']
+        //$json_data=['batch','stationCommodities','stationMaterialBin','$currentStationTaskCommodity']
         //$this->broadcast($station_id, $json_data)
     }
 

+ 18 - 1
app/StationTask.php

@@ -6,5 +6,22 @@ use Illuminate\Database\Eloquent\Model;
 
 class StationTask extends Model
 {
-    protected $fillable = ['status',];
+    protected $fillable = ['status'];
+
+
+    public function taskCommodities()
+    {   //任务商品列表
+        return $this->belongsToMany(StationTaskCommodity::class,"station_task_children","station_task_id","station_task_table_id")
+            ->where("station_task_table_type","station_task_commodities");
+    }
+    public function taskBatches()
+    {   //任务波次 目前为单个,取值时应取第一个即可
+        return $this->belongsToMany(StationTaskBatch::class,"station_task_children","station_task_id","station_task_table_id")
+            ->where("station_task_table_type","station_task_batches");
+    }
+    public function taskMaterialBoxes()
+    {   //任务料箱
+        return $this->belongsToMany(StationTaskMaterialBox::class,"station_task_children","station_task_id","station_task_table_id")
+            ->where("station_task_table_type","station_task_material_boxes");
+    }
 }

+ 6 - 1
app/StationTaskBatch.php

@@ -6,5 +6,10 @@ use Illuminate\Database\Eloquent\Model;
 
 class StationTaskBatch extends Model
 {
-    protected $fillable=['batch_id','station_id','station_mission_batch_type_id','status'];
+    protected $fillable=['batch_id','station_id','station_task_batch_type_id','status'];
+
+    public function batch()
+    {   //波次
+        return $this->hasOne(Batch::class,"id","batch_id");
+    }
 }

+ 15 - 0
app/StationTaskChildren.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+
+class StationTaskChildren extends Model
+{
+    protected $table="station_task_children";
+    protected $fillable=[
+        "station_task_id",
+        "station_task_table_type",
+        "station_task_table_id",
+    ];
+}

+ 10 - 1
app/StationTaskCommodity.php

@@ -6,5 +6,14 @@ use Illuminate\Database\Eloquent\Model;
 
 class StationTaskCommodity extends Model
 {
-    protected $fillable= ['station_id','material_box_id','commodity_id','amount','order_id','status'];
+    protected $fillable= ['station_id','material_box_id','commodity_id','amount','order_id','status',"bin_number"];
+
+    public function commodity()
+    {   //商品
+        return $this->hasOne(Commodity::class,"id","commodity_id");
+    }
+    public function materialBox()
+    {   //料箱
+        return $this->hasOne(MaterialBox::class,"id","material_box_id");
+    }
 }

+ 5 - 0
app/StationTaskMaterialBox.php

@@ -7,4 +7,9 @@ use Illuminate\Database\Eloquent\Model;
 class StationTaskMaterialBox extends Model
 {
     protected $fillable=['station_id','material_box_id','status'];
+
+    public function box()
+    {   //料箱
+        return $this->hasOne(MaterialBox::class,"id","material_box_id");
+    }
 }

+ 7 - 0
app/StationTypeBinMonitor.php

@@ -7,4 +7,11 @@ use Illuminate\Database\Eloquent\Model;
 class StationTypeBinMonitor extends Model
 {
     protected $fillable=['station_id','bin_row_length','bin_column_length','bin_wall_amount'];
+
+    public static $default=[
+        "station_id"        => null,
+        "bin_row_length"    => 2,
+        "bin_column_length" => 4,
+        "bin_wall_amount"   => 2,
+    ];
 }

+ 2 - 2
composer.json

@@ -29,7 +29,7 @@
         "pusher/pusher-php-server": "^4.1",
         "te7a-houdini/laravel-trix": "^2.0",
         "yajra/laravel-oci8": "7.0",
-      "ext-bcmath": "*"
+        "ext-bcmath": "*"
     },
     "require-dev": {
         "barryvdh/laravel-debugbar": "^3.2",
@@ -81,4 +81,4 @@
             "@php artisan key:generate --ansi"
         ]
     }
-}
+}

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 401 - 112
composer.lock


+ 0 - 2
config/app.php

@@ -174,7 +174,6 @@ return [
          App\Providers\BroadcastServiceProvider::class,
         App\Providers\EventServiceProvider::class,
         App\Providers\RouteServiceProvider::class,
-
     ],
 
     /*
@@ -225,7 +224,6 @@ return [
         'URL' => Illuminate\Support\Facades\URL::class,
         'Validator' => Illuminate\Support\Facades\Validator::class,
         'View' => Illuminate\Support\Facades\View::class,
-
     ],
 
 ];

+ 13 - 0
database/factories/BarcodeFactory.php

@@ -0,0 +1,13 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\CommodityBarcode;
+use Faker\Generator as Faker;
+
+$factory->define(CommodityBarcode::class, function (Faker $faker) {
+    return [
+        'code' => md5(\Illuminate\Support\Str::random(8)).date('Ymd'),
+        'commodity_id'=>factory(\App\Commodity::class),
+    ];
+});

+ 1 - 1
database/factories/MaterialBoxFactory.php

@@ -7,6 +7,6 @@ use Faker\Generator as Faker;
 
 $factory->define(MaterialBox::class, function (Faker $faker) {
     return [
-        //
+        'code'=>md5(\Illuminate\Support\Str::random(5)).date('Ymd')
     ];
 });

+ 16 - 0
database/factories/StationTaskBatchFactory.php

@@ -0,0 +1,16 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\StationTaskBatch;
+use Faker\Generator as Faker;
+
+$factory->define(StationTaskBatch::class, function (Faker $faker) {
+    $status = ['待处理','挂起','处理中','完成','异常','取消'];
+    return [
+        'batch_id' => factory(\App\Batch::class),
+        'station_id' => factory(\App\Station::class),
+        'station_task_batch_type_id' => factory(\App\StationTaskBatchType::class),
+        "status"=>$status[array_rand($status)],
+    ];
+});

+ 14 - 0
database/factories/StationTaskChildrenFactory.php

@@ -0,0 +1,14 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\StationTaskChildren;
+use Faker\Generator as Faker;
+
+$factory->define(StationTaskChildren::class, function (Faker $faker) {
+    return [
+        "station_task_id" => factory(\App\StationTask::class),
+        "station_task_table_type" => \Illuminate\Support\Str::random(5),
+        "station_task_table_id" => rand(1,5),
+    ];
+});

+ 19 - 0
database/factories/StationTaskCommodityFactory.php

@@ -0,0 +1,19 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\StationTaskCommodity;
+use Faker\Generator as Faker;
+
+$factory->define(StationTaskCommodity::class, function (Faker $faker) {
+    $status = ['待处理','挂起','处理中','完成','异常','取消'];
+    return [
+        'station_id' => factory(\App\Station::class),
+        'material_box_id' => factory(\App\MaterialBox::class),
+        'commodity_id' => factory(\App\Commodity::class),
+        'amount'=>rand(1,1000),
+        "bin_number"=>rand(1,24),
+        'order_id'=>factory(\App\Order::class),
+        "status"=>$status[array_rand($status)],
+    ];
+});

+ 2 - 1
database/factories/StationTaskFactory.php

@@ -6,7 +6,8 @@ use App\StationTask;
 use Faker\Generator as Faker;
 
 $factory->define(StationTask::class, function (Faker $faker) {
+    $status = ['待处理','挂起','处理中','完成','异常','取消'];
     return [
-        //
+        "status"=>$status[array_rand($status)],
     ];
 });

+ 4 - 1
database/factories/StationTypeBinMonitorFactory.php

@@ -7,6 +7,9 @@ use Faker\Generator as Faker;
 
 $factory->define(StationTypeBinMonitor::class, function (Faker $faker) {
     return [
-        //
+        'station_id' => factory(\App\Station::class),
+        'bin_row_length' => rand(1,20),
+        'bin_column_length' => rand(1,20),
+        'bin_wall_amount' => rand(1,20),
     ];
 });

+ 5 - 0
package-lock.json

@@ -5533,6 +5533,11 @@
                 }
             }
         },
+        "jsbarcode": {
+            "version": "3.11.3",
+            "resolved": "https://registry.npm.taobao.org/jsbarcode/download/jsbarcode-3.11.3.tgz",
+            "integrity": "sha1-HI+5tcfURS5XGTCAGwDhIJSnBR4="
+        },
         "jsbn": {
             "version": "0.1.1",
             "resolved": "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz",

+ 1 - 0
package.json

@@ -30,6 +30,7 @@
     "element-ui": "^2.14.1",
     "jquery.cookie": "^1.4.1",
     "js-cookie": "^2.2.1",
+    "jsbarcode": "^3.11.3",
     "laravel-echo": "^1.8.0",
     "laravel-echo-server": "^1.6.2",
     "moment": "^2.28.0",

binární
public/images/QRCodeIMG/3.png


+ 0 - 1
public/images/QRCodeIMG/readme.txt

@@ -1 +0,0 @@
-生成二维码文件夹用的参照物,请勿删除

binární
public/images/QRCodeIMG/undefined.png


+ 15 - 0
resources/js/utilities/barcode.js

@@ -0,0 +1,15 @@
+
+import JsBarcode from 'jsbarcode'
+
+window.setBarcode = function setBarcode(val, dom='barcode', width=2, height=40, isShowValue=false){
+    if (!val)return;
+    JsBarcode(dom, val, {
+        format: 'CODE39',
+        lineColor: '#000',
+        background: '#EBEEF5',
+        width: width,
+        height: height,
+        displayValue: isShowValue
+    });
+};
+

+ 26 - 0
resources/views/order/index/delivering.blade.php

@@ -39,6 +39,7 @@
                         <button class="btn btn-sm ml-2" :class="[checkData.length>0?'btn-dark':'btn-outline-danger']" @click="isRejectedBillExist()"
                             style="opacity: 0.7">生成退货单</button>
                     @endcan
+                    <button class="btn btn-sm ml-2 btn-primary" v-if="checkData.length>0" @click="copyLogisticNumber()">复制快递单号</button>
                 </div>
                 <div class="modal fade " style="top: 20%" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                     <div class="modal-dialog">
@@ -852,6 +853,31 @@
                 copyLogisticInfo(){
                     this.copyText(this.tagOrder.logisticInfo)
                 },
+                copyLogisticNumber(){
+                    let text="";
+                    this.checkData.forEach((code,i)=>{
+                        if (this.picktotraceidMap[code] && this.picktotraceidMap[code].length>1){console.log(1);
+                            this.picktotraceidMap[code].forEach((number,j)=>{
+                                text += number;
+                                if (i!==this.checkData.length-1 && j!==this.picktotraceidMap[code].length-1){
+                                    text += ",";
+                                }
+                            });
+                        }else{
+                            this.orders.some(order=>{
+                                if (order.orderno == code){
+                                    if (order.soreference5) {
+                                        text += order.soreference5;
+                                        if(i!==this.checkData.length-1)text += ",";
+                                    }
+                                    return true;
+                                }
+                            });
+                        }
+                    });
+                    if (!text)text = " ";
+                    this.copyText(text)
+                },
                 copyMerchantInfo(){
                     this.copyText(this.tagOrder.merchantInfo)
                 },

+ 29 - 0
resources/views/rejected/search/general.blade.php

@@ -59,6 +59,8 @@
                 @can('退货管理-编辑')
                     <a class="btn btn-sm btn-outline-dark" href="{{url('rejected/importRejectedNumber')}}" style="cursor: pointer">导入修改</a>
                 @endcan
+                <button class="btn btn-sm ml-2 btn-primary" v-if="rejectedBills_checkBoxes.length>0" @click="copyLogisticNumber()">复制快递单号</button>
+
                 <span for="checkSelectingAll" class="d-none" id="cloneCheckAll">
                     <input type="checkbox" class="form-control-sm tooltipTarget" title="全选"
                            id="checkSelectingAll" @click="checkBoxAllToggle($event)">
@@ -153,6 +155,7 @@
                 <div class="text-info h5 btn btn">{{$rejectedBills->count()}}/{{$rejectedBills->total()}}</div>
                 {{$rejectedBills->appends($paginateParams)->links()}}
             </div>
+            <label><textarea  id="clipboardDiv" style="opacity:0"></textarea></label>
         </div>
     </div>
 @endsection
@@ -307,6 +310,32 @@
                 }
             },
             methods:{
+                copyLogisticNumber(){
+                    let text="";
+                    this.rejectedBills_checkBoxes.forEach((id,i)=>{
+                        this.rejectedBills.some(bill=>{
+                            if (bill.id == id){
+                                text += bill.logistic_number_return;
+                                if (i!==this.rejectedBills_checkBoxes.length-1)text += ",";
+                                return true;
+                            }
+                        });
+                    });
+                    this.copyText(text)
+                },
+                copyText(text){
+                    try {
+                        $('#clipboardDiv').text(text).select().focus();
+                        document.execCommand("Copy");
+                        tempTip.setIndex(1052)
+                        tempTip.setDuration(2000)
+                        tempTip.showSuccess('复制成功')
+                    } catch (e) {
+                        tempTip.setIndex(1052)
+                        tempTip.setDuration(2000)
+                        tempTip.showSuccess('复制失败:'+e)
+                    }
+                },
                 updateRejectedBillRemark:function (e) {
                     let target = $(e.target);
                     let _this = this;

+ 25 - 0
resources/views/station/monitor/_svg.blade.php

@@ -0,0 +1,25 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="blue-cube"
+     viewBox="68 30 180 220" {{--style="transform: rotate3d(0,0,60,40deg)"--}}>
+    <defs>
+        <g id="cube" style="fill-opacity: .9;stroke-miterlimit: 0;">
+            <rect width="21" height="24" fill="#fff" stroke="#0079ad"
+                  transform="skewY(30)" />
+            <rect width="21" height="24" fill="#fff" stroke="#0079ad"
+                  transform="skewY(-30) translate(21 24.3)" />
+            <rect width="21" height="21" fill="#fff" stroke="#0079ad"
+                  transform="scale(1.41,.81) rotate(45) translate(0 -21)" />
+        </g>
+    </defs>
+    <defs>
+        <g id="exceptionCube" style="fill-opacity: .9;stroke-miterlimit: 0;">
+            <rect width="21" height="24" :fill="color" stroke="#0079ad"
+                  transform="skewY(30)" />
+            <rect width="21" height="24" :fill="color" stroke="#0079ad"
+                  transform="skewY(-30) translate(21 24.3)" />
+            <rect width="21" height="21" :fill="color" stroke="#0079ad"
+                  transform="scale(1.41,.81) rotate(45) translate(0 -21)" />
+        </g>
+    </defs>
+    <use v-for="box in boxes" xlink:href="#cube" :x="box.x" :y="box.y" />
+
+</svg>

+ 132 - 67
resources/views/station/monitor/show.blade.php

@@ -11,7 +11,7 @@
                     </li>
         @endcomponent
     </div>
-    <div class="container-fluid body">
+    <div class="container-fluid body" id="container">
         <div class="card">
             <div class="card-body">
                 <div class="row border" style="opacity: 0.75">
@@ -22,99 +22,61 @@
                     <div class="col-4">
                         <div class="row">
                             <div class="col py-3 h4">
-                                波次号:nnnnnnnnnnn
+                                波次号:<b>@{{ task.taskBatch.batch.code }}</b>
                             </div>
                             <div class="col py-3 h4">
 
                             </div>
                         </div>
                         <div class="row">
-                            <div class="col py-3 h4">
-                            </div>
-                            <div class="col py-3 h4 text-muted">
-                                {条码}
+                            <div class="py-3 text-muted">
+                                <img id="barcode" alt="">
                             </div>
                         </div>
                         <div class="row">
                             <div class="col py-3 h4">
-                                料箱号:nnnnnnnnnnn
+                                料箱号:<b v-if="task.currentCommodityIndex!=-1">@{{task.taskCommodities[task.currentCommodityIndex]['materialBox']['code']}}</b>
                             </div>
                         </div>
-                        <div class="row pt-5">
-                            <div class="col"><img src="{{asset('images/demoBin.png')}}" alt="" class="img"></div>
+                        <div class="row pt-2">
+                            <div class="col">
+                                {{--@include("station.monitor._svg")--}}
+                                <img src="{{asset('images/demoBin.png')}}" alt="" class="img">
+                            </div>
                         </div>
                     </div>
                     <div class="col text-center">
                         <div class="row">
-                            <div class="col py-3 h4">
+                            <div class="col py-3 h4" v-for="wall in walls">
                                 <table class="table border">
-                                    <tr>
-                                        <td class="border p-0"><span style="opacity:0.25">6</span></td>
-                                        <td class="bg-info border p-0"><span style="opacity:0.25">7</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">8</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">9</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">10</span></td>
-                                    </tr>
-                                    <tr>
-                                        <td class="border p-0"><span style="opacity:0.25">1</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">2</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">3</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">4</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">5</span></td>
-                                    </tr>
-                                </table>
-                            </div>
-                            <div class="col py-3 h4">
-                                <table class="table border">
-                                    <tr>
-                                        <td class="border p-0"><span style="opacity:0.25">6</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">7</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">8</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">9</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">10</span></td>
-                                    </tr>
-                                    <tr>
-                                        <td class="border p-0"><span style="opacity:0.25">1</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">2</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">3</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">4</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">5</span></td>
+                                    <tr v-for="row in wall">
+                                        <td class="border p-0" v-for="column in row"
+                                            :class="task.currentCommodityIndex!=-1&&task.taskCommodities[task.currentCommodityIndex]['binNumber']==column ? 'bg-info' : ''">
+                                            <span style="opacity:0.25">@{{ column }}</span></td>
                                     </tr>
                                 </table>
                             </div>
                         </div>
-                        <div class="row">
-                            <div class="col py-1">数量</div>
-                            <div class="col py-1">0/0</div>
-                            <div class="col py-1 text-muted">异常</div>
-                            <div class="col py-1"></div>
+                        <div class="row mb-1">
+                            <div class="col-1 text-left font-weight-bold">数量:</div>
+                            <div class="col-2 text-left">@{{ task.sum }}/@{{ task.currentSum }}</div>
+                            <div class="col-1 offset-2 text-muted" v-if="error">异常:</div>
+                            <div class="col-6" v-if="error">@{{ error }}</div>
                         </div>
                         <div class="row">
                             <div class="col py-1">
-                                <table class="table table-striped border">
+                                <table class="table table-hover border">
                                     <tr class="text-muted">
                                         <th class="py-2">序号</th>
                                         <th class="py-2">商品</th>
                                         <th class="py-2">数量</th>
                                         <th class="py-2">条码</th>
                                     </tr>
-                                    <tr class="text-muted">
-                                        <td></td>
-                                        <td></td>
-                                        <td>0/0</td>
-                                        <td></td>
-                                    </tr>
-                                    <tr class="text-muted">
-                                        <td></td>
-                                        <td></td>
-                                        <td>0/0</td>
-                                        <td></td>
-                                    </tr>
-                                    <tr class="text-muted">
-                                        <td></td>
-                                        <td></td>
-                                        <td>0/0</td>
-                                        <td></td>
+                                    <tr class="text-muted" v-for="(taskCommodity,i) in task.taskCommodities" :class="taskCommodity.bg">
+                                        <td>@{{ i+1 }}</td>
+                                        <td>@{{ taskCommodity.name }}</td>
+                                        <td>@{{ taskCommodity.amount }}</td>
+                                        <td><small v-for="barcode in taskCommodity.barcodes">@{{ barcode.code }}</small><br></td>
                                     </tr>
                                 </table>
                             </div>
@@ -127,18 +89,121 @@
 @endsection
 
 @section('lastScript')
+    <script type="text/javascript" src="{{mix('js/utilities/barcode.js')}}"></script>
     <script>
         new Vue({
-            el:"#app",
+            el:"#container",
+            data:{
+                broadcastName : "{{config('database.redis.options.prefix').'presence-station-'.$station->id}}",
+                channelName : ".App\\Events\\BroadcastToStation",
+                task : {
+                    currentCommodityIndex : -1,
+                    taskCommodities:[
+                        /*{amount:"",binNumber:"",name:"",barcodes:[]},*/
+                    ],
+                    taskBatch:{
+                        batch:{
+                            code:"",
+                        },
+                    },
+                    box:{},
+                    sum : 0,
+                    currentSum : 0,
+                },
+                boxes:[],
+                walls:[],
+                wall:{
+                    row:Number("{{$wall->bin_row_length}}"),
+                    column:Number("{{$wall->bin_column_length}}"),
+                    amount:Number("{{$wall->bin_wall_amount}}"),
+                },
+                color:"red",
+                error:"",
+            },
             mounted() {
-                $('.navbar,.nav1,.nav2').hide()
+                $('.navbar,.nav1,.nav2').hide();
                 $('.nav3').on('mouseenter', function () {
                     $('.navbar,.nav1,.nav2').show();
                 });
                 $('.body').on('mouseenter', function () {
                     $('.navbar,.nav1,.nav2').hide();
                 });
-            }
+                this._broadcast();
+                this._renderingWall(this.wall.amount,this.wall.row,this.wall.column);
+                this._renderingBox(2,4);
+            },
+            methods:{
+                _broadcast(){
+                    initEcho();
+                    window.Echo.channel(this.broadcastName).listen(this.channelName,(msg)=> {
+                        let json = JSON.parse(msg.json);
+                        this._refreshData(json);
+                    });
+                },
+                //刷新数据
+                _refreshData(obj){
+                    let task={};
+                    task.taskCommodities = [];
+                    task.sum = 0;
+                    task.currentSum = 0;
+                    task.currentCommodityIndex = "";
+                    obj.task_commodities.forEach((taskCommodity,i)=> {
+                        task.sum += Number(taskCommodity.amount);
+                        if (taskCommodity.status === '完成') task.currentSum += Number(taskCommodity.amount);
+                        if (taskCommodity.status === '处理中') task.currentCommodityIndex = i;
+                        task.taskCommodities.push({
+                            bg:this._setColor(taskCommodity.status),
+                            amount:taskCommodity.amount,
+                            binNumber:taskCommodity.bin_number,
+                            name:taskCommodity.commodity?taskCommodity.commodity.name:'',
+                            barcodes:taskCommodity.commodity?taskCommodity.commodity.barcodes:[],
+                            materialBox:taskCommodity.material_box,
+                        });
+                    });
+                    task.taskBatch=obj.task_batches[0];
+                    setBarcode(task.taskBatch.batch.code,"#barcode",2,50,false);
+                    this.task = task;
+                },
+                //渲染墙格口
+                _renderingWall(amount, row, column){
+                    for (let i=0;i<amount;i++){
+                        this.walls.push(this._createWall(row, column, i*(row*column)));
+                    }
+                },
+                _setColor(status){
+                    switch (status) {
+                        case "待处理":return "";
+                        case "挂起"  :return "bg-white";
+                        case "处理中"  :return "bg-primary";
+                        case "完成"  :return "bg-success";
+                        case "异常"  :return "bg-danger";
+                        case "取消"  :return "bg-dark text-white";
+                    }
+                    return "";
+                },
+                //生成墙格口
+                _createWall(row, column, increment){
+                    let wall = [];
+                    for (let i=1;i<=row;i++){
+                        let columns = [];
+                        for (let j=((i-1)*column)+1;j<=i*column;j++){
+                            columns.push(j+increment);
+                        }
+                        wall.unshift(columns);
+                    }
+                    return wall;
+                },
+                //渲染料箱格口
+                _renderingBox(row, column, x=79, y=72, width=21, height=12){
+                    let boxes = [];
+                    for (let i=0;i<column;i++){
+                        for (let j=row-1;j>=0;j--){
+                            boxes.push({x:((i+j)*width)+x,y:(y+(i*height))-(j*height)});
+                        }
+                    }
+                    this.boxes = boxes;
+                },
+            },
         });
     </script>
 @endsection

+ 1 - 0
webpack.mix.js

@@ -23,6 +23,7 @@ mix.copy('resources/sass/trix.css','public/css/initLaborReportsCountingRecords')
 mix.copy('resources/js/queryForm/queryForm.js','public/js/queryForm/queryForm.js');
 mix.copy('resources/js/queryForm/export.js','public/js/queryForm/export.js');
 mix.js('resources/js/queryForm/header.js','public/js/queryForm/header.js');
+mix.js('resources/js/utilities/barcode.js','public/js/utilities/barcode.js');
 
 mix.copy('resources/sound/','public/sound');
 mix.js('resources/js/elementUi.js','public/js/element-ui.js')

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů