|
@@ -2,6 +2,7 @@
|
|
|
|
|
|
namespace App\Services\Coach;
|
|
|
|
|
|
+use App\Models\Order;
|
|
|
use App\Models\ShopInfo;
|
|
|
use App\Models\CoachUser;
|
|
|
use App\Enums\OrderStatus;
|
|
@@ -13,6 +14,7 @@ use App\Models\CoachSchedule;
|
|
|
use App\Models\CoachStatistic;
|
|
|
use App\Enums\TechnicianStatus;
|
|
|
use App\Models\CoachInfoRecord;
|
|
|
+use App\Models\OrderGrabRecord;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
use App\Enums\TechnicianAuthStatus;
|
|
|
use App\Enums\TechnicianWorkStatus;
|
|
@@ -281,7 +283,6 @@ class AccountService
|
|
|
*/
|
|
|
public function getCoachDetail(): array
|
|
|
{
|
|
|
-
|
|
|
$coach = Auth::user()->coach->load([
|
|
|
'latestInfoRecord',
|
|
|
'latestRealRecord',
|
|
@@ -294,6 +295,15 @@ class AccountService
|
|
|
|
|
|
$baseInfo = $this->formatBaseInfo($coach->latestInfoRecord);
|
|
|
|
|
|
+
|
|
|
+ $orderStats = $this->getOrderStatistics($coach->id);
|
|
|
+
|
|
|
+
|
|
|
+ $statistics = $this->formatStatistics($coach->statistics);
|
|
|
+
|
|
|
+
|
|
|
+ $statistics = array_merge($orderStats, $statistics);
|
|
|
+
|
|
|
|
|
|
$coachNo = str_pad($coach->id, 8, '0', STR_PAD_LEFT);
|
|
|
|
|
@@ -312,9 +322,6 @@ class AccountService
|
|
|
|
|
|
$shop = $this->formatShop($coach->shop);
|
|
|
|
|
|
-
|
|
|
- $statistics = $this->formatStatistics($coach->statistics);
|
|
|
-
|
|
|
|
|
|
return array_merge(
|
|
|
[
|
|
@@ -326,6 +333,8 @@ class AccountService
|
|
|
[
|
|
|
'state' => $coach->state,
|
|
|
'state_text' => TechnicianStatus::fromValue($coach->state)?->label(),
|
|
|
+ 'work_status' => $coach->work_status,
|
|
|
+ 'work_status_text' => TechnicianWorkStatus::fromValue($coach->work_status)?->label(),
|
|
|
],
|
|
|
[
|
|
|
'auth_status' => $authStatus,
|
|
@@ -433,26 +442,26 @@ class AccountService
|
|
|
}
|
|
|
|
|
|
|
|
|
- * 格式化统计信息
|
|
|
- * 处理技师的订单统计和等级信息
|
|
|
+ * 格式化评分统计信息
|
|
|
+ * 处理技师的评分和等级信息
|
|
|
*
|
|
|
- * 业务逻辑:
|
|
|
- * 1. 获取订单相关统计数据
|
|
|
- * 2. 获取技师等级信息
|
|
|
- * 3. 获取评分信息
|
|
|
- * 4. 处理默认值
|
|
|
- *
|
|
|
- * @param CoachStatistic|null $statistics 统计对象
|
|
|
- * @return array 格式化后的统计信息
|
|
|
+ * @param CoachStatistic|null $statistics 评分统计对象
|
|
|
+ * @return array 格式化后的评分信息
|
|
|
*/
|
|
|
private function formatStatistics(?CoachStatistic $statistics): array
|
|
|
{
|
|
|
+ if (!$statistics) {
|
|
|
+ return [
|
|
|
+ 'level' => 1,
|
|
|
+ 'level_text' => $this->getLevelText(1),
|
|
|
+ 'rating' => 5.0,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
return [
|
|
|
- 'order_count' => $statistics?->order_count ?? 0,
|
|
|
- 'completed_order_count' => $statistics?->completed_order_count ?? 0,
|
|
|
- 'level' => $statistics?->level ?? 1,
|
|
|
- 'level_text' => $this->getLevelText($statistics?->level ?? 1),
|
|
|
- 'rating' => $statistics?->rating ?? 5.0,
|
|
|
+ 'level' => $statistics->level ?? 1,
|
|
|
+ 'level_text' => $this->getLevelText($statistics->level ?? 1),
|
|
|
+ 'rating' => $statistics->rating ?? 5.0,
|
|
|
];
|
|
|
}
|
|
|
|
|
@@ -513,7 +522,7 @@ class AccountService
|
|
|
*/
|
|
|
private function formatQualification($qual)
|
|
|
{
|
|
|
-
|
|
|
+
|
|
|
$qualTypeMap = [
|
|
|
1 => '初级按摩师',
|
|
|
2 => '中级按摩师',
|
|
@@ -838,7 +847,7 @@ class AccountService
|
|
|
$range['start_minutes'] <= $prevRange['end_minutes'],
|
|
|
400,
|
|
|
"时间段 {$prevRange['start_time']}-{$prevRange['end_time']} 和 " .
|
|
|
- "{$range['start_time']}-{$range['end_time']} 之间存在重叠"
|
|
|
+ "{$range['start_time']}-{$range['end_time']} 之间有重叠"
|
|
|
);
|
|
|
}
|
|
|
});
|
|
@@ -951,7 +960,7 @@ class AccountService
|
|
|
OrderStatus::ACCEPTED->value,
|
|
|
OrderStatus::DEPARTED->value,
|
|
|
OrderStatus::ARRIVED->value,
|
|
|
- OrderStatus::SERVING->value,
|
|
|
+ OrderStatus::SERVICING->value,
|
|
|
])
|
|
|
->exists();
|
|
|
|
|
@@ -1340,7 +1349,7 @@ class AccountService
|
|
|
*/
|
|
|
private function getWalletInfo(int $coachId): array
|
|
|
{
|
|
|
-
|
|
|
+
|
|
|
$coach = CoachUser::with('wallet')->find($coachId);
|
|
|
|
|
|
|
|
@@ -1568,4 +1577,45 @@ class AccountService
|
|
|
'list' => $list
|
|
|
];
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ * 获取订单统计数据
|
|
|
+ *
|
|
|
+ * @param int $coachId 技师ID
|
|
|
+ * @return array 订单统计数据
|
|
|
+ */
|
|
|
+ private function getOrderStatistics(int $coachId): array
|
|
|
+ {
|
|
|
+
|
|
|
+ $orderStats = Order::where('coach_id', $coachId)
|
|
|
+ ->selectRaw('
|
|
|
+ COUNT(*) as total_count,
|
|
|
+ SUM(CASE WHEN state = ? THEN 1 ELSE 0 END) as completed_count,
|
|
|
+ SUM(CASE WHEN state IN (?,?,?,?,?,?,?,?) THEN 1 ELSE 0 END) as pending_count,
|
|
|
+ SUM(CASE WHEN state = ? THEN 1 ELSE 0 END) as carrying_count
|
|
|
+ ', [
|
|
|
+ OrderStatus::COMPLETED->value,
|
|
|
+ OrderStatus::PAID->value,
|
|
|
+ OrderStatus::ACCEPTED->value,
|
|
|
+ OrderStatus::DEPARTED->value,
|
|
|
+ OrderStatus::ARRIVED->value,
|
|
|
+ OrderStatus::SERVICE_START->value,
|
|
|
+ OrderStatus::SERVICING->value,
|
|
|
+ OrderStatus::SERVICE_END->value,
|
|
|
+ OrderStatus::LEAVING->value,
|
|
|
+ OrderStatus::PAID->value
|
|
|
+ ])
|
|
|
+ ->first();
|
|
|
+
|
|
|
+
|
|
|
+ $grabOrderCount = OrderGrabRecord::where('coach_id', $coachId)->count();
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'order_count' => $orderStats->total_count ?? 0,
|
|
|
+ 'completed_order_count' => $orderStats->completed_count ?? 0,
|
|
|
+ 'pending_order_count' => $orderStats->pending_count ?? 0,
|
|
|
+ 'carrying_order_count' => $orderStats->carrying_count ?? 0,
|
|
|
+ 'grab_order_count' => $grabOrderCount,
|
|
|
+ ];
|
|
|
+ }
|
|
|
}
|