You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1648 lines
64 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace App\Http\Controllers\API\H5;
use App\Http\Controllers\API\AspNetZhuanController;
use App\Http\Controllers\API\XCXApiController;
use App\Http\Controllers\Controller;
use App\Http\Controllers\API\PEISApiController;
use App\Lib\Tools;
use App\Services\ConfigService;
use App\Services\OrderService;
use App\Services\SanFangCodeService;
use DateTime;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class OrderController extends Controller
{
public function list(Request $request)
{
// status 1-待支付 2-已预约 3-交易关闭 4-已完成 5-已退款
$openid = $request->post('openid');
$searchInfo = $request->post('searchInfo');
$page = $request->post('page');
if(isset($page)){
$page = intval($page);
}else{
$page = 1;
}
$user = DB::table('web_users')->where(['openid' => $openid, 'is_del' => 0])->first();
if (!$user) return \Yz::echoError1("openid对应用户不存在");
$persons_sfz = DB::table('web_user_person')->where(['user_id' => $user->id, 'is_del' => 0])->pluck('id_number')->toArray();
$where=[];
if(isset($searchInfo['status'])){
$where['status'] = $searchInfo['status'];
}
if(isset($searchInfo['orderid'])){
$where['id'] = $searchInfo['orderid'];
}
$OrderList = DB::table('orders');
$OrderList=$OrderList
->select('id', 'source','title','person_id','buy_info','plan_id', 'checkup_type_id','hunjian_status','status', 'name','appointment_date as date', 'appointment_time as time', 'order_number as order','appointment_number','transfer_type',
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');
if(isset($searchInfo['dateRange'])){
$OrderList=$OrderList->whereBetween('appointment_date', [$searchInfo['dateRange'][0], $searchInfo['dateRange'][1]]);
}
$OrderList=$OrderList
->where($where)
->where(function ($query) use ($persons_sfz,$user) {
$query->where('web_user_id', $user->id)
->orWhere(function ($q) use ($persons_sfz) {
$q->whereIn('id_number', $persons_sfz)
->where('person_id', 0);
});
})->orderBy('id', 'desc') ->skip(($page - 1) * 100) // 跳过前9999条记录
->take(100)->get();
$WaitingPaymentTime = config('app.globals.WaitingPaymentTime');//支付等待時間
$DaiBanCountArr=[0,0,0,0];
foreach ($OrderList as $key => $list) {
if ($list->status == 1) {
$datetime = new DateTime($list->created_at);
$timestamp = $datetime->getTimestamp();
$list->end_time = $timestamp + (60 * $WaitingPaymentTime);
if (time() > $list->end_time and strpos($list->source, '线下体检预约') === false) {
$list->status = 3;
}
}
if ($list->status == 1) {//待支付
$DaiBanCountArr[0]++;
}
if($list->status == 2 and empty($list->appointment_number)){ //待预约
$DaiBanCountArr[1]++;
}
if($list->status == 2 and !empty($list->appointment_number)){ //进行中
$DaiBanCountArr[2]++;
}
if($list->checkup_type_id==4 and $list->status==2 and $list->hunjian_status==0 and !empty($list->appointment_number)){
//查询配偶是否预约
$buy_info=json_decode($list->buy_info,true);
if(isset($buy_info['peiou_info']['sfz'])){
$peiou_check= DB::select("select * from orders where id_number=?
and checkup_type_id = 4
and status in(2,4)
and appointment_number is not null
", [$buy_info['peiou_info']['sfz']]);
if(count($peiou_check)==0){
$datetime = new DateTime($list->created_at);
$timestamp = $datetime->getTimestamp();
$list->end_time = $timestamp + (60 * config('app.globals.WaitingHunJianPeiOuTime'));
}
}
}
}
return \Yz::Return(true, '获取成功', [
'list' => $OrderList,
'DaiBanCountArr'=>$DaiBanCountArr
]);
}
//查询某个人的预约记录
public function GetPersonOrderList(){
$person_id= request('person_id');
$appointment_date= request('appointment_date');
$status= request('status');
$list=DB::table('orders')->where(['person_id'=>$person_id]);
if(isset($appointment_date)){
$list=$list->where(['appointment_date'=>$appointment_date]);
}
if(isset($status) and !empty($status)){
$list=$list->whereIn('status',$status);
}
$list=$list->get();
$count=count($list);
return \Yz::Return(true, '获取成功', [
'list'=>$list,
'count'=>$count
]);
}
public function GetDetail()
{
$id = request('id');
$order_info = DB::table('orders')->where(['id' => $id])->first();
if (!!$order_info) {
$order_info->buy_info = json_decode($order_info->buy_info, true);
$order_info->erxian_appointment_info = json_decode($order_info->erxian_appointment_info, true);
$order_info->appointment_back_info = json_decode($order_info->appointment_back_info, true);
if($order_info->transfer_type==2){
$transfer_code=DB::table('transfer_code')->where(['id'=>$order_info->transfer_link])->first();
$order_info->transfer_code=$transfer_code->code;
}
if($order_info->transfer_type==1){
$transfer_order=DB::table('orders')->where(['id'=>$order_info->transfer_link])->first();
$order_info->transfer_order=$transfer_order;
}
} else {
return \Yz::echoError1('未找到有效订单');
}
return \Yz::Return(true, '获取成功', [
'info' => $order_info,
'today' => date('Y-m-d')
]);
}
//创建订单
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
$peiou_info = request('peiou_info');//配偶信息
if (count($item_ids) != 0 and $item_ids[0] == "") {
$item_ids = [];
}
$duo_xuan_yi = request('duo_xuan_yi'); //多选1
$plan_id = request('plan_id');//号源id
$plan_nmr_info = request('plan_nmr_info');//核磁号源信息
$doctor = request('doctor');//预约的医生名字
$coupon_id = request('coupon_id');//优惠券
$jifen = request('jifen', 0); //使用的积分数量
$yucunkuan = request('yucunkuan', 0);//使用的预存款数量
$erxian_info= request('erxian_info');//使用的预存款数量
$sanfang_code=request('sanfang_code'); //第三方code
$yuyue_fangshi=request('yuyue_fangshi'); //预约方式 个检、团检、个检先选号源等,非必填
$order_id= request('order_id');//如果是线下预约的这里获取订单id,这种直接进行更新,不新建
$wj_flag = request('wj'); //问卷标记
if (isset($wj_flag) and $wj_flag == 1) {
$wj_zhekou = config('app.globals.Wj_ZheKou');//问卷过来的折扣率
}
if (!isset($hospital_id)) return \Yz::echoError1('医院id不能为空');
if ($hospital_id == 1) {
$yyid = 6;
}
if ($hospital_id == 4) {
$yyid = 2;
}
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('请选择预约时间');
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('体检人不存在');
$do_type='insert';
if(isset($order_id)){
$order_info=DB::table('orders')->where(['id'=>$order_id])->first();
if (strpos($order_info->source, '线下体检预约') !== false){
$do_type='update';
}
}
$title = "自选项目";
$price = 0;
$quanInfo=false;
$true_price = 0;//订单真实支付金额
$buy_info = [
'combo' => [
'id' => 0,
'name' => $title,
'price' => 0,
],
'items' => [],
'group' => [
'id' => '',
],
'nmr_list' => [],
'peiou_info' => [],
];
if (!empty($peiou_info)) {
$buy_info['peiou_info'] = $peiou_info ;
}
//如果是套餐
$Nx1_arrInfo = [];
$TJ_Leixing_id = 1;//存储用体检类型
$checkup_type_id = false; //体检类型id
$cha_sanfang_code=false;
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("套餐未关联体检类型");
if($combo_info->sex<>0 and $combo_info->sex<>$person->sex) {
return \Yz::echoError1("套餐性别与体检人性别不匹配");
}
$checkup_type_id = $combo_info->checkup_type_id;
//构建多选一数据
if (isset($duo_xuan_yi) and !empty($duo_xuan_yi)) {
$combo_Nx1 = json_decode($combo_info->duo_xuan_yi, true);
foreach ($duo_xuan_yi as $r_k => $r_v) {
foreach ($combo_Nx1 as $k => $n1v) {
if ($r_v['zu_name'] == $n1v['组名称']) {
foreach ($n1v['包含项目'] as $k2 => $v2) {
if ($v2['Id'] == $r_v['item_id']) {
if ($v2['科室名称'] == '影像科') {
$buy_info['nmr_list'][] = [
'item_id' => $v2['Id'],
'name' => $v2['名称'],
];
}
$Nx1_arrInfo[] = [
'id' => $v2['Id'],
'name' => $v2['名称'],
'price' => 0
];
}
}
}
}
}
}
$TJ_Leixing_id = $checkup_type_id;
$price += $combo_info->price;
//如果使用了第三方券
if(isset($sanfang_code) and isset($sanfang_code['code_num'])){
if($sanfang_code['combo_id']<>$combo_id) return \Yz::echoError1("转赠码与套餐不匹配");
//校验有效性,临时抵消套餐价格
$sanfang_service = new SanFangCodeService();
$cha_sanfang_code = $sanfang_service->GetSanFangCode($sanfang_code['code_num'], $person_id, $sanfang_code['qudao_type']);
if ($cha_sanfang_code['status'] == true) {
$price=$price-$cha_sanfang_code['data']['price'];
if($price<0){
$price=0;
}
}else{
return \Yz::echoError1($cha_sanfang_code['msg']);
}
// if($sanfang_code['combo_id']<>$combo_id) return \Yz::echoError1("转赠码与套餐不匹配");
// //校验有效性,临时抵消套餐价格
// if($sanfang_code['qudao_type']==1){
// $cha_sanfang_code = DB::table('transfer_code')->where(['code' => $sanfang_code['code_num'], 'status' => 1, 'is_del' => 0])->first();
// if (!$cha_sanfang_code) return \Yz::echoError1("此转赠码不可用");
// $price=$price-$cha_sanfang_code->price;
// if($price<0){
// $price=0;
// }
// }
}
$title = $combo_info->name;
$buy_info['combo'] = [
'id' => $combo_info->combo_id,
'name' => $combo_info->name,
'price' => $combo_info->price,
];
//如果有影像科则存储在nmr_list字段
$comboItem = DB::table('combo_items')->where(['combo_id' => $combo_id, 'status' => 1, 'keshi_name' => '影像科'])->get();
if (count($comboItem) > 0) {
foreach ($comboItem as $item) {
$buy_info['nmr_list'][] = [
'item_id' => $item->item_id,
'name' => $item->name,
];
}
}
}
//如果有自选项目
$items_list = [];
if (count($item_ids) != 0) {
$items_list = DB::table('items')->whereIn('item_id', $item_ids)->where(['status' => 1])->get();
$existingIds = [];
$item_price = 0;
foreach ($items_list as $item) {
$item_price += $item->price;
$existingIds[] = $item->item_id;
$buy_info['items'][] = [
'id' => $item->item_id,
'name' => $item->name,
'price' => $item->price
];
//如果有影像科则存储在nmr_list字段
if ($item->keshi_name == '影像科') {
$buy_info['nmr_list'][] = [
'item_id' => $item->item_id,
'name' => $item->name,
];
}
}
// if (isset($wj_flag) and $wj_flag == 1) {
// $item_price = $item_price * $wj_zhekou;
// }
$item_price = $item_price * config('app.globals.ZiXuan_ZheKou'); //所有自选项目打8折
$price += $item_price;
$missingIds = array_diff($item_ids, $existingIds);
if (count($missingIds) > 0) return \Yz::echoError1("部分自选项目不可用Id:" . implode(', ', $missingIds));
}
//如果有 多选一项目
if (!empty($Nx1_arrInfo)) {
$buy_info['items'] = array_merge($buy_info['items'], $Nx1_arrInfo);
}
$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];
if($group_info['name'] <> $person->name){
return \Yz::echoError1("体检人信息异常,请返回首页重新预约");
}
//如果有多选一项目
//构建多选一数据
$Nx1_arrInfo=[];
if(isset($duo_xuan_yi) and !empty($duo_xuan_yi)){
foreach ($duo_xuan_yi as $r_k=>$r_v){
$Nx1_arrInfo[]=[
'id' => $r_v['item_id'],
'name' => $r_v['item_name'],
];
}
}
$group_info['items'] =array_merge($group_info['items'],$Nx1_arrInfo); //合并多选一
$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'],
'have_Nx1'=> !empty($Nx1_arrInfo)
];
$TJ_Leixing_id = $group_info['checkup_type_id'];
$title = "单位团检" . $group_info['danwei_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;
//如果有影像科则存储在nmr_list字段
$all_items = DB::table('items')->where(['status' => 1, 'keshi_name' => '影像科'])->get();
foreach ($group_info['items'] as $item) {
foreach ($all_items as $it) {
if ($it->item_id == $item['id']) {
$buy_info['nmr_list'][] = [
'item_id' => $it->item_id,
'name' => $it->name,
];
}
}
}
}
//如果是婚检1个身份证1天智能预约1次
if ($TJ_Leixing_id == 4) {
$hunjian_order = DB::table('orders')
->where(['id_number' => $person->id_number, 'checkup_type_id' => 4])
->whereIn('status',[2,4])
->whereBetween('created_at',[ date('Y-m-d 00:00:00'),date('Y-m-d 23:59:59')])
->get();
if(count($hunjian_order) > 0) {
return \Yz::echoError1("您已经预约过婚检,不能重复预约");
}
}
//调用思信接口判断各个项目是否可用
$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']);
}
}
//检查号源是否可用
if($do_type=='update'){
//如果是线下预约的订单,则不进行号源检测
$plan = DB::table('plans')->where(['id' => $plan_id, 'hospital_id' => $hospital_id, 'is_del' => 0])->first();
}else{
$plan = new PlanController();
$plan_check = $plan->CheckPlan($plan_id, $hospital_id, $type, $person->sex, $price, $checkup_type_id,$user->id);
if ($plan_check['status'] === false) return \Yz::echoError1($plan_check['msg']);
$plan = $plan_check['plan'];
}
//如果是团检 判断号源在 团检登记人的有效时间范围内
$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("预约日期不在单位有效时间范围内,请重新选择");
}
}
$plan_nmr_appointment_info=[];
//校验积分和预存款
$env = config('app.globals.Env');
$AspNet = new AspNetZhuanController();
if ($env == 'pro') { //如果是正式环境, 测试环境不抵扣
if ($jifen > 0) {
$all_jifen = $AspNet::GetJiFen_YuCunKuan(1, $person->ghzid);
if ($jifen > $all_jifen) return \Yz::echoError1("用户剩余积分不足");
}
if ($yucunkuan > 0) {
// return \Yz::echoError1("暂不支持预存款");
$all_yucunkuan = $AspNet::GetJiFen_YuCunKuan(2, $person->ghzid);
if ($yucunkuan > $all_yucunkuan) return \Yz::echoError1("用户剩余预存款不足");
}
$true_price = $true_price - ($jifen + $yucunkuan);
if ($true_price < -1) return \Yz::echoError1("预抵扣金额超过订单金额,操作失败");
if ($true_price < 0) $true_price = 0;
//如果有二线号源,根据体检时间查询二线可用号源区分上下午二线需预约体检时间1小时后
$plan_nmr_info=[];
if (isset($erxian_info) and !empty($erxian_info)) {
foreach ($erxian_info as $erxian_item) {
if($erxian_item['leixing']==1){
$nmrPlans=$AspNet::ErXian(['yyid'=>6,'data'=>[$plan->date],'action'=>"1",'leixing'=>$erxian_item['leixing']],uniqid());
$end_time="23:59";
if(!isset($nmrPlans[$plan->date]) or empty($nmrPlans[$plan->date])) return \Yz::echoError1("二线号源不可用,请重新选择日期");
$temp_date=[];
$planTime = new DateTime($plan->time);
$planTime->modify('+1 hour');
$plan_time=$planTime->format('H:i');
foreach ($nmrPlans[$plan->date] as $nmp_p){
if($nmp_p['Time']>=$plan_time and $nmp_p['Time']<=$end_time and $nmp_p['keyong']==="0"){
$temp_date=[
"item_id"=>$erxian_item['item_id'],
"name"=>$erxian_item['name'],
"price"=>$erxian_item['price'],
"time"=>$plan->date." ".$nmp_p['Time'],
"leixing"=>$erxian_item['leixing']
];
$plan_nmr_info[]=$temp_date;
break;
}
}
if(empty($temp_date)) {
if(isset($yuyue_fangshi) and $yuyue_fangshi<>'GeJianPlanFront') { //个检先选号源此处不提示 不拦截
return \Yz::echoError1("二线号源不可用,请重新选择日期");
}
}
}
if($erxian_item['leixing']==2 or $erxian_item['leixing']==3){
$find=false;
$startDate = $plan->date;
$date = new DateTime($startDate);
$date->modify('+1 day'); // 先跳过当天
for ($i = 0; $i < 15; $i++) {
$newdate=$date->format('Y-m-d');
$nmrPlans=$AspNet::ErXian(['yyid'=>6,'data'=>[$newdate],'action'=>"1",'leixing'=>$erxian_item['leixing']],uniqid());
if(!isset($nmrPlans[$newdate]) or empty($nmrPlans[$newdate])){
$date->modify('+1 day');
continue;
}
foreach ($nmrPlans[$newdate] as $nmp_p){
if($nmp_p['keyong']==="0"){
$temp_date=[
"item_id"=>$erxian_item['item_id'],
"name"=>$erxian_item['name'],
"price"=>$erxian_item['price'],
"time"=>$newdate." ".$nmp_p['Time'],
"leixing"=>$erxian_item['leixing']
];
$plan_nmr_info[]=$temp_date;
$find=true;
break;
}
}
if($find) break;
// 增加一天
$date->modify('+1 day');
}
}
}
}
//校验二线号源
if (isset($plan_nmr_info) and !empty($plan_nmr_info) ) {
$plan_nmr_temp = [];
foreach ($plan_nmr_info as $key => $plan_nmr) {
if ($plan_nmr['item_id'] <> -1) {
$dt= explode(" ", $plan_nmr['time']);
$p_nmr_data = [
'item_id' => $plan_nmr['item_id'],
'name' => $plan_nmr['name'],
'date' => $dt[0],
'time' => $dt[1],
'price' => $plan_nmr['price'],
'leixing' => $plan_nmr['leixing']
];
//调用接口校验号源是否可用
$erxian_status = $AspNet::ErXian(['YYRQ' => $p_nmr_data['date'], 'YYSJ' => $p_nmr_data['time'], 'yyid' => $yyid, 'action' => 4,'leixing'=>$p_nmr_data['leixing']], uniqid());
if ($erxian_status !== true) {
if(isset($yuyue_fangshi) and $yuyue_fangshi<>'GeJianPlanFront') { //个检先选号源此处不提示 不拦截
return \Yz::echoError1($p_nmr_data['name'] . '号源不可用,请重新选择');
}
}
$plan_nmr_temp[] = $p_nmr_data;
}
}
$plan_nmr_appointment_info=$plan_nmr_temp;
}
}
//使用优惠券
if (isset($coupon_id) and !empty($coupon_id)) {
if($true_price==0) return \Yz::echoError1("金额为0无需使用优惠券");
$use_quan=$this->useYouHuiQuan($true_price,$person,$coupon_id);
$quanInfo=$use_quan['quanInfo'];
$true_price=$use_quan['price'];
}
$now_datetime = date('Y-m-d H:i:s');
//构建订单号
$order_num = $this->generateOrderNumber();
$data = [
'title' => $title,
'type' => $type,
'web_user_id' => $user->id,
'checkup_type_id' => $TJ_Leixing_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' => number_format($true_price, 2, '.', ''),
'jifen' => $jifen,
'yucunkuan' => $yucunkuan,
'order_number' => $order_num,
'status' => 99, //先标记为异常,方法最底部更新为正常状态
'appointment_date' => $plan->date,
'appointment_time' => $plan->time,
'erxian_appointment_info' => json_encode($plan_nmr_appointment_info, JSON_UNESCAPED_UNICODE),
'plan_id' => $plan->id,
'plan_number' => $plan->plan_number,
'combo_id' => $combo_id,
'hospital_id' => $hospital_id,
'doctor' => $doctor,
'phone' => $person->phone,
'sex' => $person->sex,
'birthday' => $person->birthday,
'married' => $person->married,
'wj_flag' => $wj_flag,
'youhuiquan' => $quanInfo === false ? '' : json_encode(['id' => $quanInfo['DZJID'], 'name' => $quanInfo['DZJLBMC']], JSON_UNESCAPED_UNICODE),
'created_at' => $now_datetime,
'paycheck_time'=>$now_datetime
];
if($do_type=='update'){
$insert = DB::table('orders')->where(['id'=>$order_id])->update($data);
$insert=$order_id;
$up_plan=true;
}else{
$insert = DB::table('orders')->insertGetId($data);
$up_plan = DB::table('plans')->where(['id' => $plan->id, 'status' => 1])->update([
'status' => 2
]);
}
//更新问卷log表
DB::table('questionnaires_logs')->where(['person_id' => $person->id, 'order_id' => 0])->update([
'order_id' => $insert,
]);
//调用接口扣除积分和预存款、优惠券
$jifen_dikou_status = true;
$yucunkuan_dikou_status = true;
$youhuiquan_dikou_status = true;
if ($env == 'pro') { //如果是正式环境
//开始预约二线
$nowDateTime=date('Y-m-d H:i:s');
if (!empty($plan_nmr_appointment_info)) {
foreach ($plan_nmr_appointment_info as $key => $plan_nmr) {
//$plan_nmr=$plan_nmr_appointment_info[0];
$sex="未知";
if($person->sex==1) $sex='男';
if($person->sex==2) $sex='女';
$p_nmr_data = [
'ghzid'=>$person->ghzid,
'YYRQ'=>$plan_nmr['date'],
'YYSJ'=>$plan_nmr['time'],
'U_SFID'=>$plan_nmr['item_id'],
'U_SFMC'=>$plan_nmr['name'],
'HBXMJE'=>$plan_nmr['price'],
'CJSJ'=>$nowDateTime,
'YYDH'=>$person->phone,
'YYXM'=>$person->name,
'YYXB'=>$sex,
'YYSR'=>$person->birthday,
'YYNL'=>Tools::GetAge($person->birthday).'岁' ,
'YYZJ'=>$person->id_number,
'YYSJ_B'=>$plan_nmr['time'].':00',
'YYSJ_E'=>$plan_nmr['time'].':00',
'YYSJ_BE'=>$plan_nmr['time'].'-'.$plan_nmr['time'],
'ZCRQ'=>$nowDateTime,
'yyid'=>$yyid,
'action'=>2,
'leixing'=>$plan_nmr['leixing']
];
//调用接口预约二线
$erxian_yuyue= $AspNet::ErXian($p_nmr_data, uniqid());
if(!!$erxian_yuyue){
$plan_nmr_appointment_info[$key]['gid']=$erxian_yuyue;
$ex_u= DB::table('orders')->where(['id' => $insert])->update([
'erxian_appointment_info'=>json_encode($plan_nmr_appointment_info, JSON_UNESCAPED_UNICODE),
]);
if(!$ex_u) return ['status' => false, 'msg' => "二线预约失败"];
}else{
return ['status' => false, 'msg' => "二线预约失败"];
}
}
}
if ($jifen > 0) {
$jifen_dikou_status = false;
$jifen_dikou_status = $AspNet::UseJiFen($person->ghzid, -$jifen, $yyid, $insert, 'tj_h5', '抵扣体检H5订单', $now_datetime);
}
if ($yucunkuan > 0) {
$yucunkuan_dikou_status = false;
$yucunkuan_dikou_status = $AspNet::UseYuCunKuan($person->ghzid, -$yucunkuan, $yyid, 0, $insert, 'tj_h5', '抵扣体检H5订单', $now_datetime);
}
//核销优惠券
if (isset($coupon_id) and !empty($coupon_id)) {
$youhuiquan_dikou_status = false;
$data = [
'action' => 3,
'ghzid' => $person->ghzid,
'dzjid' => $coupon_id,
'hxbz' => "抵扣体检H5订单",
'yyid' => $yyid
];
$youhuiquan_dikou_status = $AspNet::YouHuiQuan($data);
}
//核销三方券码(转赠码等)
if(!!$cha_sanfang_code and $cha_sanfang_code['status']==true){
$s= new SanFangCodeService();
$hexiao=$s->HeXiaoSanFangCode($sanfang_code['qudao_type'],$cha_sanfang_code['data']['code_num'],$insert);
if($hexiao['status']===false) return \Yz::echoError1($hexiao['msg']);
}
}
if ($insert and $up_plan and $jifen_dikou_status and $yucunkuan_dikou_status and $youhuiquan_dikou_status) {
//中途未报错,更新订单为待支付
DB::table('orders')->where('id', $insert)->update([
'status' => 1 //标记为待支付
]);
$action = false;
if ($true_price == 0) {
//如果是免费的,直接去预约
$yuyue = self::Finish($order_num);
if ($yuyue['status'] === true) {
return \Yz::return(true, "操作成功", ['action' => $action, 'orderid' => $insert]);
} else {
return \Yz::echoError1($yuyue['msg']);
}
}
if ($true_price > 0) {
//如果大于0则提示前端去支付
$action = "pay";
}
return \Yz::return(true, "操作成功", ['action' => $action, 'orderid' => $insert]);
} else {
DB::table('plans')->where(['id' => $plan->id])->update([
'status' => 1
]);
DB::table('questionnaires_logs')->where(['person_id' => $person->id, 'order_id' => $insert])->update([
'order_id' => 0,
]);
return \Yz::echoError1('操作失败');
}
}
//订单改约
public function ChangeAppointment()
{
$AspNet = new AspNetZhuanController();
$orderid = request('orderid');
$plan_id = request('planid');
$nmr_info = request('nmr_info');
$doctor = request('doctor');
$orderInfo = DB::table('orders')->where(['id' => $orderid, 'status' => 2])->first();
if (!$orderInfo) return \Yz::echoError1("未找到有效订单");
$person = DB::table('web_user_person')->where(['id' => $orderInfo->person_id, 'is_del' => 0])->first();
if (!$person) return \Yz::echoError1('体检人不存在');
if ($orderInfo->hospital_id == 1) {
$yyid = 6;
}
if ($orderInfo->hospital_id == 4) {
$yyid = 2;
}
//如果重新选择了体检号源,则检验号源有效性//判断体检日期是否在核磁前N天范围内
if(isset($plan_id) && $plan_id <> $orderInfo->plan_id){
$planInfo = DB::table('plans')->where(['id' => $plan_id, 'status' => 1])->first();
if (!$planInfo) return \Yz::echoError1("所选体检日期号源无效");
// $check_plan_kuadu=$this->checkDatesWithinDays([['date'=>$check_erxian_kuadu['mindate'],'date'=>$planInfo->date]],$ErXianKuaDu);
// if(!$check_erxian_kuadu['check_status']) return \Yz::echoError1("体检日期与核磁日期跨度不能大于".$ErXianKuaDu."天,请重新选择");
}
//判断核磁号源有效性能,日期范围是否正常,判断核磁新日期时间是否和旧的日期时间一样
//判断各个二线直接的跨度是否在设定范围内---废弃
// $ErXianKuaDu = config('app.globals.erxian_kuadu');
// $check_erxian_kuadu=$this->checkDatesWithinDays($nmr_info,$ErXianKuaDu);
// if(!$check_erxian_kuadu['check_status']) return \Yz::echoError1("所有二线项目预约跨度不应大于".$ErXianKuaDu."天,请重新选择");
if(isset($plan_id) && $plan_id == $orderInfo->plan_id ){
if($doctor==$orderInfo->doctor) return \Yz::echoError1("无需进行此操作");
$up_doctor=DB::table('orders')->where('id', $orderid)->update(['doctor' => $doctor]);
return \Yz::Return(true,"操作完成",[]);
}
//如果有二线号源,根据体检时间查询二线可用号源区分上下午二线需预约体检时间1小时后
$leixing=null;
//$keywords = ['磁','食管镜','肠镜检'];
$keywords = ['磁'];
$buyInfo=json_decode($orderInfo->buy_info,true);
$db_nmr_info=json_decode($orderInfo->erxian_appointment_info,true);
// if(isset($buyInfo['nmr_list']) and !empty($buyInfo['nmr_list']) and isset($db_nmr_info) and empty($db_nmr_info)){
// $temp_erxian=[];
// foreach ($buyInfo['nmr_list'] as $k=>$v){
// $cha_item=DB::table('items')->where(['item_id'=>$v['item_id'],'status'=>1])->first();
// if(!!$cha_item){
// $temp_erxian[]=[
// 'item_id'=>$v['item_id'],
// 'name'=>$cha_item->name,
// 'price'=>$cha_item->price,
// 'time'=>'',
// 'date'=>'',
// 'gid'=>'',
// ];
// }
// }
// $db_nmr_info=$temp_erxian;
// }
if(isset($db_nmr_info) and !empty($db_nmr_info)){
$temp_erxian=[];
foreach ($db_nmr_info as $k=>$v){
foreach ($keywords as $index => $keyword) {
if (strpos($v['name'], $keyword) !== false) {
$leixing=$index+1;
}
}
$temp_erxian[]=[
'item_id'=>$v['item_id'],
'name'=>$v['name'],
'price'=>$v['price'],
'time'=>'',
'date'=>'',
'gid'=>'',
'leixing'=>$leixing,
];
}
$db_nmr_info=$temp_erxian;
}
$nmr_info=[];
if (isset($db_nmr_info) and !empty($db_nmr_info)) {
foreach ($db_nmr_info as $erxian_item) {
foreach ($keywords as $index => $keyword) {
if (strpos($erxian_item['name'], $keyword) !== false) {
$leixing=$index+1;
}
}
if($leixing==1){
$nmrPlans=$AspNet::ErXian(['yyid'=>6,'data'=>[$planInfo->date],'action'=>"1",'leixing'=>$leixing],uniqid());
$end_time="23:59";
if(!isset($nmrPlans[$planInfo->date]) or empty($nmrPlans[$planInfo->date])) return \Yz::echoError1("二线号源不可用,请重新选择日期");
$temp_date=[];
$planTime = new DateTime($planInfo->time);
$planTime->modify('+1 hour');
$plan_time=$planTime->format('H:i');
foreach ($nmrPlans[$planInfo->date] as $nmp_p){
if($nmp_p['Time']>=$plan_time and $nmp_p['Time']<=$end_time and $nmp_p['keyong']==="0"){
$temp_date=[
"item_id"=>$erxian_item['item_id'],
"name"=>$erxian_item['name'],
"price"=>$erxian_item['price'],
"time"=>$nmp_p['Time'],
"date"=>$planInfo->date,
];
$nmr_info[]=$temp_date;
break;
}
}
if(empty($temp_date)) return \Yz::echoError1("二线号源不可用,请重新选择日期");
}
if($leixing==2 || $leixing==3){
$find=false;
$startDate = $planInfo->date;
$date = new DateTime($startDate);
$date->modify('+1 day'); // 先跳过当天
for ($i = 0; $i < 15; $i++) {
$newdate = $date->format('Y-m-d');
$nmrPlans=$AspNet::ErXian(['yyid'=>6,'data'=>[$newdate],'action'=>"1",'leixing'=>$leixing],uniqid());
if(!isset($nmrPlans[$newdate]) or empty($nmrPlans[$newdate])){
$date->modify('+1 day');
continue;
}
foreach ($nmrPlans[$newdate] as $nmp_p){
if($nmp_p['keyong']==="0"){
$temp_date=[
"item_id"=>$erxian_item['item_id'],
"name"=>$erxian_item['name'],
"price"=>$erxian_item['price'],
"time"=>$nmp_p['Time'],
"date"=>$newdate,
];
$nmr_info[]=$temp_date;
$find=true;
break;
}
}
if($find) break;
// 增加一天
$date->modify('+1 day');
}
}
}
}
//判断二线号源日期时间是否改变,如果改变校验号源有效性
foreach ($nmr_info as $key=>$nmr_item){
foreach ($db_nmr_info as $db_nmr_item){
foreach ($keywords as $index => $keyword) {
if (strpos($db_nmr_item['name'], $keyword) !== false) {
$leixing=$index+1;
}
}
if($nmr_item['item_id']==$db_nmr_item['item_id']){
if(!($nmr_item['date']==$db_nmr_item['date'] and $nmr_item['time']==$db_nmr_item['time'] and $db_nmr_item['gid']<>"")){
$p_nmr_data = [
'item_id' => $nmr_item['item_id'],
'name' => $nmr_item['name'],
'date' => $nmr_item['date'],
'time' => $nmr_item['time'],
'price' => $nmr_item['price'],
];
//调用接口校验号源是否可用
$erxian_status = $AspNet::ErXian(['YYRQ' => $p_nmr_data['date'], 'YYSJ' => $p_nmr_data['time'], 'yyid' => $yyid, 'action' => 4,'leixing'=>$leixing], uniqid());
if ($erxian_status !== true) return \Yz::echoError1($p_nmr_data['name'] . '号源不可用,请重新选择');
}
continue;
}
}
}
//如果二线号源校验通过,则先取消再预约新的
foreach ($nmr_info as $key=>$nmr_item){
foreach ($db_nmr_info as $key2=> $db_nmr_item){
if($nmr_item['item_id']==$db_nmr_item['item_id']){
if(!($nmr_item['date']==$db_nmr_item['date'] and $nmr_item['time']==$db_nmr_item['time'])){
foreach ($keywords as $index => $keyword) {
if (strpos($db_nmr_item['name'], $keyword) !== false) {
$leixing=$index+1;
}
}
//先取消
if($db_nmr_item['gid']<>""){
$AspNet::ErXian(['id' =>$db_nmr_item['gid'], 'yyid' => $yyid, 'action' => 3,'leixing'=>$leixing], uniqid());//取消
$db_nmr_info[$key2]['gid']='';
$ex_u= DB::table('orders')->where(['id' => $orderInfo->id])->update([
'erxian_appointment_info'=>json_encode($db_nmr_info, JSON_UNESCAPED_UNICODE),
]);
}
//再预约新的
$nowDateTime=date('Y-m-d H:i:s');
$sex="未知";
if($person->sex==1) $sex='男';
if($person->sex==2) $sex='女';
$p_nmr_data = [
'ghzid'=>$person->ghzid,
'YYRQ'=>$nmr_item['date'],
'YYSJ'=>$nmr_item['time'],
'U_SFID'=>$nmr_item['item_id'],
'U_SFMC'=>$nmr_item['name'],
'HBXMJE'=>$nmr_item['price'],
'CJSJ'=>$nowDateTime,
'YYDH'=>$person->phone,
'YYXM'=>$person->name,
'YYXB'=>$sex,
'YYSR'=>$person->birthday,
'YYNL'=>Tools::GetAge($person->birthday).'岁' ,
'YYZJ'=>$person->id_number,
'YYSJ_B'=>$nmr_item['time'].':00',
'YYSJ_E'=>$nmr_item['time'].':00',
'YYSJ_BE'=>$nmr_item['time'].'-'.$nmr_item['time'],
'ZCRQ'=>$nowDateTime,
'yyid'=>$yyid,
'action'=>2,
'leixing'=>$leixing
];
//调用接口预约二线
$erxian_yuyue= $AspNet::ErXian($p_nmr_data, uniqid());
if(!!$erxian_yuyue){
$db_nmr_info[$key2]['gid']=$erxian_yuyue;
$db_nmr_info[$key2]['date']=$nmr_item['date'];
$db_nmr_info[$key2]['time']=$nmr_item['time'];
$ex_u= DB::table('orders')->where(['id' => $orderInfo->id])->update([
'erxian_appointment_info'=>json_encode($db_nmr_info, JSON_UNESCAPED_UNICODE),
]);
if(!$ex_u) return ['status' => false, 'msg' => "二线预约失败"];
}else{
return ['status' => false, 'msg' => "二线预约失败"];
}
}
continue;
}
}
}
// var_dump($nmr_info);
// return false;
//判断体检日期时间是否和旧的日期时间一样。一样则跳过,不一样则更新
if (isset($plan_id) && $plan_id <> $orderInfo->plan_id) {
$peis = new PEISApiController();
$data = "appointmentId=" . $orderInfo->appointment_number . "&appGroupId=66&appPlanId=" . $plan_id . "&appPlanNumber=" . $planInfo->plan_number . "&date=" . urlencode($planInfo->date . ' ' . $planInfo->time);
$ch = $peis::Post2('修改用户预约时间', $peis::Api('修改用户预约时间', $data), $orderInfo->hospital_id, []);
if ($ch == '修改预约时刻保存成功') {
//恢复旧的plans
DB::table('plans')->where(['id' => $orderInfo->plan_id])->update(
['status' => 1]
);
//使用新的plans
DB::table('plans')->where(['id' => $plan_id])->update(
['status' => 2]
);
//更新订单
DB::table('orders')->where(['id' => $orderInfo->id])->update([
'plan_id' => $plan_id,
'plan_number' => $planInfo->plan_number,
'appointment_date' => $planInfo->date,
'appointment_time' => $planInfo->time,
'doctor' => isset($doctor) ? $doctor : null,
]);
$is_sendMsg = DB::table('configs')->where(['label' => '预约完成短信通知'])->first();
if (!!$is_sendMsg and $is_sendMsg->value == 1 and strlen($orderInfo->phone)>0) {
$asp = new AspNetZhuanController();
$asp::SendMsg($orderInfo->hospital_id, $orderInfo->phone, $orderInfo->name, $planInfo->date . ' ' . substr($planInfo->time, 0, 5),$orderInfo->sex);
}
if($orderInfo->checkup_type_id==4){ //如果是婚检调用his取消
$his_info=json_decode($orderInfo->his_info,true);
if(!!$his_info and isset($his_info['hunjian_yuyue_gid']) and !empty($his_info['hunjian_yuyue_gid'])){
$his_data=[
"action" => "2",
"yyid" => $yyid,
"ghzid" => $person->ghzid,
"ID"=>$his_info['hunjian_yuyue_gid']
];
$res=$AspNet::HunjianHis($his_data);
if ($res['code'] == "200") {
$his_info['hunjian_yuyue_gid']=null;
$u = DB::table('orders')->where(['id' => $orderInfo->id])->update([
'his_info'=>json_encode($his_info, JSON_UNESCAPED_UNICODE)
]);
}
}
$orderInfo = DB::table('orders')->where(['id' => $orderid, 'status' => 2])->first();
$this->HisInsertHunjian($orderInfo,$yyid,$person);
}
}
return \Yz::Return(true, "操作完成", []);
}
return \Yz::echoError1("未更改内容,无需进行此操作");
}
//判断时间跨度
function checkDatesWithinDays($data,$kuadu) {
// 提取所有日期
$dates = array_column($data, 'date');
// 将日期转换为时间戳
$timestamps = array_map('strtotime', $dates);
// 找出最早和最晚的时间戳
$earliest = min($timestamps);
$latest = max($timestamps);
// 计算时间差(以天为单位)
$differenceInDays = ($latest - $earliest) / (60 * 60 * 24);
// 判断时间差是否在3天以内
return ['check_status'=>$differenceInDays <= $kuadu,'mindate'=> date('Y-m-d H:i:s', $earliest)];
}
public 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('20250729122601478wq5l6d');
dd($f);
}
//最后步骤,开始通知思信预约
public function Finish($order_number)
{
$AspNet=new AspNetZhuanController();
$order_info = DB::table('orders')->where(['order_number' => $order_number])->first();
if (!$order_info) return ['status' => false, 'msg' => "未找到有效订单。"];
//如果是线下预约完的订单,直接走思信修改信息接口
if(strpos($order_info->source, '线下体检预约') !== false){
$BuyInfo=json_decode($order_info->buy_info,true);
$items=[];
if(isset($BuyInfo['items']) and count($BuyInfo['items'])>0){
foreach($BuyInfo['items'] as $it){
$items[]=[
'Id'=>$it['id'],
'名称'=>$it['name'],
'原价'=>$it['price'],
'数量'=>1,
'价格'=>$it['price'],
'优惠方式'=>$it['youhui_fangshi'],
'优惠值'=>$it['youhui_zhi'],
'附加项目'=>true,
'收费方式'=>'自费',
'已收费'=>$order_info->status==2,
];
}
}
$peis = new PEISApiController();
$res=$peis::Post('个检预约设置套餐和项目信息', $order_info->hospital_id, [
'预约Id' => $order_info->appointment_number,
'已收费' => $order_info->status==2,
'套餐Id' => $order_info->combo_id==0?null:$order_info->combo_id,
'项目列表' => $items,
]);
if($res['message']=='设置成功'){
//预约完成后查询预约结果
$appointment_info = self::appointment_info($order_info->hospital_id, [
'type' => 1,
"证件号码" => null,
"电话号码" => null,
"预约Id" => $order_info->appointment_number,
]);
$u = DB::table('orders')->where(['id' => $order_info->id])->update([
'appointment_back_info' => json_encode($appointment_info['data'][0], JSON_UNESCAPED_UNICODE),
]);
return ['status' => true, 'msg' => "完成"];
}else{
return ['status' => false, 'msg' => "操作失败"];
}
}
$person=DB::table('web_user_person')->where(['id' => $order_info->person_id])->first();
if(!$person) return ['status' => false, 'msg' => "体检人信息无效。"];
$yyid=6;
if($order_info->hospital_id == 1){
$yyid=6;
}
if($order_info->hospital_id == 4){
$yyid=2;
}
$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,'分组项目'=>false,'收费方式'=>'自费',];
}
//调用思信 套餐项目检查
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) {
if(strpos( $item_check['message'], '与套餐允许性别') !== false){
$item_check['message']= '套餐性别与体检人性别不匹配';
}
return ['status' => false, 'msg' => "体检系统提示:" . $item_check['message']];
}
}
//如果是个检
if ($order_info->type == 1) {
$checkup_type=DB::table('checkup_type')->where(['id' => $order_info->checkup_type_id])->first();
$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,
'体检类型Id'=>isset($checkup_type->sx_id)?$checkup_type->sx_id:null,
"已收费" => true,
];
$cad2 = [
"可选项目信息" => $item_arr,
"总计金额" => $order_info->price,
];
// if ($order_info->wj_flag == 1) {
$temp = [];
foreach ($item_arr as $k => $item) {
$temp[] = [
"Id" => $item['Id'],
"已收费" => $item['已收费'],
"优惠方式" => "打折",
"优惠值" => config('app.globals.ZiXuan_ZheKou')
];
}
$cad2 = [
"可选项目信息" => $temp,
];
// }
$cad = array_merge($cad, $cad2);
} else {
if(isset($buy_info['group']['items']) and $buy_info['group']['have_Nx1']===true){
$item_temp=[];
foreach ($buy_info['group']['items'] as $gitem) {
$item_temp[]=[
'Id' => $gitem['id'],
'分组项目' => true,
'收费方式'=>'统收',
'已收费' => true
];
}
$item_arr= array_merge($item_arr,$item_temp);
}
$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, 'status' => 1])->update([
'status' => 2,
'pay_time' => date('Y-m-d H:i:s'),
]);
//查询确认订单已经是支付状态
$cha = DB::table('orders')->where(['order_number' => $order_number, 'status' => 2])->first();
if (!$cha) return ['status' => false, 'msg' => "订单未支付,禁止预约"];
$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],
]);
$haoyuan="66";//默认传个6666没啥用不能为空而已
$erxianinfo=false;
if(json_decode($order_info->erxian_appointment_info,true) != null){ //给体检发送二线信息
$erxianinfo = json_decode($order_info->erxian_appointment_info,true);
if(count($erxianinfo) != 0){
$haoyuan=str_replace(":", "", $erxianinfo[0]['time']).'|'.$erxianinfo[0]['date'];
}
}
//调用此接口目的:修改思信体检库里 预约时间,不然他那边预约时间为空,需要再次调用一下这个接口。如果有二线则同时给思信体检传二线号源信息。
$peis = new PEISApiController();
$data = "appointmentId=" . $create_appointment['data'][0][0] . "&appGroupId=".$haoyuan."&appPlanId=" . $order_info->plan_id . "&appPlanNumber=" . $order_info->plan_number . "&date=" . urlencode($order_info->appointment_date . ' ' . $order_info->appointment_time);
$ch = $peis::Post2('修改用户预约时间', $peis::Api('修改用户预约时间', $data), $order_info->hospital_id, []);
//如果是医生web端预约则调用预约时段修改接口传入医生名称
if ($order_info->source == 'web') {
$peis = new PEISApiController();
$dat = [
"预约Id" => $create_appointment['data'][0][0],
"预约开始时间" => $order_info->appointment_date . ' ' . $order_info->appointment_time,
"预约截止时间" => $order_info->appointment_date . ' ' . $order_info->appointment_time,
"AppDoctor" => $order_info->appdoctor
];
$info = $peis::Post('预约时段修改', $order_info->hospital_id, $dat);
}
$wx_day1_sendmsg_status=1;
$wx_day1_sendmsg_time="";
//判断预约的日期是否大于今天如果是设置微信推送为0和 预计推送时间
if($order_info->appointment_date > date('Y-m-d')){
$wx_day1_sendmsg_status=0;
$specifiedDateTime = new DateTime($order_info->appointment_date . ' ' . $order_info->appointment_time);
$previousDay = $specifiedDateTime->modify('-1 day');
$wx_day1_sendmsg_time=$previousDay->format('Y-m-d H:i:s');
}
$u = 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),
'wx_day1_sendmsg_status'=>$wx_day1_sendmsg_status,
'wx_day1_sendmsg_time'=>$wx_day1_sendmsg_time<>''?$wx_day1_sendmsg_time:null,
]);
// 团检设置自费项目收费状态
if($order_info->type==2 && !empty($buy_info['group']['items'])){
$temp_items=[];
foreach ($buy_info['group']['items'] as $gitem) {
if($gitem['pay_type']=='自费'){
$temp_items[]=[
'Id' => $gitem['id'],
'已收费' => true,
];
}
}
$tuan_data=[
'预约Id' => $create_appointment['data'][0][0],
'收费项目列表' => $temp_items,
];
$peis::Post('团检设置自费项目收费状态', $order_info->hospital_id, $tuan_data);
}
$is_sendMsg = DB::table('configs')->where(['label' => '预约完成短信通知'])->first();
if (!!$is_sendMsg and $is_sendMsg->value == 1 and strlen($cha->phone)>0) {
$asp = new AspNetZhuanController();
//预约完成 发送微信提醒 ,关闭短信提醒,模板 type 7 2025-07-07
// $asp::SendMsg($cha->hospital_id, $cha->phone, $cha->name, $cha->appointment_date . ' ' . substr($cha->appointment_time, 0, 5),$cha->sex);
//微信推送
$keshi="健康管理中心1区";
if($person->sex==1) $keshi="健康管理中心1区";
if($person->sex==2) $keshi="健康管理中心2区";
$data = [
"ghzid" => $person->ghzid,
"yyid" => $yyid,
"type" => "7",
"msg1" => $person->name,
"msg2" => $order_info->appointment_date . ' ' . $order_info->appointment_time,
"msg3" => $keshi,
"msg4" => isset($order_info->doctor)?$order_info->doctor:"",
"msg5" => "请提前10分钟到(".$keshi.")签到",
"msg6" => "",
"url" => ""
];
$res = $asp->WeiXinSend($data);
}
//发送二线微信通知
if(!!$erxianinfo and isset($create_appointment['data'][0][0])) {
foreach ($erxianinfo as $key => $erxianItem) {
$keshiname='影像科';
if($erxianItem['leixing']==2 or $erxianItem['leixing']==3) {
$keshiname='胃肠镜室';
}
$data = [
"ghzid" => $person->ghzid,
"yyid" => $yyid,
"type" => "10",
"msg1" => $person->name,
"msg2" => $erxianItem['name'],
"msg3" => $person->phone,
"msg4" => $erxianItem['date'].' '.$erxianItem['time'],
"msg5" => $keshiname,
"msg6" => "",
"url" => ""
];
$dnet = new AspNetZhuanController();
$dnet->WeiXinSend($data);
}
}
//如果是婚检发送给his
if($order_info->checkup_type_id==4 and isset($create_appointment['data'][0][0]) and $order_info->status==2){
$this->HisInsertHunjian($order_info,$yyid,$person);
}
return ['status' => true, 'msg' => "完成"];
}
public function HisInsertHunjian($order_info,$yyid,$person){
$loginfo=DB::table('questions_log')->where(['personid' => $order_info->person_id])->orderBy('id','desc')->first();
if(!$loginfo) return ['status' => false,'msg' => "未找到婚检问题记录"];
$loginfo=json_decode($loginfo->content,true);
$sex='';
if($order_info->sex=='1') $sex='男';
if($order_info->sex=='2') $sex='女';
$data_array = [
"action" => "1",
"ghzid" => $person->ghzid,
"yyid" => $yyid,
"YYDH" => $order_info->phone,
"YYXM" => $order_info->name,
"YYXB" => $sex,
"YYSR" => $order_info->birthday,
"YYNL" => Tools::GetAge($order_info->birthday),
"YYZJ" =>$order_info->id_number,
"YYRQ" => $order_info->appointment_date,
"YYSJ" => substr($order_info->appointment_time, 0, 5),
"YYSJ_B" => $order_info->appointment_time,
"YYSJ_E" => $order_info->appointment_time,
"YYSJ_BE" =>substr($order_info->appointment_time, 0, 5).'-'.substr($order_info->appointment_time, 0, 5),
"zy"=>$loginfo['职业'],
"whcd"=>$loginfo['文化程度'],
"gj"=>$loginfo['国籍'],
"mz"=>$loginfo['民族'],
"csd"=>$loginfo['出生地'],
"sBjSfz"=>$order_info->id_number,
"s_province"=>$loginfo['户籍地址省市区'][0]['text'],
"s_city"=>$loginfo['户籍地址省市区'][1]['text'],
"s_county"=>$loginfo['户籍地址省市区'][2]['text'],
"xxdz"=>$loginfo['现地址'],
"yzbm"=>"",
"dw"=>$loginfo['工作单位'],
"poxm"=>$loginfo['配偶姓名'],
"xb"=>$loginfo['血缘关系'],
"hjdz"=>$loginfo['户籍地址'],
];
$aspnet=new AspNetZhuanController();
$res = $aspnet->HunjianHis($data_array);
if ($res['code'] == "200") {
$his_info=[
"hunjian_yuyue_gid"=>$res['gid'],
];
$u = DB::table('orders')->where(['id' => $order_info->id])->update([
'his_info'=>json_encode($his_info, JSON_UNESCAPED_UNICODE)
]);
}
}
//未支付取消订单
public function Cancel()
{
$order_number=request('order_number');
$orderInfo = DB::table('orders')->where(['order_number' => $order_number,'status'=>1])->first();
if (!$orderInfo) return \Yz::echoErrorJson('未找到有效订单');
$do = new OrderService();
$do->Cancel($orderInfo);
return \Yz::Return(true,"取消完成",['order_id'=>$orderInfo->id]);
}
//批量取消订单
public function BatchCancel()
{
$WaitingPaymentTime = config('app.globals.WaitingPaymentTime');//支付等待時間
$orderInfos = DB::table('orders')
->where(['status' => 1])
->whereRaw("COALESCE(source, '') NOT LIKE '%线下体检预约%'")
->get();
$ids=[];
foreach ($orderInfos as $k => $orderInfo) {
$person = DB::table('web_user_person')->where(['id' => $orderInfo->person_id])->first();
$datetime = new DateTime($orderInfo->created_at);
$timestamp = $datetime->getTimestamp();
$orderInfo->end_time = $timestamp + (60 * $WaitingPaymentTime);
if (time() > $orderInfo->end_time) {
$do = new OrderService();
$do->Cancel($orderInfo);
$ids[]=$orderInfo->id;
}
}
return \Yz::Return(true, "批量取消订单处理完成", ['orderids'=>$ids]);
}
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;
}
public function cancel_appointment($hospital, $data)
{
$peis = new PEISApiController();
$url_code = $data['type'] == 1 ? '个检预约取消' : '团检预约取消';
if($data['type']==2){
$data['删除套餐']=true;
}
unset($data['type']);
$info = $peis::Post($url_code, $hospital, $data);
return $info;
}
public function useYouHuiQuan($true_price,$person,$coupon_id){
//如果使用了代金券
$quanInfo = false;
if (isset($coupon_id) and !empty($coupon_id)) {
if ($true_price == 0) return \Yz::echoError1("无需使用代金券");
$AspNet = new AspNetZhuanController();
$data = [
'ghzid' => $person->ghzid,
'action' => 1,
];
$YouHuiQuanList = $AspNet::YouHuiQuan($data);
foreach ($YouHuiQuanList as $key => $quan) {
if ($quan['DZJID'] == $coupon_id) {
$quanInfo = $quan;
}
}
if ($quanInfo['是否在有效内'] === true and $quanInfo['TimeNuZTTextm'] == "有效" and $quanInfo['ZT'] == 1) {
} else {
return \Yz::echoError1("此代金券不可用");
}
$quanType = false;
$YouHuiQuanType = $AspNet::YouHuiQuan(['action' => 2]);
foreach ($YouHuiQuanType as $key => $qtype) {
if ($quanInfo['DZJLBID'] == $qtype['DZJLBID']) {
$quanType = $qtype;
}
// if($qtype['TJXCXHX']==1 and ($qtype['MKJE']===0 || $qtype['MKJE']>=$true_price)){
// $YouHuiQuanType_ids[]=$qtype['DZJLBID'];
// }
}
if ($quanType === false or $quanInfo === false) return \Yz::echoError1("此代金券不可用");
if ($quanType['TJXCXHX'] != 1) return \Yz::echoError1("此代金券不可用");
if ($quanType['MKJE'] == 0 or $quanType['MKJE'] >= $true_price) {
//抵扣代金券金额
if($quanType['YHLX']==1){//抵扣券
$true_price=($true_price-$quanInfo['JE'])>0 ? $true_price-$quanInfo['JE']:0;
}
if($quanType['YHLX']==2){//抵扣券
$true_price=number_format($true_price*$quanType['DZBL'],2, '.', '');
}
}
}
return ['price'=>$true_price,'quanInfo'=>$quanInfo];
}
//检后签到
public function CheckedSignIn()
{
$tj_number=request('tj_number');
$peis = new PEISApiController();
$res = $peis::Post2('检后签到', $peis::Api('检后签到',$tj_number),1,[]);
$res = json_decode($res, true);
if($res['Success']===true){
return ['status'=>true,'msg'=>$res['Message']];
}else{
return ['status'=>false,'msg'=>$res['Message']];
}
}
//用于轮询检查订单,如果订单已经支付完成,但是订单状态不对则更新状态走后续流程
public function RoundPayCheck()
{
$order_number = request('order_number');
$XCX = new XCXApiController();
$res = $XCX::Post('订单查询', ['orderid' => $order_number]);
//更新检查时间
DB::table('orders')->where(['order_number' => $order_number])->whereIn('status',[1])->update([
'paycheck_time'=> date('Y-m-d H:i:s')
]);
//判断如果支付成功,更改订单状态
if ($res['data']['trade_state'] === 'SUCCESS') {
$order = DB::table('orders')->where(['order_number' => $order_number])->first();
if($order->status == 1){
DB::table('orders')->where(['id' => $order->id])->update([
'status' => 2,
'pay_time' => date('Y-m-d H:i:s'),
]);
$Finish = new OrderController();//预约体检
$Finish->Finish($order_number);
return \Yz::Return(true, "支付成功", ['id' => $order->id]);
}else{
return \Yz::echoError1("状态非1无需执行。状态".$order->status);
}
} else {
return \Yz::echoError1("未支付" . $res['data']['trade_state']);
}
}
//提前1天微信通知
public function Day1WXSend(){
$id = request('id');
$order_info = DB::table('orders')->where(['id' => $id,'status'=>2,'wx_day1_sendmsg_status'=>0])->whereNotNull(['appointment_number'])->first();
if(!$order_info) return \Yz::echoError1("未找到有效订单");
$person= DB::table('web_user_person')->where(['id'=>$order_info->person_id])->first();
$appointment_datetime=$order_info->appointment_date.' '.$order_info->appointment_time; //预约的日期
if(!$this->isTodayTheDayBefore($order_info->appointment_date)) return \Yz::echoError1("已过推送时效,禁止推送,id:".$id);
$yyid=6;
if($order_info->hospital_id == 1){
$yyid=6;
}
if($order_info->hospital_id == 4){
$yyid=2;
}
$keshi="健康管理中心1区";
if($person->sex==1) $keshi="健康管理中心1区";
if($person->sex==2) $keshi="健康管理中心2区";
DB::table('orders')->where(['id' => $id])->update([
'wx_day1_sendmsg_status' => 1,
'wx_day1_sendmsg_time'=>date('Y-m-d H:i:s')
]);
//微信推送
$data = [
"ghzid" => $person->ghzid,
"yyid" => $yyid,
"type" => "7",
"msg1" => $person->name,
"msg2" => $appointment_datetime,
"msg3" => $keshi,
"msg4" => isset($order_info->doctor)?$order_info->doctor:"",
"msg5" => "请提前10分钟到(".$keshi.")签到",
"msg6" => "",
"url" => ""
];
$dnet = new AspNetZhuanController();
$res = $dnet->WeiXinSend($data);
return \Yz::Return(true, "推送完成", ['res' => $res]);
}
//判断今天是否是给定日期的前一天
function isTodayTheDayBefore($targetDate) {
// 创建今天日期的 DateTime 对象
$today = new DateTime('today');
// 创建目标日期的 DateTime 对象
$target = new DateTime($targetDate);
// 修改目标日期为前一天
$target->modify('-1 day');
// 比较两个日期
return $today == $target;
}
}