<template> <div style="width: 100%; padding: 0px 15px"> <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="submit" > <template #seller> <div style="width: 100%"> <el-form-item prop="sellCorporationId"> <el-select v-model="formData.data.sellCorporationId" style="width: 100%" disabled > <el-option v-for="item in corporationList" :key="item.value" :label="item.label" :value="item.value" /> </el-select> </el-form-item> <el-row style="margin-top: 20px; width: 100%"> <el-col :span="8"> <el-form-item label="地址" prop="sellCountryName"> <el-input v-model="formData.data.sellCountryName" placeholder="请输入国家" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label=" " prop="sellProvinceName"> <el-input v-model="formData.data.sellProvinceName" placeholder="请输入省/州" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label=" " prop="sellCityName"> <el-input v-model="formData.data.sellCityName" placeholder="请输入城市" /> </el-form-item> </el-col> </el-row> <el-row style="margin-top: 20px; width: 100%"> <el-col :span="24"> <el-form-item prop="sellAddress"> <el-input v-model="formData.data.sellAddress" type="textarea"> </el-input> </el-form-item> </el-col> </el-row> <el-row style="margin-top: 20px; width: 100%"> <el-col :span="8"> <el-form-item label="联系人" prop="sellContactName"> <el-input v-model="formData.data.sellContactName" placeholder="请输入联系人" /> </el-form-item> </el-col> <el-col :span="16"> <el-form-item label=" " prop="sellContactNumber"> <el-input v-model="formData.data.sellContactNumber" placeholder="请输入联系人电话" /> </el-form-item> </el-col> </el-row> </div> </template> <template #buyer> <div style="width: 100%"> <div style="width: 100%"> <!-- <el-form-item prop="buyCorporationId"> <el-select v-model="formData.data.buyCorporationId" style="width: 100%" @change="changeCustomer" > <el-option v-for="item in customerList" :key="item.value" :label="item.label" :value="item.value" /> </el-select> </el-form-item> --> <el-form-item prop="buyCorporationId"> <el-select v-model="formData.data.buyCorporationId" filterable remote reserve-keyword placeholder="请输入关键字" remote-show-suffix :remote-method="remoteMethod" :loading="loadingSearch" @input="remoteMethod" style="width: 100%" @change="changeCustomer" v-if=" [30].includes(route.query.processType) || !route.query.processType " > <el-option v-for="item in customerList" :key="item.value" :label="item.label" :value="item.value" /> </el-select> <el-select v-model="formData.data.buyCorporationName" disabled v-else style="width: 100%" > </el-select> </el-form-item> <el-row style="margin-top: 20px; width: 100%"> <el-col :span="6"> <el-form-item label="地址" prop="countryId"> <el-select v-model="formData.data.countryId" placeholder="国家" filterable @change="(val) => getCityData(val, '20', true)" > <el-option v-for="item in countryData" :label="item.name" :value="item.id" > </el-option> </el-select> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label=" " prop="provinceName"> <selectCity placeholder="省/洲" @change="(val) => getCityData(val, '30', true)" addressId="provinceId" addressName="provinceName" v-model="formData.data" :data="provinceData" > </selectCity> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label=" " prop="cityName"> <selectCity placeholder="城市" addressId="cityId" addressName="cityName" v-model="formData.data" :data="cityData" > </selectCity> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label=" " prop="buyPostalCode"> <el-input v-model="formData.data.buyPostalCode" placeholder="请输入邮编" /> </el-form-item> </el-col> </el-row> <el-row style="margin-top: 20px; width: 100%"> <el-col :span="24"> <el-form-item prop="buyAddress"> <el-input v-model="formData.data.buyAddress" type="textarea"> </el-input> </el-form-item> </el-col> </el-row> <el-row style="margin-top: 20px; width: 100%"> <el-col :span="8"> <el-form-item label="联系人" prop="buyContactName"> <el-autocomplete v-model="formData.data.buyContactName" :fetch-suggestions="querySearchPerson" clearable class="inline-input w-50" placeholder="请输入联系人" @select="handlePerson" > </el-autocomplete> </el-form-item> </el-col> <el-col :span="16"> <el-form-item label=" " prop="buyContactNumber"> <el-input v-model="formData.data.buyContactNumber" placeholder="请输入联系人电话" /> </el-form-item> </el-col> </el-row> </div> </div> </template> <template #payment> <div style="width: 100%"> <el-row style="margin-top: 20px; width: 100%"> <el-col :span="6"> <el-form-item label="币种" prop="currency"> <el-select v-model="formData.data.currency" placeholder="请选择币种" style="width: 100%" > <el-option v-for="item in accountCurrency" :key="item.value" :label="item.label" :value="item.value" /> </el-select> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="汇率" prop="rate"> <el-input-number onmousewheel="return false;" v-model="formData.data.rate" placeholder="请输入汇率" style="width: 100%" :precision="4" :controls="false" :min="0" :max="100" /> </el-form-item> </el-col> </el-row> <el-row style="margin-top: 20px; width: 100%"> <el-col :span="6"> <el-form-item label="付款方式" prop="paymentMethod"> <el-select v-model="formData.data.paymentMethod" placeholder="请选择付款方式" style="width: 100%" > <el-option v-for="item in fundsPaymentMethod" :key="item.value" :label="item.label" :value="item.value" /> </el-select> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="预付比例 (%)" prop="advanceRatio"> <el-input-number onmousewheel="return false;" v-model="formData.data.advanceRatio" placeholder="请输入预付比例" style="width: 100%" :precision="2" :controls="false" :min="0" :max="100" /> </el-form-item> </el-col> </el-row> <el-row style="margin-top: 20px; width: 100%"> <el-col :span="18"> <el-form-item label="付款条件" prop="remark"> <el-input v-model="formData.data.remark" :rows="2" type="textarea" placeholder="请输入付款条件" /> </el-form-item> </el-col> </el-row> <el-row style="margin-top: 20px; width: 100%"> <el-col :span="9"> <el-form-item label="收款账号" prop="shroffAccountId"> <el-select v-model="formData.data.shroffAccountId" placeholder="请选择收款账号" style="width: 100%" @change="changeShroffAccount" > <el-option v-for="item in accountList" :key="item.value" :label="item.label" :value="item.value" /> </el-select> </el-form-item> </el-col> <el-col :span="9"> <el-form-item label=" "> <el-button type="primary" @click="changeActiveName" text> <span v-if="activeName == '1'">收起</span> <span v-else>展开</span> </el-button> </el-form-item> </el-col> </el-row> <div style="width: 100%; margin-top: 34px"> <el-collapse v-model="activeName" class="hideCollapse" accordion> <el-collapse-item title="" name="1"> <el-row style="width: 100%"> <el-col :span="9"> <el-form-item label="Beneficiary Name" prop="beneficiaryName" > <el-input v-model="formData.data.beneficiaryName" placeholder="请输入Beneficiary Name" /> </el-form-item> <div style="height: 20px"></div> <el-form-item label="Beneficiary Bank" prop="beneficiaryBank" > <el-input v-model="formData.data.beneficiaryBank" placeholder="请输入Beneficiary Bank" /> </el-form-item> <div style="height: 20px"></div> <el-form-item label="Beneficiary Bank Address" prop="beneficiaryBankAddress" > <el-input v-model="formData.data.beneficiaryBankAddress" placeholder="请输入Beneficiary Bank Address" /> </el-form-item> </el-col> <el-col :span="9"> <el-form-item label="Beneficiary Account Number" prop="beneficiaryAccountNumber" > <el-input v-model="formData.data.beneficiaryAccountNumber" placeholder="请输入Beneficiary Account Number" /> </el-form-item> <div style="height: 20px"></div> <el-form-item label="Swift Code" prop="swiftCode"> <el-input v-model="formData.data.swiftCode" placeholder="请输入Swift Code" /> </el-form-item> <div style="height: 20px"></div> <el-form-item label="Beneficiary Address" prop="beneficiaryAddress" > <el-input v-model="formData.data.beneficiaryAddress" placeholder="请输入Beneficiary Address" /> </el-form-item> </el-col> </el-row> </el-collapse-item> </el-collapse> </div> </div> </template> <template #delivery> <div style="width: 100%"> <el-row style="margin-top: 20px; width: 100%"> <el-col :span="6"> <el-form-item label="报价有效期 (天)" prop="effective"> <el-input-number onmousewheel="return false;" v-model="formData.data.effective" placeholder="请输入有效期" style="width: 100%" :precision="0" :controls="false" :min="0" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="交货期限" prop="deliveryTime"> <el-date-picker v-model="formData.data.deliveryTime" type="date" placeholder="请选择交货期限" value-format="YYYY-MM-DD" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="运输方式" prop="transportMethod"> <el-select v-model="formData.data.transportMethod" placeholder="请选择运输方式" style="width: 100%" > <el-option v-for="item in shippingMethod" :key="item.value" :label="item.label" :value="item.value" /> </el-select> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="运输说明" prop="transportRemark"> <el-input v-model="formData.data.transportRemark" placeholder="请输入运输说明" /> </el-form-item> </el-col> </el-row> </div> </template> <template #commodity> <div style="width: 100%"> <el-button type="primary" @click="openProductCompany = true" plain >标准产品库</el-button > <el-button type="primary" @click="clickCustomerProduct()" plain >客户产品库</el-button > <el-table :data="formData.data.sampleProductList" style="width: 100%; margin-top: 16px" > <el-table-column label="商品图片" width="80"> <template #default="{ row }"> <div v-if="row.fileUrl"> <img :src="row.fileUrl" class="pic" @click="onPicture(row.fileUrl)" /> </div> <div v-else></div> </template> </el-table-column> <el-table-column prop="productCnName" label="商品中文名" min-width="130" /> <el-table-column label="商品英文名" min-width="180"> <template #default="{ row, $index }"> <div style="width: 100%"> <el-form-item :prop="'sampleProductList.' + $index + '.productName'" :rules="rules.productName" :inline-message="true" class="shrinkPadding" > <el-input v-model="row.productName" placeholder="请输入商品名称" /> </el-form-item> </div> </template> </el-table-column> <el-table-column label="尺寸 cm*cm*cm" width="140"> <template #default="{ row, $index }"> <div style="width: 100%"> <el-form-item :prop="'sampleProductList.' + $index + '.productModel'" :rules="rules.productModel" :inline-message="true" class="shrinkPadding" > <el-input v-model="row.productModel" placeholder="请输入" /> </el-form-item> </div> </template> </el-table-column> <el-table-column label="数量" width="130"> <template #default="{ row, $index }"> <div style="width: 100%"> <el-form-item :prop="'sampleProductList.' + $index + '.quantity'" :rules="rules.quantity" :inline-message="true" class="shrinkPadding" > <el-input-number onmousewheel="return false;" v-model="row.quantity" placeholder="请输入" style="width: 100%" :precision="0" :controls="false" :min="0" @change="calculationAmount()" /> </el-form-item> </div> </template> </el-table-column> <el-table-column label="单价" width="140"> <template #default="{ row, $index }"> <div style="width: 100%"> <el-form-item :prop="'sampleProductList.' + $index + '.price'" :rules="rules.price" :inline-message="true" class="shrinkPadding" > <el-input-number onmousewheel="return false;" v-model="row.price" placeholder="请输入" style="width: 100%" :precision="2" :controls="false" :min="0" @change="calculationAmount()" /> </el-form-item> </div> </template> </el-table-column> <el-table-column label="贸易方式" width="140"> <template #default="{ row, $index }"> <div style="width: 100%"> <el-form-item :prop="'sampleProductList.' + $index + '.tradeMethods'" :rules="rules.tradeMethods" :inline-message="true" class="shrinkPadding" > <el-select v-model="row.tradeMethods" placeholder="请选择" style="width: 100%" > <el-option v-for="item in tradeMethods" :key="item.value" :label="item.label" :value="item.value" /> </el-select> </el-form-item> </div> </template> </el-table-column> <el-table-column label="包装方式" width="180"> <template #default="{ row, $index }"> <div style="width: 100%"> <el-form-item :prop="'sampleProductList.' + $index + '.packMethod'" :rules="rules.packMethod" :inline-message="true" class="shrinkPadding" > <el-input v-model="row.packMethod" placeholder="请输入" /> </el-form-item> </div> </template> </el-table-column> <el-table-column prop="amount" :label="'金额 ( ' + formData.data.currency + ' )'" width="130" /> <el-table-column label="操作" width="60" align="center" fixed="right" > <template #default="{ row, $index }"> <el-button type="primary" link @click="handleRemove($index, row)" >删除</el-button > </template> </el-table-column> </el-table> </div> </template> <template #file> <div style="width: 100%"> <el-upload v-model:fileList="formData.data.fileList" action="https://winfaster.obs.cn-south-1.myhuaweicloud.com" :data="uploadData" multiple :before-upload="uploadFile" :on-success="handleSuccess" :on-preview="onPreviewFile" > <el-button type="primary" plain>选择</el-button> </el-upload> </div> </template> <template #indication> <div style="width: 100%"> <el-upload v-model:fileList="formData.data.packageFileList" action="https://winfaster.obs.cn-south-1.myhuaweicloud.com" :data="indicationUploadData" multiple :before-upload="indicationUploadFile" :on-success="handleSuccess" :on-preview="onPreviewFile" > <el-button type="primary" plain>选择</el-button> </el-upload> </div> </template> <template #otherCharge> <div style="width: 100%"> <el-button type="primary" @click="clickAdd()">添加行</el-button> <el-table :data="formData.data.sampleProjectList" style="width: 100%; margin-top: 16px" > <el-table-column label="收费项目" width="220"> <template #default="{ row, $index }"> <div style="width: 100%"> <el-form-item :prop="'sampleProjectList.' + $index + '.payName'" :rules="rules.payName" :inline-message="true" > <el-autocomplete v-model="row.payName" :fetch-suggestions="querySearch" clearable class="inline-input w-50" placeholder="请输入收费项目" /> </el-form-item> </div> </template> </el-table-column> <el-table-column label="备注"> <template #default="{ row, $index }"> <div style="width: 100%"> <el-form-item :prop="'sampleProjectList.' + $index + '.remark'" > <el-input v-model="row.remark" placeholder="请输入备注" /> </el-form-item> </div> </template> </el-table-column> <el-table-column :label="'金额 ( ' + formData.data.currency + ' )'" width="130" > <template #default="{ row, $index }"> <div style="width: 100%"> <el-form-item :prop="'sampleProjectList.' + $index + '.amount'" :rules="rules.amount" :inline-message="true" class="shrinkPadding" > <el-input-number onmousewheel="return false;" v-model="row.amount" placeholder="请输入金额" style="width: 100%" :precision="2" :controls="false" :min="0" @change="totalAmount()" /> </el-form-item> </div> </template> </el-table-column> <el-table-column label="操作" width="60" align="center" fixed="right" > <template #default="{ $index }"> <el-button type="primary" link @click="handleDelete($index)" >删除</el-button > </template> </el-table-column> </el-table> </div> </template> <template #offerMoney> <div style="width: 100%; display: flex"> <div style="width: calc(100% - 190px)"></div> <div style="width: 130px; padding: 0 12px"> <el-form-item label="合同总金额" prop="amount" class="shrinkPadding" > <el-input v-model="formData.data.amount" placeholder="合同总金额" disabled /> </el-form-item> </div> </div> </template> <template #shipment> <div style="width: 100%"> <el-table :data="formData.data.sampleShipmentList" style="width: 100%; margin-top: 16px" > <el-table-column prop="productCode" label="商品编码" width="120" /> <el-table-column prop="productName" label="商品名称" /> <el-table-column label="出货日期" width="220"> <template #default="{ row, $index }"> <div style="width: 100%"> <el-form-item :prop="'sampleShipmentList.' + $index + '.shipmentTime'" :rules="rules.shipmentTime" :inline-message="true" > <el-date-picker v-model="row.shipmentTime" type="date" placeholder="请选择出货日期" value-format="YYYY-MM-DD" /> </el-form-item> </div> </template> </el-table-column> <el-table-column label="数量" width="160"> <template #default="{ row, $index }"> <div style="width: 100%"> <el-form-item :prop="'sampleShipmentList.' + $index + '.quantity'" :inline-message="true" > <el-input-number onmousewheel="return false;" v-model="row.quantity" placeholder="请输入数量" style="width: 100%" :precision="0" :controls="false" :min="0" @change="calculationAmount()" /> </el-form-item> </div> </template> </el-table-column> <el-table-column align="center" label="操作" width="120" fixed="right" > <template #default="{ row, $index }"> <el-button type="primary" link @click="clickSplit(row)" >拆分</el-button > <el-button type="primary" link @click="clickDelete($index)" >删除</el-button > </template> </el-table-column> </el-table> </div> </template> </byForm> <el-dialog v-if="openProductCompany" v-model="openProductCompany" title="公司产品库" width="90%" append-to-body > <CompanyProduct :selectStatus="true" @selectProduct="selectProduct" ></CompanyProduct> </el-dialog> <el-dialog v-if="openProductCustomer" v-model="openProductCustomer" title="客户产品库" width="90%" append-to-body > <CustomerProduct :selectStatus="true" :buyCorporationId="formData.data.buyCorporationId" @selectProduct="selectProduct" ></CustomerProduct> </el-dialog> </div> </template> <script setup> import byForm from "@/components/byForm/index"; import CompanyProduct from "@/views/EHSD/productLibrary/companyProduct/index"; import CustomerProduct from "@/views/EHSD/productLibrary/customerProduct/index"; import { ElMessage } from "element-plus"; import selectCity from "@/components/selectCity/index.vue"; import { useRoute } from "vue-router"; import { onMounted } from "vue"; const route = useRoute(); const { proxy } = getCurrentInstance(); const innerMethod = ref([]); const outsideMethod = ref([]); const accountCurrency = ref([]); const fundsPaymentMethod = ref([]); const tradeMethods = ref([]); const shippingMethod = ref([]); const submitType = ref([]); const templateList = ref([]); const corporationList = ref([]); const customerList = ref([]); const accountList = ref([]); const countryData = ref([]); const provinceData = ref([]); const cityData = ref([]); const customerUserList = ref([]); const openProductCompany = ref(false); const openProductCustomer = ref(false); const activeName = ref("1"); const formData = reactive({ data: { currency: "", submitType: "2", amount: undefined, sampleProductList: [], sampleProjectList: [], fileList: [], packageFileList: [], sampleShipmentList: [], }, }); const submit = ref(null); const judgeStatus = () => { if (route.query.processType == 20 || route.query.processType == 10) { return true; } if (props.queryData.recordList && props.queryData.recordList.length > 0) { let data = props.queryData.recordList.filter( (item) => item.status === 2 && item.nodeType !== 1 ); if (data && data.length > 0) { return true; } } return false; }; const formOption = reactive({ inline: true, labelWidth: 100, itemWidth: 100, rules: [], disabled: false, }); const uploadData = ref({}); const indicationUploadData = ref({}); const formConfig = computed(() => { return [ { type: "title", title: "合同模板", label: "", }, { type: "select", label: "选择合同模板", prop: "contractTemplateId", data: templateList.value, fn: (val) => { changeTemplate(val); }, }, { type: "slot", slotName: "seller", label: "卖方信息", itemWidth: 50, }, { type: "slot", slotName: "buyer", label: "买方信息", itemWidth: 50, }, { type: "slot", slotName: "payment", label: "付款信息", }, { type: "slot", slotName: "delivery", label: "交付信息", }, { type: "slot", slotName: "commodity", label: "商品信息", }, { type: "slot", slotName: "file", label: "交接单", }, { type: "slot", slotName: "indication", label: "包装指示", }, { type: "slot", slotName: "otherCharge", label: "其他收费项目", }, { type: "slot", slotName: "offerMoney", }, { type: "slot", slotName: "shipment", label: "出货计划", }, // { // type: "select", // label: "提交类型", // prop: "submitType", // data: submitType.value, // }, ]; }); const rules = ref({ contractTemplateId: [ { required: true, message: "请选择合同模板", trigger: "change" }, ], buyCorporationId: [ { required: true, message: "请选择公司", trigger: "change" }, ], countryId: [{ required: true, message: "请选择国家", trigger: "change" }], sellAddress: [{ required: true, message: "请输入详细地址", trigger: "blur" }], buyAddress: [{ required: true, message: "请输入详细地址", trigger: "blur" }], buyContactName: [ { required: true, message: "请输入联系人", trigger: ["change", "blur"] }, ], buyContactNumber: [ { required: true, message: "请输入联系电话", trigger: "blur" }, ], productName: [{ required: true, message: "请输入商品名称", trigger: "blur" }], productModel: [ { required: true, message: "请输入尺寸 cm*cm*cm", trigger: "blur" }, ], quantity: [{ required: true, message: "请输入数量", trigger: "blur" }], price: [{ required: true, message: "请输入单价", trigger: "blur" }], packMethod: [{ required: true, message: "请输入包装方式", trigger: "blur" }], amount: [{ required: true, message: "请输入金额", trigger: "blur" }], payName: [ { required: true, message: "请输入收费项目", trigger: ["change", "blur"] }, ], currency: [{ required: true, message: "请选择币种", trigger: "change" }], effective: [{ required: true, message: "请输入报价有效期", trigger: "blur" }], deliveryTime: [ { required: true, message: "请选择交货期限", trigger: "change" }, ], paymentMethod: [ { required: true, message: "请选择付款方式", trigger: "change" }, ], advanceRatio: [ { required: true, message: "请输入预付比例", trigger: "blur" }, ], shroffAccountId: [ { required: true, message: "请选择收款账号", trigger: "change" }, ], tradeMethods: [ { required: true, message: "请选择贸易方式", trigger: "change" }, ], transportMethod: [ { required: true, message: "请选择运输方式", trigger: "change" }, ], transportRemark: [ { required: true, message: "请输入运输说明", trigger: "blur" }, ], remark: [{ required: true, message: "请输入付款条件", trigger: "blur" }], submitType: [ { required: true, message: "请选择提交类型", trigger: "change" }, ], rate: [{ required: true, message: "请输入汇率", trigger: "blur" }], }); const getDict = () => { proxy.post("/customer/selPage", { pageNum: 1, pageSize: 50 }).then((res) => { customerList.value = res.rows.map((x) => ({ ...x, label: x.name, value: x.id, })); }); proxy .getDictOne([ "inner_packaging_method_ehsd", "outside_packaging_method_ehsd", "account_currency", "funds_payment_method", "trade_mode", "shipping_method", "submit_type", ]) .then((res) => { innerMethod.value = res["inner_packaging_method_ehsd"].map((x) => ({ label: x.dictValue, value: x.dictKey, })); outsideMethod.value = res["outside_packaging_method_ehsd"].map((x) => ({ label: x.dictValue, value: x.dictKey, })); accountCurrency.value = res["account_currency"].map((x) => ({ label: x.dictValue, value: x.dictKey, })); fundsPaymentMethod.value = res["funds_payment_method"].map((x) => ({ label: x.dictValue, value: x.dictKey, })); tradeMethods.value = res["trade_mode"].map((x) => ({ label: x.dictValue, value: x.dictKey, })); shippingMethod.value = res["shipping_method"].map((x) => ({ label: x.dictValue, value: x.dictKey, })); submitType.value = res["submit_type"].map((x) => ({ label: x.dictValue, value: x.dictKey, })); }); proxy .post("/contractTemplate/page", { pageNum: 1, pageSize: 999 }) .then((res) => { templateList.value = res.rows.map((item) => { return { ...item, label: item.templateName, value: item.id, }; }); }); proxy.post("/corporation/page", { pageNum: 1, pageSize: 999 }).then((res) => { corporationList.value = res.rows.map((item) => { return { ...item, label: item.name, value: item.id, }; }); }); proxy .post("/accountManagement/page", { pageNum: 1, pageSize: 999 }) .then((res) => { accountList.value = res.rows.map((item) => { return { ...item, label: item.alias, value: item.id, }; }); }); }; getDict(); const changeTemplate = (val) => { formData.data.sellCorporationId = ""; formData.data.sellContactName = ""; formData.data.sellContactNumber = ""; formData.data.sellCountryName = ""; formData.data.sellProvinceName = ""; formData.data.sellCityName = ""; formData.data.sellAddress = ""; if (val) { proxy.post("/contractTemplate/detail", { id: val }).then((res) => { formData.data.sellCorporationId = res.corporationId; if (res.corporationId) { proxy .post("/corporation/detail", { id: res.corporationId }) .then((detailCorporation) => { proxy .post("/customizeArea/list", { parentId: "0" }) .then((resCountry) => { let sellCountryData = resCountry.filter( (item) => item.id === detailCorporation.countryId ); if (sellCountryData && sellCountryData.length > 0) { formData.data.sellCountryName = sellCountryData[0].name; } else { formData.data.sellCountryName = ""; } }); if (detailCorporation.countryId) { proxy .post("/customizeArea/list", { parentId: detailCorporation.countryId, }) .then((resProvince) => { let sellProvinceData = resProvince.filter( (item) => item.id === detailCorporation.provinceId ); if (sellProvinceData && sellProvinceData.length > 0) { formData.data.sellProvinceName = sellProvinceData[0].name; } else { formData.data.sellProvinceName = ""; } }); } else { formData.data.sellProvinceName = ""; } if (detailCorporation.provinceId) { proxy .post("/customizeArea/list", { parentId: detailCorporation.provinceId, }) .then((resCity) => { let sellCityData = resCity.filter( (item) => item.id === detailCorporation.cityId ); if (sellCityData && sellCityData.length > 0) { formData.data.sellCityName = sellCityData[0].name; } else { formData.data.sellCityName = ""; } }); } else { formData.data.sellCityName = ""; } formData.data.sellAddress = detailCorporation.address; }); } formData.data.sellContactName = res.contactName; formData.data.sellContactNumber = res.contactNumber; }); } }; const getCityData = (id, type, isChange) => { proxy.post("/customizeArea/list", { parentId: id }).then((res) => { if (type === "20") { provinceData.value = res; if (isChange) { formData.data.provinceId = ""; formData.data.provinceName = ""; formData.data.cityId = ""; formData.data.cityName = ""; } } else if (type === "30") { cityData.value = res; if (isChange) { formData.data.cityId = ""; formData.data.cityName = ""; } } else { countryData.value = res; } }); }; getCityData("0"); const changeCustomer = (val) => { formData.data.sampleProductList = []; formData.data.customerName = ""; formData.data.customerTel = ""; if (val) { proxy.post("/customer/detail", { id: val }).then( (res) => { formData.data.buyCorporationName = res.name; if (res.customerUserList && res.customerUserList.length > 0) { formData.data.buyContactName = res.customerUserList[0].name; if (res.customerUserList[0].contactJson) { let contactJson = JSON.parse(res.customerUserList[0].contactJson); if (contactJson && contactJson.length > 0) { formData.data.buyContactNumber = contactJson[0].contactNo; } } customerUserList.value = res.customerUserList.map((item) => { return { ...item, value: item.name, }; }); } formData.data.countryId = res.countryId; formData.data.provinceId = res.provinceId; formData.data.cityId = res.cityId; formData.data.buyPostalCode = res.zipCode; formData.data.buyAddress = res.address; getCityData(formData.data.countryId, "20"); if (formData.data.provinceId) { getCityData(formData.data.provinceId, "30"); } }, (err) => { console.log(err); formData.data.countryId = ""; formData.data.provinceId = ""; formData.data.cityId = ""; formData.data.buyPostalCode = ""; formData.data.buyAddress = ""; } ); } else { formData.data.countryId = ""; formData.data.provinceId = ""; formData.data.cityId = ""; formData.data.buyPostalCode = ""; formData.data.buyAddress = ""; } }; const createFilter = (queryString) => { return (restaurant) => { return ( restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0 ); }; }; const querySearchPerson = (queryString, callback) => { const results = queryString ? customerUserList.value.filter(createFilter(queryString)) : customerUserList.value; callback(results); }; const handlePerson = (item) => { formData.data.customerTel = item.phone; }; const selectProduct = (goods) => { if (goods && goods.id) { let data = formData.data.sampleProductList.filter( (item) => item.productId === goods.id ); if (data && data.length > 0) { return ElMessage("该产品已添加"); } let fileUrl = ""; if (goods.fileList && goods.fileList.length > 0) { fileUrl = goods.fileList[0].fileUrl; } let packMethod = ""; if (goods.innerPackMethod) { let innerPackMethod = goods.innerPackMethod.split(","); innerPackMethod.map((item) => { if (packMethod) { packMethod = packMethod + "," + proxy.dictValueLabel(item, innerMethod.value); } else { packMethod = proxy.dictValueLabel(item, innerMethod.value); } }); } if (goods.outerPackMethod) { let outerPackMethod = goods.outerPackMethod.split(","); outerPackMethod.map((item) => { if (packMethod) { packMethod = packMethod + "," + proxy.dictValueLabel(item, outsideMethod.value); } else { packMethod = proxy.dictValueLabel(item, outsideMethod.value); } }); } if ( formData.data.sampleProductList && formData.data.sampleProductList.length > 0 ) { formData.data.sampleProductList.push({ fileUrl: fileUrl, productId: goods.id, productCnName: goods.name, productName: goods.nameEnglish, productModel: goods.productLong + "*" + goods.productWide + "*" + goods.productHigh, quantity: undefined, price: undefined, amount: "", tradeMethods: "", packMethod: packMethod, }); } else { formData.data.sampleProductList = [ { fileUrl: fileUrl, productId: goods.id, productCnName: goods.name, productName: goods.nameEnglish, productModel: goods.productLong + "*" + goods.productWide + "*" + goods.productHigh, quantity: undefined, price: undefined, amount: "", tradeMethods: "", packMethod: packMethod, }, ]; } formData.data.sampleShipmentList.push({ productCode: goods.code, productId: goods.id, productName: goods.nameEnglish, shipmentTime: "", quantity: undefined, }); ElMessage({ message: "添加成功!", type: "success", }); } else { return ElMessage("选择错误"); } }; const onPicture = (path) => { window.open(path, "_blank"); }; const handleRemove = async (index, row) => { formData.data.sampleShipmentList = formData.data.sampleShipmentList.filter( (item) => item.productId !== row.productId ); await formData.data.sampleProductList.splice(index, 1); totalAmount(); }; const calculationAmount = () => { nextTick(() => { if ( formData.data.sampleProductList && formData.data.sampleProductList.length > 0 ) { for (let i = 0; i < formData.data.sampleProductList.length; i++) { let money = 0; if ( formData.data.sampleProductList[i].quantity && formData.data.sampleProductList[i].price ) { money = parseFloat( Number(formData.data.sampleProductList[i].quantity) * Number(formData.data.sampleProductList[i].price) ).toFixed(2); } formData.data.sampleProductList[i].amount = money; } } nextTick(() => { totalAmount(); }); }); }; const totalAmount = () => { let money = 0; if ( formData.data.sampleProductList && formData.data.sampleProductList.length > 0 ) { for (let i = 0; i < formData.data.sampleProductList.length; i++) { if (formData.data.sampleProductList[i].amount) { money = parseFloat( Number(money) + Number(formData.data.sampleProductList[i].amount) ).toFixed(2); } } } if ( formData.data.sampleProjectList && formData.data.sampleProjectList.length > 0 ) { for (let i = 0; i < formData.data.sampleProjectList.length; i++) { if (formData.data.sampleProjectList[i].amount) { money = parseFloat( Number(money) + Number(formData.data.sampleProjectList[i].amount) ).toFixed(2); } } } formData.data.amount = money; }; const clickAdd = () => { if ( formData.data.sampleProjectList && formData.data.sampleProjectList.length > 0 ) { formData.data.sampleProjectList.push({ payName: "", amount: undefined, remark: "", }); } else { formData.data.sampleProjectList = [ { payName: "", amount: undefined, remark: "" }, ]; } }; const handleDelete = async (index) => { await formData.data.sampleProjectList.splice(index, 1); totalAmount(); }; const querySearch = (queryString, callback) => { proxy.post("/quotationPay/page", { payName: queryString }).then((res) => { if (res.rows && res.rows.length > 0) { res.rows = res.rows.map((item) => { return { ...item, value: item.payName, }; }); callback(res.rows); } else { callback([]); } }); }; const handleSubmit = async () => { let status = await submit.value.handleSubmit(() => {}); if (status) { if ( !( formData.data.sampleProductList && formData.data.sampleProductList.length > 0 ) ) { ElMessage("请添加至少一件商品"); return false; } if (formData.data.fileList && formData.data.fileList.length > 0) { for (let i = 0; i < formData.data.fileList.length; i++) { if (formData.data.fileList[i].raw.uploadState) { ElMessage("文件上传中,请稍后提交"); return false; } } } if ( formData.data.packageFileList && formData.data.packageFileList.length > 0 ) { for (let i = 0; i < formData.data.packageFileList.length; i++) { if (formData.data.packageFileList[i].raw.uploadState) { ElMessage("文件上传中,请稍后提交"); return false; } } } if ( formData.data.sampleShipmentList && formData.data.sampleShipmentList.length > 0 ) { for (let i = 0; i < formData.data.sampleProductList.length; i++) { let data = formData.data.sampleShipmentList.filter( (item) => item.productId === formData.data.sampleProductList[i].productId ); if (data && data.length > 0) { let quantity = 0; for (let j = 0; j < data.length; j++) { quantity = parseFloat(Number(quantity) + Number(data[j].quantity)); } if (quantity > formData.data.sampleProductList[i].quantity) { ElMessage("出货数量不能大于商品数量"); return false; } } } } return true; } else { setTimeout(() => { const errorDiv = document.getElementsByClassName("is-error"); errorDiv[0].scrollIntoView(); }, 0); } return status; }; // 接收父组件的传值 const props = defineProps({ queryData: Object, }); watch( props.queryData, () => { formOption.disabled = judgeStatus(); return; if ( props.queryData && ["10", "20", "30"].includes(route.query.processType) ) { for (var text in props.queryData) { if (text === "fileList" || text === "packageFileList") { if (props.queryData[text] && props.queryData[text].length > 0) { formData.data[text] = props.queryData[text].map((item) => { return { raw: item, name: item.fileName, url: item.fileUrl, }; }); } } else { formData.data[text] = props.queryData[text]; } } if (formData.data.countryId) { getCityData(formData.data.countryId, "20"); } if (formData.data.provinceId) { getCityData(formData.data.provinceId, "30"); } } }, { deep: true, } ); const clickCustomerProduct = () => { if (!formData.data.buyCorporationId) { return ElMessage("请先选择客户"); } openProductCustomer.value = true; }; const loadingSearch = ref(false); const remoteMethod = (keyword) => { if (keyword && typeof keyword === "string") { loadingSearch.value = true; proxy.post("/customer/selPage", { keyword }).then((res) => { customerList.value = res.rows.map((x) => ({ ...x, label: x.name, value: x.id, })); loadingSearch.value = false; }); } return; }; const getFormData = () => { return proxy.deepClone(formData.data); }; // 向父组件暴露 defineExpose({ getFormData, handleSubmit, }); const changeShroffAccount = (val) => { if (val) { let data = accountList.value.filter((item) => item.value === val); if (data && data.length > 0) { formData.data.beneficiaryName = data[0].beneficiaryName; formData.data.beneficiaryBank = data[0].beneficiaryBank; formData.data.beneficiaryBankAddress = data[0].beneficiaryBankAddress; formData.data.beneficiaryAccountNumber = data[0].beneficiaryAccountNumber; formData.data.swiftCode = data[0].swiftCode; formData.data.beneficiaryAddress = data[0].beneficiaryAddress; } } }; const changeActiveName = () => { if (activeName.value) { activeName.value = ""; } else { activeName.value = "1"; } }; const uploadFile = async (file) => { const res = await proxy.post("/fileInfo/getSing", { fileName: file.name }); uploadData.value = res.uploadBody; file.id = res.id; file.fileName = res.fileName; file.fileUrl = res.fileUrl; file.uploadState = true; return true; }; const indicationUploadFile = async (file) => { const res = await proxy.post("/fileInfo/getSing", { fileName: file.name }); indicationUploadData.value = res.uploadBody; file.id = res.id; file.fileName = res.fileName; file.fileUrl = res.fileUrl; file.uploadState = true; return true; }; const handleSuccess = (any, UploadFile) => { UploadFile.raw.uploadState = false; }; const onPreviewFile = (file) => { window.open(file.raw.fileUrl, "_blank"); }; const clickSplit = (item) => { formData.data.sampleShipmentList.push({ productCode: item.code, productId: item.productId, productName: item.productName, shipmentTime: "", quantity: undefined, }); }; const clickDelete = (index) => { formData.data.sampleShipmentList.splice(index, 1); }; onMounted(() => { formOption.disabled = judgeStatus(); if (route.query && route.query.processType) { let businessId = route.query.businessId; proxy.post("/sample/detail", { id: businessId }).then((res) => { res.sampleShipmentList = res.sampleShipmentLists; res.countryId = res.buyCountryId; res.provinceId = res.buyProvinceId; res.cityId = res.buyCityId; if (!res.fileList) { res.fileList = []; } if (!res.packageFileList) { res.packageFileList = []; } for (const key in res) { formData.data[key] = res[key]; } proxy .post("/fileInfo/getList", { businessIdList: [businessId], }) .then((fileObj) => { if (fileObj[businessId] && fileObj[businessId].length > 0) { formData.data.fileList = fileObj[businessId] .filter((x) => x.businessType === "1") .map((x) => ({ raw: x, name: x.fileName, url: x.fileUrl })); formData.data.packageFileList = fileObj[businessId] .filter((x) => x.businessType === "2") .map((x) => ({ raw: x, name: x.fileName, url: x.fileUrl })); } }); if ( formData.data.sampleProductList && formData.data.sampleProductList.length > 0 ) { for (let i = 0; i < formData.data.sampleProductList.length; i++) { const e = formData.data.sampleProductList[i]; if (e.ehsdJson) { let obj = JSON.parse(e.ehsdJson); e.packMethod = obj.packMethod; e.tradeMethods = obj.tradeMethods; } } let ids = formData.data.sampleProductList.map((x) => x.productId); proxy .post("/fileInfo/getList", { businessIdList: ids, }) .then((fileObj) => { for (let i = 0; i < formData.data.sampleProductList.length; i++) { const e = formData.data.sampleProductList[i]; for (const key in fileObj) { if (e.productId === key) { e.fileList = fileObj[key] || []; if (e.fileList && e.fileList.length > 0) { e.fileUrl = e.fileList[0].fileUrl; } } } } }); } if (formData.data.countryId) { getCityData(formData.data.countryId, "20"); } if (formData.data.provinceId) { getCityData(formData.data.provinceId, "30"); } }); } else if (route.query && !route.query.processType) { let businessId = route.query.businessId; proxy.post("/sample/detail", { id: businessId }).then((res) => { if (res && res.dataJson) { res = { ...res, ...JSON.parse(res.dataJson) }; } res.sampleShipmentList = res.sampleShipmentLists; res.countryId = res.buyCountryId; res.provinceId = res.buyProvinceId; res.cityId = res.buyCityId; if (!res.fileList) { res.fileList = []; } if (!res.packageFileList) { res.packageFileList = []; } for (const key in res) { formData.data[key] = res[key]; } formData.data.oldSampleId = formData.data.id; delete formData.data.id; proxy .post("/fileInfo/getList", { businessIdList: [businessId], }) .then((fileObj) => { if (fileObj[businessId] && fileObj[businessId].length > 0) { formData.data.fileList = fileObj[businessId] .filter((x) => x.businessType === "1") .map((x) => ({ raw: x, name: x.fileName, url: x.fileUrl })); formData.data.packageFileList = fileObj[businessId] .filter((x) => x.businessType === "2") .map((x) => ({ raw: x, name: x.fileName, url: x.fileUrl })); } }); if ( formData.data.sampleProductList && formData.data.sampleProductList.length > 0 ) { for (let i = 0; i < formData.data.sampleProductList.length; i++) { const e = formData.data.sampleProductList[i]; if (e.ehsdJson) { let obj = JSON.parse(e.ehsdJson); e.packMethod = obj.packMethod; e.tradeMethods = obj.tradeMethods; } } let ids = formData.data.sampleProductList.map((x) => x.productId); proxy .post("/fileInfo/getList", { businessIdList: ids, }) .then((fileObj) => { for (let i = 0; i < formData.data.sampleProductList.length; i++) { const e = formData.data.sampleProductList[i]; for (const key in fileObj) { if (e.productId === key) { e.fileList = fileObj[key] || []; if (e.fileList && e.fileList.length > 0) { e.fileUrl = e.fileList[0].fileUrl; } } } } }); } if (formData.data.countryId) { getCityData(formData.data.countryId, "20"); } if (formData.data.provinceId) { getCityData(formData.data.provinceId, "30"); } }); } }); </script> <style lang="scss" scoped> ::v-deep(.el-input-number .el-input__inner) { text-align: left; } .pic { object-fit: contain; width: 50px; height: 50px; cursor: pointer; vertical-align: middle; } .shrinkPadding { padding-right: 0 !important; } .hideCollapse { margin-top: -62px; border: 0 !important; } ::v-deep(.el-collapse-item__arrow) { display: none !important; } ::v-deep(.el-collapse-item__wrap) { border: 0 !important; } ::v-deep(.el-collapse-item__header) { border: 0 !important; } </style>