预约优化

main
鹿和sa0ChunLuyu 2 weeks ago
parent 82a2e64188
commit eb14f73b32

@ -214,9 +214,10 @@ public function GetOptimalPlan()
$episodeid = request('episodeid'); $episodeid = request('episodeid');
$appointment_type = request('appointment_type'); $appointment_type = request('appointment_type');
$items = request('items'); $items = request('items');
$occupied_plan_ids = request('occupied_plan_ids', []);
$service = new PlanListService(); $service = new PlanListService();
return $service->GetOptimalPlan($type, $regnum, $entrustid, $episodeid, $appointment_type, $items); return $service->GetOptimalPlan($type, $regnum, $entrustid, $episodeid, $appointment_type, $items, 'all', 0, $occupied_plan_ids);
} }
//获取最近可用的,计划 日期 //获取最近可用的,计划 日期

@ -425,7 +425,7 @@ public function GetEnablePlan($regnum, $entrustids, $episodeid, $appointment_typ
} }
//最优时间/单天全检 分配 //最优时间/单天全检 分配
public function GetOptimalPlan($type, $regnum, $entrustids, $episodeid, $appointment_type, $items, $scope = 'all', $userDeptId = 0) public function GetOptimalPlan($type, $regnum, $entrustids, $episodeid, $appointment_type, $items, $scope = 'all', $userDeptId = 0, $occupied_plan_ids = [])
{ {
date_default_timezone_set('PRC'); date_default_timezone_set('PRC');
$dateRange = config('app.globals.可用号源查询范围'); $dateRange = config('app.globals.可用号源查询范围');
@ -435,14 +435,14 @@ public function GetOptimalPlan($type, $regnum, $entrustids, $episodeid, $appoint
$endDate->modify('+' . $dateRange . ' day'); $endDate->modify('+' . $dateRange . ' day');
if ($type === 'full_day') { if ($type === 'full_day') {
return $this->doFullDayAssign($startDate, $endDate, $regnum, $entrustids, $episodeid, $appointment_type, $items, $scope, $userDeptId); return $this->doFullDayAssign($startDate, $endDate, $regnum, $entrustids, $episodeid, $appointment_type, $items, $scope, $userDeptId, $occupied_plan_ids);
} else { } else {
return $this->doOptimalTimeAssign($startDate, $endDate, $regnum, $entrustids, $episodeid, $appointment_type, $items, $scope, $userDeptId); return $this->doOptimalTimeAssign($startDate, $endDate, $regnum, $entrustids, $episodeid, $appointment_type, $items, $scope, $userDeptId, $occupied_plan_ids);
} }
} }
// 最优时间分配:按科室分组,逐个 item 找最早可用号源,可跨天 // 最优时间分配:按科室分组,逐个 item 找最早可用号源,可跨天
private function doOptimalTimeAssign($startDate, $endDate, $regnum, $entrustids, $episodeid, $appointment_type, $items, $scope, $userDeptId) private function doOptimalTimeAssign($startDate, $endDate, $regnum, $entrustids, $episodeid, $appointment_type, $items, $scope, $userDeptId, $occupied_plan_ids = [])
{ {
// 按科室分组 // 按科室分组
$deptGroups = $this->groupItemsByDept($items); $deptGroups = $this->groupItemsByDept($items);
@ -471,6 +471,14 @@ private function doOptimalTimeAssign($startDate, $endDate, $regnum, $entrustids,
$availablePlans = $this->getAvailablePlansForDate($regnum, $groupEntrustids, $episodeid, $appointment_type, $nowdate, $scope, $userDeptId); $availablePlans = $this->getAvailablePlansForDate($regnum, $groupEntrustids, $episodeid, $appointment_type, $nowdate, $scope, $userDeptId);
// 过滤已占用的号源
if (!empty($occupied_plan_ids)) {
$availablePlans = array_filter($availablePlans, function($plan) use ($occupied_plan_ids) {
return !in_array($plan->id, $occupied_plan_ids);
});
$availablePlans = array_values($availablePlans);
}
if (empty($availablePlans)) { if (empty($availablePlans)) {
// 当天该科室无号源,整组留到下一轮 // 当天该科室无号源,整组留到下一轮
$newRemainingGroups[$deptCode] = $group; $newRemainingGroups[$deptCode] = $group;
@ -531,7 +539,7 @@ private function doOptimalTimeAssign($startDate, $endDate, $regnum, $entrustids,
} }
// 单天全检分配:所有 item 必须在同一天完成 // 单天全检分配:所有 item 必须在同一天完成
private function doFullDayAssign($startDate, $endDate, $regnum, $entrustids, $episodeid, $appointment_type, $items, $scope, $userDeptId) private function doFullDayAssign($startDate, $endDate, $regnum, $entrustids, $episodeid, $appointment_type, $items, $scope, $userDeptId, $occupied_plan_ids = [])
{ {
// 按科室分组 // 按科室分组
$deptGroups = $this->groupItemsByDept($items); $deptGroups = $this->groupItemsByDept($items);
@ -549,6 +557,14 @@ private function doFullDayAssign($startDate, $endDate, $regnum, $entrustids, $ep
foreach ($deptGroups as $deptCode => $group) { foreach ($deptGroups as $deptCode => $group) {
$availablePlans = $this->getAvailablePlansForDate($regnum, $group['entrustids'], $episodeid, $appointment_type, $nowdate, $scope, $userDeptId); $availablePlans = $this->getAvailablePlansForDate($regnum, $group['entrustids'], $episodeid, $appointment_type, $nowdate, $scope, $userDeptId);
// 过滤已占用的号源
if (!empty($occupied_plan_ids)) {
$availablePlans = array_filter($availablePlans, function($plan) use ($occupied_plan_ids) {
return !in_array($plan->id, $occupied_plan_ids);
});
$availablePlans = array_values($availablePlans);
}
if (empty($availablePlans)) { if (empty($availablePlans)) {
$allAssigned = false; $allAssigned = false;
break; break;

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="zh-CN">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<link rel="icon" href="/favicon.ico"> <link rel="icon" href="/favicon.ico">

File diff suppressed because it is too large Load Diff

@ -45,6 +45,8 @@
<style scoped> <style scoped>
.DoctorYuYue{ .DoctorYuYue{
height: 100vh;
padding: 10px 20px; padding: 10px 20px;
box-sizing: border-box;
} }
</style> </style>

@ -3,7 +3,7 @@
<el-dialog title="预约列表" class="iframeDialog" v-model="iframe_show" @opened="dialogopened" @closed="closeYuYueDialog()"> <el-dialog title="预约列表" class="iframeDialog" v-model="iframe_show" @opened="dialogopened" @closed="closeYuYueDialog()">
<iframe id="bdIframe" :src="selectedUrl" class="iframe" :key="YuYueKey" scrolling="auto"></iframe> <iframe id="bdIframe" :src="selectedUrl" class="iframe" :key="YuYueKey" scrolling="auto"></iframe>
</el-dialog> </el-dialog>
<el-dialog v-model="YuYueVueDialogVisible" width="100%" @close="closeYuYueDialog()"> <el-dialog v-model="YuYueVueDialogVisible" fullscreen @close="closeYuYueDialog()">
<YuYue202506 :reg_num="tableSelected[0].reg_num" :entrust_ids="entrust_ids" :key="YuYueKey" :episode_id="tableSelected[0].episodeid" appointment_type="4" :dotype="do_type" :do_user="loginUserinfo.id" :special_privileges="loginUserinfo.special_privileges" :scope="'department'"></YuYue202506> <YuYue202506 :reg_num="tableSelected[0].reg_num" :entrust_ids="entrust_ids" :key="YuYueKey" :episode_id="tableSelected[0].episodeid" appointment_type="4" :dotype="do_type" :do_user="loginUserinfo.id" :special_privileges="loginUserinfo.special_privileges" :scope="'department'"></YuYue202506>
</el-dialog> </el-dialog>
<div class="head"> <div class="head">
@ -910,6 +910,18 @@
display: none; display: none;
} }
.el-dialog.is-fullscreen {
display: flex;
flex-direction: column;
}
.el-dialog.is-fullscreen .el-dialog__body {
flex: 1;
overflow: hidden;
display: flex;
flex-direction: column;
}
</style> </style>
<style scoped> <style scoped>

@ -3,7 +3,7 @@
<el-dialog title="预约列表" class="iframeDialog" v-model="iframe_show" @opened="dialogopened" @closed="closeYuYueDialog()"> <el-dialog title="预约列表" class="iframeDialog" v-model="iframe_show" @opened="dialogopened" @closed="closeYuYueDialog()">
<iframe id="bdIframe" :src="selectedUrl" class="iframe" :key="YuYueKey" scrolling="auto"></iframe> <iframe id="bdIframe" :src="selectedUrl" class="iframe" :key="YuYueKey" scrolling="auto"></iframe>
</el-dialog> </el-dialog>
<el-dialog v-model="YuYueVueDialogVisible" width="100%" @close="closeYuYueDialog()"> <el-dialog v-model="YuYueVueDialogVisible" fullscreen @close="closeYuYueDialog()">
<YuYue202506 :reg_num="tableSelected[0].reg_num" :entrust_ids="entrust_ids" :key="YuYueKey" :episode_id="tableSelected[0].episodeid" appointment_type="4" :dotype="do_type" :do_user="loginUserinfo.id" :special_privileges="loginUserinfo.special_privileges" :scope="'department'"></YuYue202506> <YuYue202506 :reg_num="tableSelected[0].reg_num" :entrust_ids="entrust_ids" :key="YuYueKey" :episode_id="tableSelected[0].episodeid" appointment_type="4" :dotype="do_type" :do_user="loginUserinfo.id" :special_privileges="loginUserinfo.special_privileges" :scope="'department'"></YuYue202506>
</el-dialog> </el-dialog>
<div class="head"> <div class="head">
@ -829,6 +829,18 @@
overflow: auto; overflow: auto;
} }
.el-dialog.is-fullscreen {
display: flex;
flex-direction: column;
}
.el-dialog.is-fullscreen .el-dialog__body {
flex: 1;
overflow: hidden;
display: flex;
flex-direction: column;
}
</style> </style>
<style scoped> <style scoped>

Loading…
Cancel
Save