200 lines
8.1 KiB
PHP
200 lines
8.1 KiB
PHP
<?php
|
|
|
|
namespace app\api\controller\dataview;
|
|
|
|
use app\api\controller\BaseApiController;
|
|
use app\common\logic\RemoteRequestLogic;
|
|
use app\common\model\animal_info\AnimalInfo;
|
|
use app\common\model\device\Device;
|
|
use app\common\model\dict\DictData;
|
|
use app\common\model\farm\Farm;
|
|
use app\common\model\fence_house\FenceHouse;
|
|
use app\common\model\land\Land;
|
|
use app\common\model\land\Product;
|
|
use app\common\model\product\ProductDevice;
|
|
use think\exception\ValidateException;
|
|
|
|
class FarmController extends BaseApiController
|
|
{
|
|
public array $notNeedLogin = [
|
|
'farmCount','breedTypeCount','farmInfo','deviceAlarmCount','deviceCount','alarmRangeList'
|
|
];
|
|
public function initialize()
|
|
{
|
|
parent::initialize();
|
|
$this->areaCode = $this->request->param('areaCode', '');
|
|
$this->streetCode = $this->request->param('streetCode', '');
|
|
if ($this->areaCode == '') {
|
|
throw new ValidateException('未获取到位置信息');
|
|
}
|
|
}
|
|
|
|
public function farmCount()
|
|
{
|
|
$query = Farm::alias('f')->where(function ($query) {
|
|
if ($this->streetCode != '') {
|
|
$query->where('f.street', $this->streetCode);
|
|
} else {
|
|
$query->where('f.area', $this->areaCode);
|
|
}
|
|
});
|
|
// 地块数量
|
|
$farmCount = $query->count();
|
|
// 养殖规模
|
|
$totalScale = $query->sum('form_scale');
|
|
// 基地列表
|
|
$farmList = $query->select()->each(function ($farm){
|
|
// 档案数量
|
|
$fenceHouseIds = FenceHouse::where('farm_id', $farm['id'])->column('id');
|
|
$farm['animal_count'] = AnimalInfo::whereIn('fence_house_id', $fenceHouseIds)->count();
|
|
$fenceHouse = FenceHouse::where('farm_id', $farm['id'])->order('id desc')->findOrEmpty()->toArray();
|
|
if(empty($fenceHouse)){
|
|
$farm['video_url'] = '';
|
|
$farm['device_id'] = 0;
|
|
return $farm;
|
|
}
|
|
$product = Product::where('fence_house_id', $fenceHouse['id'])->findOrEmpty()->toArray();
|
|
if(empty($product)){
|
|
$farm['video_url'] = '';
|
|
$farm['device_id'] = 0;
|
|
return $farm;
|
|
}
|
|
$deviceIds = ProductDevice::where('product_id', $product['id'])->column('device_id');
|
|
$device = Device::whereIn('id', $deviceIds)->where('type', 2)->findOrEmpty();
|
|
if(empty($device)){
|
|
$farm['video_url'] = '';
|
|
$farm['device_id'] = 0;
|
|
return $farm;
|
|
}
|
|
$farm['video_url'] = $device['video_url'];
|
|
$farm['device_id'] = $device['id'];
|
|
return $farm;
|
|
})->toArray();
|
|
return $this->success('成功', compact('farmCount', 'totalScale', 'farmList'));
|
|
}
|
|
|
|
public function breedTypeCount()
|
|
{
|
|
$breedTypeRows = DictData::where('type_value', 'breed_type')->field('name,value')->select()->each(function($breedType){
|
|
$breedType['animalCount'] = Farm::alias('f')->join('fence_house fh', 'f.id=fh.farm_id')->where(function ($query) {
|
|
if ($this->streetCode != '') {
|
|
$query->where('f.street', $this->streetCode);
|
|
} else {
|
|
$query->where('f.area', $this->areaCode);
|
|
}
|
|
})->where('fh.animal_type', $breedType['value'])->count();
|
|
})->toArray();
|
|
|
|
$fenceHouseIds = Farm::alias('f')->join('fence_house fh', 'f.id=fh.farm_id')->where(function ($query) {
|
|
if ($this->streetCode != '') {
|
|
$query->where('f.street', $this->streetCode);
|
|
} else {
|
|
$query->where('f.area', $this->areaCode);
|
|
}
|
|
})->column('fh.id');
|
|
|
|
$animalList = AnimalInfo::whereIn('fence_house_id', $fenceHouseIds)->select();
|
|
return $this->success('成功', compact('breedTypeRows', 'animalList'));
|
|
}
|
|
|
|
public function centralCount()
|
|
{
|
|
|
|
$query = Farm::alias('f')->where(function ($query) {
|
|
if ($this->streetCode != '') {
|
|
$query->where('f.street', $this->streetCode);
|
|
} else {
|
|
$query->where('f.area', $this->areaCode);
|
|
}
|
|
});
|
|
// 地块数量
|
|
$farmCount = $query->count();
|
|
// 养殖规模
|
|
$totalScale = $query->sum('form_scale');
|
|
// 养殖种类
|
|
$breedCount = $query->group('breed_type')->count();
|
|
|
|
return $this->success('成功', compact('farmCount', 'totalScale', 'breedCount'));
|
|
}
|
|
|
|
public function farmInfo()
|
|
{
|
|
// 获取栏舍信息
|
|
$params = $this->request->param();
|
|
$farmInfo = Farm::where('id', $params['id'])->findOrEmpty()->toArray();
|
|
$data = FenceHouse::where('farm_id',$params['id'])->findOrEmpty()->toArray();
|
|
$product = Product::where('fence_house_id', $data['id'])->findOrEmpty()->toArray();
|
|
if(empty($product)){
|
|
return $this->fail('栏舍暂未绑定设备',[]);
|
|
}
|
|
$deviceIds = ProductDevice::where('product_id', $product['id'])->column('device_id');
|
|
$device = Device::whereIn('id', $deviceIds)->where('type', 2)->findOrEmpty();
|
|
$farmInfo['video_url'] = $device['video_url'];
|
|
$farmInfo['device_id'] = $device['id'];
|
|
|
|
$breedTypeRows = DictData::where('type_value', 'breed_type')->field('name,value')->select()->each(function($breedType) use($params){
|
|
$breedType['animalCount'] = Farm::alias('f')->join('fence_house fh', 'f.id=fh.farm_id')->where('f.id', $params['id'])->where('fh.animal_type', $breedType['value'])->count();
|
|
})->toArray();
|
|
return $this->success('成功', compact('farmInfo', 'breedTypeRows'));
|
|
}
|
|
|
|
// 设备告警统计
|
|
public function deviceAlarmCount()
|
|
{
|
|
$params = $this->request->param();
|
|
$deviceList = Device::alias('d')->where(function ($query) use($params) {
|
|
$farmIds = [$params['id']];
|
|
$fenceHouseIds = FenceHouse::whereIn('farm_id', $farmIds)->column('id');
|
|
$productIds = Product::whereIn('fence_house_id', $fenceHouseIds)->column('id');
|
|
$deviceIds = ProductDevice::whereIn('product_id', $productIds)->column('device_id');
|
|
$query->whereIn('d.id', $deviceIds);
|
|
})->select()->toArray();
|
|
|
|
// 请求mqtt接口
|
|
$list = RemoteRequestLogic::getAlarmData($deviceList);
|
|
foreach($list as $k=>$v){
|
|
if(time() - strtotime($v['alarm_time']) > 604800){
|
|
unset($list[$k]);
|
|
}
|
|
}
|
|
|
|
return $this->success('成功', compact('list'));
|
|
}
|
|
|
|
// 监测设备数量统计
|
|
public function deviceCount()
|
|
{
|
|
$params = $this->request->param();
|
|
$query = Device::alias('d')->where(function ($query) use ($params){
|
|
$farmIds = [$params['id']];
|
|
$fenceHouseIds = FenceHouse::whereIn('farm_id', $farmIds)->column('id');
|
|
$productIds = Product::whereIn('fence_house_id', $fenceHouseIds)->column('id');
|
|
$deviceIds = ProductDevice::whereIn('product_id', $productIds)->column('device_id');
|
|
$query->whereIn('d.id', $deviceIds);
|
|
});
|
|
$deviceList = $query->select()->toArray();
|
|
$total = $query->count();
|
|
|
|
$online = $query->where('d.is_online', 1)->count();
|
|
|
|
$offline = $query->where('d.is_online', 2)->count();
|
|
|
|
|
|
// 请求mqtt
|
|
[$alarmCount,$todayAlarmCount] = RemoteRequestLogic::getAlarmCount($deviceList);
|
|
|
|
return $this->success('成功', compact('total', 'online', 'offline', 'alarmCount', 'todayAlarmCount'));
|
|
|
|
}
|
|
|
|
public function alarmRangeList()
|
|
{
|
|
$params = $this->request->param();
|
|
$farmIds = [$params['id']];
|
|
$fenceHouseIds = FenceHouse::whereIn('farm_id', $farmIds)->column('id');
|
|
$productIds = Product::whereIn('fence_house_id', $fenceHouseIds)->column('id');
|
|
$deviceIds = ProductDevice::whereIn('product_id', $productIds)->column('device_id');
|
|
$list = RemoteRequestLogic::getRangeMonitorData($deviceIds);
|
|
return $this->success('成功', $list);
|
|
}
|
|
} |