feat: 同步今日小程序与后台迭代版本

集中提交今日 API、管理端、小程序与部署文档调整,确保 Gitea 主分支与本地最新开发版本一致。

Made-with: Cursor
This commit is contained in:
卡若
2026-04-20 11:07:55 +08:00
parent 7108f28280
commit ce55c48c64
180 changed files with 11659 additions and 6078 deletions

View File

@@ -4,6 +4,7 @@ namespace app\controller\superadmin;
use app\BaseController;
use app\common\service\FeishuLeadWebhookService;
use app\common\service\OutboundPushHookService;
use app\common\service\WechatAuditSyncService;
use app\model\SystemConfig as SystemConfigModel;
use app\model\User as UserModel;
use app\model\Enterprise as EnterpriseModel;
@@ -57,9 +58,17 @@ class Settings extends BaseController
'siteDescription' => '专业的AI性格测试平台',
'miniprogramName' => '神仙团队AI性格测试',
'maintenanceMode' => false,
/** 小程序提审:隐藏神仙 AI 对话/深度报告等深度合成入口,与 maintenanceMode面相审核可分开 */
'miniprogramAuditMode' => false,
'maxTestsPerDay' => 100,
'trialTestCount' => 10,
'defaultEnterpriseId' => null,
/** 为 true默认打开超管设置会按间隔拉微信审核状态并自动切换 miniprogramAuditMode */
'wechatAuditAutoMiniprogramMode' => true,
'wechatLastAuditErrcode' => null,
'wechatLastAuditStatus' => null,
'wechatLastAuditReason' => '',
'wechatLastAuditSyncedAt' => null,
];
$systemOut = $systemDefault;
// 仅当 system 行「未包含」maintenanceMode 键时,才用旧表 review_mode 回退(否则关闭审核后会被 review_mode.enabled 再次顶成「已开启」)
@@ -84,6 +93,27 @@ class Settings extends BaseController
}
}
$systemOut['maintenanceMode'] = $maint;
if (!array_key_exists('miniprogramAuditMode', $systemOut)) {
$systemOut['miniprogramAuditMode'] = false;
}
$systemOut['miniprogramAuditMode'] = (bool) ($systemOut['miniprogramAuditMode'] ?? false);
if (!array_key_exists('wechatAuditAutoMiniprogramMode', $systemOut)) {
$systemOut['wechatAuditAutoMiniprogramMode'] = true;
} else {
$systemOut['wechatAuditAutoMiniprogramMode'] = $systemOut['wechatAuditAutoMiniprogramMode'] !== false;
}
// 跟随微信审核:非手动请求时按节流调用,避免每次打开页面都打微信接口
try {
if (WechatAuditSyncService::shouldAutoSync($systemOut)) {
$sync = WechatAuditSyncService::run(false);
if (!empty($sync['systemBroadcast']) && is_array($sync['systemBroadcast'])) {
$systemOut = array_merge($systemOut, $sync['systemBroadcast']);
}
}
} catch (\Throwable $e) {
\think\facade\Log::error('wechat audit sync on settings index: ' . $e->getMessage());
}
// 与前端 el-option 的 number value 对齐,避免类型不一致导致下拉不反显
if (array_key_exists('defaultEnterpriseId', $systemOut)) {
@@ -111,7 +141,7 @@ class Settings extends BaseController
'reportRequiresPayment' => $reportRequiresPaymentConfig && !empty($reportRequiresPaymentConfig->value) ? $reportRequiresPaymentConfig->value : ['face' => 1, 'mbti' => 0, 'disc' => 0, 'pdp' => 0],
'textConfig' => $textConfigModel && !empty($textConfigModel->value) ? $textConfigModel->value : [
'analyzingTitle' => '正在分析中',
'startButtonText' => '开始面相测试',
'startButtonText' => '30秒测出你的性格',
'startButtonEnterprise' => '开始面部测试',
'reportTitle' => '分析报告',
'aiAnalysisText' => '智能分析'
@@ -141,7 +171,7 @@ class Settings extends BaseController
$input = [];
}
$allowedKeys = ['siteName', 'siteDescription', 'miniprogramName', 'maintenanceMode', 'maxTestsPerDay', 'trialTestCount', 'defaultEnterpriseId'];
$allowedKeys = ['siteName', 'siteDescription', 'miniprogramName', 'maintenanceMode', 'miniprogramAuditMode', 'wechatAuditAutoMiniprogramMode', 'maxTestsPerDay', 'trialTestCount', 'defaultEnterpriseId'];
$data = array_intersect_key($input, array_flip($allowedKeys));
// 兼容 fallbackJSON 解析失败时尝试 Request::only
if (empty($data)) {
@@ -150,6 +180,12 @@ class Settings extends BaseController
if (array_key_exists('maintenanceMode', $data)) {
$data['maintenanceMode'] = filter_var($data['maintenanceMode'], FILTER_VALIDATE_BOOLEAN);
}
if (array_key_exists('miniprogramAuditMode', $data)) {
$data['miniprogramAuditMode'] = filter_var($data['miniprogramAuditMode'], FILTER_VALIDATE_BOOLEAN);
}
if (array_key_exists('wechatAuditAutoMiniprogramMode', $data)) {
$data['wechatAuditAutoMiniprogramMode'] = filter_var($data['wechatAuditAutoMiniprogramMode'], FILTER_VALIDATE_BOOLEAN);
}
// 默认企业0 或空视为不启用
if (array_key_exists('defaultEnterpriseId', $data)) {
$de = $data['defaultEnterpriseId'];
@@ -210,7 +246,7 @@ class Settings extends BaseController
if (is_array($textConfig)) {
$tcKeys = ['analyzingTitle', 'startButtonText', 'startButtonEnterprise', 'reportTitle', 'aiAnalysisText'];
$tcData = array_intersect_key($textConfig, array_flip($tcKeys));
$tcDefaults = ['analyzingTitle' => '正在分析中', 'startButtonText' => '开始面相测试', 'startButtonEnterprise' => '开始面部测试', 'reportTitle' => '分析报告', 'aiAnalysisText' => '智能分析'];
$tcDefaults = ['analyzingTitle' => '正在分析中', 'startButtonText' => '30秒测出你的性格', 'startButtonEnterprise' => '开始面部测试', 'reportTitle' => '分析报告', 'aiAnalysisText' => '智能分析'];
$tcConfig = SystemConfigModel::where('key', 'text_config')->where('enterprise_id', 0)->find();
if (!$tcConfig) {
$tcConfig = new SystemConfigModel();
@@ -228,6 +264,30 @@ class Settings extends BaseController
}
}
/**
* POST /api/v1/superadmin/settings/wechat-audit-sync
* 立即请求微信 get_latest_auditstatus 并写入 miniprogramAuditMode不受节流限制
*/
public function syncWechatAuditStatus()
{
$user = $this->request->user ?? null;
if (!$user || $user['role'] !== 'superadmin') {
return error('无权限访问', 403);
}
try {
$sync = WechatAuditSyncService::run(true);
return success([
'applied' => !empty($sync['applied']),
'miniprogramAuditMode' => (bool) ($sync['miniprogramAuditMode'] ?? false),
'wechat' => $sync['wechat'] ?? [],
'systemBroadcast' => $sync['systemBroadcast'] ?? [],
], '已同步微信审核状态');
} catch (\Throwable $e) {
return error('同步失败:' . $e->getMessage(), 500);
}
}
/**
* 更新「报告需付费」配置:哪些测试类型需付费后才显示完整报告
* PUT body: { "face": 1, "mbti": 0, "disc": 0, "pdp": 0 }1=需付费解锁完整0=免费完整)