crm 报价 商机 合同 三块整改

pull/781/head
quu 2025-05-01 22:22:46 +09:00
parent 57a3ac118f
commit ae5519d9c4
7 changed files with 168 additions and 101 deletions

View File

@ -29,6 +29,57 @@ export interface CustomerVO {
creatorName?: string // 创建人名称 creatorName?: string // 创建人名称
createTime: Date // 创建时间 createTime: Date // 创建时间
updateTime: Date // 更新时间 updateTime: Date // 更新时间
cooperationType?: number // 合作类型
cooperationArea?: number // 合作地区
leadSource?: number // 线索来源
customerStatus?: number // 客户状态
dataType?: number // 是否为公海数据
serviceStatus?: string // 经营状态
developer?: number // 商务拓展人
contractor?: number // 商务签约人
clueDeveloper?: number // 线索拓展人
maintainer?: number // 售后维护人
assist?: number // 协助人
customerOwner?: number // 客户归属人
website?: string // 网站
contactAddress?: string // 通讯地址
customerDetails?: string // 客户详情
rejectionReason?: string // 客户退回原因
claim?: number // 是否领取
claimTime?: Date // 领取时间
startDate?: string // 成立日期
registerCapital?: string // 注册资本
legalPersonName?: string // 法定代表人
actualCapital?: string // 实缴注册资本
registerCapitalCurrency?: string // 注册资本币种
bankName?: string // 开户行名称
bankAccount?: string // 银行账号
taxQualification?: string // 纳税人资质
socialEmployeeNum?: string // 参保人数
creditNo?: string // 社会统一信用代码
businessTerm?: string // 营业期限
belongOrg?: string // 登记机关
regType?: string // 公司类型
actualCharacters?: string // 实缴字符数
registerNo?: string // 工商注册号
registeredAddress?: string // 注册地址
businessScope?: string // 经营范围
partnerTotal?: string // 股东数量
changeRecordDataTotal?: string // 变更数量
employeeDataTotal?: string // 董事会成员数量
attention?: number // 是否关注1关注0不关注
creditAmount?: number // 授信额度
accountPeriod?: number // 账期(天)
creditGrantingMethod?: number // 授信方式
creditCalculationCycle?: number // 授信计算周期
equityPledge?: number // 股权出质
judgmentRecord?: number // 被执行记录
defendantRecord?: number // 被告记录
dishonestyRecord?: number // 失信记录
abnormalService?: number // 经营异常
financeRecord?: number // 融资记录
} }
// 查询客户列表 // 查询客户列表

View File

@ -77,7 +77,7 @@
<el-radio :value="2">授权人</el-radio> <el-radio :value="2">授权人</el-radio>
<el-radio :value="3">延期</el-radio> <el-radio :value="3">延期</el-radio>
<el-radio :value="4">终止</el-radio> <el-radio :value="4">终止</el-radio>
<el-radio :value="5">甲方关联单位</el-radio> <el-radio :value="5">关联</el-radio>
<el-radio :value="6">重签</el-radio> <el-radio :value="6">重签</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
@ -304,14 +304,33 @@ if(contractFormRef.value) {
} }
let dataFormList = proChangeObj[formData.value.changeItem].value.getData() let dataFormList = proChangeObj[formData.value.changeItem].value.getData()
data[proChangeObj[formData.value.changeItem]] = dataFormList data[proChangeObj[formData.value.changeItem]] = dataFormList
if(formData.value.changeItem == 2) { if(formData.value.changeItem == 1) {
data.changeAmount = dataFormList.changeAmount
data.changeAmountDeadline = dataFormList.changeAmountDeadline
} else if(formData.value.changeItem == 2) {
let ids = [] let ids = []
dataFormList.map(item => { dataFormList.map(item => {
ids.push(item.id) ids.push(item.id)
}) })
data.afterAuthorizerId = ids.join(',') data.afterAuthorizerId = ids.join(',')
} else if(formData.value.changeItem == 3) {
data.agreementDeadline = dataFormList.agreementDeadline
data.extensionYears = dataFormList.extensionYears
data.extensionDate = dataFormList.extensionDate
data.note = dataFormList.note
} else if(formData.value.changeItem == 4) {
data.terminationDate = dataFormList.terminationDate
data.terminationReason = dataFormList.terminationReason
data.note = dataFormList.note
} else if(formData.value.changeItem == 5) {
let ids = []
dataFormList.map(item => {
ids.push(item.id)
})
data.afterAffiliateCompanyId = ids.join(',')
} else if(formData.value.changeItem == 6) {
data.newContract = data
} }
// data.contractAAuthorizedCompanys = limitFormRef.value.getData()
data.contractId = data.id data.contractId = data.id
delete data.id delete data.id
await ContractApi.changeContract(data) await ContractApi.changeContract(data)

View File

@ -187,13 +187,13 @@
</el-form-item> </el-form-item>
</el-col> --> </el-col> -->
<el-col :span="8"> <el-col :span="8">
<el-form-item label="法人代表" prop="legalRepresentative"> <el-form-item label="法人代表" prop="legalPersonName">
<el-input v-model="formData.legalRepresentative" placeholder="法人代表" disabled /> <el-input v-model="formData.legalPersonName" placeholder="法人代表" disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="统一信用代码" prop="creditCode"> <el-form-item label="统一信用代码" prop="creditNo">
<el-input v-model="formData.creditCode" placeholder="统一信用代码" disabled /> <el-input v-model="formData.creditNo" placeholder="统一信用代码" disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
@ -222,8 +222,8 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="通讯地址" prop="listingStatus"> <el-form-item label="注册地址" prop="registeredAddress">
<el-input v-model="formData.partAddress" placeholder="通讯地址" disabled /> <el-input v-model="formData.registeredAddress" placeholder="注册地址" disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
@ -254,19 +254,19 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="法人代表" prop="secPartyLegalRepresentative"> <el-form-item label="法人代表" prop="legalRepresentative">
<el-input v-model="formData.secPartyLegalRepresentative" placeholder="法人代表" disabled /> <el-input v-model="formData.legalRepresentative" placeholder="法人代表" disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="商务负责人" prop="secPartyPerson"> <el-form-item label="商务负责人" prop="ownerUserId">
<el-input v-model="formData.secPartyPerson" placeholder="商务负责人" disabled /> <el-input v-model="formData.ownerUserId" placeholder="商务负责人" disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="手机号" prop="mobile"> <el-form-item label="手机号" prop="mobile">
<el-input <el-input
v-model="formData.mobile" v-model="formData.ownerUserMobile"
placeholder="手机号" placeholder="手机号"
disabled disabled
/> />
@ -275,7 +275,7 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item label="E-mail" prop="email"> <el-form-item label="E-mail" prop="email">
<el-input <el-input
v-model="formData.email" v-model="formData.ownerUserEmail"
placeholder="E-mail" placeholder="E-mail"
disabled disabled
/> />
@ -284,7 +284,7 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item label="微信号" prop="wechat"> <el-form-item label="微信号" prop="wechat">
<el-input <el-input
v-model="formData.wechat" v-model="formData.ownerUserWechat"
placeholder="微信号" placeholder="微信号"
disabled disabled
/> />
@ -545,7 +545,7 @@ const formRules = reactive({
customerId: [{ required: true, message: '客户不能为空', trigger: 'blur' }], customerId: [{ required: true, message: '客户不能为空', trigger: 'blur' }],
quotationId: [{ required: true, message: '报价单编号不能为空', trigger: 'blur' }], quotationId: [{ required: true, message: '报价单编号不能为空', trigger: 'blur' }],
orderDate: [{ required: true, message: '下单日期不能为空', trigger: 'blur' }], orderDate: [{ required: true, message: '下单日期不能为空', trigger: 'blur' }],
ownerUserId: [{ required: true, message: '负责人不能为空', trigger: 'blur' }], // ownerUserId: [{ required: true, message: '', trigger: 'blur' }],
statementDate: [{ required: true, message: '账单日不能为空', trigger: 'change' }], statementDate: [{ required: true, message: '账单日不能为空', trigger: 'change' }],
contractType: [{ required: true, message: '合同类型不能为空', trigger: 'change' }], contractType: [{ required: true, message: '合同类型不能为空', trigger: 'change' }],
penaltyRate: [{ required: true, message: '违约金比例不能为空', trigger: 'blur' }], penaltyRate: [{ required: true, message: '违约金比例不能为空', trigger: 'blur' }],

View File

@ -10,18 +10,18 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item label="终止日期" prop="terminationDate"> <el-form-item label="终止日期" prop="terminationDate">
<el-date-picker <el-date-picker
v-model="formData.lastPayDate" v-model="formData.terminationDate"
type="date" type="date"
:disabled="!!type" :disabled="!!type"
value-format="x" value-format="YYYY-MM-DD"
placeholder="请选择终止日期" placeholder="请选择终止日期"
style="width: 100%" style="width: 100%"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="终止原因" prop=""> <el-form-item label="终止原因" prop="terminationReason">
<el-radio-group v-model="formData.defendantRecord" :disabled="!!type"> <el-radio-group v-model="formData.terminationReason" :disabled="!!type">
<el-radio :label="1">合同到期</el-radio> <el-radio :label="1">合同到期</el-radio>
<el-radio :label="2">甲方违反协议</el-radio> <el-radio :label="2">甲方违反协议</el-radio>
<el-radio :label="3">乙方不可抗力</el-radio> <el-radio :label="3">乙方不可抗力</el-radio>
@ -32,8 +32,8 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="终止说明" prop="signEmail"> <el-form-item label="终止说明" prop="note">
<el-input v-model="formData.terminationReason" :disabled="!!type" type="textarea" :row="5" placeholder="必须确保账款已全部回收" /> <el-input v-model="formData.note" :disabled="!!type" type="textarea" :row="5" placeholder="必须确保账款已全部回收" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -123,11 +123,11 @@ const formData = ref({
bBusinessLicense: undefined // bBusinessLicense: undefined //
}) })
const formRules = reactive({ const formRules = reactive({
cooperationType: [{ required: true, message: '合作类型不能为空', trigger: 'change' }], // cooperationType: [{ required: true, message: '', trigger: 'change' }],
no: [{ required: true, message: '报价单编号不能为空', trigger: 'blur' }], // no: [{ required: true, message: '', trigger: 'blur' }],
customerId: [{ required: true, message: '客户id不能为空', trigger: 'change' }], // customerId: [{ required: true, message: 'id', trigger: 'change' }],
businessId: [{ required: true, message: '商机编号不能为空', trigger: 'change' }], // businessId: [{ required: true, message: '', trigger: 'change' }],
invoiceTemplateId: [{ required: true, message: '票据模板Id不能为空', trigger: 'change' }] // invoiceTemplateId: [{ required: true, message: 'Id', trigger: 'change' }]
}) })
const formRef = ref() // Ref const formRef = ref() // Ref

View File

@ -68,10 +68,13 @@
<el-row justify="center" class="mt-3" v-if="!type"> <el-row justify="center" class="mt-3" v-if="!type">
<el-button @click="handleAdd" round>+ 添加</el-button> <el-button @click="handleAdd" round>+ 添加</el-button>
</el-row> </el-row>
<ContactForm ref="contactRef" @success="getList" />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import * as ContractApi from '@/api/crm/contract' import * as ContractApi from '@/api/crm/contract'
import { propTypes } from '@/utils/propTypes' import { propTypes } from '@/utils/propTypes'
import ContactForm from '@/components/contact/index.vue'
const props = defineProps({ const props = defineProps({
contractId: undefined, // ID contractId: undefined, // ID
@ -81,16 +84,47 @@ const props = defineProps({
const formLoading = ref(false) // const formLoading = ref(false) //
const formData = ref([]) const formData = ref([])
const formRules = reactive({ const formRules = reactive({
contractId: [{ required: true, message: '合同ID不能为空', trigger: 'blur' }], // contractId: [{ required: true, message: 'ID', trigger: 'blur' }],
customerName: [{ required: true, message: '单位名称不能为空', trigger: 'blur' }], // customerName: [{ required: true, message: '', trigger: 'blur' }],
unifiedCreditCode: [{ required: true, message: '统一社会信用代码不能为空', trigger: 'blur' }], // unifiedCreditCode: [{ required: true, message: '', trigger: 'blur' }],
invoicingAddress: [{ required: true, message: '开票地址不能为空', trigger: 'blur' }], // invoicingAddress: [{ required: true, message: '', trigger: 'blur' }],
invoicingTelephone: [{ required: true, message: '开票电话不能为空', trigger: 'blur' }], // invoicingTelephone: [{ required: true, message: '', trigger: 'blur' }],
companyBank: [{ required: true, message: '开户行不能为空', trigger: 'blur' }], // companyBank: [{ required: true, message: '', trigger: 'blur' }],
companyAccount: [{ required: true, message: '开户账号不能为空', trigger: 'blur' }] // companyAccount: [{ required: true, message: '', trigger: 'blur' }]
}) })
const formRef = ref() // Ref const formRef = ref() // Ref
const contactRef = ref() // Ref
const handleAdd = () => {
contactRef.value.open(formData.value, props.customerId)
}
const getList = (val: []) => {
for(let i = val.length - 1; i >= 0; i--) {
let obj = val[i]
if(formData.value.some(v => v.id === obj.id)) val.splice(i, 1)
}
val.forEach(item => {
if(!formData.value.some(v => v.id === item.id)) {
val.forEach(item => {
formData.value.push({
"name": item.name,
"postId": item.post,
"userRank": item.userRank,
"phoneNumber": item.mobile,
"authDesc": item.authDesc,
"wechat":item. wechat,
"email":item. email,
"id": item.id
})
})
}
})
}
/** 监听主表的关联字段的变化,加载对应的子表数据 */ /** 监听主表的关联字段的变化,加载对应的子表数据 */
watch( watch(
() => props.contractId, () => props.contractId,
@ -111,24 +145,6 @@ watch(
{ immediate: true } { immediate: true }
) )
/** 新增按钮操作 */
const handleAdd = () => {
const row = {
id: undefined,
contractId: undefined,
customerName: undefined,
unifiedCreditCode: undefined,
invoicingAddress: undefined,
invoicingTelephone: undefined,
companyBank: undefined,
companyAccount: undefined,
companyAddress: undefined,
deletedFlag: undefined
}
row.contractId = props.contractId
formData.value.push(row)
}
/** 删除按钮操作 */ /** 删除按钮操作 */
const handleDelete = (index) => { const handleDelete = (index) => {
formData.value.splice(index, 1) formData.value.splice(index, 1)

View File

@ -117,13 +117,13 @@
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="初始额度" prop="signPhoneNumber"> <el-form-item label="初始额度" prop="creditLimit">
<el-input v-model="formData.signPhoneNumber" placeholder="请输入初始额度" disabled /> <el-input v-model="formData.creditLimit" placeholder="请输入初始额度" disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="目前额度" prop="beforeAmount"> <el-form-item label="目前额度" prop="creditLimit">
<el-input v-model="formData.beforeAmount" placeholder="请输入目前额度" disabled /> <el-input v-model="formData.creditLimit" placeholder="请输入目前额度" disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
@ -140,21 +140,21 @@
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="调整金额(元)" prop="changeAmount"> <el-form-item label="调整金额(元)" prop="changeAmount">
<el-input v-model="formData.changeAmount" :disabled="!!type" placeholder="请输入调整金额(元)" /> <el-input v-model="formData.changeAmount" type="number" :disabled="!!type" placeholder="请输入调整金额(元)" @input="onChangeAmount" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="最终额度" prop="afterAmount"> <el-form-item label="最终额度" prop="afterAmount">
<el-input v-model="formData.afterAmount" :disabled="!!type" placeholder="请输入最终额度" /> <el-input v-model="formData.afterAmount" type="number" disabled placeholder="请输入最终额度" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="调整金额截止日期" prop="establishmentDate"> <el-form-item label="调整金额截止日期" prop="changeAmountDeadline">
<el-date-picker <el-date-picker
v-model="formData.lastPayDate" v-model="formData.changeAmountDeadline"
value-format="YYYY-MM-DD"
type="date" type="date"
:disabled="!!type" :disabled="!!type"
value-format="x"
placeholder="请选择调整金额截止日期" placeholder="请选择调整金额截止日期"
style="width: 100%" style="width: 100%"
/> />
@ -172,7 +172,6 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { getIntDictOptions, getStrDictOptions, DICT_TYPE } from '@/utils/dict' import { getIntDictOptions, getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { QuotationApi, QuotationVO } from '@/api/crm/quotation'
import { defaultProps, handleTree } from '@/utils/tree' import { defaultProps, handleTree } from '@/utils/tree'
import { BillTemplateApi, BillTemplateVO } from '@/api/crm/billtemplate' import { BillTemplateApi, BillTemplateVO } from '@/api/crm/billtemplate'
import * as ContractApi from '@/api/crm/contract' import * as ContractApi from '@/api/crm/contract'
@ -219,7 +218,7 @@ const formData = ref({
paymentTerm: undefined, paymentTerm: undefined,
creditMethod: undefined, creditMethod: undefined,
creditCalcCycle: undefined, creditCalcCycle: undefined,
creditLimit: undefined, creditLimit: 0,
partnerCompanyId: undefined, partnerCompanyId: undefined,
deptId: undefined, deptId: undefined,
creator: undefined, creator: undefined,
@ -250,11 +249,11 @@ const formData = ref({
bBusinessLicense: undefined // bBusinessLicense: undefined //
}) })
const formRules = reactive({ const formRules = reactive({
cooperationType: [{ required: true, message: '合作类型不能为空', trigger: 'change' }], changeAmount: [{ required: true, message: '调整额度不能为空', trigger: 'change' }],
no: [{ required: true, message: '报价单编号不能为空', trigger: 'blur' }], changeAmountDeadline: [{ required: true, message: '调整日期不能为空', trigger: 'blur' }],
customerId: [{ required: true, message: '客户id不能为空', trigger: 'change' }], // customerId: [{ required: true, message: 'id', trigger: 'change' }],
businessId: [{ required: true, message: '商机编号不能为空', trigger: 'change' }], // businessId: [{ required: true, message: '', trigger: 'change' }],
invoiceTemplateId: [{ required: true, message: '票据模板Id不能为空', trigger: 'change' }] // invoiceTemplateId: [{ required: true, message: 'Id', trigger: 'change' }]
}) })
const formRef = ref() // Ref const formRef = ref() // Ref
@ -265,27 +264,9 @@ const quotationProductFormRef = ref()
const props = defineProps({ const props = defineProps({
type: propTypes.string.def('') type: propTypes.string.def('')
}) })
const onBusinessChange = async (businessId: string) => {
if (!businessId) return const onChangeAmount = async (amount: number) => {
try { formData.value.afterAmount = Number(formData.value.creditLimit) + Number(amount);
formLoading.value = true;
const res = await BusinessApi.getBusiness(businessId);
formData.value.customerId = res.customerId;
formData.value.creditLimit = res.creditLimit; //
formData.value.ownerUserId = res.ownerUserId; //
formData.value.paymentTerm = res.paymentTerm;
formData.value.creditMethod = res.creditMethod;
formData.value.creditCalcCycle = res.creditCalcCycle;
formData.value.deptId = res.deptId;
formData.value.offlinePrice = res.offlinePrice;
formData.value.onlinePrice = res.onlinePrice;
formData.value.totalPrice = res.totalPrice;
// 🔁
await onCustomerChange(res.customerId);
} catch (err) {
} finally {
formLoading.value = false;
}
} }
const onCustomerChange = async (customerId: string) => { const onCustomerChange = async (customerId: string) => {
@ -339,7 +320,7 @@ const open = async (type: string) => {
if (type) { if (type) {
formLoading.value = true formLoading.value = true
try { try {
formData.value = await QuotationApi.getQuotation(type) formData.value = await ContractApi.getContract(type)
} finally { } finally {
formLoading.value = false formLoading.value = false
} }

View File

@ -123,9 +123,9 @@
<el-form-item label="协议截止日" prop="agreementDeadline"> <el-form-item label="协议截止日" prop="agreementDeadline">
<el-date-picker <el-date-picker
:disabled="!!type" :disabled="!!type"
v-model="formData.lastPayDate" v-model="formData.agreementDeadline"
type="date" type="date"
value-format="x" value-format="YYYY-MM-DD"
placeholder="请选择协议截止日" placeholder="请选择协议截止日"
style="width: 100%" style="width: 100%"
/> />
@ -137,12 +137,12 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="调整金额截止日期" prop="establishmentDate"> <el-form-item label="调整金额截止日期" prop="extensionDate">
<el-date-picker <el-date-picker
v-model="formData.lastPayDate" v-model="formData.extensionDate"
:disabled="!!type" :disabled="!!type"
type="date" type="date"
value-format="x" value-format="YYYY-MM-DD"
placeholder="调整金额截止日期" placeholder="调整金额截止日期"
style="width: 100%" style="width: 100%"
/> />
@ -240,11 +240,11 @@ const formData = ref({
bBusinessLicense: undefined // bBusinessLicense: undefined //
}) })
const formRules = reactive({ const formRules = reactive({
cooperationType: [{ required: true, message: '合作类型不能为空', trigger: 'change' }], // cooperationType: [{ required: true, message: '', trigger: 'change' }],
no: [{ required: true, message: '报价单编号不能为空', trigger: 'blur' }], // no: [{ required: true, message: '', trigger: 'blur' }],
customerId: [{ required: true, message: '客户id不能为空', trigger: 'change' }], // customerId: [{ required: true, message: 'id', trigger: 'change' }],
businessId: [{ required: true, message: '商机编号不能为空', trigger: 'change' }], // businessId: [{ required: true, message: '', trigger: 'change' }],
invoiceTemplateId: [{ required: true, message: '票据模板Id不能为空', trigger: 'change' }] // invoiceTemplateId: [{ required: true, message: 'Id', trigger: 'change' }]
}) })
const formRef = ref() // Ref const formRef = ref() // Ref