LinkLogic.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Administrator
  5. * Date: 2019/4/29 0029
  6. * Time: 17:16
  7. */
  8. namespace App\Http\Logics\Admin;
  9. use App\Http\Models\Link;
  10. use App\Http\Models\LinkTask;
  11. use App\Http\Models\LinkTaskDetail;
  12. use App\Http\Models\LinkTaskUrl;
  13. use App\Http\Models\User;
  14. use \Illuminate\Database\Eloquent\Builder;
  15. use Illuminate\Http\Request;
  16. use Illuminate\Support\Facades\Auth;
  17. use Illuminate\Support\Facades\DB;
  18. class LinkLogic
  19. {
  20. protected $request;
  21. public function __construct(Request $request)
  22. {
  23. $this->request = $request;
  24. }
  25. public function taskFilters($inputs): Builder
  26. {
  27. $builder = LinkTask::query()->scopes(['user']);
  28. !empty($inputs['siteId']) && $filters[] = ['site_id', '=', $inputs['siteId']];
  29. !empty($inputs['keyword']) && $filters[] = ['url', 'like', '%' . $inputs['keyword'] . '%'];
  30. !empty($inputs['status']) && $filters[] = ['status', '=', $inputs['status']];
  31. return $builder->where($filters ?? []);
  32. }
  33. public function taskItemsTransform($items)
  34. {
  35. array_walk($items, function ($item) {
  36. $item->typeTitle = $item->type_title;
  37. $item->worker_name = $item->worker->username ?? '';
  38. $item->site_title = $item->site->cn_title ?? '';
  39. $item->status_title = $item->status_with_css;
  40. });
  41. return $items;
  42. }
  43. public function demo(Request $request)
  44. {
  45. return $this->request->input();
  46. }
  47. public function syncLinkTasksUrl($urls, $linkTaskDetailId)
  48. {
  49. $ids = array_column($urls, 'id');
  50. $linkUrlIds = LinkTaskUrl::query()->where(['link_tasks_detail_id' => $linkTaskDetailId])->pluck('id')->toArray();
  51. $diff = array_diff($linkUrlIds, $ids);
  52. if ($diff) LinkTaskUrl::destroy($diff);
  53. $insert = [];
  54. foreach ($urls as $item) {
  55. if (!$item['id']) {
  56. $insert[] = ['link_tasks_detail_id' => $linkTaskDetailId, 'url' => $item['url'], 'created_at' => date('Y-m-d H:i:s')];
  57. } else {
  58. LinkTaskUrl::query()->where(['id' => $item['id']])->update(['url' => $item['url']]);
  59. }
  60. }
  61. if ($insert) {
  62. LinkTaskUrl::query()->insert($insert);
  63. }
  64. return response()->json(['message' => '操作成功']);
  65. }
  66. /**
  67. * 条件查询过滤 构造器
  68. * @param $inputs
  69. * @return Builder
  70. */
  71. public function calcFilter($inputs): Builder
  72. {
  73. $builder = LinkTask::query();
  74. !empty($inputs['start_at']) && $filters[] = ['audit_at', '>=', $inputs['start_at']];
  75. !empty($inputs['end_at']) && $filters[] = ['audit_at', '<=', $inputs['end_at']];
  76. return $builder->where($filters ?? [])->whereHas('worker', function (Builder $query) use ($inputs) {
  77. if (!empty($inputs['keyword'])) {
  78. $query->where('username', 'like', '%' . $inputs['keyword'] . '%');
  79. }
  80. });
  81. }
  82. /**
  83. * 返回兼职人员作为键值 URL数量的数组
  84. * @param $items
  85. * @return array
  86. */
  87. // public function calc($items)
  88. // {
  89. // //work => task => detail => url
  90. // $workerIdMapTaskIdsStr = array_column($items, 'task_ids', 'worker_id'); //获取兼职人员与任务ids的映射
  91. //
  92. // $taskIds = explode(',', implode(',', array_column($items, 'task_ids'))); //获取符合条件的所有任务id
  93. //
  94. // $taskDetailRecords = LinkTaskDetail::query()->whereIn('task_id', $taskIds)->get(); //获取与人物关联的任务详情记录
  95. //
  96. // $DetailIdMapTaskId = $taskDetailRecords->pluck('task_id', 'id')->toArray(); //获取link_tasks_detail_id与task_id的映射
  97. //
  98. // $workerIdMapDetailId = []; // 处理workerId 与 link_tasks_detail_id 映射
  99. // foreach ($workerIdMapTaskIdsStr as $workerId => $taskIdsStr) {
  100. // $tempTaskIds = explode(',', $taskIdsStr);
  101. // foreach ($DetailIdMapTaskId as $detailId => $taskId) {
  102. // if (in_array($taskId, $tempTaskIds)) {
  103. // $workerIdMapDetailId[$workerId][] = $detailId;
  104. // }
  105. // }
  106. // }
  107. // //获取演示地址url 审核通过的
  108. // $taskUrls = LinkTaskUrl::query()->where(['status' => 5])->whereIn('link_tasks_detail_id', $taskDetailRecords->pluck('id')->toArray())
  109. // ->get()->groupBy('link_tasks_detail_id');
  110. // $workerMapUrl = []; //work_id与url数量的映射
  111. // $detailIdMapWorkerId = $this->arrayFlip($workerIdMapDetailId);
  112. // foreach ($taskUrls as $link_tasks_detail_id => $urls) {
  113. // /**@var \Illuminate\Database\Eloquent\Collection $urls */ //将同一个workId数量累计
  114. // $workerMapUrl[$detailIdMapWorkerId[$link_tasks_detail_id]] = $urls->count() + ($workerMapUrl[$detailIdMapWorkerId[$link_tasks_detail_id]] ?? 0);
  115. // }
  116. // return $workerMapUrl;
  117. // }
  118. /**
  119. * 键值互换
  120. * @param $slices
  121. * @return array
  122. */
  123. public function arrayFlip($slices)
  124. {
  125. $result = [];
  126. foreach ($slices as $key => $slice) {
  127. foreach ($slice as $item) {
  128. $result[$item] = $key;
  129. }
  130. }
  131. return $result;
  132. }
  133. public function calcHistoryFilter($inputs, $filters): Builder
  134. {
  135. $builder = LinkTask::query()->whereHas('worker', function (Builder $builder) use ($inputs) {
  136. if ($inputs['keyword']) {
  137. $builder->where('username', 'like', '%' . $inputs['keyword'] . '%');
  138. }
  139. });
  140. !empty($inputs['start_at']) && $filters[] = ['audit_at', '>=', $inputs['start_at']];
  141. !empty($inputs['end_at']) && $filters[] = ['audit_at', '<=', $inputs['end_at']];
  142. $builder->where($filters);
  143. return $builder;
  144. }
  145. public function taskSave($linkTaskId, $taskValidated, $linkIds, &$groupId, $releaseAt = null)
  146. {
  147. $taskValidated['optimize_page_ids']=is_array($taskValidated['optimize_page_ids'])?json_encode($taskValidated['optimize_page_ids']):null;
  148. if ($linkTaskId == 0) { //添加
  149. $taskValidated['creator_id'] = Auth::id();
  150. $taskValidated['status'] = empty($taskValidated['worker_id']) ? 1 : 2; //待分配或任务中
  151. }
  152. $taskValidated['expired_at'] = date('Y-m-d H:i:s', strtotime('+1 day'));
  153. if ($linkTaskId > 0) {
  154. $result = LinkTask::query()->where(['id' => $linkTaskId])->first();
  155. if (!$result) {
  156. return response()->json(['message' => '信息不存在'], 400);
  157. }
  158. $result->update($taskValidated);
  159. /**@var \Illuminate\Database\Eloquent\Model|object|static|null $result */
  160. } else {
  161. if ($groupId > 0) { //后面的几个任务 //只针对批量发布时间的
  162. $taskValidated['group_id'] = $groupId;
  163. $taskValidated['release_at'] = $releaseAt;
  164. $taskValidated['title'] =$taskValidated['title'].'-'.date('Ymd',strtotime($releaseAt));
  165. }
  166. $result = LinkTask::query()->create($taskValidated);
  167. if ($groupId == 0) {//第一次是 0 //只针对批量发布时间的
  168. $groupId = $result->id;
  169. $result->update(['group_id' => $groupId,'release_at'=>$releaseAt,'title'=>$taskValidated['title'].'-'.date('Ymd',strtotime($releaseAt))]);
  170. }
  171. /**@var \Illuminate\Database\Eloquent\Model|object|static|null $result */
  172. }
  173. //获取审核通过的外链detail 的账号密码邮箱等信息 赋值给最新分配的 外链detail
  174. $LinkTaskDetailIdMapList = LinkTaskDetail::query()->selectRaw('username,email,password,url,link_id')
  175. ->whereIn('link_id', $linkIds)
  176. ->where(['redundant_site_id' => $result->site_id, 'status' => 5, 'enable' => 1])
  177. // ->whereNotExists(function (Builder $builder) {
  178. // $builder->select(DB::raw(1))->from('link_tasks')
  179. // ->whereRaw('link_tasks_detail.task_id=link_tasks.id AND (link_tasks.status in (4) OR link_tasks.deleted_at is not null)');
  180. // })
  181. ->get()->keyBy('link_id')->toArray();
  182. $linkMap = Link::query()->whereIn('id', $linkIds)->get()->keyBy('id')->toArray();
  183. $relateTaskDetail = [];
  184. foreach ($linkIds as $linkId) {
  185. $relateTaskDetail[$linkId] = ($LinkTaskDetailIdMapList[$linkId] ?? []) + [
  186. 'redundant_site_id' => $result->site_id,
  187. 'status' => 3,//status 3 待处理
  188. 'enable' => 1,
  189. 'link_type' => Link::TYPES[($linkMap[$linkId]['type'] ?? 0)] ?? '',
  190. 'link_url' => $linkMap[$linkId]['url'] ?? '',
  191. ];
  192. }
  193. $result->links()->sync($relateTaskDetail);
  194. return null;
  195. }
  196. }