1、弹框页面(动态表单)
java
package cyjt.cy001.devcy.devcy01.plugin.form;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.form.control.Button;
import kd.bos.form.plugin.AbstractFormPlugin;
import java.util.Date;
import java.util.EventObject;
import java.util.HashMap;
import java.util.Map;
/**
* 总账记账单同步页面 - 动态表单插件
* <p>
* 挂载位置:动态表单 "cyjt_tallyapplysync"(总账记账单同步页面),
* 由父页面 {@link FetchSysxxCostBillPlugin} 以模态弹窗方式打开。
* <p>
* 功能说明:
* 1. 提供日期(cyjt_bizdate)和公司(cyjt_company)两个输入字段供用户填写;
* 2. 监听底部"确定"按钮(btnok)的点击事件;
* 3. 点击确定后校验日期和公司是否已填写,未填写则提示用户;
* 4. 校验通过后,将用户输入的值封装为 Map 通过 {@code returnDataToParent} 返回给父页面;
* 5. 返回数据后自动关闭弹窗。
* <p>
* 返回数据格式(Map<String, Object>):
* <ul>
* <li>"cyjt_bizdate" → Date,用户选择的业务日期</li>
* <li>"cyjt_company" → DynamicObject,用户选择的公司(基础资料对象)</li>
* </ul>
* <p>
* 父页面插件:{@link FetchSysxxCostBillPlugin}
* <p>
* 平台注册路径:cyjt.cy001.devcy.devcy01.plugin.form.TallyApplySyncFormPlugin
*/
public class TallyApplySyncFormPlugin extends AbstractFormPlugin {
/**
* 注册监听器。
* 将底部"确定"按钮(btnok)注册为点击监听控件,
* 以便在 {@link #click(EventObject)} 中响应点击事件。
* "取消"按钮由平台默认处理(直接关闭弹窗,不返回数据)。
*
* @param e 事件对象
*/
@Override
public void registerListener(EventObject e) {
super.registerListener(e);
Button btnOk = this.getView().getControl("btnok");
btnOk.addClickListener(this);
}
/**
* 按钮点击事件处理。
* 当用户点击"确定"按钮时,调用 {@link #doConfirm()} 执行确认逻辑。
*
* @param evt 点击事件
*/
@Override
public void click(EventObject evt) {
super.click(evt);
Object source = evt.getSource();
if (source instanceof Button) {
Button btn = (Button) source;
if ("btnok".equals(btn.getKey())) {
doConfirm();
}
}
}
/**
* 确定按钮处理逻辑。
* <p>
* 执行步骤:
* 1. 从页面模型中获取日期字段(cyjt_bizdate)和公司字段(cyjt_company)的值;
* 2. 逐一校验是否为空,为空则弹出提示并中断;
* 3. 将日期和公司封装到 HashMap 中;
* 4. 调用 {@code returnDataToParent} 将数据返回给父页面;
* 5. 关闭当前弹窗,触发父页面的 {@code closedCallBack} 回调。
*/
private void doConfirm() {
// 获取用户输入的日期
Date bizDate = (Date) this.getModel().getValue("cyjt_bizdate");
// 获取用户选择的公司(基础资料类型,返回 DynamicObject)
DynamicObject company = (DynamicObject) this.getModel().getValue("cyjt_company");
// 非空校验
if (bizDate == null) {
this.getView().showTipNotification("请选择日期");
return;
}
if (company == null) {
this.getView().showTipNotification("请选择公司");
return;
}
// 封装返回数据
Map<String, Object> result = new HashMap<>();
result.put("cyjt_bizdate", bizDate);
result.put("cyjt_company", company);
// 返回数据给父页面并关闭弹窗
this.getView().returnDataToParent(result);
this.getView().close();
}
}
2、父页面
java
package cyjt.cy001.devcy.devcy01.plugin.form;
import kd.bos.bill.AbstractBillPlugIn;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.form.CloseCallBack;
import kd.bos.form.FormShowParameter;
import kd.bos.form.ShowType;
import kd.bos.form.control.events.ItemClickEvent;
import kd.bos.form.events.ClosedCallBackEvent;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import java.util.Date;
import java.util.EventObject;
import java.util.Map;
/**
* 获取星空成本数据 - 单据表单插件
* <p>
* 挂载位置:单据表单(报账单等),注册在单据的插件列表中。
* <p>
* 功能说明:
* 1. 监听工具栏按钮 "cyjt_sysxxcost"(获取星空成本数据)的点击事件;
* 2. 点击后以模态弹窗方式打开动态表单 "cyjt_tallyapplysync"(总账记账单同步页面),
* 供用户输入日期(cyjt_bizdate)和公司(cyjt_company);
* 3. 用户在弹窗中点击"确定"后,通过 {@link #closedCallBack} 回调接收子页面返回的数据;
* 4. 解析返回的日期和公司信息,执行后续业务逻辑。
* <p>
* 子页面插件:{@link TallyApplySyncFormPlugin}
* <p>
* 平台注册路径:cyjt.cy001.devcy.devcy01.plugin.form.FetchSysxxCostBillPlugin
*/
public class FetchSysxxCostBillPlugin extends AbstractBillPlugIn {
private static final Log log = LogFactory.getLog(FetchSysxxCostBillPlugin.class);
/** 工具栏按钮标识 - 获取星空成本数据 */
private static final String BTN_FETCH_COST = "cyjt_sysxxcost";
/** 子页面关闭回调标识,用于在 closedCallBack 中匹配来源 */
private static final String CALLBACK_ID = "fetch_sysxx_cost_callback";
/**
* 注册监听器。
* 在此方法中注册工具栏(tbmain)的按钮点击监听,
* 以便在 {@link #itemClick} 中响应按钮事件。
*
* @param e 事件对象
*/
@Override
public void registerListener(EventObject e) {
super.registerListener(e);
this.addItemClickListeners("tbmain");
}
/**
* 工具栏按钮点击事件处理。
* 当用户点击 "cyjt_sysxxcost"(获取星空成本数据)按钮时,
* 调用 {@link #openSyncForm()} 打开参数录入弹窗。
*
* @param evt 按钮点击事件
*/
@Override
public void itemClick(ItemClickEvent evt) {
super.itemClick(evt);
if (BTN_FETCH_COST.equals(evt.getItemKey())) {
openSyncForm();
}
}
/**
* 以模态弹窗方式打开动态表单 "cyjt_tallyapplysync"。
* <p>
* 设置 CloseCallBack 以便弹窗关闭后,父页面能通过
* {@link #closedCallBack} 接收用户输入的日期和公司数据。
*/
private void openSyncForm() {
FormShowParameter param = new FormShowParameter();
param.setFormId("cyjt_tallyapplysync");
param.getOpenStyle().setShowType(ShowType.Modal);
param.setCloseCallBack(new CloseCallBack(this, CALLBACK_ID));
this.getView().showForm(param);
}
/**
* 子页面关闭回调处理。
* <p>
* 当动态表单 "cyjt_tallyapplysync" 关闭后触发此方法。
* 通过 actionId 匹配回调来源,从返回数据中提取:
* <ul>
* <li>cyjt_bizdate - 用户选择的业务日期(Date)</li>
* <li>cyjt_company - 用户选择的公司(DynamicObject,基础资料)</li>
* </ul>
* 校验非空后执行后续业务逻辑。
*
* @param e 关闭回调事件,包含子页面通过 returnDataToParent 返回的数据
*/
@Override
public void closedCallBack(ClosedCallBackEvent e) {
super.closedCallBack(e);
if (!CALLBACK_ID.equals(e.getActionId())) {
return;
}
Object returnData = e.getReturnData();
if (returnData == null) {
return;
}
@SuppressWarnings("unchecked")
Map<String, Object> dataMap = (Map<String, Object>) returnData;
Date bizDate = (Date) dataMap.get("cyjt_bizdate");
DynamicObject company = (DynamicObject) dataMap.get("cyjt_company");
if (bizDate == null || company == null) {
this.getView().showMessage("日期和公司不能为空");
return;
}
log.info("获取星空成本数据 - 日期: " + bizDate + ", 公司: " + company.getString("name"));
// TODO: 在此处根据 bizDate 和 company 执行自定义业务逻辑
}
}