ufutx.dma/app/Services/OfflineOrderService.php

367 lines
13 KiB
PHP
Raw Normal View History

2026-03-04 14:42:40 +08:00
<?php
namespace App\Services;
use App\Facades\CommonService;
use App\Facades\WechatService;
use App\Http\Controllers\H5\OrderController;
use App\Jobs\UnfreezeCommission;
use App\Models\Group;
use App\Models\GroupUser;
use App\Models\OfflineOrder;
use App\Models\Order;
use App\Models\PartnerCommission;
use App\Models\PartnerWallet;
use App\Models\ServiceRole;
use App\Models\ServiceRoleOrder;
use App\Models\ServiceRoleUser;
use App\Models\ServiceUser;
use App\Models\ServiceUserBindRole;
use App\Models\User;
use Exception;
use Illuminate\Support\Facades\DB;
use cccdl\yunxin_sdk\Im\Team;
use Illuminate\Support\Facades\Log;
class OfflineOrderService
{
public function createOfflineOrder(array $data, $user_id = 0)
{
// 是否是隐私用户
if (isset($data["is_privacy"])) {
User::where("id", $user_id)->update(["is_privacy" => $data["is_privacy"]]);
}
// 创建订单
$tradeNo = CommonService::getTradeNO();
$order = Order::create([
'user_id' => $user_id,
'type' => 'SERVICE',
'type_id' => 1,
'price' => $data['price'],
'pay_status' => 'PAID',
'trade_no' => $tradeNo,
'name' => $data['name'],
'area_code' => $data['area_code'] ?? 86,
"status" => Order::NOTSTART_STATUS,
"service_status" => "NOINFO",
// 'mobile' => aesDecryptCBC($data['mobile']),
'mobile' => ctype_digit($data['mobile']) ? $data['mobile'] : aesDecryptCBC($data['mobile']),
'agency_id' => $data['agency_id'] ?? null,
'desc' => '友福健康服务',
'is_hook' => 1,
"payment_id" => $data["payment_id"] ?? 1,
"check_pay_status" => $data["check_pay_status"] ?? 0,
"check_pay_img" => $data["check_pay_img"] ?? null,
"sign_type" => (isset($data["check_pay_status"]) && $data["check_pay_status"] == 1) ? 1 : 0,
]);
$contract_no = 0;
if (isset($data['contract_no']) && !empty($data['contract_no'])) {
$contract_no = $data['contract_no'];
}
if ($contract_no == 0 && !empty($order->mobile)) {
$contract_no = $order->mobile;
}
// 创建线下订单
$offline_order = OfflineOrder::create([
'order_id' => $order->id,
'name' => $order->name,
'area_code' => $data['area_code'] ?? 86,
'mobile' => $order->mobile,
'contract_no' => $contract_no,
'pay_type' => $data['pay_type'] ?? 1,
'bank_name' => $data['bank_name'] ?? null,
'bank_num' => $data['bank_num'] ?? null,
'agency_id' => $data['agency_id'] ?? null,
'price' => $order->price ?? 0,
"operate_user_id" => auth()->id(),
"operate_user_name" => auth()->user()->name,
]);
//创建群记录
$chat_id = $data['chat_id'] ?? null;
Group::create(['name' => $order->name . '服务群', 'order_id' => $order->id, 'chat_id' => $chat_id]);
if (config('app.env') == 'production') {
//生成用户绑定二维码
$scene = 'order_id=' . $order->id;
$page = 'pages/offlineOrder/bindUser';
$qrcode = WechatService::getMPQrcode($scene, $page);
//更新线下订单信息
$offline_order->bind_qrcode = $qrcode;
$offline_order->save();
}
$this->insertRoleData($chat_id, $order->id);
DB::commit();
return $offline_order;
}
public function getOrderList($keywords = '', $status = '', $agency_id = '', $page_size = 15)
{
$orders = OfflineOrder::with([
'main_order' => function ($order) {
$order->with([
'service_role' => function ($serviceRole) {
$serviceRole->with(['serviceUser:user_id,name,mobile'])->select('order_id', 'role_id', 'user_id');
}
]);
},
"main_order.user:id,name,mobile,avatar,is_privacy",
'agency:id,name,mobile',
'order_commission' => function ($commission) {
$commission->with(['service_user:user_id,name,mobile'])->select('id', 'order_id', 'role', 'user_id');
},
'agreement:order_id,number,sign_date,quota_id',
'agreement.quotaInfo:id,agency_id,collaborator_id,num',
'agreement.quotaInfo.collaboratorInfo:id,avatar,name,mobile',
'agreement.quotaInfo.agencyInfo:id,grade,pro_id,city_id,province,city'
])
->when($keywords, function ($query) use ($keywords) {
$query->where(function ($query) use ($keywords) {
$query->where('name', 'like', '%' . $keywords . '%')->orWhere('mobile', 'like', '%' . $keywords . '%');
});
})
->when(!empty($status), function ($query) use ($status) {
$query->whereHas('main_order', function ($query) use ($status) {
$query->where('status', $status);
});
})
// ->when($agency_id,function ($query) use ($agency_id) {
// $query->where('agency_id',$agency_id);
// })
->when($agency_id, function ($query) use ($agency_id) {
return $query->whereHas('agreement.quotaInfo', function ($q) use ($agency_id) {
$q->where('agency_id', $agency_id);
});
})
->orderByDesc('id');
$is_export = request()->input('is_export');
if ($is_export) {
$orders = $orders->get();
return $orders;
}
$orders = $orders->paginate($page_size);
return $orders;
}
/**
* 更新线下订单
* @param array $data
* @return void
* @throws \Exception
*/
public function updateOfflineOrder(array $data, $order_id)
{
//获取订单状态
$offline_order = OfflineOrder::with('main_order')->findOrFail($order_id);
if ($offline_order->main_order->status != 'NOTSTART')
throw new \Exception('订单已开始服务,不可修改');
// 计算佣金
// $commission_type = $data['subcommission_type'];
// $commission_val = $data['subcommission_val'];
// $data['commission_amount'] = $this->getCommissionAmount($commission_type,$commission_val,$offline_order->price);
try {
DB::beginTransaction();
//更新线下订单
$offline_order->update($data);
//更新对应主订单
$order_data = [
'name' => $offline_order->name,
'mobile' => $offline_order->mobile,
'price' => $offline_order->price,
'agency_id' => $offline_order->agency_id,
];
$offline_order->main_order()->update($order_data);
DB::commit();
return $offline_order;
} catch (\Exception $exception) {
DB::rollBack();
throw new \Exception($exception->getMessage(), $exception->getCode());
}
}
private function getCommissionAmount($type, $val, $price)
{
// 计算佣金
if ($type === 1) {
// 比例分佣
$commission_percentage = bcdiv($val, 100, 4);
$commission_amount = bcmul($price, $commission_percentage, 2);
} else {
// 固定金额
$commission_amount = $val;
}
return $commission_amount;
}
/**
* 查看是否存在角色数据,存在则绑定角色
* @param $chat_id
* @param $order_id
*/
public function insertRoleData($chat_id, $order_id, $service_user_id = null)
{
if ($service_user_id) {
$service_user = ServiceUser::where("user_id", $service_user_id)->first();
} else {
//查看是否绑定企业微信
$work_wechat_user = session('work_wechat_user');
$work_user_id = $work_wechat_user['raw']['userid'] ?? 0;
$service_user = ServiceUser::where("work_user_id", $work_user_id)->first();
}
if ($service_user) {
$roleIds = ServiceUserBindRole::where('chat_id', $chat_id)
->where('user_id', $service_user->user_id)
->select('role_id')
->get()->toArray();
//如果存在数据,则绑定订单
if ($roleIds) {
foreach ($roleIds as $value) {
$ServiceRoleOrder = new ServiceRoleOrder();
$ServiceRoleUser = new ServiceRoleUser();
$ServiceRoleOrder->insertRoleOrder($value['role_id'], $service_user, $order_id);
$ServiceRoleUser->insertRoleUserData($service_user, $value['role_id']);
}
}
}
}
public function AutoServiceJoinGroup($imChatId, $groupId, $orderId, $userId)
{
Log::info("自动分配用户订单角色");
// 主教练id
$mainCoachRoleId = 1;
$mainCoachUserId = $this->getOrderService($userId, $mainCoachRoleId);
Log::info("主教练用户id" . $mainCoachUserId);
if ($mainCoachUserId) {
$this->joinServiceGroup($imChatId, $groupId, $orderId, $mainCoachRoleId, $mainCoachUserId);
}
// 客服
$customerRoleId = 3;
$customerUserId = $this->getOrderService($userId, $customerRoleId);
Log::info("客服用户id" . $customerUserId);
if ($customerUserId) {
$this->joinServiceGroup($imChatId, $groupId, $orderId, $customerRoleId, $customerUserId);
}
}
public function joinServiceGroup($imChatId, $groupId, $orderId, $roleId, $userId)
{
DB::beginTransaction();
try {
// 订单绑定服务人员
$roleOrder = ServiceRoleOrder::where(["order_id" => $orderId, "user_id" => $userId, "role_id" => $roleId])->first();
if (empty($roleOrder)) {
ServiceRoleOrder::create([
"order_id" => $orderId,
"user_id" => $userId,
"role_id" => $roleId
]);
}
// 服务人员加入群聊
$groupUser = GroupUser::where(["user_id" => $userId, "group_id" => $groupId])->first();
if (empty($groupUser)) {
$roleName = ServiceRole::where("id", $roleId)->value("name");
GroupUser::create([
"user_id" => $userId,
"group_id" => $groupId,
"status" => 0,
"type" => 0,
"role_id" => $roleId,
"role_name" => $roleName,
]);
}
$group_info = Group::where('id', $groupId)->first();
$owner_ac_cid = make_wangyiyun_accid($group_info->owner_id);
// 加入im群聊
$user_accid = make_wangyiyun_accid($userId);
$imTeam = new Team(config('chat.im.app_id'), appSecrt: config('chat.im.app_secret'));
$imTeam->add($imChatId, $owner_ac_cid, [$user_accid], 0, '邀请进群');
// 修改群角色
$map = [];
$map['role'] = [$roleId];
$options = ['custom' => json_encode($map)];
$imTeam->updateTeamNick($imChatId, $owner_ac_cid, $user_accid, $options);
DB::commit();
} catch (Exception $e) {
DB::rollBack();
Log::error($e->getMessage());
}
}
/**
* 获取服务人员id(轮训)
* @param mixed $userId
* @param mixed $roleId
* @return void
*/
public function getOrderService($userId, $roleId): int
{
$userIds = [];
switch ($roleId) {
case 1:
if ($userId == 3740 || $userId == 6)
return 1;
$userIds = [218, 178, 175, 176];
// $userIds = [153, 152, 11043, 1]; // 测试
break;
case 3:
if ($userId == 3740 || $userId == 6)
return 7;
$userIds = [181, 177, 184];
// $userIds = [7, 3306]; // 测试
break;
}
$serviceUserId = $this->getLastServiceUserId($roleId, $userIds);
return $serviceUserId;
}
public function getLastServiceUserId($roleId, $userIds): int
{
$serviceUserId = 0;
if ($roleId != 1 && $roleId != 3)
return $serviceUserId;
if (count($userIds) == 0)
return $serviceUserId;
$serviceRoleOrder = ServiceRoleOrder::where("role_id", $roleId)->whereIn("user_id", $userIds)->orderByDesc("id")->first();
if (!$serviceRoleOrder)
return $serviceUserId;
$serviceUserId = $this->findIndex($userIds, $serviceRoleOrder->user_id);
return $serviceUserId;
}
public function findIndex($userIds, $userId): int
{
Log::info("查询服务人员id");
Log::info(json_encode($userIds));
Log::info($userId);
if (!in_array($userId, $userIds))
return $userIds[0];
foreach ($userIds as $key => $item) {
if ($item == $userId) {
if ($key == count($userIds) - 1)
return $userIds[0];
return $userIds[$key + 1];
}
}
return $userIds[0];
}
}