CRM:待办事项(接入合同)

This commit is contained in:
YunaiV 2024-02-24 17:55:34 +08:00
parent 8f8591fc45
commit 6caa94ec47
8 changed files with 183 additions and 63 deletions

View File

@ -1,11 +1,6 @@
import request from '@/config/axios' import request from '@/config/axios'
// TODO 芋艿:融合下 // TODO 芋艿:融合下
// 3. 获得分配给我的客户数量
export const getFollowCustomerCount = async () => {
return await request.get({ url: '/crm/customer/follow-customer-count' })
}
// 5. 获得待审核合同数量 // 5. 获得待审核合同数量
export const getCheckContractCount = async () => { export const getCheckContractCount = async () => {
return await request.get({ url: '/crm/contract/check-contract-count' }) return await request.get({ url: '/crm/contract/check-contract-count' })

View File

@ -94,3 +94,13 @@ export const submitContract = async (id: number) => {
export const transferContract = async (data: TransferReqVO) => { export const transferContract = async (data: TransferReqVO) => {
return await request.put({ url: '/crm/contract/transfer', data }) return await request.put({ url: '/crm/contract/transfer', data })
} }
// 获得待审核合同数量
export const getAuditContractCount = async () => {
return await request.get({ url: '/crm/contract/audit-count' })
}
// 获得即将到期(提醒)的合同数量
export const getRemindContractCount = async () => {
return await request.get({ url: '/crm/contract/remind-count' })
}

View File

@ -30,8 +30,14 @@
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true"> <el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
<el-table-column align="center" fixed="left" label="合同编号" prop="no" width="130" /> <el-table-column align="center" fixed="left" label="合同编号" prop="no" width="180" />
<el-table-column align="center" label="合同名称" prop="name" width="130" /> <el-table-column align="center" fixed="left" 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="customerName" width="120"> <el-table-column align="center" label="客户名称" prop="customerName" width="120">
<template #default="scope"> <template #default="scope">
<el-link <el-link
@ -43,8 +49,24 @@
</el-link> </el-link>
</template> </template>
</el-table-column> </el-table-column>
<!-- TODO @puhui999做了商机详情后可以把这个超链接加上 --> <el-table-column align="center" label="商机名称" prop="businessName" width="130">
<el-table-column align="center" label="商机名称" prop="businessName" width="130" /> <template #default="scope">
<el-link
:underline="false"
type="primary"
@click="openBusinessDetail(scope.row.businessId)"
>
{{ scope.row.businessName }}
</el-link>
</template>
</el-table-column>
<el-table-column
align="center"
label="合同金额(元)"
prop="totalPrice"
width="140"
:formatter="erpPriceTableColumnFormatter"
/>
<el-table-column <el-table-column
align="center" align="center"
label="下单时间" label="下单时间"
@ -52,13 +74,6 @@
width="120" width="120"
:formatter="dateFormatter2" :formatter="dateFormatter2"
/> />
<el-table-column
align="center"
label="合同金额"
prop="price"
width="130"
:formatter="fenToYuanFormat"
/>
<el-table-column <el-table-column
align="center" align="center"
label="合同开始时间" label="合同开始时间"
@ -78,17 +93,24 @@
<el-link <el-link
:underline="false" :underline="false"
type="primary" type="primary"
@click="openContactDetail(scope.row.contactId)" @click="openContactDetail(scope.row.signContactId)"
> >
{{ scope.row.contactName }} {{ scope.row.signContactName }}
</el-link> </el-link>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="公司签约人" prop="signUserName" width="130" /> <el-table-column align="center" label="公司签约人" prop="signUserName" width="130" />
<el-table-column align="center" label="备注" prop="remark" width="130" /> <el-table-column align="center" label="备注" prop="remark" width="200" />
<!-- TODO @puhui999后续可加 已收款金额未收款金额 --> <!-- TODO @puhui999后续可加 已收款金额未收款金额 -->
<el-table-column
:formatter="dateFormatter"
align="center"
label="最后跟进时间"
prop="contactLastTime"
width="180px"
/>
<el-table-column align="center" label="负责人" prop="ownerUserName" width="120" /> <el-table-column align="center" label="负责人" prop="ownerUserName" width="120" />
<el-table-column align="center" label="创建人" prop="creatorName" width="120" /> <el-table-column align="center" label="所属部门" prop="ownerUserDeptName" width="100px" />
<el-table-column <el-table-column
:formatter="dateFormatter" :formatter="dateFormatter"
align="center" align="center"
@ -103,11 +125,24 @@
prop="createTime" prop="createTime"
width="180px" width="180px"
/> />
<el-table-column align="center" label="创建人" prop="creatorName" width="120" />
<el-table-column align="center" fixed="right" label="合同状态" prop="auditStatus" width="120"> <el-table-column align="center" fixed="right" label="合同状态" prop="auditStatus" width="120">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.CRM_AUDIT_STATUS" :value="scope.row.auditStatus" /> <dict-tag :type="DICT_TYPE.CRM_AUDIT_STATUS" :value="scope.row.auditStatus" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column fixed="right" label="操作" width="90">
<template #default="scope">
<el-button
link
v-hasPermi="['crm:contract:update']"
type="primary"
@click="handleProcessDetail(scope.row)"
>
查看审批
</el-button>
</template>
</el-table-column>
</el-table> </el-table>
<!-- 分页 --> <!-- 分页 -->
<Pagination <Pagination
@ -122,9 +157,9 @@
<script setup lang="ts" name="CheckContract"> <script setup lang="ts" name="CheckContract">
import { dateFormatter, dateFormatter2 } from '@/utils/formatTime' import { dateFormatter, dateFormatter2 } from '@/utils/formatTime'
import * as ContractApi from '@/api/crm/contract' import * as ContractApi from '@/api/crm/contract'
import { fenToYuanFormat } from '@/utils/formatter'
import { DICT_TYPE } from '@/utils/dict' import { DICT_TYPE } from '@/utils/dict'
import { AUDIT_STATUS } from './common' import { AUDIT_STATUS } from './common'
import { erpPriceTableColumnFormatter } from '@/utils'
const loading = ref(true) // const loading = ref(true) //
const total = ref(0) // const total = ref(0) //
@ -132,7 +167,8 @@ const list = ref([]) // 列表的数据
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
auditStatus: 20 sceneType: 1, //
auditStatus: 10
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
@ -154,8 +190,18 @@ const handleQuery = () => {
getList() getList()
} }
/** 查看审批 */
const handleProcessDetail = (row: ContractApi.ContractVO) => {
push({ name: 'BpmProcessInstanceDetail', query: { id: row.processInstanceId } })
}
/** 打开合同详情 */
const { push } = useRouter()
const openDetail = (id: number) => {
push({ name: 'CrmContractDetail', params: { id } })
}
/** 打开客户详情 */ /** 打开客户详情 */
const { push } = useRouter() //
const openCustomerDetail = (id: number) => { const openCustomerDetail = (id: number) => {
push({ name: 'CrmCustomerDetail', params: { id } }) push({ name: 'CrmCustomerDetail', params: { id } })
} }
@ -165,6 +211,16 @@ const openContactDetail = (id: number) => {
push({ name: 'CrmContactDetail', params: { id } }) push({ name: 'CrmContactDetail', params: { id } })
} }
/** 打开商机详情 */
const openBusinessDetail = (id: number) => {
push({ name: 'CrmBusinessDetail', params: { id } })
}
/** 激活时 */
onActivated(async () => {
await getList()
})
/** 初始化 **/ /** 初始化 **/
onMounted(() => { onMounted(() => {
getList() getList()

View File

@ -30,8 +30,14 @@
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true"> <el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
<el-table-column align="center" fixed="left" label="合同编号" prop="no" width="130" /> <el-table-column align="center" fixed="left" label="合同编号" prop="no" width="180" />
<el-table-column align="center" label="合同名称" prop="name" width="130" /> <el-table-column align="center" fixed="left" 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="customerName" width="120"> <el-table-column align="center" label="客户名称" prop="customerName" width="120">
<template #default="scope"> <template #default="scope">
<el-link <el-link
@ -43,8 +49,24 @@
</el-link> </el-link>
</template> </template>
</el-table-column> </el-table-column>
<!-- TODO @puhui999做了商机详情后可以把这个超链接加上 --> <el-table-column align="center" label="商机名称" prop="businessName" width="130">
<el-table-column align="center" label="商机名称" prop="businessName" width="130" /> <template #default="scope">
<el-link
:underline="false"
type="primary"
@click="openBusinessDetail(scope.row.businessId)"
>
{{ scope.row.businessName }}
</el-link>
</template>
</el-table-column>
<el-table-column
align="center"
label="合同金额(元)"
prop="totalPrice"
width="140"
:formatter="erpPriceTableColumnFormatter"
/>
<el-table-column <el-table-column
align="center" align="center"
label="下单时间" label="下单时间"
@ -52,13 +74,6 @@
width="120" width="120"
:formatter="dateFormatter2" :formatter="dateFormatter2"
/> />
<el-table-column
align="center"
label="合同金额"
prop="price"
width="130"
:formatter="fenToYuanFormat"
/>
<el-table-column <el-table-column
align="center" align="center"
label="合同开始时间" label="合同开始时间"
@ -78,17 +93,24 @@
<el-link <el-link
:underline="false" :underline="false"
type="primary" type="primary"
@click="openContactDetail(scope.row.contactId)" @click="openContactDetail(scope.row.signContactId)"
> >
{{ scope.row.contactName }} {{ scope.row.signContactName }}
</el-link> </el-link>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="公司签约人" prop="signUserName" width="130" /> <el-table-column align="center" label="公司签约人" prop="signUserName" width="130" />
<el-table-column align="center" label="备注" prop="remark" width="130" /> <el-table-column align="center" label="备注" prop="remark" width="200" />
<!-- TODO @puhui999后续可加 已收款金额未收款金额 --> <!-- TODO @puhui999后续可加 已收款金额未收款金额 -->
<el-table-column
:formatter="dateFormatter"
align="center"
label="最后跟进时间"
prop="contactLastTime"
width="180px"
/>
<el-table-column align="center" label="负责人" prop="ownerUserName" width="120" /> <el-table-column align="center" label="负责人" prop="ownerUserName" width="120" />
<el-table-column align="center" label="创建人" prop="creatorName" width="120" /> <el-table-column align="center" label="所属部门" prop="ownerUserDeptName" width="100px" />
<el-table-column <el-table-column
:formatter="dateFormatter" :formatter="dateFormatter"
align="center" align="center"
@ -103,11 +125,24 @@
prop="createTime" prop="createTime"
width="180px" width="180px"
/> />
<el-table-column align="center" label="创建人" prop="creatorName" width="120" />
<el-table-column align="center" fixed="right" label="合同状态" prop="auditStatus" width="120"> <el-table-column align="center" fixed="right" label="合同状态" prop="auditStatus" width="120">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.CRM_AUDIT_STATUS" :value="scope.row.auditStatus" /> <dict-tag :type="DICT_TYPE.CRM_AUDIT_STATUS" :value="scope.row.auditStatus" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column fixed="right" label="操作" width="90">
<template #default="scope">
<el-button
link
v-hasPermi="['crm:contract:update']"
type="primary"
@click="handleProcessDetail(scope.row)"
>
查看审批
</el-button>
</template>
</el-table-column>
</el-table> </el-table>
<!-- 分页 --> <!-- 分页 -->
<Pagination <Pagination
@ -125,8 +160,7 @@ import * as ContractApi from '@/api/crm/contract'
import { fenToYuanFormat } from '@/utils/formatter' import { fenToYuanFormat } from '@/utils/formatter'
import { DICT_TYPE } from '@/utils/dict' import { DICT_TYPE } from '@/utils/dict'
import { CONTRACT_EXPIRY_TYPE } from './common' import { CONTRACT_EXPIRY_TYPE } from './common'
import { erpPriceTableColumnFormatter } from '@/utils'
const { push } = useRouter() //
const loading = ref(true) // const loading = ref(true) //
const total = ref(0) // const total = ref(0) //
@ -134,6 +168,7 @@ const list = ref([]) // 列表的数据
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
sceneType: '1', //
expiryType: 1 expiryType: 1
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
@ -156,6 +191,17 @@ const handleQuery = () => {
getList() getList()
} }
/** 查看审批 */
const handleProcessDetail = (row: ContractApi.ContractVO) => {
push({ name: 'BpmProcessInstanceDetail', query: { id: row.processInstanceId } })
}
/** 打开合同详情 */
const { push } = useRouter()
const openDetail = (id: number) => {
push({ name: 'CrmContractDetail', params: { id } })
}
/** 打开客户详情 */ /** 打开客户详情 */
const openCustomerDetail = (id: number) => { const openCustomerDetail = (id: number) => {
push({ name: 'CrmCustomerDetail', params: { id } }) push({ name: 'CrmCustomerDetail', params: { id } })
@ -166,10 +212,18 @@ const openContactDetail = (id: number) => {
push({ name: 'CrmContactDetail', params: { id } }) push({ name: 'CrmContactDetail', params: { id } })
} }
/** 打开商机详情 */
const openBusinessDetail = (id: number) => {
push({ name: 'CrmBusinessDetail', params: { id } })
}
/** 激活时 */
onActivated(async () => {
await getList()
})
/** 初始化 **/ /** 初始化 **/
onMounted(() => { onMounted(() => {
getList() getList()
}) })
</script> </script>
<style scoped></style>

View File

@ -130,8 +130,8 @@ const list = ref([]) // 列表的数据
const queryParams = ref({ const queryParams = ref({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
followUpStatus: false, sceneType: 1,
sceneType: 1 followUpStatus: false
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
@ -158,10 +158,13 @@ const openDetail = (id: number) => {
push({ name: 'CrmCustomerDetail', params: { id } }) push({ name: 'CrmCustomerDetail', params: { id } })
} }
/** 激活时 */
onActivated(async () => {
await getList()
})
/** 初始化 **/ /** 初始化 **/
onMounted(() => { onMounted(() => {
getList() getList()
}) })
</script> </script>
<style scoped></style>

View File

@ -20,8 +20,9 @@ export const CONTACT_STATUS = [
/** 审批状态 */ /** 审批状态 */
export const AUDIT_STATUS = [ export const AUDIT_STATUS = [
{ label: '已审批', value: 20 }, { label: '待审批', value: 10 },
{ label: '待审批', value: 10 } { label: '审核通过', value: 20 },
{ label: '审核不通过', value: 30 }
] ]
/** 回款提醒类型 */ /** 回款提醒类型 */

View File

@ -17,9 +17,9 @@
<el-col :span="20" :xs="24"> <el-col :span="20" :xs="24">
<CustomerTodayContactList v-if="leftMenu === 'customerTodayContact'" /> <CustomerTodayContactList v-if="leftMenu === 'customerTodayContact'" />
<ClueFollowList v-if="leftMenu === 'clueFollow'" /> <ClueFollowList v-if="leftMenu === 'clueFollow'" />
<CheckContract v-if="leftMenu === 'checkContract'" /> <ContractAuditList v-if="leftMenu === 'contractAudit'" />
<CheckReceivables v-if="leftMenu === 'checkReceivables'" /> <CheckReceivables v-if="leftMenu === 'checkReceivables'" />
<EndContract v-if="leftMenu === 'endContract'" /> <ContractRemindList v-if="leftMenu === 'contractRemind'" />
<CustomerFollowList v-if="leftMenu === 'customerFollow'" /> <CustomerFollowList v-if="leftMenu === 'customerFollow'" />
<CustomerPutPoolRemindList v-if="leftMenu === 'customerPutPoolRemind'" /> <CustomerPutPoolRemindList v-if="leftMenu === 'customerPutPoolRemind'" />
<RemindReceivables v-if="leftMenu === 'remindReceivables'" /> <RemindReceivables v-if="leftMenu === 'remindReceivables'" />
@ -33,25 +33,26 @@ import CustomerFollowList from './components/CustomerFollowList.vue'
import CustomerTodayContactList from './components/CustomerTodayContactList.vue' import CustomerTodayContactList from './components/CustomerTodayContactList.vue'
import CustomerPutPoolRemindList from './components/CustomerPutPoolRemindList.vue' import CustomerPutPoolRemindList from './components/CustomerPutPoolRemindList.vue'
import ClueFollowList from './components/ClueFollowList.vue' import ClueFollowList from './components/ClueFollowList.vue'
import CheckContract from './tables/CheckContract.vue' import ContractAuditList from './components/ContractAuditList.vue'
import CheckReceivables from './tables/CheckReceivables.vue' import ContractRemindList from './components/ContractRemindList.vue'
import EndContract from './tables/EndContract.vue'
import RemindReceivables from './tables/RemindReceivables.vue' import RemindReceivables from './tables/RemindReceivables.vue'
import CheckReceivables from './tables/CheckReceivables.vue'
import * as CustomerApi from '@/api/crm/customer' import * as CustomerApi from '@/api/crm/customer'
import * as ClueApi from '@/api/crm/clue' import * as ClueApi from '@/api/crm/clue'
import * as ContractApi from '@/api/crm/contract'
defineOptions({ name: 'CrmBacklog' }) defineOptions({ name: 'CrmBacklog' })
const leftMenu = ref('customerTodayContact') const leftMenu = ref('customerTodayContact')
const customerTodayContactCount = ref(0)
const clueFollowCount = ref(0) const clueFollowCount = ref(0)
const customerFollowCount = ref(0) const customerFollowCount = ref(0)
const customerPutPoolRemindCount = ref(0) const customerPutPoolRemindCount = ref(0)
const checkContractCount = ref(0) const customerTodayContactCount = ref(0)
const contractAuditCount = ref(0)
const contractRemindCount = ref(0)
const checkReceivablesCount = ref(0) const checkReceivablesCount = ref(0)
const remindReceivablesCount = ref(0) const remindReceivablesCount = ref(0)
const endContractCount = ref(0)
const leftSides = ref([ const leftSides = ref([
{ {
@ -76,8 +77,8 @@ const leftSides = ref([
}, },
{ {
name: '待审核合同', name: '待审核合同',
menu: 'checkContract', menu: 'contractAudit',
count: checkContractCount count: contractAuditCount
}, },
{ {
name: '待审核回款', name: '待审核回款',
@ -91,8 +92,8 @@ const leftSides = ref([
}, },
{ {
name: '即将到期的合同', name: '即将到期的合同',
menu: 'endContract', menu: 'contractRemind',
count: endContractCount count: contractRemindCount
} }
]) ])
@ -110,10 +111,10 @@ const getCount = () => {
) )
CustomerApi.getFollowCustomerCount().then((count) => (customerFollowCount.value = count)) CustomerApi.getFollowCustomerCount().then((count) => (customerFollowCount.value = count))
ClueApi.getFollowClueCount().then((count) => (clueFollowCount.value = count)) ClueApi.getFollowClueCount().then((count) => (clueFollowCount.value = count))
BacklogApi.getCheckContractCount().then((count) => (checkContractCount.value = count)) ContractApi.getAuditContractCount().then((count) => (contractAuditCount.value = count))
ContractApi.getRemindContractCount().then((count) => (contractRemindCount.value = count))
BacklogApi.getCheckReceivablesCount().then((count) => (checkReceivablesCount.value = count)) BacklogApi.getCheckReceivablesCount().then((count) => (checkReceivablesCount.value = count))
BacklogApi.getRemindReceivablePlanCount().then((count) => (remindReceivablesCount.value = count)) BacklogApi.getRemindReceivablePlanCount().then((count) => (remindReceivablesCount.value = count))
BacklogApi.getEndContractCount().then((count) => (endContractCount.value = count))
} }
/** 激活时 */ /** 激活时 */

View File

@ -79,7 +79,7 @@
<el-tab-pane label="下属负责的" name="3" /> <el-tab-pane label="下属负责的" name="3" />
</el-tabs> </el-tabs>
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true"> <el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
<el-table-column align="center" fixed="left" label="合同编号" prop="no" width="160" /> <el-table-column align="center" fixed="left" label="合同编号" prop="no" width="180" />
<el-table-column align="center" fixed="left" label="合同名称" prop="name" width="160"> <el-table-column align="center" fixed="left" label="合同名称" prop="name" width="160">
<template #default="scope"> <template #default="scope">
<el-link :underline="false" type="primary" @click="openDetail(scope.row.id)"> <el-link :underline="false" type="primary" @click="openDetail(scope.row.id)">