Statistics.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. <?php
  2. namespace addons\BusinessCard\common\logic;
  3. use addons\BusinessCard\common\enums\CardEnums;
  4. use addons\BusinessCard\common\models\BusinessCard;
  5. use addons\BusinessCard\common\models\BusinessCardCustomerLog;
  6. use addons\BusinessCard\common\models\BusinessCardGoodsStatistics;
  7. use addons\BusinessCard\common\models\BusinessCardSecretUserScore;
  8. use addons\BusinessCard\common\models\BusinessCardStatistics;
  9. use addons\BusinessCard\common\models\BusinessCardTask;
  10. use addons\BusinessCard\common\models\BusinessCardUser;
  11. use common\enums\StatusEnum;
  12. use common\models\common\BuyingPointDay;
  13. use common\models\user\User;
  14. use common\enums\RabbitMqEnum;
  15. use common\models\order\Order;
  16. use common\models\user\UserPartitionRelationship;
  17. use Exception;
  18. use Yii;
  19. use yii\helpers\Json;
  20. class Statistics
  21. {
  22. /**
  23. * @param array $data item_id,user_id,mall_id,log_type
  24. * @return void
  25. * @throws Exception
  26. */
  27. public static function handler(array $data) {
  28. if (!isset($data['log_type'])) return;
  29. Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, $data, self::class, 'async_handle');
  30. }
  31. /**
  32. * @param $data
  33. * @return bool
  34. */
  35. public static function async_handle($data) {
  36. $t = Yii::$app->db->beginTransaction();
  37. try {
  38. switch ($data['log_type']) {
  39. //点赞
  40. case CardEnums::LOG_TYPE_LIKE:
  41. $log = BusinessCardCustomerLog::findOne(['item_id' => $data['item_id'], 'user_id' => $data['user_id'], 'log_type' => $data['log_type']]);
  42. $card = BusinessCard::findOne(['id' => $data['item_id']]);
  43. if($log && $log->status == 1){
  44. $card->like_num = $card->like_num - 1;
  45. }else{
  46. $card->like_num = $card->like_num + 1;
  47. }
  48. if (!$card->save()) throw new Exception($card->getErrorMessage());
  49. if (!empty($log)) {
  50. $log->status = $log->status == 1 ? -1 : 1;
  51. if (!$log->save()) {
  52. Yii::error('智能名片修改点赞错误'. $log->getErrorMessage());
  53. throw new Exception($log->getErrorMessage());
  54. }
  55. } else {
  56. $res = BusinessCardStatistics::setData(['mall_id' => $data['mall_id'], 'user_id' => $data['user_id'], 'like_num' => 1]);
  57. if ($res === false) {
  58. Yii::error('智能名片添加点赞数量统计错误'. BusinessCardStatistics::getStaticError());
  59. throw new Exception(BusinessCardStatistics::getStaticError());
  60. }
  61. }
  62. break;
  63. //新增客户
  64. case CardEnums::LOG_TYPE_USER:
  65. $user = User::getOne(['where' => ['=', 'id', $data['item_id']]]);
  66. if (!empty($user)) {
  67. //直推设置线索统计
  68. if ($user->parent_id == $data['user_id']) {
  69. $log = new BusinessCardCustomerLog();
  70. $log->mall_id = $data['mall_id'];
  71. $log->user_id = $data['user_id'];
  72. $log->item_id = $data['item_id'];
  73. $log->log_type = CardEnums::LOG_TYPE_CLUE;
  74. if (!$log->save()) {
  75. Yii::error('智能名片添加线索日志错误'. $log->getErrorMessage());
  76. throw new Exception($log->getErrorMessage());
  77. }
  78. $res = BusinessCardStatistics::setData(['mall_id' => $data['mall_id'], 'user_id' => $data['user_id'], 'clue_num' => 1]);
  79. if ($res === false) {
  80. Yii::error('智能名片添加线索数量统计错误'. BusinessCardStatistics::getStaticError());
  81. throw new Exception(BusinessCardStatistics::getStaticError());
  82. }
  83. }
  84. }
  85. break;
  86. //查看名片
  87. case CardEnums::LOG_TYPE_CARD:
  88. // $log_browse
  89. $log = BusinessCardCustomerLog::find()->orderBy('id desc')
  90. ->where(['item_id' => $data['item_id']])
  91. ->andWhere(['user_id' => $data['user_id']])
  92. ->andWhere(['log_type' => $data['log_type']])->one();
  93. // 每次累加1
  94. $card = BusinessCard::findOne(['id' => $data['item_id']]);
  95. $card->browse_num = $card->browse_num + 1;
  96. if (!$card->save()) throw new Exception($card->getErrorMessage());
  97. $res = BusinessCardStatistics::setData(['mall_id' => $data['mall_id'], 'user_id' => $data['user_id'], 'browse_num' => 1]);
  98. if ($res === false) {
  99. Yii::error('智能名片添加浏览数量统计错误'. BusinessCardStatistics::getStaticError());
  100. throw new Exception(BusinessCardStatistics::getStaticError());
  101. }
  102. if(!empty($log)){ // 每次新建累加1
  103. $log->id = 0;
  104. $log->created_at = time();
  105. $log->updated_at = time();
  106. $log->material_times = $log->material_times + 1;
  107. $log->isNewRecord = true;
  108. if (!$log->save()) throw new Exception($log->getErrorMessage());
  109. }
  110. break;
  111. case CardEnums::LOG_TYPE_SHARE:
  112. // _share
  113. // $log_share = BusinessCardCustomerLog::findOne(['item_id' => $data['item_id'], 'user_id' => $data['user_id'], 'log_type' => $data['log_type']]);
  114. // if(!$log_share){
  115. // $res = BusinessCardStatistics::setData(['mall_id' => $data['mall_id'], 'user_id' => $data['user_id'], 'share_num' => 1]);
  116. // //更新名片分享次数
  117. // $card_data = BusinessCard::findOne(['id' => $data['item_id'], 'status' => StatusEnum::ENABLED]);
  118. // if($card_data){
  119. // $card_data->share_num = $card_data->share_num + 1;
  120. // $card_data->save();
  121. // }
  122. // $user_card = BusinessCardUser::findOne(['user_id' => $data['user_id'], 'status' => StatusEnum::ENABLED]);
  123. // if($user_card){
  124. // $user_card->share_num = $user_card->share_num + 1;
  125. // $user_card->save();
  126. // }
  127. // if ($res === false) {
  128. // $transtcion->rollBack();
  129. // Yii::error('智能名片分享统计错误'. BusinessCardStatistics::getStaticError());
  130. // return;
  131. // }
  132. // }
  133. break;
  134. case CardEnums::LOG_TYPE_TURN:
  135. // user与card都需要增加分享次数
  136. $card = BusinessCard::findOne(['id' => $data['item_id']]);
  137. $card->share_num = $card->share_num + 1;
  138. if (!$card->save()) throw new Exception($card->getErrorMessage());
  139. $cardUser = BusinessCardUser::findOne(['user_id' => $card->user_id]);
  140. $cardUser->share_num = $cardUser->share_num + 1;
  141. if (!$cardUser->save(false)) throw new Exception($cardUser->getErrorMessage());
  142. break;
  143. }
  144. if(empty($log)){
  145. $model = new BusinessCardCustomerLog();
  146. $model->mall_id = $data['mall_id'];
  147. $model->user_id = $data['user_id'];
  148. $model->item_id = $data['item_id'];
  149. $model->log_type = $data['log_type'];
  150. if (!empty($data['material_times'])) {
  151. $model->material_times = $data['material_times'];
  152. }
  153. if (!$model->save()) {
  154. Yii::error('智能名片添加客户日志错误'. $model->getErrorMessage());
  155. throw new Exception($model->getErrorMessage());
  156. }
  157. }
  158. // 记录分数
  159. BusinessCardSecretUserScore::setData($data['mall_id'], $data['user_id'], $data['log_type']);
  160. $t->commit();
  161. } catch (Exception $e) {
  162. $t->rollBack();
  163. Yii::error("智能名片统计错误 {$e->getMessage()} ,行数: {$e->getLine()} ,文件: {$e->getFile()}");
  164. var_dump($e->getMessage());
  165. return false;
  166. }
  167. return true;
  168. }
  169. /**
  170. * @param array $order_ids order_ids
  171. * @throws Exception
  172. */
  173. public static function order_handler(array $order_ids) {
  174. $data = ['order_ids' => $order_ids];
  175. Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, $data, self::class, 'async_order_handle');
  176. }
  177. public static function async_order_handle($data) {
  178. $order_ids = $data['order_ids'];
  179. $orders = Order::lists([
  180. 'where'=> [['id' => $order_ids]],
  181. 'with' => ['detail']
  182. ]);
  183. // $setting = Yii::$app->services->setting->addons->get($mall_id, CardEnums::ADDONS_NAME, 'basic');
  184. // //只统计推荐商品的
  185. // if (!isset($setting['goods_list'])) return;
  186. $user_ids = array_column($orders, 'user_id');
  187. $uid = BusinessCardUser::find()->where(['user_id' => $user_ids])->select(['user_id'])->column();
  188. $order_log = [];
  189. $order_statistics = [];
  190. foreach ($orders as $order) {
  191. if(!in_array($order['user_id'], $uid)) continue;
  192. $order_log[] = [
  193. 'mall_id' => $order['mall_id'],
  194. 'user_id' => $order['user_id'],
  195. 'item_id' => $order['id'],
  196. 'log_type' => CardEnums::LOG_TYPE_ORDER,
  197. 'created_at' => time(),
  198. 'updated_at' => time()
  199. ];
  200. if (empty($order_statistics)) {
  201. $order_statistics = ['mall_id' => $order['mall_id'], 'user_id' => $order['user_id'], 'order_num' => 1];
  202. } else {
  203. $order_statistics['order_num'] += 1;
  204. }
  205. }
  206. if (!empty($order_statistics)) BusinessCardStatistics::setData($order_statistics);
  207. if (!empty($order_log)) {
  208. Yii::$app->db->createCommand()->batchInsert(BusinessCardCustomerLog::tableName(), ['mall_id', 'user_id', 'item_id', 'log_type', 'created_at', 'updated_at'], $order_log)->execute();
  209. }
  210. }
  211. public static function pay_handler(int $order_id) {
  212. $data = ['order_id' => $order_id];
  213. Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, $data, self::class, 'async_pay_handle');
  214. }
  215. public static function async_pay_handle($data) {
  216. $order_id = $data['order_id'];
  217. $order = Order::getOne([['id' => $order_id]]);
  218. $exists = BusinessCardUser::find()->where(['user_id' => $order->user_id])->count();
  219. if (!$exists) return;
  220. BusinessCardStatistics::setData(['mall_id' => $order->mall_id, 'user_id' => $order->user_id, 'order_money' => $order->original_goods_price]);
  221. }
  222. public static function band_parent_handle($data) {
  223. $bind_user = User::getUser([['=', 'id', $data['user_id'], ['=', 'mall_id', $data['mall_id']]]]);//绑定者,当前登录账号
  224. if (empty($bind_user)) return false;
  225. $card = BusinessCard::getOne(['where' => ['=', 'id', $data['card_id']], ['=', 'mall_id', $data['mall_id']], ['=', 'status', StatusEnum::ENABLED]]);
  226. if($card){
  227. $parent = UserPartitionRelationship::getParentIdArr($data['user_id']);//查询关系链
  228. if (!in_array($card->user_id, $parent)) return false; //判断绑定者和分享者是否在同一关系链中
  229. $is_extis_user = BusinessCardUser::find()->where(['user_id' => $bind_user->id, 'mall_id' => $data['mall_id']])->count(); //卡片的关系链只能绑定一次
  230. if ($is_extis_user >= 1) return false;//避免重复绑定
  231. if ($card->user_id == $bind_user->id) return false; //自己不可以绑定自己
  232. $insert_data = [
  233. 'mall_id' => $data['mall_id'],
  234. 'tags' => $card->tags,
  235. 'user_id' => $bind_user->id,
  236. 'parent_id' => $card->user_id,
  237. 'department_id' => $card->department_id,
  238. 'position_id' => $card->position_id,
  239. 'is_clue' => $bind_user->parent_id == $card->user_id ? 1 : 0,//主商城关系链中直属上级就是线索,否则不是
  240. ];
  241. $res = BusinessCardUser::setData($insert_data);
  242. }
  243. }
  244. public static function goodsStatistics(){
  245. //获取名片用户
  246. $task_time = BusinessCardTask::find()->orderBy('id desc')->one();
  247. if($task_time){
  248. $buy_user_where = ['and',['>','id',$task_time->last_id],['=','page_type','goods_detail']];
  249. }else{
  250. $buy_user_where = ['and',['=','page_type','goods_detail']];
  251. }
  252. $buy_user_data = BuyingPointDay::find()->orderBy('id')->andwhere($buy_user_where);
  253. $num = 0;
  254. $id = 0;
  255. foreach($buy_user_data->asArray()->batch(500) as $buy_data){
  256. foreach($buy_data as $k=>$v){
  257. $user_data = BusinessCardUser::getOne([['user_id'=>$v['user_id'],'status'=>StatusEnum::ENABLED]]);
  258. if($user_data && $v['item_id']>0){
  259. $goods_data['goods_id'] = $v['item_id'];
  260. $goods_data['mall_id'] = $v['mall_id'];
  261. $goods_data['user_id'] = $v['user_id'];
  262. $goods_data['parent_id'] = $user_data['parent_id'];
  263. $goods_data['total_views'] = $v['browse_num'] ?? 0;
  264. $goods_data['browse_time'] = $v['browse_time'] ?? 0;
  265. $goods_statitic = BusinessCardGoodsStatistics::setData($goods_data);
  266. }
  267. $id = $v['id'];
  268. $num ++;
  269. }
  270. }
  271. if($id){
  272. $task_add['last_id'] = $id;
  273. $task_add['total_num'] = $num;
  274. $task = BusinessCardTask::setData($task_add);
  275. }
  276. }
  277. /**
  278. * 更新员工级别的图片信息
  279. * @param array $params
  280. * @return void
  281. */
  282. public static function updateCardInfo(array $params)
  283. {
  284. $config = Yii::$app->services->setting->addons->get($params['mall_id'], CardEnums::ADDONS_NAME, 'basic');
  285. /**
  286. * @var $each BusinessCardUser
  287. */
  288. foreach (BusinessCardUser::find()->where(['mall_id' => $params['mall_id']])
  289. ->andWhere(['role_type' => 3])->select('id, user_id')->each() as $each) {
  290. /**
  291. * @var $card BusinessCard
  292. */
  293. $card = BusinessCard::getOne([
  294. ['mall_id' => $params['mall_id']],
  295. ['user_id' => $each->user_id],
  296. ['status' => [StatusEnum::DISABLED, StatusEnum::ENABLED]]
  297. ]);
  298. if (!empty($card)) {
  299. $card->video = $config['video_url'];
  300. $card->video_cover_pic = $config['video_cover_pic'];
  301. $card->images = implode(",", Json::decode($config['images']));
  302. $card->share_pic = $config['share_pic'];
  303. $card->address = $config['address'];
  304. if (!$card->save()) Yii::error($card->getErrorMessage() . " ---- " . __METHOD__);
  305. }
  306. }
  307. }
  308. }