/** * 报表下推参数应用, __push: 数组或单项, 下推类型默认 空(即查询) * { "__push": { "dataset": "dsStock", pushType:"add", data:[] } } * */ import { $CONST } from "@birt/funclib/ConstUtil"; export default { data() { return { pushData: {} }; }, computed: {}, watch: { param(val) { this._applyPushParam(val); this.reRenderDesignSheet(); } }, methods: { // 应用查询面板初始化参数 _applyQueryModelParam(param = {}) { let val = param[$CONST.LOOKUPINPUTKEY]; if (val) { for (let dsId in this.dataset) { let ds = this.dataset[dsId]; let recvField = ds && ds.getReceiveLookupInput(); if (recvField) { let queryModel = {}; queryModel[recvField] = val; ds.setQueryModel(queryModel, recvField) } } } }, // 应用下推参数,newStores是标记刚创建的数据集,只有在这个列表的才应用下推 async _applyPushParam(param, newStores) { debugger if (!param) return; let pushCdion = []; let recvCdions = []; let pushParam = param.__push; if (pushParam) { // 应用下推条件 if (Array.isArray(pushParam)) { pushParam.forEach(item => { this._applyPushItem(item, pushCdion, newStores); }) } else { this._applyPushItem(pushParam, pushCdion, newStores); } } else { // 应用自动接收参数 recvCdions = this.getReceiveCdions(param, newStores); } // 处理批量加载报表数据 let url = this._getPushUrl(param) || this.loadUrl; await this._loadPushDataByCdions(url, pushCdion.concat(recvCdions)); }, // 应用单个下推包 _applyPushItem(item, pushCdion, newStores) { if (typeof item == "string") { item = JSON.parse(item); } let pushType = item[$CONST.PUSHTYPE]; if (pushType == $CONST.PUSHADD) { this._applyPushItemAdd(item); } else if (pushType == $CONST.PUSHDELETE) { this._applyPushItemDelete(item); } else if (pushType == $CONST.PUSHCDION) { // 下推条件处理 this._applyPushItemCdion(item, pushCdion); } else { this._applyPushItemData(item, newStores); } // 附加__push下推条件 let recvCdions = this.getReceiveCdions(item, newStores); pushCdion.push(...recvCdions); }, // 应用单个下推新增 _applyPushItemAdd(item) { let dsId = this._getPushDatasetId(item); if (dsId) { let store = this.getStore(dsId); if (store) { let pushAddType = item[$CONST.PUSHADDTYPE]; let pushData = this._getPushData(item); if (pushData && pushData.length > 0) { if (pushAddType == $CONST.PUSHADDMAP) { // returnFields 映射方式下推新增 store.clear(); store.add(pushData); } else { // 应用下推数据包,当前数据集自动填充 let newRecds = []; pushData.forEach(puRecd => { let newR = store.newRecord(puRecd, item); newRecds.push(newR); }) store.add(newRecds); } } } } }, // 应用单个下推删除 _applyPushItemDelete(item) { let dsId = this._getPushDatasetId(item); if (dsId) { let store = this.getStore(dsId); if (store) { let pushData = this._getPushData(item); if (pushData && pushData.length > 0) { // 加载要删除的数据 store.loadData(pushData); store.remove(pushData); } } } }, // 应用单个下推条件 _applyPushItemCdion(item, pushCdion) { let dsId = this._getPushDatasetId(item); let pushParam = this._getPushCdion(item); if (dsId && pushParam) { let store = this.getStore(dsId); if (store) { let queryParam = store.getQueryParam(pushParam); queryParam.dataset = dsId; pushCdion.push(queryParam); } } }, // 应用单个下推数据包 _applyPushItemData(item, newStores) { let dsId = this._getPushDatasetId(item); // 当有标记新创建数据集时,只有新创建数据集应用下推,避免旧数据集重复应用下推 if (newStores && (newStores.indexOf(dsId) == -1)) return; if (dsId) { // 根据目标集id,获取下推目标数据集,加上随机数后获取不到,暂时先去掉模板拼接随机数 let store = this.getStore(dsId); if (store) { let pushData = this._getPushData(item); if (pushData && pushData.length > 0) { store.loadData(pushData); } } } }, // 根据数据集查询条件集合,批量查询下推数据 async _loadPushDataByCdions(url, cdions) { // 当没条件时,可能错失加载所有数据 if (cdions.length > 0) { let param = { __body: JSON.stringify(cdions) }; // 执行查询 await this.axios.post(url, param) .then(response => { this._loadStoresPushData(cdions, response); }) .catch(error => { console.error(error); }); } }, // 加载返回的下推数据包 _loadStoresPushData(cdions, pushData) { if (cdions.length === pushData.dataPack.length) { debugger for (let i = 0, l = cdions.length; i < l; i++) { let cdItem = cdions[i]; let dsId = this._getPushDatasetId(cdItem); let ds = this.getStore(dsId); if (ds) { let resi = pushData.dataPack[i]; let option = {}; if (resi[$CONST.OUTPARAMETER]) { option.recordCount = resi[$CONST.OUTPARAMETER][$CONST.TOTALRECORDCOUNT]; } ds.resolveLoadData(resi[$CONST.ROWS], option); let itemData = resi.rows; // ds.loadData(itemData); // 下推删除时,数据打上删除状态 rsDelete if (cdItem[$CONST.PUSHTYPE] == $CONST.PUSHDELETE) { ds.remove(itemData, true); } } } } else { console.log("批量查询返回数据包长度误,无法对应.") } }, // 获取下推请求路径url _getPushUrl(param) { if (Array.isArray(param)) { return param[0] && param[0].url; } else { return param.url; } }, // 获取下推项获取数据集id _getPushDatasetId(item) { let dsId = item.dataset; if (!dsId) { let dsUrl = this._getPushDatasetUrl(item); dsId = dsUrl && dsUrl.substring(dsUrl.lastIndexOf("/") + 1, dsUrl.lastIndexOf(".")); } return dsId; }, // 获取下推数据集模型路径 _getPushDatasetUrl(item) { return item.modelFilePath || (item.target && item.target.storeUrl); }, // 获取下推数据包 _getPushData(item) { return item.data || (item.target && item.target.data); }, // 获取下推数据条件 _getPushCdion(item) { return item.param || (item.target && item.target.ps); }, // 添加下推数据包 _addPushData(dsId, data) { }, // 获取下推数据包 getPushData() { }, // 设置页面参数 async setParam(param) { this._applyQueryModelParam(param); await this._applyPushParam(param); this.reRenderDesignSheet(); }, } }