1.1.36 合同付款方式、甲方公司、乙方公司必填,合同变更同步合同信息

dev
yinq 1 month ago
parent e85482ac73
commit 9620de170f

@ -21,7 +21,7 @@
<template #header> <template #header>
<span>{{ isEdit ? '编辑合同变更' : '合同变更申请' }}</span> <span>{{ isEdit ? '编辑合同变更' : '合同变更申请' }}</span>
</template> </template>
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px"> <el-form ref="formRef" :model="form" :rules="changeFormRules" label-width="120px">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="变更编号" prop="changeCode"> <el-form-item label="变更编号" prop="changeCode">
@ -97,10 +97,9 @@
<template #header> <template #header>
<div style="text-align: left; font-weight: bold; font-size: 18px">变更后合同信息</div> <div style="text-align: left; font-weight: bold; font-size: 18px">变更后合同信息</div>
</template> </template>
<el-form :model="form.changeInfo" label-width="120px">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="合同编号"> <el-form-item label="合同编号" prop="changeInfo.contractCode">
<el-input v-model="form.changeInfo.contractCode" placeholder="请输入合同编号" :disabled="isFormDisabled"> <el-input v-model="form.changeInfo.contractCode" placeholder="请输入合同编号" :disabled="isFormDisabled">
<template #append> <template #append>
<el-button <el-button
@ -115,26 +114,55 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="合同名称"> <el-form-item label="合同名称" prop="changeInfo.contractName">
<el-input v-model="form.changeInfo.contractName" placeholder="请输入合同名称" :disabled="isFormDisabled" /> <el-input v-model="form.changeInfo.contractName" placeholder="请输入合同名称" :disabled="isFormDisabled" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="合同大类"> <el-form-item label="合同大类" prop="changeInfo.contractCategory">
<el-select v-model="form.changeInfo.contractCategory" placeholder="请选择合同大类" disabled style="width: 100%"> <el-select v-model="form.changeInfo.contractCategory" placeholder="请选择合同大类" disabled style="width: 100%">
<el-option v-for="dict in contract_category" :key="dict.value" :label="dict.label" :value="dict.value" /> <el-option v-for="dict in contract_category" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" v-if="form.changeInfo.contractCategory !== '3'">
<el-form-item label="关联框架合同" prop="changeInfo.isFrameworkContract">
<el-radio-group v-model="form.changeInfo.isFrameworkContract" :disabled="isFormDisabled">
<el-radio v-for="dict in is_framework_contract" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12" v-if="form.changeInfo.contractCategory === '3'">
<el-form-item label="框架合同有效期" prop="changeInfo.frameworkValidPeriod">
<el-date-picker
v-model="form.changeInfo.frameworkValidPeriod"
type="date"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择框架合同有效期"
:disabled="isFormDisabled"
style="width: 100%"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="12" v-if="form.changeInfo.contractCategory !== '3' && form.changeInfo.isFrameworkContract === '1'">
<el-form-item label="关联框架合同" prop="changeInfo.frameworkContractId">
<div class="flex gap-2 items-center" style="width: 100%">
<el-input :model-value="changeFrameworkContractDisplay" placeholder="请选择框架合同" readonly :disabled="isFormDisabled" />
<el-button type="primary" plain :disabled="isFormDisabled" @click="openChangeFrameworkContractDialog"></el-button>
<el-button :disabled="isFormDisabled || !form.changeInfo.frameworkContractId" @click="clearChangeFrameworkContract"></el-button>
</div>
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="业务方向"> <el-form-item label="业务方向" prop="changeInfo.businessDirection">
<el-select v-model="form.changeInfo.businessDirection" placeholder="请选择业务方向" :disabled="isFormDisabled" style="width: 100%"> <el-select v-model="form.changeInfo.businessDirection" placeholder="请选择业务方向" :disabled="isFormDisabled" style="width: 100%">
<el-option v-for="dict in business_direction" :key="dict.value" :label="dict.label" :value="dict.value" /> <el-option v-for="dict in business_direction" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="合同负责人"> <el-form-item label="合同负责人" prop="changeInfo.contractManagerId">
<el-select <el-select
v-model="form.changeInfo.contractManagerId" v-model="form.changeInfo.contractManagerId"
placeholder="请选择该合同客户经理或签订人" placeholder="请选择该合同客户经理或签订人"
@ -147,51 +175,31 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="合同签订日期"> <el-form-item label="甲方公司" prop="changeInfo.oneCustomerId">
<el-date-picker
clearable
v-model="form.changeInfo.contractDate"
type="date"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择合同时间"
:disabled="isFormDisabled"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="付款账户">
<el-select v-model="form.changeInfo.paymentAccountId" placeholder="请选择付款账户" :disabled="isFormDisabled" clearable style="width: 100%">
<el-option v-for="item in paymentAccountList" :key="item.paymentAccountId" :label="`${item.accountType || ''} - ${item.accountNumber || ''}`" :value="item.paymentAccountId" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="甲方公司">
<el-select v-model="form.changeInfo.oneCustomerId" placeholder="请选择甲方公司" :disabled="isFormDisabled" filterable style="width: 100%"> <el-select v-model="form.changeInfo.oneCustomerId" placeholder="请选择甲方公司" :disabled="isFormDisabled" filterable style="width: 100%">
<el-option v-for="item in customerInfoList" :key="item.customerId" :label="item.customerName" :value="item.customerId" /> <el-option v-for="item in customerInfoList" :key="item.customerId" :label="item.customerName" :value="item.customerId" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="乙方公司"> <el-form-item label="乙方公司" prop="changeInfo.twoCustomerId">
<el-select v-model="form.changeInfo.twoCustomerId" placeholder="请选择乙方公司" :disabled="isFormDisabled" filterable style="width: 100%"> <el-select v-model="form.changeInfo.twoCustomerId" placeholder="请选择乙方公司" :disabled="isFormDisabled" filterable style="width: 100%">
<el-option v-for="item in customerInfoList" :key="item.customerId" :label="item.customerName" :value="item.customerId" /> <el-option v-for="item in customerInfoList" :key="item.customerId" :label="item.customerName" :value="item.customerId" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="甲方授权代表"> <el-form-item label="甲方授权代表" prop="changeInfo.oneRepresent">
<el-input v-model="form.changeInfo.oneRepresent" placeholder="请输入甲方法人或其授权代表" :disabled="isFormDisabled" /> <el-input v-model="form.changeInfo.oneRepresent" placeholder="请输入甲方法人或其授权代表" :disabled="isFormDisabled" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="乙方授权代表"> <el-form-item label="乙方授权代表" prop="changeInfo.twoRepresent">
<el-input v-model="form.changeInfo.twoRepresent" placeholder="请输入乙方法人或其授权代表" :disabled="isFormDisabled" /> <el-input v-model="form.changeInfo.twoRepresent" placeholder="请输入乙方法人或其授权代表" :disabled="isFormDisabled" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="甲方签字日期"> <el-form-item label="甲方签字日期" prop="changeInfo.oneDate">
<el-date-picker <el-date-picker
clearable clearable
v-model="form.changeInfo.oneDate" v-model="form.changeInfo.oneDate"
@ -204,7 +212,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="乙方签字日期"> <el-form-item label="乙方签字日期" prop="changeInfo.twoDate">
<el-date-picker <el-date-picker
clearable clearable
v-model="form.changeInfo.twoDate" v-model="form.changeInfo.twoDate"
@ -217,14 +225,68 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="合同模板标识"> <el-form-item label="合同签订日期" prop="changeInfo.contractDate">
<el-date-picker
clearable
v-model="form.changeInfo.contractDate"
type="date"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择合同时间"
:disabled="isFormDisabled"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同属地" prop="changeInfo.contractTerritorialFlag">
<div style="display: flex; align-items: center; width: 100%; gap: 12px">
<el-radio-group v-model="form.changeInfo.contractTerritorialFlag" :disabled="isFormDisabled">
<el-radio v-for="dict in contract_territorial_flag" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
</el-radio-group>
<el-select
v-if="form.changeInfo.contractTerritorialFlag === '2'"
v-model="form.changeInfo.contractTerritorialCountry"
placeholder="请选择国家/地区"
:disabled="isFormDisabled"
filterable
clearable
style="flex: 1"
>
<el-option v-for="dict in country_region" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="结算币种" prop="changeInfo.settlementCurrency">
<el-select v-model="form.changeInfo.settlementCurrency" placeholder="请选择结算币种" :disabled="isFormDisabled" clearable style="width: 100%">
<el-option v-for="dict in currency_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="付款账户" prop="changeInfo.paymentAccountId">
<el-select v-model="form.changeInfo.paymentAccountId" placeholder="请选择付款账户" :disabled="isFormDisabled" clearable style="width: 100%">
<el-option v-for="item in paymentAccountList" :key="item.paymentAccountId" :label="`${item.accountType || ''} - ${item.accountNumber || ''}`" :value="item.paymentAccountId" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同状态" prop="changeInfo.contractStatus">
<el-radio-group v-model="form.changeInfo.contractStatus" disabled>
<el-radio v-for="dict in contract_status" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同模板标识" prop="changeInfo.contractTemplateFlag">
<el-radio-group v-model="form.changeInfo.contractTemplateFlag" :disabled="isFormDisabled"> <el-radio-group v-model="form.changeInfo.contractTemplateFlag" :disabled="isFormDisabled">
<el-radio v-for="dict in contract_template_flag" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio> <el-radio v-for="dict in contract_template_flag" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" v-show="form.changeInfo.contractTemplateFlag !== '1'"> <el-col :span="12" v-show="form.changeInfo.contractTemplateFlag !== '1'">
<el-form-item label="合同模板"> <el-form-item label="合同模板" prop="changeInfo.templateId">
<div class="flex gap-2 items-center" style="width: 100%"> <div class="flex gap-2 items-center" style="width: 100%">
<el-select v-model="form.changeInfo.templateId" placeholder="请选择合同模板" :disabled="isFormDisabled" filterable style="flex: 1"> <el-select v-model="form.changeInfo.templateId" placeholder="请选择合同模板" :disabled="isFormDisabled" filterable style="flex: 1">
<el-option <el-option
@ -248,14 +310,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="合同总价"> <el-form-item label="质保期描述" prop="changeInfo.warrantyPeriodDescription">
<el-input v-model="form.changeInfo.totalPrice" placeholder="根据合同物料自动计算" disabled>
<template #append></template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="质保期描述">
<el-input <el-input
v-model="form.changeInfo.warrantyPeriodDescription" v-model="form.changeInfo.warrantyPeriodDescription"
placeholder="请完整输入质保期描述验收合格后12个月或发货后18个月等" placeholder="请完整输入质保期描述验收合格后12个月或发货后18个月等"
@ -264,7 +319,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="交货地点"> <el-form-item label="交货地点" prop="changeInfo.deliveryLocation">
<el-input <el-input
v-model="form.changeInfo.deliveryLocation" v-model="form.changeInfo.deliveryLocation"
placeholder="请输入交货地点(如:甲方指定仓库/项目现场等)" placeholder="请输入交货地点(如:甲方指定仓库/项目现场等)"
@ -273,7 +328,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="运输方式"> <el-form-item label="运输方式" prop="changeInfo.shipMethod">
<el-input <el-input
v-model="form.changeInfo.shipMethod" v-model="form.changeInfo.shipMethod"
placeholder="请输入运输方式(如:汽运、空运、海运等)" placeholder="请输入运输方式(如:汽运、空运、海运等)"
@ -282,12 +337,12 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="签订地点"> <el-form-item label="签订地点" prop="changeInfo.signingPlace">
<el-input v-model="form.changeInfo.signingPlace" placeholder="请输入签订地点" :disabled="isFormDisabled" /> <el-input v-model="form.changeInfo.signingPlace" placeholder="请输入签订地点" :disabled="isFormDisabled" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="发货/交货期"> <el-form-item label="发货/交货期" prop="changeInfo.deliveryStart">
<el-input <el-input
v-model="form.changeInfo.deliveryStart" v-model="form.changeInfo.deliveryStart"
type="textarea" type="textarea"
@ -299,7 +354,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="备注"> <el-form-item label="备注" prop="changeInfo.remark">
<el-input <el-input
v-model="form.changeInfo.remark" v-model="form.changeInfo.remark"
type="textarea" type="textarea"
@ -309,7 +364,9 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="附件"> <el-form-item label="附件" prop="changeInfo.ossId">
<div style="display: flex; width: 100%; gap: 16px; align-items: flex-start">
<div style="flex: 1; min-width: 0">
<FileUpload <FileUpload
v-model="changeInfoOssId" v-model="changeInfoOssId"
:limit="5" :limit="5"
@ -318,23 +375,61 @@
:disabled="isFormDisabled" :disabled="isFormDisabled"
:isShowTip="true" :isShowTip="true"
/> />
</div>
<div style="width: 230px; display: flex; flex-direction: column; align-items: flex-start; padding-top: 2px">
<el-checkbox
v-model="form.changeInfo.effectiveCustomerOrderFlag"
true-value="1"
false-value="0"
:disabled="isFormDisabled"
>
<span style="font-weight: 600">已生效客户订单</span>
</el-checkbox>
<div style="color: #909399; font-size: 12px; line-height: 1.4; margin-top: 4px">
无需盖章或签字即刻生效的客户订单
</div>
</div>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同总价" prop="changeInfo.totalPrice">
<el-input v-model="form.changeInfo.totalPrice" placeholder="根据合同物料自动计算" disabled>
<template #append></template>
</el-input>
<div style="color: #909399; font-size: 12px; line-height: 1.4; margin-top: 4px">
由下方具体物料明细金额自动计算生成
</div>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-form>
</el-card> </el-card>
<!-- 变更后合同付款方式 --> <!-- 变更后合同付款方式 -->
<el-card shadow="never" style="margin-top: 0"> <el-card shadow="never" style="margin-top: 0">
<template #header> <template #header>
<div
style="
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: 8px 16px;
width: 100%;
"
>
<div style="text-align: left; font-weight: bold; font-size: 18px">合同付款方式</div> <div style="text-align: left; font-weight: bold; font-size: 18px">合同付款方式</div>
<div style="color: #e6a23c; font-size: 13px; line-height: 1.5; text-align: left; flex: 1; min-width: 220px">
请务必填写清楚付款节点及比例付款账期开票节点及比例
</div>
</div>
</template> </template>
<div style="margin-bottom: 16px; display: flex; align-items: center; gap: 12px"> <div style="margin-bottom: 16px; display: flex; align-items: center; gap: 12px">
<el-button type="primary" icon="Plus" v-if="!isFormDisabled" @click="handleAddPaymentMethod"></el-button> <el-button type="primary" icon="Plus" v-if="!isFormDisabled" @click="handleAddPaymentMethod"></el-button>
<el-form-item label="付款方式" prop="changeInfo.paymentMethod" style="margin-bottom: 0; width: 360px"> <el-form-item label="付款式" prop="changeInfo.paymentMethod" style="margin-bottom: 0; width: 360px">
<el-select <el-select
v-model="form.changeInfo.paymentMethod" v-model="form.changeInfo.paymentMethod"
placeholder="请选择付款方式" placeholder="请选择付款式"
:disabled="isFormDisabled" :disabled="isFormDisabled"
clearable clearable
style="width: 100%" style="width: 100%"
@ -527,6 +622,12 @@
</template> </template>
</el-dialog> </el-dialog>
<FrameworkContractSelectDialog
v-model:visible="changeFrameworkContractDialogVisible"
:current-contract-id="form.contractId"
@confirm="onChangeFrameworkContractConfirm"
/>
<SaleMaterialSelect ref="saleMaterialSelectRef" :multiple="false" @confirm-call-back="saleMaterialSelectCallBack" /> <SaleMaterialSelect ref="saleMaterialSelectRef" :multiple="false" @confirm-call-back="saleMaterialSelectCallBack" />
<ContractSelect ref="contractSelectRef" @confirm-call-back="contractSelectCallBack" /> <ContractSelect ref="contractSelectRef" @confirm-call-back="contractSelectCallBack" />
@ -559,6 +660,7 @@ import SubmitVerify from '@/components/Process/submitVerify.vue';
import FileUpload from '@/components/FileUpload/index.vue'; import FileUpload from '@/components/FileUpload/index.vue';
import SaleMaterialSelect from '@/components/SaleMaterialSelect/index.vue'; import SaleMaterialSelect from '@/components/SaleMaterialSelect/index.vue';
import ContractSelect from '@/components/ContractSelect/index.vue'; import ContractSelect from '@/components/ContractSelect/index.vue';
import FrameworkContractSelectDialog from '@/views/oa/components/FrameworkContractSelectDialog.vue';
import { FlowCodeEnum, CodeRuleEnum } from '@/enums/OAEnum'; import { FlowCodeEnum, CodeRuleEnum } from '@/enums/OAEnum';
import { getRuleGenerateCode } from '@/api/system/codeRule'; import { getRuleGenerateCode } from '@/api/system/codeRule';
@ -572,7 +674,12 @@ const {
contract_flag, contract_flag,
contract_template_flag, contract_template_flag,
material_flag, material_flag,
seal_legal_entity seal_legal_entity,
is_framework_contract,
contract_territorial_flag,
country_region,
currency_type,
contract_status
} = toRefs<any>( } = toRefs<any>(
proxy?.useDict( proxy?.useDict(
'contract_change_type', 'contract_change_type',
@ -581,7 +688,12 @@ const {
'contract_flag', 'contract_flag',
'contract_template_flag', 'contract_template_flag',
'material_flag', 'material_flag',
'seal_legal_entity' 'seal_legal_entity',
'is_framework_contract',
'contract_territorial_flag',
'country_region',
'currency_type',
'contract_status'
) )
); );
@ -773,12 +885,144 @@ const form = ref<
sealLegalEntity: undefined sealLegalEntity: undefined
}); });
const rules = { const changeFrameworkContractDialogVisible = ref(false);
const changeFrameworkContractDisplay = computed(() => {
const ci = form.value.changeInfo;
if (!ci) return '';
const code = ci.frameworkContractCode || '';
const name = ci.frameworkContractName || '';
return `${code} ${name}`.trim();
});
function openChangeFrameworkContractDialog() {
if (isFormDisabled.value) return;
changeFrameworkContractDialogVisible.value = true;
}
function onChangeFrameworkContractConfirm(selected: any) {
if (!form.value.changeInfo) return;
form.value.changeInfo.frameworkContractId = selected.contractId;
form.value.changeInfo.frameworkContractCode = selected.contractCode;
form.value.changeInfo.frameworkContractName = selected.contractName;
changeFrameworkContractDialogVisible.value = false;
}
function clearChangeFrameworkContract() {
if (!form.value.changeInfo) return;
form.value.changeInfo.frameworkContractId = undefined;
form.value.changeInfo.frameworkContractCode = undefined;
form.value.changeInfo.frameworkContractName = undefined;
}
watch(
() => form.value.changeInfo?.contractCategory,
(newVal) => {
if (newVal === '3' && form.value.changeInfo) {
form.value.changeInfo.isFrameworkContract = '0';
form.value.changeInfo.frameworkContractId = undefined;
form.value.changeInfo.frameworkContractCode = undefined;
form.value.changeInfo.frameworkContractName = undefined;
}
}
);
const baseRules = {
changeType: [{ required: true, message: '请选择变更类型', trigger: 'change' }], changeType: [{ required: true, message: '请选择变更类型', trigger: 'change' }],
contractId: [{ required: true, message: '请选择合同', trigger: 'change' }], contractId: [{ required: true, message: '请选择合同', trigger: 'change' }],
changeReason: [{ required: true, message: '请输入变更原因', trigger: 'blur' }] changeReason: [{ required: true, message: '请输入变更原因', trigger: 'blur' }]
}; };
const changeInfoRules: Record<string, any[]> = {
'changeInfo.contractCode': [{ required: true, message: '合同编号不能为空', trigger: 'blur' }],
'changeInfo.contractName': [{ required: true, message: '合同名称不能为空', trigger: 'blur' }],
'changeInfo.businessDirection': [{ required: true, message: '业务方向不能为空', trigger: 'blur' }],
'changeInfo.contractManagerId': [{ required: true, message: '合同负责人不能为空', trigger: 'blur' }],
'changeInfo.oneCustomerId': [{ required: true, message: '请选择甲方公司', trigger: 'change' }],
'changeInfo.twoCustomerId': [{ required: true, message: '请选择乙方公司', trigger: 'change' }],
'changeInfo.contractTerritorialFlag': [{ required: true, message: '合同属地标识不能为空', trigger: 'change' }],
'changeInfo.contractTerritorialCountry': [
{
validator: (_rule: any, _value: any, callback: (err?: Error) => void) => {
if (form.value.changeInfo?.contractTerritorialFlag === '2' && !form.value.changeInfo?.contractTerritorialCountry) {
callback(new Error('合同属地标识为“其他”时,国家/地区不能为空'));
return;
}
callback();
},
trigger: 'change'
}
],
'changeInfo.settlementCurrency': [{ required: true, message: '结算币种不能为空', trigger: 'change' }],
'changeInfo.ossId': [
{
validator: (_rule: any, _value: any, callback: (err?: Error) => void) => {
if (form.value.changeInfo?.effectiveCustomerOrderFlag === '1' && !form.value.changeInfo?.ossId) {
callback(new Error('已生效客户订单必须上传附件'));
return;
}
callback();
},
trigger: 'change'
}
],
'changeInfo.contractTemplateFlag': [{ required: true, message: '合同模板标识不能为空', trigger: 'blur' }],
'changeInfo.isFrameworkContract': [
{
validator: (_rule: any, _value: any, callback: (err?: Error) => void) => {
const ci = form.value.changeInfo;
if (!ci || ci.contractCategory === '3') {
callback();
return;
}
if (ci.isFrameworkContract == null || ci.isFrameworkContract === '') {
callback(new Error('请选择关联框架合同'));
return;
}
callback();
},
trigger: 'change'
}
],
'changeInfo.frameworkValidPeriod': [
{
validator: (_rule: any, _value: any, callback: (err?: Error) => void) => {
const ci = form.value.changeInfo;
if (!ci || ci.contractCategory !== '3') {
callback();
return;
}
if (!ci.frameworkValidPeriod) {
callback(new Error('请填写框架合同有效期'));
return;
}
callback();
},
trigger: 'change'
}
],
'changeInfo.frameworkContractId': [
{
validator: (_rule: any, _value: any, callback: (err?: Error) => void) => {
const ci = form.value.changeInfo;
if (ci && ci.contractCategory !== '3' && ci.isFrameworkContract === '1' && !ci.frameworkContractId) {
callback(new Error('请选择关联框架合同'));
return;
}
callback();
},
trigger: 'change'
}
]
};
const changeFormRules = computed(() => {
if (form.value.changeType === '1' && form.value.changeInfo) {
return { ...baseRules, ...changeInfoRules };
}
return { ...baseRules };
});
function goBack() { function goBack() {
proxy?.$tab.closePage(route); proxy?.$tab.closePage(route);
router.push({ path: '/contract/contractChange' }); router.push({ path: '/contract/contractChange' });
@ -894,7 +1138,18 @@ function mapContractToChangeInfo(c: any) {
'materialRemark', 'materialRemark',
'contractTemplateFlag', 'contractTemplateFlag',
'capitalizedAmount', 'capitalizedAmount',
'remark' 'remark',
'isFrameworkContract',
'frameworkContractId',
'frameworkContractCode',
'frameworkContractName',
'frameworkValidPeriod',
'contractTerritorialFlag',
'contractTerritorialCountry',
'settlementCurrency',
'rmbExchangeRate',
'contractStatus',
'effectiveCustomerOrderFlag'
]; ];
keys.forEach((k) => { keys.forEach((k) => {
if (c[k] !== undefined) info[k] = c[k]; if (c[k] !== undefined) info[k] = c[k];
@ -902,6 +1157,7 @@ function mapContractToChangeInfo(c: any) {
info.changeInfoId = undefined; info.changeInfoId = undefined;
info.contractChangeId = undefined; info.contractChangeId = undefined;
if (info.contractTemplateFlag == null) info.contractTemplateFlag = '2'; if (info.contractTemplateFlag == null) info.contractTemplateFlag = '2';
if (info.effectiveCustomerOrderFlag == null || info.effectiveCustomerOrderFlag === '') info.effectiveCustomerOrderFlag = '0';
return info; return info;
} }
@ -1151,6 +1407,18 @@ function submitForm(status: string, _mode: boolean) {
proxy?.$modal.msgError('内容变更请先选择合同,以加载变更后合同信息'); proxy?.$modal.msgError('内容变更请先选择合同,以加载变更后合同信息');
return; return;
} }
if (form.value.changeType === '1') {
const pay = form.value.changePaymentMethodList;
if (!Array.isArray(pay) || pay.length === 0) {
proxy?.$modal.msgWarning('请至少维护一条合同付款方式');
return;
}
const mat = form.value.changeMaterialList;
if (!Array.isArray(mat) || mat.length === 0) {
proxy?.$modal.msgWarning('请至少维护一条合同物料');
return;
}
}
if (status !== 'draft' && form.value.changeType === '1') { if (status !== 'draft' && form.value.changeType === '1') {
const newCode = (form.value.changeInfo?.contractCode ?? '').trim(); const newCode = (form.value.changeInfo?.contractCode ?? '').trim();
const oldCode = (form.value.contractCode ?? '').trim(); const oldCode = (form.value.contractCode ?? '').trim();

@ -103,6 +103,62 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="甲方公司" prop="oneCustomerId">
<el-select v-model="form.oneCustomerId" placeholder="请选择甲方公司" :disabled="isFormDisabled"
filterable>
<el-option v-for="item in customerInfoList" :key="item.customerId" :label="item.customerName"
:value="item.customerId" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="乙方公司" prop="twoCustomerId">
<el-select v-model="form.twoCustomerId" placeholder="请选择乙方公司" :disabled="isFormDisabled"
filterable>
<el-option v-for="item in customerInfoList" :key="item.customerId" :label="item.customerName"
:value="item.customerId" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="甲方授权代表" prop="oneRepresent">
<el-input v-model="form.oneRepresent" placeholder="请输入甲方法人或其授权代表"
:disabled="isFormDisabled" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="乙方授权代表" prop="twoRepresent">
<el-input v-model="form.twoRepresent" placeholder="请输入乙方法人或其授权代表"
:disabled="isFormDisabled" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="甲方签字日期" prop="oneDate">
<el-date-picker
clearable
v-model="form.oneDate"
type="date"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择甲方签字日期"
:disabled="isFormDisabled"
>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="乙方签字日期" prop="twoDate">
<el-date-picker
clearable
v-model="form.twoDate"
type="date"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择乙方签字日期"
:disabled="isFormDisabled"
>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="合同签订日期" prop="contractDate"> <el-form-item label="合同签订日期" prop="contractDate">
<el-date-picker <el-date-picker
@ -166,62 +222,6 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="甲方公司" prop="oneCustomerId">
<el-select v-model="form.oneCustomerId" placeholder="请选择甲方公司" :disabled="isFormDisabled"
filterable>
<el-option v-for="item in customerInfoList" :key="item.customerId" :label="item.customerName"
:value="item.customerId" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="乙方公司" prop="twoCustomerId">
<el-select v-model="form.twoCustomerId" placeholder="请选择乙方公司" :disabled="isFormDisabled"
filterable>
<el-option v-for="item in customerInfoList" :key="item.customerId" :label="item.customerName"
:value="item.customerId" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="甲方授权代表" prop="oneRepresent">
<el-input v-model="form.oneRepresent" placeholder="请输入甲方法人或其授权代表"
:disabled="isFormDisabled" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="乙方授权代表" prop="twoRepresent">
<el-input v-model="form.twoRepresent" placeholder="请输入乙方法人或其授权代表"
:disabled="isFormDisabled" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="甲方签字日期" prop="oneDate">
<el-date-picker
clearable
v-model="form.oneDate"
type="date"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择甲方签字日期"
:disabled="isFormDisabled"
>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="乙方签字日期" prop="twoDate">
<el-date-picker
clearable
v-model="form.twoDate"
type="date"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择乙方签字日期"
:disabled="isFormDisabled"
>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="合同状态" prop="contractStatus"> <el-form-item label="合同状态" prop="contractStatus">
<el-radio-group v-model="form.contractStatus" disabled> <el-radio-group v-model="form.contractStatus" disabled>
@ -273,13 +273,6 @@
<el-input v-model="form.capitalizedAmount" placeholder="请输入合同大写金额" /> <el-input v-model="form.capitalizedAmount" placeholder="请输入合同大写金额" />
</el-form-item> </el-form-item>
</el-col> --> </el-col> -->
<el-col :span="12">
<el-form-item label="合同总价" prop="totalPrice">
<el-input v-model="form.totalPrice" placeholder="根据合同物料自动计算" disabled>
<template #append></template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="质保期描述" prop="warrantyPeriodDescription"> <el-form-item label="质保期描述" prop="warrantyPeriodDescription">
<el-input <el-input
@ -359,6 +352,16 @@
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="合同总价" prop="totalPrice">
<el-input v-model="form.totalPrice" placeholder="根据合同物料自动计算" disabled>
<template #append></template>
</el-input>
<div style="color: #909399; font-size: 12px; line-height: 1.4; margin-top: 4px">
由下方具体物料明细金额自动计算生成
</div>
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
</el-card> </el-card>
@ -386,10 +389,10 @@
<el-button type="primary" icon="Plus" v-if="!isFormDisabled" @click="handleAddPaymentMethod" <el-button type="primary" icon="Plus" v-if="!isFormDisabled" @click="handleAddPaymentMethod"
>新增付款方式 >新增付款方式
</el-button> </el-button>
<el-form-item label="付款式" prop="paymentMethod" style="margin-bottom: 0; width: 360px"> <el-form-item label="付款式" prop="paymentMethod" style="margin-bottom: 0; width: 360px">
<el-select <el-select
v-model="form.paymentMethod" v-model="form.paymentMethod"
placeholder="请选择付款式" placeholder="请选择付款式"
:disabled="isFormDisabled" :disabled="isFormDisabled"
clearable clearable
style="width: 100%" style="width: 100%"
@ -479,7 +482,7 @@
<!-- 合同物料备注 --> <!-- 合同物料备注 -->
<el-form-item label="合同物料备注" prop="materialRemark" style="margin-bottom: 16px"> <el-form-item label="合同物料备注" prop="materialRemark" style="margin-bottom: 16px">
<el-input v-model="form.materialRemark" type="textarea" :rows="3" placeholder="请输入合同物料备注" <el-input v-model="form.materialRemark" type="textarea" :rows="3" placeholder="请输入合同物料备注(如税率、是否包含安装调试等需要特殊注意的内容)"
:disabled="isFormDisabled" /> :disabled="isFormDisabled" />
</el-form-item> </el-form-item>
@ -1141,6 +1144,8 @@ const data = reactive<{ form: ContractInfoFormEx; rules: any }>({
contractName: [{ required: true, message: '合同名称不能为空', trigger: 'blur' }], contractName: [{ required: true, message: '合同名称不能为空', trigger: 'blur' }],
businessDirection: [{ required: true, message: '业务方向不能为空', trigger: 'blur' }], businessDirection: [{ required: true, message: '业务方向不能为空', trigger: 'blur' }],
contractManagerId: [{ required: true, message: '合同负责人不能为空', trigger: 'blur' }], contractManagerId: [{ required: true, message: '合同负责人不能为空', trigger: 'blur' }],
oneCustomerId: [{ required: true, message: '请选择甲方公司', trigger: 'change' }],
twoCustomerId: [{ required: true, message: '请选择乙方公司', trigger: 'change' }],
contractTerritorialFlag: [{ required: true, message: '合同属地标识不能为空', trigger: 'change' }], contractTerritorialFlag: [{ required: true, message: '合同属地标识不能为空', trigger: 'change' }],
contractTerritorialCountry: [ contractTerritorialCountry: [
{ {
@ -1346,6 +1351,16 @@ const submitForm = (status: string, mode: boolean) => {
try { try {
contractInfoFormRef.value?.validate(async (valid: boolean) => { contractInfoFormRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
const paymentList = (form.value as any).contractPaymentMethodList;
if (!Array.isArray(paymentList) || paymentList.length === 0) {
proxy?.$modal.msgWarning('请维护合同付款方式');
return;
}
const materialList = (form.value as any).contractMaterialList;
if (!Array.isArray(materialList) || materialList.length === 0) {
proxy?.$modal.msgWarning('请维护合同物料');
return;
}
buttonLoading.value = true; buttonLoading.value = true;
// 稿 // 稿
if (status != 'draft') { if (status != 'draft') {

Loading…
Cancel
Save