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.

416 lines
16 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace App\Http\Controllers\API\H5;
use App\Http\Controllers\Controller;
use DateTime;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class PlanController extends Controller
{
//获取本月每日剩余号源数量
public function GetMonthPlanCount()
{
$hospital_id = request('hospital');
$openid = request('openid');
$person_id = request('person_id');
$combo_id = request('combo_id');
$month = request('month');
$use_type = request('use_type');//使用类型 1个检 2团检
$checkup_type_id = request('checkup_type_id');//体检类型表对应id
$amount = request('amount');//总金额
if (!isset($checkup_type_id)) return \Yz::echoError1("体检类型不能为空");
$danwei_id = request('danwei_id');//单位id
$first_day_timestamp = strtotime($month . '-01');
$first_day = date('Y-m-d', $first_day_timestamp); //当月第一天
$last_day_timestamp = strtotime($month . '-01 +1 month -1 day');
$last_day = date('Y-m-d', $last_day_timestamp); //当月最后一天
$currentDateTime = now();
$list = DB::table('plans')
->whereBetween('date', [$first_day, $last_day])->whereIn('status', [1])
->whereRaw('CONCAT(date, " ", time) >?', [$currentDateTime])
->whereRaw('JSON_CONTAINS(checkup_type_id, ?, "$")', [json_encode($checkup_type_id)])
->where(['hospital_id' => $hospital_id, 'type' => 1, 'is_del' => 0,'is_lock' => 0])
->where('is_vip', '<>', 1)
->whereIn('use_type', [0, $use_type]);
if (!!$combo_id) {
$comboInfo = DB::table('combos')->where(['combo_id' => $combo_id])->first();
if (!empty($comboInfo->keyue_start_time) and !empty($comboInfo->keyue_end_time)) {
$list = $list->whereBetween('time', [$comboInfo->keyue_start_time, $comboInfo->keyue_end_time]);
}
}
if (!empty($danwei_id)) {
$cha_bind_danwei = DB::table('plan_type')->WhereRaw('JSON_CONTAINS(bind_units, ?)', [json_encode($danwei_id)])->where(['is_del' => 0])->get();
if (count($cha_bind_danwei) > 0) {
$list = $list->WhereRaw('JSON_CONTAINS(bind_work_unit_id, ?)', [json_encode($danwei_id)]);
} else {
$list = $list
->where(function ($query) use ($danwei_id) {
// 检查 bind_work_unit_id 为 NULL 或空字符串
$query->whereNull('bind_work_unit_id')
->orWhere('bind_work_unit_id', '=', '');
});
}
}
if (isset($person_id)) {
$personInfo = DB::table('web_user_person')->where(['id' => $person_id])->first();
if (!!$personInfo) {
$list = $list->whereIn('sex', [0, $personInfo->sex]);
}
}
if ($use_type == 1) {
$list = $list->where(function ($query) use ($amount) {
$query->where('amount_limit1', 0)->orWhere('amount_limit1', '>=', $amount);
});
}
if ($use_type == 2) {
$list = $list->where(function ($query) use ($amount) {
$query->where('amount_limit2', 0)->orWhere('amount_limit2', '>=', $amount);
});
}
$list = $list->select('date', DB::raw('COUNT(*) as count'));
$list = $list->groupBy('date')->get();
//如果是婚检不是星期二、五、六数量设置为0
if ($checkup_type_id == 4) {
$dates = array();
foreach ($list as $item) {
$date = $item->date;
$dayOfWeek = date('N', strtotime($date));
if (in_array($dayOfWeek, config('app.globals.HunJianXingQi'))) {
$dates[] = $item;
}
}
$list = $dates;
}
//获取整月日期
// 获取当月的第一天
$firstDay = date("Y-m-d", strtotime($month . "-01"));
// 获取当月的最后一天
$lastDay = date("Y-m-t", strtotime($month));
$dates = array();
$k = 0;
for ($i = $firstDay; $i <= $lastDay; $i = date("Y-m-d", strtotime($i . " +1 day"))) {
$xingqi = \App\Lib\Tools::GetWeekName($i);
$dates[] = [
'date' => $i,
'xingqi' => $xingqi,
'count' => 0
];
foreach ($list as $item) {
if ($item->date == $i) {
$dates[$k] = [
'date' => $i,
'xingqi' => $xingqi,
'count' => $item->count
];
break;
}
}
$k++;
}
return \Yz::Return(true, "查询完成", ['list' => $dates]);
}
//获取某日号源列表
public function GetDayPlanList()
{
$hospital_id = request('hospital');
$openid = request('openid');
$person_id = request('person_id');
$person_sex = request('person_sex');
$combo_id = request('combo_id');
$item_ids = request('item_ids');
$date = request('date');
$er_xian_info = request('er_xian_info');
$use_type = request('use_type');//使用类型 1个检 2团检
$checkup_type_id = (string)request('checkup_type_id');//体检类型表对应id
$amount = request('amount');//总金额
$big_date = request('big_date');//从月历选择的日期然后返回这个日期7天内的所有日期
if(!isset($big_date)) $big_date=date('Y-m-d');
if (!isset($checkup_type_id)) return \Yz::echoError1("体检类型不能为空");
$danwei_id = request('danwei_id');//单位名称
$personInfo = false;
if (isset($person_id)) {
$personInfo = DB::table('web_user_person')->where(['id' => $person_id])->first();
}
$currentDateTime = now();
$list = DB::table('plans')
->where('date', $date)->whereIn('status', [1, 2])
// ->whereRaw('CONCAT(date, " ", time) >?', [$currentDateTime])
->whereRaw('JSON_CONTAINS(checkup_type_id, ?, "$")', [$checkup_type_id])
->where(['hospital_id' => $hospital_id, 'type' => 1, 'is_del' => 0])
->where('is_vip', '<>', 1)
->whereIn('use_type', [0, $use_type]);
if (!empty($danwei_id)) {
$cha_bind_danwei = DB::table('plan_type')->WhereRaw('JSON_CONTAINS(bind_units, ?)', [json_encode($danwei_id)])->where(['is_del' => 0])->get();
if (count($cha_bind_danwei) > 0) {
$list = $list->WhereRaw('JSON_CONTAINS(bind_work_unit_id, ?)', [json_encode($danwei_id)]);
} else {
$list = $list
->where(function ($query) use ($danwei_id) {
// 检查 bind_work_unit_id 为 NULL 或空字符串
$query->whereNull('bind_work_unit_id')
->orWhere('bind_work_unit_id', '=', '');
});
}
}
$comboItemsNmr = [];
if (!!$combo_id) {
$comboInfo = DB::table('combos')->where(['combo_id' => $combo_id])->first();
if (!empty($comboInfo->keyue_start_time) and !empty($comboInfo->keyue_end_time)) {
$list = $list->whereBetween('time', [$comboInfo->keyue_start_time, $comboInfo->keyue_end_time]);
}
$comboItemsNmr = DB::table('combo_items')->where(['combo_id' => $combo_id])->where('name', 'like', '%磁%')->get();
}
$ItemsNmr = [];//自选核磁项目
if (isset($item_ids) and !empty($item_ids)) {
$ItemsNmr = DB::table('items')->whereIn('item_id', $item_ids)->where('name', 'like', '%磁%')->get();
}
if (!!$personInfo) {
$list = $list->whereIn('sex', [0, $personInfo->sex]);
}
if (isset($person_sex)) {
$list = $list->whereIn('sex', [0, $person_sex]);
}
if ($use_type == 1) {
$list = $list->where(function ($query) use ($amount) {
$query->where('amount_limit1', 0)->orWhere('amount_limit1', '>=', $amount);
});
}
if ($use_type == 2) {
$list = $list->where(function ($query) use ($amount) {
$query->where('amount_limit2', 0)->orWhere('amount_limit2', '>=', $amount);
});
}
$list = $list->orderBy('time', 'asc')->get();
if (count($comboItemsNmr) > 0 or count($ItemsNmr) > 0 or !empty($er_xian_info)) {
//如果有核磁项目11点往后的号源不可用
foreach ($list as $key => $item) {
if ($item->time > '11:00:00' and $item->time <= '12:00:00') {
// $list[$key]->status = 2; //要求放开全天核磁
}
}
}
//如果是婚检不是星期二、五、六数量设置为0
if ($checkup_type_id == 4) {
$dayOfWeek = date('N', strtotime($date));
if (!in_array($dayOfWeek, config('app.globals.HunJianXingQi'))) {
$list = [];
}
}
if(isset($openid))
{
$user = DB::table('web_users')->where(['openid' => $openid, 'is_del' => 0])->first();
if (!$user) return \Yz::echoError1("openid对应用户不存在");
foreach ($list as $key=> $l) {
//判断锁定
if($l->is_lock==1 and $l->lock_user_id==$user->id){
$list[$key]->is_lock=0;
}
//判断是否超时,超时设置为已经被占用,不可用
if($l->date . ' '.$l->time< date('Y-m-d H:i:s') ){
$list[$key]->status=2;
}
}
}
// 获取前后各三天的日期
$dateTime = new DateTime($big_date);
$days7 = [];
for ($i = 0; $i < 7; $i++) {
$dateTimeClone = clone $dateTime; // 克隆对象以避免修改原对象
$dateTimeClone->modify("$i days"); // 修改日期
$days7[] = $dateTimeClone->format('Y-m-d'); // 按照需要的格式添加到结果数组
}
$weeklist = DB::table('plans')
->whereBetween('date', [$days7[0], $days7[6]])->whereIn('status', [1])
->whereRaw('CONCAT(date, " ", time) >?', [$currentDateTime])
->whereRaw('JSON_CONTAINS(checkup_type_id, ?, "$")', [$checkup_type_id])
->where(['hospital_id' => $hospital_id, 'type' => 1, 'is_del' => 0])
->where('is_vip', '<>', 1)
->whereIn('use_type', [0, $use_type]);
if(isset($user)){
$weeklist = $weeklist
->where(function ($query) use ($user) {
$query->where('is_lock', '=', 0)
->orWhere(function ($query) use ($user) {
$query->where('is_lock', 1) // 已锁定但属于当前用户
->where('lock_user_id', $user->id);
});
});
}
if (!empty($danwei_id)) {
$cha_bind_danwei = DB::table('plan_type')->WhereRaw('JSON_CONTAINS(bind_units, ?)', [json_encode($danwei_id)])->where(['is_del' => 0])->get();
if (count($cha_bind_danwei) > 0) {
$weeklist = $weeklist->WhereRaw('JSON_CONTAINS(bind_work_unit_id, ?)', [json_encode($danwei_id)]);
} else {
$weeklist = $weeklist
->where(function ($query) use ($danwei_id) {
// 检查 bind_work_unit_id 为 NULL 或空字符串
$query->whereNull('bind_work_unit_id')
->orWhere('bind_work_unit_id', '=', '');
});
}
}
if (count($comboItemsNmr) > 0 or count($ItemsNmr) > 0 or !empty($er_xian_info)) {
//如果有核磁项目11点往后的号源不可用
//$weeklist = $weeklist->where('time', '<=', '11:00'); //要求放开全天核磁
}
if (!!$combo_id) {
$comboInfo = DB::table('combos')->where(['combo_id' => $combo_id])->first();
if (!empty($comboInfo->keyue_start_time) and !empty($comboInfo->keyue_end_time)) {
$weeklist = $weeklist->whereBetween('time', [$comboInfo->keyue_start_time, $comboInfo->keyue_end_time]);
}
if (count($comboItemsNmr) > 0) {
// $weeklist = $weeklist->whereNotBetween('time', ['11:00:00', '12:00:00']); //要求放开全天核磁
}
}
if (!!$personInfo) {
$weeklist = $weeklist->whereIn('sex', [0, $personInfo->sex]);
}
if ($use_type == 1) {
$weeklist = $weeklist->where(function ($query) use ($amount) {
$query->where('amount_limit1', 0)->orWhere('amount_limit1', '>=', $amount);
});
}
if ($use_type == 2) {
$weeklist = $weeklist->where(function ($query) use ($amount) {
$query->where('amount_limit2', 0)->orWhere('amount_limit2', '>=', $amount);
});
}
$weeklist = $weeklist->select('date', DB::raw('COUNT(*) as count'));
$weeklist = $weeklist->groupBy('date')->get();
//如果是婚检不是星期二、五、六数量设置为0
if ($checkup_type_id == 4) {
$dates = array();
foreach ($weeklist as $item) {
$date = $item->date;
$dayOfWeek = date('N', strtotime($date));
if (in_array($dayOfWeek, config('app.globals.HunJianXingQi'))) {
$dates[] = $item;
}
}
$weeklist = $dates;
}
$week7 = [];
$k = 0;
foreach ($days7 as $date) {
$xingqi = \App\Lib\Tools::GetWeekName($date);
$week7[] = [
'date' => $date,
'count' => 0,
'xingqi' => $xingqi
];
foreach ($weeklist as $plan) {
if ($plan->date == $date) {
$week7[$k] = [
'date' => $date,
'xingqi' => $xingqi,
'count' => $plan->count
];
break;
}
}
$k++;
}
return \Yz::Return(true, "查询完成", ['list' => $list, 'weeklist' => $week7]);
}
//检查号源是否可用
public function CheckPlan($plan_id, $hospital_id, $type, $sex, $price, $checkup_type_id,$user_id=0)
{
$plan = DB::table('plans')->where(['id' => $plan_id, 'hospital_id' => $hospital_id, 'status' => 1, 'is_del' => 0])->first();
if (!$plan) return ['status' => false, 'msg' => "号源不可用"];
if($plan->is_lock==1 and $plan->lock_user_id<>$user_id){ //判断锁定
return ['status' => false, 'msg' => "号源不可用"];
}
//判断个检/团检类型
if ($plan->use_type <> 0 and $plan->use_type <> $type) {
$type_temp = '';
if ($plan->use_type == 1) $type_temp = '个检';
if ($plan->use_type == 2) $type_temp = '团检';
return ['status' => false, 'msg' => "此号源为" . $type_temp . "号源,不可用"];
}
//判断是否是预留号源
if ($plan->type <> 1) return ['status' => false, 'msg' => "此号源为预留号源,不可用"];
//判断是否是vip
//判断性别
if ($plan->sex <> 0 and $plan->sex <> $sex) return ['status' => false, 'msg' => "此号源性别与体检人性别不符,不可用"];
//判断体检类型checkup_type
if (!!$checkup_type_id) {
$checkup_type_array = json_decode($plan->checkup_type_id, true);
if (!in_array($checkup_type_id, $checkup_type_array)) {
return ['status' => false, 'msg' => "此号源体检类型与套餐不匹配,不可用"];
}
}
//判断金额
if ($plan->use_type == 1 and $plan->amount_limit1 <> 0) {
if ($price < $plan->amount_limit1) return ['status' => false, 'msg' => "未达到此号源限制的金额,不可用"];
}
if ($plan->use_type == 2 and $plan->amount_limit2 <> 0) {
if ($price < $plan->amount_limit2) return ['status' => false, 'msg' => "未达到此号源限制的金额,不可用"];
}
//判断时间是否过期
$plan_datetime = $plan->date . ' ' . $plan->time;
if ($plan_datetime < date('Y-m-d H:i:s')) return ['status' => false, 'msg' => "号源已过期,不可用"];
return ['status' => true, 'msg' => "", 'plan' => $plan];
}
//锁定号源,标记锁定状态,锁定时间,超过锁定时间自动释放
public function LockPlan()
{
$openid = request('openid');
$plan_id = request('plan_id');
$user = DB::table('web_users')->where(['openid' => $openid, 'is_del' => 0])->first();
if (!$user) return \Yz::echoError1("openid对应用户不存在");
$planInfo=DB::table('plans')->where(['id' => $plan_id,'status'=>1,'is_del'=>0])->first();
if(!$planInfo) return \Yz::echoError1("此号源不可用");
if($planInfo->is_lock<>0 and $planInfo->lock_user_id<>$user->id) return \Yz::echoError1("此号源不可用");
$lock_endtime = strtotime('+'.config('app.globals.plan_lock_time').' minutes');
$lock_endtime = date('Y-m-d H:i:s', $lock_endtime);
$u=DB::table('plans')->where(['id' => $plan_id])->update(['is_lock'=>1,'lock_endtime'=>$lock_endtime,'lock_user_id'=>$user->id]);
if($u){
return \Yz::Return(true, "锁定成功", ['plan_id' => $plan_id,'lock_endtime' => $lock_endtime]);
}else{
return \Yz::echoError1("锁定失败");
}
}
//释放锁定
public function UnLockPlan(){
$plan_id = request('plan_id');
$u=DB::table('plans')->where(['id' => $plan_id])->update(['is_lock'=>0,'lock_endtime'=>null,'lock_user_id'=>null]);
if($u){
return \Yz::Return(true, "释放成功", ['plan_id' => $plan_id]);
}else{
return \Yz::Return(false, "释放失败!!!", ['plan_id' => $plan_id]);
}
}
}