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 {
id: number
name: string
industryId: number
level: number
source: number
followUpStatus: boolean
lockStatus: boolean
mobile: string
telephone: string
website: string
qq: string
wechat: string
email: string
description: string
remark: string
ownerUserId: number
roUserIds: string
rwUserIds: string
areaId: number
detailAddress: string
longitude: string
latitude: string
contactLastTime: Date
contactNextTime: Date
}

View File

@ -188,5 +188,8 @@ export enum DICT_TYPE {
// ========== CRM - 客户管理模块 ==========
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"
v-loading="formLoading"
>
<el-form-item label="客户名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入客户名称" />
</el-form-item>
<el-form-item label="跟进状态" prop="followUpStatus">
<el-radio-group v-model="formData.followUpStatus">
<el-radio
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="锁定状态" prop="lockStatus">
<el-radio-group v-model="formData.lockStatus">
<el-radio
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<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-form-item label="网址" prop="website">
<el-input v-model="formData.website" placeholder="请输入网址" />
<el-row>
<el-form-item label="客户名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入客户名称" />
</el-form-item>
<el-form-item label="所属行业" prop="industryId">
<el-select v-model="formData.industryId" placeholder="请选择所属行业">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.CRM_CUSTOMER_INDUSTRY)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-row>
<el-row>
<el-form-item label="客户来源" prop="source">
<el-select v-model="formData.source" placeholder="请选择客户来源">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.CRM_CUSTOMER_SOURCE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="客户等级" prop="level">
<el-select v-model="formData.level" placeholder="请选择客户等级">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.CRM_CUSTOMER_LEVEL)"
:key="dict.value"
:label="dict.label"
: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 label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</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>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
@ -90,7 +102,7 @@
</Dialog>
</template>
<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'
const { t } = useI18n() //
@ -103,26 +115,23 @@ const formType = ref('') // 表单的类型create - 新增update - 修改
const formData = ref({
id: undefined,
name: undefined,
followUpStatus: undefined,
lockStatus: undefined,
mobile: undefined,
industryId: undefined,
level: undefined,
source: undefined,
telephone: undefined,
website: undefined,
qq: undefined,
wechat: undefined,
email: undefined,
description: undefined,
remark: undefined,
ownerUserId: undefined,
roUserIds: undefined,
rwUserIds: undefined,
areaId: undefined,
detailAddress: undefined,
longitude: undefined,
latitude: undefined,
contactLastTime: undefined,
contactNextTime: undefined
})
const formRules = reactive({
name: [{ require: true, message: '跟进状态不能为空', trigger: 'blur' }],
followUpStatus: [{ required: true, message: '跟进状态不能为空', trigger: 'blur' }],
lockStatus: [{ required: true, message: '锁定状态不能为空', trigger: 'blur' }]
name: [{ require: true, message: '客户名称不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
@ -175,20 +184,19 @@ const resetForm = () => {
formData.value = {
id: undefined,
name: undefined,
followUpStatus: undefined,
lockStatus: undefined,
mobile: undefined,
industryId: undefined,
level: undefined,
source: undefined,
telephone: undefined,
website: undefined,
qq: undefined,
wechat: undefined,
email: undefined,
description: undefined,
remark: undefined,
ownerUserId: undefined,
roUserIds: undefined,
rwUserIds: undefined,
areaId: undefined,
detailAddress: undefined,
longitude: undefined,
latitude: undefined,
contactLastTime: undefined,
contactNextTime: undefined
}
formRef.value?.resetFields()

View File

@ -27,24 +27,6 @@
class="!w-240px"
/>
</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-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>
@ -69,38 +51,38 @@
<ContentWrap>
<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="name" />
<el-table-column label="跟进状态" align="center" prop="followUpStatus">
<el-table-column label="客户名称" align="center" prop="name" width="160" />
<el-table-column label="所属行业" align="center" prop="industryId" width="120">
<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>
</el-table-column>
<el-table-column label="锁定状态" align="center" prop="lockStatus">
<el-table-column label="客户来源" align="center" prop="source" width="100">
<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>
</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">
<template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.dealStatus" />
</template>
</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
label="下次联系时间"
align="center"
@ -109,13 +91,19 @@
width="180px"
/>
<el-table-column
label="创建时间"
label="最后跟进时间"
align="center"
prop="createTime"
prop="contactLastTime"
:formatter="dateFormatter"
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">
<el-button
link
@ -168,9 +156,7 @@ const queryParams = reactive({
pageNo: 1,
pageSize: 10,
name: null,
mobile: null,
telephone: null,
website: null
mobile: null
})
const queryFormRef = ref() //
const exportLoading = ref(false) //