123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- const API = require("../../lib/API");
- const { BaseStdResponse } = require("../../BaseStdResponse");
- const db = require("../../plugin/DataBase/db");
- const AccessControl = require("../../lib/AccessControl");
- const UserInfoCache = require("../../lib/UserInfoCache");
- class SupplementRecord extends API {
- constructor() {
- super();
- this.setPath('/SupplementRecord');
- this.setMethod('GET');
- }
- async onRequest(data, res) {
- this.setAllowCORS(res);
- const { uuid, session, user, project_id } = data;
- // 检查必需的参数是否缺失
- if (!uuid || !session || !user || !project_id) {
- return res.json({
- ...BaseStdResponse.MISSING_PARAMETER,
- endpoint: 1513123
- });
- }
- // 检查 session 是否有效
- if (!await AccessControl.checkSession(uuid, session)) {
- return res.json({
- ...BaseStdResponse.ACCESS_DENIED,
- endpoint: 48153145
- });
- }
- try {
- // 获取考勤项目数据
- const sqlGetProject = `
- SELECT user, createUser, begintime, loopy, day_of_week, admin
- FROM kq_items
- WHERE id = ?
- `;
- const [projectData] = await db.query(sqlGetProject, [project_id]);
- if (!projectData.length) {
- return res.json({
- ...BaseStdResponse.DATABASE_ERR,
- endpoint: 154754511
- });
- }
- const item = projectData[0];
- // 检查权限
- const permission = await AccessControl.getPermission(uuid);
- if (item.createUser !== uuid && !permission.groups.includes('admin') && !item.admin.includes(uuid)) {
- return res.json({
- ...BaseStdResponse.PERMISSION_DENIED,
- endpoint: 481454,
- msg: '你不是该考勤项目管理员,无操作权限'
- });
- }
- // 获取用户 UUID
- const sqlGetUserUUID = `
- SELECT uuid
- FROM users
- WHERE name = ?
- `;
- const [userUUIDData] = await db.query(sqlGetUserUUID, [user]);
- if (!userUUIDData.length) {
- return res.json({
- ...BaseStdResponse.DATABASE_ERR,
- endpoint: 154754511,
- msg: '未找到用户'
- });
- }
- const userUUID = userUUIDData[0].uuid;
- if (!item.user.includes(userUUID)) {
- return res.json({
- ...BaseStdResponse.ERR,
- endpoint: 481454,
- msg: '用户不在考勤名单中'
- });
- }
- // 检查是否已有考勤记录
- const sqlCheckRecords = `
- SELECT id, uuid, time
- FROM kq_records
- WHERE project_id = ? AND uuid = ?
- `;
- const [records] = await db.query(sqlCheckRecords, [project_id, userUUID]);
- if (records.some(record => this.hasRecord(item, record))) {
- return res.json({
- ...BaseStdResponse.ERR,
- endpoint: 513523,
- msg: '用户在本考勤周期已有考勤记录!'
- });
- }
- // 添加考勤记录
- const userInfo = await UserInfoCache.getUserByUuid(uuid);
- const sqlInsertRecord = `
- INSERT INTO kq_records (project_id, uuid, time, commit)
- VALUES (?, ?, ?, ?)
- `;
- const result = await db.query(sqlInsertRecord, [
- project_id,
- userUUID,
- new Date().getTime(),
- `${userInfo.name}补卡`
- ]);
- if (result.affectedRows !== 1) {
- return res.json({
- ...BaseStdResponse.DATABASE_ERR,
- endpoint: 513514
- });
- }
- res.json({
- ...BaseStdResponse.OK
- });
- } catch (error) {
- res.json({
- ...BaseStdResponse.DATABASE_ERR,
- endpoint: 154754511
- });
- }
- }
- hasRecord(attendanceData, record) {
- const { day_of_week, begintime, loopy } = attendanceData;
- const now = new Date();
- const nowTime = now.getTime();
- if (!loopy) {
- return record.time >= nowTime;
- }
- const targetDay = (day_of_week + 7 - now.getDay()) % 7;
- const targetDate = new Date(now);
- targetDate.setDate(now.getDate() + targetDay);
- const [hours, minutes, seconds] = begintime.split(':').map(Number);
- targetDate.setHours(hours, minutes, seconds, 0);
- return record.time >= targetDate.getTime() - 604800000;
- }
- }
- module.exports.SupplementRecord = SupplementRecord;
|