|
|
<?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');//支付等待時間
|
|
|
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->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
|
|
|
]);
|
|
|
}
|
|
|
//查询某个人的预约记录
|
|
|
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";//默认传个66,66没啥用,不能为空而已
|
|
|
$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("已过推送时效,禁止推送");
|
|
|
$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;
|
|
|
}
|
|
|
}
|