// purchase.js — 采购管理模块
function renderPurchase() {
const records = state.data.purchase || [];
const money = (v) => `¥ ${(Number(v || 0)).toLocaleString("zh-CN", { minimumFractionDigits: 0, maximumFractionDigits: 2 })}`;
const badge = (s) => {
const m = { "已审批": "green", "已采购": "blue", "已完成": "slate", "待审批": "amber" };
const c = m[s] || "amber";
return `${s}`;
};
const esc = (s) => (s || "").replace(/&/g, "&").replace(//g, ">").replace(/"/g, """);
const totalAmount = records.reduce((s, r) => s + (r.amount || 0), 0);
document.querySelector("#purchase").innerHTML = `
采购记录${records.length}
采购金额${money(totalAmount)}
待审批${records.filter(r => r.status === '待审批').length}
采购列表 (${records.length})
| 项目名称 | 采购内容 | 供应商 | 金额 | 采购日期 | 状态 | 分类 | 备注 |
${records.length ? records.map(r => `| ${esc(r.project_name)} | ${esc(r.purchase_item)} | ${esc(r.supplier)} | ${money(r.amount)} | ${r.purchase_date || '—'} | ${badge(r.status)} | ${esc(r.category)} | ${esc(r.notes) || '—'} |
`).join("") : '| 暂无采购记录 |
'}| 合计(${records.length} 条) | ${money(totalAmount)} | |
`;
if (window.lucide) window.lucide.createIcons();
}
window.openPurchaseModal = () => {
const form = document.querySelector("#purchaseModal form");
form.reset();
form.querySelector('[name="purchase_id"]').value = "";
document.querySelector("#purchaseModalTitle").textContent = "新增采购";
document.querySelector("#purchaseDeleteBtn").classList.add("hidden");
document.querySelector("#purchaseModal").classList.remove("hidden");
};
window.closePurchaseModal = () => {
document.querySelector("#purchaseModal").classList.add("hidden");
};
window.openPurchaseEdit = (id) => {
const r = (state.data.purchase || []).find(x => x.id === id);
if (!r) return;
const form = document.querySelector("#purchaseModal form");
form.reset();
const setVal = (name, val) => { const el = form.querySelector(`[name="${name}"]`); if (el) el.value = val || ""; };
setVal("purchase_id", r.id);
setVal("project_name", r.project_name);
setVal("purchase_item", r.purchase_item);
setVal("supplier", r.supplier);
setVal("amount", r.amount);
setVal("purchase_date", r.purchase_date);
setVal("status", r.status);
setVal("category", r.category);
setVal("notes", r.notes);
document.querySelector("#purchaseModalTitle").textContent = "编辑采购";
document.querySelector("#purchaseDeleteBtn").classList.remove("hidden");
document.querySelector("#purchaseModal").classList.remove("hidden");
};
window.savePurchase = async (event) => {
event.preventDefault();
const form = event.target;
const data = Object.fromEntries(new FormData(form).entries());
const isEdit = !!data.purchase_id;
delete data.purchase_id;
const url = isEdit
? `/api/purchase/${form.querySelector('[name="purchase_id"]').value}`
: "/api/purchase";
const method = isEdit ? "PUT" : "POST";
const resp = await fetch(url, { method, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ data: { ...data, tenant: state.tenant } }) });
if (!resp.ok) { alert("保存失败"); return; }
// Refresh data
const bResp = await fetch(`/api/bootstrap?tenant=${encodeURIComponent(state.tenant)}`);
if (bResp.ok) {
const bd = await bResp.json();
state.data = bd;
applyUserTenants();
renderPurchase();
}
closePurchaseModal();
};
window.deletePurchaseItem = async () => {
const id = document.querySelector("#purchaseModal form [name='purchase_id']").value;
if (!id || !confirm("确定删除?")) return;
const resp = await fetch(`/api/purchase/${id}`, { method: "DELETE" });
if (!resp.ok) { alert("删除失败"); return; }
const bResp = await fetch(`/api/bootstrap?tenant=${encodeURIComponent(state.tenant)}`);
if (bResp.ok) {
const bd = await bResp.json();
state.data = bd;
applyUserTenants();
renderPurchase();
}
closePurchaseModal();
};