PeriodForm.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544
  1. <?php
  2. namespace common\models\forms;
  3. use common\helpers\bonus\BonusCalc;
  4. use common\helpers\bonus\BonusSend;
  5. use common\helpers\bonus\PerfCalc;
  6. use common\helpers\Cache;
  7. use common\helpers\Date;
  8. use common\components\Model;
  9. use common\helpers\Form;
  10. use common\models\Period;
  11. use common\models\UserWallet;
  12. use common\models\User;
  13. use common\models\UserStatusAudit;
  14. use common\models\Withdraw;
  15. use yii\base\Exception;
  16. /**
  17. * Login form
  18. */
  19. class PeriodForm extends Model
  20. {
  21. public $periodNum;
  22. private $_periodModel;
  23. private $_limit = 1000;
  24. /**
  25. * @inheritdoc
  26. */
  27. public function rules()
  28. {
  29. return [
  30. [['periodNum'], 'trim'],
  31. [['periodNum'], 'required'],
  32. [['periodNum'], 'integer'],
  33. [['periodNum'], 'isPeriod'],
  34. ];
  35. }
  36. public function scenarios()
  37. {
  38. $parentScenarios = parent::scenarios();
  39. $customScenarios = [
  40. 'close' => ['periodNum'],
  41. 'perf' => ['periodNum'],
  42. 'calc' => ['periodNum'],
  43. 'send' => ['periodNum'],
  44. 'autoClose' => ['periodNum'],
  45. 'autoPerf' => ['periodNum'],
  46. ];
  47. return array_merge($parentScenarios, $customScenarios);
  48. }
  49. public function attributeLabels()
  50. {
  51. return [
  52. 'periodNum' => '期数',
  53. ];
  54. }
  55. public function isPeriod($attributes){
  56. $periodObj = Period::instance();
  57. $periodModel = Period::findOne(['PERIOD_NUM' => $this->periodNum]);
  58. if(!$periodModel){
  59. $this->addError($attributes, '所传期数不存在');
  60. }
  61. if($this->scenario == 'close') {
  62. if(!$periodObj->isCanClose($this->periodNum)){
  63. $this->addError($attributes, '所传期数不可封期');
  64. }
  65. }
  66. elseif($this->scenario == 'perf') {
  67. if(!$periodObj->isCanPerf($this->periodNum)){
  68. $this->addError($attributes, '所传期数不可生成业绩单');
  69. }
  70. }
  71. elseif($this->scenario == 'calc') {
  72. if(!$periodObj->isCanCalc($this->periodNum)){
  73. $this->addError($attributes, '所传期数不可结算');
  74. }
  75. }
  76. elseif($this->scenario == 'send') {
  77. if(!$periodObj->isCanSend($this->periodNum)){
  78. $this->addError($attributes, '所传期数不可挂网');
  79. }
  80. }
  81. $this->_periodModel = $periodModel;
  82. }
  83. /**
  84. * 封期
  85. * @return null
  86. * @throws \yii\db\Exception
  87. */
  88. public function closePeriod(){
  89. if(!$this->validate()){
  90. return null;
  91. }
  92. $periodNum = $this->periodNum;
  93. // 进行封期操作
  94. $transaction = \Yii::$app->db->beginTransaction();
  95. try {
  96. $model = $this->_periodModel;
  97. $model->IS_CLOSED = 1;
  98. if(isset(\Yii::$app->user->id) && \Yii::$app->user->id){
  99. $model->CLOSE_ADMIN_ID = \Yii::$app->user->id;
  100. }
  101. $model->CLOSED_AT = Date::nowTime();
  102. if(!$model->save()){
  103. throw new Exception('封期失败,请重试');
  104. }
  105. $settings = \Yii::$app->params['swooleAsyncTimer'];
  106. $bonusSettings = \Yii::$app->params['swooleBonusConfig'];
  107. $settings = array_merge($settings, $bonusSettings);
  108. $taskKey = \Yii::$app->swooleAsyncTimer->asyncHandle('bonus/after-close', ['periodNum'=>$periodNum, 'closedAt'=>$model->CLOSED_AT], $settings);
  109. if($taskKey === false){
  110. $this->addError('send', '请求失败');
  111. return null;
  112. }
  113. $transaction->commit();
  114. } catch (Exception $e){
  115. $transaction->rollBack();
  116. $this->addError('close', $e->getMessage());
  117. return null;
  118. }
  119. return $periodNum;
  120. }
  121. /**
  122. * 自动封期
  123. * @return null
  124. * @throws \yii\db\Exception
  125. */
  126. public function autoClosePeriod(){
  127. if(!$this->validate()){
  128. return null;
  129. }
  130. $periodNum = $this->periodNum;
  131. // 进行封期操作
  132. $transaction = \Yii::$app->db->beginTransaction();
  133. try {
  134. $model = $this->_periodModel;
  135. $model->IS_CLOSED = 1;
  136. if(isset(\Yii::$app->user->id) && \Yii::$app->user->id){
  137. $model->CLOSE_ADMIN_ID = \Yii::$app->user->id;
  138. }
  139. $model->CLOSED_AT = Date::nowTime();
  140. if(!$model->save()){
  141. throw new Exception('封期失败,请重试');
  142. }
  143. $transaction->commit();
  144. } catch (Exception $e){
  145. $transaction->rollBack();
  146. $this->addError('close', $e->getMessage());
  147. return null;
  148. }
  149. //封期后的操作(这句话放这里的目的是为了保障封期的时间不受其他后期工作的影响,封期之后再完成封期后的操作)
  150. $this->afterCloseAsync($periodNum, $model->CLOSED_AT);
  151. return $periodNum;
  152. }
  153. /**
  154. * 给到期要加T的会员加T
  155. * @param $periodNum
  156. */
  157. private function _periodChangeStatus($periodNum){
  158. // 到期加T
  159. $allAddTData = UserStatusAudit::find()->where('IS_PERIOD_ADD_T=1 AND ADD_T_PERIOD_NUM<=:NOW_PERIOD_NUM AND AUDIT_STATUS=:AUDIT_STATUS', [':NOW_PERIOD_NUM'=>$periodNum, ':AUDIT_STATUS'=>\Yii::$app->params['auditStatus']['true']['value']])->asArray()->all();
  160. foreach($allAddTData as $data){
  161. User::updateAll(['ID_CARD_PREFIX'=>'T'], 'ID=:ID', [':ID'=>$data['USER_ID']]);
  162. }
  163. // 到期开通
  164. $allOpenData = UserStatusAudit::find()->where('IS_PERIOD_OPEN=1 AND OPEN_PERIOD_NUM<=:NOW_PERIOD_NUM AND AUDIT_STATUS=:AUDIT_STATUS', [':NOW_PERIOD_NUM'=>$periodNum, ':AUDIT_STATUS'=>\Yii::$app->params['auditStatus']['true']['value']])->asArray()->all();
  165. foreach($allOpenData as $openData){
  166. // 改变会员的状态 并取消身份证号加T,并设置首次开通标记
  167. User::updateAll(['STATUS'=>$openData['STATUS_VALUE'], 'STATUS_AT'=>Date::nowTime(), 'ID_CARD_PREFIX'=>'', 'IS_FIRST_OPEN'=>1], 'ID=:ID', [':ID'=>$openData['USER_ID']]);
  168. //从关停到开启
  169. if ($openData['ORI_VALUE'] == UserStatusForm::STATUS_CLOSE) {
  170. UserWallet::updateAll(['CLEAR_BY_CLOSED_AT' => 0], 'USER_ID=:USER_ID', [':USER_ID' => $openData['USER_ID']]);
  171. }
  172. }
  173. }
  174. /**
  175. * 页面请求异步处理编辑
  176. * @return string | null
  177. */
  178. public function calcWebToAsync(){
  179. if(!$this->validate()){
  180. return null;
  181. }
  182. // 把正在结算标记为真
  183. $model = $this->_periodModel;
  184. $model->IS_CALCING = 1;
  185. $model->CALC_ADMIN_ID = \Yii::$app->user->id;
  186. if(!$model->save()){
  187. $this->addError('calc', Form::formatErrorsForApi($model->getErrors()));
  188. return null;
  189. }
  190. // 异步处理添加任务
  191. $settings = \Yii::$app->params['swooleAsyncTimer'];
  192. $bonusSettings = \Yii::$app->params['swooleBonusConfig'];
  193. $settings = array_merge($settings, $bonusSettings);
  194. $taskKey = \Yii::$app->swooleAsyncTimer->asyncHandle('bonus/calc', \Yii::$app->request->get(), $settings);
  195. if($taskKey === false){
  196. $this->addError('send', '请求失败');
  197. return null;
  198. }
  199. return $model;
  200. }
  201. /**
  202. * 异步处理逻辑
  203. * @param $handleUserId
  204. * @return bool|null
  205. * @throws Exception
  206. * @throws \yii\db\Exception
  207. */
  208. public function calcAsync($handleUserId){
  209. if(!$this->validate()){
  210. return null;
  211. }
  212. $bonusCalc = BonusCalc::instance();
  213. //$bonusCalc->init($this->periodNum, $handleUserId);
  214. //$bonusCalc->setPeriodNum($this->periodNum);
  215. $asyncResult = $bonusCalc->calcStep($this->periodNum, $handleUserId);
  216. if($asyncResult){
  217. $bonusCalc->endCalcTask();
  218. } else {
  219. $bonusCalc->errorCalcTask();
  220. $this->addErrors($bonusCalc->getErrors());
  221. }
  222. return $asyncResult;
  223. }
  224. /**
  225. * 页面请求异步处理生成业绩单
  226. * @return string | null
  227. */
  228. public function perfWebToAsync(){
  229. if(!$this->validate()){
  230. return null;
  231. }
  232. // 把正在结算标记为真
  233. $model = $this->_periodModel;
  234. $model->IS_PERFING = 1;
  235. $model->PERF_ADMIN_ID = \Yii::$app->user->id;
  236. if(!$model->save()){
  237. $this->addError('perf', Form::formatErrorsForApi($model->getErrors()));
  238. return null;
  239. }
  240. // 异步处理添加任务
  241. $settings = \Yii::$app->params['swooleAsyncTimer'];
  242. $bonusSettings = \Yii::$app->params['swooleBonusConfig'];
  243. $settings = array_merge($settings, $bonusSettings);
  244. $taskKey = \Yii::$app->swooleAsyncTimer->asyncHandle('bonus/perf', \Yii::$app->request->get(), $settings);
  245. if($taskKey === false){
  246. $this->addError('perf', '请求失败');
  247. return null;
  248. }
  249. return $model;
  250. }
  251. /**
  252. * 异步处理逻辑
  253. * @param $handleUserId
  254. * @return bool|null
  255. * @throws Exception
  256. * @throws \yii\db\Exception
  257. */
  258. public function perfAsync($handleUserId){
  259. if(!$this->validate()){
  260. return null;
  261. }
  262. $bonusCalc = PerfCalc::instance();
  263. //$bonusCalc->init($this->periodNum, $handleUserId);
  264. //$bonusCalc->setPeriodNum($this->periodNum);
  265. $asyncResult = $bonusCalc->calcStep($this->periodNum, $handleUserId);
  266. if($asyncResult){
  267. $bonusCalc->endCalcTask();
  268. } else {
  269. $bonusCalc->errorCalcTask();
  270. $this->addErrors($bonusCalc->getErrors());
  271. }
  272. return $asyncResult;
  273. }
  274. /**
  275. * 页面请求异步处理挂网
  276. * @return string | null
  277. */
  278. public function sendWebToAsync(){
  279. if(!$this->validate()){
  280. return null;
  281. }
  282. // 把正在挂网标记设为真
  283. $model = $this->_periodModel;
  284. $model->IS_SENDING = 1;
  285. $model->SENT_ADMIN_ID = \Yii::$app->user->id;
  286. if(!$model->save()){
  287. $this->addError('send', Form::formatErrorsForApi($model->getErrors()));
  288. return null;
  289. }
  290. // 异步处理添加任务
  291. $settings = \Yii::$app->params['swooleAsyncTimer'];
  292. $bonusSettings = \Yii::$app->params['swooleBonusConfig'];
  293. $settings = array_merge($settings, $bonusSettings);
  294. $taskKey = \Yii::$app->swooleAsyncTimer->asyncHandle('bonus/send', \Yii::$app->request->get(), $settings);
  295. if($taskKey === false){
  296. $this->addError('send', '请求失败');
  297. return null;
  298. }
  299. return $model;
  300. }
  301. /**
  302. * 异步处理挂网逻辑
  303. * @param $handleUserId
  304. * @return bool|null
  305. */
  306. public function sendAsync($handleUserId){
  307. if(!$this->validate()){
  308. return null;
  309. }
  310. $bonusSend = BonusSend::instance();
  311. $bonusSend->init($this->periodNum, $handleUserId);
  312. $asyncResult = $bonusSend->sendStep();
  313. if($asyncResult){
  314. $bonusSend->endTask();
  315. } else {
  316. $bonusSend->errorTask();
  317. $this->addErrors($bonusSend->getErrors());
  318. }
  319. return $asyncResult;
  320. }
  321. /**
  322. * 异步处理封期后的操作
  323. * @param $periodNum
  324. * @return bool
  325. * @throws \yii\db\Exception
  326. */
  327. public function afterCloseAsync($periodNum,$closedAt){
  328. //如果自动结算
  329. // if(boolval(Cache::getSystemConfig()['autoCalcPeriod']['VALUE'])){
  330. // $period = Period::instance();
  331. // if($period->isLastSent($periodNum)) {
  332. // $bonusCalc = PerfCalc::instance();
  333. // $asyncResult = $bonusCalc->calcStep($periodNum);
  334. // if ($asyncResult) {
  335. // $bonusCalc->endCalcTask();
  336. // } else {
  337. // $bonusCalc->errorCalcTask();
  338. // $this->addErrors($bonusCalc->getErrors());
  339. // }
  340. // return $asyncResult;
  341. // }
  342. // }
  343. }
  344. /**
  345. * 页面请求异步处理 自动计算
  346. * @return string | null
  347. */
  348. public function autoExec()
  349. {
  350. if (!$this->validate()) {
  351. return null;
  352. }
  353. // // 把正在结算标记为真
  354. $model = $this->_periodModel;
  355. // $model->IS_CALCING = 1;
  356. // $model->CALC_ADMIN_ID = \Yii::$app->user->id;
  357. // if (!$model->save()) {
  358. // $this->addError('calc', Form::formatErrorsForApi($model->getErrors()));
  359. // return null;
  360. // }
  361. // 异步处理添加任务
  362. $settings = \Yii::$app->params['swooleAsyncTimer'];
  363. $bonusSettings = \Yii::$app->params['swooleBonusConfig'];
  364. $settings = array_merge($settings, $bonusSettings);
  365. $taskKey = \Yii::$app->swooleAsyncTimer->asyncHandle('calc/auto-exec', \Yii::$app->request->get(), $settings);
  366. if ($taskKey === false) {
  367. $this->addError('send', '请求失败');
  368. return null;
  369. }
  370. return $model;
  371. }
  372. /**
  373. * 页面请求异步处理 自动计算
  374. * @return string | null
  375. */
  376. public function autoPerf()
  377. {
  378. if (!$this->validate()) {
  379. return null;
  380. }
  381. // // 把正在结算标记为真
  382. $model = $this->_periodModel;
  383. // $model->IS_CALCING = 1;
  384. // $model->CALC_ADMIN_ID = \Yii::$app->user->id;
  385. // if (!$model->save()) {
  386. // $this->addError('calc', Form::formatErrorsForApi($model->getErrors()));
  387. // return null;
  388. // }
  389. // 异步处理添加任务
  390. $settings = \Yii::$app->params['swooleAsyncTimer'];
  391. $bonusSettings = \Yii::$app->params['swooleBonusConfig'];
  392. $settings = array_merge($settings, $bonusSettings);
  393. $taskKey = \Yii::$app->swooleAsyncTimer->asyncHandle('calc/auto-perf', \Yii::$app->request->get(), $settings);
  394. if ($taskKey === false) {
  395. $this->addError('send', '请求失败');
  396. return null;
  397. }
  398. return $model;
  399. }
  400. /**
  401. * 页面请求异步处理 生成业绩单
  402. * @return string | null
  403. */
  404. public function generatePerfOrder()
  405. {
  406. if (!$this->validate()) {
  407. return null;
  408. }
  409. // // 把正在结算标记为真
  410. $model = $this->_periodModel;
  411. // $model->IS_CALCING = 1;
  412. // $model->CALC_ADMIN_ID = \Yii::$app->user->id;
  413. // if (!$model->save()) {
  414. // $this->addError('calc', Form::formatErrorsForApi($model->getErrors()));
  415. // return null;
  416. // }
  417. // 异步处理添加任务
  418. $settings = \Yii::$app->params['swooleAsyncTimer'];
  419. $bonusSettings = \Yii::$app->params['swooleBonusConfig'];
  420. $settings = array_merge($settings, $bonusSettings);
  421. $taskKey = \Yii::$app->swooleAsyncTimer->asyncHandle('calc/perf-order', \Yii::$app->request->get(), $settings);
  422. if ($taskKey === false) {
  423. $this->addError('send', '请求失败');
  424. return null;
  425. }
  426. return $model;
  427. }
  428. /**
  429. * 页面请求异步处理 推送基础数据
  430. * @return string | null
  431. */
  432. public function pushBaseData()
  433. {
  434. if (!$this->validate()) {
  435. return null;
  436. }
  437. // // 把正在结算标记为真
  438. $model = $this->_periodModel;
  439. // $model->IS_CALCING = 1;
  440. // $model->CALC_ADMIN_ID = \Yii::$app->user->id;
  441. // if (!$model->save()) {
  442. // $this->addError('calc', Form::formatErrorsForApi($model->getErrors()));
  443. // return null;
  444. // }
  445. // 异步处理添加任务
  446. $settings = \Yii::$app->params['swooleAsyncTimer'];
  447. $bonusSettings = \Yii::$app->params['swooleBonusConfig'];
  448. $settings = array_merge($settings, $bonusSettings);
  449. $taskKey = \Yii::$app->swooleAsyncTimer->asyncHandle('calc/push-data', \Yii::$app->request->get(), $settings);
  450. if ($taskKey === false) {
  451. $this->addError('send', '请求失败');
  452. return null;
  453. }
  454. return $model;
  455. }
  456. /**
  457. * 拉取计算系统中生成的期业绩数据
  458. * @return null
  459. */
  460. public function pullPeriod()
  461. {
  462. if (!$this->validate()) {
  463. return null;
  464. }
  465. // // 把正在结算标记为真
  466. $model = $this->_periodModel;
  467. // $model->IS_CALCING = 1;
  468. // $model->CALC_ADMIN_ID = \Yii::$app->user->id;
  469. // if (!$model->save()) {
  470. // $this->addError('calc', Form::formatErrorsForApi($model->getErrors()));
  471. // return null;
  472. // }
  473. // 异步处理添加任务
  474. $settings = \Yii::$app->params['swooleAsyncTimer'];
  475. $bonusSettings = \Yii::$app->params['swooleBonusConfig'];
  476. $settings = array_merge($settings, $bonusSettings);
  477. $taskKey = \Yii::$app->swooleAsyncTimer->asyncHandle('calc/pull-period', \Yii::$app->request->get(), $settings);
  478. if ($taskKey === false) {
  479. $this->addError('send', '请求失败');
  480. return null;
  481. }
  482. return $model;
  483. }
  484. /**
  485. * 拉取计算系统中生成的奖金数据
  486. * @return null
  487. */
  488. public function pullBonus()
  489. {
  490. if (!$this->validate()) {
  491. return null;
  492. }
  493. // // 把正在结算标记为真
  494. $model = $this->_periodModel;
  495. // $model->IS_CALCING = 1;
  496. // $model->CALC_ADMIN_ID = \Yii::$app->user->id;
  497. // if (!$model->save()) {
  498. // $this->addError('calc', Form::formatErrorsForApi($model->getErrors()));
  499. // return null;
  500. // }
  501. // 异步处理添加任务
  502. $settings = \Yii::$app->params['swooleAsyncTimer'];
  503. $bonusSettings = \Yii::$app->params['swooleBonusConfig'];
  504. $settings = array_merge($settings, $bonusSettings);
  505. $taskKey = \Yii::$app->swooleAsyncTimer->asyncHandle('calc/pull-bonus', \Yii::$app->request->get(), $settings);
  506. if ($taskKey === false) {
  507. $this->addError('send', '请求失败');
  508. return null;
  509. }
  510. return $model;
  511. }
  512. }