事件
Java触发器是执行后端Java代码逻辑的容器,在客户端视图页面加载时被触发,由开发者通过Java程序影响视图页面显示内容。
步骤
- 打开视图配置界面
- 鼠标移动视图名称上,点击"高级选项"弹出侧边栏,点击"事件"页签
- 对事件实现类进行注册/删除
配置项 | 说明 |
---|---|
触发器类型 | 各种事件名称,不同的事件要求开发人员实现的接口不同,每个事件只允许注册一个类 |
Java类名 | 一个遵循AWS事件接口实现的Java程序,格式:类路径+类名 |
注册 | 将指定的Java类注册到组件,多次为同一个组件执行【注册】等同修改 |
删除 | 将Java类从一个事件中移走 |
视图加载前的触发器
项 | 说明 |
---|---|
接口 | DataWindowBeforeLoadEventInterface |
返回值 | 一个JSON结构 |
常见使用场景
1.针对不同用户是否可查看该视图 2.实现参数处理
开发示例
import java.util.HashMap;
import com.actionsoft.bpms.dw.design.event.DataWindowBeforeLoadEventInterface;
import com.actionsoft.bpms.dw.exec.component.DataView;
import com.actionsoft.bpms.dw.exec.component.model.awsdw.ExecDataViewModel;
import com.actionsoft.bpms.server.UserContext;
import com.alibaba.fastjson.JSONObject;
/**
* 视图加载前的触发器
*
* @return 格式化好的sql语句 说明: 1.必须实现类 com.actionsoft.bpms.dw.design.event.DataWindowBeforeLoadEventInterface 2.此示例实现的是 : admin用户不能查看此视图
*/
public class DataWindowBeforeLoadEvent implements DataWindowBeforeLoadEventInterface {
public boolean excute(UserContext me, DataView view) {
//1.可以实现判断权限的功能
// if (me.getUID().equals("admin")){
// return false;
// }
//2.实现参数处理
ExecDataViewModel execDataViewModel = (ExecDataViewModel) view.getDw().getExtendParams().get("ExecDataViewModel");
JSONObject extendParams = execDataViewModel.getExtendConfig();
//2.1.获取url自定义参数
JSONObject urlConfig = extendParams.getJSONObject("urlConfig");
if (urlConfig != null) {
JSONObject stObj = (JSONObject) urlConfig.get("st");
if (stObj != null) {
//可以获取URL传入的自定义的参数(小心SQL注入)
String urlParamA = stObj.getString("urlParamA");
}
}
//2.2.把需要的业务参数放到请求参数中,前端页面可以通过DWApi.view.model.extendConfig.params获取相关参数
JSONObject params = new JSONObject();
params.put("typeA", 1);
params.put("typeB", 2);
params.put("id", 5566);
extendParams.put("params", params);
//3.可以操作部分属性,此示例会取消所有条件查询
execDataViewModel.getSearcher().getLikecondition().clear();
return true;
}
}
注册事件
进入视图模型配置页面,点击【视图名称 > 高级选项】,打开侧边栏切换至【事件】页签,注册事件。
调试运行
完成事件注册后,点编辑视图模型主页右上角【预览】按钮进行调试运行。
格式化表格SQL语句的触发器
项 | 说明 |
---|---|
接口 | DataWindowFormatSQLEventInterface |
返回值 | 一个SQL片段 |
常见使用场景
不同用户查看数据不同
开发示例
import java.util.Map;
import com.actionsoft.bpms.dw.design.event.DataWindowFormatSQLEventInterface;
import com.actionsoft.bpms.dw.exec.component.DataView;
import com.actionsoft.bpms.server.UserContext;
public class DataWindowFormatSQLEvent implements DataWindowFormatSQLEventInterface {
/**
* 格式化SQL语句的触发器
*
* @param me 用户上下文
* @param view dw视图对象
* @param sql sql语句
* @return 格式化好的sql语句
* 说明:1.必须实现类 com.actionsoft.bpms.dw.design.event.DataWindowFormatSQLEventInterface
* 2.示例说明:只有admin用户能够查询所有数据,其他用户只能查看自己创建的信息
*/
public String formatSQL(UserContext me, DataView view, String sql) {
if (!"admin".equals(me.getUID())) {
sql = sql.replace("1=1", "createuser = '" + me.getUID() + "'");
}
// 如果需要改变查询条件的值
Map<String, Object> sqlParam = view.getDatagrid().getSqlParams();
sqlParam.put("NAME", "森林好小子");// 注意多个同名参数是以NAME,NAME0,NAME1,NAME2...做为key来存放值
return sql;
}
}
注册事件
进入视图模型配置页面,点击【视图名称 > 高级选项】,打开侧边栏切换至【事件】页签,注册事件。
调试运行
完成事件注册后,点编辑视图模型主页右上角【预览】按钮进行调试运行。
删除数据后的触发器
项 | 说明 |
---|---|
接口 | DataWindowAfterDeleteInterface |
返回值 | 无 |
常见使用场景
一般用于刷新缓存
开发示例
import java.util.List;
import com.actionsoft.apps.AppPlatformConfig;
import com.actionsoft.apps.resource.AppTeam;
import com.actionsoft.bpms.bo.engine.BO;
import com.actionsoft.bpms.dw.design.event.DataWindowAfterDeleteInterface;
import com.actionsoft.bpms.server.UserContext;
/**
* 数据删除后触发器
*
* 说明:1.必须实现类com.actionsoft.bpms.dw.design.event.DataWindowAfterDeleteInterface
* 2.一般用于刷新缓存
*/
public class DataWindowAfterDeleteEvent implements DataWindowAfterDeleteInterface {
/**
* @param me 用户上下文
* @param boDatas 删除后的旧数据(用于逻辑处理)
* @param boName 表名称
*/
@Override
public void excute(UserContext me, List<BO> boDatas, String boName) {
//此示例实现删除该表数据后删除DEVTeam组中userid的成员
for (BO formData : boDatas) {
String userid = formData.getString("USERID");
AppTeam team = AppPlatformConfig.getAppTeamById( "DEVTeam");
team.getMembers().remove(userid);
}
}
}
注册事件
进入视图模型配置页面,点击【视图名称 > 高级选项】,打开侧边栏切换至【事件】页签,注册事件。
调试运行
完成事件注册后,点编辑视图模型主页右上角【预览】按钮进行调试运行。
格式化表格数据的触发器
项 | 说明 |
---|---|
接口 | DataWindowFormatDataEventInterface |
返回值 | 无 |
常见使用场景
1. 更改页面数据显示 2. 格式化导出数据
开发示例
import java.sql.ResultSet;
import java.sql.SQLException;
import com.actionsoft.bpms.dw.design.event.DataWindowFormatDataEventInterface;
import com.actionsoft.bpms.dw.exec.component.Column;
import com.actionsoft.bpms.dw.exec.data.DataSourceEngine;
import com.actionsoft.bpms.server.UserContext;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class DataWindowFormatDataEvent implements DataWindowFormatDataEventInterface {
/**
* 格式化表格数据的触发器
*
* @param me 用户上下文
* @param JSONArray 数据对象
* 说明:1.必须实现类 com.actionsoft.bpms.dw.design.event.DataWindowFormatDataEventInterface
* 2.此示例实现的是 : 如果字段"ZT",为0显示错误图标,为1显示正确图标,为其他显示警示图标
* 3.如果需要在数据导出时应用格式化数据请实现formatGridExport方法(如果不需要则不实现)
*/
public void formatData(UserContext me, JSONArray datas) {
for (Object datao : datas) {
JSONObject data = (JSONObject) datao;
String columnValue = data.getString("ZT"); // 注意有些特殊组件的值为JSONObject,请根据情况使用getJSONObject获取相应值
switch (columnValue) {
case "0":
columnValue = "<img src=../apps/_bpm.platform/img/model/form_designer/error.png border=0/>";
break;
case "1":
columnValue = "<img src=../apps/_bpm.platform/img/model/form_designer/ok.png border=0/>";
break;
default:
columnValue = "<img src=../apps/_bpm.platform/img/model/form_designer/warn.png border=0/>";
break;
}
//虚拟字段VIRTUALBUTTON ,组件为按钮不显示
//data.put("VIRTUALBUTTON" ,"");
//data.put("COLUMNTYPE_VIRTUALBUTTON", "");
data.put("ZT" + DataSourceEngine.AWS_DW_FIXED_CLOMUN_SHOW_RULE_SUFFIX, columnValue);
}
}
/**
* 格式化导出数据
*
* @param me 用户session
* @param rs 数据库结果集
* @param colModel 字段的相关配置模型
* @param fieldId 字段名
* @return null 时不执行
*/
public String formatGridExport(UserContext me, ResultSet rs, Column colModel, String fieldId) {
String ss = null;
try {
if (fieldId.equals("NAME")) { // 如果名字是NAME
ss = rs.getString(fieldId) + "Helden sterben nicht!"; // 则执行
}
} catch (SQLException e) {
e.printStackTrace();
}
return ss;
}
}
注册事件
进入视图模型配置页面,点击【视图名称 > 高级选项】,打开侧边栏切换至【事件】页签,注册事件。
调试运行
完成事件注册后,点编辑视图模型主页右上角【预览】按钮进行调试运行。
自定义表格数据的触发器
项 | 说明 |
---|---|
接口 | DataWindowCustomGridDataInterface |
返回值 | 一个JSON对象,代表一套完整的表格数据 |
常见使用场景
1. 更改页面数据显示 2. 格式化导出数据
开发示例
import java.util.Map;
import com.actionsoft.bpms.commons.mvc.view.ResponseObject;
import com.actionsoft.bpms.dw.design.event.DataWindowCustomGridDataInterface;
import com.actionsoft.bpms.dw.exec.component.DataView;
import com.actionsoft.bpms.server.UserContext;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class DataWindowCustomGridDataEvent implements DataWindowCustomGridDataInterface {
/**
* 自定义表格数据的触发器
*
* @param me 用户上下文
* @param view 当前视图对象
* @param pageNow 要查询的页数
* @param condition 查询条件
* @param eventParams 附加属性
* 说明:1.必须实现类com.actionsoft.bpms.dw.design.event.DataWindowCustomGridDataInterface
* 2.示例说明:自定义返回一套数据(需要做好创建好数据列表)
*/
@Override
public JSONObject excute(UserContext me, DataView view, int pageNow, JSONObject condition, Map<String, Object> eventParams) {
ResponseObject responseObject = ResponseObject.newOkResponse();
// 数据源可以通过自定义代码进行获取例如从WebService获取的数据源但要符合相应的JSON格式
//JSON格式如下
JSONObject maindata = new JSONObject();
maindata.put("identifier", "ID");//主键ID列名称
maindata.put("pageCount", 5); //总页数
maindata.put("pageNow", 1);//当前页
//分页信息
JSONObject pageInfo = new JSONObject();
pageInfo.put("totalsum", new JSONObject());
pageInfo.put("total", 12);//数据总条数
pageInfo.put("from", 1); //当前页显示,从第几条起
pageInfo.put("to", 4); //当前页显示,到第几条结束
maindata.put("pageInfo", pageInfo);
//数据信息
JSONArray items = new JSONArray();
//其中一条信息
JSONObject item = new JSONObject();
item.put("NUM", 26);
item.put("TIME", "2018");
item.put("PLACE", "日本东京>");
item.put("NAME", "小怪兽>");
item.put("TYPE", "动画>");
item.put("ID", "8cb8d560-736d-4e24-aa3a-414f7e505acc");
item.put("AWS_DW_SELECTED_ID", "8cb8d560-736d-4e24-aa3a-414f7e505acc");//这个参数值要与对应主键ID的值一致
//一条信息的附加信息(防止空指针)
JSONObject AWS_DW_FIXED_COLUMN_STYLE = new JSONObject();
AWS_DW_FIXED_COLUMN_STYLE.put("statusImg", "");
AWS_DW_FIXED_COLUMN_STYLE.put("fontColor", "");
AWS_DW_FIXED_COLUMN_STYLE.put("priority", "");
AWS_DW_FIXED_COLUMN_STYLE.put("isReaded", 1);
AWS_DW_FIXED_COLUMN_STYLE.put("isCanDelete", 1);
AWS_DW_FIXED_COLUMN_STYLE.put("h_s_l", 0);
item.put("AWS_DW_FIXED_COLUMN_STYLE", AWS_DW_FIXED_COLUMN_STYLE);
items.add(item);
maindata.put("items", items);
responseObject.put("maindata", maindata);
//标签查询信息
responseObject.put("ls", new JSONArray());
return responseObject.toJSONObject();
}
}
注册事件
进入视图模型配置页面,点击【视图名称 > 高级选项】,打开侧边栏切换至【事件】页签,注册事件。
调试运行
完成事件注册后,点编辑视图模型主页右上角【预览】按钮进行调试运行。
导出事件的触发器
项 | 说明 |
---|---|
接口 | DataWindowExportGridEventInterface |
返回值 | 无 |
常见使用场景
1. 视图数据导出时,更改导出内容,如将表格中的附件一并导出
开发示例
import java.io.File;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import com.actionsoft.apps.AppsConst;
import com.actionsoft.apps.resource.plugin.profile.DCPluginProfile;
import com.actionsoft.bpms.bo.design.model.BOItemModel;
import com.actionsoft.bpms.commons.cache.iae.model.IAEModel;
import com.actionsoft.bpms.commons.formfile.dao.FormFileDao;
import com.actionsoft.bpms.commons.formfile.model.delegate.FormFile;
import com.actionsoft.bpms.dw.design.event.DataWindowExportGridEventInterface;
import com.actionsoft.bpms.dw.design.model.DWModel;
import com.actionsoft.bpms.dw.exec.component.Column;
import com.actionsoft.bpms.server.UserContext;
import com.actionsoft.bpms.server.fs.DCContext;
import com.actionsoft.bpms.server.fs.dc.DCConst;
import com.actionsoft.bpms.server.fs.dc.DCProfileManager;
import com.actionsoft.bpms.server.fs.dc.DCStoreUtil;
import com.actionsoft.bpms.util.UtilFile;
import com.actionsoft.i18n.I18nRes;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.csvreader.CsvWriter;
public class DataWindowExportGridEvent implements DataWindowExportGridEventInterface {
/**
* 示例:用于把DW数据中的附件与excel一同压缩后导出
*
* @param me 用户上下文
* @param eventContext 事件上下文
*/
@Override
public void exportAfter(UserContext me, Map<String, Object> eventContext, CreateExportFile createExportFile) {
DWModel dwModel = (DWModel) eventContext.get("DWModel");//dw模型对象(仅用于读取,禁止修改,否则后果自负)
String cacheId = (String) eventContext.get("cacheId");//导出任务ID
JSONObject configJson = (JSONObject) eventContext.get("configJson");//导出任务配置
String viewId = (String) eventContext.get("viewId");//当前viewId
List<Column> showColumnList = (List<Column>) eventContext.get("showColumnList");//导出字段列表
JSONObject multiHeaderJson = (JSONObject) eventContext.get("multiHeaderJson");//多级表头配置(如果需要)
JSONArray exportData = (JSONArray) eventContext.get("exportData");//导出的数据(包含ID和BINDID)
String type = (String) eventContext.get("type");//导出格式
if (type.equals("xlsx")) {
SXSSFWorkbook wb = (SXSSFWorkbook) eventContext.get("workbook");//poi对象,按需获取避免报错
}
if (type.equals("xls")) {
HSSFWorkbook wb = (HSSFWorkbook) eventContext.get("workbook");//poi对象,按需获取避免报错
}
if (type.equals("csv")) {
CsvWriter wb = (CsvWriter) eventContext.get("workbook");//Writer,按需获取避免报错
}
//找出field字段配置
Column fieldColumn = null;
for (Column column : showColumnList) {
//F_YXVFCZJY 是附件字段名称
if (column.getField().equals("F_YXVFCZJY")) {
fieldColumn = column;
break;
}
}
//找到bo配置
BOItemModel boItemModel = (BOItemModel) fieldColumn.getExtendParams().get("boItemModel");
String groupValue = "dw~temp~file";
String zipDir = "tempzip";
String fileValue = zipDir + "/" + cacheId;
DCPluginProfile profile = DCProfileManager.getDCProfile(AppsConst.SYS_APP_PLATFORM, DCConst.REPOSITORY_TEMP);
Map<String, Integer> msi = new HashMap<>();
//遍历数据,找到该字段的所有文件,统一copy到同一路径下
String appId = AppsConst.SYS_APP_PLATFORM;//;
exportData.forEach(o -> {
JSONObject rowData = (JSONObject) o;
FormFileDao dao = new FormFileDao();// 查询当前表中 当前字段的所有文件
List<FormFile> files = dao.queryByBoFieldName(rowData.getString("ID"), boItemModel.getName(), "FILENAME", true);
for (FormFile fFile : files) {
String fieldName = fFile.getFileName();
DCContext fileDc = new DCContext(me, DCProfileManager.getDCProfile(dwModel.getAppId(), DCConst.REPOSITORY_UI_FILE), dwModel.getAppId(), fFile.getId(), fFile.getBoItemName(), fieldName);
try {
String toFieldName = fieldName;//防止重名
if (msi.containsKey(fieldName)) {
int count = msi.get(fieldName) + 1;
toFieldName = fieldName + count; //注意:此处不提供处理后缀
msi.put(fieldName, count);
} else {
msi.put(fieldName, 0);
}
InputStream in = DCStoreUtil.read(fileDc);
DCStoreUtil.write(new DCContext(me, profile, appId, groupValue, fileValue, fieldName), in);
} catch (Exception e) {
e.printStackTrace();
}
}
});
//执行excel的文件写入
//!!!注意如果执行 createExportFile.execute,则必须执行 eventContext.put("dc", exportFiledc);否则造成重复创建导出文件,并造成错误
DCContext exportFiledc = createExportFile.execute();//此处进行创建导出的excel文件
//重新命名excel文件名称
String fileTitle = I18nRes.findValue(me.getLanguage(), dwModel.getTitle().getLabel() + "(" + dwModel.getViewById(viewId).getLabel() + ")");
exportFiledc.setFileNameShow(fileTitle + "." + type);
//复制excel文件到压缩目录
try {
InputStream in = DCStoreUtil.read(exportFiledc);
DCStoreUtil.write(new DCContext(me, profile, appId, groupValue, fileValue, exportFiledc.getFileNameShow()), in);
} catch (Exception e) {
e.printStackTrace();
}
//压缩该目录的所有文件
String zipFileName = "zip文件名" + ".zip";
DCContext zipDcContext = new DCContext(me, profile, appId, groupValue, zipDir, zipFileName);
zipDcContext.setFileNameShow(zipFileName);
try {
UtilFile.zipCompress(zipDcContext.getPath() + cacheId, new File(zipDcContext.getFilePath()));
} catch (Exception e) {
e.printStackTrace();
}
//!!!注意,如果在上下文参数中放入dc,程序会使用此dc作为文件下载入口,不再执行默认生成导出文件的行为
eventContext.put("dc", zipDcContext);//放入zip文件让程序进行下载
}
/**
* 导出前事件
*
* @param me 用户上下文
* @param eventContext 事件上下文
*/
@Override
public void exportBefore(UserContext me, Map<String, Object> eventContext) {
//无操作空实现即可
}
/**
* 导出前准备事件
* 示例:更改导出显示的名称
*
* @param me 用户上下文
* @param eventContext 事件上下文
*/
@Override
public void exportPrepare(UserContext me, Map<String, Object> eventContext) {
DWModel dwModel = (DWModel) eventContext.get("DWModel");//dw模型对象(仅用于读取,禁止修改,否则后果自负)
String cacheId = (String) eventContext.get("cacheId");//导出任务ID
JSONObject configJson = (JSONObject) eventContext.get("configJson");//导出任务配置
String viewId = (String) eventContext.get("viewId");//当前viewId
IAEModel iaeModel = (IAEModel) eventContext.get("iaeModel");//任务缓存
iaeModel.setFileName("zip文件名" + ".zip");
}
}
注册事件
进入视图模型配置页面,点击【视图名称 > 高级选项】,打开侧边栏切换至【事件】页签,注册事件。
调试运行
完成事件注册后,点编辑视图模型主页右上角【预览】按钮进行调试运行。
Seven
010-62962343-690
liujx@actionsoft.com.cn
感谢您对该文档的关注!如果您对当前页面内容有疑问或好的建议,请与我联系。如果您需要解答相关技术问题请登录AWS客户成功社区