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