Parcourir la source

Merge branch 'crm-msg' of https://gitee.com/dhb52/yudao-ui-admin-vue3 into dev

# Conflicts:
#	src/views/crm/backlog/tables/TodayCustomer.vue
YunaiV il y a 1 an
Parent
commit
64cfcbf6e0

+ 18 - 0
src/api/crm/backlog/index.ts

@@ -0,0 +1,18 @@
+import request from '@/config/axios'
+
+import { type CustomerVO } from '../customer'
+import { type ClueVO } from '../clue'
+
+
+// 查询客户列表
+// TODO @芋艿:看看是不是后续融合到 getCustomerPage 里;
+export const getTodayCustomerPage = async (params) => {
+  return await request.get({ url: `/crm/backlog/today-customer-page`, params })
+}
+
+// 查询线索列表
+export const getFollowLeadsPage = async (params) => {
+  return await request.get({ url: `/crm/backlog/page`, params })
+}
+
+export  { type CustomerVO, type ClueVO }

+ 0 - 40
src/api/crm/message/index.ts

@@ -1,40 +0,0 @@
-import request from '@/config/axios'
-
-export interface CustomerVO {
-  id?: number
-  name: string
-  industryId: number
-  level: number
-  source: number
-  followUpStatus?: boolean
-  lockStatus?: boolean
-  dealStatus?: boolean
-  mobile: string
-  telephone: string
-  website: string
-  qq: string
-  wechat: string
-  email: string
-  description: string
-  remark: string
-  ownerUserId?: number
-  ownerUserName?: string
-  ownerUserDept?: string
-  roUserIds?: string
-  rwUserIds?: string
-  areaId?: number
-  areaName?: string
-  detailAddress: string
-  contactLastTime?: Date
-  contactNextTime: Date
-  createTime?: Date
-  updateTime?: Date
-  creator?: string
-  creatorName?: string
-}
-
-// 查询客户列表
-// TODO @芋艿:看看是不是后续融合到 getCustomerPage 里;
-export const getTodayCustomerPage = async (params) => {
-  return await request.get({ url: `/crm/message/todayCustomer`, params })
-}

+ 3 - 3
src/router/modules/remaining.ts

@@ -530,15 +530,15 @@ const remainingRouter: AppRouteRecordRaw[] = [
         component: () => import('@/views/crm/product/detail/index.vue')
       },
       {
-        path: 'message',
-        name: 'CrmMessage',
+        path: 'backlog',
+        name: 'CrmBacklog',
         meta: {
           title: '待办事项',
           noCache: true,
           hidden: true
         },
         // TODO @db52:后面搞,搞成菜单
-        component: () => import('@/views/crm/message/index.vue')
+        component: () => import('@/views/crm/backlog/index.vue')
       }
     ]
   }

+ 15 - 3
src/views/crm/message/index.vue → src/views/crm/backlog/index.vue

@@ -17,13 +17,25 @@
     <el-col :span="20" :xs="24">
       <TodayCustomer v-if="leftType === 'todayCustomer'" />
       <FollowLeads v-if="leftType === 'followLeads'" />
+      <CheckContract v-if="leftType === 'checkContract'" />
+      <CheckReceivables v-if="leftType === 'checkReceivables'" />
+      <EndContract v-if="leftType === 'endContract'" />
+      <FollowCustomer v-if="leftType === 'followCustomer'" />
+      <PutInPoolRemind v-if="leftType === 'putInPoolRemind'" />
+      <RemindReceivables v-if="leftType === 'remindReceivables'" />
     </el-col>
   </el-row>
 </template>
-<!-- @dbh52:模块改成 backlog 会更合适,待办事项 -->
+
 <script lang="ts" setup>
-import TodayCustomer from './tables/TodayCustomer.vue'
+import CheckContract from './tables/CheckContract.vue'
+import CheckReceivables from './tables/CheckReceivables.vue'
+import EndContract from './tables/EndContract.vue'
+import FollowCustomer from './tables/FollowCustomer.vue'
 import FollowLeads from './tables/FollowLeads.vue'
+import PutInPoolRemind from './tables/PutInPoolRemind.vue'
+import RemindReceivables from './tables/RemindReceivables.vue'
+import TodayCustomer from './tables/TodayCustomer.vue'
 
 const leftType = ref('todayCustomer')
 const leftSides = ref([
@@ -66,7 +78,7 @@ const leftSides = ref([
   },
   {
     name: '待回款提醒',
-    infoType: 'remindReceivablesPlan',
+    infoType: 'remindReceivables',
     msgCount: 4,
     tips: ''
   },

+ 15 - 0
src/views/crm/backlog/tables/CheckContract.vue

@@ -0,0 +1,15 @@
+<!-- 待审核合同 -->
+<!-- TODO: 后续再统一改名字 -->
+<template>
+  <div>
+    TODO: 待审核合同
+  </div>
+</template>
+
+<script setup lang="ts" name="CheckContract">
+
+</script>
+
+<style scoped>
+
+</style>

+ 15 - 0
src/views/crm/backlog/tables/CheckReceivables.vue

@@ -0,0 +1,15 @@
+<!-- 待审核回款 -->
+<!-- TODO: 后续再统一改名字 -->
+<template>
+  <div>
+    TODO: 待审核回款
+  </div>
+</template>
+
+<script setup lang="ts" name="CheckReceivables">
+
+</script>
+
+<style scoped>
+
+</style>

+ 15 - 0
src/views/crm/backlog/tables/EndContract.vue

@@ -0,0 +1,15 @@
+<!-- 分配给我的客户 -->
+<!-- TODO: 即将到期的合同 -->
+<template>
+  <div>
+    TODO: 即将到期的合同
+  </div>
+</template>
+
+<script setup lang="ts" name="EndContract">
+
+</script>
+
+<style scoped>
+
+</style>

+ 160 - 0
src/views/crm/backlog/tables/FollowCustomer.vue

@@ -0,0 +1,160 @@
+<!-- 分配给我的客户 -->
+<!-- WHERE followUpStatus = ? -->
+<template>
+  <ContentWrap>
+    <div class="pb-5 text-xl">分配给我的客户</div>
+    <!-- 搜索工作栏 -->
+    <el-form
+      ref="queryFormRef"
+      :inline="true"
+      :model="queryParams"
+      class="-mb-15px"
+      label-width="68px"
+    >
+      <el-form-item label="状态" prop="followUpStatus">
+        <el-select
+          v-model="queryParams.followUpStatus"
+          class="!w-240px"
+          placeholder="状态"
+          @change="handleQuery"
+        >
+          <el-option
+            v-for="(option, index) in FOLLOWUP_STATUS"
+            :label="option.label"
+            :value="option.value"
+            :key="index"
+          />
+        </el-select>
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+  <!-- 列表 -->
+  <ContentWrap>
+    <el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
+      <el-table-column align="center" label="编号" prop="id" />
+      <el-table-column align="center" label="客户名称" prop="name" width="160">
+        <template #default="scope">
+          <el-link :underline="false" type="primary" @click="openDetail(scope.row.id)">
+            {{ scope.row.name }}
+          </el-link>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" label="手机" prop="mobile" width="120" />
+      <el-table-column align="center" label="电话" prop="telephone" width="120" />
+      <el-table-column align="center" label="客户来源" prop="source" width="100">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.CRM_CUSTOMER_SOURCE" :value="scope.row.source" />
+        </template>
+      </el-table-column>
+      <el-table-column align="center" label="所属行业" prop="industryId" width="120">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.CRM_CUSTOMER_INDUSTRY" :value="scope.row.industryId" />
+        </template>
+      </el-table-column>
+      <el-table-column align="center" label="客户等级" 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 align="center" label="网址" prop="website" width="200" />
+      <el-table-column
+        :formatter="dateFormatter"
+        align="center"
+        label="下次联系时间"
+        prop="contactNextTime"
+        width="180px"
+      />
+      <el-table-column align="center" label="备注" prop="remark" width="200" />
+      <el-table-column align="center" label="成交状态" prop="dealStatus">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.dealStatus" />
+        </template>
+      </el-table-column>
+      <el-table-column align="center" label="距离进入公海" prop="poolDay">
+        <template #default="scope"> {{ scope.row.poolDay }} 天</template>
+      </el-table-column>
+      <el-table-column
+        :formatter="dateFormatter"
+        align="center"
+        label="最后跟进时间"
+        prop="contactLastTime"
+        width="180px"
+      />
+      <el-table-column
+        :formatter="dateFormatter"
+        align="center"
+        label="创建时间"
+        prop="updateTime"
+        width="180px"
+      />
+      <el-table-column
+        :formatter="dateFormatter"
+        align="center"
+        label="创建时间"
+        prop="createTime"
+        width="180px"
+      />
+      <el-table-column align="center" label="负责人" prop="ownerUserName" width="100px" />
+      <el-table-column align="center" label="所属部门" prop="ownerUserDeptName" width="100px" />
+      <el-table-column align="center" label="创建人" prop="creatorName" width="100px" />
+    </el-table>
+    <!-- 分页 -->
+    <Pagination
+      v-model:limit="queryParams.pageSize"
+      v-model:page="queryParams.pageNo"
+      :total="total"
+      @pagination="getList"
+    />
+  </ContentWrap>
+</template>
+
+<script setup lang="ts" name="FollowCustomer">
+import * as CustomerApi from '@/api/crm/customer'
+import { DICT_TYPE } from '@/utils/dict'
+import { dateFormatter } from '@/utils/formatTime'
+import { FOLLOWUP_STATUS } from './common'
+
+
+const { push } = useRouter()
+
+const loading = ref(true) // 列表的加载中
+const total = ref(0) // 列表的总页数
+const list = ref([]) // 列表的数据
+const queryParams = ref({
+  pageNo: 1,
+  pageSize: 10,
+  followUpStatus: false,
+  sceneType: 1
+})
+const queryFormRef = ref() // 搜索的表单
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await CustomerApi.getCustomerPage(queryParams.value)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNo = 1
+  getList()
+}
+
+/** 打开客户详情 */
+const openDetail = (id: number) => {
+  push({ name: 'CrmCustomerDetail', params: { id } })
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+</script>
+
+<style scoped></style>

+ 125 - 0
src/views/crm/backlog/tables/FollowLeads.vue

@@ -0,0 +1,125 @@
+<!-- TODO: dhb52 待Clue页面更新后同步更新 -->
+<!-- WHERE transformStatus = 0 AND followUpStatus = ? -->
+<template>
+  <ContentWrap>
+    <div class="pb-5 text-xl">分配给我的线索</div>
+    <!-- 搜索工作栏 -->
+    <el-form
+      ref="queryFormRef"
+      :inline="true"
+      :model="queryParams"
+      class="-mb-15px"
+      label-width="68px"
+    >
+      <el-form-item label="状态" prop="followUpStatus">
+        <el-select
+          v-model="queryParams.followUpStatus"
+          class="!w-240px"
+          placeholder="状态"
+          @change="handleQuery"
+        >
+          <el-option
+            v-for="(option, index) in FOLLOWUP_STATUS"
+            :label="option.label"
+            :value="option.value"
+            :key="index"
+          />
+        </el-select>
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+  <!-- 列表 -->
+  <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="transformStatus">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.transformStatus" />
+        </template>
+      </el-table-column>
+      <el-table-column label="跟进状态" align="center" prop="followUpStatus">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.followUpStatus" />
+        </template>
+      </el-table-column>
+      <el-table-column label="线索名称" align="center" prop="name" />
+      <el-table-column label="客户id" align="center" prop="customerId" />
+      <el-table-column
+        label="下次联系时间"
+        align="center"
+        prop="contactNextTime"
+        :formatter="dateFormatter"
+        width="180px"
+      />
+      <el-table-column label="电话" align="center" prop="telephone" />
+      <el-table-column label="手机号" align="center" prop="mobile" />
+      <el-table-column label="地址" align="center" prop="address" />
+      <el-table-column label="负责人" align="center" prop="ownerUserId" />
+      <el-table-column
+        label="最后跟进时间"
+        align="center"
+        prop="contactLastTime"
+        :formatter="dateFormatter"
+        width="180px"
+      />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column
+        label="创建时间"
+        align="center"
+        prop="createTime"
+        :formatter="dateFormatter"
+        width="180px"
+      />
+    </el-table>
+    <!-- 分页 -->
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+</template>
+
+<script setup lang="ts" name="FollowLeads">
+import * as ClueApi from '@/api/crm/clue'
+import { DICT_TYPE } from '@/utils/dict'
+import { dateFormatter } from '@/utils/formatTime'
+import { FOLLOWUP_STATUS } from './common'
+
+const loading = ref(true) // 列表的加载中
+const total = ref(0) // 列表的总页数
+const list = ref([]) // 列表的数据
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  followUpStatus: false,
+  transformStatus: false // 固定为【未转移】
+})
+const queryFormRef = ref() // 搜索的表单
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await ClueApi.getCluePage(queryParams)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+</script>
+
+<style scoped></style>

+ 15 - 0
src/views/crm/backlog/tables/PutInPoolRemind.vue

@@ -0,0 +1,15 @@
+<!-- 待进入公海的客户 -->
+<!-- TODO: 后续再统一改名字 -->
+<template>
+  <div>
+    TODO: 待进入公海的客户
+  </div>
+</template>
+
+<script setup lang="ts" name="PutInPoolRemind">
+
+</script>
+
+<style scoped>
+
+</style>

+ 15 - 0
src/views/crm/backlog/tables/RemindReceivables.vue

@@ -0,0 +1,15 @@
+<!-- 待回款提醒 -->
+<!-- TODO: 后续再统一改名字 -->
+<template>
+  <div>
+    TODO: 待回款提醒
+  </div>
+</template>
+
+<script setup lang="ts" name="RemindReceivables">
+
+</script>
+
+<style scoped>
+
+</style>

+ 22 - 57
src/views/crm/message/tables/TodayCustomer.vue → src/views/crm/backlog/tables/TodayCustomer.vue

@@ -1,8 +1,6 @@
 <template>
   <ContentWrap>
-    <div class="pb-5 text-xl">
-      {{ title }}
-    </div>
+    <div class="pb-5 text-xl"> 今日需联系客户 </div>
     <!-- 搜索工作栏 -->
     <el-form
       ref="queryFormRef"
@@ -12,35 +10,35 @@
       label-width="68px"
     >
       <el-form-item label="状态" prop="contactStatus">
-        <el-select v-model="queryParams.contactStatus" class="!w-240px" placeholder="状态">
+        <el-select
+          v-model="queryParams.contactStatus"
+          class="!w-240px"
+          placeholder="状态"
+          @change="handleQuery"
+        >
           <el-option
             v-for="(option, index) in CONTACT_STATUS"
-            :key="index"
             :label="option.label"
             :value="option.value"
+            :key="index"
           />
         </el-select>
       </el-form-item>
       <el-form-item label="归属" prop="sceneType">
-        <el-select v-model="queryParams.sceneType" class="!w-240px" placeholder="归属">
+        <el-select
+          v-model="queryParams.sceneType"
+          class="!w-240px"
+          placeholder="归属"
+          @change="handleQuery"
+        >
           <el-option
             v-for="(option, index) in SCENE_TYPES"
-            :key="index"
             :label="option.label"
             :value="option.value"
+            :key="index"
           />
         </el-select>
       </el-form-item>
-      <el-form-item>
-        <el-button @click="handleQuery">
-          <Icon class="mr-5px" icon="ep:search" />
-          搜索
-        </el-button>
-        <el-button @click="resetQuery(undefined)">
-          <Icon class="mr-5px" icon="ep:refresh" />
-          重置
-        </el-button>
-      </el-form-item>
     </el-form>
   </ContentWrap>
   <ContentWrap>
@@ -120,22 +118,18 @@
   </ContentWrap>
 </template>
 
-<script lang="ts" name="TodayCustomer" setup>
+<script lang="ts" setup name="TodayCustomer">
+import * as BacklogApi from '@/api/crm/backlog'
 import { DICT_TYPE } from '@/utils/dict'
 import { dateFormatter } from '@/utils/formatTime'
-import * as MessageApi from '@/api/crm/message'
+import { CONTACT_STATUS, SCENE_TYPES } from './common'
+
+const { push } = useRouter()
 
-const title = ref('今日需联系客户') // TODO @dbh52:这个不用枚举一个变量哈;
 const loading = ref(true) // 列表的加载中
 const total = ref(0) // 列表的总页数
 const list = ref([]) // 列表的数据
-const queryParams = ref<{
-  // TODO @dbh52:这个 ref 类型定义可以去掉哈。之前定义的原因,是因为 idea 报错了;默认 idea 可以推导出类型
-  pageNo: number
-  pageSize: number
-  contactStatus: number | undefined
-  sceneType: number | undefined
-}>({
+const queryParams = ref({
   pageNo: 1,
   pageSize: 10,
   contactStatus: 1,
@@ -143,25 +137,11 @@ const queryParams = ref<{
 })
 const queryFormRef = ref() // 搜索的表单
 
-const CONTACT_STATUS = [
-  { label: '今日需联系', value: 1 },
-  { label: '已逾期', value: 2 },
-  { label: '已联系', value: 3 }
-]
-
-const SCENE_TYPES = [
-  // TODO 芋艿:貌似可以搞成全局枚举
-  { label: '我负责的', value: 1 },
-  { label: '我跟进的', value: 2 },
-  { label: '我参与的', value: 3 },
-  { label: '下属负责的', value: 4 }
-]
-
 /** 查询列表 */
 const getList = async () => {
   loading.value = true
   try {
-    const data = await MessageApi.getTodayCustomerPage(queryParams.value)
+    const data = await BacklogApi.getTodayCustomerPage(queryParams.value)
     list.value = data.list
     total.value = data.total
   } finally {
@@ -175,22 +155,7 @@ const handleQuery = () => {
   getList()
 }
 
-/** 重置按钮操作 */
-const resetQuery = (func: Function | undefined = undefined) => {
-  queryFormRef.value.resetFields()
-  queryParams.value = {
-    pageNo: 1,
-    pageSize: 10,
-    contactStatus: 1,
-    sceneType: 1
-  }
-  // TODO @dbh52:这里的 func 是不是可以去掉哈;
-  func && func()
-  handleQuery()
-}
-
 /** 打开客户详情 */
-const { push } = useRouter()
 const openDetail = (id: number) => {
   push({ name: 'CrmCustomerDetail', params: { id } })
 }

+ 19 - 0
src/views/crm/backlog/tables/common.ts

@@ -0,0 +1,19 @@
+/** 跟进状态 */
+export const FOLLOWUP_STATUS = [
+  { label: '已跟进', value: true },
+  { label: '待跟进', value: false }
+]
+
+/** 归属范围 */
+export const SCENE_TYPES = [
+  { label: '我负责的', value: 1 },
+  { label: '我参与的', value: 2 },
+  { label: '下属负责的', value: 3 }
+]
+
+/** 联系状态 */
+export const CONTACT_STATUS = [
+  { label: '今日需联系', value: 1 },
+  { label: '已逾期', value: 2 },
+  { label: '已联系', value: 3 }
+]

+ 0 - 14
src/views/crm/message/tables/FollowLeads.vue

@@ -1,14 +0,0 @@
-<!-- 分配给我的线索 -->
-<template>
-  <div>
-    TODO: 分配给我的线索
-  </div>
-</template>
-
-<script setup lang="ts" name="FollowLeads">
-
-</script>
-
-<style scoped>
-
-</style>