金蝶云苍穹-插件开发(五)携带数据到打开页面、调度任务插件

携带数据到打开页面

这个是一个很简单的知识点,是关于跳转页面的API:FormShowParameter  的使用。这篇文章的知识点很少,主要考虑到有的读者可能不熟悉这种方法的用法,其实这种方法非常有用,能用在很多情况。所以让我边大概演示一个案例边讲解知识点。

我的案例是点击报表上的操作项,展示书籍信息以及展示本书相关评论区。

关于获取报表上的当前行的id的方法的详解,见插件开发(三)。

 展示效果如图,方便你们参考字段,做的有点丑,见谅见谅。你们可以调整调整页面,不要做的我这么丑,书籍封面用的基础资料属性字段,在插件中就不用做相关赋值。

报表上的插件:

public class BookShowInfo extends AbstractReportFormPlugin implements Plugin {
    @Override
    public void beforeDoOperation(BeforeDoOperationEventArgs e) {

        super.beforeDoOperation(e);
        String operateKey = ((FormOperate) e.getSource()).getOperateKey();
        if(operateKey.equals("querybookinfo")){
            //获取当前的报表选中当前行
            Object primaryKeyValue = null;
            ReportList reportList = this.getControl("reportlistap");
            int[] selectedRows = reportList.getEntryState().getSelectedRows();
            for (int selectedRow : selectedRows) {
                DynamicObject rowData = reportList.getReportModel().getRowData(selectedRow);
                String abq2_number = rowData.getString("abq2_number");
                DynamicObject dy = BusinessDataServiceHelper.loadSingle("abq2_books_info",
                        "number,id",
                        (new QFilter("number", QCP.equals, abq2_number)).toArray());
                primaryKeyValue = dy.getLong("id");
                break;
            }

            //跳转弹窗的界面
            FormShowParameter formShowParameter = new MobileFormShowParameter();
            formShowParameter.setFormId("abq2_book_window");
            formShowParameter.setCustomParam("BookId",primaryKeyValue);
            formShowParameter.getOpenStyle().setShowType(ShowType.Modal);
            this.getView().showForm(formShowParameter);
        }
    }
}

我使用的是一个弹窗的动态表单为样例,一般的页面都可以使用,FormShowParameter的常用方法如下:

  • setFormId:参数是要打开的页面的标识,也就是页面编码
  • getOpenStyle.setShowType:参数给ShowType的枚举对象,常用的有,Modal就是模态(通常给弹窗使用),InCurrentForm就是替换掉现处的页面,MainNewTabPage是新建一个页签
  • showForm:执行展示页面的动作
  • setCustomParam:将信息以key-value的形式传给新跳转的页面,第一个参数是key,第二个参数是value

具体使用见上案例,接着是打开的页面的插件:

public class BookInfoWindow extends AbstractFormPlugin implements Plugin {
    @Override
    public void afterCreateNewData(EventObject e) {
        //将课程信息写到弹窗页面上
        super.afterCreateNewData(e);
        Object primaryKey = this.getView().getFormShowParameter().getCustomParam("BookId");
        if (primaryKey != null) {
            QFilter idFilter = new QFilter("id", QCP.equals,primaryKey);
            DynamicObject book = BusinessDataServiceHelper.loadSingle("abq2_books_info",
                    "id," + //内码
                            "abq2_picturefield," + //书籍封面
                            "name," + //书名
                            "abq2_textfield," + //作者
                            "group," + //书籍分类
                            "abq2_introduction," + //书籍介绍
                            "abq2_textfield1",  //出版社
                    new QFilter[]{idFilter});
            this.getModel().setValue("abq2_auth",book.getString("abq2_textfield"));
            this.getModel().setValue("abq2_groupfield",book.getLong("group.id"));
            this.getModel().setValue("abq2_textfield",book.getString("abq2_textfield1"));
            this.getModel().setValue("abq2_basedatafield",primaryKey);

            this.getModel().setValue("abq2_textareafield333",book.getString("abq2_introduction"));

            //进行单据列表的过滤,使得只显示关于显示该书籍相关的评论
            BillList billList = this.getControl("abq2_billlistap");
            billList.setFilter(new QFilter("abq2_basedatafield.id",QCP.equals,book.getLong("id")));//只展示此书的评论
            billList.setOrderBy("abq2_datefield desc");//根据发表时间降序
            billList.refreshData();
            billList.refresh();
        }
    }

    /**
     * 关于发送评论的相关逻辑
     * @param args
     */
    @Override
    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
        super.beforeDoOperation(args);
        String operateKey = ((FormOperate) args.getSource()).getOperateKey();
        if (operateKey.equals("makecommand")) {
            String command = (String) this.getModel().getValue("abq2_send_command");

            if (command == null || command.equals("")){
                this.getView().showTipNotification("请输入评论");
                return;
            }

            //新建一个评论,将评论基础资料实体创建
            DynamicObject dynamicObject = BusinessDataServiceHelper.newDynamicObject("abq2_commands");
            StringBuilder sb1 = new StringBuilder(); //生成一个单据编号
            sb1.append("COMMAND-");
            for (int i = 1; i <= 10; i++) {
                int ascii = 48 + (int) (Math.random() * 9);
                char c = (char) ascii;
                sb1.append(c);
            }
            dynamicObject.set("number",sb1);
            dynamicObject.set("status","A");
            dynamicObject.set("enable",1);
            dynamicObject.set("abq2_datefield",new Date());
            dynamicObject.set("creator", RequestContext.get().getCurrUserId());
            //评论者设置为当前用户
            dynamicObject.set("abq2_userfield",RequestContext.get().getCurrUserId());
            Object primaryKey = this.getView().getFormShowParameter().getCustomParam("BookId");
            //绑定评论相应的书籍
            dynamicObject.set("abq2_basedatafield",primaryKey);
            //评论内容的赋值
            dynamicObject.set("abq2_textareafield",command);
            SaveServiceHelper.saveOperate("abq2_commands",new DynamicObject[]{dynamicObject},null);
            BillList billList = this.getControl("abq2_billlistap");
            billList.setFilter(new QFilter("abq2_basedatafield.id",QCP.equals,primaryKey));
            billList.setOrderBy("abq2_datefield desc");
            billList.refreshData();
            billList.refresh();
            //发送评论之后,清空原来的评论的内容
            this.getModel().setValue("abq2_send_command",null);
            this.getView().showSuccessNotification("评论成功");
        }
    }
}

在页面刚打开时,要在afterCreateNewData事件中编写页面刚展示的效果。

this.getView().getFormShowParameter().getCustomParam(key)   这个方法就是获取以上setCustomParam传过来的数据,当然,通常都是将某个基础资料/单据的pkid传过来,再根据这个id进行下一步的逻辑。此处就是根据这个书籍的id,加载出了这个书籍的信息,并将其用setValue的方式初始化展示在页面上

接着就是评论区的操作,评论是基础资料,评论区是一个单据列表展示了评论。其中setFilter方法是通过QFilter的方式,限制什么数据该展示在单据列表中,此处是评论绑定的书籍是本书籍的才展示出来,也是通过上一步获取到的pkid来过滤。setOrderBy方法是排序列表中的行,格式是setOrderBy("字段名 排序方式"),排序方式为asc为升序,desc为降序。此处根据发表时间降序排列。

可以发现很多地方使用了这个上一个页面传过来的pkid,通过这个id获取到了相关信息。

调度任务插件

我这以一个案例讲解一个常用的调度任务的插件,每日课程提醒,当然这里是插件开发教程,只讲解插件开发,配置方面请见社区。

先上代码:

public class CourseDailyTask extends AbstractTask implements Plugin {
    /**
     * 获取当前日期是星期几
     * @param date
     * @return 当前日期是星期几
     */
    public String getWeekOfDate(Date date) {
        String[] weekDays = { "7", "1", "2", "3", "4", "5", "6" };
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0)
            w = 0;
        return weekDays[w];

    }

    @Override
    public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
        HashMap<String, String> hashMap = new HashMap<>();

        Date date = new Date();
        String weekOfDate = getWeekOfDate(date);

        QFilter idFilter = new QFilter("abq2_textfield3", QCP.equals,weekOfDate);


        DynamicObject[] optionCourses = BusinessDataServiceHelper.load("abq2_my_course",
                "abq2_my_course_stu," + //课程内码
                        "name," + //课程名称
                        "abq2_textfield3," + //星期
                        "abq2_textfield1," + //教室
                        "abq2_textfield," + //教师
                        "abq2_textfield4," + //年级
                        "creator," + //学生
                        "abq2_textfield2",  //课节
                new QFilter[]{new QFilter("creator",QCP.equals, RequestContext.get().getCurrUserId()),idFilter});

        JSONArray jsonArray = new JSONArray();
        for (DynamicObject optionCourse : optionCourses) {
            JSONObject jsonObject = new JSONObject();
            String name = optionCourse.getString("name");
            String classTimes = optionCourse.getString("abq2_textfield2").replaceAll(",","  ");
            String classroom = optionCourse.getString("abq2_textfield1");
            jsonObject.put("courseName",name);
            jsonObject.put("classTimes",classTimes);
            jsonObject.put("classroom",classroom);
            jsonArray.add(jsonObject);
        }
        hashMap.put("courseToday",jsonArray.toJSONString());

        //调用GPT开发平台微服务
        Object[] params = new Object[] {
                //GPT提示编码
                getPromptFid("prompt-2407121131129B"),
                "",
                hashMap
        };
        Map<String, Object> result = DispatchServiceHelper.invokeBizService("ai", "gai", "GaiPromptService", "syncCall", params);
        JSONObject jsonObjectResult = new JSONObject(result);
        JSONObject jsonObjectData = jsonObjectResult.getJSONObject("data");
        String llmValue = jsonObjectData.getString("llmValue");

        sendMessage(requestContext,llmValue);
    }

    public long getPromptFid(String billNo) {
        DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("gai_prompt",
                "number," +
                        "id",
                (new QFilter("number", QCP.equals, billNo)).toArray());
        return dynamicObject.getLong("id");
    }

    private void sendMessage(RequestContext requestContext,String message){
        MessageInfo messageInfo = new MessageInfo();
        LocaleString title = new LocaleString();
        title.setLocaleValue_zh_CN("今日课程信息");
        messageInfo.setMessageTitle(title);
        LocaleString context = new LocaleString();
        context.setLocaleValue_zh_CN(message);
        messageInfo.setMessageContent(context);

        ArrayList<Long> ids = new ArrayList<Long>();

        ids.add(requestContext.getCurrUserId());

        messageInfo.setUserIds(ids);
        messageInfo.setType(MessageInfo.TYPE_NOTICE);
        messageInfo.setTag("课程服务");

        MessageCenterServiceHelper.sendMessage(messageInfo);
    }
}

execute事件就是调度任务执行的逻辑,当然可以和我这种一样,加入GPT微服务调用来更好地产生课程提醒信息。

execute方法里面的代码逻辑较为简单其中的API也比较容易熟悉,主要对sendMessage方法讲解。

我这里使用的MessageInfo依赖是kd.bos.workflow.engine.msg.info.MessageInfo,其他的依赖用法会有区别,这里只对这个依赖进行讲解。

  • setMessageTitle方法是设置消息标题,参数类型为LocaleString,可以按案例的方式进行类型的操作
  • setMessageContent方法是设置消息内容,参数类型也是LocaleString

  • setType方法是设置消息类型,使用MessageInfo的枚举对象作为参数,有以下这些

  • setTag方法是设置消息标签

  • setUserIds是设置发送对象,参数是一个ArrayList<Long>类型的集合,其中的元素是对应要发送的用户的id

最后使用MessageCenterServiceHelper.sendMessage方法进行消息的发送即可

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二狗mao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值