Browse Source

feat(resource-sharing): 新增资源共享列表接口和页面

- 新增 index1 接口,支持按共享人、姓名、手机号、校区等条件筛选资源共享列表
- 新增 getList1 方法,实现资源共享列表的查询逻辑
- 优化路由配置,添加新的资源共享列表路由
- 更新前端页面,调整资源共享列表的展示和筛选功能
master
王泽彦 9 months ago
parent
commit
4b1585d510
  1. 2
      admin/src/app/lang/zh-cn/customer_resources.customer_resources.json
  2. 575
      admin/src/app/views/xsyj/xsyj.vue
  3. 25
      niucloud/app/api/controller/apiController/ResourceSharing.php
  4. 1
      niucloud/app/api/route/route.php
  5. 211
      niucloud/app/service/api/apiService/ResourceSharingService.php

2
admin/src/app/lang/zh-cn/customer_resources.customer_resources.json

@ -3,7 +3,7 @@
"sourcePlaceholder": "请输入来源",
"sourceChannel": "来源渠道",
"sourceChannelPlaceholder": "请输入来源渠道",
"consultant": "顾问",
"consultant": "首次录入",
"name": "姓名",
"namePlaceholder": "请输入姓名",
"age": "年龄",

575
admin/src/app/views/xsyj/xsyj.vue

@ -1,275 +1,316 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never" v-loading="loading">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addStage"> 新增阶段 </el-button>
</div>
</el-card>
<el-card class="box-card !border-none" shadow="never">
<div class="flex items-center justify-between p-[10px] table-item-border bg">
<span class="text-base w-[230px]">阶段名称</span>
<span class="text-base w-[110px] text-center">底薪</span>
</div>
<el-collapse v-model="activeNames" accordion>
<el-collapse-item v-for="(stage, index) in stages" :key="stage.id" :name="stage.id">
<template #title>
<div class="collapse-title">
<span class="title-name">{{ stage.name }}</span>
<span class="arrow">{{ stage.price }} </span>
<!-- <span class="arrow">&gt;</span> -->
</div>
</template>
<el-form label-width="100px" style="margin-bottom: 10px">
<el-form-item label="阶段名称">
<el-input v-model="stage.name" placeholder="请输入阶段名称" />
</el-form-item>
</el-form>
<el-form label-width="100px" style="margin-bottom: 10px">
<el-form-item label="阶段底薪">
<el-input v-model="stage.price" placeholder="请输入阶段底薪" />
</el-form-item>
</el-form>
<el-button type="success" size="small" @click="addRule(stage)">新增规则</el-button>
<el-table :data="stage.rules" border style="margin-top: 10px">
<el-table-column prop="renewal_standard_min" label="续费上限">
<template #default="{ row }">
<el-input v-model="row.renewal_standard_min" placeholder="请输入续费上限" />
</template>
</el-table-column>
<el-table-column prop="renewal_standard_max" label="续费下限">
<template #default="{ row }">
<el-input v-model="row.renewal_standard_max" placeholder="请输入续费下限" />
</template>
</el-table-column>
<el-table-column prop="renewal_commission" label="续费提成">
<template #default="{ row }">
<el-input v-model="row.renewal_commission" placeholder="%" />
</template>
</el-table-column>
<el-table-column prop="new_count_min" label="新单成交数上限">
<template #default="{ row }">
<el-input v-model="row.new_count_min" />
</template>
</el-table-column>
<el-table-column prop="new_count_max" label="新单成交数下限">
<template #default="{ row }">
<el-input v-model="row.new_count_max" />
</template>
</el-table-column>
<el-table-column prop="xf_count_min" label="续费成交数上限">
<template #default="{ row }">
<el-input v-model="row.xf_count_min" />
</template>
</el-table-column>
<el-table-column prop="xf_count_max" label="续费成交数下限">
<template #default="{ row }">
<el-input v-model="row.xf_count_max" />
</template>
</el-table-column>
<el-table-column prop="new_move_5" label="新招(5+1)x3">
<template #default="{ row }">
<el-input v-model="row.new_move_5" />
</template>
</el-table-column>
<el-table-column prop="new_move_7" label="新招(7+1)x3">
<template #default="{ row }">
<el-input v-model="row.new_move_7" />
</template>
</el-table-column>
<el-table-column label="操作" width="100">
<template #default="{ $index }">
<el-button type="danger" size="small" @click="removeRule(stage, $index)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-button type="danger" size="small" style="margin-top: 10px"
@click="removeStage(index)">删除该阶段</el-button>
</el-collapse-item>
</el-collapse>
<el-form label-position="left" label-width="100px" class="config-form" style="margin-top: 70px;">
<h3>其他绩效配置</h3>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="一访成交">
<el-input v-model="form.qt_firstVisit" placeholder="%" suffix-icon="el-icon-percent" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="二访成交">
<el-input v-model="form.qt_secondVisit" placeholder="%" suffix-icon="el-icon-percent" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="追单">
<el-input v-model="form.qt_followUp" placeholder="%" suffix-icon="el-icon-percent" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="内部员工">
<el-input v-model="form.qt_internalStaff" placeholder="元" suffix-icon="el-icon-money" />
</el-form-item>
</el-col>
</el-row>
<view v-for="(item, index) in course_type">
<el-form-item :label="item.name" >
<el-input v-model="item.num" placeholder="元" style="width: 200px;"/>
</el-form-item>
</view>
</el-form>
<div style="text-align: right; margin-top: 20px">
<el-button type="primary" @click="onSave">提交保存</el-button>
</div>
</el-card>
</div>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never" v-loading="loading">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addStage"> 新增阶段</el-button>
</div>
</el-card>
<el-card class="box-card !border-none" shadow="never">
<div class="flex items-center justify-between p-[10px] table-item-border bg">
<span class="text-base w-[230px]">阶段名称</span>
<span class="text-base w-[110px] text-center">底薪</span>
</div>
<el-collapse v-model="activeNames" accordion>
<el-collapse-item v-for="(stage, index) in stages" :key="stage.id" :name="stage.id">
<template #title>
<div class="collapse-title">
<span class="title-name">{{ stage.name }}</span>
<span class="arrow">{{ stage.price }} </span>
<!-- <span class="arrow">&gt;</span> -->
</div>
</template>
<el-form label-width="100px" style="margin-bottom: 10px">
<el-form-item label="阶段名称">
<el-input v-model="stage.name" placeholder="请输入阶段名称"/>
</el-form-item>
</el-form>
<el-form label-width="100px" style="margin-bottom: 10px">
<el-form-item label="阶段底薪">
<el-input v-model="stage.price" placeholder="请输入阶段底薪"/>
</el-form-item>
</el-form>
<el-button type="success" size="small" @click="addRule(stage)">新增规则</el-button>
<el-table :data="stage.rules" border style="margin-top: 10px">
<el-table-column prop="renewal_standard_min" label="续费率上限">
<template #default="{ row }">
<el-input v-model="row.renewal_standard_min" placeholder="请输入续费率上限" :max="100" type="number">
<template #append>
<el-button type="primary">%</el-button>
</template>
</el-input>
</template>
</el-table-column>
<el-table-column prop="renewal_standard_max" label="续费率下限">
<template #default="{ row }">
<el-input v-model="row.renewal_standard_max" placeholder="请输入续费率下限" :max="100" type="number">
<template #append>
<el-button type="primary">%</el-button>
</template>
</el-input>
</template>
</el-table-column>
<el-table-column prop="renewal_commission" label="续费提成">
<template #default="{ row }">
<el-input v-model="row.renewal_commission" placeholder="输入续费提成金额" type="number">
<template #append>
<el-button type="primary"></el-button>
</template>
</el-input>
</template>
</el-table-column>
<el-table-column prop="new_count_min" label="新单成交数上限">
<template #default="{ row }">
<el-input v-model="row.new_count_min" placeholder="输入完单数量" type="number">
<template #append>
<el-button type="primary"></el-button>
</template>
</el-input>
</template>
</el-table-column>
<el-table-column prop="new_count_max" label="新单成交数下限">
<template #default="{ row }">
<el-input v-model="row.new_count_max" placeholder="输入完单数量" type="number">
<template #append>
<el-button type="primary"></el-button>
</template>
</el-input>
</template>
</el-table-column>
<!-- <el-table-column prop="xf_count_min" label="续费成交数上限">-->
<!-- <template #default="{ row }">-->
<!-- <el-input v-model="row.xf_count_min" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column prop="xf_count_max" label="续费成交数下限">-->
<!-- <template #default="{ row }">-->
<!-- <el-input v-model="row.xf_count_max" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column prop="new_move_5" label="新招(5+1)x3">-->
<!-- <template #default="{ row }">-->
<!-- <el-input v-model="row.new_move_5" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column prop="new_move_7" label="新招(7+1)x3">-->
<!-- <template #default="{ row }">-->
<!-- <el-input v-model="row.new_move_7" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="操作" width="100">
<template #default="{ $index }">
<el-button type="danger" size="small" @click="removeRule(stage, $index)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-button type="danger" size="small" style="margin-top: 10px"
@click="removeStage(index)">删除该阶段
</el-button>
</el-collapse-item>
</el-collapse>
<el-form label-position="left" label-width="100px" class="config-form" style="margin-top: 70px;">
<h2 style="margin-bottom: 20px">多人介入完单资源业绩配置比例</h2>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="一访成交">
<el-input v-model="form.qt_firstVisit" placeholder="请输入一访成交时提成的分配比例" :max="100" type="number">
<template #append>
<el-button type="primary">%</el-button>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="二访成交">
<el-input v-model="form.qt_secondVisit" placeholder="请输入二访成交时提成的分配比例" :max="100" type="number">
<template #append>
<el-button type="primary">%</el-button>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="追单">
<el-input v-model="form.qt_followUp" placeholder="请输入追单成功的分配比例" :max="100" type="number">
<template #append>
<el-button type="primary">%</el-button>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="内部员工">
<el-input v-model="form.qt_internalStaff" placeholder="请输入资源为内部员工时的提成金额" type="number">
<template #append>
<el-button type="primary"></el-button>
</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<h2 style="margin-bottom: 20px">课程提成</h2>
<view v-for="(item, index) in course_type">
<el-form-item :label="item.name">
<el-input v-model="item.num" placeholder="请输入金额" style="width: 200px;" type="number">
<template #append>
<el-button type="primary"></el-button>
</template>
</el-input>
</el-form-item>
</view>
</el-form>
<div style="text-align: right; margin-top: 20px">
<el-button type="primary" @click="onSave">提交保存</el-button>
</div>
</el-card>
</div>
</template>
<script lang="ts" setup>
import { xsyjConfig, getXsyjConfig } from '@/app/api/sys'
import { reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title
const loading = ref(true)
const stages = ref([])
const activeNames = ref(null)
const form = ref({
qt_firstVisit: '',
qt_secondVisit: '',
qt_followUp: '',
qt_internalStaff: '',
});
const course_type = ref({});
function addStage() {
const newStage = {
name: '默认阶段',
price: 0,
rules: [
{
renewal_standard_min: '',
renewal_standard_max: '',
renewal_commission: '',
new_count_min: '',
new_count_max: '',
xf_count_min: '',
xf_count_max: '',
new_move_5: '',
new_move_7: '',
},
],
}
stages.value.push(newStage)
activeNames.value = newStage.name
}
function removeStage(index) {
stages.value.splice(index, 1)
}
function addRule(stage) {
stage.rules.push({
renewal_standard_min: '',
renewal_standard_max: '',
renewal_commission: '',
new_count_min: '',
new_count_max: '',
xf_count_min: '',
xf_count_max: '',
new_move_5: '',
new_move_7: '',
})
}
function removeRule(stage, ruleIndex) {
if (stage.rules.length === 1) {
ElMessage.warning('至少保留一条规则')
return
}
stage.rules.splice(ruleIndex, 1)
}
const setFormData = async () => {
const data = await (await getXsyjConfig()).data
stages.value = data.data
form.value = data.form
course_type.value = data.course_type
loading.value = false
}
setFormData()
const onSave = async () => {
xsyjConfig({ 'stages': stages.value, 'form': form.value,'course_type':course_type.value})
.then(() => {
loading.value = true
setFormData()
})
.catch(() => {
loading.value = false
})
}
import {xsyjConfig, getXsyjConfig} from '@/app/api/sys'
import {reactive, ref} from 'vue'
import {ElMessage} from 'element-plus'
import {useRoute} from 'vue-router'
import Template from "@/addon/shop/views/delivery/template.vue";
const route = useRoute()
const pageName = route.meta.title
const loading = ref(true)
const stages = ref([])
const activeNames = ref(null)
const form = ref({
qt_firstVisit: '',
qt_secondVisit: '',
qt_followUp: '',
qt_internalStaff: '',
});
const course_type = ref({});
function addStage() {
const newStage = {
name: '默认阶段',
price: 0,
rules: [
{
renewal_standard_min: '0',
renewal_standard_max: '',
renewal_commission: '',
new_count_min: '0',
new_count_max: '',
xf_count_min: '0',
xf_count_max: '',
new_move_5: '',
new_move_7: '',
},
],
}
stages.value.push(newStage)
activeNames.value = newStage.name
}
function removeStage(index) {
stages.value.splice(index, 1)
}
function addRule(stage) {
stage.rules.push({
renewal_standard_min: '0',
renewal_standard_max: '',
renewal_commission: '',
new_count_min: '0',
new_count_max: '',
xf_count_min: '0',
xf_count_max: '',
new_move_5: '',
new_move_7: '',
})
}
function removeRule(stage, ruleIndex) {
if (stage.rules.length === 1) {
ElMessage.warning('至少保留一条规则')
return
}
stage.rules.splice(ruleIndex, 1)
}
const setFormData = async () => {
const data = await (await getXsyjConfig()).data
stages.value = data.data
form.value = data.form
course_type.value = data.course_type
loading.value = false
}
setFormData()
const onSave = async () => {
xsyjConfig({'stages': stages.value, 'form': form.value, 'course_type': course_type.value})
.then(() => {
loading.value = true
setFormData()
})
.catch(() => {
loading.value = false
})
}
</script>
<style lang="scss" scoped>
.collapse-title {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
font-size: 14px;
font-weight: 500;
padding-right: 10px;
color: #333;
padding: 10px;
}
.title-name {
width: 230px;
}
.title-salary {
width: 110px;
text-align: center;
color: #7438d5;
}
.arrow {
margin-left: auto;
color: #999;
font-size: 14px;
}
.collapse-title {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
font-size: 14px;
font-weight: 500;
padding-right: 10px;
color: #333;
padding: 10px;
}
.title-name {
width: 230px;
}
.title-salary {
width: 110px;
text-align: center;
color: #7438d5;
}
.arrow {
margin-left: auto;
color: #999;
font-size: 14px;
}
</style>

25
niucloud/app/api/controller/apiController/ResourceSharing.php

@ -51,7 +51,32 @@ class ResourceSharing extends BaseApiService
$res= (new ResourceSharingService())->getList($where);
return success($res);
}
public function index1(Request $request)
{
$shared_by = $request->param('shared_by','');//共享人ID
$name = $request->param('name','');////客户资源表-姓名
$phone_number = $request->param('phone_number','');//客户资源表-手机号
$campus_name = $request->param('campus_name','');//客户资源表-校区
$shared_at_str = $request->param('shared_at_str','');//共享时间|[开始时间(Y-m-d),结束时间(Y-m-d)]
$shared_at_arr = [];
if(!empty($shared_at_str)){
$shared_at_arr = explode(' ~ ',$shared_at_str);
$shared_at_arr[0] = "{$shared_at_arr[0]} 00:00:00";
$shared_at_arr[1] = "{$shared_at_arr[1]} 23:59:59";
}
$where = [
'shared_by'=>$shared_by,
'shared_at_arr'=>$shared_at_arr,
'name'=>$name,
'phone_number'=>$phone_number,
'campus_name' => $campus_name
];
$res= (new ResourceSharingService())->getList1($where);
return success($res);
}
//资源共享-详情
public function info(Request $request)
{

1
niucloud/app/api/route/route.php

@ -242,6 +242,7 @@ Route::group(function () {
//资源共享-列表
Route::get('resourceSharing/index', 'apiController.ResourceSharing/index');
Route::get('resourceSharing/index1', 'apiController.ResourceSharing/index1');
//资源共享-详情(客户详情)
Route::get('resourceSharing/info', 'apiController.ResourceSharing/info');
//资源共享-分配员工

211
niucloud/app/service/api/apiService/ResourceSharingService.php

@ -41,10 +41,10 @@ class ResourceSharingService extends BaseApiService
$person_id = $this->member_id;//当前登录的员工id
$campus_where = [];
$campus_where[] = ['person_id','=',$person_id];
$campus_where[] = ['person_id', '=', $person_id];
if (!empty($where['campus_name'])) {
$campus_where[] = ['campus_name','like','%'.$where['campus_name'].'%'];
$campus_where[] = ['campus_name', 'like', '%' . $where['campus_name'] . '%'];
}
@ -91,15 +91,15 @@ class ResourceSharingService extends BaseApiService
$model = $model->whereOr('shared_by', $where['shared_by']);
}
//分页查询
$res = $model->with(['customerResource','sixSpeed'])
->withJoin(['customerResource','sixSpeed'])
$res = $model->with(['customerResource', 'sixSpeed'])
->withJoin(['customerResource', 'sixSpeed'])
->order('customerResource.updated_at', 'desc')
->paginate([
'list_rows' => $limit,
'page' => $page,
])->toArray();
->paginate([
'list_rows' => $limit,
'page' => $page,
])->toArray();
// 获取列表中的campus_ids
$campus_ids = array_unique(array_column(array_column($res['data'],'customerResource'), 'campus'));
$campus_ids = array_unique(array_column(array_column($res['data'], 'customerResource'), 'campus'));
$campus = new Campus();
$campus_name = $campus->whereIn('id', $campus_ids)->column('campus_name', 'id');
// 获取客户资源沟通记录
@ -116,10 +116,10 @@ class ResourceSharingService extends BaseApiService
$resultdata[$item['resource_id']] = $item['max_time'];
}
foreach ($res['data'] as &$item){
$item['customerResource']['source'] = get_dict_value('source',$item['customerResource']['source']);
$item['customerResource']['source_channel'] = get_dict_value('source',$item['customerResource']['source_channel']);
$item['customerResource']['campus_name'] = $campus_name[$item['customerResource']['campus']] ?? '';
foreach ($res['data'] as &$item) {
$item['customerResource']['source'] = get_dict_value('source', $item['customerResource']['source']);
$item['customerResource']['source_channel'] = get_dict_value('source', $item['customerResource']['source_channel']);
$item['customerResource']['campus_name'] = $campus_name[$item['customerResource']['campus']] ?? '';
$item['customerResource']['communication_time'] = $resultdata[$item['resource_id']] ?? '';
}
@ -219,4 +219,189 @@ class ResourceSharingService extends BaseApiService
return $res;
}
public function getList1($where)
{
$page_params = $this->getPageParam();//获取请求参数中的页码+分页数
$page = $page_params['page'];
$limit = $page_params['limit'];
$person_id = $this->member_id;//当前登录的员工id
// 查询当前用户在CampusPersonRole中的角色和校区
$campus_person_roles = CampusPersonRole::where('person_id', $person_id)->select()->toArray();
// 初始化查询条件
$model = $this->model;
// 判断用户角色和校区权限
$is_admin = false;
$is_campus_admin = false;
$campus_ids = [];
foreach ($campus_person_roles as $item) {
// 记录用户所属的校区ID
if ($item['campus_id'] > 0) {
$campus_ids[] = $item['campus_id'];
}
// 判断是否为管理员角色(1,4,7)
if (in_array($item['role_id'], [1, 4, 7])) {
// 如果没有校区,则为全局管理员
if ($item['campus_id'] == 0) {
$is_admin = true;
} else {
// 有校区的管理员
$is_campus_admin = true;
}
}
}
// 共享人查询 - 如果指定了shared_by,优先处理这个条件
if (isset($where['shared_by']) && $where['shared_by']) {
$model = $model->where(function ($query) use ($where) {
$query->where('user_id', $where['shared_by'])
->whereOr('shared_by', $where['shared_by']);
});
} else {
// 根据角色权限设置查询条件
if ($is_admin) {
// 全局管理员可以查看所有数据,不需要额外条件
} else if ($is_campus_admin && !empty($campus_ids)) {
// 校区管理员可以查看自己校区所有人的数据
// 先获取校区内所有人员ID
$campus_person_ids = CampusPersonRole::whereIn('campus_id', $campus_ids)
->distinct(true)
->column('person_id');
if (!empty($campus_person_ids)) {
$model = $model->where(function ($query) use ($campus_person_ids) {
$query->whereIn('user_id', $campus_person_ids)
->whereOr('shared_by', 'in', $campus_person_ids);
});
}
} else {
// 普通角色只能查看user_id是自己或shared_by是自己的数据
$model = $model->where(function ($query) use ($person_id) {
$query->where('user_id', $person_id)
->whereOr('shared_by', $person_id);
});
}
}
// 处理查询条件 - CustomerResources模型的字段
$resource_conditions = [];
// 校区名称查询
if (!empty($where['campus_name'])) {
// 先查询匹配的校区ID
$campus = new Campus();
$matched_campus_ids = $campus->where('campus_name', 'like', '%' . $where['campus_name'] . '%')->column('id');
if (!empty($matched_campus_ids)) {
$resource_conditions[] = ['campus', 'in', $matched_campus_ids];
} else {
// 没有匹配的校区,返回空结果
return [
'count' => 0,
'total' => 0,
'current_page' => $page,
'last_page' => 0,
'data' => []
];
}
}
// 资源名称查询
if (!empty($where['name'])) {
$resource_conditions[] = ['name', 'like', '%' . $where['name'] . '%'];
}
// 手机号查询
if (!empty($where['phone_number'])) {
$resource_conditions[] = ['phone_number', 'like', '%' . $where['phone_number'] . '%'];
}
// 查询符合条件的资源ID
$resource_ids = [];
if (!empty($resource_conditions)) {
$resource_ids = (new CustomerResources())->where($resource_conditions)->column('id');
if (empty($resource_ids)) {
// 没有匹配的资源,返回空结果
return [
'count' => 0,
'total' => 0,
'current_page' => $page,
'last_page' => 0,
'data' => []
];
}
$model = $model->whereIn('resource_id', $resource_ids);
}
// 共享时间查询
if (!empty($where['shared_at_arr'])) {
$model = $model->where('shared_at', '>=', $where['shared_at_arr'][0])
->where('shared_at', '<=', $where['shared_at_arr'][1]);
}
// 调试SQL语句
// $sql = $model->with(['customerResource', 'sixSpeed'])->fetchSql(true)->select();
// var_dump($sql);
// 查询数据
$list = $model->with(['customerResource', 'sixSpeed'])
->order('shared_at', 'desc')
->paginate([
'list_rows' => $limit,
'page' => $page,
])->toArray();
// 处理结果数据
if (!empty($list['data'])) {
// 获取校区信息
$campus_ids = [];
foreach ($list['data'] as $item) {
if (!empty($item['customerResource']) && !empty($item['customerResource']['campus'])) {
$campus_ids[] = $item['customerResource']['campus'];
}
}
$campus_ids = array_unique($campus_ids);
$campus_names = [];
if (!empty($campus_ids)) {
$campus = new Campus();
$campus_names = $campus->whereIn('id', $campus_ids)->column('campus_name', 'id');
}
// 获取资源ID列表
$resource_ids = array_column($list['data'], 'resource_id');
// 查询最近沟通记录
$communication_times = [];
if (!empty($resource_ids)) {
$resource_ids = array_map('intval', $resource_ids);
$subQuery = CommunicationRecords::whereIn('resource_id', $resource_ids)
->field('resource_id, max(communication_time) as max_time')
->group('resource_id')
->select()
->toArray();
foreach ($subQuery as $item) {
$communication_times[$item['resource_id']] = $item['max_time'];
}
}
// 处理每条数据
foreach ($list['data'] as &$item) {
if (!empty($item['customerResource'])) {
// 设置来源和渠道名称
$item['customerResource']['source'] = get_dict_value('source', $item['customerResource']['source']);
$item['customerResource']['source_channel'] = get_dict_value('source', $item['customerResource']['source_channel']);
$item['customerResource']['campus_name'] = $campus_name[$item['customerResource']['campus']] ?? '';
$item['customerResource']['communication_time'] = $resultdata[$item['resource_id']] ?? '';
}
}
}
return $list;
}
}

Loading…
Cancel
Save