39754284edd2f91db9a25f88bc5367059133b225.svn-base 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. import { getVmParentByName } from '@/utils/util'
  2. import { JVXETypes } from '@comp/jeecg/JVxeTable/index'
  3. export const VALIDATE_FAILED = Symbol()
  4. /**
  5. * 获取指定的 $refs 对象
  6. * 有时候可能会遇到组件未挂载到页面中的情况,导致无法获取 $refs 中的某个对象
  7. * 这个方法可以等待挂载完成之后再返回 $refs 的对象,避免报错
  8. * @author sunjianlei
  9. **/
  10. export function getRefPromise(vm, name) {
  11. return new Promise((resolve) => {
  12. (function next() {
  13. let ref = vm.$refs[name]
  14. if (ref) {
  15. resolve(ref)
  16. } else {
  17. setTimeout(() => {
  18. next()
  19. }, 10)
  20. }
  21. })()
  22. })
  23. }
  24. /** 获取某一数字输入框列中的最大的值 */
  25. export function getInputNumberMaxValue(col, rowsValues) {
  26. let maxNum = 0
  27. Object.values(rowsValues).forEach((rowValue, index) => {
  28. let val = rowValue[col.key], num
  29. try {
  30. num = Number.parseFloat(val)
  31. } catch {
  32. num = 0
  33. }
  34. // 把首次循环的结果当成最大值
  35. if (index === 0) {
  36. maxNum = num
  37. } else {
  38. maxNum = (num > maxNum) ? num : maxNum
  39. }
  40. })
  41. return maxNum
  42. }
  43. /**
  44. *
  45. * 根据 tagName 获取父级节点
  46. *
  47. * @param dom 一级dom节点
  48. * @param tagName 标签名,不区分大小写
  49. * @return {HTMLElement | NULL}
  50. */
  51. export function getParentNodeByTagName(dom, tagName = 'body') {
  52. if (tagName === 'body') {
  53. return document.body
  54. }
  55. if (dom.parentNode) {
  56. if (dom.parentNode.tagName.toLowerCase() === tagName.trim().toLowerCase()) {
  57. return dom.parentNode
  58. } else {
  59. return getParentNodeByTagName(dom.parentNode, tagName)
  60. }
  61. } else {
  62. return null
  63. }
  64. }
  65. /**
  66. * vxe columns 封装成高级查询可识别的选项
  67. * @param columns
  68. * @param handler 单独处理方法
  69. */
  70. export function vxePackageToSuperQuery(columns, handler) {
  71. if (Array.isArray(columns)) {
  72. // 高级查询所需要的参数
  73. let fieldList = []
  74. // 遍历列
  75. for (let i = 0; i < columns.length; i++) {
  76. let col = columns[i]
  77. if (col.type === JVXETypes.rowCheckbox ||
  78. col.type === JVXETypes.rowRadio ||
  79. col.type === JVXETypes.rowExpand ||
  80. col.type === JVXETypes.rowNumber
  81. ) {
  82. continue
  83. }
  84. let field = {
  85. type: 'string',
  86. value: col.key,
  87. text: col.title,
  88. dictCode: col.dictCode || col.dict,
  89. }
  90. if (col.type === JVXETypes.date || col.type === JVXETypes.datetime) {
  91. field.type = col.type
  92. field.format = col.format
  93. }
  94. if (col.type === JVXETypes.inputNumber) {
  95. field.type = 'int'
  96. }
  97. if (Array.isArray(col.options)) {
  98. field.options = col.options
  99. }
  100. if (typeof handler === 'function') {
  101. Object.assign(field, handler(col, idx))
  102. }
  103. fieldList.push(field)
  104. }
  105. return fieldList
  106. } else {
  107. console.error('columns必须是一个数组')
  108. }
  109. return null
  110. }
  111. /**
  112. * 一次性验证主表单和所有的次表单
  113. * @param form 主表单 form 对象
  114. * @param cases 接收一个数组,每项都是一个JVxeTable实例
  115. * @param autoJumpTab
  116. * @returns {Promise<any>}
  117. * @author sunjianlei
  118. */
  119. export async function validateFormAndTables(form, cases, autoJumpTab) {
  120. if (!(form && typeof form.validateFields === 'function')) {
  121. throw `form 参数需要的是一个form对象,而传入的却是${typeof form}`
  122. }
  123. let dataMap = {}
  124. let values = await new Promise((resolve, reject) => {
  125. // 验证主表表单
  126. form.validateFields((err, values) => {
  127. err ? reject({error: VALIDATE_FAILED, originError: err}) : resolve(values)
  128. })
  129. })
  130. Object.assign(dataMap, {formValue: values})
  131. // 验证所有子表的表单
  132. let subData = await validateTables(cases, autoJumpTab)
  133. // 合并最终数据
  134. dataMap = Object.assign(dataMap, {tablesValue: subData})
  135. return dataMap
  136. }
  137. /**
  138. * 一次性验证主表单和所有的次表单
  139. * @param form 主表单 form 对象
  140. * @param cases 接收一个数组,每项都是一个JVxeTable实例
  141. * @param autoJumpTab
  142. * @returns {Promise<any>}
  143. * @author sunjianlei
  144. */
  145. export async function validateFormModelAndTables(form,formData, cases, autoJumpTab) {
  146. if (!(form && typeof form.validate === 'function')) {
  147. throw `form 参数需要的是一个form对象,而传入的却是${typeof form}`
  148. }
  149. let dataMap = {}
  150. let values = await new Promise((resolve, reject) => {
  151. // 验证主表表单
  152. form.validate((valid,obj) => {
  153. valid ?resolve(formData): reject({error: VALIDATE_FAILED, originError: valid})
  154. })
  155. })
  156. Object.assign(dataMap, {formValue: values})
  157. // 验证所有子表的表单
  158. let subData = await validateTables(cases, autoJumpTab)
  159. // 合并最终数据
  160. dataMap = Object.assign(dataMap, {tablesValue: subData})
  161. return dataMap
  162. }
  163. /**
  164. * 验证并获取一个或多个表格的所有值
  165. *
  166. * @param cases 接收一个数组,每项都是一个JVxeTable实例
  167. * @param autoJumpTab 校验失败后,是否自动跳转tab选项
  168. */
  169. export function validateTables(cases, autoJumpTab = true) {
  170. if (!Array.isArray(cases)) {
  171. throw `'validateTables'函数的'cases'参数需要的是一个数组,而传入的却是${typeof cases}`
  172. }
  173. return new Promise((resolve, reject) => {
  174. let tablesData = []
  175. let index = 0
  176. if (!cases || cases.length === 0) {
  177. resolve()
  178. }
  179. (function next() {
  180. let vm = cases[index]
  181. vm.validateTable().then(errMap => {
  182. // 校验通过
  183. if (!errMap) {
  184. tablesData[index] = vm.getAll()
  185. // 判断校验是否全部完成,完成返回成功,否则继续进行下一步校验
  186. if (++index === cases.length) {
  187. resolve(tablesData)
  188. } else (
  189. next()
  190. )
  191. } else {
  192. // 尝试获取tabKey,如果在ATab组件内即可获取
  193. let paneKey
  194. let tabPane = getVmParentByName(vm, 'ATabPane')
  195. if (tabPane) {
  196. paneKey = tabPane.$vnode.key
  197. // 自动跳转到该表格
  198. if (autoJumpTab) {
  199. let tabs = getVmParentByName(tabPane, 'Tabs')
  200. tabs && tabs.setActiveKey && tabs.setActiveKey(paneKey)
  201. }
  202. }
  203. // 出现未验证通过的表单,不再进行下一步校验,直接返回失败
  204. reject({error: VALIDATE_FAILED, index, paneKey, errMap})
  205. }
  206. })
  207. })()
  208. })
  209. }