TaskController.php 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Administrator
  5. * Date: 2020/3/5 0005
  6. * Time: 14:19
  7. */
  8. namespace App\Http\Controllers\Admin\Plan;
  9. use App\Exports\BasicExport;
  10. use App\Http\Controllers\Controller;
  11. use App\Http\Models\GoogleTrendsKeyword;
  12. use App\Http\Models\Mailbox;
  13. use App\Http\Models\Role;
  14. use App\Http\Models\ScheduledTasks;
  15. use App\Http\Models\User;
  16. use App\Http\Models\WeekTaskHistory;
  17. use App\Http\Models\WeekTaskInfo;
  18. use App\Http\Services\SendMessageService;
  19. use Illuminate\Http\Request;
  20. use Illuminate\Support\Collection;
  21. use Illuminate\Support\Facades\DB;
  22. use Illuminate\Contracts\View\Factory;
  23. use Illuminate\View\View;
  24. use Illuminate\Http\JsonResponse;
  25. /**
  26. * 任务计划
  27. * Class TaskController
  28. * @package App\Http\Controllers\Admin\Plan
  29. */
  30. class TaskController extends Controller
  31. {
  32. //当前任务和下周任务 根据 type 区别
  33. public function index(Request $request, $userId = 0)
  34. {
  35. $weekTaskInfo = WeekTaskInfo::query();
  36. $type = $request->input('type');
  37. $dutyId = $request->input('duty_id');
  38. if (!empty($dutyId)) {
  39. $weekTaskInfo->where('duty_id', $dutyId);
  40. }
  41. if ($userId != 0) {
  42. $weekTaskInfo->where('duty_id', auth()->user()->id);
  43. }
  44. $type = $type == 'next' ? 'next' : 'now';
  45. $condition = ['type' => $type];
  46. list($web, $design, $exam, $siteExam, $site, $seo, $allUserList) = $this->getTaskByUserList();
  47. $taskInfoList = $weekTaskInfo->where($condition)
  48. ->orderBy('deadline', 'asc')
  49. ->get()->groupBy('user_type')
  50. ->map(function (Collection $item) {
  51. return $item->groupBy('day')->toArray();
  52. })->toArray();
  53. $user = User::query()->where('status', 1)->pluck('nickname', 'id');
  54. $condList = DB::table('week_task_cond')->pluck('name', 'id')->toArray();
  55. foreach ($taskInfoList as $key => $value) {
  56. foreach ($value as $kk => $vv) {
  57. foreach ($vv as $kkk => $vvv) {
  58. if (substr($vvv['user_type'], 0, 3) == 'wfp') {
  59. $vv[$kkk]['user_name'] = '未分配';
  60. } else {
  61. $vv[$kkk]['user_name'] = $user[$vvv['user_type']] ?? '';
  62. }
  63. $vv[$kkk]['cond_name'] = $condList[$vvv['cond_id']] ?? '';
  64. $vv[$kkk]['web_name'] = $web[$vvv['web_id']] ?? '';
  65. $vv[$kkk]['design_name'] = $design[$vvv['design_id']] ?? '';
  66. $vv[$kkk]['duty_name'] = $allUserList[$vvv['duty_id']] ?? '';
  67. }
  68. $value[$kk] = $vv;
  69. }
  70. $taskInfoList[$key] = $value;
  71. }
  72. $taskStaffList = [
  73. 'web' => [],
  74. 'design' => [],
  75. 'exam' => [],
  76. 'site-exam' => [],
  77. 'site' => [],
  78. 'seo' => [],
  79. ];
  80. //前端
  81. $taskStaffList['web']['wfp-web'] = '未分配';
  82. foreach ($web as $key => $item) {
  83. $taskStaffList['web'][$key] = $item;
  84. }
  85. //设计
  86. $taskStaffList['design']['wfp-design'] = '未分配';
  87. foreach ($design as $key => $item) {
  88. $taskStaffList['design'][$key] = $item;
  89. }
  90. //seo质检
  91. $taskStaffList['exam']['wfp-exam'] = '未分配';
  92. foreach ($exam as $key => $item) {
  93. $taskStaffList['exam'][$key] = $item;
  94. }
  95. //建站质检
  96. $taskStaffList['site-exam']['wfp-site-exam'] = '未分配';
  97. foreach ($siteExam as $key => $item) {
  98. $taskStaffList['site-exam'][$key] = $item;
  99. }
  100. //策划部
  101. $taskStaffList['site']['wfp-site'] = '未分配';
  102. foreach ($site as $key => $item) {
  103. $taskStaffList['site'][$key] = $item;
  104. }
  105. //优化部
  106. $taskStaffList['seo']['wfp-seo'] = '未分配';
  107. foreach ($seo as $key => $item) {
  108. $taskStaffList['seo'][$key] = $item;
  109. }
  110. $weekDateList = $this->getWeek(time());
  111. $weekDate = [];
  112. foreach ($weekDateList as $item) {
  113. $weekDate[] = $item['date'];
  114. }
  115. return view('admin/plan/task', [
  116. 'allUserList' => $allUserList,
  117. 'designerList' => $design,
  118. 'webList' => $web,
  119. 'taskInfoList' => $taskInfoList,
  120. 'type' => $type,
  121. 'dutyId' => $dutyId,
  122. 'taskStaffList' => $taskStaffList,
  123. 'is_user' => $userId,
  124. 'weekDate' => $weekDate,
  125. ]);
  126. }
  127. /**
  128. * 添加任务页面
  129. * @param $taskId
  130. * @param $auth
  131. * @return Factory|View
  132. */
  133. public function addTask($taskId, $auth)
  134. {
  135. $auth = explode(':', $auth);
  136. $condList = DB::table('week_task_cond')
  137. ->where('type', $auth[0])
  138. ->pluck('name', 'id')
  139. ->toArray();
  140. if ($auth[4] == 1) {
  141. $differenceCondId = WeekTaskInfo::query()
  142. ->where('id', $taskId)
  143. ->value('cond_id');
  144. $condIds = DB::table('week_task_cond')
  145. ->where('id', $differenceCondId)
  146. ->pluck('name', 'id')
  147. ->toArray();
  148. //兼容
  149. foreach ($condList as $key => $value) {
  150. foreach ($condIds as $kk => $vv) {
  151. if ($key !== $kk) {
  152. $condList[$kk] = $vv;
  153. }
  154. }
  155. }
  156. }
  157. list($web, $design, $exam, $siteExam, $site, $seo, $allUserList) = $this->getTaskByUserList();
  158. $weekTaskInfo = WeekTaskInfo::query()->where('id', $taskId)->first();
  159. $user = auth()->user();
  160. return view('admin/plan/add_task', [
  161. 'condList' => $condList,
  162. 'web' => $web,
  163. 'design' => $design,
  164. 'exam' => $exam,
  165. 'siteExam' => $siteExam,
  166. 'site' => $site,
  167. 'seo' => $seo,
  168. 'allUserList' => $allUserList,
  169. 'role' => 'wfp-' . $auth[0],
  170. 'type' => $auth[1],
  171. 'taskId' => $taskId,
  172. 'weekTaskInfo' => $weekTaskInfo,
  173. 'week' => date('w'),
  174. 'day' => $auth[2],
  175. 'role_id' => $user->role_id,
  176. 'user_id' => $auth[3],
  177. ]);
  178. }
  179. /**
  180. * 保存
  181. * @param Request $request
  182. * @param int $taskId
  183. * @return JsonResponse
  184. */
  185. public function saveTask(Request $request, $taskId = 0)
  186. {
  187. $data = [];
  188. $type = $request->input('type');
  189. $role = $request->input('role');
  190. $condId = $request->input('cond_id');
  191. if (empty($condId)) {
  192. return response()->json(['message' => '请选择任务类型'], 400);
  193. }
  194. $data['cond_id'] = $condId;
  195. $describe = $request->input('describe') ?? '';
  196. if (empty($describe)) {
  197. return response()->json(['message' => '请填写任务描述'], 400);
  198. }
  199. $data['describe'] = $describe;
  200. $userType = $request->input('user_type') ?? $role;
  201. $data['user_type'] = $userType;
  202. $dutyId = $request->input('duty_id');
  203. if (empty($dutyId)) {
  204. return response()->json(['message' => '请填写负责人'], 400);
  205. }
  206. $data['duty_id'] = $dutyId;
  207. $designId = $request->input('design_id') ?? 0;
  208. if (!empty($designId) && $designId == 'wfp-design') {
  209. $data['design_id'] = null;
  210. } else {
  211. $data['design_id'] = $designId;
  212. }
  213. $webId = $request->input('web_id') ?? 0;
  214. if (!empty($webId) && $webId == 'wfp-web') {
  215. $data['web_id'] = null;
  216. } else {
  217. $data['web_id'] = $webId;
  218. }
  219. $checkScore = $request->input('check_score') ?? 0;
  220. $data['check_score'] = $checkScore;
  221. $remark = $request->input('remark');
  222. if (in_array($condId, [5, 1]) && !$remark) {
  223. return response()->json(['message' => '请填写上测试站链接'], 400);
  224. }
  225. if ($condId == 16 && !$remark) {
  226. return response()->json(['message' => '请填写上内页链接'], 400);
  227. }
  228. $data['remark'] = $remark;
  229. $day = $request->input('day');
  230. if (substr($userType, 0, 3) == 'wfp') {
  231. $day = 0;
  232. }
  233. $user = auth()->user();
  234. $deadline = $request->input('deadline');
  235. if (empty($taskId)) {
  236. if (empty($deadline)) {
  237. return response()->json(['message' => '请填写上最后期限时间'], 400);
  238. }
  239. if (strtotime($deadline) == strtotime(date('Y-m-d')) || strtotime($deadline) < strtotime(date('Y-m-d'))) {
  240. return response()->json(['message' => '不允许创建截止时间为当天或小于当天的任务'], 400);
  241. }
  242. $data['deadline'] = $deadline;
  243. } else {
  244. if (!in_array($user->role_id, [14, 27])) {
  245. if (empty($deadline)) {
  246. return response()->json(['message' => '请填写上最后期限时间'], 400);
  247. } else {
  248. $data['deadline'] = $deadline;
  249. }
  250. }
  251. }
  252. $data['day'] = $day;
  253. $data['type'] = $type;
  254. $data['created_at'] = date('Y-m-d H:i:s');
  255. if (empty($taskId)) {
  256. $id = WeekTaskInfo::query()->insertGetId($data);
  257. $this->createTask($id);
  258. } else {
  259. unset($data['created_at']);
  260. WeekTaskInfo::query()->where('id', $taskId)->update($data);
  261. $this->createTask($taskId);
  262. }
  263. return response()->json(['message' => '操作成功']);
  264. }
  265. /**
  266. * 自动创建设计任务
  267. * @param $taskId
  268. * @param int $status
  269. */
  270. public function createTask($taskId, $status = 0)
  271. {
  272. $weekTaskInfo = WeekTaskInfo::query()->where('id', $taskId)->first();
  273. //筛选出最近2个礼拜的时间排除周末
  274. $dayList = $this->getDay();
  275. $data['describe'] = $weekTaskInfo->describe ?? '';
  276. $data['duty_id'] = $weekTaskInfo->duty_id ?? 0;
  277. $data['web_id'] = $weekTaskInfo->web_id ?? 0;
  278. $data['design_id'] = $weekTaskInfo->design_id ?? 0;
  279. $data['created_at'] = date('Y-m-d H:i:s');
  280. $data['remark'] = $weekTaskInfo->remark ?? '';
  281. //前端 首页切片创建时 创建 设计 移动端设计(历史任务和当前任务都没有才创建)
  282. $taskHistory = WeekTaskHistory::query()->where(['cond_id' => 18, 'describe' => $weekTaskInfo->describe])->first();
  283. $task = WeekTaskInfo::query()->where(['cond_id' => 18, 'describe' => $weekTaskInfo->describe])->first();
  284. if (in_array($weekTaskInfo->cond_id, [1]) && !$taskHistory && !$task) {
  285. $data['user_type'] = 'wfp-design';
  286. $data['type'] = 'now';
  287. $data['status'] = '';
  288. $data['day'] = 0;
  289. $data['cond_id'] = '18';
  290. $data['deadline'] = $dayList[2];
  291. WeekTaskInfo::query()->insert($data);
  292. }
  293. //完成时触发
  294. if ($status == 1) {
  295. //前端 测试站检查触 发建站质检的 测试站检查 (暂停)
  296. /* if (in_array($weekTaskInfo->cond_id, [5]) && $weekTaskInfo->status == 'ok' && !WeekTaskInfo::query()->where(['cond_id' => 66, 'describe' => $weekTaskInfo->describe])->exists()) {
  297. $data['user_type'] = 'wfp-site-exam';
  298. $data['type'] = 'now';
  299. $data['status'] = '';
  300. $data['day'] = 0;
  301. $data['cond_id'] = '66';
  302. $data['deadline'] = $dayList[1];
  303. WeekTaskInfo::query()->insert($data);
  304. }*/
  305. //前端 首页切片、内页切片
  306. if (in_array($weekTaskInfo->cond_id, [1, 16]) && $weekTaskInfo->status == 'ok' && !WeekTaskInfo::query()->where(['cond_id' => 65, 'describe' => $weekTaskInfo->describe])->exists()) {
  307. $data['user_type'] = 'wfp-site-exam';
  308. $data['type'] = 'now';
  309. $data['status'] = '';
  310. $data['day'] = 0;
  311. $data['cond_id'] = '65';
  312. $data['deadline'] = $dayList[1];
  313. WeekTaskInfo::query()->insert($data);
  314. }
  315. //建站质检 上线表格检查 触发seo质检 上线前质检
  316. /* if (in_array($weekTaskInfo->cond_id, [67]) && $weekTaskInfo->status == 'ok' && !WeekTaskInfo::query()->where(['cond_id' => 70, 'describe' => $weekTaskInfo->describe])->exists()) {
  317. $data['user_type'] = 'wfp-exam';
  318. $data['type'] = 'now';
  319. $data['status'] = '';
  320. $data['day'] = 0;
  321. $data['cond_id'] = '70';
  322. $data['deadline'] = $dayList[0];
  323. WeekTaskInfo::query()->insert($data);
  324. }*/
  325. //建站质检 上线后检查表 触发seo质检 上线后质检
  326. if (in_array($weekTaskInfo->cond_id, [68]) && $weekTaskInfo->status == 'ok' && !WeekTaskInfo::query()->where(['cond_id' => 71, 'describe' => $weekTaskInfo->describe])->exists()) {
  327. //延时任务
  328. $data['user_type'] = 'wfp-exam';
  329. $data['type'] = 'now';
  330. $data['status'] = '';
  331. $data['day'] = 0;
  332. $data['cond_id'] = '71';
  333. unset($data['deadline']);
  334. ScheduledTasks::query()->insert($data);//入库定时拉取
  335. }
  336. //建站质检 中的 上线表格检查 点击完成 三天后在 SEO质检 中自动生成 上线前质检 任务,且任务时限为三天
  337. if (in_array($weekTaskInfo->cond_id, [67]) && $weekTaskInfo->status == 'ok' && !ScheduledTasks::query()->where(['cond_id' => 70, 'describe' => $weekTaskInfo->describe])->exists()) {
  338. //延时任务
  339. $data['user_type'] = 'wfp-exam';
  340. $data['type'] = 'now';
  341. $data['status'] = '';
  342. $data['day'] = 0;
  343. $data['cond_id'] = '70';
  344. unset($data['deadline']);
  345. ScheduledTasks::query()->insert($data);//入库定时拉取
  346. }
  347. //前端百千读取读取 触发 建站质检的百千还原度检查
  348. if (in_array($weekTaskInfo->cond_id, [74]) && $weekTaskInfo->status == 'ok' && !WeekTaskInfo::query()->where(['cond_id' => 75, 'describe' => $weekTaskInfo->describe])->exists()) {
  349. $data['user_type'] = 'wfp-site-exam';
  350. $data['type'] = 'now';
  351. $data['status'] = '';
  352. $data['day'] = 0;
  353. $data['cond_id'] = '75';
  354. $data['deadline'] = $dayList[1];
  355. WeekTaskInfo::query()->insert($data);
  356. }
  357. //接单关键词查询完成发送短信给销售
  358. if (in_array($weekTaskInfo->cond_id, [87]) && $weekTaskInfo->status == 'ok') {
  359. $result = GoogleTrendsKeyword::query()->where('keyword', $weekTaskInfo->describe)->first();
  360. if (!empty($result)) {
  361. //自动创建任务并发短信给优化
  362. $sendMessageService = new SendMessageService();
  363. $user = User::query()->where('id', $weekTaskInfo->duty_id)->first();
  364. if (!empty($user->phone)) {
  365. $sendMessageService->sendMessage($user->phone, $weekTaskInfo->describe ?? '', 2);
  366. }
  367. }
  368. }
  369. }
  370. }
  371. public function condItems(Request $request)
  372. {
  373. $condId = $request->input('condId');
  374. $taskItems = DB::table('week_task_items')->where(['cond_id' => $condId])->get()->toArray();
  375. return response()->json(['data' => $taskItems]);
  376. }
  377. public function del(Request $request)
  378. {
  379. $taskId = $request->input('taskId');
  380. $user = auth()->user();
  381. if (!in_array($user->role_id, [14, 27])) {
  382. WeekTaskInfo::query()->where(['id' => $taskId])->delete();
  383. return response()->json(['message' => '操作成功']);
  384. } else {
  385. return response()->json(['message' => '操作失败'], 400);
  386. }
  387. }
  388. public function release(Request $request)
  389. {
  390. $taskId = $request->input('taskId');
  391. $type = $request->input('type');
  392. WeekTaskInfo::query()->where(['id' => $taskId])->update(['user_type' => 'wfp-' . $type, 'day' => 0]);
  393. return response()->json(['message' => '操作成功']);
  394. }
  395. public function changeStatus(Request $request)
  396. {
  397. $taskId = $request->input('taskId');
  398. $statusType = $request->input('statusType');
  399. $type = $request->input('type');
  400. if ($statusType == 'ok') {
  401. //完成
  402. $update = ['status' => $statusType, 'type' => $type, 'complete' => date('Y-m-d H:i:s')];
  403. } else {
  404. $update = ['status' => $statusType, 'type' => $type, 'complete' => null];
  405. }
  406. $weekTaskInfo = WeekTaskInfo::query()->where(['id' => $taskId])->first();
  407. if (!empty($weekTaskInfo)) {
  408. WeekTaskInfo::query()->where(['id' => $taskId])->update($update);
  409. $this->createTask($taskId, 1);
  410. //通知后台邮箱
  411. $user = User::query()->where('id', $weekTaskInfo->user_type)->value('nickname') ?? '';
  412. $string = $user . ' 完成了 ' . '" ' . $weekTaskInfo->describe . ' "' . ' 这个任务';
  413. Mailbox::query()->insert(['message' => $string, 'user_id' => $weekTaskInfo->duty_id]);
  414. }
  415. return response()->json(['message' => '操作成功']);
  416. }
  417. //任务迁移
  418. public function migrate()
  419. {
  420. WeekTaskInfo::query()->where(['type' => 'now', 'status' => 'ok'])->delete();
  421. WeekTaskInfo::query()->where(['type' => 'now'])->whereNotIn('user_type', ['wfp-web', 'wfp-design', 'wfp-exam', 'wfp-site-exam', 'wfp-site', 'wfp-seo'])->update(['day' => 1]);
  422. WeekTaskInfo::query()->where(['type' => 'next'])->update(['type' => 'now']);
  423. return response()->json(['message' => '操作成功,清刷新当前任务的页面']);
  424. }
  425. //任务历史
  426. public function taskHistory(Request $request)
  427. {
  428. if (!$request->ajax()) {
  429. //采编、项目经理
  430. $userList = User::query()->where('status', 1)->whereIn('role_id', [2, 25, 26, 29])->get();
  431. $webList = User::query()->where('status', 1)->whereIn('role_id', [14, 27])->get();
  432. return view('admin/plan/task_history', [
  433. 'user' => $userList ?? [],
  434. 'web' => $webList,
  435. ]);
  436. }
  437. $pageSize = $request->input('pageSize') ?? TABLE_PAGE_SIZE;
  438. //$builder = WeekTaskHistory::query()->with(['designer', 'dutyMan', 'webMan']);
  439. $builder = WeekTaskHistory::query();
  440. if ($insertDate = $request->input('insert_date')) {
  441. $builder->whereDate('insert_date', '=', $insertDate);
  442. }
  443. if ($desc = $request->input('desc')) {
  444. $builder->where('describe', 'like', '%' . $desc . '%');
  445. }
  446. if ($user_type = $request->input('user_type')) {
  447. $builder->where('user_type', '=', $user_type);
  448. }
  449. if ($duty_id = $request->input('duty_id')) {
  450. $builder->where('duty_id', '=', $duty_id);
  451. }
  452. $articles = $builder->where($condition ?? [])->orderByDesc('id')
  453. ->paginate($pageSize);
  454. $items = $articles->items();
  455. $userList = User::query()->pluck('nickname', 'id');
  456. $roles = Role::query()->pluck('name', 'id');
  457. $mapCondScore = DB::table('week_task_cond')->pluck('score', 'id')->toArray();
  458. if ($insertDate && $user_type) {
  459. $totalScore = 0;
  460. } else {
  461. $totalScore = '';
  462. }
  463. $overdueList = [];
  464. $array = [];
  465. array_walk($items,
  466. function ($item) use (&$userList, &$mapCondScore, &$totalScore, &$insertDate, &$user_type, &$count, &$array, &$roles, &$overdueList) {
  467. if ($item->slices_number != 0) {
  468. $item->cond_name = $item->cond_name . '*' . $item->slices_number;
  469. }
  470. if (empty($item->cond_item_id)) {
  471. $item->cond_item_id = 0;
  472. }
  473. $item->beOverdueDay = '';
  474. if ($item->status !== 'ok' && $item->deadline && strtotime($item->deadline) < strtotime(date('Y-m-d'))) {
  475. $beOverdueDay = (strtotime(date('Y-m-d')) - strtotime($item->deadline)) / 3600 / 24;
  476. $item->beOverdueDay = '逾期' . round($beOverdueDay) . '天';
  477. /* $overdueList[] = [
  478. 'user_id' => $item->user_type ?? '',
  479. 'day' => $beOverdueDay,
  480. ];*/
  481. }
  482. $item->completeBeOverdueDay = '';
  483. if ($item->status == 'ok' && $item->complete && strtotime(date('Y-m-d', strtotime($item->complete))) > strtotime($item->deadline)) {
  484. $completeBeOverdueDay = (strtotime(date('Y-m-d', strtotime($item->complete))) - strtotime($item->deadline)) / 3600 / 24;
  485. $item->completeBeOverdueDay = '逾期' . round($completeBeOverdueDay) . '天';
  486. $overdueList[] = [
  487. 'user_id' => $item->user_type ?? '',
  488. 'day' => $completeBeOverdueDay,
  489. 'task' => $item->id,
  490. ];
  491. }
  492. $item->deadline = substr($item->deadline, 0, 10);
  493. //$item->complete = substr($item->complete, 0, 10);
  494. $item->cond_item_list = DB::table('week_task_items')->where('cond_id', $item->cond_id)->pluck('name', 'id')->toArray() ?? [];
  495. $item->username = $userList[$item->user_type] ?? '';
  496. $item->role_id = User::query()->where('id', $item->user_type)->first()->role_id ?? '';
  497. $item->role_type = $roles[$item->role_id] ?? '';
  498. $item->designerName = $userList[$item->design_id] ?? '';
  499. $item->dutyName = $userList[$item->duty_id] ?? '';
  500. $item->webName = $userList[$item->web_id] ?? '';
  501. $item->statusTitle = WeekTaskInfo::StatusMap[$item->status] ?? '';
  502. if ($item->status == 'ok' && $insertDate && $user_type) {
  503. //切片数量,没有默认为1
  504. if ($item->slices_number == 0) {
  505. $slicesNumber = 1;
  506. } else {
  507. $slicesNumber = $item->slices_number;
  508. }
  509. if ($item['cond_id'] == 16) {
  510. $totalScore = floatval(bcadd(($mapCondScore[$item['cond_id']] ?? 0) * $slicesNumber, $totalScore, 2));
  511. } else {
  512. $totalScore = floatval(bcadd($mapCondScore[$item['cond_id']] ?? 0, $totalScore, 2));
  513. }
  514. $array[] = $item->cond_id;
  515. }
  516. });
  517. if (!empty($array)) {
  518. //过滤null
  519. foreach ($array as $key => $v) {
  520. if (empty($v)) {
  521. $array[$key] = 15;
  522. }
  523. }
  524. $result = array_count_values($array);
  525. $list = [];
  526. foreach ($result as $key => $value) {
  527. $list[$key]['key'] = $key;
  528. $list[$key]['value'] = $value;
  529. }
  530. $condIdList = WeekTaskHistory::query()->groupBy('cond_id', 'cond_name')->pluck('cond_name', 'cond_id')->toArray();
  531. foreach ($list as $key => $value) {
  532. $list[$key]['cond'] = $condIdList[$value['key']];
  533. }
  534. $string = '';
  535. foreach ($list as $key => $value) {
  536. $string .= $value['cond'] . ':' . $value['value'] . ' ';
  537. }
  538. }
  539. $webs = User::query()->where('role_id', 14)->pluck('id')->toArray();
  540. $design = User::query()->where('role_id', 27)->pluck('id')->toArray();
  541. $webOverdueDay = 0;
  542. $webTask = 0;
  543. $designOverdueDay = 0;
  544. $designTask = 0;
  545. foreach ($overdueList as $value) {
  546. if (in_array($value['user_id'], $webs)) {
  547. $webOverdueDay += $value['day'];
  548. $webTask++;
  549. }
  550. if (in_array($value['user_id'], $design)) {
  551. $designOverdueDay += $value['day'];
  552. $designTask++;
  553. }
  554. }
  555. return response()->json([
  556. 'rows' => $items,
  557. 'total' => $articles->total(),
  558. 'totalScore' => $totalScore,
  559. 'listCount' => $string ?? '',
  560. 'webOverdueDay' => $webOverdueDay,
  561. 'webTask' => $webTask,
  562. 'designOverdueDay' => $designOverdueDay,
  563. 'designTask' => $designTask,
  564. ]);
  565. }
  566. public function historyExport(Request $request)
  567. {
  568. $request = $request->all();
  569. $builder = WeekTaskHistory::query();
  570. if (!empty($request['duty_id'])) {
  571. $builder->where('duty_id', $request['duty_id']);
  572. }
  573. if (!empty($request['user_type'])) {
  574. $builder->where('user_type', $request['user_type']);
  575. }
  576. if (!empty($request['desc'])) {
  577. $builder->where('describe', 'like', '%' . $request['desc'] . '%');
  578. }
  579. if (!empty($request['insert_date'])) {
  580. $builder->whereDate('insert_date', '=', $request['insert_date']);
  581. } else {
  582. $builder->whereDate('insert_date', '=', date("Y-m-d", strtotime("-1 day")));
  583. }
  584. $userList = User::query()->pluck('nickname', 'id');
  585. $roles = Role::query()->pluck('name', 'id');
  586. $items = $builder->orderByDesc('id')->get();
  587. $overdueList = [];
  588. foreach ($items as $item) {
  589. $item->beOverdueDay = '';
  590. if ($item->status !== 'ok' && $item->deadline && strtotime($item->deadline) < strtotime(date('Y-m-d'))) {
  591. $beOverdueDay = (strtotime(date('Y-m-d')) - strtotime($item->deadline)) / 3600 / 24;
  592. $item->beOverdueDay = '逾期' . round($beOverdueDay) . '天';
  593. }
  594. $item->completeBeOverdueDay = '';
  595. if ($item->status == 'ok' && $item->complete && strtotime(date('Y-m-d', strtotime($item->complete))) > strtotime($item->deadline)) {
  596. $completeBeOverdueDay = (strtotime(date('Y-m-d', strtotime($item->complete))) - strtotime($item->deadline)) / 3600 / 24;
  597. $item->completeBeOverdueDay = '逾期' . round($completeBeOverdueDay) . '天';
  598. $overdueList[] = [
  599. 'user_id' => $item->user_type ?? '',
  600. 'day' => $completeBeOverdueDay,
  601. 'task' => $item->id,
  602. ];
  603. }
  604. $item->deadline = substr($item->deadline, 0, 10);
  605. $item->username = $userList[$item->user_type] ?? '';
  606. $item->role_id = User::query()->where('id', $item->user_type)->first()->role_id ?? '';
  607. $item->role_type = $roles[$item->role_id] ?? '';
  608. $item->designerName = $userList[$item->design_id] ?? '';
  609. $item->dutyName = $userList[$item->duty_id] ?? '';
  610. $item->webName = $userList[$item->web_id] ?? '';
  611. $item->statusTitle = WeekTaskInfo::StatusMap[$item->status] ?? '';
  612. }
  613. $result = [];
  614. foreach ($items as $key => $item) {
  615. if ($item->status == 'ok') {
  616. $status = '完成';
  617. } else {
  618. $status = '未完成';
  619. }
  620. if ($item->check_score == 0) {
  621. $evaluation = '未评价';
  622. } elseif ($item->check_score == 1) {
  623. $evaluation = '非常满意';
  624. } elseif ($item->check_score == 2) {
  625. $evaluation = '满意';
  626. } elseif ($item->check_score == 3) {
  627. $evaluation = '一般';
  628. } else {
  629. $evaluation = '';
  630. }
  631. $data = [
  632. 'date' => $item->insert_date,
  633. 'user' => $userList[$item->user_type] ?? [],
  634. 'user_type' => $roles[$item->role_id] ?? '',
  635. 'describe' => $item->describe ?? '',
  636. 'dutyMan' => $item->dutyName ?? '',
  637. 'designerName' => $item->designerName ?? '',
  638. 'webMan' => $item->webName ?? '',
  639. 'cond_name' => $item->cond_name ?? '',
  640. 'deadline' => $item->deadline ?? '',
  641. 'remark' => $item->remark ?? '',
  642. 'beOverdueDay' => $item->beOverdueDay,
  643. 'status' => $status,
  644. 'complete' => $item->complete,
  645. 'completeBeOverdueDay' => $item->completeBeOverdueDay,
  646. 'evaluation' => $evaluation,
  647. ];
  648. $result[] = $data;
  649. }
  650. array_unshift($result, ['时间', '用户', '类型', '任务描述', '负责人', '设计', '前端', '检查类型', '截止时间', '备注', '逾期时长', '状态', '完成时间', '完成逾期时长', '检查反馈']);
  651. return (new BasicExport($result))->download(sprintf('任务历史记录%s.xls', date('YmdHis')));
  652. }
  653. public function historyUpdate(Request $request, $id)
  654. {
  655. $checkScore = $request->input('check_score');
  656. if (!$request->ajax()) {
  657. $weekTaskHistory = WeekTaskHistory::query()->where('id', $id)->first() ?? '';
  658. return view('admin/plan/task_history_update', [
  659. 'weekTaskHistory' => $weekTaskHistory,
  660. ]);
  661. }
  662. $result = WeekTaskHistory::query()->where('id', $id)->update(['check_score' => $checkScore]);
  663. if (!empty($result)) {
  664. return response()->json(['message' => '操作成功']);
  665. }
  666. }
  667. public function rank(Request $request, $type)
  668. {
  669. $userList = User::query()->where('role_id', $type)->where('status', 1)->pluck('nickname', 'id')->toArray();
  670. $userId = User::query()->where('role_id', $type)->where('status', 1)->value('id');
  671. if ($type == 14) {
  672. $auth = 'web';
  673. } else {
  674. $auth = 'design';
  675. }
  676. list($cond, $condList) = $this->getWeekTaskCondList($auth);
  677. $user = $request->input('user') ?? $userId;
  678. $date = $request->input('date') ?? date('Y-m');
  679. $userRank = [];
  680. foreach ($userList as $key => $item) {
  681. //这个月
  682. $thisMonth = $this->getSunday($date);
  683. list($thisMonth, $thisMonthSum) = $this->getRankList($thisMonth, $key, $condList, $cond, $userList);
  684. $data = [
  685. 'user' => $item,
  686. 'rank' => $thisMonthSum,
  687. ];
  688. $userRank[] = $data;
  689. }
  690. array_multisort(array_column($userRank, 'rank'), SORT_DESC, $userRank);
  691. //这个月
  692. $thisMonth = $this->getSunday($date);
  693. list($thisMonth, $thisMonthSum) = $this->getRankList($thisMonth, $user, $condList, $cond, $userList);
  694. return view('admin.plan.rank', [
  695. 'type' => $type,
  696. 'userList' => $userList,
  697. 'user' => $user,
  698. 'rank' => $userRank,
  699. 'date' => $date,
  700. 'list' => $thisMonth,
  701. ]);
  702. }
  703. public function getRankList($dateList, $user, $condList, $cond, $userList)
  704. {
  705. $result = [];
  706. foreach ($dateList as $key => $value) {
  707. $condition = [
  708. ['status', '=', 'ok'],
  709. ['user_type', '=', $user],
  710. ['insert_date', '=', $value],
  711. ];
  712. $historyList1 = WeekTaskHistory::query()
  713. ->select('cond_id', DB::raw('COUNT(id) as complete_total'), DB::raw('SUM(slices_number) as complete_slices_total'))
  714. ->whereIn('cond_id', $condList)
  715. ->where($condition)
  716. ->groupBy('cond_id')
  717. ->get()->toArray();
  718. $list1 = [];
  719. foreach ($historyList1 as $kk => $vv) {
  720. $list1[$vv['cond_id']] = $vv['complete_total'];
  721. }
  722. $list2 = [];
  723. foreach ($historyList1 as $kk => $vv) {
  724. $list2[$vv['cond_id']] = $vv['complete_slices_total'];
  725. }
  726. $condition = [
  727. ['user_type', '=', $user],
  728. ['insert_date', '=', $value],
  729. ];
  730. $historyList = WeekTaskHistory::query()
  731. ->select('cond_id', 'user_type', 'cond_name', 'insert_date', DB::raw('COUNT(id) as total'), DB::raw('SUM(slices_number) as slices_total'))
  732. ->whereIn('cond_id', $condList)
  733. ->where($condition)
  734. ->groupBy('cond_id', 'user_type', 'cond_name', 'insert_date')
  735. ->get()->toArray();
  736. foreach ($historyList as $kkk => $vvv) {
  737. $historyList[$kkk]['user'] = $userList[$vvv['user_type']] ?? '';
  738. $historyList[$kkk]['complete_total'] = $list1[$vvv['cond_id']] ?? 0;
  739. $historyList[$kkk]['complete_slices_total'] = $list2[$vvv['cond_id']] ?? 0;
  740. }
  741. $result[] = $historyList;
  742. }
  743. $res = [];
  744. foreach ($result as $key => $value) {
  745. foreach ($value as $kk => $vv) {
  746. $res[] = $vv;
  747. }
  748. }
  749. foreach ($cond as $key => $value) {
  750. $cond[$key]['user'] = '';
  751. $cond[$key]['complete_total'] = 0;
  752. $cond[$key]['complete_slices_total'] = 0;
  753. $cond[$key]['count'] = 0;
  754. $cond[$key]['end_date'] = '';
  755. $cond[$key]['slices_number'] = 0;
  756. foreach ($res as $kk => $vv) {
  757. if ($value['id'] == $vv['cond_id']) {
  758. $cond[$key]['user'] = $vv['user'];
  759. $cond[$key]['complete_total'] += $vv['complete_total'];
  760. $cond[$key]['complete_slices_total'] += $vv['complete_slices_total'];
  761. $cond[$key]['count'] += $vv['total'];
  762. $cond[$key]['end_date'] = $vv['insert_date'];
  763. $cond[$key]['slices_number'] += $vv['slices_total'];
  764. }
  765. }
  766. }
  767. $sum = 0;
  768. foreach ($cond as $key => $item) {
  769. $sum += ($item['score'] * $item['complete_total']);
  770. /* if ($item['id'] == 16) {
  771. $sum += ($item['score'] * $item['complete_slices_total']);
  772. } else {
  773. $sum += ($item['score'] * $item['complete_total']);
  774. }*/
  775. }
  776. return [$cond, $sum];
  777. }
  778. public function getSunday($month = '')
  779. {
  780. if (empty($month)) {
  781. $month = date("Y-m");
  782. }
  783. $maxDay = date('t', strtotime($month . "-01"));
  784. $mondays = array();
  785. for ($i = 1; $i <= $maxDay; $i++) {
  786. if (date('w', strtotime($month . "-" . $i)) == 0) {
  787. $mondays[] = $month . "-" . ($i > 9 ? '' : '0') . $i;
  788. }
  789. }
  790. if (count($mondays) > 4) {
  791. array_shift($mondays);
  792. }
  793. return $mondays;
  794. }
  795. public function getWeekTaskCondList($type = 'web')
  796. {
  797. $cond = DB::table('week_task_cond')
  798. ->where('type', $type)->get()->toJson();
  799. $cond = json_decode($cond, true) ?? [];
  800. $condList = DB::table('week_task_cond')
  801. ->where('type', $type)->pluck('id')->toArray() ?? [];
  802. return [$cond, $condList];
  803. }
  804. /**
  805. * 部门人员列表
  806. * @return array
  807. */
  808. public function getTaskByUserList()
  809. {
  810. $web = User::query()->where('status', 1)
  811. ->where('role_id', Role::TYPE_WEB)
  812. ->pluck('nickname', 'id')->toArray();
  813. $design = User::query()->where('status', 1)
  814. ->where('role_id', Role::TYPE_DESIGNER)
  815. ->pluck('nickname', 'id')->toArray();
  816. $exam = User::query()->where('status', 1)
  817. ->whereIn('role_id', [Role::TYPE_OPTIMIZER, Role::TYPE_MANAGE_HELPER])
  818. ->pluck('nickname', 'id')->toArray();
  819. $siteExam = User::query()->where('status', 1)
  820. ->where('role_id', Role::TYPE_QUALITY)
  821. ->pluck('nickname', 'id')->toArray();
  822. $site = User::query()->where('status', 1)
  823. ->whereIn('role_id', [Role::TYPE_MANAGE_HELPER, Role::TYPE_AE])
  824. ->pluck('nickname', 'id')->toArray();
  825. $seo = User::query()->where('status', 1)
  826. ->whereIn('role_id', [Role::TYPE_OPTIMIZER, Role::TYPE_OPTIMIZATION_EDITING])
  827. ->pluck('nickname', 'id')->toArray();
  828. $web['wfp-web'] = '未分配';
  829. $design['wfp-design'] = '未分配';
  830. $exam['wfp-exam'] = '未分配';
  831. $siteExam['wfp-site-exam'] = '未分配';
  832. $site['wfp-site'] = '未分配';
  833. $seo['wfp-seo'] = '未分配';
  834. ksort($web);
  835. ksort($design);
  836. ksort($exam);
  837. ksort($siteExam);
  838. ksort($site);
  839. ksort($seo);
  840. //负责人
  841. $allUserList = User::query()
  842. ->where('status', 1)
  843. ->whereIn('role_id', [1, 2, 6, 16, 17, 18, 25, 26, 29, 30, 32])
  844. ->orderBy('role_id', 'asc')
  845. ->pluck('nickname', 'id')->toArray();
  846. $allUserList[0] = '未分配';
  847. ksort($allUserList);
  848. return [$web, $design, $exam, $siteExam, $site, $seo, $allUserList];
  849. }
  850. public function getDay()
  851. {
  852. //筛选出最近2个礼拜的时间排除周末
  853. $days = 12;
  854. $dayList = [];
  855. for ($i = 1; $i <= $days; $i++) {
  856. $day = date('Y-m-d', strtotime(date('Y-m-d')) + 86400 * $i);
  857. $result = $this->isWeekend($day);
  858. if (!$result) {
  859. $dayList[] = $day;
  860. }
  861. }
  862. return $dayList;
  863. }
  864. public function isWeekend($date)
  865. {
  866. if ((date('w', strtotime($date)) == 6) || (date('w', strtotime($date)) == 0)) {
  867. return true;
  868. } else {
  869. return false;
  870. }
  871. }
  872. function getWeek($time, $format = "Y-m-d")
  873. {
  874. //最近一个礼拜的日期
  875. $week = date('w', $time);
  876. $weekList = array('星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六');
  877. //星期日排到末位
  878. if (empty($week)) {
  879. $week = 7;
  880. }
  881. $data = [];
  882. for ($i = 0; $i <= 6; $i++) {
  883. $day = '+' . ($i + 1 - $week - 1) . ' days';
  884. $data[$i]['date'] = date($format, strtotime($day, $time));
  885. $data[$i]['week'] = $weekList[$i];
  886. }
  887. return $data;
  888. }
  889. }