<template> <a-card :bordered="false"> <a-page-header :title="formData.id ? '企业台账' : '新增企业台账'" @back="onClose" > <template #extra> <a-button style="margin-right: 8px" @click="onClose">关闭</a-button> <a-popconfirm title="请确认是否保存?" @confirm="onTemp" v-if="!isView"> <a-button style="margin-right: 8px" :loading="submitLoading">保存</a-button> </a-popconfirm> <a-popconfirm title="请确认是否申报?" @confirm="onSubmit" v-if="!isView"> <a-button type="primary" :loading="submitLoading">申报</a-button> </a-popconfirm> </template> </a-page-header> <a-collapse v-model:activeKey="activeKey" expand-icon-position="end"> <a-collapse-panel key="1" header="基本信息"> <a-form ref="formRef" :model="formData" :rules="formRules"> <a-row :gutter="16"> <a-col :span="8"> <a-form-item label="预录入台账编号:" name="ylTzCode"> <a-input v-model:value="formData.ylTzCode" :disabled="true" placeholder="请输入预录入台账编号" allow-clear/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="台账编号:" name="tzCode"> <a-input v-model:value="formData.tzCode" :disabled="true" placeholder="请输入台账编号" allow-clear/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="台账性质:" name="tzType"> <a-select v-model:value="formData.tzType" :disabled="isView" placeholder="请选择台账性质" :options="tzTypeOptions" show-search allow-clear option-filter-prop="label"/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="海关注册编码:" name="companyMainHgCode"> <a-input v-model:value="formData.companyMainHgCode" :disabled="isView" placeholder="请输入海关注册编码" allow-clear/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="统一社会信用代码:" name="companyCode"> <a-input v-model:value="formData.companyCode" :disabled="true" placeholder="请输入统一社会信用代码" allow-clear/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="企业名称:" name="companyName"> <a-input v-model:value="formData.companyName" :disabled="true" placeholder="请输入企业名称" allow-clear/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="申报类型:" name="applyType"> <a-select v-model:value="formData.applyType" :disabled="true" placeholder="请选择申报类型" :options="applyTypeOptions" show-search allow-clear option-filter-prop="label"/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="企业类型:" name="companyType"> <a-select v-model:value="formData.companyType" :disabled="true" placeholder="请选择企业类型" :options="companyTypeOptions" show-search allow-clear option-filter-prop="label"/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="企业地址:" name="companyAddress"> <a-input v-model:value="formData.companyAddress" :disabled="true" placeholder="请输入企业地址" allow-clear/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="联系人:" name="companyLinkMan"> <a-input v-model:value="formData.companyLinkMan" :disabled="true" placeholder="请输入联系人" allow-clear/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="联系电话:" name="companyLegalPhone"> <a-input v-model:value="formData.companyLegalPhone" :disabled="true" placeholder="请输入联系电话" allow-clear/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="经营范围:" name="companyJyFw"> <a-input v-model:value="formData.companyJyFw" :disabled="true" placeholder="请输入经营范围" allow-clear/> </a-form-item> </a-col> </a-row> </a-form> </a-collapse-panel> <a-collapse-panel key="2" header="料件信息"> <a-button type="primary" @click="onBodyReset" v-if="!isView" style="margin-bottom: 20px;">重置</a-button> <a-form ref="bodyFormRef" :model="bodyData" :rules="bodyRules" style="margin-bottom: 20px;"> <a-row :gutter="16"> <a-col :span="8"> <a-form-item label="商品编码:" name="productCode"> <a-input v-model:value="bodyData.productCode" :disabled="isView" placeholder="请输入商品编码" allow-clear /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="商品名称:" name="productName"> <a-input v-model:value="bodyData.productName" :disabled="isView" placeholder="请输入商品名称" allow-clear /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="规格型号:" name="specModel"> <a-input v-model:value="bodyData.specModel" :disabled="isView" placeholder="请输入规格型号" allow-clear /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="备案数量:" name="recordQuantity"> <a-input-number v-model:value="bodyData.recordQuantity" :disabled="isView" placeholder="请输入备案数量" :precision="0" :min="0" style="width: 100%;" @change="onChangeRecordQuantity"/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="备案计量单位:" name="recordUnit"> <a-select v-model:value="bodyData.recordUnit" :disabled="isView" placeholder="请输入备案计量单位" :options="legalUnitOptions" show-search allow-clear option-filter-prop="label"/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="申报计量单位:" name="declareUnit"> <a-select v-model:value="bodyData.declareUnit" :disabled="isView" placeholder="请输入申报计量单位" :options="legalUnitOptions" show-search allow-clear option-filter-prop="label"/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="法定计量单位:" name="legalUnit"> <a-select v-model:value="bodyData.legalUnit" :disabled="isView" placeholder="请输入法定计量单位" :options="legalUnitOptions" show-search allow-clear option-filter-prop="label"/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="法定第二计量单位:" name="legalSecondUnit"> <a-select v-model:value="bodyData.legalSecondUnit" :disabled="isView" placeholder="请输入法定第二计量单位" :options="legalUnitOptions" show-search allow-clear option-filter-prop="label"/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="原产国(地区):" name="originCountry"> <a-select v-model:value="bodyData.originCountry" :disabled="isView" placeholder="请输入原产国(地区)" :options="originCountryOptions" show-search allow-clear option-filter-prop="label" /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="备案单价:" name="recordPrice"> <a-input-number v-model:value="bodyData.recordPrice" :disabled="isView" placeholder="请输入备案单价" style="width: 100%" @change="onChangeRecordPrice"/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="备案总价:" name="recordTotalPrice"> <a-input v-model:value="bodyData.recordTotalPrice" :disabled="true" placeholder="备案数量 * 备案单价" allow-clear /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="币制:" name="currency"> <a-select v-model:value="bodyData.currency" :disabled="isView" placeholder="请选择币制" :options="currencyOptions" show-search allow-clear option-filter-prop="label" /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="法定数量:" name="legalQuantity"> <a-input-number v-model:value="bodyData.legalQuantity" :disabled="isView" :precision="0" :min="0" style="width: 100%;" placeholder="请输入法定数量" @change="onChangeLegalQuantity"/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="第二法定数量:" name="secondLegalQuantity"> <a-input-number v-model:value="bodyData.secondLegalQuantity" :disabled="isView" :precision="0" :min="0" style="width: 100%;" placeholder="请输入第二法定数量" /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="重量比例因子:" name="weightRatioFactor"> <a-input v-model:value="bodyData.weightRatioFactor" :disabled="true" placeholder="备案数量 / 法定数量" @change="onChangeWeightRatioFactor"/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="第一比例因子:" name="firstRatioFactor"> <a-input v-model:value="bodyData.firstRatioFactor" :disabled="true" placeholder="请输入第一比例因子" allow-clear /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="第二比例因子:" name="secondRatioFactor"> <a-input v-model:value="bodyData.secondRatioFactor" :disabled="true" placeholder="请输入第二比例因子" allow-clear /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="毛重(KG):" name="grossWeight"> <a-input-number v-model:value="bodyData.grossWeight" :disabled="isView" :min="0" style="width: 100%;" placeholder="请输入毛重(KG)" /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="净重(KG):" name="netWeight"> <a-input v-model:value="bodyData.netWeight" :disabled="isView" :min="0" style="width: 100%;" placeholder="请输入净重(KG)" /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="剩余备案数量:" name="remainingRecordAmount"> <a-input v-model:value="bodyData.remainingRecordAmount" :disabled="true" placeholder="请输入剩余备案数量" allow-clear /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="进账累计数量:" name="inAccountCumulativeAmount"> <a-input-number v-model:value="bodyData.inAccountCumulativeAmount" :disabled="isView" :precision="0" :min="0" style="width: 100%;" placeholder="请输入进账累计数量" @change="onChangeInAccountCumulativeAmount"/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="出账累计数量:" name="outAccountCumulativeAmount"> <a-input-number v-model:value="bodyData.outAccountCumulativeAmount" :disabled="isView" :precision="0" :min="0" style="width: 100%;" placeholder="请输入出账累计数量" @change="onChangeOutAccountCumulativeAmount"/> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="库存累计数量:" name="inventoryCumulativeAmount"> <a-input-number v-model:value="bodyData.inventoryCumulativeAmount" :disabled="isView" :precision="0" :min="0" style="width: 100%;" placeholder="请输入库存累计数量" /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="一线进区累计数量:" name="firstInAmount"> <a-input-number v-model:value="bodyData.firstInAmount" :disabled="isView" :precision="0" :min="0" style="width: 100%;" placeholder="请输入一线进区累计数量" /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="一线出区累计数量:" name="firstOutAmount"> <a-input-number v-model:value="bodyData.firstOutAmount" :disabled="isView" :precision="0" :min="0" style="width: 100%;" placeholder="请输入一线出区累计数量" /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="二线进区累计数量:" name="secondInAmount"> <a-input-number v-model:value="bodyData.secondInAmount" :disabled="isView" :precision="0" :min="0" style="width: 100%;" placeholder="请输入二线进区累计数量" /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="二线出区累计数量:" name="secondOutAmount"> <a-input-number v-model:value="bodyData.secondOutAmount" :disabled="isView" :precision="0" :min="0" style="width: 100%;" placeholder="请输入二线出区累计数量" /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="区内转入累计数量:" name="intraZoneTransferInAmount"> <a-input-number v-model:value="bodyData.intraZoneTransferInAmount" :disabled="isView" :precision="0" :min="0" style="width: 100%;" placeholder="请输入区内转入累计数量" /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="区内转出累计数量:" name="intraZoneTransferOutAmount"> <a-input-number v-model:value="bodyData.intraZoneTransferOutAmount" :disabled="isView" :precision="0" :min="0" style="width: 100%;" placeholder="请输入区内转出累计数量" /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="区外转入累计数量:" name="extraZoneTransferInAmount"> <a-input-number v-model:value="bodyData.extraZoneTransferInAmount" :disabled="isView" :precision="0" :min="0" style="width: 100%;" placeholder="请输入区外转入累计数量" /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="转至区外累计数量:" name="transferToExtraZoneAmount"> <a-input-number v-model:value="bodyData.transferToExtraZoneAmount" :disabled="isView" :precision="0" :min="0" style="width: 100%;" placeholder="请输入转至区外累计数量" /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="补税累计数量:" name="compensationTaxAmount"> <a-input-number v-model:value="bodyData.compensationTaxAmount" :disabled="isView" :precision="0" :min="0" style="width: 100%;" placeholder="请输入补税累计数量" /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="核销累计数量:" name="writeOffAmount"> <a-input-number v-model:value="bodyData.writeOffAmount" :disabled="isView" :precision="0" :min="0" style="width: 100%;" placeholder="请输入核销累计数量" /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item label="修改标志:" name="modifyFlag"> <a-input v-model:value="bodyData.modifyFlag" :disabled="isView" placeholder="请输入修改标志" allow-clear /> </a-form-item> </a-col> </a-row> </a-form> <template v-if="!isView"> <a-button type="primary" style="margin-right: 8px;" v-if="!(bodyData.id || bodyData.__index)" @click="onBodyAdd">插入</a-button> <a-button type="primary" style="margin-right: 8px;" v-else @click="onBodyEdit">保存</a-button> <xn-batch-delete :selectedRowKeys="bodySelectedRowKeys" @batchDelete="deleteBatchBody" /> </template> <a-table style="margin-top: 10px" bordered :dataSource="bodyList" :columns="bodyColumns" :pagination="false" :scroll="{ x: 2000 }" :row-selection="bodyOptions.rowSelection" > <template #bodyCell="{ column, record, index }"> <template v-if="column.dataIndex === 'recordUnit'"> {{ $TOOL.dictTypeData('measurement unit', record.recordUnit) }} </template> <template v-if="column.dataIndex === 'declareUnit'"> {{ $TOOL.dictTypeData('measurement unit', record.declareUnit) }} </template> <template v-if="column.dataIndex === 'legalUnit'"> {{ $TOOL.dictTypeData('measurement unit', record.legalUnit) }} </template> <template v-if="column.dataIndex === 'legalSecondUnit'"> {{ $TOOL.dictTypeData('measurement unit', record.legalSecondUnit) }} </template> <template v-if="column.dataIndex === 'originCountry'"> {{ $TOOL.dictTypeData('address', record.originCountry) }} </template> <template v-if="column.dataIndex === 'currency'"> {{ $TOOL.dictTypeData('hbdm', record.currency) }} </template> <template v-if="column.dataIndex === 'action'"> <template v-if="isView"> <a-button type="link" primary size="small" @click="onBodyReset(), bodyData = cloneDeep(record)">查看</a-button> </template> <template v-else> <a-button type="link" primary size="small" @click="onBodyReset(), bodyData = cloneDeep(record)">编辑</a-button> <a-button type="link" danger size="small" @click="onBodyDel(index)">删除</a-button> </template> </template> </template> </a-table> </a-collapse-panel> <a-collapse-panel key="3" header="附件信息"> <template v-if="!isView"> <div class="file-tips"> <InfoCircleFilled style="margin-right: 4px;"/>友情提示<br/> 1、附件大小要求不超过4M,如果文件过大,建议拆分多个上传;<br/> 2、附件格式要求:PDF文件;<br/> 3、同一附件类型可以上传多个附件;<br/> 4、附件传输过程中会出现传输失败的情况,请随时关注附件传输状态;<br/> 5、要求上传复印件的可上传原件的扫描件。 </div> <xn-upload ref="ref_upload" v-model:value="fileData.fileUrl" @onChange="fileChange" accept=".pdf" v-if="showFileUpload"/> <div style="margin-top: 10px;"> <xn-batch-delete :selectedRowKeys="fileSelectedRowKeys" @batchDelete="deleteBatchFile" /> </div> </template> <a-table style="margin-top: 10px" bordered :dataSource="fileList" :columns="fileColumns" :pagination="false" :row-selection="fileOptions.rowSelection" > <template #bodyCell="{ column, record, index, text }"> <template v-if="['attachmentName', 'attachmentFormat', 'attachmentContent'].includes(column.dataIndex)"> <div> <a-input v-if="!isView" v-model:value="record[column.dataIndex]" style="margin: -5px 0" /> <template v-else> {{ text }} </template> </div> </template> <template v-if="column.dataIndex === 'action'"> <template v-if="isView"> </template> <template v-else> <a-button type="link" danger size="small" @click="onFileDel(index)" v-if="!isView">删除</a-button> </template> </template> </template> </a-table> </a-collapse-panel> </a-collapse> </a-card> </template> <script setup name="qyRecordInfoDetail"> import tool from '@/utils/tool' import {cloneDeep} from 'lodash-es' import {required} from '@/utils/formRules' import qyRecordInfoApi from '@/api/yqyc/qyRecordInfoApi' import {message, Modal} from "ant-design-vue"; import {createVNode} from "vue"; import {ExclamationCircleOutlined} from "@ant-design/icons-vue"; // 抽屉状态 const { proxy } = getCurrentInstance() const emit = defineEmits({successful: null, onClose: null}) const formRef = ref() const bodyFormRef = ref() const ref_upload = ref() // 表单数据 const formData = ref({}) const bodyData = ref({}) const fileData = ref({}) const submitLoading = ref(false) const isView = ref(false) const showFileUpload = ref(true) const tzTypeOptions = ref([]) const applyTypeOptions = ref([]) const companyTypeOptions = ref([]) const activeKey = ref('1') const bodySelectedRowKeys = ref([]) const bodyList = ref([]) const userInfo = tool.data.get('USER_INFO') const legalUnitOptions = ref([]) const originCountryOptions = ref([]) const currencyOptions = ref([]) // 列表选择配置 const bodyOptions = { rowSelection: { onChange: (selectedRowKey, selectedRows) => { bodySelectedRowKeys.value = selectedRows } } } const fileSelectedRowKeys = ref([]) const fileList = ref([]) // 列表选择配置 const fileOptions = { rowSelection: { onChange: (selectedRowKey, selectedRows) => { fileSelectedRowKeys.value = selectedRows } } } // 打开抽屉 const onOpen = (record, view = false, type) => { isView.value = view if (record) { qyRecordInfoApi.qyRecordInfoDetail({id: record.id}).then(res => { formData.value = res bodyList.value = res.qyRecardBodyAddParams fileList.value = res.qyRecordAttachmentAddParams if (type) { formData.value.applyType = type } }) } else { formData.value.companyCode = userInfo.companyNumber formData.value.companyName = userInfo.companyName formData.value.companyType = userInfo.companyType formData.value.companyAddress = userInfo.companyAddress formData.value.companyLinkMan = userInfo.contactName formData.value.companyLegalPhone = userInfo.contactPhone formData.value.companyJyFw = userInfo.businessScope formData.value.applyType = 'basq' } tzTypeOptions.value = tool.dictList('tzlx') applyTypeOptions.value = tool.dictList('qybalx') companyTypeOptions.value = tool.dictList('qylx') legalUnitOptions.value = tool.dictList('measurement unit') originCountryOptions.value = tool.dictList('address') currencyOptions.value = tool.dictList('hbdm') } // 关闭抽屉 const onClose = () => { formRef.value.resetFields() formData.value = {} isView.value = true emit('onClose') } // 默认要校验的 const formRules = { companyMainHgCode: [required('请输入海关注册编码')], companyCode: [required('请输入统一社会信用代码')], companyName: [required('请输入企业名称')], applyType: [required('请输入申报类型')], companyType: [required('请输入企业类型')], companyAddress: [required('请输入企业地址')], companyLinkMan: [required('请输入联系人')], companyLegalPhone: [required('请输入联系电话')], companyJyFw: [required('请输入经营范围')], } // 默认要校验的 const bodyRules = { productCode: [required('请输入商品编码')], productName: [required('请输入商品名称')], specModel: [required('请输入规格型号')], recordQuantity: [required('请输入备案数量')], recordUnit: [required('请输入备案计量单位')], legalUnit: [required('请输入法定计量单位')], originCountry: [required('请输入原产国(地区)')], recordPrice: [required('请输入备案单价')], recordTotalPrice: [required('请输入备案总价')], currency: [required('请输入币制')], legalQuantity: [required('请输入法定数量')], recordAmount: [required('请输入备案数量')], weightRatioFactor: [required('请输入重量比例因子')], remainingRecordAmount: [required('请输入剩余备案数量')], inAccountCumulativeAmount: [required('请输入进账累计数量')], outAccountCumulativeAmount: [required('请输入出账累计数量')], } const bodyColumns = [ { title: '商品编码', dataIndex: 'productCode', width: 100, fixed: 'left' }, { title: '商品名称', dataIndex: 'productName', width: 100, fixed: 'left' }, { title: '规格型号', dataIndex: 'specModel', width: 100 }, { title: '备案数量', dataIndex: 'recordQuantity', width: 100 }, { title: '备案计量单位', dataIndex: 'recordUnit', width: 120 }, { title: '申报计量单位', dataIndex: 'declareUnit', width: 120 }, { title: '法定计量单位', dataIndex: 'legalUnit', width: 120 }, { title: '法定第二计量单位', dataIndex: 'legalSecondUnit', width: 160 }, { title: '原产国(地区)', dataIndex: 'originCountry', width: 140 }, { title: '备案单价', dataIndex: 'recordPrice', width: 100 }, { title: '备案总价', dataIndex: 'recordTotalPrice', width: 100 }, { title: '币制', dataIndex: 'currency', width: 100 }, { title: '法定数量', dataIndex: 'legalQuantity', width: 100 }, { title: '第二法定数量', dataIndex: 'secondLegalQuantity', width: 120 }, { title: '重量比例因子', dataIndex: 'weightRatioFactor', width: 120 }, { title: '第一比例因子', dataIndex: 'firstRatioFactor', width: 120 }, { title: '第二比例因子', dataIndex: 'secondRatioFactor', width: 120 }, { title: '毛重(KG)', dataIndex: 'grossWeight', width: 120 }, { title: '净重(KG)', dataIndex: 'netWeight', width: 120 }, { title: '剩余备案数量', dataIndex: 'remainingRecordAmount', width: 120 }, { title: '进账累计数量', dataIndex: 'inAccountCumulativeAmount', width: 120 }, { title: '出账累计数量', dataIndex: 'outAccountCumulativeAmount', width: 120 }, { title: '库存累计数量', dataIndex: 'inventoryCumulativeAmount', width: 120 }, { title: '一线进区累计数量', dataIndex: 'firstInAmount', width: 160 }, { title: '一线出区累计数量', dataIndex: 'firstOutAmount', width: 160 }, { title: '二线进区累计数量', dataIndex: 'secondInAmount', width: 160 }, { title: '二线出区累计数量', dataIndex: 'secondOutAmount', width: 160 }, { title: '区内转入累计数量', dataIndex: 'intraZoneTransferInAmount', width: 160 }, { title: '区内转出累计数量', dataIndex: 'intraZoneTransferOutAmount', width: 160 }, { title: '区外转入累计数量', dataIndex: 'extraZoneTransferInAmount', width: 160 }, { title: '转至区外累计数量', dataIndex: 'transferToExtraZoneAmount', width: 160 }, { title: '补税累计数量', dataIndex: 'compensationTaxAmount', width: 120 }, { title: '核销累计数量', dataIndex: 'writeOffAmount', width: 120 }, { title: '修改标志', dataIndex: 'modifyFlag', width: 100 }, { title: '操作', dataIndex: 'action', width: 160, fixed: 'right' }, ] const fileColumns = [ { title: '附件名称', dataIndex: 'attachmentName', }, { title: '附件格式', dataIndex: 'attachmentFormat', }, { title: '附件内容', dataIndex: 'attachmentContent', }, { title: '上传时间', dataIndex: 'uploadTime', }, { title: '操作', dataIndex: 'action', }, ] // 验证并提交数据 const onSubmit = () => { formRef.value .validate() .then(() => { submitLoading.value = true const formDataParam = cloneDeep(formData.value) if (!formDataParam.id) { formDataParam.qyRecardBodyAddParams = bodyList.value formDataParam.qyRecordAttachmentAddParams = fileList.value } else { formDataParam.qyRecardBodyEditParams = bodyList.value formDataParam.qyRecordAttachmentEditParams = fileList.value delete formDataParam.qyRecardBodyAddParams delete formDataParam.qyRecordAttachmentAddParams } formDataParam.status = '3' qyRecordInfoApi .qyRecordInfoSubmitForm(formDataParam, formDataParam.id) .then(() => { onClose() emit('successful') }) .finally(() => { submitLoading.value = false }) }) .catch(() => { }) } // 验证并提交数据 const onTemp = () => { formRef.value .validate() .then(() => { submitLoading.value = true const formDataParam = cloneDeep(formData.value) if (!formDataParam.id) { formDataParam.qyRecardBodyAddParams = bodyList.value formDataParam.qyRecordAttachmentAddParams = fileList.value } else { formDataParam.qyRecardBodyEditParams = bodyList.value formDataParam.qyRecordAttachmentEditParams = fileList.value delete formDataParam.qyRecardBodyAddParams delete formDataParam.qyRecordAttachmentAddParams } formDataParam.status = '1' qyRecordInfoApi .qyRecordInfoSubmitForm(formDataParam, formDataParam.id) .then(() => { onClose() emit('successful') }) .finally(() => { submitLoading.value = false }) }) .catch(() => { }) } const onBodyReset = () => { bodyFormRef.value.resetFields() bodyData.value = {} } const onBodyAdd = () => { bodyFormRef.value .validate() .then(() => { bodyList.value.push(Object.assign({__index: new Date().getTime()}, bodyData.value)) onBodyReset() message.success('插入表体信息成功!') }) .catch(() => { }) } const onBodyEdit = () => { bodyFormRef.value .validate() .then(() => { let k = '' if (bodyData.value.id) { k = 'id' } else if (bodyData.value.__index) { k = '__index' } if (k) { bodyList.value.forEach(v => { if (v[k] === bodyData.value[k]) { Object.assign(v, bodyData.value) } }) } onBodyReset() message.success('编辑表体信息成功!') }) .catch(() => { }) } const onBodyDel = (recode, index) => { Modal.confirm({ title: '提示', icon: createVNode(ExclamationCircleOutlined), content: createVNode('div', { style: 'color:red;' }, `是否要删除${record.productName}?`), centered: true, onOk() { bodyList.value.splice(index, 1) }, onCancel() { }, }); } const deleteBatchBody = () => { bodyList.value = bodyList.value.filter(v => { let flag = true bodySelectedRowKeys.value.forEach(s => { if ((v.id && (v.id === s.id)) || (v.__index && (v.__index === s.__index))) { flag = false } }) return flag }) } const getFileExtension = (filename) => { // 使用lastIndexOf查找最后一个"."的位置 var dotIndex = filename.lastIndexOf("."); // 如果找到了".",则提取从"."之后的子串作为后缀名 if (dotIndex !== -1 && dotIndex < filename.length - 1) { // 确保"."不是字符串的最后一个字符 return filename.slice(dotIndex + 1); // slice从dotIndex+1开始到字符串结束 } else { // 如果没有找到".",返回空字符串表示没有后缀 return ""; } } const fileChange = (file) => { if (file) { const f = ref_upload.value.uploadFileList()[0] fileList.value.push({ __index: new Date().getTime(), attachmentUrl: f.url, attachmentName: f.name, attachmentFormat: getFileExtension(f.name), attachmentContent: '', uploadTime: proxy.$util.YMDHms(new Date()), }) fileData.value.fileUrl = '' showFileUpload.value = false setTimeout(() => { showFileUpload.value = true }, 0) } } const onFileDel = (recode, index) => { Modal.confirm({ title: '提示', icon: createVNode(ExclamationCircleOutlined), content: createVNode('div', { style: 'color:red;' }, `是否要删除?`), centered: true, onOk() { fileList.value.splice(index, 1) }, onCancel() { }, }); } const deleteBatchFile = () => { fileList.value = fileList.value.filter(v => { let flag = true fileSelectedRowKeys.value.forEach(s => { if ((v.id && (v.id === s.id)) || (v.__index && (v.__index === s.__index))) { flag = false } }) return flag }) } const onChangeRecordQuantity = () => { setTimeout(() => { if (proxy.$util.isValue(bodyData.value.recordQuantity) && proxy.$util.isValue(bodyData.value.recordPrice)) { bodyData.value.recordTotalPrice = Number(bodyData.value.recordQuantity) * Number(bodyData.value.recordPrice) } else { bodyData.value.recordTotalPrice = '' } if (proxy.$util.isValue(bodyData.value.recordQuantity) && proxy.$util.isValue(bodyData.value.legalQuantity) && (Number(bodyData.value.legalQuantity) > 0)) { bodyData.value.weightRatioFactor = Number(bodyData.value.recordQuantity) / Number(bodyData.value.legalQuantity) } else { bodyData.value.weightRatioFactor = '' } if (proxy.$util.isValue(bodyData.value.recordQuantity) && proxy.$util.isValue(bodyData.value.inAccountCumulativeAmount) && proxy.$util.isValue(bodyData.value.outAccountCumulativeAmount)) { bodyData.value.remainingRecordAmount = Number(bodyData.value.inAccountCumulativeAmount) - Number(bodyData.value.outAccountCumulativeAmount) - Number(bodyData.value.recordQuantity) } else { bodyData.value.remainingRecordAmount = '' } }, 100) } const onChangeRecordPrice = () => { setTimeout(() => { if (proxy.$util.isValue(bodyData.value.recordQuantity) && proxy.$util.isValue(bodyData.value.recordPrice)) { bodyData.value.recordTotalPrice = Number(bodyData.value.recordQuantity) * Number(bodyData.value.recordPrice) } else { bodyData.value.recordTotalPrice = '' } }, 100) } const onChangeLegalQuantity = () => { setTimeout(() => { if (proxy.$util.isValue(bodyData.value.recordQuantity) && proxy.$util.isValue(bodyData.value.legalQuantity) && (Number(bodyData.value.legalQuantity) > 0)) { bodyData.value.weightRatioFactor = Number(bodyData.value.recordQuantity) / Number(bodyData.value.legalQuantity) } else { bodyData.value.weightRatioFactor = '' } }, 100) } const onChangeWeightRatioFactor = () => { setTimeout(() => { bodyData.value.firstRatioFactor = bodyData.value.weightRatioFactor }, 100) } const onChangeInAccountCumulativeAmount = () => { setTimeout(() => { if (proxy.$util.isValue(bodyData.value.recordQuantity) && proxy.$util.isValue(bodyData.value.inAccountCumulativeAmount) && proxy.$util.isValue(bodyData.value.outAccountCumulativeAmount)) { bodyData.value.remainingRecordAmount = Number(bodyData.value.inAccountCumulativeAmount) - Number(bodyData.value.outAccountCumulativeAmount) - Number(bodyData.value.recordQuantity) } else { bodyData.value.remainingRecordAmount = '' } }, 100) } const onChangeOutAccountCumulativeAmount = () => { setTimeout(() => { if (proxy.$util.isValue(bodyData.value.recordQuantity) && proxy.$util.isValue(bodyData.value.inAccountCumulativeAmount) && proxy.$util.isValue(bodyData.value.outAccountCumulativeAmount)) { bodyData.value.remainingRecordAmount = Number(bodyData.value.inAccountCumulativeAmount) - Number(bodyData.value.outAccountCumulativeAmount) - Number(bodyData.value.recordQuantity) } else { bodyData.value.remainingRecordAmount = '' } }, 100) } // 抛出函数 defineExpose({ onOpen }) </script> <style lang="less" scoped> .file-tips { background-color: rgb(235, 245, 255); border: 1px solid rgb(214, 235, 255); border-radius: 5px; color: rgb(153, 153, 153); padding: 10px 20px; margin-bottom: 10px; } </style>