queryform.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. import miment from 'miment'
  2. import { getData } from '@/api/bigscreen'
  3. export default {
  4. data() {
  5. return {
  6. // form select-input key
  7. selectInput: {
  8. keyname: '',
  9. keyword: ''
  10. },
  11. //日期时间快捷选项
  12. datetimeRangePickerOptions: {
  13. shortcuts: [{
  14. text: '今天',
  15. onClick(picker) {
  16. const end = new Date();
  17. const start = new Date(new Date(new Date().getTime()).setHours(0, 0, 0, 0));
  18. picker.$emit('pick', [start, end]);
  19. }
  20. }, {
  21. text: '昨天',
  22. onClick(picker) {
  23. const start = new Date(new Date(new Date().getTime() - 24 * 60 * 60 * 1000).setHours(0, 0, 0, 0));
  24. const end = new Date(new Date(new Date().getTime() - 24 * 60 * 60 * 1000).setHours(23, 59, 59, 999));
  25. picker.$emit('pick', [start, end]);
  26. }
  27. }, {
  28. text: '最近一周',
  29. onClick(picker) {
  30. const end = new Date();
  31. const start = new Date();
  32. start.setTime(miment().add(-1, 'ww').stamp());
  33. picker.$emit('pick', [start, end]);
  34. }
  35. }, {
  36. text: '最近一个月',
  37. onClick(picker) {
  38. const end = new Date();
  39. const start = new Date();
  40. start.setTime(miment().add(-1, 'MM').stamp());
  41. picker.$emit('pick', [start, end]);
  42. }
  43. }, {
  44. text: '最近三个月',
  45. onClick(picker) {
  46. const end = new Date();
  47. const start = new Date();
  48. start.setTime(miment().add(-3, 'MM').stamp());
  49. picker.$emit('pick', [start, end]);
  50. }
  51. }],
  52. // disabledDate(time){
  53. // return time.getTime() > Date.now()
  54. // }
  55. },
  56. }
  57. },
  58. computed: {},
  59. created() {
  60. },
  61. mounted() {
  62. },
  63. destroyed() {
  64. },
  65. methods: {
  66. // 搜索重置搜索页码
  67. search() {
  68. this.params.currentPage = 1;
  69. this.queryByPage();
  70. },
  71. // 把selectInput中的值赋到params查询对象中
  72. parseParamsBySelectInput(keyname, keyword) {
  73. if (this.params === undefined || this.params === null) {
  74. console.warn('query form must bind to params object in vue data')
  75. return
  76. }
  77. // if (!this.params.hasOwnProperty(keyname)) {
  78. // console.warn('params has no field:' + keyname)
  79. // return
  80. // }
  81. if (keyword !== undefined) {
  82. this.params[keyname] = keyword.trim()
  83. }
  84. },
  85. resetForm(data) {
  86. let formKeys = Object.keys(data)
  87. for (let k of formKeys) {
  88. data[k] = null
  89. }
  90. },
  91. handlerInputchange(val) {
  92. this.parseParamsBySelectInput(this.selectInput.keyname, val)
  93. },
  94. // 查询echarts 数据
  95. queryEchartsData(params) {
  96. return new Promise(async (resolve) => {
  97. const { code, data } = await getData(params);
  98. if (code != 200) return
  99. const analysisData = this.analysisChartsData(params, data);
  100. resolve(analysisData)
  101. })
  102. },
  103. // 解析不同图标的数据
  104. analysisChartsData(params, data) {
  105. // widget-barchart 柱线图、widget-linechart 折线图、 widget-barlinechart 柱线图
  106. // widget-piechart 饼图、widget-funnel 漏斗图
  107. // widget-text 文本框
  108. // widge-table 表格(数据不要转)
  109. // widget-stackchart 堆叠图
  110. // widget-heatmap 热力图
  111. // widget-mapline 中国地图-路线图
  112. // widget-radar 雷达图
  113. // widget-select 下拉框
  114. const chartType = params.chartType
  115. if (
  116. chartType == "widget-barchart" ||
  117. chartType == "widget-linechart" ||
  118. chartType == "widget-barlinechart"
  119. ) {
  120. return this.barOrLineChartFn(params.chartProperties, data);
  121. } else if (
  122. chartType == "widget-piechart" ||
  123. chartType == "widget-funnel"
  124. ) {
  125. return this.piechartFn(params.chartProperties, data);
  126. } else if (chartType == "widget-text") {
  127. return this.widgettext(params.chartProperties, data)
  128. } else if (chartType == "widget-stackchart") {
  129. return this.stackChartFn(params.chartProperties, data)
  130. } else if (chartType == "widget-coord") {
  131. return this.coordChartFn(params.chartProperties, data)
  132. } else if (chartType == "widget-linemap") {
  133. return this.linemapChartFn(params.chartProperties, data)
  134. } else if (chartType == "widget-radar") {
  135. return this.radarChartFn(params.chartProperties, data)
  136. } else if (chartType == "widget-select") {
  137. return this.selectChartFn(params.chartProperties, data)
  138. } else {
  139. return data
  140. }
  141. },
  142. // 柱状图、折线图、柱线图
  143. barOrLineChartFn(chartProperties, data) {
  144. const analysisData = {};
  145. const xAxisList = [];
  146. const series = [];
  147. for (const key in chartProperties) {
  148. const obj = {};
  149. const seriesData = [];
  150. const value = chartProperties[key];
  151. obj["type"] = value;
  152. obj["name"] = key;
  153. for (let i = 0; i < data.length; i++) {
  154. if (value.startsWith("xAxis")) {
  155. // 代表为x轴
  156. xAxisList[i] = data[i][key];
  157. } else {
  158. // 其他的均为series展示数据
  159. seriesData[i] = data[i][key];
  160. }
  161. }
  162. obj["data"] = seriesData;
  163. if (!obj["type"].startsWith("xAxis")) {
  164. series.push(obj);
  165. }
  166. }
  167. analysisData["xAxis"] = xAxisList;
  168. analysisData["series"] = series;
  169. return analysisData;
  170. },
  171. //堆叠图
  172. stackChartFn(chartProperties, data) {
  173. const analysisData = {};
  174. const series = [];
  175. //全部字段字典值
  176. const types = Object.values(chartProperties)
  177. //x轴字段、y轴字段名
  178. const xAxisField = Object.keys(chartProperties)[types.indexOf('xAxis')]
  179. const yAxisField = Object.keys(chartProperties)[types.indexOf('yAxis')]
  180. const dataField = Object.keys(chartProperties)[types.indexOf('bar')]
  181. //x轴数值去重,y轴去重
  182. const xAxisList = this.setUnique(data.map(item => item[xAxisField]))
  183. const yAxisList = this.setUnique(data.map(item => item[yAxisField]))
  184. const dataGroup = this.setGroupBy(data, yAxisField)
  185. for (const key in chartProperties) {
  186. if (chartProperties[key] !== 'yAxis' && !chartProperties[key].startsWith('xAxis')) {
  187. Object.keys(dataGroup).forEach(item => {
  188. const data = new Array(xAxisList.length).fill(0)
  189. dataGroup[item].forEach(res => {
  190. data[xAxisList.indexOf(res[xAxisField])] = res[key]
  191. })
  192. series.push({
  193. name: yAxisList[item],
  194. type: chartProperties[key],
  195. data: data,
  196. })
  197. })
  198. }
  199. }
  200. analysisData["xAxis"] = xAxisList;
  201. analysisData["series"] = series;
  202. return analysisData;
  203. },
  204. // 饼图、漏斗图
  205. piechartFn(chartProperties, data) {
  206. const analysisData = [];
  207. for (let i = 0; i < data.length; i++) {
  208. const obj = {};
  209. for (const key in chartProperties) {
  210. const value = chartProperties[key];
  211. if (value === "name") {
  212. obj["name"] = data[i][key];
  213. } else {
  214. obj["value"] = data[i][key];
  215. }
  216. }
  217. analysisData.push(obj);
  218. }
  219. return analysisData;
  220. },
  221. widgettext(chartProperties, data) {
  222. const analysisData = [];
  223. for (let i = 0; i < data.length; i++) {
  224. const obj = {};
  225. for (const key in chartProperties) {
  226. const value = chartProperties[key];
  227. if (value === "name") {
  228. } else {
  229. obj["value"] = data[i][key];
  230. }
  231. }
  232. analysisData.push(obj);
  233. }
  234. return analysisData;
  235. },
  236. // 坐标系数据解析
  237. coordChartFn(chartProperties, data) {
  238. const analysisData = {};
  239. let series = [];
  240. //全部字段字典值
  241. const types = Object.values(chartProperties)
  242. //x轴字段、y轴字段、数值字段名
  243. const xAxisField = Object.keys(chartProperties)[types.indexOf('xAxis')]
  244. const yAxisField = Object.keys(chartProperties)[types.indexOf('yAxis')]
  245. const dataField = Object.keys(chartProperties)[types.indexOf('series')]
  246. //x轴数值去重,y轴去重
  247. const xAxisList = this.setUnique(data.map(item => item[xAxisField]))
  248. const yAxisList = this.setUnique(data.map(item => item[yAxisField]))
  249. analysisData["xAxis"] = xAxisList;
  250. analysisData["yAxis"] = yAxisList;
  251. for (const i in data) {
  252. series[i] = [data[i][xAxisField], data[i][yAxisField], data[i][dataField]];
  253. }
  254. analysisData["series"] = series;
  255. return analysisData;
  256. },
  257. // 中国地图。路线图数据解析,适合source、target、value
  258. linemapChartFn(chartProperties, data) {
  259. const analysisData = [];
  260. for (let i = 0; i < data.length; i++) {
  261. const obj = {};
  262. for (const key in chartProperties) {
  263. const value = chartProperties[key];
  264. if (value === "source") {
  265. obj["source"] = data[i][key];
  266. } else if (value === "target") {
  267. obj["target"] = data[i][key];
  268. } else {
  269. obj["value"] = data[i][key];
  270. }
  271. }
  272. analysisData.push(obj);
  273. }
  274. return analysisData;
  275. },
  276. // 雷达图
  277. radarChartFn(chartProperties, data) {
  278. const analysisData = {};
  279. // 字段名
  280. const radarField = [];
  281. let nameField;
  282. for (const key in chartProperties) {
  283. if (chartProperties[key] == 'radar') {
  284. radarField.push(key)
  285. }
  286. if (chartProperties[key] == 'name') {
  287. nameField = key;
  288. }
  289. }
  290. // 拿到数值
  291. analysisData["name"] = nameField;
  292. analysisData["keys"] = radarField;
  293. analysisData["value"] = data;
  294. return analysisData;
  295. },
  296. // 下拉框
  297. selectChartFn(chartProperties, data){
  298. let valueField;
  299. let labelField;
  300. for (const key in chartProperties) {
  301. if (chartProperties[key] == "value") {
  302. valueField = key;
  303. }
  304. if (chartProperties[key] == "label") {
  305. labelField = key;
  306. }
  307. }
  308. if (valueField == null && labelField != null) {
  309. valueField = labelField;
  310. }
  311. if (labelField == null && valueField != null) {
  312. labelField = valueField
  313. }
  314. const analysisData = [];
  315. for (let i = 0; i < data.length; i++) {
  316. const obj = {};
  317. obj["value"] = data[i][valueField];
  318. obj["label"] = data[i][labelField];
  319. analysisData.push(obj);
  320. }
  321. return analysisData;
  322. },
  323. setUnique(arr) {
  324. let newArr = [];
  325. arr.forEach(item => {
  326. return newArr.includes(item) ? '' : newArr.push(item);
  327. });
  328. return newArr;
  329. },
  330. setGroupBy(array, name) {
  331. const groups = {}
  332. array.forEach(function (o) {
  333. const group = JSON.stringify(o[name])
  334. groups[group] = groups[group] || []
  335. groups[group].push(o)
  336. })
  337. return Object.keys(groups).map(function (group) {
  338. return groups[group]
  339. })
  340. },
  341. },
  342. watch: {
  343. 'selectInput.keyname'(newVal, oldVal) {
  344. this.resetForm(this.params)
  345. this.params.currentPage = 1
  346. this.params.pageSize = 10
  347. this.parseParamsBySelectInput(newVal, this.selectInput.keyword)
  348. },
  349. 'selectInput.keyword'(newVal, oldVal) {
  350. if (!this.selectInput.keyname) return
  351. this.parseParamsBySelectInput(this.selectInput.keyname, newVal)
  352. }
  353. // 'selectInput.keyword'(newVal, oldVal) {
  354. // this.parseParamsBySelectInput(this.selectInput.keyname, newVal)
  355. // }
  356. }
  357. }