<?php /** * CommentService.class.php * 活动评论信息表 * @author: daijun * @copyright: vchangyi.com */ namespace Common\Service; use Common\Common\AttachOperation; use Common\Common\IntegralStrategy; use Common\Common\Integral; use Common\Common\Constant; use Common\Common\Department; use Common\Common\User; use Common\Model\ActivityModel; use Common\Model\AttachmentModel; use Common\Model\CommentModel; use Common\Model\CountModel; use Common\Model\HistoryModel; use Common\Model\LikeModel; use Common\Model\LogModel; use Common\Model\RightModel; use Common\Common\Tag; class CommentService extends AbstractService { // 可以进行删除操作 const IS_DEL_OK = 1; // 不可以进行删除 const IS_DEL_NO = 0; // 已点赞 const IS_LIKE_OK = 1; // 未点赞 const IS_LIKE_NO = 0; // 回复每页条数 const REPLY_LIMIT = 5; // 点赞类型为回复 const COMMENT_TYPE = 2; // 上传图片个数最大值 const IMAGES_COUNT = 9; // 一级评论 const FIRST_COMMENT = 0; // 回复评论加权数 const COMMENT_NUM = 1; // 默认获取点赞数 const DEFAULT_LIKE_LIMIT = 12; // 回复活动类型 const RESTORE_ACTIVITY_TYPE = 1; // 回复回帖类型 const REPLIES_ARE_ANSWERED_TYPE = 2; // 帖子被回复类型 const REPLY_ARE_ANSWERED_TYPE = 3; // 首次 const COMMENT_FIRST = 1; // 已置顶 const IS_TOP_TRUE = 1; // 未置顶 const IS_TOP_FALSE = 0; /** * @var User 用户公用类 */ protected $_user; /** * @var LikeModel 点赞数据model */ protected $_d_like; /** * @var ActivityModel 活动数据model */ protected $_d_activity; /** * @var AttachmentModel 附件数据model */ protected $_d_attach; /** * @var RightModel 部门用户model */ protected $_d_right; /** * @var CountModel 回复统计表 */ protected $_d_count; /** * @var LogModel 积分日志表 */ protected $_d_log; /** * @var HistoryModel 历史日志表 */ protected $_d_history; // 构造方法 public function __construct() { $this->_user = new User(); $this->_d = new CommentModel(); $this->_d_like = new LikeModel(); $this->_d_activity = new ActivityModel(); $this->_d_attach = new AttachmentModel(); $this->_d_right = new RightModel(); $this->_d_count = new CountModel(); $this->_d_log = new LogModel(); $this->_d_history = new HistoryModel(); parent::__construct(); } /** * 查询回复评论信息 * @param $params array 查条件参数 * @param $page_option array 分页参数 * @param $uid String 用户UID * @return array|bool */ public function replay_list($params, $page_option, $uid) { $comment_id = intval($params['comment_id']); // 判断评论ID是否存在 if (!$comment_id) { E('_ERR_AC_REPLAY_EMPTY'); } // 查询评论信息 $comment_info = $this->get($comment_id); if (empty($comment_info)) { E('_ERR_DATA_NOT_EXIST'); } // 查询发布评论的用户信息 $user_info = $this->_user->getByUid($comment_info['uid']); $info = array( 'uid' => strval($comment_info['uid']), 'username' => strval($user_info['memUsername']), 'avatar' => strval($user_info['memFace']), 'content' => $this->Enter($comment_info['content']), 'created' => $comment_info['created'], 'likes' => intval($comment_info['likes']), 'replys' => intval($comment_info['replys']), ); //判断活动是否可以点赞 $mylikecount = $this->_d_like->count_by_conds(array( 'uid' => $uid, 'cid' => $comment_id, 'type' => self::COMMENT_TYPE, )); $is_like = $mylikecount ? self::IS_LIKE_OK : self::IS_LIKE_NO; $info['is_like'] = $is_like; // 获取评论点赞列表 $info['like_list'] = $this->like_list($comment_id); // 获取评论附件列表 $info['img_list'] = $this->img_list($comment_id); //查询回复总条数 $conds = array('parent_id' => $comment_id); $order_option = array('created' => 'DESC'); $total = $this->count_by_conds($conds); $list = []; if ($total > 0) { //查询回复列表 $list = $this->list_by_conds($conds, $page_option, $order_option); if ($list) { // 回复列表数据格式化 $list = $this->format_comment_list($list, $uid); } } $info['total'] = intval($total); $info['list'] = $list; return $info; } /** * 获取评论图片列表 * @param $comment_id int 评论ID * @return array */ protected function img_list($comment_id) { // 排序 $order_option = array('created' => 'DESC'); $list = $this->_d_attach->list_by_conds( array('cid' => $comment_id), null, $order_option ); $images = []; foreach ($list as $v) { $images[] = array( 'atId' => $v['at_id'], 'imgUrl' => imgUrlReal($v['at_id']), ); } return $images; } /** * 获取评论点赞列表int * @param $comment_id int 评论ID * @return array */ public function like_list($comment_id) { // 排序 $order_option = array('created' => 'DESC'); $like_list = $this->_d_like->list_by_conds( array('cid' => $comment_id, 'type' => self::COMMENT_TYPE), null, $order_option ); $user_arr = []; if (!empty($like_list)) { $uids = array_column($like_list, 'uid'); // 查询用户集合 $users = $this->_user->listAll(array('memUids' => $uids)); // 获取被删除的用户信息 $this->user_list($users, $uids); $user_list = array_combine_by_key($users, 'memUid'); // 格式化点赞列表数据 foreach ($like_list as $val) { $value = []; $value['created'] = $val['created']; $value['like_id'] = $val['like_id']; $value['uid'] = $val['uid']; $value['username'] = $user_list[$val['uid']]['memUsername']; $value['avatar'] = $user_list[$val['uid']]['memFace']; $user_arr[] = $value; } } return $user_arr; } /** * 获取评论列表(后台) * @param array $result 返回活动信息 * @param array $reqData 请求数据 * @return bool */ public function comment_list(&$result, $reqData) { $ac_id = intval($reqData['ac_id']); $parent_id = intval($reqData['parent_id']); if (empty($ac_id)) { E('_ERR_AC_ID_EMPTY'); } // 默认值 $page = isset($reqData['page']) ? intval($reqData['page']) : self::DEFAULT_PAGE; // 默认每页条数 if ($parent_id > 0) { $limit = isset($reqData['limit']) ? intval($reqData['limit']) : self::REPLY_LIMIT; } else { $limit = isset($reqData['limit']) ? intval($reqData['limit']) : self::DEFAULT_LIMIT; } // 分页 list($start, $limit) = page_limit($page, $limit); // 排序 $order_option = array('top_time' => 'DESC', 'created' => 'DESC'); // 分页 $page_option = array($start, $limit); // 查询总记录数 $total = $this->_d->count_by_conds(array('ac_id' => $ac_id, 'parent_id' => $parent_id)); // 查询列表 $list = []; if ($total > 0) { $comm_list = $this->_d->list_by_conds(array('ac_id' => $ac_id, 'parent_id' => $parent_id), $page_option, $order_option); // 格式化列表数据 $list = $this->format_comment_list_admin($comm_list); } $result = array( 'page' => $page, 'limit' => $limit, 'total' => (int)$total, 'lists' => $list, ); return true; } /** * 格式化评论列表数据(前台) * @param array $comm_list 评论数据 * @param string $uid 用户ID * @return array */ public function format_comment_list($comm_list = [], $uid = '') { // 获取用户ID集合 $uids = array_column($comm_list, 'uid'); // 查询用户列表 $user_list = $this->_user->listAll(array('memUids' => $uids)); // 获取被删除的用户信息 $this->user_list($user_list, $uids); // 将用户列表转换为以uid为key的二维数组 $users = array_combine_by_key($user_list, 'memUid'); // 查询该用户点赞的所有评论 $like_list = $this->_d_like->list_by_conds(array('type' => LikeModel::TYPE_COMMENT, 'uid' => $uid)); // 点赞的评论ID集合 $like_cids = array_column($like_list, 'cid'); // 获取评论ID集合 $comment_ids = array_column($comm_list, 'comment_id'); $attach_list = []; if (!empty($comment_ids)) { // 查询附件集合 $attach_list = $this->_d_attach->list_by_conds(array('cid' => $comment_ids)); } foreach ($comm_list as &$v) { // 转换数据返回格式 $v['comment_id'] = intval($v['comment_id']); $v['likes'] = intval($v['likes']); $v['comments'] = intval($v['replys']); $v['is_attach'] = intval($v['is_attach']); $v['content'] = $this->Enter($v['content']); // 组装用户数据 $v['uid'] = strval($v['uid']); $v['username'] = strval($users[$v['uid']]['memUsername']); $v['avatar'] = strval($users[$v['uid']]['memFace']); // 格式化时间 $v['created'] = $this->get_time($v['created']); // 组装是否可删除标识 if ($v['uid'] == $uid) { $v['is_del'] = self::IS_DEL_OK; } else { $v['is_del'] = self::IS_DEL_NO; } // 组装是否已点赞标识 if (in_array($v['comment_id'], $like_cids)) { $v['is_like'] = self::IS_LIKE_OK; } else { $v['is_like'] = self::IS_LIKE_NO; } // 获取评论图片信息 $images = []; foreach ($attach_list as $_v) { // 如果是本评论的附件 if ($_v['cid'] == $v['comment_id']) { $images[] = array( 'atId' => $_v['at_id'], 'imgUrl' => imgUrlReal($_v['at_id']), ); // 清除该条记录 unset($_v); } } $v['images'] = $images; // 是否被置顶 $v['is_top'] = $v['top_time'] ? self::IS_TOP_TRUE : self::IS_TOP_FALSE; // 删除多余数据 unset( $v['top_time'], $v['parent_id'], $v['ac_id'], $v['replys'], $v['domain'], $v['status'], $v['updated'], $v['deleted'] ); } return $comm_list; } /** * 格式化评论列表数据(后台) * @param $comm_list array 评论列表数据 * @return array */ public function format_comment_list_admin(&$comm_list) { // 获取用户ID集合 $uids = array_column($comm_list, 'uid'); // 查询用户列表 $user_list = $this->_user->listAll(array('memUids' => $uids)); // 获取被删除的用户信息 $this->user_list($user_list, $uids); // 将用户列表转换为以uid为key的二维数组 $users = array_combine_by_key($user_list, 'memUid'); // 获取评论ID集合 $comment_ids = array_column($comm_list, 'comment_id'); $attach_list = []; if (!empty($comment_ids)) { // 查询附件集合 $attach_list = $this->_d_attach->list_by_conds(array('cid' => $comment_ids)); } foreach ($comm_list as &$v) { $v['ac_id'] = (int)$v['ac_id']; $v['comment_id'] = (int)$v['comment_id']; $v['parent_id'] = (int)$v['parent_id']; $v['likes'] = (int)$v['likes']; $v['replys'] = (int)$v['replys']; $v['username'] = (string)$users[$v['uid']]['memUsername']; $v['avatar'] = $users[$v['uid']]['memFace']; $v['content'] = $this->Enter($v['content']); $v['is_top'] = $v['top_time'] ? self::IS_TOP_TRUE : self::IS_TOP_FALSE; // 获取评论图片信息 $images = []; foreach ($attach_list as $_v) { // 如果是本评论的附件 if ($_v['cid'] == $v['comment_id']) { $images[] = array( 'atId' => $_v['at_id'], 'imgUrl' => imgUrlReal($_v['at_id']), ); // 清除该条记录 unset($_v); } } $v['images'] = $images; // 获取一级评论的回复列表 if ($v['parent_id'] == self::FIRST_COMMENT && $v['replys'] > 0) { $v['reply_lists'] = $this->_d->list_by_conds( array( 'ac_id' => $v['ac_id'], 'parent_id' => $v['comment_id'], ), array( self::FIRST_COMMENT, self::REPLY_LIMIT, ), array( 'created' => 'DESC', ), 'comment_id,uid,content,is_attach,likes,replys,created' ); } // 获取回复用户信息及附件信息 if ($v['reply_lists']) { // 获取回复用户ID集合 $reply_uids = array_column($v['reply_lists'], 'uid'); // 查询回复用户列表 $reply_user_list = $this->_user->listAll(array('memUids' => $reply_uids)); // 获取被删除的用户信息 $this->user_list($reply_user_list, $reply_uids); // 将用户列表转换为以uid为key的二维数组 $reply_users = array_combine_by_key($reply_user_list, 'memUid'); // 获取回复ID集合 $reply_ids = array_column($v['reply_lists'], 'comment_id'); $reply_attach_list = []; if (!empty($reply_ids)) { // 查询附件集合 $reply_attach_list = $this->_d_attach->list_by_conds(array('cid' => $reply_ids)); } foreach ($v['reply_lists'] as &$reply) { $reply['comment_id'] = (int)$reply['comment_id']; $reply['likes'] = (int)$reply['likes']; $reply['replys'] = (int)$reply['replys']; $reply['username'] = (string)$reply_users[$reply['uid']]['memUsername']; $reply['avatar'] = $reply_users[$reply['uid']]['memFace']; $reply['content'] = $this->Enter($reply['content']); // 获取评论图片信息 $reply_images = []; foreach ($reply_attach_list as $_reply) { // 如果是本评论的附件 if ($_reply['cid'] == $reply['comment_id']) { $reply_images[] = array( 'atId' => $_reply['at_id'], 'imgUrl' => imgUrlReal($_reply['at_id']), ); // 清除该条记录 unset($_reply); } } $reply['images'] = $reply_images; } } // 删除多余数据 unset($v['top_time'], $v['domain'], $v['status'], $v['updated'], $v['deleted']); } return $comm_list; } /** * 前端删除我的评论 * @param $comment_id * @param string $uid 前端登录用户ID * @return bool */ public function del_comment($comment_id, $uid = '') { // 查询评论数据 $data = $this->_d->get($comment_id); // 如果数据不存在 if (empty($data)) { E('_ERR_DATA_NOT_EXIST'); } // 活动已结束不能删除 $activity = $this->_d_activity->get($data['ac_id']); if (($activity['end_time'] < MILLI_TIME || ActivityService::STOP_ACTIVITY == $activity['activity_status']) && $data['parent_id'] == 0 && $uid&& ActivityService::ROUTINE_TYPE==$activity['activity_type']) { E('_ERR_ACTIVITY_END'); } // 如果不是自己发布的,则不能删除 if (!empty($uid) && ($uid != $data['uid'])) { E('_ERR_COMMENT_FORYOU'); } try { // 开始事务 $this->start_trans(); // 删除评论 $this->_d->delete($comment_id); //删除评论附件 $this->_d_attach->delete_by_conds(array('cid' => $comment_id)); //删除评论点赞 $this->_d_like->delete_by_conds(array('cid' => $comment_id)); // 如果评论是一级评论 if (self::FIRST_COMMENT == $data['parent_id']) { // 查询该评论下的所有回复 $replay_list = $this->_d->list_by_conds(array('parent_id' => $comment_id)); // 获取该评论回复的ID集合 $comment_ids = array_column($replay_list, 'comment_id'); if (!empty($comment_ids)) { // 删除回复 $this->_d->delete_by_conds(array('parent_id' => $comment_id)); //删除回复附件 $this->_d_attach->delete_by_conds(array('cid in (?)' => $comment_ids)); //删除回复点赞 $this->_d_like->delete_by_conds(array('cid in (?)' => $comment_ids)); } // 此处给该活动的评论数减1 $this->_d_activity->update($data['ac_id'], array('comments = comments-?' => 1)); } else { // 此处给该评论的评论数减1 $this->_d->update($data['parent_id'], array('replys = replys-?' => 1)); } // 提交事务 $this->commit(); } catch (\Think\Exception $e) { \Think\Log::record($e); // 事务回滚 $this->_set_error($e->getMessage(), $e->getCode()); $this->rollback(); return false; } catch (\Exception $e) { \Think\Log::record($e); $this->_set_error($e->getMessage(), $e->getCode()); // 事务回滚 $this->rollback(); return false; } // 附件操作 $attach_serv = new AttachOperation(); $attach_serv->delete_attach(APP_DIR, 'comment', [$comment_id]); return true; } /** * 发布评论和回复评论接口 * @param array $data 评论的数据 * @param string $uid 评论人UID * @param string $username 评论人姓名 * @param array $activity 活动信息 * @return mixed */ public function publish_comment($data = [], $uid = '', $username = '', $activity = []) { $ac_id = intval($data['ac_id']); $piclist = $data['images']; $content = trim($data['content']); $comment_id = intval($data['comment_id']); $images = array_column($piclist, 'atId'); //活动ID必须大于0 if (!$ac_id) { E('_ERR_AC_ID_EMPTY'); } $content_length = $comment_id ? 500 : 1000; //判断评论内容长度 if (!\Com\Validator::is_len_in_range($content, 2, $content_length, 'utf-8')) { $comment_id ? E('_ERR_AC_COMMENT_LENGTH') : E('_ERR_AC_POST_LENGTH'); } $pic_total = count($images); $is_attach = $pic_total ? 1 : 0; // 上传图片数量是否大于上传图片个数最大值 if ($pic_total > self::IMAGES_COUNT) { E('_ERR_AC_IMAGE_LENGTH'); } // 初始化 $news_cid = 0; try { // 开始事务 $this->_d->start_trans(); //插入评论信息 $news_cid = $this->_d->insert(array( 'ac_id' => $ac_id, 'parent_id' => $comment_id, 'content' => $content, 'is_attach' => $is_attach, 'uid' => $uid, )); // 组装当前用户条件 $condition = array('uid' => $uid); // 查询当前用户是否有评论统计记录 $user_total = $this->_d_count->get_by_conds($condition); if (empty($user_total)) { $this->_d_count->insert($condition); } // 开启积分策略 if (self::INTEGRAL_ACTION_TYPE_NO != $activity['integral_action_type']) { // 如果是回帖 if (self::FIRST_COMMENT == $comment_id) { // 更新楼层 $this->update_floor($ac_id, $news_cid); // 更新回帖数和回帖次数 $this->update_reply($uid, $ac_id); } else { // 更新回复次数以及回复个数,回帖被回复次数以及个数 $this->update_answer($uid, $comment_id); } } // 如果有附件 if ($is_attach) { // 组装附件信息数组 $attach_list = []; foreach ($images as $v) { if (!empty(trim($v))) { $attach_list[] = array('cid' => $news_cid, 'at_id' => $v); } } // 插入附件信息 if (!empty($attach_list)) { $this->_d_attach->insert_all($attach_list); } } if (!$comment_id) { $update_data = [ 'comments=comments+(?)' => self::COMMENT_NUM, ]; // 当前用户是否发布过评论 $conds = [ 'ac_id' => $ac_id, 'parent_id' => 0, 'uid' => $uid, ]; $is_comment = $this->_d->count_by_conds($conds); if ($is_comment == 1) { // 如果是第一次发表评论则更新活动表的已参与人数和未参与人数 $update_data['join_total=join_total+(?)'] = 1; $update_data['unjoin_total=unjoin_total-(?)'] = 1; } //更新活动 $this->_d_activity->update($ac_id, $update_data); } else { //评论回复 $this->_d->update($comment_id, array("replys=replys+(?)" => self::COMMENT_NUM)); } //评论消息回复 $this->comment_send_msg($ac_id, $comment_id, $content, $username); //提交修改 $this->_d->commit(); } catch (\Think\Exception $e) { \Think\Log::record($e); $this->_d->rollback(); } catch (\Exception $e) { \Think\Log::record($e); $this->_d->rollback(); } // 附件操作 if (!empty($images)) { $attach_serv = new AttachOperation(); $attach_serv->insert_attach( APP_DIR, 'comment', $news_cid, ['attach_ids' => $images] ); } return $news_cid; } /** * 更新回复次数以及回复个数,回帖被回复次数以及个数 * @param string $uid 当前用户UID * @param string $comment_id 上级ID * @return bool */ protected function update_answer($uid = '', $comment_id = '') { // 组装当前用户条件 $condition = array('uid' => $uid); // 组装查询回帖条件 $where = array( 'comment_id' => $comment_id, 'parent_id' => self::FIRST_COMMENT ); // 查询是否为帖子 $info = $this->get_by_conds($where); // 如果是帖子 if (!empty($info)) { // 组装回帖人数据 $replies_where = array('uid' => $info['uid']); // 查询当前用户是否有评论统计记录 $replies_total = $this->_d_count->count_by_conds($replies_where); if (empty($replies_total)) { $this->_d_count->insert($replies_where); } // 更新回复次数 $this->_d_count->update_by_conds( $condition, array( "answer_total=answer_total+(?)" => self::COMMENT_NUM )); // 回帖被回复次数 $this->_d_count->update_by_conds( $replies_where, array( "replies_total=replies_total+(?)" => self::COMMENT_NUM )); // 回复回帖组装条件 $reply_card = array( 'uid' => $uid, 'ac_id' => $info['ac_id'], 'pid' => $comment_id, 'type' => self::REPLIES_ARE_ANSWERED_TYPE, 'post_man' => $info['uid'] ); $reply_total = $this->_d_history->get_by_conds($reply_card); // 如果刚刚插入回帖数 if (empty($reply_total)) { // 更新回帖个数 $this->_d_count->update_by_conds( $condition, array( "answer_num=answer_num+(?)" => self::COMMENT_NUM )); // 回帖被回复个数 /* $this->_d_count->update_by_conds( $replies_where, array( "replies_num=replies_num+(?)" => self::COMMENT_NUM )); */ } // 回复贴子记录 $this->_d_history->insert($reply_card); // 回帖被回复记录 $commit_data = array( 'uid' => $info['uid'], 'ac_id' => $info['ac_id'], 'pid' => $comment_id, 'type' => self::REPLY_ARE_ANSWERED_TYPE ); // 回帖被回复记录 $this->_d_history->insert($commit_data); } return true; } /** * 更新回帖数和回帖次数 * @param string $uid 当前用户UID * @param string $ac_id 活动ID * @return bool */ protected function update_reply($uid = '', $ac_id = '') { // 条件 $condition = array('uid' => $uid); // 回帖查询 $restore_cond = array( 'uid' => $uid, 'ac_id' => $ac_id, 'pid' => self::FIRST_COMMENT, 'type' => self::RESTORE_ACTIVITY_TYPE ); // 查询是否回复过此话题 $reply_total = $this->_d_history->count_by_conds($restore_cond); // 查询是否回复过此活动 if (empty($reply_total)) { // 更新回复活动数 $this->_d_count->update_by_conds( $condition, array( "reply_num=reply_num+(?)" => self::COMMENT_NUM )); } // 写入历史记录 $this->_d_history->insert($restore_cond); // 回复活动次数 $this->_d_count->update_by_conds( $condition, array( "reply_total=reply_total+(?)" => self::COMMENT_NUM )); return true; } /** * 更新楼层数 * @param string $ac_id 活动ID * @param string $news_cid 帖子ID * @return bool */ protected function update_floor($ac_id = '', $news_cid = '') { //插入评论信息 $info = $this->_d_activity->get($ac_id); if (!empty($info)) { // 插入楼层信息 $this->_d->update($news_cid, array('sort' => intval($info['floor']) + 1)); // 更新楼层数 $this->_d_activity->update($ac_id, array("floor=floor+(?)" => self::COMMENT_NUM)); } return true; } /** * 前端回复评论消息 * @param int $ac_id 活动ID * @param int $comment_id 评论ID(有则评论回复) * @param string $reply_content 回复内容 * @param string $username 回复人姓名 * @return bool */ public function comment_send_msg($ac_id = 0, $comment_id = 0, $reply_content = '', $username = '') { //批判断活动ID是否存在 if (!$ac_id) { return false; } $activity = $this->_d_activity->get($ac_id); $data = []; //判断是否发送评论回复消息 if ($activity['is_notice'] && $comment_id) { //查询要回复评论的UID $comment = $this->_d->get($comment_id); //给评论人提醒有回复 $data['uids'] = $comment['uid']; $data['subject'] = $activity['subject']; $data['content'] = $reply_content; $data['username'] = $username; $data['cid'] = $comment_id; $this->send_msg($data, self::MSG_COMMENT_REPLY); } return false; } /** * 获取积分信息 * @param array $params POST参数 * @param string $uid 当前UID * @param string $id 评论ID * @return array */ public function get_integral_msg($params = [], $uid = '', $id = '') { // 策略ID集合 $key_ids = []; $credit_key_ids = []; // 初始化返回消息 $msg = []; // 实例积分 $service = new Integral(); // 获取活动详情 $activity_info = $this->_d_activity->get($params['ac_id']); // 不使用策略 if (self::INTEGRAL_ACTION_TYPE_NO == $activity_info['integral_action_type'] && self::INTEGRAL_ACTION_TYPE_NO == $activity_info['credit_action_type']) { return []; } // 自定义策略 if (self::INTEGRAL_ACTION_TYPE_MY == $activity_info['integral_action_type']) { $key_ids = unserialize($activity_info['integral_strategyid']); $key_ids = array_combine_by_key($key_ids, 'businesskact'); } // 自定义策略 if (self::INTEGRAL_ACTION_TYPE_MY == $activity_info['credit_action_type']) { $credit_key_ids = unserialize($activity_info['credit_strategyid']); $credit_key_ids = array_combine_by_key($credit_key_ids, 'businesskact'); } // 我评论的详情 $ac_info = $this->get_by_conds(array('comment_id' => $id)); // 发布话题用户记录详情 $info = $this->_d_count->get_by_conds(array('uid' => $uid)); // 如果是回帖 if (self::FIRST_COMMENT == $params['comment_id']) { // 楼层KEY $reply_floor_key = 'reply_floor' . $params['ac_id']; // 回帖KEY $comment_key = 'reply_floor_range' . $params['ac_id']; // 楼层积分规则 $integral_data = array( 'msgIdentifier' => APP_IDENTIFIER, 'memUid' => $uid, 'businessKey' => 'active_center', 'businessAct' => 'reply_floor', 'businessId' => $reply_floor_key, 'triggers' => [ [ 'miType' => IntegralStrategy::TRIGGER_TYPE_INTEGRAL, 'businessStrategyId' => strval($key_ids['reply_floor']['eibsid']), 'triggerTypes' => [ [ 'triggerKey' => 'number', 'value' => intval($ac_info['sort']), 'remark' => '回帖楼层数' ], [ 'triggerKey' => 'reply_floor_range', 'value' => intval($ac_info['sort']), 'remark' => '回帖楼层区间' ] ] ] ], ); // 回帖次数 $answered[] = array( 'triggerKey' => 'number', 'value' => intval($info['reply_total']), 'remark' => '回帖次数' ); // 查询回帖记录 $reply_cond = array( 'uid' => $uid, 'ac_id' => $params['ac_id'], 'pid' => self::FIRST_COMMENT, 'type' => self::RESTORE_ACTIVITY_TYPE ); // 查询是否回复过此话题 $reply_total = $this->_d_history->count_by_conds($reply_cond); // 如果是首次回复 if (self::COMMENT_FIRST == $reply_total) { $answered[] = array( 'triggerKey' => 'reply_business_num', 'value' => intval($info['reply_num']), 'remark' => '回复活动数' ); } // 回帖积分规则 $reply_data = array( 'msgIdentifier' => APP_IDENTIFIER, 'memUid' => $uid, 'businessKey' => 'active_center', 'businessAct' => 'answered', 'businessId' => $comment_key, 'triggers' => [ [ 'miType' => IntegralStrategy::TRIGGER_TYPE_INTEGRAL, 'businessStrategyId' => strval($key_ids['answered']['eibsid']), 'triggerTypes' => $answered, ] ], ); // 楼层数据 $was_comment = array( 'uid' => $uid, 'pid' => $id, 'businessId' => $reply_floor_key ); // 楼层日志 $this->_d_log->insert($was_comment); // 回帖数据 $comment = array( 'uid' => $uid, 'pid' => $id, 'businessId' => $comment_key ); // 回帖日志 $this->_d_log->insert($comment); // 统一触发积分策略 if (self::INTEGRAL_ACTION_TYPE_NO != $activity_info['integral_action_type']) { $integral_msg = $service->changeScore($integral_data); $reply_msg = $service->changeScore($reply_data); } // 统一触发学分策略 if (self::INTEGRAL_ACTION_TYPE_NO != $activity_info['credit_action_type']) { $integral_data['triggers'][0]['miType'] = IntegralStrategy::TRIGGER_TYPE_CREDIT; $integral_data['triggers'][0]['businessStrategyId'] = strval($credit_key_ids['reply_floor']['eibsid']); $credit_msg = $service->changeScore($integral_data); $reply_data['triggers'][0]['miType'] = IntegralStrategy::TRIGGER_TYPE_CREDIT; $reply_data['triggers'][0]['businessStrategyId'] = strval($credit_key_ids['answered']['eibsid']); $credit_reply_msg = $service->changeScore($reply_data); } // 合并消息 $msg = array_merge($integral_msg, $reply_msg, $credit_msg, $credit_reply_msg); } else { // 组装查询回帖条件 $where = array( 'comment_id' => $params['comment_id'], 'parent_id' => self::FIRST_COMMENT ); // 查询是否为帖子 $comment_info = $this->get_by_conds($where); if (!empty($comment_info)) { // 话题被评论KEY $reply_key = 'active_' . $id . '_' . rand(0, 9999); // 话题被评论KEY $comment_key = 'active_' . $id . '_' . rand(0, 9999); // 回复回帖数组 $triggerTypes[] = array( 'triggerKey' => 'number', 'value' => intval($info['answer_total']), 'remark' => '回复回帖次数' ); // 发布话题用户回帖被回复数据 $reply_info = $this->_d_count->get_by_conds(array('uid' => $comment_info['uid'])); // 回帖被回复次数 $was_reply_data[] = array( 'triggerKey' => 'number', 'value' => intval($reply_info['replies_total']), 'remark' => '回帖被回复次数' ); // 回复当前回帖次数判断 $restore_cond = array( 'uid' => $uid, 'ac_id' => $params['ac_id'], 'pid' => $params['comment_id'], 'type' => self::REPLIES_ARE_ANSWERED_TYPE ); // 查询是否回复过此话题 $restore_total = $this->_d_history->count_by_conds($restore_cond); // 如果回复回帖数 if (self::COMMENT_FIRST == $restore_total) { $triggerTypes[] = array( 'triggerKey' => 'reply_business_num', 'value' => intval($info['answer_num']), 'remark' => '回复回帖个数' ); $was_reply_where = array( 'post_man' => $comment_info['uid'], 'type' => self::REPLIES_ARE_ANSWERED_TYPE ); // 查询所以被回复记录UID去重统计 $list = $this->_d_history->list_by_conds($was_reply_where, null, [], 'uid'); // 所有的回帖人 $uids = array_unique(array_column($list, 'uid')); // 回帖被回复数组 $was_reply_data[] = array( 'triggerKey' => 'was_reply_num', 'value' => count($uids), 'remark' => '回帖被回复个数' ); } // 回复回帖 $reply_data = [ 'msgIdentifier' => APP_IDENTIFIER, 'memUid' => $uid, 'businessKey' => 'active_center', 'businessAct' => 'reply', 'businessId' => $reply_key, 'triggers' => [ [ 'miType' => IntegralStrategy::TRIGGER_TYPE_INTEGRAL, 'businessStrategyId' => strval($key_ids['reply']['eibsid']), 'triggerTypes' => $triggerTypes, ] ], ]; // 回帖被回复积分规则 $answer_data = [ 'msgIdentifier' => APP_IDENTIFIER, 'memUid' => $comment_info['uid'], 'businessKey' => 'active_center', 'businessAct' => 'was_reply', 'businessId' => $comment_key, 'triggers' => [ [ 'miType' => IntegralStrategy::TRIGGER_TYPE_INTEGRAL, 'businessStrategyId' => strval($key_ids['was_reply']['eibsid']), 'triggerTypes' => $was_reply_data, ] ], ]; // 回复帖子日志 $reply = array( 'uid' => $uid, 'pid' => $id, 'businessId' => $reply_key ); // 回复帖子 $this->_d_log->insert($reply); // 帖子被回复日志 $was_reply = array( 'uid' => $comment_info['uid'], 'pid' => $id, 'businessId' => $comment_key ); // 帖子被回复日志 $this->_d_log->insert($was_reply); // 统一触发积分策略 if (self::INTEGRAL_ACTION_TYPE_NO != $activity_info['integral_action_type']) { $service->changeScore($answer_data); $integral_msg = $service->changeScore($reply_data); } // 统一触发学分策略 if (self::INTEGRAL_ACTION_TYPE_NO != $activity_info['credit_action_type']) { $answer_data['triggers'][0]['miType'] = IntegralStrategy::TRIGGER_TYPE_CREDIT; $answer_data['triggers'][0]['businessStrategyId'] = strval($credit_key_ids['was_reply']['eibsid']); $service->changeScore($answer_data); $reply_data['triggers'][0]['miType'] = IntegralStrategy::TRIGGER_TYPE_CREDIT; $reply_data['triggers'][0]['businessStrategyId'] = strval($credit_key_ids['reply']['eibsid']); $credit_msg = $service->changeScore($reply_data); } // 如果是回复 $msg = array_merge($integral_msg, $credit_msg); } } // 获取返回消息 return $this->msg_list($msg); } /** * 管理后台活动已参与列表 * * @param $params * * @return mixed */ public function list_join($params) { // 默认值 $page = !empty($params['page']) ? intval($params['page']) : self::DEFAULT_PAGE; $limit = !empty($params['limit']) ? intval($params['limit']) : self::DEFAULT_LIMIT; // 分页 list($start, $limit) = page_limit($page, $limit); // 按照发布时间排序 $order_option = ['created' => 'DESC']; // 查询条件 $conds = ['ac_id' => $params['ac_id'], 'parent_id' => 0]; $join_list = $this->_d->list_join($conds, [$start, $limit], $order_option); $uids = array_column($join_list, 'uid'); $user_s = new User(); $user_list = $user_s->listByUid($uids); foreach ($join_list as $join_k => $join_v) { // 获取用户信息 $user_info = $user_list[$join_v['uid']]; // 获取被删除的用户信息 if (empty($user_info)) { $user_info = $user_s->getByUid($join_v['uid']); } $join_list[$join_k]['memId'] = $join_v['uid']; $join_list[$join_k]['memUsername'] = $user_info['memUsername']; $join_list[$join_k]['dpName'] = $user_info['dpName'][0]['dpName']; $join_list[$join_k]['roleName'] = $user_info['memRole']; $join_list[$join_k]['jobName'] = $user_info['memJob']; $join_list[$join_k]['telephone'] = $user_info['memMobile']; $join_list[$join_k]['last_join_time'] = $join_v['created']; $join_list[$join_k]['tagName'] = $user_info['memTag']; } return $join_list; } /** * 获取活动已参与人数 * * @param array $params 过滤条件 * * @return mixed */ public function count_join($params) { $conds = [ 'ac_id' => $params['ac_id'], 'parent_id' => 0, ]; return $this->_d->count_join($conds); } /** * 获取活动未参与列表 * * @param array $params 过滤条件 * @param array $unjoin_uids 未参与的uid集合数组 * * @return array */ public function list_unjoin($params, $unjoin_uids) { // 数组分页 $page = !empty($params['page']) ? intval($params['page']) : self::DEFAULT_PAGE; $limit = !empty($params['limit']) ? intval($params['limit']) : self::DEFAULT_LIMIT; //计算每次分页的开始位置 $start_limt = ($page - 1) * $limit; $uids = array_slice($unjoin_uids, $start_limt, $limit); // 查询用户信息 $user_s = new User(); $unjoin_user_list = $user_s->listByUid($uids); $unjoin_list = []; foreach ($unjoin_user_list as $user_v) { $unjoin_list[] = [ 'memId' => $user_v['memUid'], 'memUsername' => $user_v['memUsername'], 'dpName' => $user_v['dpName'][0]['dpName'], 'roleName' => $user_v['memRole'], 'jobName' => $user_v['memJob'], 'telephone' => $user_v['memMobile'], 'tagName' => $user_v['memTag'] ]; } return $unjoin_list; } /** * 获取活动未参与人数 * * @param array $params 过滤条件 * * @return array */ public function count_unjoin($params) { // 获取权限内总人数 $right_m = new RightModel(); $right_conds = [ 'ac_id' => $params['ac_id'], ]; $right_list = $right_m->list_by_conds($right_conds); $right_service = new RightService(); $right_data = $right_service->format_db_data($right_list); $right_data['is_all'] = $params['is_all']; $right_uids = $right_service->list_uids_by_right($right_data); // 获取已参与人员 $join_list = $this->_d->list_join(['ac_id' => $params['ac_id']]); // 剔除已参与的人员 $join_uids = array_column($join_list, 'uid'); $unjoin_uids = array_diff($right_uids, $join_uids); return [ 'unjoin_uids' => $unjoin_uids, // 未参与的uid数组 'unjoin_num' => count($unjoin_uids), // 未参与人数 ]; } /** * 获取活动参与情况数据 * * @param array $params 参数列表 * @param array $unjoin_uids 未参与人员id集合 * * @return array */ public function export_join_data($params, $unjoin_uids = []) { $list = []; $user_s = new User(); // 已参与 if (Constant::ACTIVITY_JOIN_TYPE_TRUE == $params['is_join']) { // 排序 $order_option = ['comment_id' => 'DESC']; // 查询条件 $conditions = [ 'ac_id' => $params['ac_id'], 'parent_id' => 0 ]; $join_list = $this->_d->list_join($conditions, [], $order_option); $uids = array_unique(array_column($join_list, 'uid')); $user_list = $user_s->listByUid($uids); foreach ($join_list as $join_k => $join_v) { // 用户信息 $user_info = $user_list[$join_v['uid']]; // 获取被删除的用户信息 if (empty($user_info)) { $user_info = $user_s->getByUid($join_v['uid']); } // 部门路径 $departmentPath = Department::instance()->getCdNames($user_info['dpName'][0]['dpId']); $list[] = [ 'memUsername' => $user_info['memUsername'], 'dpName' => $departmentPath, 'jobName' => $user_info['memJob'], 'roleName' => $user_info['memRole'], 'telephone' => $user_info['memMobile'], 'last_join_time' => rgmdate($join_v['created'], 'Y-m-d H:i') ]; } } elseif (Constant::ACTIVITY_JOIN_TYPE_FALSE == $params['is_join']) { // 未参与 // 查询用户信息 $unjoin_user_list = $user_s->listByUid($unjoin_uids); foreach ($unjoin_user_list as $unjoin_user) { // 部门路径 $departmentPath = Department::instance()->getCdNames($unjoin_user['dpName'][0]['dpId']); $list[] = [ 'memUsername' => $unjoin_user['memUsername'], 'dpName' => $departmentPath, 'jobName' => $unjoin_user['memJob'], 'roleName' => $unjoin_user['memRole'], 'telephone' => $unjoin_user['memMobile'] ]; } } return $list; } }