Browse Source

Merge branch 'master' of ssh://gitlab.frkj.cc:222/php/zhjwxt

yuhongzhe
王泽彦 11 months ago
parent
commit
e5f07a2b1b
  1. 4
      .gitignore
  2. 6
      admin/src/app/api/customer_resources.ts
  3. 21
      admin/src/app/lang/zh-cn/customer_resources.customer_resources.json
  4. 178
      admin/src/app/views/customer_resources/components/customer-resources-edit.vue
  5. 134
      admin/src/app/views/customer_resources/customer_resources.vue
  6. 31
      niucloud/app/adminapi/controller/customer_resources/CustomerResources.php
  7. 3
      niucloud/app/adminapi/route/customer_resources.php
  8. 192
      niucloud/app/model/customer_resources/CustomerResources.php
  9. 6
      niucloud/app/service/admin/customer_resources/CustomerResourcesService.php
  10. 20
      niucloud/app/validate/customer_resources/CustomerResources.php
  11. 3
      niucloud/public/index.php

4
.gitignore

@ -5,3 +5,7 @@
*.log
*.txt
/.idea
/niucloud/runtime
/niucloud/vendor
/niucloud/config
config

6
admin/src/app/api/customer_resources.ts

@ -1,5 +1,11 @@
import request from '@/utils/request'
// USER_CODE_BEGIN -- customer_resources
/**
*

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

@ -1,22 +1,15 @@
{
"id":"编号",
"idPlaceholder":"请输入编号",
"createYearMonth":"创建年月",
"createYearMonthPlaceholder":"请输入创建年月",
"createDate":"创建日期",
"createDatePlaceholder":"请输入创建日期",
"sourceChannel":"来源渠道",
"sourceChannelPlaceholder":"请输入来源渠道",
"source":"来源",
"sourcePlaceholder":"请输入来源",
"sourceChannel":"来源渠道",
"sourceChannelPlaceholder":"请输入来源渠道",
"consultant":"顾问",
"consultantPlaceholder":"请输入顾问",
"name":"姓名",
"namePlaceholder":"请输入姓名",
"age":"年龄",
"agePlaceholder":"请输入年龄",
"gender":"性别: male-男性, female-女性, other-其他",
"genderPlaceholder":"请输入性别: male-男性, female-女性, other-其他",
"gender":"性别",
"genderPlaceholder":"请输入性别",
"phoneNumber":"联系电话",
"phoneNumberPlaceholder":"请输入联系电话",
"demand":"需求",
@ -31,10 +24,12 @@
"distancePlaceholder":"请输入距离",
"decisionMaker":"决策人",
"decisionMakerPlaceholder":"请输入决策人",
"initialIntent":"客户初步意向度: high-高, medium-中, low-低",
"initialIntentPlaceholder":"请输入客户初步意向度: high-高, medium-中, low-低",
"initialIntent":"客户初步意向度",
"initialIntentPlaceholder":"请输入客户初步意向度",
"campus":"所属校区",
"campusPlaceholder":"请输入所属校区",
"status":"客户状态",
"statusPlaceholder":"请输入客户状态",
"addCustomerResources":"添加客户资源",
"updateCustomerResources":"编辑客户资源",
"customerResourcesDeleteTips":"确定要删除该数据吗?",

178
admin/src/app/views/customer_resources/components/customer-resources-edit.vue

@ -1,24 +1,28 @@
<template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateCustomerResources') : t('addCustomerResources')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true">
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
<el-form-item :label="t('createYearMonth')" prop="create_year_month">
<el-input v-model="formData.create_year_month" clearable :placeholder="t('createYearMonthPlaceholder')" class="input-width" />
</el-form-item>
<el-form-item :label="t('createDate')" prop="create_date">
<el-input v-model="formData.create_date" clearable :placeholder="t('createDatePlaceholder')" class="input-width" />
</el-form-item>
<el-form-item :label="t('sourceChannel')" prop="source_channel">
<el-input v-model="formData.source_channel" clearable :placeholder="t('sourceChannelPlaceholder')" class="input-width" />
</el-form-item>
<el-form-item :label="t('source')" prop="source">
<el-input v-model="formData.source" clearable :placeholder="t('sourcePlaceholder')" class="input-width" />
<el-select class="input-width" v-model="formData.source" clearable :placeholder="t('sourcePlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in sourceList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('consultant')" prop="consultant">
<el-input v-model="formData.consultant" clearable :placeholder="t('consultantPlaceholder')" class="input-width" />
<el-form-item :label="t('sourceChannel')" >
<el-select class="input-width" v-model="formData.source_channel" clearable :placeholder="t('sourceChannelPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in source_channelList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('name')" prop="name">
@ -26,11 +30,19 @@
</el-form-item>
<el-form-item :label="t('age')" prop="age">
<el-input v-model="formData.age" clearable :placeholder="t('agePlaceholder')" class="input-width" />
<el-input-number v-model="formData.age" clearable :placeholder="t('agePlaceholder')" class="input-width" :min = "3" max = "80" />
</el-form-item>
<el-form-item :label="t('gender')" prop="gender">
<el-input v-model="formData.gender" clearable :placeholder="t('genderPlaceholder')" class="input-width" />
<el-select class="input-width" v-model="formData.gender" clearable :placeholder="t('genderPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in genderList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('phoneNumber')" prop="phone_number">
@ -38,21 +50,42 @@
</el-form-item>
<el-form-item :label="t('demand')" prop="demand">
<el-input v-model="formData.demand" clearable :placeholder="t('demandPlaceholder')" class="input-width" />
<el-input v-model="formData.demand" type="textarea" rows="4" clearable :placeholder="t('demandPlaceholder')" class="input-width"/>
</el-form-item>
<el-form-item :label="t('purchasingPower')" prop="purchasing_power">
<el-input v-model="formData.purchasing_power" clearable :placeholder="t('purchasingPowerPlaceholder')" class="input-width" />
<el-select class="input-width" v-model="formData.purchasing_power" clearable :placeholder="t('purchasingPowerPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in purchasing_powerList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('cognitiveIdea')" prop="cognitive_idea">
<el-input v-model="formData.cognitive_idea" clearable :placeholder="t('cognitiveIdeaPlaceholder')" class="input-width" />
<el-select class="input-width" v-model="formData.cognitive_idea" clearable :placeholder="t('cognitiveIdeaPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in cognitive_ideaList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('optionalClassTime')" prop="optional_class_time">
<el-input v-model="formData.optional_class_time" clearable :placeholder="t('optionalClassTimePlaceholder')" class="input-width" />
<el-form-item :label="t('optionalClassTime')" prop="optional_class_time" class="input-width">
<el-date-picker
class="flex-1 !flex"
v-model="formData.optional_class_time"
clearable
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="t('optionalClassTimePlaceholder')">
</el-date-picker>
</el-form-item>
<el-form-item :label="t('distance')" prop="distance">
<el-input v-model="formData.distance" clearable :placeholder="t('distancePlaceholder')" class="input-width" />
</el-form-item>
@ -62,13 +95,33 @@
</el-form-item>
<el-form-item :label="t('initialIntent')" prop="initial_intent">
<el-input v-model="formData.initial_intent" clearable :placeholder="t('initialIntentPlaceholder')" class="input-width" />
<el-select class="input-width" v-model="formData.initial_intent" clearable :placeholder="t('initialIntentPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in initial_intentList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('campus')" prop="campus">
<el-input v-model="formData.campus" clearable :placeholder="t('campusPlaceholder')" class="input-width" />
</el-form-item>
<el-form-item :label="t('status')" prop="status">
<el-select class="input-width" v-model="formData.status" clearable :placeholder="t('statusPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in statusList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-form>
<template #footer>
@ -97,11 +150,8 @@ const loading = ref(false)
*/
const initialFormData = {
id: '',
create_year_month: '',
create_date: '',
source_channel: '',
source: '',
consultant: '',
source_channel: '',
name: '',
age: '',
gender: '',
@ -114,6 +164,7 @@ const initialFormData = {
decision_maker: '',
initial_intent: '',
campus: '',
status: '',
}
const formData: Record<string, any> = reactive({ ...initialFormData })
@ -122,28 +173,13 @@ const formRef = ref<FormInstance>()
//
const formRules = computed(() => {
return {
create_year_month: [
{ required: true, message: t('createYearMonthPlaceholder'), trigger: 'blur' },
]
,
create_date: [
{ required: true, message: t('createDatePlaceholder'), trigger: 'blur' },
]
,
source_channel: [
{ required: true, message: t('sourceChannelPlaceholder'), trigger: 'blur' },
]
,
source: [
{ required: true, message: t('sourcePlaceholder'), trigger: 'blur' },
]
,
consultant: [
{ required: true, message: t('consultantPlaceholder'), trigger: 'blur' },
source_channel: [
{ required: true, message: t('sourceChannelPlaceholder'), trigger: 'blur' },
]
,
@ -154,7 +190,7 @@ const formRules = computed(() => {
,
age: [
{ required: true, message: t('agePlaceholder'), trigger: 'blur' },
{ validator: (rule: any, value: string, callback: any) => { if (value && !/^\d{3,80}$/.test(value)) { callback(new Error(t('generateBetween')))} else { callback() }}},
]
,
gender: [
@ -205,6 +241,11 @@ const formRules = computed(() => {
campus: [
{ required: true, message: t('campusPlaceholder'), trigger: 'blur' },
]
,
status: [
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' },
]
,
}
@ -238,7 +279,48 @@ const confirm = async (formEl: FormInstance | undefined) => {
}
//
let sourceList = ref([])
const sourceDictList = async () => {
sourceList.value = await (await useDictionary('source')).data.dictionary
}
sourceDictList();
watch(() => sourceList.value, () => { formData.source = sourceList.value[0].value })
let source_channelList = ref([])
const source_channelDictList = async () => {
source_channelList.value = await (await useDictionary('SourceChannel')).data.dictionary
}
source_channelDictList();
watch(() => source_channelList.value, () => { formData.source_channel = source_channelList.value[0].value })
let genderList = ref([])
const genderDictList = async () => {
genderList.value = await (await useDictionary('zy_sex')).data.dictionary
}
genderDictList();
watch(() => genderList.value, () => { formData.gender = genderList.value[0].value })
let purchasing_powerList = ref([])
const purchasing_powerDictList = async () => {
purchasing_powerList.value = await (await useDictionary('customer_purchasing_power')).data.dictionary
}
purchasing_powerDictList();
watch(() => purchasing_powerList.value, () => { formData.purchasing_power = purchasing_powerList.value[0].value })
let cognitive_ideaList = ref([])
const cognitive_ideaDictList = async () => {
cognitive_ideaList.value = await (await useDictionary('cognitive_concept')).data.dictionary
}
cognitive_ideaDictList();
watch(() => cognitive_ideaList.value, () => { formData.cognitive_idea = cognitive_ideaList.value[0].value })
let initial_intentList = ref([])
const initial_intentDictList = async () => {
initial_intentList.value = await (await useDictionary('preliminarycustomerintention')).data.dictionary
}
initial_intentDictList();
watch(() => initial_intentList.value, () => { formData.initial_intent = initial_intentList.value[0].value })
let statusList = ref([])
const statusDictList = async () => {
statusList.value = await (await useDictionary('kh_status')).data.dictionary
}
statusDictList();
watch(() => statusList.value, () => { formData.status = statusList.value[0].value })
const setFormData = async (row: any = null) => {

134
admin/src/app/views/customer_resources/customer_resources.vue

@ -11,57 +11,12 @@
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="customerResourcesTable.searchParam" ref="searchFormRef">
<el-form-item :label="t('createYearMonth')" prop="create_year_month">
<el-input v-model="customerResourcesTable.searchParam.create_year_month" :placeholder="t('createYearMonthPlaceholder')" />
</el-form-item>
<el-form-item :label="t('createDate')" prop="create_date">
<el-input v-model="customerResourcesTable.searchParam.create_date" :placeholder="t('createDatePlaceholder')" />
</el-form-item>
<el-form-item :label="t('sourceChannel')" prop="source_channel">
<el-input v-model="customerResourcesTable.searchParam.source_channel" :placeholder="t('sourceChannelPlaceholder')" />
</el-form-item>
<el-form-item :label="t('source')" prop="source">
<el-input v-model="customerResourcesTable.searchParam.source" :placeholder="t('sourcePlaceholder')" />
</el-form-item>
<el-form-item :label="t('consultant')" prop="consultant">
<el-input v-model="customerResourcesTable.searchParam.consultant" :placeholder="t('consultantPlaceholder')" />
</el-form-item>
<el-form-item :label="t('name')" prop="name">
<el-input v-model="customerResourcesTable.searchParam.name" :placeholder="t('namePlaceholder')" />
</el-form-item>
<el-form-item :label="t('age')" prop="age">
<el-input v-model="customerResourcesTable.searchParam.age" :placeholder="t('agePlaceholder')" />
</el-form-item>
<el-form-item :label="t('gender')" prop="gender">
<el-input v-model="customerResourcesTable.searchParam.gender" :placeholder="t('genderPlaceholder')" />
</el-form-item>
<el-form-item :label="t('phoneNumber')" prop="phone_number">
<el-input v-model="customerResourcesTable.searchParam.phone_number" :placeholder="t('phoneNumberPlaceholder')" />
</el-form-item>
<el-form-item :label="t('demand')" prop="demand">
<el-input v-model="customerResourcesTable.searchParam.demand" :placeholder="t('demandPlaceholder')" />
</el-form-item>
<el-form-item :label="t('purchasingPower')" prop="purchasing_power">
<el-input v-model="customerResourcesTable.searchParam.purchasing_power" :placeholder="t('purchasingPowerPlaceholder')" />
</el-form-item>
<el-form-item :label="t('cognitiveIdea')" prop="cognitive_idea">
<el-input v-model="customerResourcesTable.searchParam.cognitive_idea" :placeholder="t('cognitiveIdeaPlaceholder')" />
</el-form-item>
<el-form-item :label="t('optionalClassTime')" prop="optional_class_time">
<el-input v-model="customerResourcesTable.searchParam.optional_class_time" :placeholder="t('optionalClassTimePlaceholder')" />
</el-form-item>
<el-form-item :label="t('distance')" prop="distance">
<el-input v-model="customerResourcesTable.searchParam.distance" :placeholder="t('distancePlaceholder')" />
</el-form-item>
<el-form-item :label="t('decisionMaker')" prop="decision_maker">
<el-input v-model="customerResourcesTable.searchParam.decision_maker" :placeholder="t('decisionMakerPlaceholder')" />
</el-form-item>
<el-form-item :label="t('initialIntent')" prop="initial_intent">
<el-input v-model="customerResourcesTable.searchParam.initial_intent" :placeholder="t('initialIntentPlaceholder')" />
</el-form-item>
<el-form-item :label="t('campus')" prop="campus">
<el-input v-model="customerResourcesTable.searchParam.campus" :placeholder="t('campusPlaceholder')" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadCustomerResourcesList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
@ -74,13 +29,13 @@
<template #empty>
<span>{{ !customerResourcesTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="create_year_month" :label="t('createYearMonth')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="create_date" :label="t('createDate')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="source_channel" :label="t('sourceChannel')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="source" :label="t('source')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column :label="t('source')" min-width="180" align="center" :show-overflow-tooltip="true">
<template #default="{ row }">
<div v-for="(item, index) in sourceList">
<div v-if="item.value == row.source">{{ item.name }}</div>
</div>
</template>
</el-table-column>
<el-table-column prop="consultant" :label="t('consultant')" min-width="120" :show-overflow-tooltip="true"/>
@ -88,26 +43,18 @@
<el-table-column prop="age" :label="t('age')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="gender" :label="t('gender')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column :label="t('gender')" min-width="180" align="center" :show-overflow-tooltip="true">
<template #default="{ row }">
<div v-for="(item, index) in genderList">
<div v-if="item.value == row.gender">{{ item.name }}</div>
</div>
</template>
</el-table-column>
<el-table-column prop="phone_number" :label="t('phoneNumber')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="demand" :label="t('demand')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="purchasing_power" :label="t('purchasingPower')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="cognitive_idea" :label="t('cognitiveIdea')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="optional_class_time" :label="t('optionalClassTime')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="distance" :label="t('distance')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="decision_maker" :label="t('decisionMaker')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="initial_intent" :label="t('initialIntent')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="campus" :label="t('campus')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
@ -147,23 +94,8 @@ let customerResourcesTable = reactive({
loading: true,
data: [],
searchParam:{
"create_year_month":"",
"create_date":"",
"source_channel":"",
"source":"",
"consultant":"",
"name":"",
"age":"",
"gender":"",
"phone_number":"",
"demand":"",
"purchasing_power":"",
"cognitive_idea":"",
"optional_class_time":"",
"distance":"",
"decision_maker":"",
"initial_intent":"",
"campus":""
"phone_number":""
}
})
@ -173,7 +105,41 @@ const searchFormRef = ref<FormInstance>()
const selectData = ref<any[]>([])
//
const sourceList = ref([] as any[])
const sourceDictList = async () => {
sourceList.value = await (await useDictionary('source')).data.dictionary
}
sourceDictList();
const source_channelList = ref([] as any[])
const source_channelDictList = async () => {
source_channelList.value = await (await useDictionary('SourceChannel')).data.dictionary
}
source_channelDictList();
const genderList = ref([] as any[])
const genderDictList = async () => {
genderList.value = await (await useDictionary('zy_sex')).data.dictionary
}
genderDictList();
const purchasing_powerList = ref([] as any[])
const purchasing_powerDictList = async () => {
purchasing_powerList.value = await (await useDictionary('customer_purchasing_power')).data.dictionary
}
purchasing_powerDictList();
const cognitive_ideaList = ref([] as any[])
const cognitive_ideaDictList = async () => {
cognitive_ideaList.value = await (await useDictionary('cognitive_concept')).data.dictionary
}
cognitive_ideaDictList();
const initial_intentList = ref([] as any[])
const initial_intentDictList = async () => {
initial_intentList.value = await (await useDictionary('preliminarycustomerintention')).data.dictionary
}
initial_intentDictList();
const statusList = ref([] as any[])
const statusDictList = async () => {
statusList.value = await (await useDictionary('kh_status')).data.dictionary
}
statusDictList();
/**
* 获取客户资源列表

31
niucloud/app/adminapi/controller/customer_resources/CustomerResources.php

@ -28,23 +28,8 @@ class CustomerResources extends BaseAdminController
*/
public function lists(){
$data = $this->request->params([
["create_year_month",""],
["create_date",""],
["source_channel",""],
["source",""],
["consultant",""],
["name",""],
["age",""],
["gender",""],
["phone_number",""],
["demand",""],
["purchasing_power",""],
["cognitive_idea",""],
["optional_class_time",""],
["distance",""],
["decision_maker",""],
["initial_intent",""],
["campus",""]
["phone_number",""]
]);
return success((new CustomerResourcesService())->getPage($data));
}
@ -64,11 +49,8 @@ class CustomerResources extends BaseAdminController
*/
public function add(){
$data = $this->request->params([
["create_year_month",""],
["create_date","2025-05-16 17:34:54"],
["source_channel",""],
["source",""],
["consultant",""],
["source_channel",""],
["name",""],
["age",0],
["gender",""],
@ -81,7 +63,7 @@ class CustomerResources extends BaseAdminController
["decision_maker",""],
["initial_intent",""],
["campus",""],
["status",""]
]);
$this->validate($data, 'app\validate\customer_resources\CustomerResources.add');
$id = (new CustomerResourcesService())->add($data);
@ -95,11 +77,8 @@ class CustomerResources extends BaseAdminController
*/
public function edit(int $id){
$data = $this->request->params([
["create_year_month",""],
["create_date","2025-05-16 17:34:54"],
["source_channel",""],
["source",""],
["consultant",""],
["source_channel",""],
["name",""],
["age",0],
["gender",""],
@ -112,7 +91,7 @@ class CustomerResources extends BaseAdminController
["decision_maker",""],
["initial_intent",""],
["campus",""],
["status",""]
]);
$this->validate($data, 'app\validate\customer_resources\CustomerResources.edit');
(new CustomerResourcesService())->edit($id, $data);

3
niucloud/app/adminapi/route/customer_resources.php

@ -14,6 +14,9 @@ use think\facade\Route;
use app\adminapi\middleware\AdminCheckRole;
use app\adminapi\middleware\AdminCheckToken;
use app\adminapi\middleware\AdminLog;
// USER_CODE_BEGIN -- customer_resources
Route::group('customer_resources', function () {

192
niucloud/app/model/customer_resources/CustomerResources.php

@ -50,78 +50,6 @@ class CustomerResources extends BaseModel
*/
protected $defaultSoftDelete = 0;
/**
* 搜索器:客户资源编号
* @param $value
* @param $data
*/
public function searchIdAttr($query, $value, $data)
{
if ($value) {
$query->where("id", $value);
}
}
/**
* 搜索器:客户资源创建年月
* @param $value
* @param $data
*/
public function searchCreateYearMonthAttr($query, $value, $data)
{
if ($value) {
$query->where("create_year_month", $value);
}
}
/**
* 搜索器:客户资源创建日期
* @param $value
* @param $data
*/
public function searchCreateDateAttr($query, $value, $data)
{
if ($value) {
$query->where("create_date", $value);
}
}
/**
* 搜索器:客户资源来源渠道
* @param $value
* @param $data
*/
public function searchSourceChannelAttr($query, $value, $data)
{
if ($value) {
$query->where("source_channel", $value);
}
}
/**
* 搜索器:客户资源来源
* @param $value
* @param $data
*/
public function searchSourceAttr($query, $value, $data)
{
if ($value) {
$query->where("source", $value);
}
}
/**
* 搜索器:客户资源顾问
* @param $value
* @param $data
*/
public function searchConsultantAttr($query, $value, $data)
{
if ($value) {
$query->where("consultant", $value);
}
}
/**
* 搜索器:客户资源姓名
* @param $value
@ -134,30 +62,6 @@ class CustomerResources extends BaseModel
}
}
/**
* 搜索器:客户资源年龄
* @param $value
* @param $data
*/
public function searchAgeAttr($query, $value, $data)
{
if ($value) {
$query->where("age", $value);
}
}
/**
* 搜索器:客户资源性别: male-男性, female-女性, other-其他
* @param $value
* @param $data
*/
public function searchGenderAttr($query, $value, $data)
{
if ($value) {
$query->where("gender", $value);
}
}
/**
* 搜索器:客户资源联系电话
* @param $value
@ -170,102 +74,6 @@ class CustomerResources extends BaseModel
}
}
/**
* 搜索器:客户资源需求
* @param $value
* @param $data
*/
public function searchDemandAttr($query, $value, $data)
{
if ($value) {
$query->where("demand", $value);
}
}
/**
* 搜索器:客户资源购买力
* @param $value
* @param $data
*/
public function searchPurchasingPowerAttr($query, $value, $data)
{
if ($value) {
$query->where("purchasing_power", $value);
}
}
/**
* 搜索器:客户资源认知理念
* @param $value
* @param $data
*/
public function searchCognitiveIdeaAttr($query, $value, $data)
{
if ($value) {
$query->where("cognitive_idea", $value);
}
}
/**
* 搜索器:客户资源可选上课时间
* @param $value
* @param $data
*/
public function searchOptionalClassTimeAttr($query, $value, $data)
{
if ($value) {
$query->where("optional_class_time", $value);
}
}
/**
* 搜索器:客户资源距离
* @param $value
* @param $data
*/
public function searchDistanceAttr($query, $value, $data)
{
if ($value) {
$query->where("distance", $value);
}
}
/**
* 搜索器:客户资源决策人
* @param $value
* @param $data
*/
public function searchDecisionMakerAttr($query, $value, $data)
{
if ($value) {
$query->where("decision_maker", $value);
}
}
/**
* 搜索器:客户资源客户初步意向度: high-高, medium-中, low-低
* @param $value
* @param $data
*/
public function searchInitialIntentAttr($query, $value, $data)
{
if ($value) {
$query->where("initial_intent", $value);
}
}
/**
* 搜索器:客户资源所属校区
* @param $value
* @param $data
*/
public function searchCampusAttr($query, $value, $data)
{
if ($value) {
$query->where("campus", $value);
}
}

6
niucloud/app/service/admin/customer_resources/CustomerResourcesService.php

@ -36,10 +36,10 @@ class CustomerResourcesService extends BaseAdminService
*/
public function getPage(array $where = [])
{
$field = 'id,create_year_month,create_date,source_channel,source,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';
$field = 'id,create_year_month,create_date,source,source_channel,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';
$order = 'id desc';
$search_model = $this->model->withSearch(["id","create_year_month","create_date","source_channel","source","consultant","name","age","gender","phone_number","demand","purchasing_power","cognitive_idea","optional_class_time","distance","decision_maker","initial_intent","campus"], $where)->field($field)->order($order);
$search_model = $this->model->withSearch(["name","phone_number"], $where)->field($field)->order($order);
$list = $this->pageQuery($search_model);
return $list;
}
@ -51,7 +51,7 @@ class CustomerResourcesService extends BaseAdminService
*/
public function getInfo(int $id)
{
$field = 'id,create_year_month,create_date,source_channel,source,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';
$field = 'id,create_year_month,create_date,source,source_channel,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]])->findOrEmpty()->toArray();
return $info;

20
niucloud/app/validate/customer_resources/CustomerResources.php

@ -20,15 +20,11 @@ class CustomerResources extends BaseValidate
{
protected $rule = [
'create_year_month' => 'require',
'create_date' => 'require',
'source_channel' => 'require',
'source' => 'require',
'consultant' => 'require',
'name' => 'require',
'age' => 'require',
'age' => 'require|between:3,80',
'gender' => 'require',
'phone_number' => 'require',
'phone_number' => 'require|mobile',
'demand' => 'require',
'purchasing_power' => 'require',
'cognitive_idea' => 'require',
@ -37,18 +33,17 @@ class CustomerResources extends BaseValidate
'decision_maker' => 'require',
'initial_intent' => 'require',
'campus' => 'require',
'status' => 'require',
];
protected $message = [
'create_year_month.require' => ['common_validate.require', ['create_year_month']],
'create_date.require' => ['common_validate.require', ['create_date']],
'source_channel.require' => ['common_validate.require', ['source_channel']],
'source.require' => ['common_validate.require', ['source']],
'consultant.require' => ['common_validate.require', ['consultant']],
'name.require' => ['common_validate.require', ['name']],
'age.require' => ['common_validate.require', ['age']],
'age.between' => ['common_validate.between', ['age','3','80']],
'gender.require' => ['common_validate.require', ['gender']],
'phone_number.require' => ['common_validate.require', ['phone_number']],
'phone_number.mobile' => ['common_validate.mobile', ['phone_number']],
'demand.require' => ['common_validate.require', ['demand']],
'purchasing_power.require' => ['common_validate.require', ['purchasing_power']],
'cognitive_idea.require' => ['common_validate.require', ['cognitive_idea']],
@ -57,11 +52,12 @@ class CustomerResources extends BaseValidate
'decision_maker.require' => ['common_validate.require', ['decision_maker']],
'initial_intent.require' => ['common_validate.require', ['initial_intent']],
'campus.require' => ['common_validate.require', ['campus']],
'status.require' => ['common_validate.require', ['status']],
];
protected $scene = [
"add" => ['create_year_month', 'create_date', 'source_channel', 'source', 'consultant', 'name', 'age', 'gender', 'phone_number', 'demand', 'purchasing_power', 'cognitive_idea', 'optional_class_time', 'distance', 'decision_maker', 'initial_intent', 'campus'],
"edit" => ['create_year_month', 'create_date', 'source_channel', 'source', 'consultant', 'name', 'age', 'gender', 'phone_number', 'demand', 'purchasing_power', 'cognitive_idea', 'optional_class_time', 'distance', 'decision_maker', 'initial_intent', 'campus']
"add" => ['source', 'source_channel', 'name', 'age', 'gender', 'phone_number', 'demand', 'purchasing_power', 'cognitive_idea', 'optional_class_time', 'distance', 'decision_maker', 'initial_intent', 'campus', 'status'],
"edit" => ['source', 'source_channel', 'name', 'age', 'gender', 'phone_number', 'demand', 'purchasing_power', 'cognitive_idea', 'optional_class_time', 'distance', 'decision_maker', 'initial_intent', 'campus', 'status']
];
}

3
niucloud/public/index.php

@ -11,6 +11,8 @@
// [ 应用入口文件 ]
namespace think;
if (PHP_VERSION_ID < 80000)
die('require PHP > 8.0.0 !');
require __DIR__ . '/../vendor/autoload.php';
@ -20,6 +22,7 @@ if (!file_exists(__DIR__ .'/../install.lock')) {
}
// 执行HTTP应用并响应
$http = (new App())->http;

Loading…
Cancel
Save