Commit 220d436856cdbf03b60326c19cf5cdf3bf92f0dc
1 parent
e1146525
1.将keyUp事件封装到commonKeyUp文件中,重构代码结构,使之更清晰易读
Showing
4 changed files
with
570 additions
and
32 deletions
src/components/Common/CommonBase.js
| @@ -12,6 +12,7 @@ import commonConfig from '../../utils/config'; | @@ -12,6 +12,7 @@ import commonConfig from '../../utils/config'; | ||
| 12 | import * as commonUtils from '../../utils/utils'; | 12 | import * as commonUtils from '../../utils/utils'; |
| 13 | import * as commonServices from '../../services/services'; | 13 | import * as commonServices from '../../services/services'; |
| 14 | import * as commonFunc from './commonFunc'; | 14 | import * as commonFunc from './commonFunc'; |
| 15 | +import * as commonKeyUp from './commonKeyUp'; | ||
| 15 | import * as commonBusiness from './commonBusiness'; /* 通用单据方法 */ | 16 | import * as commonBusiness from './commonBusiness'; /* 通用单据方法 */ |
| 16 | import instructSet from "@/components/Common/CommonInstructSet"; | 17 | import instructSet from "@/components/Common/CommonInstructSet"; |
| 17 | 18 | ||
| @@ -1899,7 +1900,7 @@ export default (ChildComponent) => { | @@ -1899,7 +1900,7 @@ export default (ChildComponent) => { | ||
| 1899 | } | 1900 | } |
| 1900 | 1901 | ||
| 1901 | const tableDataRowNew = { ...tableData[iIndex], ...changeValue, handleType }; | 1902 | const tableDataRowNew = { ...tableData[iIndex], ...changeValue, handleType }; |
| 1902 | - const tableDataAfter = commonBusiness.getKeyUpEvent(name, sFieldName, tableConfig, masterData, tableDataRowNew, true, tableAllData, tableSelectedData, app); | 1903 | + const tableDataAfter = commonKeyUp.getKeyUpEvent(name, sFieldName, tableConfig, masterData, tableDataRowNew, true, tableAllData, tableSelectedData, app); |
| 1903 | if (commonUtils.isNotEmptyObject(tableDataAfter)) { | 1904 | if (commonUtils.isNotEmptyObject(tableDataAfter)) { |
| 1904 | changeValue = { ...tableDataAfter }; | 1905 | changeValue = { ...tableDataAfter }; |
| 1905 | } | 1906 | } |
src/components/Common/commonBusiness.js
| @@ -1024,6 +1024,11 @@ export function extractTableNames(expression) { | @@ -1024,6 +1024,11 @@ export function extractTableNames(expression) { | ||
| 1024 | * 移除tableSelectedData中key的Row后缀,返回新对象 | 1024 | * 移除tableSelectedData中key的Row后缀,返回新对象 |
| 1025 | */ | 1025 | */ |
| 1026 | function formatTableData(originObj) { | 1026 | function formatTableData(originObj) { |
| 1027 | + // 添加空值检查,防止undefined或null导致Object.entries报错 | ||
| 1028 | + if (originObj == null || typeof originObj !== 'object') { | ||
| 1029 | + return {}; | ||
| 1030 | + } | ||
| 1031 | + | ||
| 1027 | const newObj = {}; | 1032 | const newObj = {}; |
| 1028 | // 遍历原始对象的键值对 | 1033 | // 遍历原始对象的键值对 |
| 1029 | Object.entries(originObj).forEach(([key, value]) => { | 1034 | Object.entries(originObj).forEach(([key, value]) => { |
src/components/Common/commonFunc.js
| @@ -269,15 +269,40 @@ export function getDefaultData(config, allTableData = {}, extraData = {}) { | @@ -269,15 +269,40 @@ export function getDefaultData(config, allTableData = {}, extraData = {}) { | ||
| 269 | return returnData; | 269 | return returnData; |
| 270 | } | 270 | } |
| 271 | 271 | ||
| 272 | +export function clearJsonStringFields(obj, excludeFields = []) { | ||
| 273 | + if (!commonUtils.isNotEmptyObject(obj)) { | ||
| 274 | + return obj; | ||
| 275 | + } | ||
| 276 | + | ||
| 277 | + const processedObj = lodash.cloneDeep(obj); | ||
| 278 | + | ||
| 279 | + Object.keys(processedObj).forEach(key => { | ||
| 280 | + // 跳过排除字段 | ||
| 281 | + if (excludeFields.includes(key)) { | ||
| 282 | + return; | ||
| 283 | + } | ||
| 284 | + | ||
| 285 | + const value = processedObj[key]; | ||
| 286 | + | ||
| 287 | + // 智能检测JSON字符串 | ||
| 288 | + if (typeof value === 'string' && commonUtils.isJSON(value)) { | ||
| 289 | + processedObj[key] = ''; | ||
| 290 | + } | ||
| 291 | + }); | ||
| 292 | + | ||
| 293 | + return processedObj; | ||
| 294 | +} | ||
| 295 | + | ||
| 296 | + | ||
| 272 | /** 获取数据默认值 */ | 297 | /** 获取数据默认值 */ |
| 273 | -export function getAssignFieldValue(sAssignField, srcData, allTableData = {}, bMultiTable, bCommon, tableNames) { | 298 | +export function getAssignFieldValue(sAssignField, srcData, allTableData = {}, bMultiTable, bCrossTable, tableNames) { |
| 274 | const returnData = {}; | 299 | const returnData = {}; |
| 275 | if (!commonUtils.isEmpty(sAssignField)) { | 300 | if (!commonUtils.isEmpty(sAssignField)) { |
| 276 | /* 赋值数组 */ | 301 | /* 赋值数组 */ |
| 277 | const sAssignFieldObj = sAssignField.split(','); | 302 | const sAssignFieldObj = sAssignField.split(','); |
| 278 | if (commonUtils.isNotEmptyObject(srcData)) { | 303 | if (commonUtils.isNotEmptyObject(srcData)) { |
| 279 | let strVar = ''; | 304 | let strVar = ''; |
| 280 | - if (sAssignField && sAssignField.includes('var') && bCommon) { | 305 | + if (sAssignField && sAssignField.includes('var') && bCrossTable) { |
| 281 | console.log('sAssignFiel:d', sAssignField); | 306 | console.log('sAssignFiel:d', sAssignField); |
| 282 | if (sAssignField.includes('slave.') || sAssignField.includes('slave.') || sAssignField.includes('control.') | 307 | if (sAssignField.includes('slave.') || sAssignField.includes('slave.') || sAssignField.includes('control.') |
| 283 | || sAssignField.includes('materials.') || sAssignField.includes('process.') || sAssignField.includes('master.')) { /* var表格对象 */ | 308 | || sAssignField.includes('materials.') || sAssignField.includes('process.') || sAssignField.includes('master.')) { /* var表格对象 */ |
| @@ -289,35 +314,7 @@ export function getAssignFieldValue(sAssignField, srcData, allTableData = {}, bM | @@ -289,35 +314,7 @@ export function getAssignFieldValue(sAssignField, srcData, allTableData = {}, bM | ||
| 289 | 314 | ||
| 290 | for (const row of matchedKeys) { | 315 | for (const row of matchedKeys) { |
| 291 | const srcData = allTableData[row]; | 316 | const srcData = allTableData[row]; |
| 292 | - const srcNewData = lodash.cloneDeep(srcData); | ||
| 293 | - if (srcNewData.sCombinedMemo) { | ||
| 294 | - srcNewData.sCombinedMemo = ''; | ||
| 295 | - } | ||
| 296 | - if(srcNewData.sWorkOrderParam) { | ||
| 297 | - srcNewData.sWorkOrderParam = ''; | ||
| 298 | - } | ||
| 299 | - if(srcNewData.sProcessParam) { | ||
| 300 | - srcNewData.sProcessParam = ''; | ||
| 301 | - } | ||
| 302 | - if(srcNewData.sNormParam) { | ||
| 303 | - srcNewData.sNormParam = ''; | ||
| 304 | - } | ||
| 305 | - if(srcNewData.sNormPanel) { | ||
| 306 | - srcNewData.sNormPanel = ''; | ||
| 307 | - } | ||
| 308 | - if(srcNewData.sWorkOrderPanel) { | ||
| 309 | - srcNewData.sWorkOrderPanel = ''; | ||
| 310 | - } | ||
| 311 | - if(srcNewData.sParams) { | ||
| 312 | - srcNewData.sParams = ''; | ||
| 313 | - } | ||
| 314 | - if(srcNewData.sQuoParams) { | ||
| 315 | - srcNewData.sQuoParams = ''; | ||
| 316 | - } | ||
| 317 | - | ||
| 318 | - if (srcNewData.sPositiveColor) { | ||
| 319 | - srcNewData.sPositiveColor = ''; | ||
| 320 | - } | 317 | + const srcNewData = clearJsonStringFields(srcData); |
| 321 | const field = `var ${row}=${JSON.stringify(srcNewData)};`; | 318 | const field = `var ${row}=${JSON.stringify(srcNewData)};`; |
| 322 | strVar += field; | 319 | strVar += field; |
| 323 | } | 320 | } |
src/components/Common/commonKeyUp.js
0 → 100644
| 1 | + | ||
| 2 | +import * as commonUtils from '@/utils/utils'; | ||
| 3 | +import * as commonFunc from './commonFunc'; | ||
| 4 | + | ||
| 5 | +/** | ||
| 6 | + * 自定义onChange事件处理函数 - 处理表格字段变更时的联动逻辑 | ||
| 7 | + * | ||
| 8 | + * @param {string} name - 表名('master'表示主表,其他表示从表如slave,control,materials,process) | ||
| 9 | + * @param {string} sFieldName - 触发变更的字段名称 | ||
| 10 | + * @param {Object} tableConfig - 表格配置对象,包含gdsconfigformslave配置数组 | ||
| 11 | + * @param {Object} masterData - 主表数据对象 | ||
| 12 | + * @param {Object} tableDataRow - 当前行数据对象(从表时使用) | ||
| 13 | + * @param {boolean} isWait - 是否等待处理完成 | ||
| 14 | + * @param {Object} dataCollection - 所有表格数据集合 | ||
| 15 | + * @param {Object} dataSelected - 选中的数据对象 | ||
| 16 | + * @param {Object} app - 应用实例对象 | ||
| 17 | + * @returns {Object} 处理后的数据对象 | ||
| 18 | + */ | ||
| 19 | +export function getKeyUpEvent(name, sFieldName, tableConfig, masterData, tableDataRow, isWait, dataCollection, dataSelected, app) { | ||
| 20 | + // 初始化数据对象和拷贝容器 | ||
| 21 | + let tableDataRowNew = {}; | ||
| 22 | + const newCopyTo = {}; | ||
| 23 | + | ||
| 24 | + // 根据表名类型初始化数据 | ||
| 25 | + if (name === 'master') { | ||
| 26 | + tableDataRowNew = masterData; // 主表使用masterData | ||
| 27 | + } else { | ||
| 28 | + tableDataRowNew = tableDataRow; // 从表使用当前行数据 | ||
| 29 | + newCopyTo.slave = tableDataRow; // 设置从表数据到拷贝容器 | ||
| 30 | + } | ||
| 31 | + | ||
| 32 | + // 检查表格配置是否存在且有效 | ||
| 33 | + if (commonUtils.isNotEmptyObject(tableConfig) && commonUtils.isNotEmptyArr(tableConfig.gdsconfigformslave)) { | ||
| 34 | + // 查找对应字段的配置项 | ||
| 35 | + const iConfigIndex = tableConfig.gdsconfigformslave.findIndex(item => item.sName === sFieldName); | ||
| 36 | + if (iConfigIndex > -1) { | ||
| 37 | + // 设置主表数据到拷贝容器 | ||
| 38 | + newCopyTo.master = masterData; | ||
| 39 | + | ||
| 40 | + // 获取赋值字段配置和按钮参数 | ||
| 41 | + const sAssignField = tableConfig.gdsconfigformslave[iConfigIndex].sOnChangeAssignField; | ||
| 42 | + const sButtonParam = tableConfig.gdsconfigformslave[iConfigIndex].sButtonParam; /* 设置多级联动 */ | ||
| 43 | + | ||
| 44 | + console.log('sAssignField:', sAssignField); | ||
| 45 | + | ||
| 46 | + // 根据赋值字段类型分发处理逻辑 | ||
| 47 | + /* keyUp联动其他表 */ | ||
| 48 | + if (commonUtils.isNotEmptyObject(sAssignField) && (sAssignField.includes('@@@:') || sAssignField.includes(';,'))) { | ||
| 49 | + // 多表联动处理(包含@@@:或;,分隔符) | ||
| 50 | + return handleMultiTableLinkage(name, sAssignField, sButtonParam, tableDataRowNew, newCopyTo, masterData, tableDataRow, dataCollection, dataSelected, app); | ||
| 51 | + } else if (commonUtils.isNotEmptyObject(sAssignField) && sAssignField.includes('_')) { | ||
| 52 | + // 跨表联动处理(包含下划线_all汇总, _filter过滤) | ||
| 53 | + return handleCrossTableLinkage(name, sAssignField, sButtonParam, tableDataRowNew, newCopyTo, masterData, tableDataRow, dataCollection, dataSelected, app); | ||
| 54 | + } else if (commonUtils.isNotEmptyObject(sAssignField)) { | ||
| 55 | + // 单表keyUp事件处理 | ||
| 56 | + return handleSingleTableEvent(name, sAssignField, tableDataRowNew, newCopyTo, masterData, tableDataRow, dataSelected, isWait); | ||
| 57 | + } else { | ||
| 58 | + // 无有效赋值字段,返回空对象 | ||
| 59 | + return {}; | ||
| 60 | + } | ||
| 61 | + } | ||
| 62 | + } | ||
| 63 | + | ||
| 64 | + // 未找到对应配置或配置无效,返回原始数据 | ||
| 65 | + return tableDataRowNew; | ||
| 66 | +} | ||
| 67 | + | ||
| 68 | +// 辅助函数:处理多表联动 | ||
| 69 | +function handleMultiTableLinkage(name, sAssignField, sButtonParam, tableDataRowNew, newCopyTo, masterData, tableDataRow, dataCollection, dataSelected, app) { | ||
| 70 | + const sAssignFieldObj = sAssignField.split(';,'); | ||
| 71 | + console.log('=====sAssignFieldObj', sAssignFieldObj); | ||
| 72 | + let addState = {}; | ||
| 73 | + | ||
| 74 | + if (name === 'master') { | ||
| 75 | + sAssignFieldObj.forEach((sAssignFieldItem) => { | ||
| 76 | + if (sAssignFieldItem?.indexOf('@@@:') !== -1) { | ||
| 77 | + const sFormula = sAssignFieldItem.split('@@@:')[1]; | ||
| 78 | + const sAssignFieldV2 = commonFunc.getAssignFieldV2(sFormula, tableDataRowNew); | ||
| 79 | + const result = commonFunc.getAssignFieldValue(sAssignFieldV2, tableDataRowNew, newCopyTo); | ||
| 80 | + addState = { ...addState, ...result }; | ||
| 81 | + } else if (sAssignFieldItem?.includes('_all')) { | ||
| 82 | + addState = { ...addState, ...handleAllTableLinkage(sAssignFieldItem, newCopyTo, masterData, dataCollection) }; | ||
| 83 | + } else { | ||
| 84 | + addState = { | ||
| 85 | + ...addState, | ||
| 86 | + ...commonFunc.getAssignFieldValue(sAssignFieldItem, tableDataRowNew, newCopyTo), | ||
| 87 | + }; | ||
| 88 | + } | ||
| 89 | + }); | ||
| 90 | + } else { | ||
| 91 | + sAssignFieldObj.forEach((sAssignFieldItem) => { | ||
| 92 | + const tableConfigCopy = cloneDeep(tableConfig); | ||
| 93 | + tableConfigCopy.gdsconfigformslave[iConfigIndex].sOnChangeAssignField = sAssignFieldItem; | ||
| 94 | + const returnResult = getKeyUpEvent(name, sFieldName, tableConfigCopy, masterData, { ...tableDataRow, ...addState }, isWait, dataCollection, dataSelected, app); | ||
| 95 | + addState = { ...addState, ...returnResult }; | ||
| 96 | + }); | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | + console.log('=====KeyUpResult', addState); | ||
| 100 | + return { ...tableDataRowNew, ...addState }; | ||
| 101 | +} | ||
| 102 | + | ||
| 103 | +// 辅助函数:处理_all类型的表联动 | ||
| 104 | +function handleAllTableLinkage(sAssignFieldItem, newCopyTo, masterData, dataCollection) { | ||
| 105 | + const addState = {}; | ||
| 106 | + const leftFiled = sAssignFieldItem; /* 每一个赋值字段 */ | ||
| 107 | + if (commonUtils.isNotEmptyObject(leftFiled)) { | ||
| 108 | + const tbName = leftFiled.substring(0, leftFiled.indexOf('_')); | ||
| 109 | + const tableData = dataCollection[tbName]; | ||
| 110 | + if (commonUtils.isNotEmptyArr(tableData)) { | ||
| 111 | + const sOnChangeAssignFieldNew = leftFiled.replace(`${tbName}_all.`, '').trim(); | ||
| 112 | + tableData.forEach((item, index) => { | ||
| 113 | + newCopyTo[tbName] = item; | ||
| 114 | + const tableRow = { ...item, ...commonFunc.getAssignFieldValue(sOnChangeAssignFieldNew, item, newCopyTo) }; // 取赋值字段 | ||
| 115 | + tableRow.handleType = commonUtils.isEmpty(tableRow.handleType) ? 'update' : tableRow.handleType; | ||
| 116 | + tableData[index] = tableRow; | ||
| 117 | + }); | ||
| 118 | + addState[tbName] = tableData; | ||
| 119 | + masterData.handleType = commonUtils.isEmpty(masterData.handleType) ? 'update' : masterData.handleType; | ||
| 120 | + addState.master = masterData; | ||
| 121 | + addState.bMultiTable = true; | ||
| 122 | + } | ||
| 123 | + } | ||
| 124 | + return addState; | ||
| 125 | +} | ||
| 126 | + | ||
| 127 | +// 辅助函数:处理跨表联动 | ||
| 128 | +function handleCrossTableLinkage(name, sAssignField, sButtonParam, tableDataRowNew, newCopyTo, masterData, tableDataRow, dataCollection, dataSelected, app) { | ||
| 129 | + const addState = {}; | ||
| 130 | + /* 主表联动其他表格 */ | ||
| 131 | + if (name === 'master' && (!sAssignField.includes('filter') && !sAssignField.includes('sum') )) { | ||
| 132 | + const sAssignFieldObj = sAssignField.split(','); | ||
| 133 | + if (commonUtils.isNotEmptyArr(sAssignFieldObj)) { | ||
| 134 | + sAssignFieldObj.forEach((eachFiled) => { | ||
| 135 | + if (eachFiled.includes('_')) { | ||
| 136 | + const tbName = eachFiled.substring(0, eachFiled.indexOf('_')); | ||
| 137 | + const tableData = dataCollection[tbName]; | ||
| 138 | + if (commonUtils.isNotEmptyArr(tableData)) { | ||
| 139 | + const sOnChangeAssignFieldNew = eachFiled.replace(`${tbName}_all.`, '').trim(); | ||
| 140 | + console.log('333', sOnChangeAssignFieldNew); | ||
| 141 | + tableData.forEach((item, index) => { | ||
| 142 | + newCopyTo[tbName] = item; | ||
| 143 | + newCopyTo.master = masterData; | ||
| 144 | + let tableRow = { ...item, ...commonFunc.getAssignFieldValue(sOnChangeAssignFieldNew, item, newCopyTo, true, true) }; | ||
| 145 | + if (commonUtils.isNotEmptyObject(sButtonParam)) { | ||
| 146 | + let sLinkFieldName = ''; | ||
| 147 | + if (commonUtils.isJSON(sButtonParam)) { | ||
| 148 | + const linkObj = JSON.parse(sButtonParam); | ||
| 149 | + let models = 'Product'; | ||
| 150 | + if (linkObj.linkMaterials) { | ||
| 151 | + sLinkFieldName = linkObj.linkMaterials; | ||
| 152 | + models = 'Materials'; | ||
| 153 | + } else if (linkObj.linkProduct) { | ||
| 154 | + sLinkFieldName = linkObj.linkProduct; | ||
| 155 | + models = 'Product'; | ||
| 156 | + } | ||
| 157 | + console.log('sLinkFieldName', sLinkFieldName, models); | ||
| 158 | + tableRow = this.getCalculateAllMoney(app, models, sLinkFieldName, masterData, tableRow); | ||
| 159 | + } | ||
| 160 | + } | ||
| 161 | + tableRow.handleType = commonUtils.isEmpty(tableRow.handleType) ? 'update' : tableRow.handleType; | ||
| 162 | + tableData[index] = tableRow; | ||
| 163 | + }); | ||
| 164 | + addState[tbName] = tableData; | ||
| 165 | + masterData.handleType = commonUtils.isEmpty(masterData.handleType) ? 'update' : masterData.handleType; | ||
| 166 | + addState.master = commonUtils.isNotEmptyObject(addState.master) ? { ...addState.master, ...masterData } : masterData; | ||
| 167 | + addState.bMultiTable = true; | ||
| 168 | + } | ||
| 169 | + } else { | ||
| 170 | + if (commonUtils.isNotEmptyArr(dataCollection)) { | ||
| 171 | + if (eachFiled.includes('master.')) { | ||
| 172 | + newCopyTo.master = dataCollection.master; | ||
| 173 | + } else if (eachFiled.includes('control.')) { | ||
| 174 | + // const tbName = 'control'; | ||
| 175 | + } | ||
| 176 | + } | ||
| 177 | + tableDataRowNew = { ...tableDataRowNew, ...commonFunc.getAssignFieldValue(eachFiled, tableDataRowNew, newCopyTo) }; | ||
| 178 | + let { handleType } = masterData; | ||
| 179 | + if (name !== 'master') { | ||
| 180 | + // eslint-disable-next-line prefer-destructuring | ||
| 181 | + handleType = tableDataRow.handleType; | ||
| 182 | + } | ||
| 183 | + addState.bMultiTable = true; | ||
| 184 | + tableDataRowNew.handleType = commonUtils.isEmpty(handleType) ? 'update' : handleType; | ||
| 185 | + addState.master = tableDataRowNew; | ||
| 186 | + } | ||
| 187 | + }); | ||
| 188 | + } | ||
| 189 | + return addState; | ||
| 190 | + } else { | ||
| 191 | + const sAssignFieldObj = sAssignField.split(','); | ||
| 192 | + if (commonUtils.isNotEmptyArr(sAssignFieldObj)) { | ||
| 193 | + const leftFiled = sAssignFieldObj[0]; | ||
| 194 | + if (commonUtils.isNotEmptyObject(leftFiled)) { | ||
| 195 | + const tbName = leftFiled.substring(0, leftFiled.indexOf('_')); | ||
| 196 | + const tableData = dataCollection[name]; | ||
| 197 | + if (commonUtils.isNotEmptyArr(tableData)) { | ||
| 198 | + if (sAssignField.indexOf('filter') > -1 && sAssignField.indexOf('sum') > -1) { | ||
| 199 | + return handleFilterAndSum(sAssignField, tableDataRowNew, newCopyTo, masterData, tableDataRow, dataCollection, dataSelected, app); | ||
| 200 | + } else if (sAssignField.indexOf('sum') > -1) { | ||
| 201 | + return handleSumOnly(tbName, sAssignField, tableData, tableDataRowNew, newCopyTo, masterData, tableDataRow, app); | ||
| 202 | + } else if (sAssignField.indexOf('filter') > -1) { | ||
| 203 | + return handleFilterOnly(sAssignField, sButtonParam, tableDataRowNew, newCopyTo, masterData, tableDataRow, dataCollection, app); | ||
| 204 | + } | ||
| 205 | + } | ||
| 206 | + } | ||
| 207 | + } | ||
| 208 | + return tableDataRowNew; | ||
| 209 | + } | ||
| 210 | +} | ||
| 211 | + | ||
| 212 | +// 辅助函数:处理过滤并汇总 | ||
| 213 | +function handleFilterAndSum(sAssignField, tableDataRowNew, newCopyTo, masterData, tableDataRow, dataCollection, dataSelected, app) { | ||
| 214 | + console.log('赋值字段', sAssignField); | ||
| 215 | + let sOnChangeAssignFieldNew = sAssignField; | ||
| 216 | + const indexOf = sAssignField.indexOf('_'); | ||
| 217 | + const targetSumName = sAssignField.substring(0, indexOf); | ||
| 218 | + let targetTbName = ''; | ||
| 219 | + | ||
| 220 | + const fStartIndexOf = sAssignField.indexOf(':'); | ||
| 221 | + const fEndIndexOf = sAssignField.lastIndexOf('_filter'); | ||
| 222 | + console.log('拿目标要过滤的表名', targetSumName, fStartIndexOf, fEndIndexOf); | ||
| 223 | + if (fStartIndexOf > -1 && fEndIndexOf > -1) { | ||
| 224 | + targetTbName = sAssignField.substring(fStartIndexOf + 1, fEndIndexOf); | ||
| 225 | + } | ||
| 226 | + const targetTableData = dataCollection[targetTbName]; | ||
| 227 | + const targetData = dataCollection[targetSumName]; | ||
| 228 | + const targetRow = dataSelected[`${targetSumName}Row`]; | ||
| 229 | + const targetFieldName = sAssignField.substring(sAssignField.indexOf('.') + 1, sAssignField.indexOf(':')); | ||
| 230 | + const baseFieldName = sAssignField.substring(sAssignField.lastIndexOf('.') + 1, sAssignField.length); | ||
| 231 | + let filterTableData = []; | ||
| 232 | + const leftIndexOf = sAssignField.indexOf('{'); | ||
| 233 | + const rightIndexOf = sAssignField.lastIndexOf('}'); | ||
| 234 | + if (leftIndexOf > -1 && rightIndexOf > -1) { | ||
| 235 | + const condition = sAssignField.substring(leftIndexOf, rightIndexOf + 1); | ||
| 236 | + const conditionStr = condition.toString(); | ||
| 237 | + sOnChangeAssignFieldNew = sAssignField.replace(`${targetTbName}_filter_${condition}.`, '').replace('_sum', '').trim(); | ||
| 238 | + console.log('sOnChangeAssignFieldNew', sOnChangeAssignFieldNew); | ||
| 239 | + let jsonObj = {}; | ||
| 240 | + if (commonUtils.isNotEmptyObject(conditionStr) && commonUtils.isJSON(conditionStr)) { | ||
| 241 | + jsonObj = JSON.parse(conditionStr); | ||
| 242 | + const { ifdo: ifdoStr, condition, decimal = 0 } = jsonObj; | ||
| 243 | + let ifdoResult = true; | ||
| 244 | + if (ifdoStr) { | ||
| 245 | + try { | ||
| 246 | + let ifdoStrNew = ""; | ||
| 247 | + const reg = new RegExp(`master\.`, "g"); | ||
| 248 | + ifdoStrNew = ifdoStr.replace(reg, `masterData.`); | ||
| 249 | + const reg1 = new RegExp(`slave\.`, "g"); | ||
| 250 | + ifdoStrNew = ifdoStrNew.replace(reg1, `tableDataRow.`); | ||
| 251 | + const evalStr = eval("`" + ifdoStrNew + "`"); | ||
| 252 | + ifdoResult = eval(evalStr); | ||
| 253 | + } catch (error) { | ||
| 254 | + console.log('=====keyup ifdo 报错:', { | ||
| 255 | + ifdoStr, error | ||
| 256 | + }) | ||
| 257 | + } | ||
| 258 | + } | ||
| 259 | + if (!ifdoResult) { | ||
| 260 | + return {}; | ||
| 261 | + } | ||
| 262 | + if (commonUtils.isNotEmptyArr(condition)) { | ||
| 263 | + filterTableData = applyFilterConditions(condition, targetTableData, masterData, tableDataRow, baseFieldName, app); | ||
| 264 | + } | ||
| 265 | + let sumData = 0; | ||
| 266 | + if (commonUtils.isNotEmptyArr(filterTableData)) { | ||
| 267 | + sumData = calculateSum(sFieldName, filterTableData, tableDataRow, targetTableData, decimal, newCopyTo, masterData, name, targetTbName, app); | ||
| 268 | + if (commonUtils.isNotEmptyObject(targetRow)) { | ||
| 269 | + targetRow[sFieldName] = sumData; | ||
| 270 | + } | ||
| 271 | + if (targetSumName === 'master') { | ||
| 272 | + const targetDataNew = name === 'master' ? masterData : targetData; | ||
| 273 | + targetDataNew[targetFieldName] = sumData; | ||
| 274 | + targetDataNew.handleType = commonUtils.isEmpty(targetDataNew.handleType) ? 'update' : targetDataNew.handleType; | ||
| 275 | + addState[targetSumName] = targetDataNew; | ||
| 276 | + if(name === 'master') { | ||
| 277 | + addState[targetTbName] = targetTableData; | ||
| 278 | + return addState; | ||
| 279 | + } | ||
| 280 | + } else if (commonUtils.isNotEmptyArr(targetData)) { | ||
| 281 | + targetRow[`${sFieldName}Sum`] = sumData; | ||
| 282 | + const iSlaveIndex = targetData.findIndex(item => item.sId === targetRow.sId); | ||
| 283 | + if (iSlaveIndex > -1) { | ||
| 284 | + targetData[iSlaveIndex][`${sFieldName}Sum`] = sumData; | ||
| 285 | + newCopyTo[targetSumName] = targetData[iSlaveIndex]; | ||
| 286 | + targetData[iSlaveIndex].dTotal_waste_qty = sumData; | ||
| 287 | + targetData[iSlaveIndex].handleType = commonUtils.isEmpty(targetData[iSlaveIndex].handleType) ? 'update' : targetData[iSlaveIndex].handleType; | ||
| 288 | + addState[targetData] = targetData; | ||
| 289 | + } | ||
| 290 | + } | ||
| 291 | + addState[targetTbName] = targetTableData; | ||
| 292 | + } | ||
| 293 | + } | ||
| 294 | + } | ||
| 295 | + return addState; | ||
| 296 | +} | ||
| 297 | + | ||
| 298 | +// 辅助函数:应用过滤条件 | ||
| 299 | +function applyFilterConditions(conditions, targetTableData, masterData, tableDataRow, baseFieldName, app) { | ||
| 300 | + let filterTableData = []; | ||
| 301 | + for (const item of conditions) { | ||
| 302 | + const { bFilterName, bFilterCondition, bFilterValue } = item; | ||
| 303 | + if (bFilterCondition === '>') { | ||
| 304 | + if (bFilterValue.includes('.')) { | ||
| 305 | + const indexs = bFilterValue.indexOf('.'); | ||
| 306 | + const sConditionTableName = bFilterValue.substring(0, indexs); | ||
| 307 | + const sConditionFieldName = bFilterValue.substring(indexs + 1, bFilterValue.length); | ||
| 308 | + if (sConditionFieldName === 'slave') { | ||
| 309 | + if (commonUtils.isNotEmptyArr(targetTableData)) { | ||
| 310 | + filterTableData = targetTableData.filter(item => item[bFilterName] > tableDataRow[sConditionTableName]); | ||
| 311 | + } | ||
| 312 | + } | ||
| 313 | + } else { | ||
| 314 | + filterTableData = targetTableData.filter(item => item[bFilterName] > bFilterValue); | ||
| 315 | + } | ||
| 316 | + } else if (bFilterCondition === '=') { | ||
| 317 | + if (bFilterValue.includes('.')) { | ||
| 318 | + const indexs = bFilterValue.indexOf('.'); | ||
| 319 | + const sConditionTableName = bFilterValue.substring(0, indexs); | ||
| 320 | + const sConditionFieldName = bFilterValue.substring(indexs + 1, bFilterValue.length); | ||
| 321 | + if (sConditionTableName === 'slave') { | ||
| 322 | + if (commonUtils.isNotEmptyArr(targetTableData)) { | ||
| 323 | + filterTableData = targetTableData.filter(item => item[bFilterName] === tableDataRow[sConditionFieldName]); | ||
| 324 | + } | ||
| 325 | + } else if (sConditionTableName === 'master') { | ||
| 326 | + if (commonUtils.isNotEmptyArr(targetTableData)) { | ||
| 327 | + filterTableData = targetTableData.filter(item => item[bFilterName] === masterData[sConditionFieldName]); | ||
| 328 | + } | ||
| 329 | + } | ||
| 330 | + } else { | ||
| 331 | + filterTableData = targetTableData.filter(item => item[bFilterName] === bFilterValue); | ||
| 332 | + } | ||
| 333 | + if(baseFieldName !== sFieldName) { | ||
| 334 | + sFieldName = baseFieldName; | ||
| 335 | + } | ||
| 336 | + } else if (bFilterCondition === '<') { | ||
| 337 | + if (bFilterValue.includes('.')) { | ||
| 338 | + const indexs = bFilterValue.indexOf('.'); | ||
| 339 | + const sConditionTableName = bFilterValue.substring(0, indexs); | ||
| 340 | + const sConditionFieldName = bFilterValue.substring(indexs + 1, bFilterValue.length); | ||
| 341 | + if (sConditionTableName === 'slave') { | ||
| 342 | + if (commonUtils.isNotEmptyArr(targetTableData)) { | ||
| 343 | + filterTableData = targetTableData.filter(item => item[bFilterName] < tableDataRow[sConditionFieldName]); | ||
| 344 | + } | ||
| 345 | + } | ||
| 346 | + } else { | ||
| 347 | + filterTableData = targetTableData.filter(item => item[bFilterName] < bFilterValue); | ||
| 348 | + } | ||
| 349 | + } | ||
| 350 | + } | ||
| 351 | + return filterTableData; | ||
| 352 | +} | ||
| 353 | + | ||
| 354 | +// 辅助函数:计算汇总值 | ||
| 355 | +function calculateSum(sFieldName, filterTableData, tableDataRow, targetTableData, decimal, newCopyTo, masterData, name, targetTbName, app) { | ||
| 356 | + let sumData = 0; | ||
| 357 | + filterTableData.forEach((item) => { | ||
| 358 | + const iIndex = targetTableData.findIndex(itemNew => itemNew.sId === item.sId); | ||
| 359 | + if (iIndex > -1) { | ||
| 360 | + newCopyTo.master = masterData; | ||
| 361 | + newCopyTo[targetTbName] = item; | ||
| 362 | + newCopyTo[name] = tableDataRow; | ||
| 363 | + newCopyTo.slaveInfo = item; | ||
| 364 | + newCopyTo.slaveChild = item; | ||
| 365 | + if (item.sId !== tableDataRow.sId) { | ||
| 366 | + sumData += commonUtils.isNull(item[sFieldName], 0); | ||
| 367 | + } else { | ||
| 368 | + sumData += commonUtils.isNull(tableDataRow[sFieldName], 0); | ||
| 369 | + } | ||
| 370 | + } | ||
| 371 | + }); | ||
| 372 | + if (decimal) { | ||
| 373 | + sumData = Number(sumData.toFixed(decimal)); | ||
| 374 | + } | ||
| 375 | + console.log('sumData', sumData); | ||
| 376 | + return sumData; | ||
| 377 | +} | ||
| 378 | + | ||
| 379 | +// 辅助函数:仅处理汇总 | ||
| 380 | +function handleSumOnly(tbName, sAssignField, tableData, tableDataRowNew, newCopyTo, masterData, tableDataRow, app) { | ||
| 381 | + const addState = {}; | ||
| 382 | + const sOnChangeAssignFieldNew = sAssignField.replace(`${tbName}_sum.`, '').trim(); | ||
| 383 | + newCopyTo.master = masterData; | ||
| 384 | + let sumData = 0; | ||
| 385 | + tableData.forEach((item, index) => { | ||
| 386 | + if (item.sId === tableDataRowNew.sId) { | ||
| 387 | + item = tableDataRowNew; | ||
| 388 | + tableData[index] = tableDataRowNew; | ||
| 389 | + } | ||
| 390 | + newCopyTo[name] = item; | ||
| 391 | + const tableRow = { ...item, ...commonFunc.getAssignFieldValue(sOnChangeAssignFieldNew, item, newCopyTo) }; | ||
| 392 | + tableRow.handleType = commonUtils.isEmpty(tableRow.handleType) ? 'update' : tableRow.handleType; | ||
| 393 | + const tempName = `${sFieldName}temp_sum`; | ||
| 394 | + const tempData = tableRow[tempName]; | ||
| 395 | + if (!commonUtils.isEmpty(tempData)) { | ||
| 396 | + sumData += tableRow[tempName]; | ||
| 397 | + sumData += tableRow[sFieldName]; | ||
| 398 | + } | ||
| 399 | + tableData[index] = tableRow; | ||
| 400 | + }); | ||
| 401 | + addState[name] = tableData; | ||
| 402 | + masterData.handleType = commonUtils.isEmpty(masterData.handleType) ? 'update' : masterData.handleType; | ||
| 403 | + masterData[sumData] = sumData; | ||
| 404 | + addState.masterData = masterData; | ||
| 405 | + return addState; | ||
| 406 | +} | ||
| 407 | + | ||
| 408 | +// 辅助函数:仅处理过滤 | ||
| 409 | +function handleFilterOnly(sAssignField, sButtonParam, tableDataRowNew, newCopyTo, masterData, tableDataRow, dataCollection, app) { | ||
| 410 | + const addState = {}; | ||
| 411 | + let sOnChangeAssignFieldNew = sAssignField; | ||
| 412 | + const indexOf = sAssignField.indexOf('_'); | ||
| 413 | + const targetTbName = sAssignField.substring(0, indexOf); | ||
| 414 | + const targetTableData = dataCollection[targetTbName]; | ||
| 415 | + let filterTableData = []; | ||
| 416 | + const leftIndexOf = sAssignField.indexOf('{'); | ||
| 417 | + const rightIndexOf = sAssignField.lastIndexOf('}'); | ||
| 418 | + if (leftIndexOf > -1 && rightIndexOf > -1) { | ||
| 419 | + const condition = sAssignField.substring(leftIndexOf, rightIndexOf + 1); | ||
| 420 | + const conditionStr = condition.toString(); | ||
| 421 | + sOnChangeAssignFieldNew = sAssignField.replace(`${targetTbName}_filter_${condition}.`, '').trim(); | ||
| 422 | + let jsonObj = {}; | ||
| 423 | + if (commonUtils.isNotEmptyObject(conditionStr)) { | ||
| 424 | + jsonObj = JSON.parse(conditionStr); | ||
| 425 | + const { condition } = jsonObj; | ||
| 426 | + if (commonUtils.isNotEmptyArr(condition)) { | ||
| 427 | + filterTableData = applyFilterConditions(condition, targetTableData, masterData, tableDataRow, sFieldName, app); | ||
| 428 | + } | ||
| 429 | + if (commonUtils.isNotEmptyArr(filterTableData)) { | ||
| 430 | + filterTableData.forEach((item) => { | ||
| 431 | + const iIndex = targetTableData.findIndex(itemNew => itemNew.sId === item.sId); | ||
| 432 | + if (iIndex > -1) { | ||
| 433 | + newCopyTo.master = masterData; | ||
| 434 | + newCopyTo[targetTbName] = item; | ||
| 435 | + newCopyTo[name] = tableDataRow; | ||
| 436 | + newCopyTo.slaveInfo = item; | ||
| 437 | + const tableRowAfter = { ...item, ...commonFunc.getAssignFieldValue(sOnChangeAssignFieldNew, tableDataRow, newCopyTo) }; | ||
| 438 | + let tableNewRow = {}; | ||
| 439 | + if (commonUtils.isNotEmptyObject(sButtonParam)) { | ||
| 440 | + newCopyTo[name] = tableRowAfter; | ||
| 441 | + tableNewRow = { ...tableRowAfter, ...commonFunc.getAssignFieldValue(sButtonParam, tableRowAfter, newCopyTo) }; | ||
| 442 | + } | ||
| 443 | + tableRowAfter.handleType = commonUtils.isEmpty(tableRowAfter.handleType) ? 'update' : tableRowAfter.handleType; | ||
| 444 | + if (commonUtils.isNotEmptyObject(tableNewRow)) { | ||
| 445 | + targetTableData[iIndex] = { ...tableRowAfter, ...tableNewRow }; | ||
| 446 | + } else { | ||
| 447 | + targetTableData[iIndex] = { ...item, ...tableRowAfter }; | ||
| 448 | + } | ||
| 449 | + } | ||
| 450 | + }); | ||
| 451 | + addState[targetTbName] = targetTableData; | ||
| 452 | + } | ||
| 453 | + } | ||
| 454 | + } | ||
| 455 | + return addState; | ||
| 456 | +} | ||
| 457 | + | ||
| 458 | +// 辅助函数:处理单表事件 | ||
| 459 | +function handleSingleTableEvent(name, sAssignField, tableDataRowNew, newCopyTo, masterData, tableDataRow, dataSelected, isWait) { | ||
| 460 | + const bCrossTable = isCrossTableAssignment(sAssignField); | ||
| 461 | + const tableNames = extractTableNames(sAssignField); | ||
| 462 | + | ||
| 463 | + const newTableSelectedMap = formatTableData(dataSelected); | ||
| 464 | + const datasetMap = bCrossTable ? newTableSelectedMap : newCopyTo; | ||
| 465 | + | ||
| 466 | + // 使用新的变量名来接收处理后的数据 | ||
| 467 | + const processedData = { | ||
| 468 | + ...tableDataRowNew, | ||
| 469 | + ...commonFunc.getAssignFieldValue(sAssignField, tableDataRowNew, datasetMap, false, bCrossTable, tableNames) | ||
| 470 | + }; | ||
| 471 | + | ||
| 472 | + let { handleType } = masterData ? masterData : { handleType: '' }; | ||
| 473 | + if (name !== 'master') { | ||
| 474 | + handleType = processedData.handleType; | ||
| 475 | + } | ||
| 476 | + processedData.handleType = commonUtils.isEmpty(handleType) ? 'update' : handleType; | ||
| 477 | + | ||
| 478 | + if (isWait) { | ||
| 479 | + return processedData; | ||
| 480 | + } | ||
| 481 | + | ||
| 482 | + return processedData; | ||
| 483 | +} | ||
| 484 | + | ||
| 485 | +function extractTableNames(sAssignField) { | ||
| 486 | + const tableNames = []; | ||
| 487 | + const regex = /(\w+)\./g; | ||
| 488 | + let match; | ||
| 489 | + while ((match = regex.exec(sAssignField)) !== null) { | ||
| 490 | + if (!tableNames.includes(match[1])) { | ||
| 491 | + tableNames.push(match[1]); | ||
| 492 | + } | ||
| 493 | + } | ||
| 494 | + return tableNames; | ||
| 495 | +} | ||
| 496 | + | ||
| 497 | +// 辅助函数:格式化表格数据 | ||
| 498 | +function formatTableData(originObj) { | ||
| 499 | + // 添加空值检查,防止undefined或null导致Object.entries报错 | ||
| 500 | + if (originObj == null || typeof originObj !== 'object') { | ||
| 501 | + return {}; | ||
| 502 | + } | ||
| 503 | + | ||
| 504 | + const newObj = {}; | ||
| 505 | + // 遍历原始对象的键值对 | ||
| 506 | + Object.entries(originObj).forEach(([key, value]) => { | ||
| 507 | + // 去掉末尾的Row后缀 | ||
| 508 | + const newKey = key.replace(/Row$/, ''); | ||
| 509 | + // 赋值到新对象(键名更新,数据不变) | ||
| 510 | + newObj[newKey] = value; | ||
| 511 | + }); | ||
| 512 | + return newObj; | ||
| 513 | +} | ||
| 514 | + | ||
| 515 | +// 辅助函数:获取子级数据(递归) | ||
| 516 | +function getChildData(parentId, tableData, childData = []) { | ||
| 517 | + if (!commonUtils.isNotEmptyArr(tableData)) return childData; | ||
| 518 | + | ||
| 519 | + const children = tableData.filter(item => item.sParentId === parentId); | ||
| 520 | + if (commonUtils.isNotEmptyArr(children)) { | ||
| 521 | + childData.push(...children); | ||
| 522 | + children.forEach(child => { | ||
| 523 | + getChildData(child.sId, tableData, childData); | ||
| 524 | + }); | ||
| 525 | + } | ||
| 526 | + return childData; | ||
| 527 | +} | ||
| 528 | + | ||
| 529 | + | ||
| 530 | + | ||
| 531 | +// 辅助函数:判断是否为跨表赋值 | ||
| 532 | +function isCrossTableAssignment(sAssignField) { | ||
| 533 | + const crossTableKeywords = ['slave.', 'control.', 'materials.', 'process.', 'master.']; | ||
| 534 | + return crossTableKeywords.some(keyword => sAssignField.includes(keyword)); | ||
| 535 | +} |