众所周知,插件中要获取人员信息可调用人员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; });
以上几种查询用户方法,基本能满足需求.如果更多方法可提出交流讨论.
推荐阅读