Files
4an-workorder/app/static/js/dispatch.js
T
2025-08-08 10:38:10 +08:00

271 lines
9.5 KiB
JavaScript
Executable File

function handleSelectAll() {
const checkboxes = document.querySelectorAll('input[name="device_ids"]');
const selectAllButton = document.getElementById('selectAllBtn');
const hasSelected = Array.from(checkboxes).some(checkbox => checkbox.checked);
const newState = !hasSelected;
checkboxes.forEach(checkbox => {
checkbox.checked = newState;
});
selectAllButton.textContent = newState ? '清空' : '全选';
}
function handleInvertSelect() {
const checkboxes = document.querySelectorAll('input[name="device_ids"]');
checkboxes.forEach(checkbox => {
checkbox.checked = !checkbox.checked;
});
updateSelectAllButtonText();
}
function updateSelectAllButtonText() {
const checkboxes = document.querySelectorAll('input[name="device_ids"]');
const selectAllButton = document.getElementById('selectAllBtn');
const hasSelected = Array.from(checkboxes).some(checkbox => checkbox.checked);
selectAllButton.textContent = hasSelected ? '清空' : '全选';
}
function changePerPage(value) {
const currentUrl = new URL(window.location.href);
currentUrl.searchParams.set('per_page', value);
currentUrl.searchParams.set('page', '1');
window.location.href = currentUrl.toString();
}
async function handleSync(type) {
if (type === 'camera') {
try {
const response = await fetch('/get_captcha', {
method: 'GET'
});
if (response.ok) {
const blob = await response.blob();
document.getElementById('captchaImage').src = URL.createObjectURL(blob);
document.getElementById('captchaModal').style.display = 'block';
} else {
alert('获取验证码失败,请重试');
}
} catch (error) {
console.error('获取验证码失败:', error);
alert('获取验证码失败,请重试');
}
} else if (type === 'alarm') {
// 显示确认模态框
document.getElementById('alarmConfirmModal').style.display = 'block';
}
}
// 添加关闭确认模态框的函数
function closeAlarmConfirmModal() {
document.getElementById('alarmConfirmModal').style.display = 'none';
}
// 添加确认同步的函数
async function confirmAlarmSync() {
try {
// 关闭确认模态框
closeAlarmConfirmModal();
// 显示加载提示
document.getElementById('resultMessage').textContent = '正在同步数据,请稍候...';
document.getElementById('resultModal').style.display = 'block';
const response = await fetch('/sync_offline_devices', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
});
const data = await response.json();
if (data.success) {
document.getElementById('resultMessage').textContent =
`同步成功!已为 ${data.count} 个离线设备创建工单。`;
} else {
document.getElementById('resultMessage').textContent = '同步失败:' + data.message;
}
document.getElementById('resultModal').style.display = 'block';
} catch (error) {
console.error('同步失败:', error);
document.getElementById('resultMessage').textContent = '同步失败,请重试';
document.getElementById('resultModal').style.display = 'block';
}
}
async function submitCaptcha() {
const captcha = document.getElementById('captchaInput').value;
if (!captcha) {
alert('请输入验证码');
return;
}
try {
const response = await fetch('/sync_camera_step1', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ captcha: captcha })
});
const data = await response.json();
if (data.success) {
document.getElementById('captchaModal').style.display = 'none';
// 更新模态框中的数量
document.getElementById('updatedCount').textContent = data.updated_count || 0;
document.getElementById('confirmModal').style.display = 'block';
} else {
if (data.message === 'INVALID_CAPTCHA') {
alert('验证码错误,请重新输入');
handleSync('camera');
} else {
alert('同步失败:' + data.message);
}
}
} catch (error) {
console.error('同步失败:', error);
alert('同步失败,请重试');
}
}
async function handleDispatch(isCamera = false) {
try {
// 不立即关闭确认模态框,而是先更新其内容
const confirmModal = document.getElementById('confirmModal');
const modalContent = confirmModal.querySelector('.modal-content');
modalContent.innerHTML = `
<h3>正在处理</h3>
<p>正在为选中设备创建工单,请稍候...</p>
<div class="loading-spinner"></div>
`;
let response;
if (isCamera) {
// 如果是摄像头同步,调用第二步接口
response = await fetch('/sync_camera_step2', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
});
} else {
// 普通派单
response = await fetch('/dispatch', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
});
}
const result = await response.json();
// 处理完成后,平滑过渡到结果模态框
document.getElementById('confirmModal').style.display = 'none';
document.getElementById('resultMessage').textContent = `派单成功!已为 ${result.count} 个设备创建工单。`;
document.getElementById('resultModal').style.display = 'block';
} catch (error) {
console.error('派单失败:', error);
document.getElementById('resultMessage').textContent = '派单失败,请重试';
document.getElementById('resultModal').style.display = 'block';
}
}
function cancelDispatch() {
document.getElementById('confirmModal').style.display = 'none';
window.location.reload();
}
function closeCaptchaModal() {
document.getElementById('captchaModal').style.display = 'none';
document.getElementById('captchaInput').value = '';
}
// 备注编辑功能
function editRemark(deviceId, spanElement) {
const inputElement = spanElement.nextElementSibling;
spanElement.style.display = 'none';
inputElement.style.display = 'inline-block';
inputElement.focus();
}
async function saveRemark(deviceId, inputElement) {
const newRemark = inputElement.value.trim();
const spanElement = inputElement.previousElementSibling;
try {
const response = await fetch('/update_device_remark', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
device_id: deviceId,
remark: newRemark
})
});
const data = await response.json();
if (data.success) {
spanElement.textContent = newRemark || '点击添加备注';
spanElement.style.display = 'inline-block';
inputElement.style.display = 'none';
} else {
alert('保存失败:' + data.message);
inputElement.focus();
}
} catch (error) {
console.error('保存备注失败:', error);
alert('保存失败,请重试');
inputElement.focus();
}
}
document.addEventListener('DOMContentLoaded', function() {
// 监听复选框的变化
document.addEventListener('change', function(e) {
if (e.target.matches('input[name="device_ids"]')) {
updateSelectAllButtonText();
}
});
// 添加表单提交前的检查
document.getElementById('dispatchForm').addEventListener('submit', async function(e) {
e.preventDefault();
const selectedDevices = Array.from(document.querySelectorAll('input[name="device_ids"]:checked'))
.map(checkbox => checkbox.value);
if (selectedDevices.length === 0) {
alert('请至少选择一个设备');
return;
}
try {
const response = await fetch('/check_existing_orders', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ device_ids: selectedDevices })
});
const data = await response.json();
if (data.existing_devices.length > 0) {
alert(`以下设备已有在途工单,请勿重复派单:\n${data.existing_devices.join('\n')}`);
return;
}
this.submit();
} catch (error) {
console.error('检查失败:', error);
alert('检查在途工单失败,请重试');
}
});
});