page.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. const Core = require('@alicloud/pop-core');
  2. const { Op } = require('sequelize');
  3. const moment = require('moment');
  4. const _ = require('lodash');
  5. const Sample = require('../db/models/sample');
  6. const Clue = require('../db/models/clue');
  7. const Business = require('../db/models/business');
  8. const Area = require('../db/models/area');
  9. const redis = require('../utils/redis');
  10. const { fill, onSuccess, onError } = require('../utils');
  11. const sequelize = require('sequelize');
  12. const model = {
  13. async home() {
  14. const [sCount, sReserves, sVolume, clueCount, bCount, clueList7, busList] = await Promise.all([
  15. Sample.count({ where: {} }),
  16. Sample.aggregate('reserves', 'sum', { where: {} }),
  17. Sample.aggregate('volume', 'sum', { where: {} }),
  18. Clue.count({ where: { type: 2 } }),
  19. Business.count({ where: {} }),
  20. Clue.findAll({
  21. where: {
  22. type: 2,
  23. createdAt: {
  24. [Op.gte]: moment().subtract(7, 'day').startOf('day'),
  25. [Op.lte]: moment().endOf('day'),
  26. },
  27. },
  28. all: true,
  29. }),
  30. Business.findAll({
  31. attributes: [[sequelize.fn('count', sequelize.col('province_id')), 'psum']],
  32. group: ['province_id'],
  33. order: [[sequelize.literal('psum'), 'DESC']],
  34. }),
  35. ]);
  36. // 近7天咨询量
  37. const clue7 = [];
  38. for (let i = 0; i < 7; i++) {
  39. clue7.unshift({ title: moment().subtract(i, 'day').format('MM-DD'), count: 0 });
  40. }
  41. if (clueList7.length) {
  42. for (let i = 0; i < clueList7.length; i++) {
  43. const { createdAt } = clueList7[i];
  44. const a = moment().diff(createdAt, 'day');
  45. clue7[6 - a].count += 1;
  46. }
  47. }
  48. const bus = await fill(busList, fillBus);
  49. return onSuccess({ sCount, sReserves, sVolume, clueCount, bCount, clue7, bus });
  50. },
  51. async smsCode(obj) {
  52. const expire = 300;
  53. const { phone } = obj;
  54. const time = await redis.pttl(`smsCode:${phone}`);
  55. // const time = await getPttl(`smsCode:${phone}`);
  56. if (time && time > 240000) {
  57. return onError('一分钟内发送一次');
  58. }
  59. const code = 100000 + Math.round(Math.random() * 899999);
  60. try {
  61. const client = new Core({
  62. accessKeyId: 'LTAI5tBzbbZosUBciGory8jA',
  63. accessKeySecret: 'hH5vtcwnCR17Slv8KWXrtF9OmgL06s',
  64. // securityToken: '<your-sts-token>', // use STS Token
  65. endpoint: 'https://dysmsapi.aliyuncs.com',
  66. apiVersion: '2017-05-25',
  67. });
  68. const params = {
  69. PhoneNumbers: phone, // 接收短信的手机号码
  70. SignName: '伏羲碳惠交易平台', // 短信签名名称
  71. TemplateCode: 'SMS_461080515', // 短信模板CODE
  72. TemplateParam: `{ "code":${code} }`,
  73. };
  74. const requestOption = {
  75. method: 'POST',
  76. };
  77. const data = await client.request('SendSms', params, requestOption);
  78. console.log(data);
  79. if (data.Code === 'OK') {
  80. await redis.set(`smsCode:${phone}`, code);
  81. await redis.expire(`smsCode:${phone}`, expire);
  82. return onSuccess(data, '发送成功');
  83. }
  84. return onError('发送失败请重试', data);
  85. } catch (error) {
  86. console.log(error);
  87. return onError('发送失败请重试');
  88. }
  89. },
  90. };
  91. async function fillBus(data) {
  92. if (data) {
  93. const { cityId, provinceId } = data;
  94. const pItem = await Area.findOne({ where: { id: provinceId } });
  95. data.provinceName = pItem.name;
  96. }
  97. return { title: data.provinceName, count: data.psum };
  98. }
  99. module.exports = model;