szdjg.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. const express = require("express");
  2. const axios = require("axios");
  3. const router = express.Router();
  4. const schedule = require("node-schedule");
  5. var mysql = require("./mysql");
  6. // 本地
  7. // const _mysqlLabor = ["183.36.25.93", "pbl"]; //edu數據庫信息
  8. // const _mysqluser = ["183.36.25.93", "cocorobouser"]; //用户数据库信息
  9. // const _getmysqlLabor2 = ["183.36.25.93", "pbl"]; //edu數據庫信息
  10. // const _getmysqlLabor = ["183.36.25.93", "pbl"]; //edu數據庫信息
  11. //线上
  12. const _mysqlLabor = ["172.16.12.5", "pbl"]; //edu數據庫信息
  13. const _mysqluser = ["172.16.12.5", "cocorobouser"]; //edu數據庫信息
  14. const _getmysqlLabor2 = ["172.16.12.7", "pbl"]; //edu數據庫信息
  15. const _getmysqlLabor = ["172.16.12.7", "pbl"]; //edu數據庫信息
  16. // 定时任务:每天凌晨2点触发
  17. schedule.scheduleJob("0 2 * * *", async () => {
  18. try {
  19. let p = []
  20. p.unshift(_mysqlLabor[0], _mysqlLabor[1], "getSzdjgData");
  21. mysql.usselect(p, async function (ret) {
  22. let allDownloadCount = 0;
  23. if (ret[7].length) {
  24. for (let i = 0; i < ret[7].length; i++) {
  25. allDownloadCount += ret[7][i].count;
  26. }
  27. }
  28. let dataAddParam = {
  29. serverName: "深教AI6",
  30. schoolNum: ret[0][0].count,
  31. classNum: ret[1][0].count,
  32. teacherNum: ret[2][0].count,
  33. studentNum: ret[3][0].count,
  34. totalVisit: ret[4][0].count,
  35. ssoVisit: ret[5][0].count,
  36. visitNum: ret[6][0].count,
  37. allDownloadCount: allDownloadCount,
  38. activeTeacherNum: ret[8][0].count,
  39. activeStudentNum: ret[9][0].count,
  40. allPrepareCount: ret[10][0].count,
  41. allClassCount: ret[11][0].count,
  42. classClickCount: ret[12][0].count,
  43. };
  44. console.log(dataAddParam);
  45. if (!dataAddParam || !dataAddParam.serverName) {
  46. console.error("上报失败:缺少必填参数 serverName");
  47. return;
  48. }
  49. const response = await axios.post(
  50. "http://36.213.31.21:8090/api/data/integrate",
  51. dataAddParam,
  52. { headers: { "Content-Type": "application/json" } }
  53. );
  54. console.log("数据上报成功", response.data);
  55. });
  56. } catch (error) {
  57. console.error("数据上报异常", error.response?.data?.msg || error.message);
  58. }
  59. });
  60. /**
  61. * 新增:上课/备课数据实时同步接口
  62. * POST /sync/class
  63. * body参数请参考接口文档说明
  64. */
  65. router.post("/sync/class", async (req, res) => {
  66. try {
  67. // 校验必填参数
  68. const {
  69. serverName,
  70. dataType,
  71. courseId,
  72. courseName,
  73. courseGrade,
  74. courseTime,
  75. } = req.body;
  76. if (
  77. !serverName ||
  78. typeof dataType !== "number" ||
  79. !courseId ||
  80. !courseName ||
  81. !courseGrade
  82. ) {
  83. return res
  84. .status(400)
  85. .json({
  86. code: 400,
  87. msg: "缺少必填参数",
  88. serverName,
  89. dataType: typeof dataType,
  90. courseId,
  91. courseName,
  92. courseGrade,
  93. courseTime,
  94. });
  95. }
  96. // 组装请求体,允许所有字段透传
  97. const realClassParam = { ...req.body };
  98. // 向深教AI学习平台同步数据
  99. const response = await axios.post(
  100. "http://36.213.31.21:8090/api/data/integrateClass",
  101. realClassParam,
  102. { headers: { "Content-Type": "application/json" } }
  103. );
  104. // 返回平台响应
  105. res.status(200).json(response.data);
  106. } catch (error) {
  107. const msg =
  108. error.response?.data?.msg ||
  109. error.response?.data ||
  110. error.message ||
  111. "同步失败";
  112. res.status(500).json({ code: 500, msg });
  113. }
  114. });
  115. router.post("/data", async (req, res) => {
  116. let p = []
  117. p.unshift(_mysqlLabor[0], _mysqlLabor[1], "getSzdjgData");
  118. mysql.usselect(p, async function (ret) {
  119. let allDownloadCount = 0;
  120. if (ret[7].length) {
  121. for (let i = 0; i < ret[7].length; i++) {
  122. allDownloadCount += ret[7][i].count;
  123. }
  124. }
  125. let dataAddParam = {
  126. serverName: "深教AI6",
  127. schoolNum: ret[0][0].count,
  128. classNum: ret[1][0].count,
  129. teacherNum: ret[2][0].count,
  130. studentNum: ret[3][0].count,
  131. totalVisit: ret[4][0].count,
  132. ssoVisit: ret[5][0].count,
  133. visitNum: ret[6][0].count,
  134. allDownloadCount: allDownloadCount,
  135. activeTeacherNum: ret[8][0].count,
  136. activeStudentNum: ret[9][0].count,
  137. allPrepareCount: ret[10][0].count,
  138. allClassCount: ret[11][0].count,
  139. classClickCount: ret[12][0].count,
  140. };
  141. console.log(dataAddParam);
  142. });
  143. });
  144. module.exports = router;
  145. /*
  146. 用法示例:
  147. POST /sync/class
  148. Content-Type: application/json
  149. {
  150. "serverName": "深教AI1",
  151. "dataType": 0,
  152. "teacherName": "张老师",
  153. "teacherAccount": "E12356334",
  154. "teacherPhone": "13235671123",
  155. "eduId": "",
  156. "schoolName": "第一中学",
  157. "schoolType": "公办",
  158. "area": "南山区",
  159. "coursePackageName": "AI课程",
  160. "courseId": "1234",
  161. "courseName": "AI画画",
  162. "courseGrade": "三年级",
  163. "courseTime": "40",
  164. "startTime": "2025-07-10 13:00:00",
  165. "endTime": "2025-07-10 13:40:00"
  166. }
  167. */
  168. // gpt-4