@@ -900,6 +900,19 @@ const submitSuccessPayment = ref(null) // 成功后返回的支付单信息(
const selectedContract = ref(null)
const showContractSelector = ref(false)
+const getContractRequirement = (category) => {
+ if (!category) return 'none'
+ return category.contract_requirement || (category.need_contract ? 'required' : 'none')
+}
+
+const allowsContractSelection = (category) => {
+ return ['optional', 'required'].includes(getContractRequirement(category))
+}
+
+const requiresContractSelection = (category) => {
+ return getContractRequirement(category) === 'required'
+}
+
// 格式化金额
const formatAmount = (amount) => {
if (amount === null || amount === undefined) return '-'
@@ -923,7 +936,7 @@ const checkFieldDisplayConditionsWithContract = (element, contract = null) => {
// 如果当前支付分类开启了 need_contract,则取合同带回的 amount_total
// 如果没开启,取表单中的 amount 字段的值
let contractTotalAmount
- if (selectedCategory.value?.need_contract && contract) {
+ if (allowsContractSelection(selectedCategory.value) && contract) {
contractTotalAmount = contract.amount_total || 0
} else {
contractTotalAmount = currentPaymentAmount
@@ -984,7 +997,7 @@ const checkFieldDisplayConditionsWithContract = (element, contract = null) => {
// 检测字段显示状态是否受合同总金额影响
const checkFieldDisplayChangeByContract = (newContract) => {
- if (!selectedCategory.value?.need_contract || !templateElements.value || templateElements.value.length === 0) {
+ if (!allowsContractSelection(selectedCategory.value) || !templateElements.value || templateElements.value.length === 0) {
return { hasChange: false, changedFields: [] }
}
@@ -1269,7 +1282,7 @@ const checkFieldDisplayConditions = (element) => {
display_conditions: element?.display_conditions,
formDataAmount: formData.amount,
selectedCategory: selectedCategory.value,
- need_contract: selectedCategory.value?.need_contract,
+ contract_requirement: getContractRequirement(selectedCategory.value),
selectedContract: selectedContract.value,
contractAmountTotal: selectedContract.value?.amount_total
})
@@ -1287,7 +1300,7 @@ const checkFieldDisplayConditions = (element) => {
// 如果当前支付分类开启了 need_contract,则取合同带回的 amount_total
// 如果没开启,取表单中的 amount 字段的值
let contractTotalAmount
- if (selectedCategory.value?.need_contract && selectedContract.value) {
+ if (allowsContractSelection(selectedCategory.value) && selectedContract.value) {
contractTotalAmount = selectedContract.value.amount_total || 0
console.log('[checkFieldDisplayConditions] 使用合同总金额:', contractTotalAmount)
} else {
@@ -2300,12 +2313,12 @@ const handleNextStep = async () => {
return
}
- // 验证合同选择(直接支付且分类需要关联合同)
- if (isDirectPayment.value && selectedCategory.value?.need_contract) {
- if (!selectedContract.value) {
- ElMessage.warning('请选择关联合同')
- return
- }
+ // 验证合同选择(直接支付且分类要求必须关联合同)
+ if (isDirectPayment.value && requiresContractSelection(selectedCategory.value) && !selectedContract.value) {
+ ElMessage.warning('请选择关联合同')
+ return
+ }
+ if (isDirectPayment.value && selectedContract.value) {
// 再次验证合同类型(防止用户通过其他方式绕过)
if (selectedContract.value.amount_type === 'open') {
ElMessageBox.alert(
@@ -2662,13 +2675,13 @@ const autoCreatePayment = async () => {
return
}
- // 验证合同选择(直接支付且分类需要关联合同)
- if (isDirectPayment.value && selectedCategory.value?.need_contract) {
- if (!selectedContract.value) {
- ElMessage.warning('已创建OA流程,但缺少关联合同,请选择合同后手动提交')
- autoSubmitFailed.value = true
- return
- }
+ // 验证合同选择(直接支付且分类要求必须关联合同)
+ if (isDirectPayment.value && requiresContractSelection(selectedCategory.value) && !selectedContract.value) {
+ ElMessage.warning('已创建OA流程,但缺少关联合同,请选择合同后手动提交')
+ autoSubmitFailed.value = true
+ return
+ }
+ if (isDirectPayment.value && selectedContract.value) {
if (selectedContract.value.amount_type === 'open') {
ElMessage.warning('已创建OA流程,但合同类型不符合要求,请手动提交')
autoSubmitFailed.value = true
@@ -2873,12 +2886,12 @@ const handleSubmit = async () => {
return
}
- // 验证合同选择(直接支付且分类需要关联合同)
- if (isDirectPayment.value && selectedCategory.value?.need_contract) {
- if (!selectedContract.value) {
- ElMessage.warning('请选择关联合同')
- return
- }
+ // 验证合同选择(直接支付且分类要求必须关联合同)
+ if (isDirectPayment.value && requiresContractSelection(selectedCategory.value) && !selectedContract.value) {
+ ElMessage.warning('请选择关联合同')
+ return
+ }
+ if (isDirectPayment.value && selectedContract.value) {
// 再次验证合同类型
if (selectedContract.value.amount_type === 'open') {
ElMessageBox.alert(
@@ -3627,4 +3640,3 @@ onUnmounted(() => {
justify-content: flex-end;
}
-
diff --git a/src/views/payment/IndirectPayment.vue b/src/views/payment/IndirectPayment.vue
index b703d3f..1b8a4b4 100644
--- a/src/views/payment/IndirectPayment.vue
+++ b/src/views/payment/IndirectPayment.vue
@@ -594,9 +594,9 @@
-
+
@@ -886,9 +886,9 @@
-
+