星瀚弹框页面实现

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




    }
}
相关推荐
GuWenyue5 小时前
放弃云端API!一套React+WebGPU本地LLM方案,零数据上传、离线可用
前端·人工智能·前端框架
love530love5 小时前
OpenClaw Windows Companion 桌面客户端 连接 LM Studio 完整配置指南
人工智能·windows·python·openclaw
原则猫6 小时前
函数/变量提升
前端
独泪了无痕7 小时前
Vue3 Hooks使用实战解析
前端·vue.js
cui_ruicheng7 小时前
Python从入门到实战(十六):多进程编程
开发语言·python
shawxlee8 小时前
vue3在public下封装config.js自定义配置动态数据,可在打包后直接修改,方便后端部署及后续维护
前端·javascript·经验分享·vue·团队开发·js·项目优化
Jelena157795857928 小时前
电商运营分析数据比价接口实战:多平台价格监控与智能决策系统
java·大数据·数据库
用户059540174468 小时前
把记忆存储的回归测试从手工换成 Playwright + GitHub Actions,线上缺陷降低 80%
前端·css
触底反弹8 小时前
🚀 从 DOM0 级到 React 合成事件:前端事件监听的 20 年演进史
前端·react.js·面试
kyriewen9 小时前
我给前端项目的接口请求套了6层保护——才发现以前一直在裸奔
前端·javascript·面试