新增功能
This commit is contained in:
@@ -81,7 +81,7 @@ class FirstVisitConversionLogic
|
||||
'start_date' => $startDate,
|
||||
'end_date' => $endDate,
|
||||
'include_filters' => 1,
|
||||
'include_members' => 0,
|
||||
'include_members' => 1,
|
||||
'exclude_cancelled_appointments' => 1,
|
||||
'order_metric_mode' => 'performance',
|
||||
'page_no' => 1,
|
||||
@@ -109,14 +109,15 @@ class FirstVisitConversionLogic
|
||||
|
||||
$rowDeptIdSet = [];
|
||||
self::collectRowDeptIds($rows, $rowDeptIdSet);
|
||||
$openDirect = self::loadOpenCountByDept(
|
||||
$openCounts = self::loadOpenCounts(
|
||||
$startDate,
|
||||
$endDate,
|
||||
$effectiveAdminIds,
|
||||
array_fill_keys(array_keys($rowDeptIdSet), true),
|
||||
self::personalYejiMediaSources($selectedMediaChannelCode, $selectedMediaChannel)
|
||||
);
|
||||
self::applyOpenCounts($rows, $openDirect);
|
||||
$openDirect = $openCounts['dept'];
|
||||
self::applyOpenCounts($rows, $openDirect, $openCounts['admin']);
|
||||
|
||||
$summary = is_array($conversion['summary'] ?? null) ? $conversion['summary'] : [];
|
||||
$summary['total_open_count'] = array_sum($openDirect);
|
||||
@@ -170,6 +171,7 @@ class FirstVisitConversionLogic
|
||||
? '个人业绩录入'
|
||||
: '个人业绩录入(按渠道名称匹配)',
|
||||
'appointment_rule' => '按预约日期统计,归属优先挂号医助、再回退诊单医助;仅含已预约、已完成和已过号',
|
||||
'registration_rule' => '按支付时间统计已支付且实收金额大于 0、低于 10 元的订单,每笔计 1 个挂号并按订单创建人归属',
|
||||
'performance_rule' => '按业务订单创建时间和创建人统计,排除取消、拒收、退款及已发生退款的订单',
|
||||
],
|
||||
'filters' => [
|
||||
@@ -294,6 +296,10 @@ class FirstVisitConversionLogic
|
||||
if (!is_array($row)) {
|
||||
continue;
|
||||
}
|
||||
if (in_array((string) ($row['type'] ?? ''), ['member', 'unbound'], true)) {
|
||||
$out[] = $row;
|
||||
continue;
|
||||
}
|
||||
$children = self::filterDeptRows(is_array($row['children'] ?? null) ? $row['children'] : [], $allowedSet);
|
||||
$id = (int) ($row['id'] ?? 0);
|
||||
if (isset($allowedSet[$id])) {
|
||||
@@ -328,9 +334,9 @@ class FirstVisitConversionLogic
|
||||
* @param int[]|null $effectiveAdminIds
|
||||
* @param array<int,true> $rowDeptSet
|
||||
* @param string[]|null $mediaSources null=全部渠道;空数组=所选渠道没有可匹配的手工来源
|
||||
* @return array<int,int>
|
||||
* @return array{dept:array<int,int>,admin:array<int,int>}
|
||||
*/
|
||||
private static function loadOpenCountByDept(
|
||||
private static function loadOpenCounts(
|
||||
string $startDate,
|
||||
string $endDate,
|
||||
?array $effectiveAdminIds,
|
||||
@@ -339,7 +345,7 @@ class FirstVisitConversionLogic
|
||||
): array
|
||||
{
|
||||
if ($effectiveAdminIds === [] || $rowDeptSet === [] || $mediaSources === []) {
|
||||
return [];
|
||||
return ['dept' => [], 'admin' => []];
|
||||
}
|
||||
$query = PersonalYeji::whereBetween('yeji_date', [$startDate, $endDate]);
|
||||
if ($effectiveAdminIds !== null) {
|
||||
@@ -354,7 +360,7 @@ class FirstVisitConversionLogic
|
||||
->select()
|
||||
->toArray();
|
||||
if ($rows === []) {
|
||||
return [];
|
||||
return ['dept' => [], 'admin' => []];
|
||||
}
|
||||
|
||||
$creatorIds = self::normalizeIds(array_column($rows, 'creator_id'));
|
||||
@@ -415,6 +421,7 @@ class FirstVisitConversionLogic
|
||||
unset($deptIds);
|
||||
|
||||
$direct = [];
|
||||
$adminDirect = [];
|
||||
foreach ($rows as $row) {
|
||||
$adminId = (int) ($row['creator_id'] ?? 0);
|
||||
$targetDeptId = 0;
|
||||
@@ -428,24 +435,48 @@ class FirstVisitConversionLogic
|
||||
$targetDeptId = -2;
|
||||
}
|
||||
if ($targetDeptId !== 0) {
|
||||
$direct[$targetDeptId] = ($direct[$targetDeptId] ?? 0) + (int) ($row['open_count'] ?? 0);
|
||||
$openCount = (int) ($row['open_count'] ?? 0);
|
||||
$direct[$targetDeptId] = ($direct[$targetDeptId] ?? 0) + $openCount;
|
||||
$adminDirect[$adminId] = ($adminDirect[$adminId] ?? 0) + $openCount;
|
||||
}
|
||||
}
|
||||
|
||||
return $direct;
|
||||
return ['dept' => $direct, 'admin' => $adminDirect];
|
||||
}
|
||||
|
||||
/** @param array<int,array<string,mixed>> $rows @param array<int,int> $direct */
|
||||
private static function applyOpenCounts(array &$rows, array $direct): int
|
||||
/**
|
||||
* @param array<int,array<string,mixed>> $rows
|
||||
* @param array<int,int> $deptDirect
|
||||
* @param array<int,int> $adminDirect
|
||||
*/
|
||||
private static function applyOpenCounts(array &$rows, array $deptDirect, array $adminDirect): int
|
||||
{
|
||||
$sum = 0;
|
||||
foreach ($rows as &$row) {
|
||||
$rowType = (string) ($row['type'] ?? '');
|
||||
if (in_array($rowType, ['member', 'unbound'], true)) {
|
||||
$count = $rowType === 'member'
|
||||
? (int) ($adminDirect[(int) ($row['admin_id'] ?? 0)] ?? 0)
|
||||
: 0;
|
||||
$row['total_open_count'] = $count;
|
||||
$row['total_open_rate'] = self::percent($count, (int) ($row['add_fans_count'] ?? 0));
|
||||
$row['open_appointment_rate'] = self::percent(
|
||||
(int) ($row['paid_appointment_count'] ?? 0),
|
||||
$count
|
||||
);
|
||||
$row['open_receive_rate'] = self::percent(
|
||||
(int) ($row['completed_order_count'] ?? 0),
|
||||
$count
|
||||
);
|
||||
continue;
|
||||
}
|
||||
$children = is_array($row['children'] ?? null) ? $row['children'] : [];
|
||||
$childTotal = self::applyOpenCounts($children, $direct);
|
||||
$childTotal = self::applyOpenCounts($children, $deptDirect, $adminDirect);
|
||||
if ($children !== []) {
|
||||
$row['children'] = $children;
|
||||
}
|
||||
$count = (int) ($direct[(int) ($row['id'] ?? 0)] ?? 0) + $childTotal;
|
||||
$directCount = (int) ($deptDirect[(int) ($row['id'] ?? 0)] ?? 0);
|
||||
$count = $directCount + $childTotal;
|
||||
$row['total_open_count'] = $count;
|
||||
$row['total_open_rate'] = self::percent($count, (int) ($row['add_fans_count'] ?? 0));
|
||||
$row['open_appointment_rate'] = self::percent(
|
||||
@@ -453,7 +484,7 @@ class FirstVisitConversionLogic
|
||||
$count
|
||||
);
|
||||
$row['open_receive_rate'] = self::percent((int) ($row['completed_order_count'] ?? 0), $count);
|
||||
$sum += (int) ($direct[(int) ($row['id'] ?? 0)] ?? 0) + $childTotal;
|
||||
$sum += $directCount + $childTotal;
|
||||
}
|
||||
unset($row);
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ use think\facade\Db;
|
||||
/**
|
||||
* 一诊「医生看板」。
|
||||
*
|
||||
* 医生是最终展示维度;部门权限通过实际经手医助下推到挂号、诊单与业绩:
|
||||
* 医生是最终展示维度;部门权限通过实际经手医助下推到预约、诊单与业绩:
|
||||
* - 医生 SELF:只看本人医生数据,不限制经手医助;
|
||||
* - 医助 SELF:只看本人经手患者关联的医生数据;
|
||||
* - 组长/经理:只看数据范围内医助经手患者关联的医生数据;
|
||||
@@ -79,7 +79,15 @@ class FirstVisitDoctorDashboardLogic
|
||||
$doctorDeptNames,
|
||||
$doctorStatus
|
||||
);
|
||||
$summary = self::buildSummary($rows);
|
||||
// 支付单没有医生字段,当前数据中的低额支付单也未关联患者;挂号只能按创建人及权限范围汇总,
|
||||
// 不能为了医生排行而将医助创建的支付单虚构分摊给某位医生。
|
||||
$registrationCreatorIds = $doctorSelf ? [$adminId] : $assistantIds;
|
||||
$registrationTotal = self::loadRegistrationTotal(
|
||||
$range['start'],
|
||||
$range['end'],
|
||||
$registrationCreatorIds
|
||||
);
|
||||
$summary = self::buildSummary($rows, $registrationTotal);
|
||||
$trend = self::buildAmountTrend($doctorIds, $assistantIds);
|
||||
|
||||
$selectedDeptName = $selectedDeptId > 0
|
||||
@@ -108,7 +116,8 @@ class FirstVisitDoctorDashboardLogic
|
||||
'selected_dept_name' => $selectedDeptName,
|
||||
'selected_doctor_name' => $selectedDoctorName,
|
||||
'doctor_count' => count($rows),
|
||||
'appointment_rule' => '总挂号包含已预约、已取消、已完成和已过号;面诊取状态为已完成的挂号',
|
||||
'registration_rule' => '总挂号按支付时间统计已支付且实收金额大于 0、低于 10 元的订单,每笔计 1 个,并按订单创建人及当前权限范围归属',
|
||||
'appointment_rule' => '总预约包含已预约、已取消、已完成和已过号;面诊取状态为已完成的预约',
|
||||
'performance_rule' => '诊单按订单创建时间统计,排除已取消、拒收、全额退款及部分退款,金额归属处方开方医生',
|
||||
],
|
||||
'filters' => [
|
||||
@@ -122,7 +131,8 @@ class FirstVisitDoctorDashboardLogic
|
||||
'conversion' => self::ranking($rows, 'receive_conversion_rate', 8),
|
||||
],
|
||||
'funnel' => [
|
||||
['key' => 'appointment', 'label' => '挂号', 'value' => (int) $summary['appointment_total']],
|
||||
['key' => 'registration', 'label' => '挂号', 'value' => (int) $summary['registration_total']],
|
||||
['key' => 'appointment', 'label' => '预约', 'value' => (int) $summary['appointment_total']],
|
||||
['key' => 'interview', 'label' => '面诊', 'value' => (int) $summary['interview_count']],
|
||||
['key' => 'receive', 'label' => '接诊', 'value' => (int) $summary['order_count']],
|
||||
['key' => 'deal', 'label' => '成交', 'value' => (int) $summary['order_count']],
|
||||
@@ -327,7 +337,7 @@ class FirstVisitDoctorDashboardLogic
|
||||
}
|
||||
|
||||
/** @param array<int,array<string,mixed>> $rows @return array<string,mixed> */
|
||||
private static function buildSummary(array $rows): array
|
||||
private static function buildSummary(array $rows, int $registrationTotal): array
|
||||
{
|
||||
$appointmentTotal = 0;
|
||||
$interviewCount = 0;
|
||||
@@ -345,6 +355,7 @@ class FirstVisitDoctorDashboardLogic
|
||||
}
|
||||
|
||||
return [
|
||||
'registration_total' => $registrationTotal,
|
||||
'appointment_total' => $appointmentTotal,
|
||||
'interview_count' => $interviewCount,
|
||||
'order_count' => $orderCount,
|
||||
@@ -361,6 +372,40 @@ class FirstVisitDoctorDashboardLogic
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 新挂号口径:支付时间位于筛选区间、状态为已支付、0 < 实收金额 < 10 元。
|
||||
* null 表示全部创建人,空数组表示当前权限范围没有可统计创建人。
|
||||
*
|
||||
* @param int[]|null $creatorIds
|
||||
*/
|
||||
private static function loadRegistrationTotal(
|
||||
string $startDate,
|
||||
string $endDate,
|
||||
?array $creatorIds
|
||||
): int {
|
||||
if ($creatorIds === []) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
$query = Db::name('order')
|
||||
->whereNull('delete_time')
|
||||
->where('status', 2)
|
||||
->where('amount', '>', 0)
|
||||
->where('amount', '<', 10)
|
||||
->whereNotNull('payment_time')
|
||||
->where('payment_time', '<>', '')
|
||||
->whereBetweenTime(
|
||||
'payment_time',
|
||||
$startDate . ' 00:00:00',
|
||||
$endDate . ' 23:59:59'
|
||||
);
|
||||
if ($creatorIds !== null) {
|
||||
$query->whereIn('creator_id', $creatorIds);
|
||||
}
|
||||
|
||||
return (int) $query->count();
|
||||
}
|
||||
|
||||
/** @param array<int,array<string,mixed>> $rows @return array<int,array<string,mixed>> */
|
||||
private static function ranking(array $rows, string $field, int $limit): array
|
||||
{
|
||||
|
||||
@@ -14,7 +14,9 @@ use think\facade\Db;
|
||||
* 一诊「挂号统计」。
|
||||
*
|
||||
* 统计口径:
|
||||
* - 挂号:doctor_appointment.appointment_date,状态 1/3/4,排除已取消 2;
|
||||
* - 挂号:order.payment_time,已支付且 0 < amount < 10,每笔支付订单计 1 个;
|
||||
* 按支付订单 creator_id 归属员工。
|
||||
* - 预约:doctor_appointment.appointment_date,状态 1/3/4,排除已取消 2;
|
||||
* 归属优先挂号医助 assistant_id,再回退诊单医助 assistant_id。
|
||||
* - 诊单:tcm_prescription_order.create_time,归属订单 creator_id,排除履约 4/9/10。
|
||||
* - 所有部门和员工筛选都只能收窄 DataScope,不允许 HTTP 参数扩大当前账号范围。
|
||||
@@ -62,6 +64,11 @@ class FirstVisitRegistrationStatsLogic
|
||||
$range['day_after_tomorrow'],
|
||||
$assistantIds
|
||||
);
|
||||
$registrationDaily = self::loadRegistrationDaily(
|
||||
min($range['compare_start'], $range['start']),
|
||||
$range['end'],
|
||||
$assistantIds
|
||||
);
|
||||
$orderDaily = self::loadOrderDaily(
|
||||
min($range['compare_start'], $range['start']),
|
||||
$range['end'],
|
||||
@@ -73,6 +80,7 @@ class FirstVisitRegistrationStatsLogic
|
||||
$assistantIds,
|
||||
$assignment,
|
||||
$appointmentDaily,
|
||||
$registrationDaily,
|
||||
$orderDaily,
|
||||
$range
|
||||
);
|
||||
@@ -112,6 +120,7 @@ class FirstVisitRegistrationStatsLogic
|
||||
'selected_dept_name' => $selectedDeptName,
|
||||
'selected_assistant_name' => $selectedAssistantName,
|
||||
'member_count' => count($assistantIds),
|
||||
'registration_rule' => '支付时间在统计区间,状态为已支付且实收金额低于 10 元(大于 0 元),每笔支付订单计 1 个挂号',
|
||||
'appointment_rule' => '预约日期在统计区间,状态为已预约、已完成或已过号,排除已取消',
|
||||
'performance_rule' => '按订单创建时间和创建人统计,排除已取消、拒收和退款',
|
||||
],
|
||||
@@ -123,6 +132,7 @@ class FirstVisitRegistrationStatsLogic
|
||||
'employee_rows' => $groups,
|
||||
'rankings' => [
|
||||
'performance' => self::rankMembers($members, 'order_amount', 10),
|
||||
'registrations' => self::rankMembers($members, 'registration_count', 10),
|
||||
'appointments' => self::rankMembers($members, 'appointment_count', 10),
|
||||
],
|
||||
'departments' => self::departmentSummaryRows($groups),
|
||||
@@ -305,6 +315,39 @@ class FirstVisitRegistrationStatsLogic
|
||||
return $out;
|
||||
}
|
||||
|
||||
/** @param int[] $assistantIds @return array<int,array<string,array{count:int}>> */
|
||||
private static function loadRegistrationDaily(string $startDate, string $endDate, array $assistantIds): array
|
||||
{
|
||||
if ($assistantIds === []) {
|
||||
return [];
|
||||
}
|
||||
$rows = Db::name('order')->alias('o')
|
||||
->whereNull('o.delete_time')
|
||||
->where('o.status', 2)
|
||||
->where('o.amount', '>', 0)
|
||||
->where('o.amount', '<', 10)
|
||||
->whereBetweenTime(
|
||||
'o.payment_time',
|
||||
$startDate . ' 00:00:00',
|
||||
$endDate . ' 23:59:59'
|
||||
)
|
||||
->whereIn('o.creator_id', $assistantIds)
|
||||
->fieldRaw('o.creator_id AS assistant_id, DATE(o.payment_time) AS date_label, COUNT(*) AS item_count')
|
||||
->group(['o.creator_id', 'date_label'])
|
||||
->select()
|
||||
->toArray();
|
||||
$out = [];
|
||||
foreach ($rows as $row) {
|
||||
$aid = (int) ($row['assistant_id'] ?? 0);
|
||||
$date = (string) ($row['date_label'] ?? '');
|
||||
if ($aid > 0 && $date !== '') {
|
||||
$out[$aid][$date] = ['count' => (int) ($row['item_count'] ?? 0)];
|
||||
}
|
||||
}
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
/** @param int[] $assistantIds @return array<int,array<string,array{count:int,amount:float}>> */
|
||||
private static function loadOrderDaily(string $startDate, string $endDate, array $assistantIds): array
|
||||
{
|
||||
@@ -345,6 +388,7 @@ class FirstVisitRegistrationStatsLogic
|
||||
array $assistantIds,
|
||||
array $assignment,
|
||||
array $appointmentDaily,
|
||||
array $registrationDaily,
|
||||
array $orderDaily,
|
||||
array $range
|
||||
): array {
|
||||
@@ -356,6 +400,8 @@ class FirstVisitRegistrationStatsLogic
|
||||
foreach ($assistantIds as $aid) {
|
||||
$appointmentCount = self::sumDaily($appointmentDaily[$aid] ?? [], $range['start'], $range['end'], 'count');
|
||||
$compareAppointmentCount = self::sumDaily($appointmentDaily[$aid] ?? [], $range['compare_start'], $range['compare_end'], 'count');
|
||||
$registrationCount = self::sumDaily($registrationDaily[$aid] ?? [], $range['start'], $range['end'], 'count');
|
||||
$compareRegistrationCount = self::sumDaily($registrationDaily[$aid] ?? [], $range['compare_start'], $range['compare_end'], 'count');
|
||||
$orderCount = self::sumDaily($orderDaily[$aid] ?? [], $range['start'], $range['end'], 'count');
|
||||
$orderAmount = self::sumDaily($orderDaily[$aid] ?? [], $range['start'], $range['end'], 'amount');
|
||||
$rows[] = [
|
||||
@@ -364,6 +410,9 @@ class FirstVisitRegistrationStatsLogic
|
||||
'dept_id' => (int) ($assignment[$aid] ?? 0),
|
||||
'name' => (string) ($assistantIndex[$aid] ?? '未命名员工'),
|
||||
'row_type' => 'employee',
|
||||
'registration_count' => (int) $registrationCount,
|
||||
'compare_registration_count' => (int) $compareRegistrationCount,
|
||||
'registration_compare_rate' => self::relativeChange($registrationCount, $compareRegistrationCount),
|
||||
'appointment_count' => (int) $appointmentCount,
|
||||
'compare_appointment_count' => (int) $compareAppointmentCount,
|
||||
'appointment_compare_rate' => self::relativeChange($appointmentCount, $compareAppointmentCount),
|
||||
@@ -374,7 +423,7 @@ class FirstVisitRegistrationStatsLogic
|
||||
'status' => 'normal',
|
||||
];
|
||||
}
|
||||
usort($rows, static fn (array $a, array $b): int => ($b['appointment_count'] <=> $a['appointment_count']) ?: ($b['order_amount'] <=> $a['order_amount']));
|
||||
usort($rows, static fn (array $a, array $b): int => ($b['registration_count'] <=> $a['registration_count']) ?: ($b['appointment_count'] <=> $a['appointment_count']) ?: ($b['order_amount'] <=> $a['order_amount']));
|
||||
|
||||
return $rows;
|
||||
}
|
||||
@@ -393,6 +442,8 @@ class FirstVisitRegistrationStatsLogic
|
||||
'name' => $key > 0 ? (string) ($deptIndex[$key]['name'] ?? '未命名部门') : '未分配部门',
|
||||
'row_type' => 'department',
|
||||
'member_count' => 0,
|
||||
'registration_count' => 0,
|
||||
'compare_registration_count' => 0,
|
||||
'appointment_count' => 0,
|
||||
'compare_appointment_count' => 0,
|
||||
'tomorrow_count' => 0,
|
||||
@@ -405,13 +456,17 @@ class FirstVisitRegistrationStatsLogic
|
||||
}
|
||||
$groups[$key]['children'][] = $member;
|
||||
$groups[$key]['member_count']++;
|
||||
foreach (['appointment_count', 'compare_appointment_count', 'tomorrow_count', 'day_after_count', 'order_count'] as $field) {
|
||||
foreach (['registration_count', 'compare_registration_count', 'appointment_count', 'compare_appointment_count', 'tomorrow_count', 'day_after_count', 'order_count'] as $field) {
|
||||
$groups[$key][$field] += (int) ($member[$field] ?? 0);
|
||||
}
|
||||
$groups[$key]['order_amount'] += (float) ($member['order_amount'] ?? 0);
|
||||
}
|
||||
foreach ($groups as &$group) {
|
||||
$group['order_amount'] = round((float) $group['order_amount'], 2);
|
||||
$group['registration_compare_rate'] = self::relativeChange(
|
||||
(float) $group['registration_count'],
|
||||
(float) $group['compare_registration_count']
|
||||
);
|
||||
$group['appointment_compare_rate'] = self::relativeChange(
|
||||
(float) $group['appointment_count'],
|
||||
(float) $group['compare_appointment_count']
|
||||
@@ -432,11 +487,15 @@ class FirstVisitRegistrationStatsLogic
|
||||
/** @param array<int,array<string,mixed>> $members @return array<string,mixed> */
|
||||
private static function buildSummary(array $members, array $range): array
|
||||
{
|
||||
$registrationCount = 0;
|
||||
$compareRegistrationCount = 0;
|
||||
$appointmentCount = 0;
|
||||
$compareAppointmentCount = 0;
|
||||
$orderCount = 0;
|
||||
$orderAmount = 0.0;
|
||||
foreach ($members as $member) {
|
||||
$registrationCount += (int) ($member['registration_count'] ?? 0);
|
||||
$compareRegistrationCount += (int) ($member['compare_registration_count'] ?? 0);
|
||||
$appointmentCount += (int) ($member['appointment_count'] ?? 0);
|
||||
$compareAppointmentCount += (int) ($member['compare_appointment_count'] ?? 0);
|
||||
$orderCount += (int) ($member['order_count'] ?? 0);
|
||||
@@ -444,6 +503,9 @@ class FirstVisitRegistrationStatsLogic
|
||||
}
|
||||
|
||||
return [
|
||||
'registration_count' => $registrationCount,
|
||||
'registration_compare_count' => $compareRegistrationCount,
|
||||
'registration_compare_rate' => self::relativeChange($registrationCount, $compareRegistrationCount),
|
||||
'appointment_count' => $appointmentCount,
|
||||
'appointment_compare_count' => $compareAppointmentCount,
|
||||
'appointment_compare_rate' => self::relativeChange($appointmentCount, $compareAppointmentCount),
|
||||
@@ -460,13 +522,18 @@ class FirstVisitRegistrationStatsLogic
|
||||
usort($rows, static fn (array $a, array $b): int => (($b[$field] ?? 0) <=> ($a[$field] ?? 0)) ?: strcmp((string) $a['name'], (string) $b['name']));
|
||||
$out = [];
|
||||
foreach (array_slice($rows, 0, $limit) as $row) {
|
||||
$countField = match ($field) {
|
||||
'order_amount' => 'order_count',
|
||||
'registration_count' => 'registration_count',
|
||||
default => 'appointment_count',
|
||||
};
|
||||
$out[] = [
|
||||
'admin_id' => (int) ($row['admin_id'] ?? 0),
|
||||
'name' => (string) ($row['name'] ?? ''),
|
||||
'value' => $field === 'order_amount'
|
||||
? round((float) ($row[$field] ?? 0), 2)
|
||||
: (int) ($row[$field] ?? 0),
|
||||
'count' => $field === 'order_amount' ? (int) ($row['order_count'] ?? 0) : (int) ($row['appointment_count'] ?? 0),
|
||||
'count' => (int) ($row[$countField] ?? 0),
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user