1,仪表盘(数据来源修改)
注意点:有层级关系,管理员账号可以看到全部数据,主管只能看到下属数据。
2、在客户管理菜单里面 增加一个时间筛选、额度汇总
/*** 获取客户列表** @param $type* @param $content* @return bool|\PDOStatement|string|\think\Collection* @throws \think\db\exception\DataNotFoundException* @throws \think\db\exception\ModelNotFoundException* @throws \think\exception\DbException*/private function getCustomerList($type, $content)
{# 默认条件$customerWhere = $this->getCustomerWhere();# 查询条件$searchWhere = $this->getSearchWhere($type, $content);# 查询字段$field = ['customer_id', 'name', 'create_time', 'owner_user_id', 'deal_time', 'telephone', 'mobile'];return db('crm_customer')->alias('customer')->field($field)->where($customerWhere)->where($searchWhere)->limit(10)->order('update_time', 'desc')->select();
}
3,单独新增一个今日数据表格
(以表格的形式呈现出来)
需求:
3.1,需要关联部门和员工层级关系,比如:普通员工只填写自己的数据,部门领导客户看到下面人员所有数据,管理员可以看到所有部门数据。
3.2,条件筛选,时间筛选、部门筛选、员工筛选、全部
3.3,表格可以自定义增删改,自定义隐藏和开启字段
public function getDataList($request){$userModel = new \app\admin\model\User();$structureModel = new \app\admin\model\Structure();$fieldModel = new \app\admin\model\Field();$customerModel = new \app\crm\model\Customer();$search = $request['search'];$user_id = $request['user_id'];$scene_id = (int)$request['scene_id'];$is_excel = $request['is_excel']; //导出$order_field = $request['order_field'];$order_type = $request['order_type'];$pageType = $request['pageType'];$getCount = $request['getCount'];$cstart_time = $request['cstart_time'];$cend_time = $request['cend_time'];//需要过滤的参数$unsetRequest = ['scene_id', 'search', 'user_id', 'is_excel', 'action', 'order_field', 'order_type', 'is_remind', 'getCount', 'type', 'otherMap', 'business_id', 'check_status','cstart_time','cend_time'];foreach ($unsetRequest as $v) {unset($request[$v]);}$request = $this->fmtRequest($request);$requestMap = $request['map'] ?: [];$sceneModel = new \app\admin\model\Scene();if ($scene_id) {//自定义场景$sceneMap = $sceneModel->getDataById($scene_id, $user_id, 'todaydata') ?: [];} else {//默认场景$sceneMap = $sceneModel->getDefaultData('crm_todaydata', $user_id) ?: [];}$searchMap = [];if ($search || $search == '0') {//普通筛选$searchMap = function ($query) use ($search) {$query->where('todaydata.name', array('like', '%' . $search . '%'))->whereOr('todaydata.mobile', array('like', '%' . $search . '%'))->whereOr('todaydata.telephone', array('like', '%' . $search . '%'));};}$partMap = [];//优先级:普通筛选>高级筛选>场景$teamMap=$requestMap['team_id'];//团队成员 高级筛选if($teamMap){$partMap= advancedQueryFormatForTeam($teamMap,'todaydata','todaydata_id');unset($requestMap['team_id']);$map = $requestMap ? array_merge($sceneMap, $requestMap) : $sceneMap;} else {$map = $requestMap ? array_merge($sceneMap, $requestMap) : $sceneMap;}//高级筛选$map = advancedQuery($map, 'crm', 'todaydata', 'index');//权限$a = 'index';if ($is_excel) $a = 'excelExport';$authMap = [];$auth_user_ids = $userModel->getUserByPer('crm', 'todaydata', $a);if (isset($map['todaydata.owner_user_id'])) {if (!is_array($map['todaydata.owner_user_id'][1])) {$map['todaydata.owner_user_id'][1] = [$map['todaydata.owner_user_id'][1]];}if (in_array($map['todaydata.owner_user_id'][0], ['neq', 'notin'])) {$auth_user_ids = array_diff($auth_user_ids, $map['todaydata.owner_user_id'][1]) ?: []; //取差集} else {$auth_user_ids = array_intersect($map['todaydata.owner_user_id'][1], $auth_user_ids) ?: []; //取交集}unset($map['todaydata.owner_user_id']);$auth_user_ids = array_merge(array_unique(array_filter($auth_user_ids))) ?: ['-1'];//负责人、相关团队$authMap['todaydata.owner_user_id'] = ['in', $auth_user_ids];} else {$authMapData = [];$authMapData['auth_user_ids'] = $auth_user_ids;$authMapData['user_id'] = $user_id;$authMap = function ($query) use ($authMapData) {$query->where('todaydata.owner_user_id', array('in', $authMapData['auth_user_ids']));// ->whereOr('todaydata.ro_user_id', array('like', '%,' . $authMapData['user_id'] . ',%'))// ->whereOr('todaydata.rw_user_id', array('like', '%,' . $authMapData['user_id'] . ',%'));};}$timeWhere = '';if($cstart_time){$timeWhere .= 'todaydata.create_time>='.strtotime($cstart_time);}if($cend_time){if($timeWhere) $timeWhere .= ' and ';$timeWhere .= 'todaydata.create_time<'.strtotime('+1 day', strtotime($cend_time));}//列表展示字段$indexField = $fieldModel->getIndexField('crm_todaydata', $user_id, 1) ?: array('name');$userField = $fieldModel->getFieldByFormType('crm_todaydata', 'user'); //人员类型$structureField = $fieldModel->getFieldByFormType('crm_todaydata', 'structure'); //部门类型$datetimeField = $fieldModel->getFieldByFormType('crm_todaydata', 'datetime'); //日期时间类型$booleanField = $fieldModel->getFieldByFormType('crm_todaydata', 'boolean_value'); //布尔值$dateIntervalField = $fieldModel->getFieldByFormType('crm_todaydata', 'date_interval'); // 日期区间类型字段$positionField = $fieldModel->getFieldByFormType('crm_todaydata', 'position'); // 地址类型字段$handwritingField = $fieldModel->getFieldByFormType('crm_todaydata', 'handwriting_sign'); // 手写签名类型字段$locationField = $fieldModel->getFieldByFormType('crm_todaydata', 'location'); // 定位类型字段$boxField = $fieldModel->getFieldByFormType('crm_todaydata', 'checkbox'); // 多选类型字段$floatField = $fieldModel->getFieldByFormType('crm_todaydata', 'floatnumber'); // 货币类型字段
// $fieldGrant = db('admin_field_mask')->where('types', 'todaydata')->select();# 处理人员和部门类型的排序报错问题(前端传来的是包含_name的别名字段)$temporaryField = str_replace('_name', '', $order_field);if (in_array($temporaryField, $userField) || in_array($temporaryField, $structureField)) {$order_field = $temporaryField;}//排序if ($order_type && $order_field) {$order = $fieldModel->getOrderByFormtype('crm_todaydata', 'todaydata', $order_field, $order_type);} else {$order = 'todaydata.update_time desc';}$readAuthIds = $userModel->getUserByPer('crm', 'todaydata', 'read');$updateAuthIds = $userModel->getUserByPer('crm', 'todaydata', 'update');$deleteAuthIds = $userModel->getUserByPer('crm', 'todaydata', 'delete');$customerWhere = [];if ($pageType == !'all') {//非客户池条件// $customerWhere = $customerModel->getWhereByCustomer();}$dataCount = db('crm_todaydata')->alias('todaydata')->join('__CRM_CUSTOMER__ customer', 'todaydata.customer_id = customer.customer_id', 'LEFT')->where($map)->where($searchMap)->where($authMap)->where($partMap)->where($customerWhere)->where($timeWhere)->count('todaydata_id');if ($getCount == 1) {$data['dataCount'] = $dataCount ?: 0;return $data;}$statisticsField = ['sum(jrxh) as total_jrxh','sum(jrjfrs) as total_jrjfrs','sum(zsy) as total_zsy','sum(total_follow_buy) as total_total_follow_buy','sum(yxkh) as total_yxkh','sum(zgm) as total_zgm',];if($dataCount > 0){$statisticsField[] = 'ROUND(sum(zhl) / '.$dataCount.', 2) as total_zhl';}else{$statisticsField[] = '0 as total_zhl';}$statistics = db('crm_todaydata')->alias('todaydata')->field($statisticsField)->where($map)->where($searchMap)->where($partMap)->where($authMap)->where($customerWhere)->where($timeWhere)->find();if(!$statistics){$statistics = ['total_jrxh' => 0,'total_jrjfrs' => 0,'total_zsy' => 0,'total_total_follow_buy' => 0,'total_yxkh' => 0,'total_zgm' => 0,'total_zhl' => 0,];}$list = db('crm_todaydata')->alias('todaydata')->join('__CRM_CUSTOMER__ customer', 'todaydata.customer_id = customer.customer_id', 'LEFT')->where($map)->where($searchMap)->where($partMap)->where($authMap)->where($customerWhere)->where($timeWhere)->limit($request['offset'], $request['length'])->field('todaydata.*,customer.name as customer_name')->orderRaw($order)->select();# 扩展数据$extraData = [];$todaydata_id_list = !empty($list) ? array_column($list, 'todaydata_id') : [];$grantData = getFieldGrantData($user_id);foreach ($grantData['crm_todaydata'] as $key => $value) {foreach ($value as $ke => $va) {if($va['maskType']!=0){$fieldGrant[$ke]['maskType'] = $va['maskType'];$fieldGrant[$ke]['form_type'] = $va['form_type'];$fieldGrant[$ke]['field'] = $va['field'];}}}foreach ($list as $k => $v) {$list[$k]['create_user_id_info'] = isset($v['create_user_id']) ? $userModel->getUserById($v['create_user_id']) : [];$list[$k]['owner_user_id_info'] = isset($v['owner_user_id']) ? $userModel->getUserById($v['owner_user_id']) : [];$list[$k]['customer_id_info']['customer_id'] = $v['customer_id'] ?: '';$list[$k]['customer_id_info']['name'] = $v['customer_name'] ?: '';foreach ($userField as $key => $val) {$usernameField = !empty($v[$val]) ? db('admin_user')->whereIn('id', stringToArray($v[$val]))->column('realname') : [];$list[$k][$val] = implode($usernameField, ',');}foreach ($structureField as $key => $val) {$structureNameField = !empty($v[$val]) ? db('admin_structure')->whereIn('id', stringToArray($v[$val]))->column('name') : [];$list[$k][$val] = implode($structureNameField, ',');}foreach ($datetimeField as $key => $val) {$list[$k][$val] = !empty($v[$val]) ? date('Y-m-d H:i:s', $v[$val]) : null;}foreach ($booleanField as $key => $val) {$list[$k][$val] = !empty($v[$val]) ? (string)$v[$val] : '0';}// 处理日期区间类型字段的格式foreach ($dateIntervalField as $key => $val) {$list[$k][$val] = !empty($extraData[$v['todaydata_id']][$val]) ? json_decode($extraData[$v['todaydata_id']][$val], true) : null;}// 处理地址类型字段的格式foreach ($positionField as $key => $val) {$list[$k][$val] = !empty($extraData[$v['todaydata_id']][$val]) ? json_decode($extraData[$v['todaydata_id']][$val], true) : null;}// 手写签名类型字段foreach ($handwritingField as $key => $val) {$handwritingData = !empty($v[$val]) ? db('admin_file')->where('file_id', $v[$val])->value('file_path') : null;$list[$k][$val] = ['url' => !empty($handwritingData) ? getFullPath($handwritingData) : null];}// 定位类型字段foreach ($locationField AS $key => $val) {$list[$k][$val] = !empty($extraData[$v['todaydata_id']][$val]) ? json_decode($extraData[$v['todaydata_id']][$val], true) : null;}// 多选框类型字段foreach ($boxField AS $key => $val) {$list[$k][$val] = !empty($v[$val]) ? trim($v[$val], ',') : null;}// 货币类型字段foreach ($floatField AS $key => $val) {$list[$k][$val] = $v[$val]!='0.00' ? (string)$v[$val] : null;}//掩码相关类型字段foreach ($fieldGrant AS $key => $val){//掩码相关类型字段if ($val['maskType']!=0 && $val['form_type'] == 'mobile') {$pattern = "/(1[3458]{1}[0-9])[0-9]{4}([0-9]{4})/i";$rs = preg_replace($pattern, "$1****$2", $v[$val['field']]);$list[$k][$val['field']] = !empty($v[$val['field']]) ? (string)$rs : null;} elseif ($val['maskType']!=0 && $val['form_type'] == 'email') {$email_array = explode("@", $v[$val['field']]);$prevfix = (strlen($email_array[0]) < 4) ? "" : substr($v[$val['field']], 0, 2); //邮箱前缀$str = preg_replace('/([\d\w+_-]{0,100})@/', "***@", $v[$val['field']], -1, $count);$rs = $prevfix . $str;$list[$k][$val['field']] = !empty($v[$val['field']]) ?$rs: null;} elseif ($val['maskType']!=0 && in_array($val['form_type'],['position','floatnumber'])) {$list[$k][$val['field']] = !empty($v[$val['field']]) ? (string)substr_replace($v[$val['field']], '*****',0,strlen($v[$val['field']])) : null;}}//权限$permission = [];$is_read = 0;$is_update = 0;$is_delete = 0;if (in_array($v['owner_user_id'], $readAuthIds)) $is_read = 1;if (in_array($v['owner_user_id'], $updateAuthIds)) $is_update = 1;if (in_array($v['owner_user_id'], $deleteAuthIds)) $is_delete = 1;$permission['is_read'] = $is_read;$permission['is_update'] = $is_update;$permission['is_delete'] = $is_delete;$list[$k]['permission'] = $permission;# 关注$starWhere = ['user_id' => $user_id, 'target_id' => $v['todaydata_id'], 'type' => 'crm_todaydata'];$star = Db::name('crm_star')->where($starWhere)->value('star_id');$list[$k]['star'] = !empty($star) ? 1 : 0;# 日期// $list[$k]['create_time'] = !empty($v['create_time']) ? date('Y-m-d H:i:s', $v['create_time']) : null;$list[$k]['create_time'] = !empty($v['create_time']) ? date('Y-m-d', $v['create_time']) : null;$list[$k]['update_time'] = !empty($v['update_time']) ? date('Y-m-d H:i:s', $v['update_time']) : null;$list[$k]['last_time'] = !empty($v['last_time']) ? date('Y-m-d H:i:s', $v['last_time']) : null;# 创建人$list[$k]['create_user_name'] = !empty($list[$k]['create_user_id_info']['realname']) ? $list[$k]['create_user_id_info']['realname'] : '';# 负责人$list[$k]['owner_user_name'] = !empty($list[$k]['owner_user_id_info']['realname']) ? $list[$k]['owner_user_id_info']['realname'] : '';# 系统字段 负责人部门 zjf 20210726$list[$k]['owner_user_structure_name'] = $list[$k]['owner_user_id_info']['structure_name'];}$data = [];$data['list'] = $list;$data['dataCount'] = $dataCount ?: 0;$data['statistics'] = $statistics ?: [];return $data;}
二次开发增加的条件筛选:
时间筛选、部门筛选、员工筛选、全部
/*** 获取查询条件** @param $type* @param $content* @return array|\Closure*/private function getSearchWhere($type, $content)
{$searchWhere = [];# 查询客户名称if ($type == 'name') {$searchWhere = function ($query) use ($content) {$query->where('name', 'like', '%' . $content . '%');};}# 查询手机或电话if ($type == 'phone') {$searchWhere = function ($query) use ($content) {$query->where(function ($query) use ($content) {$query->whereOr('telephone', $content);$query->whereOr('mobile', $content);});};}return $searchWhere;
}
悟空crm客户管理系统二次开发