TaskLogic.php 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. <?php
  2. namespace app\oa\logic;
  3. use app\work\logic\WorkLogic;
  4. use app\work\model\Task as TaskModel;
  5. use app\work\model\Work as WorkModel;
  6. use app\work\model\WorkClass as classModel;
  7. use think\Db;
  8. class TaskLogic
  9. {
  10. public function getDataList($param)
  11. {
  12. $userModel = new \app\admin\model\User();
  13. $taskModel = new TaskModel();
  14. $recordModel = new \app\admin\model\Record();
  15. $str = ',' . $param['user_id'] . ',';
  16. //自定义时间
  17. $map['t.stop_time'] = $param['dueDate'] ? strtotime($param['dueDate'] . ' +1 month -1 day') : ['>=', 0];
  18. $search = $param['search'];
  19. if ($search) {
  20. $where['t.name'] = array('like', '%' . $search . '%');
  21. }
  22. $type = '';
  23. if (isset($param['type']) && $param['type']) {
  24. $type = $param['type'];
  25. }
  26. //状态
  27. $status = $param['status'] ?: '';
  28. if ($status) {
  29. $where['t.status'] = $status;
  30. } else {
  31. $where['t.status'] = [['=', 1], ['=', 5], 'OR'];
  32. }
  33. //项目id
  34. $priority = ($param['priority'] || $param['priority'] == '0') ? $param['priority'] : ['in', [0, 1, 2, 3]];
  35. $where['t.priority'] = $priority;
  36. if (!empty($param['work_id'])) {
  37. $where = [];
  38. $where['ishidden'] = 0;
  39. $where['pid'] = 0;
  40. $where['work_id'] = $param['work_id'];
  41. if (!empty($param['search'])) {
  42. $taskSearch = ' (task.name like "%' . $param['search'] . '%" OR task.description like "%' . $param['search'] . '%")';
  43. }
  44. # 成员
  45. if (!empty($param['owner_user_id']) && is_array($param['owner_user_id'])) {
  46. $whereStr = '';
  47. foreach ($param['owner_user_id'] as $key => $value) {
  48. $whereStr .= '( task.owner_user_id like "%,' . $value . ',%") OR ';
  49. }
  50. if (!empty($whereStr)) $whereStr = '(' . rtrim($whereStr, 'OR ') . ')';
  51. }
  52. # 截止日期
  53. $timeWhere = $this->getTimeParam($param['time_type']);
  54. # 标签
  55. $labelWhere = '';
  56. if (!empty($param['label_id']) && is_array($param['label_id'])) {
  57. foreach ($param['label_id'] as $key => $value) {
  58. $labelWhere .= '( task.lable_id like "%,' . $value . ',%") OR ';
  59. }
  60. if (!empty($labelWhere)) $labelWhere = '(' . rtrim($labelWhere, 'OR ') . ')';
  61. }
  62. if ($param['owner_user_id']) {
  63. foreach ($param['owner_user_id'] as $key => $value) {
  64. $logWhere.= '( task.owner_user_id like "%,' . $value . ',%") OR ';
  65. }
  66. if (!empty($logWhere)) $logWhere = '(' . rtrim($logWhere, 'OR ') . ')';
  67. }
  68. $taskList = db('task')
  69. ->alias('task')
  70. ->join('AdminUser u', 'u.id = task.main_user_id', 'LEFT')
  71. ->field('task.task_id,task.name as task_name,task.main_user_id,task.description,task.priority,task.stop_time,task.create_time,task.owner_user_id,
  72. task.start_time,task.create_user_id,u.realname as main_user_name,task.class_id,task.work_id,task.lable_id')
  73. ->where($where)
  74. ->where($timeWhere)
  75. ->where($labelWhere)
  76. ->where($whereStr)
  77. ->where($labelWhere)
  78. ->where($taskSearch)
  79. ->order('task.task_id desc')
  80. ->select();
  81. } else {
  82. if ($param['is_top'] > 0 ) {
  83. $where = [];
  84. $where['ishidden'] = 0;
  85. $where['pid'] = 0;
  86. if (!empty($this->param['search'])) {
  87. $taskSearch = ' (task.name like "%' . $this->param['search'] . '%" OR task.description like "%' . $this->param['search'] . '%")';
  88. }
  89. # 成员
  90. if (!empty($param['owner_user_id']) && is_array($param['owner_user_id'])) {
  91. $whereStr = '';
  92. foreach ($param['owner_user_id'] as $key => $value) {
  93. $whereStr .= '( task.owner_user_id like "%,' . $value . ',%") OR ';
  94. }
  95. if (!empty($whereStr)) $whereStr = '(' . rtrim($whereStr, 'OR ') . ')';
  96. }
  97. # 截止日期
  98. $timeWhere = $this->getTimeParam($param['time_type']);
  99. # 标签
  100. $labelWhere = '';
  101. if (!empty($param['label_id']) && is_array($param['label_id'])) {
  102. foreach ($param['label_id'] as $key => $value) {
  103. $labelWhere .= '( task.lable_id like "%,' . $value . ',%") OR ';
  104. }
  105. if (!empty($labelWhere)) $labelWhere = '(' . rtrim($labelWhere, 'OR ') . ')';
  106. }
  107. $taskList = db('task')
  108. ->alias('task')
  109. ->join('AdminUser u', 'u.id = task.main_user_id', 'LEFT')
  110. ->field('task.task_id,task.name as task_name,task.main_user_id,task.description,task.priority,task.stop_time,task.create_time,task.owner_user_id,
  111. task.start_time,task.create_user_id,u.realname as main_user_name,task.is_top')
  112. ->where($where)
  113. ->where($timeWhere)
  114. ->where($labelWhere)
  115. ->where($whereStr)
  116. ->where($taskSearch)
  117. ->where($labelWhere)
  118. ->order('task.task_id desc')
  119. ->select();
  120. } else {
  121. ///下属任务
  122. if ($param['mold'] == 1) {
  123. $subList = getSubUserId(false, 0);
  124. $subStr = $subList ? implode(',', $subList) : '-1';
  125. $subArr = [];
  126. foreach ($subList as $k => $v) {
  127. $subArr[] = $v;
  128. $subArr[] = '|';
  129. }
  130. $subValue = $subList ? arrayToString($subArr) : '';
  131. if ($type != 0) {
  132. switch ($type) {
  133. case '1' :
  134. $type = 't.main_user_id in (' . $subStr . ')';
  135. break; //下属负责的
  136. case '3' :
  137. //使用正则查询
  138. // SELECT * FROM 5kcrm_task WHERE owner_user_id REGEXP '(,1,|,2,|,3,)';
  139. $type = $subValue ? 't.owner_user_id REGEXP "(' . $subValue . ')"' : '';
  140. break; //下属参与的
  141. }
  142. } else {
  143. if (!$subValue) {
  144. $type = 't.is_open = 1 AND (t.main_user_id in (' . $subStr . ') or t.create_user_id in (' . $subStr . '))';
  145. } else {
  146. $type .= 't.is_open = 1 AND (t.main_user_id in (' . $subStr . ') or t.create_user_id in (' . $subStr . ') or t.owner_user_id REGEXP "(' . $subValue . ')")';
  147. }
  148. }
  149. $map['t.pid'] = 0;
  150. $map['t.ishidden'] = 0;
  151. $taskList = Db::name('Task')
  152. ->alias('t')
  153. ->join('AdminUser u', 'u.id = t.main_user_id', 'LEFT')
  154. ->field(
  155. 't.task_id,t.name as task_name,t.main_user_id,t.description,t.priority,t.stop_time,t.create_time,t.owner_user_id,t.start_time,t.create_user_id,u.realname as main_user_name'
  156. )
  157. ->where(function ($query) use ($type) {
  158. $query->where($type);
  159. })
  160. ->where($where)
  161. ->where($map)
  162. ->order('t.task_id desc')
  163. ->select();
  164. } else {
  165. $map['t.pid'] = 0;
  166. if ($type != 0) {
  167. switch ($type) {
  168. case '1' :
  169. $type = 't.main_user_id =' . $param['user_id'] . '';
  170. break; //我负责的
  171. case '3' :
  172. $type = 't.owner_user_id like "%,' . $param['user_id'] . ',%"';
  173. break; //我参与的
  174. }
  175. } else {
  176. $adminIds = $userModel->getAdminId();
  177. if (in_array($param['user_id'], $adminIds)) {
  178. $type = 't.is_open = 1';
  179. } else {
  180. $type = 't.is_open = 1 AND (t.main_user_id =' . $param['user_id'] . ' OR t.owner_user_id like "%,' . $param['user_id'] . ',%")';
  181. }
  182. }
  183. $where['t.ishidden'] = 0;
  184. $taskList = Db::name('Task')->alias('t')
  185. ->join('AdminUser u', 'u.id = t.main_user_id', 'LEFT')
  186. ->join('Work w', 'w.work_id = t.work_id', 'LEFT')
  187. ->field('t.task_id,t.name as task_name,t.main_user_id,t.description,t.create_user_id,t.is_top,t.work_id,t.lable_id,t.priority,t.update_time,t.start_time,t.stop_time,t.status,t.pid,t.create_time,t.owner_user_id,u.realname as main_user_name,u.thumb_img,w.name as work_name')
  188. ->where($where)
  189. ->where($type)
  190. ->where($map)
  191. ->order('t.task_id desc')
  192. ->select();
  193. }
  194. }
  195. }
  196. foreach ($taskList as $key => $value) {
  197. $taskList[$key]['work'] = '';
  198. if ($param['work_id'] != 0) {
  199. $work = db('work_task_class')->where('class_id', $value['class_id'])->find();
  200. $taskList[$key]['work'] = $work['name']?:'未分组';
  201. }
  202. if ($param['is_top'] != 0) {
  203. switch ($value['is_top']) {
  204. case 0:
  205. $taskList[$key]['top'] = '收件箱';
  206. break;
  207. case 1:
  208. $taskList[$key]['top'] = '今天要做';
  209. break;
  210. case 2:
  211. $taskList[$key]['top'] = '下一步要做';
  212. break;
  213. case 3:
  214. $taskList[$key]['top'] = '以后要做';
  215. break;
  216. }
  217. }
  218. //创建时间
  219. $taskList[$key]['create_time'] = $value['create_time'] ? date('Y-m-d H:i:s', $value['create_time']) : '';
  220. //开始时间
  221. $taskList[$key]['start_time'] = $value['start_time'] ? date('Y-m-d H:i:s', $value['start_time']) : '';
  222. //结束时间
  223. $taskList[$key]['stop_time'] = $value['stop_time'] ? date('Y-m-d H:i:s', $value['stop_time']) : '';
  224. //优先级
  225. switch ($value['priority']) {
  226. case 0:
  227. $taskList[$key]['priority'] = '无';
  228. break;
  229. case 1:
  230. $taskList[$key]['priority'] = '低';
  231. break;
  232. case 2:
  233. $taskList[$key]['priority'] = '中';
  234. break;
  235. case 3:
  236. $taskList[$key]['priority'] = '高';
  237. break;
  238. }
  239. $is_end = 0;
  240. $create_user = db('admin_user')->where('id', $value['create_user_id'])->find();
  241. $taskList[$key]['create_user_name'] = $create_user['realname'];
  242. $relationArr = $recordModel->getListByRelationId('task', $value['task_id']);
  243. $lableArr = $recordModel->getListByLableId('task', $value['task_id']);
  244. $taskList[$key]['owner_user_name'] = arrayToString(array_column($userModel->getListByStr($value['owner_user_id']), 'realname'));
  245. $taskList[$key]['owner_user_name'] = trim($taskList[$key]['owner_user_name'],',');
  246. $taskList[$key]['work_name'] = trim(arrayToString(array_column($lableArr['lable'], 'name')),','). ' ';
  247. $taskList[$key]['relation'] = trim(arrayToString(array_column($relationArr['businessList'], 'name')) . ' ' .
  248. arrayToString(array_column($relationArr['contactsList'], 'name')) . ' ' .
  249. arrayToString(array_column($relationArr['contractList'], 'name')) . ' ' .
  250. arrayToString(array_column($relationArr['customerList'], 'name')),',');
  251. }
  252. return $taskList;
  253. }
  254. /**
  255. * 任务导出
  256. * @param $param
  257. */
  258. public function excelExport($param)
  259. {
  260. $data = $this->getDataList($param);
  261. p($data);
  262. $excelModel = new \app\admin\model\Excel();
  263. if ($param['work_id'] != 0) {
  264. $file_name = 'work_task';
  265. $title = '项目任务信息';
  266. $field_list = [
  267. '0' => ['name' => '任务名称', 'field' => 'task_name'],
  268. '1' => ['name' => '任务描述', 'field' => 'description'],
  269. '2' => ['name' => '负责人', 'field' => 'main_user_name'],
  270. '3' => ['name' => '开始时间', 'field' => 'start_time'],
  271. '4' => ['name' => '结束时间', 'field' => 'stop_time'],
  272. '5' => ['name' => '标签', 'field' => 'work_name'],
  273. '6' => ['name' => '参与人', 'field' => 'owner_user_name'],
  274. '7' => ['name' => '优先级', 'field' => 'priority'],
  275. '8' => ['name' => '创建人', 'field' => 'create_user_name'],
  276. '9' => ['name' => '创建时间', 'field' => 'create_time'],
  277. '10' => ['name' => '所在任务列表', 'field' => 'work'],
  278. '11' => ['name' => '关联业务', 'field' => 'relation'],
  279. ];
  280. } elseif ($param['is_top'] != 0) {
  281. $file_name = 'oaTask';
  282. $title = '项目任务信息';
  283. $field_list = [
  284. '0' => ['name' => '任务名称', 'field' => 'task_name'],
  285. '1' => ['name' => '任务描述', 'field' => 'description'],
  286. '2' => ['name' => '负责人', 'field' => 'main_user_name'],
  287. '3' => ['name' => '开始时间', 'field' => 'start_time'],
  288. '4' => ['name' => '结束时间', 'field' => 'stop_time'],
  289. '5' => ['name' => '标签', 'field' => 'work_name'],
  290. '6' => ['name' => '参与人', 'field' => 'owner_user_name'],
  291. '7' => ['name' => '优先级', 'field' => 'priority'],
  292. '8' => ['name' => '创建人', 'field' => 'create_user_name'],
  293. '9' => ['name' => '创建时间', 'field' => 'create_time'],
  294. '10' => ['name' => '所在工作台', 'field' => 'top'],
  295. '11' => ['name' => '关联业务', 'field' => 'relation'],
  296. ];
  297. } else {
  298. $file_name = 'oa_task';
  299. $title = '办公任务信息';
  300. $field_list = [
  301. '0' => ['name' => '任务名称', 'field' => 'task_name'],
  302. '1' => ['name' => '任务描述', 'field' => 'description'],
  303. '2' => ['name' => '负责人', 'field' => 'main_user_name'],
  304. '3' => ['name' => '开始时间', 'field' => 'start_time'],
  305. '4' => ['name' => '结束时间', 'field' => 'stop_time'],
  306. '5' => ['name' => '标签', 'field' => 'work_name'],
  307. '6' => ['name' => '参与人', 'field' => 'owner_user_name'],
  308. '7' => ['name' => '优先级', 'field' => 'priority'],
  309. '8' => ['name' => '创建人', 'field' => 'create_user_name'],
  310. '9' => ['name' => '创建时间', 'field' => 'create_time'],
  311. '10' => ['name' => '关联业务', 'field' => 'relation'],
  312. ];
  313. }
  314. return $excelModel->taskExportCsv($file_name, $field_list, $title, $data);
  315. }
  316. public function where($param)
  317. {
  318. $taskModel = new TaskModel();
  319. $mep = [];
  320. //权限项目判断
  321. $workModel = new WorkModel();
  322. $userModel = new \app\admin\model\User();
  323. $work_id = $param['work_id'] ?: '';
  324. if ($param['main_user_id']) {
  325. $map['task.main_user_id'] = ['in', $param['main_user_id']];
  326. }
  327. //截止时间
  328. if ($param['stop_time_type']) {
  329. if ($param['stop_time_type'] == '5') { //没有截至日期
  330. $map['task.stop_time'] = '0';
  331. } elseif ($param['stop_time_type'] == '6') { //延期的
  332. $map['task.stop_time'] = ['between', [1, time()]];
  333. $map['task.status'] = 1;
  334. } elseif ($param['stop_time_type'] == '7') { //今日更新
  335. $timeAry = getTimeByType('today');
  336. $map['task.update_time'] = ['between', [$timeAry[0], $timeAry[1]]];
  337. } else {
  338. switch ($param['stop_time_type']) {
  339. case '1': //今天到期
  340. $timeAry = getTimeByType('today');
  341. break;
  342. case '2': //明天到期
  343. $temp = getTimeByType('today');
  344. $timeAry[0] = $temp[1];
  345. $timeAry[1] = $temp[1] + 3600 * 24;
  346. break;
  347. case '3': //一周内到期
  348. $timeAry = getTimeByType('week');
  349. break;
  350. case '4': //一月内到期
  351. $timeAry = getTimeByType('month');
  352. break;
  353. default:
  354. break;
  355. }
  356. $map['task.stop_time'] = ['between', [$timeAry[0], $timeAry[1]]];
  357. }
  358. }
  359. if ($param['lable_id']) {
  360. $taskIds = [];
  361. $task_ids = [];
  362. foreach ($param['lable_id'] as $v) {
  363. $task_id = [];
  364. $lableWhere = [];
  365. $lableWhere['lable_id'] = ['like', '%,' . $v . ',%'];
  366. $lableWhere['work_id'] = $work_id;
  367. $lableWhere['status'] = ['in', ['1', '5']];
  368. $lableWhere['ishidden'] = 0;
  369. $lableWhere['pid'] = 0;
  370. $lableWhere['is_archive'] = 0;
  371. $task_id = $taskModel->where($lableWhere)->column('task_id');
  372. if ($task_id && $task_ids) {
  373. $task_ids = array_unique(array_filter(array_merge($task_ids, $task_id)));
  374. } elseif ($task_id) {
  375. $task_ids = $task_id;
  376. }
  377. }
  378. $map['task.task_id'] = ['in', $task_ids];
  379. } else {
  380. $map['task.task_id'] = $work_id;
  381. }
  382. return $map;
  383. }
  384. /**
  385. * 获取截止日期参数
  386. * @param $type
  387. * @return array|string
  388. */
  389. private function getTimeParam($type)
  390. {
  391. $result = [];
  392. # 今天
  393. if ($type == 1) {
  394. $result = '(task.stop_time > 0 AND task.stop_time <= ' . strtotime(date('Y-m-d 23:59:59')) . ')';
  395. }
  396. # 明天
  397. if ($type == 2) {
  398. $tomorrow = date("Y-m-d 23:59:59", strtotime("+1 day"));
  399. $result = '(task.stop_time > 0 AND task.stop_time <= ' . strtotime($tomorrow) . ')';
  400. }
  401. # 本周
  402. if ($type == 3) {
  403. $week = mktime(23, 59, 59, date("m"), date("d") - date("w") + 7, date("Y"));
  404. $result = '(task.stop_time > 0 AND task.stop_time <= ' . $week . ')';
  405. }
  406. # 本月
  407. if ($type == 4) {
  408. $month = mktime(23, 59, 59, date("m"), date("t"), date("Y"));
  409. $result = '(task.stop_time > 0 AND task.stop_time <= ' . $month . ')';
  410. }
  411. # 未设置截止日期
  412. if ($type == 5) {
  413. $result = $result = '(task.stop_time = 0)';;
  414. }
  415. # 已延期
  416. if ($type == 6) {
  417. $result = '(task.status = 2 OR task.stop_time >= ' . time() . ')';
  418. }
  419. # 今日更新
  420. if ($type == 7) {
  421. $result = '(task.update_time >= ' . strtotime(date('Y-m-d 00:00:00')) . ' AND task.update_time <= ' . strtotime(date('Y-m-d 23:59:59')) . ')';
  422. }
  423. return $result;
  424. }
  425. }