Commit e114652579336acdd667cc58b053b8c623b7b950
1 parent
7957bae6
1.修复keyup业务逻辑处理,支持跨任意表取值,如dLossQty:var s =0; var a=0; a= control.dSumMachineQty…
… / 100 * dAdjustLossRate;只要标明slave. control.
Showing
2 changed files
with
97 additions
and
5 deletions
src/components/Common/commonBusiness.js
| ... | ... | @@ -994,6 +994,47 @@ export function getCalculateMoneyByLossMoney(app, type, masterData, tableDataRow |
| 994 | 994 | return tableDataRow; |
| 995 | 995 | } |
| 996 | 996 | |
| 997 | +export function extractTableNames(expression) { | |
| 998 | + // 1. 定义需要识别的表名列表(与tableSelectedData的key一一对应) | |
| 999 | + const targetTables = ['master', 'slave', 'control', 'materialsRow', 'processRow', 'slaveChildRow']; | |
| 1000 | + | |
| 1001 | + // 入参校验:非字符串直接返回空数组 | |
| 1002 | + if (typeof expression !== 'string' || expression.trim() === '') { | |
| 1003 | + return []; | |
| 1004 | + } | |
| 1005 | + | |
| 1006 | + // 2. 构建正则:匹配「表名.任意属性」的格式(仅捕获表名) | |
| 1007 | + const tableNamePattern = targetTables.join('|'); | |
| 1008 | + // \b 确保表名是独立单词(避免匹配control123这种) | |
| 1009 | + // 正则匹配:master/slave/control等 + 点号 + 任意属性名 | |
| 1010 | + const regex = new RegExp(`\\b(${tableNamePattern})\\.\\w+`, 'g'); | |
| 1011 | + | |
| 1012 | + // 3. 匹配所有符合规则的片段,提取表名 | |
| 1013 | + const matches = expression.match(regex) || []; | |
| 1014 | + const tableNames = matches.map(match => { | |
| 1015 | + // 拆分 "control.dSumMachineQty" → 取前面的表名部分 | |
| 1016 | + return match.split('.')[0]; | |
| 1017 | + }); | |
| 1018 | + | |
| 1019 | + // 4. 去重并返回纯表名数组 | |
| 1020 | + return [...new Set(tableNames)]; | |
| 1021 | +} | |
| 1022 | + | |
| 1023 | +/** | |
| 1024 | + * 移除tableSelectedData中key的Row后缀,返回新对象 | |
| 1025 | + */ | |
| 1026 | +function formatTableData(originObj) { | |
| 1027 | + const newObj = {}; | |
| 1028 | + // 遍历原始对象的键值对 | |
| 1029 | + Object.entries(originObj).forEach(([key, value]) => { | |
| 1030 | + // 去掉末尾的Row后缀 | |
| 1031 | + const newKey = key.replace(/Row$/, ''); | |
| 1032 | + // 赋值到新对象(键名更新,数据不变) | |
| 1033 | + newObj[newKey] = value; | |
| 1034 | + }); | |
| 1035 | + return newObj; | |
| 1036 | +} | |
| 1037 | + | |
| 997 | 1038 | /* 自定义onChange事件 */ |
| 998 | 1039 | export function getKeyUpEvent(name, sFieldName, tableConfig, masterData, tableDataRow, isWait, dataCollection, dataSelected, app) { |
| 999 | 1040 | let tableDataRowNew = {}; |
| ... | ... | @@ -1448,7 +1489,17 @@ export function getKeyUpEvent(name, sFieldName, tableConfig, masterData, tableDa |
| 1448 | 1489 | } |
| 1449 | 1490 | } |
| 1450 | 1491 | } else if (commonUtils.isNotEmptyObject(sAssignField)) { /* 单表keyUp事件 */ |
| 1451 | - tableDataRowNew = { ...tableDataRowNew, ...commonFunc.getAssignFieldValue(sAssignField, tableDataRowNew, newCopyTo) }; // 取赋值字段 | |
| 1492 | + const bCrossTable =(sAssignField?.includes('slave.') || sAssignField?.includes('slave.') | |
| 1493 | + || sAssignField.includes('control.') | |
| 1494 | + || sAssignField?.includes('materials.') | |
| 1495 | + || sAssignField?.includes('process.') | |
| 1496 | + || sAssignField?.includes('master.')); | |
| 1497 | + | |
| 1498 | + const tableNames = this.extractTableNames(sAssignField); | |
| 1499 | + // 生成新的tableSelectedData | |
| 1500 | + const newTableSelectedMap = formatTableData(dataSelected); | |
| 1501 | + const datasetMap = bCrossTable ? newTableSelectedMap : newCopyTo; | |
| 1502 | + tableDataRowNew = { ...tableDataRowNew, ...commonFunc.getAssignFieldValue(sAssignField, tableDataRowNew, datasetMap, false, bCrossTable, tableNames) }; // 取赋值字段 | |
| 1452 | 1503 | let { handleType } = masterData ? masterData : { handleType: '' }; |
| 1453 | 1504 | if (name !== 'master') { |
| 1454 | 1505 | // eslint-disable-next-line prefer-destructuring | ... | ... |
src/components/Common/commonFunc.js
| ... | ... | @@ -270,7 +270,7 @@ export function getDefaultData(config, allTableData = {}, extraData = {}) { |
| 270 | 270 | } |
| 271 | 271 | |
| 272 | 272 | /** 获取数据默认值 */ |
| 273 | -export function getAssignFieldValue(sAssignField, srcData, allTableData = {}, bMultiTable, bCommon) { | |
| 273 | +export function getAssignFieldValue(sAssignField, srcData, allTableData = {}, bMultiTable, bCommon, tableNames) { | |
| 274 | 274 | const returnData = {}; |
| 275 | 275 | if (!commonUtils.isEmpty(sAssignField)) { |
| 276 | 276 | /* 赋值数组 */ |
| ... | ... | @@ -281,12 +281,40 @@ export function getAssignFieldValue(sAssignField, srcData, allTableData = {}, bM |
| 281 | 281 | console.log('sAssignFiel:d', sAssignField); |
| 282 | 282 | if (sAssignField.includes('slave.') || sAssignField.includes('slave.') || sAssignField.includes('control.') |
| 283 | 283 | || sAssignField.includes('materials.') || sAssignField.includes('process.') || sAssignField.includes('master.')) { /* var表格对象 */ |
| 284 | - for (const row of Object.keys(allTableData)) { | |
| 284 | + // 第一步:统一转为key数组(核心优化) | |
| 285 | + const allKeys = Object.keys(allTableData); // 先拿到原对象所有key | |
| 286 | + const matchedKeys = commonUtils.isNotEmptyArr(tableNames) | |
| 287 | + ? allKeys.filter(key => tableNames.includes(key)) // 筛选匹配的key | |
| 288 | + : allKeys; // 未筛选时直接用所有key | |
| 289 | + | |
| 290 | + for (const row of matchedKeys) { | |
| 285 | 291 | const srcData = allTableData[row]; |
| 286 | 292 | const srcNewData = lodash.cloneDeep(srcData); |
| 287 | 293 | if (srcNewData.sCombinedMemo) { |
| 288 | 294 | srcNewData.sCombinedMemo = ''; |
| 289 | 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 | + | |
| 290 | 318 | if (srcNewData.sPositiveColor) { |
| 291 | 319 | srcNewData.sPositiveColor = ''; |
| 292 | 320 | } |
| ... | ... | @@ -307,8 +335,21 @@ export function getAssignFieldValue(sAssignField, srcData, allTableData = {}, bM |
| 307 | 335 | varValue = varValue === 'NaN' || varValue === undefined ? '' : varValue; |
| 308 | 336 | field = `var ${key}='${varValue}';`; |
| 309 | 337 | } else { |
| 310 | - varValue = varValue === 'NaN' || isNaN(varValue) || varValue === undefined || commonUtils.isEmptyObject(varValue) ? 0 : varValue; | |
| 311 | - field = `var ${key}=${varValue};`; | |
| 338 | + let finalValue = varValue; | |
| 339 | + // 1. 先判断类型:非数字类型且无法转为数字 → 设为0 | |
| 340 | + if (typeof finalValue !== 'number' && isNaN(Number(finalValue))) { | |
| 341 | + finalValue = 0; | |
| 342 | + } | |
| 343 | + // 2. 处理特殊异常值(NaN/undefined/"NaN") | |
| 344 | + else if (finalValue === 'NaN' || finalValue === undefined || Number.isNaN(finalValue)) { | |
| 345 | + finalValue = 0; | |
| 346 | + } | |
| 347 | + // 3. 空对象特殊处理(仅当值是对象且为空时设为0) | |
| 348 | + else if (typeof finalValue === 'object' && finalValue !== null && commonUtils.isEmptyObject(finalValue)) { | |
| 349 | + finalValue = 0; | |
| 350 | + } | |
| 351 | + // 4. 合法数字(包括0/222等)保留原值 | |
| 352 | + field = `var ${key}=${finalValue};`; | |
| 312 | 353 | } |
| 313 | 354 | strVar += field; |
| 314 | 355 | } | ... | ... |