Files
littleTiger/application/common/logic/MessageLogic.php

472 lines
16 KiB
PHP
Raw Normal View History

2019-02-28 19:48:21 +08:00
<?php
/**
* tpshop
* ============================================================================
* 版权所有 2015-2027 深圳搜豹网络科技有限公司,并保留所有权利。
* 网站地址: http://www.tp-shop.cn
* ----------------------------------------------------------------------------
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
* 不允许对程序代码以任何形式任何目的的再发布。
* 采用最新Thinkphp5助手函数特性实现单字母函数M D U等简写方式
* ============================================================================
* Author: IT宇宙人
* Date: 2015-09-09
*/
namespace app\common\logic;
use think\Model;
use think\Db;
/**
* Class OrderGoodsLogic
* @package common\Logic
*/
class MessageLogic extends Model
{
protected $tableName = 'message';
protected $_validate = array();
protected $message_category_num = 6;
/**
* 获取用户的消息个数
* @return array
*/
public function getUserMessageCount(){
$user_info = session('user');
$user_system_message_no_read_where = array(
'um.user_id' => $user_info['user_id'],
'um.is_see' => 0,
'um.deleted' => 0,
);
$user_system_message_no_read = DB::name('user_message')
->alias('um')
->join('__MESSAGE__ m','um.message_id = m.message_id','LEFT')
->where($user_system_message_no_read_where)
->count();
return $user_system_message_no_read;
}
/**
* 获取用户的活动消息
* @return array
*/
public function getUserSellerMessage()
{
$user_info = session('user');
$user_system_message_no_read_where = array(
'user_id' => $user_info['user_id'],
'status' => 0,
'm.category' => ['<>', 0]
);
$user_system_message_no_read = Db::name('user_message')
->alias('um')
->field('um.rec_id,um.user_id,um.category,um.message_id,um.status,m.send_time,m.type,m.message')
->join('__MESSAGE__ m','um.message_id = m.message_id','LEFT')
->where($user_system_message_no_read_where)
->select();
return $user_system_message_no_read;
}
/**
* 获取用户的全部消息
* @return array
*/
public function getUserAllMessage()
{
$this->checkPublicMessage();
$user_info = session('user');
$user_system_message_no_read_where = array(
'user_id' => $user_info['user_id'],
'status' => 0,
);
$user_system_message_no_read = Db::name('user_message')
->alias('um')
->field('um.rec_id,um.user_id,um.category,um.message_id,um.status,m.send_time,m.type,m.message')
->join('__MESSAGE__ m','um.message_id = m.message_id','LEFT')
->where($user_system_message_no_read_where)
->select();
return $user_system_message_no_read;
}
/**
* 获取用户的系统消息
* @return array
*/
public function getUserMessageNotice()
{
$this->checkPublicMessage();
$user_info = session('user');
$user_system_message_no_read_where = array(
'user_id' => $user_info['user_id'],
'status' => 0,
'm.category' => 0
);
$user_system_message_no_read = Db::name('user_message')
->alias('um')
->field('um.rec_id,um.user_id,um.category,um.message_id,um.status,m.send_time,m.type,m.message')
->join('__MESSAGE__ m','um.message_id = m.message_id','LEFT')
->where($user_system_message_no_read_where)
->select();
return $user_system_message_no_read;
}
/**
* 查询系统全体消息,如有将其插入用户信息表
* @author dyr
* @time 2016/09/01
*/
public function checkPublicMessage()
{
$user_info = session('user');
$user_message = Db::name('user_message')->where(array('user_id' => $user_info['user_id'], 'category' => 0))->select();
$message_where = array(
'category' => 0,
'type' => 1,
'send_time' => array('gt', $user_info['reg_time']),
);
if (!empty($user_message)) {
$user_id_array = get_arr_column($user_message, 'message_id');
$message_where['message_id'] = array('NOT IN', $user_id_array);
}
$user_system_public_no_read = Db::name('message')->field('message_id')->where($message_where)->select();
foreach ($user_system_public_no_read as $key) {
DB::name('user_message')->insert(['user_id'=>$user_info['user_id'],'message_id'=>$key['message_id'],'category'=>0,'status'=>0]);
}
}
/**
* 获取用户的全部关注的消息
* @return array
*/
public function getUserAllMaskMessage()
{
$this->checkPublicMessage();
$user_info = session('user');
$categorys = $categorys = $this->getUserMessageCategory($user_info);
if (empty($categorys)) {
return [];
}
$user_system_message_no_read_where = array(
'user_id' => $user_info['user_id'],
'status' => 0,
'um.category' => ['in', $categorys]
);
$user_system_message_no_read = Db::name('user_message')
->alias('um')
->field('um.rec_id,um.user_id,um.category,um.message_id,um.status,m.send_time,m.type,m.message')
->join('__MESSAGE__ m','um.message_id = m.message_id','LEFT')
->where($user_system_message_no_read_where)
->select();
return $user_system_message_no_read;
}
/**
* 获取用户关注的消息类型
* @param type $user
* @param type $filter 是否强制过滤
* @return int
*/
public function getUserMessageCategory($user, $filter = 0)
{
$categorys = [];
for ($i = 0; $i < $this->message_category_num; $i++) {
//目前限定为四种类型,过滤掉 '3商品提醒'、'5商城好店'
if ($filter && ($i == 3 || $i == 5)) {
continue;
}
if ($user['message_mask'] & (1 << $i)) {
$categorys[] = $i;
}
}
return $categorys;
}
/**
* 获取用户的每个类型最新一条消息
* @return array
*/
public function getUserPerTypeLastMessage()
{
$this->checkPublicMessage();
$user = session('user');
if ($user) {
$categorys = $this->getUserMessageCategory($user, 1);
if (empty($categorys)) {
return [];
}
} else {
$categorys = [0, 2, 3, 5];//0系统消息1物流通知2优惠促销3商品提醒4我的资产5商城好店
}
$data = [];
foreach ($categorys as $c) {
$query = Db::query('SELECT m.category,m.message_id,um.status,m.send_time,m.type,m.data FROM __PREFIX__message m '
. 'INNER JOIN __PREFIX__user_message um ON (um.message_id=m.message_id AND um.user_id = ?) '
. 'WHERE m.type = 0 AND m.category = ? AND m.data!="" '
. 'UNION (SELECT m.category,m.message_id, 1 AS status,m.send_time,m.type,m.data FROM __PREFIX__message m '
. 'WHERE m.type = 1 AND m.category = ? AND m.data!="") '
. 'ORDER BY send_time DESC LIMIT 1', [$user['user_id'], $c, $c]);
if (!empty($query[0])) {
$query = $query[0];
$msgdata = unserialize($query['data']);
$query['message'] = $msgdata['discription'];
unset($query['data']);
$data[] = $query;
}
}
return $data;
}
/**
* 获取具体类型的消息列表
* @param type $user_id
* @param type $category
* @param type $p
* @return type
*/
public function getUserMessageList($user_id, $category, $p = 1)
{
if ($p < 1) {
$p = 1;
}
$p = ($p - 1) * 15;
$data = Db::query('SELECT m.category,m.message_id,um.status,m.send_time,m.type,m.data FROM __PREFIX__message m '
. 'INNER JOIN __PREFIX__user_message um ON (um.message_id=m.message_id AND um.user_id = ?) '
. 'WHERE m.type = 0 AND m.category = ? AND m.data!="" '
. 'UNION (SELECT m.category,m.message_id, 1 AS status,m.send_time,m.type,m.data FROM __PREFIX__message m '
. 'WHERE m.type = 1 AND m.category = ? AND m.data!="") '
. 'ORDER BY send_time DESC LIMIT ?,15', [$user_id, $category, $category, $p]);
foreach ($data as &$d) {
$d['data'] = unserialize($d['data']);
}
return $data;
}
/**
* 创建推送消息
* @param int $type0系统消息1物流通知2优惠促销3商品提醒4我的资产5商城好店
*/
public function createPushMsg($type, $data)
{
$title = isset($data['title']) ? $data['title'] : '';
$order_id = isset($data['order_id']) ? $data['order_id'] : 0;
$discription = isset($data['discription']) ? $data['discription'] : '';
$goods_id = isset($data['goods_id']) ? $data['goods_id'] : 0;
$change_type = isset($data['change_type']) ? $data['change_type'] : 0;
$money = isset($data['money']) ? $data['money'] : 0;
$cover = isset($data['cover']) ? $data['cover'] : '';
$logic = new MessageLogic;
if ($type === 0) {
$data = $logic->createSystemMsg($type, $title, $discription);
} elseif ($type === 1) {
$data = $logic->createShippingMsg($type, $title, $order_id, $goods_id, $discription);
} elseif ($type === 2) {
$data = $logic->createPromotionMsg($type, $title, $goods_id, $cover, $discription);
} elseif ($type === 4) {
$data = $logic->createAssetMsg($type, $change_type, $title, $discription, $money);
} else {
$data = [];
}
return $data;
}
/**
* 推送物流消息
* @param type $title
* @param type $order_id
* @param type $goods_id
* @param type $discription
*/
public function createShippingMsg($t, $title, $order_id, $goods_id, $discription = '')
{
$row = M('order')->field('order_sn, shipping_name')->where('order_id', $order_id)->find();
if (!$row) {
return ['status' => -1, 'msg' => '订单不存在'];
}
$discription = $discription ?: "您的订单已炼货完毕,待出库交付{$row['shipping_name']},"
. "运单号为{$row['order_sn']}";
$title = $title ?: "发货提醒";
$data = [
'category' => $t,
'data' => [
'title' => $title,
'post_time' => time(),
'order_id' => $order_id,
'discription' => $discription,
'goods_id' => $goods_id
]
];
return $data;
}
/**
* 推送促销消息
* @param type $title
* @param type $goods_id
* @param type $cover
* @param type $discription
*/
public function createPromotionMsg($t, $title, $goods_id, $cover = '', $discription = '')
{
$data = [
'category' => $t,
'data' => [
'title' => $title,
'post_time' => time(),
'cover' => $cover,
'discription' => $discription,
'goods_id' => $goods_id
]
];
return $data;
}
/**
* 推送资金变动/我的资产消息
* @param type $change_type 1:积分,2:余额,3:优惠券
* @param type $title
* @param type $discription
* @param type $money 优惠券类型通知时该值才大于0
*/
public function createAssetMsg($t, $change_type, $title, $discription = '', $money = 0)
{
$data = [
'category' => $t,
'data' => [
'change_type' => $change_type,
'title' => $title,
'post_time' => time(),
'discription' => $discription,
'money' => $money
]
];
return $data;
}
/**
* 推送系统/服务消息
* @param type $title
* @param type $discription
*/
public function createSystemMsg($t, $title, $discription = '')
{
$data = [
'category' => $t,
'data' => [
'title' => $title,
'post_time' => time(),
'discription' => $discription,
]
];
return $data;
}
/**
* 发送消息
* @param type $msg message表字段必要的数据
* @param type $push_data 推送的消息主体
* @param array $user_ids 用户的id集
* @return type
*/
public function sendMessage($msg, $push_data, $user_ids = [])
{
//创建推送消息
$push_data = $this->createPushMsg($msg['category'], $push_data);
if (!$push_data) {
return ['status' => -1, 'msg' => '推送的内容不能为空'];
}
if (is_string($user_ids)) {
$user_ids = explode(',', $user_ids);
}
//推送消息
$push_ids = [];
if (!$msg['type']) {
$push_ids = M('users')->where(['user_id' => ['IN', $user_ids]])->column('push_id');
}
$push = new PushLogic;
$res = $push->push($push_data, $msg['type'], $push_ids);
if ($res['status'] !== 1) {
return $res;
}
$message = [
'admin_id' => isset($msg['admin_id']) ? $msg['admin_id'] : 0,
'seller_id' => isset($msg['seller_id']) ? $msg['seller_id'] : 0,
'category' => $msg['category'],
'type' => $msg['type'],
'message' => $push_data['data']['discription'],
'send_time' => $push_data['data']['post_time'],
'data' => serialize($push_data['data'])
];
//推送成功才入库
if ($msg['type'] == 1) {
M('Message')->add($message);
} elseif (!empty($user_ids)) {
$msg_id = M('Message')->add($message);
foreach ($user_ids as $uid) {
M('user_message')->add(['user_id' => $uid, 'message_id' => $msg_id, 'status' => 0, 'category' => $msg['category']]);
}
}
return $res;
}
/**
* 获取消息开关
* @param type $mask 开关掩码
* @return type
*/
public function getMessageSwitch($mask)
{
$notice[] = boolval($mask & (1 << 0)); //'system'
$notice[] = boolval($mask & (1 << 1)); //'express'
$notice[] = boolval($mask & (1 << 2)); //'promotion'
$notice[] = boolval($mask & (1 << 3)); //'goods'
$notice[] = boolval($mask & (1 << 4)); //'asset'
$notice[] = boolval($mask & (1 << 5)); //'store'
return $notice;
}
/**
* 设置消息开关
* @param type $type 开关类型
* @param type $val开关值
*/
public function setMessageSwitch($type, $val, $user)
{
if ($type > 5) {
return ['status' => -1, 'msg' => '开关类型错误'];
}
if ($val) {
$user['message_mask'] |= (1 << $type);
} else {
$user['message_mask'] &= ~(1 << $type);
}
M('users')->where('user_id', $user['user_id']) ->save(['message_mask' => $user['message_mask']]);
return ['status' => 1, 'msg' => '设置成功'];
}
/**
* 设置消息为已读
*/
public function setMessageRead($user_id)
{
M('user_message')->where('user_id', $user_id)->save(['status' => 1]);
}
}