AutoClosePeriod.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: leo
  5. * Date: 2018/5/18
  6. * Time: 下午4:53
  7. */
  8. namespace common\helpers\bonus;
  9. use common\helpers\Cache;
  10. use common\helpers\Date;
  11. use common\models\forms\PeriodForm;
  12. use common\models\Period;
  13. use yii\base\BaseObject;
  14. use yii\base\StaticInstanceTrait;
  15. class AutoClosePeriod extends BaseObject
  16. {
  17. use StaticInstanceTrait;
  18. const CACHE_PERIOD_NUM_KEY = 'autoClosePeriodNum';
  19. const CACHE_PERIOD_CLOSE_STATUS_KEY = 'autoClosePeriodCloseStatus';
  20. const CACHE_CLOSE_PERIOD_TIME_KEY = 'autoCloseClosePeriodTime';
  21. const CLOSE_PERIOD_STATUS_NORMAL = 1;
  22. const CLOSE_PERIOD_STATUS_CLOSING = 2;
  23. private $_closeInfo;
  24. public function init()
  25. {
  26. parent::init();
  27. }
  28. /**
  29. * 自动封期
  30. * @throws \yii\db\Exception
  31. */
  32. public function autoClose(){
  33. if($this->isAutoClose()){
  34. if($this->isToCloseTime()){
  35. // 把正在封期状态设置为正在封期
  36. $this->setClosingStat();
  37. $formModel = new PeriodForm();
  38. $formModel->scenario = 'autoClose';
  39. $formModel->periodNum = $this->_closeInfo['periodNum'];
  40. $formModel->autoClosePeriod();
  41. // 更新新的缓存
  42. $this->setCloseTimeAndPeriodStat();
  43. }
  44. }
  45. }
  46. /**
  47. * 获取当前系统是否自动封期
  48. * @return bool
  49. */
  50. public function isAutoClose(){
  51. $systemConfig = Cache::getSystemConfig();
  52. return boolval($systemConfig['autoClosePeriod']['VALUE']);
  53. }
  54. /**
  55. * 判断是否到达可以封期
  56. * @return bool
  57. */
  58. public function isToCloseTime(){
  59. $closeInfo = $this->_closeInfo = self::getCloseTimeAndPeriodStat();
  60. if($closeInfo['periodCloseStatus'] == self::CLOSE_PERIOD_STATUS_CLOSING){
  61. return false;
  62. }
  63. if(Date::nowTime() < $closeInfo['closePeriodTime']){
  64. return false;
  65. }
  66. return true;
  67. }
  68. /**
  69. * 从缓存中获取封期状态和封期时间
  70. * @return array
  71. */
  72. public function getCloseTimeAndPeriodStat(){
  73. $periodNum = \Yii::$app->redis->get(self::CACHE_PERIOD_NUM_KEY);
  74. $periodCloseStatus = \Yii::$app->redis->get(self::CACHE_PERIOD_CLOSE_STATUS_KEY);
  75. $closePeriodTime = \Yii::$app->redis->get(self::CACHE_CLOSE_PERIOD_TIME_KEY);
  76. if((!$periodNum) || (!$periodCloseStatus) || (!$closePeriodTime)){
  77. return $this->setCloseTimeAndPeriodStat();
  78. }
  79. return [
  80. 'periodNum' => $periodNum,
  81. 'periodCloseStatus' => $periodCloseStatus,
  82. 'closePeriodTime' => $closePeriodTime,
  83. ];
  84. }
  85. /**
  86. * 设置下次封期时间和把本期封期状态设置为正常存入缓存
  87. * @return array
  88. */
  89. public function setCloseTimeAndPeriodStat(){
  90. // 先把封期状态设置为正常
  91. $periodCloseStatus = self::CLOSE_PERIOD_STATUS_NORMAL;
  92. \Yii::$app->redis->set(self::CACHE_PERIOD_CLOSE_STATUS_KEY, $periodCloseStatus);
  93. // 找到最近的未封期的期数
  94. $periodModel = Period::instance();
  95. $periodNum = $periodModel->getNowPeriodNum();
  96. \Yii::$app->redis->set(self::CACHE_PERIOD_NUM_KEY, $periodNum);
  97. $closePeriodTime = $periodModel->getNowPeriodEnd();
  98. \Yii::$app->redis->set(self::CACHE_CLOSE_PERIOD_TIME_KEY, $closePeriodTime);
  99. return [
  100. 'periodNum' => $periodNum,
  101. 'periodCloseStatus' => $periodCloseStatus,
  102. 'closePeriodTime' => $closePeriodTime,
  103. ];
  104. }
  105. /**
  106. * 设置为正在封期
  107. */
  108. public function setClosingStat(){
  109. \Yii::$app->redis->set(self::CACHE_PERIOD_CLOSE_STATUS_KEY, self::CLOSE_PERIOD_STATUS_CLOSING);
  110. }
  111. }