|
|
<?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("体检类型不能为空");
|
|
|
if(empty($hospital_id)) $hospital_id=1;
|
|
|
|
|
|
$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("体检类型不能为空");
|
|
|
if(empty($hospital_id)) $hospital_id=1;
|
|
|
$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]);
|
|
|
}
|
|
|
}
|
|
|
}
|