Skip to content

Commit 6725318

Browse files
author
puhui999
committed
CRM:完善回款计划
1 parent 8f8591f commit 6725318

File tree

6 files changed

+225
-186
lines changed

6 files changed

+225
-186
lines changed

src/api/crm/contract/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ export const getContract = async (id: number) => {
6565
return await request.get({ url: `/crm/contract/get?id=` + id })
6666
}
6767

68+
// 查询 CRM 合同下拉列表
69+
export const getCrmContractSimpleListByCustomerId = async (customerId: number) => {
70+
return await request.get({
71+
url: `/crm/contract/list-all-simple-by-customer?customerId=${customerId}`
72+
})
73+
}
74+
6875
// 新增 CRM 合同
6976
export const createContract = async (data: ContractVO) => {
7077
return await request.post({ url: `/crm/contract/create`, data })

src/api/crm/customer/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ export const importCustomerTemplate = () => {
9090
return request.download({ url: '/crm/customer/get-import-template' })
9191
}
9292

93+
// 导入客户
94+
export const handleImport = async (formData) => {
95+
return await request.upload({ url: `/crm/customer/import`, data: formData })
96+
}
97+
9398
// 客户列表
9499
export const getCustomerSimpleList = async () => {
95100
return await request.get({ url: `/crm/customer/simple-list` })

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ export interface ReceivablePlanVO {
44
id: number
55
period: number
66
receivableId: number
7-
status: number
8-
checkStatus: string
7+
finishStatus: number
98
processInstanceId: number
109
price: number
1110
returnTime: Date
@@ -14,7 +13,6 @@ export interface ReceivablePlanVO {
1413
customerId: number
1514
contractId: number
1615
ownerUserId: number
17-
sort: number
1816
remark: string
1917
}
2018

src/views/crm/customer/CustomerImportForm.vue

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
<el-upload
55
ref="uploadRef"
66
v-model:file-list="fileList"
7-
:action="importUrl + '?updateSupport=' + updateSupport"
87
:auto-upload="false"
98
:disabled="formLoading"
109
:headers="uploadHeaders"
@@ -13,6 +12,7 @@
1312
:on-exceed="handleExceed"
1413
:on-success="submitFormSuccess"
1514
accept=".xlsx, .xls"
15+
action="none"
1616
drag
1717
>
1818
<Icon icon="ep:upload" />
@@ -45,6 +45,7 @@
4545
import * as CustomerApi from '@/api/crm/customer'
4646
import { getAccessToken, getTenantId } from '@/utils/auth'
4747
import download from '@/utils/download'
48+
import type { UploadUserFile } from 'element-plus'
4849
4950
defineOptions({ name: 'SystemUserImportForm' })
5051
@@ -53,11 +54,9 @@ const message = useMessage() // 消息弹窗
5354
const dialogVisible = ref(false) // 弹窗的是否展示
5455
const formLoading = ref(false) // 表单的加载中
5556
const uploadRef = ref()
56-
const importUrl =
57-
import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/crm/customer/import'
5857
const uploadHeaders = ref() // 上传 Header 头
59-
const fileList = ref([]) // 文件列表
60-
const updateSupport = ref(0) // 是否更新已经存在的客户数据
58+
const fileList = ref<UploadUserFile[]>([]) // 文件列表
59+
const updateSupport = ref(false) // 是否更新已经存在的客户数据
6160
6261
/** 打开弹窗 */
6362
const open = () => {
@@ -79,7 +78,10 @@ const submitForm = async () => {
7978
'tenant-id': getTenantId()
8079
}
8180
formLoading.value = true
82-
uploadRef.value!.submit()
81+
const formData = new FormData()
82+
formData.append('updateSupport', updateSupport.value)
83+
formData.append('file', fileList.value[0].raw)
84+
await CustomerApi.handleImport(formData)
8385
}
8486
8587
/** 文件上传成功 */
Lines changed: 134 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -1,124 +1,138 @@
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"
7-
label-width="100px"
8-
v-loading="formLoading"
8+
label-width="110px"
99
>
10-
<el-form-item label="客户名称" prop="customerId">
11-
<el-input v-model="formData.customerId" placeholder="请输入客户名称" />
12-
</el-form-item>
13-
<el-form-item label="合同名称" prop="contractId">
14-
<el-input v-model="formData.contractId" placeholder="请输入合同名称" />
15-
</el-form-item>
16-
<el-form-item label="负责人" prop="ownerUserId">
17-
<el-select v-model="formData.ownerUserId" clearable placeholder="请输入负责人">
18-
<el-option
19-
v-for="item in userList"
20-
:key="item.id"
21-
:label="item.nickname"
22-
:value="item.id"
23-
/>
24-
</el-select>
25-
</el-form-item>
26-
<el-form-item label="期数" prop="period">
27-
<el-input-number v-model="formData.period" placeholder="请输入期数" />
28-
</el-form-item>
29-
<!--<el-form-item label="回款ID" prop="receivableId">
30-
<el-input v-model="formData.receivableId" placeholder="请输入回款ID" />
31-
</el-form-item>
32-
<el-form-item label="完成状态" prop="status">
33-
<el-select v-model="formData.status" placeholder="请选择完成状态">
34-
<el-option
35-
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
36-
:key="dict.value"
37-
:label="dict.label"
38-
:value="dict.value"
39-
/>
40-
</el-select>
41-
</el-form-item>
42-
<el-form-item label="审批状态" prop="checkStatus">
43-
<el-select v-model="formData.checkStatus" placeholder="请选择审批状态">
44-
<el-option
45-
v-for="dict in getStrDictOptions(DICT_TYPE.CRM_RECEIVABLE_CHECK_STATUS)"
46-
:key="dict.value"
47-
:label="dict.label"
48-
:value="dict.value"
49-
/>
50-
</el-select>
51-
</el-form-item>
52-
<el-form-item label="工作流编号" prop="processInstanceId">
53-
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" />
54-
</el-form-item>-->
55-
<el-form-item label="计划回款金额" prop="price">
56-
<el-input-number v-model="formData.price" placeholder="请输入计划回款金额" />
57-
</el-form-item>
58-
<el-form-item label="计划回款日期" prop="returnTime">
59-
<el-date-picker
60-
v-model="formData.returnTime"
61-
type="date"
62-
value-format="x"
63-
placeholder="选择计划回款日期"
64-
/>
65-
</el-form-item>
66-
<el-form-item label="提前几天提醒" prop="remindDays">
67-
<el-input-number v-model="formData.remindDays" placeholder="请输入提前几天提醒" />
68-
</el-form-item>
69-
<el-form-item label="提醒日期" prop="remindTime">
70-
<el-date-picker
71-
v-model="formData.remindTime"
72-
type="date"
73-
value-format="x"
74-
placeholder="选择提醒日期"
75-
/>
76-
</el-form-item>
77-
<el-form-item label="显示排序" prop="sort">
78-
<el-input-number v-model="formData.sort" :min="0" controls-position="right" />
79-
</el-form-item>
80-
<el-form-item label="备注" prop="remark">
81-
<el-input type="textarea" :rows="3" v-model="formData.remark" placeholder="请输入备注" />
82-
</el-form-item>
10+
<el-row>
11+
<el-col :span="12">
12+
<el-form-item label="客户名称" prop="customerId">
13+
<el-select v-model="formData.customerId" class="w-1/1" placeholder="请选择客户">
14+
<el-option
15+
v-for="item in customerList"
16+
:key="item.id"
17+
:label="item.name"
18+
:value="item.id"
19+
/>
20+
</el-select>
21+
</el-form-item>
22+
</el-col>
23+
<el-col :span="12">
24+
<el-form-item label="合同名称" prop="contractId">
25+
<el-select
26+
v-model="formData.contractId"
27+
:disabled="!formData.customerId"
28+
class="!w-100%"
29+
placeholder="请选择合同"
30+
>
31+
<el-option
32+
v-for="data in contractList"
33+
:key="data.id"
34+
:label="data.name"
35+
:value="data.id!"
36+
/>
37+
</el-select>
38+
</el-form-item>
39+
</el-col>
40+
<el-col :span="12">
41+
<el-form-item label="负责人" prop="ownerUserId">
42+
<el-select v-model="formData.ownerUserId" clearable placeholder="请输入负责人">
43+
<el-option
44+
v-for="item in userList"
45+
:key="item.id"
46+
:label="item.nickname"
47+
:value="item.id"
48+
/>
49+
</el-select>
50+
</el-form-item>
51+
</el-col>
52+
<el-col :span="12">
53+
<el-form-item label="计划回款金额" prop="price">
54+
<el-input-number
55+
v-model="formData.price"
56+
class="!w-100%"
57+
controls-position="right"
58+
placeholder="请输入计划回款金额"
59+
/>
60+
</el-form-item>
61+
</el-col>
62+
<el-col :span="12">
63+
<el-form-item label="计划回款日期" prop="returnTime">
64+
<el-date-picker
65+
v-model="formData.returnTime"
66+
placeholder="选择计划回款日期"
67+
type="date"
68+
value-format="x"
69+
/>
70+
</el-form-item>
71+
</el-col>
72+
<el-col :span="12">
73+
<el-form-item label="提前几天提醒" prop="remindDays">
74+
<el-input-number
75+
v-model="formData.remindDays"
76+
class="!w-100%"
77+
controls-position="right"
78+
placeholder="请输入提前几天提醒"
79+
/>
80+
</el-form-item>
81+
</el-col>
82+
<el-col :span="12">
83+
<el-form-item label="提醒日期" prop="remindTime">
84+
<el-date-picker
85+
v-model="formData.remindTime"
86+
placeholder="选择提醒日期"
87+
type="date"
88+
value-format="x"
89+
/>
90+
</el-form-item>
91+
</el-col>
92+
<el-col :span="24">
93+
<el-form-item label="备注" prop="remark">
94+
<el-input
95+
v-model="formData.remark"
96+
:rows="3"
97+
placeholder="请输入备注"
98+
type="textarea"
99+
/>
100+
</el-form-item>
101+
</el-col>
102+
</el-row>
83103
</el-form>
84104
<template #footer>
85-
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
105+
<el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
86106
<el-button @click="dialogVisible = false">取 消</el-button>
87107
</template>
88108
</Dialog>
89109
</template>
90-
<script setup lang="ts">
110+
<script lang="ts" setup>
91111
import * as ReceivablePlanApi from '@/api/crm/receivable/plan'
92112
import * as UserApi from '@/api/system/user'
113+
import * as CustomerApi from '@/api/crm/customer'
114+
import * as ContractApi from '@/api/crm/contract'
115+
import { useUserStore } from '@/store/modules/user'
116+
93117
const { t } = useI18n() // 国际化
94118
const message = useMessage() // 消息弹窗
95119
const userList = ref<UserApi.UserVO[]>([]) // 用户列表
96120
const dialogVisible = ref(false) // 弹窗的是否展示
97121
const dialogTitle = ref('') // 弹窗的标题
98122
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
99123
const formType = ref('') // 表单的类型:create - 新增;update - 修改
100-
const formData = ref({
101-
id: undefined,
102-
period: undefined,
103-
receivableId: undefined,
104-
status: undefined,
105-
checkStatus: undefined,
106-
processInstanceId: undefined,
107-
price: undefined,
108-
returnTime: undefined,
109-
remindDays: undefined,
110-
remindTime: undefined,
111-
customerId: undefined,
112-
contractId: undefined,
113-
ownerUserId: undefined,
114-
sort: undefined,
115-
remark: undefined
116-
})
124+
const formData = ref<ReceivablePlanApi.ReceivablePlanVO>({} as ReceivablePlanApi.ReceivablePlanVO)
117125
const formRules = reactive({
118-
status: [{ required: true, message: '完成状态不能为空', trigger: 'change' }]
126+
price: [{ required: true, message: '计划回款金额不能为空', trigger: 'blur' }],
127+
returnTime: [{ required: true, message: '计划回款日期不能为空', trigger: 'blur' }],
128+
remindTime: [{ required: true, message: '提醒日期不能为空', trigger: 'blur' }],
129+
customerId: [{ required: true, message: '客户编号不能为空', trigger: 'blur' }],
130+
contractId: [{ required: true, message: '合同编号不能为空', trigger: 'blur' }],
131+
ownerUserId: [{ required: true, message: '负责人不能为空', trigger: 'blur' }]
119132
})
120133
const formRef = ref() // 表单 Ref
121-
134+
const customerList = ref<CustomerApi.CustomerVO[]>([]) // 客户列表
135+
const contractList = ref<ContractApi.ContractVO[]>([]) // 合同列表
122136
/** 打开弹窗 */
123137
const open = async (type: string, id?: number) => {
124138
dialogVisible.value = true
@@ -137,9 +151,31 @@ const open = async (type: string, id?: number) => {
137151
138152
// 获得用户列表
139153
userList.value = await UserApi.getSimpleUserList()
154+
// 获得客户列表
155+
customerList.value = await CustomerApi.getCustomerSimpleList()
156+
// 默认新建时选中自己
157+
if (formType.value === 'create') {
158+
formData.value.ownerUserId = useUserStore().getUser.id
159+
}
140160
}
141161
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
142162
163+
const getContractList = async (customerId: number) => {
164+
contractList.value = await ContractApi.getCrmContractSimpleListByCustomerId(customerId)
165+
}
166+
watch(
167+
() => formData.value.customerId,
168+
(newVal) => {
169+
if (!newVal) {
170+
return
171+
}
172+
getContractList(newVal)
173+
},
174+
{
175+
immediate: true
176+
}
177+
)
178+
143179
/** 提交表单 */
144180
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
145181
const submitForm = async () => {
@@ -168,23 +204,7 @@ const submitForm = async () => {
168204
169205
/** 重置表单 */
170206
const resetForm = () => {
171-
formData.value = {
172-
id: undefined,
173-
period: undefined,
174-
receivableId: undefined,
175-
status: undefined,
176-
checkStatus: undefined,
177-
processInstanceId: undefined,
178-
price: undefined,
179-
returnTime: undefined,
180-
remindDays: undefined,
181-
remindTime: undefined,
182-
customerId: undefined,
183-
contractId: undefined,
184-
ownerUserId: undefined,
185-
sort: undefined,
186-
remark: undefined
187-
}
207+
formData.value = {} as ReceivablePlanApi.ReceivablePlanVO
188208
formRef.value?.resetFields()
189209
}
190210
</script>

0 commit comments

Comments
 (0)