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.

1002 lines
37 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Appointment;
use App\Models\Hospital;
use App\Models\HospitalExtra;
use App\Models\ProfitsharingLog;
use App\Models\UserAccount;
use App\Models\UserOrder;
use App\Models\UserPerson;
use App\Models\WeChatPay;
use App\Models\WeChatRefund;
use Illuminate\Http\Request;
use Yo;
use Login;
use Lu;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\DB;
class UserOrderController extends Controller
{
public function check_order(Request $request)
{
$password = $request->post('password');
if ($password != env('INTERNAL_PASSWORD')) Yo::error_echo(200078);
$code = $request->post('appid');
$hospital_info = Hospital::where('code', $code)->where('del', 2)->first();
if (!$hospital_info) Yo::error_echo(100000, ['医院']);
$appointment_number = $request->post('serve_id');
$user_order = UserOrder::where('appointment_number', $appointment_number)->first();
if (!$user_order) Yo::error_echo(100000, ['订单']);
$exam_number = $request->post('exam_id', '');
if (!!$exam_number) {
// 到检
if ($user_order->status != 2) Yo::error_echo(200080);
if ($user_order->check_status == 2) Yo::error_echo(200079);
$user_order->exam_number = $exam_number;
$user_order->check_status = 2;
$user_order->check_time = date('Y-m-d H:i:s');
$user_order->save();
$hospital_sharing_content = self::sharing_config($user_order->hospital, false);
if ($hospital_sharing_content['open'] == 1) {
$slc = ProfitsharingLog::where('order', $user_order->id)->first();
if (!$slc) {
$p = new ProfitsharingController();
$sharing = $p->sharing($user_order->id, $hospital_sharing_content['hospital']);
$receivers = [];
$sharing_map = [];
$price = $user_order->true_price;
foreach ($sharing as $item) {
$formula = $item->formula;
$item->formula = Str::replaceArray('$p', [$price], $item->formula);
foreach ($sharing_map as $k => $i) {
$item->formula = Str::replaceArray('$r' . ($k + 1), [$i['surplus']], $item->formula);
}
$amount = number_format($p->calculateExpression($item->formula), 2);
$receivers[] = [
'type' => $item->type == 1 ? 'MERCHANT_ID' : 'PERSONAL_OPENID',
'account' => $item->account,
'amount' => $amount * 100,
'description' => $item->desc
];
$sharing_map[] = [
'surplus' => $price - $amount,
'formula' => $formula,
];
}
if (count($receivers) != 0) {
$sharing_data = [
'transaction_id' => $user_order->transaction,
'receivers' => $receivers
];
$hospital_extra_content = self::pay_config($user_order->hospital);
$wcp = new WeChatPayController();
$builder_config = [
'appid' => env('WX_APP_ID'),
'pem_path' => base_path() . $hospital_extra_content['wxp']['key'],
'cer_path' => base_path() . $hospital_extra_content['wxp']['crt'],
'cer_num' => $hospital_extra_content['wxp']['number'],
'mchid' => $hospital_extra_content['wxp']['id'],
'v3' => $hospital_extra_content['wxp']['v3'],
];
$wcp->builder($builder_config);
$res = $wcp->profitsharing($sharing_data);
$sl = new ProfitsharingLog();
$sl->hospital = $user_order->hospital;
$sl->order = $user_order->id;
$sl->builder = json_encode($builder_config, JSON_UNESCAPED_UNICODE);
$sl->receivers = json_encode($receivers, JSON_UNESCAPED_UNICODE);
$sl->sharing = json_encode($sharing_map, JSON_UNESCAPED_UNICODE);
$sl->response = json_encode($res, JSON_UNESCAPED_UNICODE);
$sl->recover = '{}';
$sl->status = 1;
$sl->save();
}
}
}
} else {
// 删除
$user_order->status = 3;
$user_order->save();
$appointment = Appointment::where('id', $user_order->appointment)->first();
if (!!$appointment) {
$appointment->used_count -= 1;
$appointment->save();
}
}
return Yo::update_echo($appointment_number);
}
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 exam_info($hospital, $data)
{
$peis = new PEISApiController();
$info = $peis::Post('体检报告查询', $hospital, $data);
return $info;
}
public function cancel_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 item_check($hospital, $data)
{
$peis = new PEISApiController();
$check = $peis::Post('套餐项目检查', $hospital, $data);
return $check;
}
public function time_check($hospital, $data)
{
$peis = new PEISApiController();
$check = $peis::Post('预约时间检查', $hospital, $data);
return $check;
}
public function create(Request $request)
{
Login::user();
$cic = new ComboItemController();
$hospital = $request->post('hospital');
$combo = $request->post('combo');
$person = $request->post('person');
if (count($person) == 0) Yo::error_echo(200044);
$person_info = UserPerson::where('id', $person[0]['id'])
->where('user', Login::$info->id)
->where('del', 2)->first();
if (!$person_info) Yo::error_echo(100000, ['人员信息']);
$price = 0;
$buy_info = [
'combo' => [
'id' => 0,
'name' => '自选项目',
'price' => 0,
],
'items' => [],
'group' => [
'id' => '',
],
];
if (!!$combo) {
$combo_info = $cic->combo_info($hospital, [
'套餐Id' => $combo,
]);
$price += $combo_info['price'];
$buy_info['combo'] = [
'id' => $combo_info['id'],
'name' => $combo_info['name'],
'price' => $combo_info['price'],
];
}
$items = $request->post('items');
$items_list = [];
if (count($items) != 0) {
$items_list = $cic->items($hospital, [
'价格下限' => "0",
'价格上限' => "999999",
"性别" => null,
"妇检" => null,
"套餐Id" => null,
"项目Id列表" => $items
]);
}
foreach ($items_list as $item) {
$price += $item['price'];
$buy_info['items'][] = [
'id' => $item['id'],
'name' => $item['name'],
'price' => $item['price']
];
}
$group = $request->post('group');
$group_info = false;
if (!!$group) {
$cic = new ComboItemController();
$group_info = $cic->group_info($hospital, [
"电话号码" => null,
"证件号码" => null,
"预约Id" => $group
]);
$buy_info['group'] = [
'id' => $group,
'combo_name' => $group_info['combo_name'],
'combo_id' => $group_info['combo_id'],
'group_name' => $group_info['group_name'],
'items' => $group_info['items'],
'appointment_number' => $group_info['appointment_number'],
];
}
$time = $request->post('time');
$time_info = Appointment::where('id', $time['id'])->where('status', 1)->where('del', 2)->first();
if (!$time_info) Yo::error_echo(200046);
$order_count=DB::table('user_orders')->where('appointment',$time['id'])->whereIn('status',[2,4])->count();
if ($time_info->max_count <= $order_count) {
$time_info = false;
}
$check_items = [];
foreach ($items as $item) {
$check_items[] = ['Id' => $item];
}
if (!!($combo == 0 ? null : $combo) || count($check_items) != 0) {
$item_check = self::item_check($hospital, [
'人员信息列表' => [[
"序号" => 0,
"性别" => $person_info->sex == 1 ? '男' : '女',
"年龄" => floor((time() - strtotime($person_info->birthday)) / 86400 / 360),
"婚姻状态" => $person_info->marriage == 1 ? '已婚' : '未婚',
]],
'套餐Id' => $combo == 0 ? null : $combo,
'可选项目信息' => $check_items,
]);
if (count($item_check['data']) != 1) {
Yo::error_exit([
'code' => 200045,
'message' => $item_check['message'],
'data' => [],
]);
}
}
$time_check = self::time_check($hospital, [
'索引信息列表' => [[
"序号" => 0,
"电话号码" => $person_info->phone,
"证件号码" => $person_info->id_number,
]],
'预约时间' => $time_info->date . ' ' . $time_info->start_time,
]);
if (count($time_check['data']) != 1) Yo::error_echo(200047);
if (!!$group_info) {
if (strtotime($group_info['start_time'] . ' 00:00:00') > strtotime($time_info->date . ' ' . $time_info->start_time)) Yo::error_echo(200047);
if (strtotime($group_info['end_time'] . ' 23:59:59') < strtotime($time_info->date . ' ' . $time_info->end_time)) Yo::error_echo(200047);
}
$true_price = $price;
if (Login::$info->pay > 0 && $true_price > 0) {
$true_price = Login::$info->pay;
}
$referral = $request->post('referral');
$order = new UserOrder();
$order->user = Login::$info->id;
$order->hospital = $hospital;
$order->name = $person_info->name;
$order->id_number = $person_info->id_number;
$order->phone = $person_info->phone;
$order->birthday = $person_info->birthday;
$order->sex = $person_info->sex;
$order->marriage = $person_info->marriage;
$order->buy_info = json_encode($buy_info, JSON_UNESCAPED_UNICODE);
$order->type = ($combo == 0 && !!$group) ? 2 : 1;
$order->combo = $combo;
$order->price = $price;
$order->true_price = $true_price;
$order->group_price = 0;
$order->status = 1;
$order->referral = $referral;
$order->appointment = $time_info->id;
$order->appointment_time = $time_info->date . ' ' . $time_info->start_time;
$order->appointment_number = !!$group ? $group : '';
$order->show = '';
$order->save();
$show = date('ymd') . str_pad(($order->id % 100000000), 8, "0", STR_PAD_LEFT);
$order->show = $show;
$order->save();
$time_info->used_count =$order_count+ 1;
$time_info->save();
return Yo::create_echo($order->id);
}
public function mp_list(Request $request)
{
Login::user();
$status = $request->post('status');
$list = UserOrder::select('*')
->selectRaw("IFNULL((select name from hospitals where hospitals.id = user_orders.hospital),'') as hospital_name")
->selectRaw("IFNULL((select address from hospitals where hospitals.id = user_orders.hospital),'') as address")
->selectRaw("IFNULL((select longitude from hospitals where hospitals.id = user_orders.hospital),'') as longitude")
->selectRaw("IFNULL((select latitude from hospitals where hospitals.id = user_orders.hospital),'') as latitude")
->where('user', Login::$info->id)
->where(function ($query) use ($status) {
if ($status != 0) $query->where('status', $status);
})
->orderBy('id', 'desc')->get();
return Yo::echo(['list' => $list]);
}
public function mp_info(Request $request)
{
Login::user();
$id = $request->post('id');
$order_info = UserOrder::where('id', $id)
->where('user', Login::$info->id)
->orderBy('id', 'desc')->first();
if (!$order_info) Yo::error_echo(100000, ['订单']);
if ($order_info->status == 1 && $order_info->pay_type == 1) {
$hospital_extra_content = self::pay_config($order_info->hospital);
$wcp = new WeChatPayController();
$wcp->builder([
'appid' => env('WX_APP_ID'),
'pem_path' => base_path() . $hospital_extra_content['wxp']['key'],
'cer_path' => base_path() . $hospital_extra_content['wxp']['crt'],
'cer_num' => $hospital_extra_content['wxp']['number'],
'mchid' => $hospital_extra_content['wxp']['id'],
'v3' => $hospital_extra_content['wxp']['v3'],
]);
$check = $wcp->check($order_info->show);
if ($check['trade_state'] == 'SUCCESS') {
$we_chat_pay = WeChatPay::where('out_trade_no', $order_info->show)->first();
if (!!$we_chat_pay) {
$we_chat_pay->callback = json_encode([
'type' => 'auto',
'input' => '',
'headers' => '',
'res' => $check,
], JSON_UNESCAPED_UNICODE);
$we_chat_pay->save();
}
$ret = self::done($order_info->id, $check['transaction_id']);
if ($ret == 'status') {
$order_info = UserOrder::where('id', $id)
->where('user', Login::$info->id)
->orderBy('id', 'desc')->first();
}
}
}
return Yo::echo(['info' => $order_info]);
}
//锁定预约记录
public function lock_appointment($hospital,$data){
$peis = new PEISApiController();
$url_code ='个检预约锁定';
$info = $peis::Post($url_code, $hospital, $data);
return $info;
}
//取消锁定预约记录
public function unlock_appointment($hospital,$data){
$peis = new PEISApiController();
$url_code ='个检预约解锁';
$info = $peis::Post($url_code, $hospital, $data);
return $info;
}
public function refund(Request $request)
{
Login::user();
$id = $request->post('id');
$order_info = UserOrder::where('id', $id)
->where('user', Login::$info->id)
->orderBy('id', 'desc')->first();
if (!$order_info) Yo::error_echo(100000, ['订单']);
if ($order_info->status != 2) Yo::error_echo(200051);
if ($order_info->check_status == 2) Yo::error_echo(200052);
$appointment_id=$order_info->appointment_number;
//如果是个检预约,先进行锁定,再退款,再取消预约
if($order_info->type==1){
//锁定
self::lock_appointment($order_info->hospital, [
'预约Id' => $order_info->appointment_number
]);
$order_info->appointment_number = '';
switch ($order_info->pay_type) {
case 1:
$hospital_extra_content = self::pay_config($order_info->hospital);
$wcp = new WeChatPayController();
$wcp->builder([
'appid' => env('WX_APP_ID'),
'pem_path' => base_path() . $hospital_extra_content['wxp']['key'],
'cer_path' => base_path() . $hospital_extra_content['wxp']['crt'],
'cer_num' => $hospital_extra_content['wxp']['number'],
'mchid' => $hospital_extra_content['wxp']['id'],
'v3' => $hospital_extra_content['wxp']['v3'],
]);
$out_trade_no = $order_info->show;
$wcr = new WeChatRefund();
$post_data = [
'transaction_id' => $order_info->transaction,
'out_refund_no' => $out_trade_no,
'total' => $order_info->true_price * 100,
];
$wcr->out_trade_no = $out_trade_no;
$wcr->post_data = json_encode($post_data, JSON_UNESCAPED_UNICODE);
$pay = $wcp->refund($post_data);
$wcr->params = json_encode($pay, JSON_UNESCAPED_UNICODE);
$wcr->save();
if (isset($pay['code'])){
self::unlock_appointment($order_info->hospital, [
'预约Id' =>$appointment_id
]);
Yo::error_echo(200076);
}
if ($pay['status'] != 'PROCESSING' && $pay['status'] != 'SUCCESS'){ //如果退款失败,则解除锁定
self::unlock_appointment($order_info->hospital, [
'预约Id' =>$appointment_id
]);
Yo::error_echo(200053);
}
$order_info->status = 5;
$order_info->refund = $wcr->id;
$order_info->refund_time = date('Y-m-d H:i:s');
$order_info->save();
// return Yo::echo();
case 2:
// Yo::error_echo(200048);
case 3:
$order_info->status = 5;
$order_info->refund_time = date('Y-m-d H:i:s');
$order_info->save();
// return Yo::echo();
}
self::cancel_appointment($order_info->hospital, [
'type' => $order_info->type,
'预约Id' => $appointment_id
]);
$appointment = Appointment::where('id', $order_info->appointment)->first();
if (!!$appointment) {
$appointment->used_count -= 1;
$appointment->save();
}
}else{ //如果不是个检预约,则先取消,再退款
self::cancel_appointment($order_info->hospital, [
'type' => $order_info->type,
'预约Id' => $order_info->appointment_number
]);
$appointment = Appointment::where('id', $order_info->appointment)->first();
if (!!$appointment) {
$appointment->used_count -= 1;
$appointment->save();
}
$order_info->appointment_number = '';
switch ($order_info->pay_type) {
case 1:
$hospital_extra_content = self::pay_config($order_info->hospital);
$wcp = new WeChatPayController();
$wcp->builder([
'appid' => env('WX_APP_ID'),
'pem_path' => base_path() . $hospital_extra_content['wxp']['key'],
'cer_path' => base_path() . $hospital_extra_content['wxp']['crt'],
'cer_num' => $hospital_extra_content['wxp']['number'],
'mchid' => $hospital_extra_content['wxp']['id'],
'v3' => $hospital_extra_content['wxp']['v3'],
]);
$out_trade_no = $order_info->show;
$wcr = new WeChatRefund();
$post_data = [
'transaction_id' => $order_info->transaction,
'out_refund_no' => $out_trade_no,
'total' => $order_info->true_price * 100,
];
$wcr->out_trade_no = $out_trade_no;
$wcr->post_data = json_encode($post_data, JSON_UNESCAPED_UNICODE);
$pay = $wcp->refund($post_data);
$wcr->params = json_encode($pay, JSON_UNESCAPED_UNICODE);
$wcr->save();
if (isset($pay['code'])) Yo::error_echo(200076);
if ($pay['status'] != 'PROCESSING' && $pay['status'] != 'SUCCESS') Yo::error_echo(200053);
$order_info->status = 5;
$order_info->refund = $wcr->id;
$order_info->refund_time = date('Y-m-d H:i:s');
$order_info->save();
//恢复团检预约时间段
if($order_info->type==2){
self::recovery_time_range($order_info->hospital,$order_info->user,$order_info->id_number,$order_info->phone,$appointment_id);
}
return Yo::echo();
case 2:
Yo::error_echo(200048);
case 3:
$order_info->status = 5;
$order_info->refund_time = date('Y-m-d H:i:s');
$order_info->save();
//恢复团检预约时间段
if($order_info->type==2){
self::recovery_time_range($order_info->hospital,$order_info->user,$order_info->id_number,$order_info->phone,$appointment_id);
}
return Yo::echo();
}
}
return Yo::echo(['info' => $order_info]);
}
//恢复单位团检预约时间段
public function recovery_time_range($hospital,$user_id,$people_idnumber,$people_tel,$appointment_num)
{
$user_info=DB::table('user_people')->where(['user'=>$user_id,'id_number'=>$people_idnumber,'phone'=>$people_tel])->first();
$data=[
"预约Id"=>$appointment_num ,
"预约开始时间"=>$user_info->danwei_time_start,
"预约截止时间"=>$user_info->danwei_time_end,
"已排期"=>0,
"排期操作时间"=>date("Y-m-d H:i:s"),
"排期操作"=>"微信小程序"
];
$peis = new PEISApiController();
$url_code ='预约时段修改';
$peis::Post($url_code,$hospital, $data);
}
public function exam(Request $request)
{
$number = $request->post('number');
$hospital = $request->post('hospital');
$info = self::exam_info($hospital, [
"电话号码" => "",
"证件号码" => "",
"体检号" => $number
]);
return Yo::echo(['info' => $info]);
}
public function cancel(Request $request)
{
$number = $request->post('number');
$hospital = $request->post('hospital');
$info = self::cancel_appointment($hospital, [
'type' => 2,
'预约Id' => $number
]);
return Yo::echo(['info' => $info]);
}
public function done($id, $transaction = '')
{
$order_info = UserOrder::where('id', $id)->first();
if (!$order_info) Yo::error_echo(100000, ['订单']);
if ($order_info->status != 1) return 'status';
$buy_info = json_decode($order_info->buy_info, true);
$check_items = [];
foreach ($buy_info['items'] as $item) {
$check_items[] = ['Id' => $item['id']];
}
$combo = $order_info->combo;
if (!!($combo == 0 ? null : $combo) || count($check_items) != 0) {
$item_check = self::item_check($order_info->hospital, [
'人员信息列表' => [[
"序号" => 0,
"性别" => $order_info->sex == 1 ? '男' : '女',
"年龄" => floor((time() - strtotime($order_info->birthday)) / 86400 / 360),
"婚姻状态" => $order_info->marriage == 1 ? '已婚' : '未婚',
]],
'套餐Id' => $order_info->combo == 0 ? null : $order_info->combo,
'可选项目信息' => $check_items,
]);
if (count($item_check['data']) != 1) {
Yo::error_exit([
'code' => 200045,
'message' => $item_check['message'],
'data' => [],
]);
}
}
$time_check = self::time_check($order_info->hospital, [
'索引信息列表' => [[
"序号" => 0,
"电话号码" => $order_info->phone,
"证件号码" => $order_info->id_number,
]],
'预约时间' => $order_info->appointment_time,
]);
if (count($time_check['data']) != 1) Yo::error_echo(200047);
if ($order_info->type == 1) {
$pay_status = true;
if ($order_info->pay_type == 3 && $order_info->price > 0) $pay_status = false;
$cad = [
'type' => 1,
"姓名" => $order_info->name,
"性别" => $order_info->sex == 1 ? '男' : '女',
"年龄" => floor((time() - strtotime($order_info->birthday)) / 86400 / 360),
"婚姻状态" => $order_info->marriage == 1 ? '已婚' : '未婚',
"证件号码" => $order_info->id_number,
"电话号码" => $order_info->phone,
"预约时间" => $order_info->appointment_time,
"介绍人" => $order_info->referral,
'套餐Id' => $order_info->combo == 0 ? null : $order_info->combo,
"可选项目信息" => $check_items,
"已收费" => $pay_status,
"总计金额" => $order_info->price,
];
} else {
$cad = [
'type' => 2,
"预约Id" => $order_info->appointment_number,
"预约时间" => $order_info->appointment_time,
'套餐Id' => null,
"可选项目信息" => $check_items
];
}
$create_appointment = self::create_appointment($order_info->hospital, $cad);
$order_info->transaction = $transaction;
$order_info->status = 2;
$order_info->pay_time = date('Y-m-d H:i:s');
if ($create_appointment['code'] != 0) Yo::error_echo(200050, [$create_appointment['message']]);
$order_info->appointment_number = $create_appointment['data'][0][0];
$appointment_info = self::appointment_info($order_info->hospital, [
'type' => $order_info->type,
"证件号码" => null,
"电话号码" => null,
"预约Id" => $order_info->appointment_number,
]);
$order_info->appointment_info = json_encode($appointment_info['data'][0], JSON_UNESCAPED_UNICODE);
$order_info->save();
if($order_info->type == 2 or $order_info->type == 1){
$appointment=DB::table('appointments')->where(['id'=>$order_info->appointment])->get();
$data=[
"预约Id"=> $order_info->appointment_number,
"预约开始时间"=>$appointment[0]->date . ' '.$appointment[0]->start_time,
"预约截止时间"=>$appointment[0]->date . ' '.$appointment[0]->end_time,
"已排期"=>1,
"排期操作时间"=>date("Y-m-d H:i:s"),
"排期操作"=>"微信小程序"
];
$peis = new PEISApiController();
$url_code ='预约时段修改';
$info = $peis::Post($url_code, $order_info->hospital, $data);
}
return $order_info;
}
public function pay_config($hospital, $error = true)
{
$mark = 'pay';
$hospital_extra = HospitalExtra::where('hospital', $hospital)->where('mark', $mark)->first();
$hospital_extra_public = HospitalExtra::where('hospital', 0)->where('mark', $mark)->first();
$hospital_extra_public_content = json_decode($hospital_extra_public->content, true);
if (!!$hospital_extra) {
$hospital_extra_content = json_decode($hospital_extra->content, true);
$hospital_extra_content['wxp'] = $hospital_extra_content['wxp']['open'] == 0 ? $hospital_extra_public_content['wxp'] : $hospital_extra_content['wxp'];
} else {
$hospital_extra_content = $hospital_extra_public_content;
}
if ($hospital_extra_content['wxp']['open'] == 0) $hospital_extra_content['wxp']['open'] = 2;
if ($error && $hospital_extra_content['wxp']['open'] == 2) Yo::error_echo(200047);
return $hospital_extra_content;
}
public function sharing_config($hospital, $error = true)
{
$mark = 'profitsharing';
$hospital_extra = HospitalExtra::where('hospital', $hospital)->where('mark', $mark)->first();
$hospital_extra_public = HospitalExtra::where('hospital', 0)->where('mark', $mark)->first();
$hospital_extra_public_content = json_decode($hospital_extra_public->content, true);
if (!!$hospital_extra) {
$hospital_extra_content = json_decode($hospital_extra->content, true);
if ($hospital_extra_content['open'] == 0) {
$hospital_extra_content = [
'open' => $hospital_extra_public_content['open'],
'hospital' => 0
];
} else {
$hospital_extra_content = [
'open' => $hospital_extra_content['open'],
'hospital' => $hospital
];
}
} else {
$hospital_extra_content = [
'open' => $hospital_extra_public_content['open'],
'hospital' => 0
];;
}
if ($hospital_extra_content['open'] == 0) $hospital_extra_content['open'] = 2;
return $hospital_extra_content;
}
public function admin_list(Request $request)
{
Login::admin([], [26, 30]);
$hospital = $request->post('hospital');
if (Login::$info->hospital != 0) {
if ($hospital != Login::$info->hospital) {
Yo::error_echo(100000, ['机构/医院']);
}
}
$start_time = $request->post('start_time');
$end_time = $request->post('end_time');
$time = $request->post('time');
$search = $request->post('search');
$status = $request->post('status');
$list = UserOrder::select('*')
->where('hospital', $hospital)
->where(function ($query) use ($status) {
if ($status != 0) $query->where('status', $status);
})
->where(function ($query) use ($search) {
if ($search != '') $query->where('name', $search)
->orWhere('id_number', $search)
->orWhere('phone', $search)
->orWhere('show', $search);
});
if (!!$start_time) {
switch ($time) {
case 1:
$list->where('created_at', '>=', $start_time);
break;
case 2:
$list->where('pay_time', '>=', $start_time);
break;
case 3:
$list->where('appointment_time', '>=', $start_time);
break;
}
}
if (!!$end_time) {
switch ($time) {
case 1:
$list->where('created_at', '<=', $end_time);
break;
case 2:
$list->where('pay_time', '<=', $end_time);
break;
case 3:
$list->where('appointment_time', '<=', $end_time);
break;
}
}
return Yo::echo($list->orderBy('id', 'desc')->paginate(10));
}
public function callback($id)
{
$input = file_get_contents('php://input');
$headers = request()->header();
$hospital_extra_content = self::pay_config($id);
$wcp = new WeChatPayController();
$res = $wcp->callback($input, $headers, $hospital_extra_content['wxp']['v3'], 'file://' . base_path() . $hospital_extra_content['wxp']['crt']);
if (!!$res) {
if ($res['trade_state'] == 'SUCCESS') {
$order_info = UserOrder::where('show', $res['out_trade_no'])->where('status', 1)->first();
if (!!$order_info) {
$we_chat_pay = WeChatPay::where('out_trade_no', $res['out_trade_no'])->first();
if (!!$we_chat_pay) {
$we_chat_pay->callback = json_encode([
'type' => 'callback',
'input' => $input,
'headers' => $headers,
'res' => $res,
], JSON_UNESCAPED_UNICODE);
$we_chat_pay->save();
}
self::done($order_info->id, $res['transaction_id']);
}
}
}
return Lu::exit([
'code' => 'SUCCESS',
'message' => '成功',
]);
}
public function pay(Request $request)
{
Login::user();
$order = $request->post('order');
$order_info = UserOrder::where('id', $order)->where('user', Login::$info->id)->where('status', 1)->first();
if (!$order_info) Yo::error_echo(100000, ['订单']);
if (strtotime($order_info->created_at) + 60 * 60 * 2 <= time()) Yo::error_echo(200049);
$buy_info = json_decode($order_info->buy_info, true);
$check_items = [];
foreach ($buy_info['items'] as $item) {
$check_items[] = ['Id' => $item['id']];
}
$combo = $order_info->combo;
if (!!($combo == 0 ? null : $combo) || count($check_items) != 0) {
$item_check = self::item_check($order_info->hospital, [
'人员信息列表' => [[
"序号" => 0,
"性别" => $order_info->sex == 1 ? '男' : '女',
"年龄" => floor((time() - strtotime($order_info->birthday)) / 86400 / 360),
"婚姻状态" => $order_info->marriage == 1 ? '已婚' : '未婚',
]],
'套餐Id' => $order_info->combo == 0 ? null : $order_info->combo,
'可选项目信息' => $check_items,
]);
if (count($item_check['data']) != 1) {
Yo::error_exit([
'code' => 200045,
'message' => $item_check['message'],
'data' => [],
]);
}
}
$time_check = self::time_check($order_info->hospital, [
'索引信息列表' => [[
"序号" => 0,
"电话号码" => $order_info->phone,
"证件号码" => $order_info->id_number,
]],
'预约时间' => $order_info->appointment_time,
]);
if (count($time_check['data']) != 1) Yo::error_echo(200047);
$pay_type = $request->post('pay_type');
if ($order_info->true_price == 0) $pay_type = 3;
if ($order_info->true_price > 0 && $pay_type == 3) $pay_type = 1;
$hospital_extra_content = self::pay_config($order_info->hospital, false);
$hospital_sharing_content = self::sharing_config($order_info->hospital, false);
if ($pay_type == 1 && $hospital_extra_content['wxp']['open'] == 2) $pay_type = 3;
switch ($pay_type) {
case 1:
$we_chat_pay = WeChatPay::where('out_trade_no', $order_info->show)->first();
if (!!$we_chat_pay) {
$params = json_decode($we_chat_pay->params, true);
$pay = [
'appid' => $params['appId'],
'timestamp' => $params['timeStamp'],
'nonce_str' => $params['nonceStr'],
'package' => $params['package'],
'pay_sign' => $params['paySign'],
'sign_type' => $params['signType'],
];
} else {
$wcp = new WeChatPayController();
$wcp->builder([
'appid' => env('WX_APP_ID'),
'pem_path' => base_path() . $hospital_extra_content['wxp']['key'],
'cer_path' => base_path() . $hospital_extra_content['wxp']['crt'],
'cer_num' => $hospital_extra_content['wxp']['number'],
'mchid' => $hospital_extra_content['wxp']['id'],
'v3' => $hospital_extra_content['wxp']['v3'],
]);
$out_trade_no = $order_info->show;
$user_account_info = UserAccount::where('user', Login::$info->id)->first();
$pay = $wcp->create([
'description' => '体检预约',
'out_trade_no' => $out_trade_no,
'notify_url' => env('APP_URL') . '/api/Pay/Wxp/callback/' . $order_info->hospital,
'total' => $order_info->true_price * 100,
'openid' => $user_account_info->account,
'profit_sharing' => $hospital_sharing_content['open'] == 1,
]);
$order_info->pay_type = 1;
$order_info->save();
}
return Yo::echo([
'action' => 'wxp',
'pay' => $pay
]);
case 2:
Yo::error_echo(200047);
case 3:
$order_info->pay_type = 3;
$order_info->save();
self::done($order_info->id);
return Yo::echo([
'action' => 'done',
'pay' => false,
]);
}
}
public function admin_cancel(Request $request)
{
Login::admin([], [26, 30]);
$id = $request->post('id');
$type = $request->post('type');
$order_info = UserOrder::where('id', $id)->first();
if (!$order_info) Yo::error_echo(100000, ['订单']);
$hospital = $order_info->hospital;
if (Login::$info->hospital != 0) {
if ($hospital != Login::$info->hospital) {
Yo::error_echo(100000, ['机构/医院']);
}
}
if (!$order_info->appointment_number) Yo::error_echo(200077);
if ($order_info->check_status == 2) Yo::error_echo(200052);
$order_info->status = 3;
switch ($type) {
case 1:
// 取消预约
if ($order_info->status == 1) Yo::error_echo(200077);
self::cancel_appointment($order_info->hospital, [
'type' => $order_info->type,
'预约Id' => $order_info->appointment_number
]);
$order_info->appointment_number = '';
break;
case 2:
// 取消订单
break;
}
$appointment = Appointment::where('id', $order_info->appointment)->first();
if (!!$appointment) {
$appointment->used_count -= 1;
$appointment->save();
}
$order_info->save();
return Yo::update_echo();
}
public function admin_refund(Request $request)
{
Login::admin([], [26, 30]);
$id = $request->post('id');
$type = $request->post('type');
$order_info = UserOrder::where('id', $id)->first();
if (!$order_info) Yo::error_echo(100000, ['订单']);
$hospital = $order_info->hospital;
if (Login::$info->hospital != 0) {
if ($hospital != Login::$info->hospital) {
Yo::error_echo(100000, ['机构/医院']);
}
}
if ($order_info->status != 2) Yo::error_echo(200075);
if ($order_info->check_status == 2) Yo::error_echo(200052);
if ($order_info->pay_type != 1) Yo::error_echo(200075);
$cancel = false;
switch ($type) {
case 1:
// 仅退款
break;
case 2:
// 退款&取消预约
$cancel = true;
break;
}
$hospital_extra_content = self::pay_config($order_info->hospital);
$wcp = new WeChatPayController();
$wcp->builder([
'appid' => env('WX_APP_ID'),
'pem_path' => base_path() . $hospital_extra_content['wxp']['key'],
'cer_path' => base_path() . $hospital_extra_content['wxp']['crt'],
'cer_num' => $hospital_extra_content['wxp']['number'],
'mchid' => $hospital_extra_content['wxp']['id'],
'v3' => $hospital_extra_content['wxp']['v3'],
]);
$out_trade_no = $order_info->show;
$wcr = new WeChatRefund();
$post_data = [
'transaction_id' => $order_info->transaction,
'out_refund_no' => $out_trade_no,
'total' => $order_info->true_price * 100,
];
$wcr->admin = Login::$info->id;
$wcr->out_trade_no = $out_trade_no;
$wcr->post_data = json_encode($post_data, JSON_UNESCAPED_UNICODE);
$pay = $wcp->refund($post_data);
$wcr->params = json_encode($pay, JSON_UNESCAPED_UNICODE);
$wcr->save();
if (isset($pay['code'])) Yo::error_echo(200076);
if ($pay['status'] != 'PROCESSING' && $pay['status'] != 'SUCCESS') Yo::error_echo(200053);
$order_info->refund = $wcr->id;
$order_info->refund_time = date('Y-m-d H:i:s');
if ($cancel) {
self::cancel_appointment($order_info->hospital, [
'type' => $order_info->type,
'预约Id' => $order_info->appointment_number
]);
$appointment = Appointment::where('id', $order_info->appointment)->first();
if (!!$appointment) {
$appointment->used_count -= 1;
$appointment->save();
}
$order_info->appointment_number = '';
$order_info->status = 5;
}
$order_info->save();
return Yo::update_echo();
}
}