home.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. const { models } = require('../db')
  2. // 获取今日起止时间
  3. function getTodayRange() {
  4. const now = new Date();
  5. // 当天起始时间(00:00:00.000)
  6. const startOfDay = new Date(now);
  7. startOfDay.setHours(0, 0, 0, 0);
  8. // 当天结束时间(23:59:59.999)
  9. const endOfDay = new Date(now);
  10. endOfDay.setHours(23, 59, 59, 999);
  11. return { startOfDay, endOfDay };
  12. }
  13. // 获取本年起止时间
  14. function getYearRange() {
  15. const now = new Date();
  16. const currentYear = now.getFullYear();
  17. // 本年起始时间(1月1日 00:00:00.000)
  18. const startOfYear = new Date(currentYear, 0, 1);
  19. // 本年结束时间(12月31日 23:59:59.999)
  20. const endOfYear = new Date(currentYear + 1, 0, 0); // 下一年1月0日即本年最后一天
  21. return { startOfYear, endOfYear };
  22. }
  23. /**
  24. * 今日今年下单付款统计
  25. */
  26. async function findCountAndTotal() {
  27. const todayRange = getTodayRange()
  28. const sql = "select IF(count(*) <=> null, 0, count(*)) as ri_xiadan, IF(sum(real_money) <=> null, 0, sum(real_money)) as ri_jine from orders where createdAt >= {{start}} AND createdAt <= {{end}} and (status = 1 or status = 2)"
  29. try {
  30. const today = await models.$runSQL(sql, {
  31. start: todayRange.startOfDay.getTime(),
  32. end: todayRange.endOfDay.getTime(),
  33. })
  34. const todayData = today.data.executeResultList[0]
  35. const yearRange = getYearRange()
  36. const params = {
  37. start: yearRange.startOfYear.getTime(),
  38. end: yearRange.endOfYear.getTime(),
  39. }
  40. const year = await models.$runSQL(sql, params)
  41. const yearData = year.data.executeResultList[0]
  42. const result = {
  43. ri_jine: todayData.ri_jine,
  44. ri_xiadan: todayData.ri_xiadan,
  45. nian_jine: yearData.ri_jine,
  46. nian_xiadan: yearData.ri_xiadan
  47. }
  48. return {
  49. success: true,
  50. msg: '查询成功',
  51. data: result,
  52. }
  53. } catch (error) {
  54. console.error('error =>', error)
  55. return {
  56. success: false,
  57. msg: '查询失败',
  58. error: error,
  59. }
  60. }
  61. }
  62. /**
  63. * 异常行为预警
  64. */
  65. async function findBehaviorAlarm() {
  66. try {
  67. const sql = "select aba._id as _id, " +
  68. " aba.file_name as file_name, " +
  69. " s.name as school_name, " +
  70. " aba.reason as reason, " +
  71. " aba.createdAt, " +
  72. " tu.name as teacher_name " +
  73. "from abnormal_behavior_alarm aba " +
  74. " left join wx_teacher_user tu on aba.user_id = tu._id " +
  75. " left join wx_school s on tu.school_id = s._id " +
  76. "where aba.type = 0 " +
  77. "order by aba.createdAt desc " +
  78. "limit 4 "
  79. const result = await models.$runSQL(sql, {})
  80. return {
  81. success: true,
  82. msg: '查询成功',
  83. data: result.data.executeResultList,
  84. }
  85. } catch (error) {
  86. console.error('error =>', error)
  87. return {
  88. success: false,
  89. msg: '查询失败',
  90. error: error,
  91. }
  92. }
  93. }
  94. /**
  95. * 按月份统计下单量
  96. * @param {*} parameter 年份 e.g: 2025
  97. */
  98. async function findOrderCountByMonth(parameter) {
  99. const { year } = parameter
  100. try {
  101. // const sql = "WITH RECURSIVE months AS ( " +
  102. // " SELECT 1 AS month_num " +
  103. // " UNION ALL " +
  104. // " SELECT month_num + 1 " +
  105. // " FROM months " +
  106. // " WHERE month_num < 12 " +
  107. // "), " +
  108. // "target_year AS ( " +
  109. // " SELECT COALESCE(YEAR(FROM_UNIXTIME(MIN(createdAt)/1000)), YEAR(CURDATE())) AS year " +
  110. // " FROM orders " +
  111. // ") " +
  112. // "SELECT " +
  113. // " ty.year, " +
  114. // " CONCAT(ty.year, '-', LPAD(m.month_num, 2, '0')) AS month, " +
  115. // " COUNT(o._id) AS order_count " +
  116. // "FROM target_year ty " +
  117. // "CROSS JOIN months m " +
  118. // "LEFT JOIN orders o " +
  119. // " ON DATE_FORMAT(FROM_UNIXTIME(o.createdAt/1000), '%Y-%m') = CONCAT(ty.year, '-', LPAD(m.month_num, 2, '0')) " +
  120. // "where ty.year = {{searchYear}}" +
  121. // " GROUP BY ty.year, m.month_num " +
  122. // "ORDER BY ty.year, m.month_num "
  123. const sql = "select * " +
  124. "from (select COUNT(*) as count, " +
  125. " DATE_FORMAT(FROM_UNIXTIME(orders.createdAt / 1000), '%Y-%m') as month, " +
  126. " DATE_FORMAT(FROM_UNIXTIME(orders.createdAt / 1000), '%Y') as year " +
  127. " from orders " +
  128. " group by month, year " +
  129. " order by year, month) t " +
  130. "where year = {{searchYear}}"
  131. const result = await models.$runSQL(sql, { searchYear: year })
  132. console.log(result.data);
  133. return {
  134. success: true,
  135. msg: '查询成功',
  136. data: result.data.executeResultList,
  137. }
  138. } catch (error) {
  139. console.error('error =>', error)
  140. return {
  141. success: false,
  142. msg: '查询失败',
  143. error: error,
  144. }
  145. }
  146. }
  147. /**
  148. * 按天统计下单量
  149. * @param {*} parameter 年份 e.g: 2025
  150. * @returns
  151. */
  152. async function findOrderCountByDay(parameter) {
  153. const { year } = parameter
  154. try {
  155. const sql = "select * " +
  156. "from (select COUNT(*) as count, " +
  157. " DATE_FORMAT(FROM_UNIXTIME(orders.createdAt / 1000), '%Y-%m-%d') as day, " +
  158. " DATE_FORMAT(FROM_UNIXTIME(orders.createdAt / 1000), '%Y') as year " +
  159. " from orders " +
  160. " group by day, year " +
  161. " order by year, day) t " +
  162. "where year = {{searchYear}}"
  163. const params = {
  164. searchYear: year
  165. }
  166. const result = await models.$runSQL(sql, params)
  167. return {
  168. success: true,
  169. msg: '查询成功',
  170. data: result.data.executeResultList,
  171. }
  172. } catch (error) {
  173. console.error('error =>', error)
  174. return {
  175. success: false,
  176. msg: '查询失败',
  177. error: error,
  178. }
  179. }
  180. }
  181. /**
  182. * 按月份分组查询课件上传统计
  183. * @param {*} parameter 年份 e.g: 2025
  184. */
  185. async function findFileCount(parameter) {
  186. const { year } = parameter
  187. try {
  188. const sql = "select * " +
  189. "from (select COUNT(*) as count, " +
  190. " DATE_FORMAT(FROM_UNIXTIME(createdAt / 1000), '%Y-%m') as month, " +
  191. " DATE_FORMAT(FROM_UNIXTIME(createdAt / 1000), '%Y') as year " +
  192. " from file_manage " +
  193. " group by month, year " +
  194. " order by year, month) t " +
  195. "where year = {{searchYear}}"
  196. const params = {
  197. searchYear: year
  198. }
  199. const result = await models.$runSQL(sql, params)
  200. return {
  201. success: true,
  202. msg: '查询成功',
  203. data: result.data.executeResultList,
  204. }
  205. } catch (error) {
  206. console.error('error =>', error)
  207. return {
  208. success: false,
  209. msg: '查询失败',
  210. error: error,
  211. }
  212. }
  213. }
  214. module.exports = {
  215. findCountAndTotal,
  216. findBehaviorAlarm,
  217. findOrderCountByMonth,
  218. findOrderCountByDay,
  219. findFileCount,
  220. }