CustomQuery.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. import { parseExp } from '@/utils/parse.js'
  2. import { getValueByPath } from '@/utils/value.js'
  3. import { Message } from 'element-ui'
  4. import request from '@/utils/request.js'
  5. const CustomQuery = {
  6. /**
  7. * 通过别名获取关联查询定义
  8. */
  9. get: (alias) => {
  10. return new Promise((resolve, reject) => {
  11. if (!alias) {
  12. reject('alias can not be null.')
  13. }
  14. request({
  15. url: `${window.context.form}/form/customQuery/v1/getByAlias`,
  16. method: 'post',
  17. data: alias,
  18. })
  19. .then((response) => resolve(response))
  20. .catch((error) => reject(error))
  21. })
  22. },
  23. /**
  24. * 传入关联查询别名和查询参数,返回查询到的数据
  25. */
  26. load: (alias, params) => {
  27. return new Promise((resolve, reject) => {
  28. CustomQuery.get(alias).then(
  29. (query) => {
  30. if (!query) {
  31. reject(`未获取到别名为:${alias}的关联查询`)
  32. } else {
  33. // 执行关联查询
  34. CustomQuery._doQuery(query, params, '1', (data) => {
  35. resolve(data)
  36. })
  37. }
  38. },
  39. () => {
  40. reject()
  41. }
  42. )
  43. })
  44. },
  45. _throwException: (msg) => {
  46. Message.error(msg)
  47. throw msg
  48. },
  49. // 处理POST请求时的参数
  50. _handlePostData: (query, queryParams) => {
  51. if (!query.dataParam || query.dataParam.constructor != String) {
  52. return queryParams
  53. }
  54. // 构建上下文数据对象
  55. let ctx = {}
  56. queryParams &&
  57. queryParams.forEach((element) => {
  58. ctx[element.key] = element.value
  59. })
  60. const exp = parseExp(query.dataParam, ctx)
  61. try {
  62. return JSON.parse(exp)
  63. } catch (e) {
  64. CustomQuery._throwException(
  65. `POST参数不是有效的JSON格式${query.dataParam}`
  66. )
  67. }
  68. },
  69. // 处理GET请求的URL(GET请求的查询参数追加到URL后面)
  70. _handleGetUrl: (url, queryParams) => {
  71. if (!url) {
  72. CustomQuery._throwException('Restful类型的url地址为空')
  73. }
  74. let urlParamsAry = []
  75. queryParams &&
  76. queryParams.forEach((q) => {
  77. urlParamsAry.push(`${q.key}=${q.value}`)
  78. })
  79. const linkWord = url.indexOf('?') == -1 ? '?' : '&'
  80. return `${url}${linkWord}${urlParamsAry.join('&')}`
  81. },
  82. _doQuery: (query, params, type, cb) => {
  83. params = params || {}
  84. // 复制一份关联查询对象
  85. query = { ...query }
  86. // 关联数据始终查询第一页
  87. const page = 1
  88. // 关联数据查询参数
  89. let queryParams = []
  90. if (query.conditionfield) {
  91. try {
  92. const conditionFields = JSON.parse(query.conditionfield)
  93. // 构建查询参数
  94. if (
  95. conditionFields &&
  96. conditionFields.constructor == Array &&
  97. conditionFields.length > 0
  98. ) {
  99. conditionFields.forEach((c) => {
  100. // 默认按照固定值构建查询参数
  101. let obj = {
  102. key: c.field,
  103. value: c.defaultValue,
  104. }
  105. // 参数传入时获取传入的params中的同名参数值
  106. if (c.defaultType == '1') {
  107. if (params.hasOwnProperty(c.field)) {
  108. obj.value = params[c.field]
  109. }
  110. }
  111. queryParams.push(obj)
  112. })
  113. }
  114. } catch (e) {
  115. CustomQuery._throwException(`条件字段的JSON格式错误:${e}`)
  116. }
  117. }
  118. if (query.dsType != 'dataSource') {
  119. // POST请求,则处理queryParams参数
  120. if (query.requestType == 'POST') {
  121. queryParams = CustomQuery._handlePostData(query, queryParams)
  122. }
  123. // GET请求,则处理url地址
  124. else if (query.requestType == 'GET') {
  125. query.url = CustomQuery._handleGetUrl(query.url, queryParams)
  126. }
  127. }
  128. // 构建查询地址
  129. const queryUrl =
  130. query.dsType == 'dataSource'
  131. ? `${window.context.form}/form/customQuery/v1/doQuery?alias=` +
  132. query.alias +
  133. '&page=' +
  134. page
  135. : query.url
  136. let requestMethod = 'POST'
  137. //如果关联数据列表查询数据不是数据源则请求方法为restful配置的请求方式
  138. if (query.dsType != 'dataSource') {
  139. requestMethod = query.requestType
  140. }
  141. //查询数据
  142. request(
  143. {
  144. url: queryUrl,
  145. method: requestMethod,
  146. data: queryParams,
  147. headers: query.header,
  148. },
  149. query.dsType
  150. ).then(
  151. (response) => {
  152. //自定义对话框因为要显示分页信息,并且显示字段的key是小写,故此处直接返回,由自定义对话框组件本身处理数据
  153. if (type == '1') {
  154. //如果数据来源是数据源
  155. if (query.dsType == 'dataSource') {
  156. cb(response.rows)
  157. } else {
  158. // 如果数据来源是REST接口
  159. const data = CustomQuery._handleResponse(response, query.listKey)
  160. cb(data)
  161. }
  162. }
  163. },
  164. (reason) => {
  165. cb([])
  166. CustomQuery._throwException(reason)
  167. }
  168. )
  169. },
  170. _handleResponse: (data, rowsKey) => {
  171. if (!data) {
  172. Message.error('返回的数据为空')
  173. return []
  174. }
  175. if (data.constructor == String) {
  176. try {
  177. data = JSON.parse(data)
  178. } catch (e) {
  179. CustomQuery._throwException(`将返回值解析为JSON对象时出错了:${e}`)
  180. }
  181. }
  182. if (data.constructor == Object) {
  183. // 如果没有指定提取key,则将返回值包装为列表
  184. if (!rowsKey) {
  185. return [data]
  186. }
  187. try {
  188. return getValueByPath(data, rowsKey)
  189. } catch (e) {
  190. CustomQuery._throwException(`从返回的数据中提取数组时出错了:${e}`)
  191. }
  192. } else if (data.constructor == Array) {
  193. // 已经是数组类型时,不再通过rowsKey提取
  194. return data
  195. } else {
  196. CustomQuery._throwException(`返回的数据无法解析:${data}`)
  197. }
  198. },
  199. }
  200. export default CustomQuery