From 0fb76d60376356879b5a95af086c22befd6799da Mon Sep 17 00:00:00 2001 From: liweisen Date: Wed, 18 Nov 2020 13:03:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=A5=E7=A8=8B=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/common/Model/Events.php | 110 +++++++ application/common/Model/EventsLog.php | 8 + application/common/Model/EventsMember.php | 98 +++++++ application/project/behavior/Events.php | 138 +++++++++ application/project/controller/Events.php | 338 ++++++++++++++++++++++ application/project/tags.php | 3 + 6 files changed, 695 insertions(+) create mode 100644 application/common/Model/Events.php create mode 100644 application/common/Model/EventsLog.php create mode 100644 application/common/Model/EventsMember.php create mode 100644 application/project/behavior/Events.php create mode 100644 application/project/controller/Events.php diff --git a/application/common/Model/Events.php b/application/common/Model/Events.php new file mode 100644 index 0000000..aff6315 --- /dev/null +++ b/application/common/Model/Events.php @@ -0,0 +1,110 @@ + $projectCode])->field('id')->find(); + if (!$project) { + return error(3, '该日程已失效'); + } + $data = [ + 'create_time' => nowTime(), + 'code' => createUniqueCode('ProjectVersion'), + 'project_code' => $projectCode, + 'begin_time' => $beginTime, + 'end_time' => $endTime, + 'position' => $position, + 'all_day' => $allDay, + 'description' => $description, + 'organization_code' => $organizationCode, + 'created_by' => $createdBy, + 'title' => trim($title), + ]; + return self::create($data)->toArray(); + } + + /** + * 删除日程 + * @param $eventsCode + * @return array|bool + */ + public function deleteEvents($eventsCode) + { + if (!$eventsCode) { + return error(1, '请选择一个日程'); + } + self::eventsHook(getCurrentMember()['code'], $eventsCode, 'delete'); + self::update(['deleted' => 1, 'deleted_time' => nowTime()], ['code' => $eventsCode]); + return true; + } + + /** + * 变动钩子 + * @param $memberCode + * @param $eventsCode + * @param string $type + * @param string $remark + * @param string $content + * @param array $data + * @param string $tag + */ + public static function eventsHook($memberCode, $eventsCode, $type = 'create', $remark = '', $content = '', $data = [], $tag = 'events') + { + $data = ['memberCode' => $memberCode, 'eventsCode' => $eventsCode, 'remark' => $remark, 'type' => $type, 'content' => $content, 'data' => $data, 'tag' => $tag]; + Hook::listen($tag, $data); + } +} diff --git a/application/common/Model/EventsLog.php b/application/common/Model/EventsLog.php new file mode 100644 index 0000000..299dd5e --- /dev/null +++ b/application/common/Model/EventsLog.php @@ -0,0 +1,8 @@ + $eventCode, 'deleted' => 0])->find(); + if (!$event) { + return error(4, '该日程已失效'); + } + $hasJoined = self::where(['member_code' => $memberCode, 'events_code' => $eventCode])->find(); + if ($hasJoined) { + return error(4, '该成员已加入日程'); + } + $data = [ + 'member_code' => $memberCode, + 'events_code' => $eventCode, + 'project_code' => $event->project_code, + 'is_owner' => $isOwner, + 'status' => $isOwner ? 1 : $status, + 'join_time' => nowTime() + ]; + $result = self::create($data); + Events::eventsHook(getCurrentMember()['code'], $eventCode, 'inviteMember', '', '', ['memberCode' => $memberCode]); + return $result; + } + + public static function removeMember($memberCode, $eventCode) + { + $event = Events::where(['code' => $eventCode, 'deleted' => 0])->find(); + if (!$event) { + return error(4, '该日程已失效'); + } + $hasJoined = self::where(['member_code' => $memberCode, 'events_code' => $eventCode])->find(); + if (!$hasJoined) { + return error(4, '该成员尚未加入日程'); + } + if ($hasJoined['is_owner']) { + return error(4, '不能移除创建者'); + } + $result = $hasJoined->delete(); + Events::eventsHook(getCurrentMember()['code'], $eventCode, 'removeMember', '', '', ['memberCode' => $memberCode]); + return $result; + } + + public static function confirmJoin($memberCode, $eventCode, $status) + { + $event = Events::where(['code' => $eventCode, 'deleted' => 0])->find(); + if (!$event) { + return error(4, '该日程已失效'); + } + $hasJoined = self::where(['member_code' => $memberCode, 'events_code' => $eventCode])->find(); + if (!$hasJoined) { + return error(4, '尚未加入日程'); + } + $result = self::where(['member_code' => $memberCode, 'events_code' => $eventCode])->update(['status' => $status, 'confirm_time' => nowTime()]); + if ($status == 1) { + $type = 'agreeJoin'; + } else { + $type = 'refuseJoin'; + } + Events::eventsHook(getCurrentMember()['code'], $eventCode, $type, '', '', ['memberCode' => $memberCode]); + return $result; + } + + public function getMemberInfoAttr($value, $data) + { + if (empty($data['member_code'])) { + $data['member_code'] = 0; + } + return Member::where('code', $data['member_code'])->field('name,avatar')->find(); + } +} diff --git a/application/project/behavior/Events.php b/application/project/behavior/Events.php new file mode 100644 index 0000000..69206e5 --- /dev/null +++ b/application/project/behavior/Events.php @@ -0,0 +1,138 @@ + $data['memberCode'], 'source_code' => $data['eventsCode'], 'remark' => $data['remark'], 'type' => $data['type'], 'content' => $data['content'], 'data' => $data['data'], 'create_time' => nowTime(), 'code' => createUniqueCode('eventsLog')]; + $events = \app\common\Model\Events::where(['code' => $data['eventsCode']])->find(); + $logData['project_code'] = $events['project_code']; + $remark = ''; + $content = ''; + $notifyData = [ + 'title' => '', + 'content' => '', + 'type' => 'message', + 'action' => 'events', + 'terminal' => 'project', + 'source_code' => $data['eventsCode'], + ]; + + $member = Member::where(['code' => $data['memberCode']])->find(); + $toMember = []; + if (isset($data['data']['memberCode'])) { + $toMember = Member::where(['code' => $data['data']['memberCode']])->find(); + } + switch ($data['type']) { + case 'create': + $icon = 'plus'; + $remark = '创建了日程 '; + $content = $events['title']; + break; + case 'title': + $icon = 'edit'; + $remark = '更新了日程名 '; + $content = $events['title']; + break; + case 'content': + $icon = 'file-text'; + $remark = '更新了备注 '; + $content = $events['description']; + break; + case 'clearContent': + $icon = 'file-text'; + $remark = '清空了备注 '; + break; + case 'setBeginTime': + $icon = 'calendar'; + $remark = '更新开始时间为 ' . date('m月d日 H:i', strtotime($events['begin_time'])); + break; + case 'clearBeginTime': + $icon = 'calendar'; + $remark = '清除了开始时间 '; + break; + case 'setEndTime': + $icon = 'calendar'; + $remark = '更新截止时间为 ' . date('m月d日 H:i', strtotime($events['end_time'])); + break; + case 'clearEndTime': + $icon = 'calendar'; + $remark = '清除了截止时间 '; + break; + case 'delete': + $icon = 'delete'; + $remark = '删除了日程 '; + break; + case 'agreeJoin': + $icon = 'user-add'; + $remark = $member['name'] . ' 确认加入日程'; + $content = $member['name']; + break; + case 'refuseJoin': + $icon = 'user-add'; + $remark = $member['name'] . ' 拒绝加入日程'; + $content = $member['name']; + break; + case 'inviteMember': + $icon = 'user-add'; + $remark = '将 ' . $toMember['name'] . ' 添加到日程'; + $content = $toMember['name']; + $notifyData['title'] = "{$member['name']} 邀请你加入日程"; + $notifyData['content'] = $events['title']; + break; + case 'removeMember': + $icon = 'user-delete'; + $remark = '将 ' . $toMember['name'] . ' 从日程中移出'; + $content = $toMember['name']; + $notifyData['title'] = "{$member['name']} 将你从日程中移出"; + $notifyData['content'] = $events['title']; + break; + default: + $icon = 'plus'; + $remark = ' 创建了日程 '; + break; + } + $logData['icon'] = $icon; + if (!$data['remark']) { + $logData['remark'] = $remark; + } + if (!$data['content']) { + $logData['content'] = $content; + } + EventsLog::create($logData); + + $notifyActions = ['inviteMember', 'removeMember']; + $socketAction = $notifyData['action']; + if (in_array($data['type'], $notifyActions)) { + if ($toMember['code'] != $member['code']) { + $messageService = new MessageService(); + $notifyModel = new Notify(); + $notifyData['avatar'] = $member['avatar']; + $result = $notifyModel->add($notifyData['title'], $notifyData['content'], $notifyData['type'], $member['code'], $toMember['code'], $notifyData['action'], [], $notifyData['terminal'], $notifyData['avatar']); + if (isOpenNoticePush()) { + $socketMessage = $socketGroupMessage = ['content' => $notifyData['content'], 'title' => $notifyData['title'], 'data' => ['organizationCode' => getCurrentOrganizationCode(), 'projectCode' => $events['project_code'], 'eventsCode' => $events['code']]]; + $socketMessage['notify'] = $result; + $messageService->sendToUid($toMember['code'], $socketMessage, $socketAction); + } + } + } + } +} diff --git a/application/project/controller/Events.php b/application/project/controller/Events.php new file mode 100644 index 0000000..57f7c0f --- /dev/null +++ b/application/project/controller/Events.php @@ -0,0 +1,338 @@ +model) { + $this->model = new \app\common\Model\Events(); + } + } + + /** + * 显示资源日程 + * @return void + * @throws DataNotFoundException + * @throws ModelNotFoundException + * @throws DbException + */ + public function index() + { + $where = []; + $code = Request::post('projectCode'); + if ($code) { + $where[] = ['project_code', '=', $code]; + } + $where[] = ['deleted', '=', 0]; + $list = $this->model->_list($where); +// $eventMember = new EventsMember(); +// $list = $eventMember->_list($where); + if ($list['list']) { + foreach ($list['list'] as &$item) { + $item['memberList'] = []; + $item['projectName'] = ''; + $members = EventsMember::where(['events_code' => $item['code']])->order('is_owner desc, status desc, id asc')->all(); + if ($members) { + $item['memberList'] = $members; + } + $project = \app\common\Model\Project::where('code', $item['project_code'])->field('name')->find(); + if ($project) { + $item['projectName'] = $project['name']; + } + } + } + $this->success('', $list); + } + + public function myList() + { + $where = []; + $code = Request::post('projectCode'); + if ($code) { + $where[] = ['project_code', '=', $code]; + } + $status = Request::post('status', -1); + $where[] = ['deleted', '=', 0]; + $memberWhere = [['member_code', '=', getCurrentMember()['code']]]; + if ($status != -1) { + $memberWhere[] = ['status', '=', $status]; + } else { + $memberWhere[] = ['status', '<>', 2]; + } + $memberCode = getCurrentMember()['code']; + $eventCodes = EventsMember::where($memberWhere)->column('events_code'); + $where[] = ['code', 'in', $eventCodes]; + $list = $this->model->_list($where); + if ($list['list']) { + foreach ($list['list'] as &$item) { + $item['memberList'] = []; + $item['projectName'] = ''; + $item['waitConfirm'] = 1; + $waitConfirm = EventsMember::where(['events_code' => $item['code'], 'member_code' => $memberCode, 'status' => 0])->find(); + if (!$waitConfirm) { + $item['waitConfirm'] = 0; + } + $members = EventsMember::where(['events_code' => $item['code']])->order('is_owner desc, status desc, id asc')->all(); + if ($members) { + $item['memberList'] = $members; + } + $project = \app\common\Model\Project::where('code', $item['project_code'])->field('name')->find(); + if ($project) { + $item['projectName'] = $project['name']; + } + } + } + $this->success('', $list); + } + + public function confirmList() + { + $where = []; + $code = Request::post('projectCode'); + if ($code) { + $where[] = ['project_code', '=', $code]; + } + $where[] = ['deleted', '=', 0]; + $eventCodes = EventsMember::where(['status' => 0, 'member_code' => getCurrentMember()['code']])->column('events_code'); + $where[] = ['code', 'in', $eventCodes]; + $list = $this->model->_list($where); + if ($list['list']) { + foreach ($list['list'] as &$item) { + $item['memberList'] = []; + $item['projectName'] = ''; + $members = EventsMember::where(['events_code' => $item['code']])->all(); + if ($members) { + $item['memberList'] = $members; + } + $project = \app\common\Model\Project::where('code', $item['project_code'])->field('name')->find(); + if ($project) { + $item['projectName'] = $project['name']; + } + } + } + $this->success('', $list); + } + + /** + * 新增 + * @param Request $request + * @return void + * @throws DataNotFoundException + * @throws DbException + * @throws ModelNotFoundException + */ + public function save(Request $request) + { + $data = $request::only('project_code,title,description,begin_time,end_time,all_day,position'); + if (!$request::post('title')) { + $this->error("请填写日程名称"); + } + $result = $this->model->createData($data['project_code'], $data['title'], $data['description'], $data['position'], $data['all_day'], getCurrentOrganizationCode(), $data['begin_time'], $data['end_time'], getCurrentMember()['code']); + if (!isError($result)) { + \app\common\Model\Events::eventsHook(getCurrentMember()['code'], $result['code'], 'create'); + $memberList = $request::post('member_list', ""); + if ($memberList) { + $memberCode = getCurrentMember()['code']; + $memberList = json_decode($memberList, JSON_UNESCAPED_UNICODE); + foreach ($memberList as $item) { + EventsMember::inviteMember($item, $result['code'], $item == $memberCode ? 1 : 0); + } + } + + $this->success('添加成功', $result); + } + $this->error($result['msg']); + } + + /** + * 保存 + * @param Request $request + * @return void + * @throws DataNotFoundException + * @throws ModelNotFoundException + * @throws DbException + */ + public function edit(Request $request) + { + $data = $request::only('project_code,title,description,begin_time,end_time,all_day,position'); + $eventsCode = $request::param('code'); + if (isset($data['title']) && !$data['title']) { + $this->error("请填写日程名称"); + } + if (!$eventsCode) { + $this->error("请选择一个日程"); + } + $events = $this->model->where(['code' => $eventsCode])->field('id,project_code')->find(); + if (!$events) { + $this->error("该日程已失效"); + } + $result = $this->model->_edit($data, ['code' => $eventsCode]); + if ($result) { + $eventsMemberCodes = EventsMember::where(['events_code' => $eventsCode])->column('member_code'); + $memberList = $request::post('member_list', ""); + if ($memberList) { + $memberCode = getCurrentMember()['code']; + $memberList = json_decode($memberList, JSON_UNESCAPED_UNICODE); + foreach ($memberList as $item) { + if (!in_array($item, $eventsMemberCodes)) { + EventsMember::inviteMember($item, $eventsCode, $item == $memberCode ? 1 : 0); + } + } + } + if ($eventsMemberCodes) { + foreach ($eventsMemberCodes as $item) { + if (!in_array($item, $memberList)) { + EventsMember::removeMember($item, $eventsCode); + } + } + } + + $member = getCurrentMember(); + $type = 'title'; + if (isset($data['title'])) { + $type = 'title'; + } + if (isset($data['description'])) { + $type = 'content'; + if (!$data['description']) { + $type = 'clearContent'; + } + } + if (isset($data['begin_time'])) { + $type = 'setBeginTime'; + if (!$data['begin_time']) { + $type = 'clearBeginTime'; + } + } + if (isset($data['end_time'])) { + $type = 'setEndTime'; + if (!$data['end_time']) { + $type = 'clearEndTime'; + } + } + \app\common\Model\Events::eventsHook($member['code'], $eventsCode, $type); + $this->success(''); + } + $this->error("操作失败,请稍候再试!"); + } + + /** + * 详情 + * @throws DataNotFoundException + * @throws DbException + * @throws ModelNotFoundException + */ + public function read() + { + $code = Request::post('eventsCode'); + $events = $this->model->where(['code' => $code])->field('id', true)->find(); + if ($events) { + $events['memberList'] = []; + $members = EventsMember::where(['events_code' => $events['code']])->all(); + if ($members) { + $events['memberList'] = $members; + } + } + $this->success('', $events); + } + + public function confirmJoin() + { + $eventsCode = Request::post('eventsCode'); + $status = Request::post('status'); + $memberCode = getCurrentMember()['code']; + $result = EventsMember::confirmJoin($memberCode, $eventsCode, $status); + if (isError($result)) { + $this->error($result['msg'], $result['errno']); + } + $this->success(); + } + + public function removeMember() + { + $eventsCode = Request::post('eventsCode'); + $memberCode = Request::post('memberCode'); + $result = EventsMember::removeMember($memberCode, $eventsCode); + if (isError($result)) { + $this->error($result['msg'], $result['errno']); + } + $this->success(); + } + + public function inviteMember() + { + $eventsCode = Request::post('eventsCode'); + $memberCode = Request::post('memberCode'); + $result = EventsMember::inviteMember($memberCode, $eventsCode, 0); + if (isError($result)) { + $this->error($result['msg'], $result['errno']); + } + $this->success(); + } + + /** + * 日程日志 + * @throws DataNotFoundException + * @throws DbException + * @throws ModelNotFoundException + */ + public function _getEventsLog() + { + $code = Request::post('eventsCode'); + $showAll = Request::post('all', 0); + $where = []; + $where[] = ['source_code', '=', $code]; + $eventsModel = new EventsLog(); + if ($showAll) { + $list = []; + $list['list'] = $eventsModel->where($where)->order('id asc')->select()->toArray(); + $list['total'] = count($list['list']); + } else { + $list = $eventsModel->_list($where, 'id desc'); + if ($list['list']) { + $list['list'] = array_reverse($list['list']); + } + } + if ($list['list']) { + foreach ($list['list'] as &$item) { + $member = Member::where(['code' => $item['member_code']])->field('id,name,avatar,code')->find(); + !$member && $member = []; + $item['member'] = $member; + } + } + $this->success('', $list); + } + + /** + * 删除日程 + * @return void + */ + public function delete() + { + $code = Request::post('eventsCode'); + if (!$code) { + $this->error("请选择一个日程"); + } + $result = $this->model->deleteEvents($code); + if (isError($result)) { + $this->error($result['msg'], $result['errno']); + } + $this->success(); + } +} diff --git a/application/project/tags.php b/application/project/tags.php index 773c829..0afdff8 100644 --- a/application/project/tags.php +++ b/application/project/tags.php @@ -9,4 +9,7 @@ return [ 'version' => [ 'app\\project\\behavior\\Version' ], + 'events' => [ + 'app\\project\\behavior\\Events' + ], ];