329 lines
8.7 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|