(function () { function parseNum(v) { var n = parseFloat(v); return isNaN(n) ? null : n; } function calcPnl(direction, entry, target, lots) { if (!entry || !target || !lots) return ''; if (direction === 'long') return ((target - entry) * lots).toFixed(2); if (direction === 'short') return ((entry - target) * lots).toFixed(2); return ''; } function calcDuration(openVal, closeVal) { if (!openVal || !closeVal) return ''; var o = new Date(openVal); var c = new Date(closeVal); var secs = Math.floor((c - o) / 1000); if (secs < 0) return ''; var h = Math.floor(secs / 3600); var m = Math.floor((secs % 3600) / 60); return h ? h + '小时' + m + '分钟' : m + '分钟'; } function recalc() { var form = document.getElementById('review-form'); if (!form) return; var dir = form.querySelector('[name="direction"]').value; var entry = parseNum(form.querySelector('[name="entry_price"]').value); var sl = parseNum(form.querySelector('[name="stop_loss"]').value); var tp = parseNum(form.querySelector('[name="take_profit"]').value); var close = parseNum(form.querySelector('[name="close_price"]').value); var lots = parseNum(form.querySelector('[name="lots"]').value) || 1; var openT = form.querySelector('[name="open_time"]').value; var closeT = form.querySelector('[name="close_time"]').value; var hold = document.getElementById('holding_duration'); var initP = document.getElementById('initial_pnl'); var actP = document.getElementById('actual_pnl'); if (hold) hold.value = calcDuration(openT, closeT); if (initP) initP.value = calcPnl(dir, entry, tp, lots); if (actP) actP.value = calcPnl(dir, entry, close, lots); } function bindForm() { var form = document.getElementById('review-form'); if (!form) return; form.querySelectorAll('input, select').forEach(function (el) { el.addEventListener('input', recalc); el.addEventListener('change', recalc); }); } function showModal(data) { var mask = document.getElementById('review-modal'); var body = document.getElementById('review-modal-body'); if (!mask || !body) return; var html = '