private void button1_Generate_Click(object sender, EventArgs e) { if (textBox_SealSpan.Text == "") { textBox_SealSpan.Text = "0"; } //RailwayVehicleModel实例化需要配置5个参数 //70还是60吨车型、生产日期、上次厂修时间、上次段修时间、封存时间 RailwayVehicleModel vehicleModel = new RailwayVehicleModel(); //配置vehicleModel参数 5项 //强制转换,别搞那么复杂 vehicleModel.GenTpSelection = listBox1.SelectedIndex; vehicleModel.produceDate = dateTimePicker1_Produce.Value.Date; vehicleModel.previousDepotDate = dateTimePicker1_Dep.Value.Date; vehicleModel.previousFactoryDate = dateTimePicker2_Fac.Value.Date; vehicleModel.SealDuration = Convert.ToInt32(textBox_SealSpan.Text); //需要设置int GenTp, DateTime pre_depDate, DateTime pre_facDate, DateTime produceDate, int SealSpan RailwayVehicleModel vResult = VehicleData.ReDateProcessKernel(vehicleModel); if (vResult == null) { MessageBox.Show("vResult为null,检查计算Kernel"); return; } textBox_NextDep.Text = vResult.vNextDepotDate.ToLongDateString(); textBox1_CurrentTime.Text = vResult.currentDepotDate.ToLongDateString(); textBox_NextFac.Text = vResult.nextFactoryDate.ToLongDateString(); label9.Text = "修程进度:" + vResult.n.ToString(); //进度条显示 ProgressBarScaleDisplay(vResult.GenType, vResult.n); textBox1_DBG.Text = vResult.warningInfo; //Dbg("Log:" + DateTime.Now.ToString() + "\r\n" + vResult.nextFactoryDate.ToString()); }
/// <summary> /// 处理不参加修程修制改革的车型 /// </summary> /// <param name="vehicle"></param> /// <returns></returns> public static RailwayVehicleModel NonDateProcessKernel(RailwayVehicleModel vehicle) { vehicle.warningInfo = "暂不处理非修程修制改革车型"; return(vehicle); }
/// <summary> /// 修程修制改革车型计算核心 /// </summary> /// <param name="vehicle"></param> /// <returns></returns> public static RailwayVehicleModel ReDateProcessKernel(RailwayVehicleModel vehicle) { //需要设置int GenTp, //DateTime pre_depDate, //DateTime pre_facDate, //DateTime produceDate, //int SealSpan //计算上次段修距离上次厂修的时间差 //Gate用来储存时间差 int Gate_year = vehicle.previousDepotDate.Year - vehicle.previousFactoryDate.Year; int Gate_month = vehicle.previousDepotDate.Month - vehicle.previousFactoryDate.Month; decimal Gate_sum = Gate_year * 12 + Gate_month; //70t通用 if (vehicle.GenTpSelection == 0) { //此时开始判断是否需要加强段修。开始分类,判断特殊情况。 int predictFacDate = vehicle.previousFactoryDate.AddMonths(vehicle.SealDuration).Year + 8; if ((predictFacDate == 2020 || predictFacDate == 2021) && ((vehicle.previousFactoryDate.Year - vehicle.produceDate.Year) < 2)) { //GenTp = 2;//70t的特殊情况,需要加强段修.但后面不再需要GenTp此参数,由描述车型更精确的vehicle.GenType替代 vehicle.GenType = RailwayVehicleModel.vehicleGenType.Spc70t; vehicle.warningInfo += "\r\n70t特殊类型"; } else { vehicle.GenType = RailwayVehicleModel.vehicleGenType.Gen70t; vehicle.warningInfo += "\r\n70t通用类型"; } //段修修程为24个月 n为第几次段修 int n = (int)Math.Round(Convert.ToDouble(Gate_sum / 24), MidpointRounding.AwayFromZero);//四舍五入为了减少误差 //判断是否修正过 if (vehicle.previousDepotDate.Date != vehicle.previousFactoryDate.AddMonths(n * 24).Date) { vehicle.warningInfo = "\r\n前次段修数据经过修正,之前:" + vehicle.previousDepotDate + ";\r\n修正后:" + vehicle.previousFactoryDate.AddMonths(n * 24); } vehicle.previousDepotDate = vehicle.previousFactoryDate.AddMonths(n * 24); switch (vehicle.GenType) { case RailwayVehicleModel.vehicleGenType.Gen70t: //计算增加修程 //将前n次的24个月+剩下的4-n次的27个月加入到上次厂修 即可求出下次厂修时间 vehicle.nextFactoryDate = vehicle.previousFactoryDate.AddMonths((4 - n) * 27 + n * 24).AddMonths(vehicle.SealDuration); //拿修正后的段修时间+封存期,判断第n次段修是否在2020-2021修程修制改革时间内 DateTime sealEndTime = vehicle.previousDepotDate.AddMonths(vehicle.SealDuration); if (sealEndTime.Year == 2020 || sealEndTime.Year == 2021) { //在2020-2011期间,则先加两年再加3个月,得到下一次厂修日期 vehicle.currentDepotDate = sealEndTime.AddMonths(24).AddMonths(3); //vehicle.previousDepotDate.AddMonths(vehicle.SealDuration); vehicle.nextFactoryDate = vehicle.nextFactoryDate.AddMonths(3); vehicle.vNextDepotDate = vehicle.currentDepotDate.AddMonths(27); } else { //如果不在2020-2011,则按照正常算 //前面的FactoryDate不用算了 vehicle.currentDepotDate = sealEndTime.AddMonths(27); vehicle.vNextDepotDate = vehicle.currentDepotDate.AddMonths(27); } vehicle.n = n; break; case RailwayVehicleModel.vehicleGenType.Spc70t: //首先判断n是否为3,保险起见 if (n == 3) { //第一次做加强段修,不增加修程 //本次为加强段修,下次做厂修 vehicle.nextFactoryDate = vehicle.previousFactoryDate.AddMonths(24 * 5).AddMonths(vehicle.SealDuration); vehicle.enhanceDepotDate = vehicle.previousFactoryDate.AddYears(8).AddMonths(vehicle.SealDuration); vehicle.currentDepotDate = vehicle.enhanceDepotDate; vehicle.vNextDepotDate = vehicle.currentDepotDate.AddMonths(24); vehicle.n = n; } else { vehicle = null; } break; default: vehicle = null; break; } } //60t通用 else if (vehicle.GenTpSelection == 1) { vehicle.GenType = RailwayVehicleModel.vehicleGenType.Gen60t; //段修修程为18个月 n为第几次段修 int n = (int)Math.Round(Convert.ToDouble(Gate_sum / 18), MidpointRounding.AwayFromZero);//四舍五入为了减少误差 //计算增加修程 //将前n次的18个月+剩下的6-n次的20个月加入到上次厂修 即可求出下次厂修时间 vehicle.nextFactoryDate = vehicle.previousFactoryDate.AddMonths((6 - n) * 20 + n * 18).AddMonths(vehicle.SealDuration); //修正上次段修时间 if (vehicle.previousDepotDate.Date != vehicle.previousFactoryDate.AddMonths(n * 18).Date) { vehicle.warningInfo = "\r\n前次段修数据经过修正,之前:" + vehicle.previousDepotDate + ";\r\n修正后:" + vehicle.previousFactoryDate.AddMonths(n * 18); } vehicle.previousDepotDate = vehicle.previousFactoryDate.AddMonths(n * 18); //密封期 DateTime sealEndTime = vehicle.previousDepotDate.AddMonths(vehicle.SealDuration); if (sealEndTime.Year == 2020 || sealEndTime.Year == 2021) { //在2020-2011期间,则先加两年再加3个月,得到下一次厂修日期 vehicle.currentDepotDate = sealEndTime.AddMonths(18).AddMonths(2); vehicle.nextFactoryDate = vehicle.nextFactoryDate.AddMonths(2).AddMonths(vehicle.SealDuration); vehicle.vNextDepotDate = vehicle.currentDepotDate.AddMonths(20); } else { //如果不在2020-2011,则按照正常算 vehicle.currentDepotDate = vehicle.previousDepotDate.AddMonths(20).AddMonths(vehicle.SealDuration); vehicle.vNextDepotDate = vehicle.currentDepotDate.AddMonths(20); } vehicle.n = n; vehicle.warningInfo += "\r\n60t通用类型"; } else//其他车就不用改修程 { //其他车都是60t的车都是水泥罐之类的,1.5年修一次,5个段修,9年做一次厂修 //其他车暂时不写 vehicle = null; } return(vehicle); }