星瀚弹框页面实现

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




    }
}
相关推荐
kernelcraft2 小时前
Boto3:Python 操作 AWS 的官方 SDK
开发语言·python·其他·aws
D3bugRealm2 小时前
cryptography:Python 开发者的加密标准库
开发语言·python·其他
EdgeOne边缘安全加速平台2 小时前
EdgeOne Web 防护×AI 升级:让 AI 既参与攻击识别,也参与误报纠错
前端·人工智能·腾讯云·edgeone
nuIl2 小时前
实现一个 Coding Agent(6):并行工具调用
前端·ai编程·cursor
Rain5092 小时前
2.1 Nest.js 项目初始化与模块化架构
开发语言·前端·javascript·后端·架构·数据分析·node.js
cjp5602 小时前
009. ASP.NET WEB API 用户关联esp32设备
前端·后端·asp.net
HappyAcmen2 小时前
5.通义向量模型调用
python
小熊美家熊猫系统3 小时前
电子合同技术实现与合规实践
java·开发语言·分布式
云烟成雨TD3 小时前
Agent Scope Java 2.x 系列【3】从零构建 ReActAgent
java·人工智能·agent