首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在node.js mongodb和express中创建考勤系统

如何在node.js mongodb和express中创建考勤系统
EN

Stack Overflow用户
提问于 2018-12-23 14:56:41
回答 1查看 1.6K关注 0票数 2

我正在试着写一个应用程序,注册一天的出勤时,我登录并存储在MongoDB数据库中。

我可以在登录时添加时间、时间戳或时间,但我无法存储一天中的一个登录时间或只有一个出席率。此外,还应区分在10-10:15am之间登录时的attendance或在此之后的late attendance

我应该如何存储每天的单个出勤,以便在月底可以计算总出勤和迟到出勤?

代码语言:javascript
复制
mongoose.connect('mongodb://localhost/MYDB',{ useNewUrlParser: true });

const MYDBSchema = new mongoose.Schema({
    firstname: { type: String, default: 'default firstname' },
    lastname: { type: String, default: 'default lastname' },
    password: {type: String, default: 'pass' },
    email: { type: String, default: 'hahaha' },
    phone: { type: Number},
    dob: { type: Date },

    attendance:[{
        date:{
            type:Date,
            default:Date.now,
        },
        entry:{type:Date}


    }]
});
EN

回答 1

Stack Overflow用户

发布于 2021-11-27 15:46:04

要创建考勤,您需要3个集合。

集合1: Shift

Shift文档将具有如下架构

代码语言:javascript
复制
        const MYDBSchema = new mongoose.Schema({
        name: { type: String, default: 'Default' },
        weekend: { type: Array, default: [] },
        time: {type: Array, default: [] },
        lateIn: { type: Number, default: 0 },
        earlyOut: { type: Number, default: 0},
        halfDayHour: { type: Number }, // Half Day
        fullDayHour: { type: Number } // Full Day
        offset: { type: Number } // Timezone offset
        assignedEmployee: { type: Array, default: [] }
    });

如上所述,模式LateIn的早期输出将具有分钟格式的数字

集合2: DailyReport

每日报告文档将具有如下架构

代码语言:javascript
复制
     const MYDBSchema = new mongoose.Schema({
        user: { type: mongoose.Types.ObjectId}, // Reference of User
        shift: { type: mongoose.Types.ObjectId}, // Reference of User
        date: { type: Date }, // Start Of The Day Date . Example your offset -330 then store it as "2021-11-26T18:30:00.000Z"
        lateIn: { type: Number, default: 0 }, //  Will have total LAte In Seconds
        earlyOut: { type: Number, default: 0}, // Will have total Early Out Seconds
        overTime: { type: Number } // Will have Overtime
        breakTime: { type: Number } // Will have total Break Time
        initialInTime: { type: Date }, // Will have First Clock In
        finalOutTime: { type: Date } // Will have Final Clock Out
        totalWorkHour: { type: Number } // Will have Total Working Hour Seconds
        dayStatus: { type: Number } // Will define that day is Holiday or Weekend or Working Day
        timeStatus: { type:  Number } // Will have initial (absent), work (working), break (on break), end (Clocked Out),
});

集合3: TimeSheets

时间表文档将如下所示

代码语言:javascript
复制
 const MYDBSchema = new mongoose.Schema({
        user: { type: mongoose.Types.ObjectId}, // Reference of User
        dailyReport: { type: mongoose.Types.ObjectId}, // Reference of Daily Report
        date: { type: Date }, // Start Of The Day Date . Example your offset -330 then store it as "2021-11-26T18:30:00.000Z"
        inTime: { type: Date }, // Will have Clock In / Break In
        outTime: { type: Date } // Will have Clock Out / Break Out
        duration: { type: Number } // Will have Duration in Seconds difference between inTime and outTime
        type: { type: Number } // Break or Work
});

-> shift的工作原理

每天运行CRON或者创建函数,该函数将通过将timeStatus设置为初始设置来为每个用户创建每天的条目

->每日报告的工作原理

当任何用户发送打卡请求时。首先需要抓取班次,然后从班次获取时区偏移量,转换该日期并获取每日报告。

-> Create函数如下

getShiftTiming({ shiftObject,date }) ->将返回包含{ willStartAt: Date,endAt: Date }的对象

getCurrentTiming({ date }) ->将获取每日报告以将其发送到客户端

addIn ({ date,type }) ->将获取DailyReport,然后在TimeSheets集合中将条目创建为inTime,然后根据参数类型将timeStatus更改为WORK / BREAK

addOut ({ TimeSheet }) ->将获取每日报告,然后获取最后一个日期,然后设置outTime

calculateDailyReport({ shiftDetail,dailyReportDetail }) ->将根据TimeSheet集合计算报表。它将根据Daily Report获取所有记录,并汇总duration并更新dailyReport的totalWorkingHour,break然后获取第一个时间表的inTime和最后一个timesheet的outTime,然后设置dailyReport的initialInTime = inTime和finalOutTime = outTime。这个函数中的另一个函数将被调用,它将被调用( lateIn -> getShiftTiming调用这个函数,然后得到initialInTime和willStart之间的差异,因为它将在几秒内延迟,overTime ->从breakTime中减去totalTime,然后用shiftDetail的fullDayWorkingHour检查它,你将以同样的方式获得overTime秒,你可以得到earlyOutTime )

通过这种方式,您可以管理Shift。我还成功地管理了ubsapp.com的Shift,它比这个例子更具动态性。它有额外功能,将允许用户更新和添加插槽和请求( GEO位置和IP访问基于打卡和打卡许多其他。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53901828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档