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.
1003 lines
37 KiB
PHP
1003 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->status = 4;
|
|
$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();
|
|
}
|
|
}
|