悟空crm客户管理系统二次开发 单独新增表格字段

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客户管理系统二次开发
在这里插入图片描述

很高兴为您解答关于悟空CRM二次开发的问题。 悟空CRM是一款基于云计算的客户关系管理系统,它提供了丰富的功能模块,包括销售管理、客户服务、营销管理等。同时,悟空CRM也提供了二次开发平台,使得用户可以根据自己的业务需求进行个性化定制。 以下是悟空CRM二次开发的教学步骤: 1.注册开发者账号 首先,您需要注册悟空CRM开发者账号,登录后即可进入二次开发平台。 2.了解二次开发平台 在二次开发平台中,您可以使用开放API接口、Webhook、自定义组件等方式进行二次开发。其中,API接口是最为常用的一种方式,通过调用API接口,可以实现对悟空CRM中数据的增删改查等操作。 3.创建应用 在二次开发平台中,您需要创建应用来进行二次开发。创建应用后,您可以获取到应用的AppId和AppSecret,这些信息在调用API接口时需要用到。 4.调用API接口 在二次开发中,您可以使用HTTP请求方式调用API接口。调用API接口的URL格式为:https://api.wukongcrm.com/api/{version}/{module}/{action},其中version为API版本,module为操作模块,action为执行操作。 例如,如果您要调用获取客户列表的接口,URL格式为:https://api.wukongcrm.com/api/v1/Customer/GetList。 5.使用自定义组件 在二次开发平台中,您也可以使用自定义组件来进行二次开发。自定义组件可以添加到悟空CRM中的页面上,实现对页面的个性化定制。 总的来说,悟空CRM二次开发是一个非常灵活和强大的工具,它可以满足不同用户的不同需求。但是,二次开发过程中需要有一定的编程基础和技术能力,如果您对此不太熟悉,建议寻求专业人士的帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linlinlove2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值