更新
This commit is contained in:
@@ -40,6 +40,8 @@ class ConversionLogic
|
||||
): array
|
||||
{
|
||||
$includeFilters = (int)($params['include_filters'] ?? 0) === 1;
|
||||
// 仅供需要“有效挂号”口径的内部看板调用;默认保持转换统计历史口径不变。
|
||||
$excludeCancelledAppointments = (int)($params['exclude_cancelled_appointments'] ?? 0) === 1;
|
||||
$dimension = self::normalizeDimension((string)($params['dimension'] ?? 'dept'));
|
||||
$mediaChannelCode = MediaChannelService::normalizeStatsCode((string) ($params['media_channel_code'] ?? ''));
|
||||
$mediaChannel = $mediaChannelCode !== '' ? MediaChannelService::getChannelByCode($mediaChannelCode) : null;
|
||||
@@ -141,7 +143,19 @@ class ConversionLogic
|
||||
$trustedCostAllocationAdminIdsOverride
|
||||
);
|
||||
}
|
||||
self::hydrateAppointmentStats($entities, $dimension, $entityIds, $adminToDeptIds, $startTimestamp, $endTimestamp, $startDate, $endDate, $mediaChannel, $visibleAdminIds);
|
||||
self::hydrateAppointmentStats(
|
||||
$entities,
|
||||
$dimension,
|
||||
$entityIds,
|
||||
$adminToDeptIds,
|
||||
$startTimestamp,
|
||||
$endTimestamp,
|
||||
$startDate,
|
||||
$endDate,
|
||||
$mediaChannel,
|
||||
$visibleAdminIds,
|
||||
$excludeCancelledAppointments
|
||||
);
|
||||
self::hydrateOrderAndAmountStats($entities, $dimension, $entityIds, $adminToDeptIds, $startTimestamp, $endTimestamp, $mediaChannel, $visibleAdminIds);
|
||||
// 数据隔离:可见部门 = 可见 admin 所属部门并集;用于 account_cost 与下游 cost 分摊。
|
||||
$visibleDeptIds = self::resolveVisibleDeptIds($visibleAdminIds);
|
||||
@@ -913,7 +927,8 @@ class ConversionLogic
|
||||
string $startDate,
|
||||
string $endDate,
|
||||
?array $mediaChannel,
|
||||
?array $visibleAdminIds = null
|
||||
?array $visibleAdminIds = null,
|
||||
bool $excludeCancelledAppointments = false
|
||||
): void {
|
||||
$sourceExpr = $dimension === 'doctor' ? 'a.doctor_id' : 'u.assistant_id';
|
||||
$query = Db::name('doctor_appointment')
|
||||
@@ -924,6 +939,10 @@ class ConversionLogic
|
||||
->fieldRaw("{$sourceExpr} AS source_admin_id, a.patient_id AS diagnosis_id, COUNT(*) AS appointment_count, SUM(CASE WHEN a.status = 3 THEN 1 ELSE 0 END) AS interview_count")
|
||||
->group("{$sourceExpr}, a.patient_id");
|
||||
|
||||
if ($excludeCancelledAppointments) {
|
||||
$query->where('a.status', '<>', 2);
|
||||
}
|
||||
|
||||
$query->where(static function (Query $subQuery): void {
|
||||
$subQuery->whereNull('u.id')
|
||||
->whereOr(static function (Query $orQuery): void {
|
||||
|
||||
@@ -294,7 +294,11 @@ class PerformanceDashboardLogic
|
||||
$items[] = [
|
||||
'id' => (int) ($row['admin_id'] ?? 0),
|
||||
'name' => (string) ($row['doctor_name'] ?? ''),
|
||||
'count' => (int) ($row['appointment_total'] ?? 0),
|
||||
// DoctorDailyStats 的 total 含已取消;驾驶舱实时排行只统计有效挂号。
|
||||
'count' => max(
|
||||
0,
|
||||
(int) ($row['appointment_total'] ?? 0) - (int) ($row['appointment_cancelled'] ?? 0)
|
||||
),
|
||||
'amount' => round((float) ($row['deal_amount'] ?? 0), 2),
|
||||
];
|
||||
}
|
||||
@@ -324,6 +328,7 @@ class PerformanceDashboardLogic
|
||||
'dimension' => 'assistant',
|
||||
'time_type' => 'today',
|
||||
'include_filters' => 0,
|
||||
'exclude_cancelled_appointments' => 1,
|
||||
'page_no' => 1,
|
||||
'page_size' => $rankingVisibleAdminIds !== null ? max(1, count($rankingVisibleAdminIds)) : 100,
|
||||
], $adminId, $adminInfo, $rankingVisibleAdminIds);
|
||||
|
||||
Reference in New Issue
Block a user