diff --git a/src/api/crm/customer/index.ts b/src/api/crm/customer/index.ts index 16ccb355..0cbba590 100644 --- a/src/api/crm/customer/index.ts +++ b/src/api/crm/customer/index.ts @@ -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 } diff --git a/src/utils/dict.ts b/src/utils/dict.ts index 489d8e4b..85e08e67 100644 --- a/src/utils/dict.ts +++ b/src/utils/dict.ts @@ -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' } diff --git a/src/views/crm/customer/CustomerForm.vue b/src/views/crm/customer/CustomerForm.vue index 52ff923a..80db76ab 100644 --- a/src/views/crm/customer/CustomerForm.vue +++ b/src/views/crm/customer/CustomerForm.vue @@ -7,80 +7,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> @@ -89,7 +101,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() // 国际化 @@ -102,26 +114,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 @@ -174,20 +183,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() diff --git a/src/views/crm/customer/index.vue b/src/views/crm/customer/index.vue index 15a0d144..7db9654d 100644 --- a/src/views/crm/customer/index.vue +++ b/src/views/crm/customer/index.vue @@ -26,24 +26,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> @@ -67,38 +49,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" @@ -107,13 +89,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 @@ -166,9 +154,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) // 导出的加载中