| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169 |
- <?php
- // +----------------------------------------------------------------------
- // | Description: 客户
- // +----------------------------------------------------------------------
- // | Author: Michael_xu | gengxiaoxu@5kcrm.com
- // +----------------------------------------------------------------------
-
- namespace app\crm\controller;
-
- use app\admin\controller\ApiCommon;
- use app\crm\logic\CustomerLogic;
- use app\crm\traits\SearchConditionTrait;
- use app\crm\traits\StarTrait;
- use phpDocumentor\Reflection\Types\False_;
- use think\Cache;
- use think\Hook;
- use think\Request;
- use think\Db;
-
- class Customer extends ApiCommon
- {
- use StarTrait, SearchConditionTrait;
-
- /**
- * 用于判断权限
- * @permission 无限制
- * @allow 登录用户可访问
- * @other 其他根据系统设置
- **/
- public function _initialize()
- {
- $action = [
- 'permission' => ['exceldownload', 'setfollow', 'delete'],
- 'allow' => ['read', 'system', 'count', 'poolauthority', 'level']
- ];
- Hook::listen('check_auth', $action);
- $request = Request::instance();
- $a = strtolower($request->action());
- if (!in_array($a, $action['permission'])) {
- parent::_initialize();
- } else {
- $param = Request::instance()->param();
- $this->param = $param;
- }
- }
-
- /**
- * 客户列表
- * @return
- * @author Michael_xu
- */
- public function index()
- {
- $customerModel = model('Customer');
- $param = $this->param;
- $userInfo = $this->userInfo;
- $param['user_id'] = $userInfo['id'];
- $data = $customerModel->getDataList($param);
- return resultArray(['data' => $data]);
- }
-
- /**
- * 客户公海(没有负责人或已经到期)
- * @return
- * @author Michael_xu
- */
- public function pool()
- {
- $param = $this->param;
- $param['action'] = 'pool';
- unset($param['poolId']); # todo uniApp传来的参数,临时删除掉 fanqi。
- $data = model('Customer')->getDataList($param);
- return resultArray(['data' => $data]);
- }
-
- /**
- * 添加客户
- * @param
- * @return
- * @author Michael_xu
- */
- public function save()
- {
- $customerModel = model('Customer');
- $param = $this->param;
- $userInfo = $this->userInfo;
- $param['user_id'] = $userInfo['id'];
- $param['create_user_id'] = $userInfo['id'];
- $param['owner_user_id'] = $userInfo['id'];
- if ($res = $customerModel->createData($param)) {
- return resultArray(['data' => $res]);
- } else {
- return resultArray(['error' => $customerModel->getError()]);
- }
- }
-
- /**
- * 客户详情
- * @param
- * @return
- * @author Michael_xu
- */
- public function read()
- {
- $customerModel = model('Customer');
- $cutomerLogic = new CustomerLogic();
- $param = $this->param;
- $userInfo = $this->userInfo;
- $data = $customerModel->getDataById($param['id'], $userInfo['id']);
- if (!$data) {
- return resultArray(['error' => $customerModel->getError()]);
- }
- //数据权限判断
- $userModel = new \app\admin\model\User();
- $auth_user_ids = $userModel->getUserByPer('crm', 'customer', 'read');
- //读权限
- $roPre = $userModel->rwPre($userInfo['id'], $data['ro_user_id'], $data['rw_user_id'], 'read');
- $rwPre = $userModel->rwPre($userInfo['id'], $data['ro_user_id'], $data['rw_user_id'], 'update');
- //判断是否客户池数据
- $wherePool = $customerModel->getWhereByPool();
- $resPool = db('crm_customer')->alias('customer')->where(['customer_id' => $param['id']])->where($wherePool)->find();
- if (!$resPool && !in_array($data['owner_user_id'], $auth_user_ids) && !$roPre && !$rwPre) {
- $authData['dataAuth'] = (int)0;
- return resultArray(['data' => $authData]);
- }
- return resultArray(['data' => $data]);
- }
-
- /**
- * 编辑客户
- * @param
- * @return
- * @author Michael_xu
- */
- public function update()
- {
- $customerModel = model('Customer');
- $param = $this->param;
- $userInfo = $this->userInfo;
- //数据详情
- $data = $customerModel->getDataById($param['id']);
- if (!$data) {
- return resultArray(['error' => $customerModel->getError()]);
- }
-
- $param['user_id'] = $userInfo['id'];
- if ($customerModel->updateDataById($param, $param['id'])) {
- return resultArray(['data' => '编辑成功']);
- } else {
- return resultArray(['error' => $customerModel->getError()]);
- }
- }
-
- /**
- * 删除客户
- * @param
- * @return
- * @author Michael_xu
- */
- public function delete()
- {
- $param = $this->param;
- $user = new ApiCommon();
- $userInfo = $user->userInfo;
- // 是否客户池
- if ($param['isSeas'] == 1) {
- $permission = checkPerByAction('crm', 'customer', 'poolDelete');
- } else {
- $permission = checkPerByAction('crm', 'customer', 'delete');
- }
- if ($permission == false) {
- return resultArray(['error' => '无权操作']);
- }
- $customerModel = model('Customer');
- $userModel = new \app\admin\model\User();
- $recordModel = new \app\admin\model\Record();
- $fileModel = new \app\admin\model\File();
- $actionRecordModel = new \app\admin\model\ActionRecord();
- if (!is_array($param['id'])) {
- $customer_id[] = $param['id'];
- } else {
- $customer_id = $param['id'];
- }
- $delIds = [];
- $errorMessage = [];
-
- //数据权限判断
- $auth_user_ids = $userModel->getUserByPer('crm', 'customer', 'delete');
- //判断是否客户池数据(客户池数据只有管理员可以删)
- $adminId = $userModel->getAdminId();
- $wherePool = $customerModel->getWhereByPool();
- foreach ($customer_id as $k => $v) {
- $isDel = true;
- //数据详情
- $data = db('crm_customer')->where(['customer_id' => $v])->find();
- if (!$data) {
- $isDel = false;
- $errorMessage[] = 'id为' . $v . '的客户删除失败,错误原因:' . $customerModel->getError();
- }
- $resPool = db('crm_customer')->alias('customer')->where(['customer_id' => $v])->where($wherePool)->find();
- if (!$resPool && !in_array($data['owner_user_id'], $auth_user_ids) && $isDel) {
- $isDel = false;
- $errorMessage[] = '名称为' . $data['name'] . '的客户删除失败,错误原因:无权操作';
- }
- // 公海 (原逻辑,公海仅允许管理员删除,修改为授权,不再限制)
- // if ($resPool && !in_array($data['owner_user_id'],$adminId)) {
- // $isDel = false;
- // $errorMessage[] = '名称为'.$data['name'].'的客户删除失败,错误原因:无权操作';
- // }
- //有商机、合同、联系人则不能删除
- if ($isDel) {
- $resBusiness = db('crm_business')->where(['customer_id' => $v])->find();
- if ($resBusiness) {
- $isDel = false;
- $errorMessage[] = '名称为' . $data['name'] . '的客户删除失败,错误原因:客户下存在商机,不能删除';
- }
- }
- if ($isDel) {
- $resContacts = db('crm_contacts')->where(['customer_id' => $v])->find();
- if ($resContacts) {
- $isDel = false;
- $errorMessage[] = '名称为' . $data['name'] . '的客户删除失败,错误原因:客户下存在联系人,不能删除';
- }
- }
- if ($isDel) {
- $resContract = db('crm_contract')->where(['customer_id' => $v])->find();
- if ($resContract) {
- $isDel = false;
- $errorMessage[] = '名称为' . $data['name'] . '的客户删除失败,错误原因:客户下存在合同,不能删除';
- }
- }
- if ($isDel) {
- $delIds[] = $v;
- }
- }
- $dataInfo = $customerModel->where('customer_id', ['in', $delIds])->select();
- if ($delIds) {
- $delRes = $customerModel->delDatas($delIds);
- if (!$delRes) {
- return resultArray(['error' => $customerModel->getError()]);
- }
- // 删除客户扩展数据
- db('crm_customer_data')->whereIn('customer_id', $delIds)->delete();
- // 删除跟进记录
- $recordModel->delDataByTypes(2, $delIds);
- // 删除关联附件
- $fileModel->delRFileByModule('crm_customer', $delIds);
- // 删除关联操作记录
- $actionRecordModel->delDataById(['types' => 'crm_customer', 'action_id' => $delIds]);
- foreach ($dataInfo as $k => $v) {
- RecordActionLog($userInfo['id'], 'crm_customer', 'delete', $v['name'], '', '', '删除了客户:' . $v['name']);
- }
- }
- if ($errorMessage) {
- return resultArray(['error' => $errorMessage]);
- } else {
- return resultArray(['data' => '删除成功']);
- }
- }
-
- /**
- * 客户转移
- * @param owner_user_id 变更负责人
- * @param is_remove 1移出,2转为团队成员
- * @param types business,contract 相关模块
- * @param type 权限 1只读2读写
- * @return
- * @author Michael_xu
- */
- public function transfer()
- {
- $param = $this->param;
- $userInfo = $this->userInfo;
- $customerModel = model('Customer');
- $businessModel = model('Business');
- $contractModel = model('Contract');
- $contactsModel = model('Contacts');
- $settingModel = model('Setting');
- $customerConfigModel = model('CustomerConfig');
- $userModel = new \app\admin\model\User();
-
- if (!$param['owner_user_id']) {
- return resultArray(['error' => '变更负责人不能为空']);
- }
- if (!$param['customer_id'] || !is_array($param['customer_id'])) {
- return resultArray(['error' => '请选择需要转移的客户']);
- }
- $is_remove = ($param['is_remove'] == 2) ? 2 : 1;
- $type = $param['type'] == 2 ?: 1;
- $types = $param['types'] ?: [];
-
- $data = [];
- $data['owner_user_id'] = $param['owner_user_id'];
- $data['update_time'] = time();
- $data['follow'] = '待跟进';
- # 获取客户的时间
- $data['obtain_time'] = time();
-
- $ownerUserName = $userModel->getUserNameById($param['owner_user_id']);
- $errorMessage = [];
- foreach ($param['customer_id'] as $customer_id) {
- $customerInfo = db('crm_customer')->where(['customer_id' => $customer_id])->find();
- if (!$customerInfo) {
- $errorMessage[] = '名称:为《' . $customerInfo['name'] . '》的客户转移失败,错误原因:数据不存在;';
- continue;
- }
- $resCustomer = true;
- //权限判断
- if (!$customerModel->checkData($customer_id)) {
- $errorMessage[] = $customerInfo['name'] . '转移失败,错误原因:无权限;';
- continue;
- }
- //拥有客户数上限检测
- if (!$customerConfigModel->checkData($param['owner_user_id'], 1)) {
- $errorMessage[] = $customerInfo['name'] . '转移失败,错误原因:' . $customerConfigModel->getError();
- continue;
- }
-
- //团队成员
- $teamData = [];
- $teamData['type'] = $type; //权限 1只读2读写
- $teamData['user_id'] = [$customerInfo['owner_user_id']]; //协作人
- $teamData['types'] = 'crm_customer'; //类型
- $teamData['types_id'] = $customer_id; //类型ID
- $teamData['is_del'] = ($is_remove == 1) ? 1 : '';
- $res = $settingModel->createTeamData($teamData);
-
- # 处理分配标识,待办事项专用
- $data['is_allocation'] = 1;
-
- $resCustomer = db('crm_customer')->where(['customer_id' => $customer_id])->update($data);
- if (!$resCustomer) {
- $errorMessage[] = $customerInfo['name'] . '转移失败,错误原因:数据出错;';
- continue;
- } else {
- # 处理转移时,负责人出现在只读和读写成员列表中
- $customerArray = [];
- $teamCustomer = db('crm_customer')->field(['owner_user_id', 'ro_user_id', 'rw_user_id'])->where('customer_id', $customer_id)->find();
- if (!empty($teamCustomer['ro_user_id'])) {
- $customerRo = arrayToString(array_diff(stringToArray($teamCustomer['ro_user_id']), [$teamCustomer['owner_user_id']]));
- $customerArray['ro_user_id'] = $customerRo;
- }
- if (!empty($teamCustomer['rw_user_id'])) {
- $customerRo = arrayToString(array_diff(stringToArray($teamCustomer['rw_user_id']), [$teamCustomer['owner_user_id']]));
- $customerArray['rw_user_id'] = $customerRo;
- }
- db('crm_customer')->where('customer_id', $customer_id)->update($customerArray);
- }
-
- if (in_array('crm_contacts', $types)) {
- $contactsIds = [];
- $contactsIds = db('crm_contacts')->where(['customer_id' => $customer_id])->column('contacts_id');
- if ($contactsIds) {
- $resContacts = $contactsModel->transferDataById($contactsIds, $param['owner_user_id'], $type, $is_remove);
- if ($resContacts !== true) {
- $errorMessage[] = $resContacts;
- continue;
- }
- }
- }
-
- //商机、合同转移
- if (in_array('crm_business', $types)) {
- $businessIds = [];
- $businessIds = db('crm_business')->where(['customer_id' => $customer_id])->column('business_id');
- if ($businessIds) {
- $resBusiness = $businessModel->transferDataById($businessIds, $param['owner_user_id'], $type, $is_remove);
- if ($resBusiness !== true) {
- $errorMessage = $errorMessage ? array_merge($errorMessage, $resBusiness) : $resBusiness;
- continue;
- }
- }
- }
-
- if (in_array('crm_contract', $types)) {
- $contractIds = [];
- $contractIds = db('crm_contract')->where(['customer_id' => $customer_id])->column('contract_id');
- if ($contractIds) {
- $resContract = $contractModel->transferDataById($contractIds, $param['owner_user_id'], $type, $is_remove);
- if ($resContract !== true) {
- $errorMessage = $errorMessage ? array_merge($errorMessage, $resContract) : $resContract;
- continue;
- }
- }
- }
- //修改记录
- updateActionLog($userInfo['id'], 'crm_customer', $customer_id, '', '', '将客户转移给:' . $ownerUserName);
- RecordActionLog($userInfo['id'], 'crm_customer', 'transfer', $customerInfo['name'], '', '', '将客户:' . $customerInfo['name'] . '转移给:' . $ownerUserName);
- }
- if (!$errorMessage) {
- return resultArray(['data' => '转移成功']);
- } else {
- return resultArray(['error' => $errorMessage]);
- }
- }
-
- /**
- * 客户放入公海(负责人置为0)
- * @param
- * @return
- * @author Michael_xu
- */
- public function putInPool()
- {
- if (empty($this->param['customer_id'])) return resultArray(['error' => '请选择要放入公海的客户!']);
- if (!is_array($this->param['customer_id'])) return resultArray(['error' => '客户ID格式不正确!']);
- if (empty($this->param['pool_id'])) return resultArray(['error' => '请选择公海!']);
-
- $userInfo = $this->userInfo;
- $userId = $userInfo['id'];
- $customerIds = $this->param['customer_id'];
- $poolId = $this->param['pool_id'];
- $customerModel = new \app\crm\model\Customer();
- # 消息数据
- $message = [];
-
- # 获取客户数据
- $customerData = [];
- $customerList = db('crm_customer')->field(['customer_id', 'owner_user_id', 'name'])->whereIn('customer_id', $customerIds)->select();
- foreach ($customerList as $key => $value) {
- $customerData[$value['customer_id']] = $value;
- }
-
- # 整理数据
- $ip = request()->ip();
- $poolRelationData = [];
- $poolRecordData = [];
- $fieldRecordData = [];
- $operationLogData = [];
- foreach ($customerIds as $key => $value) {
- if (empty($customerData[$value])) {
- $message[] = '将客户放入公海失败,错误原因:数据不存在!';
- unset($customerIds[(int)$key]);
-
- continue;
- }
- if (!$customerModel->checkData($value)) {
- $message[] = '"' . $customerData[$value]['name'] . '"放入公海失败,错误原因:无权限';
- continue;
- }
- if (isset($customerData[$value]['owner_user_id']) && empty($customerData[$value]['owner_user_id'])) {
- $message[] = '将客户《' . $customerData[$value]['name'] . '》放入公海失败,错误原因:已经处于公海!';
- unset($customerIds[(int)$key]);
-
- continue;
- }
-
- # 公海关联数据
- $poolRelationData[] = [
- 'pool_id' => $poolId,
- 'customer_id' => $value
- ];
- # 公海操作记录数据
- $poolRecordData[] = [
- 'customer_id' => $value,
- 'user_id' => $userId,
- 'pool_id' => $poolId,
- 'type' => 2,
- 'create_time' => time()
- ];
- # 字段操作记录数据
- $fieldRecordData[] = [
- 'user_id' => $userId,
- 'types' => 'crm_customer',
- 'action_id' => $value,
- 'content' => '将客户放入公海',
- 'create_time' => time()
- ];
- # 数据操作日志数据
- $operationLogData[] = [
- 'user_id' => $userId,
- 'client_ip' => $ip,
- 'module' => 'crm_customer',
- 'action_id' => $value,
- 'content' => '将客户放入公海',
- 'create_time' => time(),
- 'action_name' => 'update',
- 'target_name' => !empty($customerData[$value]['name']) ? $customerData[$value]['name'] : ''
- ];
- }
-
- if (empty($customerIds)) return resultArray(['error' => $message]);
-
- Db::startTrans();
- try {
- # 修改客户数据
- Db::name('crm_customer')->whereIn('customer_id', $customerIds)->exp('before_owner_user_id', 'owner_user_id')->update([
- 'ro_user_id' => '',
- 'rw_user_id' => '',
- 'owner_user_id' => 0,
- 'into_pool_time' => time()
- ]);
-
- # 删除联系人的负责人
- Db::name('crm_contacts')->whereIn('customer_id', $customerIds)->update(['owner_user_id' => 0]);
-
- # 将客户放入公海
- Db::name('crm_customer_pool_relation')->insertAll($poolRelationData);
-
- # 公海操作记录
- Db::name('crm_customer_pool_record')->insertAll($poolRecordData);
-
- # 字段操作记录
- Db::name('admin_action_record')->insertAll($fieldRecordData);
-
- # 数据操作日志
- Db::name('admin_operation_log')->insertAll($operationLogData);
-
- Db::commit();
- } catch (\Exception $e) {
- Db::rollback();
-
- $message = ['操作失败!'];
- }
-
- return resultArray(!empty($message) ? ['error' => $message] : ['data' => '操作成功!']);
-
- // $param = $this->param;
- // $userInfo = $this->userInfo;
- // $customerModel = model('Customer');
- // $settingModel = new \app\crm\model\Setting();
- // if (!$param['customer_id'] || !is_array($param['customer_id'])) {
- // return resultArray(['error' => '请选择需要放入公海的客户']);
- // }
- // $data = [];
- // $data['owner_user_id'] = 0;
- // $data['is_lock'] = 0;
- // $data['update_time'] = time();
- // $errorMessage = [];
- // foreach ($param['customer_id'] as $customer_id) {
- // $customerInfo = [];
- // $customerInfo = db('crm_customer')->where(['customer_id' => $customer_id])->find();
- // if (!$customerInfo) {
- // $errorMessage[] = '名称:为《' . $customerInfo['name'] . '》的客户放入公海失败,错误原因:数据不存在;';
- // continue;
- // }
- // //权限判断
- // if (!$customerModel->checkData($customer_id)) {
- // $errorMessage[] = '"' . $customerInfo['name'] . '"放入公海失败,错误原因:无权限';
- // continue;
- // }
- // //将团队成员全部清除
- // $data['ro_user_id'] = '';
- // $data['rw_user_id'] = '';
- // $resCustomer = db('crm_customer')->where(['customer_id' => $customer_id])->update($data);
- // if (!$resCustomer) {
- // $errorMessage[] = '"' . $customerInfo['name'] . '"放入公海失败,错误原因:数据出错;';
- // continue;
- // }
- // //联系人负责人清除
- // db('crm_contacts')->where(['customer_id' => $customer_id])->update(['owner_user_id' => 0]);
- // //修改记录
- // updateActionLog($userInfo['id'], 'crm_customer', $customer_id, '', '', '将客户放入公海');
- // RecordActionLog($userInfo['id'],'crm_pool','pool',$customerInfo['name'],'','','将客户'.$customerInfo['name'].'放入公海');
- // }
- // if (!$errorMessage) {
- // return resultArray(['data' => '操作成功']);
- // } else {
- // return resultArray(['error' => $errorMessage]);
- // }
- }
-
- /**
- * 客户锁定,解锁
- * @param is_lock 1锁定,2解锁
- * @return
- * @author Michael_xu
- */
- public function lock()
- {
- $param = $this->param;
- $userInfo = $this->userInfo;
- $customerModel = model('Customer');
- $customerConfigModel = model('CustomerConfig');
- $is_lock = ((int)$param['is_lock'] == 2) ? (int)$param['is_lock'] : 1;
- $lock_name = ($is_lock == 2) ? '解锁' : '锁定';
- if (!$param['customer_id'] || !is_array($param['customer_id'])) {
- return resultArray(['error' => '请选择需要' . $lock_name . '的客户']);
- }
- $data = [];
- $data['is_lock'] = ($is_lock == 1) ? $is_lock : 0;
- $data['update_time'] = time();
- $errorMessage = [];
- foreach ($param['customer_id'] as $customer_id) {
- $customerInfo = [];
- $customerInfo = $customerModel->getDataById($customer_id);
- if (!$customerInfo) {
- $errorMessage[] = '名称:为《' . $customerInfo['name'] . '》的客户' . $lock_name . '失败,错误原因:数据不存在;';
- continue;
- }
- //权限判断
- if (!$customerModel->checkData($customer_id)) {
- $errorMessage[] = $customerInfo['name'] . $lock_name . '失败,错误原因:无权限';
- continue;
- }
- //锁定上限检测
- if ($is_lock == 1 && !$customerConfigModel->checkData($customerInfo['owner_user_id'], 2)) {
- $errorMessage[] = $customerInfo['name'] . $lock_name . '失败,错误原因:' . $customerConfigModel->getError();
- continue;
- }
- //已成交客户,锁定,提示无需锁定
- // if ($customerInfo['deal_status'] == '已成交' && $is_lock == 1) {
- // $errorMessage[] = $customerInfo['name'].$lock_name.'失败,错误原因:已成交状态,无需锁定';
- // continue;
- // }
- $resCustomer = db('crm_customer')->where(['customer_id' => $customer_id])->update($data);
- if (!$resCustomer) {
- $errorMessage[] = $customerInfo['name'] . $lock_name . '失败,错误原因:数据出错;';
- }
- //修改记录
- updateActionLog($userInfo['id'], 'crm_customer', $customer_id, '', '', '将客户' . $lock_name);
- if ($is_lock == 2) {
- RecordActionLog($userInfo['id'], 'crm_customer', 'islock', $customerInfo['name'], '', '', '将客户' . $customerInfo['name'] . $lock_name);
- } else {
- RecordActionLog($userInfo['id'], 'crm_customer', 'lock', $customerInfo['name'], '', '', '将客户' . $customerInfo['name'] . $lock_name);
- }
- }
- if (!$errorMessage) {
- return resultArray(['data' => '操作成功']);
- } else {
- return resultArray(['error' => $errorMessage]);
- }
- }
-
- /**
- * 客户领取
- * @param
- * @return
- * @author Michael_xu
- */
- public function receive()
- {
- $param = $this->param;
- $userInfo = $this->userInfo;
- $customerModel = model('Customer');
- $customerConfigModel = model('CustomerConfig');
-
- $customer_ids = $param['customer_id'] ?: $userInfo['id'];
- if (!$customer_ids || !is_array($customer_ids)) {
- return resultArray(['error' => '请选择需要领取的客户']);
- }
- $errorMessage = [];
- $wherePool = $customerModel->getWhereByPool();
- foreach ($customer_ids as $k => $v) {
- $dataName = db('crm_customer')->where(['customer_id' => $v])->value('name');
- //判断是否是客户池数据
- $resPool = db('crm_customer')->alias('customer')->where(['customer_id' => $v])->where($wherePool)->find();
- if (!$resPool) {
- $errorMessage[] = '客户《' . $dataName . '》领取失败,错误原因:非公海数据无权操作;';
- continue;
- }
- //拥有客户数上限检测
- if (!$customerConfigModel->checkData($userInfo['id'], 1)) {
- $errorMessage[] = '客户《' . $dataName . '》领取失败,错误原因:' . $customerConfigModel->getError();
- continue;
- }
- $data = [];
- $data['owner_user_id'] = $userInfo['id'];
- $data['update_time'] = time();
- $data['deal_time'] = time();
- $data['follow'] = '待跟进';
- //将团队成员全部清除
- $data['ro_user_id'] = '';
- $data['rw_user_id'] = '';
- # 获取客户的时间
- $data['obtain_time'] = time();
- $resCustomer = db('crm_customer')->where(['customer_id' => $v])->update($data);
- if (!$resCustomer) {
- $errorMessage[] = '客户《' . $dataName . '》领取失败,错误原因:数据出错;';
- continue;
- }
- //联系人领取
- db('crm_contacts')->where(['customer_id' => $v])->update(['owner_user_id' => $userInfo['id']]);
- //修改记录
- updateActionLog($userInfo['id'], 'crm_customer', $v, '', '', '领取了客户');
- RecordActionLog($userInfo['id'], 'crm_customer', 'update', $dataName, '', '', '领取了客户:' . $dataName);
- }
- if (!$errorMessage) {
- return resultArray(['data' => '领取成功']);
- } else {
- return resultArray(['error' => $errorMessage]);
- }
- }
-
- /**
- * 客户分配
- * @param
- * @return
- * @author Michael_xu
- */
- public function distribute()
- {
- $param = $this->param;
- $userInfo = $this->userInfo;
- $customerModel = model('Customer');
- $userModel = new \app\admin\model\User();
- $customerConfigModel = model('CustomerConfig');
-
- $customer_ids = $param['customer_id'];
- $owner_user_id = $param['owner_user_id'];
- if (!$customer_ids || !is_array($customer_ids)) {
- return resultArray(['error' => '请选择需要分配的客户']);
- }
- if (!$owner_user_id) {
- return resultArray(['error' => '请选择分配人']);
- }
- $ownerUserName = $userModel->getUserNameById($owner_user_id);
-
- $errorMessage = [];
- $wherePool = $customerModel->getWhereByPool();
- foreach ($customer_ids as $k => $v) {
- $dataName = db('crm_customer')->where(['customer_id' => $v])->value('name');
- //判断是否是客户池数据
- $resPool = db('crm_customer')->alias('customer')->where(['customer_id' => $v])->where($wherePool)->find();
- if (!$resPool) {
- $errorMessage[] = '客户《' . $dataName . '》分配失败,错误原因:非公海数据无权操作;';
- continue;
- }
- //拥有客户数上限检测
- if (!$customerConfigModel->checkData($owner_user_id, 1)) {
- $errorMessage[] = '客户《' . $dataName . '》分配失败,错误原因:' . $customerConfigModel->getError();
- continue;
- }
- $data = [];
- $data['owner_user_id'] = $owner_user_id;
- $data['update_time'] = time();
- $data['deal_time'] = time();
- $data['follow'] = '待跟进';
- //将团队成员全部清除
- $data['ro_user_id'] = '';
- $data['rw_user_id'] = '';
- # 处理分配标识,待办事项专用
- $data['is_allocation'] = 1;
- # 获取客户的时间
- $data['obtain_time'] = time();
- $resCustomer = db('crm_customer')->where(['customer_id' => $v])->update($data);
- if (!$resCustomer) {
- $errorMessage[] = '客户《' . $dataName . '》分配失败,错误原因:数据出错;';
- }
- db('crm_contacts')->where(['customer_id' => $v])->update(['owner_user_id' => $owner_user_id]);
- //修改记录
- updateActionLog($userInfo['id'], 'crm_customer', $v, '', '', '将客户分配给:' . $ownerUserName);
- RecordActionLog($userInfo['id'], 'crm_customer', 'distribute', $dataName, '', '', '将客户' . $dataName . '分配给:' . $ownerUserName);
- //站内信
- $send_user_id[] = $owner_user_id;
- $sendContent = $userInfo['realname'] . '将客户《' . $dataName . '》,分配给您';
- if ($send_user_id) {
- sendMessage($send_user_id, $sendContent, $v, 1);
- }
- }
- if (!$errorMessage) {
- return resultArray(['data' => '分配成功']);
- } else {
- return resultArray(['error' => $errorMessage]);
- }
- }
-
- /**
- * 客户导出
- * @param
- * @return
- * @author Michael_xu
- */
- public function excelExport()
- {
- $param = $this->param;
- $userInfo = $this->userInfo;
- $param['user_id'] = $userInfo['id'];
- $action_name = '导出全部';
- if ($param['customer_id']) {
- $param['customer_id'] = ['condition' => 'in', 'value' => $param['customer_id'], 'form_type' => 'text', 'name' => ''];
- $action_name = '导出选中';
- }
- $param['is_excel'] = 1;
- $excelModel = new \app\admin\model\Excel();
- // 导出的字段列表
- $fieldModel = new \app\admin\model\Field();
- $field_list = $fieldModel->getIndexFieldConfig('crm_customer', $userInfo['id'], '', 'excel');
- // 文件名
- $file_name = '5kcrm_customer_' . date('Ymd');
-
- $model = model('Customer');
- $temp_file = $param['temp_file'];
- unset($param['temp_file']);
- $page = $param['page'] ?: 1;
- unset($param['page']);
- unset($param['export_queue_index']);
- RecordActionLog($userInfo['id'], 'crm_customer', 'excelexport', $action_name, '', '', '导出客户');
- return $excelModel->batchExportCsv($file_name, $temp_file, $field_list, $page, function ($page, $limit) use ($model, $param, $field_list) {
- $param['page'] = $page;
- $param['limit'] = $limit;
- $data = $model->getDataList($param);
- $data['list'] = $model->exportHandle($data['list'], $field_list, 'customer');
- return $data;
- });
-
- }
-
- /**
- * 客户导入模板下载
- * @param string $save_path 本地保存路径 用于错误数据导出,在 Admin\Model\Excel::batchImportData()调用
- * @return
- * @author Michael_xu
- */
- public function excelDownload($save_path = '')
- {
- # 下次升级
- $param = $this->param;
- $userInfo = $this->userInfo;
- $excelModel = new \app\admin\model\Excel();
- // 导入的字段列表
- $fieldModel = new \app\admin\model\Field();
- $fieldParam['types'] = 'crm_customer';
- $fieldParam['action'] = 'excel';
- $field_list = $fieldModel->field($fieldParam);
- $field = [1 => [
- 'field' => 'owner_user_id',
- 'types' => 'crm_customer',
- 'name' => '负责人',
- 'form_type' => 'user',
- 'default_value' => '',
- 'is_null' => 1,
- 'input_tips' => '',
- 'setting' => array(),
- 'is_hidden' => 0,
- 'writeStatus' => 1,
- 'value' => '']
- ];
- $first_array = array_splice($field_list, 2, 0, $field);
- $excelModel->excelImportDownload($field_list, 'crm_customer', $save_path);
- }
-
-
- /**
- * 客户数据导入
- * @param
- * @return
- * @author Michael_xu
- */
- public function excelImport()
- {
- $param = $this->param;
- $userInfo = $this->userInfo;
- $excelModel = new \app\admin\model\Excel();
- $param['create_user_id'] = $userInfo['id'];
- $param['owner_user_id'] = $param['owner_user_id'] ?: 0;
- $param['deal_time'] = time();
- $param['deal_status'] = '未成交';
- $param['types'] = 'crm_customer';
- $file = request()->file('file');
- // $res = $excelModel->importExcel($file, $param, $this);
- $res = $excelModel->batchImportData($file, $param, $this);
- RecordActionLog($userInfo['id'], 'crm_customer', 'excel', '导入客户', '', '', '导入客户');
- return resultArray(['data' => $excelModel->getError()]);
- }
-
- /**
- * 客户标记为已跟进
- * @param
- * @return
- * @author Michael_xu
- */
- public function setFollow()
- {
- $param = $this->param;
- $customerIds = $param['id'] ?: [];
- if (!$customerIds || !is_array($customerIds)) {
- return resultArray(['error' => '参数错误']);
- }
- $data['follow'] = '已跟进';
- $data['update_time'] = time();
- $res = db('crm_customer')->where(['customer_id' => ['in', $customerIds]])->update($data);
- if (!$res) {
- return resultArray(['error' => '操作失败,请重试']);
- }
- return resultArray(['data' => '跟进成功']);
- }
-
- /**
- * 置顶 / 取消置顶
- * @return [type] [description]
- */
- public function top()
- {
- $customerModel=model('Customer');
- $param = $this->param;
- $userInfo = $this->userInfo;
- $param['create_role_id'] = $userInfo['id'];
- $param['top_time'] = time();
-
- $top_id = Db::name('crm_top')->where(['module' => ['eq', $param['module']], 'create_role_id' => ['eq', $userInfo['id']], 'module_id' => ['eq', $param['module_id']]])->column('top_id');
- if ($top_id) {
- if ($res = Db::name('crm_top')->where('top_id', $top_id[0])->update($param)) {
- return resultArray(['data' => $res]);
- } else {
- return resultArray(['error' => Db::name('crm_top')->getError()]);
- }
- } else {
- if ($res = Db::name('crm_top')->data($param)->insert()) {
- return resultArray(['data' => $res]);
- } else {
- return resultArray(['error' => $customerModel->getError()]);
- }
- }
- }
-
- /**
- * 客户成交状态
- * @param status 1已成交,2未成交
- * @return
- * @author Michael_xu
- */
- public function deal_status()
- {
- $param = $this->param;
- $userInfo = $this->userInfo;
- $statusArr = ['1' => '已成交', '2' => '未成交'];
- $statusList = ['1', '2'];
- if (!$param['customer_id'] || !in_array($param['status'], $statusList)) {
- return resultArray(['error' => '参数错误']);
- }
- $customerModel = model('Customer');
- $customerConfigModel = model('CustomerConfig');
- $userModel = new \app\admin\model\User();
- $customer_ids = $param['customer_id'];
- if (!is_array($customer_ids) || !$customer_ids) {
- $customer_ids[] = $customer_ids;
- }
- $data = [];
- $data['update_time'] = time();
- $data['deal_time'] = time();
- $data['deal_status'] = $statusArr[$param['status']];
- $errorMessage = [];
- foreach ($customer_ids as $customer_id) {
- $dataInfo = [];
- $dataInfo = db('crm_customer')->where(['customer_id' => $customer_id])->field('owner_user_id,deal_status,name')->find();
- //权限判断
- if (!$customerModel->checkData($customer_id, 1)) {
- $errorMessage[] = '名称:为《' . $dataInfo['name'] . '》的客户更改失败,错误原因:' . $customerModel->getError();
- continue;
- }
- $owner_user_id = $dataInfo['owner_user_id'];;
- if (!$owner_user_id) {
- $errorMessage[] = '名称:为《' . $dataInfo['name'] . '》的客户更改失败,错误原因:公海数据无权操作';
- continue;
- }
- //拥有客户数上限检测
- if ($statusArr[$param['status']] == '未成交' && $dataInfo['deal_status'] == '已成交') {
- if (!$customerConfigModel->checkData($owner_user_id, 1, 1)) {
- $errorMessage[] = '名称:为《' . $dataInfo['name'] . '》的客户更改失败,错误原因:' . $customerConfigModel->getError();
- continue;
- }
- }
- if ($statusArr[$param['status']] == '已成交') {
- $data['is_lock'] = 0;
- }
- $res = db('crm_customer')->where(['customer_id' => $customer_id])->update($data);
- if (!$res) {
- $errorMessage[] = '名称:为《' . $dataInfo['name'] . '》的客户更改失败,错误原因:操作失败,请重试!';
- continue;
- }
- //修改记录
- updateActionLog($userInfo['id'], 'crm_customer', $customer_id, ['deal_status' => $dataInfo['deal_status']], ['deal_status' => $data['deal_status']]);
- if ($param['status'] == 1) {
- RecordActionLog($userInfo['id'], 'crm_customer', 'status', $dataInfo['name'], '', '', '修改客户:' . $dataInfo['name'] . '成交状态:' . $statusArr[$param['status']]);
- } else {
- RecordActionLog($userInfo['id'], 'crm_customer', 'status', $dataInfo['name'], '', '', '修改客户:' . $dataInfo['name'] . '成交状态:' . $statusArr[$param['status']]);
- }
- }
- if (!$errorMessage) {
- return resultArray(['data' => '操作成功']);
- } else {
- return resultArray(['error' => $errorMessage]);
- }
- }
-
- /**
- * 设置关注
- *
- * @return \think\response\Json
- * @throws \think\Exception
- * @throws \think\exception\PDOException
- */
- public function star()
- {
- $userId = $this->userInfo['id'];
- $targetId = $this->param['target_id'];
- $type = $this->param['type'];
-
- if (empty($userId) || empty($targetId) || empty($type)) return resultArray(['error' => '缺少必要参数!']);
-
- if (!$this->setStar($type, $userId, $targetId)) {
- return resultArray(['error' => '设置关注失败!']);
- }
-
- return resultArray(['data' => '设置关注成功!']);
- }
-
- /**
- * 附近客户
- *
- * @return \think\response\Json
- */
- public function nearby()
- {
- if (empty($this->param['lng'])) return resultArray(['error' => '缺少经度参数!']);
- if (empty($this->param['lat'])) return resultArray(['error' => '缺少纬度参数!']);
- if (empty($this->param['distance'])) return resultArray(['error' => '请选择距离!']);
-
- $customerModel = model('Customer');
-
- $data = $customerModel->getNearbyList($this->param);
-
- return resultArray(['data' => $data]);
- }
-
- /**
- * 系统信息
- *
- * @return \think\response\Json
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- public function system()
- {
- if (empty($this->param['id'])) return resultArray(['error' => '参数错误!']);
-
- $customerModel = new \app\crm\model\Customer();
-
- $data = $customerModel->getSystemInfo($this->param['id']);
-
- return resultArray(['data' => $data]);
- }
-
- /**
- * table标签栏数量
- *
- * @return \think\response\Json
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- public function count()
- {
- if (empty($this->param['customer_id'])) return resultArray(['error' => '参数错误!']);
-
- $userInfo = $this->userInfo;
-
- $customerId = $this->param['customer_id'];
-
- # 联系人
- $contactsAuth = $this->getContactsSearchWhere($userInfo['id']);
- $contactsCount = Db::name('crm_contacts')->where('customer_id', $customerId)->where($contactsAuth)->count();
-
- # 团队成员
- $customer = Db::name('crm_customer')->field(['owner_user_id', 'ro_user_id', 'rw_user_id'])->where('customer_id', $customerId)->find();
- $customer['ro_user_id'] = explode(',', trim($customer['ro_user_id'], ','));
- $customer['rw_user_id'] = explode(',', trim($customer['rw_user_id'], ','));
- $customer['owner_user_id'] = [$customer['owner_user_id']];
- $teamCount = array_filter(array_unique(array_merge($customer['ro_user_id'], $customer['rw_user_id'], $customer['owner_user_id'])));
-
- # 商机
- $businessAuth = $this->getBusinessSearchWhere($userInfo['id']);
- $businessCount = Db::name('crm_business')->where('customer_id', $customerId)->where($businessAuth)->count();
-
- # 合同
- $contractAuth = $this->getContractSearchWhere($userInfo['id']);
- $contractCount = Db::name('crm_contract')->where('customer_id', $customerId)->where($contractAuth)->count();
-
- # 回款
- $receivablesAuth = $this->getReceivablesSearchWhere();
- $receivablesCount = Db::name('crm_receivables')->where('customer_id', $customerId)->whereIn('owner_user_id', $receivablesAuth)->count();
-
- # 回访
- $visitAuth = $this->getVisitSearchWhere($userInfo['id']);
- $visitCount = Db::name('crm_visit')->where(['customer_id' => $customerId, 'deleted_state' => 0])->where($visitAuth)->count();
-
- # 发票
- $invoiceAuth = $this->getInvoiceSearchWhere();
- $invoiceCount = Db::name('crm_invoice')->where('customer_id', $customerId)->whereIn('owner_user_id', $invoiceAuth)->count();
-
- # 附件
- $fileCount = Db::name('crm_customer_file')->alias('customer')->join('__ADMIN_FILE__ file', 'file.file_id = customer.file_id')->where('customer_id', $customerId)->count();
-
- $data = [
- 'businessCount' => $businessCount,
- 'contactCount' => $contactsCount,
- 'contractCount' => $contractCount,
- 'fileCount' => $fileCount,
- 'invoiceCount' => $invoiceCount,
- 'memberCount' => count($teamCount),
- 'receivablesCount' => $receivablesCount,
- 'returnVisitCount' => $visitCount
- ];
-
- return resultArray(['data' => $data]);
- }
-
- /**
- * 公海权限
- *
- * @param CustomerLogic $customerLogic
- * @return \think\response\Json
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- public function poolAuthority(CustomerLogic $customerLogic)
- {
- $authority = [
- 'delete' => false, # 删除
- 'distribute' => false, # 分配
- 'excelexport' => false, # 导出
- 'index' => false, # 列表
- 'receive' => false, # 领取
- ];
-
- $userId = $this->userInfo['id'];
-
- if (empty($userId)) return resultArray(['data' => $authority]);
-
- # 员工角色数据
- $groupIds = $customerLogic->getEmployeeGroups($userId);
- # 员工角色下的规则数据
- $ruleIds = $customerLogic->getEmployeeRules($groupIds);
- # 公海规则数据
- $poolRules = $customerLogic->getPoolRules();
-
- # 整理员工规则数据
- $rules = [];
- $ruleIds = implode(',', $ruleIds);
- $rules = array_filter(array_unique(explode(',', $ruleIds)));
- # 整理公海规则数据
- $deleteId = $distributeId = $exportId = $indexId = $receiveId = 0;
- foreach ($poolRules as $key => $value) {
- if ($value['name'] == 'pool') $indexId = $value['id'];
- if ($value['name'] == 'distribute') $distributeId = $value['id'];
- if ($value['name'] == 'receive') $receiveId = $value['id'];
- if ($value['name'] == 'poolExcelExport') $exportId = $value['id'];
- if ($value['name'] == 'poolDelete') $deleteId = $value['id'];
- }
-
- # 权限判断
- $authority['delete'] = $userId == 1 || in_array(1, $groupIds) || in_array($deleteId, $rules) ? true : false;
- $authority['distribute'] = $userId == 1 || in_array(1, $groupIds) || in_array($distributeId, $rules) ? true : false;
- $authority['excelexport'] = $userId == 1 || in_array(1, $groupIds) || in_array($exportId, $rules) ? true : false;
- $authority['index'] = $userId == 1 || in_array(1, $groupIds) || in_array($indexId, $rules) ? true : false;
- $authority['receive'] = $userId == 1 || in_array(1, $groupIds) || in_array($receiveId, $rules) ? true : false;
-
- return resultArray(['data' => $authority]);
- }
-
- /**
- * 客户级别列表
- *
- * @return \think\response\Json
- * @since 2021-03-29
- * @author fanqi
- */
- public function level()
- {
- $data = db('admin_field')->where(['types' => 'crm_customer', 'field' => 'level'])->value('setting');
-
- $data = explode(chr(10), $data);
-
- return resultArray(['data' => $data]);
- }
- }
|