1、为什么我们企业会选择 Flexus 云服务器 X 实例来部署自己的 CRM 管理系统?



因为基于华为云 Flexus X 实例搭建 CRM 管理平台,可以从容面对企业内部瞬息万变的业务压力变化
2、华为云服务器 Flexus X 方案及优势:
灵活伸缩
搭配弹性伸缩服务 AS 及负载均衡服务 ELB,可以实现基于业务负载的快速弹缩,从容应对多变的市场业务压力
数据可靠
搭配华为云数据库服务,存储电商持久化数据,使用方便,可靠性高
安全可靠
搭配 WAF、DDoS 等网络安全服务,实现对电商业务全方位安全防护,降低黑客入侵风险


3、在宝塔里面安装必要的环境 PHP7.3、Mysql5.6+、NGINX


4、安装搭建好,进入 CRM 管理界面:

点击添加客户信息的时候就会发现,提示:
APP Referer 校验失败。请检查该 ak 设置的白名单与访问所有的域名是否一致。详情查看:http://lbsyun.baidu.com/apiconsole/key#
这是由于百度地图 api 接口没有配置好导致的问题出现

当配置好地图参数之后,就可以进行地区定位和使用附件客户等功能了



5、客户详情功能模块代码
{
$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 appadminmodelUser();
authuserids=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(′crmcustomer′)−>alias(′customer′)−>where([′customerid′=>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]);
}
6、编辑客户功能模块代码
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[′userid′]=userInfo['id'];
if (customerModel−>updateDataById(param, $param['id'])) {
return resultArray(['data' => '编辑成功']);
} else {
return resultArray(['error' => $customerModel->getError()]);
}
}
7、删除客户功能模块代码
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 appadminmodelUser();
$recordModel = new appadminmodelRecord();
$fileModel = new appadminmodelFile();
$actionRecordModel = new appadminmodelActionRecord();
if (!is_array($param['id'])) {
customerid[]=param['id'];
} else {
customerid=param['id'];
}
$delIds = [];
$errorMessage = [];
//数据权限判断
authuserids=userModel->getUserByPer('crm', 'customer', 'delete');
//判断是否客户池数据(客户池数据只有管理员可以删)
adminId=userModel->getAdminId();
wherePool=customerModel->getWhereByPool();
foreach (customeridask => $v) {
$isDel = true;
//数据详情
data=db(′crmcustomer′)−>where([′customerid′=>v])->find();
if (!$data) {
$isDel = false;
errorMessage[]=′id为′.v . '的客户删除失败,错误原因:' . $customerModel->getError();
}
resPool=db(′crmcustomer′)−>alias(′customer′)−>where([′customerid′=>v])->where($wherePool)->find();
if (!resPool && !in_array(data['owner_user_id'], auth_user_ids) && isDel) {
$isDel = false;
$errorMessage[] = '无权操作';
}
// 公海 (原逻辑,公海仅允许管理员删除,修改为授权,不再限制)
// if (resPool && !in_array(data['owner_user_id'],$adminId)) {
// $isDel = false;
// errorMessage[]=′名称为′.data['name'].'的客户删除失败,错误原因:无权操作';
// }
//有商机、合同、联系人则不能删除
if ($isDel) {
resBusiness=db(′crmbusiness′)−>where([′customerid′=>v])->find();
if ($resBusiness) {
$isDel = false;
$errorMessage[] = '客户下存在商机,不能删除';
}
}
if ($isDel) {
resContacts=db(′crmcontacts′)−>where([′customerid′=>v])->find();
if ($resContacts) {
$isDel = false;
// errorMessage[]=′名称为′.data['name'] . '的客户删除失败,错误原因:客户下存在联系人,不能删除';
$errorMessage[] = '客户下存在联系人,不能删除';
}
}
if ($isDel) {
resContract=db(′crmcontract′)−>where([′customerid′=>v])->find();
if ($resContract) {
$isDel = false;
$errorMessage[] = '客户下存在合同,不能删除';
}
}
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(′crmcustomer′,delIds);
// 删除关联操作记录
actionRecordModel−>delDataById([′types′=>′crmcustomer′,′actionid′=>delIds]);
foreach (dataInfoask => $v) {
RecordActionLog(userInfo[′id′],′crmcustomer′,′delete′,v['name'], '', '', '删除了客户:' . $v['name']);
}
}
if ($errorMessage) {
return resultArray(['error' => $errorMessage]);
} else {
return resultArray(['data' => '删除成功']);
}
}
8、客户信息详情界面

9、客户转移功能
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 appadminmodelUser();
if (!$param['owner_user_id']) {
return resultArray(['error' => '变更负责人不能为空']);
}
if (!param[′customerid′]∣∣!isarray(param['customer_id'])) {
return resultArray(['error' => '请选择需要转移的客户']);
}
isremove=(param['is_remove'] == 2) ? 2 : 1;
type=param['type'] == 2 ?: 1;
types=param['types'] ?: [];
$data = [];
data[′owneruserid′]=param['owner_user_id'];
$data['update_time'] = time();
$data['follow'] = '待跟进';
# 获取客户的时间
$data['obtain_time'] = time();
ownerUserName=userModel->getUserNameById($param['owner_user_id']);
$errorMessage = [];
foreach (param[′customerid′]ascustomer_id) {
customerInfo=db(′crmcustomer′)−>where([′customerid′=>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[′userid′]=[customerInfo['owner_user_id']]; //协作人
$teamData['types'] = 'crm_customer'; //类型
teamData[′typesid′]=customer_id; //类型 ID
teamData[′isdel′]=(is_remove == 1) ? 1 : '';
res=settingModel->createTeamData($teamData);
# 处理分配标识,待办事项专用
$data['is_allocation'] = 1;
resCustomer=db(′crmcustomer′)−>where([′customerid′=>customer_id])->update($data);
if (!$resCustomer) {
errorMessage[]=customerInfo['name'] . '转移失败,错误原因:数据出错;';
continue;
} else {
# 处理转移时,负责人出现在只读和读写成员列表中
$customerArray = [];
teamCustomer=db(′crmcustomer′)−>field([′owneruserid′,′rouserid′,′rwuserid′])−>where(′customerid′,customer_id)->find();
if (!empty($teamCustomer['ro_user_id'])) {
customerRo=arrayToString(arraydiff(stringToArray(teamCustomer['ro_user_id']), [$teamCustomer['owner_user_id']]));
customerArray[′rouserid′]=customerRo;
}
if (!empty($teamCustomer['rw_user_id'])) {
customerRo=arrayToString(arraydiff(stringToArray(teamCustomer['rw_user_id']), [$teamCustomer['owner_user_id']]));
customerArray[′rwuserid′]=customerRo;
}
db('crm_customer')->where('customer_id', customerid)−>update(customerArray);
}
if (in_array('crm_contacts', $types)) {
$contactsIds = [];
contactsIds=db(′crmcontacts′)−>where([′customerid′=>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(′crmbusiness′)−>where([′customerid′=>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(′crmcontract′)−>where([′customerid′=>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′],′crmcustomer′,customer_id, '', '', '将客户转移给:' . $ownerUserName);
RecordActionLog(userInfo[′id′],′crmcustomer′,′transfer′,customerInfo['name'], '', '', '将客户:' . customerInfo[′name′].′转移给:′.ownerUserName);
}
if (!$errorMessage) {
return resultArray(['data' => '转移成功']);
} else {
return resultArray(['error' => $errorMessage]);
}
}
企业 CRM 管理系统部署上线之后,我们可以在华为云的控制台可以观察监控着 CPU 使用情况、内存、磁盘等等一切运作情况。华为云真的是性能强大、安全、稳定的云产品!!!

华为云 828 为企业提供多行业场景解决方案及企业专属优惠,助力企业实现数字化转型升级,大家赶紧去选购吧!!


————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/csdndddsd/article/details/141969901
审核编辑 黄宇
-
服务器
+关注
关注
13文章
10108浏览量
90969 -
华为云
+关注
关注
3文章
2805浏览量
19106
发布评论请先 登录
华为云 Flexus 云服务器 X 实例之 openEuler 系统下搭建 MaxKB 开源知识库问答系统
使用华为云 Flexus 云服务器 X 搭建部署茶叶商城小程序 uniapp
Flexus 云服务器 X 实例:在 Docker 环境下搭建 java 开发环境
基于华为云 Flexus 云服务器 X 实例部搭建 Halo 博客平台

华为云服务器 Flexus X 搭建悟空 crm 管理系统——助力企业云上管理(解决 APP Referer 校验失败问题)
评论