You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

556 lines
20 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
// +----------------------------------------------------------------------
// | Description: 联系人
// +----------------------------------------------------------------------
// | Author: Michael_xu | gengxiaoxu@5kcrm.com
// +----------------------------------------------------------------------
namespace app\crm\controller;
use app\admin\controller\ApiCommon;
use app\crm\traits\SearchConditionTrait;
use app\crm\traits\StarTrait;
use think\Hook;
use think\Request;
use think\Db;
class Contacts extends ApiCommon
{
use StarTrait, SearchConditionTrait;
/**
* 用于判断权限
* @permission 无限制
* @allow 登录用户可访问
* @other 其他根据系统设置
**/
public function _initialize()
{
$action = [
'permission'=>['exceldownload'],
'allow'=>['index','relation','setprimary','getcontactslist','system','count']
];
Hook::listen('check_auth',$action);
$request = Request::instance();
$a = strtolower($request->action());
if (!in_array($a, $action['permission'])) {
parent::_initialize();
}
}
/**
* 联系人列表
* @author Michael_xu
* @return
*/
public function index()
{
$contactsModel = model('Contacts');
$param = $this->param;
$userInfo = $this->userInfo;
$param['user_id'] = $userInfo['id'];
$data = $contactsModel->getDataList($param);
return resultArray(['data' => $data]);
}
/**
* 添加联系人
* @author Michael_xu
* @param
* @return
*/
public function save()
{
$contactsModel = model('Contacts');
$param = $this->param;
$userInfo = $this->userInfo;
$param['create_user_id'] = $userInfo['id'];
$param['owner_user_id'] = $userInfo['id'];
if ($data = $contactsModel->createData($param)) {
# 商机管理联系人
$business_id = $param['business_id'] ? $param['business_id'] : 0;
if (!empty($business_id)) {
$data['business_id'] = $business_id;
if ($res = Db::name('crm_contacts_business')->data($data)->insert()) {
return resultArray(['data' => '添加成功']);
} else {
return resultArray(['error' => Db::name('crm_contacts_business')->getError()]);
}
}
return resultArray(['data' => '添加成功']);
} else {
return resultArray(['error' => $contactsModel->getError()]);
}
}
/**
* 联系人详情
* @author Michael_xu
* @param
* @return
*/
public function read()
{
$contactsModel = model('Contacts');
$userModel = new \app\admin\model\User();
$param = $this->param;
$data = $contactsModel->getDataById($param['id'], $this->userInfo['id']);
//判断权限
$auth_user_ids = $userModel->getUserByPer('crm', 'contacts', 'read');
if (!in_array($data['owner_user_id'],$auth_user_ids)) {
$authData['dataAuth'] = (int)0;
return resultArray(['data' => $authData]);
}
if (!$data) {
return resultArray(['error' => $contactsModel->getError()]);
}
return resultArray(['data' => $data]);
}
/**
* 编辑联系人
* @author Michael_xu
* @param
* @return
*/
public function update()
{
$contactsModel = model('Contacts');
$param = $this->param;
$userInfo = $this->userInfo;
$param['user_id'] = $userInfo['id'];
// //判断权限
// $data = $contactsModel->getDataById($param['id']);
// $auth_user_ids = $userModel->getUserByPer('crm', 'contacts', 'update');
// if (!in_array($data['owner_user_id'],$auth_user_ids)) {
// header('Content-Type:application/json; charset=utf-8');
// exit(json_encode(['code'=>102,'error'=>'无权操作']));
// }
if ($contactsModel->updateDataById($param, $param['id'])) {
return resultArray(['data' => '编辑成功']);
} else {
return resultArray(['error' => $contactsModel->getError()]);
}
}
/**
* 删除联系人
* @author Michael_xu
* @param
* @return
*/
public function delete()
{
$param = $this->param;
$contactsModel = model('Contacts');
$recordModel = new \app\admin\model\Record();
$fileModel = new \app\admin\model\File();
$actionRecordModel = new \app\admin\model\ActionRecord();
if (!is_array($param['id'])) {
$contacts_id[] = $param['id'];
} else {
$contacts_id = $param['id'];
}
$delIds = [];
$errorMessage = [];
//数据权限判断
$userModel = new \app\admin\model\User();
$auth_user_ids = $userModel->getUserByPer('crm', 'contacts', 'delete');
foreach ($contacts_id as $k=>$v) {
$isDel = true;
//数据详情
$data = $contactsModel->getDataById($v);
if (!$data) {
$isDel = false;
$errorMessage[] = 'id为'.$v.'的联系人删除失败,错误原因:'.$contactsModel->getError();
}
if (!in_array($data['owner_user_id'],$auth_user_ids)) {
$isDel = false;
$errorMessage[] = '名称为'.$data['name'].'的联系人删除失败,错误原因:无权操作';
}
if ($isDel) {
$delIds[] = $v;
}
}
$dataInfo = $contactsModel->getDataById($v);
if ($delIds) {
$data = $contactsModel->delDatas($delIds);
if (!$data) {
return resultArray(['error' => $contactsModel->getError()]);
}
// 删除联系人扩展数据
db('crm_contacts_data')->whereIn('contacts_id', $delIds)->delete();
//删除跟进记录
$recordModel->delDataByTypes(3,$delIds);
//删除关联附件
$fileModel->delRFileByModule('crm_contacts',$delIds);
//删除关联操作记录
$actionRecordModel->delDataById(['types'=>'crm_contacts','action_id'=>$delIds]);
$userInfo = $this->userInfo;
foreach ($contacts_id as $k => $v) {
RecordActionLog($userInfo['id'], 'crm_contacts', 'delete', $dataInfo['name'], '', '', '删除了联系人:' . $dataInfo['name']);
}
}
if ($errorMessage) {
return resultArray(['error' => $errorMessage]);
} else {
return resultArray(['data' => '删除成功']);
}
}
/**
* 联系人转移
* @author Michael_xu
* @param owner_user_id 变更负责人
* @param is_remove 1移出2转为团队成员
* @param type 权限 1只读2读写
* @return
*/
public function transfer()
{
$param = $this->param;
$userInfo = $this->userInfo;
$contactsModel = model('Contacts');
$settingModel = model('Setting');
$userModel = new \app\admin\model\User();
$authIds = $userModel->getUserByPer(); //权限范围的user_id
if (!$param['owner_user_id']) {
return resultArray(['error' => '变更负责人不能为空']);
}
$owner_user_info = $userModel->getUserById($param['owner_user_id']);
if (!$param['contacts_id'] || !is_array($param['contacts_id'])) {
return resultArray(['error' => '请选择需要转移的联系人']);
}
$is_remove = $param['is_remove'] == 2 ? : 1;
$type = $param['type'] == 2 ? : 1;
$data = [];
$data['owner_user_id'] = $param['owner_user_id'];
$data['update_time'] = time();
$errorMessage = [];
foreach ($param['contacts_id'] as $contacts_id) {
$contactsInfo = $contactsModel->getDataById($contacts_id);
// 转移至当前负责人的直接跳过
if ($param['owner_user_id'] == $contactsInfo['owner_user_id']) continue;
if (!$contactsInfo) {
$errorMessage[] = '名称:为《'.$contactsInfo['name'].'》的联系人转移失败,错误原因:数据不存在;';
continue;
}
//权限判断
if (!in_array($contactsInfo['owner_user_id'],$authIds)) {
$errorMessage[] = $contactsInfo['name'].'"转移失败,错误原因:无权限;';
continue;
}
$resContacts = db('crm_contacts')->where(['contacts_id' => $contacts_id])->update($data);
if (!$resContacts) {
$errorMessage[] = $contactsInfo['name'].'"转移失败,错误原因:数据出错;';
continue;
}
updateActionLog($userInfo['id'], 'crm_contacts', $contacts_id, '', '', '将联系人转移给:' . $owner_user_info['realname']);
RecordActionLog($userInfo['id'], 'crm_contacts', 'transfer',$contactsInfo['name'], '','','将联系人:'.$contactsInfo['name'].'转移给:' . $owner_user_info['realname']);
}
if (!$errorMessage) {
return resultArray(['data' => '转移成功']);
} else {
return resultArray(['error' => $errorMessage]);
}
}
/**
* 联系人导入模板
* @author Michael_xu
* @param string $save_path 本地保存路径 用于错误数据导出,在 Admin\Model\Excel::importExcel()调用
* @return
*/
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_contacts';
$fieldParam['action'] = 'excel';
$field_list = $fieldModel->field($fieldParam);
$array=[];
$field=[1=>[
'field'=>'owner_user_id',
'types'=>'crm_contacts',
'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_contacts', $save_path);
}
/**
* 联系人导出
* @author Michael_xu
* @param
* @return
*/
public function excelExport()
{
$param = $this->param;
$userInfo = $this->userInfo;
$param['user_id'] = $userInfo['id'];
$action_name='导出全部';
if ($param['contacts_id']) {
$param['contacts_id'] = ['condition' => 'in','value' => $param['contacts_id'],'form_type' => 'text','name' => ''];
$param['is_excel'] = 1;
$action_name='导出选中';
}
$excelModel = new \app\admin\model\Excel();
// 导出的字段列表
$fieldModel = new \app\admin\model\Field();
$field_list = $fieldModel->getIndexFieldConfig('crm_contacts', $userInfo['id'],'','excel');
// 文件名
$file_name = '5kcrm_contacts_'.date('Ymd');
$model = model('Contacts');
$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_contracts','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, 'contacts');
return $data;
});
}
/**
* 联系人数据导入
* @author Michael_xu
* @param
* @return
*/
public function excelImport()
{
$param = $this->param;
$userInfo = $this->userInfo;
$excelModel = new \app\admin\model\Excel();
$param['types'] = 'crm_contacts';
$param['create_user_id'] = $userInfo['id'];
$param['owner_user_id'] = $param['owner_user_id'] ? : $userInfo['id'];
$file = request()->file('file');
// $res = $excelModel->importExcel($file, $param, $this);
$res = $excelModel->batchImportData($file, $param, $this);
// if (!$res) {
// return resultArray(['error'=>$excelModel->getError()]);
// }
RecordActionLog($userInfo['id'],'crm_contacts','excel','导入联系人','','','导入联系人');
return resultArray(['data' => $excelModel->getError()]);
}
/**
* 联系人 关联/取消关联 商机
* @return [type] [description]
*/
public function relation()
{
$param = $this->param;
if (!$param['contacts_id'] || !$param['contacts_id']) {
return resultArray(['error' => '参数错误!']);
}
$res = 1;
if ($param['is_relation'] == 1) {//关联
$data = [];
if (is_array($param['contacts_id'])) {//商机关联联系人
foreach ($param['contacts_id'] as $key => $value) {
$data['contacts_id'] = $value;
$data['business_id'] = $param['business_id'];
$ret = Db::name('crm_contacts_business')->where(['contacts_id' => $value,'business_id' => $param['business_id']])->find();
if (!$ret) {
if (!Db::name('crm_contacts_business')->insert($data)) {
$res = 0;
}
}
}
} else {//联系人关联商机
foreach ($param['business_id'] as $key => $value) {
$data['business_id'] = $value;
$data['contacts_id'] = $param['contacts_id'];
$ret = Db::name('crm_contacts_business')->where(['contacts_id' => $param['contacts_id'],'business_id' => $value])->find();
if (!$ret) {
if (!Db::name('crm_contacts_business')->insert($data)) {
$res = 0;
}
}
}
}
} else {//取消关联
$where = array();
if (is_array($param['contacts_id'])) {
$where['contacts_id'] = array('in',$param['contacts_id']);
$where['business_id'] = array('eq',$param['business_id']);
} else {
$where['business_id'] = array('in',$param['business_id']);
$where['contacts_id'] = array('eq',$param['contacts_id']);
}
Db::name('crm_contacts_business')->where($where)->delete();
# 商机首要联系人处理
if (is_array($param['contacts_id'])) {
foreach ($param['contacts_id'] AS $key => $value) {
$contactsId = Db::name('crm_business')->where('business_id', $param['business_id'])->value('contacts_id');
if ($contactsId == $value) {
Db::name('crm_business')->where('business_id', $param['business_id'])->update(['contacts_id' => 0]);
}
}
}
}
if ($res == 1) {
return resultArray(['data' => '操作成功!']);
} else {
return resultArray(['error' => '操作失败,请重试!']);
}
}
/**
* 设置关注
*
* @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
* @throws \think\Exception
* @throws \think\exception\PDOException
*/
public function setPrimary()
{
$customerId = $this->param['customer_id'];
$contactsId = $this->param['contacts_id'];
if (empty($customerId)) return resultArray(['error' => '缺少客户ID']);
if (empty($customerId)) return resultArray(['error' => '缺少联系人ID']);
$contactsModel = new \app\crm\model\Contacts();
$contactsModel->setPrimary($customerId, $contactsId);
return resultArray(['data' => '操作成功!']);
}
/**
* 获取联系人
*
* @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getContactsList()
{
if (empty($this->param['customer_id'])) return resultArray(['error' => '缺少客户ID']);
$contactsModel = new \app\crm\model\Contacts();
$data = $contactsModel->getContactsList($this->param['customer_id']);
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' => '参数错误!']);
$contactsModel = new \app\crm\model\Contacts();
$data = $contactsModel->getSystemInfo($this->param['id']);
return resultArray(['data' => $data]);
}
/**
* table标签栏数量
*
* @return \think\response\Json
* @throws \think\Exception
*/
public function count()
{
if (empty($this->param['contacts_id'])) return resultArray(['error' => '参数错误!']);
$contactsId = $this->param['contacts_id'];
$userInfo = $this->userInfo;
# 团队成员
$contacts = Db::name('crm_contacts')->field(['owner_user_id', 'ro_user_id', 'rw_user_id'])->where('contacts_id', $contactsId)->find();
$contacts['ro_user_id'] = stringToArray($contacts['ro_user_id']);
$contacts['rw_user_id'] = stringToArray($contacts['rw_user_id']);
$contacts['owner_user_id'] = [$contacts['owner_user_id']];
$teamCount = array_filter(array_unique(array_merge($contacts['ro_user_id'], $contacts['rw_user_id'], $contacts['owner_user_id'])));
# 查询联系人和商机的关联表
$businessIds = Db::name('crm_contacts_business')->where('contacts_id', $contactsId)->column('business_id');
# 商机权限条件
$businessAuth = $this->getBusinessSearchWhere($userInfo['id']);
# 商机
$businessCount = Db::name('crm_business')->whereIn('business_id', $businessIds)->where($businessAuth)->count();
# 附件
$fileCount = Db::name('crm_contacts_file')->alias('contacts')->join('__ADMIN_FILE__ file', 'file.file_id = contacts.file_id', 'LEFT')->where('contacts_id', $contactsId)->count();
$data = [
'businessCount' => $businessCount,
'fileCount' => $fileCount,
'memberCount' => count($teamCount),
];
return resultArray(['data' => $data]);
}
}