我正在试着写一个应用程序,注册一天的出勤时,我登录并存储在MongoDB数据库中。
我可以在登录时添加时间、时间戳或时间,但我无法存储一天中的一个登录时间或只有一个出席率。此外,还应区分在10-10:15am之间登录时的attendance或在此之后的late attendance。
我应该如何存储每天的单个出勤,以便在月底可以计算总出勤和迟到出勤?
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}
}]
});发布于 2021-11-27 15:46:04
要创建考勤,您需要3个集合。
集合1: Shift
Shift文档将具有如下架构
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
每日报告文档将具有如下架构
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
时间表文档将如下所示
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访问基于打卡和打卡许多其他。)
https://stackoverflow.com/questions/53901828
复制相似问题