UserStatusForm.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. <?php
  2. namespace common\models\forms;
  3. use common\helpers\Cache;
  4. use common\helpers\Date;
  5. use common\components\Model;
  6. use common\helpers\Form;
  7. use common\helpers\Tool;
  8. use common\helpers\user\Balance;
  9. use common\helpers\user\Info;
  10. use common\helpers\user\Status;
  11. use common\libs\logging\operate\AdminOperate;
  12. use common\models\DealType;
  13. use common\models\PerfPeriod;
  14. use common\models\Period;
  15. use common\models\EmployLevel;
  16. use common\models\UserWallet;
  17. use common\models\User;
  18. use common\models\UserBind;
  19. use common\models\UserBonus;
  20. use common\models\UserClose;
  21. use common\models\UserInfo;
  22. use common\models\UserPerf;
  23. use common\models\UserStatusAudit;
  24. use common\models\Withdraw;
  25. use yii\base\Exception;
  26. /**
  27. * Login form
  28. */
  29. class UserStatusForm extends Model {
  30. public $id;
  31. public $userName;
  32. public $statusValue;
  33. public $remark;
  34. public $auditStatus;
  35. public $isPeriodAddT;
  36. public $addTPeriodNum;
  37. public $isPeriodOpen;
  38. public $openPeriodNum;
  39. public $userId;
  40. public $periodNum;
  41. public $userIds;
  42. public $isOperating;
  43. private $_userId;
  44. private $_userStatusModel;
  45. private $_userModel;
  46. private $_periodNum;
  47. const STATUS_NORMAL = 1;
  48. const STATUS_LOGOUT = 2;//注销
  49. const STATUS_BLACKLIST = 3;//黑名单
  50. const STATUS_STOP_SEND = 4;//停发
  51. const STATUS_CLOSE = 9;//永久关停
  52. public function init()
  53. {
  54. parent::init();
  55. $this->adminOperateLogger = new AdminOperate([
  56. 'fetchClass' => UserStatusAudit::class,
  57. ]);
  58. }
  59. /**
  60. * @inheritdoc
  61. */
  62. public function rules() {
  63. return [
  64. [['id', 'userName', 'statusValue', 'remark', 'auditStatus', 'isPeriodAddT', 'addTPeriodNum', 'isPeriodOpen', 'openPeriodNum', 'userIds', 'isOperating', 'userId', 'periodNum'], 'trim'],
  65. [['id', 'userName', 'statusValue', 'auditStatus', 'userIds'], 'required'],
  66. [['userName'], 'exist', 'targetClass' => UserInfo::class, 'targetAttribute' => 'USER_NAME'],
  67. [['id'], 'exist', 'targetClass' => UserStatusAudit::class, 'targetAttribute' => 'ID'],
  68. [['statusValue'], 'isStatus'],
  69. [['auditStatus'], 'isAuditStatus'],
  70. ];
  71. }
  72. /**
  73. * 指定校验场景
  74. * @return array
  75. */
  76. public function scenarios() {
  77. $parentScenarios = parent::scenarios();
  78. $customScenarios = [
  79. // 手动申请
  80. 'add' => ['userName', 'statusValue', 'remark', 'isPeriodAddT', 'addTPeriodNum', 'isPeriodOpen', 'openPeriodNum'],
  81. // 审核
  82. 'audit' => ['id', 'auditStatus', 'remark', 'isPeriodAddT', 'addTPeriodNum', 'isPeriodOpen', 'openPeriodNum'],
  83. // 调整是否运作
  84. 'operating' => ['userIds', 'isOperating'],
  85. 'autoClose' => ['userId'],
  86. 'clearWallet' => ['remark'],
  87. ];
  88. return array_merge($parentScenarios, $customScenarios);
  89. }
  90. public function attributeLabels() {
  91. return [
  92. 'id' => 'ID',
  93. 'userName' => '会员编号',
  94. 'statusValue' => '调整状态',
  95. 'remark' => '备注',
  96. 'auditStatus' => '审核状态',
  97. 'isPeriodAddT' => '是否立即加T',
  98. 'addTPeriodNum' => '加T的期数',
  99. 'isPeriodOpen' => '是否马上开通',
  100. 'openPeriodNum' => '开通的期数',
  101. 'userIds' => '会员ID',
  102. 'isOperating' => '是否运作',
  103. ];
  104. }
  105. public function beforeValidate() {
  106. // 调整是否运作不走初始化流程
  107. if ($this->scenario == 'add' || $this->scenario == 'audit' || $this->scenario == 'autoClose' ) {
  108. $this->initModel();
  109. }
  110. return parent::beforeValidate();
  111. }
  112. /**
  113. * 初始化model和userId
  114. */
  115. public function initModel() {
  116. $period = Period::instance();
  117. $this->_periodNum = $period->getNowPeriodNum();
  118. if ($this->scenario == 'audit') {
  119. $this->_userStatusModel = UserStatusAudit::findOne(['ID' => $this->id]);
  120. $this->_userId = $this->_userStatusModel->USER_ID;
  121. } elseif ($this->scenario == 'add') {
  122. $this->_userStatusModel = new UserStatusAudit();
  123. $oneUser = UserInfo::findOneAsArray(['USER_NAME' => $this->userName], [], 'USER_ID');
  124. $this->_userId = $oneUser['USER_ID'];
  125. // 查看数据库中是否已经存在了该会员的申请未审核
  126. $oneUserStatus = UserStatusAudit::findOne(['USER_ID' => $this->_userId, 'AUDIT_STATUS' => \Yii::$app->params['auditStatus']['un']['value']]);
  127. if ($oneUserStatus && $this->scenario == 'add') {
  128. // 不允许重复申请
  129. $this->addError('initModel', '已经存在该会员的待审核数据,请等待审核后再申请');
  130. }
  131. // 查看,如果数据库中存在一条已审核,并且是关停转开通,并且是按照期数开通,并且是大于当前期数,则提示存在待开通状态,不能申请
  132. if (UserStatusAudit::find()->where('USER_ID=:USER_ID AND IS_PERIOD_OPEN=1 AND OPEN_PERIOD_NUM>:NOW_PERIOD_NUM AND STATUS_VALUE=:STATUS_VALUE', [':USER_ID' => $this->_userId, ':NOW_PERIOD_NUM' => $this->_periodNum, ':STATUS_VALUE' => self::STATUS_NORMAL])->exists()) {
  133. $this->addError('initModel', '该会员处于到期等待开通状态,不能修改其他状态');
  134. }
  135. } else {
  136. $this->addError('initModel', '场景不正确');
  137. }
  138. $this->_userModel = User::findOne(['ID' => $this->_userId]);
  139. }
  140. /**
  141. * 状态类型校验
  142. * @param $attribute
  143. */
  144. public function isStatus($attribute) {
  145. if (!array_key_exists($this->statusValue, \Yii::$app->params['userStatus'])) {
  146. $this->addError($attribute, '类型不正确');
  147. }
  148. // 会员当前状态
  149. if ($this->_userModel['STATUS'] == $this->statusValue) {
  150. $this->addError($attribute, '调整状态与调整前状态一致,无需提交');
  151. }
  152. $period = Period::instance();
  153. $nowPeriodNum = $period->getNowPeriodNum();
  154. // 只有注销状态才需要校验是否立即加T
  155. if ($this->statusValue == self::STATUS_LOGOUT || $this->statusValue == self::STATUS_STOP_SEND) {
  156. if ($this->isPeriodAddT && $this->addTPeriodNum <= $nowPeriodNum) {
  157. $this->addError($attribute, '加T的期数不能小于当前期数');
  158. }
  159. }
  160. // 从关停状态改为正常状态需要判断开通期数不能小于当前期数
  161. if ($this->_userModel['STATUS'] == self::STATUS_CLOSE && $this->statusValue == self::STATUS_NORMAL) {
  162. if ($this->isPeriodOpen && $this->openPeriodNum <= $nowPeriodNum) {
  163. $this->addError($attribute, '开通的期数不能小于当前的期数');
  164. }
  165. }
  166. }
  167. /**
  168. * 审核状态是否正确
  169. * @param $attributes
  170. */
  171. public function isAuditStatus($attributes) {
  172. if (!array_key_exists($this->auditStatus, \Yii::$app->params['auditStatus'])) {
  173. $this->addError($attributes, '无效的审核状态');
  174. }
  175. }
  176. /**
  177. * 申请
  178. * @return null
  179. * @throws \yii\db\Exception
  180. */
  181. public function add() {
  182. if (!$this->validate()) {
  183. return null;
  184. }
  185. $db = \Yii::$app->db;
  186. $transaction = $db->beginTransaction();
  187. try {
  188. // 获取会员当前的状态
  189. $oriStatus = Status::getStatus($this->_userId);
  190. $model = $this->_userStatusModel;
  191. $model->USER_ID = $this->_userId;
  192. $model->STATUS_VALUE = $this->statusValue;
  193. $model->ORI_VALUE = $oriStatus;
  194. $model->PERIOD_NUM = $this->_periodNum;
  195. $model->AUDIT_STATUS = \Yii::$app->params['auditStatus']['un']['value'];
  196. $model->IS_PERIOD_ADD_T = $this->isPeriodAddT ? $this->isPeriodAddT : 0;
  197. $model->ADD_T_PERIOD_NUM = $this->addTPeriodNum;
  198. $model->IS_PERIOD_OPEN = $this->isPeriodOpen ? $this->isPeriodOpen : 0;
  199. $model->OPEN_PERIOD_NUM = $this->openPeriodNum;
  200. $model->CREATE_REMARK = $this->remark;
  201. $model->CREATE_ADMIN = \Yii::$app->user->id;
  202. $model->CREATED_AT = Date::nowTime();
  203. if (!$model->save()) {
  204. throw new Exception(Form::formatErrorsForApi($model->getErrors()));
  205. }
  206. $transaction->commit();
  207. } catch (Exception $e) {
  208. $transaction->rollBack();
  209. $this->addError('edit', $e->getMessage());
  210. return null;
  211. }
  212. // 记录日志
  213. $this->adminOperateLogger->afterInsert($model)->clean()->save([
  214. 'optType' => '申请修改会员状态',
  215. 'userId' => $model->USER_ID,
  216. 'userName' => Info::getUserNameByUserId($model->USER_ID),
  217. 'remark' => $model->CREATE_REMARK,
  218. ]);
  219. return $model;
  220. }
  221. /**
  222. * 审核
  223. * @return null
  224. * @throws \yii\db\Exception
  225. */
  226. public function audit() {
  227. if (!$this->validate()) {
  228. return null;
  229. }
  230. // 日志记录操作前的数据
  231. $this->adminOperateLogger->beforeUpdate($this->_userStatusModel);
  232. $db = \Yii::$app->db;
  233. $transaction = $db->beginTransaction();
  234. try {
  235. $model = $this->_userStatusModel;
  236. if ($this->auditStatus == 'true') {
  237. // 获取该会员的当前的聘级和报单级别
  238. $model->DEC_LV = Info::getDecLv($model->USER_ID);
  239. $model->EMP_LV = Info::getEmpLv($model->USER_ID);
  240. // 获取当前会员的各个区的业绩
  241. $userPerf = UserPerf::findOneAsArray('USER_ID=:USER_ID', [':USER_ID' => $model->USER_ID]);
  242. $model->PV_1L = $userPerf['PV_1L'];
  243. $model->PV_2L = $userPerf['PV_2L'];
  244. $model->PV_3L = $userPerf['PV_3L'];
  245. $model->PV_4L = $userPerf['PV_4L'];
  246. $model->PV_5L = $userPerf['PV_5L'];
  247. // 获取当前会员的最新已挂网的会员的剩余业绩
  248. $maxPeriodNum = Period::sentMaxPeriodNum();
  249. $perfPeriod = PerfPeriod::findOne(['USER_ID' => $model->USER_ID, 'PERIOD_NUM' => $maxPeriodNum]);
  250. $model->SURPLUS_1L = $perfPeriod['SURPLUS_1L'] ?? 0;
  251. $model->SURPLUS_2L = $perfPeriod['SURPLUS_2L'] ?? 0;
  252. $model->SURPLUS_3L = $perfPeriod['SURPLUS_3L'] ?? 0;
  253. $model->SURPLUS_4L = $perfPeriod['SURPLUS_4L'] ?? 0;
  254. $model->SURPLUS_5L = $perfPeriod['SURPLUS_5L'] ?? 0;
  255. $model->IS_PERIOD_ADD_T = $this->isPeriodAddT ? $this->isPeriodAddT : 0;
  256. $model->ADD_T_PERIOD_NUM = $this->addTPeriodNum ? $this->addTPeriodNum : null;
  257. $model->IS_PERIOD_OPEN = $this->isPeriodOpen ? $this->isPeriodOpen : 0;
  258. $model->OPEN_PERIOD_NUM = $this->openPeriodNum;
  259. $model->CREATE_REMARK = $this->remark;
  260. $model->AUDIT_ADMIN = \Yii::$app->user->id;
  261. $model->AUDIT_STATUS = \Yii::$app->params['auditStatus']['true']['value'];
  262. $model->AUDITED_AT = Date::nowTime();
  263. if (!$model->save()) {
  264. throw new Exception(Form::formatErrorsForApi($model->getErrors()));
  265. }
  266. // 把商城会员表的状态修改
  267. // 如果是从关停修改为正常状态,并且不是马上开通的先不开通,等待封期时,到那一期再给会员开通,其他的情况现在就调整状态
  268. $userModel = $this->_userModel;
  269. $beforeStatus = $userModel->STATUS;
  270. if (!($model->ORI_VALUE == self::STATUS_CLOSE && $model->STATUS_VALUE == self::STATUS_NORMAL && $model->IS_PERIOD_OPEN)) {
  271. $userModel->STATUS = $model->STATUS_VALUE;
  272. $userModel->STATUS_AT = Date::nowTime();
  273. if (!$userModel->save()) {
  274. throw new Exception(Form::formatErrorsForApi($userModel->getErrors()));
  275. }
  276. }
  277. if (!($model->ORI_VALUE == self::STATUS_CLOSE && $model->IS_PERIOD_OPEN)) {
  278. UserWallet::updateAll(['CLEAR_BY_CLOSED_AT'=> 0], 'USER_ID=:USER_ID', [':USER_ID' => $model->USER_ID]);
  279. }
  280. // 开始会员状态相关的后续功能
  281. // 注销立即清空全部会员所有钱包余额、奖金余额、大区剩余业绩、和各区业绩,自动提现改为手动提现
  282. // 注销需要设置立即加T,还是按照设定期数加T,(思路:假设115封期的时候先从会员状态审核表查看116期,批量更新116期需要加T的会员的身份证表前缀为字母T)
  283. // 设置成黑名单后自动提现改为手动提现
  284. // 停发立即加T,自动提现改为手动提现,清空的参照奖金需求
  285. // 取消关停状态可以选择期数开通,到期自动开
  286. // 老会员需要开通时选择报单级别
  287. // 关停开通时,首次报复销单需要交足额的复销,这个在会员表有参数 IS_FIRST_OPEN
  288. if ($model->STATUS_VALUE == self::STATUS_NORMAL) {
  289. if (!$this->isPeriodOpen) {
  290. // 身份证号取消加T
  291. User::updateAll(['ID_CARD_PREFIX' => ''], 'ID=:ID', [':ID' => $userModel->ID]);
  292. // 查看开通之前的状态是什么,如果是关停状态,就把会员表的首次开通的字段设标记
  293. if ($beforeStatus == self::STATUS_CLOSE) {
  294. User::updateAll(['IS_FIRST_OPEN' => 1], 'ID=:ID', [':ID' => $userModel->ID]);
  295. }
  296. }
  297. }
  298. //注销
  299. elseif ($model->STATUS_VALUE == self::STATUS_LOGOUT) {
  300. if ($perfPeriod) {
  301. // 清空大区剩余业绩
  302. $perfPeriod->SURPLUS_1L = 0;
  303. $perfPeriod->SURPLUS_2L = 0;
  304. $perfPeriod->SURPLUS_3L = 0;
  305. $perfPeriod->SURPLUS_4L = 0;
  306. $perfPeriod->SURPLUS_5L = 0;
  307. if (!$perfPeriod->save()) {
  308. throw new Exception(Form::formatErrorsForApi($perfPeriod->getErrors()));
  309. }
  310. }
  311. // 清空各区业绩
  312. $userPerf = UserPerf::findOne(['USER_ID' => $userModel->ID]);
  313. if ($userPerf) {
  314. $userPerf->PV_1L = 0;
  315. $userPerf->PV_2L = 0;
  316. $userPerf->PV_3L = 0;
  317. $userPerf->PV_4L = 0;
  318. $userPerf->PV_5L = 0;
  319. if (!$userPerf->save()) {
  320. throw new Exception(Form::formatErrorsForApi($userPerf->getErrors()));
  321. }
  322. }
  323. // 清空所有奖金
  324. Balance::clearAllBonus($userModel->ID, ['REMARK' => '清空账户余额','DEAL_TYPE'=>DealType::DEDUCT_LOGOUT]);
  325. // 取消自动提现
  326. Withdraw::setAutoWithdraw($userModel->ID, 0);
  327. // 向下找新的主会员
  328. UserBind::setNewMainBind($userModel->ID);
  329. // 如果立即加T,否则到期数自动加T(从封期实现)
  330. if (!$this->isPeriodAddT) {
  331. User::updateAll(['ID_CARD_PREFIX' => 'T'], 'ID=:ID', [':ID' => $userModel->ID]);
  332. }
  333. } elseif ($model->STATUS_VALUE == self::STATUS_BLACKLIST) {
  334. // 取消自动提现
  335. Withdraw::setAutoWithdraw($userModel->ID, 0);
  336. // 向下找新的主会员
  337. UserBind::setNewMainBind($userModel->ID);
  338. } elseif ($model->STATUS_VALUE == self::STATUS_STOP_SEND) {
  339. // 取消自动提现
  340. Withdraw::setAutoWithdraw($userModel->ID, 0);
  341. // 向下找新的主会员
  342. UserBind::setNewMainBind($userModel->ID);
  343. // 如果立即加T,否则到期数自动加T(从封期实现)
  344. if (!$this->isPeriodAddT) {
  345. User::updateAll(['ID_CARD_PREFIX' => 'T'], 'ID=:ID', [':ID' => $userModel->ID]);
  346. }
  347. }
  348. //永久关停
  349. elseif ($model->STATUS_VALUE == self::STATUS_CLOSE) {
  350. $this->_afterClose($userModel->ID,$perfPeriod);
  351. }
  352. } elseif ($this->auditStatus == 'reject') {
  353. $model->CREATE_REMARK = $this->remark;
  354. $model->AUDIT_ADMIN = \Yii::$app->user->id;
  355. $model->AUDIT_STATUS = \Yii::$app->params['auditStatus']['reject']['value'];
  356. $model->AUDITED_AT = Date::nowTime();
  357. if (!$model->save()) {
  358. throw new Exception(Form::formatErrorsForApi($model->getErrors()));
  359. }
  360. }
  361. $transaction->commit();
  362. } catch (Exception $e) {
  363. $transaction->rollBack();
  364. $this->addError('audit', $e->getMessage());
  365. return null;
  366. }
  367. // 记录日志
  368. $this->adminOperateLogger->afterUpdate($model)->clean()->save([
  369. 'optType' => '审核会员状态',
  370. 'userId' => $model->USER_ID,
  371. 'userName' => Info::getUserNameByUserId($model->USER_ID),
  372. 'remark' => $model->CREATE_REMARK,
  373. ]);
  374. return $model;
  375. }
  376. /**
  377. * 调整是否运作
  378. * @return User|null
  379. */
  380. public function operating() {
  381. if (!$this->validate()) {
  382. return null;
  383. }
  384. $this->adminOperateLogger->fetchClass = User::class;
  385. $this->adminOperateLogger->setIsBatch(true)->beforeUpdate($this->userIds, 'ID',['select'=>'ID,NOT_OPERATING']);
  386. $allUidIn = implode("','", $this->userIds);
  387. User::updateAll(['NOT_OPERATING' => !$this->isOperating], "ID IN ('" . $allUidIn . "')");
  388. $this->adminOperateLogger->setIsBatch(true)->afterUpdate($this->userIds, 'ID',['select'=>'ID,NOT_OPERATING']);
  389. $this->adminOperateLogger->setBatchField('ID')->setOptObjField('ID')->clean()->save([
  390. 'optType' => '调整会员运作状态【'.($this->isOperating ? '运作' : '不运作').'】',
  391. 'remark' => $this->remark,
  392. ]);
  393. return $this->userIds;
  394. }
  395. /**
  396. * 自动关停
  397. * @return UserStatusAudit|null
  398. * @throws \yii\db\Exception
  399. */
  400. public function autoClose() {
  401. if (!$this->validate()) {
  402. return null;
  403. }
  404. $db = \Yii::$app->db;
  405. $transaction = $db->beginTransaction();
  406. try {
  407. // 获取会员当前的状态
  408. $oriStatus = Status::getStatus($this->userId);
  409. $model = new UserStatusAudit();
  410. $model->USER_ID = $this->userId;
  411. $model->STATUS_VALUE = self::STATUS_CLOSE;
  412. $model->ORI_VALUE = $oriStatus;
  413. $model->PERIOD_NUM = $this->periodNum;
  414. $model->AUDIT_STATUS = \Yii::$app->params['auditStatus']['true']['value'];
  415. $model->IS_PERIOD_ADD_T = 0;
  416. $model->ADD_T_PERIOD_NUM = 0;
  417. $model->IS_PERIOD_OPEN = 0;
  418. $model->OPEN_PERIOD_NUM = 0;
  419. $model->CREATE_REMARK = '自动关停';
  420. $model->CREATE_ADMIN = 0;
  421. $model->CREATED_AT = Date::nowTime();
  422. if (!$model->save()) {
  423. throw new Exception(Form::formatErrorsForApi($model->getErrors()));
  424. }
  425. $userModel = User::findOne(['ID' => $this->userId]);
  426. $userModel->STATUS = self::STATUS_CLOSE;
  427. $userModel->STATUS_AT = Date::nowTime();
  428. if (!$userModel->save()) {
  429. throw new Exception(Form::formatErrorsForApi($userModel->getErrors()));
  430. }
  431. $this->_afterClose($this->userId);
  432. $transaction->commit();
  433. } catch (Exception $e) {
  434. $transaction->rollBack();
  435. $this->addError('autoClose', $e->getMessage());
  436. return null;
  437. }
  438. return $model;
  439. }
  440. /**
  441. * 关停后对会员操作
  442. * @param $userId
  443. * @param null $perfPeriod
  444. * @throws Exception
  445. * @throws \yii\db\Exception
  446. */
  447. private function _afterClose($userId,$perfPeriod=null){
  448. if(!$perfPeriod) {
  449. $maxPeriodNum = Period::sentMaxPeriodNum();
  450. $perfPeriod = PerfPeriod::findOne(['USER_ID' => $userId, 'PERIOD_NUM' => $maxPeriodNum]);
  451. }
  452. // 清空大区剩余业绩
  453. if ($perfPeriod) {
  454. $perfPeriod->SURPLUS_1L = 0;
  455. $perfPeriod->SURPLUS_2L = 0;
  456. $perfPeriod->SURPLUS_3L = 0;
  457. $perfPeriod->SURPLUS_4L = 0;
  458. $perfPeriod->SURPLUS_5L = 0;
  459. if (!$perfPeriod->save()) {
  460. throw new Exception(Form::formatErrorsForApi($perfPeriod->getErrors()));
  461. }
  462. }
  463. // 清空各区业绩
  464. $userPerf = UserPerf::findOne(['USER_ID' => $userId]);
  465. if ($userPerf) {
  466. $userPerf->PV_1L = 0;
  467. $userPerf->PV_2L = 0;
  468. $userPerf->PV_3L = 0;
  469. $userPerf->PV_4L = 0;
  470. $userPerf->PV_5L = 0;
  471. if (!$userPerf->save()) {
  472. throw new Exception(Form::formatErrorsForApi($userPerf->getErrors()));
  473. }
  474. }
  475. // 清空所有奖金 暂时不清奖金<19.10.1>@190730
  476. // Balance::clearAllBonus($userId, ['REMARK' => '会员永久关停']);
  477. // 取消自动提现
  478. Withdraw::setAutoWithdraw($userId, 0);
  479. // 身份证号立即加T,聘级将为无聘级
  480. User::updateAll(['ID_CARD_PREFIX' => 'T', 'EMP_LV' => EmployLevel::getDefaultLevelId()], 'ID=:ID', [':ID' => $userId]);
  481. // 向下找新的主会员
  482. UserBind::setNewMainBind($userId);
  483. }
  484. /**
  485. * 自动关停
  486. * @param $periodNum
  487. * @param int $closedAt
  488. * @param $limit
  489. * @param int $start
  490. * @param null $closeInspectStart
  491. * @param null $closeInspectPv
  492. * @return bool
  493. * @throws \yii\db\Exception
  494. */
  495. public static function autoChkClose($periodNum, $closedAt = 0, $limit, $start = 0, $closeInspectStart = null, $closeInspectPv = null) {
  496. //初始化
  497. if (!$closeInspectStart || !$closeInspectPv) {
  498. $systemConfig = Cache::getSystemConfig();
  499. $closeInspectMonth = $systemConfig['closeInspectMonth']['VALUE'];
  500. $closeInspectStart = Date::lastNumMonth($closeInspectMonth, $closedAt);
  501. $closeInspectPv = $systemConfig['closeInspectPv']['VALUE'];
  502. }
  503. //考察所有未注销未关停的会员 (修复UserInfo没有STATUS)
  504. $allData = User::find()->where('STATUS!=:STATUS_CLOSE AND STATUS!=:STATUS_LOGOUT AND SUB_COM_LEADER!=1',[':STATUS_CLOSE'=>self::STATUS_CLOSE,':STATUS_LOGOUT'=>self::STATUS_LOGOUT])->select('ID')->offset($start)->limit($limit)->asArray()->all();
  505. if ($allData) {
  506. foreach ($allData as $data) {
  507. // 修复绑定的START和END是关键字不允许作为绑定参数
  508. $pvPcs = PerfPeriod::find()->where('CREATED_AT>:START_TIME AND CREATED_AT<:END_TIME', [':START_TIME' => $closeInspectStart, ':END_TIME' => $closedAt])->SUM('PV_PCS');
  509. if ($pvPcs < $closeInspectPv) {
  510. //未达到业绩,封停会员
  511. $formModel = new UserStatusForm();
  512. $formModel->scenario = 'autoClose';
  513. $formModel->userId = $data['ID'];
  514. $formModel->periodNum = $periodNum;
  515. if (!$formModel->autoClose()) {
  516. continue;
  517. }
  518. unset($formModel);
  519. }
  520. }
  521. unset($allData);
  522. $start = $start + $limit;
  523. return self::autoChkClose($periodNum, $closedAt, $limit, $start, $closeInspectStart, $closeInspectPv);
  524. }
  525. return true;
  526. }
  527. /**
  528. * 删除前
  529. * @param $selected
  530. */
  531. public function beforeDelete($selected) {
  532. $this->adminOperateLogger->setIsBatch(true)->beforeDelete($selected, 'ID');
  533. }
  534. /**
  535. * 删除
  536. * @param $selected
  537. * @throws Exception
  538. */
  539. public function delete($selected) {
  540. $this->adminOperateLogger->clean()->save([
  541. 'optType' => '删除会员状态待审核数据',
  542. ]);
  543. }
  544. /**
  545. * 清空关停会员钱包
  546. * @return array|null
  547. * @throws Exception
  548. * @throws \yii\db\Exception
  549. */
  550. public function clearWallet() {
  551. if (!$this->validate()) {
  552. return null;
  553. }
  554. $uids = [];
  555. $users = Status::getCloseUser();
  556. if ($users) {
  557. $uids = array_column($users, 'ID');
  558. $this->adminOperateLogger->fetchClass = UserBonus::class;
  559. $this->adminOperateLogger->setIsBatch(true)->beforeUpdate($uids, 'USER_ID');
  560. $userBonus = $this->adminOperateLogger->saveBeforeContent;
  561. $this->adminOperateLogger->fetchClass = UserWallet::class;
  562. $this->adminOperateLogger->setIsBatch(true)->beforeUpdate($uids, 'USER_ID');
  563. $shopWallet = $this->adminOperateLogger->saveBeforeContent;
  564. $this->adminOperateLogger->saveBeforeContent=Tool::mergeArrayWithKey($userBonus,$shopWallet);
  565. $db = \Yii::$app->db;
  566. $transaction = $db->beginTransaction();
  567. try {
  568. foreach ($users as $u) {
  569. // 清空所有奖金
  570. Balance::clearAllBonus($u['ID'], ['REMARK' => '清空账户余额', 'DEAL_TYPE' => DealType::DEDUCT_CLOSE]);
  571. }
  572. $transaction->commit();
  573. } catch (Exception $e) {
  574. $transaction->rollBack();
  575. }
  576. $this->adminOperateLogger->fetchClass = UserBonus::class;
  577. $this->adminOperateLogger->setIsBatch(true)->afterUpdate($uids, 'USER_ID');
  578. $userBonus = $this->adminOperateLogger->saveAfterContent;
  579. $this->adminOperateLogger->fetchClass = UserWallet::class;
  580. $this->adminOperateLogger->setIsBatch(true)->afterUpdate($uids, 'USER_ID');
  581. $shopWallet = $this->adminOperateLogger->saveAfterContent;
  582. $this->adminOperateLogger->saveAfterContent=Tool::mergeArrayWithKey($userBonus,$shopWallet);
  583. $this->adminOperateLogger->setBatchField('USER_ID')->setOptObjField('USER_ID')->clean()->save([
  584. 'optType' => '清空关停会员钱包',
  585. 'remark' => $this->remark,
  586. ]);
  587. return $uids;
  588. } else {
  589. throw new Exception('暂无符合条件的会员');
  590. }
  591. }
  592. }