# 投票竞选
# 1.场景介绍
竞选人发起投票流程,由所在机构人员投票,支持率大于60%则当选,投票结束后发送站内信通知竞选结果。
# 2.效果展示
# 3.实现思路
使用按钮提交参数,从相关数据里获取提交参数的值,判断投票结果并发送站内信通知。
# 4.操作步骤
本示例使用EOS8.3.2 express版+Mysql5.7进行开发
# 4.1、数据初始化并创建实体
初始化脚本如下:
drop table if exists Vote;
create table Vote (
id varchar(255) not null,
name varchar(255) comment '竞选人姓名',
result varchar(255) comment '竞选结果',
position varchar(255) comment '竞选岗位',
primary key (id)
) comment='投票';
# 4.2、生成页面
在实体上右键-生成页面,然后在生成的页面里调整"竞选结果"的控件状态为隐藏
# 4.3、流程开发
新建投票流程,如下图:
# 4.3.1 发起投票环节设置
参与者"从参与者列表获得",添加具体的某一个员工
表单状态为"新增"
# 4.3.2 投票环节设置
参与者"从参与者列表获得",添加具体的某一个机构
操作权限中提交按钮参数设置: 首先复制一个提交按钮,修改两个提交按钮名称分别为支持、反对, 添加提交按钮参数: 支持 touresult 值为1 反对 touresult 值为0
启动多工作项,多工作项创建策略为"按操作员个数创建工作项"
# 4.3.3 通知投票结果环节设置
参与者为流程启动者;消息通知后续定义站内信模板后再配置
# 4.4、逻辑流开发及调用
# 4.4.1 逻辑流开发
在服务-流程事件上右键新建服务,如下图:
双击逻辑流空白处,定义变量及参数,如下图:
脚本图元中代码编写,实现从相关数据获取投票结果并计算结果
代码如下:
//从相关数据获取投票结果
List<Map<String,Object>> result = context.relative
int agree = 0;
int disagree = 0;
for(Map<String,Object> map: result){
Object vote = map.get("touresult");
if(Objects.isNull(vote)){
continue;
}
if(vote.toString().equals("1")){
agree = agree+1;
}else if(vote.toString().equals("0")){
disagree = disagree +1
}
}
//支持率大于60%即当选
int total = agree+disagree;
if(agree/total >= 0.6){
context.result = "当选"
}else{
context.result = "未当选"
}
赋值图元设置:
调用运算逻辑updateEntityByTemplate,更新投票结果,设置如下:
调用运算逻辑setRelativeData,更新投票结果,设置如下:
# 4.4.2 逻辑流调用
双击"投票"的人工活动图元,在引擎事件Tab页新增调用,如下图:
注意!本示例基于express版进行开发,调用方式为同步,事件动作类型选逻辑流。若使用微服务版,因为存在跨应用调用,调用方式必须为EOS服务,事件动作类型为异步。
其中,id值为__bfp_entity/id ;relative值为__task_submit_data-manualActivity1,为相关数据中的提交按钮对象,如下图;
processinstid值使用内置变量,为thisProcessInst/processInstID
# 4.5、自定义站内信模版并配置使用
# 4.5.1 自定义站内信模板
在AFCenter-流程中心-业务配置-消息配置-模板配置中新建模板,类型选"站内信",点击下一步,编辑消息模板。 在模版中增加竞选结果,值选择业务数据中的"竞选结果",如下图:
# 4.5.1 使用站内信模板
双击"通知投票结果"的人工活动图元,在消息通知Tab页配置站内信模板。如下图:
至此,此demo开发完毕。