如何实现不同的用户打开同一个单据时展示不同的分录数据原创
13人赞赏了该文章
5,253次浏览
编辑于2022年04月14日 17:39:24
摘要由AI智能服务提供
本文介绍了在业务单据系统中,根据用户身份(是否为单据创建人)来动态显示和修改单据分录的需求及实现方案。实现过程包括:打开单据时,非创建人只能查看和修改自己对应的分录信息;保存时,非创建人仅更新自己的分录数据;关闭单据时,取消修改校验。实现方法通过重写系统方法,结合用户权限控制数据显示和修改。开发环境为COSMICV4.0.010.0,实现了特定用户只能看到自己相关分录的效果。
关键词:单据、单据体、分录、按条件显示
一、需求背景
有个别需求在业务单据打开的时候,按条件显示对应的分录数据。例如如下讲师评审的业务单据,为了避免讲师的评审规则等信息透露,每个讲师(用户)打开单据时,只能查看和修改自己评审分录的数据。
二、实现方案
用户打开单据时,先判断是否是创建人,如果是创建人,可以按照正常单据的显示和修改;如果非创建人,择只显示当前用户对应的分录信息;最后保存的时候不是保存当前界面所显示的全部数据,而是后台修改当前页面的的分录数据即可。
三、实现过程
1、从列表打开单据时,只显示当前讲师的分录信息
@Override public void afterBindData(EventObject e) { // 当前登录用户id String currentUserId = String.valueOf(UserServiceHelper.getCurrentUserId()); DynamicObject creator = (DynamicObject) this.getModel().getValue("creator"); String creatorId = creator.getString("id"); // 非创建人只能看评卷讲师的分录 if (!currentUserId.equals(creatorId)) { // 不能增删分录 this.getView().setVisible(false, "advcontoolbarap"); DynamicObjectCollection lecturerCol = this.getModel().getDataEntity(true) .getDynamicObjectCollection("lecturer_entryentity"); //只能查看和修改当前评审讲师的数据,所以删除掉其他分录的数据 Iterator<DynamicObject> iterator = lecturerCol.iterator(); while (iterator.hasNext()) { DynamicObject dynamicObject = (DynamicObject) iterator.next(); DynamicObject lectureruser = dynamicObject.getDynamicObject("kded_lectureruser"); if (!lectureruser.getString("id").equals(currentUserId)) { iterator.remove();}} //刷新单据体 this.getView().updateView("lecturer_entryentity"); } super.afterBindData(e); }
2、保存逻辑
@Override public void beforeDoOperation(BeforeDoOperationEventArgs args) { Object source = args.getSource(); if (source instanceof Save) { // 创建人 DynamicObject creator = (DynamicObject) this.getModel().getValue("creator"); String creatorId = creator.getString("id"); // 当前登录用户id String currentUserId= = String.valueOf(UserServiceHelper.getCurrentUserId()); if (!creatorId.equals(currentUserId)) { // 取消原有的保存逻辑 args.setCancel(true); Object pk = this.getModel().getDataEntity().getPkValue(); DynamicObject toUpdateObj = BusinessDataServiceHelper.loadSingle(pk, "kded_lecturer_arrangement"); DynamicObjectCollection dynamicObjectCollection = toUpdateObj .getDynamicObjectCollection("lecturer_entryentity"); for (DynamicObject entryObj : dynamicObjectCollection) { DynamicObject lectureruser = entryObj.getDynamicObject("kded_lectureruser"); if (lectureruser.getString("id").equals(currentUserId)) { int entryRowCount = this.getModel().getEntryRowCount("lecturer_entryentity"); if (entryRowCount > 0) { Object value = this.getModel().getValue("kded_rule", 0); entryObj.set("kded_rule", value); } break; } // 只更改一条数据 } // 更新数据 SaveServiceHelper.update(toUpdateObj); this.getView().showSuccessNotification("保存成功"); } } super.beforeDoOperation(args); }
3、关闭单据时,取消修改校验
@Override public void beforeClosed(BeforeClosedEvent e) { // 取消提示分录被删除,我们已经在beforeDoOperation通过后台实现了数据的保存 e.setCheckDataChange(false); super.beforeClosed(e); }
四、开发环境版本
COSMICV4.0.010.0
五、实现效果
用苏**账号的账号打开单据时,只显示了苏**账号对应的分录数据(可以自己拉一下附件元数据和插件到本地体验)
六、参考资料
lecturebillplugin.zip(1.50KB)
kded_lecturer_arrangement_meta …(10.33KB)
赞 13
13人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!