You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
313 lines
8.4 KiB
313 lines
8.4 KiB
|
11 months ago
|
<?php
|
||
|
|
|
||
|
|
namespace App\Models;
|
||
|
|
|
||
|
|
class Config extends SoftDeletesModel
|
||
|
|
{
|
||
|
|
protected $table = 'configs';
|
||
|
|
|
||
|
|
// 配置键常量
|
||
|
|
const KEY_SYSTEM_NAME = 'system_name'; // 系统名称
|
||
|
|
const KEY_SYSTEM_LOGO = 'system_logo'; // 系统Logo
|
||
|
|
const KEY_VISIT_ADVANCE_DAYS = 'visit_advance_days'; // 预约提前天数
|
||
|
|
const KEY_VISIT_MAX_DAYS = 'visit_max_days'; // 预约最大天数
|
||
|
|
const KEY_STUDY_REQUIRED = 'study_required'; // 是否必须学习
|
||
|
|
const KEY_STUDY_EXPIRE_DAYS = 'study_expire_days'; // 学习有效期
|
||
|
|
const KEY_AUDIT_AUTO_APPROVE = 'audit_auto_approve'; // 自动审核
|
||
|
|
const KEY_BLACKLIST_CHECK = 'blacklist_check'; // 黑名单检查
|
||
|
|
const KEY_SMS_ENABLED = 'sms_enabled'; // 短信通知
|
||
|
|
const KEY_EMAIL_ENABLED = 'email_enabled'; // 邮件通知
|
||
|
|
const KEY_WECHAT_ENABLED = 'wechat_enabled'; // 微信通知
|
||
|
|
const KEY_GATE_QR_EXPIRE = 'gate_qr_expire'; // 门岗二维码有效期
|
||
|
|
const KEY_VISIT_REMINDER_HOURS = 'visit_reminder_hours'; // 访问提醒时间
|
||
|
|
const KEY_SYSTEM_MAINTENANCE = 'system_maintenance'; // 系统维护模式
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取配置值
|
||
|
|
*/
|
||
|
|
public static function get($key, $default = null)
|
||
|
|
{
|
||
|
|
$config = self::where('key', $key)->first();
|
||
|
|
return $config ? $config->value : $default;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 设置配置值
|
||
|
|
*/
|
||
|
|
public static function set($key, $value, $name = null)
|
||
|
|
{
|
||
|
|
$config = self::where('key', $key)->first();
|
||
|
|
|
||
|
|
if ($config) {
|
||
|
|
$config->value = $value;
|
||
|
|
if ($name) {
|
||
|
|
$config->name = $name;
|
||
|
|
}
|
||
|
|
$config->save();
|
||
|
|
} else {
|
||
|
|
self::create([
|
||
|
|
'key' => $key,
|
||
|
|
'value' => $value,
|
||
|
|
'name' => $name ?: $key,
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取系统名称
|
||
|
|
*/
|
||
|
|
public static function getSystemName()
|
||
|
|
{
|
||
|
|
return self::get(self::KEY_SYSTEM_NAME, '访客管理系统');
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取系统Logo
|
||
|
|
*/
|
||
|
|
public static function getSystemLogo()
|
||
|
|
{
|
||
|
|
return self::get(self::KEY_SYSTEM_LOGO);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取预约提前天数
|
||
|
|
*/
|
||
|
|
public static function getVisitAdvanceDays()
|
||
|
|
{
|
||
|
|
return (int) self::get(self::KEY_VISIT_ADVANCE_DAYS, 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取预约最大天数
|
||
|
|
*/
|
||
|
|
public static function getVisitMaxDays()
|
||
|
|
{
|
||
|
|
return (int) self::get(self::KEY_VISIT_MAX_DAYS, 30);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 是否必须学习
|
||
|
|
*/
|
||
|
|
public static function isStudyRequired()
|
||
|
|
{
|
||
|
|
return (bool) self::get(self::KEY_STUDY_REQUIRED, true);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取学习有效期
|
||
|
|
*/
|
||
|
|
public static function getStudyExpireDays()
|
||
|
|
{
|
||
|
|
return (int) self::get(self::KEY_STUDY_EXPIRE_DAYS, 30);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 是否自动审核
|
||
|
|
*/
|
||
|
|
public static function isAuditAutoApprove()
|
||
|
|
{
|
||
|
|
return (bool) self::get(self::KEY_AUDIT_AUTO_APPROVE, false);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 是否检查黑名单
|
||
|
|
*/
|
||
|
|
public static function isBlacklistCheckEnabled()
|
||
|
|
{
|
||
|
|
return (bool) self::get(self::KEY_BLACKLIST_CHECK, true);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 是否启用短信通知
|
||
|
|
*/
|
||
|
|
public static function isSmsEnabled()
|
||
|
|
{
|
||
|
|
return (bool) self::get(self::KEY_SMS_ENABLED, true);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 是否启用邮件通知
|
||
|
|
*/
|
||
|
|
public static function isEmailEnabled()
|
||
|
|
{
|
||
|
|
return (bool) self::get(self::KEY_EMAIL_ENABLED, true);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 是否启用微信通知
|
||
|
|
*/
|
||
|
|
public static function isWechatEnabled()
|
||
|
|
{
|
||
|
|
return (bool) self::get(self::KEY_WECHAT_ENABLED, true);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取门岗二维码有效期(小时)
|
||
|
|
*/
|
||
|
|
public static function getGateQrExpireHours()
|
||
|
|
{
|
||
|
|
return (int) self::get(self::KEY_GATE_QR_EXPIRE, 24);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取访问提醒时间(小时)
|
||
|
|
*/
|
||
|
|
public static function getVisitReminderHours()
|
||
|
|
{
|
||
|
|
return (int) self::get(self::KEY_VISIT_REMINDER_HOURS, 2);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 是否系统维护模式
|
||
|
|
*/
|
||
|
|
public static function isSystemMaintenance()
|
||
|
|
{
|
||
|
|
return (bool) self::get(self::KEY_SYSTEM_MAINTENANCE, false);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取所有配置
|
||
|
|
*/
|
||
|
|
public static function getAllConfigs()
|
||
|
|
{
|
||
|
|
return self::all()->pluck('value', 'key')->toArray();
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 批量设置配置
|
||
|
|
*/
|
||
|
|
public static function setBatch($configs)
|
||
|
|
{
|
||
|
|
foreach ($configs as $key => $value) {
|
||
|
|
self::set($key, $value);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取系统配置统计
|
||
|
|
*/
|
||
|
|
public static function getStatistics()
|
||
|
|
{
|
||
|
|
$total = self::count();
|
||
|
|
$systemConfigs = self::whereIn('key', [
|
||
|
|
self::KEY_SYSTEM_NAME,
|
||
|
|
self::KEY_SYSTEM_LOGO,
|
||
|
|
self::KEY_SYSTEM_MAINTENANCE,
|
||
|
|
])->count();
|
||
|
|
|
||
|
|
$visitConfigs = self::whereIn('key', [
|
||
|
|
self::KEY_VISIT_ADVANCE_DAYS,
|
||
|
|
self::KEY_VISIT_MAX_DAYS,
|
||
|
|
self::KEY_VISIT_REMINDER_HOURS,
|
||
|
|
])->count();
|
||
|
|
|
||
|
|
$studyConfigs = self::whereIn('key', [
|
||
|
|
self::KEY_STUDY_REQUIRED,
|
||
|
|
self::KEY_STUDY_EXPIRE_DAYS,
|
||
|
|
])->count();
|
||
|
|
|
||
|
|
$notificationConfigs = self::whereIn('key', [
|
||
|
|
self::KEY_SMS_ENABLED,
|
||
|
|
self::KEY_EMAIL_ENABLED,
|
||
|
|
self::KEY_WECHAT_ENABLED,
|
||
|
|
])->count();
|
||
|
|
|
||
|
|
return [
|
||
|
|
'total' => $total,
|
||
|
|
'system_configs' => $systemConfigs,
|
||
|
|
'visit_configs' => $visitConfigs,
|
||
|
|
'study_configs' => $studyConfigs,
|
||
|
|
'notification_configs' => $notificationConfigs,
|
||
|
|
];
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 初始化默认配置
|
||
|
|
*/
|
||
|
|
public static function initDefaultConfigs()
|
||
|
|
{
|
||
|
|
$defaultConfigs = [
|
||
|
|
self::KEY_SYSTEM_NAME => '访客管理系统',
|
||
|
|
self::KEY_VISIT_ADVANCE_DAYS => 1,
|
||
|
|
self::KEY_VISIT_MAX_DAYS => 30,
|
||
|
|
self::KEY_STUDY_REQUIRED => true,
|
||
|
|
self::KEY_STUDY_EXPIRE_DAYS => 30,
|
||
|
|
self::KEY_AUDIT_AUTO_APPROVE => false,
|
||
|
|
self::KEY_BLACKLIST_CHECK => true,
|
||
|
|
self::KEY_SMS_ENABLED => true,
|
||
|
|
self::KEY_EMAIL_ENABLED => true,
|
||
|
|
self::KEY_WECHAT_ENABLED => true,
|
||
|
|
self::KEY_GATE_QR_EXPIRE => 24,
|
||
|
|
self::KEY_VISIT_REMINDER_HOURS => 2,
|
||
|
|
self::KEY_SYSTEM_MAINTENANCE => false,
|
||
|
|
];
|
||
|
|
|
||
|
|
foreach ($defaultConfigs as $key => $value) {
|
||
|
|
if (!self::where('key', $key)->exists()) {
|
||
|
|
self::create([
|
||
|
|
'key' => $key,
|
||
|
|
'value' => $value,
|
||
|
|
'name' => $key,
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取配置详情
|
||
|
|
*/
|
||
|
|
public function getDetails()
|
||
|
|
{
|
||
|
|
return [
|
||
|
|
'id' => $this->id,
|
||
|
|
'key' => $this->key,
|
||
|
|
'name' => $this->name,
|
||
|
|
'value' => $this->value,
|
||
|
|
'created_at' => $this->created_at->format('Y-m-d H:i:s'),
|
||
|
|
'updated_at' => $this->updated_at->format('Y-m-d H:i:s'),
|
||
|
|
];
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 验证配置值
|
||
|
|
*/
|
||
|
|
public function validate()
|
||
|
|
{
|
||
|
|
$errors = [];
|
||
|
|
|
||
|
|
if (empty($this->key)) {
|
||
|
|
$errors[] = '配置键不能为空';
|
||
|
|
}
|
||
|
|
|
||
|
|
if (empty($this->name)) {
|
||
|
|
$errors[] = '配置名称不能为空';
|
||
|
|
}
|
||
|
|
|
||
|
|
// 根据不同的配置键进行特殊验证
|
||
|
|
switch ($this->key) {
|
||
|
|
case self::KEY_VISIT_ADVANCE_DAYS:
|
||
|
|
case self::KEY_VISIT_MAX_DAYS:
|
||
|
|
case self::KEY_STUDY_EXPIRE_DAYS:
|
||
|
|
case self::KEY_GATE_QR_EXPIRE:
|
||
|
|
case self::KEY_VISIT_REMINDER_HOURS:
|
||
|
|
if (!is_numeric($this->value) || $this->value < 0) {
|
||
|
|
$errors[] = '数值配置必须为非负数';
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case self::KEY_STUDY_REQUIRED:
|
||
|
|
case self::KEY_AUDIT_AUTO_APPROVE:
|
||
|
|
case self::KEY_BLACKLIST_CHECK:
|
||
|
|
case self::KEY_SMS_ENABLED:
|
||
|
|
case self::KEY_EMAIL_ENABLED:
|
||
|
|
case self::KEY_WECHAT_ENABLED:
|
||
|
|
case self::KEY_SYSTEM_MAINTENANCE:
|
||
|
|
if (!in_array($this->value, ['0', '1', 'true', 'false'])) {
|
||
|
|
$errors[] = '布尔配置值必须为0/1或true/false';
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
return $errors;
|
||
|
|
}
|
||
|
|
}
|