
# 业务背景
单据配置了数据规则:只允许当前登录人查看自己创建的单据。如果一旦该人员离职,那么他创建的单据就没有人可以看到了。目前数据规则还无法做到类似单据交接的功能:既能看到创建人自己的单据,同时还能看到离职人员创建的单据。
# 解决方案
核心思路:通过开发自定义比较符,做到不仅能够查看自己创建的单据,还能查看到我负责交接的离职人员创建的单据,具体效果图如下:

# 实现步骤
1. 开发平台新建一张单据,具体设计如图:

**设计说明:** 核心字段有两个:一个是交接人,即有人员离职后,这些人员所创建的单据要转给此交接人;另一个是离职员工分录,顾名思义,该分录记录的就是离职人员。同时,新增表单插件,做相关逻辑校验,插件配置如图:

插件校验逻辑:1、如果离职人员本身也是交接人员,那么就不能保存,需要将该人员名下的离职人员分录也分配给交接人;2、如果对应的【用户禁用】状态是未禁用,则不允许保存。
```
package kd.hr.hrt.dada.demo.LicenseCheck;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.form.control.events.BeforeItemClickEvent;
import kd.bos.form.plugin.AbstractFormPlugin;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import java.util.EventObject;
public class MyFormPlugin extends AbstractFormPlugin {
private final static String OPERATION_KEY = "bar_save";
private final static String KEY_MAINBAR = "tbmain";
@Override
public void registerListener(EventObject e) {
this.addItemClickListeners(KEY_MAINBAR);
}
@Override
public void beforeItemClick(BeforeItemClickEvent evt) {
if (StringUtils.equals(OPERATION_KEY, evt.getItemKey())) {
DynamicObjectCollection collection = this.getModel().getEntryEntity("yf_leave_user_entry");
for (DynamicObject object : collection) {
DynamicObject leaveUser = (DynamicObject) object.get("leave_user");
//如果离职人员用户禁用装填是非禁用,则不允许保存
if (!(boolean) leaveUser.get("isforbidden")) {
this.getView().showMessage(String.format("用户%s尚未被禁用", leaveUser.get("name")));
}
//如果离职人员也存在离职人员名单,则需要将其名下维护的人员也自动转到新的交接人员手中
QFilter userFilter = new QFilter("reveiver", QCP.equals, leaveUser.get("id"));
DynamicObject leaveUsersList = BusinessDataServiceHelper.loadSingle("yf_employeemapping", "id", new QFilter[]{userFilter});
if (leaveUsersList != null) {
this.getView().showMessage(String.format("用户%存在未交接人员名单,请处理", leaveUser.get("name")));
}
}
}
}
}
```
2. 新增自定义比较符,配置如下:
其中解析类代码如下:
```
package kd.hr.hrt.dada.demo.LicenseCheck;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.entity.filter.AbstractFilterContantParser;
import kd.bos.entity.filter.FilterContantParserArgs;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.user.UserServiceHelper;
import java.uti