携带数据到打开页面
这个是一个很简单的知识点,是关于跳转页面的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方法进行消息的发送即可