新增功能
This commit is contained in:
@@ -156,7 +156,8 @@ class ConversionLogic
|
||||
$endDate,
|
||||
$mediaChannel,
|
||||
$visibleAdminIds,
|
||||
$excludeCancelledAppointments
|
||||
$excludeCancelledAppointments,
|
||||
$usePerformanceOrderMetrics
|
||||
);
|
||||
self::hydrateOrderAndAmountStats(
|
||||
$entities,
|
||||
@@ -251,7 +252,9 @@ class ConversionLogic
|
||||
$adminToDeptIds,
|
||||
$validDeptIds,
|
||||
$globalAccountCost,
|
||||
$visibleAdminIds
|
||||
$visibleAdminIds,
|
||||
$excludeCancelledAppointments,
|
||||
$usePerformanceOrderMetrics
|
||||
);
|
||||
$pagedRows = self::attachDeptMembers($pagedRows, $memberRowsByDeptId);
|
||||
}
|
||||
@@ -983,7 +986,8 @@ class ConversionLogic
|
||||
string $endDate,
|
||||
?array $mediaChannel,
|
||||
?array $visibleAdminIds = null,
|
||||
bool $excludeCancelledAppointments = false
|
||||
bool $excludeCancelledAppointments = false,
|
||||
bool $useRegistrationMetric = false
|
||||
): void {
|
||||
$sourceExpr = $dimension === 'doctor'
|
||||
? 'a.doctor_id'
|
||||
@@ -1040,7 +1044,17 @@ class ConversionLogic
|
||||
}
|
||||
}
|
||||
|
||||
self::hydratePaidAppointmentStats($entities, $dimension, $entityIds, $adminToDeptIds, $startTimestamp, $endTimestamp, $mediaChannel, $visibleAdminIds);
|
||||
self::hydratePaidAppointmentStats(
|
||||
$entities,
|
||||
$dimension,
|
||||
$entityIds,
|
||||
$adminToDeptIds,
|
||||
$startTimestamp,
|
||||
$endTimestamp,
|
||||
$mediaChannel,
|
||||
$visibleAdminIds,
|
||||
$useRegistrationMetric
|
||||
);
|
||||
|
||||
foreach ($entities as &$entity) {
|
||||
$appointmentTotalCount = (int)($entity['appointment_total_count'] ?? 0);
|
||||
@@ -1065,7 +1079,8 @@ class ConversionLogic
|
||||
int $startTimestamp,
|
||||
int $endTimestamp,
|
||||
?array $mediaChannel,
|
||||
?array $visibleAdminIds = null
|
||||
?array $visibleAdminIds = null,
|
||||
bool $useRegistrationMetric = false
|
||||
): void {
|
||||
$startDateTime = date('Y-m-d H:i:s', $startTimestamp);
|
||||
$endDateTime = date('Y-m-d H:i:s', $endTimestamp);
|
||||
@@ -1073,14 +1088,20 @@ class ConversionLogic
|
||||
->alias('o')
|
||||
->whereNull('o.delete_time')
|
||||
->where('o.status', 2)
|
||||
->where('o.order_type', 1)
|
||||
->where('o.amount', 5)
|
||||
->whereNotNull('o.payment_time')
|
||||
->where('o.payment_time', '<>', '')
|
||||
->whereBetweenTime('o.payment_time', $startDateTime, $endDateTime)
|
||||
->fieldRaw('o.creator_id AS source_admin_id, COUNT(*) AS paid_appointment_count')
|
||||
->group('o.creator_id');
|
||||
|
||||
if ($useRegistrationMetric) {
|
||||
// 一诊页面的新“挂号”:已支付且 0 < 实收金额 < 10 元,每笔支付订单计 1 个。
|
||||
$query->where('o.amount', '>', 0)->where('o.amount', '<', 10);
|
||||
} else {
|
||||
// 保留旧统计页面的历史“付费挂号”字段,避免本次一诊改造改变其它模块口径。
|
||||
$query->where('o.order_type', 1)->where('o.amount', 5);
|
||||
}
|
||||
|
||||
if ($mediaChannel !== null) {
|
||||
$query->leftJoin('qywx_external_contact q', 'q.external_userid = o.payer_external_userid');
|
||||
MediaChannelService::applyFollowUsersChannelFilter($query, 'q.follow_users', $mediaChannel);
|
||||
@@ -1683,6 +1704,8 @@ class ConversionLogic
|
||||
* @param float $globalAccountCost 由调用方提前计算好的本期总账户消耗(zyt_account_cost SUM)。
|
||||
* -1 表示让本函数自行 hydrate;>= 0 时直接复用,避免重复 SQL。
|
||||
* @param int[]|null $visibleAdminIds 可见 admin 集合(null = SCOPE_ALL);用于成员明细的隔离
|
||||
* @param bool $excludeCancelledAppointments 是否排除已取消挂号,须与部门汇总口径一致
|
||||
* @param bool $usePerformanceOrderMetrics 是否使用有效业绩订单口径,须与部门汇总口径一致
|
||||
* @return array<int, array<int, array<string, mixed>>> dept_id => [member_row, ...]
|
||||
*/
|
||||
private static function buildMemberRowsByDept(
|
||||
@@ -1697,7 +1720,9 @@ class ConversionLogic
|
||||
array $adminToDeptIds,
|
||||
array $validDeptIds = [],
|
||||
float $globalAccountCost = -1.0,
|
||||
?array $visibleAdminIds = null
|
||||
?array $visibleAdminIds = null,
|
||||
bool $excludeCancelledAppointments = false,
|
||||
bool $usePerformanceOrderMetrics = false
|
||||
): array
|
||||
{
|
||||
$assistantEntities = self::loadAdminEntities(2, 0, $visibleAdminIds);
|
||||
@@ -1706,15 +1731,15 @@ class ConversionLogic
|
||||
$assistantIds = array_keys($assistantEntities);
|
||||
$doctorIds = array_keys($doctorEntities);
|
||||
|
||||
if ($assistantIds !== []) {
|
||||
if ($assistantIds !== [] && !$usePerformanceOrderMetrics) {
|
||||
self::hydrateFanStats($assistantEntities, 'assistant', $assistantIds, $adminToDeptIds, $startTimestamp, $endTimestamp, $mediaChannel, $visibleAdminIds);
|
||||
self::hydrateAppointmentStats($assistantEntities, 'assistant', $assistantIds, $adminToDeptIds, $startTimestamp, $endTimestamp, $startDate, $endDate, $mediaChannel, $visibleAdminIds);
|
||||
self::hydrateOrderAndAmountStats($assistantEntities, 'assistant', $assistantIds, $adminToDeptIds, $startTimestamp, $endTimestamp, $mediaChannel, $visibleAdminIds);
|
||||
self::hydrateAppointmentStats($assistantEntities, 'assistant', $assistantIds, $adminToDeptIds, $startTimestamp, $endTimestamp, $startDate, $endDate, $mediaChannel, $visibleAdminIds, $excludeCancelledAppointments);
|
||||
self::hydrateOrderAndAmountStats($assistantEntities, 'assistant', $assistantIds, $adminToDeptIds, $startTimestamp, $endTimestamp, $mediaChannel, $visibleAdminIds, $usePerformanceOrderMetrics);
|
||||
}
|
||||
if ($doctorIds !== []) {
|
||||
if ($doctorIds !== [] && !$usePerformanceOrderMetrics) {
|
||||
self::hydrateFanStats($doctorEntities, 'doctor', $doctorIds, $adminToDeptIds, $startTimestamp, $endTimestamp, $mediaChannel, $visibleAdminIds);
|
||||
self::hydrateAppointmentStats($doctorEntities, 'doctor', $doctorIds, $adminToDeptIds, $startTimestamp, $endTimestamp, $startDate, $endDate, $mediaChannel, $visibleAdminIds);
|
||||
self::hydrateOrderAndAmountStats($doctorEntities, 'doctor', $doctorIds, $adminToDeptIds, $startTimestamp, $endTimestamp, $mediaChannel, $visibleAdminIds);
|
||||
self::hydrateAppointmentStats($doctorEntities, 'doctor', $doctorIds, $adminToDeptIds, $startTimestamp, $endTimestamp, $startDate, $endDate, $mediaChannel, $visibleAdminIds, $excludeCancelledAppointments);
|
||||
self::hydrateOrderAndAmountStats($doctorEntities, 'doctor', $doctorIds, $adminToDeptIds, $startTimestamp, $endTimestamp, $mediaChannel, $visibleAdminIds, $usePerformanceOrderMetrics);
|
||||
}
|
||||
|
||||
// 复用调用方传入的 global account cost;只有兜底未传时才回查一次(保留向后兼容)。
|
||||
@@ -1749,6 +1774,15 @@ class ConversionLogic
|
||||
}
|
||||
}
|
||||
|
||||
if ($usePerformanceOrderMetrics && $combined !== []) {
|
||||
// 一诊综合转化的部门指标均按业务归属人统计。成员明细也必须沿用同一归属,
|
||||
// 不能再分别按“医助/医生”统计后相加,否则双角色员工会重复、人员合计也无法与部门汇总对齐。
|
||||
$combinedIds = array_keys($combined);
|
||||
self::hydrateFanStats($combined, 'assistant', $combinedIds, $adminToDeptIds, $startTimestamp, $endTimestamp, $mediaChannel, $visibleAdminIds);
|
||||
self::hydrateAppointmentStats($combined, 'assistant', $combinedIds, $adminToDeptIds, $startTimestamp, $endTimestamp, $startDate, $endDate, $mediaChannel, $visibleAdminIds, $excludeCancelledAppointments, true);
|
||||
self::hydrateOrderAndAmountStats($combined, 'assistant', $combinedIds, $adminToDeptIds, $startTimestamp, $endTimestamp, $mediaChannel, $visibleAdminIds, true);
|
||||
}
|
||||
|
||||
if ($combined === []) {
|
||||
return [];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user