最近编写一个酒店管理系统,这个系统我是使用spring+springMVC+hibernate+JPA来架构项目。一切的增删改查,上传下载很顺利。 但是酒店管理系统。是需要客户订房的,而订房是需要一个时间段一个时间段的订。
比如张三订101房:2020-1-3 到 2020-1-6
那么李四如果想 订101房 就得错过 2020-1-3 , 2020-1-4 ,2020-1-5,2020-1-6 这四天,当然我只计算到天。如果计算到小时比较麻烦我不想整。可以是时间段之前,可以是时间段之后。
看似很简单。其实要想一个问题。所有客户订房的时间段是一个集合。也就是下面样子
[
[2020-1-3 , 2020-1-4 ,2020-1-5,2020-1-6],
[2020-1-7 , 2020-1-8 ,2020-1-9,2020-1-10],
[2019-1-3 , 2019-1-4 ,2019-1-5,2019-1-6]
.......
]
如果新客户要来预订的时间段,那么必须错过这些时间段。而且也考略客户退房。客户退房我做的就很直接,直接考略移除掉这条数据就可以了。数据表中我做订单的时候,用了一个state字段,0就代表预订了没住,1代表就是代表了住进来了。2代表已经离店了。
这时候我考略state=0的字段就可以,只要不与这些用户冲突就可以了。而先决条件是这个房间必须不是state=1 .一旦等于1任何时间段都不能订。这个考虑是,用户是不是有续费的可能。
这些思路还是比较容易想的,也很简单。 那么重点考虑筛选时间段这块了。我是很懒的有现成的,我就绝对不动手,恩,能不动手就不动手。那么就开始搜索看看有没有类似的插件或者直接来了酒店这块的插件。我真没找到!layui这么好用的ui都没有!不过没事,那就只能自己写了。
还记得当年来简书写js日期插件的我还是青涩少年,现在就变得有些略显油腻了。本来可以直接用layui的那个日期控件,不过我想想,我自己原来写的也非常不错啊。能看到我当年写js日期插件的可以过去学一下,翻我主页就能找到。
简单说一下:酒店预订房间时间段的思路,js版本的。
1.预订时间 - 离店时间 : 2020-1-2 ~ 2020-3-1
这个发现是同一年,那么就考略,月份 和天数了,
1.1 月份是当前月份的预订
1.2 月份是当前月+下个月预订
1.3月份是当前月+(n)个月<12个月 +最后一个月份
当前年+下一年 考虑问题也是同上
然后就是当前年+n年+最后的一年
具体的代码就如下,我注释写的很详细。
var totalArr = []; //所有客户订房的所有日期数组的集合
//获取id
function $$(id){
return document.getElementById(id);
}
TaoTaodate({
dateId:"ipt", //input 上面的id
skin:"red", //皮肤配置参数
interval:"-" // 分隔符参数配置
});
TaoTaodate({
dateId:"ipt1",
skin:"blue",
//interval:" /\ "
interval:"-" // 分隔符参数配置
});
//获取时间戳,不含分秒.时间格式:2020-01-02
function getTimeChuo(times){
var now = new Date();
var dateNow = now.getFullYear()+"-"+Number(now.getMonth()+1)+"-"+now.getDate();
times = !times?new Date(dateNow).getTime():new Date(times).getTime();
return times;
}
//获取某一个年某一月有多少天
var getDaysInOneMonth = function (year, month) {
month = parseInt(month, 10); //强转成数字
var d = new Date(year, month, 0); //这个是都可以兼容的
return d.getDate();
};
//传入两个日期,求出中间所差的天数
function getAllDate(d1,d2){
var resultArr = [];//所有日期的数组集合
var darr1 = d1.split("-");
var darr2 = d2.split("-");
var year = darr2[0] - darr1[0];
//同一年的计算
if(year == 0){
var tempMonth = []; //月份存储的临时数组
var month = darr2[1] - darr1[1];
for(var i=Number(darr1[1]);i<=Number(darr2[1]);i++){
tempMonth.push(i);
//console.log(i);
}
//这时候判定月份,当发现数组中只有一个值的时候,那么证明是同月
if(tempMonth.length == 1){
//只计算天数差了多少天
for(var i=darr1[2];i<=darr2[2];i++){
var str = darr2[0]+"-"+tempMonth[0]+"-"+i;
resultArr.push(str);
}
}
//如果数组中只有两个值的时候,证明当前月到下个月
else if(tempMonth.length == 2){
//只计算数组中第一个值到月底有多少天
//只计算数组中第二个值到月初有多少天
//获取当前月的天数
var lastMonthDate = getDaysInOneMonth(darr2[0],tempMonth[0]);
//计算数组中第一个值,从当前天到月底的天数
for(var i=darr1[2];i<=lastMonthDate;i++){
var str = darr1[0]+"-"+tempMonth[0]+"-"+i;
resultArr.push(str);
}
//计算数组中第最后的一个值,从当前天到月初1号的天数
for(var i=1;i<=darr2[2];i++){
var str = darr2[0]+"-"+tempMonth[tempMonth.length-1]+"-"+i;
resultArr.push(str);
}
}
//当超过2值时候发现多出了月份
else{
//获取当前月的天数
var lastMonthDate = getDaysInOneMonth(darr2[0],tempMonth[0]);
//计算数组中第一个值,从当前天到月底的天数
for(var i=darr1[2];i<=lastMonthDate;i++){
var str = darr1[0]+"-"+tempMonth[0]+"-"+i;
resultArr.push(str);
}
var mon = [];//多余出来的月份数组
for(var i=1;i<tempMonth.length-1;i++){
mon.push(tempMonth[i]);
}
//循环获取每个月天数
for(var i=0;i<mon.length;i++){
var tempdate1 = getDaysInOneMonth(darr2[0],mon[i]);
for(var j=1;j<=tempdate1;j++){
var str = darr2[0]+"-"+mon[i]+"-"+j;
// console.log(j);
resultArr.push(str);
}
}
//计算数组中第最后的一个值,从当前天到月初1号的天数
for(var i=1;i<=darr2[2];i++){
var str = darr2[0]+"-"+tempMonth[tempMonth.length-1]+"-"+i;
resultArr.push(str);
}
/*** 2020年 6月份 到 8月份所有天
**/
}
return resultArr;
}
//当前年到下一年的计算
else if(year == 1){
//当前年的当前月的所有天数
var currentMonth = getDaysInOneMonth(darr1[0],darr1[1]);
//当前月到月底的天数
for(var i=darr1[2];i<=currentMonth;i++){
var str = darr1[0]+"-"+darr1[1]+"-"+i;
resultArr.push(str);
}
//当前年的下一个月到 12月中间所有的月份
for(var i=Number(darr1[1])+1;i<=12;i++){
var MonthDate = getDaysInOneMonth(darr1[0],i);
//这些月份对应的天数
for(var j=1;j<=MonthDate;j++){
var str = darr1[0]+"-"+i+"-"+j;
resultArr.push(str);
}
}
//下一年的1月份到下一年的上个月
for(var i=1;i<darr2[1];i++){
var MonthDate = getDaysInOneMonth(darr2[0],i);
//这些月份对应的天数
for(var j=1;j<=MonthDate;j++){
var str = darr2[0]+"-"+i+"-"+j;
resultArr.push(str);
}
}
//下一年的最后的月份所对应的天数
for(var i=1;i<=darr2[2];i++){
var str = darr2[0]+"-"+darr2[1]+"-"+i;
resultArr.push(str);
}
return resultArr;
}
//当前年份 到 中间隔了1一年以上 到 下一年 如 2020-1-2 到 2023-1-6
else{
//当前年的当前月的所有天数
var currentMonth = getDaysInOneMonth(darr1[0],darr1[1]);
//当前月到月底的天数
for(var i=darr1[2];i<=currentMonth;i++){
var str = darr1[0]+"-"+darr1[1]+"-"+i;
resultArr.push(str);
}
//当前年的下一个月到 12月中间所有的月份
for(var i=Number(darr1[1])+1;i<=12;i++){
var MonthDate = getDaysInOneMonth(darr1[0],i);
//这些月份对应的天数
for(var j=1;j<=MonthDate;j++){
var str = darr1[0]+"-"+i+"-"+j;
resultArr.push(str);
}
}
//获取中间那几年,那几月的那几天
for(var i=Number(darr1[0])+1;i<darr2[0];i++){
for(var j=1;j<=12;j++){
var MonthDate = getDaysInOneMonth(i,j);
for(var k=1;k<=MonthDate;k++){
var str = i+"-"+j+"-"+k;
resultArr.push(str);
}
}
}
//下一年的1月份到下一年的上个月
for(var i=1;i<darr2[1];i++){
var MonthDate = getDaysInOneMonth(darr2[0],i);
//这些月份对应的天数
for(var j=1;j<=MonthDate;j++){
var str = darr2[0]+"-"+i+"-"+j;
resultArr.push(str);
}
}
//下一年的最后的月份所对应的天数
for(var i=1;i<=darr2[2];i++){
var str = darr2[0]+"-"+darr2[1]+"-"+i;
resultArr.push(str);
}
return resultArr;
}
//console.log(year,month)
}
//数组查找函数
function isArrIndex(msg,a){
if(a.length == 0){
return -1;
}
else{
for(var i=0;i<a.length;i++){
if(a[i] == msg){
return i;
}
}
return -1;
}
}
//酒店选择的时间数组
$$("surebtn").onclick=function(){
//预定时间不得小于今天
if(getTimeChuo($$("ipt").value)<getTimeChuo()){
alert("预订时间,不能小于今天");
return ;
}
//预定时间不得大于离店时间
if(getTimeChuo($$("ipt").value)>getTimeChuo($$("ipt1").value)){
alert("预订时间,不能大于离店时间");
return ;
}
//获取选择好的日期数组
var dateArr = getAllDate($$("ipt").value,$$("ipt1").value);
if(totalArr.length == 0){
alert("订房成功");
totalArr = totalArr.concat(dateArr);
}
else{
//比对预订时间 - 离店时间段内是否已经被订房了!
var dateArr1 = getAllDate($$("ipt").value,$$("ipt1").value);
for(var i=0;i<dateArr1.length;i++){
if(totalArr.indexOf(dateArr1[i]) != -1){
alert("该时间段:"+dateArr1[i]+" 已经被人订了");
return ;
}
}
totalArr = totalArr.concat(dateArr1);
//console.log();
}
console.log(totalArr);
}
网友评论