1, ]; /** * 项目下任务列表(看板视图) * * @param $request * @param $user_id * @return array|false * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function getDataList($request, $user_id) { //权限项目判断 $workModel = model('Work'); $userModel = new \app\admin\model\User(); $work_id = $request['work_id']; $map=[]; $ret = $workModel->checkWork($work_id, $user_id); if (!$ret) { $this->error = $workModel->getError(); return false; } $classModel = model('WorkClass'); //删除还原的任务,归类至未分组列表下,此列表不可拖拽编辑 if ($this->where(['class_id' => 0, 'ishidden' => 0, 'work_id' => $work_id])->find()) { $classArr = ['0' => ['name' => '未分组', 'class_id' => 0]]; } $classList = $classModel->getDataList($work_id); if ($classArr && $classList['list']) { $newList = array_merge($classArr, $classList['list']); } elseif ($classArr) { $newList = $classArr; } else { $newList = $classList['list']; } if ($request['stop_time_type']) { if ($request['stop_time_type'] == '5') { //没有截至日期 $map['stop_time'] = '0'; } elseif ($request['stop_time_type'] == '6') { //延期的 $map['stop_time'] = ['between', [1, time()]]; $map['status'] = 1; } elseif ($request['stop_time_type'] == '7') { //今日更新 $timeAry = getTimeByType('today'); $map['update_time'] = ['between', [$timeAry[0], $timeAry[1]]]; } else { switch ($request['stop_time_type']) { case '1': //今天到期 $timeAry = getTimeByType('today'); break; case '2': //明天到期 $temp = getTimeByType('today'); $timeAry[0] = $temp[1]; $timeAry[1] = $temp[1] + 3600 * 24; break; case '3': //一周内到期 $timeAry = getTimeByType('week'); break; case '4': //一月内到期 $timeAry = getTimeByType('month'); break; default: break; } $map['stop_time'] = ['between', [$timeAry[0], $timeAry[1]]]; } } if ($request['lable_id']) { $taskIds = []; $task_ids = []; foreach ($request['lable_id'] as $v) { $task_id = []; $lableWhere = []; $lableWhere['lable_id'] = ['like', '%,' . $v . ',%']; $lableWhere['work_id'] = $work_id; $lableWhere['status'] = ['in', ['1', '5']]; $lableWhere['ishidden'] = 0; $lableWhere['pid'] = 0; $lableWhere['is_archive'] = 0; $task_id = $this->where($lableWhere)->column('task_id'); if ($task_id && $task_ids) { $task_ids = array_unique(array_filter(array_merge($task_ids, $task_id))); } elseif ($task_id) { $task_ids = $task_id; } } $map['task_id'] = ['in', $task_ids]; } $data = array(); foreach ($newList as $key => $value) { $data[$key]['class_id'] = $value['class_id'] ?: -1; $data[$key]['class_name'] = $value['name']; $map['status'] = $map['status'] ?: ['in', ['1', '5']]; $map['ishidden'] = 0; $map['work_id'] = $request['work_id']; $map['class_id'] = $value['class_id']; $map['pid'] = 0; $map['is_archive'] = 0; $map['main_user_id']=$request['main_user_id']; $taskList = []; $map['search']=$request['search']; $resTaskList = $this->getTaskList($map); $data[$key]['count'] = $resTaskList['count']; $data[$key]['list'] = $resTaskList['list']; } return $data; } /** * 项目下任务列表(负责人视图) * * @param $request * @param $user_id * @return array|false * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function getOwnerTaskList($request, $user_id) { //权限项目判断 $workModel = model('Work'); $userModel = new \app\admin\model\User(); $work_id = $request['work_id']; $ret = $workModel->checkWork($work_id, $user_id); if (!$ret) { $this->error = $workModel->getError(); return false; } $newList = db('task')->alias('task')->join('__ADMIN_USER__ user', 'user.id = task.main_user_id', 'LEFT') ->field(['user.id', 'user.realname'])->where('work_id', $work_id)->group('task.main_user_id')->select(); if ($request['main_user_id']) { $map['main_user_id'] = ['in', $request['main_user_id']]; } //截止时间 if ($request['stop_time_type']) { if ($request['stop_time_type'] == '5') { //没有截至日期 $map['stop_time'] = '0'; } elseif ($request['stop_time_type'] == '6') { //延期的 $map['stop_time'] = ['between', [1, time()]]; $map['status'] = 1; } elseif ($request['stop_time_type'] == '7') { //今日更新 $timeAry = getTimeByType('today'); $map['update_time'] = ['between', [$timeAry[0], $timeAry[1]]]; } else { switch ($request['stop_time_type']) { case '1': //今天到期 $timeAry = getTimeByType('today'); break; case '2': //明天到期 $temp = getTimeByType('today'); $timeAry[0] = $temp[1]; $timeAry[1] = $temp[1] + 3600 * 24; break; case '3': //一周内到期 $timeAry = getTimeByType('week'); break; case '4': //一月内到期 $timeAry = getTimeByType('month'); break; default: break; } $map['stop_time'] = ['between', [$timeAry[0], $timeAry[1]]]; } } if ($request['lable_id']) { $taskIds = []; $task_ids = []; foreach ($request['lable_id'] as $v) { $task_id = []; $lableWhere = []; $lableWhere['lable_id'] = ['like', '%,' . $v . ',%']; $lableWhere['work_id'] = $work_id; $lableWhere['status'] = ['in', ['1', '5']]; $lableWhere['ishidden'] = 0; $lableWhere['pid'] = 0; $lableWhere['is_archive'] = 0; $task_id = $this->where($lableWhere)->column('task_id'); if ($task_id && $task_ids) { $task_ids = array_unique(array_filter(array_merge($task_ids, $task_id))); } elseif ($task_id) { $task_ids = $task_id; } } $map['task_id'] = ['in', $task_ids]; } $data = array(); foreach ($newList as $key => $value) { $data[$key]['class_id'] = $value['id']; $data[$key]['class_name'] = $value['realname']; $map['status'] = $map['status'] ?: ['in', ['1', '5']]; $map['ishidden'] = 0; $map['work_id'] = $request['work_id']; $map['main_user_id'] = $value['id']; $map['pid'] = 0; $map['is_archive'] = 0; $taskList = []; $resTaskList = $this->getTaskList($map); $data[$key]['count'] = $resTaskList['count']; $data[$key]['list'] = $resTaskList['list']; } return $data; } /** * 根据任务ID 获取操作记录 * @return * @author yykun */ public function getTaskLogList($param) { $list = Db::name('WorkTaskLog')->alias('l') ->join('AdminUser u', 'u.id = l.user_id', 'LEFT') ->field('l.*,u.realname,u.thumb_img') ->where('l.task_id =' . $param['task_id']) ->order('l.log_id desc') ->select(); foreach ($list as $key => $value) { $list[$key]['thumb_img'] = $value['thumb_img'] ? getFullPath($value['thumb_img']) : ''; $list[$key]['create_time'] = !empty($value['create_time']) ? date('Y-m-d H:i:s', $value['create_time']) : null; } return $list ?: []; } /** * 根据主键获取详情 * @return * @author yykun */ public function getDataById($id = '', $userInfo) { //读取参与人 $userModel = new UserModel(); $structModel = new StructureModel(); $recordModel = new \app\admin\model\Record(); $taskInfo = $this->where(['task_id' => $id])->find(); if (!$taskInfo) { $this->error = '任务不存在或已删除'; return false; } # 日期格式 $taskInfo['start_time'] = !empty($taskInfo['start_time']) ? date('Y-m-d', $taskInfo['start_time']) : null; $taskInfo['stop_time'] = !empty($taskInfo['stop_time']) ? date('Y-m-d', $taskInfo['stop_time']) : null; $taskInfo['hidden_time'] = !empty($taskInfo['hidden_time']) ? date('Y-m-d H:i:s', $taskInfo['hidden_time']) : null; $userlist = $userModel->getDataByStr($taskInfo['owner_user_id']); $taskInfo['owner_list'] = $userlist ?: array(); $workInfo = Db::name('Work')->where(['work_id' => $taskInfo['work_id']])->find(); $taskInfo['work_name'] = $workInfo['name'] ?: ''; //读取部门 $structList = $structModel->getDataByStr($taskInfo['structure_ids']); $taskInfo['struct_list'] = $structList ?: array(); //负责人 $mainData = []; if ($taskInfo['main_user_id']) { $mainData = $userModel->getDataById($taskInfo['main_user_id']); } $taskInfo['main_user_name'] = !empty($mainData['realname']) ? $mainData['realname'] : ''; $taskInfo['main_user_img'] = !empty($mainData['thumb_img']) ? $mainData['thumb_img'] : ''; $taskInfo['main_user'] = [ 'id' => !empty($taskInfo['main_user_id']) ? $taskInfo['main_user_id'] : 0, 'realname' => $taskInfo['main_user_name'], 'img' => $taskInfo['main_user_img'] ]; $lablelist = []; if ($taskInfo['lable_id']) { $lableModel = new \app\work\model\WorkLable(); $lablelist = $lableModel->getDataByStr($taskInfo['lable_id']); } $taskInfo['lable_list'] = $lablelist ?: array(); $commonmodel = new \app\admin\model\Comment(); $param['type_id'] = $taskInfo['task_id']; $param['type'] = 'task'; $taskInfo['replyList'] = $commonmodel->read($param); $subTaskList = $this->alias('t') ->join('AdminUser u', 'u.id = t.main_user_id', 'LEFT') ->field('t.task_id,t.pid,t.name,t.main_user_id,t.stop_time,t.status,t.class_id,u.id as main_user_id,u.realname,u.thumb_img') ->where(' t.ishidden = 0 and ( t.status=1 or t.status=5 ) and t.pid =' . $id) ->select(); $complete = 0; foreach ($subTaskList as $key => $value) { $subTaskList[$key]['thumb_img'] = $value['thumb_img'] ? getFullPath($value['thumb_img']) : ''; $subTaskList[$key]['stop_time'] = !empty($value['stop_time']) ? date('Y-m-d', $value['stop_time']) : null; if ($value['status'] == 5) ++$complete; } # 子任务 $taskInfo['subTaskList'] = $subTaskList; # 子任务完成总数 $taskInfo['subTaskComplete'] = $complete; # 附件 $taskInfo['fileList'] = $this->getTaskFile($id); //相关业务 $relationArr = $recordModel->getListByRelationId('task', $id); $taskInfo['businessList'] = $relationArr['businessList']; $taskInfo['contactsList'] = $relationArr['contactsList']; $taskInfo['contractList'] = $relationArr['contractList']; $taskInfo['customerList'] = $relationArr['customerList']; if (!strripos($taskInfo['create_time'], '-')) { $taskInfo['create_time'] = date('Y-m-d H:i:s', $taskInfo['create_time']); } if (!strripos($taskInfo['update_time'], '-')) { $taskInfo['update_time'] = date('Y-m-d H:i:s', $taskInfo['update_time']); } $taskInfo['start_time'] = !empty($taskInfo['start_time']) ? $taskInfo['start_time'] : null; $taskInfo['stop_time'] = !empty($taskInfo['stop_time']) ? $taskInfo['stop_time'] : null; $taskInfo['archive_time'] = !empty($taskInfo['archive_time']) ? date('Y-m-d H:i:s', $taskInfo['archive_time']) : null; $createUserInfo = $userModel->getDataById($taskInfo['create_user_id']); $createUserInfo['thumb_img'] = $createUserInfo['thumb_img'] ? getFullPath($createUserInfo['thumb_img']) : ''; $taskInfo['create_user_info'] = $createUserInfo; return $taskInfo; } /** * 获取任务附件列表 * * @param $taskId * @return bool|\PDOStatement|string|\think\Collection * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ private function getTaskFile($taskId) { # 查询文件IDS $fileIds = Db::name('work_task_file')->where('task_id', $taskId)->column('file_id'); # 查询附件 $list = Db::name('admin_file')->whereIn('file_id', $fileIds)->select(); foreach ($list as $key => $value) { $list[$key]['size'] = format_bytes($value['size']); //字节转换 $list[$key]['create_time'] = date('Y-m-d H:i:s', $value['create_time']); $list[$key]['ext'] = getExtension($value['save_name']); $list[$key]['file_path'] = getFullPath($value['file_path']); $list[$key]['file_path_thumb'] = getFullPath($value['file_path_thumb']); } return $list; } /** * 创建任务 * @return * @author yykun */ public function createTask($param) { # 子任务 $subtask = !empty($param['subtask']) ? $param['subtask'] : []; unset($param['subtask']); # 附件 $files = !empty($param['files']) ? $param['files'] : ''; unset($param['files']); $param['status'] = 1; $rdata = []; $rdata['customer_ids'] = !empty($param['customer_ids']) ? arrayToString($param['customer_ids']) : ''; $rdata['contacts_ids'] = !empty($param['contacts_ids']) ? arrayToString($param['contacts_ids']) : ''; $rdata['business_ids'] = !empty($param['business_ids']) ? arrayToString($param['business_ids']) : ''; $rdata['contract_ids'] = !empty($param['contract_ids']) ? arrayToString($param['contract_ids']) : ''; $arr = ['customer_ids', 'contacts_ids', 'business_ids', 'contract_ids']; foreach ($arr as $value) { unset($param[$value]); } $main_user_id = $param['main_user_id'] ?: $param['create_user_id']; $param['owner_user_id'] = ','.$main_user_id.','; //参与人 $param['main_user_id'] = $main_user_id; //负责人 $param['start_time'] = !empty($param['start_time']) ? strtotime($param['start_time']) : 0; $param['stop_time'] = !empty($param['stop_time']) ? strtotime($param['stop_time']) : 0; if (!empty($param['stop_time']) && $param['start_time'] > $param['stop_time']) { $this->error = '截止时间不能在开始时间之前'; return false; } if ((!empty($param['start_time']) || !empty($param['stop_time'])) && $param['start_time'] == $param['stop_time']) { $param['stop_time'] = $param['start_time'] + 86399; } $this->data($param)->allowField(true)->save(); $task_id = $this->task_id; if ($task_id) { $rdata['status'] = 1; $rdata['create_time'] = time(); $rdata['task_id'] = $task_id; Db::name('TaskRelation')->insert($rdata); if (!$param['pid']) { $taskLog = new LogModel(); $datalog['name'] = $param['name']; $datalog['user_id'] = $param['create_user_id']; $datalog['task_id'] = $task_id; $datalog['work_id'] = $param['work_id'] ?: ''; $ret = $taskLog->newTaskLog($datalog); //操作日志 // actionLog($task_id, '', '', '新建了任务'); //抄送站内信 (new Message())->send( Message::TASK_ALLOCATION, [ 'title' => $param['name'], 'action_id' => $task_id ], stringToArray($param['owner_user_id']) ); } # 添加活动记录 if (!empty($rdata['customer_ids']) || !empty($rdata['contacts_ids']) || !empty($rdata['business_ids']) || !empty($rdata['contract_ids'])) { Db::name('crm_activity')->insert([ 'type' => 2, 'activity_type' => 11, 'activity_type_id' => $task_id, 'content' => $param['name'], 'create_user_id' => $param['create_user_id'], 'update_time' => time(), 'create_time' => time(), 'customer_ids' => !empty($rdata['customer_ids']) ? $rdata['customer_ids'] : '', 'contacts_ids' => !empty($rdata['contacts_ids']) ? $rdata['contacts_ids'] : '', 'business_ids' => !empty($rdata['business_ids']) ? $rdata['business_ids'] : '', 'contract_ids' => !empty($rdata['contract_ids']) ? $rdata['contract_ids'] : '' ]); } # 添加附件 if (!empty($files)) { $fileData = []; foreach ($files as $key => $value) { $fileData[] = ['file_id' => $value, 'task_id' => $task_id]; } db('work_task_file')->insertAll($fileData); } $user=new ApiCommon(); $userInfo=$user->userInfo; # 添加子任务 if (!empty($subtask)) { $subtaskData = []; foreach ($subtask as $key => $value) { $stopTime = !empty($value['stop_time']) ? strtotime($value['stop_time']) : 0; $ownerUserId = !empty($value['owner_user_id']) ? $value['owner_user_id'] : $param['create_user_id']; $subtaskData[] = [ 'name' => $value['name'], 'create_user_id' => $param['create_user_id'], 'main_user_id' => $ownerUserId, 'owner_user_id' => $ownerUserId, 'create_time' => time(), 'update_time' => time(), 'pid' => $task_id, 'start_time' => 0, 'stop_time' => $stopTime ]; } Db::name('task')->insertAll($subtaskData); foreach ($subtaskData as $v){ RecordActionLog($userInfo['id'],'work_task','save',$param['name'],'','','新增了子任务'.$v['name']); } } if(!empty($param['pid'])){ $dataInfo=Db::name('task')->where('task_id',$param['pid'])->find(); RecordActionLog($userInfo['id'],'work_task','save',$dataInfo['name'],'','','新增了子任务'.$param['name']); }else{ RecordActionLog($userInfo['id'],'work_task','save',$param['name'],'','','新增任务'.$param['name']); } return $task_id; } else { $this->error = '添加失败'; return false; } } /** * 编辑任务 * * @param $param * @return bool * @throws \think\Exception * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException * @throws \think\exception\PDOException */ public function updateDetTask($param) { $LogModel = new LogModel(); $userModel = new UserModel(); $lableModel = new lableModel(); $StructureModel = new StructureModel(); $createUserId = $param['create_user_id']; $type = $param['type'] ?: ''; if (!$param['task_id']) { $this->error = '参数错误!'; return false; } //关联业务 if (isset($param['customer_ids']) && !empty($param['customer_ids'])) $rdata['customer_ids'] = arrayToString($param['customer_ids']); if (isset($param['contacts_ids']) && !empty($param['contacts_ids'])) $rdata['contacts_ids'] = arrayToString($param['contacts_ids']); if (isset($param['business_ids']) && !empty($param['business_ids'])) $rdata['business_ids'] = arrayToString($param['business_ids']); if (isset($param['contract_ids']) && !empty($param['contract_ids'])) $rdata['contract_ids'] = arrayToString($param['contract_ids']); $rdata['task_id'] = $param['task_id']; $arr = ['customer_ids', 'contacts_ids', 'business_ids', 'contract_ids']; foreach ($arr as $value) { unset($param[$value]); } # 调整时间参数格式 if (!empty($param['stop_time'])) $param['stop_time'] = strtotime($param['stop_time']); if (!empty($param['start_time'])) $param['start_time'] = strtotime($param['start_time']); if (empty($param['stop_time']) && $param['stop_time'] === null) unset($param['stop_time']); if (empty($param['start_time']) && $param['start_time'] === null) unset($param['start_time']); $data = array(); $taskInfo = $this->get($param['task_id']); $taskInfo = json_decode(json_encode($taskInfo), true); $data['type'] = $param['type']; $data['before'] = $taskInfo[$param['type']] ? $taskInfo[$param['type']] : '空'; $target_name=$taskInfo['name']; switch ($type) { case 'name' : $data['after'] = $param['name']; $name='任务名称'; $count_name=$param['name']; break; case 'stop_time' : if ($param['stop_time']) { $data['after'] = date("Y-m-d", $param['stop_time']); } else { $data['after'] = '无'; } $name='结束时间'; $count_name=$data['after']; break; case 'start_time' : if (!empty($param['start_time'])) { $data['after'] = date("Y-m-d", $param['stop_time']); } else { $data['after'] = '无'; } $count_name=$data['after']; $name='开始时间'; break; case 'class_id' : //类型修改 $classModel = model('WorkClass'); $taskInfo = $classModel->getDataById($param['class_id']); $data['after'] = $taskInfo['name']; $name='类型'; break; case 'lable_id_add' : //标签添加 $oldLabel = !empty($taskInfo['lable_id']) ? $lableModel->getNameByIds(stringToArray($taskInfo['lable_id'])) : []; $lable = $lableModel->getNameByIds($param['lable_id_add']); if ($taskInfo['lable_id'] && $param['lable_id_add']) { $param['lable_id_add'] = array_unique(array_merge(stringToArray($taskInfo['lable_id']), $param['lable_id_add'])); } $param['lable_id'] = arrayToString($param['lable_id_add']); $addLabel = !empty($lable) ? array_diff($lable, $oldLabel) : ''; $data['after'] = !empty($addLabel) ? implode(',', $addLabel) : ''; unset($param['lable_id_add']); $count_name=$data['after']; $name='标签'; break; case 'lable_id_del' : //标签删除 $lable = $lableModel->getNameByIds($param['lable_id_del']); if ($param['lable_id_del']) { $lable_id = array_unique(array_diff(stringToArray($taskInfo['lable_id']), $param['lable_id_del'])); $param['lable_id'] = arrayToString($lable_id); } else { $param['lable_id'] = $taskInfo['lable_id']; } $data['after'] = $lable ? implode(',', $lable) : ''; unset($param['lable_id_del']); $count_name=$data['after']; $name='删除标签'; break; case 'structure_id_del' : //删除参与部门 $structuredet = $StructureModel->getDataById($param['structure_id']); $param['structure_ids'] = str_replace(',' . $param['structure_id_del'] . ',', ',', $taskInfo['structure_ids']); //删除 $data['after'] = $structuredet['name']; unset($param['structure_id_del']); $count_name=$data['after']; $name='删除参与部门'; break; case 'structure_id_add' : //添加参与部门 $structuredet = $StructureModel->getDataById($param['owner_userid_add']); if ($taskInfo['structure_ids']) { $param['structure_ids'] = $taskInfo['structure_ids'] . $param['structure_id_add'] . ','; //追加 } else { $param['structure_ids'] = ',' . $param['structure_id_add'] . ','; //首次添加 } $data['after'] = $structuredet['name']; unset($param['structure_id_add']); $count_name=$data['after']; $name='参与部门'; break; case 'owner_userid_del' : //删除参与成员 $userdet = $userModel->getDataById($param['owner_userid_del']); $param['owner_user_id'] = str_replace(',' . $param['owner_userid_del'] . ',', ',', $taskInfo['owner_user_id']); //删除 $data['after'] = $userdet['realname']; unset($param['owner_userid_del']); $count_name=$data['after']; $name='删除参与成员'; break; case 'owner_userid_add' : //添加参与成员 $userdet = $userModel->getDataById($param['owner_userid_add']); if ($taskInfo['owner_user_id']) { $param['owner_user_id'] = $taskInfo['owner_user_id'] . $param['owner_userid_add'] . ','; //追加 } else { $param['owner_user_id'] = ',' . $param['owner_userid_add'] . ','; //首次添加 } $data['after'] = $userdet['realname']; unset($param['owner_userid_add']); $count_name=$data['after']; $name='参与成员'; break; case 'main_user_id' : //设置负责人 $userdet = $userModel->getDataById($param['main_user_id']); $data['after'] = '设定' . $userdet['realname'] . '为主要负责人!'; (new Message())->send( Message::TASK_ALLOCATION, [ 'title' => $taskInfo['name'], 'action_id' => $param['task_id'] ], $param['main_user_id'] ); $count_name=$userdet['realname']; $name='负责人'; break; } $param['update_time'] = time(); $data['work_id'] = $param['work_id']; $data['task_id'] = $param['task_id']; $data['user_id'] = $param['create_user_id']; unset($param['type']); unset($param['create_user_id']); $flag = $this->where(['task_id' => $param['task_id']])->update($param); if ($flag || count($rdata)) { if ($param['owner_user_id']) { $this->where(['task_id' => $param['task_id']])->setField('owner_user_id', $param['owner_user_id']); } if (!$param['pid']) { $LogModel = new LogModel(); $taskInfo = $LogModel->taskLogAdd($data); // actionLog($param['task_id'], $param['owner_user_id'], $param['structure_ids'], '修改了任务'); $user=new ApiCommon(); $userInfo=$user->userInfo; if(empty($name)){ if(!empty($param['description'])){ $name='描述'; } } $count_name=empty($count_name)?$target_name:$count_name; RecordActionLog($userInfo['id'], 'work_task', 'update',$target_name, '','','修改任务'.$name.':'.$count_name); $resRelation = Db::name('TaskRelation')->where(['task_id' => $param['task_id']])->find(); if ($resRelation) { Db::name('TaskRelation')->where(['task_id' => $param['task_id']])->update($rdata); //更新关联关系 } else { $rdata['create_time'] = time(); $rdata['status'] = 1; Db::name('TaskRelation')->insert($rdata); //更新关联关系 } } # 删除活动记录 Db::name('crm_activity')->where(['activity_type' => 11, 'activity_type_id' => $param['task_id']])->delete(); # 添加活动记录 if (!empty($rdata['customer_ids']) || !empty($rdata['contacts_ids']) || !empty($rdata['business_ids']) || !empty($rdata['contract_ids'])) { Db::name('crm_activity')->insert([ 'type' => 2, 'activity_type' => 11, 'activity_type_id' => $param['task_id'], 'content' => $param['name'], 'create_user_id' => $createUserId, 'update_time' => time(), 'create_time' => time(), 'customer_ids' => !empty($rdata['customer_ids']) ? $rdata['customer_ids'] : '', 'contacts_ids' => !empty($rdata['contacts_ids']) ? $rdata['contacts_ids'] : '', 'business_ids' => !empty($rdata['business_ids']) ? $rdata['business_ids'] : '', 'contract_ids' => !empty($rdata['contract_ids']) ? $rdata['contract_ids'] : '' ]); } return true; } else { $this->error = '操作失败'; return false; } } //根据IDs获取数组 public function getDataByStr($idstr) { $idArr = stringToArray($idstr); if (!$idArr) { return []; } $list = db('work_task_lable')->where(['lable_id' => ['in', $idArr]])->select(); return $list; } /** * 任务统计不同状态 * @param * @return * @author yykun */ public function getCount($status = 0) { $map = array(); if ($status > 0) { $map['status'] = $status; } $count = $this->where($map)->count(); return $count ?: 0; } /** * 获取某一月份任务列表 * @param * @return * @author yykun */ public function getDateList($param) { $start_time = $param['start_time']; $stop_time = $param['stop_time']; $user_id = $param['user_id']; // $date_list = dateList($start_time, $stop_time, 1); $where = []; $where['ishidden'] = 0; $where['is_archive'] = 0; $where['status'] = 1; $where['pid'] = 0; $str = ',' . $user_id . ','; $whereStr = ' ( create_user_id = ' . $user_id . ' or ( owner_user_id like "%' . $str . '%") or ( main_user_id = ' . $user_id . ' ) )'; $whereDate = '( stop_time > 0 and stop_time between ' . $start_time . ' and ' . $stop_time . ' ) or ( update_time between ' . $start_time . ' and ' . $stop_time . ' )'; $list = db('task') ->where($where) ->where($whereStr) ->where($whereDate) ->field('task_id,name,priority,start_time,stop_time,priority,update_time') ->select(); return $list ?: []; } /** * 删除任务 * @param * @return * @author yykun */ public function delTaskById($param) { if (!$param['task_id']) { $this->error = '参数错误'; return false; } $taskInfo = $this->get($param['task_id']); if (!$taskInfo) { $this->error = '数据不存在或已删除'; return false; } $map['task_id'] = $param['task_id']; $temp['ishidden'] = 1; $temp['hidden_time'] = time(); $flag = $this->where($map)->update($temp); if ($flag) { # 删除任务的活动记录 db('crm_activity')->where(['type' => 2, 'activity_type' => 11, 'activity_type_id' => $param['task_id']])->delete(); return true; } else { $this->error = '删除失败'; return false; } } /** * 归档任务 * @param * @return * @author yykun */ public function archiveData($param) { $data['is_archive'] = 1; $data['archive_time'] = time(); $dataInfo=$this->get($param['task_id']); $dataInfo = json_decode(json_encode($dataInfo), true); $flag = $this->where(['task_id' => $param['task_id']])->update($data); if ($flag) { //添加归档日志 // actionLog($param['task_id'], '', '', '归档了任务'); $user=new ApiCommon(); $userInfo=$user->userInfo; RecordActionLog($userInfo['id'], 'work_task', 'archiveData',$dataInfo['name'], '','','归档了任务:'.$dataInfo['name']); return true; } else { $this->error = '归档失败'; return false; } } /** * 归档任务恢复 * @param * @return * @author yykun */ public function recover($param) { $dataInfo=$this->get($param['task_id']); $dataInfo = json_decode(json_encode($dataInfo), true); $flag = $this->where(['task_id' => $param['task_id']])->setField('is_archive', 0); if ($flag) { //添加日志 $user=new ApiCommon(); $userInfo=$user->userInfo; RecordActionLog($userInfo['id'], 'work_task', 'recover',$dataInfo['name'], '','','归档了任务:'.$dataInfo['name']); return true; } else { $this->error = '操作失败'; return false; } } /** * 任务权限判断 * @param * @return * @author Michael_xu */ public function checkTask($task_id, $userInfo) { $userModel = new \app\admin\model\User(); $taskInfo = $this->get($task_id); if (!$taskInfo) { $this->error = '该任务不存在或已删除'; return false; } $user_id = $userInfo['id']; $structure_id = $userInfo['structure_id']; $adminTypes = adminGroupTypes($user_id); if (in_array(1, $adminTypes) || in_array(7, $adminTypes)) { return true; } if (($taskInfo['create_user_id'] == $user_id) || ($taskInfo['main_user_id'] == $user_id) || in_array($user_id, stringToArray($taskInfo['owner_user_id'])) || in_array($structure_id, stringToArray($taskInfo['structure_ids']))) { return true; } $workInfo = db('work')->where(['work_id' => $taskInfo['work_id']])->find(); if ($taskInfo['is_open'] == 1) { return true; } else { //私有项目(只有项目成员可以查看) $workUser = db('work_user')->where(['work_id' => $taskInfo['work_id']])->column('user_id'); if ($workUser && in_array($user_id, $workUser)) { return true; } return false; } } /** * 查看关联个数 * @param * @return * @author yykun */ public function getRelationCount($task_id) { $relationInfo = Db::name('TaskRelation')->where(['task_id' => $task_id])->find(); $count = 0; if ($relationInfo) { $count1 = count(stringToArray($relationInfo['customer_ids'])); $count2 = count(stringToArray($relationInfo['contacts_ids'])); $count3 = count(stringToArray($relationInfo['business_ids'])); $count4 = count(stringToArray($relationInfo['contract_ids'])); $count = $count1 + $count2 + $count3 + $count4; } return $count; } /** * 任务列表 * * @param $request * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function getTaskList($request) { $search = $request['search']?:''; $whereStr = $request['whereStr'] ?: []; $lable_id = $request['lable_id'] ?: ''; $main_user_id = $request['main_user_id'] ?: ''; $taskSearch = !empty($request['taskSearch']) ? $request['taskSearch'] : ''; $isArchive = !empty($request['is_archive']) ? $request['is_archive'] : 0; unset($request['search']); unset($request['whereStr']); unset($request['lable_id']); unset($request['main_user_id']); $request = $this->fmtRequest($request); $requestMap = $request['map'] ?: []; $userModel = new \app\admin\model\User(); $lableModel = new \app\work\model\WorkLable(); $map = $requestMap; $map['ishidden'] = $requestMap['ishidden'] ?: 0; $map = where_arr($map, 'work', 'task', 'index'); if ($search) { //普通筛选 $map['task.name'] = ['like', '%' . $search . '%']; } if ($lable_id) { $map['task.lable_id'] = array('like', '%' . $lable_id . '%'); } $dataCount = db('task')->alias('task')->where($map)->where($whereStr)->where($taskSearch)->count(); $taskList = []; $logWhere=''; if ($main_user_id) { foreach ($main_user_id as $key => $value) { $logWhere.= '( task.owner_user_id like "%,' . $value . ',%") OR '; } if (!empty($logWhere)) $logWhere = '(' . rtrim($logWhere, 'OR ') . ')'; } if ($dataCount) { $taskList = db('task') ->alias('task') ->join('AdminUser u', 'u.id = task.main_user_id', 'LEFT') ->join('Work w', 'w.work_id = task.work_id', 'LEFT') ->field('task.task_id,task.name,task.main_user_id,task.is_top,task.work_id,task.lable_id,task.priority,task.stop_time,task.status,task.pid,task.create_time,task.owner_user_id,u.realname as main_user_name,u.thumb_img,w.name as work_name,color') ->where($map) ->where($whereStr) ->where($logWhere) ->where($taskSearch) ->order('task.status asc,task.order_id asc') ->select(); foreach ($taskList as $key => $value) { if ($value['pid'] > 0) { $p_det = $this->field('task_id,name')->where(['task_id' => $value['pid']])->find(); $taskList[$key]['pname'] = $p_det['name']; } else { $taskList[$key]['pname'] = ''; } $taskList[$key]['thumb_img'] = $value['thumb_img'] ? getFullPath($value['thumb_img']) : ''; $subcount = $this->where(['ishidden' => 0, 'status' => 1, 'pid' => $value['task_id']])->count(); $subdonecount = $this->where(['ishidden' => 0, 'status' => 5, 'pid' => $value['task_id']])->count(); $taskList[$key]['subcount'] = $subcount; //子任务 $taskList[$key]['subdonecount'] = $subdonecount; //已完成子任务 $taskList[$key]['commentcount'] = Db::name('AdminComment')->where(['type' => 'task', 'type_id' => $value['task_id']])->count(); //评论 $taskList[$key]['filecount'] = Db::name('WorkTaskFile')->where(['task_id' => $value['task_id']])->count(); $lableList = []; if ($value['lable_id']) { $lableList = $lableModel->getDataByStr($value['lable_id']); $taskList[$key]['lableList'] = $lableList ?: array(); } $taskList[$key]['lableList'] = $lableList ?: array(); //参与人 //负责人信息 $taskList[$key]['main_user'] = $value['main_user_id'] ? $userModel->getDataById($value['main_user_id']) : NULL; $taskList[$key]['relationCount'] = $this->getRelationCount($value['task_id']); $is_end = 0; if (!empty($value['stop_time']) && (strtotime(date('Ymd')) + 86399 > $value['stop_time'])) $is_end = 1; $taskList[$key]['is_end'] = $is_end; $taskList[$key]['checked'] = ($value['status'] == '5') ? true : false; $taskList[$key]['stop_time'] = !empty($value['stop_time']) ? date('Y-m-d H:i:s', $value['stop_time']) : null; $taskList[$key]['create_time'] = !empty($value['create_time']) ? date('Y-m-d H:i:s', $value['create_time']) : null; } } # 归档任务 if (!empty($isArchive)) { return $taskList; } $data = []; $data['count'] = $dataCount; $data['list'] = $taskList ?: []; return $data; } /** * 项目-控制台-任务列表(新) * * @param $request * @param $param * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function getProjectTaskList($request, $param) { # 排序 $order = $this->getSplicingSortParam($param); # 搜索 $whereStr = $request['whereStr'] ?: []; $taskSearch = !empty($request['taskSearch']) ? $request['taskSearch'] : ''; unset($request['whereStr']); unset($request['taskSearch']); $request = $this->fmtRequest($request); $requestMap = $request['map'] ?: []; $userModel = new \app\admin\model\User(); $lableModel = new \app\work\model\WorkLable(); $map = $requestMap; $map['ishidden'] = $requestMap['ishidden'] ?: 0; $map = where_arr($map, 'work', 'task', 'index'); # 成员 if (!empty($param['owner_user_id']) && is_array($param['owner_user_id'])) { $whereStr = ''; foreach ($param['owner_user_id'] as $key => $value) { $whereStr .= '( task.owner_user_id like "%,' . $value . ',%") OR '; } if (!empty($whereStr)) $whereStr = '(' . rtrim($whereStr, 'OR ') . ')'; } # 截止日期 $timeWhere = $this->getTimeParam($param['time_type']); # 标签 $labelWhere = ''; if (!empty($param['label_id']) && is_array($param['label_id'])) { foreach ($param['label_id'] as $key => $value) { $labelWhere .= '( task.lable_id like "%,' . $value . ',%") OR '; } if (!empty($labelWhere)) $labelWhere = '(' . rtrim($labelWhere, 'OR ') . ')'; } $dataCount = db('task')->alias('task')->where($map)->where($whereStr)->where($taskSearch)->where($timeWhere)->where($labelWhere)->count(); $taskList = []; if ($dataCount) { $taskList = db('task') ->alias('task') ->join('AdminUser u', 'u.id = task.main_user_id', 'LEFT') ->join('Work w', 'w.work_id = task.work_id', 'LEFT') ->field('task.task_id,task.name,task.main_user_id,task.is_top,task.work_id,task.lable_id,task.priority,task.stop_time,task.status,task.pid,task.create_time,task.owner_user_id,u.realname as main_user_name,u.thumb_img,w.name as work_name,color') ->where($map) ->where($whereStr) ->where($taskSearch) ->where($timeWhere) ->where($labelWhere) ->order($order) ->select(); foreach ($taskList as $key => $value) { if ($value['pid'] > 0) { $p_det = $this->field('task_id,name')->where(['task_id' => $value['pid']])->find(); $taskList[$key]['pname'] = $p_det['name']; } else { $taskList[$key]['pname'] = ''; } $taskList[$key]['thumb_img'] = $value['thumb_img'] ? getFullPath($value['thumb_img']) : ''; $subcount = $this->where(['ishidden' => 0, 'status' => 1, 'pid' => $value['task_id']])->count(); $subdonecount = $this->where(['ishidden' => 0, 'status' => 5, 'pid' => $value['task_id']])->count(); $taskList[$key]['subcount'] = $subcount; //子任务 $taskList[$key]['subdonecount'] = $subdonecount; //已完成子任务 $taskList[$key]['commentcount'] = Db::name('AdminComment')->where(['type' => 'task', 'type_id' => $value['task_id']])->count(); //评论 $taskList[$key]['filecount'] = Db::name('WorkTaskFile')->where(['task_id' => $value['task_id']])->count(); $lableList = []; if ($value['lable_id']) { $lableList = $lableModel->getDataByStr($value['lable_id']); $taskList[$key]['lableList'] = $lableList ?: array(); } $taskList[$key]['lableList'] = $lableList ?: array(); //参与人 //负责人信息 $taskList[$key]['main_user'] = $value['main_user_id'] ? $userModel->getDataById($value['main_user_id']) : NULL; $taskList[$key]['relationCount'] = $this->getRelationCount($value['task_id']); $is_end = 0; if (!empty($value['stop_time']) && (strtotime(date('Ymd')) + 86399 > $value['stop_time'])) $is_end = 1; $taskList[$key]['is_end'] = $is_end; $taskList[$key]['checked'] = ($value['status'] == '5') ? true : false; } } $data = []; $data['count'] = $dataCount; $data['list'] = $taskList ?: []; return $data; } /** * 获取截止日期参数 * @param $type * @return array|string */ private function getTimeParam($type) { $result = []; # 今天 if ($type == 1) { $result = '(task.stop_time >= ' . strtotime(date('Y-m-d 00:00:00')) . ' AND task.stop_time <= ' . strtotime(date('Y-m-d 23:59:59')) . ')'; } # 明天 if ($type == 2) { $tomorrow = date("Y-m-d 23:59:59", strtotime("+1 day")); $start = date("Y-m-d 00:00:00", strtotime("+1 day")); $result = '(task.stop_time >= ' . strtotime($start) . ' AND task.stop_time <= ' . strtotime($tomorrow) . ')'; } # 本周 if ($type == 3) { $week = mktime(23, 59, 59, date("m"), date("d") - date("w") + 7, date("Y")); $start_week=mktime(0, 0, 0, date('m'), date('d') - date('w') + 1, date('Y')); $result = '(task.stop_time >= ' . $start_week . ' AND task.stop_time <= ' . $week . ')'; } # 本月 if ($type == 4) { $timestamp = mktime(0, 0, 0, date('m'), 1, date('Y')); $month = mktime(23, 59, 59, date("m"), date("t"), date("Y")); $result = '(task.stop_time > ' . $timestamp . ' AND task.stop_time <= ' . $month . ')'; } # 未设置截止日期 if ($type == 5) { $result = '(task.stop_time = 0)';; } # 已延期 if ($type == 6) { $result = '(task.status = 2 OR task.stop_time < ' . time() . ')'.'AND task.stop_time <> 0 AND task.status = 1'; } # 今日更新 if ($type == 7) { $result = '(task.update_time >= ' . strtotime(date('Y-m-d 00:00:00')) . ' AND task.update_time <= ' . strtotime(date('Y-m-d 23:59:59')) . ')'; } return $result; } /** * 拼接排序参数 * * @param $param * @return string */ private function getSplicingSortParam($param) { $result = ''; # 排序字段映射 $sortFieldArray = [1 => 'top_order_id', 2 => 'create_time', 3 => 'stop_time', 4 => 'update_time', 5 => 'priority']; # 已完成任务默认排在最后 $completedTask = $param['completed_task']; # 排序方式:top_order_id按手动拖拽;create_time按最近创建;stop_time按最近截止;update_time按最近更新;priority按最高优先级; $sortField = !empty($param['sort_field']) ? $param['sort_field'] : 'task_id'; # 默认是升序 $sortValue = 'asc'; # 除按手动拖拽以外,全部是降序 if (in_array($sortField, [2, 3, 4, 5])) $sortValue = 'desc'; if (!empty($completedTask) && ($completedTask != 'false' || $completedTask != false)) $result = 'task.status asc, '; $result .= 'task.' . $sortFieldArray[$sortField] . ' ' . $sortValue; return $result; } }