预约功能更新

This commit is contained in:
vijay 2024-09-02 14:47:14 +08:00
parent 87e791e853
commit f5f09c89da
4 changed files with 260 additions and 113 deletions

View File

@ -202,6 +202,65 @@ class Customers extends EA_Controller
}
}
/**
* Filter customers by the provided keyword.
*/
public function search_by_phone(): void
{
$phoneNumber = request('phone_number', '');
if (empty($phoneNumber)) {
// 返回错误信息
echo json_encode(['success' => false, 'message' => 'Invalid phone number']);
return;
}
// 查询数据库中的预约信息
$appointments = $this->appointments_model->get_appointments_by_phone($phoneNumber);
foreach ($appointments as &$appointment) {
$this->appointments_model->load($appointment, ['service', 'provider']);
}
if (!empty($appointments)) {
// 返回预约信息
echo json_encode(['success' => true, 'appointments' => $appointments]);
} else {
// 如果没有找到预约信息
echo json_encode(['success' => false, 'message' => 'No appointments found']);
}
}
public function cancel(): void
{
try {
$appointmentId = request('appointmentId');
// 查找指定的预约记录
$appointment = $this->appointments_model->find($appointmentId);
if ($appointment) {
// 更新状态为 '取消'
$appointment['status'] = '取消';
// 保存更新后的预约记录
$this->appointments_model->save($appointment);
json_response([
'success' => true,
'id' => $appointmentId,
]);
} else {
// 处理预约记录不存在的情况
json_response([
'success' => false,
'message' => '預約記錄不存在。',
], 404);
}
} catch (Throwable $e) {
json_exception($e);
}
}
/**
* Store a new customer.
*/

View File

@ -649,7 +649,7 @@ class Appointments_model extends EA_Model
->like('providers.phone_number', $phone_number)
->or_like('customers.phone_number', $phone_number)
->group_end()
->where('appointments.start_datetime >=', date('Y-m-d H:i:s')) // 过滤掉当天00点之前的预约
// ->where('appointments.start_datetime >=', date('Y-m-d H:i:s')) // 过滤掉当天00点之前的预约
->limit($limit)
->offset($offset)
->order_by($order_by)
@ -662,4 +662,5 @@ class Appointments_model extends EA_Model
return $appointments;
}
}

View File

@ -1,5 +1,6 @@
<!doctype html>
<html lang="<?= config('language_code') ?>">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
@ -38,9 +39,11 @@
flex-direction: column;
min-height: 44.2vh;
}
.search-container-title {
color: #666666;
}
.search-container {
display: flex;
flex-direction: column;
@ -49,6 +52,7 @@
max-width: 400px;
margin-bottom: 20px;
}
.search-container input {
width: 100%;
padding: 10px;
@ -56,6 +60,7 @@
border-radius: 5px;
border: 1px solid #ccc;
}
.search-container button {
padding: 10px 20px;
background-color: #429a82;
@ -65,12 +70,15 @@
cursor: pointer;
width: 100%;
}
.appointments-container {
display: none;
width: 100%;
max-width: 600px;
margin-top: 20px;
padding: 0 12px;
}
.no-appointments {
display: none;
color: red;
@ -144,14 +152,11 @@
<script src="<?= asset_url('assets/js/utils/string.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/validation.js') ?>"></script>
<script src="<?= asset_url('assets/js/layouts/booking_layout.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/localization_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/customers_search_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/customers.js') ?>"></script>
<script>
document.getElementById('searchButton').addEventListener('click', function() {
function doSearch() {
var phoneNumber = document.getElementById('phoneNumber').value;
if (phoneNumber.trim() === '') {
@ -160,28 +165,50 @@
}
// 发送请求前获取CSRF token
var csrfToken = document.querySelector('meta[name="csrf_token"]').getAttribute('content');
//var csrfToken = document.querySelector('meta[name="csrf_token"]').getAttribute('content');
const url = App.Utils.Url.siteUrl('customers/search_by_phone');
const data = {
csrf_token: vars('csrf_token'),
phone_number: phoneNumber,
};
$.post(url, data).done((response) => {
// console.log('data',typeof(data));
const data = JSON.parse(response);
fetch('/index.php/appointmentSearch/search_by_phone', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': csrfToken // 添加CSRF Token到请求头
},
body: JSON.stringify({ phone_number: phoneNumber })
})
.then(response => response.json())
.then(data => {
if (data.success && data.appointments.length > 0) {
displayAppointments(data.appointments);
} else {
showNoAppointmentsMessage();
}
})
.catch(error => {
console.error('Error fetching appointments:', error);
showNoAppointmentsMessage();
});
}
document.getElementById('searchButton').addEventListener('click', function() {
doSearch();
// fetch('/index.php/customers/search_by_phone', {
// method: 'POST',
// headers: {
// 'Content-Type': 'application/json',
// //'X-CSRF-TOKEN': csrfToken // 添加CSRF Token到请求头
// },
// body: formData
// })
// .then(response => response.json())
// .then(data => {
// if (data.success && data.appointments.length > 0) {
// displayAppointments(data.appointments);
// } else {
// showNoAppointmentsMessage();
// }
// })
// .catch(error => {
// console.error('Error fetching appointments:', error);
// showNoAppointmentsMessage();
// });
});
function displayAppointments(appointments) {
@ -191,7 +218,66 @@
appointmentsList.innerHTML = '';
appointments.forEach(function(appointment) {
var listItem = document.createElement('li');
listItem.textContent = `预约时间:${appointment.start_datetime}提供者ID${appointment.id_users_provider}`;
// 创建服务名称和提供者姓名的 div
var serviceDiv = document.createElement('div');
serviceDiv.textContent = `${appointment.service.name} - ${appointment.provider.last_name}${appointment.provider.first_name}`;
// 创建预约时间的 div
var timeDiv = document.createElement('div');
timeDiv.textContent = `開始時間:${appointment.start}`;
// 创建结束时间的 div
var endDiv = document.createElement('div');
endDiv.textContent = `結束時間:${appointment.end}`;
// 创建状态的 div
var statusDiv = document.createElement('div');
statusDiv.textContent = `狀態:${appointment.status}`;
// 将每个 div 添加到 li 中
listItem.appendChild(serviceDiv);
listItem.appendChild(timeDiv);
listItem.appendChild(endDiv);
listItem.appendChild(statusDiv);
// 如果状态是“已预约”,添加取消预约按钮
if (appointment.status === '已預約') {
var cancelButton = document.createElement('button');
cancelButton.textContent = '取消預約';
cancelButton.className = 'btn btn-danger'; // 添加一些样式类名
cancelButton.addEventListener('click', function() {
// 确认对话框
var confirmCancel = confirm('您確定要取消這個預約嗎?');
if (confirmCancel) {
// 添加取消预约的逻辑
// 例如,发起一个请求到服务器取消预约
console.log(`取消預約:${appointment.id}`);
// 这里可以添加实际的请求代码
const url = App.Utils.Url.siteUrl('customers/cancel');
const data = {
csrf_token: vars('csrf_token'),
appointmentId: appointment.id,
};
$.post(url, data).done((data) => {
// console.log('data',response);
if (data.success) {
//重新加载
doSearch();
alert('取消預約成功。');
} else {
alert('取消預約失敗。');
}
});
}
});
listItem.appendChild(cancelButton);
}
// 将 li 添加到 ul 或 ol 列表中
appointmentsList.appendChild(listItem);
});
@ -217,4 +303,5 @@
<?php slot('scripts'); ?>
</body>
</html>