星瀚弹框页面实现

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




    }
}
相关推荐
ℋᙚᵐⁱᒻᵉ鲸落3 小时前
移动端滑动手势冲突:overflow: auto导致外层横向滑动失效
前端·javascript·css·vue.js·html
学长毕业设计3 小时前
基于SpringBoot的公益基金管理系统(源码+文档+讲解视频)
java·spring boot·后端
东小西3 小时前
【SAA实战】第 3 篇 · 工具调用全攻略:把业务能力交给 Agent 自己调度
java·后端·spring
东小西3 小时前
【SAA实战】第 4 篇 · Agent 短期记忆:saver 让 Agent 跨轮记得住(threadId 隔离)
java·后端·spring
许彰午4 小时前
22-DataCenter报文序列化
java·低代码·架构·状态模式
2601_962065254 小时前
[MySQL] SQL优化之性能分析
java·sql·mysql
默_笙4 小时前
🎃 前端学了 Next.js,后端该学啥?NestJS 就是 Node 版的蜜雪冰城
前端·javascript
小范同学_4 小时前
JDK1.7 与 JDK1.8 HashMap 底层原理对比 + 数组并发扩容死循环详解
java·开发语言
傲笑风5 小时前
【openvino】tinybert基于openvino服务化部署(四)
人工智能·python·自然语言处理·nlp·bert·openvino
维基框架5 小时前
WIKI 知识库 v1.1.1 正式发布
人工智能·python