Commit e114652579336acdd667cc58b053b8c623b7b950

Authored by Min
1 parent 7957bae6

1.修复keyup业务逻辑处理,支持跨任意表取值,如dLossQty:var s =0; var a=0; a= control.dSumMachineQty…

… / 100 * dAdjustLossRate;只要标明slave. control.
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 }
... ...