Skip to content

Commit 5369328

Browse files
committed
✨ CRM:完善回款的新增/修改
1 parent 70bf234 commit 5369328

File tree

5 files changed

+122
-108
lines changed

5 files changed

+122
-108
lines changed

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ export interface ReceivablePlanVO {
44
id: number
55
period: number
66
receivableId: number
7-
finishStatus: number
87
price: number
98
returnTime: Date
109
remindDays: number
@@ -43,10 +42,9 @@ export const getReceivablePlan = async (id: number) => {
4342
}
4443

4544
// 查询回款计划下拉数据
46-
// TODO @芋艿:再看看这里
47-
export const getReceivablePlanListByContractId = async (customerId: number, contractId: number) => {
45+
export const getReceivablePlanSimpleList = async (customerId: number, contractId: number) => {
4846
return await request.get({
49-
url: `/crm/receivable-plan/list-all-simple-by-customer?customerId=${customerId}&contractId=${contractId}`
47+
url: `/crm/receivable-plan/simple-list?customerId=${customerId}&contractId=${contractId}`
5048
})
5149
}
5250

src/views/crm/receivable/ReceivableForm.vue

Lines changed: 100 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,37 @@
1010
<el-row>
1111
<el-col :span="12">
1212
<el-form-item label="回款编号" prop="no">
13-
<el-input v-model="formData.no" placeholder="请输入回款编号" />
13+
<el-input disabled v-model="formData.no" placeholder="保存时自动生成" />
1414
</el-form-item>
1515
</el-col>
16+
<el-col :span="12">
17+
<el-form-item label="负责人" prop="ownerUserId">
18+
<el-select
19+
v-model="formData.ownerUserId"
20+
:disabled="formType !== 'create'"
21+
class="w-1/1"
22+
>
23+
<el-option
24+
v-for="item in userOptions"
25+
:key="item.id"
26+
:label="item.nickname"
27+
:value="item.id"
28+
/>
29+
</el-select>
30+
</el-form-item>
31+
</el-col>
32+
</el-row>
33+
<el-row>
1634
<el-col :span="12">
1735
<el-form-item label="客户名称" prop="customerId">
18-
<el-select v-model="formData.customerId" class="w-1/1" placeholder="请选择客户">
36+
<el-select
37+
v-model="formData.customerId"
38+
:disabled="formType !== 'create'"
39+
class="w-1/1"
40+
filterable
41+
@change="handleCustomerChange"
42+
placeholder="请选择客户"
43+
>
1944
<el-option
2045
v-for="item in customerList"
2146
:key="item.id"
@@ -29,51 +54,46 @@
2954
<el-form-item label="合同名称" prop="contractId">
3055
<el-select
3156
v-model="formData.contractId"
32-
:disabled="!formData.customerId"
33-
class="!w-100%"
57+
:disabled="formType !== 'create' || !formData.customerId"
58+
class="w-1/1"
59+
filterable
60+
@change="handleContractChange"
3461
placeholder="请选择合同"
3562
>
3663
<el-option
3764
v-for="data in contractList"
3865
:key="data.id"
3966
:label="data.name"
4067
:value="data.id!"
68+
:disabled="data.auditStatus !== 20"
4169
/>
4270
</el-select>
4371
</el-form-item>
4472
</el-col>
73+
</el-row>
74+
<el-row>
4575
<el-col :span="12">
4676
<el-form-item label="回款期数" prop="planId">
4777
<el-select
4878
v-model="formData.planId"
49-
:disabled="!formData.contractId"
50-
class="!w-100%"
79+
:disabled="formType !== 'create' || !formData.contractId"
80+
class="!w-1/1"
81+
@change="handleReceivablePlanChange"
5182
placeholder="请选择回款期数"
5283
>
5384
<el-option
5485
v-for="data in receivablePlanList"
5586
:key="data.id"
56-
:label="data.period + '期'"
87+
:label="'第 ' + data.period + ' 期'"
5788
: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"
89+
:disabled="data.receivableId"
7090
/>
7191
</el-select>
7292
</el-form-item>
7393
</el-col>
7494
<el-col :span="12">
7595
<el-form-item label="回款方式" prop="returnType">
76-
<el-select v-model="formData.returnType" placeholder="请选择回款方式">
96+
<el-select v-model="formData.returnType" class="w-1/1" placeholder="请选择回款方式">
7797
<el-option
7898
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_RECEIVABLE_RETURN_TYPE)"
7999
:key="dict.value"
@@ -83,13 +103,17 @@
83103
</el-select>
84104
</el-form-item>
85105
</el-col>
106+
</el-row>
107+
<el-row>
86108
<el-col :span="12">
87109
<el-form-item label="回款金额" prop="price">
88110
<el-input-number
89111
v-model="formData.price"
90112
class="!w-100%"
91113
controls-position="right"
92114
placeholder="请输入回款金额"
115+
:min="0.01"
116+
:precision="2"
93117
/>
94118
</el-form-item>
95119
</el-col>
@@ -103,14 +127,11 @@
103127
/>
104128
</el-form-item>
105129
</el-col>
130+
</el-row>
131+
<el-row>
106132
<el-col :span="24">
107133
<el-form-item label="备注" prop="remark">
108-
<el-input
109-
v-model="formData.remark"
110-
:rows="3"
111-
placeholder="请输入备注"
112-
type="textarea"
113-
/>
134+
<el-input v-model="formData.remark" placeholder="请输入备注" type="textarea" />
114135
</el-form-item>
115136
</el-col>
116137
</el-row>
@@ -129,29 +150,33 @@ import * as CustomerApi from '@/api/crm/customer'
129150
import * as ContractApi from '@/api/crm/contract'
130151
import { useUserStore } from '@/store/modules/user'
131152
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
153+
import form from '@/components/Form/src/Form.vue'
132154
133155
const { t } = useI18n() // 国际化
134156
const message = useMessage() // 消息弹窗
135-
const userList = ref<UserApi.UserVO[]>([]) // 用户列表
157+
const userOptions = ref<UserApi.UserVO[]>([]) // 用户列表
136158
const dialogVisible = ref(false) // 弹窗的是否展示
137159
const dialogTitle = ref('') // 弹窗的标题
138160
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
139161
const formType = ref('') // 表单的类型:create - 新增;update - 修改
140162
const formData = ref<ReceivableApi.ReceivableVO>({} as ReceivableApi.ReceivableVO)
141163
const formRules = reactive({
142-
no: [{ required: true, message: '回款编号不能为空', trigger: 'blur' }],
143164
customerId: [{ required: true, message: '客户不能为空', trigger: 'blur' }],
144165
contractId: [{ required: true, message: '合同不能为空', trigger: 'blur' }],
145-
auditStatus: [{ required: true, message: '审批状态不能为空', trigger: 'blur' }],
146166
returnTime: [{ required: true, message: '回款日期不能为空', trigger: 'blur' }],
147167
price: [{ required: true, message: '回款金额不能为空', trigger: 'blur' }]
148168
})
149169
const formRef = ref() // 表单 Ref
150170
const customerList = ref<CustomerApi.CustomerVO[]>([]) // 客户列表
151171
const contractList = ref<ContractApi.ContractVO[]>([]) // 合同列表
152172
const receivablePlanList = ref<ReceivablePlanApi.ReceivablePlanVO[]>([]) // 回款计划列表
173+
153174
/** 打开弹窗 */
154-
const open = async (type: string, id?: number, planData?: ReceivablePlanApi.ReceivablePlanVO) => {
175+
const open = async (
176+
type: string,
177+
id?: number,
178+
receivablePlan?: ReceivablePlanApi.ReceivablePlanVO
179+
) => {
155180
dialogVisible.value = true
156181
dialogTitle.value = t('action.' + type)
157182
formType.value = type
@@ -166,18 +191,20 @@ const open = async (type: string, id?: number, planData?: ReceivablePlanApi.Rece
166191
}
167192
}
168193
// 获得用户列表
169-
userList.value = await UserApi.getSimpleUserList()
194+
userOptions.value = await UserApi.getSimpleUserList()
170195
// 获得客户列表
171196
customerList.value = await CustomerApi.getCustomerSimpleList()
172197
// 默认新建时选中自己
173198
if (formType.value === 'create') {
174199
formData.value.ownerUserId = useUserStore().getUser.id
175200
}
176201
// 从回款计划创建回款
177-
if (planData) {
178-
formData.value.customerId = planData.customerId
179-
formData.value.contractId = planData.contractId
180-
formData.value.planId = planData.id
202+
if (receivablePlan) {
203+
formData.value.customerId = receivablePlan.customerId
204+
formData.value.contractId = receivablePlan.contractId
205+
formData.value.planId = receivablePlan.id
206+
formData.value.price = receivablePlan.price
207+
formData.value.returnType = receivablePlan.returnType
181208
}
182209
}
183210
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
@@ -214,53 +241,47 @@ const resetForm = () => {
214241
formRef.value?.resetFields()
215242
}
216243
217-
const getContractList = async (customerId: number) => {
218-
contractList.value = await ContractApi.getContractSimpleList(customerId)
219-
}
220-
const getReceivablePlanList = async (contractId: number) => {
221-
receivablePlanList.value = await ReceivablePlanApi.getReceivablePlanListByContractId(
222-
formData.value.customerId,
223-
contractId
224-
)
244+
/** 处理切换客户 */
245+
const handleCustomerChange = async (customerId: number) => {
246+
// 重置合同编号
247+
formData.value.contractId = undefined
248+
// 获得合同列表
249+
if (customerId) {
250+
contractList.value = []
251+
contractList.value = await ContractApi.getContractSimpleList(customerId)
252+
}
225253
}
226-
watch(
227-
() => formData.value.customerId,
228-
(newVal) => {
229-
if (!newVal) {
230-
return
254+
255+
/** 处理切换合同 */
256+
const handleContractChange = async (contractId: number) => {
257+
// 重置回款计划编号
258+
formData.value.planId = undefined
259+
if (contractId) {
260+
// 获得回款计划列表
261+
receivablePlanList.value = []
262+
receivablePlanList.value = await ReceivablePlanApi.getReceivablePlanSimpleList(
263+
formData.value.customerId,
264+
contractId
265+
)
266+
// 设置金额
267+
const contract = contractList.value.find((item) => item.id === contractId)
268+
if (contract) {
269+
// TODO @芋艿:后续可以改成未还款金额
270+
formData.value.price = contract.totalPrice
231271
}
232-
getContractList(newVal)
233-
},
234-
{
235-
immediate: true
236272
}
237-
)
238-
watch(
239-
() => formData.value.contractId,
240-
(newVal) => {
241-
if (!newVal) {
242-
return
243-
}
244-
getReceivablePlanList(newVal)
245-
},
246-
{
247-
immediate: true
273+
}
274+
275+
/** 处理切换回款计划 */
276+
const handleReceivablePlanChange = (planId: number) => {
277+
if (!planId) {
278+
return
248279
}
249-
)
250-
watch(
251-
() => formData.value.planId,
252-
(newVal) => {
253-
if (!newVal) {
254-
return
255-
}
256-
const receivablePlan = receivablePlanList.value.find((item) => item.id === newVal)
257-
if (!receivablePlan) {
258-
return
259-
}
260-
// 只有没有金额的时候才设置
261-
if (!formData.value.price || formData.value.price === 0) {
262-
formData.value.price = receivablePlan.price
263-
}
280+
const receivablePlan = receivablePlanList.value.find((item) => item.id === planId)
281+
if (!receivablePlan) {
282+
return
264283
}
265-
)
284+
formData.value.price = receivablePlan.price
285+
formData.value.returnType = receivablePlan.returnType
286+
}
266287
</script>

src/views/crm/receivable/index.vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,6 @@
195195
<!-- 表单弹窗:添加/修改 -->
196196
<ReceivableForm ref="formRef" @success="getList" />
197197
</template>
198-
199198
<script lang="ts" setup>
200199
import { DICT_TYPE } from '@/utils/dict'
201200
import { dateFormatter, dateFormatter2 } from '@/utils/formatTime'

src/views/crm/receivable/plan/components/ReceivablePlanList.vue

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,6 @@
3131
/>
3232
<el-table-column label="负责人" prop="ownerUserName" width="120" />
3333
<el-table-column align="center" label="备注" prop="remark" />
34-
<el-table-column
35-
align="center"
36-
fixed="right"
37-
label="完成状态"
38-
prop="finishStatus"
39-
width="130px"
40-
>
41-
<template #default="scope">
42-
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.finishStatus" />
43-
</template>
44-
</el-table-column>
4534
<el-table-column align="center" fixed="right" label="操作" width="200px">
4635
<template #default="scope">
4736
<el-button
@@ -141,6 +130,7 @@ const openForm = (type: string, id?: number) => {
141130
formRef.value.open(type, id)
142131
}
143132
133+
// todo @puhui999:拼写错误
144134
const emits = defineEmits<{
145135
(e: 'crateReceivable', v: ReceivablePlanApi.ReceivablePlanVO)
146136
}>()
@@ -161,6 +151,7 @@ const handleDelete = async (id: number) => {
161151
await getList()
162152
} catch {}
163153
}
154+
164155
/** 监听打开的 customerId + contractId,从而加载最新的列表 */
165156
watch(
166157
() => [props.customerId, props.contractId],

0 commit comments

Comments
 (0)