最近完成的小系统,会议室预定系统。可预览:
技术分析:
1,准备一个表,存储会议室,可以添加,编辑,启用或禁用(为控制某一会议室是否显示给用户在预定时是否可见),删除功能,可有可无,如果实现,当删除时,需要写触发器,把此预定过此会议室的记录一同删除。
2,准备两个表,存储时间记录(id,TimeName),每半个小时,如00:00,00:30,01:00直至23:30;另一个表是存储星期(id,weekName),你可以存储中文或是英文星期名称。这两个表均是为用户选择时间而准备。
3,预定你可以使用用户登录功能,登录成功之后,才可以预定,这样可以实现不同的人可以管理好自己的预定记录。
4,会议类型分为一次性,或是周期性。一次性的会议,日期需大于或等于当天。而开始时间,还需要判断,始时间须大于当前时间加上一小时。因为系统会预留半小时,不够半小时的,算够半小时。系统会作发送邮件。
5,准备一个表,存储预定记录,(id,会议室Id,WeekName,预定日期,开始,结束,...)上面使用中文,只是为了更好作解释。存储预定记录时,如果是周期性的,预定日期字段是为空的。另外,如果是存储一次性,预定日期字段不能为空,或是weekName要把预定日期转换算出是星期几填充WeekName字段,这样我们为下面判断时间是否有冲突,就方便多了。
5,判断预定时间是否有冲突,同一会议室,不管是一次性,还是周期性,时间不能重叠。
BEGIN
RAISERROR (N ' 不能预定此会议室,会议时间发生重叠。 ' , 16 , 1 )
RETURN
END
6,预定成功,给预定人和会议联系人发送会议室预定成功的邮件。
7,写一个进程,30秒判断一次,当前的时间,分钟部分是否为00或是30,如果是的话,把当前这个时间加半小时,去判断预定开始时间是否相同,如果相同,发送邮件。
int currentMinute = e.SignalTime.Minute;
if (currentMinute == 0 || currentMinute == 30 )
{
try
{
AutomationEntity objAutomationEntity = new AutomationEntity();
objAutomationEntity.MeetingNotify(currentHour, currentMinute);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
上面有一个方法MeetingNotify(xxx,xxx):
{
int cHour = 0 ;
int cMinute = 0 ;
if (currentMinute == 0 )
{
cHour = currentHour;
cMinute = 30 ;
}
if (currentMinute == 30 )
{
cHour = currentHour + 1 ;
cMinute = 0 ;
}
// 传入数据库
}
8,最后一个需要说的,就是会议参与人的字段,在发送邮件时,需要在SQL做split。sql没有此函数,但你可以在网上找到很多相关的方法。
另外,提供一下前端页面显示:
今天的预定:
FROM [ dbo ] . [ xxx ]
WHERE [ MRId ] <> 1 AND ( [ WeekName ] = DATENAME (w, CURRENT_TIMESTAMP ) OR [ BookingDate ] = CAST ( CURRENT_TIMESTAMP AS DATE))
明天的预定:
SELECT ...
FROM [ dbo ] . [ xxx ]
WHERE [ MRId ] <> 1 AND ( [ WeekName ] = DATENAME (w, @tomorrow ) OR [ BookingDate ] = @tomorrow )
本周的预定,本月和所有的预定存储过程略。
取消或是过期:
首先要写一个预定记录Status的函数:
IF ( @IsEnable = 0 )
SET @ReturnValue = 1 -- 取消
IF ( ' 一次性 ' AND ( @BookingDateTime < CURRENT_TIMESTAMP ))
SET @ReturnValue = 2 -- 过期
IF ( @IsEnable = 0 AND ' 一次性 ' AND ( @BookingDateTime < CURRENT_TIMESTAMP ))
SET @ReturnValue = 3 -- 取消与过期
FROM [ dbo ] . [ xxx ]
WHERE [ MRId ] <> 1 AND [ Status ] <> 0