'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']), 'value' => $v['value'], 'form_type' => $v['form_type'], 'name' => $v['name'], 'type' => $v['type'] ]; if (!empty($v['start'])) $sceneData[$k]['start'] = $v['start']; if (!empty($v['end'])) $sceneData[$k]['end'] = $v['end']; } } 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; if ($val['form_type'] == 'user' && !empty($val['value'][0])) { $userInfo = $userModel->getUserById($val['value'][0]); $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; } if ($this->where(['scene_id' => ['neq', $id], 'types' => $param['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']), 'value' => $v['value'], 'form_type' => $v['form_type'], 'name' => $v['name'], 'type' => $v['type'] ]; if (!empty($v['start'])) $sceneData[$k]['start'] = $v['start']; if (!empty($v['end'])) $sceneData[$k]['end'] = $v['end']; } } 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']); } else { db('admin_scene_default')->where(['user_id' => $user_id, 'types' => $param['types'], 'scene_id' => $id])->delete(); } 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; } } }