星瀚弹框页面实现

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 执行自定义业务逻辑




    }
}
相关推荐
天平1 分钟前
油猴脚本创建webworker踩坑记录
前端·javascript·typescript
原则猫1 小时前
前端基础大厦
前端
陈随易3 小时前
编程语言级别的Skill市场,AI Agent 的未来形态
前端·后端·程序员
SoaringHeart3 小时前
Flutter进阶:基于 EasyRefresh 的下拉刷新封装 n_easy_refresh_mixin.dart
前端·flutter
IT_陈寒5 小时前
Vite的热更新突然不香了,排查三小时差点砸键盘
前端·人工智能·后端
子兮曰6 小时前
Agency-Agents 深度解析:400+ AI 专家的"梦之队"如何重塑开发工作流
前端·后端·vibecoding
竹林8186 小时前
用 The Graph 查询链上数据实战:从手搓 RPC 到 Subgraph,我的 NFT 项目数据加载快了 10 倍
前端·javascript
用户8356290780517 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户8356290780517 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
karry_k7 小时前
MyBatis批量insert-select踩坑:useGeneratedKeys=true 可能让PostgreSQL返回大量插入结果
java·后端