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