| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842 |
- <?php
- /**
- * 活动逻辑类
- *
- * @author qifan
- * @date 2020-12-09
- */
-
- namespace app\crm\logic;
-
- use app\admin\controller\ApiCommon;
- use app\admin\model\Group;
- use app\crm\model\Activity;
- use think\Db;
-
- class ActivityLogic
- {
- # 活动类型 1 线索 2 客户 3 联系人 4 产品 5 商机 6 合同 7 回款 8 日志 9 审批 10 日程 11 任务 12 发邮件
- private $activityType = [
- 1 => ['en' => 'crm_leads', 'cn' => '线索'],
- 2 => ['en' => 'crm_customer', 'cn' => '客户'],
- 3 => ['en' => 'crm_contacts', 'cn' => '联系人'],
- 4 => ['en' => 'crm_product', 'cn' => '产品'],
- 5 => ['en' => 'crm_business', 'cn' => '商机'],
- 6 => ['en' => 'crm_contract', 'cn' => '合同'],
- 7 => ['en' => 'crm_receivables', 'cn' => '回款'],
- 8 => ['en' => 'oa_log', 'cn' => '日志'],
- 9 => ['en' => 'oa_examine', 'cn' => '审批'],
- 10 => ['en' => 'oa_event', 'cn' => '日程'],
- 11 => ['en' => 'oa_task', 'cn' => '任务'],
- 12 => ['en' => 'mail', 'cn' => '发邮件']
- ];
-
- private $moduleToNumber = [
- 'leads' => 1,
- 'customer' => 2,
- 'contacts' => 3,
- 'product' => 4,
- 'business' => 5,
- 'contract' => 6,
- 'receivables' => 7,
- 'log' => 8,
- 'examine' => 9,
- 'event' => 10,
- 'task' => 11,
- 'email' => 12
- ];
-
- /**
- * 活动列表
- *
- * @param $param
- * @return array
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- public function index($param)
- {
- $userId = $param['user_id'];
- unset($param['user_id']);
- unset($param['crmType']);
-
- $param['limit'] = !empty($param['limit']) ? $param['limit'] : 15;
- $param['page'] = !empty($param['page']) ? $param['page'] : 1;
-
- $recordWhere = [];
- $commonWhere = [];
- $leadsWhere = [];
- $customerWhere = function () {};
- $contactsWhere = function () {};
- $businessWhere = function () {};
- $contractWhere = function () {};
- $dateGroupWhere = function () {};
-
- # 跟进记录权限判断
- if (!checkPerByAction('crm', 'activity', 'index')) {
- $recordWhere['type'] = ['neq', 1];
- }
-
- # 处理公共查询参数
- if (!empty($param['interval_day'])) {
- $commonWhere['update_time'] = ['egt', time() - 86400 * $param['interval_day']];
- $commonWhere['update_time'] = ['elt', time()];
- }
- if (!empty($param['start_date']) && !empty($param['end_date'])) {
- $commonWhere['update_time'] = ['egt', strtotime($param['start_date'].' 00:00:00')];
- $commonWhere['update_time'] = ['elt', strtotime($param['end_date'].' 23:59:59')];
- }
- if (!empty($param['search'])) {
- $commonWhere['content'] = ['like', '%' . $param['search'] . '%'];
- }
- if (!empty($param['activity_type'])) {
- $commonWhere['activity_type'] = $param['activity_type'];
- }
-
- # 客户模块的额外查询条件
- $contactsData = [];
- $businessData = [];
- $contractData = [];
- $receivablesData = [];
-
- # 联系人ID串
- $contacts = Db::name('crm_contacts')->field(['contacts_id'])->where('customer_id', $param['activity_type_id'])->select();
- if (!empty($contacts)) {
- $contactsData['activity_type'] = 3;
- $contactsData['activity_type_id'] = array_reduce($contacts, function ($result, $value) {
- return array_merge($result, array_values($value));
- }, []);
- }
-
- # 商机ID串
- $business = Db::name('crm_business')->field(['business_id'])->where('customer_id', $param['activity_type_id'])->select();
- if (!empty($business)) {
- $businessData['activity_type'] = 5;
- $businessData['activity_type_id'] = array_reduce($business, function ($result, $value) {
- return array_merge($result, array_values($value));
- }, []);
- }
-
- # 合同ID串
- $contract = Db::name('crm_contract')->field(['contract_id'])->where('customer_id', $param['activity_type_id'])->select();
- if (!empty($contract)) {
- $contractData['activity_type'] = 6;
- $contractData['activity_type_id'] = array_reduce($contract, function ($result, $value) {
- return array_merge($result, array_values($value));
- }, []);
- }
-
- # 回款ID串
- $receivables = Db::name('crm_receivables')->field(['receivables_id'])->where('customer_id', $param['activity_type_id'])->select();
- if (!empty($receivables)) {
- $receivablesData['activity_type'] = 7;
- $receivablesData['activity_type_id'] = array_reduce($receivables, function ($result, $value) {
- return array_merge($result, array_values($value));
- }, []);
- }
-
- # 设置时间分组查询条件,第一页就是当天的数据,第二页就是下一天的数据
- $datetime = Db::name('crm_activity')
- ->field('update_time')
- ->where($recordWhere)
- ->where('status', 1)
- ->where(function ($query) use ($param, $contactsData, $businessData, $contractData, $receivablesData) {
- $query->whereOr(function ($query) use ($param) {
- $query->where('activity_type_id', $param['activity_type_id']);
- $query->where('activity_type', $this->moduleToNumber[$param['module']]);
- });
- $query->whereOr('customer_ids', 'like', '%,'.$param['activity_type_id'].',%');
- $query->whereOr('contacts_ids', 'like', '%,'.$param['activity_type_id'].',%');
- $query->whereOr('contract_ids', 'like', '%,'.$param['activity_type_id'].',%');
- $query->whereOr('business_ids', 'like', '%,'.$param['activity_type_id'].',%');
- $query->whereOr('leads_ids', 'like', '%,'.$param['activity_type_id'].',%');
- if (!empty($contactsData)) {
- $query->whereOr(function ($query) use ($contactsData) {
- $query->where('activity_type', $contactsData['activity_type']);
- $query->whereIn('activity_type_id', $contactsData['activity_type_id']);
- });
- }
- if (!empty($businessData)) {
- $query->whereOr(function ($query) use ($businessData) {
- $query->where('activity_type', $businessData['activity_type']);
- $query->whereIn('activity_type_id', $businessData['activity_type_id']);
- });
- }
- if (!empty($contractData)) {
- $query->whereOr(function ($query) use ($contractData) {
- $query->where('activity_type', $contractData['activity_type']);
- $query->whereIn('activity_type_id', $contractData['activity_type_id']);
- });
- }
- if (!empty($receivablesData)) {
- $query->whereOr(function ($query) use ($receivablesData) {
- $query->where('activity_type', $receivablesData['activity_type']);
- $query->whereIn('activity_type_id', $receivablesData['activity_type_id']);
- });
- }
- })
- ->where($commonWhere)
- ->order('update_time', 'desc')
- ->group('update_time')
- ->select();
- $dateGroup = [0 => '']; // 加一个占位,page从1开始
- $dateWhere = [0 => []]; // 加一个占位,page从1开始
- foreach ($datetime AS $key => $value) {
- $date = date('Y-m-d', $value['update_time']);
- if (!in_array($date, $dateGroup)) {
- $dateGroup[] = $date;
- $dateWhere[] = [
- 'start_time' => strtotime($date . ' 00:00:00'),
- 'end_time' => strtotime($date . ' 23:59:59')
- ];
- }
- }
- if (!empty($dateWhere[$param['page']])) {
- $dateGroupWhere = function ($query) use ($param, $dateWhere) {
- $query->where('update_time', '>=', $dateWhere[$param['page']]['start_time']);
- $query->where('update_time', '<=', $dateWhere[$param['page']]['end_time']);
- };
- }
- if (empty($dateWhere[$param['page']])) {
- return ['lastPage' => true, 'list' => [], 'time' => ''];
- }
-
- # 组织线索、客户、联系人、商机、合同下的查询条件
- switch ($param['module']) {
- case 'leads' :
- $leadsWhere = function ($query) use ($param) {
- $query->where('activity_type', 1);
- $query->where('activity_type_id', $param['activity_type_id']);
- };
- break;
- case 'customer' :
- # 客户模块查询条件
- $customerWhere = function ($query) use ($param, $contactsData, $businessData, $contractData, $receivablesData) {
- $query->whereOr(function ($query) use ($param) {
- $query->where('activity_type', 2);
- $query->where('activity_type_id', $param['activity_type_id']);
- });
- $query->whereOr(function ($query) use ($param) {
- $query->where('customer_ids', 'like', '%,' . $param['activity_type_id'] . ',%');
- $query->whereIn('activity_type', [8, 9, 11]);
- });
- if (!empty($contactsData)) {
- $query->whereOr(function ($query) use ($contactsData) {
- $query->where('activity_type', $contactsData['activity_type']);
- $query->whereIn('activity_type_id', $contactsData['activity_type_id']);
- });
- }
- if (!empty($businessData)) {
- $query->whereOr(function ($query) use ($businessData) {
- $query->where('activity_type', $businessData['activity_type']);
- $query->whereIn('activity_type_id', $businessData['activity_type_id']);
- });
- }
- if (!empty($contractData)) {
- $query->whereOr(function ($query) use ($contractData) {
- $query->where('activity_type', $contractData['activity_type']);
- $query->whereIn('activity_type_id', $contractData['activity_type_id']);
- });
- }
- if (!empty($receivablesData)) {
- $query->whereOr(function ($query) use ($receivablesData) {
- $query->where('activity_type', $receivablesData['activity_type']);
- $query->whereIn('activity_type_id', $receivablesData['activity_type_id']);
- });
- }
- };
-
- break;
- case 'contacts' :
- # 联系人模块查询条件
- $contactsWhere = function ($query) use ($param) {
- $query->whereOr(function ($query) use ($param) {
- $query->where('activity_type', 3);
- $query->where('activity_type_id', $param['activity_type_id']);
- });
- $query->whereOr(function ($query) use ($param) {
- $query->where('contacts_ids', 'like', '%,' . $param['activity_type_id'] . ',%');
- $query->whereIn('activity_type', [8, 9, 11]);
- });
- };
-
- break;
- case 'business' :
- # 商机模块查询条件
- $businessWhere = function ($query) use ($param) {
- $query->whereOr(function ($query) use ($param) {
- $query->where('activity_type', 5);
- $query->where('activity_type_id', $param['activity_type_id']);
- });
- $query->whereOr(function ($query) use ($param) {
- $query->where('business_ids', 'like', '%,' . $param['activity_type_id'] . ',%');
- $query->whereIn('activity_type', [8, 9, 11]);
- });
- };
- break;
- case 'contract' :
- # 合同模块查询条件
- $contractWhere = function ($query) use ($param) {
- $query->whereOr(function ($query) use ($param) {
- $query->where('activity_type', 6);
- $query->where('activity_type_id', $param['activity_type_id']);
- });
- $query->whereOr(function ($query) use ($param) {
- $query->where('contract_ids', 'like', '%,' . $param['activity_type_id'] . ',%');
- $query->whereIn('activity_type', [8, 9, 11]);
- });
- };
-
- break;
- }
-
- $field = [
- 'activity_id',
- 'type',
- 'category',
- 'activity_type',
- 'activity_type_id',
- 'content',
- 'contacts_ids',
- 'next_time',
- 'create_user_id',
- 'update_time',
- 'business_ids'
- ];
- $dataArray = Db::name('crm_activity')->field($field)
- ->where($dateGroupWhere)
- ->where($recordWhere)
- ->where($commonWhere)
- ->where($customerWhere)
- ->where($contactsWhere)
- ->where($businessWhere)
- ->where($contractWhere)
- ->where($leadsWhere)
- ->where('status', 1)
- ->order('update_time', 'desc')
- ->select();
-
- $fileModel = new \app\admin\model\File();
- foreach ($dataArray AS $key => $value) {
- # 用户信息
- $realname = Db::name('admin_user')->where('id', $dataArray[$key]['create_user_id'])->find();
- $dataArray[$key]['create_user_name'] = $realname['realname'];
- $dataArray[$key]['thumb_img'] = $realname['thumb_img'] ? getFullPath($realname['thumb_img']) : '';;
-
- # 附件信息
- if ($value['type'] = 1) {
- $files = [];
- $images = [];
- $fileList = $fileModel->getDataList(['module' => 'crm_activity', 'module_id' => $dataArray[$key]['activity_id']], 'all');
- if (!empty($fileList['list'])) {
- foreach ($fileList['list'] AS $k => $v) {
- if ($v['types'] == 'file') {
- $files[] = $v;
- } else {
- $images[] = $v;
- }
- }
- }
- $dataArray[$key]['fileList'] = $files ? : [];
- $dataArray[$key]['imgList'] = $images ? : [];
- }
-
- # 判断是不是本人添加的,如果不是将禁止删除修改
- $dataArray[$key]['auth'] = false;
- if ($dataArray[$key]['type'] == 1 && $dataArray[$key]['create_user_id'] == $userId) {
- $dataArray[$key]['auth'] = true;
- }
-
- # 查询联系人信息
- $dataArray[$key]['contacts_list'] = [];
- if ($dataArray[$key]['type'] == 1 && !empty($dataArray[$key]['contacts_ids'])) {
- $res = Db::name('crm_contacts')->where('contacts_id', trim($dataArray[$key]['contacts_ids'], ','))->value('name');
- $dataArray[$key]['contacts_list'][] = [
- 'contacts_id' => (int)trim($dataArray[$key]['contacts_ids'], ','),
- 'name' =>empty($res)? null : $res,
- ];
- }
-
- # 时间格式处理
- $dataArray[$key]['update_time'] = date('Y-m-d H:i:s', $value['update_time']);
- $dataArray[$key]['create_time'] = date('Y-m-d H:i:s', $value['create_time']);
- $dataArray[$key]['next_time'] = !empty($value['next_time']) ? date('Y-m-d H:i:s', $value['next_time']) : '';
-
- # 获取类型名称
- $dataArray[$key]['activity_type_name'] = $this->getActivityName($value['activity_type'], $value['activity_type_id']);
-
- # 客户模块跟进记录关联的商机
- $dataArray[$key]['business_list'] = $value['activity_type'] == 2 ? $this->getBusinessInfo($value['business_ids']) : [];
-
- # 去掉客户模块跟进记录联系人ID两端的逗号
- if ($value['type'] == 1 && $value['activity_type'] == 2) {
- $dataArray[$key]['contacts_ids'] = !empty($value['contacts_ids']) ? trim($value['contacts_ids'], ',') : '';
- }
- }
-
- # 是否是最后一页
- $lastPage = !empty($dateGroup[$param['page']]) && $param['page'] < count($dateGroup) - 1 ? false : true;
-
- return ['lastPage' => $lastPage, 'list' => $dataArray, 'time' => !empty($dateGroup[$param['page']]) ? $dateGroup[$param['page']] : ''];
- }
-
- /**
- * 活动详情【跟进记录】
- *
- * @param $activityId
- * @return array|bool|\PDOStatement|string|\think\Model|null
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- public function read($activityId)
- {
- # 查询跟进记录信息
- $field = ['activity_id', 'category', 'activity_type', 'activity_type_id', 'content', 'next_time', 'customer_ids', 'contacts_ids', 'contract_ids', 'business_ids'];
- $activityData = Activity::field($field)->where('type', 1)->where('activity_id', $activityId)->where('status', 1)->find();
-
- if (empty($activityData)) return [];
-
- # 查询与跟进记录关联的客户信息
- $customerData = Db::name('crm_customer')->field(['customer_id', 'name'])->whereIn('customer_id', $activityData['customer_ids'])->select();
- $activityData['customerInfo'] = $customerData;
-
- # 查询与跟进记录关联的联系人信息
- $contactsData = Db::name('crm_contacts')->field(['contacts_id', 'name'])->whereIn('contacts_id', $activityData['contacts_ids'])->select();
- $activityData['contactsInfo'] = $contactsData;
-
- # 查询与跟进记录关联的合同信息
- $contractData = Db::name('crm_contract')->field(['contract_id', 'name'])->whereIn('contract_id', $activityData['contract_ids'])->select();
- $activityData['contractInfo'] = $contractData;
-
- # 查询与跟进记录关联的商机信息
- $businessData = Db::name('crm_business')->field(['business_id', 'name'])->whereIn('business_id', $activityData['business_ids'])->select();
- $activityData['businessInfo'] = $businessData;
-
- # 查询与跟进记录关联的附件
- $fileData = (new \app\admin\model\File())->getDataList(['module' => 'crm_activity', 'module_id' => $activityId], 'all');
- $activityData['fileInfo'] = $fileData;
-
- return $activityData;
- }
-
- /**
- * 创建活动【跟进记录】
- *
- * @param $param
- * @return bool
- * @throws \think\Exception
- * @throws \think\exception\PDOException
- */
- public function save($param)
- {
- $userId = $param['user_id'];
- $isEvent = !empty($param['is_event']) ? $param['is_event'] : 0;
- $fileIds = !empty($param['file_id']) ? $param['file_id'] : [];
- unset($param['is_event']);
- unset($param['file_id']);
- unset($param['user_id']);
-
- $param['create_user_id'] = $userId;
- $param['type'] = 1;
- $param['next_time'] = !empty($param['next_time']) ? strtotime($param['next_time']) : 0;
- $param['business_ids'] = !empty($param['business_ids']) ? arrayToString($param['business_ids']) : '';
- $param['create_time'] = time();
- $param['update_time'] = time();
- if (!empty($param['contacts_ids'])) $param['contacts_ids'] = ',' . $param['contacts_ids'] . ',';
- $activityJson = Activity::create($param);
- if (empty($activityJson)) return false;
-
- $activityArray = json_decode($activityJson, true);
- if (empty($activityArray['activity_id'])) return false;
-
- # 设置最后跟进记录
- $this->setFollowRecord($param['activity_type'], $param['activity_type_id'], $param['content']);
-
- # 下次联系时间
- $this->updateNextTime($this->activityType[$param['activity_type']]['en'], $param['activity_type_id'], $param['next_time'],false);
-
- # 处理附件关系
- if (!empty($fileIds)) {
- $fileModel = new \app\admin\model\File();
-
- $fileModel->createDataById($fileIds, 'crm_activity', $activityArray['activity_id']);
- }
-
- # 同时创建日程
- if ($isEvent) {
- $eventModel = new \app\oa\model\Event();
-
- $data['title'] = trim($param['content']);
- $data['content'] = trim($param['content']);
- $data['start_time'] = !empty($param['next_time']) ? $param['next_time'] : time();
- $data['end_time'] = $param['next_time'] + 86399;
- $data['create_user_id'] = $param['create_user_id'];
- $data['business_ids'] = $param['business_ids'];
- $data['contacts_ids'] = $param['contacts_ids'];
- $data['is_live'] = true;
- if ($param['activity_type'] == 'crm_customer') $data['customer_ids'] = $param['activity_type_id'];
-
- $eventModel->createData($data);
- }
- $activity=[1 =>'线索', 2=> '客户', 3 =>'联系人' ,4 =>'产品', 5 =>'商机', 6 =>'合同' ,7=>'回款' ,8=>'日志' ,9=>'审批' ,10=>'日程' ,11=>'任务' ,12 =>'发邮件'];
- RecordActionLog($param['create_user_id'],'crm_activity','save',$activity[$param['activity_type']],'','','新增了跟进记录'.$param['content']);
- return true;
- }
-
- /**
- * 修改活动【跟进记录】
- *
- * @param $param
- * @return bool
- * @throws \think\Exception
- * @throws \think\exception\PDOException
- */
- public function update($param)
- {
- $isEvent = !empty($param['is_event']) ? $param['is_event'] : 0;
- $fileIds = !empty($param['file_id']) ? $param['file_id'] : [];
- unset($param['is_event']);
- unset($param['file_id']);
- $param['type'] = 1;
- $param['next_time'] = strtotime($param['next_time']);
- $param['business_ids'] = !empty($param['business_ids']) ? arrayToString($param['business_ids']) : '';
- $param['update_time'] = time();
- $dataInfo=db('crm_activity')->where('activity_id',$param['activity_id'])->find();
- if (!Activity::update($param)) return false;
-
- # 设置最后跟进记录
- $this->setFollowRecord($param['activity_type'], $param['activity_type_id'], $param['content']);
-
- # 下次联系时间
- $this->updateNextTime($this->activityType[$param['activity_type']]['en'], $param['activity_type_id'], $param['next_time'],false);
-
- # 处理附件关系
- $fileModel = new \app\admin\model\File();
- if (!empty($fileIds)) {
- # 删除
- $fileModel->delRFileByModule('crm_activity', $param['activity_id']);
-
- # 添加
- $fileModel->createDataById($fileIds, 'crm_activity', $param['activity_id']);
- } else {
- # 删除
- $fileModel->delRFileByModule('crm_activity', $param['activity_id']);
- }
-
- # 同时创建日程
- if ($isEvent) {
- $eventModel = new \app\oa\model\Event();
-
- $data['title'] = trim($param['content']);
- $data['content'] = trim($param['content']);
- $data['start_time'] = !empty($param['next_time']) ? $param['next_time'] : time();
- $data['end_time'] = $param['next_time'] + 86399;
- $data['create_user_id'] = $param['create_user_id'];
- $data['business_ids'] = $param['business_ids'];
- $data['contacts_ids'] = $param['contacts_ids'];
- if ($param['activity_type'] == 2) $data['customer_ids'] = $param['activity_type_id'];
-
- $eventModel->createData($data);
- }
- return true;
- }
-
- /**
- * 删除活动【跟进记录】
- *
- * @param $activityId
- * @return Activity
- */
- public function delete($activityId)
- {
- $activityInfo = Db::name('crm_activity')->where(['activity_id' => $activityId])->find();
- if (Activity::update(['activity_id' => $activityId, 'status' => 0])) {
- $this->updateNextTime($this->activityType[$activityInfo['activity_type']]['en'], $activityInfo['activity_type_id'], '', true);
- # 删除附件
- $fileIds = db('crm_activity_file')->where('activity_id', $activityId)->column('file_id');
- if (!empty($fileIds)) {
- db('crm_activity_file')->where('activity_id', $activityId)->delete();
- db('admin_file')->whereIn('file_id', $fileIds)->delete();
- }
- if ($activityInfo['activity_type'] == 3) db('crm_contacts_file')->whereIn('file_id', $fileIds)->delete();
- if ($activityInfo['activity_type'] == 5) db('crm_business_file')->whereIn('file_id', $fileIds)->delete();
- if ($activityInfo['activity_type'] == 6) db('crm_contract_file')->whereIn('file_id', $fileIds)->delete();
- $user=new ApiCommon();
- $userInfo=$user->userInfo;
- RecordActionLog($userInfo['id'],'crm_activity','delete','删除跟进记录','','','删除了'.$recordModules[$types].$name);
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * 相关模块下次联系时间
- *
- * @param $types
- * @param $types_id
- * @param string $next_time
- * @return bool
- * @throws \think\Exception
- * @throws \think\exception\PDOException
- */
- private function updateNextTime($types, $types_id, $next_time = '', $is_del = false)
- {
- switch ($types) {
- case 'crm_customer' : $dbName = db('crm_customer'); $dbId = 'customer_id'; $activity_type = 2; break;
- case 'crm_leads' : $dbName = db('crm_leads'); $dbId = 'leads_id'; $activity_type = 1; break;
- case 'crm_contacts' : $dbName = db('crm_contacts'); $dbId = 'contacts_id'; $activity_type = 3; break;
- case 'crm_business' : $dbName = db('crm_business'); $dbId = 'business_id'; $activity_type = 5; break;
- default : break;
- }
-
- if (!$dbName || !$dbId) return true;
-
- $data = [];
- $data['update_time'] = time();
- if (!empty($next_time)) {
- $data['next_time'] = $next_time;
- } else {
- if ($is_del) {
- # 查找最近一条下次联系时间补上,如果没有就置空
- $resActivity = Db::name('crm_activity')->where(['type'=>1, 'activity_type'=>$activity_type, 'activity_type_id' => $types_id,'status'=>['neq',0]])->order('activity_id desc')->find();
- $data['next_time'] = $resActivity['next_time'] ? : 0;
- unset($data['update_time']);
- } else {
- # 如果未填写下次联系时间,并且 原下次联系时间为当天,则把下次联系时间置空
- $next_time = $dbName->where([$dbId => $types_id])->value('next_time');
- list($start, $end) = getTimeByType();
- if ($next_time >= $start && $next_time <= $end) {
- $data['next_time'] = 0;
- }
- }
- }
- if (!$is_del && in_array($types, ['crm_customer', 'crm_leads'])) {
- $data['follow'] = '已跟进';
- }
- # 设置今日需联系线索、客户、商机
- if (!$is_del && in_array($types, ['crm_customer', 'crm_leads', 'crm_business'])) {
- if (!empty($next_time) && $next_time >= strtotime('Y-m-d 00:00:00')) $data['is_dealt'] = 0;
- }
- $dbName->where([$dbId => $types_id])->update($data);
- return true;
- }
-
- /**
- * 获取常用语
- *
- * @return mixed
- */
- public function getPhrase()
- {
- $dataJson = Db::name('crm_config')->where('name', 'activity_phrase')->value('value');
-
- return !empty($dataJson) ? unserialize($dataJson) : [];
- }
-
- /**
- * 设置常用语
- *
- * @param $param
- * @return int|string
- * @throws \think\Exception
- * @throws \think\exception\PDOException
- */
- public function setPhrase($param)
- {
- if (!Db::name('crm_config')->where('name', 'activity_phrase')->value('value')) {
- return Db::name('crm_config')->insert(['name' => 'activity_phrase', 'value' => serialize($param), 'description' => '跟进记录常用语']);
- }
-
- Db::name('crm_config')->where('name', 'activity_phrase')->update(['value' => serialize($param)]);
- return true;
- }
-
- /**
- * 获取修改过的跟进记录信息
- *
- * @param $activityId
- * @param $userId
- * @return array|bool|\PDOStatement|string|\think\Model|null
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- public function getFollowData($activityId, $userId)
- {
- $field = [
- 'activity_id',
- 'type',
- 'category',
- 'activity_type',
- 'activity_type_id',
- 'content',
- 'contacts_ids',
- 'next_time',
- 'create_user_id',
- 'update_time',
- 'business_ids'
- ];
- $data = db('crm_activity')->where('activity_id', $activityId)->field($field)->find();
-
- $fileModel = new \app\admin\model\File();
-
- $realname = Db::name('admin_user')->where('id', $data['create_user_id'])->value('realname');
- $data['create_user_name'] = $realname;
-
- # 附件信息
- if ($data['type'] = 1) {
- $files = [];
- $images = [];
- $fileList = $fileModel->getDataList(['module' => 'crm_activity', 'module_id' => $activityId], 'all');
- if (!empty($fileList['list'])) {
- foreach ($fileList['list'] AS $k => $v) {
- if ($v['types'] == 'file') {
- $files[] = $v;
- } else {
- $images[] = $v;
- }
- }
- }
- $data['fileList'] = $files ? : [];
- $data['imgList'] = $images ? : [];
- }
-
- # 判断是不是本人添加的,如果不是将禁止删除修改
- $data['auth'] = false;
- if ($data['type'] == 1 && $data['create_user_id'] == $userId) {
- $data['auth'] = true;
- }
-
- # 查询联系人信息
- $data['contacts_name'] = '';
- if ($data['type'] == 1 && !empty($data['contacts_ids'])) {
- $data['contacts_name'] = Db::name('crm_contacts')->where('contacts_id', $data['contacts_ids'])->value('name');
- }
-
- $data['update_time'] = date('Y-m-d H:i:s', $data['update_time']);
- $data['next_time'] = !empty($data['next_time']) ? date('Y-m-d H:i:s', $data['next_time']) : null;
-
- # 关联商机
- $data['business_list'] = $data['activity_type'] == 2 ? $this->getBusinessInfo($data['business_ids']) : [];
-
- return $data;
- }
-
- /**
- * 获取活动类型名称
- *
- * @param $activityType
- * @param $activityTypeId
- * @return float|mixed|string|\think\db\Query
- */
- private function getActivityName($activityType, $activityTypeId)
- {
- $activityTypeName = '';
-
- # 线索
- if ($activityType == 1) {
- $activityTypeName = Db::name('crm_leads')->where('leads_id', $activityTypeId)->value('name');
- }
- # 客户
- if ($activityType == 2) {
- $activityTypeName = Db::name('crm_customer')->where('customer_id', $activityTypeId)->value('name');
- }
- # 联系人
- if ($activityType == 3) {
- $activityTypeName = Db::name('crm_contacts')->where('contacts_id', $activityTypeId)->value('name');
- }
- # 产品
- if ($activityType == 4) {
- $activityTypeName = Db::name('crm_product')->where('product_id', $activityTypeId)->value('name');
- }
- # 商机
- if ($activityType == 5) {
- $activityTypeName = Db::name('crm_business')->where('business_id', $activityTypeId)->value('name');
- }
- # 合同
- if ($activityType == 6) {
- $activityTypeName = Db::name('crm_contract')->where('contract_id', $activityTypeId)->value('name');
- }
- # 回款
- if ($activityType == 7) {
- $activityTypeName = Db::name('crm_receivables')->where('receivables_id', $activityTypeId)->value('number');
- }
- # 日志
- if ($activityType == 8) {
- $activityTypeName = Db::name('oa_log')->where('log_id', $activityTypeId)->value('title');
- }
- # 审批
- if ($activityType == 9) {
- $categoryId = Db::name('oa_examine')->where('examine_id', $activityTypeId)->value('category_id');
- $activityTypeName = Db::name('oa_examine_category')->where('category_id', $categoryId)->value('title');
- }
- # 日程
- if ($activityType == 10) {
- $activityTypeName = Db::name('oa_event')->where('event_id', $activityTypeId)->value('title');
- }
- # 任务
- if ($activityType == 11) {
- $activityTypeName = Db::name('task')->where('task_id', $activityTypeId)->value('name');
- }
-
- return $activityTypeName;
- }
-
- /**
- * 获取客户跟进记录关联的商机
- *
- * @param $businessIds
- * @return bool|\PDOStatement|string|\think\Collection
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- private function getBusinessInfo($businessIds)
- {
- return Db::name('crm_business')->field(['business_id', 'name'])->whereIn('business_id', $businessIds)->select();
- }
-
- /**
- * 设置跟进记录
- *
- * @param $type
- * @param $typeId
- * @param $content
- * @throws \think\Exception
- * @throws \think\exception\PDOException
- */
- private function setFollowRecord($type, $typeId, $content)
- {
- $model = null;
- $primaryKey = null;
-
- switch ($type) {
- case 1 : $model = db('crm_leads'); $primaryKey = 'leads_id'; break;
- case 2 : $model = db('crm_customer'); $primaryKey = 'customer_id'; break;
- case 3 : $model = db('crm_contacts'); $primaryKey = 'contacts_id'; break;
- case 5 : $model = db('crm_business'); $primaryKey = 'business_id'; break;
- case 6 : $model = db('crm_contract'); $primaryKey = 'contract_id'; break;
- }
-
- $model->where($primaryKey, $typeId)->update(['last_time' => time(), 'last_record' => $content]);
- }
-
- /**
- * 跟进记录导出
- * @param $field_list
- * @param $data
- *
- * @author alvin guogaobo
- * @version 1.0 版本号
- * @since 2021/4/21 0021 09:35
- */
- public function excelExport($field_list,$data){
- $excelModel = new \app\admin\model\Excel();
- $file_name='activity_record';
- $title='跟进记录';
- $excelModel->taskExportCsv($file_name, $field_list, $title, $data);
- }
- }
|