工具源码
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