UserTeamworkForm.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  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\user\Info;
  7. use common\libs\logging\operate\AdminOperate;
  8. use common\models\Period;
  9. use common\models\DeclarationLevel;
  10. use common\models\EmployLevel;
  11. use common\models\User;
  12. use common\models\UserBind;
  13. use common\models\UserInfo;
  14. use common\models\UserTeamwork;
  15. use yii\base\Exception;
  16. /**
  17. * 点位合作表单
  18. */
  19. class UserTeamworkForm extends Model {
  20. public $id;
  21. public $type;
  22. public $userName;
  23. public $mainUserName;
  24. public $dividePercent;
  25. public $divideArr;
  26. public $nation;
  27. public $realName;
  28. public $idCard;
  29. public $mobile;
  30. public $address;
  31. public $openBank;
  32. public $bankAddress;
  33. public $bankNo;
  34. public $bankAreaSelected;
  35. public $areaSelected;
  36. public $tel;
  37. public $remark;
  38. const HAS_USER = 1; // 在网站已有会员
  39. const NOT_USER = 0; // 在网站没有会员
  40. private $_uid;
  41. private $_mainUid;
  42. private $_model;
  43. public function init() {
  44. parent::init();
  45. $this->adminOperateLogger = new AdminOperate([
  46. 'fetchClass' => UserTeamwork::class,
  47. ]);
  48. }
  49. /**
  50. * @inheritdoc
  51. */
  52. public function rules() {
  53. return [
  54. [['id', 'type', 'userName', 'mainUserName', 'dividePercent', 'nation', 'realName', 'idCard', 'mobile', 'address', 'openBank', 'bankAddress', 'bankNo', 'bankAreaSelected', 'areaSelected', 'tel', 'remark'], 'trim'],
  55. [['id', 'type', 'userName', 'mainUserName', 'dividePercent', 'idCard', 'realName'], 'required'],
  56. [['dividePercent'], 'price', 'message' => '分成比例必须是整数或者两位小数'],
  57. [['type'], 'boolean', 'message' => '添加类型格式不正确'],
  58. [['userName'], 'isUserName'],
  59. [['mobile', 'tel'], 'mobile'],
  60. [['bankNo'], 'string', 'max' => 19],
  61. [['mainUserName'], 'isMainUserName'],
  62. [['dividePercent'], 'isDivide'],
  63. [['divideArr'], 'isDivideArr'],
  64. [['id'], 'initModel'],
  65. [['userName'], 'userName'],
  66. [['idCard'], 'isIdCard'],
  67. [['realName','address','bankAddress'], 'realName'],
  68. ];
  69. }
  70. /**
  71. * 指定校验场景
  72. * @return array
  73. */
  74. public function scenarios() {
  75. $parentScenarios = parent::scenarios();
  76. $customScenarios = [
  77. 'add' => ['type', 'userName', 'mainUserName', 'dividePercent', 'nation', 'realName', 'idCard', 'mobile', 'address', 'openBank', 'bankAddress', 'bankNo', 'bankAreaSelected', 'areaSelected', 'tel', 'remark'],
  78. 'changeDivide' => ['id', 'divideArr', 'remark'],
  79. ];
  80. return array_merge($parentScenarios, $customScenarios);
  81. }
  82. public function attributeLabels() {
  83. return [
  84. 'type' => '添加类型',
  85. 'userName' => '会员编号',
  86. 'mainUserName' => '主会员编号',
  87. 'dividePercent' => '分成比例',
  88. 'nation' => '民族',
  89. 'realName' => '会员姓名',
  90. 'idCard' => '身份证',
  91. 'mobile' => '手机号',
  92. 'address' => '地址',
  93. 'openBank' => '开户行',
  94. 'bankAddress' => '银行地址',
  95. 'bankNo' => '银行账号',
  96. 'bankAreaSelected' => '银行地区',
  97. 'areaSelected' => '地区',
  98. 'tel' => '电话',
  99. 'remark' => '备注',
  100. ];
  101. }
  102. /**
  103. * 初始化model
  104. * @param $attributes
  105. */
  106. public function initModel($attributes) {
  107. $this->_model = UserTeamwork::findOne(['ID' => $this->id]);
  108. if (!$this->_model) {
  109. $this->addError($attributes, 'The data does not exist'); // 数据不存在
  110. }
  111. }
  112. /**
  113. * 用户名是否正确
  114. * @param $attributes
  115. * @throws Exception
  116. */
  117. public function isUserName($attributes) {
  118. if ($this->userName == $this->mainUserName) {
  119. $this->addError($attributes, '同一会员不能合作');
  120. }
  121. if ($this->type == self::HAS_USER) {
  122. $userInfo = UserInfo::findOneAsArray(['USER_NAME' => $this->userName]);
  123. if ($userInfo) {
  124. $this->_uid = $userInfo['USER_ID'];
  125. if ($userInfo['IS_TEAM_MAIN'] == 1) {
  126. $this->addError($attributes, '该会员是其他点位合作的主会员,无法添加');
  127. }
  128. $info = Info::baseInfo($this->_uid);
  129. /*if ($info['STATUS'] == UserStatusForm::STATUS_LOGOUT || $info['STATUS'] == UserStatusForm::STATUS_CLOSE) {
  130. $this->addError($attributes, '注销或永久关停的会员不允许设置点位合作');
  131. }*/
  132. if ($info['STATUS'] != UserStatusForm::STATUS_NORMAL) {
  133. $this->addError($attributes, '非正常的会员不允许设置点位合作');
  134. }
  135. } else {
  136. $this->addError($attributes, 'Member does not exist'); // 会员不存在
  137. }
  138. } else {
  139. if (strpos(strtolower($this->userName), 'hz') !== 0) {
  140. $this->addError($attributes, '无点位的会员编号必须是以hz开头');
  141. }
  142. if (!$this->realName || !$this->idCard) {
  143. $this->addError($attributes, '请详细填写新增无点位会员的相关信息');
  144. }
  145. }
  146. }
  147. /**
  148. * 主会员编号
  149. * @param $attributes
  150. * @throws Exception
  151. */
  152. public function isMainUserName($attributes) {
  153. $userInfo = UserInfo::findOneAsArray(['USER_NAME' => $this->mainUserName]);
  154. if ($userInfo) {
  155. if (UserTeamwork::find()->where('USER_ID=:USER_ID AND MAIN_UID!=:USER_ID AND IS_DEL=0', [':USER_ID' => $userInfo['USER_ID']])->exists()) {
  156. $this->addError($attributes, '主会员已在其他点位有合作情况');
  157. }
  158. $info = Info::baseInfo($userInfo['USER_ID']);
  159. if ($info['STATUS'] != UserStatusForm::STATUS_NORMAL) {
  160. $this->addError($attributes, '非正常的主会员不允许设置点位合作');
  161. }
  162. $this->_mainUid = $userInfo['USER_ID'];
  163. } else {
  164. $this->addError($attributes, '主会员不存在');
  165. }
  166. }
  167. /**
  168. * 校验分成比例
  169. * @param $attributes
  170. * @return bool
  171. */
  172. public function isDivide($attributes) {
  173. /*$divideSum = UserTeamwork::findOneAsArray('USER_ID=:MAIN_UID AND MAIN_UID=:MAIN_UID AND IS_DEL=0', [':MAIN_UID' => $this->_mainUid], 'DIVIDE_PERCENT');
  174. if ($divideSum && $divideSum['DIVIDE_PERCENT'] <= $this->dividePercent) {
  175. $this->addError($attributes, '该合作者的分成比例不能超过主会员分成比例【' . $divideSum . '】');
  176. }*/
  177. }
  178. /**
  179. * 校验身份证号
  180. * @param $attributes
  181. * @return bool
  182. */
  183. public function isIdCard($attributes) {
  184. if($user=User::findOneAsArray('ID_CARD=:ID_CARD',[':ID_CARD'=>$this->idCard],'REAL_NAME')){
  185. if($user['REAL_NAME']!=$this->realName){
  186. $this->addError($attributes, '填写的会员姓名与已经实名认证的会员姓名不一致');
  187. }
  188. }
  189. }
  190. /**
  191. * 校验分成数组
  192. * @param $attributes
  193. * @return bool
  194. */
  195. public function isDivideArr($attributes) {
  196. $sum = 0;
  197. foreach ($this->divideArr as $value) {
  198. if (!preg_match("/^[0-9]+([.]{1}[0-9]{1,2})?$/", $value['DIVIDE_PERCENT'])) {
  199. $this->addError($attributes, '分成比例必须是整数或者两位小数');
  200. return false;
  201. }
  202. $sum += $value['DIVIDE_PERCENT'];
  203. }
  204. if ($sum != 100) {
  205. $this->addError($attributes, '确保总分成比例为100');
  206. }
  207. }
  208. /**
  209. * 添加
  210. * @return UserTeamwork|null
  211. * @throws \yii\base\Exception
  212. */
  213. public function add() {
  214. if (!$this->validate()) {
  215. return null;
  216. }
  217. $transaction = \Yii::$app->db->beginTransaction();
  218. try {
  219. $period = Period::instance();
  220. // 如果需要添加虚拟合作会员的,先新增会员
  221. if ($this->type == self::NOT_USER) {
  222. // 商城表增加会员
  223. $user = new User();
  224. $user->USER_NAME = $this->userName;
  225. $pwd = Info::passwordGenerator($this->idCard,$user->USER_NAME);
  226. $user->PASSWORD_HASH = \Yii::$app->security->generatePasswordHash($pwd);
  227. $pwd = Info::passwordGenerator($this->idCard,$user->USER_NAME,true);
  228. $user->PAY_PASSWORD = \Yii::$app->security->generatePasswordHash($pwd);
  229. $user->NATION = $this->nation ? $this->nation : 1;
  230. $user->REAL_NAME = $this->realName;
  231. $user->ID_CARD = $this->idCard;
  232. $user->MOBILE = $this->mobile;
  233. $user->ADDRESS = $this->address ? $this->address : '无';
  234. $user->ADDRESS = '无';
  235. $user->OPEN_BANK = $this->openBank;
  236. $user->BANK_ADDRESS = $this->bankAddress;
  237. $user->BANK_NO = $this->bankNo;
  238. $user->BANK_PROVINCE = $this->bankAreaSelected[0] ?? '0';
  239. $user->BANK_CITY = $this->bankAreaSelected[1] ?? '0';
  240. $user->BANK_COUNTY = $this->bankAreaSelected[2] ?? '0';
  241. $user->CREATED_AT = Date::nowTime();
  242. $user->STATUS = 1;
  243. $user->DEC_LV = DeclarationLevel::getDefaultLevelId();
  244. $user->EMP_LV = EmployLevel::getDefaultLevelId();
  245. $user->PROVINCE = $this->areaSelected[0] ?? '0';
  246. $user->CITY = $this->areaSelected[1] ?? '0';
  247. $user->COUNTY = $this->areaSelected[2] ?? '0';
  248. $user->TEL = $this->tel;
  249. //$user->REG_IS_COMPLETED = 1;
  250. $user->SUB_COM_ID = null;
  251. $user->AVATAR = 'avatar/1.png';
  252. $user->IS_DEC = 0;
  253. $user->DEC_ID = \Yii::$app->params['mainUserId'];
  254. $user->BIRTHDAY = null;
  255. $user->DEC_ROLE_ID = null;
  256. $user->PERIOD_AT = $period->getNowPeriodNum();
  257. $user->IS_UNION = 1;//合作会员标识
  258. $user->IS_DIRECT_SELLER = 0;
  259. $user->VERIFIED = 1;
  260. $user->VERIFIED_AT = Date::nowTime();;
  261. if (!$user->save()) {
  262. throw new Exception(Form::formatErrorsForApi($user->getErrors()));
  263. }
  264. $this->_uid = $user->ID;
  265. // 结算表用户表增加会员但不写入点位关系
  266. $userInfoModel = new UserInfo();
  267. $userInfoModel->USER_ID = $this->_uid;
  268. $userInfoModel->USER_NAME = $this->userName;
  269. $userInfoModel->CON_UID = '0';
  270. $userInfoModel->REC_UID = '0';
  271. $userInfoModel->IS_TEAM = 1;
  272. //$userInfoModel->PERIOD_NUM = $period->getNowPeriodNum();
  273. $userInfoModel->CREATED_AT = Date::nowTime();
  274. $userInfoModel->HIGHEST_EMP_LV = EmployLevel::getDefaultLevelId();
  275. $userInfoModel->ALLOW_TRANSFER = 1;
  276. $userInfoModel->HIGHEST_EMP_LV_PERIOD = $period->getNowPeriodNum();
  277. $userInfoModel->TRANSFER_PROP = 100.00;
  278. $userInfoModel->IS_GROUP_LEADER = 0;
  279. if (!$userInfoModel->save()) {
  280. throw new Exception(Form::formatErrorsForApi($userInfoModel->getErrors()));
  281. }
  282. }
  283. // 查看主点位是否已经存在
  284. if (!UserTeamwork::find()->where('USER_ID=:USER_ID AND MAIN_UID=:MAIN_UID AND IS_DEL=0', [':USER_ID' => $this->_mainUid, ':MAIN_UID' => $this->_mainUid])->exists()) {
  285. UserTeamwork::insertOne([
  286. 'USER_ID' => $this->_mainUid,
  287. 'MAIN_UID' => $this->_mainUid,
  288. 'DIVIDE_PERCENT' => 100 - $this->dividePercent,
  289. 'PERIOD_NUM' => $period->getNowPeriodNum(),
  290. 'IS_DEL' => 0,
  291. 'CREATE_REMARK' => $this->remark,
  292. 'CREATE_ADMIN' => \Yii::$app->user->id,
  293. 'CREATED_AT' => Date::nowTime(),
  294. ]);
  295. } else {
  296. $mainModel = UserTeamwork::findOne(['USER_ID' => $this->_mainUid]);
  297. $mainModel->DIVIDE_PERCENT = $mainModel->DIVIDE_PERCENT - $this->dividePercent;
  298. if (!$mainModel->save()) {
  299. throw new Exception(Form::formatErrorsForApi($mainModel->getErrors()));
  300. }
  301. }
  302. // 会员信息表添加点位合作标识
  303. UserInfo::updateAll(['IS_TEAM' => 1], 'USER_ID=:USER_ID', [':USER_ID' => $this->_uid]);
  304. UserInfo::updateAll(['IS_TEAM' => 1, 'IS_TEAM_MAIN' => 1], 'USER_ID=:USER_ID', [':USER_ID' => $this->_mainUid]);
  305. // 添加会员合作点位
  306. $model = new UserTeamwork();
  307. $model->USER_ID = $this->_uid;
  308. $model->MAIN_UID = $this->_mainUid;
  309. $model->DIVIDE_PERCENT = $this->dividePercent;
  310. $model->PERIOD_NUM = $period->getNowPeriodNum();
  311. $model->IS_DEL = 0;
  312. $model->CREATE_REMARK = $this->remark;
  313. $model->CREATE_ADMIN = \Yii::$app->user->id;
  314. $model->CREATED_AT = Date::nowTime();
  315. if (!$model->save()) {
  316. throw new Exception(Form::formatErrorsForApi($model->getErrors()));
  317. }
  318. //点位绑定
  319. UserBind::autoBind($this->_uid,$this->idCard,1);
  320. $transaction->commit();
  321. } catch (Exception $e) {
  322. $transaction->rollBack();
  323. User::deleteAll(['ID'=>$this->_uid]);
  324. $this->addError('add', $e->getMessage());
  325. return null;
  326. }
  327. if ($this->type == self::NOT_USER) {
  328. $this->adminOperateLogger->fetchClass = User::class;
  329. $this->adminOperateLogger->afterInsert($this->_uid, 'ID', ['select' => 'ID,NATION,REAL_NAME,ID_CARD,ADDRESS,MOBILE,PROVINCE,CITY,COUNTY,OPEN_BANK,BANK_ADDRESS,BANK_NO,BANK_PROVINCE,BANK_CITY,BANK_COUNTY,TEL,CREATED_AT,IS_UNION']);
  330. $userData = $this->adminOperateLogger->saveAfterContent;
  331. $this->adminOperateLogger->fetchClass = UserTeamwork::class;
  332. $this->adminOperateLogger->afterInsert($model);
  333. $infoData = $this->adminOperateLogger->saveAfterContent;
  334. $this->adminOperateLogger->saveAfterContent = array_merge($userData, $infoData);
  335. }else{
  336. $this->adminOperateLogger->afterInsert($model);
  337. }
  338. $this->adminOperateLogger->clean()->save([
  339. 'optType' => '添加合作点位',
  340. 'userId' => $model->USER_ID,
  341. 'userName' => Info::getUserNameByUserId($model->USER_ID),
  342. 'remark' => $this->remark
  343. ]);
  344. return $model;
  345. }
  346. /**
  347. * 改变分成比例
  348. * @return array|null
  349. * @throws \yii\db\Exception
  350. */
  351. public function changeDivide() {
  352. if (!$this->validate()) {
  353. return null;
  354. }
  355. $logs = [];
  356. $ids = array_column($this->divideArr, 'ID');
  357. $this->adminOperateLogger->setIsBatch(true)->beforeUpdate($ids,'ID');
  358. $transaction = \Yii::$app->db->beginTransaction();
  359. try {
  360. $period = Period::instance();
  361. foreach ($this->divideArr as $value) {
  362. $model = UserTeamwork::findOne(['ID'=>$value['ID']]);
  363. $model->DIVIDE_PERCENT = $value['DIVIDE_PERCENT'];
  364. $model->UPDATE_ADMIN = \Yii::$app->user->id;
  365. $model->CREATE_REMARK = $this->remark;
  366. $model->UPDATED_PERIOD = $period->getNowPeriodNum();
  367. $model->UPDATED_AT = Date::nowTime();
  368. if (!$model->save()) {
  369. throw new Exception(Form::formatErrorsForApi($model->getErrors()));
  370. }
  371. $logs[$value['USER_ID']] = $value['DIVIDE_PERCENT'];
  372. }
  373. $transaction->commit();
  374. } catch (Exception $e) {
  375. $transaction->rollBack();
  376. $this->addError('changeDivide', $e->getMessage());
  377. return null;
  378. }
  379. $this->adminOperateLogger->setIsBatch(true)->afterUpdate($ids,'ID');
  380. $this->adminOperateLogger->setOptObjField('USER_ID')->clean()->save([
  381. 'optType' => '编辑合作点位',
  382. 'remark' => $this->remark
  383. ]);
  384. return ['logs' => $logs];
  385. }
  386. /**
  387. * 删除
  388. * @param $selected
  389. */
  390. public static function delete($selected) {
  391. foreach ($selected as $select) {
  392. $userTeamwork = UserTeamwork::findOneAsArray('ID=:ID', [':ID' => $select], 'USER_ID');
  393. UserInfo::updateAll(['IS_TEAM' => 0, 'IS_TEAM_MAIN' => 0], 'USER_ID=:USER_ID', [':USER_ID' => $userTeamwork['USER_ID']]);
  394. // 如果是主合作者位取消了合作,那么子合作者也自动同时取消合作
  395. if ($userTeamwork['USER_ID'] == $userTeamwork['MAIN_UID']) {
  396. $allTeamUser = UserTeamwork::findAllAsArray('MAIN_UID=:MAIN_UID', [':MAIN_UID' => $userTeamwork['USER_ID']]);
  397. foreach ($allTeamUser as $user) {
  398. UserInfo::updateAll(['IS_TEAM' => 0, 'IS_TEAM_MAIN' => 0], 'USER_ID=:USER_ID', [':USER_ID' => $user['USER_ID']]);
  399. }
  400. UserTeamwork::updateAll(['IS_DEL' => 1], 'MAIN_UID=:MAIN_UID', [':MAIN_UID' => $userTeamwork['USER_ID']]);
  401. }
  402. }
  403. }
  404. }