Compare commits

...

16 Commits

Author SHA1 Message Date
Jing Li aef3502938 Update 2023-10-31 12:05:53 +08:00
Jing Li 2da65f5608 Update 2023-10-30 15:55:33 +08:00
Jing Li 7b8c02c1b4 Update 2023-10-30 15:52:30 +08:00
Jing Li be80b4bf0c Update 2023-10-26 20:31:59 +08:00
Jing Li a3cd26602f Update 2023-10-26 14:48:37 +08:00
Jing Li 00c7ef9de8 修复基地产量 2023-10-26 14:41:07 +08:00
Jing Li c857350b52 Fix 2023-10-26 10:46:25 +08:00
Jing Li adaddba5ce Fix 2023-10-26 10:18:03 +08:00
Jing Li 1cfa3715c4 Fix 2023-10-25 10:56:57 +08:00
Jing Li 342c5f7c3d 更新异常处理器 2023-10-25 10:55:08 +08:00
Jing Li e13ca5cf4b 重点产业数据校验 2023-10-25 10:50:01 +08:00
Jing Li baf96dd997 Update 2023-10-23 12:01:10 +08:00
Jing Li dde34bfbce Update 2023-10-23 11:48:21 +08:00
Jing Li fd9cbd8c7d Update 2023-10-23 10:39:57 +08:00
Jing Li 83dd2ec7d1 监控设备扩展数据非必填 2023-10-22 16:18:20 +08:00
Jing Li 91962e4b52 按用户角色获取基地 2023-10-22 15:27:02 +08:00
24 changed files with 273 additions and 137 deletions

View File

@ -10,7 +10,6 @@ use App\Models\DeviceLog;
use App\Models\WormPhoto;
use Illuminate\Console\Command;
use Illuminate\Support\Arr;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Storage;
use RuntimeException;
use Throwable;
@ -65,6 +64,7 @@ class DeviceLogSyncCommand extends Command
/** @var \App\Models\Device */
foreach ($devices as $device) {
if (! in_array($device->type, [
DeviceType::Monitor,
DeviceType::Soil,
DeviceType::Meteorological,
DeviceType::Worm,
@ -78,6 +78,7 @@ class DeviceLogSyncCommand extends Command
$this->info('设备编号: ' . $device->sn);
$this->info('设备名称: ' . $device->name);
$this->info('设备类型: ' . match ($device->type) {
DeviceType::Monitor => '苗情设备',
DeviceType::Soil => '土壤设备',
DeviceType::Meteorological => '气象设备',
DeviceType::Worm => '虫情设备',
@ -89,6 +90,14 @@ class DeviceLogSyncCommand extends Command
$httpClient = $this->buildHttpClient($device);
switch ($device->type) {
case DeviceType::Monitor:
$data = $httpClient->getMonitorPalyAddress($device->sn);
$device->update([
'status' => $data ? DeviceStatus::Online : DeviceStatus::Offline,
]);
break;
case DeviceType::Soil:
$data = $httpClient->getLatestSoilReport($device->sn);

View File

@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Http\Exceptions\ThrottleRequestsException;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Validation\ValidationException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Throwable;
@ -111,10 +112,16 @@ class Handler extends ExceptionHandler
*/
protected function invalidJson($request, ValidationException $exception)
{
$errors = $exception->errors();
if (is_array($firstMessage = Arr::first($errors))) {
$firstMessage = Arr::first($firstMessage);
}
return response()->json([
'code' => 422,
'message' => $exception->getMessage(),
'errors' => $exception->errors(),
'message' => $firstMessage ?: '参数错误',
'errors' => $errors,
], 200);
}

View File

@ -2,16 +2,16 @@
namespace App\Http\Controllers;
use App\Enums\OperationType;
use App\Helpers\Paginator;
use App\Http\Requestes\AdminUserRequest;
use App\Http\Requestes\AdminUserUpdateRequest;
use App\Http\Requestes\RestPasswordRequest;
use App\Http\Resources\AdminUserResource;
use App\Models\AdminUser;
use App\Services\OperationLogService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Services\OperationLogService;
use App\Enums\OperationType;
class AdminUserController extends Controller
{
@ -33,10 +33,20 @@ class AdminUserController extends Controller
DB::beginTransaction();
//添加管理员信息
$input = $request->input();
// 是否可查看所有基地
if ($viewAllBases = (bool) $request->input('view_all_bases', false)) {
$input['view_all_bases'] = $viewAllBases;
}
$input['password'] = bcrypt($request->input('password'));
$user = AdminUser::create($input);
//添加管理员查看基地的数据权限;
$user->bases()->sync($baseIds);
if (! $user->view_all_bases) {
// 添加管理员查看基地的数据权限;
$user->bases()->sync($baseIds);
}
//添加管理员角色关联;
$user->roles()->sync($request->input('role_id'));
DB::commit();
@ -66,10 +76,21 @@ class AdminUserController extends Controller
}
try {
DB::beginTransaction();
$input = $request->input();
if ($viewAllBases = (bool) $request->input('view_all_bases', false)) {
$input['view_all_bases'] = $viewAllBases;
}
//添加管理员信息
$adminUser->update($request->input());
//添加管理员查看基地的数据权限;
$adminUser->bases()->sync($baseIds);
$adminUser->update($input);
if (! $adminUser->view_all_bases) {
// 添加管理员查看基地的数据权限;
$adminUser->bases()->sync($baseIds);
}
//添加管理员角色关联;
$adminUser->roles()->sync($request->input('role_id'));
DB::commit();

View File

@ -125,17 +125,18 @@ class AgriculturalBaseController extends Controller
*/
public function deviceBase(Request $request)
{
$deviceType = $request->input('device_type', DeviceType::Monitor);
// $status = $request->input('status');
/** @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) {
if($deviceType == DeviceType::Monitor || $deviceType == 1){
if($isRecommend){
$q->where('is_recommend', 1);
}
$q->where('status', 1);
}
return $q->where('type', $deviceType);
$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() && ! $user->view_all_bases, 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));

View File

@ -17,46 +17,62 @@ class AgriculturalBaseRequest extends FormRequest
*/
public function rules()
{
if ($this->input('type') == 2) {
return [
'type' => ['bail', 'required', new Enum(BaseType::class)],
'name' => ['bail', 'required', 'string', 'max:100'],
'address' => ['bail', 'required', 'string', 'max:190'],
'areas' => ['bail', 'required', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'cultivated' => ['bail', 'required', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'workforce' => ['bail', 'required', 'int', 'min:0', 'max:2147483647'],
'description' => ['bail', 'nullable', 'string'],
];
}
return [
'type' => ['required', new Enum(BaseType::class)],
'name' => 'required|string|max:100',
'description' => 'nullable|string',
'person' => 'required_if:type,1|string|max:100',
'crops_ids' => 'nullable|array|min:1',
'areas' => 'required|regex:/^\d+(\.\d{1,2})?$/',
'workforce' => 'required|integer|min:0',
'address' => 'nullable|string',
'address_lat' => 'nullable|regex:/^\d+(\.\d{1,10})?$/',
'address_lng' => 'nullable|regex:/^\d+(\.\d{1,10})?$/',
'parent_id' => 'required_if:type,1|integer|min:0',
'sort' => 'nullable|integer|min:0',
'type' => ['bail', 'required', new Enum(BaseType::class)],
'parent_id' => ['bail', 'required', 'int'],
'name' => ['bail', 'required', 'string', 'max:100'],
'person' => ['bail', 'required', 'string', 'max:100'],
'crops_ids' => ['bail', 'required', 'array'],
'areas' => ['bail', 'required', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'cultivated' => ['bail', 'required', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'workforce' => ['bail', 'required', 'int', 'min:0', 'max:2147483647'],
'description' => ['bail', 'nullable', 'string'],
'address' => ['bail', 'required', 'string', 'max:190'],
'address_lat' => ['bail', 'nullable', 'regex:/^\d+(\.\d{1,10})?$/'],
'address_lng' => ['bail', 'nullable', 'regex:/^\d+(\.\d{1,10})?$/'],
'sort' => ['bail', 'nullable', 'int', 'min:0', 'max:2147483647'],
];
}
public function messages()
public function attributes()
{
$messages = [
'type' => '请选择区域类别',
'name.required' => '请填写名称',
'name.max' => '名称不能超过100字',
'description.string' => '请正确填写介绍',
'person.required_if' => '请填写负责人名称',
'person.max' => '负责人名称不能超过100字',
'crops_ids.min' => '至少选择一种农作物',
'areas.required' => '请填写面积',
'areas.regex' => '请正确填写面积',
'workforce.required' => '请填写人数',
'workforce.min' => '人数最小为0',
'address.string' => '请正确填写地址',
'parent_id.required_if' => '请选择城镇',
if ($this->input('type') == 2) {
return [
'name' => '街镇名称',
'address' => '街镇地址',
'areas' => '街镇面积',
'cultivated' => '耕地面积',
'workforce' => '街镇人数',
'description' => '街镇介绍',
];
}
return [
'industry_key' => '农业类型',
'name' => '基地名称',
'person' => '基地负责人',
'areas' => '基地面积',
'cultivated' => '种养植面积',
'workforce' => '基地人数',
'parent_id' => '城镇',
'crops_ids' => '基地农作物',
'description' => '基地介绍',
'address' => '基地地址',
'address_lng' => '基地经度',
'address_lat' => '基地纬度',
'sort' => '排序',
];
return $messages;
}
protected function failedValidation(Validator $validator)
{
$error = $validator->errors()->all();
throw new HttpResponseException(response()->json(['data' => [], 'code' => 400, 'message' => $error[0]]));
}
}

View File

@ -2,9 +2,9 @@
namespace App\Http\Requestes;
use Illuminate\Contracts\Validation\Validator;
use App\Rules\Quarter;
use App\Rules\Year;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
class CropYieldRequest extends FormRequest
{
@ -16,34 +16,26 @@ class CropYieldRequest extends FormRequest
public function rules()
{
return [
'time_year' => 'required|date_format:Y',
'quarter' => 'required|integer|min:1|max:4',
'time_year' => ['bail', 'required', new Year()],
'quarter' => ['bail', 'required', new Quarter()],
'crop_id' => 'required|integer|min:0',
'base_id' => 'required|integer|min:0',
'yield' => 'required|regex:/^\d+(\.\d{1,2})?$/',
'cultivated' => 'required|regex:/^\d+(\.\d{1,2})?$/',
'output' => 'required|regex:/^\d+(\.\d{1,2})?$/',
'yield' => ['bail', 'required', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'cultivated' => ['bail', 'required', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'output' => ['bail', 'required', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
];
}
public function messages()
public function attributes()
{
$messages = [
'time_year' => '请选择正确年份',
'quarter' => '请选择正确季度',
'crop_id' => '请选择农作物',
'base_id' => '请选择地区',
'yield' => '请填写产量',
'cultivated' => '请填写种养殖面积',
'output' => '请填写产值',
return [
'time_year' => '年份',
'quarter' => '季度',
'crop_id' => '农作物',
'base_id' => '地区',
'yield' => '产量',
'cultivated' => '耕种面积',
'output' => '产值',
];
return $messages;
}
protected function failedValidation(Validator $validator)
{
$error = $validator->errors()->all();
throw new HttpResponseException(response()->json(['data' => [], 'code' => 400, 'message' => $error[0]]));
}
}

View File

@ -2,9 +2,9 @@
namespace App\Http\Requestes;
use Illuminate\Contracts\Validation\Validator;
use App\Rules\Quarter;
use App\Rules\Year;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
class CropYieldUpdateRequest extends FormRequest
{
@ -16,32 +16,26 @@ class CropYieldUpdateRequest extends FormRequest
public function rules()
{
return [
'time_year' => 'required|date_format:Y',
'time_year' => ['bail', 'required', new Year()],
'quarter' => ['bail', 'required', new Quarter()],
'crop_id' => 'required|integer|min:0',
'base_id' => 'required|integer|min:0',
'yield' => 'required|regex:/^\d+(\.\d{1,2})?$/',
'cultivated' => 'required|regex:/^\d+(\.\d{1,2})?$/',
'output' => 'required|regex:/^\d+(\.\d{1,2})?$/',
'yield' => ['bail', 'required', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'cultivated' => ['bail', 'required', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'output' => ['bail', 'required', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
];
}
public function messages()
public function attributes()
{
$messages = [
'time_year' => '请选择年份',
'crop_id' => '请选择农作物',
'base_id' => '请选择基地',
'yield' => '请填写产量',
'cultivated' => '请填写耕地面积',
'output' => '请填写产值',
return [
'time_year' => '年份',
'quarter' => '季度',
'crop_id' => '农作物',
'base_id' => '地区',
'yield' => '产量',
'cultivated' => '耕种面积',
'output' => '产值',
];
return $messages;
}
protected function failedValidation(Validator $validator)
{
$error = $validator->errors()->all();
throw new HttpResponseException(response()->json(['data' => [], 'code' => 400, 'message' => $error[0]]));
}
}

View File

@ -24,12 +24,12 @@ class DeviceRequest extends FormRequest
'monitoring_point' => 'required|string|max:100',
'supplier_key' => 'required',
'extends' => 'required_if:type,1',
'extends.ip' => 'required_if:type,1|string',
'extends.port' => 'required_if:type,1|string',
'extends.rtsp_url' => 'required_if:type,1|string',
'extends.username' => 'required_if:type,1|string',
'extends.password' => 'required_if:type,1|string',
'extends.passage' => 'required_if:type,1|string',
// 'extends.ip' => 'required_if:type,1|string',
// 'extends.port' => 'required_if:type,1|string',
// 'extends.rtsp_url' => 'required_if:type,1|string',
// 'extends.username' => 'required_if:type,1|string',
// 'extends.password' => 'required_if:type,1|string',
// 'extends.passage' => 'required_if:type,1|string',
'is_recommend' => 'filled|boolean',
'sort' => 'nullable|integer|min:0',
];

View File

@ -4,6 +4,7 @@ namespace App\Http\Requestes;
use App\Enums\MaterielType;
use App\Rules\Quarter;
use App\Rules\Year;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rules\Enum;
@ -17,12 +18,12 @@ class MaterielStoreRequest extends FormRequest
public function rules()
{
return [
'year' => ['bail', 'required', 'int'],
'year' => ['bail', 'required', 'int', new Year()],
'quarter' => ['bail', 'required', new Quarter()],
'name' => ['bail', 'required', 'string', 'max:255'],
'type' => ['bail', 'required', new Enum(MaterielType::class)],
'lowest_price' => ['bail', 'required', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'highest_price' => ['bail', 'required', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/', 'gte:lowest_price'],
'lowest_price' => ['bail', 'required', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'highest_price' => ['bail', 'required', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/', 'gte:lowest_price'],
];
}

View File

@ -4,6 +4,7 @@ namespace App\Http\Requestes;
use App\Enums\MaterielType;
use App\Rules\Quarter;
use App\Rules\Year;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rules\Enum;
@ -17,12 +18,12 @@ class MaterielUpdateRequest extends FormRequest
public function rules()
{
return [
'year' => ['filled', 'int'],
'year' => ['filled', 'int', new Year()],
'quarter' => ['filled', new Quarter()],
'name' => ['filled', 'string', 'max:255'],
'type' => ['filled', new Enum(MaterielType::class)],
'lowest_price' => ['filled', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'highest_price' => ['filled', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/', 'gte:lowest_price'],
'lowest_price' => ['filled', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'highest_price' => ['filled', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/', 'gte:lowest_price'],
'unit' => ['filled', 'string'],
];
}

View File

@ -3,6 +3,7 @@
namespace App\Http\Requestes;
use App\Rules\Quarter;
use App\Rules\Year;
use Illuminate\Foundation\Http\FormRequest;
class RiceShrimpFlowStoreRequest extends FormRequest
@ -15,10 +16,10 @@ class RiceShrimpFlowStoreRequest extends FormRequest
public function rules()
{
return [
'year' => ['required', 'int'],
'year' => ['required', 'int', new Year()],
'quarter' => ['required', new Quarter()],
'area' => ['required', 'string'],
'sales' => ['required', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'sales' => ['required', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'unit' => ['required', 'string'],
];
}

View File

@ -3,6 +3,7 @@
namespace App\Http\Requestes;
use App\Rules\Quarter;
use App\Rules\Year;
use Illuminate\Foundation\Http\FormRequest;
class RiceShrimpFlowUpdateRequest extends FormRequest
@ -15,10 +16,10 @@ class RiceShrimpFlowUpdateRequest extends FormRequest
public function rules()
{
return [
'year' => ['filled', 'int'],
'year' => ['filled', 'int', new Year()],
'quarter' => ['filled', new Quarter()],
'area' => ['filled', 'string'],
'sales' => ['filled', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'sales' => ['filled', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'unit' => ['filled', 'string'],
];
}

View File

@ -3,6 +3,7 @@
namespace App\Http\Requestes;
use App\Rules\Quarter;
use App\Rules\Year;
use Illuminate\Foundation\Http\FormRequest;
class RiceShrimpIndustryStoreRequest extends FormRequest
@ -15,13 +16,13 @@ class RiceShrimpIndustryStoreRequest extends FormRequest
public function rules()
{
return [
'year' => ['required', 'int'],
'year' => ['required', 'int', new Year()],
'quarter' => ['required', new Quarter()],
'area' => ['required', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'area' => ['required', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'area_unit' => ['required', 'string'],
'product_output' => ['required', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'product_output' => ['required', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'product_output_unit' => ['required', 'string'],
'product_value' => ['required', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'product_value' => ['required', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'product_value_unit' => ['required', 'string'],
];
}

View File

@ -3,6 +3,7 @@
namespace App\Http\Requestes;
use App\Rules\Quarter;
use App\Rules\Year;
use Illuminate\Foundation\Http\FormRequest;
class RiceShrimpIndustryUpdateRequest extends FormRequest
@ -15,13 +16,13 @@ class RiceShrimpIndustryUpdateRequest extends FormRequest
public function rules()
{
return [
'year' => ['filled', 'int'],
'year' => ['filled', 'int', new Year()],
'quarter' => ['filled', new Quarter()],
'area' => ['filled', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'area' => ['filled', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'area_unit' => ['filled', 'string'],
'product_output' => ['filled', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'product_output' => ['filled', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'product_output_unit' => ['filled', 'string'],
'product_value' => ['filled', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'product_value' => ['filled', 'numeric', 'min:0', 'max:9999999999.99', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'product_value_unit' => ['filled', 'string'],
];
}

View File

@ -3,6 +3,7 @@
namespace App\Http\Requestes;
use App\Rules\Quarter;
use App\Rules\Year;
use Illuminate\Foundation\Http\FormRequest;
class RiceShrimpPriceStoreRequest extends FormRequest
@ -15,9 +16,9 @@ class RiceShrimpPriceStoreRequest extends FormRequest
public function rules()
{
return [
'year' => ['required', 'int'],
'year' => ['required', 'int', new Year()],
'quarter' => ['required', new Quarter()],
'price' => ['required', 'int'],
'price' => ['required', 'int', 'min:0', 'max:2147483647'],
];
}

View File

@ -3,6 +3,7 @@
namespace App\Http\Requestes;
use App\Rules\Quarter;
use App\Rules\Year;
use Illuminate\Foundation\Http\FormRequest;
class RiceShrimpPriceUpdateRequest extends FormRequest
@ -15,9 +16,9 @@ class RiceShrimpPriceUpdateRequest extends FormRequest
public function rules()
{
return [
'year' => ['filled', 'int'],
'year' => ['filled', 'int', new Year()],
'quarter' => ['filled', new Quarter()],
'price' => ['filled', 'int'],
'price' => ['filled', 'int', 'min:0', 'max:2147483647'],
];
}

View File

@ -2,8 +2,7 @@
namespace App\Http\Requestes;
use App\Models\RiceShrimpWeeklyPrice;
use App\Rules\Quarter;
use App\Rules\Year;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Peidikeji\Keywords\Models\Keywords;
@ -18,7 +17,7 @@ class RiceShrimpWeeklyPriceStoreRequest extends FormRequest
public function rules()
{
return [
'year' => ['required', 'int'],
'year' => ['required', 'int', new Year()],
'week' => [
'required',
'int',
@ -26,7 +25,7 @@ class RiceShrimpWeeklyPriceStoreRequest extends FormRequest
return $query->where('type_key', 'weeks-per-year');
}),
],
'price' => ['required', 'int'],
'price' => ['required', 'int', 'min:0', 'max:2147483647'],
];
}

View File

@ -2,6 +2,7 @@
namespace App\Http\Requestes;
use App\Rules\Year;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Peidikeji\Keywords\Models\Keywords;
@ -16,7 +17,7 @@ class RiceShrimpWeeklyPriceUpdateRequest extends FormRequest
public function rules()
{
return [
'year' => ['filled', 'int'],
'year' => ['filled', 'int', new Year()],
'week' => [
'filled',
'int',
@ -24,7 +25,7 @@ class RiceShrimpWeeklyPriceUpdateRequest extends FormRequest
return $query->where('type_key', 'weeks-per-year');
}),
],
'price' => ['filled', 'int'],
'price' => ['filled', 'int', 'min:0', 'max:2147483647'],
];
}

View File

@ -24,6 +24,7 @@ class AdminUserResource extends JsonResource
'phone' => $this->phone,
'status' => $this->status,
'is_enable' => $this->is_enable,
'view_all_bases' => (int) $this->view_all_bases,
'bases' => AgriculturalBaseResource::collection($this->whenloaded('bases')),
];
}

View File

@ -95,6 +95,21 @@ class HttpClient
return $result['data'] ?? [];
}
/**
* 苗情设备 - 直播地址
*/
public function getMonitorPalyAddress(string $deviceId)
{
$result = $this->get(
$this->apiUrl('/api/open-api/open/getSeedingLive'),
[
'equipmentCode' => $deviceId,
]
);
return $result['data'] ?? "";
}
public function get(string $url, array $query = []): array
{
return $this->request('GET', $url, [

View File

@ -15,7 +15,11 @@ class AdminUser extends BaseAdminModel
'username',
'password',
'avatar',
'department', 'phone', 'status', 'is_enable',
'department',
'phone',
'status',
'is_enable',
'view_all_bases',
];
protected $hidden = [

30
app/Rules/Year.php 100644
View File

@ -0,0 +1,30 @@
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class Year implements Rule
{
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return $value <= now()->year;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return ':attribute 不能超过现在';
}
}

View File

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('admin_users', function (Blueprint $table) {
$table->boolean('view_all_bases')->default(false)->comment('是否可查看所有基地');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('admin_users', function (Blueprint $table) {
$table->dropColumn(['view_all_bases']);
});
}
};

View File

@ -100,9 +100,15 @@ class EndpointPermissionSeeder extends Seeder
'curd' => false,
'children' => [
'device' => ['name' => '设备管理', 'curd' => true],
'warnings' => ['name' => '警报明细', 'curd' => false,'children'=>['mark'=>'标记'],
'warnings' => [
'name' => '警报明细',
'curd' => ['index'],
'children' => [
'mark'=>'标记',
],
],
],
]],
],
'manage' => [
'name' => '系统管理',
'curd' => false,