This commit is contained in:
YunaiV 2023-10-29 10:38:48 +08:00
commit 690b208a4e
4 changed files with 140 additions and 138 deletions

View File

@ -3,19 +3,24 @@ import request from '@/config/axios'
export interface CustomerVO { export interface CustomerVO {
id: number id: number
name: string name: string
industryId: number
level: number
source: number
followUpStatus: boolean followUpStatus: boolean
lockStatus: boolean lockStatus: boolean
mobile: string mobile: string
telephone: string telephone: string
website: string website: string
qq: string
wechat: string
email: string
description: string
remark: string remark: string
ownerUserId: number ownerUserId: number
roUserIds: string roUserIds: string
rwUserIds: string rwUserIds: string
areaId: number areaId: number
detailAddress: string detailAddress: string
longitude: string
latitude: string
contactLastTime: Date contactLastTime: Date
contactNextTime: Date contactNextTime: Date
} }

View File

@ -188,5 +188,8 @@ export enum DICT_TYPE {
// ========== CRM - 客户管理模块 ========== // ========== CRM - 客户管理模块 ==========
CRM_RECEIVABLE_CHECK_STATUS = 'crm_receivable_check_status', CRM_RECEIVABLE_CHECK_STATUS = 'crm_receivable_check_status',
CRM_RETURN_TYPE = 'crm_return_type' CRM_RETURN_TYPE = 'crm_return_type',
CRM_CUSTOMER_INDUSTRY = 'crm_customer_industry',
CRM_CUSTOMER_LEVEL = 'crm_customer_level',
CRM_CUSTOMER_SOURCE = 'crm_customer_source'
} }

View File

@ -8,80 +8,92 @@
label-width="100px" label-width="100px"
v-loading="formLoading" v-loading="formLoading"
> >
<el-form-item label="客户名称" prop="name"> <el-row>
<el-input v-model="formData.name" placeholder="请输入客户名称" /> <el-form-item label="客户名称" prop="name">
</el-form-item> <el-input v-model="formData.name" placeholder="请输入客户名称" />
<el-form-item label="跟进状态" prop="followUpStatus"> </el-form-item>
<el-radio-group v-model="formData.followUpStatus"> <el-form-item label="所属行业" prop="industryId">
<el-radio <el-select v-model="formData.industryId" placeholder="请选择所属行业">
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)" <el-option
:key="dict.value" v-for="dict in getStrDictOptions(DICT_TYPE.CRM_CUSTOMER_INDUSTRY)"
:label="dict.value" :key="dict.value"
> :label="dict.label"
{{ dict.label }} :value="dict.value"
</el-radio> />
</el-radio-group> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="锁定状态" prop="lockStatus"> </el-row>
<el-radio-group v-model="formData.lockStatus"> <el-row>
<el-radio <el-form-item label="客户来源" prop="source">
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)" <el-select v-model="formData.source" placeholder="请选择客户来源">
:key="dict.value" <el-option
:label="dict.value" v-for="dict in getStrDictOptions(DICT_TYPE.CRM_CUSTOMER_SOURCE)"
> :key="dict.value"
{{ dict.label }} :label="dict.label"
</el-radio> :value="dict.value"
</el-radio-group> />
</el-form-item> </el-select>
<el-form-item label="手机" prop="mobile"> </el-form-item>
<el-input v-model="formData.mobile" placeholder="请输入手机" /> <el-form-item label="客户等级" prop="level">
</el-form-item> <el-select v-model="formData.level" placeholder="请选择客户等级">
<el-form-item label="电话" prop="telephone"> <el-option
<el-input v-model="formData.telephone" placeholder="请输入电话" /> v-for="dict in getStrDictOptions(DICT_TYPE.CRM_CUSTOMER_LEVEL)"
</el-form-item> :key="dict.value"
<el-form-item label="网址" prop="website"> :label="dict.label"
<el-input v-model="formData.website" placeholder="请输入网址" /> :value="dict.value"
/>
</el-select>
</el-form-item>
</el-row>
<el-row>
<el-form-item label="手机" prop="mobile">
<el-input v-model="formData.mobile" placeholder="请输入手机" />
</el-form-item>
<el-form-item label="电话" prop="telephone">
<el-input v-model="formData.telephone" placeholder="请输入电话" />
</el-form-item>
</el-row>
<el-row>
<el-form-item label="邮箱" prop="email">
<el-input v-model="formData.email" placeholder="请输入邮箱" />
</el-form-item>
<el-form-item label="QQ" prop="qq">
<el-input v-model="formData.qq" placeholder="请输入QQ" />
</el-form-item>
</el-row>
<el-row>
<el-form-item label="微信" prop="wechat">
<el-input v-model="formData.wechat" placeholder="请输入微信" />
</el-form-item>
<el-form-item label="网址" prop="website">
<el-input v-model="formData.website" placeholder="请输入网址" />
</el-form-item>
</el-row>
<el-row>
<el-form-item label="地区编号" prop="areaId">
<el-input v-model="formData.areaId" placeholder="请输入地区编号" />
</el-form-item>
<el-form-item label="详细地址" prop="detailAddress">
<el-input v-model="formData.detailAddress" placeholder="请输入详细地址" />
</el-form-item>
</el-row>
<!-- TODO @Wanwan 少一个负责人字段默认先选中自己 -->
<el-row>
<el-form-item label="下次联系时间" prop="contactNextTime">
<el-date-picker
v-model="formData.contactNextTime"
type="date"
value-format="x"
placeholder="选择下次联系时间"
/>
</el-form-item>
</el-row>
<el-form-item label="客户描述" prop="description">
<el-input v-model="formData.description" placeholder="请输入客户描述" />
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" /> <el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item> </el-form-item>
<el-form-item label="负责人的用户编号" prop="ownerUserId">
<el-input v-model="formData.ownerUserId" placeholder="请输入负责人的用户编号" />
</el-form-item>
<el-form-item label="只读权限的用户编号数组" prop="roUserIds">
<el-input v-model="formData.roUserIds" placeholder="请输入只读权限的用户编号数组" />
</el-form-item>
<el-form-item label="读写权限的用户编号数组" prop="rwUserIds">
<el-input v-model="formData.rwUserIds" placeholder="请输入读写权限的用户编号数组" />
</el-form-item>
<el-form-item label="地区编号" prop="areaId">
<el-input v-model="formData.areaId" placeholder="请输入地区编号" />
</el-form-item>
<el-form-item label="详细地址" prop="detailAddress">
<el-input v-model="formData.detailAddress" placeholder="请输入详细地址" />
</el-form-item>
<el-form-item label="地理位置经度" prop="longitude">
<el-input v-model="formData.longitude" placeholder="请输入地理位置经度" />
</el-form-item>
<el-form-item label="地理位置维度" prop="latitude">
<el-input v-model="formData.latitude" placeholder="请输入地理位置维度" />
</el-form-item>
<el-form-item label="最后跟进时间" prop="contactLastTime">
<el-date-picker
v-model="formData.contactLastTime"
type="date"
value-format="x"
placeholder="选择最后跟进时间"
/>
</el-form-item>
<el-form-item label="下次联系时间" prop="contactNextTime">
<el-date-picker
v-model="formData.contactNextTime"
type="date"
value-format="x"
placeholder="选择下次联系时间"
/>
</el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button> <el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
@ -90,7 +102,7 @@
</Dialog> </Dialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { DICT_TYPE, getBoolDictOptions } from '@/utils/dict' import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
import * as CustomerApi from '@/api/crm/customer' import * as CustomerApi from '@/api/crm/customer'
const { t } = useI18n() // const { t } = useI18n() //
@ -103,26 +115,23 @@ const formType = ref('') // 表单的类型create - 新增update - 修改
const formData = ref({ const formData = ref({
id: undefined, id: undefined,
name: undefined, name: undefined,
followUpStatus: undefined,
lockStatus: undefined,
mobile: undefined, mobile: undefined,
industryId: undefined,
level: undefined,
source: undefined,
telephone: undefined, telephone: undefined,
website: undefined, website: undefined,
qq: undefined,
wechat: undefined,
email: undefined,
description: undefined,
remark: undefined, remark: undefined,
ownerUserId: undefined,
roUserIds: undefined,
rwUserIds: undefined,
areaId: undefined, areaId: undefined,
detailAddress: undefined, detailAddress: undefined,
longitude: undefined,
latitude: undefined,
contactLastTime: undefined,
contactNextTime: undefined contactNextTime: undefined
}) })
const formRules = reactive({ const formRules = reactive({
name: [{ require: true, message: '跟进状态不能为空', trigger: 'blur' }], name: [{ require: true, message: '客户名称不能为空', trigger: 'blur' }]
followUpStatus: [{ required: true, message: '跟进状态不能为空', trigger: 'blur' }],
lockStatus: [{ required: true, message: '锁定状态不能为空', trigger: 'blur' }]
}) })
const formRef = ref() // Ref const formRef = ref() // Ref
@ -175,20 +184,19 @@ const resetForm = () => {
formData.value = { formData.value = {
id: undefined, id: undefined,
name: undefined, name: undefined,
followUpStatus: undefined,
lockStatus: undefined,
mobile: undefined, mobile: undefined,
industryId: undefined,
level: undefined,
source: undefined,
telephone: undefined, telephone: undefined,
website: undefined, website: undefined,
qq: undefined,
wechat: undefined,
email: undefined,
description: undefined,
remark: undefined, remark: undefined,
ownerUserId: undefined,
roUserIds: undefined,
rwUserIds: undefined,
areaId: undefined, areaId: undefined,
detailAddress: undefined, detailAddress: undefined,
longitude: undefined,
latitude: undefined,
contactLastTime: undefined,
contactNextTime: undefined contactNextTime: undefined
} }
formRef.value?.resetFields() formRef.value?.resetFields()

View File

@ -27,24 +27,6 @@
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="电话" prop="telephone">
<el-input
v-model="queryParams.telephone"
placeholder="请输入电话"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="网址" prop="website">
<el-input
v-model="queryParams.website"
placeholder="请输入网址"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item> <el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button> <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
@ -69,38 +51,38 @@
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="编号" align="center" prop="id" /> <el-table-column label="编号" align="center" prop="id" />
<el-table-column label="客户名称" align="center" prop="name" /> <el-table-column label="客户名称" align="center" prop="name" width="160" />
<el-table-column label="跟进状态" align="center" prop="followUpStatus"> <el-table-column label="所属行业" align="center" prop="industryId" width="120">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.followUpStatus" /> <dict-tag :type="DICT_TYPE.CRM_CUSTOMER_INDUSTRY" :value="scope.row.industryId" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="锁定状态" align="center" prop="lockStatus"> <el-table-column label="客户来源" align="center" prop="source" width="100">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.lockStatus" /> <dict-tag :type="DICT_TYPE.CRM_CUSTOMER_SOURCE" :value="scope.row.source" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="客户等级" align="center" prop="level" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_LEVEL" :value="scope.row.level" />
</template>
</el-table-column>
<el-table-column label="手机" align="center" prop="mobile" width="120" />
<el-table-column label="详细地址" align="center" prop="detailAddress" width="200" />
<!-- TODO @Wanwan 负责人回显所属部门创建人 -->
<el-table-column label="负责人" align="center" prop="ownerUserId" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="成交状态" align="center" prop="dealStatus"> <el-table-column label="成交状态" align="center" prop="dealStatus">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.dealStatus" /> <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.dealStatus" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="手机" align="center" prop="mobile" />
<el-table-column label="电话" align="center" prop="telephone" />
<el-table-column label="网址" align="center" prop="website" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="负责人的用户编号" align="center" prop="ownerUserId" />
<el-table-column label="地区编号" align="center" prop="areaId" />
<el-table-column label="详细地址" align="center" prop="detailAddress" />
<el-table-column label="地理位置经度" align="center" prop="longitude" />
<el-table-column label="地理位置维度" align="center" prop="latitude" />
<el-table-column
label="最后跟进时间"
align="center"
prop="contactLastTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column <el-table-column
label="下次联系时间" label="下次联系时间"
align="center" align="center"
@ -109,13 +91,19 @@
width="180px" width="180px"
/> />
<el-table-column <el-table-column
label="创建时间" label="最后跟进时间"
align="center" align="center"
prop="createTime" prop="contactLastTime"
:formatter="dateFormatter" :formatter="dateFormatter"
width="180px" width="180px"
/> />
<el-table-column label="操作" align="center"> <el-table-column label="锁定状态" align="center" prop="lockStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.lockStatus" />
</template>
</el-table-column>
<!-- TODO @Wanwan 距进入公海天数 -->
<el-table-column label="操作" align="center" width="160">
<template #default="scope"> <template #default="scope">
<el-button <el-button
link link
@ -168,9 +156,7 @@ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
name: null, name: null,
mobile: null, mobile: null
telephone: null,
website: null
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
const exportLoading = ref(false) // const exportLoading = ref(false) //