SupplementRecord.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. const API = require("../../lib/API");
  2. const { BaseStdResponse } = require("../../BaseStdResponse");
  3. const db = require("../../plugin/DataBase/db");
  4. const AccessControl = require("../../lib/AccessControl");
  5. const UserInfoCache = require("../../lib/UserInfoCache");
  6. class SupplementRecord extends API {
  7. constructor() {
  8. super();
  9. this.setPath('/SupplementRecord');
  10. this.setMethod('GET');
  11. }
  12. async onRequest(req, res) {
  13. const { uuid, session, user, project_id } = req.query;
  14. // 检查必需的参数是否缺失
  15. if (!uuid || !session || !user || !project_id) {
  16. return res.json({
  17. ...BaseStdResponse.MISSING_PARAMETER,
  18. endpoint: 1513123
  19. });
  20. }
  21. // 检查 session 是否有效
  22. if (!await AccessControl.checkSession(uuid, session)) {
  23. return res.json({
  24. ...BaseStdResponse.ACCESS_DENIED,
  25. endpoint: 48153145
  26. });
  27. }
  28. try {
  29. // 获取考勤项目数据
  30. const sqlGetProject = `
  31. SELECT user, createUser, begintime, loopy, day_of_week, admin
  32. FROM kq_items
  33. WHERE id = ?
  34. `;
  35. const projectData = await db.query(sqlGetProject, [project_id]);
  36. if (!projectData.length) {
  37. return res.json({
  38. ...BaseStdResponse.DATABASE_ERR,
  39. endpoint: 1544511
  40. });
  41. }
  42. const item = projectData[0];
  43. // 检查权限
  44. const permission = await AccessControl.getPermission(uuid);
  45. if (item.createUser !== uuid && !permission.includes('admin') && !item.admin.includes(uuid)) {
  46. return res.json({
  47. ...BaseStdResponse.PERMISSION_DENIED,
  48. endpoint: 481454,
  49. msg: '你不是该考勤项目管理员,无操作权限'
  50. });
  51. }
  52. // 获取用户 UUID
  53. const sqlGetUserUUID = `
  54. SELECT uuid
  55. FROM users
  56. WHERE username = ?
  57. `;
  58. const userUUIDData = await db.query(sqlGetUserUUID, [user]);
  59. if (!userUUIDData.length) {
  60. return res.json({
  61. ...BaseStdResponse.DATABASE_ERR,
  62. endpoint: 154711,
  63. msg: '未找到用户'
  64. });
  65. }
  66. const userUUID = userUUIDData[0].uuid;
  67. if (!item.user.includes(userUUID)) {
  68. return res.json({
  69. ...BaseStdResponse.ERR,
  70. endpoint: 481454,
  71. msg: '用户不在考勤名单中'
  72. });
  73. }
  74. // 检查是否已有考勤记录
  75. const sqlCheckRecords = `
  76. SELECT id, uuid, time
  77. FROM kq_records
  78. WHERE project_id = ? AND uuid = ?
  79. `;
  80. const records = await db.query(sqlCheckRecords, [project_id, userUUID]);
  81. if (records.length !== 0 && this.hasRecord(item, records, userUUID)) {
  82. return res.json({
  83. ...BaseStdResponse.ERR,
  84. endpoint: 513523,
  85. msg: '用户在本考勤周期已有考勤记录!'
  86. });
  87. }
  88. // 添加考勤记录
  89. const userInfo = await UserInfoCache.getUserByUuid(uuid);
  90. const sqlInsertRecord = `
  91. INSERT INTO kq_records (project_id, uuid, time, commit)
  92. VALUES (?, ?, ?, ?)
  93. `;
  94. const result = await db.query(sqlInsertRecord, [
  95. project_id,
  96. userUUID,
  97. new Date().getTime(),
  98. `${userInfo.username}补卡`
  99. ]);
  100. if (!result || result.affectedRows !== 1) {
  101. return res.json({
  102. ...BaseStdResponse.DATABASE_ERR,
  103. endpoint: 513514
  104. });
  105. }
  106. res.json({
  107. ...BaseStdResponse.OK
  108. });
  109. } catch (error) {
  110. res.json({
  111. ...BaseStdResponse.ERR,
  112. endpoint: 154511
  113. });
  114. this.logger.error(`添加补卡记录时出错!${error.stack}`)
  115. }
  116. }
  117. hasRecord(attendanceData, records, uuid) {
  118. const { day_of_week, begintime, loopy } = attendanceData;
  119. if (!loopy) {
  120. return records.some(record => record.uuid === uuid);
  121. }
  122. const now = new Date();
  123. const dayOfWeek = now.getDay();
  124. const nowTime = now.getTime();
  125. function getTimestamp() {
  126. // 计算今天与目标星期几的差值
  127. // 目标星期几应当是从0到6的范围,0是星期日,6是星期六
  128. const daysUntilTarget = (day_of_week - dayOfWeek + 7) % 7;
  129. // 计算目标日期
  130. const targetDate = new Date(now);
  131. targetDate.setDate(now.getDate() + daysUntilTarget);
  132. const [hours, minutes, seconds] = begintime.split(':').map(Number);
  133. targetDate.setHours(hours, minutes, seconds, 0);
  134. return targetDate.getTime();
  135. }
  136. const begin = getTimestamp();
  137. if (nowTime >= begin) {
  138. return records.some(record => record.time >= begin && record.uuid === uuid);
  139. }
  140. return records.some(record => record.time >= begin - 604800000 && record.uuid === uuid);
  141. }
  142. }
  143. module.exports.SupplementRecord = SupplementRecord;