干燥机配套车间生产管理系统/云平台服务端
baoshiwei
2023-03-10 1fb197352b6a263646e4ccd3ed1c7854ede031dd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import { getValueType } from '/@/utils';
 
export const VALIDATE_FAILED = Symbol();
/**
 * 一次性验证主表单和所有的次表单(新版本)
 * @param form 主表单 form 对象
 * @param cases 接收一个数组,每项都是一个JEditableTable实例
 * @returns {Promise<any>}
 */
export async function validateFormModelAndTables(validate, formData, cases, props, autoJumpTab?) {
  if (!(validate && typeof validate === 'function')) {
    throw `validate 参数需要的是一个方法,而传入的却是${typeof validate}`;
  }
  let dataMap = {};
  let values = await new Promise((resolve, reject) => {
    // 验证主表表单
    validate()
      .then(() => {
        //update-begin---author:wangshuai ---date:20220507  for:[VUEN-912]一对多用户组件(所有风格,单表和树没问题)保存报错------------
        for (let data in formData) {
          //如果该数据是数组
          if (formData[data] instanceof Array) {
            let valueType = getValueType(props, data);
            //如果是字符串类型的需要变成以逗号分割的字符串
            if (valueType === 'string') {
              formData[data] = formData[data].join(',');
            }
          }
        }
        //update-end---author:wangshuai ---date:20220507  for:[VUEN-912]一对多用户组件(所有风格,单表和树没问题)保存报错--------------
        resolve(formData);
      })
      .catch(() => {
        reject({ error: VALIDATE_FAILED });
      });
  });
  Object.assign(dataMap, { formValue: values });
  // 验证所有子表的表单
  let subData = await validateTables(cases, autoJumpTab);
  // 合并最终数据
  dataMap = Object.assign(dataMap, { tablesValue: subData });
  return dataMap;
}
/**
 * 验证并获取一个或多个表格的所有值
 * @param cases 接收一个数组,每项都是一个JEditableTable实例
 * @param autoJumpTab 是否自动跳转到报错的tab
 */
export function validateTables(cases, autoJumpTab = true) {
  if (!(cases instanceof Array)) {
    throw `'validateTables'函数的'cases'参数需要的是一个数组,而传入的却是${typeof cases}`;
  }
  return new Promise((resolve, reject) => {
    let tablesData: any = [];
    let index = 0;
    if (!cases || cases.length === 0) {
      resolve(tablesData);
    }
    (function next() {
      let vm = cases[index];
      vm.value.validateTable().then((errMap) => {
        // 校验通过
        if (!errMap) {
          tablesData[index] = { tableData: vm.value.getTableData() };
          // 判断校验是否全部完成,完成返回成功,否则继续进行下一步校验
          if (++index === cases.length) {
            resolve(tablesData);
          } else next();
        } else {
          // 尝试获取tabKey,如果在ATab组件内即可获取
          let paneKey;
          let tabPane = getVmParentByName(vm.value, 'ATabPane');
          if (tabPane) {
            paneKey = tabPane.$.vnode.key;
            // 自动跳转到该表格
            if (autoJumpTab) {
              let tabs = getVmParentByName(tabPane, 'Tabs');
              tabs && tabs.setActiveKey && tabs.setActiveKey(paneKey);
            }
          }
          // 出现未验证通过的表单,不再进行下一步校验,直接返回失败
          reject({ error: VALIDATE_FAILED, index, paneKey, errMap });
        }
      });
    })();
  });
}
 
export function getVmParentByName(vm, name) {
  let parent = vm.$parent;
  if (parent && parent.$options) {
    if (parent.$options.name === name) {
      return parent;
    } else {
      let res = getVmParentByName(parent, name);
      if (res) {
        return res;
      }
    }
  }
  return null;
}