Files
zszq-trs/Framework/YLErp.Core/DBModels/EodTask.cs
T
2024-05-09 14:06:26 +08:00

329 lines
8.7 KiB
C#

using System.ComponentModel.DataAnnotations.Schema;
namespace YLErp.DBModels
{
/// <summary>
/// 收盘任务
/// </summary>
[Table("eod_task")]
public class EodTask : DBModelBaseV2
{
/// <summary>
/// 收盘开始日期
/// </summary>
public DateTime StartDate { get; set; }
/// <summary>
/// 收盘结束日期
/// </summary>
public DateTime EndDate { get; set; }
/// <summary>
/// 波动率类型
/// </summary>
public string VolTypes { get; set; }
public string ClientIds { get; set; }
[NotMapped]
public string ClientNameStr { get; set; }
[NotMapped]
public List<int> ListClientId { get; set; }
/// <summary>
/// 1=收盘价,2=结算价,3=收盘价+结算价
/// </summary>
public EodSettlePriceType PriceType { get; set; }
/// <summary>
/// 部分收盘标识
/// </summary>
public string PartFlag { get; set; }
/// <summary>
/// 收盘日期
/// </summary>
public DateTime ValueDate { get; set; }
/// <summary>
/// 任务状态(0:未开始,100成功结束)
/// </summary>
public EodTaskState TaskState { get; set; }
/// <summary>
/// 任务执行时间
/// </summary>
public DateTime TaskStartTime { get; set; }
/// <summary>
/// 任务结束时间
/// </summary>
public DateTime TaskEndTime { get; set; }
/// <summary>
/// 任务结果信息
/// </summary>
public string TaskResult { get; set; }
/// <summary>
/// 任务创建时间
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 创建人ID
/// </summary>
public int? CreatorId { get; set; }
/// <summary>
/// 创建人名称
/// </summary>
public string CreatorName { get; set; }
///// <summary>
///// 任务数据(用于部分收盘)
///// </summary>
//public string TaskData { get; set; }
/// <summary>
/// 步骤标识(1:跳过上日收盘检查)
/// </summary>
public byte StepFlag { get; set; }
/// <summary>
/// 错误提示(但不终止收盘,不要存入数据库,如果收很多天的历史盘会导致这个值特别长)
/// </summary>
[NotMapped]
public string ErrorTips { get; set; }
public EodTask Clone()
{
return (EodTask)MemberwiseClone();
}
/// <summary>
/// 是否延期交易
/// </summary>
public bool IsDelayTrade { get; set; }
/// <summary>
/// 设置普通错误,此任务可以重新启动
/// </summary>
public void SetFailure(string errorMsg)
{
TaskResult += errorMsg + Environment.NewLine;
if (TaskState < EodTaskState.completed && TaskState != EodTaskState.fatalError)
{
TaskState = EodTaskState.failure;
}
}
/// <summary>
/// 设置严重错误,此任务不能再重新启动
/// </summary>
public void SetFatalError(string errorMsg)
{
TaskResult += errorMsg + Environment.NewLine;
TaskState = EodTaskState.fatalError;
}
/// <summary>
/// 设置严重错误,此任务不能再重新启动
/// </summary>
public void SetError(bool isFatalError, string errorMsg)
{
if (isFatalError)
{
SetFatalError(errorMsg);
}
else if (TaskState != EodTaskState.fatalError)
{
SetFailure(errorMsg);
}
}
public override string ToString()
{
var priceType = "";
if (EodSettlePriceType.ClosePrice == (EodSettlePriceType.ClosePrice & PriceType))
{
priceType += "收盘价,";
}
if (EodSettlePriceType.SettlePrice == (EodSettlePriceType.SettlePrice & PriceType))
{
priceType += "结算价";
}
return $"[{id}][{StartDate:yyyy-MM-dd}-{EndDate:yyyy-MM-dd}][{VolTypes}][{priceType}][{TaskState}][{ValueDate:yyyy-MM-dd}]";
}
[NotMapped]
public IEnumerable<EodTaskDetail> Details { get; set; }
/// <summary>
/// 是否使用收盘价
/// </summary>
public bool UseClosePrice() => EodSettlePriceType.ClosePrice == (EodSettlePriceType.ClosePrice & PriceType);
/// <summary>
/// 是否使用结算价
/// </summary>
public bool UseSettlePrice() => EodSettlePriceType.SettlePrice == (EodSettlePriceType.SettlePrice & PriceType);
}
/// <summary>
/// 收盘任务
/// </summary>
[Table("eod_task_detail")]
public class EodTaskDetail
{
public long id { get; set; }
public long TaskId { get; set; }
/// <summary>
/// 收盘日期
/// </summary>
public DateTime ValueDate { get; set; }
/// <summary>
/// 收盘开始日期
/// </summary>
public DateTime StartTime { get; set; }
/// <summary>
///
/// </summary>
public int ElapsedMilliseconds { get; set; }
public override string ToString()
{
return $"[{TaskId}][{ValueDate:yyyy-MM-dd}][{StartTime:yyyy-MM-dd HH:mm:ss}][{ElapsedMilliseconds}毫秒]";
}
public EodTaskDetail Clone()
{
return (EodTaskDetail)MemberwiseClone();
}
}
[NotMapped]
public class EodTaskDetailDto : EodTaskDetail
{
}
/// <summary>
/// 收盘任务状态
/// </summary>
public enum EodTaskState
{
/// <summary>
/// 等待中
/// </summary>
pending = 0,
/// <summary>
/// 执行中
/// </summary>
running = 1,
/// <summary>
/// 完成
/// </summary>
completed = 100,
/// <summary>
/// 取消中
/// </summary>
canceling = 101,
/// <summary>
/// 被取消(可以继续或重新开始)
/// </summary>
canceled = 102,
/// <summary>
/// 执行被中断
/// </summary>
interrupted = 103,
/// <summary>
/// 执行失败(可以继续或重新开始)
/// </summary>
failure = 110,
/// <summary>
/// 致命错误(比如任务参数不符合要求,不可以继续或重新开始)
/// </summary>
fatalError = 200,
/// <summary>
/// 已过期
/// </summary>
outOfDate = 300,
}
/// <summary>
/// 结算价类型
/// </summary>
public enum EodSettlePriceType : byte
{
ClosePrice = 1,
SettlePrice = 2,
AllPrices = ClosePrice | SettlePrice
}
public static class EodTaskHelper
{
public static string GetEodTaskStateDesc(EodTaskState state)
{
switch (state)
{
case EodTaskState.pending:
return "等待中";
case EodTaskState.running:
return "执行中";
case EodTaskState.interrupted:
return "执行被中断";
case EodTaskState.completed:
return "已完成";
case EodTaskState.failure:
return "执行失败";
case EodTaskState.canceling:
return "执行取消中";
case EodTaskState.canceled:
return "执行被取消";
case EodTaskState.fatalError:
return "严重错误";
case EodTaskState.outOfDate:
return "过期任务";
default: return state.ToString();
}
}
public static string GetEodPriceTypeDesc(EodSettlePriceType priceType)
{
switch (priceType)
{
case EodSettlePriceType.ClosePrice:
return "收盘价";
case EodSettlePriceType.SettlePrice:
return "结算价";
case EodSettlePriceType.AllPrices:
return "收盘价,结算价";
default: return "未知";
}
}
public static bool IsValidPartFlag(string partFlag)
{
return string.IsNullOrWhiteSpace(partFlag) || Array.IndexOf(new[] { "全部", "场外", "场内" }, partFlag) >= 0;
}
}
}