<script lang="ts" setup name="CustomerEdit"> /** * 添加/编辑/详情客户 */ import dayjs from 'dayjs' import type { Ref } from 'vue' import { ElLoading, ElMessage, ElMessageBox } from 'element-plus' import type { FormInstance } from 'element-plus' import type { CustomerPerson, ICustomer, Menu, SimpleCertification, SimpleContract, SimpleMeasureRecord, SimpleSample, dictType } from './customer_interface' import TemplateTable from './templateTable.vue' import showPhoto from '@/views/system/tool/showPhoto.vue' import { UploadFile } from '@/api/measure/file' import { addCustomer, getCertificationByCustomer, getContractByCustomer, getCustomerDetail, getOrderByCustomer, getSampleByCustomer, updateCustomer } from '@/api/customer/customer' import { validatePhone } from '@/utils/validate' import type { IAddress } from '@/components/AddressSelect/address-interface' import { getDictByCode } from '@/api/system/dict' import { SCHEDULE } from '@/utils/scheduleDict' import { calc } from '@/utils/useCalc' import type { IRecord } from '@/views/business/schedule/interchange/interchange_interface' const loading = ref(false) // 表单加载状态 const infoId = ref('') // id const pageType = ref('add') // 页面类型: add, edit, detail const buttonLoading = ref(false) // 按钮加载状态 const textMap: { [key: string]: string } = { edit: '编辑', add: '新建', detail: '详情', }// 字典 // 从路由中获取页面类型参数 const $route = useRoute() if ($route.params && $route.params.type) { pageType.value = $route.params.type as string if ($route.params.id) { infoId.value = $route.params.id as string } } const dataForm: Ref<ICustomer> = ref({ id: '', businessContent: '', customerName: '', customerNo: '', bankAccount: '', bankAccountNumber: '', bankName: '', briefName: '', businessScope: '', grade: '', // 履约评级 companySize: '', // 公司规模 businessSize: '', // 业务规模 evaluation: '', // 整体评价 fullAddress: '', addressArea: '', addressCity: '', addressCountry: '', addressProvince: '', addressAreaName: '', addressCityName: '', addressCountryName: '', addressProvinceName: '', director: '', fax: '', invoiceFullAddress: '', invoiceArea: '', invoiceCity: '', invoiceCountry: '', invoiceProvince: '', invoiceAreaName: '', invoiceCityName: '', invoiceCountryName: '', invoiceProvinceName: '', email: '', minioFileName: '', mobile: '', phone: '', postalCode: '', remark: '', taxNumber: '', website: '', customerUserList: [], }) const fullAddress = ref<string[]>([]) // 公司地址 const invoiceFullAddress = ref<string[]>([]) // 开票地址 const customerPersonList: Ref<CustomerPerson[]> = ref([]) // 人员列表 const columns = ref([ { text: '姓名', value: 'name', required: true, align: 'center' }, { text: '工作部门', value: 'department', required: false, align: 'center' }, { text: '职务', value: 'job', required: false, align: 'center' }, { text: '联系方式', value: 'phone', required: true, reg: validatePhone, align: 'center' }, ]) // -----------------------------------表格---------------------------------------------- // 其他关联数据列表 const dataList = ref({ personList: [] as CustomerPerson[], sampleRecords: [] as SimpleSample[], contractRecords: [] as SimpleContract[], measureRecords: [] as SimpleMeasureRecord[], // 检定记录 certificationRecords: [] as SimpleCertification[], // 检定证书 }) // 检测记录和检定证书查询条件 const listQuery = ref<IRecord>({ sampleId: '', // 样品id customerId: infoId.value, // 客户id offset: 1, limit: 10, }) // 合同记录请求参数 const contractListQuery = ref({ agreementKind: '1', // 合同种类-收入合同1 agreementName: '', // 合同名字 agreementNo: '', // 合同编号 agreementType: '', // 合同类型-采购合同/业务合同等-字典code customerId: infoId.value, // 单位id(客户id)(收入合同该字段为甲方单位,支出合同该字段为乙方单位) estimateSignEndDate: '', // 预计签订/实际签订结束日期 estimateSignStartDate: '', // 预计签订/实际签订开始日期 firstParty: '', // 单位名字(收入合同该字段为甲方单位,支出合同该字段为乙方单位) formId: SCHEDULE.BUSINESS_FINANCE_CONTRACT_APPROVE, // 表单id ids: [], // 导出ids status: '', // 合同完成状态-字典code offset: 1, limit: 10, }) // 样品记录查询条件 const sampleListQuery = ref({ id: infoId.value, // 客户id offset: 1, limit: 10, }) const totalRecords = ref(0) // 检定记录 const totalCertifications = ref(0) // 检定证书 const totalContract = ref(0) // 合同记录 const totalSample = ref(0) // 样品记录 // 获取样品列表 const fetchSampleList = function () { getSampleByCustomer(sampleListQuery.value).then((res) => { dataList.value.sampleRecords = res.data.rows totalSample.value = res.data.total }) } // 获取合同记录 const fetchContractRecords = function () { getContractByCustomer(contractListQuery.value).then((response) => { dataList.value.contractRecords = response.data.rows.map((item: { estimateSignDate: string; agreementAmount: number }) => { return { ...item, estimateSignDate: item.estimateSignDate ? dayjs(item.estimateSignDate).format('YYYY-MM-DD') : item.estimateSignDate, agreementAmount: calc(Number(item.agreementAmount), 100, '/'), } }) totalContract.value = parseInt(response.data.total) }) } // 获取检定记录 const fetchMeasureRecords = function () { getOrderByCustomer(listQuery.value).then((res) => { dataList.value.measureRecords = res.data.rows.map((item: { orderTime: string; deliverTime: string }) => { return { ...item, orderTime: item.orderTime ? dayjs(item.orderTime).format('YYYY-MM-DD') : '', deliverTime: item.deliverTime ? dayjs(item.deliverTime).format('YYYY-MM-DD') : '', } }) totalRecords.value = parseInt(res.data.total) }) } // 获取检定证书 const fetchCertifications = function () { getCertificationByCustomer(listQuery.value).then((res) => { dataList.value.certificationRecords = res.data.rows.map((item: { effectiveDate: string; expirationDate: string }) => { return { ...item, effectiveDate: item.effectiveDate ? dayjs(item.effectiveDate).format('YYYY-MM-DD') : '', expirationDate: item.expirationDate ? dayjs(item.expirationDate).format('YYYY-MM-DD') : '', } }) totalCertifications.value = parseInt(res.data.total) }) } // 菜单 const menu = ref<Menu[]>([ { name: '客户人员', columns: [ { text: '姓名', value: 'name', align: 'center' }, { text: '工作部门', value: 'department', align: 'center' }, { text: '职务', value: 'job', align: 'center' }, { text: '联系方式', value: 'phone', align: 'center' }, ], pagination: false, list: 'personList', searchFunc: null, }, { name: '样品记录', query: { id: '', limit: 10, offset: 1, }, columns: [ { text: '样品编号', value: 'sampleNo', align: 'center', width: '160' }, { text: '样品名称', value: 'sampleName', align: 'center' }, { text: '型号', value: 'sampleModel', align: 'center' }, { text: '出厂编号', value: 'manufacturingNo', align: 'center' }, { text: '上次检定时间', value: 'measureLastTime', align: 'center', width: '180' }, { text: '检定周期(月)', value: 'measurePeriod', align: 'center' }, ], pagination: true, list: 'sampleRecords', searchFunc: fetchSampleList, }, { name: '合同记录', columns: [ { text: '合同编号', value: 'agreementNo', align: 'center', width: '160' }, { text: '合同名称', value: 'agreementName', align: 'center' }, { text: '合同金额(元)', value: 'agreementAmount', align: 'center' }, { text: '签订日期', value: 'estimateSignDate', align: 'center', width: '120' }, { text: '负责人', value: 'director', align: 'center' }, ], query: { id: '', limit: 10, offset: 1, }, list: 'contractRecords', pagination: true, searchFunc: fetchContractRecords, }, { name: '检定记录', columns: [ { text: '委托单编号', value: 'orderCode', align: 'center', width: '160' }, { text: '委托单日期', value: 'orderTime', align: 'center', width: '120' }, { text: '委托方代码', value: 'customerCode', align: 'center', width: '160' }, { text: '委托方名称', value: 'customerName', align: 'center' }, { text: '送检人', value: 'deliverer', align: 'center' }, { text: '送检日期', value: 'deliverTime', align: 'center', width: '120' }, ], query: { id: '', limit: 10, offset: 1, }, list: 'measureRecords', pagination: true, searchFunc: fetchMeasureRecords, }, { name: '检定证书', query: { id: '', limit: 10, offset: 1, }, columns: [ { text: '证书编号', value: 'certificationCode', align: 'center', width: '160' }, { text: '证书名称', value: 'certificationName', align: 'center' }, { text: '证书类型', value: 'certificationClassName', align: 'center' }, { text: '证书出具日期', value: 'effectiveDate', align: 'center', width: '120' }, { text: '证书有效期', value: 'expirationDate', align: 'center', width: '120' }, ], list: 'certificationRecords', pagination: true, searchFunc: fetchCertifications, }, ]) const currentMenu = ref('客户人员') const currentMenuObj = computed(() => { return menu.value.find(item => item.name === currentMenu.value) }) watch(currentMenuObj, () => { listQuery.value.offset = 1 // 检定记录和检定证书 contractListQuery.value.offset = 1 // 合同记录 sampleListQuery.value.offset = 1 // 样品记录 if (currentMenuObj.value?.searchFunc) { currentMenuObj.value?.searchFunc() } }, { deep: true, immediate: true, }) // 监听页数变化 const changePage = (val: any) => { if (val.value && currentMenuObj) { listQuery.value.offset = val.value.offset // 检定记录和检定证书 listQuery.value.limit = val.value.limit // 检定记录和检定证书 contractListQuery.value.offset = val.value.offset // 合同记录 contractListQuery.value.limit = val.value.limit // 合同记录 sampleListQuery.value.offset = val.value.offset // 样品记录 sampleListQuery.value.limit = val.value.limit // 样品记录 if (currentMenuObj.value?.searchFunc) { currentMenuObj.value?.searchFunc() } } } const ruleFormRef = ref<FormInstance>() // 人员对象 const addPersonObj: CustomerPerson = { id: '', customerId: '', userNo: '', name: '', department: '', job: '', phone: '', editable: true, } const SelectionList: Ref<CustomerPerson[]> = ref([]) // 校验规则 const rules = ref({ customerName: [{ required: true, message: '公司名称必填', trigger: 'blur' }], businessContent: [{ required: true, message: '业务内容必填', trigger: 'blur' }], }) // 表单验证规则 // 初始化router const $router = useRouter() // 关闭新增页面的回调 const close = () => { $router.back() } const companySizeList = ref<dictType[]>([]) // 公司规模列表 const businessSizeList = ref<dictType[]>([]) // 业务规模列表 const gradeList = ref<dictType[]>([]) // 履约评级列表 const evaluationList = ref<dictType[]>([]) // 整体评价列表 function getDict() { // 获取公司规模 getDictByCode('companySize').then((response) => { companySizeList.value = response.data }) // 获取业务规模 getDictByCode('businessSize').then((response) => { businessSizeList.value = response.data }) // 获取履约评级 getDictByCode('grade').then((response) => { gradeList.value = response.data }) // 获取整体评价 getDictByCode('evaluation').then((response) => { evaluationList.value = response.data }) } const getInfo = () => { loading.value = true getCustomerDetail({ id: infoId.value }).then((res) => { loading.value = false // res.data = { bankAccount: '银行账户', bankAccountNumber: '银行账号', bankName: '工商银行', briefName: '京东', businessContent: '电商', businessScope: 'test1', grade: '1', gradeName: '优质', companySize: '1', companySizeName: '优质', businessSize: '1', businessSizeName: '小微企业', evaluation: '1', evaluationName: '优质', fullAddress: '五棵松', addressAreaName: '海淀区', addressCityName: '北京市', addressCountryName: '中国', addressProvinceName: '北京', addressArea: '110107', addressCity: '110100', addressCountry: 'CN', addressProvince: '110000', createTime: '2022-11-29 21:14:50', director: '刘强东', fax: 'test1', id: '1597579843411234817', invoiceFullAddress: '五棵松', invoiceAreaName: '海淀区', invoiceCityName: '北京市', invoiceCountryName: '中国', invoiceProvinceName: '北京', invoiceyArea: '110107', invoiceCity: '110100', invoiceCountry: 'CN', invoiceProvince: '110000', email: 'test1', minioFileName: 'test', mobile: 'test', phone: '950618', postalCode: 'test', remark: 'test', customerName: '京东集团', customerNo: 'sygf202211290001', taxNumber: 'test', updateTime: '2023-01-10 09:56:57', website: 'test' } dataForm.value = res.data if (pageType.value == 'detail') { fullAddress.value = [dataForm.value.addressCountryName, dataForm.value.addressProvinceName, dataForm.value.addressCityName, dataForm.value.addressAreaName, dataForm.value.fullAddress] invoiceFullAddress.value = [dataForm.value.invoiceCountryName, dataForm.value.invoiceProvinceName, dataForm.value.invoiceCityName, dataForm.value.invoiceAreaName, dataForm.value.invoiceFullAddress] // 人员列表 dataList.value.personList = res.data.customerUserList // 其他查询菜单 for (const item of menu.value) { if (item.searchFunc) { item.searchFunc(item.query) } } } else { fullAddress.value = [dataForm.value.addressCountry, dataForm.value.addressProvince, dataForm.value.addressCity, dataForm.value.addressArea, dataForm.value.fullAddress] invoiceFullAddress.value = [dataForm.value.invoiceCountry, dataForm.value.invoiceProvince, dataForm.value.invoiceCity, dataForm.value.invoiceArea, dataForm.value.invoiceFullAddress] // 人员列表 customerPersonList.value = res.data.customerUserList.map((item: CustomerPerson) => { return { id: '', customerId: '', userNo: item.userNo, name: item.name, department: item.department, job: item.job, phone: item.phone, editable: true, } }) } }) } // 表格选中 const handleSelectionChange = (e: CustomerPerson[]) => { SelectionList.value = e } // 公司地址变化后给对象赋值 function fullAddressChange(addressObj: IAddress) { console.log(addressObj) dataForm.value.addressCountry = addressObj.country dataForm.value.addressProvince = addressObj.province dataForm.value.addressCity = addressObj.city dataForm.value.addressArea = addressObj.area dataForm.value.fullAddress = addressObj.address dataForm.value.addressCountryName = addressObj.countryName dataForm.value.addressProvinceName = addressObj.provinceName dataForm.value.addressCityName = addressObj.cityName dataForm.value.addressAreaName = addressObj.areaName } // 开票地址发生变化 function invoiceFullAddressChange(addressObj: IAddress) { dataForm.value.invoiceCountry = addressObj.country dataForm.value.invoiceProvince = addressObj.province dataForm.value.invoiceCity = addressObj.city dataForm.value.invoiceArea = addressObj.area dataForm.value.invoiceFullAddress = addressObj.address dataForm.value.invoiceCountryName = addressObj.countryName dataForm.value.invoiceProvinceName = addressObj.provinceName dataForm.value.invoiceCityName = addressObj.cityName dataForm.value.invoiceAreaName = addressObj.areaName } // 点击增加行 const addRow = () => { // 检查上一行必填项 if (checkPersonList()) { setAllRowReadable() customerPersonList.value.push({ ...addPersonObj }) } } // 检查人员列表 function checkPersonList() { for (let index = 0; index < customerPersonList.value.length; index++) { const item = customerPersonList.value[index] for (const prop of columns.value) { // 检查必填 if (prop.required && !item[prop.value]) { ElMessage.warning(`请先完善第${index + 1}行中${prop.text}`) return false } // 验证正则 if (prop.reg && typeof prop.reg === 'function') { if (!prop.reg(item[prop.value])) { ElMessage.warning(`第${index + 1}行中${prop.text}输入不合法`) return false } } } } return true } // 删除行 const deleteList = () => { customerPersonList.value = customerPersonList.value.filter((item: CustomerPerson) => { return !SelectionList.value.includes(item) }) } // 打印表单 const printObj = ref({ id: 'form', // 需要打印元素的id popTitle: '客户详情', // 打印配置页上方的标题 extraHead: '<div style="display: flex;flex-direction: column;text-align: center"><h3>客户详情</h3></div>', // 最上方的头部文字,附加在head标签上的额外标签,使用逗号分割 preview: false, // 是否启动预览模式,默认是false standard: '', extarCss: '', }) // 保存 function saveForm(formEl: FormInstance | undefined) { if (!formEl) { return } formEl.validate((valid, fields) => { if (valid) { if (!customerPersonList.value.length) { ElMessage.warning('要求人员列表不能为空') return false } if (checkPersonList()) { // 检查人员列表 setAllRowReadable() // 校验人员列表 dataForm.value.customerUserList = customerPersonList.value.map((item) => { const value = { ...item } delete value.editable return value }) ElMessageBox.confirm( '确认保存吗?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }, ).then(() => { if (dataForm.value.id) { updateCustomer(dataForm.value).then((res) => { if (res.code === 200) { ElMessage.success('已保存') $router.go(-1) } }) } else { addCustomer(dataForm.value).then((res) => { if (res.code === 200) { // dataForm.value.id = res.data.id // dataForm.value.customerNo = res.data.customerNo ElMessage.success('已保存') $router.go(-1) } }) } }) } } }) } const fileRef = ref() // 文件上传input const onFileChange = (event: any) => { if (event.target.files?.length !== 0) { // 创建formdata对象 const fd = new FormData() fd.append('multipartFile', event.target.files[0]) const loading = ElLoading.service({ lock: true, background: 'rgba(255, 255, 255, 0.8)', }) UploadFile(fd).then((res) => { if (res.code === 200) { dataForm.value.minioFileName = res.data[0] // 重置当前验证 ElMessage.success('文件上传成功') loading.close() } else { loading.close() ElMessage.error(res.message) } }) } } const upload = () => { fileRef.value.click() } // 双击行显示输入框 const dblclickRow = (row: CustomerPerson) => { setAllRowReadable() row.editable = true } // 将所有人员信息列表置为不可编辑状态 function setAllRowReadable() { for (const item of customerPersonList.value) { item.editable = false } } onMounted(() => { // 非添加页面获取详情 if (pageType.value !== 'add') { getInfo() } getDict() }) </script> <template> <app-container> <detail-page v-loading="loading" :title="`客户-${textMap[pageType]}`"> <template #btns> <el-button v-if="pageType === 'detail'" v-print="printObj" type="primary"> 打印 </el-button> <el-button v-if="pageType !== 'detail'" type="primary" @click="saveForm(ruleFormRef)"> 保存 </el-button> <el-button type="info" @click="close"> 关闭 </el-button> </template> <div id="form"> <el-form ref="ruleFormRef" :model="dataForm" :label-width="120" label-position="right" :rules="rules" > <el-row :gutter="24"> <el-col :span="6"> <el-form-item label="客户编号:" prop="customerNo"> <el-input v-model="dataForm.customerNo" :placeholder="pageType === 'detail' ? '' : '系统自动生成'" :class="{ 'detail-input': pageType === 'detail' }" disabled /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="公司名称:" prop="customerName"> <el-input v-model.trim="dataForm.customerName" :placeholder="pageType === 'detail' ? '' : '请输入公司名称'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail'" /> </el-form-item> </el-col><el-col :span="6"> <el-form-item label="公司简称:"> <el-input v-model="dataForm.briefName" :placeholder="pageType === 'detail' ? '' : '请输入公司简称'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail'" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="业务内容:" prop="businessContent"> <el-input v-model.trim="dataForm.businessContent" :placeholder="pageType === 'detail' ? '' : '请输入业务内容'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail'" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="公司规模" prop="companySize"> <el-select v-model="dataForm.companySize" :placeholder="pageType === 'detail' ? ' ' : '请选择公司规模'" :disabled="pageType === 'detail'" class="full-width-input"> <el-option v-for="item in companySizeList" :key="item.id" :label="item.name" :value="item.value" /> </el-select> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="业务规模" prop="businessSize"> <el-select v-model="dataForm.businessSize" :placeholder="pageType === 'detail' ? ' ' : '请选择业务规模'" :disabled="pageType === 'detail'" class="full-width-input"> <el-option v-for="item in businessSizeList" :key="item.id" :label="item.name" :value="item.value" /> </el-select> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="履约评级" prop="grade"> <el-select v-model="dataForm.grade" :placeholder="pageType === 'detail' ? ' ' : '请选择履约评级'" :disabled="pageType === 'detail'" class="full-width-input"> <el-option v-for="item in gradeList" :key="item.id" :label="item.name" :value="item.value" /> </el-select> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="整体评价" prop="evaluation"> <el-select v-model="dataForm.evaluation" :placeholder="pageType === 'detail' ? ' ' : '请选择整体评价'" :disabled="pageType === 'detail'" class="full-width-input"> <el-option v-for="item in evaluationList" :key="item.id" :label="item.name" :value="item.value" /> </el-select> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="税号:" prop="taxNumber"> <el-input v-model="dataForm.taxNumber" :placeholder="pageType === 'detail' ? '' : '请输入税号'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail'" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="银行账户名:"> <el-input v-model="dataForm.bankAccount" :placeholder="pageType === 'detail' ? '' : '请输入银行账户名'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail'" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="银行名称:"> <el-input v-model="dataForm.bankName" :placeholder="pageType === 'detail' ? '' : '请输入银行名称'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail'" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="银行账号:"> <el-input v-model="dataForm.bankAccountNumber" :placeholder="pageType === 'detail' ? '' : '请输入银行账号'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail'" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="邮编:"> <el-input v-model="dataForm.postalCode" :placeholder="pageType === 'detail' ? '' : '请输入邮编'" :disabled="pageType === 'detail'" :class="{ 'detail-input': pageType === 'detail' }" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="负责人:"> <el-input v-model="dataForm.director" :placeholder="pageType === 'detail' ? '' : '请输入负责人'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail'" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="电话:"> <el-input v-model="dataForm.phone" :placeholder="pageType === 'detail' ? '' : '请输入电话'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail'" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="传真:"> <el-input v-model="dataForm.fax" :placeholder="pageType === 'detail' ? '' : '请输入传真'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail'" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="手机:"> <el-input v-model="dataForm.mobile" :placeholder="pageType === 'detail' ? '' : '请输入手机'" :disabled="pageType === 'detail'" :class="{ 'detail-input': pageType === 'detail' }" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="邮箱:"> <el-input v-model="dataForm.email" :placeholder="pageType === 'detail' ? '' : '请输入邮箱'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail'" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="网址:"> <el-input v-model="dataForm.website" :placeholder="pageType === 'detail' ? '' : '请输入网址'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail'" /> </el-form-item> </el-col> </el-row> <el-row :gutter="5"> <el-form-item label="公司地址:"> <address-select :data="fullAddress" :detail="pageType === 'detail'" @on-change="fullAddressChange" /> </el-form-item> </el-row> <el-row :gutter="5"> <el-form-item label="开票地址:"> <address-select :data="invoiceFullAddress" :detail="pageType === 'detail'" @on-change="invoiceFullAddressChange" /> </el-form-item> </el-row> <el-row :gutter="24"> <el-col :span="14"> <el-form-item label="公司业务范围:"> <el-input v-model="dataForm.businessScope" :placeholder="pageType === 'detail' ? '' : '请输入公司业务范围'" :disabled="pageType === 'detail'" :class="{ 'detail-input': pageType === 'detail' }" /> </el-form-item> </el-col> </el-row> <el-row :gutter="24"> <el-col :span="14"> <el-form-item label="备注:"> <el-input v-model="dataForm.remark" :placeholder="pageType === 'detail' ? '' : '请输入备注'" :disabled="pageType === 'detail'" :class="{ 'detail-input': pageType === 'detail' }" /> </el-form-item> </el-col> </el-row> <el-row :gutter="24" class="marg"> <el-col :span="14"> <el-form-item label="附件:"> <show-photo v-if="dataForm.minioFileName" :minio-file-name="dataForm.minioFileName" /> <span v-else-if="pageType === 'detail'">无</span> <input v-show="pageType === ''" ref="fileRef" type="file" @change="onFileChange"> <el-button v-if="pageType !== 'detail'" id="file" type="primary" :disabled="pageType === 'detail'" :style="{ 'margin-left': dataForm.minioFileName === '' ? '0px' : '20px' }" @click="upload"> {{ dataForm.minioFileName === '' ? '上传' : '更换附件' }} </el-button> </el-form-item> </el-col> </el-row> </el-form> </div> </detail-page> <detail-block v-if="pageType !== 'detail'" title="人员信息"> <template v-if="pageType !== 'detail'" #btns> <el-button type="primary" @click="addRow"> 增加行 </el-button> <el-button type="info" @click="deleteList"> 删除行 </el-button> </template> <el-table id="form" v-loading="loading" :data="customerPersonList" border style="width: 100%;" @selection-change="handleSelectionChange" @row-dblclick="dblclickRow" > <el-table-column type="selection" width="38" /> <el-table-column align="center" label="序号" width="80" type="index" /> <el-table-column v-for="item in columns" :key="item.value" :prop="item.value" :label="item.text" align="center" > <template #header> <span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span> </template> <template #default="scope"> <span v-if="!scope.row.editable">{{ scope.row[item.value] }}</span> <el-input v-else v-model.trim="scope.row[item.value]" :autofocus="true" :placeholder="`${item.text}`" class="input" /> </template> </el-table-column> </el-table> </detail-block> <detail-block-switch v-else :title="currentMenu"> <template #menu> <el-radio-group v-model="currentMenu"> <el-radio-button v-for="item in menu" :key="item.name" :label="item.name"> {{ item.name }} </el-radio-button> </el-radio-group> </template> <template-table v-if="currentMenuObj" :columns="currentMenuObj.columns" :total="currentMenu === '检定记录' ? totalRecords : currentMenu === '检定证书' ? totalCertifications : currentMenu === '合同记录' ? totalContract : totalSample" :list="dataList[currentMenuObj.list]" :loading="false" :pagination="currentMenuObj.pagination" @change-page="changePage" /> </detail-block-switch> </app-container> </template> <style lang="scss" scoped> // 样式 </style>