Skip to content

Commit 26780c3

Browse files
committed
【新增】回款计划 功能
1 parent 7ad1457 commit 26780c3

File tree

3 files changed

+556
-0
lines changed

3 files changed

+556
-0
lines changed

src/api/crm/receivablePlan/index.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import request from '@/config/axios'
2+
3+
export interface ReceivablePlanVO {
4+
id: number
5+
indexNo: number
6+
receivableId: number
7+
status: number
8+
checkStatus: string
9+
processInstanceId: number
10+
price: number
11+
returnTime: Date
12+
remindDays: number
13+
remindTime: Date
14+
customerId: number
15+
contractId: number
16+
ownerUserId: number
17+
sort: number
18+
remark: string
19+
}
20+
21+
// 查询回款计划列表
22+
export const getReceivablePlanPage = async (params) => {
23+
return await request.get({ url: `/crm/receivable-plan/page`, params })
24+
}
25+
26+
// 查询回款计划详情
27+
export const getReceivablePlan = async (id: number) => {
28+
return await request.get({ url: `/crm/receivable-plan/get?id=` + id })
29+
}
30+
31+
// 新增回款计划
32+
export const createReceivablePlan = async (data: ReceivablePlanVO) => {
33+
return await request.post({ url: `/crm/receivable-plan/create`, data })
34+
}
35+
36+
// 修改回款计划
37+
export const updateReceivablePlan = async (data: ReceivablePlanVO) => {
38+
return await request.put({ url: `/crm/receivable-plan/update`, data })
39+
}
40+
41+
// 删除回款计划
42+
export const deleteReceivablePlan = async (id: number) => {
43+
return await request.delete({ url: `/crm/receivable-plan/delete?id=` + id })
44+
}
45+
46+
// 导出回款计划 Excel
47+
export const exportReceivablePlan = async (params) => {
48+
return await request.download({ url: `/crm/receivable-plan/export-excel`, params })
49+
}
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
<template>
2+
<Dialog :title="dialogTitle" v-model="dialogVisible">
3+
<el-form
4+
ref="formRef"
5+
:model="formData"
6+
:rules="formRules"
7+
label-width="100px"
8+
v-loading="formLoading"
9+
>
10+
<el-form-item label="期数" prop="indexNo">
11+
<el-input-number v-model="formData.indexNo" placeholder="请输入期数" />
12+
</el-form-item>
13+
<!--<el-form-item label="回款ID" prop="receivableId">
14+
<el-input v-model="formData.receivableId" placeholder="请输入回款ID" />
15+
</el-form-item>
16+
<el-form-item label="完成状态" prop="status">
17+
<el-select v-model="formData.status" placeholder="请选择完成状态">
18+
<el-option
19+
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
20+
:key="dict.value"
21+
:label="dict.label"
22+
:value="dict.value"
23+
/>
24+
</el-select>
25+
</el-form-item>
26+
<el-form-item label="审批状态" prop="checkStatus">
27+
<el-select v-model="formData.checkStatus" placeholder="请选择审批状态">
28+
<el-option
29+
v-for="dict in getStrDictOptions(DICT_TYPE.CRM_RECEIVABLE_CHECK_STATUS)"
30+
:key="dict.value"
31+
:label="dict.label"
32+
:value="dict.value"
33+
/>
34+
</el-select>
35+
</el-form-item>
36+
<el-form-item label="工作流编号" prop="processInstanceId">
37+
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" />
38+
</el-form-item>-->
39+
<el-form-item label="计划回款金额" prop="price">
40+
<el-input-number v-model="formData.price" placeholder="请输入计划回款金额" />
41+
</el-form-item>
42+
<el-form-item label="计划回款日期" prop="returnTime">
43+
<el-date-picker
44+
v-model="formData.returnTime"
45+
type="date"
46+
value-format="x"
47+
placeholder="选择计划回款日期"
48+
/>
49+
</el-form-item>
50+
<el-form-item label="提前几天提醒" prop="remindDays">
51+
<el-input-number v-model="formData.remindDays" placeholder="请输入提前几天提醒" />
52+
</el-form-item>
53+
<el-form-item label="提醒日期" prop="remindTime">
54+
<el-date-picker
55+
v-model="formData.remindTime"
56+
type="date"
57+
value-format="x"
58+
placeholder="选择提醒日期"
59+
/>
60+
</el-form-item>
61+
<el-form-item label="客户ID" prop="customerId">
62+
<el-input v-model="formData.customerId" placeholder="请输入客户ID" />
63+
</el-form-item>
64+
<el-form-item label="合同ID" prop="contractId">
65+
<el-input v-model="formData.contractId" placeholder="请输入合同ID" />
66+
</el-form-item>
67+
<el-form-item label="负责人" prop="ownerUserId">
68+
<el-input v-model="formData.ownerUserId" placeholder="请输入负责人" />
69+
</el-form-item>
70+
<!--<el-form-item label="显示顺序" prop="sort">
71+
<el-input v-model="formData.sort" placeholder="请输入显示顺序" />
72+
</el-form-item>-->
73+
<el-form-item label="备注" prop="remark">
74+
<el-input type="textarea" :rows="3" v-model="formData.remark" placeholder="请输入备注" />
75+
</el-form-item>
76+
</el-form>
77+
<template #footer>
78+
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
79+
<el-button @click="dialogVisible = false">取 消</el-button>
80+
</template>
81+
</Dialog>
82+
</template>
83+
<script setup lang="ts">
84+
import { DICT_TYPE, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
85+
import * as ReceivablePlanApi from '@/api/crm/receivablePlan'
86+
87+
const { t } = useI18n() // 国际化
88+
const message = useMessage() // 消息弹窗
89+
90+
const dialogVisible = ref(false) // 弹窗的是否展示
91+
const dialogTitle = ref('') // 弹窗的标题
92+
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
93+
const formType = ref('') // 表单的类型:create - 新增;update - 修改
94+
const formData = ref({
95+
id: undefined,
96+
indexNo: undefined,
97+
receivableId: undefined,
98+
status: undefined,
99+
checkStatus: undefined,
100+
processInstanceId: undefined,
101+
price: undefined,
102+
returnTime: undefined,
103+
remindDays: undefined,
104+
remindTime: undefined,
105+
customerId: undefined,
106+
contractId: undefined,
107+
ownerUserId: undefined,
108+
sort: undefined,
109+
remark: undefined
110+
})
111+
const formRules = reactive({
112+
status: [{ required: true, message: '完成状态不能为空', trigger: 'change' }]
113+
})
114+
const formRef = ref() // 表单 Ref
115+
116+
/** 打开弹窗 */
117+
const open = async (type: string, id?: number) => {
118+
dialogVisible.value = true
119+
dialogTitle.value = t('action.' + type)
120+
formType.value = type
121+
resetForm()
122+
// 修改时,设置数据
123+
if (id) {
124+
formLoading.value = true
125+
try {
126+
formData.value = await ReceivablePlanApi.getReceivablePlan(id)
127+
} finally {
128+
formLoading.value = false
129+
}
130+
}
131+
}
132+
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
133+
134+
/** 提交表单 */
135+
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
136+
const submitForm = async () => {
137+
// 校验表单
138+
if (!formRef) return
139+
const valid = await formRef.value.validate()
140+
if (!valid) return
141+
// 提交请求
142+
formLoading.value = true
143+
try {
144+
const data = formData.value as unknown as ReceivablePlanApi.ReceivablePlanVO
145+
if (formType.value === 'create') {
146+
await ReceivablePlanApi.createReceivablePlan(data)
147+
message.success(t('common.createSuccess'))
148+
} else {
149+
await ReceivablePlanApi.updateReceivablePlan(data)
150+
message.success(t('common.updateSuccess'))
151+
}
152+
dialogVisible.value = false
153+
// 发送操作成功的事件
154+
emit('success')
155+
} finally {
156+
formLoading.value = false
157+
}
158+
}
159+
160+
/** 重置表单 */
161+
const resetForm = () => {
162+
formData.value = {
163+
id: undefined,
164+
indexNo: undefined,
165+
receivableId: undefined,
166+
status: undefined,
167+
checkStatus: undefined,
168+
processInstanceId: undefined,
169+
price: undefined,
170+
returnTime: undefined,
171+
remindDays: undefined,
172+
remindTime: undefined,
173+
customerId: undefined,
174+
contractId: undefined,
175+
ownerUserId: undefined,
176+
sort: undefined,
177+
remark: undefined
178+
}
179+
formRef.value?.resetFields()
180+
}
181+
</script>

0 commit comments

Comments
 (0)