星瀚弹框页面实现

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&lt;String, Object&gt;):
 * <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 执行自定义业务逻辑




    }
}
相关推荐
rannn_1119 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
leisoo80979 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
WangYan20229 小时前
基于XGBoost与AI的生态—地学多源数据建模:植被与土地利用识别、土壤碳氮空间预测、生物多样性驱动机制、土壤微生物功能预测、生态退化与风险识别
python·机器学习·xgboost
紫禁玄科10 小时前
Shai-Hulud:npm生态的自我复制蠕虫风暴
前端·npm·node.js
东风破_10 小时前
后端API没写好,前端难道干等着吗?
前端
IKUN家族10 小时前
Spring IoC&DI
java·spring·rpc
用户9385156350710 小时前
从前后端分离到前端接口工程:React + MockJS + Vite 解析
前端·后端·全栈
用户9385156350710 小时前
从零在浏览器里跑 DeepSeek-R1:WebGPU + Transformers.js 全链路实战(三)
前端·react.js·typescript
excel11 小时前
当前端行情变差,我们为什么还要坚持?
前端
鸿是江边鸟,曾是心上人11 小时前
快速搭建HTTPS本地开发环境
前端