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; $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 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; //构建多选一数据 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; $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; } $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]; //如果有多选一项目 //构建多选一数据 $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['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; //如果有影像科,则存储在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, ]; } } } } //调用思信接口判断各个项目是否可用 $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_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) { $temp_date = [ "item_id" => $erxian_item['item_id'], "name" => $erxian_item['name'], "price" => $erxian_item['price'], ]; $plan_nmr_info[] = $temp_date; } } //使用优惠券 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, //先标记为异常,方法最底部更新为正常状态 'erxian_appointment_info' => json_encode($plan_nmr_info, JSON_UNESCAPED_UNICODE), '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 ]; $insert = DB::table('orders')->insertGetId($data); //调用接口扣除积分和预存款、优惠券 $jifen_dikou_status = true; $yucunkuan_dikou_status = true; $youhuiquan_dikou_status = true; if ($env == 'pro') { //如果是正式环境 $nowDateTime = date('Y-m-d H:i:s'); 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 ($insert 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) { DB::table('orders')->where('id', $insert)->update([ 'status' => 2 //标记为已支付 ]); } if ($true_price > 0) { //如果大于0则提示前端去支付 $action = "pay"; } return \Yz::return(true, "操作成功", ['action' => $action, 'orderid' => $insert]); } else { return \Yz::echoError1('操作失败'); } } } //预约,用于用户先支付,后期再预约 public function StartYuYue(){ $plan_id = request('plan_id'); $orderid = request('orderid'); $doctor = request('doctor'); $order = DB::table('orders')->where(['id' => $orderid])->first(); if(!$order) return \Yz::echoError1("订单不存在"); if($order->status!== 2) return \Yz::echoError1("订单不是已支付状态不能预约"); if (!isset($plan_id)) return \Yz::echoError1('号源id不能为空'); $person = DB::table('web_user_person')->where(['id' => $order->person_id, 'is_del' => 0])->first(); if (!$person) return \Yz::echoError1('体检人不存在'); if ($order->hospital_id == 1) { $yyid = 6; } if ($order->hospital_id == 4) { $yyid = 2; } //检查号源是否可用 $plan = new PlanController(); $plan_check = $plan->CheckPlan($plan_id, $order->hospital_id, $order->type, $order->sex, $order->price, $order->checkup_type_id); if ($plan_check['status'] === false) return \Yz::echoError1($plan_check['msg']); $plan = $plan_check['plan']; $plan_nmr_appointment_info=[]; //如果有二线号源,根据体检时间查询二线可用号源,区分上下午,二线需预约体检时间1小时后 $plan_nmr_info=[]; $erxian_info=json_decode($order->erxian_appointment_info,true); $AspNet = new AspNetZhuanController(); if (isset($erxian_info) and !empty($erxian_info)) { foreach ($erxian_info as $erxian_item) { $nmrPlans=$AspNet::ErXian(['yyid'=>6,'data'=>[$plan->date],'action'=>"1"],uniqid()); if($plan->time<="12:00") $end_time="12:00"; if($plan->time>"12:00") $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'], ]; $plan_nmr_info[]=$temp_date; break; } } if(empty($temp_date)) return \Yz::echoError1("二线号源不可用,请重新选则日期"); } } //校验二线号源 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'], ]; //调用接口校验号源是否可用 $erxian_status = $AspNet::ErXian(['YYRQ' => $p_nmr_data['date'], 'YYSJ' => $p_nmr_data['time'], 'yyid' => $yyid, 'action' => 4], uniqid()); if ($erxian_status !== true) return \Yz::echoError1($p_nmr_data['name'] . '号源不可用,请重新选择'); $plan_nmr_temp[] = $p_nmr_data; } } $plan_nmr_appointment_info=$plan_nmr_temp; } //开始预约二线 $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, ]; //调用接口预约二线 $erxian_yuyue= $AspNet::ErXian($p_nmr_data, uniqid()); if(!!$erxian_yuyue){ $plan_nmr_appointment_info[$key]['gid']=$erxian_yuyue; }else{ return ['status' => false, 'msg' => "二线预约失败"]; } } } $data=[ 'appointment_date' => $plan->date, 'appointment_time' => $plan->time, 'plan_id' => $plan->id, 'plan_number' => $plan->plan_number, 'doctor' => $doctor, 'erxian_appointment_info'=>json_encode($plan_nmr_appointment_info, JSON_UNESCAPED_UNICODE), 'updated_at' => date('Y-m-d H:i:s') ]; $u = DB::table('orders')->where(['id' => $orderid])->update($data); if(!$u) return \Yz::echoError1("预约失败"); $Finish = new OrderController();//预约体检 $yuyue= $Finish->Finish($order->order_number); return \Yz::Return($yuyue['status'], $yuyue['msg'], ['id' => $order->id]); } //转赠 public function ZhuanZeng() { $order_id = request('order_id'); $person_id = request('person_id'); $openid = request('openid'); $person=DB::table('web_user_person')->where(['id'=>$person_id,'is_del'=>0])->first(); if(!$person) return \Yz::echoError1('转赠用户不存在'); $user = DB::table('web_users')->where(['openid' => $openid, 'status' => 1, 'is_del' => 0])->first(); if (!$user) return \Yz::echoError1('用户不存在'); $order = DB::table('orders') ->where('id', '=', $order_id) ->where('status', '=', 2) ->where(function($query) { $query->where('transfer_type', '=', '') ->orWhereNull('transfer_type'); }) ->where(function($query) { $query->where('plan_id', '=', '') ->orWhereNull('plan_id'); })->first(); if(!$order) return \Yz::echoError1('此订单无法转赠他人'); if($order->web_user_id<>$user->id) return \Yz::echoError1('无权操作此订单'); if($order->person_id==$person_id) return \Yz::echoError1('被转赠人不能和原用户相同'); //查询转赠码表是否生成了对应的转赠码 $transfer_code=DB::table('transfer_code')->where(['link_order_id'=>$order->id,'is_del'=>0])->first(); if(!!$transfer_code) return \Yz::echoError1('此订单已生成转赠码,无法再次转赠'); $peis = new PEISApiController(); $comboDetail = $peis::Post('套餐详情查询', $order->hospital_id, ['套餐Id' => $order->combo_id], false); if ($comboDetail['code'] != 0) return \Yz::echoError1("套餐详情查询失败"); $comboDetail_sex = $comboDetail['data'][0]['性别限制']; if($comboDetail_sex=='全部') $comboDetail_sex=0; if($comboDetail_sex=='男') $comboDetail_sex=1; if($comboDetail_sex=='女') $comboDetail_sex=2; if($comboDetail_sex <> 0 and $comboDetail_sex <> $person->sex) return \Yz::echoError1('性别不符,此套餐不适合转赠给此用户'); DB::beginTransaction(); $now_datetime=date('Y-m-d H:i:s'); $data = [ 'source'=>'转赠from'.$order->id, 'title' => $order->title, 'type' => $order->type, 'web_user_id' => 0, 'checkup_type_id' => $order->checkup_type_id, 'person_id' => 0, 'name' => $person->name, 'id_number' => $person->id_number, 'buy_info' => $order->buy_info, 'price' => $order->price, 'true_price' =>$order->true_price, 'order_number' => $this->generateOrderNumber(), 'status' => 2, 'erxian_appointment_info' => $order->erxian_appointment_info, 'combo_id' => $order->combo_id, 'hospital_id' => $order->hospital_id, 'phone' => $person->phone, 'sex' => $person->sex, 'birthday' => $person->birthday, 'married' => $person->married, 'created_at' => $now_datetime, 'paycheck_time' => $now_datetime ]; $i_order_id=DB::table('orders')->insertGetId($data); $u=DB::table('orders')->where(['id'=>$order->id])->update(['transfer_type'=>1,'transfer_link'=>$i_order_id,'status'=>6]); if($u and $i_order_id){ DB::commit(); return \Yz::Return(true,'操作成功',[]); }else{ DB::rollBack(); return \Yz::echoError1('操作失败'); } } //接受转赠 public function ReceiveZhuanZeng(){ $order_id = request('order_id'); $openid = request('openid'); $user = DB::table('web_users')->where(['openid' => $openid, 'status' => 1, 'is_del' => 0])->first(); if (!$user) return \Yz::echoError1('用户不存在'); $order = DB::table('orders')->where(['id'=>$order_id,'status'=>2,'person_id'=>0]) ->where(function($query) { $query->where('transfer_type', '=', '') ->orWhereNull('transfer_type'); }) ->first(); if(!$order) return \Yz::echoError1('接收失败'); $person=DB::table('web_user_person')->where(['user_id'=>$user->id,'id_number'=>$order->id_number,'is_del'=>0])->first(); if(!$person) return \Yz::echoError1('体检人不存在'); $u=DB::table('orders')->where(['id'=>$order_id])->update(['person_id'=>$person->id,'web_user_id'=>$user->id]); if($u){ return \Yz::Return(true,'操作成功',[]); }else{ return \Yz::echoError1('操作失败'); } } public function item_check($hospital, $data) { $peis = new PEISApiController(); $check = $peis::Post('套餐项目检查', $hospital, $data); return $check; } 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; } }