* @day: 2017/11/28 */ namespace app\admin\model\wechat; use app\admin\model\user\User; use think\facade\Cache; use crmeb\traits\ModelTrait; use crmeb\basic\BaseModel; use app\admin\model\wechat\WechatUser as UserModel; /** * 微信用户行为记录 model * Class WechatMessage * @package app\admin\model\wechat */ class WechatMessage extends BaseModel { /** * 数据表主键 * @var string */ protected $pk = 'id'; /** * 模型名称 * @var string */ protected $name = 'wechat_message'; use ModelTrait; protected $insert = ['add_time']; /** * 微信用户操作的基本所有操作 * @var array */ public static $mold = array( 'event_subscribe' => '关注微信号', 'event_unsubscribe' => '取消关注微信号', 'event_scan' => '扫码', 'event_templatesendjobfinish' => '进入小程序', 'event_location' => '获取位置', 'event_click' => '点击微信菜单关键字', 'event_view' => '点击微信菜单链接', 'event_view_miniprogram' => '点击微信菜单进入小程序', 'text' => '收到文本消息', 'image' => '收到图片消息', 'video' => '收到视频消息', 'voice' => '收到声音消息', 'location' => '收到位置消息', 'link' => '收到链接消息', 'event_scan_subscribe' => '扫码关注' ); public static function setAddTimeAttr($value) { return time(); } public static function setMessage($result, $openid, $type) { if (is_object($result) || is_array($result)) $result = json_encode($result); $add_time = time(); $data = compact('result', 'openid', 'type', 'add_time'); return self::create($data); } public static function setOnceMessage($result, $openid, $type, $unique, $cacheTime = 172800) { $cacheName = 'wechat_message_' . $type . '_' . $unique; if (Cache::has($cacheName)) return true; $res = self::setMessage($result, $openid, $type); if ($res) Cache::set($cacheName, 1, $cacheTime); return $res; } /** * 按钮事件 * @param $Event * @return mixed */ public static function tidyEvent($Event) { $res = array( 'msg' => $Event['EventKey'], ); return $res; } /** * 取消关注事件扫码 * @param $Event * @return mixed */ public static function tidyNull() { $res = array( 'msg' => '无', ); return $res; } /** * 整理文本显示的数据 * @param $text 收到的文本消息 * return 返回收到的消息 */ public static function tidyText($text) { $res = array( 'rep_id' => '1', 'MsgId' => $text['MsgId'], 'Content' => $text['Content'], 'msg' => $text['Content'], ); return $res; } /** * 整理图片显示的数据 * @param $image * @return mixed */ public static function tidyImage($image) { $res = array( 'rep_id' => '2', 'MsgId' => $image['MsgId'], 'PicUrl' => $image['PicUrl'], 'MediaId' => $image['MediaId'], 'msg' => '媒体ID:' . $image['MediaId'], ); return $res; } /** * 整理视屏显示的数据 * @param $video * @return mixed */ public static function tidyVideo($video) { $res = array( 'rep_id' => '3', 'MsgId' => $video['MsgId'], 'MediaId' => $video['MediaId'], 'msg' => '媒体ID:' . $video['MediaId'], ); return $res; } /** * 整理声音显示的数据 * @param $voice * @return mixed */ public static function tidyVoice($voice) { $res = array( 'rep_id' => '4', 'MsgId' => $voice['MsgId'], 'MediaId' => $voice['MediaId'], 'msg' => '媒体ID:' . $voice['MediaId'], ); return $res; } /** * 地理位置 * @param $location * @return array */ public static function tidyLocation($location) { $res = array( 'rep_id' => '5', 'MsgId' => $location['MsgId'], 'Label' => $location['Label'], 'msg' => $location['Label'], ); return $res; } /** * 获取用户扫码点击事件 * @param array $where * @return array */ public static function systemPage($where = array()) { $model = new self; $model = $model->alias('m'); if ($where['nickname'] !== '') { $user = UserModel::where('nickname', 'LIKE', "%$where[nickname]%")->field('openid')->select(); if (empty($user->toArray())) $model = $model->where('m.id', 0); foreach ($user as $v) { $model = $model->where('m.openid', $v['openid']); } } if ($where['type'] !== '') $model = $model->where('m.type', $where['type']); if ($where['data'] !== '') { list($startTime, $endTime) = explode(' - ', $where['data']); $model = $model->where('m.add_time', '>', strtotime($startTime)); $model = $model->where('m.add_time', '<', strtotime($endTime)); } $model = $model->field('u.nickname,m.*')->join('WechatUser u', 'u.openid=m.openid')->order('m.id desc'); return self::page($model, function ($item) { switch ($item['type']) { case 'text': $item['result_arr'] = self::tidyText(json_decode($item['result'], true)); break; case 'image': $item['result_arr'] = self::tidyImage(json_decode($item['result'], true)); break; case 'video': $item['result_arr'] = self::tidyVideo(json_decode($item['result'], true)); break; case 'voice': $item['result_arr'] = self::tidyVoice(json_decode($item['result'], true)); break; case 'location': $item['result_arr'] = self::tidyLocation(json_decode($item['result'], true)); break; case 'event_click': $item['result_arr'] = self::tidyEvent(json_decode($item['result'], true)); break; case 'event_view': $item['result_arr'] = self::tidyEvent(json_decode($item['result'], true)); break; case 'event_subscribe': $item['result_arr'] = self::tidyNull(); break; case 'event_unsubscribe': $item['result_arr'] = self::tidyNull(); break; case 'event_scan': $item['result_arr'] = self::tidyNull(); break; default : $item['result_arr'] = ['msg' => $item['type']]; break; } $item['type_name'] = isset(self::$mold[$item['type']]) ? self::$mold[$item['type']] : '未知'; }, $where); } /* * 获取应为记录数据 * */ public static function getViweList($date, $class = []) { $model = new self(); switch ($date) { case null: case 'today': case 'week': case 'year': if ($date == null) $date = 'month'; $model = $model->whereTime('add_time', $date); break; case 'quarter': $time = User::getMonth('n'); $model = $model->where('add_time', 'between', $time); break; default: list($startTime, $endTime) = explode('-', $date); $model = $model->where('add_time', '>', strtotime($startTime)); $model = $model->where('add_time', '<', strtotime($endTime)); break; } $list = $model->field(['type', 'count(*) as num', 'result'])->group('type')->limit(0, 20)->select()->toArray(); $viwe = []; foreach ($list as $key => $item) { $now_list['name'] = isset(self::$mold[$item['type']]) ? self::$mold[$item['type']] : '未知'; $now_list['value'] = $item['num']; $now_list['class'] = isset($class[$key]) ? $class[$key] : ''; $viwe[] = $now_list; } return $viwe; } }