feat: 小程序与管理端迭代(神仙AI、了解自己CRM、AI测试入口、报表与分润等)

Made-with: Cursor
This commit is contained in:
卡若
2026-04-17 19:46:48 +08:00
parent cf835ea585
commit 7108f28280
239 changed files with 21061 additions and 2175 deletions

View File

@@ -0,0 +1,79 @@
<?php
namespace app\controller\superadmin;
use app\BaseController;
use think\facade\Db;
use think\facade\Request;
class ProfitRule extends BaseController
{
public function index()
{
$this->ensureSuperadmin();
$list = Db::name('profit_sharing_rules')->order('id', 'asc')->select()->toArray();
foreach ($list as &$row) {
$row['receivers'] = json_decode($row['receivers'] ?? '[]', true) ?: [];
}
unset($row);
return success(['list' => $list]);
}
public function save()
{
$this->ensureSuperadmin();
$id = (int) Request::param('id', 0);
$productType = trim((string) Request::param('productType', ''));
$name = trim((string) Request::param('name', ''));
$receivers = Request::param('receivers/a', []);
$status = Request::param('status', 'active');
if ($productType === '' || $name === '') return error('productType / name 必填');
if (!is_array($receivers) || count($receivers) === 0) return error('至少一个收款人');
// 校验比例合计 = 1
$sum = 0.0;
foreach ($receivers as $r) { $sum += (float) ($r['ratio'] ?? 0); }
if (abs($sum - 1.0) > 0.005) {
return error('分账比例合计必须等于 100%(当前 ' . round($sum * 100, 2) . '%');
}
$now = time();
$data = [
'productType' => $productType,
'name' => $name,
'receivers' => json_encode($receivers, JSON_UNESCAPED_UNICODE),
'status' => $status === 'disabled' ? 'disabled' : 'active',
'updatedAt' => $now,
];
if ($id > 0) {
Db::name('profit_sharing_rules')->where('id', $id)->update($data);
} else {
$dup = Db::name('profit_sharing_rules')->where('productType', $productType)->find();
if ($dup) return error('该产品类型已存在规则,请编辑现有规则');
$data['createdAt'] = $now;
Db::name('profit_sharing_rules')->insert($data);
}
return success(null, '已保存');
}
public function toggle($id)
{
$this->ensureSuperadmin();
$row = Db::name('profit_sharing_rules')->where('id', (int) $id)->find();
if (!$row) return error('规则不存在');
$next = $row['status'] === 'active' ? 'disabled' : 'active';
Db::name('profit_sharing_rules')->where('id', (int) $id)->update([
'status' => $next,
'updatedAt' => time(),
]);
return success(['status' => $next]);
}
private function ensureSuperadmin()
{
$user = $this->request->user ?? null;
if (!$user || ($user['role'] ?? '') !== 'superadmin') {
abort(403, '无权限访问');
}
}
}