| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627 |
- <?php
- // +----------------------------------------------------------------------
- // | Description: 项目管理
- // +----------------------------------------------------------------------
- // | Author: Michael_xu | gengxiaoxu@5kcrm.com
- // +----------------------------------------------------------------------
-
- namespace app\work\model;
-
- use think\Db;
- use app\admin\model\Common;
-
- class Work extends Common
- {
- /**
- * 为了数据库的整洁,同时又不影响Model和Controller的名称
- * 我们约定每个模块的数据表都加上相同的前缀,比如微信模块用weixin作为数据表前缀
- */
- protected $name = 'work';
- protected $createTime = 'create_time';
- protected $updateTime = 'update_time';
- protected $autoWriteTimestamp = true;
- protected $insert = ['status' => 1];
-
- /**
- * 列表
- *
- * @return bool|\PDOStatement|string|\think\Collection
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- public function getDataList()
- {
- $list = $this->where(['status' => 1])->field('work_id,name,status,create_time')->select();
- return $list ;
- }
-
- /**
- * 创建项目
- *
- * @param array $param
- * @return array|bool|float|int|mixed|object|\stdClass|null
- * @throws \think\exception\PDOException
- */
- public function createData($param)
- {
- $this->startTrans();
-
- try {
- # 设置项目参数
- if (!empty($param['is_open']) && $param['is_open'] == 1) {
- $ownerUserId = Db::name('admin_user')->where('status', 1)->column('id');
- } else {
- $ownerUserId = $param['owner_user_id'] ? : [];
- }
- $param['owner_user_id'] = $ownerUserId ? arrayToString($ownerUserId) : '';
- $param['status'] = 1;
- # 创建项目
- $this->data($param)->allowField(true)->save();
-
- # 设置项目下的任务参数
- $workId = $this->work_id;
- $createTime = time();
- $createUserId = $param['create_user_id'];
- $taskData = [
- ['name' => '要做', 'create_time' => $createTime, 'create_user_id' => $createUserId, 'status' => 1, 'work_id' => $workId, 'order_id' => 1],
- ['name' => '在做', 'create_time' => $createTime, 'create_user_id' => $createUserId, 'status' => 1, 'work_id' => $workId, 'order_id' => 2],
- ['name' => '待定', 'create_time' => $createTime, 'create_user_id' => $createUserId, 'status' => 1, 'work_id' => $workId, 'order_id' => 3]
- ];
- # 创建项目下的任务
- Db::name('work_task_class')->insertAll($taskData);
-
- # 设置项目下的相关成员参数
- $ownerData['work_id'] = $workId;
- $ownerData['create_user_id'] = $createUserId;
- $ownerData['owner_user_id'] = $ownerUserId;
- $ownerData['group_id'] = !empty($param['group_id']) ? $param['group_id'] : 0;
- # 创建项目下的相关成员
- $this->addOwner($ownerData);
-
- # 提交事务
- $this->commit();
-
- return $workId;
- } catch(\Exception $e) {
- # 回滚事务
- $this->rollback();
- # 错误原因
- $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 updateDataById($param)
- {
- $param['update_time'] = time();
- $userId = $param['user_id'];
- unset($param['user_id']);
- $map['work_id'] = $param['work_id'];
- $workInfo = $this->where(['work_id' => $param['work_id']])->find();
- # 公有改私有
- if (isset($param['is_open']) && empty($param['is_open']) && $workInfo['is_open'] == 1) {
- $ownerData = [];
- $ownerData['work_id'] = $param['work_id'];
- $ownerData['create_user_id'] = $workInfo['create_user_id'];
- $ownerData['owner_user_id'] = !empty($param['owner_user_id']) ? stringToArray($param['owner_user_id']) : stringToArray($workInfo['create_user_id']);
- $ownerData['is_open'] = $param['is_open'];
- $ownerData['group_id'] = 0;
- $this->addOwner($ownerData);
- }
- # 私有改公有
- if (isset($param['is_open']) && !empty($param['is_open']) && $workInfo['is_open'] == 0) {
- $ownerUserId = Db::name('admin_user')->where('status', 1)->column('id');
- $ownerData['work_id'] = $param['work_id'];
- $ownerData['create_user_id'] = $workInfo['create_user_id'];
- $ownerData['owner_user_id'] = $ownerUserId;
- $ownerData['is_open'] = $param['is_open'];
- $ownerData['group_id'] = $param['group_id'];
- $this->addOwner($ownerData);
- }
- # 公开项目更新时的权限变更
- if ($param['is_open'] == 1 && !empty($param['group_id']) && $param['group_id'] != $workInfo['group_id']) {
- db('work_user')->where(['work_id' => $workInfo['work_id'], 'user_id' => ['neq', $workInfo['create_user_id']]])->update(['group_id' => $param['group_id']]);
- }
- $resUpdata = $this->where($map)->update($param);
- if ($resUpdata) {
- $logmodel = model('WorkLog');
- $datalog['type'] = 2; //重命名项目
- $datalog['name'] = $param['name']; //项目名
- $datalog['create_user_id'] = $userId;
- $datalog['work_id'] = $param['work_id'];
- $datalog['user_id'] = $userId;
- $ret = $logmodel->workLogAdd($datalog);
- return true;
- } else {
- $this->error = '重命名失败';
- return false;
- }
- }
-
- /**
- * 删除项目
- * @author yykun
- * @param
- * @return
- */
- public function delWorkById($param)
- {
- $map['work_id'] = $param['work_id'];
- Db::name('Task')->where($map)->delete();
- Db::name('WorkTaskClass')->where($map)->delete();
- $flag = $this->where($map)->delete();
- if ($flag) {
- $logmodel = new \app\work\model\WorkLog();
- $datalog['status'] = 4; //删除项目
- $datalog['create_user_id'] = $param['create_user_id'];
- $datalog['work_id'] = $param['work_id'];
- $datalog['content'] = '删除了项目';
- $ret = $logmodel->workLogAdd($datalog);
- return true;
- } else {
- $this->error = '数据不存在或已被删除';
- return false;
- }
- }
-
- /**
- * 归档项目
- * @author yykun
- * @param
- * @return
- */
- public function archiveData($param)
- {
- $map['work_id'] = $param['work_id'];
- $flag = $this->where($map)->setField('status',0);
- $this->where($map)->setField('archive_time',time());
- if ($flag) {
- $data = [];
- $data['status'] = 3;
- $data['archive_time'] = time();
- Db::name('task')->where($map)->update($data);
- return true;
- } else {
- $this->error = '归档失败';
- return false;
- }
- }
-
- /**
- * 归档项目列表
- * @author yykun
- * @param
- * @return
- */
- public function archiveList($param)
- {
- $page = !empty($param['page']) ? $param['page'] : 1;
- $limit = !empty($param['limit']) ? $param['limit'] : 15;
- unset($param['page']);
- unset($param['limit']);
- //权限
- $map = $this->getWorkWhere($param);
- $where['status'] = 0;
- $where['ishidden'] = 0;
- $count = $this->where($map)->where($where)->field('work_id,name,color,archive_time')->count();
- $list = $this->where($map)->where($where)->field('work_id,name,color,archive_time')
- ->limit(($page - 1) * $limit, $limit)->select();
- foreach ($list AS $key => $value) {
- $list[$key]['archive_time'] = !empty($value['archive_time']) ? date('Y-m-d H:i:s', $value['archive_time']) : null;
- }
- return ['count' => $count, 'list' => $list];
- }
-
- /**
- * 归档恢复
- * @author yykun
- * @param
- * @return
- */
- public function arRecover($work_id='')
- {
- if (!$work_id) {
- $this->error = '参数错误';
- return false;
- }
- $map['work_id'] =$work_id;
- $map['status'] = 0;
- $this->where($map)->setField('status',1);
- $map['status'] = 3;
- Db::name('Task')->where($map)->setField('status',1);
- return true;
- }
-
- /**
- * 退出项目
- * @author yykun
- * @param 项目id,会员ID
- * @return
- */
- public function leaveById($work_id,$user_id)
- {
- $workInfo = $this->where(['work_id' => $work_id])->find();
- if ($user_id == $workInfo['create_user_id']) {
- $this->error = '项目创建人不可以退出';
- return false;
- }
- //从项目成员中移除
- db('work_user')->where(['work_id' => $work_id,'user_id' => $user_id])->delete();
- $str = ','.$user_id.',';
- if (in_array($user_id,stringToArray($workInfo['owner_user_id']))) {
- $owner_user_id = str_replace($str,',',$workInfo['owner_user_id']);
- $this->where(['work_id' => $work_id])->update(['owner_user_id' => $owner_user_id]);
- }
- $list = Db::name('Task')->where(['work_id' => $work_id])->select();
- foreach ($list as $key => $value) {
- $data = [];
- if (in_array($user_id,stringToArray($value['owner_user_id']))) {
- $new_own_user_id = str_replace($str,',',$value['owner_user_id']);
- $data['owner_user_id'] = $new_own_user_id;
- }
- if ($value['main_user_id'] == $param['create_user_id']) {
- $data['main_user_id'] = '';
- }
- if ($data) Db::name('Task')->where(['task_id' => $value['task_id']])->update($data);
- }
- return true;
- }
-
- /**
- * 添加项目成员
- *
- * @param $param
- * @return bool
- * @throws \think\Exception
- * @throws \think\exception\DbException
- * @throws \think\exception\PDOException
- */
- public function addOwner($param)
- {
- $workInfo = $this->get($param['work_id']);
- $oldOwner = stringToArray($workInfo['owner_user_id']);
- $owner_user = $newOwner = $param['owner_user_id'];
- # 更新项目表中的项目成员
- $this->where(['work_id' => $param['work_id']])->update(['owner_user_id' => arrayToString($newOwner)]);
- # 差集,需删除的
- $del_user_ids = array_diff($oldOwner, $newOwner);
- $create_user_id = !empty($param['create_user_id']) ? $param['create_user_id'] : '';
- unset($param['create_user_id']);
- $owner_user_arr = db('work_user')->where(['work_id' => $param['work_id']])->column('user_id');
- foreach ($owner_user as $k=>$v) {
- $data = [];
- if (in_array($v,$owner_user_arr)) continue;
- $data['work_id'] = $param['work_id'];
- $data['user_id'] = $v;
- $data['types'] = 0;
- if ($v == $create_user_id) {
- $data['types'] = 1;
- $group_id = 1;
- } else {
- # 默认角色
- $group_id = !empty($param['group_id']) ? $param['group_id'] : db('admin_group')->where(['pid' => 5, 'system' => 1])->order('id asc')->value('id');
- }
- $data['group_id'] = $group_id;
- $saveData[] = $data;
- }
- $res = true;
- if ($saveData && !db('work_user')->insertAll($saveData)) {
- $res = false;
- }
- if ($del_user_ids && !db('work_user')->where(['work_id' => $param['work_id'],'user_id' => ['in',$del_user_ids]])->delete()) {
- $res = false;
- }
- return $res;
- }
-
- /**
- * 删除项目成员
- * @author yykun
- * @param
- * @return
- */
- public function delOwner($param)
- {
- $work_id = $param['work_id'];
- $workUserInfo = db('work_user')->where(['work_id' => $work_id,'user_id' => $param['owner_user_id']])->find();
- if (!$workUserInfo) {
- $this->error = '数据不存在或已删除';
- return false;
- }
- if ($workUserInfo['types'] == 1) {
- $this->error = '项目负责人不能删除';
- return false;
- }
- $res = db('work_user')->where(['id' => $workUserInfo['id']])->delete();
-
- $owner_user_id[] = $param['owner_user_id'];
- $workInfo = $this->get($param['work_id']);
- $oldOwner = stringToArray($workInfo['owner_user_id']);
- $newOwner = array_diff($oldOwner,$owner_user_id);
- $resUpdate = $this->where(['work_id' => $work_id])->update(['owner_user_id' => arrayToString($newOwner)]);
- if (!$res || !$resUpdate){
- $this->error = '删除失败,请重试!';
- return false;
- }
- return true;
- }
-
- /**
- * 项目成员列表
- * @author yykun
- * @param
- * @return
- */
- public function ownerList($param)
- {
- if ($param['work_id']) {
- $workInfo = $this->get($param['work_id']);
- if ($workInfo['is_open'] == 1) {
- //公开项目
- $list = db('admin_user')->where(['status' => 1])->field('username,realname,thumb_img,id')->select();
- } else {
- // $exp = new \think\db\Expression('field(types,1,0,2)');
- $list = db('work_user')
- ->alias('work')
- ->join('__ADMIN_USER__ user', 'user.id = work.user_id', 'LEFT')
- ->where(['work.work_id' => $param['work_id']])
- ->field('work.*,user.username,user.realname,user.thumb_img')
- ->order('work.types desc,user.id asc')
- ->select();
- }
- } else {
- $list = db('admin_user')->where(['status' => 1])->field('username,realname,thumb_img,id')->select();
- }
- if ($list) {
- foreach ($list as $k=>$v) {
- $list[$k]['thumb_img'] = $v['thumb_img'] ? getFullPath($v['thumb_img']) : '';
- $list[$k]['id'] = $v['user_id'] ? : $v['id'];
- }
- }
- return $list ? : [];
- }
-
- /**
- * 项目权限判断(成员)
- * @author yykun
- * @param
- * @return
- */
- public function checkWork($work_id, $user_id)
- {
- $info = $this->get($work_id);
- if (!$info) {
- $this->error = '该项目不存在或已删除';
- return false;
- }
- //私有项目(成员可见)
- $map = function($query) use ($user_id){
- $query->whereOr(function ($query) use ($user_id) {
- $query->where(['is_open' => 0,'owner_user_id' => array('like','%,'.$user_id.',%')]);
- })
- ->whereOr(function ($query) use ($user_id) {
- $query->where(['is_open' => 1]);
- })
- ->whereOr(function ($query) use ($user_id) {
- $query->where(['create_user_id' => $user_id]);
- });
- };
- $resData = db('work')->where(['work_id' => $work_id])->where($map)->find();
- $userMap = function($query) {
- $query->where(['types' => 1])
- ->whereOr(['group_id' => 1]);
- };
- $adminUser = db('work_user')->where(['work_id' => $work_id])->where($userMap)->column('user_id');
- $adminTypes = adminGroupTypes($user_id);
- if (!$resData && !in_array(1,$adminTypes) && !in_array(7,$adminTypes) && !in_array($user_id,$adminUser)) {
- $this->error = '没有权限';
- return false;
- }
- return true;
- }
-
- /**
- * 判断项目操作权限
- *
- * @param $m
- * @param $c
- * @param $a
- * @param $work_id
- * @param $user_id
- * @return bool
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- public function isCheck($m, $c, $a, $work_id, $user_id)
- {
- if (!$work_id) return false;
- $adminTypes = adminGroupTypes($user_id);
- $workInfo = Db::name('Work')->where(['work_id' => $work_id])->find();
- if (in_array(1,$adminTypes) || in_array(7,$adminTypes)) {
- return true;
- }
- //创建人有管理权限
- if ($workInfo['create_user_id'] == $user_id) {
- return true;
- }
- if (empty($workInfo['is_open'])) {
- //私有项目
- $groupInfo = db('work_user')->where(['work_id' => $work_id,'user_id' => $user_id])->find();
- if ($groupInfo['types'] == 1 && $groupInfo['group_id'] == 1) {
- return true;
- }
- $checkParam = [];
- $checkParam['user_id'] = $user_id;
- $checkParam['group_id'] = $groupInfo['group_id'];
- if (checkWorkPerByAction($m, $c, $a, $checkParam)) {
- return true;
- }
- } else {
- if ($m == 'work' && $c == 'work' && $a == 'update') {
- return false;
- }
- return true;
- }
- return false;
- }
-
- /**
- * 获取项目权限范围
- * @author Michael_xu
- * @return
- */
- public function getWorkWhere($param)
- {
- $user_id = $param['user_id'];
- $adminTypes = adminGroupTypes($user_id);
- $map = [];
- if (!in_array(1,$adminTypes) && !in_array(7,$adminTypes)) {
- $map = function($query) use ($user_id){
- $query->whereOr(function ($query) use ($user_id) {
- $query->where(['is_open' => 0,'owner_user_id' => array('like','%,'.$user_id.',%')]);
- })
- ->whereOr(function ($query) use ($user_id) {
- $query->where(['is_open' => 1]);
- })
- ->whereOr(function ($query) use ($user_id) {
- $query->where(['create_user_id' => $user_id]);
- });
- };
- }
- return $map ? : [];
- }
-
- /**
- * 获取项目下权限信息
- * @author Michael_xu
- * @return
- */
- public function authList($param)
- {
- $user_id = $param['user_id'];
- $work_id = $param['work_id'];
- $ruleMap = [];
- $adminTypes = adminGroupTypes($user_id);
- $ruleMap['types'] = ['eq',3];
- $ruleMap['status'] = 1;
- if (!in_array(1,$adminTypes) && !in_array(7,$adminTypes)) {
- $workInfo = $this->get($work_id);
- if ($workInfo['is_open'] == 1) {
- //公开项目
- if ($workInfo['create_user_id'] !== $user_id) {
- $ruleMap['name'] = ['not in',['update']];
- }
- } else {
- //私有项目
- $groupInfo = db('work_user')->where(['work_id' => $work_id,'user_id' => $user_id])->find();
- if ($groupInfo['types'] !== 1 || $groupInfo['group_id'] !== 1) {
- $rule_ids = db('admin_group')->where(['id' => $groupInfo['group_id']])->value('rules');
- $ruleIds = stringToArray($rule_ids);
- if ($ruleIds) {
- $ruleMap['id'] = array('in', $ruleIds);
- } else {
- $ruleMap['id'] = ['eq',3];
- }
- }
- }
- }
- $newRuleIds = [];
- // 重新设置ruleIds,除去部分已删除或禁用的权限。
- $rules = Db::name('admin_rule')->where($ruleMap)->order('types asc')->select();
- foreach ($rules as $k => $v) {
- $newRuleIds[] = $v['id'];
- $rules[$k]['name'] = strtolower($v['name']);
- }
- $tree = new \com\Tree();
- $rulesList = $tree->list_to_tree($rules, 'id', 'pid', 'child', 0, true, array('pid'));
- //权限数组
- $authList = rulesListToArray($rulesList, $newRuleIds);
- return $authList ? : [];
- }
-
- /**
- * 任务列表统计
- * @author yykun
- * @return
- */
- public function classList($work_id)
- {
- $classList = Db::name('WorkTaskClass')->where(['status' => 1,'work_id' => $work_id])->order('order_id asc')->select();
- $taskarray = array();
- foreach ($classList as $k => $v) {
- $task_list = [];
- $task_list = db('task')->where(['work_id' => $work_id,'class_id' => $v['class_id'],'is_archive' => 0,'ishidden' => 0])->field('is_archive,status')->select();
- $allTask = 0;
- $undoneTask = 0;
- $doneTask = 0;
- foreach ($task_list as $kk => $vv) {
- $allTask += 1;
- if ($vv['status'] == 1) {
- $undoneTask += 1;
- continue;
- }
- if ($vv['status'] == 5) {
- $doneTask += 1;
- continue;
- }
- }
- $classList[$k]['allTask'] = $allTask ? : 0;
- $classList[$k]['undoneTask'] = $undoneTask ? : 0;
- $classList[$k]['doneTask'] = $doneTask ? : 0;
- }
- return $classList ? : [];
- }
-
- /**
- * 任务标签统计
- * @author yykun
- * @return
- */
- public function labelList($work_id,$labelIds = array())
- {
- if ($labelIds) {
- $labelList = [];
- $i = 0;
- foreach ($labelIds as $k => $v) {
- $labledet = [];
- $task_list = [];
- $labledet = Db::name('WorkTaskLable')->where(['lable_id' => $v])->find();
- $task_list = Db::name('Task')->where(['lable_id' => ['like','%,'.$v.',%'],'work_id' => $work_id,'is_archive' => 0,'ishidden' => 0])->field('status,task_id')->select();
- $allTask = 0;
- $undoneTask = 0;
- $doneTask = 0;
- foreach ($task_list as $kk => $vv) {
- if ($vv['status'] !== 3) $allTask += 1;
- if ($vv['status'] == 1) {
- $undoneTask += 1;
- continue;
- }
- if ($vv['status'] == 5) {
- $doneTask += 1;
- continue;
- }
- }
- $labelList[$i]['allTask'] = $allTask ? : 0;
- $labelList[$i]['undoneTask'] = $undoneTask ? : 0;
- $labelList[$i]['doneTask'] = $doneTask ? : 0;
- $labelList[$i]['lablename'] = $labledet['name'];
- $i++;
- }
- }
- return $labelList ? : [];
- }
- }
|