如何在ERPNext教育模块中仅允许已缴费学生打印学生申请表?
修复:学生未结清费用时禁用Student Applicant打印功能
你的脚本无效的核心问题是用了同步方式获取Fees文档——客户端环境下frappe.get_doc无法直接拉取服务器端的最新数据,再加上没处理异步逻辑,导致还没拿到费用数据就走完了判断流程,自然拦不住打印操作。
下面是修复后的完整代码:
frappe.ui.form.on("Student Applicant", { onPrintDocument: function(frm, doc, ev) { // 先阻止默认打印行为,等验证完成后再决定是否放行 ev.preventDefault(); // 异步调用获取服务器端Fees文档的最新未结清金额 frappe.call({ method: "frappe.client.get", args: { doctype: "Fees", name: frm.doc.fees }, callback: function(r) { if (r.message) { const outstandingAmount = r.message.outstanding_amount; if (outstandingAmount === 0) { // 费用已全额结清,手动触发打印 frm.print_doc(); } else { // 存在未结清费用,提示用户并取消打印 frappe.msgprint("费用未全额缴纳,无法打印学生申请表"); } } else { // 未找到关联的Fees记录,给出提示 frappe.msgprint("当前申请表未关联有效的费用记录"); } }, error: function() { // 处理请求失败的情况 frappe.msgprint("验证费用状态失败,请稍后重试"); } }); } });
核心修改说明:
- 先执行
ev.preventDefault():直接阻止默认打印流程,避免异步请求还没返回就完成打印 - 改用
frappe.call异步获取数据:确保拿到的是服务器端最新的Fees未结清金额,避免本地数据过时或为空 - 验证通过后手动触发打印:费用结清时调用
frm.print_doc()完成打印操作 - 增加异常处理:覆盖找不到费用记录、请求失败等场景,提升用户体验
注意:请确保Student Applicant表单中的fees字段已正确关联到对应的Fees文档,否则会触发「未关联有效费用记录」的提示。
内容的提问来源于stack exchange,提问作者Khallad
相关产品推荐
相关产品推荐

