Skip to content

Commit af79d4a

Browse files
YunaiVgitee-org
authored andcommitted
!285 【新增】回款管理 功能
Merge pull request !285 from souvc/master
2 parents 73578ce + 26780c3 commit af79d4a

File tree

7 files changed

+1164
-1
lines changed

7 files changed

+1164
-1
lines changed

src/api/crm/receivable/index.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import request from '@/config/axios'
2+
3+
export interface ReceivableVO {
4+
id: number
5+
no: string
6+
planId: number
7+
customerId: number
8+
contractId: number
9+
checkStatus: number
10+
processInstanceId: number
11+
returnTime: Date
12+
returnType: string
13+
price: number
14+
ownerUserId: number
15+
batchId: number
16+
sort: number
17+
dataScope: number
18+
dataScopeDeptIds: string
19+
status: number
20+
remark: string
21+
}
22+
23+
// 查询回款管理列表
24+
export const getReceivablePage = async (params) => {
25+
return await request.get({ url: `/crm/receivable/page`, params })
26+
}
27+
28+
// 查询回款管理详情
29+
export const getReceivable = async (id: number) => {
30+
return await request.get({ url: `/crm/receivable/get?id=` + id })
31+
}
32+
33+
// 新增回款管理
34+
export const createReceivable = async (data: ReceivableVO) => {
35+
return await request.post({ url: `/crm/receivable/create`, data })
36+
}
37+
38+
// 修改回款管理
39+
export const updateReceivable = async (data: ReceivableVO) => {
40+
return await request.put({ url: `/crm/receivable/update`, data })
41+
}
42+
43+
// 删除回款管理
44+
export const deleteReceivable = async (id: number) => {
45+
return await request.delete({ url: `/crm/receivable/delete?id=` + id })
46+
}
47+
48+
// 导出回款管理 Excel
49+
export const exportReceivable = async (params) => {
50+
return await request.download({ url: `/crm/receivable/export-excel`, params })
51+
}

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+
}

src/utils/dict.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,5 +182,9 @@ export enum DICT_TYPE {
182182
PROMOTION_ACTIVITY_STATUS = 'promotion_activity_status', // 优惠活动的状态
183183
PROMOTION_CONDITION_TYPE = 'promotion_condition_type', // 营销的条件类型枚举
184184
PROMOTION_BARGAIN_RECORD_STATUS = 'promotion_bargain_record_status', // 砍价记录的状态
185-
PROMOTION_COMBINATION_RECORD_STATUS = 'promotion_combination_record_status' // 拼团记录的状态
185+
PROMOTION_COMBINATION_RECORD_STATUS = 'promotion_combination_record_status', // 拼团记录的状态
186+
187+
// ========== CRM - 客户管理模块 ==========
188+
CRM_RECEIVABLE_CHECK_STATUS = 'crm_receivable_check_status',
189+
CRM_RETURN_TYPE = 'crm_return_type'
186190
}
Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
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="no">
11+
<el-input v-model="formData.no" placeholder="请输入回款编号" />
12+
</el-form-item>
13+
<!--<el-form-item label="回款计划ID" prop="planId">
14+
<el-input v-model="formData.planId" placeholder="请输入回款计划ID" />
15+
</el-form-item>-->
16+
<el-form-item label="客户ID" prop="customerId">
17+
<el-input v-model="formData.customerId" placeholder="请输入客户ID" />
18+
</el-form-item>
19+
<el-form-item label="合同ID" prop="contractId">
20+
<el-input v-model="formData.contractId" placeholder="请输入合同ID" />
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_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-input v-model="formData.ownerUserId" placeholder="请输入负责人" />
58+
</el-form-item>
59+
<el-form-item label="批次" prop="batchId">
60+
<el-input v-model="formData.batchId" placeholder="请输入批次" />
61+
</el-form-item>
62+
<!--<el-form-item label="显示顺序" prop="sort">
63+
<el-input v-model="formData.sort" placeholder="请输入显示顺序" />
64+
</el-form-item>-->
65+
<el-form-item label="状态" prop="status">
66+
<el-select v-model="formData.status" placeholder="请选择状态">
67+
<el-option
68+
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
69+
:key="dict.value"
70+
:label="dict.label"
71+
:value="dict.value"
72+
/>
73+
</el-select>
74+
</el-form-item>
75+
<el-form-item label="备注" prop="remark">
76+
<el-input type="textarea" :rows="3" v-model="formData.remark" placeholder="请输入备注" />
77+
</el-form-item>
78+
</el-form>
79+
<template #footer>
80+
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
81+
<el-button @click="dialogVisible = false">取 消</el-button>
82+
</template>
83+
</Dialog>
84+
</template>
85+
<script setup lang="ts">
86+
import { DICT_TYPE, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
87+
import * as ReceivableApi from '@/api/crm/receivable'
88+
89+
const { t } = useI18n() // 国际化
90+
const message = useMessage() // 消息弹窗
91+
92+
const dialogVisible = ref(false) // 弹窗的是否展示
93+
const dialogTitle = ref('') // 弹窗的标题
94+
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
95+
const formType = ref('') // 表单的类型:create - 新增;update - 修改
96+
const formData = ref({
97+
id: undefined,
98+
no: undefined,
99+
planId: undefined,
100+
customerId: undefined,
101+
contractId: undefined,
102+
checkStatus: undefined,
103+
processInstanceId: undefined,
104+
returnTime: undefined,
105+
returnType: undefined,
106+
price: undefined,
107+
ownerUserId: undefined,
108+
batchId: undefined,
109+
sort: undefined,
110+
dataScope: undefined,
111+
dataScopeDeptIds: undefined,
112+
status: undefined,
113+
remark: undefined
114+
})
115+
const formRules = reactive({
116+
status: [{ required: true, message: '状态不能为空', trigger: 'change' }]
117+
})
118+
const formRef = ref() // 表单 Ref
119+
120+
/** 打开弹窗 */
121+
const open = async (type: string, id?: number) => {
122+
dialogVisible.value = true
123+
dialogTitle.value = t('action.' + type)
124+
formType.value = type
125+
resetForm()
126+
// 修改时,设置数据
127+
if (id) {
128+
formLoading.value = true
129+
try {
130+
formData.value = await ReceivableApi.getReceivable(id)
131+
} finally {
132+
formLoading.value = false
133+
}
134+
}
135+
}
136+
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
137+
138+
/** 提交表单 */
139+
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
140+
const submitForm = async () => {
141+
// 校验表单
142+
if (!formRef) return
143+
const valid = await formRef.value.validate()
144+
if (!valid) return
145+
// 提交请求
146+
formLoading.value = true
147+
try {
148+
const data = formData.value as unknown as ReceivableApi.ReceivableVO
149+
if (formType.value === 'create') {
150+
await ReceivableApi.createReceivable(data)
151+
message.success(t('common.createSuccess'))
152+
} else {
153+
await ReceivableApi.updateReceivable(data)
154+
message.success(t('common.updateSuccess'))
155+
}
156+
dialogVisible.value = false
157+
// 发送操作成功的事件
158+
emit('success')
159+
} finally {
160+
formLoading.value = false
161+
}
162+
}
163+
164+
/** 重置表单 */
165+
const resetForm = () => {
166+
formData.value = {
167+
id: undefined,
168+
no: undefined,
169+
planId: undefined,
170+
customerId: undefined,
171+
contractId: undefined,
172+
checkStatus: undefined,
173+
processInstanceId: undefined,
174+
returnTime: undefined,
175+
returnType: undefined,
176+
price: undefined,
177+
ownerUserId: undefined,
178+
batchId: undefined,
179+
sort: undefined,
180+
dataScope: undefined,
181+
dataScopeDeptIds: undefined,
182+
status: undefined,
183+
remark: undefined
184+
}
185+
formRef.value?.resetFields()
186+
}
187+
</script>

0 commit comments

Comments
 (0)