logic.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. from model import Wannianli, WannianliJieqi
  2. from tools import *
  3. from yixue import *
  4. def get_last_day_info(year: int):
  5. dt = Wannianli.select().where(Wannianli.nian == year, Wannianli.yue == 12, Wannianli.ri == 31)
  6. data = dt[0]
  7. if data.ri_gan == "":
  8. return None
  9. else:
  10. return data
  11. def _do_update_ri_by_year(year: int, start_rigan: str, start_rizhi: str):
  12. last_rigan = start_rigan
  13. last_rizhi = start_rizhi
  14. for month in range(1, 13):
  15. max_day = get_max_day(year, month)
  16. print("处理", year, month, "月数据")
  17. for day in range(1, max_day + 1):
  18. if month == 1 and day == 1:
  19. rigan = last_rigan
  20. rizhi = last_rizhi
  21. else:
  22. rigan = next_tiangan(last_rigan)
  23. rizhi = next_dizhi(last_rizhi)
  24. last_rigan = rigan
  25. last_rizhi = rizhi
  26. Wannianli.update({
  27. "ri_gan": rigan,
  28. "ri_zhi": rizhi,
  29. }).where(Wannianli.nian == year, Wannianli.yue == month, Wannianli.ri == day).execute()
  30. print("update over last:", last_rigan, last_rizhi)
  31. def update_ri_by_year(year: int):
  32. start = Wannianli.select().where(Wannianli.nian == year, Wannianli.yue == 1, Wannianli.ri == 1)
  33. start_data = start[0]
  34. if start_data.ri_gan == "":
  35. print(year, "1月1日未配置初始值,从上一年取得数据")
  36. last_year = get_last_day_info(year - 1)
  37. if last_year is not None:
  38. print("上一年最后一天是", last_year.ri_gan, last_year.ri_zhi)
  39. next_rigan = next_tiangan(last_year.ri_gan)
  40. next_rizhi = next_dizhi(last_year.ri_zhi)
  41. print("新年第一天的开始是", next_rigan, next_rizhi)
  42. _do_update_ri_by_year(year, next_rigan, next_rizhi)
  43. else:
  44. print("上一年也没数据")
  45. else:
  46. _do_update_ri_by_year(year, start_data.ri_gan, start_data.ri_zhi)
  47. def get_wannianli_data(year: int, month: int, day: int):
  48. dt = Wannianli.select().where(Wannianli.nian == year, Wannianli.yue == month, Wannianli.ri == day)
  49. if len(dt) > 0:
  50. return dt[0]
  51. else:
  52. print(year, month, day, "has empty data")
  53. return None
  54. def get_jieqi_of_month(jieqi: WannianliJieqi, month: int):
  55. ary = [jieqi.xiaohan, jieqi.lichun, jieqi.jingzhe, jieqi.qingming, jieqi.lixia,
  56. jieqi.mangzhong, jieqi.xiaoshu, jieqi.liqiu, jieqi.bailu, jieqi.hanlu,
  57. jieqi.lidong, jieqi.daxue]
  58. return ary[month - 1]
  59. def _do_update_yue_by_year(year: int, month: int, start_yuegan: str, start_yuezhi: str):
  60. jieqi = WannianliJieqi.select().where(WannianliJieqi.nianfen == year)
  61. jieqi_day = get_jieqi_of_month(jieqi[0], month)
  62. print("处理", year, month, "月数据, 节气日期是:", jieqi_day)
  63. key_day = str(jieqi_day).split(".")[1]
  64. max_day = get_max_day(year, month)
  65. for day in range(1, max_day + 1):
  66. if day < int(key_day):
  67. yuegan = start_yuegan
  68. yuezhi = start_yuezhi
  69. else:
  70. yuegan = next_tiangan(start_yuegan)
  71. yuezhi = next_dizhi(start_yuezhi)
  72. # print(year, month, day, yuegan, yuezhi)
  73. Wannianli.update({
  74. "yue_gan": yuegan,
  75. "yue_zhi": yuezhi,
  76. }).where(Wannianli.nian == year, Wannianli.yue == month, Wannianli.ri == day).execute()
  77. print("update month over ", year, month)
  78. def prepare_yue_data(year: int, month: int):
  79. if month == 1:
  80. print(year, month, "月份未配置初始值,从上年12月取得数据")
  81. last_month = get_wannianli_data(year - 1, 12, 31)
  82. else:
  83. print(year, month, "月份未配置初始值,从当年上个月取得数据")
  84. max_day = get_max_day(year, month - 1)
  85. last_month = get_wannianli_data(year, month - 1, max_day)
  86. if last_month.yue_gan == "":
  87. print("未取得合适的数据", year, month, ",请检查上年12月或本年上个月的数据是否已录入")
  88. return False
  89. else:
  90. _do_update_yue_by_year(year, month, last_month.yue_gan, last_month.yue_zhi)
  91. return True
  92. def update_yue_by_year(year: int):
  93. for month in range(1, 13):
  94. start = Wannianli.select().where(Wannianli.nian == year, Wannianli.yue == month, Wannianli.ri == 1)
  95. start_data = start[0]
  96. if start_data.yue_gan == "":
  97. if not prepare_yue_data(year, month):
  98. break
  99. else:
  100. if year == 1901 and month == 1:
  101. _do_update_yue_by_year(year, month, start_data.yue_gan, start_data.yue_zhi)
  102. else:
  103. if not prepare_yue_data(year, month):
  104. break
  105. def _do_update_nian_by_year(year: int, start_niangan: str, start_nianzhi: str):
  106. jieqi = WannianliJieqi.select().where(WannianliJieqi.nianfen == year)
  107. jieqi_key = str(jieqi[0].chuxi).split(".")
  108. jieqi_month = int(jieqi_key[0])
  109. jieqi_day = int(jieqi_key[1])
  110. for month in range(1, 13):
  111. max_day = get_max_day(year, month)
  112. for day in range(1, max_day + 1):
  113. niangan = ""
  114. nianzhi = ""
  115. if month < jieqi_month:
  116. niangan = start_niangan
  117. nianzhi = start_nianzhi
  118. elif month == jieqi_month:
  119. if day > jieqi_day:
  120. niangan = next_tiangan(start_niangan)
  121. nianzhi = next_dizhi(start_nianzhi)
  122. else:
  123. niangan = start_niangan
  124. nianzhi = start_nianzhi
  125. elif month > jieqi_month:
  126. niangan = next_tiangan(start_niangan)
  127. nianzhi = next_dizhi(start_nianzhi)
  128. Wannianli.update({
  129. "nian_gan": niangan,
  130. "nian_zhi": nianzhi,
  131. }).where(Wannianli.nian == year, Wannianli.yue == month, Wannianli.ri == day).execute()
  132. print(year, month, "年数据更新完成")
  133. def update_nian_by_year(year: int):
  134. start = Wannianli.select().where(Wannianli.nian == year, Wannianli.yue == 1, Wannianli.ri == 1)
  135. start_data = start[0]
  136. if start_data.nian_gan == "":
  137. print("没有1月1日数据,从上一年取数")
  138. last_year = get_wannianli_data(year - 1, 12, 31)
  139. if last_year is not None:
  140. _do_update_nian_by_year(year, last_year.nian_gan, last_year.nian_zhi)
  141. else:
  142. _do_update_nian_by_year(year, start_data.nian_gan, start_data.nian_zhi)
  143. def get_hour_of_day(day_tiangan: str, hour: int):
  144. start_tiangan = get_tiangan_start_of_hour(day_tiangan)
  145. tiangan = get_tiangan_by_hour(start_tiangan, hour)
  146. dizhi = get_dizhi_by_hour(hour)
  147. return [tiangan, dizhi]