feat: 企业计费服务与超管/管理端设置及定价规则文档
1、修复了财务、Analyze/Test 等与定价、账务相关的接口行为。 2、新增 EnterpriseBillingService 与定价企业账务规则说明文档。 3、优化超管 Settings、PricingConfig 及小程序 app 入口逻辑。 Made-with: Cursor
This commit is contained in:
@@ -101,7 +101,7 @@ class Finance extends BaseController
|
||||
$direction = $type === 'consume' ? 'out' : 'in';
|
||||
$description = (string) ($row['description'] ?? '');
|
||||
$typeLabel = $type === 'consume'
|
||||
? '佣金扣减'
|
||||
? (strpos($description, '平台扣费:') === 0 ? '平台扣费' : '佣金扣减')
|
||||
: (strpos($description, '企业余额充值') !== false ? '余额充值' : ($orderId > 0 ? '测试收入' : '余额充值'));
|
||||
|
||||
return [
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
namespace app\controller\api;
|
||||
|
||||
use app\BaseController;
|
||||
use app\common\SystemDefaultEnterprise;
|
||||
use app\common\service\EnterpriseBillingService;
|
||||
use app\controller\api\Test as TestController;
|
||||
use app\model\AiProvider as AiProviderModel;
|
||||
use app\model\SystemConfig as SystemConfigModel;
|
||||
@@ -51,7 +51,7 @@ class Analyze extends BaseController
|
||||
// 三个变量各司其职(同 Test::submit 逻辑):
|
||||
// $enterpriseId —— 仅企业测试(请求体传入)才非 null,决定走 admin_enterprise 定价
|
||||
// $pricingEnterpriseId —— 个人测试时从 wechat_users 取,走 admin_personal + eid 定价
|
||||
// $writeEnterpriseId —— 写入 test_results.enterpriseId(企业测试 or 绑定企业都记录)
|
||||
// $writeEnterpriseId —— 写入 test_results.enterpriseId(仅企业测试或真实绑定企业时记录)
|
||||
$pricingEnterpriseId = $enterpriseId;
|
||||
$writeEnterpriseId = $enterpriseId;
|
||||
if ($enterpriseId === null && $earlyUserId > 0) {
|
||||
@@ -59,12 +59,6 @@ class Analyze extends BaseController
|
||||
if (!empty($boundEid)) {
|
||||
$pricingEnterpriseId = (int) $boundEid; // admin_personal + eid
|
||||
$writeEnterpriseId = (int) $boundEid; // 历史记录展示企业名
|
||||
} else {
|
||||
$defEid = SystemDefaultEnterprise::getId();
|
||||
if ($defEid !== null) {
|
||||
$pricingEnterpriseId = $defEid;
|
||||
$writeEnterpriseId = $defEid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -189,6 +183,11 @@ class Analyze extends BaseController
|
||||
]);
|
||||
}
|
||||
}
|
||||
try {
|
||||
EnterpriseBillingService::chargePlatformFeeForTestResult($testResultId, 'face', $writeEnterpriseId);
|
||||
} catch (\Throwable $e) {
|
||||
// 平台费扣款失败不阻断主流程
|
||||
}
|
||||
// 面相分析由本接口直接写入 test_results,也要补触发测试完成佣金
|
||||
try {
|
||||
\app\controller\api\Distribution::settleTestCommission($testResultId, $userId, 'face');
|
||||
@@ -376,6 +375,11 @@ class Analyze extends BaseController
|
||||
]);
|
||||
}
|
||||
}
|
||||
try {
|
||||
EnterpriseBillingService::chargePlatformFeeForTestResult($testResultId, 'resume', $enterpriseId > 0 ? $enterpriseId : null);
|
||||
} catch (\Throwable $e) {
|
||||
// 平台费扣款失败不阻断主流程
|
||||
}
|
||||
}
|
||||
} catch (\Throwable $e) {
|
||||
Log::error('resumeAnalysis: save test_result failed ' . $e->getMessage());
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
namespace app\controller\api;
|
||||
|
||||
use app\BaseController;
|
||||
use app\common\SystemDefaultEnterprise;
|
||||
use app\common\PdpDiscResultText;
|
||||
use app\common\service\EnterpriseBillingService;
|
||||
use app\model\Enterprise as EnterpriseModel;
|
||||
use app\model\PricingConfig as PricingConfigModel;
|
||||
use app\model\Question as QuestionModel;
|
||||
@@ -668,7 +668,7 @@ class Test extends BaseController
|
||||
// 三个变量各司其职:
|
||||
// $enterpriseId —— 仅企业测试(请求体传入)才非 null,决定走 admin_enterprise 定价
|
||||
// $pricingEnterpriseId —— 个人测试时从 wechat_users 取,走 admin_personal + eid 定价
|
||||
// $writeEnterpriseId —— 写入 test_results.enterpriseId(企业测试 or 绑定企业都记录)
|
||||
// $writeEnterpriseId —— 写入 test_results.enterpriseId(仅企业测试或真实绑定企业时记录)
|
||||
$pricingEnterpriseId = $enterpriseId;
|
||||
$writeEnterpriseId = $enterpriseId;
|
||||
if ($enterpriseId === null) {
|
||||
@@ -676,13 +676,6 @@ class Test extends BaseController
|
||||
if (!empty($boundEid)) {
|
||||
$pricingEnterpriseId = (int) $boundEid; // admin_personal + eid
|
||||
$writeEnterpriseId = (int) $boundEid; // 历史记录展示企业名
|
||||
} else {
|
||||
// 主入口无参数且未绑定企业:回落超管配置的默认企业(与个人版 getEnterpriseIdForApiPayload 不传参一致,由服务端统一落库)
|
||||
$defEid = SystemDefaultEnterprise::getId();
|
||||
if ($defEid !== null) {
|
||||
$pricingEnterpriseId = $defEid;
|
||||
$writeEnterpriseId = $defEid;
|
||||
}
|
||||
}
|
||||
}
|
||||
$requiresPayment = $this->getRequiresPaymentByTestType($testType, $enterpriseId, $pricingEnterpriseId);
|
||||
@@ -715,6 +708,12 @@ class Test extends BaseController
|
||||
]);
|
||||
}
|
||||
}
|
||||
// 已绑定企业时,独立按超管企业版单价扣平台费,与用户实付分列记账。
|
||||
try {
|
||||
EnterpriseBillingService::chargePlatformFeeForTestResult($id, $testType, $writeEnterpriseId);
|
||||
} catch (\Throwable $e) {
|
||||
// 平台费扣款失败不阻断主流程
|
||||
}
|
||||
// 测试完成佣金结算(无需付款,异步不影响主流程)
|
||||
try {
|
||||
\app\controller\api\Distribution::settleTestCommission($id, $userId, $testType);
|
||||
|
||||
@@ -61,19 +61,19 @@ class Settings extends BaseController
|
||||
'defaultEnterpriseId' => null,
|
||||
];
|
||||
$systemOut = $systemDefault;
|
||||
// 仅当 system 行「未包含」maintenanceMode 键时,才用旧表 review_mode 回退(否则关闭审核后会被 review_mode.enabled 再次顶成「已开启」)
|
||||
$hasMaintenanceKeyInSystem = false;
|
||||
if ($systemConfig && $systemConfig->value !== null && $systemConfig->value !== '') {
|
||||
$raw = $systemConfig->value;
|
||||
$decoded = is_array($raw) ? $raw : (is_string($raw) ? json_decode($raw, true) : null);
|
||||
if (is_array($decoded)) {
|
||||
$hasMaintenanceKeyInSystem = array_key_exists('maintenanceMode', $decoded);
|
||||
$systemOut = array_merge($systemDefault, $decoded);
|
||||
}
|
||||
}
|
||||
// 审核模式唯一口径:system.maintenanceMode(布尔)。兼容旧版 review_mode.enabled
|
||||
$maint = false;
|
||||
if (isset($systemOut['maintenanceMode'])) {
|
||||
$maint = (bool) $systemOut['maintenanceMode'];
|
||||
}
|
||||
if (!$maint && $reviewModeConfig && !empty($reviewModeConfig->value)) {
|
||||
// 审核模式:system.maintenanceMode 为唯一口径;兼容旧数据仅在没有该键时读 review_mode.enabled
|
||||
$maint = (bool) ($systemOut['maintenanceMode'] ?? false);
|
||||
if (!$hasMaintenanceKeyInSystem && !$maint && $reviewModeConfig && !empty($reviewModeConfig->value)) {
|
||||
$rv = $reviewModeConfig->value;
|
||||
if (is_string($rv)) {
|
||||
$rv = json_decode($rv, true);
|
||||
@@ -187,6 +187,21 @@ class Settings extends BaseController
|
||||
$config->value = array_merge($oldArr, $data);
|
||||
$config->save();
|
||||
|
||||
// 与旧版 review_mode 行同步,避免库内 enabled=true 与 system.maintenanceMode=false 并存
|
||||
if (array_key_exists('maintenanceMode', $data)) {
|
||||
$rmRow = SystemConfigModel::where('key', 'review_mode')->where('enterprise_id', 0)->find();
|
||||
if ($rmRow) {
|
||||
$rv = $rmRow->value;
|
||||
$rv = is_array($rv) ? $rv : (is_string($rv) ? (json_decode($rv, true) ?: []) : []);
|
||||
if (!is_array($rv)) {
|
||||
$rv = [];
|
||||
}
|
||||
$rv['enabled'] = !empty($data['maintenanceMode']);
|
||||
$rmRow->value = $rv;
|
||||
$rmRow->save();
|
||||
}
|
||||
}
|
||||
|
||||
// 更新站点信息
|
||||
$this->updateSiteInfo($data);
|
||||
|
||||
@@ -528,6 +543,18 @@ class Settings extends BaseController
|
||||
$config->value = $oldArr;
|
||||
$config->save();
|
||||
|
||||
$rmRow = SystemConfigModel::where('key', 'review_mode')->where('enterprise_id', 0)->find();
|
||||
if ($rmRow) {
|
||||
$rv = $rmRow->value;
|
||||
$rv = is_array($rv) ? $rv : (is_string($rv) ? (json_decode($rv, true) ?: []) : []);
|
||||
if (!is_array($rv)) {
|
||||
$rv = [];
|
||||
}
|
||||
$rv['enabled'] = (bool) $on;
|
||||
$rmRow->value = $rv;
|
||||
$rmRow->save();
|
||||
}
|
||||
|
||||
return success([
|
||||
'maintenanceMode' => (bool) $on,
|
||||
'enabled' => (bool) $on,
|
||||
|
||||
Reference in New Issue
Block a user