# Kylin Report

Kylin 版号申报材料生成包 — 防沉迷系统说明书、检测报告、测试账号清单、敏感词库导出。

## 功能特性

- **防沉迷系统说明书**：自动生成 Markdown 格式说明书（`generateSystemManual()`）
- **检测报告**：12 项检查清单（`generateTestReport()`）
- **测试账号管理**：4 个年龄段测试账号（`getTestAccounts()`）
- **数据脱敏**：身份证号脱敏展示（`810000201801****1234`）
- **数据加密**：报表数据 `encrypted` cast 加密存储
- **审计日志**：申报材料生成记录审计日志
- **权限控制**：API 路由需 `auth:sanctum` 鉴权

## 安装

```bash
composer require kylin/report
```

## 配置发布

```bash
php artisan vendor:publish --tag=kylin-report-config
```

## 使用示例

### Facade

```php
use Kylin\Report\Facades\KylinReport;

// 生成防沉迷系统说明书（Markdown）
$markdown = KylinReport::generateSystemManual($gameId);

// 生成检测报告（含 12 项检查清单）
$report = KylinReport::generateTestReport($gameId);

// 获取测试账号清单（4 个年龄段）
$accounts = app(\Kylin\Report\Services\TestAccountService::class)->getTestAccounts($gameId);
```

### 服务注入

```php
use Kylin\Report\Services\ApprovalMaterialService;
use Kylin\Report\Services\TestAccountService;

public function __construct(
    private readonly ApprovalMaterialService $approvalService,
    private readonly TestAccountService $testAccountService,
) {}

public function generate(int $gameId): array
{
    $manual = $this->approvalService->generateSystemManual($gameId);
    $report = $this->approvalService->generateTestReport($gameId);
    $accounts = $this->testAccountService->getTestAccounts($gameId);

    return compact('manual', 'report', 'accounts');
}
```

### API 路由

所有路由需通过 `auth:sanctum` 鉴权。

| 方法 | 路径 | 说明 |
|------|------|------|
| POST | /api/kylin/report/system-manual | 生成防沉迷系统说明书 |
| POST | /api/kylin/report/test-report | 生成检测报告 |
| GET | /api/kylin/report/test-accounts | 获取测试账号清单 |

## 检测报告检查清单

| 检查项 | 状态 | 说明 |
|------|------|------|
| 实名认证接入 NPPA | pass | 已接入国家新闻出版署防沉迷实名验证系统 |
| 未成年人时段限制 | pass | 仅周五/六/日及法定节假日 20:00-21:00 |
| 未成年人消费限额 | pass | 8-16 岁单次≤50/月≤200；16-18 岁单次≤100/月≤400 |
| 强制下线机制 | pass | 时段结束自动强制下线 |
| 人脸识别验证 | pass | 登录/消费/异常行为触发 |
| 监护人系统 | pass | 支持监护人绑定、查看记录、设置限制 |
| 举报渠道 | pass | 游戏内举报+服务专线+12315 |
| 敏感词过滤 | pass | 6 大类词库+抗绕过检测 |
| CADPA 适龄提示 | pass | 登录时显示适龄提示 |
| 健康游戏忠告 | pass | 登录时显示健康游戏忠告 |
| 数据加密存储 | pass | 身份证号字段级加密+HTTPS 传输 |
| API 签名验证 | pass | HMAC-SHA256 签名验证 |

## 测试账号

按版署审核要求，每个年龄段至少提供 1 个测试账号：

| 年龄段 | 标签 | 测试账号 |
|--------|------|----------|
| 0 | 未满 8 周岁 | 测试幼儿 |
| 1 | 8 周岁以上未满 16 周岁 | 测试少年A |
| 2 | 16 周岁以上未满 18 周岁 | 测试少年B |
| 3 | 已满 18 周岁 | 测试成年 |

## 数据库表

| 表名 | 说明 |
|------|------|
| `kylin_reports` | 报表表（filters/data 加密存储） |
| `kylin_report_exports` | 报表导出记录表 |
| `kr_test_accounts` | 测试账号表（含身份证号脱敏字段） |

## 审计事件

| 事件 | 说明 |
|------|------|
| `system_manual_generated` | 防沉迷系统说明书生成 |
| `test_report_generated` | 检测报告生成 |

## 合规要点

| 合规项 | 实现方式 | 法律依据 |
|------|------|------|
| 防沉迷系统说明书 | `generateSystemManual()` | 国新出发〔2019〕34号 |
| 检测报告 | `generateTestReport()` 12 项检查 | 《网络游戏管理暂行办法》第十六条 |
| 测试账号管理 | 4 个年龄段测试账号 | 版署审核要求 |
| 身份证号脱敏 | `id_card_masked` 字段 | 《个人信息保护法》第二十八条 |
| 报表数据加密 | `encrypted` cast | 《网络安全法》第二十一条 |
| 审计日志 | `audit()` 方法 | 等保 2.0 8.1.4.6 |
| 权限控制 | `auth:sanctum` 中间件 | 等保 2.0 8.1.4.1 |

## 法律合规

详见 [LEGAL.md](./LEGAL.md)，涵盖：
- 《关于防止未成年人沉迷网络游戏的通知》(国新出发〔2019〕34号)
- 《网络游戏管理暂行办法》(文化部令第49号)
- 《中华人民共和国数据安全法》(2021.9.1)
- 《中华人民共和国网络安全法》(2017.6.1)
- 《中华人民共和国个人信息保护法》(2021.11.1)
- 《中华人民共和国统计法》(2010.1.1)
- 等保 2.0 (GB/T 22239-2019)

## 依赖

- PHP ^8.5
- Laravel ^13.0
- kylin/core
- phpoffice/phpspreadsheet ^4.0
- 建议：kylin/audit-log（审计日志）、kylin/rbac（权限控制）

## 许可证

私有软件，未经授权禁止使用。
