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