model = new CustomerResources(); } /** * 获取客户资源列表 * @param array $where * @return array */ public function getPage(array $data = []) { // dump($data);die; $field = 'a.*,b.id as shared_id,c.campus_name'; $order = 'a.id desc'; $where = []; if ($data['phone_number']) { $where[] = ['a.phone_number', '=', $data['phone_number']]; } if ($data['name']) { $where[] = ['a.name', '=', $data['name']]; } if ($data['age']) { $where[] = ['a.age', '=', $data['age']]; } if ($data['gender']) { $where[] = ['a.gender', '=', $data['gender']]; } if ($data['type'] == 'yjfp') { $where[] = ['b.shared_by', '=', 0]; } if ($data['member_label']) { $where[] = ['a.member_label', 'like', "%" . $data['member_label'] . "%"]; } if ($data['campus_name']) { $where[] = ['c.campus_name', 'like', "%" . $data['campus_name'] . "%"]; } $search_model = $this->model ->alias("a") ->join(['school_resource_sharing' => 'b'], 'a.id = b.resource_id', 'left') ->join(['school_campus' => 'c'], 'a.campus = c.id', 'left') ->where($where) ->with(['personnel']) ->field($field)->order($order); if (isset($data['created_at'][0]) && isset($data['created_at'][1])) { $search_model->whereBetweenTime('created_at', $data['created_at'][0] . "00:00:00", $data['created_at'][1] . "23:59:59"); } if (isset($data['updated_at'][0]) && isset($data['updated_at'][1])) { $search_model->whereBetweenTime('updated_at', $data['updated_at'][0] . "00:00:00", $data['updated_at'][1] . "23:59:59"); } $search_model->where(get_campus_where($this->uid, 'campus')); return $this->pageQuery($search_model, function ($item, $key) { $item = $this->makeUp($item); $sixSpeed = new SixSpeed(); $data = $sixSpeed->where(['resource_id' => $item['id']])->findOrEmpty()->toArray(); $item['six'] = $data; $member = new Member(); $member_info = $member->where(['member_id' => $item['member_id']])->findOrEmpty()->toArray(); $item['member_info'] = $member_info; }); } /** * 获取客户资源信息 * @param int $id * @return array */ public function getInfo(int $id) { $field = 'id,create_year_month,create_date,source,source_channel,member_label,consultant,name,age,gender,phone_number,demand,purchasing_power,cognitive_idea,optional_class_time,distance,decision_maker,initial_intent,campus,created_at,updated_at,deleted_at,status'; $info = $this->model->field($field)->where([['id', "=", $id]])->with(['personnel'])->findOrEmpty()->toArray(); $sixSpeed = new SixSpeed(); $data = $sixSpeed->where(['resource_id' => $id])->field("*,distance as distance_tow")->findOrEmpty()->toArray(); $info = $info + $data; return $this->makeUp($info); } public function makeUp($data) { //会员标签 if (!empty($data['member_label'])) { $data['member_label_array'] = (new MemberLabelService())->getMemberLabelListByLabelIds($data['member_label']); } return $data; } /** * 添加客户资源 * @param array $data * @return mixed */ public function add(array $data) { $personnel = new Personnel(); $data['consultant'] = $personnel->where(['sys_user_id' => $this->uid])->value("id"); if (!$data['consultant']) { return fail("超级管理员不允许添加资源"); } if ($this->model->where(['phone_number' => $data['phone_number']])->find()) { return fail("资源重复添加"); } $sixSpeed = new SixSpeed(); $role_id = $personnel->alias("a") ->join(['school_campus_person_role' => 'b'], 'a.id = b.person_id', 'left') ->where(['a.id' => $data['consultant']]) ->value('b.role_id'); $data['rf_type'] = get_role_type($role_id); // $data['member_label'] = json_encode($data['member_label']); // 新资源有2节体验课 $data['trial_class_count'] = 2; $res = $this->model->create($data); // 写入资源分配表 $assignee_id = $data['consultant'] ?: 56; // 如果没有查到人员记录则使用默认值56 try { Db::table('school_resource_assignment')->insert([ 'resource_id' => $res->id, 'assignee_type' => 'user', 'assignee_id' => $assignee_id, 'is_primary' => 1, 'assigned_by' => 0, 'assigned_at' => date("Y-m-d H:i:s"), 'campus_id' => $data['campus'], 'assigned_source' => 'adminapi' ]); } catch (\Exception $e) { // 如果插入失败,记录日志但不影响主流程 Log::error("资源分配记录写入失败:" . $e->getMessage()); } $event_data = [ 'customer_resources_id' => $res->id,//客户资源表id 'event_type' => 'add'//事件类型"add=添加,edit=修改 ];//事件类型"add=添加,edit=修改 Event::trigger('CalculatePerformance', $event_data, true); if ($data['purchase_power']) { $six_id = $sixSpeed->where(['resource_id' => $res->id])->value("id"); $data['staff_id'] = $data['consultant']; $field = [ 'purchase_power' => $data['purchase_power'], 'concept_awareness' => $data['concept_awareness'], 'preferred_class_time' => $data['preferred_class_time'], 'distance' => $data['distance_tow'], 'communication' => $data['communication'], 'promised_visit_time' => $data['promised_visit_time'], 'actual_visit_time' => $data['actual_visit_time'], 'call_intent' => $data['call_intent'], 'first_visit_status' => $data['first_visit_status'], 'second_visit_status' => $data['second_visit_status'], 'is_closed' => $data['is_closed'], 'staff_id' => $data['staff_id'], 'resource_id' => $res->id ]; if ($six_id) { $sixSpeed->where(['resource_id' => $res->id])->update($field); } else { $sixSpeed->insert($field); } } return success("操作成功"); } /** * 客户资源编辑 * @param int $id * @param array $data */ public function edit(int $id, array $data) { $personnel = new Personnel(); $data['consultant'] = $personnel->where(['sys_user_id' => $this->uid])->value("id"); if(!$data['consultant']){ return fail("超级管理员不允许修改资源"); } if ($this->model->where([ ['phone_number', '=', $data['phone_number']], ['id', '<>', $id] ])->find()) { return fail("资源重复添加"); } // $data['consultant'] = 1; $res = $this->model->where([['id', '=', $id]])->findOrEmpty()->toArray(); $this->model->where([['id', '=', $id]])->update([ 'source' => $data['source'], 'source_channel' => $data['source_channel'], 'member_label' => $data['member_label'], 'name' => $data['name'], 'age' => $data['age'], 'gender' => $data['gender'], 'phone_number' => $data['phone_number'], 'demand' => $data['demand'], 'purchasing_power' => $data['purchasing_power'], 'cognitive_idea' => $data['cognitive_idea'], 'optional_class_time' => $data['optional_class_time'], 'distance' => $data['distance'], 'decision_maker' => $data['decision_maker'], 'initial_intent' => $data['initial_intent'], 'campus' => $data['campus'], 'status' => $data['status'], 'create_year_month' => $data['create_year_month'], 'create_date' => $data['create_date'] ]); $resources_save = getModifiedFields($res, $data); $customerResourceChanges = new CustomerResourceChanges(); if ($resources_save['is_save']) { $customerResourceChanges->insert([ 'customer_resource_id' => $id, 'operator_id' => $res['consultant'], 'campus_id' => $data['campus'], 'modified_fields' => $resources_save['modified_fields'], 'old_values' => $resources_save['old_values'], 'new_values' => $resources_save['new_values'] ]); } $sixSpeed = new SixSpeed(); if ($data['purchase_power']) { $sixSpeedModificationLog = new SixSpeedModificationLog(); $six_id = $sixSpeed->where(['resource_id' => $id])->value("id"); $data['staff_id'] = $res['consultant']; $field = [ 'purchase_power' => $data['purchase_power'], 'concept_awareness' => $data['concept_awareness'], 'preferred_class_time' => $data['preferred_class_time'], 'distance' => $data['distance_tow'], 'communication' => $data['communication'], 'promised_visit_time' => $data['promised_visit_time'], 'actual_visit_time' => $data['actual_visit_time'], 'call_intent' => $data['call_intent'], 'first_visit_status' => $data['first_visit_status'], 'second_visit_status' => $data['second_visit_status'], 'is_closed' => $data['is_closed'], 'staff_id' => $data['staff_id'], 'resource_id' => $id ]; if ($six_id) { $six_log = $sixSpeed->where(['resource_id' => $id])->findOrEmpty()->toArray(); $six_save = getModifiedFields($six_log, $field); if ($six_save['is_save']) { $sixSpeedModificationLog->insert([ 'customer_resource_id' => $id, 'operator_id' => $res['consultant'], 'campus_id' => $data['campus'], 'modified_field' => $six_save['modified_fields'], 'old_value' => $six_save['old_values'], 'new_value' => $six_save['new_values'] ]); } $sixSpeed->where(['resource_id' => $id])->update($field); } else { $sixSpeed->insert($field); } } return success("操作成功"); } /** * 删除客户资源 * @param int $id * @return bool */ public function del(int $id) { $model = $this->model->where([['id', '=', $id]])->find(); $res = $model->delete(); return $res; } public function getPersonnelAll($data) { $school_campus_person_role = new CampusPersonRole(); $personnelModel = new Personnel(); $where = []; // if ($data['role_id']) { // $where[] = ['a.role_id', '=', $data['role_id']]; // } if ($data['dept_id']) { $where[] = ['a.dept_id', '=', $data['dept_id']]; } return $school_campus_person_role ->alias("a") ->join(['school_personnel' => 'b'], 'a.person_id = b.id', 'left') ->field("b.*") ->where($where)->select()->toArray(); } public function getCampusAll() { $campusModel = new Campus(); return $campusModel->select()->toArray(); } public function fp_edit($data) { $resourceSharing = new ResourceSharing(); $resourceSharing->where(['id' => $data['shared_id']])->update([ 'shared_by' => $data['shared_by'], 'shared_at' => date("Y-m-d H:i:s") ]); return "分配成功"; } public function personnelAllByname($name) { $query = $this->model->whereNotExists(function ($query) { $query->name('order_table') // 订单表名 ->whereRaw('school_order_table.resource_id = school_customer_resources.id'); }); //如果$name是手机号,则按手机号查询 if (isPhone($name)) { $query = $query->where('phone_number', $name); } else { $query = $query->where('name', 'like', '%' . $name . '%'); } return $query->select()->toArray(); } /** * 获取销售人员 */ public function getSalesPerson($campus_id) { } /** * 获取市场人员 */ public function getMarketPerson($campus_id) { } /** * 获取教练人员 */ public function getCoachPerson($campus_id) { $coachModel = new CampusPersonRole(); return $coachModel ->alias("a") ->join(['school_personnel' => 'b'], 'a.person_id = b.id', 'left') ->field("a.*,b.name,b.phone") ->where([ ['a.campus_id', '=', $campus_id], // ['a.role_id', '=', 5] ])->select()->toArray(); } /** * 获取课程下的资源和学员 * @param $course_id * @return mixed */ public function getResourceByCourse($schedule_id) { $schedule = CourseSchedule::find($schedule_id); $course_id = $schedule->course_id; $all = (new OrderTable()) ->alias('a') ->join(['school_customer_resources' => 'b'], 'a.resource_id = b.id') ->join(['school_student' => 'c'], 'a.resource_id = c.user_id') ->field('b.name, b.phone_number, b.id, c.name as student_name, c.age, c.id as student_id, a.id as order_id') ->where([ ['a.course_id', '=', $course_id], ['a.order_status', '=', 'paid'] ]) ->group('a.id') ->select() ->toArray(); // 假设 $selectedCode 是一个数组,包含已经加入课程的人员 ID $selectedCode = $schedule->participants; // 遍历 $all,为每个元素添加 checked 属性 foreach ($all as &$item) { $item['checked'] = in_array($item['id'], $selectedCode ? $selectedCode : []); } return $all; } public function log_list(array $data = []) { $customer_resource_changes = new CustomerResourceChanges(); $where = []; if ($data['customer_resource_id']) { $where[] = ['a.customer_resource_id', '=', $data['customer_resource_id']]; } $search_model = $customer_resource_changes ->alias("a") ->join(['school_personnel' => 'b'], 'a.operator_id = b.id', 'left') ->where($where) ->field("a.*,b.name") ->order("a.id asc"); return $this->pageQuery($search_model, function ($item, $key) { $fieldZhArr = CustomerResources::FieldZh; $modified_fields = json_decode($item['modified_fields'], true); $type = []; foreach ($modified_fields as $key => $value) { $type[] = $fieldZhArr[$value]; } $item['type'] = implode("
", $type); $old_values = json_decode($item['old_values'], true); $new_values = json_decode($item['new_values'], true); $values = []; foreach ($old_values as $key => $value) { $old_value = $this->fields($key, $value); $new_value = $this->fields($key, $new_values[$key]); $values[] = $old_value . '->' . $new_value; } $item['values'] = implode("
", $values); }); } public function student_courses(array $data = []) { $studentCourses = new StudentCourses(); $where = []; if ($data['customer_resource_id']) { $where[] = ['b.user_id', '=', $data['customer_resource_id']]; } $search_model = $studentCourses ->alias("a") ->join(['school_student' => 'b'], 'a.student_id = b.id', 'left') ->join(['school_course' => 'c'], 'a.course_id = c.id', 'left') ->where($where) ->field("a.*,c.course_name") ->order("a.id desc"); return $this->pageQuery($search_model, function ($item, $key) { $item['total'] = $item['total_hours'] + $item['gift_hours']; $item['used'] = $item['use_total_hours'] + $item['use_gift_hours']; $now = date('Y-m-d'); // 当前日期 if ($now < $item['start_date']) { $item['status'] = '未进行'; } elseif ($now > $item['end_date']) { $item['status'] = '已结束'; } else { $item['status'] = '进行中'; } }); } public function order_table(array $data = []) { $orderTable = new OrderTable(); $where = []; if ($data['customer_resource_id']) { $where[] = ['a.resource_id', '=', $data['customer_resource_id']]; } $search_model = $orderTable ->alias("a") ->join(['school_course' => 'b'], 'a.course_id = b.id', 'left') ->where($where) ->field("a.*,b.course_name") ->order("a.id desc"); return $this->pageQuery($search_model, function ($item, $key) { $arr = ['cash' => '现金支付', 'scan_code' => '扫码支付', 'subscription' => '订阅支付']; $item['type'] = $arr[$item['payment_type']]; $item['order_status'] = $item['order_status'] == 'pending' ? '待支付' : '已支付'; }); } public function fields($filed, $value) { if (!$value) { return '空'; } $campus = new Campus(); $member_label = new MemberLabel(); switch ($filed) { case 'initial_intent': return get_dict_value('preliminarycustomerintention', $value); break; case 'source': return get_dict_value('source', $value); break; case 'purchasing_power': return get_dict_value('customer_purchasing_power', $value); break; case 'cognitive_idea': return get_dict_value('cognitive_concept', $value); break; case 'source_channel': return get_dict_value('SourceChannel', $value); break; case 'status': return get_dict_value('kh_status', $value); break; case 'member_label': $label_name = $member_label->where('label_id', 'in', $value)->column('label_name'); return implode("-", $label_name); break; case 'campus': return $campus->where(['id' => $value])->value("campus_name"); break; default: return $value; } } public function to_lead_into(array $data) { $filePath = public_path() . $data['url']; $personnel = new Personnel(); $campusModel = new Campus(); // $consultant = $personnel->where(['sys_user_id' => $this->uid])->value("id"); // if(!$consultant){ // return fail("操作失败"); // } $consultant = 3; try { $spreadsheet = IOFactory::load($filePath); $worksheet = $spreadsheet->getActiveSheet(); $highestRow = $worksheet->getHighestRow(); $list = []; // 遍历每一行 foreach ($worksheet->getRowIterator() as $rowIndex => $row) { if ($rowIndex == 1) { // 跳过第一行(表头)和最后一行 continue; } $cellIterator = $row->getCellIterator(); $cellIterator->setIterateOnlyExistingCells(false); $data = []; foreach ($cellIterator as $cell) { $value = $cell->getValue(); // 获取每个单元格的值 if ($value instanceof \PhpOffice\PhpSpreadsheet\RichText\RichText) { $value = $value->getPlainText(); } $data[] = $value; } $list[] = $data; } $inserAll = []; // $status = ['已禁用' => 0,'待审核'=>1,'已审核' => 2]; // $is_sys_user = ['是' => 1,'否'=>0]; foreach ($list as $key => $item) { $source_channel = get_dict_name('source',$item[1]); $source = get_dict_name('SourceChannel',$item[2]); $gender = get_dict_name('zy_sex',$item[4]); $purchasing_power = get_dict_name('customer_purchasing_power',$item[7]); $cognitive_idea = get_dict_name('cognitive_concept',$item[8]); $campus = $campusModel->where(['campus_name' => $item[0]])->value('id'); $inserAll[] = [ 'campus' => $campus, 'source_channel' => $source_channel, 'source' => $source, 'name' =>$item[3], 'gender' =>$gender, 'phone_number' => $item[5], 'demand' => $item[6], 'purchasing_power' =>$purchasing_power, 'cognitive_idea' => $cognitive_idea, 'consultant' => $consultant, 'create_year_month' => date("Y-m"), 'create_date' => date("Y-m-d") ]; } $this->model->insertAll($inserAll); return success("导入成功"); } catch (\PhpOffice\PhpSpreadsheet\Reader\Exception $e) { return fail($e->getMessage()); } } /** * 获取客户赠品记录列表 * @param array $data * @return array */ public function gift_records(array $data = []) { if (empty($data['resource_id'])) { return []; } // 使用API服务层的方法 $api_service = new \app\service\api\apiService\CustomerResourcesService(); $result = $api_service->getGiftRecordList(['resource_id' => $data['resource_id']]); if ($result['code']) { return $result['data']; } else { return []; } } }