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