PeriodForm.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  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. ];
  46. return array_merge($parentScenarios, $customScenarios);
  47. }
  48. public function attributeLabels()
  49. {
  50. return [
  51. 'periodNum' => '期数',
  52. ];
  53. }
  54. public function isPeriod($attributes){
  55. $periodObj = Period::instance();
  56. $periodModel = Period::findOne(['PERIOD_NUM' => $this->periodNum]);
  57. if(!$periodModel){
  58. $this->addError($attributes, '所传期数不存在');
  59. }
  60. if($this->scenario == 'close') {
  61. if(!$periodObj->isCanClose($this->periodNum)){
  62. $this->addError($attributes, '所传期数不可封期');
  63. }
  64. }
  65. elseif($this->scenario == 'perf') {
  66. if(!$periodObj->isCanPerf($this->periodNum)){
  67. $this->addError($attributes, '所传期数不可生成业绩单');
  68. }
  69. }
  70. elseif($this->scenario == 'calc') {
  71. if(!$periodObj->isCanCalc($this->periodNum)){
  72. $this->addError($attributes, '所传期数不可结算');
  73. }
  74. }
  75. elseif($this->scenario == 'send') {
  76. if(!$periodObj->isCanSend($this->periodNum)){
  77. $this->addError($attributes, '所传期数不可挂网');
  78. }
  79. }
  80. $this->_periodModel = $periodModel;
  81. }
  82. /**
  83. * 封期
  84. * @return null
  85. * @throws \yii\db\Exception
  86. */
  87. public function closePeriod(){
  88. if(!$this->validate()){
  89. return null;
  90. }
  91. $periodNum = $this->periodNum;
  92. // 进行封期操作
  93. $transaction = \Yii::$app->db->beginTransaction();
  94. try {
  95. $model = $this->_periodModel;
  96. $model->IS_CLOSED = 1;
  97. if(isset(\Yii::$app->user->id) && \Yii::$app->user->id){
  98. $model->CLOSE_ADMIN_ID = \Yii::$app->user->id;
  99. }
  100. $model->CLOSED_AT = Date::nowTime();
  101. if(!$model->save()){
  102. throw new Exception('封期失败,请重试');
  103. }
  104. $settings = \Yii::$app->params['swooleAsyncTimer'];
  105. $bonusSettings = \Yii::$app->params['swooleBonusConfig'];
  106. $settings = array_merge($settings, $bonusSettings);
  107. $taskKey = \Yii::$app->swooleAsyncTimer->asyncHandle('bonus/after-close', ['periodNum'=>$periodNum, 'closedAt'=>$model->CLOSED_AT], $settings);
  108. if($taskKey === false){
  109. $this->addError('send', '请求失败');
  110. return null;
  111. }
  112. $transaction->commit();
  113. } catch (Exception $e){
  114. $transaction->rollBack();
  115. $this->addError('close', $e->getMessage());
  116. return null;
  117. }
  118. return $periodNum;
  119. }
  120. /**
  121. * 页面请求异步处理编辑
  122. * @return string | null
  123. */
  124. public function calcWebToAsync(){
  125. if(!$this->validate()){
  126. return null;
  127. }
  128. // 把正在结算标记为真
  129. $model = $this->_periodModel;
  130. $model->IS_CALCING = 1;
  131. $model->CALC_ADMIN_ID = \Yii::$app->user->id;
  132. if(!$model->save()){
  133. $this->addError('calc', Form::formatErrorsForApi($model->getErrors()));
  134. return null;
  135. }
  136. // 异步处理添加任务
  137. $settings = \Yii::$app->params['swooleAsyncTimer'];
  138. $bonusSettings = \Yii::$app->params['swooleBonusConfig'];
  139. $settings = array_merge($settings, $bonusSettings);
  140. $taskKey = \Yii::$app->swooleAsyncTimer->asyncHandle('bonus/calc', \Yii::$app->request->get(), $settings);
  141. if($taskKey === false){
  142. $this->addError('send', '请求失败');
  143. return null;
  144. }
  145. return $model;
  146. }
  147. /**
  148. * 异步处理逻辑
  149. * @param $handleUserId
  150. * @return bool|null
  151. * @throws Exception
  152. * @throws \yii\db\Exception
  153. */
  154. public function calcAsync($handleUserId){
  155. if(!$this->validate()){
  156. return null;
  157. }
  158. $bonusCalc = BonusCalc::instance();
  159. //$bonusCalc->init($this->periodNum, $handleUserId);
  160. //$bonusCalc->setPeriodNum($this->periodNum);
  161. $asyncResult = $bonusCalc->calcStep($this->periodNum, $handleUserId);
  162. if($asyncResult){
  163. $bonusCalc->endCalcTask();
  164. } else {
  165. $bonusCalc->errorCalcTask();
  166. $this->addErrors($bonusCalc->getErrors());
  167. }
  168. return $asyncResult;
  169. }
  170. /**
  171. * 页面请求异步处理生成业绩单
  172. * @return string | null
  173. */
  174. public function perfWebToAsync(){
  175. if(!$this->validate()){
  176. return null;
  177. }
  178. // 把正在结算标记为真
  179. $model = $this->_periodModel;
  180. $model->IS_PERFING = 1;
  181. $model->PERF_ADMIN_ID = \Yii::$app->user->id;
  182. if(!$model->save()){
  183. $this->addError('perf', Form::formatErrorsForApi($model->getErrors()));
  184. return null;
  185. }
  186. // 异步处理添加任务
  187. $settings = \Yii::$app->params['swooleAsyncTimer'];
  188. $bonusSettings = \Yii::$app->params['swooleBonusConfig'];
  189. $settings = array_merge($settings, $bonusSettings);
  190. $taskKey = \Yii::$app->swooleAsyncTimer->asyncHandle('bonus/perf', \Yii::$app->request->get(), $settings);
  191. if($taskKey === false){
  192. $this->addError('perf', '请求失败');
  193. return null;
  194. }
  195. return $model;
  196. }
  197. /**
  198. * 异步处理逻辑
  199. * @param $handleUserId
  200. * @return bool|null
  201. * @throws Exception
  202. * @throws \yii\db\Exception
  203. */
  204. public function perfAsync($handleUserId){
  205. if(!$this->validate()){
  206. return null;
  207. }
  208. $bonusCalc = PerfCalc::instance();
  209. //$bonusCalc->init($this->periodNum, $handleUserId);
  210. //$bonusCalc->setPeriodNum($this->periodNum);
  211. $asyncResult = $bonusCalc->calcStep($this->periodNum, $handleUserId);
  212. if($asyncResult){
  213. $bonusCalc->endCalcTask();
  214. } else {
  215. $bonusCalc->errorCalcTask();
  216. $this->addErrors($bonusCalc->getErrors());
  217. }
  218. return $asyncResult;
  219. }
  220. /**
  221. * 页面请求异步处理挂网
  222. * @return string | null
  223. */
  224. public function sendWebToAsync(){
  225. if(!$this->validate()){
  226. return null;
  227. }
  228. // 把正在挂网标记设为真
  229. $model = $this->_periodModel;
  230. $model->IS_SENDING = 1;
  231. $model->SENT_ADMIN_ID = \Yii::$app->user->id;
  232. if(!$model->save()){
  233. $this->addError('send', Form::formatErrorsForApi($model->getErrors()));
  234. return null;
  235. }
  236. // 异步处理添加任务
  237. $settings = \Yii::$app->params['swooleAsyncTimer'];
  238. $bonusSettings = \Yii::$app->params['swooleBonusConfig'];
  239. $settings = array_merge($settings, $bonusSettings);
  240. $taskKey = \Yii::$app->swooleAsyncTimer->asyncHandle('bonus/send', \Yii::$app->request->get(), $settings);
  241. if($taskKey === false){
  242. $this->addError('send', '请求失败');
  243. return null;
  244. }
  245. return $model;
  246. }
  247. /**
  248. * 异步处理挂网逻辑
  249. * @param $handleUserId
  250. * @return bool|null
  251. */
  252. public function sendAsync($handleUserId){
  253. if(!$this->validate()){
  254. return null;
  255. }
  256. $bonusSend = BonusSend::instance();
  257. $bonusSend->init($this->periodNum, $handleUserId);
  258. $asyncResult = $bonusSend->sendStep();
  259. if($asyncResult){
  260. $bonusSend->endTask();
  261. } else {
  262. $bonusSend->errorTask();
  263. $this->addErrors($bonusSend->getErrors());
  264. }
  265. return $asyncResult;
  266. }
  267. /**
  268. * 异步处理封期后的操作
  269. * @param $periodNum
  270. * @return bool
  271. * @throws \yii\db\Exception
  272. */
  273. public function afterCloseAsync($periodNum,$closedAt){
  274. //如果自动结算
  275. // if(boolval(Cache::getSystemConfig()['autoCalcPeriod']['VALUE'])){
  276. // $period = Period::instance();
  277. // if($period->isLastSent($periodNum)) {
  278. // $bonusCalc = PerfCalc::instance();
  279. // $asyncResult = $bonusCalc->calcStep($periodNum);
  280. // if ($asyncResult) {
  281. // $bonusCalc->endCalcTask();
  282. // } else {
  283. // $bonusCalc->errorCalcTask();
  284. // $this->addErrors($bonusCalc->getErrors());
  285. // }
  286. // return $asyncResult;
  287. // }
  288. // }
  289. }
  290. }