1 业务场景
管控策略有两个模型维护组织和数据的关系;对于旧模型,平台会冗余维护使用范围表、使用登记表和排除表,新模型,平台会冗余维护一张组织位图表。这些表都是在受控基础资料元数据重建的时候动态生成,禁止业务线或者二开直接通过SQL语句直接操作和访问。
如果业务线或者二开需要在出厂的时候就预置好一些数据,但是因为不能直接访问冗余表,对于这种需要预置数据的场景,就需要提供统一的预置入口。
系统升级的时候,SQL的执行是优先于元数据重建的,所以SQL执行的时候,上面提到的冗余表是不存在的,所以统一入口中的逻辑不仅要支持把预置的组织和数据的关系写入到平台冗余表中,还需要处理冗余表的创建工作。
2 解决方案
平台定义统一入口:
kd.bos.servicehelper.basedata.BaseDataServiceHelper#presetCtrlOrgUseRangData
,入口参数说明如下:dbKey
数据库路由标识entity
受控资料实体标识tableName
基础资料主表名称dataOrgMap
需要预置的数据和组织的信息, K:数据Id,V:创建组织IdisTreeType
是否树形基础资料,树形:true, 非树形:false业务预置数据时,在预置脚本XML后边提供脚本升级服务,升级服务中调用平台的统一入口实现数据写入冗余表。
3 业务预置数据关键操作
步骤一:编写好预置数据SQL脚本,如:
kd_6.0.0_bos_bd_supplier_insert.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
方法,服务中调用平台的统一入口
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"; // 受控基础资料类型对应的主表名,由业务根据实际情况指定 String tableName = "t_bd_supplier"; // 需要预置的数据和组织的关系,key:预置数据ID,value:创建组织ID,由业务根据实际情况指定 Map<Long, Long> dataOrgMap = new HashMap<>(1); dataOrgMap.put(10003999736L, 100000L); // 需要预置的资料类型,是不是树形资料,由业务根据实际情况指定 boolean isTreeType = false; // 调用统一入口,实现数据写入平台的冗余表 return BaseDataServiceHelper.presetCtrlOrgUseRangData(dbKey, entity, tableName, dataOrgMap, isTreeType); } }
步骤三:在XML中指定预置脚本,并给预置脚本指定升级服务
<SqlScript Type="KSQL" Separator=";" dbkey="basedata" Plugin="cloud:bos,app:bos,class:ScriptUpgradeService,scriptPlugin:kd.bos.bd.upgrade.BusinessUpgradeServiceImpl">preinsdata/kd_6.0.0_bos_bd_supplier_insert.sql</SqlScript>
4 注意事项
重要的事情说三遍:
a、
fbitindex
,fsourcebitindex
,fsourcedataid
三个字段不用预置,如果要预置,那么请置为0b、
fbitindex
,fsourcebitindex
,fsourcedataid
三个字段不用预置,如果要预置,那么请置为0c、
fbitindex
,fsourcebitindex
,fsourcedataid
三个字段不用预置,如果要预置,那么请置为0XML文件中的
dbkey
,cloud
,app
和scriptPlugin
的值,要根据业务实际情况填写,不能照抄
推荐阅读