Ver Fonte

✨ CRM:完善商机状态的实现

YunaiV há 1 ano atrás
pai
commit
6baeadc87a

+ 37 - 0
src/api/crm/business/status/index.ts

@@ -0,0 +1,37 @@
+import request from '@/config/axios'
+
+export interface BusinessStatusTypeVO {
+  id: number
+  name: string
+  deptIds: number[]
+  statuses?: {
+    id: number
+    name: string
+    percent: number
+  }
+}
+
+// 查询商机状态组列表
+export const getBusinessStatusPage = async (params: any) => {
+  return await request.get({ url: `/crm/business-status/page`, params })
+}
+
+// 新增商机状态组
+export const createBusinessStatus = async (data: BusinessStatusTypeVO) => {
+  return await request.post({ url: `/crm/business-status/create`, data })
+}
+
+// 修改商机状态组
+export const updateBusinessStatus = async (data: BusinessStatusTypeVO) => {
+  return await request.put({ url: `/crm/business-status/update`, data })
+}
+
+// 查询商机状态类型详情
+export const getBusinessStatus = async (id: number) => {
+  return await request.get({ url: `/crm/business-status/get?id=` + id })
+}
+
+// 获得商机状态组列表
+export const getBusinessStatusTypeSimpleList = async () => {
+  return await request.get({ url: `/crm/business-status/type-simple-list` })
+}

+ 0 - 48
src/api/crm/businessStatusType/index.ts

@@ -1,48 +0,0 @@
-import request from '@/config/axios'
-
-export interface BusinessStatusTypeVO {
-  id: number
-  name: string
-  deptIds: number[]
-  status: boolean
-}
-
-// 查询商机状态类型列表
-export const getBusinessStatusTypePage = async (params) => {
-  return await request.get({ url: `/crm/business-status-type/page`, params })
-}
-
-// 查询商机状态类型详情
-export const getBusinessStatusType = async (id: number) => {
-  return await request.get({ url: `/crm/business-status-type/get?id=` + id })
-}
-
-// 新增商机状态类型
-export const createBusinessStatusType = async (data: BusinessStatusTypeVO) => {
-  return await request.post({ url: `/crm/business-status-type/create`, data })
-}
-
-// 修改商机状态类型
-export const updateBusinessStatusType = async (data: BusinessStatusTypeVO) => {
-  return await request.put({ url: `/crm/business-status-type/update`, data })
-}
-
-// 删除商机状态类型
-export const deleteBusinessStatusType = async (id: number) => {
-  return await request.delete({ url: `/crm/business-status-type/delete?id=` + id })
-}
-
-// 导出商机状态类型 Excel
-export const exportBusinessStatusType = async (params) => {
-  return await request.download({ url: `/crm/business-status-type/export-excel`, params })
-}
-
-// 获取商机状态类型信息列表
-export const getBusinessStatusTypeList = async () => {
-  return await request.get({ url: `/crm/business-status-type/get-simple-list` })
-}
-
-// 根据类型ID获取商机状态信息列表
-export const getBusinessStatusListByTypeId = async (typeId: number) => {
-  return await request.get({ url: `/crm/business-status-type/get-status-list?typeId=` + typeId })
-}

+ 2 - 2
src/views/crm/business/BusinessForm.vue

@@ -131,7 +131,7 @@
 </template>
 <script setup lang="ts">
 import * as BusinessApi from '@/api/crm/business'
-import * as BusinessStatusTypeApi from '@/api/crm/businessStatusType'
+import * as BusinessStatusApi from '@/api/crm/business/status'
 import * as CustomerApi from '@/api/crm/customer'
 import * as UserApi from '@/api/system/user'
 import { useUserStore } from '@/store/modules/user'
@@ -212,7 +212,7 @@ const open = async (type: string, id?: number) => {
   }
   customerList.value = await CustomerApi.getCustomerSimpleList()
   // 加载商机状态类型列表
-  statusTypeList.value = await BusinessStatusTypeApi.getBusinessStatusTypeList()
+  statusTypeList.value = await BusinessStatusApi.getBusinessStatusTypeSimpleList()
   // 获得用户列表
   userOptions.value = await UserApi.getSimpleUserList()
   // 默认新建时选中自己

+ 35 - 24
src/views/crm/businessStatusType/BusinessStatusTypeForm.vue → src/views/crm/business/status/BusinessStatusForm.vue

@@ -7,10 +7,13 @@
       label-width="100px"
       v-loading="formLoading"
     >
-      <el-form-item label="状态类型名" prop="name">
-        <el-input v-model="formData.name" placeholder="请输入状态类型名" />
+      <el-form-item label="状态名" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入状态名" />
       </el-form-item>
       <el-form-item label="应用部门" prop="deptIds">
+        <template #label>
+          <Tooltip message="不选择部门时,默认全公司生效" title="应用部门" />
+        </template>
         <el-tree
           ref="treeRef"
           :data="deptList"
@@ -21,31 +24,39 @@
           show-checkbox
         />
       </el-form-item>
-      <el-form-item label="状态设置" prop="statusList">
-        <el-table border style="width: 100%" :data="formData.statusList">
-          <el-table-column align="center" label="状态" width="120" prop="star">
+      <el-form-item label="阶段设置" prop="statuses">
+        <el-table border style="width: 100%" :data="formData.statuses">
+          <el-table-column align="center" label="阶段" width="70">
             <template #default="scope">
-              <el-text>状态{{ scope.$index + 1 }}</el-text>
+              <el-text>阶段 {{ scope.$index + 1 }}</el-text>
             </template>
           </el-table-column>
-          <el-table-column align="center" label="状态名称" width="120" prop="name">
+          <el-table-column align="center" label="阶段名称" width="160" prop="name">
             <template #default="{ row }">
               <el-input v-model="row.name" placeholder="请输入状态名称" />
             </template>
           </el-table-column>
-          <el-table-column width="120" align="center" label="赢单率" prop="percent">
+          <el-table-column width="140" align="center" label="赢单率" prop="percent">
             <template #default="{ row }">
-              <el-input v-model="row.percent" placeholder="请输入赢单率" />
+              <el-input-number
+                v-model="row.percent"
+                placeholder="请输入赢单率"
+                controls-position="right"
+                :min="0"
+                :max="100"
+                :precision="2"
+                class="!w-1/1"
+              />
             </template>
           </el-table-column>
-          <el-table-column label="操作" align="center">
+          <el-table-column label="操作" width="110" align="center">
             <template #default="scope">
               <el-button link type="primary" @click="addStatusArea(scope.$index)"> 添加 </el-button>
               <el-button
                 link
                 type="danger"
                 @click="deleteStatusArea(scope.$index)"
-                v-show="scope.$index > 0"
+                :disabled="formData.statuses.length <= 1"
               >
                 删除
               </el-button>
@@ -61,7 +72,7 @@
   </Dialog>
 </template>
 <script setup lang="ts">
-import * as BusinessStatusTypeApi from '@/api/crm/businessStatusType'
+import * as BusinessStatusApi from '@/api/crm/business/status'
 import { defaultProps, handleTree } from '@/utils/tree'
 import * as DeptApi from '@/api/system/dept'
 
@@ -71,15 +82,15 @@ const message = useMessage() // 消息弹窗
 const dialogVisible = ref(false) // 弹窗的是否展示
 const dialogTitle = ref('') // 弹窗的标题
 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
-const formType = ref('') // 表单的类型:create - 新增;update - 修改
+const formType = ref('') // 表单的:create - 新增;update - 修改
 const formData = ref({
   id: 0,
   name: '',
   deptIds: [],
-  statusList: []
+  statuses: []
 })
 const formRules = reactive({
-  name: [{ required: true, message: '状态类型名不能为空', trigger: 'blur' }]
+  name: [{ required: true, message: '状态名不能为空', trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 const deptList = ref<Tree[]>([]) // 树形结构
@@ -96,9 +107,9 @@ const open = async (type: string, id?: number) => {
   if (id) {
     formLoading.value = true
     try {
-      formData.value = await BusinessStatusTypeApi.getBusinessStatusType(id)
+      formData.value = await BusinessStatusApi.getBusinessStatus(id)
       treeRef.value.setCheckedKeys(formData.value.deptIds)
-      if (formData.value.statusList.length == 0) {
+      if (formData.value.statuses.length == 0) {
         addStatusArea(0)
       }
     } finally {
@@ -120,13 +131,13 @@ const submitForm = async () => {
   // 提交请求
   formLoading.value = true
   try {
-    const data = formData.value as unknown as BusinessStatusTypeApi.BusinessStatusTypeVO
+    const data = formData.value as unknown as BusinessStatusApi.BusinessStatusTypeVO
     data.deptIds = treeRef.value.getCheckedKeys(false)
     if (formType.value === 'create') {
-      await BusinessStatusTypeApi.createBusinessStatusType(data)
+      await BusinessStatusApi.createBusinessStatus(data)
       message.success(t('common.createSuccess'))
     } else {
-      await BusinessStatusTypeApi.updateBusinessStatusType(data)
+      await BusinessStatusApi.updateBusinessStatus(data)
       message.success(t('common.updateSuccess'))
     }
     dialogVisible.value = false
@@ -144,7 +155,7 @@ const resetForm = () => {
     id: 0,
     name: '',
     deptIds: [],
-    statusList: []
+    statuses: []
   }
   treeRef.value?.setCheckedNodes([])
   formRef.value?.resetFields()
@@ -153,15 +164,15 @@ const resetForm = () => {
 /** 添加状态 */
 const addStatusArea = () => {
   const data = formData.value
-  data.statusList.push({
+  data.statuses.push({
     name: '',
-    percent: ''
+    percent: undefined
   })
 }
 
 /** 删除状态 */
 const deleteStatusArea = (index: number) => {
   const data = formData.value
-  data.statusList.splice(index, 1)
+  data.statuses.splice(index, 1)
 }
 </script>

+ 18 - 22
src/views/crm/businessStatusType/index.vue → src/views/crm/business/status/index.vue

@@ -9,25 +9,14 @@
       label-width="68px"
     >
       <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>
         <el-button
           type="primary"
           plain
           @click="openForm('create')"
-          v-hasPermi="['crm:business-status-type:create']"
+          v-hasPermi="['crm:business-status:create']"
         >
           <Icon icon="ep:plus" class="mr-5px" /> 新增
         </el-button>
-        <el-button
-          type="success"
-          plain
-          @click="handleExport"
-          :loading="exportLoading"
-          v-hasPermi="['crm:business-status-type:export']"
-        >
-          <Icon icon="ep:download" class="mr-5px" /> 导出
-        </el-button>
       </el-form-item>
     </el-form>
   </ContentWrap>
@@ -35,8 +24,15 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
-      <el-table-column label="状态类型名" align="center" prop="name" />
-      <el-table-column label="使用的部门" align="center" prop="deptNames" />
+      <el-table-column label="状态组名" align="center" prop="name" />
+      <el-table-column label="应用部门" align="center" prop="deptNames">
+        <template #default="scope">
+          <span v-if="scope.row?.deptNames?.length > 0">
+            {{ scope.row.deptNames.join(' ') }}
+          </span>
+          <span v-else>全公司</span>
+        </template>
+      </el-table-column>
       <el-table-column label="创建人" align="center" prop="creator" />
       <el-table-column
         label="创建时间"
@@ -51,7 +47,7 @@
             link
             type="primary"
             @click="openForm('update', scope.row.id)"
-            v-hasPermi="['crm:business-status-type:update']"
+            v-hasPermi="['crm:business-status:update']"
           >
             编辑
           </el-button>
@@ -59,7 +55,7 @@
             link
             type="danger"
             @click="handleDelete(scope.row.id)"
-            v-hasPermi="['crm:business-status-type:delete']"
+            v-hasPermi="['crm:business-status:delete']"
           >
             删除
           </el-button>
@@ -76,16 +72,16 @@
   </ContentWrap>
 
   <!-- 表单弹窗:添加/修改 -->
-  <BusinessStatusTypeForm ref="formRef" @success="getList" />
+  <BusinessStatusForm ref="formRef" @success="getList" />
 </template>
 
 <script setup lang="ts">
 import { dateFormatter } from '@/utils/formatTime'
 import download from '@/utils/download'
-import * as BusinessStatusTypeApi from '@/api/crm/businessStatusType'
-import BusinessStatusTypeForm from './BusinessStatusTypeForm.vue'
+import * as BusinessStatusApi from '@/api/crm/business/status'
+import BusinessStatusForm from './BusinessStatusForm.vue'
 
-defineOptions({ name: 'BusinessStatusType' })
+defineOptions({ name: 'CrmBusinessStatus' })
 
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化
@@ -104,7 +100,7 @@ const exportLoading = ref(false) // 导出的加载中
 const getList = async () => {
   loading.value = true
   try {
-    const data = await BusinessStatusTypeApi.getBusinessStatusTypePage(queryParams)
+    const data = await BusinessStatusApi.getBusinessStatusPage(queryParams)
     list.value = data.list
     total.value = data.total
   } finally {
@@ -157,7 +153,7 @@ const handleExport = async () => {
     // 发起导出
     exportLoading.value = true
     const data = await BusinessStatusTypeApi.exportBusinessStatusType(queryParams)
-    download.excel(data, '商机状态类型.xls')
+    download.excel(data, '商机状态.xls')
   } catch {
   } finally {
     exportLoading.value = false