|
|
|
|
@ -0,0 +1,388 @@
|
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Http\Controllers\API\H5;
|
|
|
|
|
|
|
|
|
|
use App\Http\Controllers\API\AspNetZhuanController;
|
|
|
|
|
use App\Http\Controllers\Controller;
|
|
|
|
|
use App\Lib\Tools;
|
|
|
|
|
use Illuminate\Http\Request;
|
|
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
|
|
|
|
|
|
class OrderNewController extends Controller
|
|
|
|
|
{
|
|
|
|
|
public function CreateNewOrder()
|
|
|
|
|
{
|
|
|
|
|
$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_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');//使用的预存款数量
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$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 ($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('体检人不存在');
|
|
|
|
|
$title = "自选项目";
|
|
|
|
|
$price = 0;
|
|
|
|
|
$quanInfo = false;
|
|
|
|
|
$true_price = 0;//订单真实支付金额
|
|
|
|
|
$buy_info = [
|
|
|
|
|
'combo' => [
|
|
|
|
|
'id' => 0,
|
|
|
|
|
'name' => $title,
|
|
|
|
|
'price' => 0,
|
|
|
|
|
],
|
|
|
|
|
'items' => [],
|
|
|
|
|
'group' => [
|
|
|
|
|
'id' => '',
|
|
|
|
|
],
|
|
|
|
|
'nmr_list' => [],
|
|
|
|
|
'peiou_info' => [],
|
|
|
|
|
];
|
|
|
|
|
if (!empty($peiou_info)) {
|
|
|
|
|
$buy_info['peiou_info'] = $peiou_info;
|
|
|
|
|
}
|
|
|
|
|
//如果是套餐
|
|
|
|
|
$Nx1_arrInfo = [];
|
|
|
|
|
$TJ_Leixing_id = 1;//存储用体检类型
|
|
|
|
|
$checkup_type_id = false; //体检类型id
|
|
|
|
|
if (isset($combo_id) and $combo_id <> 0) {
|
|
|
|
|
$combo_info = DB::table('combos')->where(['combo_id' => $combo_id, 'status' => 1])->first();
|
|
|
|
|
if (!$combo_info) return \Yz::echoError1("套餐不存在");
|
|
|
|
|
if (!isset($combo_info->checkup_type_id)) return \Yz::echoError1("套餐未关联体检类型");
|
|
|
|
|
$checkup_type_id = $combo_info->checkup_type_id;
|
|
|
|
|
|
|
|
|
|
//构建多选一数据
|
|
|
|
|
if (isset($duo_xuan_yi) and !empty($duo_xuan_yi)) {
|
|
|
|
|
$combo_Nx1 = json_decode($combo_info->duo_xuan_yi, true);
|
|
|
|
|
foreach ($duo_xuan_yi as $r_k => $r_v) {
|
|
|
|
|
foreach ($combo_Nx1 as $k => $n1v) {
|
|
|
|
|
if ($r_v['zu_name'] == $n1v['组名称']) {
|
|
|
|
|
foreach ($n1v['包含项目'] as $k2 => $v2) {
|
|
|
|
|
if ($v2['Id'] == $r_v['item_id']) {
|
|
|
|
|
if ($v2['科室名称'] == '影像科') {
|
|
|
|
|
$buy_info['nmr_list'][] = [
|
|
|
|
|
'item_id' => $v2['Id'],
|
|
|
|
|
'name' => $v2['名称'],
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
$Nx1_arrInfo[] = [
|
|
|
|
|
'id' => $v2['Id'],
|
|
|
|
|
'name' => $v2['名称'],
|
|
|
|
|
'price' => 0
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$TJ_Leixing_id = $checkup_type_id;
|
|
|
|
|
$price += $combo_info->price;
|
|
|
|
|
$title = $combo_info->name;
|
|
|
|
|
$buy_info['combo'] = [
|
|
|
|
|
'id' => $combo_info->combo_id,
|
|
|
|
|
'name' => $combo_info->name,
|
|
|
|
|
'price' => $combo_info->price,
|
|
|
|
|
];
|
|
|
|
|
//如果有影像科,则存储在nmr_list字段
|
|
|
|
|
$comboItem = DB::table('combo_items')->where(['combo_id' => $combo_id, 'status' => 1, 'keshi_name' => '影像科'])->get();
|
|
|
|
|
if (count($comboItem) > 0) {
|
|
|
|
|
foreach ($comboItem as $item) {
|
|
|
|
|
$buy_info['nmr_list'][] = [
|
|
|
|
|
'item_id' => $item->item_id,
|
|
|
|
|
'name' => $item->name,
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//如果有自选项目
|
|
|
|
|
$items_list = [];
|
|
|
|
|
if (count($item_ids) != 0) {
|
|
|
|
|
$items_list = DB::table('items')->whereIn('item_id', $item_ids)->where(['status' => 1])->get();
|
|
|
|
|
$existingIds = [];
|
|
|
|
|
$item_price = 0;
|
|
|
|
|
foreach ($items_list as $item) {
|
|
|
|
|
$item_price += $item->price;
|
|
|
|
|
$existingIds[] = $item->item_id;
|
|
|
|
|
$buy_info['items'][] = [
|
|
|
|
|
'id' => $item->item_id,
|
|
|
|
|
'name' => $item->name,
|
|
|
|
|
'price' => $item->price
|
|
|
|
|
];
|
|
|
|
|
//如果有影像科,则存储在nmr_list字段
|
|
|
|
|
if ($item->keshi_name == '影像科') {
|
|
|
|
|
$buy_info['nmr_list'][] = [
|
|
|
|
|
'item_id' => $item->item_id,
|
|
|
|
|
'name' => $item->name,
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (isset($wj_flag) and $wj_flag == 1) {
|
|
|
|
|
$item_price = $item_price * $wj_zhekou;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$price += $item_price;
|
|
|
|
|
$missingIds = array_diff($item_ids, $existingIds);
|
|
|
|
|
if (count($missingIds) > 0) return \Yz::echoError1("部分自选项目不可用,Id:" . implode(', ', $missingIds));
|
|
|
|
|
}
|
|
|
|
|
//如果有 多选一项目
|
|
|
|
|
if (!empty($Nx1_arrInfo)) {
|
|
|
|
|
$buy_info['items'] = array_merge($buy_info['items'], $Nx1_arrInfo);
|
|
|
|
|
}
|
|
|
|
|
$true_price = $price;
|
|
|
|
|
|
|
|
|
|
//如果是团检
|
|
|
|
|
$group_info = false;
|
|
|
|
|
if ($type == 2) {
|
|
|
|
|
$P = new PersonController();
|
|
|
|
|
$data = [
|
|
|
|
|
'电话号码' => null,
|
|
|
|
|
'证件号码' => null,
|
|
|
|
|
'预约Id' => $group_id
|
|
|
|
|
];
|
|
|
|
|
$group_info = $P->group_info($hospital_id, $data);
|
|
|
|
|
$group_info = $group_info[0];
|
|
|
|
|
|
|
|
|
|
//如果有多选一项目
|
|
|
|
|
//构建多选一数据
|
|
|
|
|
$Nx1_arrInfo = [];
|
|
|
|
|
if (isset($duo_xuan_yi) and !empty($duo_xuan_yi)) {
|
|
|
|
|
foreach ($duo_xuan_yi as $r_k => $r_v) {
|
|
|
|
|
$Nx1_arrInfo[] = [
|
|
|
|
|
'id' => $r_v['item_id'],
|
|
|
|
|
'name' => $r_v['item_name'],
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
$group_info['items'] = array_merge($group_info['items'], $Nx1_arrInfo); //合并多选一
|
|
|
|
|
|
|
|
|
|
$buy_info['group'] = [
|
|
|
|
|
'id' => $group_id,
|
|
|
|
|
'combo_name' => $group_info['combo_name'],
|
|
|
|
|
'combo_id' => $group_info['combo_id'],
|
|
|
|
|
'group_name' => $group_info['group_name'],
|
|
|
|
|
'items' => $group_info['items'],
|
|
|
|
|
'group_id' => $group_info['group_id'],
|
|
|
|
|
'have_Nx1' => !empty($Nx1_arrInfo)
|
|
|
|
|
];
|
|
|
|
|
$TJ_Leixing_id = $group_info['checkup_type_id'];
|
|
|
|
|
$title = "单位团检" . $group_info['combo_name'];
|
|
|
|
|
$price = $price + $group_info['sixi_zong_ji_jin_e'];
|
|
|
|
|
$need_pay = ($price - $group_info['tongshou_xiane']) > 0 ? $price - $group_info['tongshou_xiane'] : 0;
|
|
|
|
|
//团检订单金额为减去统收后的金的
|
|
|
|
|
$price = $need_pay;
|
|
|
|
|
$true_price = $need_pay;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//如果有影像科,则存储在nmr_list字段
|
|
|
|
|
$all_items = DB::table('items')->where(['status' => 1, 'keshi_name' => '影像科'])->get();
|
|
|
|
|
foreach ($group_info['items'] as $item) {
|
|
|
|
|
foreach ($all_items as $it) {
|
|
|
|
|
if ($it->item_id == $item['id']) {
|
|
|
|
|
$buy_info['nmr_list'][] = [
|
|
|
|
|
'item_id' => $it->item_id,
|
|
|
|
|
'name' => $it->name,
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//调用思信接口判断各个项目是否可用
|
|
|
|
|
$check_items = [];
|
|
|
|
|
foreach ($item_ids as $item_id) {
|
|
|
|
|
$check_items[] = ['Id' => $item_id];
|
|
|
|
|
}
|
|
|
|
|
if ((isset($combo_id) and $combo_id <> 0) || count($check_items) != 0) {
|
|
|
|
|
$item_check = self::item_check($hospital_id, [
|
|
|
|
|
'人员信息列表' => [[
|
|
|
|
|
"序号" => 0,
|
|
|
|
|
"性别" => $person->sex == 1 ? '男' : '女',
|
|
|
|
|
"年龄" => floor((time() - strtotime($person->birthday)) / 86400 / 360),
|
|
|
|
|
"婚姻状态" => $person->married == 1 ? '已婚' : '未婚',
|
|
|
|
|
]],
|
|
|
|
|
'套餐Id' => $combo_id == 0 ? null : $combo_id,
|
|
|
|
|
'可选项目信息' => $check_items,
|
|
|
|
|
]);
|
|
|
|
|
if (count($item_check['data']) != 1) {
|
|
|
|
|
return \Yz::echoError1("体检系统提示:" . $item_check['message']);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$plan_nmr_appointment_info = [];
|
|
|
|
|
//校验积分和预存款
|
|
|
|
|
$env = config('app.globals.Env');
|
|
|
|
|
$AspNet = new AspNetZhuanController();
|
|
|
|
|
if ($env == 'pro') { //如果是正式环境, 测试环境不抵扣
|
|
|
|
|
if ($jifen > 0) {
|
|
|
|
|
$all_jifen = $AspNet::GetJiFen_YuCunKuan(1, $person->ghzid);
|
|
|
|
|
if ($jifen > $all_jifen) return \Yz::echoError1("用户剩余积分不足");
|
|
|
|
|
}
|
|
|
|
|
if ($yucunkuan > 0) {
|
|
|
|
|
// return \Yz::echoError1("暂不支持预存款");
|
|
|
|
|
$all_yucunkuan = $AspNet::GetJiFen_YuCunKuan(2, $person->ghzid);
|
|
|
|
|
if ($yucunkuan > $all_yucunkuan) return \Yz::echoError1("用户剩余预存款不足");
|
|
|
|
|
}
|
|
|
|
|
$true_price = $true_price - ($jifen + $yucunkuan);
|
|
|
|
|
if ($true_price < -1) return \Yz::echoError1("预抵扣金额超过订单金额,操作失败");
|
|
|
|
|
if ($true_price < 0) $true_price = 0;
|
|
|
|
|
//如果有二线号源,根据体检时间查询二线可用号源,区分上下午,二线需预约体检时间1小时后
|
|
|
|
|
$plan_nmr_info = [];
|
|
|
|
|
if (isset($erxian_info) and !empty($erxian_info)) {
|
|
|
|
|
foreach ($erxian_info as $erxian_item) {
|
|
|
|
|
$temp_date = [
|
|
|
|
|
"item_id" => $erxian_item['item_id'],
|
|
|
|
|
"name" => $erxian_item['name'],
|
|
|
|
|
"price" => $erxian_item['price'],
|
|
|
|
|
];
|
|
|
|
|
$plan_nmr_info[] = $temp_date;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//使用优惠券
|
|
|
|
|
if (isset($coupon_id) and !empty($coupon_id)) {
|
|
|
|
|
if ($true_price == 0) return \Yz::echoError1("金额为0,无需使用优惠券");
|
|
|
|
|
$use_quan = $this->useYouHuiQuan($true_price, $person, $coupon_id);
|
|
|
|
|
$quanInfo = $use_quan['quanInfo'];
|
|
|
|
|
$true_price = $use_quan['price'];
|
|
|
|
|
}
|
|
|
|
|
$now_datetime = date('Y-m-d H:i:s');
|
|
|
|
|
//构建订单号
|
|
|
|
|
$order_num = $this->generateOrderNumber();
|
|
|
|
|
|
|
|
|
|
$data = [
|
|
|
|
|
'title' => $title,
|
|
|
|
|
'type' => $type,
|
|
|
|
|
'web_user_id' => $user->id,
|
|
|
|
|
'checkup_type_id' => $TJ_Leixing_id,
|
|
|
|
|
'person_id' => $person->id,
|
|
|
|
|
'name' => $person->name,
|
|
|
|
|
'id_number' => $person->id_number,
|
|
|
|
|
'buy_info' => json_encode($buy_info, JSON_UNESCAPED_UNICODE),
|
|
|
|
|
'price' => $price,
|
|
|
|
|
'true_price' => number_format($true_price, 2, '.', ''),
|
|
|
|
|
'jifen' => $jifen,
|
|
|
|
|
'yucunkuan' => $yucunkuan,
|
|
|
|
|
'order_number' => $order_num,
|
|
|
|
|
'status' => 99, //先标记为异常,方法最底部更新为正常状态
|
|
|
|
|
'erxian_appointment_info' => json_encode($plan_nmr_info, JSON_UNESCAPED_UNICODE),
|
|
|
|
|
'combo_id' => $combo_id,
|
|
|
|
|
'hospital_id' => $hospital_id,
|
|
|
|
|
'doctor' => $doctor,
|
|
|
|
|
'phone' => $person->phone,
|
|
|
|
|
'sex' => $person->sex,
|
|
|
|
|
'birthday' => $person->birthday,
|
|
|
|
|
'married' => $person->married,
|
|
|
|
|
'wj_flag' => $wj_flag,
|
|
|
|
|
'youhuiquan' => $quanInfo === false ? '' : json_encode(['id' => $quanInfo['DZJID'], 'name' => $quanInfo['DZJLBMC']], JSON_UNESCAPED_UNICODE),
|
|
|
|
|
'created_at' => $now_datetime,
|
|
|
|
|
'paycheck_time' => $now_datetime
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$insert = DB::table('orders')->insertGetId($data);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//调用接口扣除积分和预存款、优惠券
|
|
|
|
|
$jifen_dikou_status = true;
|
|
|
|
|
$yucunkuan_dikou_status = true;
|
|
|
|
|
$youhuiquan_dikou_status = true;
|
|
|
|
|
|
|
|
|
|
if ($env == 'pro') { //如果是正式环境
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$nowDateTime = date('Y-m-d H:i:s');
|
|
|
|
|
|
|
|
|
|
if ($jifen > 0) {
|
|
|
|
|
$jifen_dikou_status = false;
|
|
|
|
|
$jifen_dikou_status = $AspNet::UseJiFen($person->ghzid, -$jifen, $yyid, $insert, 'tj_h5', '抵扣体检H5订单', $now_datetime);
|
|
|
|
|
}
|
|
|
|
|
if ($yucunkuan > 0) {
|
|
|
|
|
$yucunkuan_dikou_status = false;
|
|
|
|
|
$yucunkuan_dikou_status = $AspNet::UseYuCunKuan($person->ghzid, -$yucunkuan, $yyid, 0, $insert, 'tj_h5', '抵扣体检H5订单', $now_datetime);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//核销优惠券
|
|
|
|
|
if (isset($coupon_id) and !empty($coupon_id)) {
|
|
|
|
|
$youhuiquan_dikou_status = false;
|
|
|
|
|
$data = [
|
|
|
|
|
'action' => 3,
|
|
|
|
|
'ghzid' => $person->ghzid,
|
|
|
|
|
'dzjid' => $coupon_id,
|
|
|
|
|
'hxbz' => "抵扣体检H5订单",
|
|
|
|
|
'yyid' => $yyid
|
|
|
|
|
];
|
|
|
|
|
$youhuiquan_dikou_status = $AspNet::YouHuiQuan($data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($insert and $jifen_dikou_status and $yucunkuan_dikou_status and $youhuiquan_dikou_status) {
|
|
|
|
|
//中途未报错,更新订单为待支付
|
|
|
|
|
DB::table('orders')->where('id', $insert)->update([
|
|
|
|
|
'status' => 1 //标记为待支付
|
|
|
|
|
]);
|
|
|
|
|
$action = false;
|
|
|
|
|
if ($true_price == 0) {
|
|
|
|
|
DB::table('orders')->where('id', $insert)->update([
|
|
|
|
|
'status' => 2 //标记为已支付
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
if ($true_price > 0) {
|
|
|
|
|
//如果大于0则提示前端去支付
|
|
|
|
|
$action = "pay";
|
|
|
|
|
}
|
|
|
|
|
return \Yz::return(true, "操作成功", ['action' => $action, 'orderid' => $insert]);
|
|
|
|
|
} else {
|
|
|
|
|
return \Yz::echoError1('操作失败');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|