自动释放非活跃用户【财务+供应链+制造分组】许可
# 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. 没...
点击下载文档
本文2024-09-23 00:46:12发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-141615.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章