| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552 |
- <?php
- /**
- +-----------------------------------------------------------------------------------------------
- * GouGuOPEN [ 左手研发,右手开源,未来可期!]
- +-----------------------------------------------------------------------------------------------
- * @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
- +-----------------------------------------------------------------------------------------------
- * @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
- +-----------------------------------------------------------------------------------------------
- * @Author 勾股工作室 <hdm58@qq.com>
- +-----------------------------------------------------------------------------------------------
- */
- declare (strict_types = 1);
- namespace app\home\controller;
- use app\base\BaseController;
- use app\home\model\Message as MessageList;
- use app\home\model\Msg as MsgList;
- use think\facade\Db;
- use think\facade\View;
- class Message extends BaseController
- {
- /**
- * 构造函数
- */
- protected $model;
- protected $model2;
- public function __construct() {
- parent::__construct(); // 调用父类构造函数
- $this->model = new MessageList();
- $this->model2 = new MsgList();
- }
- //收件箱
- public function inbox()
- {
- if (request()->isAjax()) {
- $param = get_params();
- $where = [];
- $where[] = ['to_uid', '=', $this->uid];
- $where[] = ['delete_time', '=', 0];
- if (!empty($param['keywords'])) {
- $where[] = ['title', 'like', '%' . $param['keywords'] . '%'];
- }
- if (!empty($param['read'])) {
- if($param['read']==1){
- $where[] = ['read_time', '=', 0];
- }else{
- $where[] = ['read_time', '>', 0];
- }
- }
- if (!empty($param['types'])) {
- if($param['types']==1){
- $where[] = ['from_uid', '=', 0];
- }else{
- $where[] = ['from_uid', '>', 0];
- }
- }
- //按发送时间检索
- if (!empty($param['range_time'])) {
- $range_time =explode('~', $param['range_time']);
- $where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]];
- }
- $list = $this->model2->datalist($where,$param);
- return table_assign(0, '', $list);
- } else {
- $a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
- $b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
- $count = [
- 'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
- 'inbox' => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
- 'star' => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
- 'draft' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
- 'rubbish' => $a+$b
- ];
- View::assign('count', $count);
- View::assign('action', $this->action);
- return view();
- }
- }
-
- //星标信息
- public function star()
- {
- if (request()->isAjax()) {
- $param = get_params();
- $where = [];
- $where[] = ['to_uid', '=', $this->uid];
- $where[] = ['delete_time', '=', 0];
- $where[] = ['is_star', '=', 1];
- if (!empty($param['keywords'])) {
- $where[] = ['title', 'like', '%' . $param['keywords'] . '%'];
- }
- if (!empty($param['read'])) {
- if($param['read']==1){
- $where[] = ['read_time', '=', 0];
- }else{
- $where[] = ['read_time', '>', 0];
- }
- }
- if (!empty($param['types'])) {
- if($param['types']==1){
- $where[] = ['from_uid', '=', 0];
- }else{
- $where[] = ['from_uid', '>', 0];
- }
- }
- //按发送时间检索
- if (!empty($param['range_time'])) {
- $range_time =explode('~', $param['range_time']);
- $where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]];
- }
- $list = $this->model2->datalist($where,$param);
- return table_assign(0, '', $list);
- } else {
- $a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
- $b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
- $count = [
- 'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
- 'inbox' => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
- 'star' => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
- 'draft' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
- 'rubbish' => $a+$b
- ];
- View::assign('count', $count);
- View::assign('action', $this->action);
- return view();
- }
- }
-
- //发件箱
- public function sendbox()
- {
- if (request()->isAjax()) {
- $param = get_params();
- $where = [];
- if (!empty($param['keywords'])) {
- $map[] = ['title', 'like', '%' . $param['keywords'] . '%'];
- }
- $where[] = ['from_uid', '=', $this->uid];
- $where[] = ['is_draft', '=', 1];
- $where[] = ['delete_time', '=', 0];
- //按发送时间检索
- if (!empty($param['range_time'])) {
- $range_time =explode('~', $param['range_time']);
- $where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]];
- }
- $list = $this->model->datalist($where,$param);
- return table_assign(0, '', $list);
- } else {
- $a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
- $b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
- $count = [
- 'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
- 'inbox' => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
- 'star' => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
- 'draft' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
- 'rubbish' => $a+$b
- ];
- View::assign('count', $count);
- View::assign('action', $this->action);
- return view();
- }
- }
- //草稿箱
- public function draft()
- {
- if (request()->isAjax()) {
- $param = get_params();
- $where = [];
- if (!empty($param['keywords'])) {
- $map[] = ['title', 'like', '%' . $param['keywords'] . '%'];
- }
- $where[] = ['from_uid', '=', $this->uid];
- $where[] = ['is_draft', '=', 2];
- $where[] = ['delete_time', '=', 0];
- //按发送时间检索
- if (!empty($param['range_time'])) {
- $range_time =explode('~', $param['range_time']);
- $where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]];
- }
- $list = $this->model->datalist($where,$param);
- return table_assign(0, '', $list);
- } else {
- $a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
- $b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
- $count = [
- 'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
- 'inbox' => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
- 'star' => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
- 'draft' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
- 'rubbish' => $a+$b
- ];
- View::assign('count', $count);
- View::assign('action', $this->action);
- return view();
- }
- }
- //垃圾箱
- public function rubbish()
- {
- if (request()->isAjax()) {
- $param = get_params();
- $uid = $this->uid;
- $where = "delete_time > 0";
- $where.= " AND clear_time = 0";
- if (!empty($param['keywords'])) {
- $where.= " AND title like '%" . $param['keywords'] . "%'";
- }
- $sqlParts = [];
- $sqlCounts = [];
- $tables=['message','msg'];
- $prefix = get_config('database.connections.mysql.prefix');
- foreach ($tables as $table) {
- $tableName = $prefix.$table;
- if($table=='message'){
- $wherea= $where.' AND from_uid = '.$uid;
- // 假设每个表都有相同的列结构,这里只是简单示例
- $sqlPart = "SELECT id,title,from_uid,send_time,'{$table}' as table_name FROM {$tableName} WHERE {$wherea}";
- $sqlCount = "SELECT COUNT(*) AS count FROM {$tableName} WHERE {$wherea}";
- }
- else{
- $whereb= $where.' AND to_uid = '.$uid;
- $sqlPart = "SELECT id,title,from_uid,create_time as send_time,'{$table}' as table_name FROM {$tableName} WHERE {$whereb}";
- $sqlCount = "SELECT COUNT(*) AS count FROM {$tableName} WHERE {$whereb}";
- }
-
- // 查询数据库中是否存在该数据表
- $is_table = Db::query("SHOW TABLES LIKE '{$tableName}'");
- // 判断查询结果
- if (!empty($is_table)) {
- $sqlParts[] = $sqlPart;
- $sqlCounts[] = $sqlCount;
- }
- }
- // 使用implode将各个部分用UNION ALL连接起来
- $unionSql = implode(" UNION ALL ", $sqlParts);
-
- $totalCount = 0;
- foreach ($sqlCounts as $sql) {
- $count = Db::query($sql)[0]['count']; // 假设每个查询都返回了一个包含'count'键的数组
- $totalCount += $count;
- }
- // 添加排序和分页逻辑
- // 假设每页显示10条记录,当前页码为$page(需要预先定义或获取)
- $pageSize = $param['limit'];
- $page = 1; // 示例页码
- $offset = ($page - 1) * $pageSize;
- // 注意:不同的数据库分页语法可能有所不同,这里以MySQL为例
- $finalSql = $unionSql . " ORDER BY send_time DESC LIMIT {$offset}, {$pageSize}";
- // 执行查询
- $result = Db::query($finalSql);
- // 处理结果
- foreach ($result as &$row) {
- // 处理每一行数据
- $row['types'] = 0;
- $row['sourse'] = '发件箱';
- if($row['send_time'] == 0){
- $row['sourse'] = '草稿箱';
- $row['types'] = 1;
- $row['send_time'] = '-';
- }
- else{
- if($row['table_name'] == 'msg'){
- $row['sourse'] = '收件箱';
- $row['types'] = 2;
- }
- $row['send_time'] = date('Y-m-d H:i:s',$row['send_time']);
- }
- if(!empty($row['from_uid'])){
- $row['from_name'] = Db::name('Admin')->where('id','=',$row['from_uid'])->value('name');
- }
- else{
- $row['from_name']='-';
- }
- }
- $list=array(
- 'data'=>$result,
- 'total'=>$totalCount
- );
- return table_assign(0, '', $list);
- } else {
- $a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
- $b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
- $count = [
- 'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
- 'inbox' => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
- 'star' => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
- 'draft' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
- 'rubbish' => $a+$b
- ];
- View::assign('count', $count);
- View::assign('action', $this->action);
- return view();
- }
- }
- //新增&编辑信息
- public function add()
- {
- $param = get_params();
- $id = isset($param['id']) ? $param['id'] : 0;
- $msg_id = 0;
- if ($id > 0) {
- $detail = $this->model->detail($id);
- if (empty($detail)) {
- throw new \think\exception\HttpException(404, '找不到记录');
- }
- if ($detail['from_uid'] != $this->uid) {
- throw new \think\exception\HttpException(406, '无权限编辑');
- }
- if($detail['msg_id']>0){
- $msg_id = $detail['msg_id'];
- }
- View::assign('detail', $detail);
- }
- View::assign('id', $id);
- View::assign('msg_id', $msg_id);
- return view();
- }
-
- //查看发件箱、草稿箱消息
- public function view($id)
- {
- $detail = $this->model->detail($id);
- if (empty($detail)) {
- throw new \think\exception\HttpException(404, '找不到记录');
- }
- if ($detail['from_uid'] != $this->uid) {
- throw new \think\exception\HttpException(406, '无权限查看');
- }
- //已读回执
- if($detail['send_time']>0){
- $read_user_ids= msgList::where([['message_id','=',$id],['read_time','>',0]])->column('to_uid');
- $read_users = Db::name('Admin')->where('status', 1)->where('id', 'in', $read_user_ids)->column('name');
- $detail['read_user_names'] = implode(',',$read_users);
- }
- View::assign('detail', $detail);
- return view();
- }
-
- //删除发件、草稿
- public function del()
- {
- $param = get_params();
- $ids = empty($param['ids']) ? 0 : $param['ids'];
- $idArray = explode(',', $ids);
- foreach ($idArray as $key => $val) {
- MessageList::where(['id' => $val])->update(['delete_time' => time()]);
- add_log('delete', $val,[],'消息');
- }
- return to_assign(0, '操作成功');
- }
- //保存消息
- public function save()
- {
- $param = get_params();
- $id = empty($param['id']) ? 0 : $param['id'];
- //接受人类型判断
- if ($param['types'] == 1 && empty($param['uids'])) {
- return to_assign(1, '收件人员不能为空');
- }
- if ($param['types'] == 2 && empty($param['dids'])) {
- return to_assign(1, '收件部门不能为空');
- }
- if ($param['types'] == 3 && empty($param['pids'])) {
- return to_assign(1, '收件岗位不能为空');
- }
- if ($param['types'] == 4) {
- $param['uids'] = '';
- $param['dids'] = '';
- $param['pids'] = '';
- $param['copy_uids'] = '';
- }
- $res = false;
- if ($id > 0) {
- //编辑信息的情况
- $param['update_time'] = time();
- $res = MessageList::strict(false)->field(true)->update($param);
- } else {
- //新增信息的情况
- $param['create_time'] = time();
- $param['update_time'] = time();
- $param['from_uid'] = $this->uid;
- $res = MessageList::strict(false)->field(true)->insertGetId($param);
- }
- if ($res !== false) {
- if ($id > 0) {
- $mid = $id;
- } else {
- $mid = $res;
- }
- add_log('save',$mid,$param,'消息');
- if($param['is_draft'] == 1){
- $res = $this->model->send($mid);
- if ($res!==false) {
- return to_assign(0, '发送成功');
- } else {
- return to_assign(1, '发送失败');
- }
- }
- else{
- return to_assign(0, '保存成功', $mid);
- }
- } else {
- return to_assign(1, '操作失败');
- }
- }
-
- //发送消息
- public function send_message($id)
- {
- //查询要发的消息
- $msg = MessageList::where(['id' => $id])->find();
- if (!empty($msg)) {
- $res = $this->model->send($id);
- if ($res!==false) {
- return to_assign(0, '发送成功');
- } else {
- return to_assign(1, '发送失败');
- }
- } else {
- return to_assign(1, '发送失败,找不到要发送的内容');
- }
- }
-
- //查看收件箱消息
- public function read($id )
- {
- $detail = $this->model2->detail($id);
- if (empty($detail)) {
- throw new \think\exception\HttpException(406, '找不到记录');
- }
- if ($detail['to_uid'] != $this->uid) {
- throw new \think\exception\HttpException(406, '找不到记录');
- }
- MsgList::where(['id' => $id])->update(['read_time' => time()]);
- if($detail['message_id']>0){
- View::assign('message', $this->model->detail($detail['message_id']));
- }
- $detail['from_uname'] = Db::name('Admin')->where('id', $detail['from_uid'])->value('name');
- View::assign('detail', $detail);
- return view();
- }
-
-
- //回复信息
- public function reply()
- {
- $param = get_params();
- $msg_id = isset($param['msg_id']) ? $param['msg_id'] : 0;
- $detail = $this->model2->detail($msg_id);
- if (empty($detail)) {
- throw new \think\exception\HttpException(404, '找不到记录');
- }
- if ($detail['to_uid'] != $this->uid) {
- throw new \think\exception\HttpException(406, '无权限回复');
- }
- $detail['from_name'] = Db::name('Admin')->where('id', $detail['from_uid'])->value('name');
- View::assign('detail', $detail);
- return view();
- }
-
- //转发信息
- public function resend()
- {
- $param = get_params();
- $msg_id = isset($param['msg_id']) ? $param['msg_id'] : 0;
- $detail = $this->model2->detail($msg_id);
- if (empty($detail)) {
- throw new \think\exception\HttpException(404, '找不到记录');
- }
- if ($detail['to_uid'] != $this->uid) {
- throw new \think\exception\HttpException(406, '无权限回复');
- }
- $detail['from_name'] = Db::name('Admin')->where('id', $detail['from_uid'])->value('name');
- View::assign('detail', $detail);
- return view();
- }
- //状态修改
- public function check()
- {
- $param = get_params();
- $type = empty($param['type']) ? 0 : $param['type'];
- $ids = empty($param['ids']) ? 0 : $param['ids'];
- $idArray = explode(',', $ids);
- foreach ($idArray as $key => $val) {
- if ($type==1) { //设置信息为已读
- MsgList::where(['id' => $val])->update(['read_time' => time()]);
- add_log('view', $val,[],'消息');
- }
- else if ($type==2) { //信息进入垃圾箱
- MsgList::where(['id' => $val])->update(['delete_time' => time()]);
- add_log('delete', $val,[],'消息');
- }
- else if ($type==3) { //信息从垃圾箱恢复
- MsgList::where(['id' => $val])->update(['delete_time' => 0]);
- add_log('recovery', $val,[],'消息');
- }
- else if ($type==4) { //信息彻底删除
- MsgList::where(['id' => $val])->update(['clear_time' => 0]);
- add_log('clear', $val,[],'消息');
- }
- else if ($type==5) { //星标信息
- MsgList::where(['id' => $val])->update(['is_star' => 1]);
- add_log('star', $val,[],'消息');
- }
- else if ($type==6) { //取消星标信息
- MsgList::where(['id' => $val])->update(['is_star' => 0]);
- add_log('unstar', $val,[],'消息');
- }
- }
- return to_assign(0, '操作成功');
- }
-
- //还原消息
- public function recovery()
- {
- $param = get_params();
- $table = empty($param['table']) ? '' : $param['table'];
- $ids = empty($param['ids']) ? 0 : $param['ids'];
- $idArray = explode(',', $ids);
- foreach ($idArray as $key => $val) {
- Db::name($table)->update(['id' => $val,'delete_time' => 0]);
- add_log('recovery', $val,[],'消息');
- }
- return to_assign(0, '操作成功');
- }
- //清除消息
- public function clear()
- {
- $param = get_params();
- $table = empty($param['table']) ? '' : $param['table'];
- $ids = empty($param['ids']) ? 0 : $param['ids'];
- $idArray = explode(',', $ids);
- foreach ($idArray as $key => $val) {
- Db::name($table)->update(['id' => $val,'clear_time' => time()]);
- add_log('clear', $val,[],'消息');
- }
- return to_assign(0, '操作成功');
- }
- }
|