SupplementRecord.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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: 154754511
  40. });
  41. }
  42. const item = projectData[0];
  43. // 检查权限
  44. const permission = await AccessControl.getPermission(uuid);
  45. if (item.createUser !== uuid && !permission.groups.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 name = ?
  57. `;
  58. const [userUUIDData] = await db.query(sqlGetUserUUID, [user]);
  59. if (!userUUIDData.length) {
  60. return res.json({
  61. ...BaseStdResponse.DATABASE_ERR,
  62. endpoint: 154754511,
  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.some(record => this.hasRecord(item, record))) {
  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.name}补卡`
  99. ]);
  100. if (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.DATABASE_ERR,
  112. endpoint: 154754511
  113. });
  114. }
  115. }
  116. hasRecord(attendanceData, record) {
  117. const { day_of_week, begintime, loopy } = attendanceData;
  118. const now = new Date();
  119. const nowTime = now.getTime();
  120. if (!loopy) {
  121. return record.time >= nowTime;
  122. }
  123. const targetDay = (day_of_week + 7 - now.getDay()) % 7;
  124. const targetDate = new Date(now);
  125. targetDate.setDate(now.getDate() + targetDay);
  126. const [hours, minutes, seconds] = begintime.split(':').map(Number);
  127. targetDate.setHours(hours, minutes, seconds, 0);
  128. return record.time >= targetDate.getTime() - 604800000;
  129. }
  130. }
  131. module.exports.SupplementRecord = SupplementRecord;