| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- <?php
- namespace common\models\forms;
- use common\components\Model;
- use common\helpers\Date;
- use common\helpers\Form;
- use common\libs\logging\operate\AdminOperate;
- use common\models\Config;
- use common\models\Period;
- use yii\db\Exception;
- /**
- * Login form
- */
- class ConfigPeriodForm extends Model
- {
- public $calcYear;
- public $closeWeekDate;
- public $closeTime;
- public $closeDays;
- public function init() {
- parent::init();
- $this->adminOperateLogger = new AdminOperate([
- 'fetchClass' => Config::class,
- ]);
- }
- /**
- * @inheritdoc
- */
- public function rules()
- {
- return [
- [['calcYear', 'closeWeekDate', 'closeTime', 'closeDays'], 'required'],
- [['calcYear'], 'integer', 'max'=>2050, 'min'=>2018],
- [['closeWeekDate'], 'match', 'pattern' => '/^[0-6]/', 'message' => '请填写有效的星期'],
- [['closeTime'], 'time', 'format'=>'HH:mm'],
- [['closeDays'], 'match', 'pattern' => '/^[1-4]/', 'message' => '请填写有效的天数'],
- ];
- }
- public function attributeLabels()
- {
- return [
- 'calcYear' => '计算至年份',
- 'closeWeekDate' => '封期日期',
- 'closeTime' => '封期时间',
- 'closeDays' => '封期周期天数',
- ];
- }
- /**
- * 更新配置
- * @return bool|null
- * @throws Exception
- */
- public function update(){
- if(!$this->validate()){
- return null;
- }
- $configs = Config::find()->where("TYPE='period'")->orderBy('SORT ASC')->indexBy('CONFIG_NAME')->asArray()->all();
- $configNames = [];
- foreach ($configs as $value){
- $configNames[] = $value['CONFIG_NAME'];
- }
- $beforeData = Config::getConfigByType('period');
- $this->adminOperateLogger->saveBeforeContent=$beforeData;
- $transaction = \Yii::$app->db->beginTransaction();
- try{
- if(!Config::updateAll(['VALUE'=>$this->calcYear, 'UPDATED_AT'=>Date::nowTime()], "CONFIG_NAME='calcYear'")){
- throw new Exception('计算至年份更新失败');
- }
- if(!Config::updateAll(['VALUE'=>$this->closeWeekDate, 'UPDATED_AT'=>Date::nowTime()], "CONFIG_NAME='closeWeekDate'")){
- throw new Exception('封期日期更新失败');
- }
- if(!Config::updateAll(['VALUE'=>$this->closeTime, 'UPDATED_AT'=>Date::nowTime()], "CONFIG_NAME='closeTime'")){
- throw new Exception('封期时间更新失败');
- }
- if(!Config::updateAll(['VALUE'=>$this->closeDays, 'UPDATED_AT'=>Date::nowTime()], "CONFIG_NAME='closeDays'")){
- throw new Exception('封期天数更新失败');
- }
- // 异步重新生成业绩期先注释掉
- // 异步处理添加任务
- // $taskKey = \Yii::$app->swooleAsyncTimer->asyncHandle('config/update-period', \Yii::$app->request->post());
- $taskKey = false;
- if($taskKey === false){
- throw new Exception('请求异步服务器失败');
- }
- $transaction->commit();
- } catch (Exception $e){
- $transaction->rollBack();
- $this->addError('closeWeekDate', $e->getMessage());
- return null;
- }
- $afterData = Config::getConfigByType('period');
- $this->adminOperateLogger->saveAfterContent=$afterData;
- unset($beforeData,$afterData);
- $this->adminOperateLogger->clean()->save([
- 'optType' => '更新期数配置',
- ]);
- return true;
- }
- /**
- * 异步更新期数表
- * @return bool
- * @throws Exception
- */
- public function updateAsync(){
- if(!$this->validate()){
- return false;
- }
- $period = Period::instance();
- // 获取当前期数
- $periodNum = $period->getNowPeriodNum();
- // 把所有没封期的期数都删掉只保留当前期
- Period::deleteAll('IS_CLOSED=0 AND PERIOD_NUM<>:PERIOD_NUM', [':PERIOD_NUM'=>$periodNum]);
- //$nowPeriodStart = $period->getNowPeriodStart();
- $periodEnd = $period->getNowPeriodEnd();
- // 开始时间归到0点
- $nowPeriodStart = $periodEnd + 1;
- // 循环到2030年的所有日期
- $nowPeriodNum = $periodNum + 1;
- $startDateTemp = $nowPeriodStart;
- $transaction = \Yii::$app->db->beginTransaction();
- try{
- $days = 1;
- for($startDate = $nowPeriodStart + 86400; $startDate < strtotime($this->calcYear.'-12-31'); $startDate += 86400 ){
- if(Date::dateWeek(\date('Y-m-d',$startDate)) == $this->closeWeekDate){
- $days++;
- if ($days % $this->closeDays != 0) {
- continue;
- }
- $periodModel = new Period();
- $periodModel->PERIOD_NUM = $nowPeriodNum;
- $periodModel->START_TIME = $startDateTemp;
- $periodModel->END_TIME = Date::dayMinute($startDate, $this->closeTime) - 1;
- $periodModel->CALC_MONTH = date('m', $periodModel->END_TIME);
- $periodModel->CALC_YEAR = date('Y', $periodModel->END_TIME);
- $periodModel->CREATED_AT = Date::nowTime();
- if(!$periodModel->save()){
- throw new Exception(Form::formatErrorsForApi($periodModel->getErrors()));
- };
- $startDateTemp = $periodModel->END_TIME+1;
- // 查看上一期的月份是否比本期的月份不等,则把上一期设置为月结点
- $lastPeriod = Period::findOne(['PERIOD_NUM'=>$nowPeriodNum-1]);
- if($lastPeriod){
- if($lastPeriod['CALC_MONTH'] != $periodModel->CALC_MONTH){
- $lastPeriod->IS_MONTH = 1;
- }
- // 查看上一期的年份是否比本期的不等,则把上一期的设置为年节点
- if($lastPeriod['CALC_YEAR'] != $periodModel->CALC_YEAR){
- $lastPeriod->IS_YEAR = 1;
- }
- if($lastPeriod->IS_MONTH || $lastPeriod->IS_YEAR){
- if(!$lastPeriod->save()){
- throw new Exception(Form::formatErrorsForApi($lastPeriod->getErrors()));
- }
- }
- }
- $periodModel = null;
- $lastPeriod = null;
- unset($periodModel, $lastPeriod);
- $nowPeriodNum += 1;
- //echo date('Y-m-d', $startDate).PHP_EOL;
- }
- }
- $transaction->commit();
- } catch (Exception $e){
- $transaction->rollBack();
- $this->addError('update', $e->getMessage());
- return false;
- }
- return true;
- }
- }
|