Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

customapp.js 6.7 KiB

4 lat temu
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import get from 'lodash/get'
  2. import set from 'lodash/set'
  3. import customForm from '@/common/customform.js'
  4. /**
  5. * 用于自定义应用的表单加载
  6. * 注意:自定义应用既不是代码生成器页面,也不是工作流表单
  7. * 自首页 /function/list 接口拉取「我的应用」列表,列表中值的 F_Scheme 字段,即为自定义表单列表页的 scheme 定义
  8. *
  9. * 提供以下工具方法:
  10. *
  11. * 生成自定义表单相关数据结构
  12. * async getCustomAppForm(prop)
  13. *
  14. * 获取最终需要POST的数据
  15. * async getPostData(originFormValue, scheme)
  16. *
  17. */
  18. export default {
  19. mixins: [customForm],
  20. methods: {
  21. // 生成自定义表单相关数据结构
  22. // 参数: schemeData (必填), formData, useDefault
  23. // 返回: scheme, formValue
  24. async getCustomAppForm(prop) {
  25. const { schemeData, formData, keyValue, useDefault } = prop
  26. const schemeInfoId = schemeData.schemeInfoId
  27. const schemeRef = {}
  28. const refList = []
  29. const scheme = []
  30. const rel = {}
  31. const formValue = { schemeInfoId, formData: {} }
  32. if (keyValue) {
  33. formValue.keyValue = keyValue
  34. }
  35. for (let dataIndex = 0; dataIndex < schemeData.F_Scheme.data.length; ++dataIndex) {
  36. const { componts } = schemeData.F_Scheme.data[dataIndex]
  37. for (const t of componts) {
  38. // 之后的 t 即表示每个 scheme 项
  39. t.__valuePath__ = `formData.${t.id}`
  40. if (t.type === 'girdtable' && t.table) {
  41. // 数据项是表格的情况
  42. // 先设置源数据,不然无法获取默认值
  43. for (const fieldItem of t.fieldsData) {
  44. fieldItem.__sourceData__ = await this.getSourceData(fieldItem)
  45. }
  46. t.__defaultItem__ = await this.getDefaultData(t, prop)
  47. if (formData) {
  48. // 有表单值的情况,从表单值中获取数据
  49. const val = []
  50. for (const valueItem of get(formData, `${schemeInfoId}.${t.table}`, [])) {
  51. const tableItemValue = {}
  52. for (const fieldItem of t.fieldsData.filter(t => t.field)) {
  53. const formDataValue = get(valueItem, fieldItem.field.toLowerCase())
  54. tableItemValue[fieldItem.field] = await this.convertToFormValue(fieldItem, formDataValue)
  55. }
  56. val.push(tableItemValue)
  57. }
  58. // useDefault 表示在从 formData 取不到值的时候使用默认值
  59. if ((!val || val.length <= 0) && useDefault) {
  60. set(formValue, t.__valuePath__, [this.COPY(t.__defaultItem__)])
  61. } else {
  62. set(formValue, t.__valuePath__, val)
  63. }
  64. } else {
  65. // 无表单值的情况,默认值
  66. set(formValue, t.__valuePath__, [this.COPY(t.__defaultItem__)])
  67. }
  68. } else if (t.field) {
  69. // 数据项不是表格的情况
  70. // 先设置源数据,不然无法获取默认值
  71. t.__sourceData__ = await this.getSourceData(t)
  72. if (formData) {
  73. // 有表单值的情况,从表单值中获取数据
  74. const path = `${schemeInfoId}.${t.table}.${dataIndex}.${t.field.toLowerCase()}`
  75. const formDataValue = get(formData, path)
  76. // useDefault 表示在从 formData 取不到值的时候使用默认值
  77. if (!formDataValue && useDefault) {
  78. set(formValue, t.__valuePath__, await this.getDefaultData(t, prop))
  79. } else {
  80. set(formValue, t.__valuePath__, await this.convertToFormValue(t, formDataValue))
  81. }
  82. } else {
  83. // 无表单值的情况,默认值
  84. set(formValue, t.__valuePath__, await this.getDefaultData(t, prop))
  85. }
  86. }
  87. // organize、datetime 可能作为其他 organize 或 datetimerange 的依赖项,引用它们
  88. if (['organize', 'datetime'].includes(t.type)) {
  89. schemeRef[t.id] = t
  90. }
  91. // datetimerange、带有 relation 级联字段的 organize,依赖其他项
  92. if ((t.type === 'datetimerange' && t.startTime && t.endTime) || (t.type === 'organize' && t.relation)) {
  93. refList.push(t)
  94. }
  95. // 依次处理表单关联
  96. refList.forEach(t => {
  97. if (t.type === 'organize') {
  98. // 处理组件结构级联
  99. // 给当前组件赋上级级联的值路径 __relationPath__
  100. const parent = schemeRef[t.relation]
  101. t.__relationPath__ = parent.__valuePath__
  102. // 给上级级联的组件注册自动重置当前组件的 change 事件
  103. const relItem = { type: 'organize', id: t.id, path: t.__valuePath__ }
  104. rel[parent.id] = rel[parent.id] ? rel[parent.id].concat(relItem) : [relItem]
  105. } else if (t.type === 'datetimerange') {
  106. // 处理日期区间
  107. const start = schemeRef[t.startTime]
  108. const end = schemeRef[t.endTime]
  109. const relItem = {
  110. type: 'datetimerange',
  111. path: t.__valuePath__,
  112. id: t.id,
  113. startPath: start.__valuePath__,
  114. endPath: end.__valuePath__,
  115. }
  116. rel[start.id] = rel[start.id] ? rel[start.id].concat(relItem) : [relItem]
  117. rel[end.id] = rel[end.id] ? rel[end.id].concat(relItem) : [relItem]
  118. }
  119. })
  120. scheme.push(t)
  121. }
  122. }
  123. return { formValue, scheme, rel }
  124. },
  125. // 获取最终需要POST的数据
  126. // 参数: formValue , scheme
  127. async getPostData(originFormValue, scheme) {
  128. const formValue = this.COPY(originFormValue)
  129. // 依次按照 scheme 项目遍历
  130. for (const item of scheme) {
  131. if (item.field) {
  132. // 不是表格的情况
  133. const path = item.__valuePath__
  134. const val = get(formValue, path)
  135. const result = await this.convertToPostData(item, val, originFormValue, scheme)
  136. set(formValue, path, result)
  137. } else if (item.table && item.fieldsData) {
  138. // 是表格的情况
  139. const tableValue = get(formValue, item.__valuePath__, [])
  140. for (let valueIndex = 0; valueIndex < tableValue.length; ++valueIndex) {
  141. for (const schemeItem of item.fieldsData) {
  142. const path = `${item.__valuePath__}.${valueIndex}.${schemeItem.field}`
  143. const val = get(formValue, path)
  144. const result = await this.convertToPostData(schemeItem, val, originFormValue, scheme)
  145. set(formValue, path, result)
  146. }
  147. }
  148. }
  149. }
  150. formValue.formData = JSON.stringify(formValue.formData)
  151. return [formValue]
  152. }
  153. }
  154. }