admin-vue3/src/views/crm/quotation/components/QuotationProductForm.vue

376 lines
14 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
v-loading="formLoading"
label-width="0px"
:inline-message="true"
>
<el-table :data="formData" class="-mt-10px">
<el-table-column label="序号" type="index" width="80" />
<!-- <el-table-column label="产品名称" min-width="240">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.productName`" :rules="formRules.productName" class="mb-0px!">
{{row.productName}}
</el-form-item>
</template>
</el-table-column> -->
<el-table-column label="产品类型" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.category`" :rules="formRules.category" class="mb-0px!">
<dict-tag :type="DICT_TYPE.CRM_PRODUCT_CATEGORY" :value="row.category" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="产品明细" align="center" min-width="220">
<template #default="{ row }">
<dict-tag :type="DICT_TYPE.CRM_PRODUCT_DETAIL_TYPE" :value="row.detailType" />
</template>
</el-table-column>
<el-table-column label="产品单位" align="center" min-width="150">
<template #default="{ row }">
<dict-tag :type="DICT_TYPE.CRM_PRODUCT_UNIT" :value="row.productUnit" />
</template>
</el-table-column>
<el-table-column label="基础服务费" min-width="160">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.basicServiceFee`" :rules="formRules.basicServiceFee" class="mb-0px!">
<!-- <el-input v-model="row.basicServiceFee" oninput="value=value.match(/^\d+(?:\.\d{0,2})?/)" placeholder="" /> -->
{{row.basicServiceFee}}
</el-form-item>
</template>
</el-table-column>
<el-table-column label="垫资服务费" min-width="160">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.offlinePrice`" :rules="formRules.offlinePrice" class="mb-0px!">
<!-- <el-input v-model="row.offlinePrice" oninput="value=value.match(/^\d+(?:\.\d{0,2})?/)" placeholder="" /> -->
{{row.advancePaymentServiceFee}}
</el-form-item>
</template>
</el-table-column>
<el-table-column label="代订服务费" min-width="160">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.advancePaymentServiceFee`" :rules="formRules.advancePaymentServiceFee" class="mb-0px!">
{{row.bookingPaymentServiceFee}}
</el-form-item>
</template>
</el-table-column>
<el-table-column label="票据分拣服务费" min-width="172">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.billSortingServiceFee`" :rules="formRules.billSortingServiceFee" class="mb-0px!">
{{row.billSortingServiceFee}}
</el-form-item>
</template>
</el-table-column>
<el-table-column label="服务费收入合计" min-width="172">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.totalServiceFee`" :rules="formRules.totalServiceFee" class="mb-0px!">
{{row.totalServiceFee}}
</el-form-item>
</template>
</el-table-column>
<el-table-column label="产品票据" align="center" min-width="150">
<template #default>
<!-- <el-form-item :prop="`${$index}.productInvoice`" :rules="formRules.productInvoice" class="mb-0px!">
<el-select v-model="row.productInvoice" placeholder="请选择状态" clearable class="!w-240px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_PRODUCT_INVOICE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item> -->
<dict-tag :type="DICT_TYPE.CRM_PRODUCT_INVOICE" :value="1" />
</template>
</el-table-column>
<el-table-column label="产品开具项目" align="center" min-width="220">
<template #default>
<!-- <el-form-item :prop="`${$index}.productInvoiceItem`" :rules="formRules.productInvoiceItem" class="mb-0px!">
<el-select v-model="row.productInvoiceItem" placeholder="请选择状态" clearable class="!w-240px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_PRODUCT_INVOICE_ITEMS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item> -->
<dict-tag :type="DICT_TYPE.CRM_PRODUCT_INVOICE_ITEMS" :value="1" />
</template>
</el-table-column>
<el-table-column label="服务费票据" align="center" min-width="150">
<template #default>
<!-- <el-form-item :prop="`${$index}.serviceInvoice`" :rules="formRules.serviceInvoice" class="mb-0px!">
<el-select v-model="row.serviceInvoice" placeholder="请选择状态" clearable class="!w-240px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_SERVICE_FEE_INVOICE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item> -->
<dict-tag :type="DICT_TYPE.CRM_SERVICE_FEE_INVOICE" :value="1" />
</template>
</el-table-column>
<el-table-column label="服务开具项目" align="center" min-width="240">
<template #default>
<!-- <el-form-item :prop="`${$index}.serviceInvoiceItem`" :rules="formRules.serviceInvoiceItem" class="mb-0px!">
<el-select v-model="row.serviceInvoiceItem" placeholder="请选择状态" clearable class="!w-240px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_SERVICE_FEE_INVOICE_ITEMS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item> -->
<dict-tag :type="DICT_TYPE.CRM_SERVICE_FEE_INVOICE_ITEMS" :value="1" />
</template>
</el-table-column>
<!-- <el-table-column align="center" fixed="right" label="操作" width="60">
<template #default="{ $index }">
<el-button @click="handleDelete($index)" link>—</el-button>
</template>
</el-table-column> -->
</el-table>
</el-form>
<el-row justify="center" class="mt-3">
<!-- <el-button @click="handleAdd" round>+ 添加CRM 报价产品关联</el-button> -->
</el-row>
</template>
<script setup lang="ts">
import { QuotationApi } from '@/api/crm/quotation'
import { BillTemplateApi, BillTemplateVO } from '@/api/crm/billtemplate'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import * as BusinessApi from '@/api/crm/business'
const props = defineProps<{
quotationId: undefined, //
businessId: undefined,
billTemplateId: undefined,
products: undefined,
handleType: undefined,
serviceFeeId: undefined
QuotationTimes: []
}>()
const formLoading = ref(false) // 表单的加载中
const formData = ref([])
const formRules = reactive({
quotationId: [{ required: true, message: '报价编号不能为空', trigger: 'blur' }],
productId: [{ required: true, message: '产品编号不能为空', trigger: 'blur' }],
productName: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }],
category: [{ required: true, message: '产品类型不能为空', trigger: 'blur' }],
detailType: [{ required: true, message: '产品明细类型不能为空', trigger: 'blur' }],
// productUnit: [{ required: true, message: '产品单位不能为空', trigger: 'blur' }],
// basicServiceFee: [{ required: true, message: '基础服务费不能为空', trigger: 'blur' }],
// offlinePrice: [{ required: true, message: '线下价格不能为空', trigger: 'blur' }],
totalPrice: [{ required: true, message: '总计价格不能为空', trigger: 'blur' }],
productInvoiceItem: [{ required: true, message: '产品开具项目不能为空', trigger: 'blur' }],
serviceInvoice: [{ required: true, message: '服务费票据不能为空', trigger: 'blur' }],
serviceInvoiceItem: [{ required: true, message: '服务开具项目不能为空', trigger: 'blur' }],
productInvoice: [{ required: true, message: '产品票据不能为空', trigger: 'blur' }],
})
const formRef = ref() // 表单 Ref
const emit = defineEmits(['update:handleType', 'success'])
/** 监听主表的关联字段的变化,加载对应的子表数据 */
watch(
() => props.businessId,
async (val) => {
if(!props.handleType) return
// 1. 重置表单
formData.value = []
// 2. val 非空,则加载数据
if (!val) {
return;
}
try {
formLoading.value = true
// if(val.quotationId) {
// formData.value = await QuotationApi.getQuotationProductListByQuotationId(val.quotationId)
// } else if(val.businessId) {
const business = await BusinessApi.getBusiness(val);
let data = business.products
data.forEach(item => {
item.onlinePrice = ''
item.offlinePrice = ''
item.productInvoice = 1
item.productInvoiceItem = 1
item.serviceInvoice = 1
item.serviceInvoiceItem = 1
})
formData.value = data
emit('update:handleType', 0)
// }
} finally {
formLoading.value = false
}
},
{ immediate: true }
)
watch(
() => props.billTemplateId,
async (val) => {
// 2. val 非空,则加载数据
if(!props.handleType) {
return
}
if (!val) {
return;
}
try {
formLoading.value = true
// if(val.quotationId) {
// formData.value = await QuotationApi.getQuotationProductListByQuotationId(val.quotationId)
// } else if(val.businessId) {
const business = await BillTemplateApi.getTemplateProduct({
businessId: props.businessId,
billTemplateId: val,
});
for(let i = 0; i < business.length; i++) {
let data = business[i]
if(!data.productId) {
data.productInvoice = ''
data.productInvoiceItem = ''
data.serviceInvoice = ''
data.serviceInvoiceItem = ''
}
let foundItem = formData.value.find(item => item.productId == data.productId);
if (foundItem) {
foundItem.productInvoice = data.productInvoice
foundItem.productInvoiceItem = data.productInvoiceItems
foundItem.serviceInvoice = data.serviceFeeInvoice
foundItem.serviceInvoiceItem = data.serviceFeeInvoiceItems
}
}
emit('update:handleType', 0)
// formData.value = business
// }
} finally {
formLoading.value = false
}
},
{ immediate: true }
)
watch(
() => props.QuotationTimes,
async (val) => {
// 2. val 非空,则加载数据
if (!val || !val.length) {
return;
}
try {
formLoading.value = true
for(let i = 0; i < val.length; i++) {
let data = val[i]
if(!data.id) {
data.basicServiceFee = ''
data.advancePaymentServiceFee = ''
data.bookingPaymentServiceFee = ''
data.billSortingServiceFee = ''
data.totalServiceFee = ''
}
let foundItem = formData.value.find(item => item.productId == data.id);
if (foundItem) {
foundItem.basicServiceFee = data.serviceFeeVO.basicServiceFee
foundItem.advancePaymentServiceFee = data.serviceFeeVO.advancePaymentServiceFee
foundItem.bookingPaymentServiceFee = data.serviceFeeVO.bookingPaymentServiceFee
foundItem.billSortingServiceFee = data.serviceFeeVO.billSortingServiceFee
foundItem.totalServiceFee = data.serviceFeeVO.totalServiceFee
foundItem.productUnit = data.productUnit
}
}
// formData.value = data
// emit('update:handleType', 0)
// }
} finally {
formLoading.value = false
}
},
{ deep: true }
)
// 监听合同产品变化,计算合同产品总价
watch(
() => formData.value,
(val) => {
if (!val || val.length === 0) {
return;
}
// 循环处理
// val.forEach((item) => {
// if (item.offlinePrice != null && item.basicServiceFee != null) {
// item.downlinePrice = Number((Number(item.offlinePrice) + Number(item.basicServiceFee)).toFixed(2)) || 0;
// item.totalServiceFee = Number((Number(item.downlinePrice) + Number(item.basicServiceFee)).toFixed(2)) || 0;
// } else {
// item.totalServiceFee = 0;
// }
// });
emit('success', formData.value)
},
{ deep: true }
);
watch(
() => props.products,
async (val) => {
if (!val || val.length === 0) {
return;
}
await nextTick(() => {
formData.value = val
})
},
{ immediate: true },
);
/** 新增按钮操作 */
const handleAdd = () => {
const row = {
quotationId: undefined,
productId: undefined,
productName: undefined,
detailType: undefined,
productUnit: undefined,
basicServiceFee: undefined,
offlinePrice: undefined,
totalServiceFee: undefined,
productInvoice: undefined,
productInvoiceItem: undefined,
serviceInvoice: undefined,
serviceFeeInvoiceItems: undefined
}
row.quotationId = props.quotationId
formData.value.push(row)
}
/** 删除按钮操作 */
const handleDelete = (index) => {
formData.value.splice(index, 1)
}
/** 表单校验 */
const validate = () => {
return formRef.value.validate()
}
/** 表单值 */
const getData = () => {
return formData.value
}
defineExpose({ validate, getData })
</script>