合同新增

pull/781/head
zy 2025-05-01 17:33:14 +08:00
parent 39fea5ff3a
commit 248ea11952
1 changed files with 344 additions and 209 deletions

View File

@ -7,8 +7,10 @@
:rules="formRules"
label-width="120px"
>
<ContentWrap style="border: none;font-weight: 700">
基础信息
</ContentWrap>
<el-row>
<el-col :span="8">
<el-form-item label="合同名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入合同名称" />
@ -24,6 +26,7 @@
<el-select
@change="handleQuotationChange"
v-model="formData.quotationId"
placeholder="请选择报价单编号"
class="w-1/1"
>
<el-option
@ -40,7 +43,7 @@
<el-select
v-model="formData.customerId"
disabled=""
placeholder="请选择客户"
placeholder="客户"
class="w-1/1"
>
<el-option
@ -52,166 +55,26 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="方案签约人" prop="quotationId">
<el-select
@change="handleQuotationChange"
v-model="formData.quotationId"
class="w-1/1"
>
<el-option
v-for="item in quotationList"
:key="item.id"
:label="item.no"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同签订日期" prop="startTime">
<el-date-picker
v-model="formData.startTime"
type="date"
value-format="x"
placeholder="选择合同签订日期"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同结束时间" prop="endTime">
<el-date-picker
v-model="formData.endTime"
type="date"
value-format="x"
placeholder="选择合同结束时间"
style="width: 100%"
/>
</el-form-item>
</el-col>
<!-- <el-col :span="8">
<el-form-item label="票据模板" prop="invoiceTemplateId">
<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
v-for="dict in getIntDictOptions('settle_method')"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="最晚付款日期" prop="lastPayDate">
<el-date-picker
v-model="formData.lastPayDate"
type="date"
value-format="x"
style="width: 100%"
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-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-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="拓展人" prop="expanderUserId">
<el-select v-model="formData.expanderUserId" 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-col :span="8">
<el-form-item label="方案报价人" prop="pricingUserId">
<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-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 label="授信额度" prop="creditLimit">
<el-input v-model="formData.creditLimit" placeholder="授信额度" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
@ -238,57 +101,36 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="授信额度" prop="creditLimit">
<el-input v-model="formData.creditLimit" placeholder="授信额度" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合作主体" prop="partnerCompanyId">
<el-select v-model="formData.partnerCompanyId" placeholder="合作主体" disabled >
<el-option
v-for="dict in orgList"
:key="dict.id"
:label="dict.name"
:value="dict.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="归属部门" prop="deptId" >
<el-tree-select
v-model="formData.deptId"
:data="deptTree"
:props="defaultProps"
filterable
disabled
check-strictly
node-key="id"
placeholder="归属部门"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="第几次报价" prop="quotationTimes">
<el-input v-model="formData.quotationTimes" placeholder="请输入第几次报价" />
<el-input v-model="formData.quotationTimes" disabled placeholder="第几次报价" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账期" prop="paymentTerm">
<el-select v-model="formData.paymentTerm" disabled placeholder="账期">
<el-option
v-for="dict in getStrDictOptions('payment_term')"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="票据模板" prop="invoiceTemplateId">
<el-select v-model="formData.invoiceTemplateId" disabled placeholder="请选择票据模板">
<el-option
v-for="dict in templateOptions"
:key="dict.id"
:label="dict.name"
:value="dict.id"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="合同正文" prop="contractBody">
<el-input v-model="formData.contractBody" type="textarea" rows="5" placeholder="请输入合同正文" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同补充协议" prop="contractAgreement">
<el-input v-model="formData.contractAgreement" type="textarea" rows="5" placeholder="请输入合同补充协议" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="线上总金额" prop="onlinePrice">
@ -314,12 +156,286 @@
<el-form-item label="总金额" prop="price">
<el-input
disabled
placeholder="总金额"
v-model="formData.totalPrice"
:formatter="erpPriceInputFormatter"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<ContentWrap style="border: none;font-weight: 700">
甲方基本信息
</ContentWrap>
</el-col>
<el-col :span="8">
<el-form-item label="甲方名称" prop="partyName">
<el-select v-model="formData.partyName" disabled placeholder="甲方名称">
<el-option
v-for="dict in getStrDictOptions('payment_term')"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<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 :span="8">
<el-form-item label="法人代表" prop="legalRepresentative">
<el-input v-model="formData.legalRepresentative" placeholder="法人代表" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="统一信用代码" prop="creditCode">
<el-input v-model="formData.creditCode" placeholder="统一信用代码" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="企业类型" prop="regType">
<el-input v-model="formData.regType" placeholder="企业类型" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="融资信息" prop="financingInfo">
<el-input v-model="formData.financingInfo" placeholder="融资信息" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="实缴资金" prop="actualCapital">
<el-input v-model="formData.actualCapital" placeholder="实缴资金" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="参保人数" prop="socialEmployeeNum">
<el-input v-model="formData.socialEmployeeNum" placeholder="参保人数" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="上市情况" prop="listingStatus">
<el-input v-model="formData.listingStatus" placeholder="上市情况" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="通讯地址" prop="listingStatus">
<el-input v-model="formData.partAddress" placeholder="通讯地址" disabled />
</el-form-item>
</el-col>
<el-col :span="24">
<ContentWrap style="border: none;font-weight: 700">
乙方基本信息
</ContentWrap>
</el-col>
<el-col :span="8">
<el-form-item label="合作主体" prop="partnerCompanyId">
<el-select v-model="formData.partnerCompanyId" placeholder="合作主体" disabled >
<el-option
v-for="dict in orgList"
:key="dict.id"
:label="dict.name"
:value="dict.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户行" prop="bankName">
<el-input v-model="formData.bankName" placeholder="开户行" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="银行账号" prop="bankAccount">
<el-input v-model="formData.bankAccount" placeholder="银行账号" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="法人代表" prop="secPartyLegalRepresentative">
<el-input v-model="formData.secPartyLegalRepresentative" placeholder="法人代表" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="商务负责人" prop="secPartyPerson">
<el-input v-model="formData.secPartyPerson" placeholder="商务负责人" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="手机号" prop="mobile">
<el-input
v-model="formData.mobile"
placeholder="手机号"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="E-mail" prop="email">
<el-input
v-model="formData.email"
placeholder="E-mail"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="微信号" prop="wechat">
<el-input
v-model="formData.wechat"
placeholder="微信号"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="归属部门" prop="deptId">
<el-tree-select
v-model="formData.deptId"
:data="deptTree"
:props="defaultProps"
disabled
check-strictly
node-key="id"
placeholder="归属部门"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<ContentWrap style="border: none;font-weight: 700">
合同信息
</ContentWrap>
</el-col>
<el-col :span="8">
<el-form-item label="合同类型" prop="contractType">
<el-radio-group v-model="formData.contractType">
<el-radio :label="1">单次合同</el-radio>
<el-radio :label="2">框架合同</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同签订日期" prop="startTime">
<el-date-picker
v-model="formData.startTime"
type="date"
value-format="x"
placeholder="选择合同签订日期"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同结束时间" prop="endTime">
<el-date-picker
v-model="formData.endTime"
type="date"
value-format="x"
placeholder="选择合同结束时间"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同期限(月)" prop="contractTerm">
<el-input v-model="formData.contractTerm" oninput = "value=value.replace(/[^\d]/g,'')" placeholder="请输入合同期限(月)" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="账单日" prop="statement">
<el-select v-model="formData.statement" placeholder="请选择账单日" >
<el-option
v-for="(dict, index) in statement"
:key="index"
:label="index + 1"
:value="index + 1"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="最晚付款日" prop="contractTerm">
<el-select v-model="formData.partnerCompanyId" placeholder="请选择最晚付款日" >
<el-option
v-for="(dict, index) in statement"
:key="index"
:label="index + 1"
:value="index + 1"
/>
</el-select>
</el-form-item>
</el-col>
<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="invoiceTemplateId">
<el-input v-model="formData.invoiceTemplateId" placeholder="请输入票据模板" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row> -->
<el-col :span="24">
<ContentWrap style="border: none;font-weight: 700">
财务与客服对接信息
</ContentWrap>
</el-col>
<el-col :span="8">
<el-form-item label="合同类型" prop="financeRecord">
<el-radio-group v-model="formData.financeRecord">
<el-radio :label="1">按月结算</el-radio>
<el-radio :label="0">按项目结算</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<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-col :span="24">
<el-form-item label="合同正文" prop="contractBody">
<el-input v-model="formData.contractBody" type="textarea" rows="5" placeholder="请输入合同正文" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同补充协议" prop="contractAgreement">
<el-input v-model="formData.contractAgreement" type="textarea" rows="5" placeholder="请输入合同补充协议" />
</el-form-item>
</el-col>
</el-row>
<!-- 子表的表单 -->
<ContentWrap>
<el-tabs v-model="subTabsName" class="-mt-15px -mb-10px">
@ -350,7 +466,6 @@
</ContentWrap>
</template>
<script lang="ts" setup>
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import * as CustomerApi from '@/api/crm/customer'
import * as ContractApi from '@/api/crm/contract'
import * as ContactApi from '@/api/crm/contact'
@ -358,11 +473,13 @@ import * as UserApi from '@/api/system/user'
import { QuotationApi,QuotationVO } from '@/api/crm/quotation'
import { erpPriceMultiply, erpPriceInputFormatter } from '@/utils'
import { useUserStore } from '@/store/modules/user'
import { BillTemplateApi, BillTemplateVO } from '@/api/crm/billtemplate'
import ContractProductForm from '@/views/crm/contract/components/ContractProductForm.vue'
import ContractAAuthorizedCompanyForm from './components/ContractAAuthorizedCompanyForm.vue'
import ContractAAuthorizedPersonForm from './components/ContractAAuthorizedPersonForm.vue'
import ContractBAuthorizedPersonForm from './components/ContractBAuthorizedPersonForm.vue'
import { propTypes } from '@/utils/propTypes'
import { getIntDictOptions, getStrDictOptions, DICT_TYPE } from '@/utils/dict'
const { t } = useI18n() //
const message = useMessage() //
@ -371,6 +488,7 @@ const props = defineProps({
id: propTypes.number.def(undefined),
type: propTypes.number.def(undefined),
})
const templateOptions = ref([])
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
@ -380,6 +498,10 @@ const formData = ref({
name: undefined,
no: undefined,
customerId: undefined,
partyName: undefined,
partAddress: undefined,
secPartyPerson: undefined,
wechat: undefined,
quotationId: undefined,
invoiceTemplateId: undefined,
processInstanceId: undefined,
@ -418,7 +540,12 @@ const formRules = reactive({
customerId: [{ required: true, message: '客户不能为空', trigger: 'blur' }],
quotationId: [{ required: true, message: '报价单编号不能为空', trigger: 'blur' }],
orderDate: [{ required: true, message: '下单日期不能为空', trigger: 'blur' }],
ownerUserId: [{ required: true, message: '负责人不能为空', trigger: 'blur' }]
ownerUserId: [{ required: true, message: '负责人不能为空', trigger: 'blur' }],
statement: [{ required: true, message: '账单日不能为空', trigger: 'change' }],
contractType: [{ required: true, message: '合同类型不能为空', trigger: 'change' }],
penaltyRate: [{ required: true, message: '违约金比例不能为空', trigger: 'blur' }],
latePaymentRate: [{ required: true, message: '延期付款利率不能为空', trigger: 'blur' }],
collUserId: [{ required: true, message: '协作人不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
const userOptions = ref<UserApi.UserVO[]>([]) //
@ -426,6 +553,7 @@ const customerList = ref([]) // 客户列表的数据
const quotationList = ref<QuotationVO[]>([])
const contactList = ref<ContactApi.ContactVO[]>([])
const orgList = ref([])
const statement = ref(new Array(31).fill(null))
/** 子表的表单 */
const subTabsName = ref('product')
@ -451,7 +579,7 @@ watch(
/** 打开弹窗 */
const open = async (type: string) => {
if (type) {
formLoading.value = true
// formLoading.value = true
try {
formData.value = await ContractApi.getContract(type)
} finally {
@ -647,6 +775,7 @@ const getContactOptions = computed(() =>
const route = useRoute();
onMounted(async () => {
console.log('%csrc/views/crm/contract/ContractForm.vue:760 statement.value', 'color: #007acc;', statement.value);
formType.value = props.id || route.query.id
if (formType.value) await open(formType.value)
@ -658,6 +787,12 @@ onMounted(async () => {
//
quotationList.value = await QuotationApi.getSimpleQuotationList()
//
const tempData = await BillTemplateApi.getBillTemplatePage({
pageNo: 1,
pageSize: 1000,
})
templateOptions.value = tempData.list
//
// if (formType.value === 'create') {
// formData.value.ownerUserId = useUserStore().getUser.id