;rgb:0000/0000/0000

gengx
This commit is contained in:
gr
2026-09-24 11:03:44 +08:00
parent bd22e5f476
commit 68fc86a167
10 changed files with 1257 additions and 34 deletions
+4 -1
View File
@@ -19,6 +19,9 @@
| `guard` | 详情类必填:`'builtin'`(接口自身已做逐条权限校验,需在注释写明函数)、`['callable' => [类::class, '方法'], 'args' => ['id', 'admin_id', 'admin_info']]`(调用已有校验函数,返回 true 放行)、`['via' => '列表资源标识', 'filter' => '参数名', 'match' => 'id']`(用列表的数据范围判断) |
| `handler` | 控制器里夹带写操作时改为直接调 Logic:`['logic' => [类::class, '方法'], 'args' => ['params', 'admin_id', 'admin_info'], 'validate' => [验证器::class, '场景'], 'error' => [类::class, 'getError']]` |
| `http` | 只读但必须 POST 的接口填 `'POST'` |
| `perm` | 权限点与资源标识不同时填写(如子接口复用页面权限) |
| `perm_fallback` | 自身权限点在部分环境未登记时的替代权限点(按顺序取第一个已登记的),如 `['stats.yejiStats/tabLeaderboard', 'fans/yeji']`;自身已登记时不生效 |
| `timeout` | 单条 SQL 超时秒数(默认 10,最大 60),只给后台本身就放宽了执行时间的重型统计 |
## 开放门槛(全部满足才可 `open`)
@@ -29,4 +32,4 @@
5. 不返回凭据(各类密钥、令牌、证书),配置类接口一律 `excluded`;
6. 去掉会扩大范围的参数(`forbid`),分页由 MCP 统一控制。
运行时还会检查权限点是否已在菜单登记;未登记的资源即使写了 `open` 也按“待整改”处理。
运行时还会检查权限点是否已在菜单登记;未登记(且 `perm_fallback` 里也没有已登记的替代项)的资源即使写了 `open` 也按“待整改”处理。
+17
View File
@@ -14,6 +14,10 @@
* firstvisit.wecomPromotion/customerStatistics → AuthMiddleware 获客助手整组绑定 + QywxPromotionOperatorAccess::PAGE_PERMISSION
* stats.selfInput/mediaSourceOptions → AuthMiddleware::matchPermissionAlias(复用自录转化统计/账户消耗列表权限)
* - 末尾几条是扫描误判为 write 的 GET 接口(confirm/sync/upload 等前缀),给出准确结论。
* - perm_fallback:业绩看板(fans/yeji)的子接口在部分环境没有单独登记权限点(线上曾出现 deptOptions “未在菜单登记”)。
* 子接口自身已登记时仍按自身判断(与后台一致);未登记时依次改用 Tab 权限(tabLeaderboard/tabDoctor/tabZyyt…)
* 或页面权限 fans/yeji ——后台对未登记接口不校验、只靠这些权限控制页面可见,这样不会比后台页面更宽。
* - timeout:业绩看板、医生统计、提成结算、综合转化是多张大表的聚合(后台控制器自己放宽到 120 秒),单条 SQL 超时放宽到 30 秒。
*/
$dateRange = [
@@ -75,6 +79,7 @@ return [
],
'stats.commissionSettlement/overview' => [
'timeout' => 30,
'status' => 'open', 'kind' => 'report', 'name' => '提成结算业绩汇总',
'note' => 'settlement_month 必填。默认订单池=结算月的上一个自然月创建、履约已完成(默认 fulfillment_status=3)、默认仅系统代开处方的业务订单;签收时间与尾款支付时间均不晚于结算月 7 日 23:59:59 计入“本期提成”,否则“顺延下期”;上期确定业绩时顺延的订单并入本期。传 start_time+end_time 时订单池改为与处方订单列表一致的创建时间段(默认含手动开方)。业绩归属订单创建人,只统计当前账号数据范围内可见医助;签收时间仅用库内物流数据推导,不实时查快递。返回部门/医助/医生三个维度及确认状态 confirm(confirm 按“结算月+渠道+部门筛选”共享,其中 totals_json 是确定人确定时的合计快照,不随查看人的数据范围变化,与后台一致)。',
'params_allow' => [
@@ -89,6 +94,7 @@ return [
],
'stats.conversion/overview' => [
'timeout' => 30,
'status' => 'open', 'kind' => 'report', 'name' => '综合转化统计',
'note' => '按当前账号数据范围(可见员工)统计加粉、预约、面诊、成交单数与金额、投放成本(按加粉占比分摊)及各转化率;dimension=dept 返回部门树(include_members=1 时含成员行),assistant/doctor 返回按人统计。time_type:week=最近7天、month=最近30天。结果 lists 为当前页,summary/charts 为汇总。',
'params_allow' => [
@@ -107,6 +113,7 @@ return [
],
'stats.doctorDailyStats/overview' => [
'perm_fallback' => ['stats.yejiStats/tabDoctor', 'fans/yeji'], 'timeout' => 30,
'status' => 'open', 'kind' => 'report', 'name' => '医生日统计',
'note' => '按医生汇总:系统/手动开方数(处方日期)、成交业务订单数与金额(订单创建时间,剔除已取消/拒收/退款)、挂号总数/已完成/过号/取消与挂号率(=成交单数÷总挂号,按预约日期)。医生列表按当前账号数据范围收窄;传 dept_ids 时只统计该部门医助经手的数据并隐藏全 0 医生。未传日期默认今天。',
'params_allow' => $dateRange + $yejiFilter + [
@@ -223,6 +230,7 @@ return [
],
'stats.yejiStats/appointmentLines' => [
'perm_fallback' => ['stats.yejiStats/overview', 'fans/yeji'],
'status' => 'open', 'kind' => 'report', 'name' => '业绩看板 · 预约挂号明细',
'note' => '与业绩看板/医助排行榜“预约诊单”同口径的逐条挂号:预约日期在区间内,状态为已预约/已完成/已过号(不含已取消)。传 assistant_id 看某医助,或传 dept_id 看某部门行(二选一)。' . $yejiScopeNote,
'params_allow' => $dateRange + $yejiFilter + [
@@ -234,6 +242,7 @@ return [
],
'stats.yejiStats/assignLines' => [
'perm_fallback' => ['stats.yejiStats/overview', 'fans/yeji'],
'status' => 'open', 'kind' => 'report', 'name' => '业绩看板 · 被指派明细',
'note' => '与业绩看板“被指派数”同口径:区间内非继承的成功指派,按指派操作时间落区间,医助×诊单去重,剔除已删诊单。传 assistant_id 或 dept_id(二选一)。' . $yejiScopeNote,
'params_allow' => $dateRange + $yejiFilter + [
@@ -245,18 +254,21 @@ return [
],
'stats.yejiStats/channelOptions' => [
'perm_fallback' => ['stats.yejiStats/overview', 'fans/yeji'],
'status' => 'open', 'kind' => 'report', 'name' => '业绩看板 · 渠道选项',
'note' => '启用中的投放渠道(企微标签渠道),按来源分组,附带打了该标签的客户数;供 channel_code 参数取值。',
'params_allow' => [],
],
'stats.yejiStats/deptOptions' => [
'perm_fallback' => ['stats.yejiStats/overview', 'fans/yeji'],
'status' => 'open', 'kind' => 'report', 'name' => '业绩看板 · 部门选项',
'note' => '按当前账号数据范围收窄的部门列表(id、name、pid、完整路径),供 dept_ids 参数取值。',
'params_allow' => [],
],
'stats.yejiStats/leadLines' => [
'perm_fallback' => ['stats.yejiStats/overview', 'fans/yeji'],
'status' => 'open', 'kind' => 'report', 'name' => '业绩看板 · 进线明细',
'note' => '与业绩看板“进线数据”同口径:企业微信添加客户事件(add_external_contact)逐条,按接待员工归属部门行;选渠道时只含带该标签的客户。dept_id 必填(看板部门行)。' . $yejiScopeNote,
'params_allow' => $dateRange + $yejiFilter + [
@@ -267,24 +279,28 @@ return [
],
'stats.yejiStats/leaderboard' => [
'perm_fallback' => ['stats.yejiStats/tabLeaderboard', 'fans/yeji'], 'timeout' => 30,
'status' => 'open', 'kind' => 'report', 'name' => '业绩看板 · 医助排行榜',
'note' => '按展示部门分表的医助排行:诊金=订单创建人为该医助的业务订单金额(剔除取消/拒收/退款),另有进线、被指派、接诊、成交单、预约诊单、接诊率(元/进线);二中心医助附复诊分项。结果 range_note 有完整口径。' . $yejiScopeNote,
'params_allow' => $dateRange + $yejiFilter,
],
'stats.yejiStats/multi' => [
'perm_fallback' => ['stats.yejiStats/tabZyyt', 'stats.yejiStats/tabTargetMatrix', 'fans/yeji'], 'timeout' => 30,
'status' => 'open', 'kind' => 'report', 'name' => '业绩看板 · 多区间',
'note' => '一次返回本月(1 日至今天)、本周(周一至今天)、今日、昨日四个区间的业绩看板,每个区间与 stats.yejiStats/overview 相同;不支持自定义区间(请用 overview)。' . $yejiScopeNote,
'params_allow' => $yejiFilter,
],
'stats.yejiStats/overview' => [
'perm_fallback' => ['stats.yejiStats/tabZyyt', 'fans/yeji'], 'timeout' => 30,
'status' => 'open', 'kind' => 'report', 'name' => '业绩看板',
'note' => '部门×日期区间:进线=企微添加客户事件(按接待员工部门);被指派数=区间内非继承指派(医助×诊单去重);已完成挂号按预约日期;接诊诊单/成交单数=计入业绩的业务订单条数;合计业绩=业务订单金额,按订单创建时间、剔除已取消(4)/拒收(9)/退款(10),按订单创建人部门归属;投放成本按进线占比分摊,ROI=业绩÷投放成本;复诊只统计二中心。受数据范围限制的账号不显示“未归属中心”行,底栏合计=表内各行之和。结果 channel_filter_note 有完整口径。',
'params_allow' => $dateRange + $yejiFilter,
],
'stats.yejiStats/revisitBreakdown' => [
'perm_fallback' => ['stats.yejiStats/overview', 'fans/yeji'],
'status' => 'open', 'kind' => 'report', 'name' => '业绩看板 · 二中心复诊拆解',
'note' => '二中心部门行的复诊业务订单按医助拆解(订单创建人归属);与看板“复诊”列同口径。' . $yejiScopeNote,
'params_allow' => $dateRange + $yejiFilter + [
@@ -294,6 +310,7 @@ return [
],
'stats.yejiStats/unassignedBreakdown' => [
'perm_fallback' => ['stats.yejiStats/overview', 'fans/yeji'],
'status' => 'open', 'kind' => 'report', 'name' => '业绩看板 · 未归属中心拆解',
'note' => '业绩看板“未归属中心”补差按订单创建人拆解(创建人部门无法映射到任何展示中心);受限账号只列可见医助,但 admin_id=0 行(无创建人/无诊单的全站金额)与后台页面一致会显示。',
'params_allow' => $dateRange + [