165 lines
5.6 KiB
PHP
165 lines
5.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Enums\BaseType;
|
|
use App\Enums\DeviceStatus;
|
|
use App\Enums\DeviceType;
|
|
use App\Enums\OperationType;
|
|
use App\Helpers\Paginator;
|
|
use App\Http\Requestes\AgriculturalBaseRequest;
|
|
use App\Http\Resources\AgriculturalBaseResource;
|
|
use App\Http\Resources\DeviceResource;
|
|
use App\Models\AgriculturalBase;
|
|
use App\Models\Device;
|
|
use App\Services\OperationLogService;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class AgriculturalBaseController extends Controller
|
|
{
|
|
/**
|
|
* 基地数据列表
|
|
*
|
|
* @param Request $request
|
|
* @return void
|
|
*/
|
|
public function index(Request $request)
|
|
{
|
|
$query = AgriculturalBase::with(['crops','industry'])->filter($request->all())->sort();
|
|
$list = $query->paginate(Paginator::resolvePerPage('per_page', 20));
|
|
|
|
return $this->json(AgriculturalBaseResource::collection($list));
|
|
}
|
|
|
|
public function store(AgriculturalBaseRequest $request)
|
|
{
|
|
$cropsIds = $request->input('crops_ids', []);
|
|
$extends = $request->input('extends', []);
|
|
$extends = json_encode($extends);
|
|
$inputParams = $request->input();
|
|
$inputParams['extends'] = $extends;
|
|
// $type = $request->input('type');
|
|
// //已添加区域无法变更类型
|
|
// if($type == BaseType::Town->value) {
|
|
// return $this->error('无法添加城镇');
|
|
// }
|
|
try {
|
|
DB::beginTransaction();
|
|
//添加基地信息
|
|
$base = AgriculturalBase::create($inputParams);
|
|
//添加基地农作物
|
|
$base->crops()->sync($cropsIds);
|
|
DB::commit();
|
|
} catch(\Throwable $th) {
|
|
DB::rollBack();
|
|
report($th);
|
|
|
|
return $this->error('添加失败,请稍后再试');
|
|
}
|
|
(new OperationLogService())->inLog(OperationType::Create, '', $base, $request->input());
|
|
|
|
return $this->success('添加成功!');
|
|
}
|
|
|
|
public function show(AgriculturalBase $agriculturalBasic)
|
|
{
|
|
$agriculturalBasic->load(['crops', 'devices', 'yieldLogs'])->loadSum('yieldLogs', 'output');
|
|
return $this->json(AgriculturalBaseResource::make($agriculturalBasic));
|
|
}
|
|
|
|
public function update(AgriculturalBase $agriculturalBasic, AgriculturalBaseRequest $request)
|
|
{
|
|
$cropsIds = $request->input('crops_ids', []);
|
|
$type = $request->input('type');
|
|
$extends = $request->input('extends', []);
|
|
// if($extends){
|
|
$extends = json_encode($extends);
|
|
// }
|
|
$inputParams = $request->input();
|
|
$inputParams['extends'] = $extends;
|
|
//已添加区域无法变更类型
|
|
if ($type !== $agriculturalBasic->type->value) {
|
|
return $this->error('无法变更类型');
|
|
}
|
|
try {
|
|
DB::beginTransaction();
|
|
//更新基地信息
|
|
$agriculturalBasic->update($inputParams);
|
|
//更新基地农作物
|
|
$agriculturalBasic->crops()->sync($cropsIds);
|
|
DB::commit();
|
|
} catch(\Throwable $th) {
|
|
DB::rollBack();
|
|
report($th);
|
|
|
|
return $this->error('修改失败,请稍后再试');
|
|
}
|
|
|
|
(new OperationLogService())->inLog(OperationType::Update, '', $agriculturalBasic, $request->input());
|
|
|
|
return $this->success('修改成功!');
|
|
}
|
|
|
|
public function destroy(AgriculturalBase $agriculturalBasic)
|
|
{
|
|
try {
|
|
DB::beginTransaction();
|
|
$agriculturalBasic->crops()->sync([]);
|
|
$agriculturalBasic->delete();
|
|
DB::commit();
|
|
} catch(\Throwable $th) {
|
|
DB::rollBack();
|
|
report($th);
|
|
|
|
return $this->error('删除失败,请稍后再试');
|
|
}
|
|
|
|
(new OperationLogService())->inLog(OperationType::Delete, '', $agriculturalBasic);
|
|
|
|
return $this->success('删除成功!');
|
|
}
|
|
|
|
/**
|
|
* 获取指定设备类型下有设备的基地
|
|
*/
|
|
public function deviceBase(Request $request)
|
|
{
|
|
/** @var \App\Models\AdminUser */
|
|
$user = $request->user();
|
|
$deviceType = $request->input('device_type', DeviceType::Monitor->value);
|
|
$isRecommend = $request->input('is_recommended', 0) ?? 0;
|
|
$all = $request->input('all', 0);
|
|
|
|
$list = AgriculturalBase::filter($request->all())->whereHas('devices', function ($q) use ($deviceType, $isRecommend) {
|
|
$q->when($deviceType == DeviceType::Monitor->value, function ($q) use ($isRecommend) {
|
|
$q->when($isRecommend, fn ($q) => $q->where('is_recommend', 1))->where('status', 1);
|
|
})->where('type', $deviceType);
|
|
})->when(! $all && ! $user->isAdministrator(), function ($q) use ($user) {
|
|
$q->whereRaw("id in (select base_id from admin_user_bases where user_id = {$user->id})");
|
|
})->sort()->get();
|
|
|
|
return $this->json(AgriculturalBaseResource::collection($list));
|
|
}
|
|
|
|
/**
|
|
* 获取指定基地指定设备类型下所有监控点名称选项
|
|
*/
|
|
public function basePointList(AgriculturalBase $agriculturalBasic, Request $request)
|
|
{
|
|
$deviceType = $request->input('device_type', DeviceType::Meteorological);
|
|
$list = Device::where([
|
|
'agricultural_base_id' => $agriculturalBasic->id,
|
|
'type'=>$deviceType
|
|
])->orderBy('sort', 'desc')->get()->pluck('monitoring_point', 'id')->toArray();
|
|
return $this->json($list);
|
|
}
|
|
|
|
public function basePoints(Request $request)
|
|
{
|
|
$devices = Device::filter($request->input())->orderBy('sort', 'desc')->get();
|
|
|
|
return DeviceResource::collection($devices);
|
|
}
|
|
}
|