美文网首页
金蝶云苍穹应用层弹出新应用并默认打开新页签案例

金蝶云苍穹应用层弹出新应用并默认打开新页签案例

作者: 涎涎 | 来源:发表于2020-08-07 22:30 被阅读0次

    前置条件

    1. 新建请假天数初始表基础资料
    1. 新建请假类型 基础资料
    1. 新建请假类型2 基础资料
    1. 新建请假申请单单据
    1. 新建测试应用以及测试单据

    编码

    请假申请单插件

    package kd.bos.plugin.leave.message;
    
    import java.util.EventObject;
    
    import kd.bos.bill.AbstractBillPlugIn;
    import kd.bos.dataentity.entity.DynamicObject;
    import kd.bos.dataentity.utils.StringUtils;
    import kd.bos.form.CloseCallBack;
    import kd.bos.form.IFormView;
    import kd.bos.form.ShowType;
    import kd.bos.form.events.ClosedCallBackEvent;
    import kd.bos.list.ListShowParameter;
    import kd.bos.mvc.SessionManager;
    import kd.bos.servicehelper.BusinessDataServiceHelper;
    
    /**
     * <p>Title: </p>
     * <p>
     *    Description:
     *    试验成功
     * </p>
     * <p>Copyright: Copyright (c) 2020</p>
     * @author xx
     * @date 2020年3月21日
     * @version 1.0
     */
    public class PopBillListParentPlugin4 extends AbstractBillPlugIn {
        //父页面请假类型--弹出列表控件标识
        private static final String KEY_POP_LEAVE_TYPE = "popleavetype";
        //子页面请假类型单据标识
        private static final String KEY_POP_LEAVE_TYPE_PAGE = "op_qjlx2_test";
        //子页面请假类型名称标识
        private static final String KEY_TYPE_NAME = "name";
    
        /**
         * <p>Title: </p>
         * <p>
         *    Description:
         * </p>
         * <p>Copyright: Copyright (c) 2020</p>
         * @author xx
         * @date 2020年3月21日
         * @param param the bare_field_name
         * @param e
         * @see kd.bos.bill.AbstractBillPlugIn#registerListener(java.util.EventObject)
         * @version 1.0
         */
        @Override
        public void registerListener(EventObject e) {
            super.registerListener(e);
            this.addClickListeners(KEY_POP_LEAVE_TYPE);
        }
    
        /**
         * <p>Title: </p>
         * <p>
         *    Description:
         * </p>
         * <p>Copyright: Copyright (c) 2020</p>
         * @author xx
         * @date 2020年3月21日
         * @param param the bare_field_name
         * @param evt
         * @see kd.bos.form.plugin.AbstractFormPlugin#click(java.util.EventObject)
         * @version 1.0
         */
        @Override
        public void click(EventObject evt) {
    //        super.click(evt);
          //如果是“请假类型--弹出列表”控件被点击,则创建列表弹窗页面对象
            ListShowParameter listShowParameter = new ListShowParameter();
            //设置FormId,列表的FormId固定为"bos_list"
            listShowParameter.setFormId("bos_list");
            //设置BillFormId,为列表所对应单据的标识
            listShowParameter.setBillFormId(KEY_POP_LEAVE_TYPE_PAGE);
            //设置弹出页面标题
            listShowParameter.setCaption("选择请假类型:");
    //      StyleCss styleCss = new StyleCss();
    //      styleCss.setWidth("800");
    //      styleCss.setHeight("600");
            //设置弹出页面的样式
    //      listShowParameter.getOpenStyle().setInlineStyleCss(styleCss);
            //设置为不能多选,如果为true则表示可以多选
            listShowParameter.setMultiSelect(false);
            //设置页面回调事件方法
            listShowParameter.setCloseCallBack(new CloseCallBack(this, KEY_POP_LEAVE_TYPE));
            //设置弹出页面的打开方式
            listShowParameter.getOpenStyle().setShowType(ShowType.NewTabPage);
            //设置打开界面的目标容器
            listShowParameter.getOpenStyle().setTargetKey("tabap");
            //获取最外层根页面的View对象
            IFormView mainView = SessionManager.getCurrent().getMainView(this.getView().getFormShowParameter().getRootPageId());
            //绑定弹出列表到根页面
            mainView.showForm(listShowParameter);
            this.getView().sendFormAction(mainView);
        }
    
        /**
         * <p>Title: </p>
         * <p>
         *    Description:
         * </p>
         * <p>Copyright: Copyright (c) 2020</p>
         * @author xx
         * @date 2020年3月21日
         * @param param the bare_field_name
         * @param e
         * @see kd.bos.form.plugin.AbstractFormPlugin#closedCallBack(kd.bos.form.events.ClosedCallBackEvent)
         * @version 1.0
         */
        @Override
        public void closedCallBack(ClosedCallBackEvent e) {
            super.closedCallBack(e);
            if (e.getReturnData() != null && StringUtils.equals(KEY_POP_LEAVE_TYPE, e.getActionId())) {
                //如果返回值不为空且标识一致,则获取返回值,此处返回值为所选数据的主键id
                String returnData = (String) e.getReturnData();
                if (StringUtils.isNotBlank(returnData)) {
                    //根据主键id去请假类型单据中获取单条数据
                    DynamicObject leaveType = BusinessDataServiceHelper.loadSingle(returnData, KEY_POP_LEAVE_TYPE_PAGE, KEY_TYPE_NAME);
                    //获取到请假类型名称的属性值
    //                String typename = (String) leaveType.get(KEY_TYPE_NAME);
                    String typename = leaveType.get(KEY_TYPE_NAME).toString();
                    //给页面“请假类型--弹出列表”赋值类型名称的值
                    this.getModel().setValue(KEY_POP_LEAVE_TYPE, typename);
                }
            }
        }
    }
    

    请假类型2插件

    package kd.bos.plugin.leave.message;
    
    import java.util.EventObject;
    
    import kd.bos.dataentity.utils.StringUtils;
    import kd.bos.entity.datamodel.ListSelectedRowCollection;
    import kd.bos.form.control.events.ItemClickEvent;
    import kd.bos.list.BillList;
    import kd.bos.list.plugin.AbstractListPlugin;
    
    /**
     * <p>Title: </p>
     * <p>
     *    Description:
     *    试验成功
     * </p>
     * <p>Copyright: Copyright (c) 2020</p>
     * @author xx
     * @date 2020年3月21日
     * @version 1.0
     */
    public class PopBillListPlugin extends AbstractListPlugin {
        //子列表页面确认按钮标识
        private static final String KEY_CONFIRM = "ss";    
    
        /**
         * <p>Title: </p>
         * <p>
         *    Description:
         * </p>
         * <p>Copyright: Copyright (c) 2020</p>
         * @author xx
         * @date 2020年3月21日
         * @param param the bare_field_name
         * @param e
         * @see kd.bos.form.plugin.AbstractFormPlugin#registerListener(java.util.EventObject)
         * @version 1.0
         */
        @Override
        public void registerListener(EventObject e) {
            super.registerListener(e);
            //注册工具栏确认选项的监听
            this.addItemClickListeners(KEY_CONFIRM);
           
        }
    
        /**
         * <p>Title: </p>
         * <p>
         *    Description:
         * </p>
         * <p>Copyright: Copyright (c) 2020</p>
         * @author xx
         * @date 2020年3月21日
         * @param param the bare_field_name
         * @param evt
         * @see kd.bos.form.plugin.AbstractFormPlugin#itemClick(kd.bos.form.control.events.ItemClickEvent)
         * @version 1.0
         */
        @Override
        public void itemClick(ItemClickEvent evt) {
            super.itemClick(evt);
            if (StringUtils.equals(KEY_CONFIRM, evt.getItemKey())) {
                //当工具栏确认按钮被点击,获取当前列表对象
                //这里获取当前列表对象的写法是固定写法
                BillList billList = this.getControl("billlistap");
                //获取当前列表的选中行
                ListSelectedRowCollection selectedRows = billList.getSelectedRows();
                if (null != selectedRows) {
                    
                    //获取选中行的主键id
                    //这里设置了只能单选,所以直接获取第一个元素,如果是多选需要遍历集合
                    //这里获取的有具体值的参数不是很多,一般就使用主键id,之后有需要其他信息再去根据主键查询
                    String primaryKeyValue = String.valueOf(selectedRows.get(0).getPrimaryKeyValue());
                    //返回主键id到父页面并关闭子页面
                    this.getView().returnDataToParent(primaryKeyValue);
                    this.getView().close();
                   
                }
            }
        }
    }
    

    测试001单据插件

    package kd.bos.plugin.leave.message;
    
    import java.util.EventObject;
    import java.util.HashMap;
    import java.util.List;
    
    import kd.bos.bill.AbstractBillPlugIn;
    import kd.bos.bill.BillShowParameter;
    import kd.bos.entity.AppMenuInfo;
    import kd.bos.entity.AppMetadataCache;
    import kd.bos.form.FormShowParameter;
    import kd.bos.form.IFormView;
    import kd.bos.form.ShowType;
    import kd.bos.form.control.Control;
    
    /**
     * <p>Title: </p>
     * <p>
     *    Description:
     *    暂未作试验
     * </p>
     * <p>Copyright: Copyright (c) 2020</p>
     * @author xx
     * @date 2020年3月21日
     * @version 1.0
     */
    public class PopLeaveAppPlugin extends AbstractBillPlugIn {
        //请假管理应用appid
    //    private static final String KEY_LEVEA_APPID = "wlzy_repleave";
        private static final String KEY_LEVEA_APPID = "op_hrbasedata";
        //采购管理应用按钮标识--用于弹出请假管理应用
        private static final String KEY_BUTTONAP = "buttonap";
        //请假申请单标识
    //    private static final String KEY_LEAVE_APPLY = "wlzy_leave_qjsq";
        private static final String KEY_LEAVE_APPLY = "op_leavesq";
    
        /**
         * <p>Title: </p>
         * <p>
         *    Description:
         *    注册监听
         * </p>
         * <p>Copyright: Copyright (c) 2020</p>
         * @author xx
         * @date 2020年3月21日
         * @param param the bare_field_name
         * @param e
         * @see kd.bos.bill.AbstractBillPlugIn#registerListener(java.util.EventObject)
         * @version 1.0
         */
        @Override
        public void registerListener(EventObject e) {
            super.registerListener(e);
            this.addClickListeners(KEY_BUTTONAP);
        }
    
        /**
         * 
         * <p>Title: </p>
         * <p>
         *    Description:
         *    监听点击事件
         * </p>
         * <p>Copyright: Copyright (c) 2020</p>
         * @author xx
         * @date 2020年3月21日
         * @param param the bare_field_name
         * @param evt
         * @see kd.bos.form.plugin.AbstractFormPlugin#click(java.util.EventObject)
         * @version 1.0
         */
        @Override
        public void click(EventObject evt) {
            super.click(evt);
            //获取点击的控件,判断如果是指定按钮则弹出应用及页面
            Control source = (Control) evt.getSource();
            if (null != source && KEY_BUTTONAP.equals(source.getKey())) {
                //获取最外层的根页面(主页面)
                IFormView mainView = this.getView().getMainView();
                //获取主页面的pageId
                String mainViewPageId = mainView.getPageId();
                //拼接应用的pageId,我们需要按默认格式指定pageId,因为有些场景会直接解析pageId
                String appPageId = KEY_LEVEA_APPID + mainViewPageId;
                //获取指定appid对应的app内码(即根据t_meta_bizapp表的fnumber获取fid)
                String appId = AppMetadataCache.getAppInfo(KEY_LEVEA_APPID).getAppId();
                HashMap<String, Object> hashMap;
                //判断当前应用是否已经被打开
                if (null != mainView.getViewNoPlugin(appPageId)) {
                    //已经被打开则激活应用
                    hashMap = new HashMap<>();
                    hashMap.put("view", this.getView());
                    hashMap.put("appname", "请假管理应用");
                    hashMap.put("formnumber", "wlzp_repleave_apphome");
                    hashMap.put("parametertype", "FormShowParameter");
                    PopAppUtils.activatePage(appPageId, this.getView(), hashMap);
                } else {
                    //没有打开则代打开应用
                    //创建弹出的应用对象并设置相关属性
                    FormShowParameter showParameter = new FormShowParameter();
                    //打开的表单页面标识,这里为应用首页
    //                showParameter.setFormId("wlzy_repleave_apphome");
                    showParameter.setFormId("op_hrbasedata_apphome");
                    //打开的表单标题
                    showParameter.setCaption("请假管理应用");
                    //打开的应用appId
                    showParameter.setAppId(KEY_LEVEA_APPID);
                    //设置customParam中的appid属性值(必须设置该属性才能出现菜单栏)
                    showParameter.setCustomParam("appid", appId);
                    //打开风格,这里为新增页签的写法
                    showParameter.getOpenStyle().setShowType(ShowType.NewTabPage);
                    //设置页签容器的key,这里为首页--应用页签容器的标识
                    showParameter.getOpenStyle().setTargetKey("tabap");
                    //设置pageId(默认写法为appid+mainViewPageId)
                    showParameter.setPageId(appPageId);
                    //获取根页面的页面模型数据
                    mainView.showForm(showParameter);
                    this.getView().sendFormAction(mainView);
                }
                //根据appid获取下属所有menu信息
                List<AppMenuInfo> appMenuInfos = AppMetadataCache.getAppMenusInfoByAppId(KEY_LEVEA_APPID);
                //遍历所有menu信息获取到formId为9z8e_gjt_hr_qjsqd并且是单据的menuId
                String menuId = appMenuInfos
                        .stream()
                        .filter(appMenuInfo -> KEY_LEAVE_APPLY.equals(appMenuInfo.getFormId()) && "BillShowParameter".equals(appMenuInfo.getParamType()))
                        .findFirst()
                        .get()
                        .getId();
                //拼接单据的pageId,格式为menuId+主页面的pageId
                String billPageId = menuId + mainViewPageId;
                //判断当前单据有没有被打开
                if (null != mainView.getViewNoPlugin(billPageId)) {
                    //如果已经被打开则激活该页面
                    hashMap = new HashMap<>();
                    hashMap.put("view", this.getView());
                    hashMap.put("appname", "请假申请单");
                    hashMap.put("formnumber", KEY_LEAVE_APPLY);
                    hashMap.put("parametertype", "BillShowParameter");
                    PopAppUtils.activatePage(billPageId, this.getView(), hashMap);
                } else {
                    //如果没有打开则弹出该页面
                    //创建弹出的单据对象并设置相关属性
                    BillShowParameter billShowParameter = new BillShowParameter();
                    //打开的单据页面标识
                    billShowParameter.setFormId(KEY_LEAVE_APPLY);
                    //打开的单据标题
                    billShowParameter.setCaption("请假申请单");
                    //打开的应用appId
                    billShowParameter.setAppId(KEY_LEVEA_APPID);
                    //设置customParam中的appid属性值(必须设置该属性才能出现菜单栏)
                    billShowParameter.setCustomParam("appid", appId);
                    //打开风格,这里为新增页签的写法
                    billShowParameter.getOpenStyle().setShowType(ShowType.NewTabPage);
                    //设置页签容器的key,这里为应用中的页签容器的标识
                    billShowParameter.getOpenStyle().setTargetKey("_submaintab_");
                    //设置单据的appid
                    billShowParameter.setPageId(billPageId);
                    //获取弹出应用首页的页面模型
                    IFormView qjglView = this.getView().getView(appPageId);
                    qjglView.showForm(billShowParameter);
                    this.getView().sendFormAction(qjglView);
                }
            }
        }
    }
    

    工具类

    package kd.bos.plugin.leave.message;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    
    import kd.bos.context.RequestContext;
    import kd.bos.form.IFormView;
    
    /**
     * <p>Title: </p>
     * <p>
     *    Description:
     *    工具类PopLeaveAppPlugin会调用
     * </p>
     * <p>Copyright: Copyright (c) 2020</p>
     * @author xx
     * @date 2020年3月21日
     * @version 1.0
     */
    public class PopAppUtils {
        public static void activatePage(String pageID, IFormView view, Map<String, Object> map) {
            String menuId = pageID.split("root")[0];
            IFormView childView = view.getViewNoPlugin(pageID);
            if ("bos".equals(childView.getFormShowParameter().getServiceAppId())) {
                childView = view.getView(pageID);
            }
    
            if (childView != null) {
                if (!view.getPageId().equalsIgnoreCase(childView.getPageId())) {
                    Map<String, Object> customparameters = (HashMap) map.get("customparameters");
                    childView.getFormShowParameter().getCustomParams().remove("messageId");
                    childView.getFormShowParameter().getCustomParams().remove("tabType");
                    childView.getFormShowParameter().getCustomParams().remove("openPage");
                    if (customparameters != null) {
                        if (customparameters.get("messageId") != null) {
                            childView.getFormShowParameter().setCustomParam("messageId", customparameters.get("messageId"));
                        }
    
                        if (customparameters.get("tabType") != null) {
                            childView.getFormShowParameter().setCustomParam("tabType", customparameters.get("tabType"));
                        }
    
                        if (customparameters.get("openPage") != null) {
                            childView.getFormShowParameter().setCustomParam("openPage", customparameters.get("openPage"));
                        }
                    }
    
                    childView.getFormShowParameter().setHasRight(true);
                    childView.activate();
                    if ("bos".equals(childView.getFormShowParameter().getServiceAppId())) {
                        childView.updateView();
                    }
    
                    view.sendFormAction(childView);
                    String userId = RequestContext.get().getUserId();
                    String time = (new SimpleDateFormat("yyy-MM-dd hh:mm:ss")).format(new Date(System.currentTimeMillis()));
                }
            } else {
                view.showTipNotification("系统已超时,请重新刷新登录!");
            }
        }
    }
    

    注册插件

    配置应用

    1. 启动新建的应用
    1. 配置应用菜单
    1. 管理员账号登录 administrator/1234567 授权
    1. 应用页面添加云和应用

    测试

    如下列动图所示,我点, 我再点,我点点点,测试成功。。

    以上就是我关于 金蝶云苍穹应用层弹出新应用并默认打开新页签案例 知识点整理与总结的全部内容,希望对你有帮助。。。。。。。


    分割线

    相关文章

      网友评论

          本文标题:金蝶云苍穹应用层弹出新应用并默认打开新页签案例

          本文链接:https://www.haomeiwen.com/subject/iszqdktx.html