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.

541 lines
16 KiB

4 years ago
<?php
// +----------------------------------------------------------------------
// | Description: 场景
// +----------------------------------------------------------------------
// | Author: Michael_xu | gengxiaoxu@5kcrm.com
// +----------------------------------------------------------------------
namespace app\admin\model;
use think\Db;
use app\admin\model\Common;
class Scene extends Common
{
/**
* 为了数据库的整洁同时又不影响Model和Controller的名称
* 我们约定每个模块的数据表都加上相同的前缀比如CRM模块用crm作为数据表前缀
*/
protected $name = 'admin_scene';
protected $createTime = 'create_time';
protected $updateTime = false;
protected $autoWriteTimestamp = true;
private $types_arr = ['crm_leads','crm_customer','crm_customer_pool','crm_contacts','crm_product','crm_business','crm_contract','crm_receivables','crm_visit','crm_invoice']; //支持场景的分类
protected $type = [
'data' => 'array',
];
/**
* 创建场景
* @param
* @return
*/
public function createData($param, $types = '')
{
if (empty($types)) {
$this->error = '参数错误';
return false;
}
if (empty($param['name'])) {
$this->error = '场景名称必填';
return false;
}
$user_id = $param['user_id'];
if ($this->where(['types'=>$types,'user_id'=>$user_id,'name'=>$param['name']])->find()) {
$this->error = '场景名称已存在';
return false;
}
# 转自定义场景结构
$sceneData = [];
foreach ($param['data'] AS $key => $value) {
foreach ($value AS $k => $v) {
$sceneData[$k] = [
'condition' => trim($v['condition']),
4 years ago
'value' => $v['value'],
4 years ago
'form_type' => $v['form_type'],
4 years ago
'name' => $v['name'],
'type' => $v['type']
4 years ago
];
3 years ago
if (!empty($v['start'])) $sceneData[$k]['start'] = $v['start'];
if (!empty($v['end'])) $sceneData[$k]['end'] = $v['end'];
4 years ago
}
}
if (!empty($sceneData)) $param['data'] = $sceneData;
$max_order_id = $this->getMaxOrderid($types, $user_id);
$param['order_id'] = $max_order_id ? $max_order_id+1 : 0;
$param['update_time'] = time();
$param['type'] = 0;
$param['bydata'] = '';
$res = $this->allowField(true)->save($param);
if ($res) {
//设置默认
if ($param['is_default']) {
$defaultData = [];
$defaultData['types'] = $types;
$defaultData['user_id'] = $user_id;
$this->defaultDataById($defaultData, $this->scene_id);
}
return true;
} else {
$this->error = '添加失败';
return false;
}
}
/**
* [getDataList 场景list]
* @param types 分类
* @author Michael_xu
* @return [array]
*/
public function getDataList($types, $user_id)
{
$fieldModel = new \app\admin\model\Field();
$userModel = new \app\admin\model\User();
if (!in_array($types, $this->types_arr)) {
$this->error = '参数错误';
return false;
}
$map['user_id'] = $user_id;
$map['is_hide'] = 0;
$map['types'] = $types;
$list = db('admin_scene')
->where($map)
->whereOr(function ($query) use ($types) {
$query->where(['types' => $types,'type' => 1]);
})->order('order_id asc,scene_id asc')
->select();
$defaultSceneId = db('admin_scene_default')->where(['types' => $types,'user_id' => $user_id])->value('scene_id');
$fieldList = $fieldModel->getField(['types' => $types]);
$newFieldList = [];
foreach ($fieldList as $k=>$v) {
$field = $v['field'];
if ($v['field'] == 'customer_id') $field = 'customer_name';
$newFieldList[$field] = $v;
}
foreach ($list as $k=>$v) {
if ($v['scene_id'] == $defaultSceneId) {
$list[$k]['is_default'] = 1;
}
$data = $v['data'] ? json_decode($v['data'],true) : [];
if ($data) {
foreach ($data as $key=>$val) {
$setting = $newFieldList[$key]['setting'];
$data[$key]['setting'] = $setting;
3 years ago
if ($val['form_type'] == 'user' && !empty($val['value'][0])) {
$userInfo = $userModel->getUserById($val['value'][0]);
4 years ago
$data[$key]['setting']['realname'] = $userInfo['realname'];
$data[$key]['setting']['id'] = $userInfo['id'];
}
}
}
$list[$k]['data'] = $data ? : [];
}
$map['is_hide'] = 1;
$hideList = $this->where($map)->order('order_id asc')->select();
$data = [];
$data['list'] = $list;
$data['hideList'] = $hideList;
return $data;
}
/**
* 根据主键获取详情
* @param array $param [description]
* @author Michael_xu
*/
public function getDataById($id = '', $user_id = '', $types = '')
{
$where = [];
$where['scene_id'] = $id;
// $where['user_id'] = [['=',$user_id],['=',0],'or'];
$data = db('admin_scene')->where($where)->find();
if (!$types) {
$types = $data['types'] ? : '';
}
//处理data
if ($data['bydata'] && $types) {
$data = $this->getByData($types, $data['bydata'], $user_id);
} else {
$data = json_decode($data['data'],true);
if (is_array($data)) {
foreach ($data as $k=>$v) {
if ($v['form_type'] == 'business_type') {
$data[$k]['value'] = $v['type_id'];
}
}
}
}
return $data ? : [];
}
/**
* 根据主键修改
* @param array $param [description]
* @author Michael_xu
*/
public function updateDataById($param, $id)
{
$checkData = $this->get($id);
$sceneInfo = $checkData->data;
$user_id = $param['user_id'];
if (!$sceneInfo) {
$this->error = '暂无数据';
return false;
}
//权限(只能编辑自己的)
if ($sceneInfo['user_id'] !== $user_id) {
$this->error = '参数错误';
return false;
}
if (empty($param['name'])) {
$this->error = '场景名称必填';
return false;
}
3 years ago
if ($this->where(['scene_id' => ['neq', $id], 'types' => $param['types'], 'user_id' => $user_id,'name' => $param['name']])->find()) {
4 years ago
$this->error = '场景名称已存在';
return false;
}
# 转自定义场景结构
$sceneData = [];
foreach ($param['data'] AS $key => $value) {
foreach ($value AS $k => $v) {
4 years ago
$sceneData[$k] = [
'condition' => trim($v['condition']),
'value' => $v['value'],
'form_type' => $v['form_type'],
'name' => $v['name'],
'type' => $v['type']
];
3 years ago
if (!empty($v['start'])) $sceneData[$k]['start'] = $v['start'];
if (!empty($v['end'])) $sceneData[$k]['end'] = $v['end'];
4 years ago
}
}
if (!empty($sceneData)) $param['data'] = $sceneData;
$param['update_time'] = time();
// $scene_data = $this->dataChangeString($param);
//处理data数据
$res = $this->allowField(true)->save($param, ['scene_id' => $id]);
if ($param['is_default'] == 1) {
$this->defaultDataById($param,$param['id']);
4 years ago
} else {
db('admin_scene_default')->where(['user_id' => $user_id, 'types' => $param['types'], 'scene_id' => $id])->delete();
}
4 years ago
if ($res) {
return true;
} else {
$this->error = '修改失败';
return false;
}
}
/**
* 场景设置为默认
* @param types 类型
* @param user_id 人员ID
* @param id 场景ID
* @author Michael_xu
*/
public function defaultDataById($param, $id)
{
if (!$param['types'] || !$id) {
$this->error = '参数错误';
return false;
}
$resInfo = db('admin_scene_default')->where(['types' => $param['types'],'user_id' => $param['user_id']])->find();
if ($resInfo) {
$res = db('admin_scene_default')->where(['types' => $param['types'],'user_id' => $param['user_id']])->update(['scene_id' => $id]);
} else {
$data = [];
$data['types'] = $param['types'];
$data['user_id'] = $param['user_id'];
$data['scene_id'] = $id;
$res = db('admin_scene_default')->insert($data);
}
if (!$res) {
$this->error = '设置失败或数据无变化';
return false;
}
return true;
}
/**
* 场景数据转换(字符串形式存储)
* @param
* @author Michael_xu
* @return
*/
public function dataChangeString($param = [])
{
$scene_data = '[';
$field_arr = [];
$i = 0;
foreach ($param['data'] as $k=>$v) {
if ($v != '' && !in_array($v['field'], $field_arr)) {
$i++;
if ($i == 1) {
$scene_data .= $v['field']."=>[";
} else {
$scene_data .= ",".$v['field']."=>[";
}
$scene_data .= "field=>".$v['field'].",";
//处理条件和值
foreach ($param as $k1=>$v1) {
switch ($k1) {
case 'condition' : $scene_data .= "condition=>".$v1.","; break;
case 'value' : $scene_data .= "value=>".$v1.","; break;
case 'state' :
case 'city' :
case 'area' :
//处理地址类型数据
$scene_data .= $k1."=>".$v1.","; break;
case 'start' : $scene_data .= "start=>".$v1.","; break;
case 'end' : $scene_data .= "end=>".$v1.","; break;
case 'start_date' : $scene_data .= "start_date=>".$v1.","; break;
case 'end_date' : $scene_data .= "end_date=>".$v1.","; break;
}
}
$form_type = '';
//处理字段类型
if ($v['field'] == 'create_time' || $v['field'] == 'update_time') {
$form_type = 'datetime';
} else {
$form_type = db('admin_fields')->where(['types'=>$param['types'],'field'=>$v['field'],'is_main'=>1])->column('form_type');
}
$scene_data .= "form_type=>".$form_type;
$field_arr[] = $v['field'];
}
$scene_data .= ']';
}
$scene_data .= ']';
return $scene_data;
}
/**
* 场景排序最大值
* @param
* @author Michael_xu
* @return
*/
public function getMaxOrderid($types, $user_id)
{
$maxOrderid = $this->where(['types' => $types, 'user_id' => $user_id])->max('order_id');
return $maxOrderid ? : 0;
}
/**
* 场景数据转数组格式用于where条件
* @param
* @author Michael_xu
* @return
*/
public function dataChangeArray($string)
{
$data_arr = [];
$where = [];
eval('$data_arr = '.$string.';');
foreach ($data_arr as $k=>$v) {
if ($v['state']) {
$address_where[] = '%'.$v['state'].'%';
if ($v['city']) {
$address_where[] = '%'.$v['city'].'%';
if ($v['area']) {
$address_where[] = '%'.$v['area'].'%';
}
}
if ($v['condition'] == 'not_contain') {
$where[$k] = ['notlike', $address_where, 'OR'];
} else {
$where[$k] = ['like', $address_where, 'AND'];
}
} elseif (!empty($v['start']) || !empty($v['end'])) {
if ($v['start'] && $v['end']) {
$where[$k] = ['between',[strtotime($v['start']),strtotime($v['end'])+86399]];
} elseif ($v['start']) {
$where[$k] = ['egt',strtotime($v['start'])];
} else {
$where[$k] = ['elt',strtotime($v['end'])+86399];
}
} elseif (!empty($v['value'])) {
$where[$k] = field($v['value'],$v['condition']);
}
}
return $where ? : [];
}
/**
* 场景排序
* @param ids 场景id数组
* @param hide_ids 隐藏场景id数组
* @author Michael_xu
* @return
*/
public function listOrder($param, $user_id)
{
$res = true;
$resHide = true;
//使用
$data = [];
foreach ($param['ids'] as $k=>$v) {
$data[] = ['scene_id' => $v,'order_id' => $k,'update_time' => time(),'user_id' => $user_id,'is_hide' => 0];
}
if ($param['ids']) $res = $this->isUpdate()->saveAll($data);
//隐藏
$hideData = [];
foreach ($param['hide_ids'] as $k=>$v) {
$hideData[] = ['scene_id' => $v,'order_id' => $k,'update_time' => time(),'user_id' => $user_id,'is_hide' => 1];
}
if ($param['hide_ids']) $resHide = $this->isUpdate()->saveAll($hideData);
if ($res == false || $resHide == false) {
$this->error = '设置出错,请重试';
return false;
}
return true;
}
/**
* [getDefaultData 默认场景]
* @param types 分类
* @author Michael_xu
* @return [array]
*/
public function getDefaultData($types, $user_id)
{
$where = [];
$where['types'] = $types;
$where['user_id'] = $user_id;
$scene_id = db('admin_scene_default')->where($where)->value('scene_id');
if (!$scene_id && in_array($types,['crm_leads','crm_customer','crm_business','crm_contacts','crm_contract','crm_receivables','crm_visit'])) {
$resData['bydata'] = 'all';
} else {
$resData = db('admin_scene')->where(['scene_id' => $scene_id])->find();
}
if ($resData['bydata']) {
$data = $this->getByData($types, $resData['bydata'], $user_id);
} else {
//处理data
$data = $resData ? json_decode($resData,true) : [];
}
return $data;
}
/**
* [getByData 系统场景数据]
* @param types 分类
* @author Michael_xu
* @return [array]
*/
public function getByData($types, $bydata, $user_id)
{
// print_r($types . '--');
// print_r($bydata . '--');
// print_r($user_id);
// exit;
$map = [];
$auth_user_ids = [];
$part_user_ids = [];
switch ($bydata) {
case 'me' :
# 我负责的
$auth_user_ids[] = $user_id;
break;
case 'mePart' :
# 我参与的(即相关团队)
$part_user_ids = $user_id;
break;
case 'sub' :
# 下属负责的
$auth_user_ids = getSubUserId(false) ? : ['-1'];
break;
case 'all' :
# 全部
$auth_user_ids = '';
break;
case 'is_transform' :
# 已转化线索
$map['is_transform'] = ['condition' => 'eq', 'value' => 1, 'form_type' => 'text', 'name' => ''];
break;
case 'pool' :
# 今日进入公海的客户
$customerModel = new \app\crm\model\Customer();
$map = $customerModel->getWhereByToday();
break;
case 'win_business' :
# 赢单的商机
$map['is_end'] = ['condition' => 'eq', 'value' => 1];
break;
case 'fail_business' :
# 输单的商机
$map['is_end'] = ['condition' => 'eq', 'value' => 2];
break;
case 'star' :
$where = $this->getStarParam($types, $user_id);
if (!empty($where)) $map = $where;
break;
default :
# 全部
$auth_user_ids = '';
}
$auth_user_ids = $auth_user_ids ? : [];
if ($auth_user_ids) {
$map['owner_user_id'] = ['condition' => 'in','value' => $auth_user_ids,'form_type' => 'text','name' => ''];
}
if ($part_user_ids) {
$map['ro_user_id'] = $part_user_ids ? : '';
$map['rw_user_id'] = $part_user_ids ? : '';
}
return $map;
}
/**
* 获取我的关注条件
*
* @param $types
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getStarParam($types, $user_id)
{
$where = [];
$result = [];
$data = Db::name('crm_star')->field(['target_id'])->where(['user_id' => $user_id, 'type' => 'crm_' . $types])->select();
foreach ($data AS $key => $value) $result[] = $value['target_id'];
if ($types == 'leads') $where['leads_id'] = $result ? ['condition' => 'in', 'value' => implode(',', $result)] : 0;
if ($types == 'customer') $where['customer_id'] = $result ? ['condition' => 'in', 'value' => implode(',', $result)] : 0;
if ($types == 'contacts') $where['contacts_id'] = $result ? ['condition' => 'in', 'value' => implode(',', $result)] : 0;
if ($types == 'business') $where['business_id'] = $result ? ['condition' => 'in', 'value' => implode(',', $result)] : 0;
return $where;
}
/**
* [updateData 跳过验证的编辑]
* @param types 分类
* @author Michael_xu
* @return [array]
*/
public function updateData($data, $scene_id)
{
$param['data'] = is_array($data) ? $data : '';
$param['update_time'] = time();
$res = $this->allowField(true)->save($param, ['scene_id' => $scene_id]);
if ($res) {
return true;
} else {
$this->error = '修改失败';
return false;
}
}
}