szdjg.js 5.0 KB

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