开发工具与关键技术:Visual Studio 2015 定时任务
作者:孙水兵
撰写时间:2019年7月17
一、 达到的目的
将实际班次表中已经存在的班次的数据,在实际班次表中生成往后一天的数据。
二、 涉及到的表格
三、 代码
前期工作和写其他定时任务一样,具体可以参考我的博客中:定时插件FluentScheduler的使用( https://blog.youkuaiyun.com/weixin_44554896/article/details/90287178)
完成前期工作之后,在捕获异常try{}catch{}中写其他代码。
1、 查询出实际班次的信息
利用group…by…分组在实际班次表中根据计划班次ID进行分组,然后在查询出实际班次表中日期最大的那一条实际班次信息中的计划班次ID、发车日期、车辆ID。在查询的时候只需要根据实际的发车日期倒叙排序,然后在查询出第一条数据中的所需要的信息就是实际班次表中日期最大的那一条数据。然后在查询出实际班次表中的计划班次ID并利用Distinct来去除重复的数据。
2、 在循环班次表中查询出对应的循环信息
判断刚刚从实际班次表中查询出来的计划班次ID的条数是否大于0。如果其不大于0,那么说明实际班次表中不存在任何数据,那么久不需要往下执行了,只需要执行生成7天的即可。如果其大于0,则继续往下执行。先从循环表中利用计划班次ID分组并且根据循环号顺序排序查询出循环信息。
3、 在计划班次表中查询出实际班次表中已有的计划班次信息
先new一个集合类型的实体类(该实体类在上一篇中提到过)。foreach循环前面从实际班次表中查询出来到的计划班次ID,在foreach循环前面从循环表中查询出来的信息。如果从循环表中查询出来的计划班次ID等于从实际表中查询出来的计划班次ID,则说明该循环班次所在的班次信息已在实际班次表中生成。因此往下执行生成之后一天的数据。然后从计划班次表中查询出计划班次ID等于前面查询出来的计划班次ID的班次信息。以及车辆ID为所在班次循环表中对应的车辆ID。循环号也是一样。
4、 生成最大日期后一天的实际班次
先new一个集合类型的实际班次表,然后foreach循环前面计划班次表中查询出来的符合的计划班次信息。然后声明一个时间类型的变量now和int类型的变量j并让j等于1。然后在foreach循环刚开始就从实际班次表中查询出来的数据并用item接收,然后判断两次循环的计划班次ID是否相等。让刚才声明的变量now等于item中的日期。然后再到循环表中查询出该班次对应的循环号并用j接收(实际班次表中日期最大的那一条数据对应的循环号)。然后再判断j是否等于该班次对应的最大的循环号。若等于,让j等于0。(因为循环号和车辆ID是用列表来接收的,而列表的下标是从0开始的。当j等于最大的循环号,则说明需要从第一个循环号开始循环)。然后在for循环,让i=1,并且<2(只添加一天的数据)。然后在for循环中也判断j是否等于该班次对应的最大的循环号。然后new一个实际班次的变量,然后将数据赋值给对应的实际班次中的字段,其中车辆ID是循环号所对应的车辆ID(循环号不需要像前面一样做处理是因为循环号是需要往后加+1,但是查询出来的循环号比循环号的加1)。而发车日期是根据前面获取的日期加上1。now.AddDays(i):是当前日期加上i天之后的日期。然后将数据加入到listsysRealityClasses集合中。让j自增。然后在foreach循环外将数据保存到数据库
全部代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using FluentScheduler;
using TransportManagment.Models;
using TransportManagment.EntityClass;
namespace TransportManagment.Timer
{
public class creatClassesEveryDay : IJob
{
Models.TransportManagmentEntities myModels = new TransportManagmentEntities();
public void Execute()
{
try
{
//查询出所有实际班次表中的所有计划班次ID和最大的时间
var sysRealityClassesInfo = from tbRealityClasses in myModels.SYS_RealityClasses
group tbRealityClasses by tbRealityClasses.PlanClassesID into tbPlanClassesID
select new
{
PlanClassesID = tbPlanClassesID.Key,
RealityDepartDate = tbPlanClassesID.OrderByDescending(m => m.RealityDepartDate).FirstOrDefault().RealityDepartDate,
PassengerCarID = tbPlanClassesID.OrderByDescending(m => m.RealityDepartDate).FirstOrDefault().PassengerCarID
};
List<int> RealityClassesPlanClassesID = (from tbRealityClasses in myModels.SYS_RealityClasses
select tbRealityClasses.PlanClassesID).Distinct().ToList();
if (sysRealityClassesInfo.Count()>0)
{
//从循环表中查询出数据
var ClassesCirculationCode = (from tbClassesCirculation in myModels.SYS_ClassesCirculation
group tbClassesCirculation by tbClassesCirculation.PlanClassesID into tbClasses
select new
{
PlanClassesID = tbClasses.Key,
CirculationCode = tbClasses.OrderBy(m => m.CirculationCode).Select(m => m.CirculationCode).ToList(),
PassengerCarID = tbClasses.OrderBy(m => m.CirculationCode).Select(m => m.PassengerCarID).ToList(),
}).ToList();
#region 查询出所有已生成实际班次的计划班次
List<TimeClassesVo> listSysPlanClasses = new List<TimeClassesVo>();
foreach (int PlanClassesID in RealityClassesPlanClassesID)
{
foreach (var item in ClassesCirculationCode)
{
if (PlanClassesID == item.PlanClassesID)
{
try
{
//在计划班次表中查询出所有符合的班次信息
TimeClassesVo sysPlanClasses = (from tbPlanClasses in myModels.SYS_PlanClasses
where tbPlanClasses.PlanClassesID == item.PlanClassesID
select new TimeClassesVo
{
PlanClassesID = tbPlanClasses.PlanClassesID,
CircuitID = tbPlanClasses.CircuitID,
PassengerCarID = item.PassengerCarID,
PlanClassesCode = tbPlanClasses.PlanClassesCode,
PlanDepartTime = tbPlanClasses.PlanDepartTime,
TicketCheck = tbPlanClasses.TicketCheck,
TicketOffice = tbPlanClasses.TicketOffice,
ClassesRemark = tbPlanClasses.ClassesRemark,
CirculationCode = item.CirculationCode
}).Single();
listSysPlanClasses.Add(sysPlanClasses);
}
catch (Exception e)
{
}
}
}
}
#endregion
//生成以后一天的班次并保存
List<SYS_RealityClasses> listsysRealityClasses = new List<SYS_RealityClasses>();
foreach (var ClassesInfo in listSysPlanClasses)
{
DateTime now = DateTime.Now;
int j = 1;
foreach (var item in sysRealityClassesInfo)
{
if (ClassesInfo.PlanClassesID == item.PlanClassesID)
{
now = Convert.ToDateTime(item.RealityDepartDate);
j = (from tbClassesCirculation in myModels.SYS_ClassesCirculation
where tbClassesCirculation.PlanClassesID == item.PlanClassesID && tbClassesCirculation.PassengerCarID == item.PassengerCarID
select tbClassesCirculation.CirculationCode).Single();
break;
}
}
if (j == ClassesInfo.CirculationCode.Last())
{
j = 0;
}
for (int i = 1; i < 2; i++)
{
if (j > ClassesInfo.CirculationCode.Last())
{
j = 0;
}
SYS_RealityClasses sysRealityClasses = new SYS_RealityClasses();
sysRealityClasses.ClassesTypeID = 1;
sysRealityClasses.CircuitID = ClassesInfo.CircuitID;
sysRealityClasses.PlanClassesID = ClassesInfo.PlanClassesID;
sysRealityClasses.PassengerCarID = ClassesInfo.PassengerCarID[j];
sysRealityClasses.RealityClassesCode = ClassesInfo.PlanClassesCode;
sysRealityClasses.RealityDepartDate = now.AddDays(i);
sysRealityClasses.RealityDepartTime = ClassesInfo.PlanDepartTime;
sysRealityClasses.RealityTicketCheck = ClassesInfo.TicketCheck;
sysRealityClasses.RealityTicketOffice = ClassesInfo.TicketOffice;
sysRealityClasses.WhetherAttendClass = true;
listsysRealityClasses.Add(sysRealityClasses);
j++;
}
}
myModels.SYS_RealityClasses.AddRange(listsysRealityClasses);
myModels.SaveChanges();
}
}
catch (Exception e)
{
}
}
}
}