biz.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. import request from "@/utils/request";
  2. import jp from 'jsonpath';
  3. import qs from "qs";
  4. import {isArray} from "@/utils/validate";
  5. import {objectMerge} from "@/utils/index";
  6. import {getYAxisListByUnit} from "@/utils/chart";
  7. import {formatStringByTemplate} from "@/utils/string";
  8. import {getBizDataById} from "@/api/standardization/bizDataShowConfig.js";
  9. /**
  10. * 查询业务接口信息数据及业务数据
  11. * @param id 业务编码
  12. * @returns {Promise<*>}
  13. */
  14. // export async function getBizDataByAid(id, params) {
  15. // if (!id) {
  16. // return null;
  17. // }
  18. //
  19. // let bizData = await getBizConfigById(id).then(r => r.data)
  20. //
  21. // if (params) {
  22. // if (!bizData.params) {
  23. // bizData.params = {}
  24. // }
  25. // objectMerge(bizData.params, params)
  26. // }
  27. //
  28. // let dataList = await getBizData(bizData)
  29. // if (dataList) {
  30. // bizData.dataList = dataList
  31. // }
  32. // return bizData
  33. // }
  34. /**
  35. * 查询业务数据
  36. * @param biz 业务详情
  37. */
  38. export async function getBizData(biz) {
  39. let data = null;
  40. if (biz.type === 'api') {
  41. // 1. 从接口查询数据
  42. data = await getApiData(biz)
  43. } else {
  44. // 2. 从文件查询数据
  45. data = await getFileData(biz)
  46. }
  47. if (!data) {
  48. // 数据请求失败
  49. return null;
  50. }
  51. // 转换格式
  52. let list = []
  53. const keys = Object.keys(biz.resParams || {});
  54. if (isArray(data)) {
  55. if (keys.length === 0) {
  56. return data;
  57. }
  58. for (let i = 0; i < data.length; i++) {
  59. let d = data[i]
  60. let dd = {}
  61. keys.forEach(key => {
  62. dd[biz.resParams[key]] = d[key]
  63. })
  64. list.push(dd);
  65. }
  66. } else {
  67. if (keys.length === 0) {
  68. return [data];
  69. }
  70. let dd = {}
  71. keys.forEach(key => {
  72. dd[biz.resParams[key]] = data[key]
  73. })
  74. list.push(dd);
  75. }
  76. return list;
  77. }
  78. async function getApiData(biz) {
  79. let isFormData = false
  80. if (biz.header && JSON.stringify(biz.header).indexOf('application/x-www-form-urlencoded') > 0) {
  81. isFormData = true
  82. }
  83. // 1. 查询数据
  84. let requestData = {
  85. url: biz.url,
  86. method: biz.method,
  87. headers: biz.header,
  88. timeout: 960 * 1000,
  89. }
  90. if (biz.method === 'GET') {
  91. requestData.params = biz.params
  92. } else {
  93. requestData.data = isFormData ? qs.stringify(biz.params) : biz.params
  94. }
  95. let r = await request(requestData)
  96. // 返回值格式转JSON
  97. // r = getJSONResponse(r)
  98. // 解析格式
  99. return parsingFormat(r, biz.resFormat, biz.params)
  100. }
  101. async function getFileData(biz) {
  102. let r = await request({
  103. url: '/att/biz/api/getBizDataByFileUrl',
  104. params: {fileUrl: biz.url}
  105. })
  106. // 返回值格式转JSON
  107. // r = getJSONResponse(r)
  108. // 解析格式
  109. return parsingFormat(r, biz.resFormat, biz.params)
  110. }
  111. function getJSONResponse(res) {
  112. let data = this.x2js.xml2js(r);
  113. }
  114. /**
  115. * 解析返回值格式
  116. * @param r 返回值
  117. * @param format 解析格式
  118. * @param params 传参
  119. * @returns {*}
  120. */
  121. function parsingFormat(r, format, params) {
  122. format = format || '$.data';
  123. const reg = /\{(.+?)\}/;
  124. const reg_g = /\{(.+?)\}/g;
  125. const result = format.match(reg_g);
  126. if (result && result.length > 0) {
  127. for (let i = 0; i < result.length; i++) {
  128. let item = result[i]
  129. let value = params[item.match(reg)[1]];
  130. format = format.replace(item, value);
  131. }
  132. }
  133. return jp.query(r, format)[0];
  134. }
  135. export async function getDataByDataId(id) {
  136. if (!id) {
  137. return null
  138. }
  139. const bizDataRes = await getBizDataById(id)
  140. if (!bizDataRes?.data || bizDataRes?.data?.length === 0) {
  141. return null
  142. }
  143. return bizDataRes.data;
  144. }
  145. export async function getChartOption(config) {
  146. const data = await getDataByDataId(config.id)
  147. if (!data || data.length === 0) {
  148. return {}
  149. }
  150. const renderingOptions = config.renderingOptionsData
  151. switch (renderingOptions.chartType) {
  152. case 'linebar':
  153. return getBarLineChartOption(renderingOptions, data)
  154. case 'pie':
  155. return getPieChartOption(renderingOptions, data)
  156. }
  157. }
  158. function getBarLineChartOption(config, data) {
  159. let option = {
  160. grid: config.grid,
  161. tooltip: {
  162. trigger: 'axis',
  163. },
  164. }
  165. let xparams = config.xparams;
  166. let yparams = config.yparams;
  167. const legendSelected = {};
  168. yparams.forEach(item => {
  169. legendSelected[item.name.value] = item.selected
  170. })
  171. const legend = {
  172. data: yparams.map(item => item.name.value),
  173. selected: legendSelected,
  174. };
  175. if (legend.data.length > 30) {
  176. legend.type = 'scroll';
  177. }
  178. option.legend = objectMerge(config.legend, legend);
  179. option.xAxis = {
  180. data: data.map((item) => {
  181. return item[xparams[0].key]
  182. }),
  183. axisLine: {
  184. show: true,
  185. },
  186. }
  187. option.xAxis = objectMerge(config.xAxis, option.xAxis)
  188. let yAxis = getYAxisListByUnit(Array.from(new Set(yparams.map(i => i.unit))));
  189. yAxis = yAxis.map(y => objectMerge(config.yAxis, y));
  190. option.yAxis = yAxis
  191. const series = [];
  192. yparams.forEach((y, index) => {
  193. const serie = {
  194. type: y.type,
  195. name: y.name.value,
  196. yAxisIndex: yAxis.map(i => i.name).indexOf(y.unit),
  197. data: data.map(item => item[y.name.key]),
  198. }
  199. // 柱状图样式配置
  200. if (y.type === 'bar') {
  201. serie.itemStyle = {}
  202. serie.showBackground = config.series.showBackground
  203. serie.itemStyle.borderRadius = config.series.itemStyle.borderRadius
  204. serie.itemStyle.barWidth = config.barWidth
  205. if (config.color && index < config.color.length) {
  206. serie.itemStyle.color = config.color[index]
  207. }
  208. } else if (y.type === 'line') {
  209. serie.itemStyle = {}
  210. serie.itemStyle.opacity = config.lineShow ? 1 : 0
  211. serie.smooth = config.smooth
  212. if (config.lineColors && index < config.lineColors.length) {
  213. serie.itemStyle.color = config.lineColors[index]
  214. }
  215. serie.symbolSize = config.symbolSize
  216. serie.areaStyle = {}
  217. serie.areaStyle.opacity = config.areaShow ? 1 : 0
  218. if (config.areaColors && index < config.areaColors.length) {
  219. serie.areaStyle.color = config.areaColors[index]
  220. }
  221. }
  222. series.push(serie);
  223. });
  224. series.forEach(s => {
  225. s = objectMerge(config.series, s)
  226. // if (s.type === 'bar') {
  227. // }
  228. })
  229. option.series = series
  230. return option;
  231. }
  232. function getPieChartOption(config, data) {
  233. let option = {
  234. grid: config.grid,
  235. tooltip: {
  236. trigger: 'item',
  237. formatter: '{a} <br/>{b} : {c} ({d}%)'
  238. },
  239. legend: config.legend,
  240. series: []
  241. }
  242. config.series.data = data.map((d, index) => {
  243. const seriesData = {
  244. name: d[config.nameField],
  245. value: d[config.valueField],
  246. }
  247. if (config.color && index < config.color.length) {
  248. seriesData.itemStyle = {color: config.color[index]}
  249. }
  250. return seriesData
  251. })
  252. config.series.type = 'pie';
  253. config.series.name = config.valueField;
  254. option.series.push(config.series);
  255. console.log('option', option)
  256. return option;
  257. }
  258. export async function getTableData(config) {
  259. const dataList = await getDataByDataId(config.id)
  260. if (!dataList || dataList.length === 0) {
  261. return []
  262. }
  263. return dataList;
  264. }
  265. export async function getFormListData(config) {
  266. const dataList = await getDataByDataId(config.id)
  267. if (!dataList || dataList.length === 0) {
  268. return []
  269. }
  270. let data = dataList[0]
  271. if (!isArray(dataList)) {
  272. data = dataList
  273. }
  274. const list = []
  275. config.renderingOptionsData.columns.forEach(column => {
  276. list.push({name: column.value, value: data[column.key]})
  277. })
  278. return list;
  279. }
  280. export async function getText(config) {
  281. let dataList = await getDataByDataId(config.dataId)
  282. if (!dataList || dataList.length === 0) {
  283. return ''
  284. }
  285. if (config.dataFormat === 'OBJECT') {
  286. dataList = dataList[0]
  287. }
  288. return formatStringByTemplate(dataList, config.template);
  289. }