UserClass.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. <?php
  2. namespace biz\user\classes;
  3. use biz\merchant\classes\MerchantAssetClass;
  4. use biz\user\services\UserIntegralService;
  5. use common\components\configDict;
  6. use common\services\ImageService;
  7. use common\services\xhMerchantExtendService;
  8. use common\services\xhUserCapitalService;
  9. use common\services\xhUserIntegralService;
  10. use common\services\xhUserMergeService;
  11. use Yii;
  12. use biz\base\classes\BaseClass;
  13. class UserClass extends BaseClass
  14. {
  15. public static $baseFile = '\biz\user\models\User';
  16. //用户和收入的来源
  17. public static $sourceType = [
  18. 2 => '朋友圈',
  19. 1 => '门店',
  20. 0 => '公众号',
  21. 3 => '淘宝',
  22. ];
  23. public static function generateUser($getUserInfo, $merchantId)
  24. {
  25. //替换掉微信不支持的图片
  26. $date = date("Y-m-d H:i:s");
  27. $time = time();
  28. $getUserInfo['userName'] = isset($getUserInfo['userName']) ? preg_replace('/[\x{10000}-\x{10FFFF}]/u', '', $getUserInfo['userName']) : '';
  29. $getUserInfo['sex'] = isset($getUserInfo['sex']) ? $getUserInfo['sex'] : 0;//未知
  30. $getUserInfo['isMember'] = 0;
  31. $getUserInfo['identity'] = 0;
  32. $subscribe = isset($getUserInfo['subscribe']) ? $getUserInfo['subscribe'] : 0;
  33. $getUserInfo['subscribe'] = $subscribe;
  34. $getUserInfo['merchantId'] = $merchantId;
  35. $getUserInfo['status'] = 0;
  36. //默认没有完整用户信息
  37. $isFull = 0;
  38. if (isset($getUserInfo['headImgUrl']) && !empty($getUserInfo['headImgUrl'])) {
  39. $isFull = 1;
  40. }
  41. $getUserInfo['isFull'] = $isFull;
  42. $getUserInfo['createTime'] = $date;
  43. $getUserInfo['avatar'] = '';
  44. $getUserInfo['password'] = '';
  45. $getUserInfo['payPassword'] = '';
  46. $getUserInfo['mobile'] = '';
  47. $getUserInfo['addTime'] = $time;
  48. $getUserInfo['visitTime'] = $time;
  49. $getUserInfo['source'] = isset($getUserInfo['source']) ? $getUserInfo['source'] : 0;
  50. $getUserInfo['hasSubscribe'] = 0;
  51. //生成用户基础信息
  52. $user = self::add($getUserInfo);
  53. $userId = $user['id'];
  54. if (empty($user['userName'])) {
  55. self::updateById($userId, ['userName' => $userId]);
  56. }
  57. $random = Yii::$app->getSecurity()->generateRandomString();//yii2 里生成32位唯一随机数
  58. $uniqueCode = $userId . $random;
  59. $assetData = ['userId' => $userId, 'merchantId' => $merchantId, 'createTime' => $date, 'uniqueCode' => $uniqueCode];
  60. //生成用户资产信息
  61. UserAssetClass::add($assetData);
  62. //保存头像
  63. if (isset($getUserInfo['headImgUrl']) && !empty($getUserInfo['headImgUrl'])) {
  64. if (empty($preUser) || (isset($preUser['avatar']) && empty($preUser['avatar']))) {
  65. $imgUrl = $getUserInfo['headImgUrl'];
  66. $name = ImageService::generateAvatar($merchantId, $userId, $imgUrl);
  67. self::updateById($userId, ['avatar' => $name]);
  68. }
  69. }
  70. //商家客户粉丝 +1
  71. $type = $subscribe == 1 ? 3 : 1;
  72. MerchantAssetClass::addCustomerFasNum($merchantId, $type);
  73. return $user;
  74. }
  75. public static function updateUser($originalUser, $getUserInfo, $merchantId)
  76. {
  77. $data = [];
  78. $assetData = [];
  79. $userId = $originalUser['id'];
  80. //替换掉微信不支持的图片
  81. $userName = isset($getUserInfo['userName']) ? preg_replace('/[\x{10000}-\x{10FFFF}]/u', '', $getUserInfo['userName']) : '';
  82. if (!empty($userName)) {
  83. $data['userName'] = $userName;
  84. }
  85. if (isset($getUserInfo['openId']) && !empty($getUserInfo['openId'])) {
  86. $openId = $getUserInfo['openId'];
  87. $data['openId'] = $openId;
  88. }
  89. if (isset($getUserInfo['miniOpenId']) && !empty($getUserInfo['miniOpenId'])) {
  90. $data['miniOpenId'] = $getUserInfo['miniOpenId'];
  91. }
  92. if (isset($getUserInfo['unionId']) && !empty($getUserInfo['unionId'])) {
  93. $data['unionId'] = $getUserInfo['unionId'];
  94. }
  95. if (isset($getUserInfo['sex'])) {
  96. $data['sex'] = $getUserInfo['sex'];
  97. }
  98. if (isset($getUserInfo['subscribe'])) {
  99. $data['subscribe'] = $getUserInfo['subscribe'];
  100. }
  101. if (isset($getUserInfo['subscribeTime'])) {
  102. $data['subscribeTime'] = $getUserInfo['subscribeTime'];
  103. }
  104. $data['merchantId'] = $merchantId;
  105. if (isset($getUserInfo['alipayId']) && !empty($getUserInfo['alipayId'])) {
  106. $data['alipayId'] = $getUserInfo['alipayId'];
  107. }
  108. if (isset($getUserInfo['isFull'])) {
  109. $data['isFull'] = $getUserInfo['isFull'];
  110. }
  111. if (isset($getUserInfo['headImgUrl']) && !empty($getUserInfo['headImgUrl'])) {
  112. $data['isFull'] = 1;
  113. }
  114. if (isset($getUserInfo['isMember'])) {
  115. $data['isMember'] = $getUserInfo['isMember'];
  116. $assetData['isMember'] = $getUserInfo['isMember'];
  117. }
  118. /**更新头像**/
  119. if (isset($originalUser['avatar']) == false || empty($originalUser['avatar'])) {
  120. if (isset($getUserInfo['headImgUrl']) && !empty($getUserInfo['headImgUrl'])) {
  121. $imgUrl = $getUserInfo['headImgUrl'];
  122. $name = ImageService::generateAvatar($merchantId, $userId, $imgUrl);
  123. $data['avatar'] = $name;
  124. }
  125. }
  126. /**商家增加粉丝**/
  127. if (isset($originalUser['subscribe']) && $originalUser['subscribe'] == 0 && isset($getUserInfo['subscribe']) && $getUserInfo['subscribe'] == 1) {
  128. MerchantAssetClass::addCustomerFasNum($merchantId, 2);
  129. }
  130. //更新访问时间
  131. self::updateById($userId, $data);
  132. if (!empty($assetData)) {
  133. UserAssetClass::updateByUserId($userId, $assetData);
  134. }
  135. $user = self::getById($userId);
  136. return $user;
  137. }
  138. public static function getByMiniOpenId($miniOpenId, $merchantId)
  139. {
  140. return self::getByCondition(['merchantId' => $merchantId, 'miniOpenId' => $miniOpenId]);
  141. }
  142. public static function getByAlipayId($alipayId, $merchantId)
  143. {
  144. return self::getByCondition(['merchantId' => $merchantId, 'alipayId' => $alipayId]);
  145. }
  146. public static function getByOpenId($openId, $merchantId)
  147. {
  148. return self::getByCondition(['merchantId' => $merchantId, 'openId' => $openId]);
  149. }
  150. public static function getByUnionId($unionId, $merchantId)
  151. {
  152. return self::getByCondition(['merchantId' => $merchantId, 'unionId' => $unionId]);
  153. }
  154. /**
  155. * 合并用户
  156. */
  157. public static function mergeUser($delUser, $retainUser)
  158. {
  159. $connection = Yii::$app->db;//事务处理
  160. $transaction = $connection->beginTransaction();
  161. try {
  162. $delUserId = $delUser['id'];
  163. $retainUserId = $retainUser['id'];
  164. $userName = $retainUser['userName'];
  165. $merchantId = $retainUser['merchantId'];
  166. //合并记录
  167. $return = xhUserMergeService::add(['delUserId' => $delUserId, 'merchantId' => $merchantId, 'retainUserId' => $retainUserId, 'addTime' => time(), 'createTime' => date("Y-m-d H:i:s")]);
  168. $targetId = $return['id'];
  169. $typeList = configDict::getConfig('capitalType');
  170. $capitalType = $typeList['xhMergeUser']['id'];
  171. $now = time();
  172. $date = date("Y-m-d H:i:s");
  173. //数据迁移
  174. $updateData = [];
  175. $updateKey = [
  176. 'mobile',
  177. 'password',
  178. 'payPassword',
  179. 'isMember',
  180. 'subscribe',
  181. 'hasSubscribe',
  182. 'subscribeTime',
  183. 'alipayId',
  184. 'openId',
  185. 'miniOpenId',
  186. 'unionId',
  187. ];
  188. foreach ($updateKey as $key) {
  189. if (isset($delUser[$key]) && !empty($delUser[$key])) {
  190. $updateData[$key] = $delUser[$key];
  191. }
  192. }
  193. if (!empty($updateData)) {
  194. $updateData['visitTime'] = time();
  195. self::updateById($retainUserId, $updateData);
  196. }
  197. //资产累加
  198. $addData = [];
  199. $delUserAsset = UserAssetClass::getByUserId($delUserId);
  200. $retainUserAsset = UserAssetClass::getByUserId($retainUserId);
  201. if (!empty($delUserAsset)) {
  202. //累计消费
  203. $delTotalExpend = isset($delUserAsset['totalExpend']) ? $delUserAsset['totalExpend'] : 0;
  204. if (!empty($delTotalExpend)) {
  205. $addData['totalExpend'] = $retainUserAsset['totalExpend'] + $delTotalExpend;
  206. //变化记录要增加
  207. }
  208. //累计收入
  209. $delTotalIncome = isset($delUserAsset['totalIncome']) ? $delUserAsset['totalIncome'] : 0;
  210. if (!empty($delTotalIncome)) {
  211. $addData['totalIncome'] = $retainUserAsset['totalIncome'] + $delTotalIncome;
  212. //变化记录要增加
  213. }
  214. //累计充值
  215. $delTotalRecharge = isset($delUserAsset['totalRecharge']) ? $delUserAsset['totalRecharge'] : 0;
  216. if (!empty($delTotalRecharge)) {
  217. $addData['totalRecharge'] = $retainUserAsset['totalRecharge'] + $delTotalRecharge;
  218. //变化记录要增加
  219. }
  220. //累计购买数量
  221. $delTotalBuyNum = isset($delUserAsset['totalBuyNum']) ? $delUserAsset['totalBuyNum'] : 0;
  222. if (!empty($delTotalBuyNum)) {
  223. $addData['totalBuyNum'] = $retainUserAsset['totalBuyNum'] + $delTotalBuyNum;
  224. //变化记录要增加
  225. }
  226. //余额
  227. $delBalance = isset($delUserAsset['balance']) ? $delUserAsset['balance'] : 0;
  228. if (!empty($delBalance)) {
  229. $addData['balance'] = $retainUserAsset['balance'] + $delBalance;
  230. //变化记录要增加
  231. $userCapitalData = [
  232. 'relateId' => (string)$targetId,
  233. 'balance' => $addData['balance'],
  234. 'totalIncome' => $retainUserAsset['totalIncome'] + $delBalance,
  235. 'totalExpend' => $retainUserAsset['totalExpend'],
  236. 'amount' => $delBalance,
  237. 'io' => 1,
  238. 'payWay' => 0,
  239. 'event' => '帐号合并',
  240. 'merchantId' => $merchantId,
  241. 'userId' => $retainUserId,
  242. 'alipayId' => '',
  243. 'userName' => $userName,
  244. 'operateId' => 0,
  245. 'createTime' => $date,
  246. 'addTime' => $now,
  247. 'capitalType' => $capitalType,
  248. ];
  249. xhUserCapitalService::add($userCapitalData);//用户资金流水增加
  250. }
  251. //积分
  252. $delIntegral = isset($delUserAsset['integral']) ? $delUserAsset['integral'] : 0;
  253. if (!empty($delIntegral)) {
  254. $addData['integral'] = $retainUserAsset['integral'] + $delIntegral;
  255. //注意会员等级要进行重新计算!!!!!还有积分变化记录要增加
  256. $integralData = [
  257. 'userId' => $retainUserId,
  258. 'userName' => $userName,
  259. 'merchantId' => $merchantId,
  260. 'relateId' => (string)$targetId,
  261. 'integral' => $addData['integral'],
  262. 'num' => $delIntegral,
  263. 'io' => 1,
  264. 'payWay' => 0,
  265. 'alipayId' => '',
  266. 'event' => '帐号合并',
  267. 'operatorId' => 0,
  268. 'createTime' => $date,
  269. 'capitalType' => $capitalType,
  270. 'addTime' => $now,
  271. ];
  272. xhUserIntegralService::add($integralData);//用户兑换型积分流水增加
  273. $preLevel = $retainUserAsset['memberLevel'];
  274. $preIntegral = $retainUserAsset['integral'];//可抵用型积分
  275. $merchantExtend = xhMerchantExtendService::getByMerchantId($merchantId);
  276. UserIntegralService::increaseToUpgrade($preIntegral, $addData['integral'], $preLevel, $retainUserId, $merchantId, $merchantExtend);
  277. }
  278. //积分
  279. $delPoint = isset($delUserAsset['point']) ? $delUserAsset['point'] : 0;
  280. if (!empty($delPoint)) {
  281. $addData['point'] = $retainUserAsset['point'] + $delPoint;
  282. //注意会员等级要进行重新计算!!!!!还有积分变化记录要增加
  283. }
  284. if (!empty($addData)) {
  285. UserAssetClass::updateByUserId($retainUserId, $addData);
  286. }
  287. }
  288. //清除不需要的用户
  289. $clearData = ['openId' => '', 'miniOpenId' => '', 'unionId' => '', 'alipayId' => '', 'merchantId' => 0];
  290. self::updateById($delUserId, $clearData);
  291. UserAssetClass::updateByUserId($delUserId, ['merchantId' => 0]);
  292. //清除支付宝用户
  293. $clearAlipayData = ['alipayId' => '', 'alipayAccount' => '', 'merchantId' => 0];
  294. UserAlipayClass::updateByUserId($delUserId, $clearAlipayData);
  295. $transaction->commit();
  296. return self::getById($retainUserId);
  297. } catch (Exception $e) {
  298. $transaction->rollBack();
  299. Yii::info("合并userid $delUserId $retainUserId 时事务回滚,原因:" . $e->getMessage());
  300. return [];
  301. }
  302. }
  303. //找出相同unionId的用户
  304. public static function getSameUnionId($merchantId, $unionId)
  305. {
  306. return self::getAllByCondition(['merchantId' => $merchantId, 'unionId' => $unionId], 'addTime desc', '*');
  307. }
  308. }