| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 | <?php/** * Created by PhpStorm. * User: Administrator * Date: 2019/4/29 0029 * Time: 17:16 */namespace App\Http\Logics\Admin;use App\Http\Models\Link;use App\Http\Models\LinkTask;use App\Http\Models\LinkTaskDetail;use App\Http\Models\LinkTaskUrl;use App\Http\Models\User;use \Illuminate\Database\Eloquent\Builder;use Illuminate\Http\Request;use Illuminate\Support\Facades\Auth;use Illuminate\Support\Facades\DB;class LinkLogic{    protected $request;    public function __construct(Request $request)    {        $this->request = $request;    }    public function taskFilters($inputs): Builder    {        $builder = LinkTask::query()->scopes(['user']);        !empty($inputs['siteId']) && $filters[] = ['site_id', '=', $inputs['siteId']];        !empty($inputs['keyword']) && $filters[] = ['url', 'like', '%' . $inputs['keyword'] . '%'];        !empty($inputs['status']) && $filters[] = ['status', '=', $inputs['status']];        return $builder->where($filters ?? []);    }    public function taskItemsTransform($items)    {        array_walk($items, function ($item) {            $item->typeTitle = $item->type_title;            $item->worker_name = $item->worker->username ?? '';            $item->site_title = $item->site->cn_title ?? '';            $item->status_title = $item->status_with_css;        });        return $items;    }    public function demo(Request $request)    {        return $this->request->input();    }    public function syncLinkTasksUrl($urls, $linkTaskDetailId)    {        $ids = array_column($urls, 'id');        $linkUrlIds = LinkTaskUrl::query()->where(['link_tasks_detail_id' => $linkTaskDetailId])->pluck('id')->toArray();        $diff = array_diff($linkUrlIds, $ids);        if ($diff) LinkTaskUrl::destroy($diff);        $insert = [];        foreach ($urls as $item) {            if (!$item['id']) {                $insert[] = ['link_tasks_detail_id' => $linkTaskDetailId, 'url' => $item['url'], 'created_at' => date('Y-m-d H:i:s')];            } else {                LinkTaskUrl::query()->where(['id' => $item['id']])->update(['url' => $item['url']]);            }        }        if ($insert) {            LinkTaskUrl::query()->insert($insert);        }        return response()->json(['message' => '操作成功']);    }    /**     * 条件查询过滤 构造器     * @param $inputs     * @return Builder     */    public function calcFilter($inputs): Builder    {        $builder = LinkTask::query();        !empty($inputs['start_at']) && $filters[] = ['audit_at', '>=', $inputs['start_at']];        !empty($inputs['end_at']) && $filters[] = ['audit_at', '<=', $inputs['end_at']];        return $builder->where($filters ?? [])->whereHas('worker', function (Builder $query) use ($inputs) {            if (!empty($inputs['keyword'])) {                $query->where('username', 'like', '%' . $inputs['keyword'] . '%');            }        });    }    /**     * 返回兼职人员作为键值 URL数量的数组     * @param $items     * @return array     *///    public function calc($items)//    {//        //work => task => detail => url//        $workerIdMapTaskIdsStr = array_column($items, 'task_ids', 'worker_id'); //获取兼职人员与任务ids的映射////        $taskIds = explode(',', implode(',', array_column($items, 'task_ids'))); //获取符合条件的所有任务id////        $taskDetailRecords = LinkTaskDetail::query()->whereIn('task_id', $taskIds)->get(); //获取与人物关联的任务详情记录////        $DetailIdMapTaskId = $taskDetailRecords->pluck('task_id', 'id')->toArray(); //获取link_tasks_detail_id与task_id的映射////        $workerIdMapDetailId = []; // 处理workerId 与 link_tasks_detail_id 映射//        foreach ($workerIdMapTaskIdsStr as $workerId => $taskIdsStr) {//            $tempTaskIds = explode(',', $taskIdsStr);//            foreach ($DetailIdMapTaskId as $detailId => $taskId) {//                if (in_array($taskId, $tempTaskIds)) {//                    $workerIdMapDetailId[$workerId][] = $detailId;//                }//            }//        }//        //获取演示地址url 审核通过的//        $taskUrls = LinkTaskUrl::query()->where(['status' => 5])->whereIn('link_tasks_detail_id', $taskDetailRecords->pluck('id')->toArray())//            ->get()->groupBy('link_tasks_detail_id');//        $workerMapUrl = []; //work_id与url数量的映射//        $detailIdMapWorkerId = $this->arrayFlip($workerIdMapDetailId);//        foreach ($taskUrls as $link_tasks_detail_id => $urls) {//            /**@var \Illuminate\Database\Eloquent\Collection $urls */ //将同一个workId数量累计//            $workerMapUrl[$detailIdMapWorkerId[$link_tasks_detail_id]] = $urls->count() + ($workerMapUrl[$detailIdMapWorkerId[$link_tasks_detail_id]] ?? 0);//        }//        return $workerMapUrl;//    }    /**     * 键值互换     * @param $slices     * @return array     */    public function arrayFlip($slices)    {        $result = [];        foreach ($slices as $key => $slice) {            foreach ($slice as $item) {                $result[$item] = $key;            }        }        return $result;    }    public function calcHistoryFilter($inputs, $filters): Builder    {        $builder = LinkTask::query()->whereHas('worker', function (Builder $builder) use ($inputs) {            if ($inputs['keyword']) {                $builder->where('username', 'like', '%' . $inputs['keyword'] . '%');            }        });        !empty($inputs['start_at']) && $filters[] = ['audit_at', '>=', $inputs['start_at']];        !empty($inputs['end_at']) && $filters[] = ['audit_at', '<=', $inputs['end_at']];        $builder->where($filters);        return $builder;    }    public function taskSave($linkTaskId, $taskValidated, $linkIds, &$groupId, $releaseAt = null)    {        $taskValidated['optimize_page_ids']=is_array($taskValidated['optimize_page_ids'])?json_encode($taskValidated['optimize_page_ids']):null;        if ($linkTaskId == 0) { //添加            $taskValidated['creator_id'] = Auth::id();            $taskValidated['status'] = empty($taskValidated['worker_id']) ? 1 : 2; //待分配或任务中        }        $taskValidated['expired_at'] = date('Y-m-d H:i:s', strtotime('+1 day'));        if ($linkTaskId > 0) {            $result = LinkTask::query()->where(['id' => $linkTaskId])->first();            if (!$result) {                return response()->json(['message' => '信息不存在'], 400);            }            $result->update($taskValidated);            /**@var \Illuminate\Database\Eloquent\Model|object|static|null $result */        } else {            if ($groupId > 0) { //后面的几个任务 //只针对批量发布时间的                $taskValidated['group_id'] = $groupId;                $taskValidated['release_at'] = $releaseAt;                $taskValidated['title'] =$taskValidated['title'].'-'.date('Ymd',strtotime($releaseAt));            }            $result = LinkTask::query()->create($taskValidated);            if ($groupId == 0) {//第一次是 0 //只针对批量发布时间的                $groupId = $result->id;                $result->update(['group_id' => $groupId,'release_at'=>$releaseAt,'title'=>$taskValidated['title'].'-'.date('Ymd',strtotime($releaseAt))]);            }            /**@var \Illuminate\Database\Eloquent\Model|object|static|null $result */        }        //获取审核通过的外链detail 的账号密码邮箱等信息 赋值给最新分配的 外链detail        $LinkTaskDetailIdMapList = LinkTaskDetail::query()->selectRaw('username,email,password,url,link_id')            ->whereIn('link_id', $linkIds)            ->where(['redundant_site_id' => $result->site_id, 'status' => 5, 'enable' => 1])//            ->whereNotExists(function (Builder $builder) {//                $builder->select(DB::raw(1))->from('link_tasks')//                    ->whereRaw('link_tasks_detail.task_id=link_tasks.id AND (link_tasks.status in (4) OR link_tasks.deleted_at is not null)');//            })            ->get()->keyBy('link_id')->toArray();        $linkMap = Link::query()->whereIn('id', $linkIds)->get()->keyBy('id')->toArray();        $relateTaskDetail = [];        foreach ($linkIds as $linkId) {            $relateTaskDetail[$linkId] = ($LinkTaskDetailIdMapList[$linkId] ?? []) + [                    'redundant_site_id' => $result->site_id,                    'status' => 3,//status 3 待处理                    'enable' => 1,                    'link_type' => Link::TYPES[($linkMap[$linkId]['type'] ?? 0)] ?? '',                    'link_url' => $linkMap[$linkId]['url'] ?? '',                ];        }        $result->links()->sync($relateTaskDetail);        return null;    }}
 |