如何实现不同的用户打开同一个单据时展示不同的分录数据原创
金蝶云社区-陈来珍
陈来珍
13人赞赏了该文章 5,396次浏览 未经作者许可,禁止转载编辑于2022年04月14日 17:39:24
summary-icon摘要由AI智能服务提供

本文介绍了在业务单据系统中,根据用户身份(是否为单据创建人)来动态显示和修改单据分录的需求及实现方案。实现过程包括:打开单据时,非创建人只能查看和修改自己对应的分录信息;保存时,非创建人仅更新自己的分录数据;关闭单据时,取消修改校验。实现方法通过重写系统方法,结合用户权限控制数据显示和修改。开发环境为COSMICV4.0.010.0,实现了特定用户只能看到自己相关分录的效果。

关键词:单据、单据体、分录、按条件显示

一、需求背景

         有个别需求在业务单据打开的时候,按条件显示对应的分录数据。例如如下讲师评审的业务单据,为了避免讲师的评审规则等信息透露,每个讲师(用户)打开单据时,只能查看和修改自己评审分录的数据。

image.png

二、实现方案

           用户打开单据时,先判断是否是创建人,如果是创建人,可以按照正常单据的显示和修改;如果非创建人,择只显示当前用户对应的分录信息;最后保存的时候不是保存当前界面所显示的全部数据,而是后台修改当前页面的的分录数据即可。

image.png

三、实现过程

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

五、实现效果

用苏**账号的账号打开单据时,只显示了苏**账号对应的分录数据(可以自己拉一下附件元数据和插件到本地体验)

image.png

六、参考资料

【开发平台】指导手册

学习成长中心

图标赞 13
13人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!