(() => { "use strict"; const form = document.querySelector("[data-start-purchases]"); if (!form) return; const all = form.querySelector("[data-select-all]"); const summary = form.querySelector("[data-selection-summary]"); const button = form.querySelector("[data-start-button]"); const feedback = form.querySelector("[data-start-feedback]"); const boxes = () => [...form.querySelectorAll("input[data-task-id]")]; let selectionFrozen = false; const parseCents = (value) => { const match = /^(0|[1-9]\d*)\.(\d{2})$/.exec(value); return match ? BigInt(match[1] + match[2]) : null; }; const refresh = () => { const available = boxes(); const selected = available.filter((box) => box.checked); let cents = 0n; let pricesValid = true; selected.forEach((box) => { const price = parseCents(box.dataset.price); if (price === null) pricesValid = false; else cents += price; }); summary.textContent = `已选 ${selected.length} 条,最高总额 ¥${cents / 100n}.${(cents % 100n).toString().padStart(2, "0")}`; button.disabled = !selected.length || !pricesValid; if (!pricesValid) feedback.textContent = "所选任务金额无法安全汇总,请刷新后重选。"; if (all) { all.checked = selected.length > 0 && selected.length === available.length; all.indeterminate = selected.length > 0 && selected.length < available.length; all.disabled = selectionFrozen || available.length === 0; } }; const freezeSelection = (frozen) => { selectionFrozen = frozen; boxes().forEach((box) => { box.disabled = frozen; }); refresh(); }; boxes().forEach((box) => box.addEventListener("change", refresh)); if (all) all.addEventListener("change", () => { boxes().forEach((box) => { box.checked = all.checked; }); refresh(); }); let frozenPayload = null; let inFlight = false; form.addEventListener("submit", async (event) => { event.preventDefault(); const selected = boxes().filter((box) => box.checked); if (!selected.length || inFlight) return; const tasks = selected.map((box) => ({task_id: box.dataset.taskId, expected_task_version: Number(box.dataset.taskVersion)})); if (tasks.some((item) => !Number.isSafeInteger(item.expected_task_version) || item.expected_task_version < 1)) { feedback.textContent = "任务版本无效,请刷新后重选。"; return; } frozenPayload = frozenPayload || JSON.stringify({start_key: form.dataset.startKey, tasks}); inFlight = true; freezeSelection(true); button.disabled = true; button.textContent = "正在授权…"; try { const response = await fetch("/tasks/start-purchases", {method:"POST", headers:{"Content-Type":"application/json", "X-CSRF-Token":form.dataset.csrf}, body:frozenPayload}); if (response.ok) { window.location.reload(); return; } if (response.status === 409) { feedback.textContent = "任务已变化,请刷新后重选。"; frozenPayload = null; freezeSelection(false); boxes().forEach((box) => { box.checked = false; }); refresh(); return; } if (response.status === 400 || response.status === 401 || response.status === 403) { feedback.textContent = "请求未被接受,请刷新页面后重试。"; frozenPayload = null; freezeSelection(false); return; } feedback.textContent = "结果暂时不明确,只能使用同一按钮原样重放。"; } catch (_) { feedback.textContent = "网络结果不明确,请使用同一按钮原样重试。"; } finally { inFlight = false; button.textContent = "开始采购(只创建待付款订单)"; if (frozenPayload) button.disabled = false; } }); refresh(); })();