如何实现EAS的【拥有者权限】和【主管权限】

[size=6][b]如何实现EAS的【拥有者权限】和【主管权限】[/b][/size]
[color=Red]注:文章来源:121.32.28.234:8800/kdwiki/index.php?doc-view-107.html[/color]
问题:对于全新开发的EAS单据,客户经常会要求实现【拥有者权限】(即:用户自己只能看到自己所做的单据)和【主管权限】(即:上级领导能看到其下属所做的单据)。
具体的实现方法如下:
        方法一:通过EAS自带的特殊数据权限进行配置
1、        修改EAS权限配置文件:
eas\server\profiles\server1\config\EAS_PermissionConfiguration.xml 将新开发的单据添加到此配置文件中(这样才能在EAS客户端配置特殊数据权限时看到你开发的单据)
例:[code]<special-data-permission>       
                <name>com.kingdee.eas.custom.crm.base.app.Period</name>(注:单据实体路径)
                <type>975F9A83</type>(注:BOSType)
</special-data-permission>[/code]添加完成后,记得保存
2、        打开EAS客户端,进入【系统平台】-【安全管理】-【权限管理】-打开【特殊数据权限】如下图(红色部分就是要在上面新添加配置的单据)
(这里经常会出现修改配置文件后,业务对象授权列表中却无法显示的情况。可能是由于缓存的原因导致。如果遇到这种情况,请试试重启服务器,再多搞搞几次就 会回来的。实现没办法的话,请参与以下文章解决:121.32.28.234:8800/kdwiki/index.php?doc-view- 100.html)
[img]http://121.32.28.234:8800/kdwiki/js/kindeditor/attached/20110406170409_30409.jpg[/img]

        方法二:通过编写代码实现
方法一中的拥有者,只能选择到单据上的“制单人”和“最后修改人”这两个字段。在某些情况下,方法一是无法满足客户的需求的。例如:销售订单上有一个字段 是“销售员”,客户想通过这个字段来做拥有者权限过滤。那么,这个时候就只能通过编码的方式来实现了。以下介绍代码如何时实现拥有者权限和主管权限。
        拥有者权限:只需要在单据序时簿查询时加上当前用户与相关字段(如:销售员)的比较即可,相对简单,不多说。
        主管权限:实现代码如下:
/**
         * 根据用户id查找用户职位长编码
* 主管权限调用
         * @param userId 当前用户id
         * @return 用户职位长编码
         */[code]public String getPositionLongNumberByUserId(Context ctx, String userId) {
                // 根据用户查找用户职位长编码
                StringBuffer lsql = new StringBuffer();
                lsql.append("SELECT DISTINCT PositionHierarchy.FLongNumber as longnumber FROM T_PM_USER U INNER JOIN T_BD_Person Person");
                lsql.append(" ON Person.FID = U.FPersonID INNER JOIN T_ORG_PositionMember PositionMember ON Person.FID = PositionMember.FPersonID");
                lsql.append(" INNER JOIN T_ORG_Position  Position ON Position.FID = PositionMember.FPositionID INNER JOIN T_ORG_PositionHierarchy");
                lsql.append(" PositionHierarchy ON  PositionMember.FPositionID = PositionHierarchy.FChildID WHERE U.FID = '").append(userId);
                lsql.append("' AND PositionHierarchy.FHierarchyID = '00000000-0000-0000-0000-000000000001396FCAD0'");
                ResultSet lrs;
                StringBuffer filterLongNumber = new StringBuffer();
                try {
                        lrs = DbUtil.executeQuery(ctx, lsql.toString());
                        while (lrs.next()) {
                                filterLongNumber.append(
                                " OR POSITIONHIERARCHY.FLONGNUMBER LIKE N'").append(lrs.getString("longnumber")).append("!%' ");
                        }
                } catch (BOSException e) {
                        e.printStackTrace();
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                if (filterLongNumber.toString().length() == 0) {
                        return "-1";
                }
                return filterLongNumber.toString();
        }[/code]/**
         * 根据用户职位长编码查找用户的所有下级客户
         * @param ctx
         * @param positionLongNumber
         * @return
         */[code]public List getPersionIdsByPositionLongNumber(Context ctx, String positionLongNumber) {
                // 根据用户长编码查找用户下级
                StringBuffer sql = new StringBuffer();
                List personIds = new ArrayList();
                sql.append("SELECT DISTINCT Person.FID as id FROM T_PM_USER U INNER JOIN T_BD_Person Person ON Person.FID = U.FPersonID INNER JOIN ");
                sql.append(" T_ORG_PositionMember PositionMember ON Person.FID = PositionMember.FPersonID INNER JOIN T_ORG_Position Position ");
                sql.append(" ON Position.FID = PositionMember.FPositionID INNER JOIN T_ORG_PositionHierarchy PositionHierarchy ON ");
                sql.append(" PositionMember.FPositionID = PositionHierarchy.FChildID WHERE ").append("(").append(
                                positionLongNumber.substring(positionLongNumber.indexOf("O") + 2)).append(")");
                sql.append(" AND PositionHierarchy.FHierarchyID = '00000000-0000-0000-0000-000000000001396FCAD0'");
                ResultSet prs;
                try {
                        prs = DbUtil.executeQuery(ctx, sql.toString());
                        while (prs.next()) {
                                personIds.add(prs.getString("id"));
                        }
                        //添加当前用户本人
                        UserInfo user = ContextUtil.getCurrentUserInfo(ctx);
                        personIds.add(user.getPerson().getId().toString());
                } catch (BOSException e) {
                        e.printStackTrace();
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                return personIds;
        }[/code]调用方法:[code]UserInfo user = ContextUtil.getCurrentUserInfo(ctx);//获取当前用户
        String positionLongNumber = getPositionLongNumberByUserId(ctx, user.getId().toString());//获取当前用户的职位长编码
        List lowerPersonList = getPersionIdsByPositionLongNumber(ctx, positionLongNumber);//获取当前用户所能看到的所有下级用户的person id 表列[/code]最后,根据lowerPersonList列表,在单据序时簿的过滤条件中拼写SQL语句的过滤条件即可。


以下给出动态Web框架开发的单据添加主管权限的完整例子:
由于字数限制,完整例子请看:121.32.28.234:8800/kdwiki/index.php?doc-view-107.html

你可能感兴趣的:(权限)