工具源码
This commit is contained in:
parent
8691964445
commit
ea26ed03c8
|
@ -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=*/
|
|
@ -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=*/
|
Loading…
Reference in New Issue