Merge remote-tracking branch 'origin/master'

pull/781/head
苑坤 2025-05-01 18:30:42 +08:00
commit e7f020d3df
8 changed files with 80 additions and 40 deletions

View File

@ -61,6 +61,11 @@ export const getSimpleBusinessList = async () => {
return await request.get({ url: `/crm/business/simple-all-list` })
}
// 获得 CRM 我的商机列表
export const getSelfSimpleBusinessList = async () => {
return await request.get({ url: `/crm/business/self-simple-list` })
}
// 新增 CRM 商机
export const createBusiness = async (data: BusinessVO) => {
return await request.post({ url: `/crm/business/create`, data })

View File

@ -101,6 +101,11 @@ export const getCustomerSimpleList = async () => {
return await request.get({ url: `/crm/customer/simple-list` })
}
// 我的客户列表
export const getSelfCustomerSimpleList = async () => {
return await request.get({ url: `/crm/customer/self-simple-list` })
}
// 模糊查询公司
export const getCompanyList = async (params) => {
return await request.get({ url: `/crm/customer/fuzzyQueryCompany`, params })

View File

@ -432,7 +432,7 @@ onMounted(async () => {
formData.value.ownerUserId = customerId ? '' : useUserStore().getUser.id;
formType.value = route.query.id || route.params.id;
if (formType.value) open(formType.value, customerId)
customerList.value = await CustomerApi.getCustomerSimpleList();
customerList.value = await CustomerApi.getSelfCustomerSimpleList();
statusTypeList.value = await BusinessStatusApi.getBusinessStatusTypeSimpleList();
userOptions.value = await UserApi.getSimpleUserList();
deptTree.value = handleTree(await DeptApi.getSimpleDeptList());

View File

@ -56,10 +56,10 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="方案签约人" prop="quotationId">
<el-form-item label="方案签约人" prop="pricingUserId">
<el-select
@change="handleQuotationChange"
v-model="formData.quotationId"
v-model="formData.pricingUserId"
class="w-1/1"
>
<el-option
@ -181,11 +181,11 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<!-- <el-col :span="8">
<el-form-item label="客户编号" prop="customerId">
<el-input v-model="formData.customerId" disabled placeholder="客户编号" />
</el-form-item>
</el-col>
</el-col> -->
<el-col :span="8">
<el-form-item label="法人代表" prop="legalRepresentative">
<el-input v-model="formData.legalRepresentative" placeholder="法人代表" disabled />
@ -237,7 +237,7 @@
<el-option
v-for="dict in orgList"
:key="dict.id"
:label="dict.name"
:label="dict.orgName"
:value="dict.id"
/>
</el-select>
@ -295,8 +295,8 @@
<el-tree-select
v-model="formData.deptId"
:data="deptTree"
:props="defaultProps"
disabled
:props="defaultProps"
check-strictly
node-key="id"
placeholder="归属部门"
@ -344,8 +344,8 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账单日" prop="statement">
<el-select v-model="formData.statement" placeholder="请选择账单日" >
<el-form-item label="账单日" prop="statementDate">
<el-select v-model="formData.statementDate" placeholder="请选择账单日" >
<el-option
v-for="(dict, index) in statement"
:key="index"
@ -356,8 +356,8 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="最晚付款日" prop="contractTerm">
<el-select v-model="formData.partnerCompanyId" placeholder="请选择最晚付款日" >
<el-form-item label="最晚付款日" prop="lastPayDate">
<el-select v-model="formData.lastPayDate" placeholder="请选择最晚付款日" >
<el-option
v-for="(dict, index) in statement"
:key="index"
@ -391,8 +391,8 @@
</ContentWrap>
</el-col>
<el-col :span="8">
<el-form-item label="合同类型" prop="financeRecord">
<el-radio-group v-model="formData.financeRecord">
<el-form-item label="财务结算方式" prop="settleMethod">
<el-radio-group v-model="formData.settleMethod">
<el-radio :label="1">按月结算</el-radio>
<el-radio :label="0">按项目结算</el-radio>
</el-radio-group>
@ -480,6 +480,8 @@ import ContractAAuthorizedPersonForm from './components/ContractAAuthorizedPerso
import ContractBAuthorizedPersonForm from './components/ContractBAuthorizedPersonForm.vue'
import { propTypes } from '@/utils/propTypes'
import { getIntDictOptions, getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { defaultProps, handleTree } from '@/utils/tree'
import * as DeptApi from '@/api/system/dept'
const { t } = useI18n() //
const message = useMessage() //
@ -493,12 +495,14 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const deptTree = ref() //
const formData = ref({
id: undefined,
name: undefined,
no: undefined,
customerId: undefined,
partyName: undefined,
lastPayDate: undefined,
partAddress: undefined,
secPartyPerson: undefined,
wechat: undefined,
@ -533,6 +537,7 @@ const formData = ref({
partnerCompanyId: undefined,
deptId: undefined,
quotationTimes: undefined,
statementDate: undefined,
products: []
})
const formRules = reactive({
@ -541,7 +546,7 @@ const formRules = reactive({
quotationId: [{ required: true, message: '报价单编号不能为空', trigger: 'blur' }],
orderDate: [{ required: true, message: '下单日期不能为空', trigger: 'blur' }],
ownerUserId: [{ required: true, message: '负责人不能为空', trigger: 'blur' }],
statement: [{ required: true, message: '账单日不能为空', trigger: 'change' }],
statementDate: [{ required: true, message: '账单日不能为空', trigger: 'change' }],
contractType: [{ required: true, message: '合同类型不能为空', trigger: 'change' }],
penaltyRate: [{ required: true, message: '违约金比例不能为空', trigger: 'blur' }],
latePaymentRate: [{ required: true, message: '延期付款利率不能为空', trigger: 'blur' }],
@ -695,6 +700,7 @@ const resetForm = () => {
partnerCompanyId: undefined,
deptId: undefined,
quotationTimes: undefined,
paymentTerm: undefined,
products: []
}
formRef.value?.resetFields()
@ -713,11 +719,10 @@ const handleQuotationChange = async (quotationId: number) => {
formData.value.ownerUserId = quotation.ownerUserId;
formData.value.expanderUserId = quotation.expanderUserId;
formData.value.pricingUserId = quotation.pricingUserId;
formData.value.signUserId = quotation.signUserId;
formData.value.signPhoneNumber = quotation.signPhoneNumber;
formData.value.signEmail = quotation.signEmail;
formData.value.signWechat = quotation.signWechat;
formData.value.paymentTerm = quotation.paymentTerm;
formData.value.partnerCompanyId = quotation.partnerCompanyId;
@ -732,6 +737,7 @@ const handleQuotationChange = async (quotationId: number) => {
// 🔁
await onCustomerChange(quotation.customerId);
await onPartnerChange(quotation.partnerCompanyId);
} catch (err) {
} finally {
@ -753,13 +759,15 @@ const onCustomerChange = async (customerId: string) => {
formData.value.insuredCount = customerRes.insuredCount;
formData.value.establishmentDate = customerRes.establishmentDate;
formData.value.enterpriseType = customerRes.enterpriseType;
formData.value.businessStatus = customerRes.businessStatus;
formData.value.defendantRecord = customerRes.defendantRecord;
formData.value.businessAbnormal = customerRes.businessAbnormal;
formData.value.equityPledge = customerRes.equityPledge;
formData.value.dishonestRecord = customerRes.dishonestRecord;
formData.value.financingRecord = customerRes.financingRecord;
formData.value.enforcementRecord = customerRes.enforcementRecord;
formData.value.actualCapital = customerRes.actualCapital;
formData.value.partAddress = customerRes.partAddress;
formData.value.listingStatus = customerRes.listingStatus;
formData.value.legalRepresentative = customerRes.legalRepresentative;
formData.value.creditCode = customerRes.creditCode;
formData.value.regType = customerRes.regType;
formData.value.financingInfo = customerRes.financingInfo;
formData.value.socialEmployeeNum = customerRes.socialEmployeeNum;
} catch (err) {
console.error('获取客户详情失败:', err);
} finally {
@ -767,6 +775,23 @@ const onCustomerChange = async (customerId: string) => {
}
}
const onPartnerChange = async (id: string) => {
if (!id) return
try {
formLoading.value = true;
const res = await ContractApi.getOrgInfo(id);
formData.value.bankName = res.bankName;
formData.value.bankAccount = res.bankAccount;
formData.value.legalRepresentative = res.legalRepresentative;
formData.value.businessLicenseNumber = res.businessLicenseNumber;
formData.value.businessLicense = res.businessLicense;
// formData.value.partnerCompanyId = res.partnerCompanyId;
} catch (err) {
} finally {
formLoading.value = false;
}
}
/** 动态获取客户联系人 */
const getContactOptions = computed(() =>
@ -793,6 +818,10 @@ onMounted(async () => {
pageSize: 1000,
})
templateOptions.value = tempData.list
//
deptTree.value = handleTree(await DeptApi.getSimpleDeptList())
//
// if (formType.value === 'create') {
// formData.value.ownerUserId = useUserStore().getUser.id

View File

@ -9,20 +9,20 @@
>
<el-table :data="formData" class="-mt-10px">
<el-table-column label="序号" type="index" width="100" />
<el-table-column label="客户联系人ID" min-width="150">
<el-table-column label="授权人姓名" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.customerContactId`" :rules="formRules.customerContactId" class="mb-0px!">
<el-input v-model="row.customerContactId" placeholder="请输入客户联系人ID" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="姓名" min-width="150">
<!-- <el-table-column label="姓名" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.customerName`" :rules="formRules.customerName" class="mb-0px!">
<el-input v-model="row.customerName" placeholder="请输入姓名" />
</el-form-item>
</template>
</el-table-column>
</el-table-column> -->
<el-table-column label="授权人类型" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.authPersonType`" :rules="formRules.authPersonType" class="mb-0px!">
@ -37,7 +37,7 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column label="手机号" min-width="150">
<el-table-column label="授权人手机号" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.phoneNumber`" :rules="formRules.phoneNumber" class="mb-0px!">
<el-input v-model="row.phoneNumber" placeholder="请输入手机号" />

View File

@ -9,20 +9,13 @@
>
<el-table :data="formData" class="-mt-10px">
<el-table-column label="序号" type="index" width="100" />
<el-table-column label="用户" min-width="150">
<!-- <el-table-column label="用户" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.userId`" :rules="formRules.userId" class="mb-0px!">
<el-input v-model="row.userId" placeholder="请输入用户" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="姓名" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.name`" :rules="formRules.name" class="mb-0px!">
<el-input v-model="row.name" placeholder="请输入姓名" />
</el-form-item>
</template>
</el-table-column>
</el-table-column> -->
<el-table-column label="类别" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.authType`" :rules="formRules.authType" class="mb-0px!">
@ -37,10 +30,18 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column label="姓名" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.name`" :rules="formRules.name" class="mb-0px!">
<el-input v-model="row.name" disabled placeholder="请输入姓名" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="岗位" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.postId`" :rules="formRules.postId" class="mb-0px!">
<el-input v-model="row.postId" placeholder="请输入岗位" />
<el-input v-model="row.postId" disabled placeholder="请输入岗位" />
</el-form-item>
</template>
</el-table-column>

View File

@ -10,13 +10,13 @@
>
<el-table :data="formData" class="-mt-10px">
<el-table-column label="序号" type="index" width="100" />
<el-table-column label="产品编号" min-width="150">
<!-- <el-table-column label="产品编号" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.productId`" :rules="formRules.productId" class="mb-0px!">
<el-input v-model="row.productId" placeholder="请输入产品编号" disabled />
</el-form-item>
</template>
</el-table-column>
</el-table-column> -->
<el-table-column label="产品名称" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.productName`" :rules="formRules.productName" class="mb-0px!">

View File

@ -662,7 +662,7 @@ onMounted(async () => {
pageSize: 1000,
})
templateOptions.value = data.list
businessList.value = await BusinessApi.getSimpleBusinessList()
businessList.value = await BusinessApi.getSelfSimpleBusinessList()
//
deptTree.value = handleTree(await DeptApi.getSimpleDeptList())
const org = await ContractApi.getOrg({