0, 'list' => []]; $fieldModel = new Field(); $poolId = $param['pool_id']; $orderField = $param['order_field']; $orderType = $param['order_type']; // 基础条件 $where['relation.pool_id'] = $poolId; // 普通搜索 $searchMap = []; if ($param['search'] == '0' || !empty($param['search'])) { $search = $param['search']; $searchMap = function ($query) use ($search) { $query->where('customer.name', array('like', '%' . $search . '%')) ->whereOr('customer.mobile', array('like', '%' . $search . '%')) ->whereOr('customer.telephone', array('like', '%' . $search . '%')); }; } // 处理排序参数 if (!empty($orderField)) { if ($orderField == 'create_user_id_name') $orderField = 'create_user_id'; if ($orderField == 'before_owner_user_name') $orderField = 'before_owner_user_id'; } // 公海条件 if ($param['is_excel'] == 1 && !empty($param['customer_id'])) { $authMap['customer.customer_id'] = ['in', trim(arrayToString($param['customer_id']), ',')]; } // 排序 if (!empty($orderField) && !empty($orderType)) { $order = $fieldModel->getOrderByFormtype('crm_customer', 'customer', $orderField, $orderType); } else { $order = 'customer.update_time desc'; } // 删除参数 unset($param['pool_id']); unset($param['search']); unset($param['order_field']); unset($param['order_type']); unset($param['is_excel']); unset($param['customer_id']); // 格式化参数 $request = $this->fmtRequest($param); $requestMap = !empty($request['map']) ? $request['map'] : []; // 高级搜索 $map = advancedQuery($requestMap, 'crm', 'customer', 'index'); // 公海字段 $customerFieldString = $this->getPoolQueryField($poolId); // 公海数据 $customerPoolCount = db('crm_customer_pool_relation')->alias('relation') ->join('__CRM_CUSTOMER__ customer', 'customer.customer_id = relation.customer_id', 'LEFT') ->where($where)->where($searchMap)->where($map)->where($authMap)->count(); if (empty($customerPoolCount)) return $result; $customerPoolList = db('crm_customer_pool_relation')->alias('relation')->field($customerFieldString) ->join('__CRM_CUSTOMER__ customer', 'customer.customer_id = relation.customer_id', 'LEFT') ->limit($request['offset'], $request['length'])->where($where)->where($searchMap)->where($map)->where($authMap)->orderRaw($order)->select(); // 员工列表 $userData = $this->getUserList(); // 部门列表 $structureData = $this->getStructureList(); // 特殊字段 $userField = $fieldModel->getFieldByFormType('crm_customer', 'user'); # 人员类型 $structureField = $fieldModel->getFieldByFormType('crm_customer', 'structure'); # 部门类型 $datetimeField = $fieldModel->getFieldByFormType('crm_customer', 'datetime'); # 日期时间类型 $booleanField = $fieldModel->getFieldByFormType('crm_customer', 'boolean_value'); // 布尔值类型字段 $dateIntervalField = $fieldModel->getFieldByFormType('crm_customer', 'date_interval'); // 日期区间类型字段 $positionField = $fieldModel->getFieldByFormType('crm_customer', 'position'); // 地址类型字段 $handwritingField = $fieldModel->getFieldByFormType('crm_customer', 'handwriting_sign'); // 手写签名类型字段 $locationField = $fieldModel->getFieldByFormType('crm_customer', 'location'); // 定位类型字段 // 扩展数据 $extraData = []; $customerIds = array_column($customerPoolList, 'customer_id'); $extraList = db('crm_customer_data')->whereIn('customer_id', $customerIds)->select(); foreach ($extraList as $key => $value) { $extraData[$value['customer_id']][$value['field']] = $value['content']; } // 整理公海数据 foreach ($customerPoolList as $key => $value) { $customerPoolList[$key]['create_user_name'] = !empty($userData[$value['create_user_id']]) ? $userData[$value['create_user_id']] : ''; $customerPoolList[$key]['before_owner_user_name'] = !empty($userData[$value['before_owner_user_id']]) ? $userData[$value['before_owner_user_id']] : ''; $customerPoolList[$key]['next_time'] = !empty($value['next_time']) ? date('Y-m-d H:i:s', $value['next_time']) : null; $customerPoolList[$key]['update_time'] = !empty($value['update_time']) ? date('Y-m-d H:i:s', $value['update_time']) : null; $customerPoolList[$key]['create_time'] = !empty($value['create_time']) ? date('Y-m-d H:i:s', $value['create_time']) : null; $customerPoolList[$key]['last_time'] = !empty($value['last_time']) ? date('Y-m-d H:i:s', $value['last_time']) : null; $customerPoolList[$key]['into_pool_time'] = !empty($value['into_pool_time']) ? date('Y-m-d H:i:s', $value['into_pool_time']) : null; // 处理日期时间类型的自定义字段 foreach ($datetimeField as $k => $v) { if (!empty($value[$v])) $customerPoolList[$key][$v] = date('Y-m-d H:i:s', $value[$v]); } // 处理人员类型的自定义字段 foreach ($userField as $k => $v) { if (!empty($value[$v])) { $customerPoolList[$key][$v] = $this->fieldTransformToText($value[$v], $userData); } } // 处理部门类型的自定义字段 foreach ($structureField as $k => $v) { if (!empty($value[$v])) $customerPoolList[$key][$v] = $this->fieldTransformToText($value[$v], $structureData); } // 布尔值类型字段 foreach ($booleanField as $k => $v) { $customerPoolList[$key][$v] = !empty($value[$v]) ? (string)$value[$v] : '0'; } // 处理日期区间类型字段的格式 foreach ($dateIntervalField as $k => $v) { $customerPoolList[$key][$v] = !empty($extraData[$value['customer_id']][$v]) ? json_decode($extraData[$value['customer_id']][$v], true) : null; } // 处理地址类型字段的格式 foreach ($positionField as $k => $v) { $customerPoolList[$key][$v] = !empty($extraData[$value['customer_id']][$v]) ? json_decode($extraData[$value['customer_id']][$v], true) : null; } // 手写签名类型字段 foreach ($handwritingField as $k => $v) { $handwritingData = !empty($value[$v]) ? db('admin_file')->where('file_id', $value[$v])->value('file_path') : null; $customerPoolList[$key][$v] = ['url' => !empty($handwritingData) ? getFullPath($handwritingData) : null]; } // 定位类型字段 foreach ($locationField as $k => $v) { $customerPoolList[$key][$v] = !empty($extraData[$value['customer_id']][$v]) ? json_decode($extraData[$value['customer_id']][$v], true) : null; } } $result['dataCount'] = $customerPoolCount; $result['list'] = $customerPoolList; return $result; } /** * 公海详情 * * @param array $param pool_id 公海ID,customer_id 客户ID * @return array|bool|PDOStatement|string|Model|null * @since 2021-04-14 * @author fanqi */ public function getPoolData($param) { # 更新用户自定义字段样式 $this->updateFieldStyle($param); # 公海字段 $fields = $this->getPoolQueryField($param['pool_id']); $data = db('crm_customer')->alias('customer')->field($fields)->where('customer_id', $param['customer_id'])->find(); $fieldModel = new Field(); # 员工列表 $userData = $this->getUserList(); # 部门列表 $structureData = $this->getStructureList(); # 特殊字段 $userField = $fieldModel->getFieldByFormType('crm_customer', 'user'); # 人员类型 $structureField = $fieldModel->getFieldByFormType('crm_customer', 'structure'); # 部门类型 $datetimeField = $fieldModel->getFieldByFormType('crm_customer', 'datetime'); # 日期时间类型 # 整理公海数据 $data['create_user_name'] = !empty($userData[$data['create_user_id']]) ? $userData[$data['create_user_id']] : ''; $data['before_owner_user_name'] = !empty($userData[$data['before_owner_user_id']]) ? $userData[$data['before_owner_user_id']] : ''; $data['next_time'] = !empty($data['next_time']) ? date('Y-m-d H:i:s', $data['next_time']) : null; $data['update_time'] = !empty($data['update_time']) ? date('Y-m-d H:i:s', $data['update_time']) : null; $data['create_time'] = !empty($data['create_time']) ? date('Y-m-d H:i:s', $data['create_time']) : null; $data['last_time'] = !empty($data['last_time']) ? date('Y-m-d H:i:s', $data['last_time']) : null; $data['into_pool_time'] = !empty($data['into_pool_time']) ? date('Y-m-d H:i:s', $data['into_pool_time']) : null; # 处理日期时间类型的自定义字段 foreach ($datetimeField as $k => $v) { if (isset($data[$v])) { $data[$v] = !empty($data[$v]) ? date('Y-m-d H:i:s', $data[$v]) : null; } } # 处理人员类型的自定义字段 foreach ($userField as $k => $v) { if (isset($data[$v]) && !empty($data[$v])) { $data[$v] = $this->fieldTransformToText($data[$v], $userData); } } # 处理部门类型的自定义字段 foreach ($structureField as $k => $v) { if (isset($data[$v]) && !empty($data[$v])) { $data[$v] = $this->fieldTransformToText($data[$v], $structureData); } } return $data; } /** * @param array $param * @return array */ public function deletePoolCustomer($param) { if (empty($param['user_id'])) return ['缺少用户ID!']; # 消息数据 $message = []; $customerId = $param['id']; # 查询客户列表数据 $customerData = $this->getCustomerList($customerId); # 验证是否是公海数据 foreach ($customerId as $key => $value) { if (empty($customerData[$value])) { $message[] = '删除 《' . $customerData[$value]['name'] . '》 失败,原因:公海客户不存在!'; unset($customerId[(int)$key]); } if (!empty($customerData[$value]['owner_user_id'])) { $message[] = '删除 《' . $customerData[$value]['name'] . '》 失败,原因:不是公海客户!'; unset($customerId[(int)$key]); } } # 验证是否还有需要删除的客户 if (empty($customerId)) return $message; # 查询与客户有关的数据 $customerContactsData = db('crm_contacts')->whereIn('customer_id', $customerId)->column('customer_id'); $customerBusinessData = db('crm_business')->whereIn('customer_id', $customerId)->column('customer_id'); $customerContractData = db('crm_contract')->whereIn('customer_id', $customerId)->column('customer_id'); # 验证客户下是否存在联系人、商机、合同 foreach ($customerId as $key => $value) { if (in_array($value, $customerContactsData)) { $message[] = '删除 《' . $customerData[$value]['name'] . '》 失败,原因:客户下存在联系人!'; unset($customerId[(int)$key]); } if (in_array($value, $customerBusinessData)) { $message[] = '删除 《' . $customerData[$value]['name'] . '》 失败,原因:客户下存在商机!'; unset($customerId[(int)$key]); } if (in_array($value, $customerContractData)) { $message[] = '删除 《' . $customerData[$value]['name'] . '》 失败,原因:客户下存在合同!'; unset($customerId[(int)$key]); } } # 删除客户 if (!empty($customerId)) { if (db('crm_customer')->whereIn('customer_id', $customerId)->delete()) { # 删除公海关联数据 db('crm_customer_pool_relation')->whereIn('customer_id', $customerId)->delete(); # 删除跟进记录 (new Record())->delDataByTypes(2, $customerId); # 删除关联附件 (new File())->delRFileByModule('crm_customer', $customerId); # 删除关联操作记录 (new ActionRecord())->delDataById(['types' => 'crm_customer', 'action_id' => $customerId]); # 记录到数据操作日志 $ip = request()->ip(); $addOperationLogData = []; foreach ($customerId as $key => $value) { $addOperationLogData[] = [ 'user_id' => $param['user_id'], 'client_ip' => $ip, 'module' => 'crm_customer', 'action_id' => $value, 'content' => '删除了客户:' . $customerData[$value]['name'], 'create_time' => time(), 'action_name' => 'delete', 'target_name' => $customerData[$value]['name'] ]; } db('admin_operation_log')->insertAll($addOperationLogData); } else { $message[] = '删除客户失败,请刷新后重试!'; } } return $message; } /** * 获取公海池列表 * * @param array $param 查询参数:user_id 用户id,structure_id 部门id * @return bool|PDOStatement|string|Collection * @since 2021-04-21 * @author fanqi */ public function getPondList($param) { $adminTypes = adminGroupTypes($param['user_id']); return db('crm_customer_pool')->field(['pool_id', 'pool_name']) ->where('status', 1) ->where(function ($query) use ($param, $adminTypes) { if (!in_array(1, $adminTypes)) $query->where('admin_user_ids', 'like', '%,' . $param['user_id'] . ',%'); if (!in_array(1, $adminTypes)) $query->whereOr('user_ids', 'like', '%,' . $param['user_id'] . ',%'); if (!in_array(1, $adminTypes)) $query->whereOr('department_ids', '%,' . $param['structure_id'] . ',%'); })->select(); } /** * 获取公海字段 * * @param array $param pool_id 公海ID,action 操作类型,action_id 数据id * @return array * @since 2021-04-13 * @author fanqi */ public function getFieldList($param) { $data = []; # 自定义字段 $where = [ 'pool_id' => $param['pool_id'], 'is_hidden' => 0, 'form_type' => ['notin', ['file', 'desc_text', 'detail_table']] ]; $list = db('crm_customer_pool_field_setting')->where($where)->select(); # 处理公海字段 foreach ($list as $key => $value) { $list[$key]['field'] = $value['field_name']; # 处理别名 switch ($value['field_name']) { case 'create_user_id' : $list[$key]['fieldName'] = 'create_user_name'; break; case 'before_owner_user_id' : $list[$key]['fieldName'] = 'before_owner_user_name'; break; default : $list[$key]['fieldName'] = $value['field_name']; } if (in_array($value['field_name'], ['last_record', 'create_user_id', 'create_time', 'update_time', 'last_time', 'deal_status'])) { $list[$key]['system'] = 1; } else { $list[$key]['system'] = 0; } $data[$list[$key]['field']] = [ 'field' => $list[$key]['field'], 'fieldName' => $list[$key]['fieldName'], 'name' => $list[$key]['name'], 'width' => '', 'is_hidden' => 1, 'system' => $list[$key]['system'], 'form_type' => $list[$key]['form_type'] ]; } # 公海字段样式 $list = $this->setFieldStyle($param, $data); return array_values((array)$list); } /** * 高级筛选字段列表 * * @return array * @since 2021-04-14 * @author fanqi */ public function getAdvancedFilterFieldList() { # 基础字段 $base = [ ['field' => 'address', 'name' => '省、市、区/县', 'form_type' => 'address', 'setting' => ''], ['field' => 'detail_address', 'name' => '详细地址', 'form_type' => 'text', 'setting' => ''], ['field' => 'last_record', 'name' => '最后跟进记录', 'form_type' => 'text', 'setting' => ''], ['field' => 'last_time', 'name' => '最后跟进时间', 'form_type' => 'datetime', 'setting' => ''], ['field' => 'create_time', 'name' => '创建时间', 'form_type' => 'datetime', 'setting' => ''], ['field' => 'update_time', 'name' => '更新时间', 'form_type' => 'datetime', 'setting' => ''], ['field' => 'create_user_id', 'name' => '创建人', 'form_type' => 'user', 'setting' => ''], ['field' => 'before_owner_user_id', 'name' => '前负责人', 'form_type' => 'user', 'setting' => ''], ['field' => 'into_pool_time', 'name' => '进入公海时间', 'form_type' => 'datetime', 'setting' => ''], ]; # 自定义字段 $list = db('admin_field')->field(['field', 'name', 'form_type', 'setting'])->where('types', 'crm_customer')->whereNotIn('form_type', ['file', 'handwriting_sign', 'desc_text', 'detail_table', 'date_interval'])->select(); $list = array_merge($list, $base); # 整理数据 foreach ($list as $key => $value) { if (!empty($value['setting'])) $list[$key]['setting'] = explode(chr(10), $value['setting']); } return $list; } /** * 领取公海客户 * * @param array $param user_id 领取人ID,customer_id 要领取的客户ID * @author fanqi * @since 2021-04-15 * @return array */ public function receiveCustomers($param) { if (empty($param['user_id'])) return ['缺少员工ID']; # 查询参数 $userId = $param['user_id']; $customerId = $param['customer_id']; # 消息数据 $message = []; # 查询客户列表数据 $customerData = $this->getCustomerList($customerId); # 剔除非公海客户 foreach ($customerId AS $key => $value) { if (!empty($customerData[$value]['owner_user_id'])) { $message[] = '客户《' . $customerData[$value]['name'] . '》领取失败,失败原因:不是公海客户!'; unset($customerId[(int)$key]); continue; } } # 检查是否还有要领取的客户 if (empty($customerId)) return $message; # 获取超出持有客户数的数量 $customerConfigModel = new CustomerConfig(); $exceedCount = $customerConfigModel->checkData($userId, 1, 0, count($customerId)); # 记录添加失败的客户 $failCustomer = []; if (!is_bool($exceedCount) && !empty($exceedCount) && $exceedCount > 0) { $failCustomer = array_slice($customerId, count($customerId) - $exceedCount); foreach ($failCustomer AS $key => $value) { $message[] = '客户《' . $customerData[$value]['name'] . '》领取失败,失败原因:持有客户数达到上限!'; } } # 可以领取的客户ID,取差集 $addCustomerId = count($customerId) == 1 ? $customerId : array_diff($customerId, $failCustomer); # 检查是否还有要领取的客户 if (empty($addCustomerId)) return $message; # 查询领取客户的公海id $poolId=db('crm_customer_pool_relation')->whereIn('customer_id',$customerId)->value('pool_id'); # 公海配置 $poolConfig = db('crm_customer_pool')->field(['before_owner_conf', 'before_owner_day', 'receive_conf', 'receive_count'])->where('pool_id', $poolId)->find(); # 前负责人N天内不能领取客户 if (!empty($poolConfig['before_owner_conf'])) { foreach ($addCustomerId AS $key => $value) { # 是前负责人,检查前负责人是否能够领取。 if ($userId == $customerData[$value]['before_owner_user_id']) { $restrictDay = $customerData[$value]['into_pool_time'] + 86400 * $poolConfig['before_owner_day']; if (time() < $restrictDay) { $message[] = '客户《' . $customerData[$value]['name'] . '》领取失败,失败原因:进入公海后,'.$poolConfig['before_owner_day'].'天内不能领取!'; unset($addCustomerId[(int)$key]); } } } } # 检查是否还有要领取的客户 if (empty($addCustomerId)) return $message; # 检查每天领取的个数限制 $countWhere['type'] = 1; $countWhere['pool_id'] = $poolId; $countWhere['user_id'] = $userId; $countWhere['create_time'] = ['between', [strtotime(date('Y-m-d 00:00:00')), strtotime(date('Y-m-d 23:59:59'))]]; $receiveCount = db('crm_customer_pool_record')->where($countWhere)->count(); if (!empty($poolConfig['receive_conf']) && $receiveCount + count($addCustomerId) > $poolConfig['receive_count']) { $overQuantity = ($receiveCount + count($addCustomerId)) - $poolConfig['receive_count']; $message[] = '领取客户失败,失败原因:超出当日可领取数量,超出'.$overQuantity.'个!'; return $message; } # 整理客户更新数据 $addCustomerData = [ 'owner_user_id' => $userId, 'before_owner_user_id' => 0, 'into_pool_time' => 0, 'obtain_time' => time() ]; # 整理字段操作记录和数据日志的数据 $ip = request()->ip(); $addActionRecordData = []; $addOperationLogData = []; $addReceiveData = []; foreach ($addCustomerId AS $key => $value) { $addActionRecordData[] = [ 'user_id' => $userId, 'types' => 'crm_customer', 'action_id' => $value, 'content' => '领取了客户', 'create_time' => time() ]; $addOperationLogData[] = [ 'user_id' => $userId, 'client_ip' => $ip, 'module' => 'crm_customer', 'action_id' => $value, 'content' => '领取了客户', 'create_time' => time(), 'action_name' => 'update', 'target_name' => $customerData[$value]['name'] ]; $addReceiveData[] = [ 'customer_id' => $value, 'user_id' => $userId, 'pool_id' => $poolId, 'type' => 1, 'create_time' => time() ]; } Db::startTrans(); try { # 领取客户 Db::name('crm_customer')->whereIn('customer_id', $addCustomerId)->update($addCustomerData); # 设置客户的联系人数据 Db::name('crm_contacts')->whereIn('customer_id', $addCustomerId)->update(['owner_user_id' => $userId]); # 删除公海与客户关联数据 Db::name('crm_customer_pool_relation')->whereIn('customer_id', $addCustomerId)->delete(); # 字段操作日志 Db::name('admin_action_record')->insertAll($addActionRecordData); # 数据操作日志 Db::name('admin_operation_log')->insertAll($addOperationLogData); # 记录领取的客户 Db::name('crm_customer_pool_record')->insertAll($addReceiveData); Db::commit(); } catch (\Exception $e) { Db::rollback(); $message = ['领取失败,刷新后重试!']; } return $message; } /** * 分配客户 * * @param array $param user_id 员工ID,customer_id 客户ID * @return array * @since 2021-04-15 * @author fanqi */ public function distributeCustomer($param) { # 查询参数 $userId = $param['user_id']; $customerId = $param['customer_id']; $username = db('admin_user')->where('id', $userId)->value('realname'); # 消息数据 $message = []; # 查询客户列表数据 $customerData = $this->getCustomerList($customerId); # 剔除非公海客户 foreach ($customerId as $key => $value) { if (!empty($customerData[$value]['owner_user_id'])) { $message[] = '将客户《' . $customerData[$value]['name'] . '》分配给员工' . $username . '失败,失败原因:不是公海客户!'; unset($customerId[(int)$key]); continue; } } # 检查是否还有要领取的客户 if (empty($customerId)) return $message; # 获取超出持有客户数的数量 $customerConfigModel = new CustomerConfig(); $exceedCount = $customerConfigModel->checkData($userId, 1, 0, count($customerId)); # 记录添加失败的客户 $failCustomer = []; if (!is_bool($exceedCount) && !empty($exceedCount) && $exceedCount > 0) { $failCustomer = array_slice($customerId, count($customerId) - $exceedCount); foreach ($failCustomer as $key => $value) { $message[] = '将客户《' . $customerData[$value]['name'] . '》分配给员工' . $username . '失败,失败原因:持有客户数达到上限!'; } } # 可以领取的客户ID,取差集 $addCustomerId = count($customerId) == 1 ? $customerId : array_diff($customerId, $failCustomer); # 检查是否还有要领取的客户 if (empty($addCustomerId)) return $message; # 查询分配客户的公海id $poolId = db('crm_customer_pool_relation')->whereIn('customer_id', $customerId)->value('pool_id'); # 整理客户更新数据 $addCustomerData = [ 'owner_user_id' => $userId, 'before_owner_user_id' => 0, 'into_pool_time' => 0, 'obtain_time' => time(), 'is_dealt' => 0, 'is_allocation' => 1, 'follow' => '待跟进' ]; # 整理字段操作记录和数据日志的数据 $ip = request()->ip(); $addActionRecordData = []; $addOperationLogData = []; $addReceiveData = []; foreach ($addCustomerId as $key => $value) { $addActionRecordData[] = [ 'user_id' => $userId, 'types' => 'crm_customer', 'action_id' => $value, 'content' => '将客户 ' . $customerData[$value]['name'] . ' 分配给员工 ' . $username, 'create_time' => time() ]; $addOperationLogData[] = [ 'user_id' => $userId, 'client_ip' => $ip, 'module' => 'crm_customer', 'action_id' => $value, 'content' => '将客户 ' . $customerData[$value]['name'] . ' 分配给员工 ' . $username, 'create_time' => time(), 'action_name' => 'update', 'target_name' => $customerData[$value]['name'] ]; $addReceiveData[] = [ 'customer_id' => $value, 'user_id' => $userId, 'pool_id' => $poolId, 'type' => 3, 'create_time' => time() ]; } Db::startTrans(); try { # 领取客户 Db::name('crm_customer')->whereIn('customer_id', $addCustomerId)->update($addCustomerData); # 设置客户的联系人数据 Db::name('crm_contacts')->whereIn('customer_id', $addCustomerId)->update(['owner_user_id' => $userId]); # 删除公海与客户关联数据 Db::name('crm_customer_pool_relation')->whereIn('customer_id', $addCustomerId)->delete(); # 字段操作日志 Db::name('admin_action_record')->insertAll($addActionRecordData); # 数据操作日志 Db::name('admin_operation_log')->insertAll($addOperationLogData); # 记录领取的客户 Db::name('crm_customer_pool_record')->insertAll($addReceiveData); Db::commit(); } catch (\Exception $e) { Db::rollback(); $message = ['分配失败,刷新后重试!']; } return $message; } /** * 公海权限 * * @param $param * @return array * @since 2021-04-14 * @author fanqi */ public function getAuthorityData($param) { # 权限 $authority = [ 'index' => false, # 列表 'receive' => false, # 领取 'distribute' => false, # 分配 'excelexport' => false, # 导出 'excelimport' => false, # 导入 'delete' => false, # 删除 ]; if (empty($param['pool_id']) || empty($param['user_id']) || empty($param['structure_id'])) return $authority; $poolId = $param['pool_id']; $userId = $param['user_id']; $structureId = $param['structure_id']; # 是否是超级管理员 $userLevel = isSuperAdministrators($param['user_id']); # 公海成员数据 $data = db('crm_customer_pool')->field(['admin_user_ids', 'user_ids', 'department_ids'])->where('pool_id', $poolId)->find(); # 管理员、成员、部门 $adminUserIds = !empty($data['admin_user_ids']) ? explode(',', trim($data['admin_user_ids'], ',')) : []; $userIds = !empty($data['user_ids']) ? explode(',', trim($data['user_ids'], ',')) : []; $structureIds = !empty($data['department_ids']) ? explode(',', trim($data['department_ids'], ',')) : []; # 权限判断 $authority['index'] = ($userLevel || in_array($userId, $adminUserIds)) || (in_array($userId, $userIds) || in_array($structureId, $structureIds)); $authority['receive'] = ($userLevel || in_array($userId, $adminUserIds)) || (in_array($userId, $userIds) || in_array($structureId, $structureIds)); $authority['distribute'] = $userLevel || in_array($userId, $adminUserIds); $authority['excelexport'] = $userLevel || in_array($userId, $adminUserIds); $authority['excelimport'] = $userLevel || in_array($userId, $adminUserIds); $authority['delete'] = $userLevel || in_array($userId, $adminUserIds); return $authority; } /** * 获取用户公海字段样式 * * @param array $param pool 公海ID,user_is 用户ID * @return array[] * @since 2021-04-22 * @author fanqi */ public function getFieldConfigIndex($param) { $showList = []; $hideList = []; # 公海字段-用户配置数据 $data = db('crm_customer_pool_field_style')->where(['pool_id' => $param['pool_id'], 'user_id' => $param['user_id']])->value('content'); $data = !empty($data) ? json_decode($data, true) : []; if (!empty($data)) { $exceptFields = db('admin_field')->where(['types' => 'crm_customer', 'form_type' => ['in', ['file', 'handwriting_sign', 'desc_text', 'detail_table']]])->column('field'); foreach ($data as $key => $value) { if (in_array($value['field'], $exceptFields)) continue; if (!empty($value['is_hidden'])) { $hideList[] = $value; } else { $showList[] = $value; } } } else { # 公海字段-后台配置数据 $where = [ 'pool_id' => $param['pool_id'], 'is_hidden' => 0, 'form_type' => ['notin', ['file', 'handwriting_sign', 'desc_text', 'detail_table']] ]; $poolField = db('crm_customer_pool_field_setting')->where($where)->select(); foreach ($poolField as $key => $value) { if (empty($value['is_hidden'])) { $showList[] = [ 'field' => $value['field_name'], 'name' => $value['name'], 'form_type' => $value['form_type'], 'is_hidden' => $value['is_hidden'], 'width' => '' ]; } } } return ['value_list' => $showList, 'hide_list' => $hideList]; } /** * 设置公海字段列宽 * * @param array $param pool_id 公海ID,field 字段名,width 宽度 * @author fanqi * @since 2021-04-22 */ public function setFieldWidth($param) { $data = db('crm_customer_pool_field_style')->where(['pool_id' => $param['pool_id'], 'user_id' => $param['user_id']])->value('content'); $data = !empty($data) ? json_decode($data, true) : []; if (!empty($data)) { foreach ($data as $key => $value) { if ($param['field'] == $value['field']) { $data[$key]['width'] = $param['width']; } } db('crm_customer_pool_field_style')->where(['pool_id' => $param['pool_id'], 'user_id' => $param['user_id']])->update([ 'content' => json_encode($data), 'update_time' => time() ]); } else { $result = []; $poolField = db('crm_customer_pool_field_setting')->where('pool_id', $param['pool_id'])->select(); foreach ($poolField as $key => $value) { if ($param['field'] == $value['field_name']) { $value['width'] = $param['width']; } $result[] = [ 'field' => $value['field_name'], 'name' => $value['name'], 'width' => $value['width'], 'is_hidden' => $value['hidden'] ]; } if (!empty($result)) { db('crm_customer_pool_field_style')->where(['pool_id' => $param['pool_id'], 'user_id' => $param['user_id']])->insert([ 'user_id' => $param['user_id'], 'pool_id' => $param['pool_id'], 'content' => json_encode($result), 'create_time' => time(), 'update_time' => time() ]); } } } /** * 设置公海字段样式 * * @param array $param pool_id 公海ID,value 要显示的字段数组,hide_value 要隐藏的字段数组 * @author fanqi * @since 2021-04-22 */ public function setFieldConfig($param) { $data = []; $showList = $param['value']; $hideList = $param['hide_value']; foreach ($showList as $key => $value) { $data[] = [ 'field' => $value['field'], 'name' => $value['name'], 'is_hidden' => 0, 'width' => $value['width'] ]; } foreach ($hideList as $key => $value) { $data[] = [ 'field' => $value['field'], 'name' => $value['name'], 'is_hidden' => 1, 'width' => $value['width'] ]; } if (db('crm_customer_pool_field_style')->where(['pool_id' => $param['pool_id'], 'user_id' => $param['user_id']])->value('id')) { db('crm_customer_pool_field_style')->where(['pool_id' => $param['pool_id'], 'user_id' => $param['user_id']])->update([ 'content' => json_encode($data), 'update_time' => time() ]); } else { db('crm_customer_pool_field_style')->where(['pool_id' => $param['pool_id'], 'user_id' => $param['user_id']])->insert([ 'user_id' => $param['user_id'], 'pool_id' => $param['pool_id'], 'content' => json_encode($data), 'create_time' => time(), 'update_time' => time() ]); } } /** * 数据的ID字符串转文字 * * @param string $source 源ids * @param array $target 目标数组 * @return string * @since 2021-04-14 * @author fanqi */ private function fieldTransformToText($source, $target) { $result = []; $array = explode(',', trim($source, ',')); foreach ($array as $kk => $vv) { if (!empty($target[$vv])) $result[] = $target[$vv]; } return implode(',', $result); } /** * 查询表字段 * * @param int $poolId 公海ID * @return string * @since 2021-04-14 * @author fanqi */ private function getPoolQueryField($poolId) { # 自定义字段 $customerFields = db('crm_customer_pool_field_setting')->where('pool_id', $poolId)->where('is_hidden', 0)->column('field_name'); $customerFields[] = 'customer_id'; # 自定增加表别名 $result = array_reduce($customerFields, function ($result, $value) { return $result . 'customer.' . $value . ','; }); return trim($result, ','); } /** * 获取员工列表 * * @return array * @since 2021-04-14 * @author fanqi */ private function getUserList() { $result = []; $list = db('admin_user')->field(['id', 'realname'])->select(); foreach ($list as $key => $value) { $result[$value['id']] = $value['realname']; } return $result; } /** * 获取部门列表 * * @return array * @since 2021-04-14 * @author fanqi */ private function getStructureList() { $result = []; $list = db('admin_structure')->field(['id', 'name'])->select(); foreach ($list as $key => $value) { $result[$value['id']] = $value['name']; } return $result; } /** * 获取客户列表 * * @param array $customerId 客户ID * @return array * @since 2021-04-15 * @author fanqi */ private function getCustomerList($customerId) { $result = []; # 获取客户数据 $customerList = db('crm_customer')->field(['customer_id', 'owner_user_id', 'name', 'into_pool_time', 'before_owner_user_id'])->whereIn('customer_id', $customerId)->select(); # 整理客户数据 foreach ($customerList as $key => $value) { $result[$value['customer_id']] = $value; } return $result; } /** * 设置公海字段样式 * * @param array $param user_id 用户id,pool_id 公海id * @param array $data 公海字段数据 * @return array */ private function setFieldStyle($param, $data) { $result = []; # 更新字段样式 $this->updateFieldStyle($param); # 查询自定义字段样式列表 $list = db('crm_customer_pool_field_style')->where(['user_id' => $param['user_id'], 'pool_id' => $param['pool_id']])->value('content'); # 如果用户没有自定义数据返回原数据 if (empty($list)) return $data; $list = json_decode($list, true); foreach ($list as $key => $value) { if (!empty($value['is_hidden']) || empty($data[$value['field']])) continue; $result[] = [ 'field' => $value['field'], 'fieldName' => $data[$value['field']]['fieldName'], 'name' => $value['name'], 'width' => $value['width'], 'is_hidden' => 0, 'system' => $data[$value['field']]['system'], 'form_type' => $data[$value['field']]['form_type'], ]; } return $result; } /** * 更新用户设置的字段样式 * * @param $param * @author fanqi * @since 2021-05-06 */ private function updateFieldStyle($param) { if (!empty($param['user_id']) && !empty($param['pool_id'])) { # 公海字段-用户配置数据 $fieldStyleContent = db('crm_customer_pool_field_style')->where(['pool_id' => $param['pool_id'], 'user_id' => $param['user_id']])->value('content'); if (!empty($fieldStyleContent)) { $fieldStyleList = json_decode($fieldStyleContent, true); # 公海字段-后台配置数据 $poolField = db('crm_customer_pool_field_setting')->where('pool_id', $param['pool_id'])->select(); $poolData = []; foreach ($poolField as $key => $value) { $poolData[$value['field_name']] = $value; } # 去掉隐藏的字段 + 去掉已经存在的字段 = 剩下的就是新增(隐藏后又开启)的字段 foreach ($fieldStyleList as $key => $value) { # 去掉隐藏的字段 if (empty($poolData[$value['field']]) || (!empty($poolData[$value['field']]) && !empty($poolData[$value['field']]['is_hidden']))) { unset($fieldStyleList[$key]); unset($poolData[$value['field']]); continue; } # 后台可能更新了字段名称 $fieldStyleList[$key]['name'] = $poolData[$value['field']]['name']; # 去掉已经存在的字段 unset($poolData[$value['field']]); } # 新增(隐藏后又开启)字段 if (!empty($poolData)) { foreach ($poolData as $key => $value) { if (empty($value['is_hidden'])) { $fieldStyleList[] = [ 'field' => $value['field_name'], 'name' => $value['name'], 'is_hidden' => 0, 'width' => '' ]; } } } # 公海字段-更新用户配置 db('crm_customer_pool_field_style')->where(['pool_id' => $param['pool_id'], 'user_id' => $param['user_id']])->update([ 'content' => json_encode(array_values($fieldStyleList)) ]); } } } /** * 发起捞起客户审批 * @param array $param user_id 领取人ID,customer_id 要领取的客户ID check_user_id 审核人id */ public function customerReceiveExamine($param) { $customerCheckModel = model('CustomerCheck'); $examineStepModel = new \app\admin\model\ExamineStep(); $examineStatus = $param['examineStatus'] ?? 1; // 审批是否停用 unset($param['examineStatus']); $dataInfo = db('crm_customer_check')->where('customer_id', 'in', $param['customer_id'])->find(); if ($dataInfo) { return '客户已被领取待审批,请联系管理员'; } if (($examineStatus != false && $examineStatus != 'false') || $examineStatus == 1) { // 审核判断(是否有符合条件的审批流) $examineFlowModel = new \app\admin\model\ExamineFlow(); if (!$examineFlowModel->checkExamine($param['user_id'], 'crm_customer_check')) { return '暂无审批人,无法创建'; } //添加审批相关信息 $examineFlowData = $examineFlowModel->getFlowByTypes($param['user_id'], 'crm_customer_check'); if (!$examineFlowData) { return '无可用审批流,请联系管理员'; } $param['flow_id'] = $examineFlowData['flow_id']; //获取审批人信息 if ($examineFlowData['config'] == 1) { //固定审批流 $nextStepData = $examineStepModel->nextStepUser($param['user_id'], $examineFlowData['flow_id'], 'crm_customer_check', 0, 0, 0); $next_user_ids = arrayToString($nextStepData['next_user_ids']) ?: ''; $check_user_id = $next_user_ids ?: []; $param['order_id'] = 1; } else { $check_user_id = $param['check_user_id'] ? ',' . $param['check_user_id'] . ',' : ''; } if (!$check_user_id) { return '无可用审批人,请联系管理员'; } $param['check_user_id'] = is_array($check_user_id) ? ',' . implode(',', $check_user_id) . ',' : $check_user_id; } else { # 审批流停用,将状态改为审核通过 // $param['check_status'] = 2; # 审批流停用,将状态改为正常 zjf 20210727 默认值为7 $param['check_status'] = 7; } if ($customerCheckModel->createData($param)) { return '添加成功'; } else { return $customerCheckModel->getError(); } } }