|
|
<?php
|
|
|
|
|
|
namespace App\Http\Controllers\API\H5;
|
|
|
|
|
|
use App\Http\Controllers\Controller;
|
|
|
use App\Http\Controllers\API\PEISApiController;
|
|
|
use App\Services\ConfigService;
|
|
|
use DateTime;
|
|
|
use Illuminate\Http\Request;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
|
|
class OrderController extends Controller
|
|
|
{
|
|
|
public function list(Request $request)
|
|
|
{
|
|
|
// status 1-待支付 2-已预约 3-交易关闭 4-已完成 5-已退款
|
|
|
$openid = $request->post('openid');
|
|
|
$user = DB::table('web_users')->where(['openid' => $openid, 'is_del' => 0])->first();
|
|
|
if (!$user) return \Yz::echoError1("openid对应用户不存在");
|
|
|
$OrderList = DB::table('orders')
|
|
|
->select('id', 'title', 'status', 'name', 'appointment_time as time', 'order_number as order',
|
|
|
DB::raw("CASE WHEN type = 1 THEN '个检' WHEN type = 2 THEN '团检' ELSE 'unknown' END as type"),
|
|
|
'price', 'true_price', 'pay_time', 'refund_time', 'created_at')
|
|
|
->where(['web_user_id' => $user->id])->get();
|
|
|
$WaitingPaymentTime = config('app.globals.WaitingPaymentTime');//支付等待時間
|
|
|
foreach ($OrderList as $key => $list) {
|
|
|
if ($list->status == 1) {
|
|
|
$datetime = new DateTime($list->created_at);
|
|
|
$timestamp = $datetime->getTimestamp();
|
|
|
$list->end_time = $timestamp + (60 * $WaitingPaymentTime);
|
|
|
}
|
|
|
}
|
|
|
$list = [[
|
|
|
'id' => 1,
|
|
|
'title' => '测试套餐1',
|
|
|
'status' => 1,
|
|
|
'name' => '陆予',
|
|
|
'time' => '2024-08-05 08:00:00',
|
|
|
'order' => '1234567890987654321',
|
|
|
'type' => '个检',
|
|
|
'price' => '4999.99',
|
|
|
'true_price' => '4999.99',
|
|
|
'end_time' => time() + (60 * 20)
|
|
|
], [
|
|
|
'id' => 1,
|
|
|
'title' => '测试套餐2',
|
|
|
'status' => 2,
|
|
|
'name' => '陆予',
|
|
|
'time' => '2024-08-05 08:00:00',
|
|
|
'order' => '1234567890987654321',
|
|
|
'type' => '个检',
|
|
|
'price' => '4999.99',
|
|
|
'true_price' => '4999.99',
|
|
|
'pay_time' => '2024-08-06 08:00:00'
|
|
|
], [
|
|
|
'id' => 1,
|
|
|
'title' => '测试套餐2',
|
|
|
'status' => 3,
|
|
|
'name' => '陆予',
|
|
|
'time' => '2024-08-05 08:00:00',
|
|
|
'order' => '1234567890987654321',
|
|
|
'type' => '个检'
|
|
|
], [
|
|
|
'id' => 1,
|
|
|
'title' => '测试套餐2',
|
|
|
'status' => 4,
|
|
|
'name' => '陆予',
|
|
|
'time' => '2024-08-05 08:00:00',
|
|
|
'order' => '1234567890987654321',
|
|
|
'type' => '团检',
|
|
|
'price' => '4999.99',
|
|
|
'true_price' => '0.01',
|
|
|
'pay_time' => '2024-08-06 08:00:00',
|
|
|
'report' => true,
|
|
|
'decode' => 0,
|
|
|
], [
|
|
|
'id' => 1,
|
|
|
'title' => '测试套餐2',
|
|
|
'status' => 5,
|
|
|
'name' => '陆予',
|
|
|
'time' => '2024-08-05 08:00:00',
|
|
|
'order' => '1234567890987654321',
|
|
|
'type' => '团检',
|
|
|
'price' => '4999.99',
|
|
|
'true_price' => '0.01',
|
|
|
'refund_time' => '2024-08-06 08:00:00'
|
|
|
]];
|
|
|
|
|
|
return \Yz::Return(true, '获取成功', [
|
|
|
'list' => $OrderList
|
|
|
]);
|
|
|
}
|
|
|
|
|
|
//创建订单
|
|
|
public function Create()
|
|
|
{
|
|
|
$hospital_id = request('hospital');
|
|
|
$openid = request('openid');
|
|
|
$person_id = request('person_id');
|
|
|
$combo_id = request('combo_id');
|
|
|
$type = request('type');//1个检2团检
|
|
|
$group_id = request('group_id');//团检id
|
|
|
$item_ids = request('item_ids');//自选item的ids
|
|
|
$plan_id = request('plan_id');//号源id
|
|
|
|
|
|
if (!isset($hospital_id)) return \Yz::echoError1('医院id不能为空');
|
|
|
if (!isset($openid)) return \Yz::echoError1('openid不能为空');
|
|
|
if (!isset($person_id)) return \Yz::echoError1('person_id不能为空');
|
|
|
if (!isset($type)) return \Yz::echoError1('type体检类型不能为空');
|
|
|
if ($type != 1 && $type != 2) {
|
|
|
return \Yz::echoError1('type参数,体检类型错误');
|
|
|
}
|
|
|
if (!isset($plan_id)) return \Yz::echoError1('号源id不能为空');
|
|
|
if ($type == 2 and !isset($group_id)) return \Yz::echoError1('团检,group_id不能为空');
|
|
|
if ($type == 1 and isset($group_id)) return \Yz::echoError1('体检类型:个检 与group_id冲突');
|
|
|
|
|
|
$user = DB::table('web_users')->where(['openid' => $openid, 'status' => 1, 'is_del' => 0])->first();
|
|
|
if (!$user) return \Yz::echoError1('用户不存在');
|
|
|
$person = DB::table('web_user_person')->where(['id' => $person_id, 'is_del' => 0])->first();
|
|
|
if (!$person) return \Yz::echoError1('体检人不存在');
|
|
|
$title = "自选项目";
|
|
|
$price = 0;
|
|
|
$true_price = 0;//订单真实支付金额
|
|
|
$buy_info = [
|
|
|
'combo' => [
|
|
|
'id' => 0,
|
|
|
'name' => $title,
|
|
|
'price' => 0,
|
|
|
],
|
|
|
'items' => [],
|
|
|
'group' => [
|
|
|
'id' => '',
|
|
|
],
|
|
|
];
|
|
|
//如果是套餐
|
|
|
$checkup_type_id = false; //体检类型id
|
|
|
if (isset($combo_id) and $combo_id <> 0) {
|
|
|
$combo_info = DB::table('combos')->where(['combo_id' => $combo_id, 'status' => 1])->first();
|
|
|
if (!$combo_info) return \Yz::echoError1("套餐不存在");
|
|
|
if (!isset($combo_info->checkup_type_id)) return \Yz::echoError1("套餐未关联体检类型");
|
|
|
$checkup_type_id = $combo_info->checkup_type_id;
|
|
|
$price += $combo_info->price;
|
|
|
$title = $combo_info->name;
|
|
|
$buy_info['combo'] = [
|
|
|
'id' => $combo_info->combo_id,
|
|
|
'name' => $combo_info->name,
|
|
|
'price' => $combo_info->price,
|
|
|
];
|
|
|
}
|
|
|
|
|
|
//如果有自选项目
|
|
|
$items_list = [];
|
|
|
if (count($item_ids) != 0) {
|
|
|
$items_list = DB::table('items')->whereIn('item_id', $item_ids)->where(['status' => 1])->get();
|
|
|
$existingIds = [];
|
|
|
foreach ($items_list as $item) {
|
|
|
$price += $item->price;
|
|
|
$existingIds[] = $item->item_id;
|
|
|
$buy_info['items'][] = [
|
|
|
'id' => $item->item_id,
|
|
|
'name' => $item->name,
|
|
|
'price' => $item->price
|
|
|
];
|
|
|
}
|
|
|
$missingIds = array_diff($item_ids, $existingIds);
|
|
|
if (count($missingIds) > 0) return \Yz::echoError1("部分自选项目不可用,Id:" . implode(', ', $missingIds));
|
|
|
}
|
|
|
$true_price = $price;
|
|
|
//如果是团检
|
|
|
$group_info = false;
|
|
|
if ($type == 2) {
|
|
|
$P = new PersonController();
|
|
|
$data = [
|
|
|
'电话号码' => null,
|
|
|
'证件号码' => null,
|
|
|
'预约Id' => $group_id
|
|
|
];
|
|
|
$group_info = $P->group_info($hospital_id, $data);
|
|
|
$group_info = $group_info[0];
|
|
|
$buy_info['group'] = [
|
|
|
'id' => $group_id,
|
|
|
'combo_name' => $group_info['combo_name'],
|
|
|
'combo_id' => $group_info['combo_id'],
|
|
|
'group_name' => $group_info['group_name'],
|
|
|
'items' => $group_info['items'],
|
|
|
'group_id' => $group_info['group_id'],
|
|
|
];
|
|
|
$title = "单位团检" . $group_info['combo_name'];
|
|
|
$price = $price + $group_info['sixi_zong_ji_jin_e'];
|
|
|
$need_pay = ($price - $group_info['tongshou_xiane']) > 0 ? $price - $group_info['tongshou_xiane'] : 0;
|
|
|
//团检订单金额为减去统收后的金的
|
|
|
$price = $need_pay;
|
|
|
$true_price = $need_pay;
|
|
|
}
|
|
|
|
|
|
//调用思信接口判断各个项目是否可用
|
|
|
$check_items = [];
|
|
|
foreach ($item_ids as $item_id) {
|
|
|
$check_items[] = ['Id' => $item_id];
|
|
|
}
|
|
|
if ((isset($combo_id) and $combo_id <> 0) || count($check_items) != 0) {
|
|
|
$item_check = self::item_check($hospital_id, [
|
|
|
'人员信息列表' => [[
|
|
|
"序号" => 0,
|
|
|
"性别" => $person->sex == 1 ? '男' : '女',
|
|
|
"年龄" => floor((time() - strtotime($person->birthday)) / 86400 / 360),
|
|
|
"婚姻状态" => $person->married == 1 ? '已婚' : '未婚',
|
|
|
]],
|
|
|
'套餐Id' => $combo_id == 0 ? null : $combo_id,
|
|
|
'可选项目信息' => $check_items,
|
|
|
]);
|
|
|
if (count($item_check['data']) != 1) {
|
|
|
return \Yz::echoError1("体检系统提示:" . $item_check['message']);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//检查号源是否可用
|
|
|
$plan = new PlanController();
|
|
|
$plan_check = $plan->CheckPlan($plan_id, $hospital_id, $type, $person->sex, $price, $checkup_type_id);
|
|
|
if ($plan_check['status'] === false) return \Yz::echoError1($plan_check['msg']);
|
|
|
$plan = $plan_check['plan'];
|
|
|
|
|
|
//判断号源是否可用vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
|
|
// $plan = DB::table('plans')->where(['id' => $plan_id, 'hospital_id' => $hospital_id, 'status' => 1, 'is_del' => 0])->first();
|
|
|
// if (!$plan) return \Yz::echoError1("号源不可用");
|
|
|
// //判断个检/团检类型
|
|
|
// if ($plan->use_type <> 0 and $plan->use_type <> $type) {
|
|
|
// $type_temp = '';
|
|
|
// if ($plan->use_type == 1) $type_temp = '个检';
|
|
|
// if ($plan->use_type == 2) $type_temp = '团检';
|
|
|
// return \Yz::echoError1("此号源为" . $type_temp . "号源,不可用");
|
|
|
// }
|
|
|
// //判断是否是预留号源
|
|
|
// if ($plan->type <> 1) return \Yz::echoError1("此号源为预留号源,不可用");
|
|
|
// //判断是否是vip
|
|
|
// //判断性别
|
|
|
// if ($plan->sex <> 0 and $plan->sex <> $person->sex) return \Yz::echoError1("此号源性别与体检人性别不符,不可用");
|
|
|
// //判断体检类型checkup_type
|
|
|
// //判断金额
|
|
|
// if ($plan->use_type == 1 and $plan->amount_limit1 <> 0) {
|
|
|
// if ($price < $plan->amount_limit1) return \Yz::echoError1("未达到此号源限制的金额,不可用");
|
|
|
// }
|
|
|
// if ($plan->use_type == 2 and $plan->amount_limit2 <> 0) {
|
|
|
// if ($price < $plan->amount_limit2) return \Yz::echoError1("未达到此号源限制的金额,不可用");
|
|
|
// }
|
|
|
// //判断时间是否过期
|
|
|
// $plan_datetime = $plan->date . ' ' . $plan->time;
|
|
|
// if ($plan_datetime < date('Y-m-d H:i:s')) return \Yz::echoError1("号源已过期,不可用");
|
|
|
//判断号源是否可用^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
//如果是团检 判断号源在 团检登记人的有效时间范围内
|
|
|
$plan_datetime = $plan->date . ' ' . $plan->time;
|
|
|
if (!!$group_info) {
|
|
|
if (!($plan_datetime > $group_info['start_time'] . ' 00:00:00' and $plan_datetime < $group_info['end_time'] . ' 23:59:59')) {
|
|
|
return \Yz::echoError1("预约日期不在单位有效时间范围内,请重新选择");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//构建订单号
|
|
|
$order_num = $this->generateOrderNumber();
|
|
|
$data = [
|
|
|
'title' => $title,
|
|
|
'type' => $type,
|
|
|
'web_user_id' => $user->id,
|
|
|
'person_id' => $person->id,
|
|
|
'name' => $person->name,
|
|
|
'id_number' => $person->id_number,
|
|
|
'buy_info' => json_encode($buy_info, JSON_UNESCAPED_UNICODE),
|
|
|
'price' => $price,
|
|
|
'true_price' => $true_price,
|
|
|
'order_number' => $order_num,
|
|
|
'status' => 1,
|
|
|
'appointment_date' => $plan->date,
|
|
|
'appointment_time' => $plan->time,
|
|
|
'plan_id' => $plan->id,
|
|
|
'plan_number' => $plan->plan_number,
|
|
|
'combo_id' => $combo_id,
|
|
|
'hospital_id' => $hospital_id,
|
|
|
'phone' => $person->phone,
|
|
|
'sex' => $person->sex,
|
|
|
'birthday' => $person->birthday,
|
|
|
'married' => $person->married,
|
|
|
];
|
|
|
DB::beginTransaction();
|
|
|
$insert = DB::table('orders')->insertGetId($data);
|
|
|
$up_plan = DB::table('plans')->where(['id' => $plan->id, 'status' => 1])->update([
|
|
|
'status' => 2
|
|
|
]);
|
|
|
if ($insert and $up_plan) {
|
|
|
DB::commit();
|
|
|
$action=false;
|
|
|
if($true_price==0){
|
|
|
//如果是免费的,直接去预约
|
|
|
$yuyue= self::Finish($order_num);
|
|
|
if($yuyue['status']===true){
|
|
|
return \Yz::return(true, "操作成功", ['action' => $action]);
|
|
|
}else{
|
|
|
return \Yz::echoError1($yuyue['msg']);
|
|
|
}
|
|
|
}
|
|
|
if($true_price>0){
|
|
|
//如果大于0则提示前端去支付
|
|
|
$action="pay";
|
|
|
}
|
|
|
return \Yz::return(true, "操作成功", ['action' => $action]);
|
|
|
} else {
|
|
|
DB::rollBack();
|
|
|
return \Yz::echoError1('操作失败');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function generateOrderNumber()
|
|
|
{
|
|
|
// 获取当前时间的时间戳(精确到毫秒)
|
|
|
$timestamp = round(microtime(true) * 1000);
|
|
|
|
|
|
// 生成一个随机数(可以根据需要调整长度)
|
|
|
$randomPart = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 6);
|
|
|
|
|
|
// 拼接时间戳和随机部分
|
|
|
$orderNumber = date("YmdHis", $timestamp / 1000) . substr($timestamp % 1000, -3) . $randomPart;
|
|
|
|
|
|
return $orderNumber;
|
|
|
}
|
|
|
|
|
|
public function item_check($hospital, $data)
|
|
|
{
|
|
|
$peis = new PEISApiController();
|
|
|
$check = $peis::Post('套餐项目检查', $hospital, $data);
|
|
|
return $check;
|
|
|
}
|
|
|
|
|
|
|
|
|
public function Finish_test() //删除!!!
|
|
|
{
|
|
|
$f=self::Finish('20240916154519911MbHwIE');
|
|
|
dd($f);
|
|
|
}
|
|
|
|
|
|
//最后步骤,开始通知思信预约
|
|
|
public function Finish($order_number)
|
|
|
{
|
|
|
$order_info = DB::table('orders')->where(['order_number' => $order_number, 'status' => 1])->first();
|
|
|
if (!$order_info) return ['status' => false, 'msg' => "未找到有效订单"];
|
|
|
$buy_info = json_decode($order_info->buy_info, true);
|
|
|
$combo_id = $buy_info['combo']['id'];
|
|
|
$item_arr = [];
|
|
|
foreach ($buy_info['items'] as $item) {
|
|
|
$item_arr[] = ['Id' => $item['id'], '已收费' => true];
|
|
|
}
|
|
|
//调用思信 套餐项目检查
|
|
|
if ((isset($combo_id) and $combo_id <> 0) || count($item_arr) != 0) {
|
|
|
$item_check = self::item_check($order_info->hospital_id, [
|
|
|
'人员信息列表' => [[
|
|
|
"序号" => 0,
|
|
|
"性别" => $order_info->sex == 1 ? '男' : '女',
|
|
|
"年龄" => floor((time() - strtotime($order_info->birthday)) / 86400 / 360),
|
|
|
"婚姻状态" => $order_info->married == 1 ? '已婚' : '未婚',
|
|
|
]],
|
|
|
'套餐Id' => $combo_id == 0 ? null : $combo_id,
|
|
|
'可选项目信息' => $item_arr,
|
|
|
]);
|
|
|
if (count($item_check['data']) != 1) {
|
|
|
return ['status' => false, 'msg' => "体检系统提示:" . $item_check['message']];
|
|
|
}
|
|
|
}
|
|
|
//如果是个检
|
|
|
if ($order_info->type == 1) {
|
|
|
$cad = [
|
|
|
'type' => 1,
|
|
|
"姓名" => $order_info->name,
|
|
|
"性别" => $order_info->sex == 1 ? '男' : '女',
|
|
|
"年龄" => floor((time() - strtotime($order_info->birthday)) / 86400 / 360),
|
|
|
"婚姻状态" => $order_info->married == 1 ? '已婚' : '未婚',
|
|
|
"证件号码" => $order_info->id_number,
|
|
|
"电话号码" => $order_info->phone,
|
|
|
"预约时间" => $order_info->appointment_date . ' ' . $order_info->appointment_time,
|
|
|
"介绍人" => $order_info->referral,
|
|
|
'套餐Id' => $order_info->combo_id == 0 ? null : $order_info->combo_id,
|
|
|
"可选项目信息" => $item_arr,
|
|
|
"已收费" => true,
|
|
|
"总计金额" => $order_info->price,
|
|
|
];
|
|
|
} else {
|
|
|
$cad = [
|
|
|
'type' => 2,
|
|
|
"预约Id" => $buy_info['group']['group_id'],
|
|
|
"预约时间" => $order_info->appointment_date . ' ' . $order_info->appointment_time,
|
|
|
'套餐Id' => null,
|
|
|
"可选项目信息" => $item_arr
|
|
|
];
|
|
|
}
|
|
|
//更新订单状态为已支付, 支付流水号在 上一步(方法)更新,
|
|
|
DB::table('orders')->where(['order_number' => $order_number])->update([
|
|
|
'status' => 2,
|
|
|
'pay_time' => date('Y-m-d H:i:s'),
|
|
|
]);
|
|
|
//把状态更新为支付后,然后再开始预约思信
|
|
|
$create_appointment = self::create_appointment($order_info->hospital_id, $cad);
|
|
|
|
|
|
if(!isset($create_appointment['data'][0][0])) return ['status' => false, 'msg' => "体检预约,返回非预期结果"];
|
|
|
|
|
|
//预约完成后查询预约结果
|
|
|
$appointment_info = self::appointment_info($order_info->hospital_id, [
|
|
|
'type' => $order_info->type,
|
|
|
"证件号码" => null,
|
|
|
"电话号码" => null,
|
|
|
"预约Id" => $create_appointment['data'][0][0],
|
|
|
]);
|
|
|
DB::table('orders')->where(['order_number' => $order_number])->update([
|
|
|
'appointment_number' => $create_appointment['data'][0][0],
|
|
|
'appointment_back_info'=> json_encode($appointment_info['data'][0], JSON_UNESCAPED_UNICODE)
|
|
|
]);
|
|
|
return ['status' => true, 'msg' => "完成"];
|
|
|
}
|
|
|
public function create_appointment($hospital, $data)
|
|
|
{
|
|
|
$peis = new PEISApiController();
|
|
|
$url_code = $data['type'] == 1 ? '个检预约' : '团检预约';
|
|
|
unset($data['type']);
|
|
|
$info = $peis::Post($url_code, $hospital, $data);
|
|
|
return $info;
|
|
|
}
|
|
|
public function appointment_info($hospital, $data)
|
|
|
{
|
|
|
$peis = new PEISApiController();
|
|
|
$url_code = $data['type'] == 1 ? '个检预约查询' : '团检预约查询';
|
|
|
unset($data['type']);
|
|
|
$info = $peis::Post($url_code, $hospital, $data);
|
|
|
return $info;
|
|
|
}
|
|
|
}
|