SupplementRecord.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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(data, res) {
  13. this.setAllowCORS(res);
  14. const { uuid, session, user, project_id } = data;
  15. // 检查必需的参数是否缺失
  16. if (!uuid || !session || !user || !project_id) {
  17. return res.json({
  18. ...BaseStdResponse.MISSING_PARAMETER,
  19. endpoint: 1513123
  20. });
  21. }
  22. // 检查 session 是否有效
  23. if (!await AccessControl.checkSession(uuid, session)) {
  24. return res.json({
  25. ...BaseStdResponse.ACCESS_DENIED,
  26. endpoint: 48153145
  27. });
  28. }
  29. try {
  30. // 获取考勤项目数据
  31. const sqlGetProject = `
  32. SELECT user, createUser, begintime, loopy, day_of_week, admin
  33. FROM kq_items
  34. WHERE id = ?
  35. `;
  36. const [projectData] = await db.query(sqlGetProject, [project_id]);
  37. if (!projectData.length) {
  38. return res.json({
  39. ...BaseStdResponse.DATABASE_ERR,
  40. endpoint: 154754511
  41. });
  42. }
  43. const item = projectData[0];
  44. // 检查权限
  45. const permission = await AccessControl.getPermission(uuid);
  46. if (item.createUser !== uuid && !permission.groups.includes('admin') && !item.admin.includes(uuid)) {
  47. return res.json({
  48. ...BaseStdResponse.PERMISSION_DENIED,
  49. endpoint: 481454,
  50. msg: '你不是该考勤项目管理员,无操作权限'
  51. });
  52. }
  53. // 获取用户 UUID
  54. const sqlGetUserUUID = `
  55. SELECT uuid
  56. FROM users
  57. WHERE name = ?
  58. `;
  59. const [userUUIDData] = await db.query(sqlGetUserUUID, [user]);
  60. if (!userUUIDData.length) {
  61. return res.json({
  62. ...BaseStdResponse.DATABASE_ERR,
  63. endpoint: 154754511,
  64. msg: '未找到用户'
  65. });
  66. }
  67. const userUUID = userUUIDData[0].uuid;
  68. if (!item.user.includes(userUUID)) {
  69. return res.json({
  70. ...BaseStdResponse.ERR,
  71. endpoint: 481454,
  72. msg: '用户不在考勤名单中'
  73. });
  74. }
  75. // 检查是否已有考勤记录
  76. const sqlCheckRecords = `
  77. SELECT id, uuid, time
  78. FROM kq_records
  79. WHERE project_id = ? AND uuid = ?
  80. `;
  81. const [records] = await db.query(sqlCheckRecords, [project_id, userUUID]);
  82. if (records.some(record => this.hasRecord(item, record))) {
  83. return res.json({
  84. ...BaseStdResponse.ERR,
  85. endpoint: 513523,
  86. msg: '用户在本考勤周期已有考勤记录!'
  87. });
  88. }
  89. // 添加考勤记录
  90. const userInfo = await UserInfoCache.getUserByUuid(uuid);
  91. const sqlInsertRecord = `
  92. INSERT INTO kq_records (project_id, uuid, time, commit)
  93. VALUES (?, ?, ?, ?)
  94. `;
  95. const result = await db.query(sqlInsertRecord, [
  96. project_id,
  97. userUUID,
  98. new Date().getTime(),
  99. `${userInfo.name}补卡`
  100. ]);
  101. if (result.affectedRows !== 1) {
  102. return res.json({
  103. ...BaseStdResponse.DATABASE_ERR,
  104. endpoint: 513514
  105. });
  106. }
  107. res.json({
  108. ...BaseStdResponse.OK
  109. });
  110. } catch (error) {
  111. res.json({
  112. ...BaseStdResponse.DATABASE_ERR,
  113. endpoint: 154754511
  114. });
  115. }
  116. }
  117. hasRecord(attendanceData, record) {
  118. const { day_of_week, begintime, loopy } = attendanceData;
  119. const now = new Date();
  120. const nowTime = now.getTime();
  121. if (!loopy) {
  122. return record.time >= nowTime;
  123. }
  124. const targetDay = (day_of_week + 7 - now.getDay()) % 7;
  125. const targetDate = new Date(now);
  126. targetDate.setDate(now.getDate() + targetDay);
  127. const [hours, minutes, seconds] = begintime.split(':').map(Number);
  128. targetDate.setHours(hours, minutes, seconds, 0);
  129. return record.time >= targetDate.getTime() - 604800000;
  130. }
  131. }
  132. module.exports.SupplementRecord = SupplementRecord;