crm 报价 商机 合同 三块整改

pull/781/head
quu 2025-04-26 16:15:35 +09:00 committed by 苑坤
parent 36553814fa
commit e44e6e9c8b
12 changed files with 587 additions and 349 deletions

View File

@ -1,5 +1,8 @@
import request from '@/config/axios' import request from '@/config/axios'
import { TransferReqVO } from '@/api/crm/permission' import { TransferReqVO } from '@/api/crm/permission'
import { ContractAAuthorizedCompanyVO } from '@/api/crm/contractaauthorizedcompany'
import { ContractAAuthorizedPersonVO } from '@/api/crm/contractaauthorizedperson'
import { ContractBAuthorizedPersonVO } from '@/api/crm/contractbauthorizedperson'
export interface ContractVO { export interface ContractVO {
id: number // 编号,主键自增 id: number // 编号,主键自增
@ -50,6 +53,9 @@ export interface ContractVO {
totalPrice: number totalPrice: number
} }
] ]
contractAAuthorizedCompanys? : ContractAAuthorizedCompanyVO[]
contractAAuthorizedPersons? : ContractAAuthorizedPersonVO[]
contractBAuthorizedPersons? : ContractBAuthorizedPersonVO[]
} }
// 查询 CRM 合同列表 // 查询 CRM 合同列表

View File

@ -0,0 +1,48 @@
import request from '@/config/axios'
// 合同甲方关联单位 VO
export interface ContractAAuthorizedCompanyVO {
id: number // ID
contractId: number // 合同ID
customerName: string // 单位名称
unifiedCreditCode: string // 统一社会信用代码
invoicingAddress: string // 开票地址
invoicingTelephone: string // 开票电话
companyBank: string // 开户行
companyAccount: string // 开户账号
companyAddress: string // 通讯地址
deletedFlag: number // 删除标记1-正常,-1-已删除
}
// 合同甲方关联单位 API
export const ContractAAuthorizedCompanyApi = {
// 查询合同甲方关联单位分页
getContractAAuthorizedCompanyPage: async (params: any) => {
return await request.get({ url: `/crm/contract-A-authorized-company/page`, params })
},
// 查询合同甲方关联单位详情
getContractAAuthorizedCompany: async (id: number) => {
return await request.get({ url: `/crm/contract-A-authorized-company/get?id=` + id })
},
// 新增合同甲方关联单位
createContractAAuthorizedCompany: async (data: ContractAAuthorizedCompanyVO) => {
return await request.post({ url: `/crm/contract-A-authorized-company/create`, data })
},
// 修改合同甲方关联单位
updateContractAAuthorizedCompany: async (data: ContractAAuthorizedCompanyVO) => {
return await request.put({ url: `/crm/contract-A-authorized-company/update`, data })
},
// 删除合同甲方关联单位
deleteContractAAuthorizedCompany: async (id: number) => {
return await request.delete({ url: `/crm/contract-A-authorized-company/delete?id=` + id })
},
// 导出合同甲方关联单位 Excel
exportContractAAuthorizedCompany: async (params) => {
return await request.download({ url: `/crm/contract-A-authorized-company/export-excel`, params })
}
}

View File

@ -0,0 +1,48 @@
import request from '@/config/axios'
// 合同甲方授权人信息 VO
export interface ContractAAuthorizedPersonVO {
id: number // ID
contractId: number // 合同ID
customerContactId: number // 客户联系人ID
customerName: string // 姓名
authPersonType: number // 授权人类型
phoneNumber: string // 手机号
wechat: string // 微信号
idNumber: string // 身份证号
email: string // 电子邮箱
deletedFlag: number // 删除标记1-正常,-1-已删除
}
// 合同甲方授权人信息 API
export const ContractAAuthorizedPersonApi = {
// 查询合同甲方授权人信息分页
getContractAAuthorizedPersonPage: async (params: any) => {
return await request.get({ url: `/crm/contract-A-authorized-person/page`, params })
},
// 查询合同甲方授权人信息详情
getContractAAuthorizedPerson: async (id: number) => {
return await request.get({ url: `/crm/contract-A-authorized-person/get?id=` + id })
},
// 新增合同甲方授权人信息
createContractAAuthorizedPerson: async (data: ContractAAuthorizedPersonVO) => {
return await request.post({ url: `/crm/contract-A-authorized-person/create`, data })
},
// 修改合同甲方授权人信息
updateContractAAuthorizedPerson: async (data: ContractAAuthorizedPersonVO) => {
return await request.put({ url: `/crm/contract-A-authorized-person/update`, data })
},
// 删除合同甲方授权人信息
deleteContractAAuthorizedPerson: async (id: number) => {
return await request.delete({ url: `/crm/contract-A-authorized-person/delete?id=` + id })
},
// 导出合同甲方授权人信息 Excel
exportContractAAuthorizedPerson: async (params) => {
return await request.download({ url: `/crm/contract-A-authorized-person/export-excel`, params })
}
}

View File

@ -0,0 +1,50 @@
import request from '@/config/axios'
// 合同乙方授权人信息 VO
export interface ContractBAuthorizedPersonVO {
id: number // ID
contractId: number // 合同ID
userId: number // 用户ID
name: string // 姓名
authType: number // 类别:商旅负责人、技术负责人、服务对接人
postId: number // 岗位
userRank: number // 职级
authDesc: string // 权限说明
phoneNumber: string // 手机号
wechat: string // 微信号
email: string // 电子邮箱
deletedFlag: number // 删除标记1-正常,-1-已删除
}
// 合同乙方授权人信息 API
export const ContractBAuthorizedPersonApi = {
// 查询合同乙方授权人信息分页
getContractBAuthorizedPersonPage: async (params: any) => {
return await request.get({ url: `/crm/contract-B-authorized-person/page`, params })
},
// 查询合同乙方授权人信息详情
getContractBAuthorizedPerson: async (id: number) => {
return await request.get({ url: `/crm/contract-B-authorized-person/get?id=` + id })
},
// 新增合同乙方授权人信息
createContractBAuthorizedPerson: async (data: ContractBAuthorizedPersonVO) => {
return await request.post({ url: `/crm/contract-B-authorized-person/create`, data })
},
// 修改合同乙方授权人信息
updateContractBAuthorizedPerson: async (data: ContractBAuthorizedPersonVO) => {
return await request.put({ url: `/crm/contract-B-authorized-person/update`, data })
},
// 删除合同乙方授权人信息
deleteContractBAuthorizedPerson: async (id: number) => {
return await request.delete({ url: `/crm/contract-B-authorized-person/delete?id=` + id })
},
// 导出合同乙方授权人信息 Excel
exportContractBAuthorizedPerson: async (params) => {
return await request.download({ url: `/crm/contract-B-authorized-person/export-excel`, params })
}
}

View File

@ -40,6 +40,11 @@ export const QuotationApi = {
return await request.get({ url: `/crm/quotation/get?id=` + id }) return await request.get({ url: `/crm/quotation/get?id=` + id })
}, },
// 获得 CRM 方案列表(精简)
getSimpleQuotationList : async () => {
return await request.get({ url: `/crm/quotation/simple-all-list` })
},
// 新增CRM 方案报价 // 新增CRM 方案报价
createQuotation: async (data: QuotationVO) => { createQuotation: async (data: QuotationVO) => {
return await request.post({ url: `/crm/quotation/create`, data }) return await request.post({ url: `/crm/quotation/create`, data })

View File

@ -216,18 +216,6 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :span="8">
<el-form-item label="整单折扣(%" prop="discountPercent">
<el-input-number
v-model="formData.discountPercent"
placeholder="请输入整单折扣"
controls-position="right"
:min="0"
:precision="2"
class="!w-1/1"
/>
</el-form-item>
</el-col> -->
<el-col :span="8"> <el-col :span="8">
<el-form-item label="折扣后金额" prop="price"> <el-form-item label="折扣后金额" prop="price">
<el-input <el-input

View File

@ -10,7 +10,7 @@
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="合同编号" prop="no"> <el-form-item label="合同编号" prop="no">
<el-input disabled v-model="formData.no" placeholder="保存时自动生成" /> <el-input v-model="formData.no" placeholder="请输入合同编号" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
@ -18,34 +18,35 @@
<el-input v-model="formData.name" placeholder="请输入合同名称" /> <el-input v-model="formData.name" placeholder="请输入合同名称" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row>
<el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="负责人" prop="ownerUserId"> <el-form-item label="报价单编号" prop="quotationId">
<el-select <el-select
v-model="formData.ownerUserId" @change="handleQuotationChange"
:disabled="formType !== 'create'" v-model="formData.quotationId"
class="w-1/1" class="w-1/1"
> >
<el-option <el-option
v-for="item in userOptions" v-for="item in quotationList"
:key="item.id" :key="item.id"
:label="item.nickname" :label="item.no"
:value="item.id" :value="item.id"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row>
<el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="客户名称" prop="customerId"> <el-form-item label="客户名称" prop="customerId">
<el-select <el-select
v-model="formData.customerId" v-model="formData.customerId"
disabled=""
placeholder="请选择客户" placeholder="请选择客户"
class="w-1/1" class="w-1/1"
@change="handleCustomerChange"
> >
<el-option <el-option
v-for="item in customerList" v-for="item in contactList"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id"
@ -53,214 +54,288 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8">
<el-form-item label="商机名称" prop="businessId">
<el-select
@change="handleBusinessChange"
:disabled="!formData.customerId"
v-model="formData.businessId"
class="w-1/1"
>
<el-option
v-for="item in getBusinessOptions"
:key="item.id"
:label="item.name"
:value="item.id!"
/>
</el-select>
</el-form-item>
</el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="下单日期" prop="orderDate"> <el-form-item label="合同签订日期" prop="startTime">
<el-date-picker
v-model="formData.orderDate"
placeholder="选择下单日期"
type="date"
value-format="x"
class="!w-1/1"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开始时间" prop="startTime">
<el-date-picker <el-date-picker
v-model="formData.startTime" v-model="formData.startTime"
placeholder="选择开始时间"
type="date" type="date"
value-format="x" value-format="x"
class="!w-1/1" placeholder="选择合同签订日期"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="结束时间" prop="endTime"> <el-form-item label="合同结束时间" prop="endTime">
<el-date-picker <el-date-picker
v-model="formData.endTime" v-model="formData.endTime"
placeholder="选择结束时间"
type="date" type="date"
value-format="x" value-format="x"
class="!w-1/1" placeholder="选择合同结束时间"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="公司签约人" prop="signUserId"> <el-form-item label="票据模板" prop="invoiceTemplateId">
<el-select v-model="formData.signUserId" class="w-1/1"> <el-input v-model="formData.invoiceTemplateId" placeholder="请输入票据模板" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="违约金比例" prop="penaltyRate">
<el-input v-model="formData.penaltyRate" placeholder="请输入违约金比例" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="延期付款利率" prop="latePaymentRate">
<el-input v-model="formData.latePaymentRate" placeholder="请输入延期付款利率" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="财务结算方式" prop="settleMethod">
<el-select v-model="formData.settleMethod" placeholder="请选择财务结算方式">
<el-option <el-option
v-for="item in userOptions" v-for="dict in getIntDictOptions('settle_method')"
:key="item.id" :key="dict.value"
:label="item.nickname" :label="dict.label"
:value="item.id!" :value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="最晚付款日期" prop="lastPayDate">
<el-date-picker
v-model="formData.lastPayDate"
type="date"
value-format="x"
placeholder="选择最晚付款日期"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同期限(月)" prop="contractTerm">
<el-input v-model="formData.contractTerm" placeholder="请输入合同期限(月)" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="报价签约人" prop="signUserId">
<el-select v-model="formData.signUserId" placeholder="请选择报价签约人" disabled >
<el-option
v-for="dict in userOptions"
:key="dict.id"
:label="dict.nickname"
:value="dict.id"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="签约人联系电话" prop="signPhoneNumber">
<el-input v-model="formData.signPhoneNumber" placeholder="请输入签约人联系电话" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="签约人Email" prop="signEmail">
<el-input v-model="formData.signEmail" placeholder="请输入签约人Email" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="签约人微信" prop="signWechat">
<el-input v-model="formData.signWechat" placeholder="请输入签约人微信" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="商机负责人" prop="ownerUserId">
<el-select v-model="formData.ownerUserId" placeholder="请选择商机负责人" disabled>
<el-option
v-for="dict in userOptions"
:key="dict.id"
:label="dict.nickname"
:value="dict.id"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="客户签约人" prop="signContactId"> <el-form-item label="拓展人" prop="expanderUserId">
<el-select <el-select v-model="formData.expanderUserId" placeholder="请选择拓展人" disabled>
v-model="formData.signContactId"
:disabled="!formData.customerId"
class="w-1/1"
>
<el-option <el-option
v-for="item in getContactOptions" v-for="dict in userOptions"
:key="item.id" :key="dict.id"
:label="item.name" :label="dict.nickname"
:value="item.id" :value="dict.id"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="备注" prop="remark"> <el-form-item label="方案报价人" prop="pricingUserId">
<el-input v-model="formData.remark" placeholder="请输入备注" type="textarea" /> <el-select v-model="formData.pricingUserId" placeholder="请选择方案报价人" disabled>
<el-option
v-for="dict in userOptions"
:key="dict.id"
:label="dict.nickname"
:value="dict.id"
/>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="售后维护人" prop="afterSaleUserId">
<el-select v-model="formData.afterSaleUserId" placeholder="请选择售后维护人">
<el-option
v-for="dict in userOptions"
:key="dict.id"
:label="dict.nickname"
:value="dict.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="协作人" prop="collUserId">
<el-select v-model="formData.collUserId" placeholder="请选择协作人">
<el-option
v-for="dict in userOptions"
:key="dict.id"
:label="dict.nickname"
:value="dict.id"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="合同名称" prop="name"> <el-row>
<el-input v-model="formData.name" placeholder="请输入合同名称" /> <el-col :span="8">
</el-form-item> <el-form-item label="授信方式" prop="creditMethod" >
<el-form-item label="合同编号" prop="no"> <el-select v-model="formData.creditMethod" placeholder="请选择授信方式" disabled>
<el-input v-model="formData.no" placeholder="请输入合同编号" /> <el-option
</el-form-item> v-for="dict in getIntDictOptions('credit_method')"
<el-form-item label="客户编号" prop="customerId"> :key="dict.value"
<el-input v-model="formData.customerId" placeholder="请输入客户编号" /> :label="dict.label"
</el-form-item> :value="dict.value"
<el-form-item label="报价单编号" prop="quotationId"> />
<el-input v-model="formData.quotationId" placeholder="请输入报价单编号" /> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="票据模板Id" prop="invoiceTemplateId"> </el-col>
<el-input v-model="formData.invoiceTemplateId" placeholder="请输入票据模板Id" /> <el-col :span="8">
</el-form-item> <el-form-item label="授信计算周期" prop="creditCalcCycle" >
<el-form-item label="工作流编号" prop="processInstanceId"> <el-select v-model="formData.creditCalcCycle" placeholder="请选择授信计算周期" disabled>
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" /> <el-option
</el-form-item> v-for="dict in getIntDictOptions('credit_calc_cycle')"
<el-form-item label="审批状态" prop="auditStatus"> :key="dict.value"
<el-radio-group v-model="formData.auditStatus"> :label="dict.label"
<el-radio value="1">请选择字典生成</el-radio> :value="dict.value"
</el-radio-group> />
</el-form-item> </el-select>
<el-form-item label="合同签订日期" prop="startTime"> </el-form-item>
<el-date-picker </el-col>
v-model="formData.startTime" <el-col :span="8">
type="date" <el-form-item label="授信额度" prop="creditLimit">
value-format="x" <el-input v-model="formData.creditLimit" placeholder="请输入授信额度" disabled />
placeholder="选择合同签订日期" </el-form-item>
/> </el-col>
</el-form-item> </el-row>
<el-form-item label="合同结束时间" prop="endTime">
<el-date-picker <el-row>
v-model="formData.endTime" <el-col :span="8">
type="date" <el-form-item label="合作主体" prop="partnerCompanyId">
value-format="x" <el-select v-model="formData.partnerCompanyId" placeholder="请选择合作主体" disabled >
placeholder="选择合同结束时间" <el-option
/> v-for="dict in deptList"
</el-form-item> :key="dict.id"
<el-form-item label="违约金比例" prop="penaltyRate"> :label="dict.name"
<el-input v-model="formData.penaltyRate" placeholder="请输入违约金比例" /> :value="dict.id"
</el-form-item> />
<el-form-item label="延期付款利率" prop="latePaymentRate"> </el-select>
<el-input v-model="formData.latePaymentRate" placeholder="请输入延期付款利率" /> </el-form-item>
</el-form-item> </el-col>
<el-form-item label="财务结算方式 1按月 2按项目" prop="settleMethod"> <el-col :span="8">
<el-input v-model="formData.settleMethod" placeholder="请输入财务结算方式 1按月 2按项目" /> <el-form-item label="归属部门" prop="deptId" >
</el-form-item> <el-tree-select
<el-form-item label="最晚付款日期" prop="lastPayDate"> v-model="formData.deptId"
<el-date-picker :data="deptTree"
v-model="formData.lastPayDate" :props="defaultProps"
type="date" filterable
value-format="x" disabled
placeholder="选择最晚付款日期" check-strictly
/> node-key="id"
</el-form-item> placeholder="请选择归属部门"
<el-form-item label="合同期限(月)" prop="contractTerm"> />
<el-input v-model="formData.contractTerm" placeholder="请输入合同期限(月)" /> </el-form-item>
</el-form-item> </el-col>
<el-form-item label="报价签约人" prop="signUserId"> <el-col :span="8">
<el-input v-model="formData.signUserId" placeholder="请输入报价签约人" /> <el-form-item label="第几次报价" prop="quotationTimes">
</el-form-item> <el-input v-model="formData.quotationTimes" placeholder="请输入第几次报价" />
<el-form-item label="签约人联系电话" prop="signPhoneNumber"> </el-form-item>
<el-input v-model="formData.signPhoneNumber" placeholder="请输入签约人联系电话" /> </el-col>
</el-form-item> </el-row>
<el-form-item label="签约人Email" prop="signEmail">
<el-input v-model="formData.signEmail" placeholder="请输入签约人Email" />
</el-form-item>
<el-form-item label="签约人微信" prop="signWechat">
<el-input v-model="formData.signWechat" placeholder="请输入签约人微信" />
</el-form-item>
<el-form-item label="线下总金额,单位:元" prop="offlinePrice">
<el-input v-model="formData.offlinePrice" placeholder="请输入线下总金额,单位:元" />
</el-form-item>
<el-form-item label="线上总金额,单位:元" prop="onlinePrice">
<el-input v-model="formData.onlinePrice" placeholder="请输入线上总金额,单位:元" />
</el-form-item>
<el-form-item label="商机负责人" prop="ownerUserId">
<el-input v-model="formData.ownerUserId" placeholder="请输入商机负责人" />
</el-form-item>
<el-form-item label="拓展人" prop="expanderUserId">
<el-input v-model="formData.expanderUserId" placeholder="请输入拓展人" />
</el-form-item>
<el-form-item label="方案报价人" prop="pricingUserId">
<el-input v-model="formData.pricingUserId" placeholder="请输入方案报价人" />
</el-form-item>
<el-form-item label="售后维护人" prop="afterSaleUserId">
<el-input v-model="formData.afterSaleUserId" placeholder="请输入售后维护人" />
</el-form-item>
<el-form-item label="协作人id" prop="collUserId">
<el-input v-model="formData.collUserId" placeholder="请输入协作人id" />
</el-form-item>
<el-form-item label="合同总金额" prop="totalPrice">
<el-input v-model="formData.totalPrice" placeholder="请输入合同总金额" />
</el-form-item>
<el-form-item label="合同正文" prop="contractBody">
<el-input v-model="formData.contractBody" placeholder="请输入合同正文" />
</el-form-item>
<el-form-item label="合同补充协议" prop="contractAgreement">
<el-input v-model="formData.contractAgreement" placeholder="请输入合同补充协议" />
</el-form-item>
<el-form-item label="授信方式" prop="creditMethod">
<el-input v-model="formData.creditMethod" placeholder="请输入授信方式" />
</el-form-item>
<el-form-item label="授信计算周期" prop="creditCalcCycle">
<el-input v-model="formData.creditCalcCycle" placeholder="请输入授信计算周期" />
</el-form-item>
<el-form-item label="授信额度" prop="creditLimit">
<el-input v-model="formData.creditLimit" placeholder="请输入授信额度" />
</el-form-item>
<el-form-item label="合作主体 关联部门id" prop="partnerCompanyId">
<el-input v-model="formData.partnerCompanyId" placeholder="请输入合作主体 关联部门id" />
</el-form-item>
<el-form-item label="归属部门Id" prop="deptId">
<el-input v-model="formData.deptId" placeholder="请输入归属部门Id" />
</el-form-item>
<el-form-item label="第几次报价" prop="quotationTimes">
<el-input v-model="formData.quotationTimes" placeholder="请输入第几次报价" />
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="合同正文" prop="contractBody">
<el-input v-model="formData.contractBody" placeholder="请输入合同正文" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同补充协议" prop="contractAgreement">
<el-input v-model="formData.contractAgreement" placeholder="请输入合同补充协议" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="线上总金额" prop="onlinePrice">
<el-input
disabled
v-model="formData.onlinePrice"
placeholder="请输入线上总金额,单位:元"
:formatter="erpPriceInputFormatter"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="线下总金额" prop="offlinePrice">
<el-input
disabled
v-model="formData.offlinePrice"
placeholder="请输入线下总金额,单位:元"
:formatter="erpPriceInputFormatter"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="总金额" prop="price">
<el-input
disabled
v-model="formData.totalPrice"
:formatter="erpPriceInputFormatter"
/>
</el-form-item>
</el-col>
</el-row> </el-row>
<!-- 子表的表单 --> <!-- 子表的表单 -->
<ContentWrap> <ContentWrap>
@ -283,39 +358,6 @@
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</ContentWrap> </ContentWrap>
<el-row>
<el-col :span="8">
<el-form-item label="产品总金额" prop="totalProductPrice">
<el-input
disabled
v-model="formData.totalProductPrice"
:formatter="erpPriceInputFormatter"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="整单折扣(%" prop="discountPercent">
<el-input-number
v-model="formData.discountPercent"
placeholder="请输入整单折扣"
controls-position="right"
:min="0"
:precision="2"
class="!w-1/1"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="折扣后金额" prop="totalPrice">
<el-input
disabled
v-model="formData.totalPrice"
placeholder="请输入商机金额"
:formatter="erpPriceInputFormatter"
/>
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<template #footer> <template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"></el-button> <el-button :disabled="formLoading" type="primary" @click="submitForm"></el-button>
@ -324,11 +366,12 @@
</Dialog> </Dialog>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import * as CustomerApi from '@/api/crm/customer' import * as CustomerApi from '@/api/crm/customer'
import * as ContractApi from '@/api/crm/contract' import * as ContractApi from '@/api/crm/contract'
import * as UserApi from '@/api/system/user'
import * as ContactApi from '@/api/crm/contact' import * as ContactApi from '@/api/crm/contact'
import * as BusinessApi from '@/api/crm/business' import * as UserApi from '@/api/system/user'
import { QuotationApi,QuotationVO } from '@/api/crm/quotation'
import { erpPriceMultiply, erpPriceInputFormatter } from '@/utils' import { erpPriceMultiply, erpPriceInputFormatter } from '@/utils'
import { useUserStore } from '@/store/modules/user' import { useUserStore } from '@/store/modules/user'
import ContractProductForm from '@/views/crm/contract/components/ContractProductForm.vue' import ContractProductForm from '@/views/crm/contract/components/ContractProductForm.vue'
@ -336,7 +379,6 @@ import ContractAAuthorizedCompanyForm from './components/ContractAAuthorizedComp
import ContractAAuthorizedPersonForm from './components/ContractAAuthorizedPersonForm.vue' import ContractAAuthorizedPersonForm from './components/ContractAAuthorizedPersonForm.vue'
import ContractBAuthorizedPersonForm from './components/ContractBAuthorizedPersonForm.vue' import ContractBAuthorizedPersonForm from './components/ContractBAuthorizedPersonForm.vue'
const { t } = useI18n() // const { t } = useI18n() //
const message = useMessage() // const message = useMessage() //
@ -391,7 +433,7 @@ const formRules = reactive({
const formRef = ref() // Ref const formRef = ref() // Ref
const userOptions = ref<UserApi.UserVO[]>([]) // const userOptions = ref<UserApi.UserVO[]>([]) //
const customerList = ref([]) // const customerList = ref([]) //
const businessList = ref<BusinessApi.BusinessVO[]>([]) const quotationList = ref<QuotationVO[]>([])
const contactList = ref<ContactApi.ContactVO[]>([]) const contactList = ref<ContactApi.ContactVO[]>([])
/** 子表的表单 */ /** 子表的表单 */
@ -408,15 +450,9 @@ watch(
if (!val) { if (!val) {
return return
} }
const totalProductPrice = val.products.reduce((prev, curr) => prev + curr.totalPrice, 0) // const totalPrice = val.products.reduce((prev, curr) => prev + curr.totalPrice, 0)
const discountPrice =
val.discountPercent != null
? erpPriceMultiply(totalProductPrice, val.discountPercent / 100.0)
: 0
const totalPrice = totalProductPrice - discountPrice
// //
formData.value.totalProductPrice = totalProductPrice // formData.value.totalPrice = totalPrice
formData.value.totalPrice = totalPrice
}, },
{ deep: true } { deep: true }
) )
@ -440,14 +476,15 @@ const open = async (type: string, id?: number) => {
customerList.value = await CustomerApi.getCustomerSimpleList() customerList.value = await CustomerApi.getCustomerSimpleList()
// //
userOptions.value = await UserApi.getSimpleUserList() userOptions.value = await UserApi.getSimpleUserList()
//
quotationList.value = await QuotationApi.getSimpleQuotationList()
// //
if (formType.value === 'create') { // if (formType.value === 'create') {
formData.value.ownerUserId = useUserStore().getUser.id // formData.value.ownerUserId = useUserStore().getUser.id
} // }
// //
contactList.value = await ContactApi.getSimpleContactList() contactList.value = await ContactApi.getSimpleContactList()
//
businessList.value = await BusinessApi.getSimpleBusinessList()
} }
defineExpose({ open }) // open defineExpose({ open }) // open
@ -464,7 +501,6 @@ const submitForm = async () => {
try { try {
const data = unref(formData.value) as unknown as ContractApi.ContractVO const data = unref(formData.value) as unknown as ContractApi.ContractVO
// //
data.contractProducts = contractProductFormRef.value.getData()
data.contractAAuthorizedCompanys = contractAAuthorizedCompanyFormRef.value.getData() data.contractAAuthorizedCompanys = contractAAuthorizedCompanyFormRef.value.getData()
data.contractAAuthorizedPersons = contractAAuthorizedPersonFormRef.value.getData() data.contractAAuthorizedPersons = contractAAuthorizedPersonFormRef.value.getData()
data.contractBAuthorizedPersons = contractBAuthorizedPersonFormRef.value.getData() data.contractBAuthorizedPersons = contractBAuthorizedPersonFormRef.value.getData()
@ -526,28 +562,76 @@ const resetForm = () => {
formRef.value?.resetFields() formRef.value?.resetFields()
} }
/** 处理切换客户 */
const handleCustomerChange = () => {
formData.value.businessId = undefined
formData.value.signContactId = undefined
formData.value.products = []
}
/** 处理商机变化 */ /** 处理商机变化 */
const handleBusinessChange = async (businessId: number) => { const handleQuotationChange = async (quotationId: number) => {
const business = await BusinessApi.getBusiness(businessId) if (!quotationId) return
business.products.forEach((item) => { try {
item.contractPrice = item.businessPrice const quotation = await QuotationApi.getQuotation(quotationId)
}) formData.value.products = quotation.products;
formData.value.products = business.products formData.value.customerId = quotation.customerId;
formData.value.invoiceTemplateId = quotation.invoiceTemplateId;
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.partnerCompanyId = quotation.partnerCompanyId;
formData.value.creditLimit = quotation.creditLimit;
formData.value.creditMethod = quotation.creditMethod;
formData.value.creditCalcCycle = quotation.creditCalcCycle;
formData.value.deptId = quotation.deptId;
formData.value.offlinePrice = quotation.offlinePrice;
formData.value.onlinePrice = quotation.onlinePrice;
formData.value.totalPrice = quotation.totalPrice;
// 🔁
await onCustomerChange(quotation.customerId);
} catch (err) {
} finally {
}
} }
const onCustomerChange = async (customerId: string) => {
if (!customerId) return;
try {
formLoading.value = true;
const customerRes = await CustomerApi.getCustomer(customerId);
formData.value.cooperationType = customerRes.cooperationType;
formData.value.companyType = customerRes.companyType;
formData.value.listingStatus = customerRes.listingStatus;
formData.value.financingInfo = customerRes.financingInfo;
formData.value.paidInCapital = customerRes.paidInCapital;
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;
} catch (err) {
console.error('获取客户详情失败:', err);
} finally {
formLoading.value = false;
}
}
/** 动态获取客户联系人 */ /** 动态获取客户联系人 */
const getContactOptions = computed(() => const getContactOptions = computed(() =>
contactList.value.filter((item) => item.customerId == formData.value.customerId) contactList.value.filter((item) => item.customerId == formData.value.customerId)
) )
/** 动态获取商机 */
const getBusinessOptions = computed(() =>
businessList.value.filter((item) => item.customerId == formData.value.customerId)
)
</script> </script>

View File

@ -73,7 +73,7 @@
</el-table> </el-table>
</el-form> </el-form>
<el-row justify="center" class="mt-3"> <el-row justify="center" class="mt-3">
<el-button @click="handleAdd" round>+ 添加合同甲方关联单位</el-button> <el-button @click="handleAdd" round>+ 添加</el-button>
</el-row> </el-row>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">

View File

@ -75,7 +75,7 @@
</el-table> </el-table>
</el-form> </el-form>
<el-row justify="center" class="mt-3"> <el-row justify="center" class="mt-3">
<el-button @click="handleAdd" round>+ 添加合同甲方授权人信息</el-button> <el-button @click="handleAdd" round>+ 添加</el-button>
</el-row> </el-row>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">

View File

@ -23,10 +23,10 @@
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="类别:商旅负责人、技术负责人、服务对接人" min-width="150"> <el-table-column label="类别" min-width="150">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.authType`" :rules="formRules.authType" class="mb-0px!"> <el-form-item :prop="`${$index}.authType`" :rules="formRules.authType" class="mb-0px!">
<el-select v-model="row.authType" placeholder="请选择类别:商旅负责人、技术负责人、服务对接人"> <el-select v-model="row.authType" placeholder="请选择类别">
<el-option label="请选择字典生成" value="" /> <el-option label="请选择字典生成" value="" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -89,7 +89,7 @@
</el-table> </el-table>
</el-form> </el-form>
<el-row justify="center" class="mt-3"> <el-row justify="center" class="mt-3">
<el-button @click="handleAdd" round>+ 添加合同乙方授权人信息</el-button> <el-button @click="handleAdd" round>+ 添加</el-button>
</el-row> </el-row>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">

View File

@ -8,77 +8,82 @@
:inline-message="true" :inline-message="true"
:disabled="disabled" :disabled="disabled"
> >
<el-table :data="formData" class="-mt-10px"> <el-table :data="formData" class="-mt-10px">
<el-table-column label="序号" type="index" align="center" width="60" /> <el-table-column label="序号" type="index" width="100" />
<el-table-column label="产品名称" min-width="180"> <el-table-column label="产品编号" min-width="150">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.productId`" :rules="formRules.productId" class="mb-0px!"> <el-form-item :prop="`${$index}.productId`" :rules="formRules.productId" class="mb-0px!">
<el-select <el-input v-model="row.productId" placeholder="请输入产品编号" disabled />
v-model="row.productId"
clearable
filterable
@change="onChangeProduct($event, row)"
placeholder="请选择产品"
>
<el-option
v-for="item in productList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="条码" min-width="150"> <el-table-column label="产品名称" min-width="150">
<template #default="{ row }">
<el-form-item class="mb-0px!">
<el-input disabled v-model="row.productNo" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="单位" min-width="80">
<template #default="{ row }">
<dict-tag :type="DICT_TYPE.CRM_PRODUCT_UNIT" :value="row.productUnit" />
</template>
</el-table-column>
<el-table-column label="价格(元)" min-width="120">
<template #default="{ row }">
<el-form-item class="mb-0px!">
<el-input disabled v-model="row.productPrice" :formatter="erpPriceInputFormatter" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="售价(元)" fixed="right" min-width="140">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.contractPrice`" class="mb-0px!"> <el-form-item :prop="`${$index}.productName`" :rules="formRules.productName" class="mb-0px!">
<el-input-number <el-input v-model="row.productName" placeholder="请输入产品名称" disabled />
v-model="row.contractPrice"
controls-position="right"
:min="0.001"
:precision="2"
class="!w-100%"
/>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="数量" prop="count" fixed="right" min-width="120"> <el-table-column label="产品分类编号" min-width="150">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.count`" :rules="formRules.count" class="mb-0px!"> <el-form-item :prop="`${$index}.productCategoryId`" :rules="formRules.productCategoryId" class="mb-0px!">
<el-input-number <el-input v-model="row.productCategoryId" placeholder="请输入产品分类编号" disabled />
v-model="row.count"
controls-position="right"
:min="0.001"
:precision="3"
class="!w-100%"
/>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="合计" prop="totalPrice" fixed="right" min-width="140"> <el-table-column label="产品单位" min-width="150">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.totalPrice`" class="mb-0px!"> <el-form-item :prop="`${$index}.productUnit`" :rules="formRules.productUnit" class="mb-0px!">
<el-input disabled v-model="row.totalPrice" :formatter="erpPriceInputFormatter" /> <el-input v-model="row.productUnit" placeholder="请输入产品单位" disabled />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="线上价格" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.onlinePrice`" :rules="formRules.onlinePrice" class="mb-0px!">
<el-input v-model="row.onlinePrice" placeholder="请输入线上价格" disabled />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="线下价格" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.offlinePrice`" :rules="formRules.offlinePrice" class="mb-0px!">
<el-input v-model="row.offlinePrice" placeholder="请输入线下价格" disabled />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="总计价格" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.totalPrice`" :rules="formRules.totalPrice" class="mb-0px!">
<el-input v-model="row.totalPrice" placeholder="请输入总计价格" disabled />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="产品票据" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.productInvoice`" :rules="formRules.productInvoice" class="mb-0px!">
<el-input v-model="row.productInvoice" placeholder="请输入产品票据" disabled />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="产品开具项目" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.productInvoiceItem`" :rules="formRules.productInvoiceItem" class="mb-0px!">
<el-input v-model="row.productInvoiceItem" placeholder="请输入产品开具项目" disabled />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="服务费票据" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.serviceInvoice`" :rules="formRules.serviceInvoice" class="mb-0px!">
<el-input v-model="row.serviceInvoice" placeholder="请输入服务费票据" disabled />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="服务开具项目" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.serviceInvoiceItem`" :rules="formRules.serviceInvoiceItem" class="mb-0px!">
<el-input v-model="row.serviceInvoiceItem" placeholder="请输入服务开具项目" disabled />
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
@ -89,9 +94,6 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
</el-form> </el-form>
<el-row justify="center" class="mt-3" v-if="!disabled">
<el-button @click="handleAdd" round>+ 添加产品</el-button>
</el-row>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import * as ProductApi from '@/api/crm/product' import * as ProductApi from '@/api/crm/product'
@ -121,25 +123,6 @@ watch(
{ immediate: true } { immediate: true }
) )
/** 监听合同产品变化,计算合同产品总价 */
watch(
() => formData.value,
(val) => {
if (!val || val.length === 0) {
return
}
//
val.forEach((item) => {
if (item.contractPrice != null && item.count != null) {
item.totalPrice = erpPriceMultiply(item.contractPrice, item.count)
} else {
item.totalPrice = undefined
}
})
},
{ deep: true }
)
/** 新增按钮操作 */ /** 新增按钮操作 */
const handleAdd = () => { const handleAdd = () => {
const row = { const row = {

View File

@ -254,11 +254,7 @@
<el-input v-model="formData.signWechat" placeholder="请输入签约人微信" /> <el-input v-model="formData.signWechat" placeholder="请输入签约人微信" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8">
<el-form-item label="合同总金额" prop="totalPrice">
<el-input v-model="formData.totalPrice" placeholder="" disabled="false" />
</el-form-item>
</el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="账期" prop="paymentTerm"> <el-form-item label="账期" prop="paymentTerm">
<el-select v-model="formData.paymentTerm" placeholder="请选择账期"> <el-select v-model="formData.paymentTerm" placeholder="请选择账期">
@ -314,6 +310,35 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row>
<el-col :span="8">
<el-form-item label="线上总金额" prop="onlinePrice">
<el-input
disabled
v-model="formData.onlinePrice"
:formatter="erpPriceInputFormatter"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="线下总金额" prop="offlinePrice">
<el-input
disabled
v-model="formData.offlinePrice"
:formatter="erpPriceInputFormatter"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="总金额" prop="price">
<el-input
disabled
v-model="formData.totalPrice"
:formatter="erpPriceInputFormatter"
/>
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<!-- 子表的表单 --> <!-- 子表的表单 -->
<el-tabs v-model="subTabsName"> <el-tabs v-model="subTabsName">
@ -336,6 +361,7 @@ import * as CustomerApi from '@/api/crm/customer'
import * as UserApi from '@/api/system/user' import * as UserApi from '@/api/system/user'
import * as DeptApi from '@/api/system/dept' import * as DeptApi from '@/api/system/dept'
import * as BusinessApi from '@/api/crm/business' import * as BusinessApi from '@/api/crm/business'
import { erpPriceMultiply, erpPriceInputFormatter } from '@/utils'
/** CRM 方案报价 表单 */ /** CRM 方案报价 表单 */
defineOptions({ name: 'QuotationForm' }) defineOptions({ name: 'QuotationForm' })