自动释放非活跃用户【财务+供应链+制造分组】许可

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

自动释放非活跃用户【财务+供应链+制造分组】许可

# 1、业务背景 ### 功能诉求 期望系统可以自动筛选出长期不登录的账户,并将这些账户分配的许可自动释放。 ### 当前系统局限 1. 没有统计长期不登录用户的功能 2. 没有自动释放许可的功能 # 2、 解决方案 1. 编写定时任务,继承AbstractTask 并重写execute方法; 2. 以当前时间点为基准,查询自三个月前开始就未登录过系统的用户,找到对应的用户id; 3. 根据许可分组编码,获取对应的许可分组id; 4. 调用许可相关服务接口,释放许可。 # 3、 代码示例 ``` package kd.hr.hrt.dada.demo.LicenseCheck; import kd.bos.algo.DataSet; import kd.bos.algo.Row; import kd.bos.context.RequestContext; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.db.DB; import kd.bos.db.DBRoute; import kd.bos.entity.param.AppParam; import kd.bos.exception.KDException; import kd.bos.license.LicenseServiceUtil; import kd.bos.orm.query.QFilter; import kd.bos.schedule.executor.AbstractTask; import kd.bos.servicehelper.QueryServiceHelper; import kd.bos.servicehelper.license.LicenseServiceHelper; import kd.bos.servicehelper.parameter.SystemParamServiceHelper; import java.util.*; public class LicenseRelease extends AbstractTask { @Override public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException { //step1 get accurate time you want start Date current = new Date(System.currentTimeMillis()); Date time = stepDate(current, -3); //step2 get all inactive users List<Long> userList = getInactiveUsers(time); //step3 get groupId by groupNumber Long groupId = this.getGroupIdByNumber("PRO"); //step4 release license by group number releaseLicense(userList, groupId); } private void releaseLicense(List<Long> userList, Long groupId) { Set<Long> groupSet = new HashSet<>(); groupSet.add(groupId); Set<Long> userSet = new HashSet<>(); userSet.addAll(userList); // judge weather system param 【基础服务云】-【公共设置】-【系统参数】-[启用法人公司分配许可] boolean isLegalCheck = LicenseServiceUtil.isEnableLegalPersonAssign(); Long legalPersonId = null; if (isLegalCheck) { legalPersonId = getLegalPersonId(groupId); } LicenseServiceHelper.deleteUserGroupById(userSet, groupSet, legalPersonId); } private Long getLegalPersonId(Long groupId) { QFilter qFilter = new QFilter("group", QFilter.equals, groupId); DynamicObject result = QueryServiceHelper.queryOne("lic_userlicensegroup", "org", new QFilter[]{qFilter}); if (result != null) { return (Long) result.get("org"); } return 0L; } private List<Long> getInactiveUsers(Date time) { String sql = "select u.FID from t_sec_user u where u.FID not in (select DISTINCT FUSERID from t_bas_session_history where FLOGINTIME > ?)"; Object[] params = new Object[]{time}; DataSet dataSet = DB.queryDataSet(this.getClass().getName(), DBRoute.basedata, sql, params); List<Long> userList = new ArrayList<>(); for (Row r : dataSet) { Long userId = (Long) r.get(0); userList.add(userId); } return userList; } private Long getGroupIdByNumber(String groupNumber) { // we can get groupNumber from path 安全管理-许可分许明细列表-分组简码 QFilter qFilter = new QFilter("number", QFilter.equals, groupNumber); DynamicObject result = QueryServiceHelper.queryOne("lic_group", "id", new QFilter[]{qFilter}); if (result != null) { return (Long) result.get("id"); } return 0L; } /** * @param current the start time you want. In this scenario,we use currentTimeMillis * @param sep negative number means time before. ei. -3 means 3 month ago * @return */ private Date stepDate(Date current, int sep) { Calendar c = Calendar.getInstance(); c.setTime(current); c.add(Calendar.MONTH, sep); return c.getTime(); } } ``` # 4、 方案的可推广价值 - 了解如何通过脚本查询非活跃用户; - 了解如何释放许可,并且做到释放指定分组许可。 # 5、 注意事项 - 在非活跃用户筛选过程中,仅依靠的是登录日志作为依据,无法有效判断用户为严格意义上的非活跃用户; - 开发者可通过上机操作日志作为非活跃用户的判断依据,这样更合理,但上机操作日志数据量过大,会非常影响性能,可考虑上机操作日志+日志定期归档的方式来减少数据量,从而提高查询性能。但此种方式需开发者结合实际情况选择; - 此方案是删除指定分组许可,如果想删除非活跃用户占用的所有分组许可,可以使用方法LicenseServiceHelper.deleteUserLicGroup(userID, true);详细使用方法请参考章节6【删除用户许可】 # 6、 相关资料 - [许可剩余数量预警](https://vip.kingdee.com/article/559067619438077440) - [删除用户许可](https://dev.kingdee.com/open/detail/sdk/1915311694377139200)

自动释放非活跃用户【财务+供应链+制造分组】许可

# 1、业务背景 ### 功能诉求期望系统可以自动筛选出长期不登录的账户,并将这些账户分配的许可自动释放。 ### 当前系统局限 1. 没...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息