UserSystemForm.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php
  2. namespace common\models\forms;
  3. use common\helpers\Date;
  4. use common\components\Model;
  5. use common\helpers\Form;
  6. use common\helpers\Log;
  7. use common\helpers\user\Info;
  8. use common\libs\logging\operate\AdminOperate;
  9. use common\models\BonusAsync;
  10. use common\models\Period;
  11. use common\models\UserInfo;
  12. use common\models\UserRelation;
  13. use common\models\UserSystem;
  14. use yii\base\Exception;
  15. /**
  16. * Login form
  17. */
  18. class UserSystemForm extends Model {
  19. public $id;
  20. public $systemName;
  21. public $leaderUserName;
  22. public $remark;
  23. private $_leaderUid;
  24. private $_tempSystemLeaders = []; // 用于循环给下级设置体系的时候,临时设置子集领导的数组
  25. private $_limit = 2;
  26. public function init() {
  27. parent::init();
  28. $this->adminOperateLogger = new AdminOperate([
  29. 'fetchClass' => UserSystem::class,
  30. ]);
  31. }
  32. /**
  33. * @inheritdoc
  34. */
  35. public function rules() {
  36. return [
  37. [['id', 'systemName', 'leaderUserName', 'remark'], 'trim'],
  38. [['id', 'systemName', 'leaderUserName'], 'required'],
  39. [['systemName'], 'unique', 'on' => 'update', 'targetClass' => UserSystem::class, 'targetAttribute' => 'SYSTEM_NAME', 'when' => function ($model) {
  40. return $model->isAttributeChanged('SYSTEM_NAME');
  41. }],
  42. [['leaderUserName'], 'exist', 'targetClass' => UserInfo::class, 'targetAttribute' => 'USER_NAME'],
  43. [['id'], 'exist', 'targetClass' => UserSystem::class, 'targetAttribute' => 'ID', 'on'=>'renewSystem'],
  44. [['leaderUserName'], 'isLeaderUser'],
  45. ];
  46. }
  47. /**
  48. * 指定校验场景
  49. * @return array
  50. */
  51. public function scenarios() {
  52. $parentScenarios = parent::scenarios();
  53. $customScenarios = [
  54. 'add' => ['systemName', 'leaderUserName','remark'],
  55. 'edit' => ['systemName','leaderUserName', 'remark'],
  56. 'renewSystem' => ['id'],
  57. ];
  58. return array_merge($parentScenarios, $customScenarios);
  59. }
  60. public function attributeLabels() {
  61. return [
  62. 'systemName' => '体系名称',
  63. 'leaderUserName' => '领导人会员编号',
  64. ];
  65. }
  66. public function isLeaderUser($attributes) {
  67. $leaderUserInfo = UserInfo::findOneAsArray(['USER_NAME' => $this->leaderUserName]);
  68. if ($leaderUserInfo) {
  69. $this->_leaderUid = $leaderUserInfo['USER_ID'];
  70. }
  71. }
  72. /**
  73. * 页面端编辑
  74. * @return UserSystem|null|static
  75. * @throws \yii\db\Exception
  76. */
  77. public function edit() {
  78. if (!$this->validate()) {
  79. return null;
  80. }
  81. return $this->_editHandle();
  82. }
  83. /**
  84. * 恢复
  85. * @return UserSystem|null
  86. * @throws \yii\db\Exception
  87. */
  88. public function renewSystem(){
  89. if (!$this->validate()) {
  90. return null;
  91. }
  92. return $this->_editHandle();
  93. }
  94. /**
  95. * 撤销体系前
  96. * @param $selected
  97. * @throws Exception
  98. */
  99. public function beforeDelete($selected) {
  100. $this->adminOperateLogger->setIsBatch(true)->setOptObjField('LEADER_UID')->beforeDelete($selected, 'ID');
  101. foreach ($selected as $id) {
  102. $period = Period::instance();
  103. $model = UserSystem::findOne(['ID' => $id]);
  104. $model->UPDATED_AT = Date::nowTime();
  105. $model->UPDATE_PERIOD_NUM = $period->getNowPeriodNum();
  106. $model->UPDATE_ADMIN = \Yii::$app->user->id;
  107. if (!$model->save()) {
  108. throw new Exception(Form::formatErrorsForApi($model->getErrors()));
  109. }
  110. $leaderUid = $model->LEADER_UID;
  111. // 把该体系对应的领导人及下级所有是该体系的会员,全部改为上级的体系
  112. // 获取该体系的上级会员所在的体系
  113. $parentUserInfo = UserRelation::getFirstParentUserInfo($leaderUid);
  114. if ($parentUserInfo) {
  115. $newSystemId = $parentUserInfo['SYSTEM_ID'];
  116. } else {
  117. $newSystemId = null;
  118. }
  119. UserInfo::updateAll(['IS_SYSTEM_LEADER' => 0], 'USER_ID=:USER_ID', [':USER_ID' => $leaderUid]);
  120. // 把该体系的所有体系都改成新体系
  121. UserInfo::updateAll(['SYSTEM_ID' => $newSystemId], 'SYSTEM_ID=:SYSTEM_ID AND IS_SYSTEM_LEADER=0', [':SYSTEM_ID' => $id]);
  122. }
  123. }
  124. /**
  125. * 撤销体系
  126. * @param $selected
  127. */
  128. public function delete($selected) {
  129. $this->adminOperateLogger->clean()->save([
  130. 'optType' => '撤销体系',
  131. ]);
  132. }
  133. /**
  134. * 处理编辑
  135. * @return UserSystem|null
  136. * @throws \yii\db\Exception
  137. */
  138. private function _editHandle() {
  139. if($this->scenario!='add'){
  140. $this->adminOperateLogger->beforeUpdate(UserSystem::findOne(['ID' => $this->id]));
  141. }
  142. $transaction = \Yii::$app->db->beginTransaction();
  143. try {
  144. $period = Period::instance();
  145. if ($this->scenario == 'add') {
  146. $model = new UserSystem();
  147. $model->SYSTEM_NAME = $this->systemName;
  148. $model->LEADER_UID = $this->_leaderUid;
  149. $model->PERIOD_NUM = $period->getNowPeriodNum();
  150. $model->CREATE_REMARK = $this->remark;
  151. $model->CREATE_ADMIN = \Yii::$app->user->id;
  152. $model->CREATED_AT = Date::nowTime();
  153. } elseif ($this->scenario == 'edit') {
  154. $model = UserSystem::findOne(['ID' => $this->id]);
  155. if($model->IS_DEL){
  156. $this->addError('id', '该体系已被撤销,不能编辑');
  157. return null;
  158. }
  159. $model->SYSTEM_NAME = $this->systemName;
  160. $model->LEADER_UID = $this->_leaderUid;
  161. $model->UPDATED_AT = Date::nowTime();
  162. $model->UPDATE_PERIOD_NUM = $period->getNowPeriodNum();
  163. $model->UPDATE_ADMIN = \Yii::$app->user->id;
  164. $model->CREATE_REMARK = $this->remark;
  165. } elseif ($this->scenario == 'renewSystem') {
  166. $model = UserSystem::findOne(['ID' => $this->id]);
  167. $model->IS_DEL = 0;
  168. $model->UPDATED_AT = Date::nowTime();
  169. $model->UPDATE_PERIOD_NUM = $period->getNowPeriodNum();
  170. $model->UPDATE_ADMIN = \Yii::$app->user->id;
  171. $this->_leaderUid = $model->LEADER_UID;
  172. }else {
  173. $this->addError('id', '提交场景不存在');
  174. return null;
  175. }
  176. if (!$model->save()) {
  177. throw new Exception(Form::formatErrorsForApi($model->getErrors()));
  178. }
  179. // 下级会员全部变成该体系的会员
  180. //if ($this->scenario == 'add') {
  181. // 自己也变成该体系
  182. UserInfo::updateAll(['SYSTEM_ID' => $model->ID, 'IS_SYSTEM_LEADER'=>1], 'USER_ID=:USER_ID', [':USER_ID' => $this->_leaderUid]);
  183. $this->_childrenChangeSystem($this->_leaderUid, $model->ID);
  184. //}
  185. $transaction->commit();
  186. } catch (Exception $e) {
  187. $transaction->rollBack();
  188. $this->addError('edit', $e->getMessage());
  189. return null;
  190. }
  191. if($this->scenario!='add'){
  192. $this->adminOperateLogger->afterUpdate($model);
  193. }else{
  194. $this->adminOperateLogger->afterInsert($model);
  195. }
  196. $optType = '添加体系';
  197. if($this->scenario=='edit'){
  198. $optType = '编辑体系';
  199. }elseif ($this->scenario=='renewSystem'){
  200. $optType = '恢复体系';
  201. }
  202. $this->adminOperateLogger->clean()->save([
  203. 'optType' => $optType,
  204. 'userId' => $model->LEADER_UID,
  205. 'userName' => Info::getUserNameByUserId($model->LEADER_UID),
  206. 'remark' => $this->remark??''
  207. ]);
  208. return $model;
  209. }
  210. /**
  211. * 改变子会员的体系
  212. * @param $userId
  213. * @param $systemId
  214. * @throws \yii\db\Exception
  215. */
  216. private function _childrenChangeSystem($userId, $systemId){
  217. // 查询子会员里面是体系领导人的所有子会员
  218. $allChildSystemLeader = UserRelation::find()->select('UR.*,UI.SYSTEM_ID')->from(UserRelation::tableName().' AS UR')->join('LEFT JOIN', UserInfo::tableName().' AS UI', 'UI.USER_ID=UR.USER_ID')->where('UR.PARENT_UID=:PARENT_UID AND UI.IS_SYSTEM_LEADER=1', [':PARENT_UID'=>$userId])->asArray()->all();
  219. // 先把所有子会员的体系,全部改成新体系
  220. $sql = "UPDATE {{%USER_INFO}} UI SET UI.SYSTEM_ID=:SYSTEM_ID WHERE EXISTS (SELECT UR.USER_ID FROM {{%USER_RELATION}} UR WHERE UI.USER_ID=UR.USER_ID AND UR.PARENT_UID=:PARENT_UID)";
  221. \Yii::$app->db->createCommand($sql)->bindValues([':SYSTEM_ID'=>$systemId, ':PARENT_UID'=>$userId])->query();
  222. // 循环把所有子会员的体系都设置了
  223. foreach($allChildSystemLeader as $ChildSystemLeader){
  224. UserInfo::updateAll(['SYSTEM_ID' => $ChildSystemLeader['SYSTEM_ID']], 'USER_ID=:USER_ID', [':USER_ID' => $ChildSystemLeader['USER_ID']]);
  225. $sql = "UPDATE {{%USER_INFO}} UI SET UI.SYSTEM_ID=:SYSTEM_ID WHERE EXISTS (SELECT UR.USER_ID FROM {{%USER_RELATION}} UR WHERE UI.USER_ID=UR.USER_ID AND UR.PARENT_UID=:PARENT_UID)";
  226. \Yii::$app->db->createCommand($sql)->bindValues([':SYSTEM_ID'=>$ChildSystemLeader['SYSTEM_ID'], ':PARENT_UID'=>$ChildSystemLeader['USER_ID']])->query();
  227. }
  228. }
  229. }