king hace 4 años
padre
commit
bd3aa1fde1

+ 30 - 21
app/Console/Commands/CreateWeightStatistic.php

@@ -25,28 +25,37 @@ class CreateWeightStatistic extends Command
     {
         $yesterday = date("Y-m-d",strtotime("-1 day"));
         $sql = <<<sql
-SELECT DATE_FORMAT(order_packages.created_at,'%Y-%m-%d') date,
+SELECT DATE_FORMAT(order_packages.created_at,'%Y-%m-%d') date,IFNULL(order_packages.measuring_machine_id, 0) measuring_machine_id,order_packages.owner_id
 SUM(CASE WHEN order_packages.weighed_at IS NOT NULL THEN 1 ELSE 0 END) AS count,
-COUNT(1) total FROM order_packages LEFT JOIN orders ON order_packages.order_id=orders.id WHERE orders.wms_status != '订单取消' 
-AND order_packages.created_at BETWEEN '{$yesterday} 00:00:00' AND '{$yesterday} 23:59:59' GROUP BY date
+COUNT(1) total FROM order_packages LEFT JOIN orders ON order_packages.order_id=orders.id
+WHERE orders.wms_status != '订单取消'
+AND order_packages.created_at BETWEEN '{$yesterday} 00:00:00' AND '{$yesterday} 23:59:59' GROUP BY date,order_packages.measuring_machine_id,order_packages.owner_id
 sql;
-        $result = DB::selectOne(DB::raw($sql));
-        if (!$result)$obj = [
-            "targeted_at"    => $yesterday,
-            "un_weigh_count" => 0,
-            "total_count"    => 0
-        ]; else $obj = [
-            "targeted_at"    => $result->date,
-            "un_weigh_count" => $result->count,
-            "total_count"    => $result->total,
-        ];
-        /** @var \stdClass $model */
-        $model = OrderPackageCountingRecord::query()->create($obj);
-        Cache::put("weight.".$yesterday,[
-            "date"=>$yesterday,
-            "total"=>$model->total_count,
-            "count"=>$model->un_weigh_count,
-            "value"=>$model->total_count ? intval(($model->un_weigh_count/$model->total_count)*100) : 0
-        ]);
+        $result = DB::select(DB::raw($sql));
+        if (!$result) {
+            $obj = [
+                "targeted_at" => $yesterday,
+                "un_weigh_count" => 0,
+                "total_count" => 0,
+                "measuring_machine_id" => 0,
+                "owner_id" => 0
+            ];
+            $model = OrderPackageCountingRecord::query()->create($obj);
+            Cache::put("weight.".$yesterday, $obj);
+        }else{
+            $objs = [];
+            foreach ($result as $v){
+                $obj = [
+                    "targeted_at"    => $v->date,
+                    "un_weigh_count" => $v->count,
+                    "total_count"    => $v->total,
+                    "measuring_machine_id"    => $v->measuring_machine_id,
+                    "owner_id"    => $v->owner_id
+                ];
+                $model = OrderPackageCountingRecord::query()->create($obj);
+                array_push($objs, $obj);
+            }
+            Cache::put("weight.".$yesterday, $objs);
+        }
     }
 }

+ 56 - 38
app/Http/Controllers/ControlPanelController.php

@@ -7,6 +7,7 @@ use App\Filters\OrderPackageReceivedSyncRecordFilters;
 use App\OrderPackageCountingRecord;
 use App\OrderPackageReceivedSyncRecord;
 use App\Owner;
+use App\MeasuringMachine;
 use App\Services\CacheService;
 use App\Services\CheckActiveMenuService;
 use App\Services\LaborReportsCountingRecordService;
@@ -124,41 +125,49 @@ class ControlPanelController extends Controller
         //转化为Carbon
         $start = Carbon::parse(request("start"));
         $end   = Carbon::parse(request("end"));
+        $owner = request("owner_ids");
 
         //定义三个数组 空间换时间 避免结果集二次转换
         $title = []; //标题
         $data = []; //核心数据,二维数组
-        foreach (CarbonPeriod::create($start,$end) as $date){
-            /** @var $date Carbon */
-            $str = $date->format("Y-m-d");
-            $data = $this->getTargetData($str);
-            $title[] = $str;
-        }
-
         //大于31天转换为月份显示
         if ($end->diffInDays($start) > 31){
+            $time1 = strtotime($start);
+            $time2 = strtotime($end);
             $title = [];
-            $sign = []; //标记是否已被插入
-            $dataTemp = []; //临时存储
-
-            foreach ($data as $datum){
-                $month = substr($datum["date"],0,7);
-                if (!isset($sign[$month])){
-                    $dataTemp[] = ["date"=>$month,"total"=>$datum["total"],"count"=>$datum["count"],"value"=>$datum["value"]];
-                    $title[] = $month;
-                    $sign[$month] = count($dataTemp)-1;
-                }else{
-                    $dataTemp[$sign[$month]]["total"] += $datum["total"];
-                    $dataTemp[$sign[$month]]["count"] += $datum["count"];
-                    $dataTemp[$sign[$month]]["value"] = (string)($dataTemp[$sign[$month]]["total"] ? intval(($dataTemp[$sign[$month]]["count"]/$dataTemp[$sign[$month]]["total"])*100) : 0);
-                }
+            do{
+                $str = date('Y-m',$time1); // 取得递增月;
+                $data[] = $this->getTargetData($str, $owner);
+                $title[] = $str;
+            }while( ($time1 = strtotime('+1 month', $time1)) <= $time2);
+            $start = $title[0];
+        }else{
+            foreach (CarbonPeriod::create($start,$end) as $date){
+                /** @var $date Carbon */
+                $str = $date->format("Y-m-d");
+                $data[] = $this->getTargetData($str, $owner);
+                $title[] = $str;
             }
-            $data = $dataTemp;
+            $start = date('Y-m-d', strtotime($start));
         }
 
+        $machines = MeasuringMachine::query()->select('id')->get()->toArray();
+        array_unshift($machines, ['id' => 0]);
+        array_unshift($machines, ['id' => '未称重']);
+
+        //data数据处理
+        $real_data = [];
+        foreach ($machines as $v){
+            $temp = [$v['id'] === 0 ? 'ID_未知' : 'ID_'.$v['id']];
+            foreach ($data as $val){
+                array_push($temp, array_column($val, $v['id'])? array_sum( array_column($val, $v['id'])) : 0);
+            }
+            array_push($real_data,$temp);
+        }
         array_unshift($title, 'product');
-        array_unshift($data, $title);
-        $this->success(["title"=>date("Y-m-d",strtotime($start)),"data"=>$data]);
+        array_unshift($real_data, $title);
+
+        $this->success(["title"=> $start,"data"=>$real_data]);
     }
 
 
@@ -209,36 +218,45 @@ class ControlPanelController extends Controller
      * @param string $date
      * @return array|null
      */
-    private function getTargetData(string $date)
+    private function getTargetData(string $date, array $owner = [])
     {
-        $res = [];
+        $res = [];$where='';$no_weight  = 0;
+        if ($owner) $where = " and order_packages.owner_id in (".implode(',',$owner).")";
         if ($date == date("Y-m-d")){
             $sql = <<<sql
-SELECT DATE_FORMAT(order_packages.created_at,'%Y-%m-%d') date,IFNULL(mm.name,'未知') name ,
+SELECT DATE_FORMAT(order_packages.created_at,'%Y-%m-%d') date,IFNULL(order_packages.measuring_machine_id, 0) measuring_machine_id,
 SUM(CASE WHEN order_packages.weighed_at IS NOT NULL THEN 1 ELSE 0 END) AS count,
 COUNT(1) total FROM order_packages LEFT JOIN orders ON order_packages.order_id=orders.id
-LEFT JOIN measuring_machines AS mm ON mm.id = order_packages.measuring_machine_id
-WHERE orders.wms_status != '订单取消'
+WHERE orders.wms_status != '订单取消'  {$where}
 AND order_packages.created_at like '{$date}%' GROUP BY date,order_packages.measuring_machine_id
 sql;
             //todo 新写
             $info = DB::select(DB::raw($sql));
-            if (!$info) return  $res;
-            $no_weight  =  isset($info[0]->name)  && $info[0]->name == '未知' ? $info[0]->total - $info[0]->count : 0;
+            if (empty($info)) return  $res;
             foreach ($info as $v){
-                $res[] = [$v->name,$v->count];
+                $res[] = [$v->measuring_machine_id,(int)$v->count];
+                $no_weight += (int)($v->total_count - $v->un_weigh_count);
             }
             array_push($res, ['未称重',$no_weight]);
         }else{
-            $info = app(CacheService::class)->getOrExecute("weight.".$date,function ()use($date){
-                return OrderPackageCountingRecord::query()->where("targeted_at",$date)->get()->toArray();
+            $info = app(CacheService::class)->getOrExecute("weight.".$date.($owner?implode(',',$owner):''),function ()use($date,$owner){
+                return OrderPackageCountingRecord::query()
+                    ->where(function ($query)use($date, $owner){
+                        if($owner)return $query->whereIn('owner_id',$owner);
+                        if ( strlen($date) > 8 ) {
+                            return $query->where('targeted_at',$date);
+                        }else{
+                            return $query->where('targeted_at', 'like',$date.'%');
+                        }
+                    })
+                    ->get()->toArray();
             },config("cache.expirations.forever"));
-            if (array_key_exists('date',$info)) return  $res;
-            $no_weight  =  isset($info[0]->name)  && $info[0]->name == '未知' ? $info[0]->total - $info[0]->count : 0;
+            if (empty($info)) return  $res;
             foreach ($info as $v){
-                $res[] = [$v->name,$v->count];
+                $res[] = [$v['measuring_machine_id']=>(int)$v['un_weigh_count']];
+                $no_weight += (int)($v['total_count'] - $v['un_weigh_count']);
             }
-            array_push($res, ['未称重',$no_weight]);
+            array_push($res, ['未称重'=>$no_weight]);
         }
         return $res;
     }

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

@@ -10,7 +10,9 @@ use App\MaterialBoxModel;
 use App\Owner;
 use App\OwnerFeeDetail;
 use App\OwnerPriceOperation;
+use App\OrderPackageCountingRecord;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Http;
 
@@ -51,4 +53,47 @@ class TestController extends Controller
         ]);
     }
 
+    public function addRecord()
+    {
+        $yesterday = '2021-06-08';
+        $sql = <<<sql
+SELECT DATE_FORMAT(order_packages.created_at,'%Y-%m-%d') date,IFNULL(order_packages.measuring_machine_id,0) measuring_machine_id,order_packages.owner_id,
+SUM(CASE WHEN order_packages.weighed_at IS NOT NULL THEN 1 ELSE 0 END) AS count,
+COUNT(1) total FROM order_packages LEFT JOIN orders ON order_packages.order_id=orders.id
+WHERE orders.wms_status != '订单取消'
+AND order_packages.created_at BETWEEN '{$yesterday} 00:00:00' AND '{$yesterday} 23:59:59' GROUP BY date,order_packages.measuring_machine_id,order_packages.owner_id
+sql;
+        $result = DB::select(DB::raw($sql));
+        if (!$result) {
+            $obj = [
+                "targeted_at" => $yesterday,
+                "un_weigh_count" => 0,
+                "total_count" => 0,
+                "measuring_machine_id" => 0,
+                "owner_id" => 0
+            ];
+            $model = OrderPackageCountingRecord::query()->create($obj);
+            Cache::put("weight.".$yesterday, $obj);
+        }else{
+            $objs = [];
+            foreach ($result as $v){
+                $obj = [
+                    "targeted_at"    => $v->date,
+                    "un_weigh_count" => $v->count,
+                    "total_count"    => $v->total,
+                    "measuring_machine_id"    => $v->measuring_machine_id,
+                    "owner_id"    => $v->owner_id
+                ];
+                $model = OrderPackageCountingRecord::query()->create($obj);
+                array_push($objs, $obj);
+            }
+            Cache::put("weight.".$yesterday, $objs);
+        }
+    }
+
+    public function redis()
+    {
+        Cache::pull('weight.2021-06-06');
+    }
+
 }

+ 1 - 1
app/OrderPackageCountingRecord.php

@@ -11,7 +11,7 @@ class OrderPackageCountingRecord extends Model
     use ModelLogChanging;
 
     protected $fillable=[
-        "targeted_at","un_weigh_count","total_count"
+        "targeted_at","un_weigh_count","total_count","measuring_machine_id","owner_id"
     ];
     public $timestamps=false;
 

+ 38 - 0
database/migrations/2021_08_03_154931_change_order_package_counting_records_table.php

@@ -0,0 +1,38 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeOrderPackageCountingRecordsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_package_counting_records', function (Blueprint $table) {
+            $table->dropColumn('name');
+            $table->bigInteger('measuring_machine_id')->nullable()->comment('外联 设备号');
+            $table->bigInteger('owner_id')->nullable()->comment('外联 货主ID');
+            $table->dropPrimary('targeted_at');
+            $table->index('targeted_at','index_date');
+            $table->unique(['targeted_at','measuring_machine_id','owner_id'],'index_data_id');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('order_package_counting_records', function (Blueprint $table) {
+            $table->dropColumn('measuring_machine_id');
+            $table->dropColumn('owner_id');
+        });
+    }
+}

+ 31 - 6
resources/views/control/panel.blade.php

@@ -967,7 +967,26 @@
                     let params = {start:this.searchOption.weightDate[0],end:this.searchOption.weightDate[1],owner_ids:this.selectWeightOwners};
                     window.tempTip.postBasicRequest(url,params,res=>{
                         this.cardPool.weight.hideLoading();
-                        this.cardPool.weight.setOption(this._setWeightData(res.title,res.data));
+                        let myechart = this.cardPool.weight, option = this._setWeightData(res.title,res.data);
+                        myechart.on('updateAxisPointer', function (event) {
+                            var xAxisInfo = event.axesInfo[0];
+                            if (xAxisInfo) {
+                                var dimension = xAxisInfo.value + 1;
+                                myechart.setOption({
+                                    series: {
+                                        id: 'pie',
+                                        label: {
+                                            formatter: '{b}: {@[' + dimension + ']} ({d}%)'
+                                        },
+                                        encode: {
+                                            value: dimension,
+                                            tooltip: dimension
+                                        }
+                                    }
+                                });
+                            }
+                        });
+                        myechart.setOption(option);
                     });
                 },
                 loadOrderPackageReceivedSyncRecordInfo(){
@@ -1022,11 +1041,16 @@
                     this.loadExceptionTypeInfo();
                 },
                 _setWeightData(title, data){
-                    let temp = [];
-                    for (let i=1;i<data.length; i++){
+                    let temp = [],len = data.length -1;
+                    for (let i=0; i < len; i++){
                         temp.push({type: 'line', smooth: true, seriesLayoutBy: 'row', emphasis: {focus: 'series'}});
                     }
-                    temp.push({type: 'pie', id: 'pie', radius: '30%', center: ['50%', '25%'], emphasis: {focus: 'data'},
+                    temp.push({
+                        type: 'pie',
+                        id: 'pie',
+                        radius: '30%',
+                        center: ['50%', '25%'],
+                        emphasis: {focus: 'data'},
                         label: {
                             formatter: '{b}: {@'+title+'} ({d}%)'
                         },
@@ -1035,8 +1059,9 @@
                             value: title,
                             tooltip: title
                         }
-                    })
-                    return {
+                    });
+                    console.log(temp)
+                   return {
                         legend: {},
                         tooltip: {
                             trigger: 'axis',