
## 1 业务场景
- 管控策略有两个模型维护组织和数据的关系;对于旧模型,平台会冗余维护使用范围表、使用登记表和排除表,新模型,平台会冗余维护一张组织位图表。这些表都是在受控基础资料元数据重建的时候动态生成,**禁止业务线或者二开直接通过SQL语句直接操作和访问**。
- 如果业务线或者二开需要在出厂的时候就预置好一些数据,但是因为不能直接访问冗余表,对于这种需要预置数据的场景,就需要提供统一的预置入口。
- 系统升级的时候,SQL的执行是优先于元数据重建的,所以SQL执行的时候,上面提到的冗余表是不存在的,所以统一入口中的逻辑不仅要支持把预置的组织和数据的关系写入到平台冗余表中,还需要处理冗余表的创建工作。
## 2 解决方案
- 平台定义统一入口:`kd.bos.servicehelper.basedata.BaseDataServiceHelper#presetCtrlOrgUseRangData`,入口参数说明如下:
1. `dbKey` 数据库路由标识
2. `entity` 受控资料实体标识
3. `tableName` 基础资料主表名称
4. `dataOrgMap` 需要预置的数据和组织的信息, K:数据Id,V:创建组织Id
5. `isTreeType` 是否树形基础资料,树形:true, 非树形:false
- 业务预置数据时,在预置脚本XML后边提供脚本升级服务,升级服务中调用平台的统一入口实现数据写入冗余表。
## 3 业务预置数据关键操作
- 步骤一:编写好预置数据SQL脚本,如:`kd_6.0.0_bos_bd_supplier_insert.sql`
```sql
DELETE FROM t_bd_supplier WHERE FID = 10003999736;
INSERT INTO t_bd_supplier(FID,FENABLE,FCREATEORGID,FSTATUS,FCTRLSTRATEGY,FNAME,FNUMBER, ...) VALUES (10003999736,'1',100000,'C','6','LT-1110-3999736','LT-1110-3999736', ...);
```
- 步骤二:开发脚本升级服务,实现`IUpgradeService`并重写`afterExecuteSqlWithResult`方法,服务中调用平台的统一入口
```java
package kd.bos.bd.upgrade;
import java.util.HashMap;
import java.util.Map;
import kd.bos.service.upgrade.IUpgradeService;
import kd.bos.service.upgrade.UpgradeResult;
import kd.bos.servicehelper.basedata.BaseDataServiceHelper;
public class BusinessUpgradeServiceImpl implements IUpgradeService {
@Override
public UpgradeResult afterExecuteSqlWithResult(String ver, String iteration, String dbKey, String sqlFileName) {
// 资料实体标识,由业务根据实际情况指定
String entity = "bd_supplier";
// 受控基础资料类型对应的主表名,由业务根据实际