Alfresco中按站点分配工作流任务及筛选站点用户的实现方法
在Alfresco中按站点筛选用户分配工作流任务的方案
我来帮你解决Alfresco里按站点筛选用户分配工作流任务的问题,结合你的需求(仅显示当前站点用户,或先选站点再搜用户),分两种场景给你具体方案:
一、快速配置:仅显示当前站点用户(无需大量开发)
如果你的场景是用户在某个站点内发起工作流,只想让人员选择控件默认显示当前站点的成员,直接通过表单配置就能实现:
- 找到Share的自定义配置文件
share-config-custom.xml(通常放在tomcat/shared/classes/alfresco/web-extension/目录下) - 找到对应工作流任务的表单配置节点,比如针对默认的分配任务字段
bpm:assignee,修改控件参数:
<field id="bpm:assignee"> <control template="/org/alfresco/components/form/controls/people.ftl"> <!-- 过滤规则设为站点成员 --> <control-param name="filter">siteMembers</control-param> <!-- 自动获取当前站点ID --> <control-param name="siteId">${page.url.siteId}</control-param> </control> </field>
- 重启Alfresco服务后,在站点内发起工作流时,人员选择框就只会列出当前站点的注册用户了。
二、自定义开发:先选站点再搜索用户(灵活满足需求)
如果需要让用户先选择任意站点,再搜索该站点下的用户,就需要修改前端控件和后端服务:
1. 前端表单控件改造
- 找到人员选择的FTL模板文件:
share/web/org/alfresco/components/form/controls/people.ftl - 在原有人员搜索框上方添加一个站点选择下拉框,通过Alfresco的站点API获取所有可访问站点列表
- 编写JS逻辑,监听站点选择事件,当用户选中某个站点后,调用后端接口获取该站点的成员列表,更新人员选择框的数据源
2. 后端服务扩展
- 编写Java类,注入
SiteService,实现根据站点ID查询成员的方法:
public List<Person> getSiteMembers(String siteId) { SiteInfo site = siteService.getSite(siteId); if (site == null) { return Collections.emptyList(); } List<AuthorityInfo> members = siteService.getSiteMembers(siteId, SiteMemberType.ALL); // 转换为Person对象列表返回 List<Person> personList = new ArrayList<>(); for (AuthorityInfo member : members) { if (member.isUser()) { personList.add(personService.getPerson(member.getAuthorityName())); } } return personList; }
- 把这个方法暴露为REST接口,或者修改现有的人员查询API,增加站点ID过滤参数,供前端调用
3. 可选:工作流模型关联站点信息
如果需要把站点信息和任务绑定,可以在自定义工作流模型中添加站点ID字段:
<type name="customwf:siteTask"> <parent>bpm:task</parent> <properties> <property name="customwf:siteId"> <type>d:text</type> <mandatory>true</mandatory> </property> </properties> </type>
然后在表单配置中添加站点选择字段,和人员选择控件联动,确保任务分配和站点关联。
注意事项
- 如果使用的是Alfresco Activiti工作流,还要确保任务分配的后端逻辑校验用户是否属于指定站点,避免权限问题
- 自定义开发后记得测试不同权限用户的访问场景,比如普通用户只能看到自己有权限的站点
内容的提问来源于stack exchange,提问作者Faiz
相关产品推荐
相关产品推荐

