苍穹开发中根据手机号码获取用户的几种方法原创
金蝶云社区-DC_W
DC_W
2人赞赏了该文章 1,198次浏览 未经作者许可,禁止转载编辑于2021年11月24日 10:46:00

众所周知,插件中要获取人员信息可调用人员API获取,具体如下:


获取指定部门下的所有人员接口名: kd.bos.servicehelper.user.UserServiceHelper.getAllUsersOfOrg(int jobType, List orgIds, boolean includeSubOrg, boolean includeDisableUser)


代码示例

    List<Long> orgIds = new ArrayList<>(1);
    orgIds.add(100000L);
    Set<Long> userIds = UserServiceHelper.getAllUsersOfOrg(1, orgIds, false, false);


然后再根据人员ID获取人员字段信息:

获取人员信息接口名: kd.bos.servicehelper.user.UserServiceHelper.get(List userIds)


代码示例

    List<Long> userIds = new ArrayList<>(1);
    userIds.add(12345678L);
    List<Map<String, Object>> userInfoList = UserServiceHelper.get(userIds);


最后在人员字段信息中找出对应手机号码的用户.

这样做效率很低,大量用户的情况下会造成性能问题.解决方案有以下几种:


1.使用业务数据服务帮助类kd.bos.servicehelper.BusinessDataServiceHelper业务数据服务帮助类提供查询、缓存查询等功能。


加载单个实体

static DynamicObject loadSingle(String entityName, String selectProperties, QFilter[] filters)


传入参数:entityName指定为人员实体表示,selectProperties传入需要获取的人员字段,filters指定过滤条件(这里过滤条件为手机号码=传入号码)


返回实体数据,DynamicObject类型,即可取得对应人员数据.


2.使用查询服务帮助类kd.bos.servicehelper.QueryServiceHelper查询服务帮助类封装了一些查询方法。


查询单条记录

static DynamicObject queryOne(String entityName, String selectFields, QFilter[] filters)


传入参数:entityName指定为人员实体表示,selectFields传入需要获取的人员字段,filters指定过滤条件(这里过滤条件为手机号码=传入号码)


返回实体数据,DynamicObject类型,即可取得对应人员数据.


QFilter qFilter = new QFilter("phone", QCP.equals, phone);
DynamicObject dobj = QueryServiceHelper.queryOne("bos_user", "id" ,qFilter.toArray());
if(dobj != null) {
Long userid=dobj.getLong("id");
result = getByUserId2(userid);
}



3.数据库访问统一通过DB接口,使用ksql语法。(代码示例来自开发者门户网站,查询操作同理,稍微修改以下语句即可)


苍穹系统支持每个应用使用独立的数据库,SQL在哪个库上执行,通过DBRoute来路由。DB屏蔽了物理数据库信息,用DBRoute对应具体的物理库,由mc的数据中心管理进行配置。DBRoute内置了常用的routeKey,也可以通过 DBRoute.of("routeKey") 来构造。表单的routeKey在设计时已自动指定,在同一个应用下的表单routeKey相同。


用法基本与jdbc同,DB更为简单,不必自行处理数据连接、结果集的关闭等。


新增用户:

String sql = "insert into t_sec_user(fid,fnumber) values(?,?)";
Object[] params = { ID.genLongId(), "Test-Number" };
DB.execute(DBRoute.basedata, sql, params);



查询HR简历遍历结果集:

String algoKey = getClass().getName() + ".query_resume";
String sql = "select fid, fnumber from t_hr_resume where fstatus=?";
Object[] params = { 'C' };
try (DataSet ds = DB.queryDataSet(algoKey, DBRoute.of("hr"), sql, params)) {
    while (ds.hasNext()) {
        Row row = ds.next();
        System.out.println("fid=" + row.get(0));
        System.out.println("fnumber=" + row.get(1));
    }
}



查询,使用自定义ResultSetHandler对结果集ResultSet进行遍历:

String sql = "select id from t_sec_user where fphone like ?";
Object[] params = { "135%" };
List<Long> idList = DB.query(DBRoute.basedata, sql, params, rs -> {
    List<Long> ret = new ArrayList<>();
    while (rs.next()) {
        ret.add(rs.getLong(1));
    }
    return ret;
});


以上几种查询用户方法,基本能满足需求.如果更多方法可提出交流讨论.

赞 2