<?php
// +----------------------------------------------------------------------
// | Description: 消息模块
// +----------------------------------------------------------------------
// | Author: Michael_xu | gengxiaoxu@5kcrm.com 
// +----------------------------------------------------------------------

namespace app\crm\controller;

use app\admin\controller\ApiCommon;
use app\crm\logic\InvoiceLogic;
use app\crm\logic\MessageLogic;
use think\Cache;
use think\cache\driver\Redis;
use think\Db;
use think\Hook;
use think\Request;

class Message extends ApiCommon
{
    /**
     * 用于判断权限
     * @permission 无限制
     * @allow 登录用户可访问
     * @other 其他根据系统设置
     **/
    public function _initialize()
    {
        $action = [
            'permission' => [],
            'allow' => [
                'num',
                'todayleads',
                'todaycustomer',
                'todaybusiness',
                'followleads',
                'followcustomer',
                'checkcontract',
                'checkreceivables',
                'remindreceivablesplan',
                'endcontract',
                'remindcustomer',
                'checkinvoice',
                'visitcontract',
                'alldeal',
                'checkBusiness',
                'newBusiness',
                'checkCustomerCheck',
            ]
        ];
        Hook::listen('check_auth', $action);
        $request = Request::instance();
        $a = strtolower($request->action());
        if (!in_array($a, $action['permission'])) {
            parent::_initialize();
        }
    }

    /**
     * 系统通知
     *
     * @return
     * @author Michael_xu
     */
    public function index()
    {
        $messageModel = model('Message');
        $param = $this->param;
        $userInfo = $this->userInfo;
        $param['user_id'] = $userInfo['id'];
        $param['module_name'] = 'crm';
        $data = $messageModel->getDataList($param);
        return resultArray(['data' => $data]);
    }

    /**
     * 消息数
     *
     * @return \think\response\Json
     * @throws \think\exception\DbException
     */
    public function num()
    {
        $userInfo = $this->userInfo;
        $configDataModel = model('ConfigData');
        $configData = $configDataModel->getData();
        $data = [];
        # 今日需联系线索
        $todayLeadsTime = cache('todayLeadsTime' . $userInfo['id']);
        $todayLeadsCount = cache('todayLeadsCount' . $userInfo['id']);
        if (time() <= $todayLeadsTime) {
            $data['todayLeads'] = (int)$todayLeadsCount;
        } else {
            $todayLeads = $this->todayLeads(true);
            $data['todayLeads'] = $todayLeads['dataCount'] ?: 0;
            cache('todayLeadsCount' . $userInfo['id'], $data['todayLeads']);
            cache('todayLeadsTime' . $userInfo['id'], time());
        }
        # 今日需联系客户
        $todayCustomerTime = cache('todayCustomerTime' . $userInfo['id']);
        $todayCustomerCount = cache('todayCustomerCount' . $userInfo['id']);
        if (time() <= $todayCustomerTime) {
            $data['todayCustomer'] = (int)$todayCustomerCount;
        } else {
            $todayCustomer = $this->todayCustomer(true);
            $data['todayCustomer'] = $todayCustomer['dataCount'] ?: 0;
            cache('todayCustomerCount' . $userInfo['id'], $data['todayCustomer']);
            cache('todayCustomerTime' . $userInfo['id'], time());
        }
        # 今日需联系商机
        $todayBusinessTime = cache('todayBusinessTime' . $userInfo['id']);
        $todayBusinessCount = cache('todayBusinessCount' . $userInfo['id']);
        if (time() <= $todayBusinessTime) {
            $data['todayBusiness'] = (int)$todayBusinessCount;
        } else {
            $todayBusiness = $this->todayBusiness(true);
            $data['todayBusiness'] = $todayBusiness['dataCount'] ?: 0;
            cache('todayBusinessCount' . $userInfo['id'], $data['todayBusiness']);
            cache('todayBusinessTime' . $userInfo['id'], time());
        }
        # 分配给我的线索
        $followLeadsTime = cache('followLeadsTime' . $userInfo['id']);
        $followLeadsCount = cache('followLeadsCount' . $userInfo['id']);
        if (time() <= $followLeadsTime) {
            $data['followLeads'] = (int)$followLeadsCount;
        } else {
            $followLeads = $this->followLeads(true);
            $data['followLeads'] = $followLeads['dataCount'] ?: 0;
            cache('followLeadsCount' . $userInfo['id'], $data['followLeads']);
            cache('followLeadsTime' . $userInfo['id'], time());
        }
        # 分配给我的客户
        $followCustomerTime = cache('followCustomerTime' . $userInfo['id']);
        $followCustomerCount = cache('followCustomerCount' . $userInfo['id']);
        if (time() <= $followCustomerTime) {
            $data['followCustomer'] = (int)$followCustomerCount;
        } else {
            $followCustomer = $this->followCustomer(true);
            $data['followCustomer'] = $followCustomer['dataCount'] ?: 0;
            cache('followCustomerCount' . $userInfo['id'], $data['followCustomer']);
            cache('followCustomerTime' . $userInfo['id'], time());
        }
        # 待审核合同
        $checkContractTime = cache('checkContractTime' . $userInfo['id']);
        $checkContractCount = cache('checkContractCount' . $userInfo['id']);
        if (time() <= $checkContractTime) {
            $data['checkContract'] = (int)$checkContractCount;
        } else {
            $checkContract = $this->checkContract(true);
            $data['checkContract'] = $checkContract['dataCount'] ?: 0;
            cache('checkContractCount' . $userInfo['id'], $data['checkContract']);
            cache('checkContractTime' . $userInfo['id'], time());
        }
        # 待审核回款
        $checkReceivablesTime = cache('checkReceivablesTime' . $userInfo['id']);
        $checkReceivablesCount = cache('checkReceivablesCount' . $userInfo['id']);
        if (time() <= $checkReceivablesTime) {
            $data['checkReceivables'] = (int)$checkReceivablesCount;
        } else {
            $checkReceivables = $this->checkReceivables(true);
            $data['checkReceivables'] = $checkReceivables['dataCount'] ?: 0;
            cache('checkReceivablesCount' . $userInfo['id'], $data['checkReceivables']);
            cache('checkReceivablesTime' . $userInfo['id'], time());
        }
        # 待审核发票
        $checkInvoiceTime = cache('checkInvoiceTime' . $userInfo['id']);
        $checkInvoiceCount = cache('checkInvoiceCount' . $userInfo['id']);
        if (time() <= $checkInvoiceTime) {
            $data['checkInvoice'] = (int)$checkInvoiceCount;

        } else {
            $checkInvoice = $this->checkInvoice(true);
            $data['checkInvoice'] = $checkInvoice['dataCount'] ?: 0;

            cache('checkInvoiceCount' . $userInfo['id'], $data['checkInvoice']);
            cache('checkInvoiceTime' . $userInfo['id'], time());
        }
        # 待审核商机
        $checkBusinessTime = cache('checkBusinessTime' . $userInfo['id']);
        $checkBusinessCount = cache('checkBusinessCount' . $userInfo['id']);
        if (time() <= $checkBusinessTime) {
            $data['checkBusiness'] = (int)$checkBusinessCount;

        } else {
            $checkBusiness = $this->checkBusiness(true);
            $data['checkBusiness'] = $checkBusiness['dataCount'] ?: 0;

            cache('checkBusinessCount' . $userInfo['id'], $data['checkBusiness']);
            cache('checkBusinessTime' . $userInfo['id'], time());
        }
        # 待审核客户捞取
        $checkCustomerCheckTime = cache('$checkCustomerCheckTime' . $userInfo['id']);
        $checkCustomerCheckCount = cache('checkCustomerCheckCount' . $userInfo['id']);
        if (time() <= $checkCustomerCheckTime) {
            $data['checkCustomerCheck'] = (int)$checkCustomerCheckCount;

        } else {
            $checkCustomerCheck = $this->checkCustomerCheck(true);
            $data['checkCustomerCheck'] = $checkCustomerCheck['dataCount'] ?: 0;

            cache('checkCustomerCheckCount' . $userInfo['id'], $data['checkCustomerCheck']);
            cache('$checkCustomerCheckTime' . $userInfo['id'], time());
        }
        # 待回款提醒
        $remindReceivablesPlanTime = cache('remindReceivablesPlanTime' . $userInfo['id']);
        $remindReceivablesPlanCount = cache('remindReceivablesPlanCount' . $userInfo['id']);
        if (time() <= $remindReceivablesPlanTime) {
            $data['remindReceivablesPlan'] = (int)$remindReceivablesPlanCount;
        } else {
            $remindReceivablesPlan = $this->remindReceivablesPlan(true);
            $data['remindReceivablesPlan'] = $remindReceivablesPlan['dataCount'] ?: 0;
            cache('remindReceivablesPlanCount' . $userInfo['id'], $data['remindReceivablesPlan']);
            cache('remindReceivablesPlanTime' . $userInfo['id'], time());
        }
        if ($configData['visit_config'] == 1) {
            # 待回访合同
            $visitContractTime = cache('visitContractTime' . $userInfo['id']);
            $visitContractCount = cache('visitContractCount' . $userInfo['id']);
            if (time() <= $visitContractTime) {
                $data['returnVisitRemind'] = (int)$visitContractCount;
            } else {
                $visitContract = $this->visitContract(true);
                $data['returnVisitRemind'] = $visitContract['dataCount'] ?: 0;
                cache('visitContractCount' . $userInfo['id'], $data['returnVisitRemind']);
                cache('visitContractTime' . $userInfo['id'], time());
            }
        }
        # 即将到期合同
        if ($configData['contract_config'] == 1) {
            $endContractTime = cache('endContractTime' . $userInfo['id']);
            $endContractCount = cache('endContractCount' . $userInfo['id']);
            if (time() <= $endContractTime) {
                $data['endContract'] = (int)$endContractCount;
            } else {
                $endContract = $this->endContract(true);
                $data['endContract'] = $endContract['dataCount'] ?: 0;
                cache('endContractCount' . $userInfo['id'], $data['endContract']);
                cache('endContractTime' . $userInfo['id'], time());
            }
        }

        # 新增商机
        $newBusinessTime = cache('newBusinessTime' . $userInfo['id']);
        $newBusinessCount = cache('newBusinessCount' . $userInfo['id']);
        if (time() <= $newBusinessTime) {
            $data['newBusiness'] = (int)$newBusinessCount;
        } else {
            $newBusiness = $this->newBusiness(true);
            $data['newBusiness'] = $newBusiness['dataCount'] ?: 0;
            cache('newBusinessCount' . $userInfo['id'], $data['newBusiness']);
            cache('newBusinessTime' . $userInfo['id'], time());
        }

        # 待进入公海提醒
        $pool = db('crm_customer_pool')->where(['status' => 1, 'remind_conf' => 1])->count();
        if (!empty($pool)) {
            $remindCustomerTime = cache('remindCustomerTime' . $userInfo['id']);
            $remindCustomerCount = cache('remindCustomerCount' . $userInfo['id']);
            if (time() <= $remindCustomerTime) {
                $data['putInPoolRemind'] = (int)$remindCustomerCount;
            } else {
                $remindCustomer = $this->remindCustomer(true);
                $data['putInPoolRemind'] = !empty($remindCustomer['dataCount']) ? $remindCustomer['dataCount'] : 0;
                cache('remindCustomerCount' . $userInfo['id'], $data['putInPoolRemind']);
                cache('remindCustomerTime' . $userInfo['id'], time());
            }
        }

        return resultArray(['data' => $data]);
    }

    /**
     * 今日需联系线索
     *
     * @param false $getCount
     * @return array|\think\response\Json
     */
    public function todayLeads($getCount = false)
    {
        $param = $this->param;
        $userId = $this->userInfo['id'];
        $types = $param['types'];
        unset($param['types']);
        $param['user_id'] = $userId;
        if ($getCount == true) $param['getCount'] = 1;
        $messageLogic = new MessageLogic();

        $data = $messageLogic->todayLeads($param);

        if ($types == 'list') return resultArray(['data' => $data]);

        return $data;
    }

    /**
     * 今日需联系客户
     *
     * @param string $getCount
     * @return \think\response\Json
     */
    public function todayCustomer($getCount = false)
    {
        $param = $this->param;
        $userId = $this->userInfo['id'];
        $types = $param['types'];
        if ($getCount == true) {
            $param['getCount'] = 1;
        }
        unset($param['types']);
        $param['user_id'] = $userId;
        $messageLogic = new MessageLogic();
        $data = $messageLogic->remindCustomer($param);
        if ($types == 'list') {
            return resultArray(['data' => $data]);
        }
        return $data;
    }

    /**
     * 今日需联系商机
     *
     * @param false $getCount
     * @return array|\think\response\Json
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function todayBusiness($getCount = false)
    {
        $param = $this->param;
        $userId = $this->userInfo['id'];
        $types = $param['types'];
        unset($param['types']);
        if ($getCount == true) $param['getCount'] = 1;
        $messageLogic = new MessageLogic();
        $param['user_id'] = $userId;
        $data = $messageLogic->todayBusiness($param);

        if ($types == 'list') return resultArray(['data' => $data]);

        return $data;
    }

    /**
     * 分配给我的线索
     * @return
     * @author Michael_xu
     */
    public function followLeads($getCount = false)
    {
        $param = $this->param;
        $userInfo = $this->userInfo;
        $types = $param['types'];
        unset($param['types']);
        if ($getCount == true) $param['getCount'] = 1;
        $param['user_id'] = $userInfo['id'];
        $messageLogic = new MessageLogic();
        $data = $messageLogic->followLeads($param);
        if ($types == 'list') {
            return resultArray(['data' => $data]);
        }
        return $data;
    }

    /**
     * 分配给我的客户
     * @return
     * @author Michael_xu
     */
    public function followCustomer($getCount = false)
    {
        $param = $this->param;
        $userInfo = $this->userInfo;
        $types = $param['types'];
        if ($getCount == true) {
            $param['getCount'] = 1;
        }
        unset($param['types']);
        $messageLogic = new MessageLogic();
        $param['user_id'] = $userInfo['id'];
        $data = $messageLogic->followCustomer($param);
        if ($types == 'list') {
            return resultArray(['data' => $data]);
        }
        return $data;
    }

    /**
     * 待审核合同
     *
     * @param false $getCount
     * @return \think\response\Json
     */
    public function checkContract($getCount = false)
    {
        $param = $this->param;
        $userInfo = $this->userInfo;
        $types = $param['types'];
        unset($param['types']);
        if ($getCount == true) {
            $param['getCount'] = 1;
        }
        $messageLogic = new MessageLogic();
        $param['user_id'] = $userInfo['id'];
        $data = $messageLogic->checkContract($param);
        if ($types == 'list') {
            return resultArray(['data' => $data]);
        }
        return $data;
    }

    /**
     * 待审核回款
     * @return
     * @author Michael_xu
     */
    public function checkReceivables($getCount = false)
    {
        $param = $this->param;
        $userInfo = $this->userInfo;
        $types = $param['types'];
        unset($param['types']);
        if ($getCount == true) $param['getCount'] = 1;
        $messageLogic = new MessageLogic();
        $param['user_id'] = $userInfo['id'];
        $data = $messageLogic->checkReceivables($param);
        if ($types == 'list') {
            return resultArray(['data' => $data]);
        }
        return $data;
    }

    /**
     * 待审核发票
     *
     * @param InvoiceLogic $invoiceLogic
     * @return array|\think\response\Json
     * @throws \think\exception\DbException
     */
    public function checkInvoice($getCount = false)
    {
        $param = $this->param;
        $userId = $this->userInfo['id'];
        $types = $param['types'];
        if ($getCount == true) $param['getCount'] = 1;
        # 清除与模型无关的数据
        unset($param['types']);
        $param['user_id'] = $userId;
        $messageLogic = new MessageLogic();
        $data = $messageLogic->checkInvoice($param);

        if ($types == 'list') return resultArray(['data' => $data]);

        return $data;
    }

    /**
     * 待审核商机
     *
     * @return array|\think\response\Json
     * @throws \think\exception\DbException
     */
    public function checkBusiness($getCount = false)
    {
        $param = $this->param;
        $userId = $this->userInfo['id'];
        $types = $param['types'];
        if ($getCount == true) $param['getCount'] = 1;
        # 清除与模型无关的数据
        unset($param['types']);
        $param['user_id'] = $userId;
        $messageLogic = new MessageLogic();
        $data = $messageLogic->checkBusiness($param);

        if ($types == 'list') return resultArray(['data' => $data]);

        return $data;
    }

    /**
     * 待审核客户捞取
     *
     * @return array|\think\response\Json
     * @throws \think\exception\DbException
     */
    public function checkCustomerCheck($getCount = false)
    {
        $param = $this->param;
        $userId = $this->userInfo['id'];
        $types = $param['types'];
        if ($getCount == true) $param['getCount'] = 1;
        # 清除与模型无关的数据
        unset($param['types']);
        $param['user_id'] = $userId;
        $messageLogic = new MessageLogic();
        $data = $messageLogic->checkCustomerCheck($param);

        if ($types == 'list') return resultArray(['data' => $data]);

        return $data;
    }

    /**
     * 待回款提醒
     * @return
     * @author Michael_xu
     */
    public function remindReceivablesPlan($getCount = false)
    {
        $param = $this->param;
        $userInfo = $this->userInfo;
        $types = $param['types'];
        $type = $param['type'] ?: 1;
        $isSub = $param['isSub'] ?: '';
        unset($param['types']);
        unset($param['type']);
        unset($param['isSub']);
        $receivablesPlanModel = model('ReceivablesPlan');

        if ($getCount == true) $param['getCount'] = 1;

        $param['owner_user_id'] = $userInfo['id'];
        if ($isSub) {
            $param['owner_user_id'] = ['in', getSubUserId(false)];
        }
        switch ($type) {
            case '1' :
                $param['receivables_id'] = 0;
                $param['check_status'] = ['lt', 2];
                $param['remind_date'] = ['elt', date('Y-m-d', time())];
                $param['return_date'] = ['egt', date('Y-m-d', time())];
                $param['types'] = 1;
                $param['is_dealt'] = 0;
                break;
            case '2' :
                $param['receivables_id'] = ['gt', 0];
                $param['check_status'] = 2;
                $param['dealt'] = 1;
                break;
            case '3' :
                $param['receivables_id'] = 0;
                $param['return_date'] = ['lt', date('Y-m-d', time())];
                break;
        }
        $data = $receivablesPlanModel->getDataList($param);
        if ($types == 'list') {
            return resultArray(['data' => $data]);
        }
        return $data;
    }

    /**
     * 即将到期合同
     * @return
     * @author Michael_xu
     */
    public function endContract($getCount = false)
    {
        $param = $this->param;
        $userInfo = $this->userInfo;
        $types = $param['types'];
        $type = $param['type'] ?: 1;
        $isSub = $param['isSub'] ?: '';
        if ($getCount == true) $param['getCount'] = 1;
        unset($param['types']);
        unset($param['type']);
        unset($param['isSub']);
        $contractModel = model('Contract');
        $configModel = new \app\crm\model\ConfigData();
        $configInfo = $configModel->getData();
        $expireDay = $configInfo['contract_day'] ?: '7';
        // 合同到期不提醒
        if (empty($configInfo['contract_config'])) return resultArray(['data' => []]);
        $param['owner_user_id'] = $userInfo['id'];
        if ($isSub) {
            $param['owner_user_id'] = array('in', getSubUserId(false));
        }
        switch ($type) {
            case '1' :
                $param['end_time'] = array('between', array(date('Y-m-d', time()), date('Y-m-d', time() + 86400 * $expireDay)));
                $param['expire_remind'] = 0;
                break;
            case '2' :
                $param['end_time'] = array('lt', date('Y-m-d', time()));
                break;
        }
        $data = $contractModel->getDataList($param);
//        p($contractModel->getLastSql());
        if ($types == 'list') {
            return resultArray(['data' => $data]);
        }
        return $data;
    }

    /**
     * 新增商机
     * @return
     * @author Michael_xu
     */
    public function newBusiness($getCount = false)
    {
        $param = $this->param;
        $userInfo = $this->userInfo;
        $types = $param['types'];
        $type = $param['type'] ?: 1;
        $isSub = $param['isSub'] ?: '';
        if ($getCount == true) $param['getCount'] = 1;
        unset($param['types']);
        unset($param['type']);
        unset($param['isSub']);
        $businessModel = model('Business');
//        $param['owner_user_id'] = $userInfo['id'];
        if ($isSub) {
            $param['owner_user_id'] = array('in', getSubUserId(false));
        }
        $businessIdArray = db('crm_dealt_relation')->where(['types' => ['eq', 'crm_business_new'], 'user_id' => ['eq', $userInfo['id']]])->column('types_id');
        $param['businessIdArray'] = !empty($businessIdArray) ? $businessIdArray : -1;
        $data = $businessModel->getDataList($param);
        if ($types == 'list') {
            return resultArray(['data' => $data]);
        }
        return $data;
    }

    /**
     * 待进入客户池
     * @return
     * @author Michael_xu
     */
    public function remindCustomer($getCount = false)
    {
        $customerModel = model('Customer');

        $param = $this->param;
        $userInfo = $this->userInfo;
        $types = $param['types'];
        $isSub = $param['isSub'] ?: '';
        if ($getCount == true) $param['getCount'] = 1;
        unset($param['types']);
        unset($param['type']);
        unset($param['isSub']);
        unset($param['deal_status']);
        unset($param['owner_user_id']);

        # 负责人
        $param['owner_user_id'] = !empty($isSub) ? ['in', getSubUserId(false, 0, $userInfo['id'])] : $userInfo['id'];

        # 是否提醒
        $data = [];
        $remind = db('crm_customer_pool')->where(['status' => 1, 'remind_conf' => 1])->count();
        if (!empty($remind)) {
            $whereData = $param ?: [];
            $whereData['is_remind'] = 1;
            $whereData['user_id'] = $userInfo['id'];
            $whereData['pool_remain'] = 0;
            $whereData['scene_id'] = db('admin_scene')->where(['types' => 'crm_customer', 'bydata' => 'me'])->value('scene_id');
            if ($isSub) {
                $whereData['scene_id'] = db('admin_scene')->where(['types' => 'crm_customer', 'bydata' => 'sub'])->value('scene_id');
            }
            $data = $customerModel->getDataList($whereData);
        }
        if ($types == 'list') {
            return resultArray(['data' => $data]);
        }
        return $data;
    }

    /**
     * 待回访合同
     *
     * @param false $getCount
     * @return array|\think\response\Json
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function visitContract($getCount = false)
    {
        $param = $this->param;
        $userId = $this->userInfo['id'];
        $isSub = !empty($param['isSub']) ? $param['isSub'] : 0;
        $types = !empty($param['types']) ? $param['types'] : '';
        if ($getCount == true) $param['getCount'] = 1;
        unset($param['isSub']);
        unset($param['types']);

        $param['is_visit'] = 0; # 未回访
        $param['check_status'] = 2; # 审核通过

        $contractModel = new \app\crm\model\Contract();

        # 负责人
        $param['owner_user_id'] = !empty($isSub) ? ['in', getSubUserId(false)] : $userId;

        $param['user_id'] = $userId;
        $data = $contractModel->getDataList($param);

        if ($types == 'list') return resultArray(['data' => $data]);

        return $data;
    }

    /**
     * 全部标记已处理
     *
     * @return \think\response\Json
     * @throws \think\Exception
     * @throws \think\exception\PDOException
     */
    public function allDeal()
    {
        $type = $this->param['type'];
        $typeId = !empty($this->param['type_id']) ? $this->param['type_id'] : '';
        $isSub = !empty($this->param['isSub']) ? $this->param['isSub'] : 0;
        $userId = $this->userInfo['id'];

        if (empty($type)) return resultArray(['error' => '缺少模块类型参数']);

        # 获得今日开始和结束时间戳
        $todayTime = getTimeByType('today');

        # 处理今日需联系线索、客户、商机
        if (in_array($type, ['todayLeads', 'todayCustomer', 'todayBusiness'])) {
            # 负责人
            $where['owner_user_id'] = !empty($isSub) ? ['in', getSubUserId(false)] : $userId;
            # 下次联系时间
            $where['next_time'] = ['between', [$todayTime[0], $todayTime[1]]];
            # 是否已处理(联系)
            $where['is_dealt'] = 0;

            # 线索
            if ($type == 'todayLeads') {
                $leadsId = !empty($typeId) ? $typeId : Db::name('crm_leads')->where($where)->column('leads_id');
                Db::name('crm_leads')->whereIn('leads_id', $leadsId)->update([
                    'last_time' => time(),
                    'is_dealt' => 1,
                    'follow' => '已跟进'
                ]);
            }
            # 客户
            if ($type == 'todayCustomer') {
                $customerId = !empty($typeId) ? $typeId : Db::name('crm_customer')->where($where)->column('customer_id');
                Db::name('crm_customer')->whereIn('customer_id', $customerId)->update([
                    'last_time' => time(),
                    'is_dealt' => 1,
                    'follow' => '已跟进'
                ]);
            }
            # 商机
            if ($type == 'todayBusiness') {
                $businessId = !empty($typeId) ? $typeId : Db::name('crm_business')->where($where)->column('business_id');
                Db::name('crm_business')->whereIn('business_id', $businessId)->update([
                    'last_time' => time(),
                    'is_dealt' => 1
                ]);
            }
        }

        # 处理分配给我的线索、客户
        if (in_array($type, ['followLeads', 'followCustomer'])) {
            $where['owner_user_id'] = $userId;
            $where['follow'] = [['neq', '已跟进'], null, 'or'];
            $where['is_allocation'] = 1;

            # 线索
            if ($type == 'followLeads') {
                $leadsId = !empty($typeId) ? $typeId : Db::name('crm_leads')->where($where)->column('leads_id');
                Db::name('crm_leads')->whereIn('leads_id', $leadsId)->update(['follow' => '已跟进']);
            }
            # 客户
            if ($type == 'followCustomer') {
                $customerId = !empty($typeId) ? $typeId : Db::name('crm_customer')->where($where)->column('customer_id');
                Db::name('crm_customer')->whereIn('customer_id', $customerId)->update(['follow' => '已跟进']);
            }
        }

        # 处理待审核合同、回款、发票
        if (in_array($type, ['checkContract', 'checkReceivables', 'checkInvoice', 'checkBusiness', 'checkCustomerCheck', 'newBusiness'])) {
            $where['check_status'] = ['lt', '2'];
            $where['check_user_id'] = ['like', ',%' . $userId . '%,'];

            # 合同
            if ($type == 'checkContract') {
                $contractId = !empty($typeId) ? $typeId : Db::name('crm_contract')->where($where)->column('contract_id');
                db('crm_dealt_relation')->where('user_id', $userId)->where('types', 'crm_contract')->whereIn('types_id', $contractId)->delete();
            }
            # 回款
            if ($type == 'checkReceivables') {
                $receivablesId = !empty($typeId) ? $typeId : Db::name('crm_receivables')->where($where)->column('receivables_id');
                db('crm_dealt_relation')->where('user_id', $userId)->where('types', 'crm_receivables')->whereIn('types_id', $receivablesId)->delete();
            }
            # 发票
            if ($type == 'checkInvoice') {
                $invoiceId = !empty($typeId) ? $typeId : Db::name('crm_invoice')->where($where)->column('invoice_id');
                db('crm_dealt_relation')->where('user_id', $userId)->where('types', 'crm_invoice')->whereIn('types_id', $invoiceId)->delete();
            }
            # 商机
            if ($type == 'checkBusiness') {
                $businessId = !empty($typeId) ? $typeId : Db::name('crm_business')->where($where)->column('business_id');
                db('crm_dealt_relation')->where('user_id', $userId)->where('types', 'crm_business')->whereIn('types_id', $businessId)->delete();
            }
            # 客户捞取
            if ($type == 'checkCustomerCheck') {
                $customerCheckId = !empty($typeId) ? $typeId : Db::name('crm_customer_check')->where($where)->column('customer_check_id');
                db('crm_dealt_relation')->where('user_id', $userId)->where('types', 'crm_customer_check')->whereIn('types_id', $customerCheckId)->delete();
            }

            # 新商机
            if ($type == 'newBusiness') {
                $newBusinessId = !empty($typeId) ? $typeId : Db::name('crm_business')->where($where)->column('business_id');
                db('crm_dealt_relation')->where('user_id', $userId)->where('types', 'crm_business_new')->whereIn('types_id', $newBusinessId)->delete();
            }

        }

        # 处理到期合同
        if ($type == 'endContract') {
            $configModel = new \app\crm\model\ConfigData();
            $configInfo = $configModel->getData();
            $expireDay = $configInfo['contract_day'] ?: '7';

            $where['owner_user_id'] = $userId;
            $where['end_time'] = ['between', [date('Y-m-d', time()), date('Y-m-d', time() + 86400 * $expireDay)]];
            $where['expire_remind'] = 1;

            $contractId = !empty($typeId) ? $typeId : Db::name('crm_contract')->where($where)->column('contract_id');
            Db::name('crm_contract')->whereIn('contract_id', $contractId)->update(['expire_remind' => 0]);
        }

        # 处理待回访合同
        if ($type == 'returnVisitRemind') {
            $where['owner_user_id'] = !empty($isSub) ? ['in', getSubUserId(false)] : $userId; # 负责人
            $where['is_visit'] = 0; # 未回访
            $where['check_status'] = 2; # 审核通过

            $contractId = !empty($typeId) ? $typeId : Db::name('crm_contract')->where($where)->column('contract_id');
            Db::name('crm_contract')->whereIn('contract_id', $contractId)->update(['is_visit' => 1]);
        }

        # 处理待进入公海
        if ($type == 'putInPoolRemind') {
            if (!empty($typeId)) {
                Db::name('crm_customer')->whereIn('customer_id', $typeId)->update(['pool_remain' => 1]);
            } else {
                $poolConfig = db('crm_customer_pool')->where(['status' => 1, 'remind_conf' => 1])->count();
                if (!empty($poolConfig)) {
                    $whereData['page'] = 1;
                    $whereData['limit'] = 100;
                    $whereData['is_remind'] = 1;
                    $whereData['user_id'] = $userId;
                    $whereData['pool_remain'] = 0;
                    $whereData['scene_id'] = db('admin_scene')->where(['types' => 'crm_customer', 'bydata' => empty($isSub) ? 'me' : 'sub'])->value('scene_id');
                    $whereData['owner_user_id'] = !empty($isSub) ? ['in', getSubUserId(false, 0, $userId)] : $userId;
                    $poolCustomers = (new \app\crm\model\Customer())->getDataList($whereData);
                    $ids = [];
                    foreach ($poolCustomers['list'] as $key => $value) {
                        if (!empty($value['customer_id'])) $ids[] = $value['customer_id'];
                    }
                    if (!empty($ids)) Db::name('crm_customer')->whereIn('customer_id', $ids)->update(['pool_remain' => 1]);
                }
            }
        }

        # 带回款提醒
        if ($type == 'remindReceivablesPlan') {
            $planId = [];
            if (!empty($typeId)) {
                $planId = $typeId;
            } else {
                $param['owner_user_id'] = $isSub ? ['in', getSubUserId(false)] : $userId;
                $param['receivables_id'] = 0;
                $param['check_status'] = ['lt', 2];
                $param['remind_date'] = ['elt', date('Y-m-d', time())];
                $param['return_date'] = ['egt', date('Y-m-d', time())];
                $param['types'] = 1;
                $param['page'] = 1;
                $param['limit'] = 1000;
                $receivablesPlanModel = model('ReceivablesPlan');
                $data = $receivablesPlanModel->getDataList($param);
                foreach ($data['list'] as $key => $value) {
                    $planId[] = $value['plan_id'];
                }
            }
            if (!empty($planId)) db('crm_receivables_plan')->whereIn('plan_id', $planId)->update(['is_dealt' => 1]);
        }

        cache::rm('todayLeadsCount' . $userId);
        cache::rm('todayCustomerCount' . $userId);
        cache::rm('todayBusinessCount' . $userId);
        cache::rm('followLeadsCount' . $userId);
        cache::rm('followCustomerCount' . $userId);
        cache::rm('checkContractCount' . $userId);
        cache::rm('checkReceivablesCount' . $userId);
        cache::rm('checkInvoiceCount' . $userId);
        cache::rm('remindReceivablesPlanCount' . $userId);
        cache::rm('visitContractCount' . $userId);
        cache::rm('endContractCount' . $userId);
        cache::rm('remindCustomerCount' . $userId);
        cache::rm('checkCustomerCheckCount' . $userId);
        cache::rm('checkBusinessCount' . $userId);
        cache::rm('newBusinessCount' . $userId);

        cache::rm('todayLeadsTime' . $userId);
        cache::rm('todayCustomerTime' . $userId);
        cache::rm('todayBusinessTime' . $userId);
        cache::rm('followLeadsTime' . $userId);
        cache::rm('followCustomerTime' . $userId);
        cache::rm('checkContractTime' . $userId);
        cache::rm('checkReceivablesTime' . $userId);
        cache::rm('checkInvoiceTime' . $userId);
        cache::rm('checkBusinessTime' . $userId);
        cache::rm('remindReceivablesPlanTime' . $userId);
        cache::rm('visitContractTime' . $userId);
        cache::rm('endContractTime' . $userId);
        cache::rm('remindCustomerTime' . $userId);
        cache::rm('checkCustomerCheckTime' . $userId);
        cache::rm('checkBusinessTime' . $userId);
        cache::rm('newBusinessTime' . $userId);
        return resultArray(['data' => '操作成功!']);
    }
}