TaskLogic.php 4.2 KB
<?php

namespace App\Http\Logic\Aside\Task;


use App\Helper\Arr;
use App\Http\Logic\Aside\BaseLogic;
use App\Http\Logic\Aside\LoginLogic;
use App\Http\Logic\Aside\Manage\ManageLogic;
use App\Models\Task\Task;
use App\Models\Task\TaskOwner;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;

/**
 * Class TaskLogic
 * @package App\Http\Logic\Aside\Task
 * @author zbj
 * @date 2023/4/27
 */
class TaskLogic extends BaseLogic
{
    public function __construct()
    {
        parent::__construct();

        $this->model = new Task();
    }


    public function getUserlist(array $map = [], array $sort = ['id' => 'desc'], array $columns = ['*'], int $limit = 20){
        $where = array_map(function ($v) {
            if(!Str::startsWith($v[0], 'gto.')) {
                $v[0] = 'gl_task.' . $v[0];
            }
            return $v;
        }, $map);
        $data = $this->formatQuery($where)->leftJoin('gl_task_owner as gto', 'gl_task.id', '=', 'gto.task_id')
            ->select('gto.manage_id', DB::raw('COUNT(*) as count'))
            ->groupBy('gto.manage_id')
            ->paginate($limit)->toArray();
        $list = [];
        $map = array_map(function ($v) {
            if(!Str::startsWith($v[0], 'gto.')) {
                return $v;
            }
            return [];
        }, $map);
        $map = array_filter($map);
        foreach ($data['list'] as $v){
            $ids = TaskOwner::where('manage_id', $v['manage_id'])->pluck('task_id')->toArray();
            $list[] = [
                "manage_id" => $v['manage_id'],
                "manage_id_text" => (new ManageLogic)->getCacheName($v['manage_id']),
                "count" => $v['count'],
                "task_list" => $this->model->list(['id'=>['in',$ids]]),
            ];
        }
        return $this->success($list);
    }


    public function getTaskInfo($id)
    {
        $info = $this->model->where(['id'=>$id])->with('owner')->with('follow')->first();
        return $this->success($info);
    }

    public function save($param){

        DB::beginTransaction();
        try {
            $res = parent::save($param);
            $data['task_id'] = $res['id'];
            //支持分配多人
            $owner = Arr::splitFilterToArray($param['owner']);
            foreach ($owner as $manage_id){
                $data['manage_ids'][] = $manage_id;
                (new TaskOwnerLogic)->save($data);
            }
            DB::commit();
        }catch (\Exception $e){
            DB::rollBack();
            errorLog('工单保存失败', $param, $e);
            $this->fail('保存失败');
        }
        return $this->success();
    }

    /**
     * 修改状态
     * @param $param
     * @return array
     * @throws \App\Exceptions\AsideGlobalException
     * @throws \App\Exceptions\BsideGlobalException
     * @author zbj
     * @date 2023/4/27
     */
    public function status($id, $status){
        $task = $this::getInfo($id);
        if(!$task){
            $this->fail('任务不存在');
        }
        $manage_ids = Arr::pluck($task['owner'], 'manage_id', 'id');
        if(!in_array(LoginLogic::manage('id'), $manage_ids)){
            $this->fail('非本人任务,不能更新进程');
        }
        $task_data = [
            'id' => $id,
            'status' => $status,
        ];

        //个人任务
        $task_owner_id = array_search(LoginLogic::manage('id'), $manage_ids);
        (new TaskOwnerLogic())->status($task_owner_id, $status);

        //一个人开始,任务开始,所有人完成,任务才完成
        $owner_status = TaskOwner::where('task_id', $id)->pluck('status')->toArray();
        //所有都完成
        if(array_sum($owner_status) == count($owner_status) * TaskOwner::STATUS_DOWN){
            $task_data['status'] = Task::STATUS_DOWN;
            $task_data['done_at'] = date('Y-m-d H:i:s');
        }else{
            $task_data['status'] = Task::STATUS_DONGING;
            $task_data['doing_at'] = date('Y-m-d H:i:s');
        }

        parent::save($task_data);
        return $this->success();
    }

    public function clearCache($id)
    {
        parent::clearCache($id);

        parent::setWith(['owner', 'follow']);
        parent::clearCache($id);
    }
}