Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Unverified
Commit
f30f71b7
authored
Feb 25, 2024
by
芋道源码
Committed by
Gitee
Feb 25, 2024
Browse files
Options
Browse Files
Download
Plain Diff
!393 CRM:完善回款
Merge pull request !393 from puhui999/dev-crm
parents
12972cdf
174724da
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
501 additions
and
327 deletions
+501
-327
src/api/crm/contract/index.ts
+7
-0
src/api/crm/customer/index.ts
+5
-0
src/api/crm/receivable/index.ts
+5
-1
src/api/crm/receivable/plan/index.ts
+8
-3
src/views/crm/contract/detail/index.vue
+21
-3
src/views/crm/customer/CustomerImportForm.vue
+8
-6
src/views/crm/customer/detail/index.vue
+9
-3
src/views/crm/receivable/ReceivableForm.vue
+0
-0
src/views/crm/receivable/components/ReceivableList.vue
+81
-52
src/views/crm/receivable/index.vue
+90
-63
src/views/crm/receivable/plan/ReceivablePlanForm.vue
+99
-79
src/views/crm/receivable/plan/components/ReceivablePlanList.vue
+99
-51
src/views/crm/receivable/plan/index.vue
+69
-66
No files found.
src/api/crm/contract/index.ts
View file @
f30f71b7
...
...
@@ -65,6 +65,13 @@ export const getContract = async (id: number) => {
return
await
request
.
get
({
url
:
`/crm/contract/get?id=`
+
id
})
}
// 查询 CRM 合同下拉列表
export
const
getCrmContractSimpleListByCustomerId
=
async
(
customerId
:
number
)
=>
{
return
await
request
.
get
({
url
:
`/crm/contract/list-all-simple-by-customer?customerId=
${
customerId
}
`
})
}
// 新增 CRM 合同
export
const
createContract
=
async
(
data
:
ContractVO
)
=>
{
return
await
request
.
post
({
url
:
`/crm/contract/create`
,
data
})
...
...
src/api/crm/customer/index.ts
View file @
f30f71b7
...
...
@@ -90,6 +90,11 @@ export const importCustomerTemplate = () => {
return
request
.
download
({
url
:
'/crm/customer/get-import-template'
})
}
// 导入客户
export
const
handleImport
=
async
(
formData
)
=>
{
return
await
request
.
upload
({
url
:
`/crm/customer/import`
,
data
:
formData
})
}
// 客户列表
export
const
getCustomerSimpleList
=
async
()
=>
{
return
await
request
.
get
({
url
:
`/crm/customer/simple-list`
})
...
...
src/api/crm/receivable/index.ts
View file @
f30f71b7
...
...
@@ -12,7 +12,6 @@ export interface ReceivableVO {
returnType
:
string
price
:
number
ownerUserId
:
number
sort
:
number
remark
:
string
}
...
...
@@ -50,3 +49,8 @@ export const deleteReceivable = async (id: number) => {
export
const
exportReceivable
=
async
(
params
)
=>
{
return
await
request
.
download
({
url
:
`/crm/receivable/export-excel`
,
params
})
}
// 提交审核
export
const
submitReceivable
=
async
(
id
:
number
)
=>
{
return
await
request
.
put
({
url
:
`/crm/receivable/submit?id=
${
id
}
`
})
}
src/api/crm/receivable/plan/index.ts
View file @
f30f71b7
...
...
@@ -4,8 +4,7 @@ export interface ReceivablePlanVO {
id
:
number
period
:
number
receivableId
:
number
status
:
number
checkStatus
:
string
finishStatus
:
number
processInstanceId
:
number
price
:
number
returnTime
:
Date
...
...
@@ -14,7 +13,6 @@ export interface ReceivablePlanVO {
customerId
:
number
contractId
:
number
ownerUserId
:
number
sort
:
number
remark
:
string
}
...
...
@@ -33,6 +31,13 @@ export const getReceivablePlan = async (id: number) => {
return
await
request
.
get
({
url
:
`/crm/receivable-plan/get?id=`
+
id
})
}
// 查询回款计划下拉数据
export
const
getReceivablePlanListByContractId
=
async
(
customerId
:
number
,
contractId
:
number
)
=>
{
return
await
request
.
get
({
url
:
`/crm/receivable-plan/list-all-simple-by-customer?customerId=
${
customerId
}
&contractId=
${
contractId
}
`
})
}
// 新增回款计划
export
const
createReceivablePlan
=
async
(
data
:
ReceivablePlanVO
)
=>
{
return
await
request
.
post
({
url
:
`/crm/receivable-plan/create`
,
data
})
...
...
src/views/crm/contract/detail/index.vue
View file @
f30f71b7
...
...
@@ -19,8 +19,18 @@
<el-tab-pane
label=
"产品"
>
<ContractProductList
:contract=
"contract"
/>
</el-tab-pane>
<!-- TODO @puhui999:回款信息 -->
<el-tab-pane
label=
"回款"
>
123
</el-tab-pane>
<el-tab-pane
label=
"回款"
>
<ReceivablePlanList
:contract-id=
"contract.id!"
:customer-id=
"contract.customerId"
@
crate-receivable=
"crateReceivable"
/>
<ReceivableList
ref=
"receivableListRef"
:contract-id=
"contract.id!"
:customer-id=
"contract.customerId"
/>
</el-tab-pane>
<el-tab-pane
label=
"团队成员"
>
<PermissionList
ref=
"permissionListRef"
...
...
@@ -53,6 +63,8 @@ import ContractForm from '@/views/crm/contract/ContractForm.vue'
import
CrmTransferForm
from
'@/views/crm/permission/components/TransferForm.vue'
import
PermissionList
from
'@/views/crm/permission/components/PermissionList.vue'
import
FollowUpList
from
'@/views/crm/followup/index.vue'
import
ReceivableList
from
'@/views/crm/receivable/components/ReceivableList.vue'
import
ReceivablePlanList
from
'@/views/crm/receivable/plan/components/ReceivablePlanList.vue'
defineOptions
({
name
:
'CrmContractDetail'
})
const
props
=
defineProps
<
{
id
?:
number
}
>
()
...
...
@@ -94,8 +106,14 @@ const getOperateLog = async (contractId: number) => {
logList
.
value
=
data
.
list
}
/** 从回款计划创建回款 */
const
receivableListRef
=
ref
<
InstanceType
<
typeof
ReceivableList
>>
()
// 回款列表 Ref
const
crateReceivable
=
(
planData
:
any
)
=>
{
receivableListRef
.
value
?.
crateReceivable
(
planData
)
}
/** 转移 */
// TODO @puhui999:这个组件,要不传递业务类型,然后组件里判断 title 和 api 能调用哪个;整体治理掉;
// TODO @puhui999:这个组件,要不传递业务类型,然后组件里判断 title 和 api 能调用哪个;整体治理掉;
好呢
const
transferFormRef
=
ref
<
InstanceType
<
typeof
CrmTransferForm
>>
()
// 合同转移表单 ref
const
transferContract
=
()
=>
{
transferFormRef
.
value
?.
open
(
'合同转移'
,
contract
.
value
.
id
,
ContractApi
.
transferContract
)
...
...
src/views/crm/customer/CustomerImportForm.vue
View file @
f30f71b7
...
...
@@ -4,7 +4,6 @@
<el-upload
ref=
"uploadRef"
v-model:file-list=
"fileList"
:action=
"importUrl + '?updateSupport=' + updateSupport"
:auto-upload=
"false"
:disabled=
"formLoading"
:headers=
"uploadHeaders"
...
...
@@ -13,6 +12,7 @@
:on-exceed=
"handleExceed"
:on-success=
"submitFormSuccess"
accept=
".xlsx, .xls"
action=
"none"
drag
>
<Icon
icon=
"ep:upload"
/>
...
...
@@ -45,6 +45,7 @@
import
*
as
CustomerApi
from
'@/api/crm/customer'
import
{
getAccessToken
,
getTenantId
}
from
'@/utils/auth'
import
download
from
'@/utils/download'
import
type
{
UploadUserFile
}
from
'element-plus'
defineOptions
({
name
:
'SystemUserImportForm'
})
...
...
@@ -53,11 +54,9 @@ const message = useMessage() // 消息弹窗
const
dialogVisible
=
ref
(
false
)
// 弹窗的是否展示
const
formLoading
=
ref
(
false
)
// 表单的加载中
const
uploadRef
=
ref
()
const
importUrl
=
import
.
meta
.
env
.
VITE_BASE_URL
+
import
.
meta
.
env
.
VITE_API_URL
+
'/crm/customer/import'
const
uploadHeaders
=
ref
()
// 上传 Header 头
const
fileList
=
ref
([])
// 文件列表
const
updateSupport
=
ref
(
0
)
// 是否更新已经存在的客户数据
const
fileList
=
ref
<
UploadUserFile
[]
>
([])
// 文件列表
const
updateSupport
=
ref
(
false
)
// 是否更新已经存在的客户数据
/** 打开弹窗 */
const
open
=
()
=>
{
...
...
@@ -79,7 +78,10 @@ const submitForm = async () => {
'tenant-id'
:
getTenantId
()
}
formLoading
.
value
=
true
uploadRef
.
value
!
.
submit
()
const
formData
=
new
FormData
()
formData
.
append
(
'updateSupport'
,
updateSupport
.
value
)
formData
.
append
(
'file'
,
fileList
.
value
[
0
].
raw
)
await
CustomerApi
.
handleImport
(
formData
)
}
/** 文件上传成功 */
...
...
src/views/crm/customer/detail/index.vue
View file @
f30f71b7
...
...
@@ -26,7 +26,7 @@
>
锁定
</el-button>
<el-button
v-if=
"!customer.ownerUserId"
type=
"primary"
@
click=
"handleReceive"
>
领取
</el-button>
<el-button
v-if=
"!customer.ownerUserId"
type=
"primary"
@
click=
"handleReceive"
>
领取
</el-button>
<el-button
v-if=
"!customer.ownerUserId"
type=
"primary"
@
click=
"handleDistributeForm"
>
分配
</el-button>
...
...
@@ -64,8 +64,8 @@
<ContractList
:biz-id=
"customer.id!"
:biz-type=
"BizTypeEnum.CRM_CUSTOMER"
/>
</el-tab-pane>
<el-tab-pane
label=
"回款"
lazy
>
<ReceivablePlanList
:
biz-id=
"customer.id!"
:biz-type=
"BizTypeEnum.CRM_CUSTOMER
"
/>
<ReceivableList
:biz-id=
"customer.id!"
:biz-type=
"BizTypeEnum.CRM_CUSTOMER
"
/>
<ReceivablePlanList
:
customer-id=
"customer.id!"
@
crate-receivable=
"crateReceivable
"
/>
<ReceivableList
ref=
"receivableListRef"
:customer-id=
"customer.id!
"
/>
</el-tab-pane>
<el-tab-pane
label=
"操作日志"
>
<OperateLogV2
:log-list=
"logList"
/>
...
...
@@ -197,6 +197,12 @@ const getOperateLog = async () => {
logList
.
value
=
data
.
list
}
/** 从回款计划创建回款 */
const
receivableListRef
=
ref
<
InstanceType
<
typeof
ReceivableList
>>
()
// 回款列表 Ref
const
crateReceivable
=
(
planData
:
any
)
=>
{
receivableListRef
.
value
?.
crateReceivable
(
planData
)
}
const
close
=
()
=>
{
delView
(
unref
(
currentRoute
))
push
({
name
:
'CrmCustomer'
})
...
...
src/views/crm/receivable/ReceivableForm.vue
View file @
f30f71b7
This diff is collapsed.
Click to expand it.
src/views/crm/receivable/components/ReceivableList.vue
View file @
f30f71b7
...
...
@@ -9,40 +9,51 @@
<!-- 列表 -->
<ContentWrap
class=
"mt-10px"
>
<el-table
v-loading=
"loading"
:data=
"list"
:stripe=
"true"
:show-overflow-tooltip=
"true"
>
<el-table-column
label=
"回款编号"
fixed=
"left"
align=
"center"
prop=
"no"
>
<template
#
default=
"scope"
>
<el-link
type=
"primary"
:underline=
"false"
@
click=
"openDetail(scope.row.id)"
>
{{
scope
.
row
.
no
}}
</el-link>
</
template
>
</el-table-column>
<el-table-column
label=
"合同编号"
align=
"center"
prop=
"contractNo"
/>
<el-table
v-loading=
"loading"
:data=
"list"
:show-overflow-tooltip=
"true"
:stripe=
"true"
>
<el-table-column
align=
"center"
label=
"回款编号"
prop=
"no"
/>
<el-table-column
align=
"center"
label=
"客户"
prop=
"customerName"
/>
<el-table-column
align=
"center"
label=
"合同"
prop=
"contractName"
/>
<el-table-column
label=
"回款金额(元)
"
:formatter=
"dateFormatter2
"
align=
"center"
prop=
"price"
:formatter=
"fenToYuanFormat"
label=
"回款日期"
prop=
"returnTime"
width=
"150px"
/>
<el-table-column
label=
"负责人"
align=
"center"
prop=
"ownerUserName"
/>
<el-table-column
align=
"center"
label=
"状态"
prop=
"auditStatus"
>
<el-table-column
align=
"center"
label=
"回款方式"
prop=
"returnType"
width=
"130px"
>
<template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.CRM_AUDIT_STATUS"
:value=
"scope.row.auditStatus"
/>
<dict-tag
:type=
"DICT_TYPE.CRM_RECEIVABLE_RETURN_TYPE"
:value=
"scope.row.returnType"
/>
</
template
>
</el-table-column>
<el-table-column
align=
"center"
label=
"回款金额(元)"
prop=
"price"
/>
<el-table-column
align=
"center"
label=
"负责人"
prop=
"ownerUserName"
/>
<el-table-column
align=
"center"
label=
"备注"
prop=
"remark"
/>
<el-table-column
align=
"center"
fixed=
"right"
label=
"操作"
width=
"130px"
>
<
template
#
default=
"scope"
>
<el-button
v-hasPermi=
"['crm:receivable:update']"
link
type=
"primary"
@
click=
"openForm('update', scope.row.id)"
>
编辑
</el-button>
<el-button
v-hasPermi=
"['crm:receivable:delete']"
link
type=
"danger"
@
click=
"handleDelete(scope.row.id)"
>
删除
</el-button>
</
template
>
</el-table-column>
<el-table-column
label=
"回款日期"
align=
"center"
prop=
"returnTime"
:formatter=
"dateFormatter"
width=
"180px"
/>
</el-table>
<!-- 分页 -->
<Pagination
:total=
"total"
v-model:page=
"queryParams.pageNo"
v-model:limit=
"queryParams.pageSize"
v-model:page=
"queryParams.pageNo"
:total=
"total"
@
pagination=
"getList"
/>
</ContentWrap>
...
...
@@ -50,45 +61,43 @@
<!-- 表单弹窗:添加 -->
<ReceivableForm
ref=
"formRef"
@
success=
"getList"
/>
</template>
<
script
setup
lang=
"ts"
>
<
script
lang=
"ts"
setup
>
import
*
as
ReceivablePlanApi
from
'@/api/crm/receivable/plan'
import
*
as
ReceivableApi
from
'@/api/crm/receivable'
import
ReceivableForm
from
'./../ReceivableForm.vue'
import
{
BizTypeEnum
}
from
'@/api/crm/permission'
import
{
dateFormatter
}
from
'@/utils/formatTime'
import
{
fenToYuanFormat
}
from
'@/utils/formatter'
import
{
dateFormatter2
}
from
'@/utils/formatTime'
import
{
DICT_TYPE
}
from
'@/utils/dict'
defineOptions
({
name
:
'CrmReceivableList'
})
const
props
=
defineProps
<
{
bizType
:
number
// 业务类型
bizId
:
number
// 业务
编号
customerId
?:
number
// 客户编号
contractId
?:
number
// 合同
编号
}
>
()
const
message
=
useMessage
()
// 消息弹窗
const
{
t
}
=
useI18n
()
// 国际化
const
loading
=
ref
(
true
)
// 列表的加载中
const
total
=
ref
(
0
)
// 列表的总页数
const
list
=
ref
([])
// 列表的数据
const
queryParams
=
reactive
({
pageNo
:
1
,
pageSize
:
10
,
customerId
:
undefined
as
unknown
// 允许 undefined + number
customerId
:
undefined
as
unknown
,
// 允许 undefined + number
contractId
:
undefined
as
unknown
// 允许 undefined + number
})
/** 查询列表 */
const
getList
=
async
()
=>
{
loading
.
value
=
true
try
{
// 置空参数
queryParams
.
customerId
=
undefined
// 执行查询
let
data
=
{
list
:
[],
total
:
0
}
switch
(
props
.
bizType
)
{
case
BizTypeEnum
.
CRM_CUSTOMER
:
queryParams
.
customerId
=
props
.
bizId
data
=
await
ReceivableApi
.
getReceivablePageByCustomer
(
queryParams
)
break
default
:
return
if
(
props
.
customerId
&&
!
props
.
contractId
)
{
queryParams
.
customerId
=
props
.
customerId
}
else
if
(
props
.
customerId
&&
props
.
contractId
)
{
// 如果是合同的话客户编号也需要带上因为权限基于客户
queryParams
.
customerId
=
props
.
customerId
queryParams
.
contractId
=
props
.
contractId
}
const
data
=
await
ReceivableApi
.
getReceivablePageByCustomer
(
queryParams
)
list
.
value
=
data
.
list
total
.
value
=
data
.
total
}
finally
{
...
...
@@ -99,25 +108,45 @@ const getList = async () => {
/** 搜索按钮操作 */
const
handleQuery
=
()
=>
{
queryParams
.
pageNo
=
1
// 置空参数
queryParams
.
customerId
=
undefined
queryParams
.
contractId
=
undefined
getList
()
}
/** 添加 */
/** 添加
/修改操作
*/
const
formRef
=
ref
()
const
openForm
=
()
=>
{
formRef
.
value
.
open
(
'create'
)
const
openForm
=
(
type
:
string
,
id
?:
number
)
=>
{
formRef
.
value
.
open
(
type
,
id
)
}
/** 打开合同详情 */
const
{
push
}
=
useRouter
()
const
openDetail
=
(
id
:
number
)
=>
{
push
({
name
:
'CrmReceivableDetail'
,
params
:
{
id
}
})
/** 删除按钮操作 */
const
handleDelete
=
async
(
id
:
number
)
=>
{
try
{
// 删除的二次确认
await
message
.
delConfirm
()
// 发起删除
await
ReceivableApi
.
deleteReceivable
(
id
)
message
.
success
(
t
(
'common.delSuccess'
))
// 刷新列表
await
getList
()
}
catch
{}
}
/** 监听打开的 bizId + bizType,从而加载最新的列表 */
/** 从回款计划创建回款 */
const
crateReceivable
=
(
planData
:
any
)
=>
{
const
data
=
planData
as
unknown
as
ReceivablePlanApi
.
ReceivablePlanVO
formRef
.
value
.
open
(
'create'
,
undefined
,
data
)
}
defineExpose
({
crateReceivable
})
/** 监听打开的 customerId + contractId,从而加载最新的列表 */
watch
(
()
=>
[
props
.
bizId
,
props
.
bizType
],
()
=>
{
()
=>
[
props
.
customerId
,
props
.
contractId
],
(
newVal
)
=>
{
// 保证至少客户编号有值
if
(
!
newVal
[
0
])
{
return
}
handleQuery
()
},
{
immediate
:
true
,
deep
:
true
}
...
...
src/views/crm/receivable/index.vue
View file @
f30f71b7
...
...
@@ -2,49 +2,63 @@
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class=
"-mb-15px"
:model=
"queryParams"
ref=
"queryFormRef"
:inline=
"true"
:model=
"queryParams"
class=
"-mb-15px"
label-width=
"68px"
>
<el-form-item
label=
"回款编号"
prop=
"no"
>
<el-input
v-model=
"queryParams.no"
placeholder=
"请输入回款编号
"
class=
"!w-240px
"
clearable
placeholder=
"请输入回款编号"
@
keyup
.
enter=
"handleQuery"
class=
"!w-240px"
/>
</el-form-item>
<el-form-item
label=
"客户名称"
prop=
"customerId"
>
<el-
inpu
t
<el-
selec
t
v-model=
"queryParams.customerId"
placeholder=
"请输入客户名称"
clearable
@
keyup
.
enter=
"handleQuery"
class=
"!w-240px"
placeholder=
"请选择客户"
@
keyup
.
enter=
"handleQuery"
>
<el-option
v-for=
"item in customerList"
:key=
"item.id"
:label=
"item.name"
:value=
"item.id"
/>
</el-select>
</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>
<el-button
@
click=
"handleQuery"
>
<Icon
class=
"mr-5px"
icon=
"ep:search"
/>
搜索
</el-button>
<el-button
@
click=
"resetQuery"
>
<Icon
class=
"mr-5px"
icon=
"ep:refresh"
/>
重置
</el-button>
<el-button
type=
"primary
"
v-hasPermi=
"['crm:receivable:create']
"
plain
type=
"primary"
@
click=
"openForm('create')"
v-hasPermi=
"['crm:receivable:create']"
>
<Icon
icon=
"ep:plus"
class=
"mr-5px"
/>
新增
<Icon
class=
"mr-5px"
icon=
"ep:plus"
/>
新增
</el-button>
<el-button
type=
"success"
v-hasPermi=
"['crm:receivable:export']"
:loading=
"exportLoading"
plain
type=
"success"
@
click=
"handleExport"
:loading=
"exportLoading"
v-hasPermi=
"['crm:receivable:export']"
>
<Icon
icon=
"ep:download"
class=
"mr-5px"
/>
导出
<Icon
class=
"mr-5px"
icon=
"ep:download"
/>
导出
</el-button>
</el-form-item>
</el-form>
...
...
@@ -52,66 +66,63 @@
<!-- 列表 -->
<ContentWrap>
<el-table
v-loading=
"loading"
:data=
"list"
:stripe=
"true"
:show-overflow-tooltip=
"true"
>
<el-table-column
label=
"ID"
align=
"center"
prop=
"id"
/>
<el-table-column
label=
"回款编号"
align=
"center"
prop=
"no"
/>
<!--
<el-table-column
label=
"回款计划ID"
align=
"center"
prop=
"planId"
/>
-->
<el-table-column
label=
"客户"
align=
"center"
prop=
"customerId"
/>
<el-table-column
label=
"合同"
align=
"center"
prop=
"contractId"
/>
<el-table-column
label=
"审批状态"
align=
"center"
prop=
"checkStatus"
width=
"130px"
>
<template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.CRM_AUDIT_STATUS"
:value=
"scope.row.checkStatus"
/>
</
template
>
</el-table-column>
<!-- <el-table-column label="工作流编号" align="center" prop="processInstanceId" />-->
<el-table
v-loading=
"loading"
:data=
"list"
:show-overflow-tooltip=
"true"
:stripe=
"true"
>
<el-table-column
align=
"center"
label=
"回款编号"
prop=
"no"
/>
<el-table-column
align=
"center"
label=
"客户"
prop=
"customerName"
/>
<el-table-column
align=
"center"
label=
"合同"
prop=
"contractName"
/>
<el-table-column
label=
"回款日期
"
:formatter=
"dateFormatter2
"
align=
"center"
label=
"回款日期"
prop=
"returnTime"
:formatter=
"dateFormatter2"
width=
"150px"
/>
<el-table-column
label=
"回款方式"
align=
"center
"
prop=
"returnType"
width=
"130px"
>
<el-table-column
align=
"center"
label=
"回款方式
"
prop=
"returnType"
width=
"130px"
>
<template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.CRM_RECEIVABLE_RETURN_TYPE"
:value=
"scope.row.returnType"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"回款金额(元)"
align=
"center"
prop=
"price"
/>
<el-table-column
label=
"负责人"
align=
"center"
prop=
"ownerUserId"
/>
<el-table-column
label=
"批次"
align=
"center"
prop=
"batchId"
/>
<!--<el-table-column label="显示顺序" align="center" prop="sort" />-->
<el-table-column
label=
"状态"
align=
"center"
prop=
"status"
>
<el-table-column
align=
"center"
label=
"回款金额(元)"
prop=
"price"
/>
<el-table-column
align=
"center"
label=
"负责人"
prop=
"ownerUserName"
/>
<el-table-column
align=
"center"
label=
"备注"
prop=
"remark"
/>
<el-table-column
align=
"center"
fixed=
"right"
label=
"回款状态"
prop=
"auditStatus"
width=
"120"
>
<
template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.C
OMMON_STATUS"
:value=
"scope.row.s
tatus"
/>
<dict-tag
:type=
"DICT_TYPE.C
RM_AUDIT_STATUS"
:value=
"scope.row.auditS
tatus"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"备注"
align=
"center"
prop=
"remark"
/>
<el-table-column
label=
"创建时间"
align=
"center"
prop=
"createTime"
:formatter=
"dateFormatter"
width=
"180px"
/>
<el-table-column
label=
"操作"
align=
"center"
width=
"180px"
>
<el-table-column
align=
"center"
fixed=
"right"
label=
"操作"
width=
"180px"
>
<
template
#
default=
"scope"
>
<!-- todo @liuhongfeng:用路径参数哈,receivableId -->
<!--
<router-link
:to=
"'/crm/receivable-plan?receivableId=' + scope.row.receivableId"
>
<el-button
link
type=
"primary"
>
详情
</el-button>
</router-link>
-->
<el-button
v-hasPermi=
"['crm:receivable:update']"
link
type=
"primary"
@
click=
"openForm('update', scope.row.id)"
v-hasPermi=
"['crm:receivable:update']"
>
编辑
</el-button>
<el-button
v-if=
"scope.row.auditStatus === 0"
v-hasPermi=
"['crm:receivable:update']"
link
type=
"primary"
@
click=
"handleSubmit(scope.row)"
>
提交审核
</el-button>
<el-button
v-else
v-hasPermi=
"['crm:receivable:update']"
link
type=
"primary"
@
click=
"handleProcessDetail(scope.row)"
>
查看审批
</el-button>
<el-button
v-hasPermi=
"['crm:receivable:delete']"
link
type=
"danger"
@
click=
"handleDelete(scope.row.id)"
v-hasPermi=
"['crm:receivable:delete']"
>
删除
</el-button>
...
...
@@ -120,9 +131,9 @@
</el-table>
<!-- 分页 -->
<Pagination
:total=
"total"
v-model:page=
"queryParams.pageNo"
v-model:limit=
"queryParams.pageSize"
v-model:page=
"queryParams.pageNo"
:total=
"total"
@
pagination=
"getList"
/>
</ContentWrap>
...
...
@@ -131,26 +142,27 @@
<ReceivableForm
ref=
"formRef"
@
success=
"getList"
/>
</template>
<
script
setup
lang=
"ts"
>
<
script
lang=
"ts"
setup
>
import
{
DICT_TYPE
}
from
'@/utils/dict'
import
{
dateFormatter
,
dateFormatter
2
}
from
'@/utils/formatTime'
import
{
dateFormatter2
}
from
'@/utils/formatTime'
import
download
from
'@/utils/download'
import
*
as
ReceivableApi
from
'@/api/crm/receivable'
import
ReceivableForm
from
'./ReceivableForm.vue'
import
*
as
CustomerApi
from
'@/api/crm/customer'
defineOptions
({
name
:
'Receivable'
})
const
message
=
useMessage
()
// 消息弹窗
const
{
t
}
=
useI18n
()
// 国际化
const
{
push
}
=
useRouter
()
// 路由
const
loading
=
ref
(
true
)
// 列表的加载中
const
total
=
ref
(
0
)
// 列表的总页数
const
list
=
ref
([])
// 列表的数据
const
queryParams
=
reactive
({
pageNo
:
1
,
pageSize
:
10
,
no
:
null
,
customerId
:
null
no
:
undefined
,
customerId
:
undefined
})
const
queryFormRef
=
ref
()
// 搜索的表单
const
exportLoading
=
ref
(
false
)
// 导出的加载中
...
...
@@ -198,6 +210,19 @@ const handleDelete = async (id: number) => {
}
catch
{}
}
/** 提交审核 **/
const
handleSubmit
=
async
(
row
:
ReceivableApi
.
ReceivableVO
)
=>
{
await
message
.
confirm
(
`您确定提交编号为【
${
row
.
no
}
】的回款审核吗?`
)
await
ReceivableApi
.
submitReceivable
(
row
.
id
)
message
.
success
(
'提交审核成功!'
)
await
getList
()
}
/** 查看审批 */
const
handleProcessDetail
=
(
row
:
ReceivableApi
.
ReceivableVO
)
=>
{
push
({
name
:
'BpmProcessInstanceDetail'
,
query
:
{
id
:
row
.
processInstanceId
}
})
}
// TODO puhui999: 回款流程审批表单详情查看后面完善
/** 导出按钮操作 */
const
handleExport
=
async
()
=>
{
try
{
...
...
@@ -212,9 +237,11 @@ const handleExport = async () => {
exportLoading
.
value
=
false
}
}
const
customerList
=
ref
<
CustomerApi
.
CustomerVO
[]
>
([])
// 客户列表
/** 初始化 **/
onMounted
(()
=>
{
getList
()
onMounted
(
async
()
=>
{
await
getList
()
// 获得客户列表
customerList
.
value
=
await
CustomerApi
.
getCustomerSimpleList
()
})
</
script
>
src/views/crm/receivable/plan/ReceivablePlanForm.vue
View file @
f30f71b7
<
template
>
<Dialog
:title=
"dialogTitle"
v-model=
"dialogVisib
le"
>
<Dialog
v-model=
"dialogVisible"
:title=
"dialogTit
le"
>
<el-form
ref=
"formRef"
v-loading=
"formLoading"
:model=
"formData"
:rules=
"formRules"
label-width=
"100px"
v-loading=
"formLoading"
label-width=
"110px"
>
<el-row>
<el-col
:span=
"12"
>
<el-form-item
label=
"客户名称"
prop=
"customerId"
>
<el-input
v-model=
"formData.customerId"
placeholder=
"请输入客户名称"
/>
</el-form-item>
<el-form-item
label=
"合同名称"
prop=
"contractId"
>
<el-input
v-model=
"formData.contractId"
placeholder=
"请输入合同名称"
/>
</el-form-item>
<el-form-item
label=
"负责人"
prop=
"ownerUserId"
>
<el-select
v-model=
"formData.ownerUserId"
clearable
placeholder=
"请输入负责人"
>
<el-select
v-model=
"formData.customerId"
class=
"w-1/1"
placeholder=
"请选择客户"
>
<el-option
v-for=
"item in us
erList"
v-for=
"item in custom
erList"
:key=
"item.id"
:label=
"item.nick
name"
:label=
"item.
name"
:value=
"item.id"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"期数"
prop=
"period"
>
<el-input-number
v-model=
"formData.period"
placeholder=
"请输入期数"
/>
</el-form-item>
<!--
<el-form-item
label=
"回款ID"
prop=
"receivableId"
>
<el-input
v-model=
"formData.receivableId"
placeholder=
"请输入回款ID"
/>
</el-form-item>
<el-form-item
label=
"完成状态"
prop=
"status"
>
<el-select
v-model=
"formData.status"
placeholder=
"请选择完成状态"
>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"合同名称"
prop=
"contractId"
>
<el-select
v-model=
"formData.contractId"
:disabled=
"!formData.customerId"
class=
"!w-100%"
placeholder=
"请选择合同"
>
<el-option
v-for=
"dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)
"
:key=
"dict.value
"
:label=
"dict.label
"
:value=
"dict.value
"
v-for=
"data in contractList
"
:key=
"data.id
"
:label=
"data.name
"
:value=
"data.id!
"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"审批状态"
prop=
"checkStatus"
>
<el-select
v-model=
"formData.checkStatus"
placeholder=
"请选择审批状态"
>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"负责人"
prop=
"ownerUserId"
>
<el-select
v-model=
"formData.ownerUserId"
clearable
placeholder=
"请输入负责人"
>
<el-option
v-for=
"dict in getStrDictOptions(DICT_TYPE.CRM_RECEIVABLE_CHECK_STATUS)
"
:key=
"dict.value
"
:label=
"dict.label
"
:value=
"dict.value
"
v-for=
"item in userList
"
:key=
"item.id
"
:label=
"item.nickname
"
:value=
"item.id
"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"工作流编号"
prop=
"processInstanceId"
>
<el-input
v-model=
"formData.processInstanceId"
placeholder=
"请输入工作流编号"
/>
</el-form-item>
-->
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"计划回款金额"
prop=
"price"
>
<el-input-number
v-model=
"formData.price"
placeholder=
"请输入计划回款金额"
/>
<el-input-number
v-model=
"formData.price"
class=
"!w-100%"
controls-position=
"right"
placeholder=
"请输入计划回款金额"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"计划回款日期"
prop=
"returnTime"
>
<el-date-picker
v-model=
"formData.returnTime"
placeholder=
"选择计划回款日期"
type=
"date"
value-format=
"x"
placeholder=
"选择计划回款日期"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"提前几天提醒"
prop=
"remindDays"
>
<el-input-number
v-model=
"formData.remindDays"
placeholder=
"请输入提前几天提醒"
/>
<el-input-number
v-model=
"formData.remindDays"
class=
"!w-100%"
controls-position=
"right"
placeholder=
"请输入提前几天提醒"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"提醒日期"
prop=
"remindTime"
>
<el-date-picker
v-model=
"formData.remindTime"
placeholder=
"选择提醒日期"
type=
"date"
value-format=
"x"
placeholder=
"选择提醒日期"
/>
</el-form-item>
<el-form-item
label=
"显示排序"
prop=
"sort"
>
<el-input-number
v-model=
"formData.sort"
:min=
"0"
controls-position=
"right"
/>
</el-form-item>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
label=
"备注"
prop=
"remark"
>
<el-input
type=
"textarea"
:rows=
"3"
v-model=
"formData.remark"
placeholder=
"请输入备注"
/>
<el-input
v-model=
"formData.remark"
:rows=
"3"
placeholder=
"请输入备注"
type=
"textarea"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template
#
footer
>
<el-button
@
click=
"submitForm"
type=
"primary"
:disabled=
"formLoading
"
>
确 定
</el-button>
<el-button
:disabled=
"formLoading"
type=
"primary"
@
click=
"submitForm
"
>
确 定
</el-button>
<el-button
@
click=
"dialogVisible = false"
>
取 消
</el-button>
</
template
>
</Dialog>
</template>
<
script
setup
lang=
"ts"
>
<
script
lang=
"ts"
setup
>
import
*
as
ReceivablePlanApi
from
'@/api/crm/receivable/plan'
import
*
as
UserApi
from
'@/api/system/user'
import
*
as
CustomerApi
from
'@/api/crm/customer'
import
*
as
ContractApi
from
'@/api/crm/contract'
import
{
useUserStore
}
from
'@/store/modules/user'
const
{
t
}
=
useI18n
()
// 国际化
const
message
=
useMessage
()
// 消息弹窗
const
userList
=
ref
<
UserApi
.
UserVO
[]
>
([])
// 用户列表
...
...
@@ -97,28 +121,18 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const
dialogTitle
=
ref
(
''
)
// 弹窗的标题
const
formLoading
=
ref
(
false
)
// 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const
formType
=
ref
(
''
)
// 表单的类型:create - 新增;update - 修改
const
formData
=
ref
({
id
:
undefined
,
period
:
undefined
,
receivableId
:
undefined
,
status
:
undefined
,
checkStatus
:
undefined
,
processInstanceId
:
undefined
,
price
:
undefined
,
returnTime
:
undefined
,
remindDays
:
undefined
,
remindTime
:
undefined
,
customerId
:
undefined
,
contractId
:
undefined
,
ownerUserId
:
undefined
,
sort
:
undefined
,
remark
:
undefined
})
const
formData
=
ref
<
ReceivablePlanApi
.
ReceivablePlanVO
>
({}
as
ReceivablePlanApi
.
ReceivablePlanVO
)
const
formRules
=
reactive
({
status
:
[{
required
:
true
,
message
:
'完成状态不能为空'
,
trigger
:
'change'
}]
price
:
[{
required
:
true
,
message
:
'计划回款金额不能为空'
,
trigger
:
'blur'
}],
returnTime
:
[{
required
:
true
,
message
:
'计划回款日期不能为空'
,
trigger
:
'blur'
}],
remindTime
:
[{
required
:
true
,
message
:
'提醒日期不能为空'
,
trigger
:
'blur'
}],
customerId
:
[{
required
:
true
,
message
:
'客户编号不能为空'
,
trigger
:
'blur'
}],
contractId
:
[{
required
:
true
,
message
:
'合同编号不能为空'
,
trigger
:
'blur'
}],
ownerUserId
:
[{
required
:
true
,
message
:
'负责人不能为空'
,
trigger
:
'blur'
}]
})
const
formRef
=
ref
()
// 表单 Ref
const
customerList
=
ref
<
CustomerApi
.
CustomerVO
[]
>
([])
// 客户列表
const
contractList
=
ref
<
ContractApi
.
ContractVO
[]
>
([])
// 合同列表
/** 打开弹窗 */
const
open
=
async
(
type
:
string
,
id
?:
number
)
=>
{
dialogVisible
.
value
=
true
...
...
@@ -137,9 +151,31 @@ const open = async (type: string, id?: number) => {
// 获得用户列表
userList
.
value
=
await
UserApi
.
getSimpleUserList
()
// 获得客户列表
customerList
.
value
=
await
CustomerApi
.
getCustomerSimpleList
()
// 默认新建时选中自己
if
(
formType
.
value
===
'create'
)
{
formData
.
value
.
ownerUserId
=
useUserStore
().
getUser
.
id
}
}
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
const
getContractList
=
async
(
customerId
:
number
)
=>
{
contractList
.
value
=
await
ContractApi
.
getCrmContractSimpleListByCustomerId
(
customerId
)
}
watch
(
()
=>
formData
.
value
.
customerId
,
(
newVal
)
=>
{
if
(
!
newVal
)
{
return
}
getContractList
(
newVal
)
},
{
immediate
:
true
}
)
/** 提交表单 */
const
emit
=
defineEmits
([
'success'
])
// 定义 success 事件,用于操作成功后的回调
const
submitForm
=
async
()
=>
{
...
...
@@ -168,23 +204,7 @@ const submitForm = async () => {
/** 重置表单 */
const
resetForm
=
()
=>
{
formData
.
value
=
{
id
:
undefined
,
period
:
undefined
,
receivableId
:
undefined
,
status
:
undefined
,
checkStatus
:
undefined
,
processInstanceId
:
undefined
,
price
:
undefined
,
returnTime
:
undefined
,
remindDays
:
undefined
,
remindTime
:
undefined
,
customerId
:
undefined
,
contractId
:
undefined
,
ownerUserId
:
undefined
,
sort
:
undefined
,
remark
:
undefined
}
formData
.
value
=
{}
as
ReceivablePlanApi
.
ReceivablePlanVO
formRef
.
value
?.
resetFields
()
}
</
script
>
src/views/crm/receivable/plan/components/ReceivablePlanList.vue
View file @
f30f71b7
...
...
@@ -9,43 +9,73 @@
<!-- 列表 -->
<ContentWrap
class=
"mt-10px"
>
<el-table
v-loading=
"loading"
:data=
"list"
:stripe=
"true"
:show-overflow-tooltip=
"true"
>
<el-table-column
label=
"期数"
fixed=
"left"
align=
"center"
prop=
"no"
>
<template
#
default=
"scope"
>
<el-link
type=
"primary"
:underline=
"false"
@
click=
"openDetail(scope.row.id)"
>
{{
scope
.
row
.
period
}}
</el-link>
</
template
>
</el-table-column>
<el-table-column
label=
"客户名称"
align=
"center"
prop=
"customerName"
/>
<el-table-column
label=
"合同编号"
align=
"center"
prop=
"contractNo"
/>
<el-table
v-loading=
"loading"
:data=
"list"
:show-overflow-tooltip=
"true"
:stripe=
"true"
>
<el-table-column
align=
"center"
label=
"客户名称"
prop=
"customerName"
width=
"150px"
/>
<el-table-column
align=
"center"
label=
"合同编号"
prop=
"contractNo"
width=
"200px"
/>
<el-table-column
align=
"center"
label=
"期数"
prop=
"period"
/>
<el-table-column
align=
"center"
label=
"计划回款(元)"
prop=
"price"
width=
"120"
/>
<el-table-column
label=
"计划还款金额(元)
"
:formatter=
"dateFormatter2
"
align=
"center"
prop=
"price"
:formatter=
"fenToYuanFormat"
label=
"计划回款日期"
prop=
"returnTime"
width=
"180px"
/>
<el-table-column
align=
"center"
label=
"提前几天提醒"
prop=
"remindDays"
width=
"150"
/>
<el-table-column
label=
"计划还款日期
"
:formatter=
"dateFormatter2
"
align=
"center"
prop=
"returnTime
"
:formatter=
"dateFormatter
"
label=
"提醒日期
"
prop=
"remindTime
"
width=
"180px"
/>
<el-table-column
align=
"center"
label=
"计划还款方式"
prop=
"auditStatus"
>
<el-table-column
label=
"负责人"
prop=
"ownerUserName"
width=
"120"
/>
<el-table-column
align=
"center"
label=
"备注"
prop=
"remark"
/>
<el-table-column
align=
"center"
fixed=
"right"
label=
"完成状态"
prop=
"finishStatus"
width=
"130px"
>
<template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.INFRA_BOOLEAN_STRING"
:value=
"scope.row.finishStatus"
/>
</
template
>
</el-table-column>
<el-table-column
align=
"center"
fixed=
"right"
label=
"操作"
width=
"200px"
>
<
template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.CRM_RECEIVABLE_RETURN_TYPE"
:value=
"scope.row.returnType"
/>
<el-button
v-hasPermi=
"['crm:receivable:create']"
link
type=
"primary"
@
click=
"crateReceivable(scope.row)"
>
创建回款
</el-button>
<el-button
v-hasPermi=
"['crm:receivable-plan:update']"
link
type=
"primary"
@
click=
"openForm('update', scope.row.id)"
>
编辑
</el-button>
<el-button
v-hasPermi=
"['crm:receivable-plan:delete']"
link
type=
"danger"
@
click=
"handleDelete(scope.row.id)"
>
删除
</el-button>
</
template
>
</el-table-column>
<el-table-column
label=
"提前几日提醒"
align=
"center"
prop=
"remindDays"
/>
<el-table-column
label=
"备注"
align=
"center"
prop=
"remark"
/>
<!-- TODO 芋艿:新建回款、编辑、删除 -->
</el-table>
<!-- 分页 -->
<Pagination
:total=
"total"
v-model:page=
"queryParams.pageNo"
v-model:limit=
"queryParams.pageSize"
v-model:page=
"queryParams.pageNo"
:total=
"total"
@
pagination=
"getList"
/>
</ContentWrap>
...
...
@@ -53,45 +83,42 @@
<!-- 表单弹窗:添加 -->
<ReceivableForm
ref=
"formRef"
@
success=
"getList"
/>
</template>
<
script
setup
lang=
"ts"
>
<
script
lang=
"ts"
setup
>
import
*
as
ReceivablePlanApi
from
'@/api/crm/receivable/plan'
import
ReceivableForm
from
'./../ReceivablePlanForm.vue'
import
{
BizTypeEnum
}
from
'@/api/crm/permission'
import
{
dateFormatter
}
from
'@/utils/formatTime'
import
{
fenToYuanFormat
}
from
'@/utils/formatter'
import
{
DICT_TYPE
}
from
'@/utils/dict'
import
{
dateFormatter2
}
from
'@/utils/formatTime'
defineOptions
({
name
:
'CrmReceivablePlanList'
})
const
props
=
defineProps
<
{
bizType
:
number
// 业务类型
bizId
:
number
// 业务
编号
customerId
?:
number
// 客户编号
contractId
?:
number
// 合同
编号
}
>
()
const
message
=
useMessage
()
// 消息弹窗
const
{
t
}
=
useI18n
()
// 国际化
const
loading
=
ref
(
true
)
// 列表的加载中
const
total
=
ref
(
0
)
// 列表的总页数
const
list
=
ref
([])
// 列表的数据
const
queryParams
=
reactive
({
pageNo
:
1
,
pageSize
:
10
,
customerId
:
undefined
as
unknown
// 允许 undefined + number
customerId
:
undefined
as
unknown
,
// 允许 undefined + number
contractId
:
undefined
as
unknown
// 允许 undefined + number
})
/** 查询列表 */
const
getList
=
async
()
=>
{
loading
.
value
=
true
try
{
// 置空参数
queryParams
.
customerId
=
undefined
// 执行查询
let
data
=
{
list
:
[],
total
:
0
}
switch
(
props
.
bizType
)
{
case
BizTypeEnum
.
CRM_CUSTOMER
:
queryParams
.
customerId
=
props
.
bizId
data
=
await
ReceivablePlanApi
.
getReceivablePlanPageByCustomer
(
queryParams
)
break
default
:
return
if
(
props
.
customerId
&&
!
props
.
contractId
)
{
queryParams
.
customerId
=
props
.
customerId
}
else
if
(
props
.
customerId
&&
props
.
contractId
)
{
// 如果是合同的话客户编号也需要带上因为权限基于客户
queryParams
.
customerId
=
props
.
customerId
queryParams
.
contractId
=
props
.
contractId
}
const
data
=
await
ReceivablePlanApi
.
getReceivablePlanPageByCustomer
(
queryParams
)
list
.
value
=
data
.
list
total
.
value
=
data
.
total
}
finally
{
...
...
@@ -102,25 +129,46 @@ const getList = async () => {
/** 搜索按钮操作 */
const
handleQuery
=
()
=>
{
queryParams
.
pageNo
=
1
// 置空参数
queryParams
.
customerId
=
undefined
queryParams
.
contractId
=
undefined
getList
()
}
/** 添加 */
/** 添加
/修改操作
*/
const
formRef
=
ref
()
const
openForm
=
()
=>
{
formRef
.
value
.
open
(
'create'
)
const
openForm
=
(
type
:
string
,
id
?:
number
)
=>
{
formRef
.
value
.
open
(
type
,
id
)
}
/** 打开合同详情 */
const
{
push
}
=
useRouter
()
const
openDetail
=
(
id
:
number
)
=>
{
push
({
name
:
'CrmReceivablePlanDetail'
,
params
:
{
id
}
})
const
emits
=
defineEmits
<
{
(
e
:
'crateReceivable'
,
v
:
ReceivablePlanApi
.
ReceivablePlanVO
)
}
>
()
/** 创建回款 */
const
crateReceivable
=
(
row
:
ReceivablePlanApi
.
ReceivablePlanVO
)
=>
{
emits
(
'crateReceivable'
,
row
)
}
/** 监听打开的 bizId + bizType,从而加载最新的列表 */
/** 删除按钮操作 */
const
handleDelete
=
async
(
id
:
number
)
=>
{
try
{
// 删除的二次确认
await
message
.
delConfirm
()
// 发起删除
await
ReceivablePlanApi
.
deleteReceivablePlan
(
id
)
message
.
success
(
t
(
'common.delSuccess'
))
// 刷新列表
await
getList
()
}
catch
{}
}
/** 监听打开的 customerId + contractId,从而加载最新的列表 */
watch
(
()
=>
[
props
.
bizId
,
props
.
bizType
],
()
=>
{
()
=>
[
props
.
customerId
,
props
.
contractId
],
(
newVal
)
=>
{
// 保证至少客户编号有值
if
(
!
newVal
[
0
])
{
return
}
handleQuery
()
},
{
immediate
:
true
,
deep
:
true
}
...
...
src/views/crm/receivable/plan/index.vue
View file @
f30f71b7
...
...
@@ -2,49 +2,63 @@
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class=
"-mb-15px"
:model=
"queryParams"
ref=
"queryFormRef"
:inline=
"true"
:model=
"queryParams"
class=
"-mb-15px"
label-width=
"68px"
>
<el-form-item
label=
"客户"
prop=
"customerId"
>
<el-
inpu
t
<el-form-item
label=
"客户
名称
"
prop=
"customerId"
>
<el-
selec
t
v-model=
"queryParams.customerId"
placeholder=
"请输入客户"
clearable
@
keyup
.
enter=
"handleQuery"
class=
"!w-240px"
placeholder=
"请选择客户"
@
keyup
.
enter=
"handleQuery"
>
<el-option
v-for=
"item in customerList"
:key=
"item.id"
:label=
"item.name"
:value=
"item.id"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"合同
"
prop=
"contractId
"
>
<el-form-item
label=
"合同
编号"
prop=
"contractNo
"
>
<el-input
v-model=
"queryParams.contract
Id
"
placeholder=
"请输入合同
"
v-model=
"queryParams.contract
No
"
class=
"!w-240px
"
clearable
placeholder=
"请输入合同编号"
@
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>
<el-button
@
click=
"handleQuery"
>
<Icon
class=
"mr-5px"
icon=
"ep:search"
/>
搜索
</el-button>
<el-button
@
click=
"resetQuery"
>
<Icon
class=
"mr-5px"
icon=
"ep:refresh"
/>
重置
</el-button>
<el-button
type=
"primary
"
v-hasPermi=
"['crm:receivable-plan:create']
"
plain
type=
"primary"
@
click=
"openForm('create')"
v-hasPermi=
"['crm:receivable-plan:create']"
>
<Icon
icon=
"ep:plus"
class=
"mr-5px"
/>
新增
<Icon
class=
"mr-5px"
icon=
"ep:plus"
/>
新增
</el-button>
<el-button
type=
"success"
v-hasPermi=
"['crm:receivable-plan:export']"
:loading=
"exportLoading"
plain
type=
"success"
@
click=
"handleExport"
:loading=
"exportLoading"
v-hasPermi=
"['crm:receivable-plan:export']"
>
<Icon
icon=
"ep:download"
class=
"mr-5px"
/>
导出
<Icon
class=
"mr-5px"
icon=
"ep:download"
/>
导出
</el-button>
</el-form-item>
</el-form>
...
...
@@ -52,68 +66,54 @@
<!-- 列表 -->
<ContentWrap>
<el-table
v-loading=
"loading"
:data=
"list"
:stripe=
"true"
:show-overflow-tooltip=
"true"
>
<!--
<el-table-column
label=
"ID"
align=
"center"
prop=
"id"
/>
-->
<el-table-column
label=
"客户名称"
align=
"center"
prop=
"customerId"
width=
"150px"
/>
<el-table-column
label=
"合同名称"
align=
"center"
prop=
"contractId"
width=
"150px"
/>
<el-table-column
label=
"期数"
align=
"center"
prop=
"period"
/>
<el-table-column
label=
"计划回款"
align=
"center"
prop=
"price"
/>
<el-table
v-loading=
"loading"
:data=
"list"
:show-overflow-tooltip=
"true"
:stripe=
"true"
>
<el-table-column
align=
"center"
label=
"客户名称"
prop=
"customerName"
width=
"150px"
/>
<el-table-column
align=
"center"
label=
"合同编号"
prop=
"contractNo"
width=
"200px"
/>
<el-table-column
align=
"center"
label=
"期数"
prop=
"period"
/>
<el-table-column
align=
"center"
label=
"计划回款(元)"
prop=
"price"
width=
"120"
/>
<el-table-column
label=
"计划回款日期
"
:formatter=
"dateFormatter2
"
align=
"center"
label=
"计划回款日期"
prop=
"returnTime"
:formatter=
"dateFormatter2"
width=
"180px"
/>
<el-table-column
label=
"提前几天提醒"
align=
"center"
prop=
"remindDays
"
/>
<
!--
<
el-table-column
label=
"提醒日期
"
<el-table-column
align=
"center"
label=
"提前几天提醒"
prop=
"remindDays"
width=
"150
"
/>
<el-table-column
:formatter=
"dateFormatter2
"
align=
"center"
label=
"提醒日期"
prop=
"remindTime"
:formatter=
"dateFormatter"
width=
"180px"
/>
-->
<!--
<el-table-column
label=
"回款ID"
align=
"center"
prop=
"receivableId"
/>
-->
<el-table-column
label=
"完成状态"
align=
"center"
prop=
"status"
>
<template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.COMMON_STATUS"
:value=
"scope.row.status"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"审批状态"
align=
"center"
prop=
"checkStatus"
width=
"130px"
>
/>
<el-table-column
label=
"负责人"
prop=
"ownerUserName"
width=
"120"
/>
<el-table-column
align=
"center"
label=
"备注"
prop=
"remark"
/>
<el-table-column
align=
"center"
fixed=
"right"
label=
"完成状态"
prop=
"finishStatus"
width=
"130px"
>
<template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.
CRM_AUDIT_STATUS"
:value=
"scope.row.check
Status"
/>
<dict-tag
:type=
"DICT_TYPE.
INFRA_BOOLEAN_STRING"
:value=
"scope.row.finish
Status"
/>
</
template
>
</el-table-column>
<!--<el-table-column label="工作流编号" align="center" prop="processInstanceId" />-->
<el-table-column
prop=
"ownerUserId"
label=
"负责人"
width=
"120"
>
<
template
#
default=
"scope"
>
{{
userList
.
find
((
user
)
=>
user
.
id
===
scope
.
row
.
ownerUserId
)?.
nickname
}}
</
template
>
</el-table-column>
<el-table-column
label=
"显示顺序"
align=
"center"
prop=
"sort"
/>
<el-table-column
label=
"备注"
align=
"center"
prop=
"remark"
/>
<el-table-column
label=
"创建时间"
align=
"center"
prop=
"createTime"
:formatter=
"dateFormatter"
width=
"180px"
/>
<el-table-column
label=
"操作"
align=
"center"
width=
"130px"
>
<el-table-column
align=
"center"
fixed=
"right"
label=
"操作"
width=
"130px"
>
<
template
#
default=
"scope"
>
<el-button
v-hasPermi=
"['crm:receivable-plan:update']"
link
type=
"primary"
@
click=
"openForm('update', scope.row.id)"
v-hasPermi=
"['crm:receivable-plan:update']"
>
编辑
</el-button>
<el-button
v-hasPermi=
"['crm:receivable-plan:delete']"
link
type=
"danger"
@
click=
"handleDelete(scope.row.id)"
v-hasPermi=
"['crm:receivable-plan:delete']"
>
删除
</el-button>
...
...
@@ -122,9 +122,9 @@
</el-table>
<!-- 分页 -->
<Pagination
:total=
"total"
v-model:page=
"queryParams.pageNo"
v-model:limit=
"queryParams.pageSize"
v-model:page=
"queryParams.pageNo"
:total=
"total"
@
pagination=
"getList"
/>
</ContentWrap>
...
...
@@ -133,13 +133,14 @@
<ReceivablePlanForm
ref=
"formRef"
@
success=
"getList"
/>
</template>
<
script
setup
lang=
"ts"
>
<
script
lang=
"ts"
setup
>
import
{
DICT_TYPE
}
from
'@/utils/dict'
import
{
dateFormatter
,
dateFormatter
2
}
from
'@/utils/formatTime'
import
{
dateFormatter2
}
from
'@/utils/formatTime'
import
download
from
'@/utils/download'
import
*
as
ReceivablePlanApi
from
'@/api/crm/receivable/plan'
import
ReceivablePlanForm
from
'./ReceivablePlanForm.vue'
import
*
as
UserApi
from
'@/api/system/user'
import
*
as
CustomerApi
from
'@/api/crm/customer'
defineOptions
({
name
:
'ReceivablePlan'
})
...
...
@@ -153,8 +154,8 @@ const userList = ref<UserApi.UserVO[]>([]) // 用户列表
const
queryParams
=
reactive
({
pageNo
:
1
,
pageSize
:
10
,
customerId
:
null
,
contract
Id
:
null
customerId
:
undefined
,
contract
No
:
undefined
})
const
queryFormRef
=
ref
()
// 搜索的表单
const
exportLoading
=
ref
(
false
)
// 导出的加载中
...
...
@@ -216,11 +217,13 @@ const handleExport = async () => {
exportLoading
.
value
=
false
}
}
const
customerList
=
ref
<
CustomerApi
.
CustomerVO
[]
>
([])
// 客户列表
/** 初始化 **/
onMounted
(
async
()
=>
{
await
getList
()
// 获取用户列表
userList
.
value
=
await
UserApi
.
getSimpleUserList
()
// 获得客户列表
customerList
.
value
=
await
CustomerApi
.
getCustomerSimpleList
()
})
</
script
>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment