statistics.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. const _ = require('lodash')
  2. const app = require('../app')
  3. app.service('statistics', function(api) {
  4. const chart = ({
  5. rows,
  6. seriesField,
  7. dataField,
  8. labelsField,
  9. format
  10. }) => {
  11. const labels = _.chain(rows).map(x => x[labelsField]).uniq().value()
  12. const series = _.chain(rows).map(x => x[seriesField]).uniq().value()
  13. const seriesData = _.chain(rows)
  14. .groupBy(x => x[seriesField])
  15. .toPairs()
  16. .map(([key, rows]) => [
  17. key,
  18. _.chain(rows)
  19. .map(row => [row[labelsField], row[dataField]])
  20. .fromPairs()
  21. .value()
  22. ])
  23. .fromPairs()
  24. .value()
  25. const data = series.map(s => {
  26. const sdata = seriesData[s]
  27. return labels.map(l => sdata[l])
  28. })
  29. return {labels, series, data, options: {
  30. tooltips: {
  31. callbacks: {
  32. label: (tooltipItem, data) => {
  33. const label = data.datasets[tooltipItem.datasetIndex].label || ''
  34. const value = tooltipItem.yLabel
  35. return format ? format(label, value) : `${label}: ${value}`
  36. }
  37. }
  38. }
  39. }}
  40. }
  41. this.efficiency = async () => {
  42. const rows = await api.statistics()
  43. return {
  44. delivery: chart({
  45. rows,
  46. seriesField: 'key',
  47. dataField: 'delivered',
  48. labelsField: 'date',
  49. format: (label, value) => `${label}: ${value.toLocaleString()} cartons`
  50. }),
  51. efficiency: chart({
  52. rows,
  53. seriesField: 'key',
  54. dataField: 'efficiency',
  55. labelsField: 'date',
  56. format: (label, value) => `${label}: $${value.toFixed(2)} per carton`
  57. }),
  58. laborCost: chart({
  59. rows,
  60. seriesField: 'key',
  61. dataField: 'laborCost',
  62. labelsField: 'date',
  63. format: (label, value) => `${label}: $${value.toFixed(2)} labor cost`
  64. })
  65. }
  66. }
  67. })