Skip to content

Commit 41e5cf6

Browse files
author
puhui999
committed
CRM:完善回款
1 parent 6725318 commit 41e5cf6

File tree

5 files changed

+286
-187
lines changed

5 files changed

+286
-187
lines changed

src/api/crm/receivable/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ export interface ReceivableVO {
1212
returnType: string
1313
price: number
1414
ownerUserId: number
15-
sort: number
1615
remark: string
1716
}
1817

@@ -50,3 +49,8 @@ export const deleteReceivable = async (id: number) => {
5049
export const exportReceivable = async (params) => {
5150
return await request.download({ url: `/crm/receivable/export-excel`, params })
5251
}
52+
53+
// 提交审核
54+
export const submitReceivable = async (id: number) => {
55+
return await request.put({ url: `/crm/receivable/submit?id=${id}` })
56+
}

src/api/crm/receivable/plan/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ export const getReceivablePlan = async (id: number) => {
3131
return await request.get({ url: `/crm/receivable-plan/get?id=` + id })
3232
}
3333

34+
// 查询回款计划下拉数据
35+
export const getReceivablePlanListByContractId = async (customerId: number, contractId: number) => {
36+
return await request.get({
37+
url: `/crm/receivable-plan/list-all-simple-by-customer?customerId=${customerId}&contractId=${contractId}`
38+
})
39+
}
40+
3441
// 新增回款计划
3542
export const createReceivablePlan = async (data: ReceivablePlanVO) => {
3643
return await request.post({ url: `/crm/receivable-plan/create`, data })
Lines changed: 181 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -1,98 +1,134 @@
11
<template>
2-
<Dialog :title="dialogTitle" v-model="dialogVisible">
2+
<Dialog v-model="dialogVisible" :title="dialogTitle">
33
<el-form
44
ref="formRef"
5+
v-loading="formLoading"
56
:model="formData"
67
:rules="formRules"
78
label-width="100px"
8-
v-loading="formLoading"
99
>
10-
<el-form-item label="回款编号" prop="no">
11-
<el-input v-model="formData.no" placeholder="请输入回款编号" />
12-
</el-form-item>
13-
<el-form-item label="回款计划" prop="planId">
14-
<el-input v-model="formData.planId" placeholder="请输入回款计划" />
15-
</el-form-item>
16-
<el-form-item label="客户名称" prop="customerId">
17-
<el-input v-model="formData.customerId" placeholder="请输入客户名称" />
18-
</el-form-item>
19-
<el-form-item label="合同名称" prop="contractId">
20-
<el-input v-model="formData.contractId" placeholder="请输入合同名称" />
21-
</el-form-item>
22-
<!--<el-form-item label="审批状态" prop="checkStatus">
23-
<el-select v-model="formData.checkStatus" placeholder="请选择审批状态">
24-
<el-option
25-
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_RECEIVABLE_CHECK_STATUS)"
26-
:key="dict.value"
27-
:label="dict.label"
28-
:value="dict.value"
29-
/>
30-
</el-select>
31-
</el-form-item>-->
32-
<!--<el-form-item label="工作流编号" prop="processInstanceId">
33-
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" />
34-
</el-form-item>-->
35-
<el-form-item label="回款日期" prop="returnTime">
36-
<el-date-picker
37-
v-model="formData.returnTime"
38-
type="date"
39-
value-format="x"
40-
placeholder="选择回款日期"
41-
/>
42-
</el-form-item>
43-
<el-form-item label="回款方式" prop="returnType">
44-
<el-select v-model="formData.returnType" placeholder="请选择回款方式">
45-
<el-option
46-
v-for="dict in getStrDictOptions(DICT_TYPE.CRM_RECEIVABLE_RETURN_TYPE)"
47-
:key="dict.value"
48-
:label="dict.label"
49-
:value="dict.value"
50-
/>
51-
</el-select>
52-
</el-form-item>
53-
<el-form-item label="回款金额" prop="price">
54-
<el-input-number v-model="formData.price" placeholder="请输入回款金额" />
55-
</el-form-item>
56-
<el-form-item label="负责人" prop="ownerUserId">
57-
<el-select v-model="formData.ownerUserId" clearable placeholder="请输入负责人">
58-
<el-option
59-
v-for="item in userList"
60-
:key="item.id"
61-
:label="item.nickname"
62-
:value="item.id"
63-
/>
64-
</el-select>
65-
</el-form-item>
66-
<el-form-item label="批次" prop="batchId">
67-
<el-input-number v-model="formData.batchId" placeholder="请输入批次" />
68-
</el-form-item>
69-
<el-form-item label="显示排序" prop="sort">
70-
<el-input-number v-model="formData.sort" :min="0" controls-position="right" />
71-
</el-form-item>
72-
<!--<el-form-item label="状态" prop="status">
73-
<el-select v-model="formData.status" placeholder="请选择状态">
74-
<el-option
75-
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
76-
:key="dict.value"
77-
:label="dict.label"
78-
:value="dict.value"
79-
/>
80-
</el-select>
81-
</el-form-item>-->
82-
<el-form-item label="备注" prop="remark">
83-
<el-input type="textarea" :rows="3" v-model="formData.remark" placeholder="请输入备注" />
84-
</el-form-item>
10+
<el-row>
11+
<el-col :span="12">
12+
<el-form-item label="回款编号" prop="no">
13+
<el-input v-model="formData.no" placeholder="请输入回款编号" />
14+
</el-form-item>
15+
</el-col>
16+
<el-col :span="12">
17+
<el-form-item label="客户名称" prop="customerId">
18+
<el-select v-model="formData.customerId" class="w-1/1" placeholder="请选择客户">
19+
<el-option
20+
v-for="item in customerList"
21+
:key="item.id"
22+
:label="item.name"
23+
:value="item.id"
24+
/>
25+
</el-select>
26+
</el-form-item>
27+
</el-col>
28+
<el-col :span="12">
29+
<el-form-item label="合同名称" prop="contractId">
30+
<el-select
31+
v-model="formData.contractId"
32+
:disabled="!formData.customerId"
33+
class="!w-100%"
34+
placeholder="请选择合同"
35+
>
36+
<el-option
37+
v-for="data in contractList"
38+
:key="data.id"
39+
:label="data.name"
40+
:value="data.id!"
41+
/>
42+
</el-select>
43+
</el-form-item>
44+
</el-col>
45+
<el-col :span="12">
46+
<el-form-item label="回款期数" prop="planId">
47+
<el-select
48+
v-model="formData.planId"
49+
:disabled="!formData.contractId"
50+
class="!w-100%"
51+
placeholder="请选择回款期数"
52+
>
53+
<el-option
54+
v-for="data in receivablePlanList"
55+
:key="data.id"
56+
:label="data.period + '期'"
57+
:value="data.id!"
58+
/>
59+
</el-select>
60+
</el-form-item>
61+
</el-col>
62+
<el-col :span="12">
63+
<el-form-item label="负责人" prop="ownerUserId">
64+
<el-select v-model="formData.ownerUserId" clearable placeholder="请输入负责人">
65+
<el-option
66+
v-for="item in userList"
67+
:key="item.id"
68+
:label="item.nickname"
69+
:value="item.id"
70+
/>
71+
</el-select>
72+
</el-form-item>
73+
</el-col>
74+
<el-col :span="12">
75+
<el-form-item label="回款方式" prop="returnType">
76+
<el-select v-model="formData.returnType" placeholder="请选择回款方式">
77+
<el-option
78+
v-for="dict in getStrDictOptions(DICT_TYPE.CRM_RECEIVABLE_RETURN_TYPE)"
79+
:key="dict.value"
80+
:label="dict.label"
81+
:value="dict.value"
82+
/>
83+
</el-select>
84+
</el-form-item>
85+
</el-col>
86+
<el-col :span="12">
87+
<el-form-item label="回款金额" prop="price">
88+
<el-input-number
89+
v-model="formData.price"
90+
class="!w-100%"
91+
controls-position="right"
92+
placeholder="请输入回款金额"
93+
/>
94+
</el-form-item>
95+
</el-col>
96+
<el-col :span="12">
97+
<el-form-item label="回款日期" prop="returnTime">
98+
<el-date-picker
99+
v-model="formData.returnTime"
100+
placeholder="选择回款日期"
101+
type="date"
102+
value-format="x"
103+
/>
104+
</el-form-item>
105+
</el-col>
106+
<el-col :span="24">
107+
<el-form-item label="备注" prop="remark">
108+
<el-input
109+
v-model="formData.remark"
110+
:rows="3"
111+
placeholder="请输入备注"
112+
type="textarea"
113+
/>
114+
</el-form-item>
115+
</el-col>
116+
</el-row>
85117
</el-form>
86118
<template #footer>
87-
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
119+
<el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
88120
<el-button @click="dialogVisible = false">取 消</el-button>
89121
</template>
90122
</Dialog>
91123
</template>
92-
<script setup lang="ts">
93-
import { DICT_TYPE, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
124+
<script lang="ts" setup>
125+
import * as ReceivablePlanApi from '@/api/crm/receivable/plan'
94126
import * as ReceivableApi from '@/api/crm/receivable'
95127
import * as UserApi from '@/api/system/user'
128+
import * as CustomerApi from '@/api/crm/customer'
129+
import * as ContractApi from '@/api/crm/contract'
130+
import { useUserStore } from '@/store/modules/user'
131+
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
96132
97133
const { t } = useI18n() // 国际化
98134
const message = useMessage() // 消息弹窗
@@ -101,29 +137,19 @@ const dialogVisible = ref(false) // 弹窗的是否展示
101137
const dialogTitle = ref('') // 弹窗的标题
102138
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
103139
const formType = ref('') // 表单的类型:create - 新增;update - 修改
104-
const formData = ref({
105-
id: undefined,
106-
no: undefined,
107-
planId: undefined,
108-
customerId: undefined,
109-
contractId: undefined,
110-
checkStatus: undefined,
111-
processInstanceId: undefined,
112-
returnTime: undefined,
113-
returnType: undefined,
114-
price: undefined,
115-
ownerUserId: undefined,
116-
batchId: undefined,
117-
sort: undefined,
118-
dataScope: undefined,
119-
dataScopeDeptIds: undefined,
120-
status: undefined,
121-
remark: undefined
140+
const formData = ref<ReceivableApi.ReceivableVO>({} as ReceivableApi.ReceivableVO)
141+
const formRules = reactive({
142+
no: [{ required: true, message: '回款编号不能为空', trigger: 'blur' }],
143+
customerId: [{ required: true, message: '客户不能为空', trigger: 'blur' }],
144+
contractId: [{ required: true, message: '合同不能为空', trigger: 'blur' }],
145+
auditStatus: [{ required: true, message: '审批状态不能为空', trigger: 'blur' }],
146+
returnTime: [{ required: true, message: '回款日期不能为空', trigger: 'blur' }],
147+
price: [{ required: true, message: '回款金额不能为空', trigger: 'blur' }]
122148
})
123-
// const formRules = reactive({
124-
// status: [{ required: true, message: '状态不能为空', trigger: 'change' }]
125-
// })
126149
const formRef = ref() // 表单 Ref
150+
const customerList = ref<CustomerApi.CustomerVO[]>([]) // 客户列表
151+
const contractList = ref<ContractApi.ContractVO[]>([]) // 合同列表
152+
const receivablePlanList = ref<ReceivablePlanApi.ReceivablePlanVO[]>([]) // 回款计划列表
127153
128154
/** 打开弹窗 */
129155
const open = async (type: string, id?: number) => {
@@ -142,6 +168,12 @@ const open = async (type: string, id?: number) => {
142168
}
143169
// 获得用户列表
144170
userList.value = await UserApi.getSimpleUserList()
171+
// 获得客户列表
172+
customerList.value = await CustomerApi.getCustomerSimpleList()
173+
// 默认新建时选中自己
174+
if (formType.value === 'create') {
175+
formData.value.ownerUserId = useUserStore().getUser.id
176+
}
145177
}
146178
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
147179
@@ -173,25 +205,54 @@ const submitForm = async () => {
173205
174206
/** 重置表单 */
175207
const resetForm = () => {
176-
formData.value = {
177-
id: undefined,
178-
no: undefined,
179-
planId: undefined,
180-
customerId: undefined,
181-
contractId: undefined,
182-
checkStatus: undefined,
183-
processInstanceId: undefined,
184-
returnTime: undefined,
185-
returnType: undefined,
186-
price: undefined,
187-
ownerUserId: undefined,
188-
batchId: undefined,
189-
sort: undefined,
190-
dataScope: undefined,
191-
dataScopeDeptIds: undefined,
192-
status: undefined,
193-
remark: undefined
194-
}
208+
formData.value = {} as ReceivableApi.ReceivableVO
195209
formRef.value?.resetFields()
196210
}
211+
212+
const getContractList = async (customerId: number) => {
213+
contractList.value = await ContractApi.getCrmContractSimpleListByCustomerId(customerId)
214+
}
215+
const getReceivablePlanList = async (contractId: number) => {
216+
receivablePlanList.value = await ReceivablePlanApi.getReceivablePlanListByContractId(
217+
formData.value.customerId,
218+
contractId
219+
)
220+
}
221+
watch(
222+
() => formData.value.customerId,
223+
(newVal) => {
224+
if (!newVal) {
225+
return
226+
}
227+
getContractList(newVal)
228+
},
229+
{
230+
immediate: true
231+
}
232+
)
233+
watch(
234+
() => formData.value.contractId,
235+
(newVal) => {
236+
if (!newVal) {
237+
return
238+
}
239+
getReceivablePlanList(newVal)
240+
},
241+
{
242+
immediate: true
243+
}
244+
)
245+
watch(
246+
() => formData.value.planId,
247+
(newVal) => {
248+
if (!newVal) {
249+
return
250+
}
251+
const receivablePlan = receivablePlanList.value.find((item) => item.id === newVal)
252+
// 只有没有金额的时候才设置
253+
if (!formData.value.price || formData.value.price === 0) {
254+
formData.value.price = receivablePlan!.price
255+
}
256+
}
257+
)
197258
</script>

0 commit comments

Comments
 (0)