📝 填写检查表信息

请先选择行业
3 项 5 项 8 项 10 项 自定义
开启后由 AI 根据企业信息智能生成专业检查表;关闭则使用标准模板

🔍 填写隐患排查信息

📷
点击上传现场照片(支持多张 JPG/PNG,最多5张)
AI将综合分析所有照片中的安全隐患
'; win.document.write(html); win.document.close(); } // ====== 隐患识别功能 ====== function previewPhotos(event) { var files = event.target.files; if (!files || files.length === 0) return; var maxPhotos = 5; var remaining = maxPhotos - photoBase64List.length; if (remaining <= 0) { alert('最多上传 ' + maxPhotos + ' 张照片'); return; } if (files.length > remaining) { alert('还能添加 ' + remaining + ' 张照片(最多' + maxPhotos + '张)'); } var added = 0; Array.from(files).slice(0, remaining).forEach(function(file) { var reader = new FileReader(); reader.onload = function(e) { photoBase64List.push(e.target.result); added++; // 所有文件读取完后统一渲染 if (added === Math.min(files.length, remaining)) { renderPhotoPreviews(); } }; reader.readAsDataURL(file); }); } function renderPhotoPreviews() { var container = document.getElementById('hd-photoPreviewContainer'); var hint = document.getElementById('hd-photoHint'); var area = document.getElementById('hd-photoArea'); if (photoBase64List.length === 0) { container.style.display = 'none'; hint.style.display = 'block'; area.classList.remove('has-photo'); return; } hint.style.display = 'none'; area.classList.add('has-photo'); container.style.display = 'flex'; container.innerHTML = photoBase64List.map(function(src, idx) { return '
' + '' + '' + '
照片 ' + (idx+1) + '
' + '
'; }).join(''); } function removePhoto(idx) { photoBase64List.splice(idx, 1); renderPhotoPreviews(); } async function startDetect() { if (!requireLogin()) return; var unit = document.getElementById('hd-unit').value.trim(); var date = document.getElementById('hd-date').value; var inspector = document.getElementById('hd-inspector').value.trim(); if (!unit || !date || !inspector) { alert('请填写带 * 的必填项'); return; } if (!photoBase64List || photoBase64List.length === 0) { alert('请上传至少一张现场照片'); return; } var btn = document.getElementById('hd-detectBtn'); btn.disabled = true; btn.textContent = '🔍 AI正在识别分析...'; try { var res = await fetch('/anquan-api/tools/hazard/detect', { method: 'POST', headers: Object.assign({ 'Content-Type': 'application/json' }, getAuthHeaders()), body: JSON.stringify({ unit: unit, checkDate: date, inspector: inspector, area: document.getElementById('hd-area').value.trim(), photos: photoBase64List }) }); var data = await res.json(); if (data.code === 0 && data.data.hazards) { hazardData = data.data; renderHazardReport(data.data); } else { alert('识别失败:' + (data.message || '未知错误')); } } catch(e) { alert('网络错误,请重试'); console.error(e); } btn.disabled = false; btn.textContent = '🔍 开始识别分析'; } function renderHazardReport(data) { var resultEl = document.getElementById('hd-result'); resultEl.style.display = 'block'; resultEl.scrollIntoView({ behavior: 'smooth' }); var risk = data.riskAssessment || {}; var hazards = data.hazards || []; var levelClass = risk.level === 'high' ? 'risk-high' : (risk.level === 'medium' ? 'risk-medium' : 'risk-low'); var levelText = risk.levelText || '未知'; // 基本信息可能包在 data.meta(detect 接口)或直接在 data(report 接口) var meta = data.meta || {}; var fUnit = data.unit || meta.unit || ''; var fDate = data.checkDate || meta.checkDate || ''; var fInspector = data.inspector || meta.inspector || ''; var fArea = data.area || meta.area || ''; var fCreateTime = data.createTime || meta.createTime || ''; var photos = data.photos || meta.photos || []; var html = ''; // 原始照片(彩色,2张一排大图) if (photos && photos.length > 0) { html += '
'; html += '

📷 现场原始照片(共' + photos.length + '张)

'; html += '
'; photos.forEach(function(p, i) { html += '
' + '现场照片' + (i+1) + '' + '
照片 ' + (i+1) + '
'; }); html += '
'; } // 基本信息 html += '
'; html += '

📋 检查基本信息

'; html += '
'; html += '
被检单位
' + escapeHtml(fUnit) + '
'; html += '
检查日期
' + escapeHtml(fDate) + '
'; html += '
检查人
' + escapeHtml(fInspector) + '
'; html += '
检查区域
' + escapeHtml(fArea || '-') + '
'; if (fCreateTime) html += '
生成时间
' + escapeHtml(formatCreateTime(fCreateTime)) + '
'; html += '
'; // 风险评估 html += '
'; html += '

⚠️ 整体风险评估

'; html += '

' + levelText + '风险

'; html += '

' + escapeHtml(risk.description || '') + '

'; html += '
'; // 场景概述 if (data.sceneOverview) { html += '
'; html += '

👁 场景概述

'; html += '

' + escapeHtml(data.sceneOverview) + '

'; html += '
'; } // 隐患列表 html += '
'; html += '

🔎 隐患排查结果(共' + hazards.length + '项)

'; hazards.forEach(function(h, i) { var hLevelClass = h.level === 'high' ? 'risk-high' : (h.level === 'medium' ? 'risk-medium' : 'risk-low'); html += '
'; html += '
#' + (i+1) + ' ' + escapeHtml(h.name) + ' ' + (h.levelText || '') + '
'; html += '
' + escapeHtml(h.description) + '
'; if (h.regulation) { html += '
📜 法规依据:' + escapeHtml(h.regulation) + '
'; } if (h.suggestions && h.suggestions.length > 0) { html += ''; } html += '
'; }); html += '
'; // 综合评价 if (data.conclusion) { html += '
'; html += '

📝 综合评价与整改要求

'; html += '

' + escapeHtml(data.conclusion) + '

'; html += '
'; } // 补充提示 + 另外补充(合并为一个区块) html += '
'; if (data.tips) { html += '

💡 补充检查提示

'; html += '
' + escapeHtml(data.tips) + '
'; } html += '

另外补充:

'; html += '
'; html += '
'; document.getElementById('hd-reportContent').innerHTML = html; } function viewFullReport() { if (!hazardData || !hazardData.id) return; window.open('/hazard-report.html?id=' + hazardData.id, '_blank'); } function resetHazard() { document.getElementById('hd-result').style.display = 'none'; hazardData = null; window.scrollTo({ top: 0, behavior: 'smooth' }); } // ====== 工具函数 ====== function escapeHtml(str) { if (!str) return ''; return String(str).replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"'); } // 将 ISO/UTC 时间格式化为中国本地时间(YYYY-MM-DD HH:MM) function formatCreateTime(timeStr) { if (!timeStr) return '-'; var d; if (typeof timeStr === 'string') { if (timeStr.indexOf('T') >= 0) { d = new Date(timeStr); } else { d = new Date(timeStr.replace(' ', 'T') + (timeStr.indexOf('+') < 0 && timeStr.indexOf('Z') < 0 ? 'Z' : '')); } } else { d = new Date(timeStr); } if (isNaN(d.getTime())) return timeStr; var pad = function(n) { return String(n).padStart(2, '0'); }; return d.getFullYear() + '-' + pad(d.getMonth()+1) + '-' + pad(d.getDate()) + ' ' + pad(d.getHours()) + ':' + pad(d.getMinutes()); }