using BaseOUDAL; using Qdp.Foundation.Implementations; using YLErp.QdpModule; namespace YLErp.Modules.DictionaryModule { public class DictionarySerivice { readonly ErpBaseContext basedb = new(); public DateTime GetForwardDateType(DateTime dateTime, int lastMonth, int lastDay, ForwardDateTypeEnum typeEnum, bool isbefore) { dateTime = dateTime.AddMonths(-lastMonth); var t = typeEnum == 0 ? ("", new DateTime()) : GetWeekInfoByMonth(dateTime, lastMonth, lastDay); var number = WeekStrToNumber(t.Item1); switch (typeEnum) { case ForwardDateTypeEnum.交易日: //取下一个月第一天 dateTime = new Date(dateTime.Year, dateTime.Month, 1); dateTime = dateTime.AddMonths(1); dateTime = QdpCalendarHelper.GetNonHoliday(dateTime); for (var i = 0; i < lastDay; i++)//OTC-5942 上一个月倒数第一个交易日 { dateTime = QdpCalendarHelper.GetNonHolidayDefore(dateTime.AddDays(-1)); } break; case ForwardDateTypeEnum.星期一: dateTime = GetWeekDateTime(t.Item2.AddDays(number >= 1 ? 7 - number + 1 : 1 - number), isbefore); break; case ForwardDateTypeEnum.星期二: dateTime = GetWeekDateTime(t.Item2.AddDays(number >= 2 ? 7 - number + 2 : 2 - number), isbefore); break; case ForwardDateTypeEnum.星期三: dateTime = GetWeekDateTime(t.Item2.AddDays(number >= 3 ? 7 - number + 3 : 3 - number), isbefore); break; case ForwardDateTypeEnum.星期四: dateTime = GetWeekDateTime(t.Item2.AddDays(number >= 4 ? 7 - number + 4 : 4 - number), isbefore); break; case ForwardDateTypeEnum.星期五: dateTime = GetWeekDateTime(t.Item2.AddDays(number >= 5 ? 7 - number + 5 : 5 - number), isbefore); break; case ForwardDateTypeEnum.星期六: dateTime = GetWeekDateTime(t.Item2.AddDays(number >= 6 ? 7 - number + 6 : 6 - number), isbefore); break; case ForwardDateTypeEnum.星期日: dateTime = GetWeekDateTime(t.Item2.AddDays(number >= 7 ? 7 - number + 7 : 7 - number), isbefore); break; } return dateTime; } public DateTime GetWeekDateTime(DateTime date, bool isAfter = true) { if (QdpCalendarHelper.IsHoliday(date)) { date = date.AddDays(isAfter ? -1 : 1); return GetWeekDateTime(date, isAfter); } else { return date; } } public int WeekStrToNumber(string weekStr) { var number = 0; switch (weekStr) { case "Monday": number = 1; break; case "Tuesday": number = 2; break; case "Wednesday": number = 3; break; case "Thursday": number = 4; break; case "Friday": number = 5; break; case "Saturday": number = 6; break; case "Sunday": number = 7; break; } return number; } public string NumberToWeekStr(int number) { var weekStr = ""; switch (number) { case (int)ForwardDateTypeEnum.交易日: weekStr = "交易日"; break; case (int)ForwardDateTypeEnum.星期一: weekStr = "星期一"; break; case (int)ForwardDateTypeEnum.星期二: weekStr = "星期二"; break; case (int)ForwardDateTypeEnum.星期三: weekStr = "星期三"; break; case (int)ForwardDateTypeEnum.星期四: weekStr = "星期四"; break; case (int)ForwardDateTypeEnum.星期五: weekStr = "星期五"; break; case (int)ForwardDateTypeEnum.星期六: weekStr = "星期六"; break; case (int)ForwardDateTypeEnum.星期日: weekStr = "星期日"; break; default: break; } return weekStr; } public (string, DateTime) GetWeekInfoByMonth(DateTime dateTime, int month, int lastDay) { if (month == 0) { var endWeekStr = dateTime.DayOfWeek.ToString(); var beforeWeekDay = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day); beforeWeekDay = beforeWeekDay.AddDays(-(lastDay * 7)); return (endWeekStr, beforeWeekDay); } else { var monthEndDate = new DateTime(dateTime.Year, dateTime.Month, 1); monthEndDate = monthEndDate.AddMonths(1).AddDays(-1); //获取最后一天星期几 var endWeekStr = monthEndDate.DayOfWeek.ToString(); var beforeWeekDay = new DateTime(dateTime.Year, dateTime.Month, monthEndDate.Day); beforeWeekDay = beforeWeekDay.AddDays(-(lastDay * 7)); return (endWeekStr, beforeWeekDay); } } public Dictionary GetForwardDateNameDic() { //标的交割月前 { 【】 }个月倒数第 { 【】 }个 { 交易日 / 星期【】} var dicStr = new Dictionary { { "期权到期日", "期权到期日" }, { "标的到期日", "标的到期日" } }; var dictionaryModel = basedb.Dictionaries.FirstOrDefault(d => d.Name == "累计转远期到期日类型"); if (dictionaryModel != null) { var dictionaryItemModels = basedb.DictionaryItems.Where(l => l.DictId == dictionaryModel.Id).ToList(); if (dictionaryItemModels != null && dictionaryItemModels.Any()) { foreach (var dictionaryItemModel in dictionaryItemModels) { var str = ""; if (int.Parse(dictionaryItemModel.Name) == 1) { //标的交割月在前一月 0代表交易日 if (dictionaryItemModel.ShortName.Split(',')[1] == "0") { //适应以前规则 str = string.Format("标的交割月前{0}{1}", NumberHelper.CurrToChnInt(int.Parse(dictionaryItemModel.ShortName.Split(',')[0])), NumberToWeekStr(int.Parse(dictionaryItemModel.ShortName.Split(',')[1]))); } else { str = string.Format("标的交割月前倒数第{0}个{1}{2}", NumberHelper.CurrToChnInt(int.Parse(dictionaryItemModel.ShortName.Split(',')[0])), NumberToWeekStr(int.Parse(dictionaryItemModel.ShortName.Split(',')[1])), dictionaryItemModel.ShortName.Split(',')[2] == "0" ? "(向前调整)" : "(向后调整)"); } } else { if (dictionaryItemModel.ShortName.Split(',')[1] == "0") { str = string.Format("标的交割月前{0}个月倒数第{1}个{2}", NumberHelper.CurrToChnInt(int.Parse(dictionaryItemModel.Name)), NumberHelper.CurrToChnInt(int.Parse(dictionaryItemModel.ShortName.Split(',')[0])), NumberToWeekStr(int.Parse(dictionaryItemModel.ShortName.Split(',')[1]))); } else { str = string.Format("标的交割月前{0}个月倒数第{1}个{2}{3}", NumberHelper.CurrToChnInt(int.Parse(dictionaryItemModel.Name)), NumberHelper.CurrToChnInt(int.Parse(dictionaryItemModel.ShortName.Split(',')[0])), NumberToWeekStr(int.Parse(dictionaryItemModel.ShortName.Split(',')[1])), dictionaryItemModel.ShortName.Split(',')[2] == "0" ? "(向前调整)" : "(向后调整)"); } } dicStr.Add(str, str); } } } return dicStr; } public Dictionary GetForwardDateDic() { var dictionaryModel = basedb.Dictionaries.FirstOrDefault(d => d.Name == "累计转远期到期日类型"); var dicStr = new Dictionary(); if (dictionaryModel != null) { var dictionaryItemModels = basedb.DictionaryItems.Where(l => l.DictId == dictionaryModel.Id).ToList(); //标的交割月前 { 【】 }个月倒数第 { 【】 }个 { 交易日 / 星期【】} if (dictionaryItemModels != null && dictionaryItemModels.Any()) { foreach (var dictionaryItemModel in dictionaryItemModels) { var str = ""; if (int.Parse(dictionaryItemModel.Name) == 1) { //标的交割月在前一月 0代表交易日 if (dictionaryItemModel.ShortName.Split(',')[1] == "0") { //适应以前规则 str = string.Format("标的交割月前{0}{1}", NumberHelper.CurrToChnInt(int.Parse(dictionaryItemModel.ShortName.Split(',')[0])), NumberToWeekStr(int.Parse(dictionaryItemModel.ShortName.Split(',')[1]))); } else { str = string.Format("标的交割月前倒数第{0}个{1}{2}", NumberHelper.CurrToChnInt(int.Parse(dictionaryItemModel.ShortName.Split(',')[0])), NumberToWeekStr(int.Parse(dictionaryItemModel.ShortName.Split(',')[1])), dictionaryItemModel.ShortName.Split(',')[2] == "0" ? "(向前调整)" : "(向后调整)"); } } else { //不在当月 if (dictionaryItemModel.ShortName.Split(',')[1] == "0") { str = string.Format("标的交割月前{0}个月倒数第{1}个{2}", NumberHelper.CurrToChnInt(int.Parse(dictionaryItemModel.Name)), NumberHelper.CurrToChnInt(int.Parse(dictionaryItemModel.ShortName.Split(',')[0])), NumberToWeekStr(int.Parse(dictionaryItemModel.ShortName.Split(',')[1]))); } else { str = string.Format("标的交割月前{0}个月倒数第{1}个{2}{3}", NumberHelper.CurrToChnInt(int.Parse(dictionaryItemModel.Name)), NumberHelper.CurrToChnInt(int.Parse(dictionaryItemModel.ShortName.Split(',')[0])), NumberToWeekStr(int.Parse(dictionaryItemModel.ShortName.Split(',')[1])), dictionaryItemModel.ShortName.Split(',')[2] == "0" ? "(向前调整)" : "(向后调整)"); } } dicStr.Add(dictionaryItemModel.Id, str); } } } return dicStr; } } public enum ForwardDateTypeEnum { 交易日 = 0, 星期一 = 1, 星期二 = 2, 星期三 = 3, 星期四 = 4, 星期五 = 5, 星期六 = 6, 星期日 = 7, } }