1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | Description: 任务
  4. // +----------------------------------------------------------------------
  5. // | Author: yykun
  6. // +----------------------------------------------------------------------
  7. namespace app\work\model;
  8. use app\admin\controller\ApiCommon;
  9. use think\Db;
  10. use app\admin\model\Common;
  11. use app\admin\model\Message;
  12. use app\admin\model\User as UserModel;
  13. use app\admin\model\Structure as StructureModel;
  14. use app\admin\model\Comment as CommentModel;
  15. use app\work\model\WorkLog as LogModel;
  16. use app\work\model\WorkLable as lableModel;
  17. use app\work\model\WorkClass as classModel;
  18. use com\verify\HonrayVerify;
  19. use think\Validate;
  20. use think\Cache;
  21. class Task extends Common
  22. {
  23. /**
  24. * 为了数据库的整洁,同时又不影响Model和Controller的名称
  25. * 我们约定每个模块的数据表都加上相同的前缀,比如微信模块用weixin作为数据表前缀
  26. */
  27. protected $name = 'task';
  28. protected $createTime = 'create_time';
  29. protected $updateTime = 'update_time';
  30. protected $autoWriteTimestamp = true;
  31. protected $insert = [
  32. 'status' => 1,
  33. ];
  34. /**
  35. * 项目下任务列表(看板视图)
  36. *
  37. * @param $request
  38. * @param $user_id
  39. * @return array|false
  40. * @throws \think\db\exception\DataNotFoundException
  41. * @throws \think\db\exception\ModelNotFoundException
  42. * @throws \think\exception\DbException
  43. */
  44. public function getDataList($request, $user_id)
  45. {
  46. //权限项目判断
  47. $workModel = model('Work');
  48. $userModel = new \app\admin\model\User();
  49. $work_id = $request['work_id'];
  50. $map=[];
  51. $ret = $workModel->checkWork($work_id, $user_id);
  52. if (!$ret) {
  53. $this->error = $workModel->getError();
  54. return false;
  55. }
  56. $classModel = model('WorkClass');
  57. //删除还原的任务,归类至未分组列表下,此列表不可拖拽编辑
  58. if ($this->where(['class_id' => 0, 'ishidden' => 0, 'work_id' => $work_id])->find()) {
  59. $classArr = ['0' => ['name' => '未分组', 'class_id' => 0]];
  60. }
  61. $classList = $classModel->getDataList($work_id);
  62. if ($classArr && $classList['list']) {
  63. $newList = array_merge($classArr, $classList['list']);
  64. } elseif ($classArr) {
  65. $newList = $classArr;
  66. } else {
  67. $newList = $classList['list'];
  68. }
  69. if ($request['stop_time_type']) {
  70. if ($request['stop_time_type'] == '5') { //没有截至日期
  71. $map['stop_time'] = '0';
  72. } elseif ($request['stop_time_type'] == '6') { //延期的
  73. $map['stop_time'] = ['between', [1, time()]];
  74. $map['status'] = 1;
  75. } elseif ($request['stop_time_type'] == '7') { //今日更新
  76. $timeAry = getTimeByType('today');
  77. $map['update_time'] = ['between', [$timeAry[0], $timeAry[1]]];
  78. } else {
  79. switch ($request['stop_time_type']) {
  80. case '1': //今天到期
  81. $timeAry = getTimeByType('today');
  82. break;
  83. case '2': //明天到期
  84. $temp = getTimeByType('today');
  85. $timeAry[0] = $temp[1];
  86. $timeAry[1] = $temp[1] + 3600 * 24;
  87. break;
  88. case '3': //一周内到期
  89. $timeAry = getTimeByType('week');
  90. break;
  91. case '4': //一月内到期
  92. $timeAry = getTimeByType('month');
  93. break;
  94. default:
  95. break;
  96. }
  97. $map['stop_time'] = ['between', [$timeAry[0], $timeAry[1]]];
  98. }
  99. }
  100. if ($request['lable_id']) {
  101. $taskIds = [];
  102. $task_ids = [];
  103. foreach ($request['lable_id'] as $v) {
  104. $task_id = [];
  105. $lableWhere = [];
  106. $lableWhere['lable_id'] = ['like', '%,' . $v . ',%'];
  107. $lableWhere['work_id'] = $work_id;
  108. $lableWhere['status'] = ['in', ['1', '5']];
  109. $lableWhere['ishidden'] = 0;
  110. $lableWhere['pid'] = 0;
  111. $lableWhere['is_archive'] = 0;
  112. $task_id = $this->where($lableWhere)->column('task_id');
  113. if ($task_id && $task_ids) {
  114. $task_ids = array_unique(array_filter(array_merge($task_ids, $task_id)));
  115. } elseif ($task_id) {
  116. $task_ids = $task_id;
  117. }
  118. }
  119. $map['task_id'] = ['in', $task_ids];
  120. }
  121. $data = array();
  122. foreach ($newList as $key => $value) {
  123. $data[$key]['class_id'] = $value['class_id'] ?: -1;
  124. $data[$key]['class_name'] = $value['name'];
  125. $map['status'] = $map['status'] ?: ['in', ['1', '5']];
  126. $map['ishidden'] = 0;
  127. $map['work_id'] = $request['work_id'];
  128. $map['class_id'] = $value['class_id'];
  129. $map['pid'] = 0;
  130. $map['is_archive'] = 0;
  131. $map['main_user_id']=$request['main_user_id'];
  132. $taskList = [];
  133. $map['search']=$request['search'];
  134. $resTaskList = $this->getTaskList($map);
  135. $data[$key]['count'] = $resTaskList['count'];
  136. $data[$key]['list'] = $resTaskList['list'];
  137. }
  138. return $data;
  139. }
  140. /**
  141. * 项目下任务列表(负责人视图)
  142. *
  143. * @param $request
  144. * @param $user_id
  145. * @return array|false
  146. * @throws \think\db\exception\DataNotFoundException
  147. * @throws \think\db\exception\ModelNotFoundException
  148. * @throws \think\exception\DbException
  149. */
  150. public function getOwnerTaskList($request, $user_id)
  151. {
  152. //权限项目判断
  153. $workModel = model('Work');
  154. $userModel = new \app\admin\model\User();
  155. $work_id = $request['work_id'];
  156. $ret = $workModel->checkWork($work_id, $user_id);
  157. if (!$ret) {
  158. $this->error = $workModel->getError();
  159. return false;
  160. }
  161. $newList = db('task')->alias('task')->join('__ADMIN_USER__ user', 'user.id = task.main_user_id', 'LEFT')
  162. ->field(['user.id', 'user.realname'])->where('work_id', $work_id)->group('task.main_user_id')->select();
  163. if ($request['main_user_id']) {
  164. $map['main_user_id'] = ['in', $request['main_user_id']];
  165. }
  166. //截止时间
  167. if ($request['stop_time_type']) {
  168. if ($request['stop_time_type'] == '5') { //没有截至日期
  169. $map['stop_time'] = '0';
  170. } elseif ($request['stop_time_type'] == '6') { //延期的
  171. $map['stop_time'] = ['between', [1, time()]];
  172. $map['status'] = 1;
  173. } elseif ($request['stop_time_type'] == '7') { //今日更新
  174. $timeAry = getTimeByType('today');
  175. $map['update_time'] = ['between', [$timeAry[0], $timeAry[1]]];
  176. } else {
  177. switch ($request['stop_time_type']) {
  178. case '1': //今天到期
  179. $timeAry = getTimeByType('today');
  180. break;
  181. case '2': //明天到期
  182. $temp = getTimeByType('today');
  183. $timeAry[0] = $temp[1];
  184. $timeAry[1] = $temp[1] + 3600 * 24;
  185. break;
  186. case '3': //一周内到期
  187. $timeAry = getTimeByType('week');
  188. break;
  189. case '4': //一月内到期
  190. $timeAry = getTimeByType('month');
  191. break;
  192. default:
  193. break;
  194. }
  195. $map['stop_time'] = ['between', [$timeAry[0], $timeAry[1]]];
  196. }
  197. }
  198. if ($request['lable_id']) {
  199. $taskIds = [];
  200. $task_ids = [];
  201. foreach ($request['lable_id'] as $v) {
  202. $task_id = [];
  203. $lableWhere = [];
  204. $lableWhere['lable_id'] = ['like', '%,' . $v . ',%'];
  205. $lableWhere['work_id'] = $work_id;
  206. $lableWhere['status'] = ['in', ['1', '5']];
  207. $lableWhere['ishidden'] = 0;
  208. $lableWhere['pid'] = 0;
  209. $lableWhere['is_archive'] = 0;
  210. $task_id = $this->where($lableWhere)->column('task_id');
  211. if ($task_id && $task_ids) {
  212. $task_ids = array_unique(array_filter(array_merge($task_ids, $task_id)));
  213. } elseif ($task_id) {
  214. $task_ids = $task_id;
  215. }
  216. }
  217. $map['task_id'] = ['in', $task_ids];
  218. }
  219. $data = array();
  220. foreach ($newList as $key => $value) {
  221. $data[$key]['class_id'] = $value['id'];
  222. $data[$key]['class_name'] = $value['realname'];
  223. $map['status'] = $map['status'] ?: ['in', ['1', '5']];
  224. $map['ishidden'] = 0;
  225. $map['work_id'] = $request['work_id'];
  226. $map['main_user_id'] = $value['id'];
  227. $map['pid'] = 0;
  228. $map['is_archive'] = 0;
  229. $taskList = [];
  230. $resTaskList = $this->getTaskList($map);
  231. $data[$key]['count'] = $resTaskList['count'];
  232. $data[$key]['list'] = $resTaskList['list'];
  233. }
  234. return $data;
  235. }
  236. /**
  237. * 根据任务ID 获取操作记录
  238. * @return
  239. * @author yykun
  240. */
  241. public function getTaskLogList($param)
  242. {
  243. $list = Db::name('WorkTaskLog')->alias('l')
  244. ->join('AdminUser u', 'u.id = l.user_id', 'LEFT')
  245. ->field('l.*,u.realname,u.thumb_img')
  246. ->where('l.task_id =' . $param['task_id'])
  247. ->order('l.log_id desc')
  248. ->select();
  249. foreach ($list as $key => $value) {
  250. $list[$key]['thumb_img'] = $value['thumb_img'] ? getFullPath($value['thumb_img']) : '';
  251. $list[$key]['create_time'] = !empty($value['create_time']) ? date('Y-m-d H:i:s', $value['create_time']) : null;
  252. }
  253. return $list ?: [];
  254. }
  255. /**
  256. * 根据主键获取详情
  257. * @return
  258. * @author yykun
  259. */
  260. public function getDataById($id = '', $userInfo)
  261. {
  262. //读取参与人
  263. $userModel = new UserModel();
  264. $structModel = new StructureModel();
  265. $recordModel = new \app\admin\model\Record();
  266. $taskInfo = $this->where(['task_id' => $id])->find();
  267. if (!$taskInfo) {
  268. $this->error = '任务不存在或已删除';
  269. return false;
  270. }
  271. # 日期格式
  272. $taskInfo['start_time'] = !empty($taskInfo['start_time']) ? date('Y-m-d', $taskInfo['start_time']) : null;
  273. $taskInfo['stop_time'] = !empty($taskInfo['stop_time']) ? date('Y-m-d', $taskInfo['stop_time']) : null;
  274. $taskInfo['hidden_time'] = !empty($taskInfo['hidden_time']) ? date('Y-m-d H:i:s', $taskInfo['hidden_time']) : null;
  275. $userlist = $userModel->getDataByStr($taskInfo['owner_user_id']);
  276. $taskInfo['owner_list'] = $userlist ?: array();
  277. $workInfo = Db::name('Work')->where(['work_id' => $taskInfo['work_id']])->find();
  278. $taskInfo['work_name'] = $workInfo['name'] ?: '';
  279. //读取部门
  280. $structList = $structModel->getDataByStr($taskInfo['structure_ids']);
  281. $taskInfo['struct_list'] = $structList ?: array();
  282. //负责人
  283. $mainData = [];
  284. if ($taskInfo['main_user_id']) {
  285. $mainData = $userModel->getDataById($taskInfo['main_user_id']);
  286. }
  287. $taskInfo['main_user_name'] = !empty($mainData['realname']) ? $mainData['realname'] : '';
  288. $taskInfo['main_user_img'] = !empty($mainData['thumb_img']) ? $mainData['thumb_img'] : '';
  289. $taskInfo['main_user'] = [
  290. 'id' => !empty($taskInfo['main_user_id']) ? $taskInfo['main_user_id'] : 0,
  291. 'realname' => $taskInfo['main_user_name'],
  292. 'img' => $taskInfo['main_user_img']
  293. ];
  294. $lablelist = [];
  295. if ($taskInfo['lable_id']) {
  296. $lableModel = new \app\work\model\WorkLable();
  297. $lablelist = $lableModel->getDataByStr($taskInfo['lable_id']);
  298. }
  299. $taskInfo['lable_list'] = $lablelist ?: array();
  300. $commonmodel = new \app\admin\model\Comment();
  301. $param['type_id'] = $taskInfo['task_id'];
  302. $param['type'] = 'task';
  303. $taskInfo['replyList'] = $commonmodel->read($param);
  304. $subTaskList = $this->alias('t')
  305. ->join('AdminUser u', 'u.id = t.main_user_id', 'LEFT')
  306. ->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')
  307. ->where(' t.ishidden = 0 and ( t.status=1 or t.status=5 ) and t.pid =' . $id)
  308. ->select();
  309. $complete = 0;
  310. foreach ($subTaskList as $key => $value) {
  311. $subTaskList[$key]['main_user'] = [
  312. 'id' => $value['main_user_id'],
  313. 'img' => $value['thumb_img'],
  314. 'realname' => $value['realname']
  315. ];
  316. $subTaskList[$key]['thumb_img'] = $value['thumb_img'] ? getFullPath($value['thumb_img']) : '';
  317. $subTaskList[$key]['stop_time'] = !empty($value['stop_time']) ? date('Y-m-d', $value['stop_time']) : null;
  318. if ($value['status'] == 5) ++$complete;
  319. }
  320. # 子任务
  321. $taskInfo['subTaskList'] = $subTaskList;
  322. # 子任务完成总数
  323. $taskInfo['subTaskComplete'] = $complete;
  324. # 附件
  325. $taskInfo['fileList'] = $this->getTaskFile($id);
  326. //相关业务
  327. $relationArr = $recordModel->getListByRelationId('task', $id);
  328. $taskInfo['businessList'] = $relationArr['businessList'];
  329. $taskInfo['contactsList'] = $relationArr['contactsList'];
  330. $taskInfo['contractList'] = $relationArr['contractList'];
  331. $taskInfo['customerList'] = $relationArr['customerList'];
  332. if (!strripos($taskInfo['create_time'], '-')) {
  333. $taskInfo['create_time'] = date('Y-m-d H:i:s', $taskInfo['create_time']);
  334. }
  335. if (!strripos($taskInfo['update_time'], '-')) {
  336. $taskInfo['update_time'] = date('Y-m-d H:i:s', $taskInfo['update_time']);
  337. }
  338. $taskInfo['start_time'] = !empty($taskInfo['start_time']) ? $taskInfo['start_time'] : null;
  339. $taskInfo['stop_time'] = !empty($taskInfo['stop_time']) ? $taskInfo['stop_time'] : null;
  340. $taskInfo['archive_time'] = !empty($taskInfo['archive_time']) ? date('Y-m-d H:i:s', $taskInfo['archive_time']) : null;
  341. $createUserInfo = $userModel->getDataById($taskInfo['create_user_id']);
  342. $createUserInfo['thumb_img'] = $createUserInfo['thumb_img'] ? getFullPath($createUserInfo['thumb_img']) : '';
  343. $taskInfo['create_user_info'] = $createUserInfo;
  344. return $taskInfo;
  345. }
  346. /**
  347. * 获取任务附件列表
  348. *
  349. * @param $taskId
  350. * @return bool|\PDOStatement|string|\think\Collection
  351. * @throws \think\db\exception\DataNotFoundException
  352. * @throws \think\db\exception\ModelNotFoundException
  353. * @throws \think\exception\DbException
  354. */
  355. private function getTaskFile($taskId)
  356. {
  357. # 查询文件IDS
  358. $fileIds = Db::name('work_task_file')->where('task_id', $taskId)->column('file_id');
  359. # 查询附件
  360. $list = Db::name('admin_file')->whereIn('file_id', $fileIds)->select();
  361. foreach ($list as $key => $value) {
  362. $list[$key]['size'] = format_bytes($value['size']); //字节转换
  363. $list[$key]['create_time'] = date('Y-m-d H:i:s', $value['create_time']);
  364. $list[$key]['ext'] = getExtension($value['save_name']);
  365. $list[$key]['file_path'] = getFullPath($value['file_path']);
  366. $list[$key]['file_path_thumb'] = getFullPath($value['file_path_thumb']);
  367. }
  368. return $list;
  369. }
  370. /**
  371. * 创建任务
  372. * @return
  373. * @author yykun
  374. */
  375. public function createTask($param)
  376. {
  377. # 子任务
  378. $subtask = !empty($param['subtask']) ? $param['subtask'] : [];
  379. unset($param['subtask']);
  380. # 附件
  381. $files = !empty($param['files']) ? $param['files'] : '';
  382. unset($param['files']);
  383. $param['status'] = 1;
  384. $rdata = [];
  385. $rdata['customer_ids'] = !empty($param['customer_ids']) ? arrayToString($param['customer_ids']) : '';
  386. $rdata['contacts_ids'] = !empty($param['contacts_ids']) ? arrayToString($param['contacts_ids']) : '';
  387. $rdata['business_ids'] = !empty($param['business_ids']) ? arrayToString($param['business_ids']) : '';
  388. $rdata['contract_ids'] = !empty($param['contract_ids']) ? arrayToString($param['contract_ids']) : '';
  389. $arr = ['customer_ids', 'contacts_ids', 'business_ids', 'contract_ids'];
  390. foreach ($arr as $value) {
  391. unset($param[$value]);
  392. }
  393. $main_user_id = $param['main_user_id'] ?: $param['create_user_id'];
  394. $param['owner_user_id'] = ','.$main_user_id.','; //参与人
  395. $param['main_user_id'] = $main_user_id; //负责人
  396. $param['start_time'] = !empty($param['start_time']) ? strtotime($param['start_time']) : 0;
  397. $param['stop_time'] = !empty($param['stop_time']) ? strtotime($param['stop_time']) : 0;
  398. if (!empty($param['stop_time']) && $param['start_time'] > $param['stop_time']) {
  399. $this->error = '截止时间不能在开始时间之前';
  400. return false;
  401. }
  402. if ((!empty($param['start_time']) || !empty($param['stop_time'])) && $param['start_time'] == $param['stop_time']) {
  403. $param['stop_time'] = $param['start_time'] + 86399;
  404. }
  405. $this->data($param)->allowField(true)->save();
  406. $task_id = $this->task_id;
  407. if ($task_id) {
  408. $rdata['status'] = 1;
  409. $rdata['create_time'] = time();
  410. $rdata['task_id'] = $task_id;
  411. Db::name('TaskRelation')->insert($rdata);
  412. if (!$param['pid']) {
  413. $taskLog = new LogModel();
  414. $datalog['name'] = $param['name'];
  415. $datalog['user_id'] = $param['create_user_id'];
  416. $datalog['task_id'] = $task_id;
  417. $datalog['work_id'] = $param['work_id'] ?: '';
  418. $ret = $taskLog->newTaskLog($datalog);
  419. //抄送站内信
  420. (new Message())->send(
  421. Message::TASK_ALLOCATION,
  422. [
  423. 'title' => $param['name'],
  424. 'action_id' => $task_id
  425. ],
  426. stringToArray($param['owner_user_id'])
  427. );
  428. }
  429. # 添加活动记录
  430. if (!empty($rdata['customer_ids']) || !empty($rdata['contacts_ids']) || !empty($rdata['business_ids']) || !empty($rdata['contract_ids'])) {
  431. Db::name('crm_activity')->insert([
  432. 'type' => 2,
  433. 'activity_type' => 11,
  434. 'activity_type_id' => $task_id,
  435. 'content' => $param['name'],
  436. 'create_user_id' => $param['create_user_id'],
  437. 'update_time' => time(),
  438. 'create_time' => time(),
  439. 'customer_ids' => !empty($rdata['customer_ids']) ? $rdata['customer_ids'] : '',
  440. 'contacts_ids' => !empty($rdata['contacts_ids']) ? $rdata['contacts_ids'] : '',
  441. 'business_ids' => !empty($rdata['business_ids']) ? $rdata['business_ids'] : '',
  442. 'contract_ids' => !empty($rdata['contract_ids']) ? $rdata['contract_ids'] : ''
  443. ]);
  444. }
  445. # 添加附件
  446. if (!empty($files)) {
  447. $fileData = [];
  448. foreach ($files as $key => $value) {
  449. $fileData[] = ['file_id' => $value, 'task_id' => $task_id];
  450. }
  451. db('work_task_file')->insertAll($fileData);
  452. }
  453. # 添加子任务
  454. if (!empty($subtask)) {
  455. $subtaskData = [];
  456. foreach ($subtask as $key => $value) {
  457. $stopTime = !empty($value['stop_time']) ? strtotime($value['stop_time']) : 0;
  458. $ownerUserId = !empty($value['owner_user_id']) ? $value['owner_user_id'] : $param['create_user_id'];
  459. $subtaskData[] = [
  460. 'name' => $value['name'],
  461. 'create_user_id' => $param['create_user_id'],
  462. 'main_user_id' => $ownerUserId,
  463. 'owner_user_id' => $ownerUserId,
  464. 'create_time' => time(),
  465. 'update_time' => time(),
  466. 'pid' => $task_id,
  467. 'start_time' => 0,
  468. 'stop_time' => $stopTime
  469. ];
  470. }
  471. Db::name('task')->insertAll($subtaskData);
  472. foreach ($subtaskData as $v){
  473. RecordActionLog($param['create_user_id'],'work_task','save',$param['name'],'','','新增了子任务'.$v['name']);
  474. }
  475. }
  476. RecordActionLog($param['create_user_id'],'work_task','save',$param['name'],'','','新增任务'.$param['name']);
  477. return $task_id;
  478. } else {
  479. $this->error = '添加失败';
  480. return false;
  481. }
  482. }
  483. /**
  484. * 编辑任务
  485. *
  486. * @param $param
  487. * @return bool
  488. * @throws \think\Exception
  489. * @throws \think\db\exception\DataNotFoundException
  490. * @throws \think\db\exception\ModelNotFoundException
  491. * @throws \think\exception\DbException
  492. * @throws \think\exception\PDOException
  493. */
  494. public function updateDetTask($param)
  495. {
  496. $LogModel = new LogModel();
  497. $userModel = new UserModel();
  498. $lableModel = new lableModel();
  499. $StructureModel = new StructureModel();
  500. $createUserId = $param['create_user_id'];
  501. $type = $param['type'] ?: '';
  502. if (!$param['task_id']) {
  503. $this->error = '参数错误!';
  504. return false;
  505. }
  506. //关联业务
  507. if (isset($param['customer_ids']) && !empty($param['customer_ids'])) $rdata['customer_ids'] = arrayToString($param['customer_ids']);
  508. if (isset($param['contacts_ids']) && !empty($param['contacts_ids'])) $rdata['contacts_ids'] = arrayToString($param['contacts_ids']);
  509. if (isset($param['business_ids']) && !empty($param['business_ids'])) $rdata['business_ids'] = arrayToString($param['business_ids']);
  510. if (isset($param['contract_ids']) && !empty($param['contract_ids'])) $rdata['contract_ids'] = arrayToString($param['contract_ids']);
  511. $rdata['task_id'] = $param['task_id'];
  512. $arr = ['customer_ids', 'contacts_ids', 'business_ids', 'contract_ids'];
  513. foreach ($arr as $value) {
  514. unset($param[$value]);
  515. }
  516. # 调整时间参数格式
  517. if (!empty($param['stop_time'])) $param['stop_time'] = strtotime($param['stop_time']);
  518. if (!empty($param['start_time'])) $param['start_time'] = strtotime($param['start_time']);
  519. if (empty($param['stop_time']) && $param['stop_time'] === null) unset($param['stop_time']);
  520. if (empty($param['start_time']) && $param['start_time'] === null) unset($param['start_time']);
  521. $data = array();
  522. $taskInfo = $this->get($param['task_id']);
  523. $taskInfo = json_decode(json_encode($taskInfo), true);
  524. $data['type'] = $param['type'];
  525. $data['before'] = $taskInfo[$param['type']] ? $taskInfo[$param['type']] : '空';
  526. $target_name=$taskInfo['name'];
  527. switch ($type) {
  528. case 'name' :
  529. $data['after'] = $param['name'];
  530. $name='任务名称';
  531. $count_name=$param['name'];
  532. break;
  533. case 'stop_time' :
  534. if ($param['stop_time']) {
  535. $data['after'] = date("Y-m-d", $param['stop_time']);
  536. } else {
  537. $data['after'] = '无';
  538. }
  539. $name='结束时间';
  540. $count_name=$data['after'];
  541. break;
  542. case 'start_time' :
  543. if (!empty($param['start_time'])) {
  544. $data['after'] = date("Y-m-d", $param['stop_time']);
  545. } else {
  546. $data['after'] = '无';
  547. }
  548. $count_name=$data['after'];
  549. $name='开始时间';
  550. break;
  551. case 'class_id' :
  552. //类型修改
  553. $classModel = model('WorkClass');
  554. $taskInfo = $classModel->getDataById($param['class_id']);
  555. $data['after'] = $taskInfo['name'];
  556. $name='类型';
  557. break;
  558. case 'lable_id_add' :
  559. //标签添加
  560. $oldLabel = !empty($taskInfo['lable_id']) ? $lableModel->getNameByIds(stringToArray($taskInfo['lable_id'])) : [];
  561. $lable = $lableModel->getNameByIds($param['lable_id_add']);
  562. if ($taskInfo['lable_id'] && $param['lable_id_add']) {
  563. $param['lable_id_add'] = array_unique(array_merge(stringToArray($taskInfo['lable_id']), $param['lable_id_add']));
  564. }
  565. $param['lable_id'] = arrayToString($param['lable_id_add']);
  566. $addLabel = !empty($lable) ? array_diff($lable, $oldLabel) : '';
  567. $data['after'] = !empty($addLabel) ? implode(',', $addLabel) : '';
  568. unset($param['lable_id_add']);
  569. $count_name=$data['after'];
  570. $name='标签';
  571. break;
  572. case 'lable_id_del' :
  573. //标签删除
  574. $lable = $lableModel->getNameByIds($param['lable_id_del']);
  575. if ($param['lable_id_del']) {
  576. $lable_id = array_unique(array_diff(stringToArray($taskInfo['lable_id']), $param['lable_id_del']));
  577. $param['lable_id'] = arrayToString($lable_id);
  578. } else {
  579. $param['lable_id'] = $taskInfo['lable_id'];
  580. }
  581. $data['after'] = $lable ? implode(',', $lable) : '';
  582. unset($param['lable_id_del']);
  583. $count_name=$data['after'];
  584. $name='删除标签';
  585. break;
  586. case 'structure_id_del' :
  587. //删除参与部门
  588. $structuredet = $StructureModel->getDataById($param['structure_id']);
  589. $param['structure_ids'] = str_replace(',' . $param['structure_id_del'] . ',', ',', $taskInfo['structure_ids']); //删除
  590. $data['after'] = $structuredet['name'];
  591. unset($param['structure_id_del']);
  592. $count_name=$data['after'];
  593. $name='删除参与部门';
  594. break;
  595. case 'structure_id_add' :
  596. //添加参与部门
  597. $structuredet = $StructureModel->getDataById($param['owner_userid_add']);
  598. if ($taskInfo['structure_ids']) {
  599. $param['structure_ids'] = $taskInfo['structure_ids'] . $param['structure_id_add'] . ','; //追加
  600. } else {
  601. $param['structure_ids'] = ',' . $param['structure_id_add'] . ','; //首次添加
  602. }
  603. $data['after'] = $structuredet['name'];
  604. unset($param['structure_id_add']);
  605. $count_name=$data['after'];
  606. $name='参与部门';
  607. break;
  608. case 'owner_userid_del' :
  609. //删除参与成员
  610. $userdet = $userModel->getDataById($param['owner_userid_del']);
  611. $param['owner_user_id'] = str_replace(',' . $param['owner_userid_del'] . ',', ',', $taskInfo['owner_user_id']); //删除
  612. $data['after'] = $userdet['realname'];
  613. unset($param['owner_userid_del']);
  614. $count_name=$data['after'];
  615. $name='删除参与成员';
  616. break;
  617. case 'owner_userid_add' :
  618. //添加参与成员
  619. $userdet = $userModel->getDataById($param['owner_userid_add']);
  620. if ($taskInfo['owner_user_id']) {
  621. $param['owner_user_id'] = $taskInfo['owner_user_id'] . $param['owner_userid_add'] . ','; //追加
  622. } else {
  623. $param['owner_user_id'] = ',' . $param['owner_userid_add'] . ','; //首次添加
  624. }
  625. $data['after'] = $userdet['realname'];
  626. unset($param['owner_userid_add']);
  627. $count_name=$data['after'];
  628. $name='参与成员';
  629. break;
  630. case 'main_user_id' :
  631. //设置负责人
  632. $userdet = $userModel->getDataById($param['main_user_id']);
  633. $data['after'] = '设定' . $userdet['realname'] . '为主要负责人!';
  634. (new Message())->send(
  635. Message::TASK_ALLOCATION,
  636. [
  637. 'title' => $taskInfo['name'],
  638. 'action_id' => $param['task_id']
  639. ],
  640. $param['main_user_id']
  641. );
  642. $count_name=$userdet['realname'];
  643. $name='负责人';
  644. break;
  645. }
  646. $param['update_time'] = time();
  647. $data['work_id'] = $param['work_id'];
  648. $data['task_id'] = $param['task_id'];
  649. $data['user_id'] = $param['create_user_id'];
  650. unset($param['type']);
  651. unset($param['create_user_id']);
  652. $flag = $this->where(['task_id' => $param['task_id']])->update($param);
  653. if ($flag || count($rdata)) {
  654. if ($param['owner_user_id']) {
  655. $this->where(['task_id' => $param['task_id']])->setField('owner_user_id', $param['owner_user_id']);
  656. }
  657. if (!$param['pid']) {
  658. $LogModel = new LogModel();
  659. $taskInfo = $LogModel->taskLogAdd($data);
  660. if(empty($name)){
  661. if(!empty($param['description'])){
  662. $name='描述';
  663. }
  664. }
  665. $count_name=empty($count_name)?$target_name:$count_name;
  666. RecordActionLog($createUserId, 'work_task', 'update',$target_name, '','','修改任务'.$name.':'.$count_name);
  667. $resRelation = Db::name('TaskRelation')->where(['task_id' => $param['task_id']])->find();
  668. if ($resRelation) {
  669. Db::name('TaskRelation')->where(['task_id' => $param['task_id']])->update($rdata); //更新关联关系
  670. } else {
  671. $rdata['create_time'] = time();
  672. $rdata['status'] = 1;
  673. Db::name('TaskRelation')->insert($rdata); //更新关联关系
  674. }
  675. }
  676. # 删除活动记录
  677. Db::name('crm_activity')->where(['activity_type' => 11, 'activity_type_id' => $param['task_id']])->delete();
  678. # 添加活动记录
  679. if (!empty($rdata['customer_ids']) || !empty($rdata['contacts_ids']) || !empty($rdata['business_ids']) || !empty($rdata['contract_ids'])) {
  680. Db::name('crm_activity')->insert([
  681. 'type' => 2,
  682. 'activity_type' => 11,
  683. 'activity_type_id' => $param['task_id'],
  684. 'content' => $param['name'],
  685. 'create_user_id' => $createUserId,
  686. 'update_time' => time(),
  687. 'create_time' => time(),
  688. 'customer_ids' => !empty($rdata['customer_ids']) ? $rdata['customer_ids'] : '',
  689. 'contacts_ids' => !empty($rdata['contacts_ids']) ? $rdata['contacts_ids'] : '',
  690. 'business_ids' => !empty($rdata['business_ids']) ? $rdata['business_ids'] : '',
  691. 'contract_ids' => !empty($rdata['contract_ids']) ? $rdata['contract_ids'] : ''
  692. ]);
  693. }
  694. return true;
  695. } else {
  696. $this->error = '操作失败';
  697. return false;
  698. }
  699. }
  700. //根据IDs获取数组
  701. public function getDataByStr($idstr)
  702. {
  703. $idArr = stringToArray($idstr);
  704. if (!$idArr) {
  705. return [];
  706. }
  707. $list = db('work_task_lable')->where(['lable_id' => ['in', $idArr]])->select();
  708. return $list;
  709. }
  710. /**
  711. * 任务统计不同状态
  712. * @param
  713. * @return
  714. * @author yykun
  715. */
  716. public function getCount($status = 0)
  717. {
  718. $map = array();
  719. if ($status > 0) {
  720. $map['status'] = $status;
  721. }
  722. $count = $this->where($map)->count();
  723. return $count ?: 0;
  724. }
  725. /**
  726. * 获取某一月份任务列表
  727. * @param
  728. * @return
  729. * @author yykun
  730. */
  731. public function getDateList($param)
  732. {
  733. $start_time = $param['start_time'];
  734. $stop_time = $param['stop_time'];
  735. $user_id = $param['user_id'];
  736. // $date_list = dateList($start_time, $stop_time, 1);
  737. $where = [];
  738. $where['ishidden'] = 0;
  739. $where['is_archive'] = 0;
  740. $where['status'] = 1;
  741. $where['pid'] = 0;
  742. $str = ',' . $user_id . ',';
  743. $whereStr = ' ( create_user_id = ' . $user_id . ' or ( owner_user_id like "%' . $str . '%") or ( main_user_id = ' . $user_id . ' ) )';
  744. $whereDate = '( stop_time > 0 and stop_time between ' . $start_time . ' and ' . $stop_time . ' ) or ( update_time between ' . $start_time . ' and ' . $stop_time . ' )';
  745. $list = db('task')
  746. ->where($where)
  747. ->where($whereStr)
  748. ->where($whereDate)
  749. ->field('task_id,name,priority,start_time,stop_time,priority,update_time')
  750. ->select();
  751. return $list ?: [];
  752. }
  753. /**
  754. * 删除任务
  755. * @param
  756. * @return
  757. * @author yykun
  758. */
  759. public function delTaskById($param)
  760. {
  761. if (!$param['task_id']) {
  762. $this->error = '参数错误';
  763. return false;
  764. }
  765. $taskInfo = $this->get($param['task_id']);
  766. if (!$taskInfo) {
  767. $this->error = '数据不存在或已删除';
  768. return false;
  769. }
  770. $map['task_id'] = $param['task_id'];
  771. $temp['ishidden'] = 1;
  772. $temp['hidden_time'] = time();
  773. $flag = $this->where($map)->update($temp);
  774. if ($flag) {
  775. # 删除任务的活动记录
  776. db('crm_activity')->where(['type' => 2, 'activity_type' => 11, 'activity_type_id' => $param['task_id']])->delete();
  777. return true;
  778. } else {
  779. $this->error = '删除失败';
  780. return false;
  781. }
  782. }
  783. /**
  784. * 归档任务
  785. * @param
  786. * @return
  787. * @author yykun
  788. */
  789. public function archiveData($param)
  790. {
  791. $data['is_archive'] = 1;
  792. $data['archive_time'] = time();
  793. $dataInfo=$this->get($param['task_id']);
  794. $dataInfo = json_decode(json_encode($dataInfo), true);
  795. $flag = $this->where(['task_id' => $param['task_id']])->update($data);
  796. if ($flag) {
  797. RecordActionLog($param['create_user_id'], 'work_task', 'archiveData',$dataInfo['name'], '','','归档了任务:'.$dataInfo['name']);
  798. return true;
  799. } else {
  800. $this->error = '归档失败';
  801. return false;
  802. }
  803. }
  804. /**
  805. * 归档任务恢复
  806. * @param
  807. * @return
  808. * @author yykun
  809. */
  810. public function recover($param)
  811. {
  812. $dataInfo=$this->get($param['task_id']);
  813. $dataInfo = json_decode(json_encode($dataInfo), true);
  814. $flag = $this->where(['task_id' => $param['task_id']])->setField('is_archive', 0);
  815. if ($flag) {
  816. //添加日志
  817. RecordActionLog($param['create_user_id'], 'work_task', 'recover',$dataInfo['name'], '','','归档了任务:'.$dataInfo['name']);
  818. return true;
  819. } else {
  820. $this->error = '操作失败';
  821. return false;
  822. }
  823. }
  824. /**
  825. * 任务权限判断
  826. * @param
  827. * @return
  828. * @author Michael_xu
  829. */
  830. public function checkTask($task_id, $userInfo)
  831. {
  832. $userModel = new \app\admin\model\User();
  833. $taskInfo = $this->get($task_id);
  834. if (!$taskInfo) {
  835. $this->error = '该任务不存在或已删除';
  836. return false;
  837. }
  838. $user_id = $userInfo['id'];
  839. $structure_id = $userInfo['structure_id'];
  840. $adminTypes = adminGroupTypes($user_id);
  841. if (in_array(1, $adminTypes) || in_array(7, $adminTypes)) {
  842. return true;
  843. }
  844. 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']))) {
  845. return true;
  846. }
  847. $workInfo = db('work')->where(['work_id' => $taskInfo['work_id']])->find();
  848. if ($taskInfo['is_open'] == 1) {
  849. return true;
  850. } else {
  851. //私有项目(只有项目成员可以查看)
  852. $workUser = db('work_user')->where(['work_id' => $taskInfo['work_id']])->column('user_id');
  853. if ($workUser && in_array($user_id, $workUser)) {
  854. return true;
  855. }
  856. return false;
  857. }
  858. }
  859. /**
  860. * 查看关联个数
  861. * @param
  862. * @return
  863. * @author yykun
  864. */
  865. public function getRelationCount($task_id)
  866. {
  867. $relationInfo = Db::name('TaskRelation')->where(['task_id' => $task_id])->find();
  868. $count = 0;
  869. if ($relationInfo) {
  870. $count1 = count(stringToArray($relationInfo['customer_ids']));
  871. $count2 = count(stringToArray($relationInfo['contacts_ids']));
  872. $count3 = count(stringToArray($relationInfo['business_ids']));
  873. $count4 = count(stringToArray($relationInfo['contract_ids']));
  874. $count = $count1 + $count2 + $count3 + $count4;
  875. }
  876. return $count;
  877. }
  878. /**
  879. * 任务列表
  880. *
  881. * @param $request
  882. * @return array
  883. * @throws \think\db\exception\DataNotFoundException
  884. * @throws \think\db\exception\ModelNotFoundException
  885. * @throws \think\exception\DbException
  886. */
  887. public function getTaskList($request)
  888. {
  889. $search = $request['search']?:'';
  890. $whereStr = $request['whereStr'] ?: [];
  891. $lable_id = $request['lable_id'] ?: '';
  892. $main_user_id = $request['main_user_id'] ?: '';
  893. $taskSearch = !empty($request['taskSearch']) ? $request['taskSearch'] : '';
  894. $isArchive = !empty($request['is_archive']) ? $request['is_archive'] : 0;
  895. unset($request['search']);
  896. unset($request['whereStr']);
  897. unset($request['lable_id']);
  898. unset($request['main_user_id']);
  899. $request = $this->fmtRequest($request);
  900. $requestMap = $request['map'] ?: [];
  901. $userModel = new \app\admin\model\User();
  902. $lableModel = new \app\work\model\WorkLable();
  903. $map = $requestMap;
  904. $map['ishidden'] = $requestMap['ishidden'] ?: 0;
  905. $map = where_arr($map, 'work', 'task', 'index');
  906. if ($search) {
  907. //普通筛选
  908. $map['task.name'] = ['like', '%' . $search . '%'];
  909. }
  910. if ($lable_id) {
  911. $map['task.lable_id'] = array('like', '%' . $lable_id . '%');
  912. }
  913. $dataCount = db('task')->alias('task')->where($map)->where($whereStr)->where($taskSearch)->count();
  914. $taskList = [];
  915. $logWhere='';
  916. if ($main_user_id) {
  917. foreach ($main_user_id as $key => $value) {
  918. $logWhere.= '( task.owner_user_id like "%,' . $value . ',%") OR ';
  919. }
  920. if (!empty($logWhere)) $logWhere = '(' . rtrim($logWhere, 'OR ') . ')';
  921. }
  922. if ($dataCount) {
  923. $taskList = db('task')
  924. ->alias('task')
  925. ->join('AdminUser u', 'u.id = task.main_user_id', 'LEFT')
  926. ->join('Work w', 'w.work_id = task.work_id', 'LEFT')
  927. ->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')
  928. ->where($map)
  929. ->where($whereStr)
  930. ->where($logWhere)
  931. ->where($taskSearch)
  932. ->order('task.status asc,task.order_id asc')
  933. ->select();
  934. foreach ($taskList as $key => $value) {
  935. if ($value['pid'] > 0) {
  936. $p_det = $this->field('task_id,name')->where(['task_id' => $value['pid']])->find();
  937. $taskList[$key]['pname'] = $p_det['name'];
  938. } else {
  939. $taskList[$key]['pname'] = '';
  940. }
  941. $taskList[$key]['thumb_img'] = $value['thumb_img'] ? getFullPath($value['thumb_img']) : '';
  942. $subcount = $this->where(['ishidden' => 0, 'status' => 1, 'pid' => $value['task_id']])->count();
  943. $subdonecount = $this->where(['ishidden' => 0, 'status' => 5, 'pid' => $value['task_id']])->count();
  944. $taskList[$key]['subcount'] = $subcount; //子任务
  945. $taskList[$key]['subdonecount'] = $subdonecount; //已完成子任务
  946. $taskList[$key]['commentcount'] = Db::name('AdminComment')->where(['type' => 'task', 'type_id' => $value['task_id']])->count(); //评论
  947. $taskList[$key]['filecount'] = Db::name('WorkTaskFile')->where(['task_id' => $value['task_id']])->count();
  948. $lableList = [];
  949. if ($value['lable_id']) {
  950. $lableList = $lableModel->getDataByStr($value['lable_id']);
  951. $taskList[$key]['lableList'] = $lableList ?: array();
  952. }
  953. $taskList[$key]['lableList'] = $lableList ?: array();
  954. //参与人
  955. //负责人信息
  956. $taskList[$key]['main_user'] = $value['main_user_id'] ? $userModel->getDataById($value['main_user_id']) : NULL;
  957. $taskList[$key]['relationCount'] = $this->getRelationCount($value['task_id']);
  958. $is_end = 0;
  959. if (!empty($value['stop_time']) && (strtotime(date('Ymd')) + 86399 > $value['stop_time'])) $is_end = 1;
  960. $taskList[$key]['is_end'] = $is_end;
  961. $taskList[$key]['checked'] = ($value['status'] == '5') ? true : false;
  962. $taskList[$key]['stop_time'] = !empty($value['stop_time']) ? date('Y-m-d H:i:s', $value['stop_time']) : null;
  963. $taskList[$key]['create_time'] = !empty($value['create_time']) ? date('Y-m-d H:i:s', $value['create_time']) : null;
  964. }
  965. }
  966. # 归档任务
  967. if (!empty($isArchive)) {
  968. return $taskList;
  969. }
  970. $data = [];
  971. $data['count'] = $dataCount;
  972. $data['list'] = $taskList ?: [];
  973. return $data;
  974. }
  975. /**
  976. * 项目-控制台-任务列表(新)
  977. *
  978. * @param $request
  979. * @param $param
  980. * @return array
  981. * @throws \think\db\exception\DataNotFoundException
  982. * @throws \think\db\exception\ModelNotFoundException
  983. * @throws \think\exception\DbException
  984. */
  985. public function getProjectTaskList($request, $param)
  986. {
  987. # 排序
  988. $order = $this->getSplicingSortParam($param);
  989. # 搜索
  990. $whereStr = $request['whereStr'] ?: [];
  991. $taskSearch = !empty($request['taskSearch']) ? $request['taskSearch'] : '';
  992. unset($request['whereStr']);
  993. unset($request['taskSearch']);
  994. $request = $this->fmtRequest($request);
  995. $requestMap = $request['map'] ?: [];
  996. $userModel = new \app\admin\model\User();
  997. $lableModel = new \app\work\model\WorkLable();
  998. $map = $requestMap;
  999. $map['ishidden'] = $requestMap['ishidden'] ?: 0;
  1000. $map = where_arr($map, 'work', 'task', 'index');
  1001. # 成员
  1002. if (!empty($param['owner_user_id']) && is_array($param['owner_user_id'])) {
  1003. $whereStr = '';
  1004. foreach ($param['owner_user_id'] as $key => $value) {
  1005. $whereStr .= '( task.owner_user_id like "%,' . $value . ',%") OR ';
  1006. }
  1007. if (!empty($whereStr)) $whereStr = '(' . rtrim($whereStr, 'OR ') . ')';
  1008. }
  1009. # 截止日期
  1010. $timeWhere = $this->getTimeParam($param['time_type']);
  1011. # 标签
  1012. $labelWhere = '';
  1013. if (!empty($param['label_id']) && is_array($param['label_id'])) {
  1014. foreach ($param['label_id'] as $key => $value) {
  1015. $labelWhere .= '( task.lable_id like "%,' . $value . ',%") OR ';
  1016. }
  1017. if (!empty($labelWhere)) $labelWhere = '(' . rtrim($labelWhere, 'OR ') . ')';
  1018. }
  1019. $dataCount = db('task')->alias('task')->where($map)->where($whereStr)->where($taskSearch)->where($timeWhere)->where($labelWhere)->count();
  1020. $taskList = [];
  1021. if ($dataCount) {
  1022. $taskList = db('task')
  1023. ->alias('task')
  1024. ->join('AdminUser u', 'u.id = task.main_user_id', 'LEFT')
  1025. ->join('Work w', 'w.work_id = task.work_id', 'LEFT')
  1026. ->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')
  1027. ->where($map)
  1028. ->where($whereStr)
  1029. ->where($taskSearch)
  1030. ->where($timeWhere)
  1031. ->where($labelWhere)
  1032. ->order($order)
  1033. ->select();
  1034. foreach ($taskList as $key => $value) {
  1035. if ($value['pid'] > 0) {
  1036. $p_det = $this->field('task_id,name')->where(['task_id' => $value['pid']])->find();
  1037. $taskList[$key]['pname'] = $p_det['name'];
  1038. } else {
  1039. $taskList[$key]['pname'] = '';
  1040. }
  1041. $taskList[$key]['thumb_img'] = $value['thumb_img'] ? getFullPath($value['thumb_img']) : '';
  1042. $subcount = $this->where(['ishidden' => 0, 'status' => 1, 'pid' => $value['task_id']])->count();
  1043. $subdonecount = $this->where(['ishidden' => 0, 'status' => 5, 'pid' => $value['task_id']])->count();
  1044. $taskList[$key]['subcount'] = $subcount; //子任务
  1045. $taskList[$key]['subdonecount'] = $subdonecount; //已完成子任务
  1046. $taskList[$key]['commentcount'] = Db::name('AdminComment')->where(['type' => 'task', 'type_id' => $value['task_id']])->count(); //评论
  1047. $taskList[$key]['filecount'] = Db::name('WorkTaskFile')->where(['task_id' => $value['task_id']])->count();
  1048. $lableList = [];
  1049. if ($value['lable_id']) {
  1050. $lableList = $lableModel->getDataByStr($value['lable_id']);
  1051. $taskList[$key]['lableList'] = $lableList ?: array();
  1052. }
  1053. $taskList[$key]['lableList'] = $lableList ?: array();
  1054. //参与人
  1055. //负责人信息
  1056. $taskList[$key]['main_user'] = $value['main_user_id'] ? $userModel->getDataById($value['main_user_id']) : NULL;
  1057. $taskList[$key]['relationCount'] = $this->getRelationCount($value['task_id']);
  1058. $is_end = 0;
  1059. if (!empty($value['stop_time']) && (strtotime(date('Ymd')) + 86399 > $value['stop_time'])) $is_end = 1;
  1060. $taskList[$key]['is_end'] = $is_end;
  1061. $taskList[$key]['checked'] = ($value['status'] == '5') ? true : false;
  1062. }
  1063. }
  1064. $data = [];
  1065. $data['count'] = $dataCount;
  1066. $data['list'] = $taskList ?: [];
  1067. return $data;
  1068. }
  1069. /**
  1070. * 获取截止日期参数
  1071. * @param $type
  1072. * @return array|string
  1073. */
  1074. private function getTimeParam($type)
  1075. {
  1076. $result = [];
  1077. # 今天
  1078. if ($type == 1) {
  1079. $result = '(task.stop_time >= ' . strtotime(date('Y-m-d 00:00:00')) . ' AND task.stop_time <= ' . strtotime(date('Y-m-d 23:59:59')) . ')';
  1080. }
  1081. # 明天
  1082. if ($type == 2) {
  1083. $tomorrow = date("Y-m-d 23:59:59", strtotime("+1 day"));
  1084. $start = date("Y-m-d 00:00:00", strtotime("+1 day"));
  1085. $result = '(task.stop_time >= ' . strtotime($start) . ' AND task.stop_time <= ' . strtotime($tomorrow) . ')';
  1086. }
  1087. # 本周
  1088. if ($type == 3) {
  1089. $week = mktime(23, 59, 59, date("m"), date("d") - date("w") + 7, date("Y"));
  1090. $start_week=mktime(0, 0, 0, date('m'), date('d') - date('w') + 1, date('Y'));
  1091. $result = '(task.stop_time >= ' . $start_week . ' AND task.stop_time <= ' . $week . ')';
  1092. }
  1093. # 本月
  1094. if ($type == 4) {
  1095. $timestamp = mktime(0, 0, 0, date('m'), 1, date('Y'));
  1096. $month = mktime(23, 59, 59, date("m"), date("t"), date("Y"));
  1097. $result = '(task.stop_time > ' . $timestamp . ' AND task.stop_time <= ' . $month . ')';
  1098. }
  1099. # 未设置截止日期
  1100. if ($type == 5) {
  1101. $result = '(task.stop_time = 0)';;
  1102. }
  1103. # 已延期
  1104. if ($type == 6) {
  1105. $result = '(task.status = 2 OR task.stop_time < ' . time() . ')'.'AND task.stop_time <> 0 AND task.status = 1';
  1106. }
  1107. # 今日更新
  1108. if ($type == 7) {
  1109. $result = '(task.update_time >= ' . strtotime(date('Y-m-d 00:00:00')) . ' AND task.update_time <= ' . strtotime(date('Y-m-d 23:59:59')) . ')';
  1110. }
  1111. return $result;
  1112. }
  1113. /**
  1114. * 拼接排序参数
  1115. *
  1116. * @param $param
  1117. * @return string
  1118. */
  1119. private function getSplicingSortParam($param)
  1120. {
  1121. $result = '';
  1122. # 排序字段映射
  1123. $sortFieldArray = [1 => 'top_order_id', 2 => 'create_time', 3 => 'stop_time', 4 => 'update_time', 5 => 'priority'];
  1124. # 已完成任务默认排在最后
  1125. $completedTask = $param['completed_task'];
  1126. # 排序方式:top_order_id按手动拖拽;create_time按最近创建;stop_time按最近截止;update_time按最近更新;priority按最高优先级;
  1127. $sortField = !empty($param['sort_field']) ? $param['sort_field'] : 'task_id';
  1128. # 默认是升序
  1129. $sortValue = 'asc';
  1130. # 除按手动拖拽以外,全部是降序
  1131. if (in_array($sortField, [2, 3, 4, 5])) $sortValue = 'desc';
  1132. if (!empty($completedTask) && ($completedTask != 'false' || $completedTask != false)) $result = 'task.status asc, ';
  1133. $result .= 'task.' . $sortFieldArray[$sortField] . ' ' . $sortValue;
  1134. return $result;
  1135. }
  1136. }