|
@@ -451,7 +451,7 @@ class OrderService
|
|
|
$order->state = OrderStatus::ACCEPTED->value;
|
|
|
$order->save();
|
|
|
|
|
|
- // 清理技师相关缓存
|
|
|
+ // 清���技师相关缓存
|
|
|
$this->clearCoachCache($coach->id, $order->service_time);
|
|
|
|
|
|
// 记录日志
|
|
@@ -1008,50 +1008,53 @@ class OrderService
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 订单设置
|
|
|
+ * 更新订单设置
|
|
|
*
|
|
|
- * @param int $userId 技师用户ID
|
|
|
- * @param array $data 订单设置数据
|
|
|
- * @return array
|
|
|
+ * 业务流程:
|
|
|
+ * 1. 获取订单配置项
|
|
|
+ * 2. 验证服务距离范围
|
|
|
+ * 3. 更新技师设置
|
|
|
+ * 4. 返回最新设置
|
|
|
*
|
|
|
- * @throws \Exception
|
|
|
+ * @param CoachUser $coach 技师对象
|
|
|
+ * @param array $data 设置数据,包含:
|
|
|
+ * - distance: float 服务距离(公里)
|
|
|
+ * @return array 返回最新设置信息
|
|
|
+ * @throws \Exception 当更新失败时抛出异常
|
|
|
*/
|
|
|
- public function setOrder(int $userId, array $data)
|
|
|
+ public function setOrder(CoachUser $coach, array $data): array
|
|
|
{
|
|
|
+ return DB::transaction(function () use ($coach, $data) {
|
|
|
+ // 获取订单距离配置项
|
|
|
+ $distanceItem = SettingGroup::where('code', 'order')
|
|
|
+ ->firstOrFail()
|
|
|
+ ->items()
|
|
|
+ ->where('code', 'distance')
|
|
|
+ ->firstOrFail();
|
|
|
+
|
|
|
+ // 验证服务距离范围
|
|
|
+ $distance = (float)$data['distance'];
|
|
|
+ abort_if(
|
|
|
+ $distance > $distanceItem->max_value || $distance < $distanceItem->min_value,
|
|
|
+ 422,
|
|
|
+ sprintf('服务距离必须在 %.1f-%.1f 公里之间', $distanceItem->min_value, $distanceItem->max_value)
|
|
|
+ );
|
|
|
|
|
|
- return DB::transaction(function () use ($userId, $data) {
|
|
|
-
|
|
|
- // 获取技师信息
|
|
|
- $user = MemberUser::with(['coach'])->findOrFail($userId);
|
|
|
- $coach = $user->coach;
|
|
|
- abort_if(! $coach, 404, '技师信息不存在');
|
|
|
-
|
|
|
- // 获取订单配置分组
|
|
|
- $settingGroup = SettingGroup::where('code', 'order')->first();
|
|
|
- abort_if(! $settingGroup, 404, '订单配置分组不存在');
|
|
|
-
|
|
|
- // 获取距离配置项
|
|
|
- $distanceSettingItem = $settingGroup->items()->where('code', 'distance')->first();
|
|
|
- abort_if(! $distanceSettingItem, 404, '距离配置项不存在');
|
|
|
-
|
|
|
- // 检查服务距离是否存在,并且是否大于0
|
|
|
- if (isset($data['distance']) && $data['distance'] > 0) {
|
|
|
- // 从全局配置中验证服务距离的合理范围
|
|
|
- abort_if($data['distance'] > $distanceSettingItem->max_value, 422, '服务距离不能超过' . $distanceSettingItem->max_value . '公里');
|
|
|
-
|
|
|
- // 更新技师服务距离配置
|
|
|
- $coach->settingValues()->updateOrCreate(
|
|
|
- ['item_id' => $distanceSettingItem->id],
|
|
|
- ['value' => $data['distance']],
|
|
|
- ['object_type' => $coach::class],
|
|
|
- ['object_id' => $coach->id],
|
|
|
- );
|
|
|
- }
|
|
|
+ // 更新技师服务距离设置
|
|
|
+ $coach->settingValues()->updateOrCreate(
|
|
|
+ [
|
|
|
+ 'item_id' => $distanceItem->id,
|
|
|
+ 'object_type' => $coach::class,
|
|
|
+ 'object_id' => $coach->id,
|
|
|
+ ],
|
|
|
+ ['value' => $distance]
|
|
|
+ );
|
|
|
|
|
|
+ // 返回最新设置
|
|
|
return [
|
|
|
- 'message' => '订单设置更新成功',
|
|
|
- 'coach_id' => $coach->id,
|
|
|
- 'settings' => $data,
|
|
|
+ 'distance' => $distance,
|
|
|
+ 'distance_max' => (float)$distanceItem->max_value,
|
|
|
+ 'distance_min' => (float)$distanceItem->min_value,
|
|
|
];
|
|
|
});
|
|
|
}
|