
# 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