工具源码

This commit is contained in:
lihao 2025-03-28 09:35:10 +08:00
parent 8691964445
commit ea26ed03c8
2 changed files with 401 additions and 0 deletions

View File

@ -0,0 +1,388 @@
/*U78Ffc36EDqIdVE704DtxRQN4nbg0EuMhMftv3nDP2E=*/
/**
* 封装主子孙的结构
* @param {*} pagecode 页面pagecode
* @param {*} headid 主表id
* @param {*} bodyid 子表id
* @param {*} childid 孙表id
* @param {*} isCompress 压缩流量
*/
function createGrandsonData(pagecode, headid, bodyid, childid, isCompress = true) {
let data = {};
if (isCompress) {
data = this.props.createMasterChildDataSimple(pagecode, headid, bodyid);
} else {
data = this.props.createMasterChildData(pagecode, headid, bodyid);
}
let childData = this.props.cardTable.getAllGrandData({ parentId: bodyid });
dealChildData(childData, childid);
data.grandson = childData;
daleDataPseudocolumn(data, bodyid);
return data;
}
/**
* 处理伪列的值 后台需要伪列处理子表孙表关系
* @param {} data
*/
function daleDataPseudocolumn(data, bodyid) {
//处理子表伪列
data.body[bodyid].rows.forEach((item, i) => {
if (item.values.pseudocolumn) {
item.values.pseudocolumn.value = JSON.stringify(i);
} else {
item.values.pseudocolumn = { value: JSON.stringify(i) };
}
});
return data;
}
/**
* 处理孙表数据格式
* @param {*} childData
* @param {*} childid
*/
function dealChildData(childData, childid) {
for (let index in childData) {
let newitem = {};
newitem.areaType = 'table';
newitem.areacode = childid;
newitem.rows = childData[index][childid].rows;
childData[index] = { [childid]: newitem };
}
}
/**
* 孙表数据填充
* @param {*} bodyid 子表id
* @param {*} childid 孙表id
* @param {*} record 孙表数据
* @param {*} isCache 是否缓存 默认true
* @param {*} isTop 默认false
*/
function setGrandsonData(bodyid, bodyPkCode, childid, record, isCache = true, isTop = false) {
let props = this.props;
Object.keys(record).forEach(function(key) {
//由于新增的没有主键所以前台按照rowId对孙表做隔离,先转一下
let rowId = props.cardTable.getRowIdFromPkcode({
parentId: bodyid,
plcodeValue: key
});
props.cardTable.setGrandTableData({
rowid: rowId,
parentId: bodyid,
tableId: childid,
data: { rows: record[key][childid].rows },
callback: () => {},
isCache: isCache,
isTop: isTop
});
});
}
/**
* 孙表数据为空填充
* @param {*} bodyid 子表id
* @param {*} childid 孙表id
* @param {*} isCache 是否缓存 默认true
* @param {*} isTop 默认false
*/
function setGrandsonNullData(bodyid, childid, isCache = true, isTop = false) {
let _props = this.props;
let bodyDatas = _props.cardTable.getAllRows(bodyid);
bodyDatas.forEach((row) => {
let rowId = row.rowid;
_props.cardTable.setGrandTableData({
rowid: rowId,
parentId: bodyid,
tableId: childid,
data: { rows: [] },
callback: () => {},
isCache: isCache,
isTop: isTop
});
});
}
/**
* 将被改变行的孙表赋值空数据
* @param {*} bodyid 子表id
* @param {*} childid 孙表id
* @param {*} isCache 是否缓存 默认true
* @param {*} isTop 默认false
*/
function setGrandsonNullDataForRow(bodyid, childid, isCache = true, isTop = false) {
let _props = this.props;
let changeRows = _props.cardTable.getChangedRows(bodyid);
changeRows.forEach((row) => {
//状态为2的 为新增行
if (row.status == 2) {
let flag = true;
//没建立子孙关系的,需要先建立,有的就不用重新复空
let grandRows = _props.cardTable.getAllGrandData({ parentId: bodyid });
Object.keys(grandRows).forEach(function(key) {
if (key == row.rowid) {
flag = false;
return;
}
});
if (flag) {
_props.cardTable.setGrandTableData({
rowid: row.rowid,
parentId: bodyid,
tableId: childid,
data: { rows: [] },
callback: () => {},
isCache: isCache,
isTop: isTop
});
}
}
});
}
/**
* 获取点击行的表体所对应的孙表数据
* @param {*} bodyid
* @param {*} childid
* @param {*} rowid
*/
function getGrandsonDataByBody(bodyid, childid, rowid) {
let bodyRows = this.props.cardTable.getClickRowIndex(bodyid);
rowid = rowid ? rowid : bodyRows.record.rowid;
let grandRows = this.props.cardTable.getAllGrandData({ parentId: bodyid });
let sonRows = [];
Object.keys(grandRows).forEach(function(key) {
if (key == rowid) {
sonRows = grandRows[key][childid].rows;
}
});
return sonRows;
}
/**
* 删除子表行时更新该子表的孙表行状态为删除态
* @param {*} bodyid 子表id
* @param {*} childid 孙表id
* @param {*} rowIds 子表rowids 数组
*/
function delBodyRow(bodyid, childid, rowIds) {
//根据rowid获取当前子表的孙表数据并更新状态为删除状态
let childData = this.props.cardTable.getAllGrandData({ parentId: bodyid });
Object.keys(childData).forEach(function(key) {
rowIds.forEach((rid) => {
if (key == rid) {
//孙表的rows
let childrows = childData[key][childid].rows;
childrows.forEach((crow) => {
crow.status = 3;
});
}
});
});
}
/**
* 孙表空行过滤
* @param {*} bodyid 子表id
* @param {*} childid 孙表id
* @param {*} keys 排除的字段数组
*/
function filterChildEmptyRows(bodyid, childid, keys) {
let childData = this.props.cardTable.getAllGrandData({ parentId: bodyid });
Object.keys(childData).forEach(function(key) {
let newRows = [];
let rows = childData[key][childid].rows;
rows.forEach((item, index) => {
let values = item.values;
let tempArr = Object.keys(values).filter((item) => item != 'numberindex');
if (Array.isArray(keys)) {
tempArr = tempArr.filter((val) => {
return keys.every((key) => {
return val !== key;
});
});
}
// flag 为true 说明每个字段 (要不然不是对象 TODO ? 应该不需要判断, 略) 或者 没值
let flag = tempArr.every((one) => isWrongFalse(values[one] ? values[one].value : ''));
if (flag) {
if (rows[index].status != '2') {
rows[index].status = '3';
newRows.push(rows[index]);
}
} else {
newRows.push(rows[index]);
}
});
childData[key][childid].rows = newRows;
});
}
function isWrongFalse(value) {
return value == '' || value == null;
}
//----------------------------------------------------------------------------------------------------------
/**
* 按照平台框架结构组装数据
* @param {*} props
* @param {*} pagecode
* @param {*} headAreaCode
* @param {*} bodyAreaCode
* @param {*} sonAreaCode
* @param {*} relatefield
*/
function createGrandsonDataNew(
props,
pagecode,
headAreaCode,
bodyAreaCode,
sonAreaCode,
relatefield,
sonfield,
isfilterDelete = true
) {
let data = props.createMasterChildDataSimple(pagecode, headAreaCode, bodyAreaCode);
let sonData = props.cardTable.getAllGrandData({ parentId: bodyAreaCode });
let newBodyRows = [];
let rowIds = [];
let bodyRows = data.body[bodyAreaCode].rows;
for (let i = 0; i < bodyRows.length; i++) {
const row = bodyRows[i];
row.values.pseudocolumn = { value: i + '' };
if (isfilterDelete && row.status == '3' && row.values[relatefield].value == null) {
// 如果过滤删除行,则不添加到数组中
} else {
rowIds.push(row.rowid);
newBodyRows.push(row);
}
}
data.body[bodyAreaCode].rows = newBodyRows;
let newSonRows = [];
for (let i = 0; i < rowIds.length; i++) {
const rowId = rowIds[i];
if (sonData && sonData[rowId] && sonData[rowId][sonAreaCode]) {
let sonRows = sonData[rowId][sonAreaCode].rows;
sonRows.forEach((row) => {
// 用是否包含主键来判断新增行用status == '2'判断有时会判断错误
if (row.values[sonfield].value == null || row.values[sonfield].value == '') {
let bodypk;
// 新增态判断表体行是否存在主键如果存在的话则等于主键否则等于rowid
if (props.cardTable.getValByKeyAndRowId(bodyAreaCode, rowId, relatefield)) {
bodypk = props.cardTable.getValByKeyAndRowId(bodyAreaCode, rowId, relatefield).value;
}
if (bodypk) {
row.values[relatefield] = { value: bodypk, display: null };
} else {
row.values[relatefield] = { value: rowId, display: null };
}
}
// 清除伪列数据
row.values['pseudocolumn'] = { display: null, value: null };
if (isfilterDelete && row.status == '3' && row.values[sonfield].value == null) {
// 如果过滤删除行,则不添加到数组中
} else {
newSonRows.push(row);
}
});
}
}
data.grandSons = {
[sonAreaCode]: {
areaType: 'table',
areacode: sonAreaCode,
rows: newSonRows
}
};
return data;
}
/**
* 将孙表设值到对应的数据上
* @param {*} props
* @param {*} bodyData
* @param {*} grandData
* @param {*} relatefield
*/
function setGrandSonTableData(
props,
bodyAreaCode,
sonAreaCode,
data,
relatefield,
isDiffUpdate = false,
isCache = true,
shouldForceUpdate = false
) {
if (
data.body[bodyAreaCode] &&
data.body[bodyAreaCode].rows &&
data.grandSons[sonAreaCode] &&
data.grandSons[sonAreaCode].rows
) {
let bodyRows = data.body[bodyAreaCode].rows;
let grandSonRows = data.grandSons[sonAreaCode].rows;
let keyMap = {};
let pseudocolumnKey = [];
bodyRows.forEach((row) => {
let pk = row.values[relatefield].value;
if (!pk) {
pk = row.values['pseudocolumn'].value;
pseudocolumnKey.push(pk);
}
let rowid = row.rowid;
keyMap[pk] = rowid;
});
let keyMapList = {};
grandSonRows.forEach((row) => {
let pk = row.values[relatefield].value;
// 因为此处取出来的值可能是伪列也可能是rowid, 也可能是主键
if (keyMap[pk]) {
// 是伪列和主键的场景已经再上次遍历中确定
if (pseudocolumnKey.includes(pk)) {
// 如果是伪列的话重置为rowid ,因为关联字段在后台只能够识别 主键或rowid
row.values[relatefield].value = keyMap[pk];
}
// 统一使用rowid作为孙表行的归属判断
pk = keyMap[pk];
}
// 如果不在上次遍历中则认为当前已经是rowid了属于处理过的数据
if (!keyMapList[pk]) {
keyMapList[pk] = [];
}
keyMapList[pk].push(row);
});
for (const relatePk in keyMap) {
if (keyMap.hasOwnProperty(relatePk)) {
props.cardTable.setGrandTableData({
rowid: keyMap[relatePk],
parentId: bodyAreaCode,
tableId: sonAreaCode,
data: { rows: keyMapList[keyMap[relatePk]] },
shouldForceUpdate: shouldForceUpdate,
isCache: isCache,
isDiffUpdate: isDiffUpdate
});
}
}
}
}
export {
createGrandsonData,
createGrandsonDataNew,
setGrandSonTableData,
setGrandsonData,
setGrandsonNullData,
setGrandsonNullDataForRow,
getGrandsonDataByBody,
delBodyRow,
filterChildEmptyRows
};
/*U78Ffc36EDqIdVE704DtxRQN4nbg0EuMhMftv3nDP2E=*/

View File

@ -0,0 +1,13 @@
/*urremOWARK+vBHz6FJqz/HoIiL7jg8KLA37kmvVsOZU=*/
/*
* 孙表数据工具类
* @Author: liangzhyf
* @Date: 2019-04-30 15:00:25
* @Last Modified by: huoyzh
* @Last Modified time: 2019-05-22 10:43:56
*/
import { createGrandsonData, setGrandsonData, setGrandsonNullData } from './grandsonDataUtils';
export { createGrandsonData, setGrandsonData, setGrandsonNullData };
/*urremOWARK+vBHz6FJqz/HoIiL7jg8KLA37kmvVsOZU=*/