diff --git a/src/views/oa/erp/contractChange/edit.vue b/src/views/oa/erp/contractChange/edit.vue index 8eb39aa..8c45b50 100644 --- a/src/views/oa/erp/contractChange/edit.vue +++ b/src/views/oa/erp/contractChange/edit.vue @@ -21,7 +21,7 @@ {{ isEdit ? '编辑合同变更' : '合同变更申请' }} - + @@ -97,10 +97,9 @@ 变更后合同信息 - - + - + - + - + + + + + {{ dict.label }} + + + + + + + + + + + + + 选择 + 清空 + + + - + - + - - - - - - - - - - - - - + - + - + - + - + - + - + + + + + + + + + {{ dict.label }} + + + + + + + + + + + + + + + + + + + + + + + + + {{ dict.label }} + + + + + {{ dict.label }} - + - - - 元 - - - - - + - + - + - + - + - + - - + + + + + + + + 已生效客户订单 + + + (无需盖章或签字,即刻生效的客户订单) + + + + + + + + + 元 + + + 由下方具体物料明细金额自动计算生成 + - - 合同付款方式 + + 合同付款方式 + + (请务必填写清楚付款节点及比例、付款账期、开票节点及比例。) + + 新增付款方式 - + + + @@ -559,6 +660,7 @@ import SubmitVerify from '@/components/Process/submitVerify.vue'; import FileUpload from '@/components/FileUpload/index.vue'; import SaleMaterialSelect from '@/components/SaleMaterialSelect/index.vue'; import ContractSelect from '@/components/ContractSelect/index.vue'; +import FrameworkContractSelectDialog from '@/views/oa/components/FrameworkContractSelectDialog.vue'; import { FlowCodeEnum, CodeRuleEnum } from '@/enums/OAEnum'; import { getRuleGenerateCode } from '@/api/system/codeRule'; @@ -572,7 +674,12 @@ const { contract_flag, contract_template_flag, material_flag, - seal_legal_entity + seal_legal_entity, + is_framework_contract, + contract_territorial_flag, + country_region, + currency_type, + contract_status } = toRefs( proxy?.useDict( 'contract_change_type', @@ -581,7 +688,12 @@ const { 'contract_flag', 'contract_template_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 }); -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' }], contractId: [{ required: true, message: '请选择合同', trigger: 'change' }], changeReason: [{ required: true, message: '请输入变更原因', trigger: 'blur' }] }; +const changeInfoRules: Record = { + '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() { proxy?.$tab.closePage(route); router.push({ path: '/contract/contractChange' }); @@ -894,7 +1138,18 @@ function mapContractToChangeInfo(c: any) { 'materialRemark', 'contractTemplateFlag', 'capitalizedAmount', - 'remark' + 'remark', + 'isFrameworkContract', + 'frameworkContractId', + 'frameworkContractCode', + 'frameworkContractName', + 'frameworkValidPeriod', + 'contractTerritorialFlag', + 'contractTerritorialCountry', + 'settlementCurrency', + 'rmbExchangeRate', + 'contractStatus', + 'effectiveCustomerOrderFlag' ]; keys.forEach((k) => { if (c[k] !== undefined) info[k] = c[k]; @@ -902,6 +1157,7 @@ function mapContractToChangeInfo(c: any) { info.changeInfoId = undefined; info.contractChangeId = undefined; if (info.contractTemplateFlag == null) info.contractTemplateFlag = '2'; + if (info.effectiveCustomerOrderFlag == null || info.effectiveCustomerOrderFlag === '') info.effectiveCustomerOrderFlag = '0'; return info; } @@ -1151,6 +1407,18 @@ function submitForm(status: string, _mode: boolean) { proxy?.$modal.msgError('内容变更请先选择合同,以加载变更后合同信息'); 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') { const newCode = (form.value.changeInfo?.contractCode ?? '').trim(); const oldCode = (form.value.contractCode ?? '').trim(); diff --git a/src/views/oa/erp/contractInfo/edit.vue b/src/views/oa/erp/contractInfo/edit.vue index e884ff0..59a44f6 100644 --- a/src/views/oa/erp/contractInfo/edit.vue +++ b/src/views/oa/erp/contractInfo/edit.vue @@ -103,6 +103,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -273,13 +273,6 @@ --> - - - - 元 - - - + + + + 元 + + + 由下方具体物料明细金额自动计算生成 + + + @@ -386,10 +389,10 @@ 新增付款方式 - + - @@ -1141,6 +1144,8 @@ const data = reactive<{ form: ContractInfoFormEx; rules: any }>({ contractName: [{ required: true, message: '合同名称不能为空', trigger: 'blur' }], businessDirection: [{ 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' }], contractTerritorialCountry: [ { @@ -1346,6 +1351,16 @@ const submitForm = (status: string, mode: boolean) => { try { contractInfoFormRef.value?.validate(async (valid: boolean) => { 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; // 设置后端发起和不等于草稿状态 直接走流程发起 if (status != 'draft') {