Skip to content

Commit dced551

Browse files
committed
feat: CRM/合同 crud
1 parent 8c18ad9 commit dced551

File tree

4 files changed

+761
-0
lines changed

4 files changed

+761
-0
lines changed

src/api/crm/contract/index.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import request from '@/config/axios'
2+
3+
export interface ContractVO {
4+
id: number
5+
name: string
6+
customerId: number
7+
businessId: number
8+
processInstanceId: number
9+
orderDate: Date
10+
ownerUserId: number
11+
no: string
12+
startTime: Date
13+
endTime: Date
14+
price: number
15+
discountPercent: number
16+
productPrice: number
17+
roUserIds: string
18+
rwUserIds: string
19+
contactId: number
20+
signUserId: number
21+
contactLastTime: Date
22+
remark: string
23+
}
24+
25+
// 查询合同列表
26+
export const getContractPage = async (params) => {
27+
return await request.get({ url: `/crm/contract/page`, params })
28+
}
29+
30+
// 查询合同详情
31+
export const getContract = async (id: number) => {
32+
return await request.get({ url: `/crm/contract/get?id=` + id })
33+
}
34+
35+
// 新增合同
36+
export const createContract = async (data: ContractVO) => {
37+
return await request.post({ url: `/crm/contract/create`, data })
38+
}
39+
40+
// 修改合同
41+
export const updateContract = async (data: ContractVO) => {
42+
return await request.put({ url: `/crm/contract/update`, data })
43+
}
44+
45+
// 删除合同
46+
export const deleteContract = async (id: number) => {
47+
return await request.delete({ url: `/crm/contract/delete?id=` + id })
48+
}
49+
50+
// 导出合同 Excel
51+
export const exportContract = async (params) => {
52+
return await request.download({ url: `/crm/contract/export-excel`, params })
53+
}
Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
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-row>
11+
<el-col :span="12">
12+
<el-form-item label="合同名称" prop="name">
13+
<el-input v-model="formData.name" placeholder="请输入合同名称" />
14+
</el-form-item>
15+
</el-col>
16+
<el-col :span="12">
17+
<el-form-item label="客户" prop="customerId">
18+
<el-input v-model="formData.customerId" placeholder="请选择对应客户" />
19+
</el-form-item>
20+
</el-col>
21+
</el-row>
22+
23+
<el-form-item label="商机名称" prop="businessId">
24+
<el-input v-model="formData.businessId" placeholder="请选择对应商机" />
25+
</el-form-item>
26+
<el-form-item label="工作流" prop="processInstanceId">
27+
<el-input v-model="formData.processInstanceId" placeholder="请选择工作流" />
28+
</el-form-item>
29+
<el-form-item label="下单日期" prop="orderDate">
30+
<el-date-picker
31+
v-model="formData.orderDate"
32+
type="date"
33+
value-format="x"
34+
placeholder="选择下单日期"
35+
/>
36+
</el-form-item>
37+
<el-form-item label="负责人" prop="ownerUserId">
38+
<el-input v-model="formData.ownerUserId" placeholder="请选择负责人" />
39+
</el-form-item>
40+
<el-form-item label="合同编号" prop="no">
41+
<el-input v-model="formData.no" placeholder="请输入合同编号" />
42+
</el-form-item>
43+
44+
<el-row>
45+
<el-col :span="12">
46+
<el-form-item label="开始时间" prop="startTime">
47+
<el-date-picker
48+
v-model="formData.startTime"
49+
type="date"
50+
value-format="x"
51+
placeholder="选择开始时间"
52+
/>
53+
</el-form-item>
54+
</el-col>
55+
<el-col :span="12">
56+
<el-form-item label="结束时间" prop="endTime">
57+
<el-date-picker
58+
v-model="formData.endTime"
59+
type="date"
60+
value-format="x"
61+
placeholder="选择结束时间"
62+
/>
63+
</el-form-item>
64+
</el-col>
65+
</el-row>
66+
67+
<el-row>
68+
<el-col :span="8">
69+
<el-form-item label="合同金额" prop="price">
70+
<el-input v-model="formData.price" placeholder="请输入合同金额" />
71+
</el-form-item>
72+
</el-col>
73+
<el-col :span="8">
74+
<el-form-item label="整单折扣" prop="discountPercent">
75+
<el-input v-model="formData.discountPercent" placeholder="请输入整单折扣" />
76+
</el-form-item>
77+
</el-col>
78+
<el-col :span="8">
79+
<el-form-item label="产品总金额" prop="productPrice">
80+
<el-input v-model="formData.productPrice" placeholder="请输入产品总金额" />
81+
</el-form-item>
82+
</el-col>
83+
</el-row>
84+
85+
<el-form-item label="只读权限的用户" prop="roUserIds">
86+
<el-input v-model="formData.roUserIds" placeholder="请输入只读权限的用户" />
87+
</el-form-item>
88+
<el-form-item label="读写权限的用户" prop="rwUserIds">
89+
<el-input v-model="formData.rwUserIds" placeholder="请输入读写权限的用户" />
90+
</el-form-item>
91+
92+
<el-row>
93+
<el-col :span="12">
94+
<el-form-item label="联系人编号" prop="contactId">
95+
<el-input v-model="formData.contactId" placeholder="请输入联系人编号" />
96+
</el-form-item>
97+
</el-col>
98+
<el-col :span="12">
99+
<el-form-item label="公司签约人" prop="signUserId">
100+
<el-input v-model="formData.signUserId" placeholder="请输入公司签约人" />
101+
</el-form-item>
102+
</el-col>
103+
</el-row>
104+
105+
<el-form-item label="最后跟进时间" prop="contactLastTime">
106+
<el-date-picker
107+
v-model="formData.contactLastTime"
108+
type="date"
109+
value-format="x"
110+
placeholder="选择最后跟进时间"
111+
/>
112+
</el-form-item>
113+
<el-form-item label="备注" prop="remark">
114+
<el-input v-model="formData.remark" placeholder="请输入备注" />
115+
</el-form-item>
116+
</el-form>
117+
<template #footer>
118+
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
119+
<el-button @click="dialogVisible = false">取 消</el-button>
120+
</template>
121+
</Dialog>
122+
</template>
123+
<script setup lang="ts">
124+
import * as ContractApi from '@/api/crm/contract'
125+
126+
const { t } = useI18n() // 国际化
127+
const message = useMessage() // 消息弹窗
128+
129+
const dialogVisible = ref(false) // 弹窗的是否展示
130+
const dialogTitle = ref('') // 弹窗的标题
131+
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
132+
const formType = ref('') // 表单的类型:create - 新增;update - 修改
133+
const formData = ref({
134+
id: undefined,
135+
name: undefined,
136+
customerId: undefined,
137+
businessId: undefined,
138+
processInstanceId: undefined,
139+
orderDate: undefined,
140+
ownerUserId: undefined,
141+
no: undefined,
142+
startTime: undefined,
143+
endTime: undefined,
144+
price: undefined,
145+
discountPercent: undefined,
146+
productPrice: undefined,
147+
roUserIds: undefined,
148+
rwUserIds: undefined,
149+
contactId: undefined,
150+
signUserId: undefined,
151+
contactLastTime: undefined,
152+
remark: undefined
153+
})
154+
const formRules = reactive({
155+
name: [{ required: true, message: '合同名称不能为空', trigger: 'blur' }]
156+
})
157+
const formRef = ref() // 表单 Ref
158+
159+
/** 打开弹窗 */
160+
const open = async (type: string, id?: number) => {
161+
dialogVisible.value = true
162+
dialogTitle.value = t('action.' + type)
163+
formType.value = type
164+
resetForm()
165+
// 修改时,设置数据
166+
if (id) {
167+
formLoading.value = true
168+
try {
169+
formData.value = await ContractApi.getContract(id)
170+
} finally {
171+
formLoading.value = false
172+
}
173+
}
174+
}
175+
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
176+
177+
/** 提交表单 */
178+
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
179+
const submitForm = async () => {
180+
// 校验表单
181+
if (!formRef) return
182+
const valid = await formRef.value.validate()
183+
if (!valid) return
184+
// 提交请求
185+
formLoading.value = true
186+
try {
187+
const data = formData.value as unknown as ContractApi.ContractVO
188+
if (formType.value === 'create') {
189+
await ContractApi.createContract(data)
190+
message.success(t('common.createSuccess'))
191+
} else {
192+
await ContractApi.updateContract(data)
193+
message.success(t('common.updateSuccess'))
194+
}
195+
dialogVisible.value = false
196+
// 发送操作成功的事件
197+
emit('success')
198+
} finally {
199+
formLoading.value = false
200+
}
201+
}
202+
203+
/** 重置表单 */
204+
const resetForm = () => {
205+
formData.value = {
206+
id: undefined,
207+
name: undefined,
208+
customerId: undefined,
209+
businessId: undefined,
210+
processInstanceId: undefined,
211+
orderDate: undefined,
212+
ownerUserId: undefined,
213+
no: undefined,
214+
startTime: undefined,
215+
endTime: undefined,
216+
price: undefined,
217+
discountPercent: undefined,
218+
productPrice: undefined,
219+
roUserIds: undefined,
220+
rwUserIds: undefined,
221+
contactId: undefined,
222+
signUserId: undefined,
223+
contactLastTime: undefined,
224+
remark: undefined
225+
}
226+
formRef.value?.resetFields()
227+
}
228+
</script>

0 commit comments

Comments
 (0)