留点什么?希望别人有用……
一天分成多个时间段,各个时段不同的费用,以前在小软件上有做个类似的,但现在发觉之前的方法还是有点小问题了,
而今无聊之余,重新整理思绪,算是做了些优化吧
源码:https://download.csdn.net/download/wysdong/10883293 (源码加上去,就不能删!~,所有源码的类CalcM,还是用文章后面的吧)
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CLib
{
public class CalcM
{
public CalcM()
{
}
///
#region 计费参数
///
///
///
set
{
_oneDayMaxCost = value;
}
}
///
///
set
{
_idayType = value;
}
}
///
///
set
{
_iMinTime = value;
}
}
///
set
{
_iFirstType = value;
}
}
///
set
{
_firstHour = value;
}
}
///
set
{
_firstCash = value;
}
}
///
set
{
_iAfter24H = value;
}
}
#endregion
#region 计算费用
int iDayIndex = 1;
///
#region
if (decimal.Parse(ST.ToString("yyMMddHHmm")) >= decimal.Parse(OT.ToString("yyMMddHHmm")))
{
rt.result = "FAIL";
rt.errcode = "-1";
rt.errmsg = "停车的起始时间>=截止时间,无法计算。";
result = Newtonsoft.Json.JsonConvert.SerializeObject(rt);
return result;
}
TimeSpan ts = OT.Subtract(ST);
rt.iHour = decimal.Parse(ts.TotalHours.ToString("f2"));
if (ts.Days > 0)
{
StopTimeInfo += ts.Days.ToString() + "天";
}
if (ts.Hours > 0)
{
StopTimeInfo += ts.Hours.ToString() + "小时";
}
if (ts.Minutes > 0)
{
StopTimeInfo += ts.Minutes.ToString() + "分钟";
}
#endregion
DateTime _ST = ST;
DateTime _OT = OT;
while (decimal.Parse(_ST.ToString("yyMMdd")) <= decimal.Parse(_OT.ToString("yyMMdd")))
{
decimal OneDayCash = 0;//计算某一天的费用
if (ST.ToString("yyMMdd") == OT.ToString("yyMMdd"))
{
OneDayCash = CalcOneDayCast(ST, OT, ref alist, true);
if (OneDayCash == -100)
{
rt.result = "FAIL";
rt.errcode = "-2";
rt.errmsg = "计费出错:" + ExceptionInfo;
result = Newtonsoft.Json.JsonConvert.SerializeObject(rt);
return result;
}
_CalcM += OneDayCash;
}
else
{
#region
if (_ST.ToString("yyMMdd") == ST.ToString("yyMMdd"))
{
#region 起始一天
DateTime _temDT = DateTime.Parse(_ST.ToString("yyyy-MM-dd 23:59:59"));
OneDayCash = CalcOneDayCast(ST, _temDT, ref alist, true);
if (OneDayCash == -100)
{
rt.result = "FAIL";
rt.errcode = "-3";
rt.errmsg = "计费出错:" + ExceptionInfo;
result = Newtonsoft.Json.JsonConvert.SerializeObject(rt);
return result;
}
_CalcM += OneDayCash;
#endregion
}
else if (_ST.ToString("yyMMdd") == OT.ToString("yyMMdd"))
{
#region 最后一天
DateTime _temDT = DateTime.Parse(_ST.ToString("yyyy-MM-dd 00:00:00"));
OneDayCash = CalcOneDayCast(_temDT, OT, ref alist, false);
if (OneDayCash == -100)
{
rt.result = "FAIL";
rt.errcode = "-4";
rt.errmsg = "计费出错:" + ExceptionInfo;
result = Newtonsoft.Json.JsonConvert.SerializeObject(rt);
return result;
}
_CalcM += OneDayCash;
#endregion
}
else
{
#region 一整天
if (idayType == 2)
{
//errmsg = "超过1天,按收费标准重新计费:";
//重新按计费标准计费
DateTime tem_beg = DateTime.Parse(_ST.ToString("yyyy-MM-dd 00:00:00"));
DateTime tem_end = DateTime.Parse(_ST.ToString("yyyy-MM-dd 23:59:00"));
OneDayCash = CalcOneDayCast(tem_beg, tem_end, ref alist, false);
if (OneDayCash == -100)
{
rt.result = "FAIL";
rt.errcode = "-5";
rt.errmsg = "计费出错:" + ExceptionInfo;
result = Newtonsoft.Json.JsonConvert.SerializeObject(rt);
return result;
}
}
else
{
OneDayCash = idayMoney;
if (OneDayCash > OneDayMaxCost)
{
OneDayCash = OneDayMaxCost;
errmsg = "------>:" + iDayIndex.ToString() + "、" + _ST.ToString("yyyyMMdd") + "单天超过最高收费标准" + OneDayMaxCost.ToString("f2") + ",按最高标准收费。:<-----";
alist.Add(errmsg);
}
else
{
errmsg = "------>:" + iDayIndex.ToString() + "、" + _ST.ToString("yyyyMMdd") + "一整天的费用为" + idayMoney.ToString() + " :<-----";
alist.Add(errmsg);
}
iDayIndex++;
}
_CalcM += OneDayCash;
#endregion
}
#endregion
}
_ST = _ST.AddDays(1);
}
}
catch (Exception ex)
{
rt.result = "FAIL";
rt.errcode = "-6";
rt.errmsg = "计费出错:" + ex.Message;
}
rt.paycash = _CalcM;
alist.Add("{ " + ST.ToString("yyyy-MM-dd HH:mm:00") + " " + OT.ToString("yyyy-MM-dd HH:mm:00") + " 共停车 " + StopTimeInfo + ",合计费用:" + _CalcM.ToString("f2") + " }");
rt.alist = alist;
result = Newtonsoft.Json.JsonConvert.SerializeObject(rt);
return result;
}
#endregion
#region 计算一天内时段的费用
///
#region
string errmsg = "";
decimal OneDayValue = 0;
_OT = DateTime.Parse(_ST.ToString("yyyy-MM-dd ") + _OT.ToString("HH:mm:00"));
TimeSpan ts = _OT.Subtract(_ST);
alist.Add("------>:" + iDayIndex.ToString() + "、" + _ST.ToString("yyyy-MM-dd HH:mm:00") + " " + _OT.ToString("yyyy-MM-dd HH:mm:00"));
bool boReturn = false;
if (boFirstDay || iAfter24H == 0)
{
//第一天或都重新计费
if (ts.TotalMinutes < FreeMinute)
{
alist.Add(ts.TotalMinutes.ToString() + "小于" + FreeMinute.ToString() + "不收费。");
boReturn = true;
//return OneDayValue;
}
else if (ts.TotalMinutes <= firstHour * 60)
{
OneDayValue += firstCash;
alist.Add("超过" + FreeMinute.ToString() + "分钟,在" + firstHour.ToString() + "小时内" + firstCash.ToString() + "元");
boReturn = true;
// return OneDayValue;
}
else
{
_ST = _ST.AddHours(firstHour);
OneDayValue += firstCash;
alist.Add("超过" + FreeMinute.ToString() + "分钟,在" + firstHour.ToString() + "小时内" + firstCash.ToString() + "元");
}
}
if (!boReturn)
{
#region 停车时间在同一天内
decimal _H_Start = decimal.Parse(_ST.ToString("HHmm"));
decimal _H_End = decimal.Parse(_OT.ToString("HHmm"));
alist.Add(_ST.ToString("HH:mm") + " VS " + _OT.ToString("HH:mm"));
//TimeSpan ts = _OT.Subtract(_ST);
//消费在一天内
for (int i = 0; i < timelist.Count; i++)
{
#region
// _timelist.Add("00:00&08:00&4");
string[] spt = timelist[i].ToString().Split(new char[] { '&' });
DateTime _StartDT = DateTime.Parse(_ST.ToString("yyyy-MM-dd") + " " + spt[0]);
DateTime _EndDT = DateTime.Parse(_ST.ToString("yyyy-MM-dd") + " " + spt[1]);
decimal _C_Start = decimal.Parse(spt[0].Replace(":", "").Trim());
decimal _C_End = decimal.Parse(spt[1].Replace(":", "").Trim());
decimal _SpCash = decimal.Parse(spt[2]);
//_H_Start06:00; _C_Start:8:00; _H_End:10:00; _C_End:12:00
if (_H_Start <= _C_Start && _H_End >= _C_Start && _H_End <= _C_End)
{
//消费起始时间小于时段起始时间,消费截止时间在时段内
ts = _OT.Subtract(_StartDT);
decimal Dvalue = _SpCash * decimal.Parse(ts.TotalHours.ToString());
OneDayValue += Dvalue;
errmsg = " " + (i + 1).ToString() + "、" + _StartDT.ToString("HH:mm") + " " + _EndDT.ToString("HH:mm") + " { " + _StartDT.ToString("HH:mm") + " " + _OT.ToString("HH:mm") + " } 耗时" + ts.TotalHours.ToString("f2") + "小时,单价" + _SpCash.ToString("f2") + ",合计费用为" + Dvalue.ToString("f2") + "; \n";
alist.Add(errmsg);
}
else if (_C_Start >= _H_Start && _C_Start <= _H_End)// (_H_Start >= _C_Start && _H_End<= _C_End)
{
//整个时段内在消费
ts = _EndDT.Subtract(_StartDT);
decimal Dvalue = _SpCash * decimal.Parse(ts.TotalHours.ToString());
OneDayValue += Dvalue;
errmsg = " " + (i + 1).ToString() + "、" + _StartDT.ToString("HH:mm") + " " + _EndDT.ToString("HH:mm") + " { " + _StartDT.ToString("HH:mm") + " " + _EndDT.ToString("HH:mm") + " } 耗时" + ts.TotalHours.ToString("f2") + "小时,单价" + _SpCash.ToString("f2") + ",合计费用为" + Dvalue.ToString("f2") + "; \n";
alist.Add(errmsg);
}
else if (_H_Start >= _C_Start && _H_End <= _C_End)
{
//消费在时段内
ts = _OT.Subtract(_ST);
decimal Dvalue = _SpCash * decimal.Parse(ts.TotalHours.ToString());
OneDayValue += Dvalue;
errmsg = " " + (i + 1).ToString() + "、" + _StartDT.ToString("HH:mm") + " " + _EndDT.ToString("HH:mm") + " { " + _ST.ToString("HH:mm") + " " + _OT.ToString("HH:mm") + " } 耗时" + ts.TotalHours.ToString("f2") + "小时,单价" + _SpCash.ToString("f2") + ",合计费用为" + Dvalue.ToString("f2") + "; \n";
alist.Add(errmsg);
}
else if (_H_Start >= _C_Start && _H_Start <= _C_End &&
_H_End >= _C_Start && _H_End >= _C_End)
{
//消费起始时间在时段内,消费截止时间大于结束时间
ts = _EndDT.Subtract(_ST);
decimal Dvalue = _SpCash * decimal.Parse(ts.TotalHours.ToString());
OneDayValue += Dvalue;
errmsg = " " + (i + 1).ToString() + "、" + _StartDT.ToString("HH:mm") + " " + _EndDT.ToString("HH:mm") + " { " + _ST.ToString("HH:mm") + " " + _EndDT.ToString("HH:mm") + " } 耗时" + ts.TotalHours.ToString("f2") + "小时,单价" + _SpCash.ToString("f2") + ",合计费用为" + Dvalue.ToString("f2") + "; \n";
alist.Add(errmsg);
}
#endregion
}
#endregion
}
if (OneDayValue > OneDayMaxCost)
{
errmsg = _ST.ToString("yyyy-MM-dd") + "单天费用" + OneDayValue.ToString("f2") + "超过最高收费标准" + OneDayMaxCost.ToString("f2") + ",按最高标准收费。:<-----";
OneDayValue = OneDayMaxCost;
alist.Add(errmsg);
}
else
{
alist.Add(_ST.ToString("yyyy-MM-dd") + "当天合计费用:" + OneDayValue.ToString("f2") + " :<-----");
}
iDayIndex++;
return OneDayValue;
#endregion
}
catch (Exception ex)
{
ExceptionInfo = ex.Message;
return -100;
}
}
#endregion
}
///
///
///