|
@@ -0,0 +1,1092 @@
|
|
|
+<template>
|
|
|
+ <div class="form">
|
|
|
+ <van-tabs v-model:active="active">
|
|
|
+ <van-tab :title="proxy.t('contract.transactionInformation')" />
|
|
|
+ <van-tab title="付款信息" />
|
|
|
+ <van-tab :title="proxy.t('contract.commodityInformation')" />
|
|
|
+ <van-tab :title="proxy.t('contract.otherCharges')" />
|
|
|
+ <van-tab :title="proxy.t('contract.shipmentPlan')" />
|
|
|
+ <div class="common-process-card" v-show="active == 0">
|
|
|
+ <div class="common-title">
|
|
|
+ {{ proxy.t("contract.transactionInformation") }}
|
|
|
+ </div>
|
|
|
+ <testForm
|
|
|
+ v-model="formData.data"
|
|
|
+ :formOption="formOption"
|
|
|
+ :formConfig="formConfig"
|
|
|
+ :rules="rules"
|
|
|
+ ref="formDom1"
|
|
|
+ >
|
|
|
+ </testForm>
|
|
|
+ </div>
|
|
|
+ <div class="common-process-card" v-show="active == 1">
|
|
|
+ <div class="common-title">付款信息</div>
|
|
|
+ <testForm
|
|
|
+ v-model="formData.data"
|
|
|
+ :formOption="formOption"
|
|
|
+ :formConfig="formConfigOne"
|
|
|
+ :rules="rules"
|
|
|
+ ref="formDom2"
|
|
|
+ >
|
|
|
+ </testForm>
|
|
|
+ </div>
|
|
|
+ <div class="common-process-card" v-show="active == 2">
|
|
|
+ <div class="common-title">商品信息</div>
|
|
|
+ <testForm
|
|
|
+ v-model="formData.data"
|
|
|
+ :formOption="formGoodsOption"
|
|
|
+ :formConfig="formEmptyConfig"
|
|
|
+ :rules="rules"
|
|
|
+ ref="formDom3"
|
|
|
+ >
|
|
|
+ </testForm>
|
|
|
+ </div>
|
|
|
+ <div class="common-process-card" v-show="active == 3">
|
|
|
+ <div class="common-title">其他收费</div>
|
|
|
+ <testForm
|
|
|
+ v-model="formData.data"
|
|
|
+ :formOption="formProjectOption"
|
|
|
+ :formConfig="formEmptyConfig"
|
|
|
+ :rules="rules"
|
|
|
+ ref="formDom4"
|
|
|
+ >
|
|
|
+ </testForm>
|
|
|
+ <testForm
|
|
|
+ v-model="formData.data"
|
|
|
+ :formOption="formOption"
|
|
|
+ :formConfig="formAmountProjectConfig"
|
|
|
+ :rules="rules"
|
|
|
+ ref="formDom5"
|
|
|
+ >
|
|
|
+ </testForm>
|
|
|
+ </div>
|
|
|
+ <div class="common-process-card" v-show="active == 4">
|
|
|
+ <div class="common-title">出货计划</div>
|
|
|
+ <testForm
|
|
|
+ v-model="formData.data"
|
|
|
+ :formOption="formShipmentOption"
|
|
|
+ :formConfig="formEmptyConfig"
|
|
|
+ :rules="rulesTwo"
|
|
|
+ ref="formDom6"
|
|
|
+ >
|
|
|
+ </testForm>
|
|
|
+ </div>
|
|
|
+ </van-tabs>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import {
|
|
|
+ ref,
|
|
|
+ getCurrentInstance,
|
|
|
+ onMounted,
|
|
|
+ defineProps,
|
|
|
+ defineExpose,
|
|
|
+ watch,
|
|
|
+ reactive,
|
|
|
+ toRefs,
|
|
|
+} from "vue";
|
|
|
+import { useRoute } from "vue-router";
|
|
|
+import testForm from "@/components/testForm/index.vue";
|
|
|
+import { getUserInfo } from "@/utils/auth";
|
|
|
+import { showFailToast } from "vant";
|
|
|
+
|
|
|
+// 接收父组件的传值
|
|
|
+const props = defineProps({
|
|
|
+ queryData: Object,
|
|
|
+});
|
|
|
+const refProps = toRefs(props);
|
|
|
+const proxy = getCurrentInstance().proxy;
|
|
|
+const route = useRoute();
|
|
|
+const active = ref(0);
|
|
|
+const tabsChange = () => {
|
|
|
+ active.value++;
|
|
|
+};
|
|
|
+const formData = reactive({
|
|
|
+ data: {
|
|
|
+ contractProductList: [],
|
|
|
+ contractProjectList: [],
|
|
|
+ contractShipmentList: [],
|
|
|
+ },
|
|
|
+});
|
|
|
+const formDom1 = ref(null);
|
|
|
+const formDom2 = ref(null);
|
|
|
+const formDom3 = ref(null);
|
|
|
+const formDom4 = ref(null);
|
|
|
+const formDom5 = ref(null);
|
|
|
+const formDom6 = ref(null);
|
|
|
+
|
|
|
+const formOption = reactive({
|
|
|
+ readonly: false,
|
|
|
+ disabled: false,
|
|
|
+ labelAlign: "top",
|
|
|
+ scroll: true,
|
|
|
+ labelWidth: "62pk",
|
|
|
+ hiddenSubmitBtn: true,
|
|
|
+});
|
|
|
+const formConfig = reactive([
|
|
|
+ {
|
|
|
+ type: "picker",
|
|
|
+ label: proxy.t("contract.contractTemplateId"),
|
|
|
+ prop: "contractTemplateId",
|
|
|
+ itemType: "onePicker",
|
|
|
+ showPicker: false,
|
|
|
+ fieldNames: {
|
|
|
+ text: "label",
|
|
|
+ value: "value",
|
|
|
+ },
|
|
|
+ data: [],
|
|
|
+ changeFn: (val, data) => {},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "title",
|
|
|
+ title: proxy.t("contract.sellerInformation"),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "picker",
|
|
|
+ label: proxy.t("contract.sellCorporationId"),
|
|
|
+ prop: "sellCorporationId",
|
|
|
+ itemType: "onePicker",
|
|
|
+ showPicker: false,
|
|
|
+ fieldNames: {
|
|
|
+ text: "label",
|
|
|
+ value: "value",
|
|
|
+ },
|
|
|
+ data: [],
|
|
|
+ readonly: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: proxy.t("contract.cityText"),
|
|
|
+ prop: "sellCity",
|
|
|
+ itemType: "text",
|
|
|
+ readonly: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: proxy.t("contract.address"),
|
|
|
+ prop: "sellAddress",
|
|
|
+ itemType: "textarea",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: proxy.t("contract.contactName"),
|
|
|
+ prop: "sellContactName",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: proxy.t("contract.contactNumber"),
|
|
|
+ prop: "sellContactNumber",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "title",
|
|
|
+ title: proxy.t("contract.buyerInformation"),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "picker",
|
|
|
+ label: proxy.t("contract.buyCorporationId"),
|
|
|
+ prop: "buyCorporationId",
|
|
|
+ itemType: "onePicker",
|
|
|
+ showPicker: false,
|
|
|
+ fieldNames: {
|
|
|
+ text: "label",
|
|
|
+ value: "value",
|
|
|
+ },
|
|
|
+ data: [],
|
|
|
+ changeFn: (val, data) => {},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "cascader",
|
|
|
+ label: proxy.t("contract.cityText"),
|
|
|
+ prop: "countryId",
|
|
|
+ itemType: "city",
|
|
|
+ showPicker: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: proxy.t("contract.address"),
|
|
|
+ prop: "buyAddress",
|
|
|
+ itemType: "textarea",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: proxy.t("contract.postalCode"),
|
|
|
+ prop: "buyPostalCode",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: proxy.t("contract.contactName"),
|
|
|
+ prop: "buyContactName",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: proxy.t("contract.contactNumber"),
|
|
|
+ prop: "buyContactNumber",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+]);
|
|
|
+const formConfigOne = reactive([
|
|
|
+ {
|
|
|
+ type: "picker",
|
|
|
+ label: "币种",
|
|
|
+ prop: "currency",
|
|
|
+ itemType: "onePicker",
|
|
|
+ showPicker: false,
|
|
|
+ fieldNames: {
|
|
|
+ text: "label",
|
|
|
+ value: "value",
|
|
|
+ },
|
|
|
+ data: [],
|
|
|
+ readonly: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "汇率",
|
|
|
+ prop: "rate",
|
|
|
+ itemType: "number",
|
|
|
+ readonly: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "picker",
|
|
|
+ label: "付款方式",
|
|
|
+ prop: "paymentMethod",
|
|
|
+ itemType: "onePicker",
|
|
|
+ showPicker: false,
|
|
|
+ fieldNames: {
|
|
|
+ text: "label",
|
|
|
+ value: "value",
|
|
|
+ },
|
|
|
+ data: [],
|
|
|
+ readonly: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "预付比例",
|
|
|
+ prop: "advanceRatio",
|
|
|
+ itemType: "number",
|
|
|
+ readonly: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "付款条件",
|
|
|
+ prop: "remark",
|
|
|
+ itemType: "textarea",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "picker",
|
|
|
+ label: "收款账号",
|
|
|
+ prop: "shroffAccountId",
|
|
|
+ itemType: "onePicker",
|
|
|
+ showPicker: false,
|
|
|
+ fieldNames: {
|
|
|
+ text: "label",
|
|
|
+ value: "value",
|
|
|
+ },
|
|
|
+ data: [],
|
|
|
+ readonly: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "Beneficiary Name",
|
|
|
+ prop: "beneficiaryName",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "Beneficiary Account Number",
|
|
|
+ prop: "beneficiaryAccountNumber",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "Beneficiary Bank",
|
|
|
+ prop: "beneficiaryBank",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "Swift Code",
|
|
|
+ prop: "swiftCode",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "Beneficiary Bank Address",
|
|
|
+ prop: "beneficiaryBankAddress",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "Beneficiary Address",
|
|
|
+ prop: "beneficiaryAddress",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "title",
|
|
|
+ title: "交付信息",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "报价有效期 (天)",
|
|
|
+ prop: "effective",
|
|
|
+ itemType: "number",
|
|
|
+ readonly: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "picker",
|
|
|
+ label: "交货期限",
|
|
|
+ prop: "deliveryTime",
|
|
|
+ itemType: "datePicker",
|
|
|
+ showPicker: false,
|
|
|
+ split: "-",
|
|
|
+ columnsType: ["year", "month", "day"],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "picker",
|
|
|
+ label: "运输方式",
|
|
|
+ prop: "transportMethod",
|
|
|
+ itemType: "onePicker",
|
|
|
+ showPicker: false,
|
|
|
+ fieldNames: {
|
|
|
+ text: "label",
|
|
|
+ value: "value",
|
|
|
+ },
|
|
|
+ data: [],
|
|
|
+ readonly: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "运输说明",
|
|
|
+ prop: "transportRemark",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+]);
|
|
|
+const formGoodsOption = reactive({
|
|
|
+ readonly: false,
|
|
|
+ disabled: false,
|
|
|
+ labelAlign: "top",
|
|
|
+ scroll: true,
|
|
|
+ labelWidth: "62pk",
|
|
|
+ hiddenSubmitBtn: true,
|
|
|
+ btnConfig: {
|
|
|
+ isNeed: true,
|
|
|
+ prop: "contractProductList",
|
|
|
+ plain: true,
|
|
|
+ listTitle: "商品信息",
|
|
|
+ listConfig: [
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "商品中文名",
|
|
|
+ prop: "productCnName",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "商品英文名",
|
|
|
+ prop: "productName",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "尺寸 cm*cm*cm",
|
|
|
+ prop: "productModel",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "包装方式",
|
|
|
+ prop: "packMethod",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "数量",
|
|
|
+ prop: "quantity",
|
|
|
+ itemType: "number",
|
|
|
+ // changeFn: () => {
|
|
|
+ // calculatedAmount();
|
|
|
+ // },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "单价",
|
|
|
+ prop: "price",
|
|
|
+ itemType: "number",
|
|
|
+ // changeFn: () => {
|
|
|
+ // calculatedAmount();
|
|
|
+ // },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "picker",
|
|
|
+ label: "贸易方式",
|
|
|
+ prop: "tradeMethods",
|
|
|
+ itemType: "onePicker",
|
|
|
+ showPicker: false,
|
|
|
+ fieldNames: {
|
|
|
+ text: "label",
|
|
|
+ value: "value",
|
|
|
+ },
|
|
|
+ data: [],
|
|
|
+ readonly: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "金额",
|
|
|
+ prop: "amount",
|
|
|
+ itemType: "number",
|
|
|
+ // changeFn: () => {
|
|
|
+ // calculatedAmount();
|
|
|
+ // },
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ clickFn: () => {
|
|
|
+ if (
|
|
|
+ formData.data.contractProductList &&
|
|
|
+ formData.data.contractProductList.length > 0
|
|
|
+ ) {
|
|
|
+ formData.data.contractProductList.push({
|
|
|
+ productId: null,
|
|
|
+ productName: null,
|
|
|
+ productModel: null,
|
|
|
+ quantity: null,
|
|
|
+ price: null,
|
|
|
+ amount: null,
|
|
|
+ remark: null,
|
|
|
+ });
|
|
|
+ formData.data.contractShipmentList.push({
|
|
|
+ productId: null,
|
|
|
+ productName: null,
|
|
|
+ shipmentTime: null,
|
|
|
+ quantity: null,
|
|
|
+ remark: null,
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ formData.data.contractProductList = [
|
|
|
+ {
|
|
|
+ productId: null,
|
|
|
+ productName: null,
|
|
|
+ productModel: null,
|
|
|
+ quantity: null,
|
|
|
+ price: null,
|
|
|
+ amount: null,
|
|
|
+ remark: null,
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ formData.data.contractShipmentList = [
|
|
|
+ {
|
|
|
+ productId: null,
|
|
|
+ productName: null,
|
|
|
+ shipmentTime: null,
|
|
|
+ quantity: null,
|
|
|
+ remark: null,
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ },
|
|
|
+ deleteFn: (index) => {
|
|
|
+ formData.data.contractProductList.splice(index, 1);
|
|
|
+ formData.data.contractShipmentList.splice(index, 1);
|
|
|
+ handleChangeAmount();
|
|
|
+ },
|
|
|
+ },
|
|
|
+});
|
|
|
+const formEmptyConfig = reactive([]);
|
|
|
+
|
|
|
+const formAmountProjectConfig = reactive([
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "合同总金额",
|
|
|
+ prop: "amount",
|
|
|
+ itemType: "text",
|
|
|
+ readonly: true,
|
|
|
+ },
|
|
|
+]);
|
|
|
+const formProjectOption = reactive({
|
|
|
+ readonly: false,
|
|
|
+ disabled: false,
|
|
|
+ labelAlign: "top",
|
|
|
+ scroll: true,
|
|
|
+ labelWidth: "62pk",
|
|
|
+ hiddenSubmitBtn: true,
|
|
|
+ btnConfig: {
|
|
|
+ isNeed: true,
|
|
|
+ prop: "contractProjectList",
|
|
|
+ plain: true,
|
|
|
+ listTitle: "收费项目",
|
|
|
+ listConfig: [
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "收费项目",
|
|
|
+ prop: "payName",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "金额",
|
|
|
+ prop: "amount",
|
|
|
+ itemType: "number",
|
|
|
+ changeFn: () => {
|
|
|
+ handleChangeAmount();
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "备注",
|
|
|
+ prop: "remark",
|
|
|
+ itemType: "textarea",
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ clickFn: () => {
|
|
|
+ if (
|
|
|
+ formData.data.contractProjectList &&
|
|
|
+ formData.data.contractProjectList.length > 0
|
|
|
+ ) {
|
|
|
+ formData.data.contractProjectList.push({
|
|
|
+ payName: null,
|
|
|
+ amount: null,
|
|
|
+ remark: null,
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ formData.data.contractProjectList = [
|
|
|
+ {
|
|
|
+ payName: null,
|
|
|
+ amount: null,
|
|
|
+ remark: null,
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ },
|
|
|
+ deleteFn: (index) => {
|
|
|
+ formData.data.contractProjectList.splice(index, 1);
|
|
|
+ handleChangeAmount();
|
|
|
+ },
|
|
|
+ },
|
|
|
+});
|
|
|
+
|
|
|
+const formShipmentOption = reactive({
|
|
|
+ readonly: false,
|
|
|
+ disabled: false,
|
|
|
+ labelAlign: "top",
|
|
|
+ scroll: true,
|
|
|
+ labelWidth: "62pk",
|
|
|
+ hiddenSubmitBtn: true,
|
|
|
+ btnConfig: {
|
|
|
+ isNeed: false,
|
|
|
+ prop: "contractShipmentList",
|
|
|
+ plain: true,
|
|
|
+ listTitle: "商品",
|
|
|
+ listConfig: [
|
|
|
+ {
|
|
|
+ type: "picker",
|
|
|
+ label: "出货日期",
|
|
|
+ prop: "shipmentTime",
|
|
|
+ itemType: "datePicker",
|
|
|
+ showPicker: false,
|
|
|
+ split: "-",
|
|
|
+ columnsType: ["year", "month", "day"],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "商品编码",
|
|
|
+ prop: "productCode",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "商品名称",
|
|
|
+ prop: "productName",
|
|
|
+ itemType: "text",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "input",
|
|
|
+ label: "出货数量",
|
|
|
+ prop: "quantity",
|
|
|
+ itemType: "number",
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+});
|
|
|
+const rules = {
|
|
|
+ contractType: [
|
|
|
+ { required: true, message: proxy.t("contract.contractTypeMsg") },
|
|
|
+ ],
|
|
|
+ contractTemplateId: [
|
|
|
+ { required: true, message: proxy.t("contract.contractTemplateIdMsg") },
|
|
|
+ ],
|
|
|
+ sellCorporationId: [
|
|
|
+ { required: true, message: proxy.t("contract.sellCorporationIdMsg") },
|
|
|
+ ],
|
|
|
+ buyCorporationId: [
|
|
|
+ { required: true, message: proxy.t("contract.buyCorporationIdMsg") },
|
|
|
+ ],
|
|
|
+ sellCity: [{ required: true, message: proxy.t("contract.cityMsg") }],
|
|
|
+ countryCity: [{ required: true, message: proxy.t("contract.cityMsg") }],
|
|
|
+ sellAddress: [{ required: true, message: proxy.t("contract.addressMsg") }],
|
|
|
+ buyAddress: [{ required: true, message: proxy.t("contract.addressMsg") }],
|
|
|
+ sellContactName: [
|
|
|
+ { required: true, message: proxy.t("contract.contactNameMsg") },
|
|
|
+ ],
|
|
|
+ sellContactNumber: [
|
|
|
+ { required: true, message: proxy.t("contract.contactNumberMsg") },
|
|
|
+ ],
|
|
|
+ // buyPostalCode: [{ required: true, message: proxy.t("contract.postalCodeMsg") }],
|
|
|
+ buyContactName: [
|
|
|
+ { required: true, message: proxy.t("contract.contactNameMsg") },
|
|
|
+ ],
|
|
|
+ buyContactNumber: [
|
|
|
+ { required: true, message: proxy.t("contract.contactNumberMsg") },
|
|
|
+ ],
|
|
|
+ productId: [{ required: true, message: proxy.t("contract.productIdMsg") }],
|
|
|
+ productName: [
|
|
|
+ { required: true, message: proxy.t("contract.productNameMsg") },
|
|
|
+ ],
|
|
|
+ productModel: [
|
|
|
+ { required: true, message: proxy.t("contract.productModelMsg") },
|
|
|
+ ],
|
|
|
+ quantity: [{ required: true, message: proxy.t("contract.quantityMsg") }],
|
|
|
+ price: [{ required: true, message: proxy.t("contract.priceMsg") }],
|
|
|
+ payName: [{ required: true, message: proxy.t("contract.chargeItemMsg") }],
|
|
|
+ amount: [{ required: true, message: proxy.t("contract.amountMsg") }],
|
|
|
+};
|
|
|
+const rulesTwo = {
|
|
|
+ currency: [{ required: true, message: proxy.t("contract.currencyMsg") }],
|
|
|
+ paymentMethod: [
|
|
|
+ { required: true, message: proxy.t("contract.paymentMethodMsg") },
|
|
|
+ ],
|
|
|
+ advanceRatio: [
|
|
|
+ { required: true, message: proxy.t("contract.advanceRatioMsg") },
|
|
|
+ ],
|
|
|
+ shroffAccountId: [
|
|
|
+ { required: true, message: proxy.t("contract.shroffAccountIdMsg") },
|
|
|
+ ],
|
|
|
+ tradeMethods: [
|
|
|
+ { required: true, message: proxy.t("contract.tradeMethodsMsg") },
|
|
|
+ ],
|
|
|
+ transportMethod: [
|
|
|
+ { required: true, message: proxy.t("contract.transportMethodMsg") },
|
|
|
+ ],
|
|
|
+ transportRemark: [
|
|
|
+ { required: true, message: proxy.t("contract.transportRemarkMsg") },
|
|
|
+ ],
|
|
|
+ remark: [{ required: true, message: proxy.t("contract.remarksMsg") }],
|
|
|
+};
|
|
|
+const getDict = () => {
|
|
|
+ let query = {
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 999,
|
|
|
+ tenantId: getUserInfo().tenantId,
|
|
|
+ };
|
|
|
+
|
|
|
+ proxy
|
|
|
+ .post("/contractTemplate/page", { pageNum: 1, pageSize: 999 })
|
|
|
+ .then((res) => {
|
|
|
+ formConfig[0].data = res.data.rows.map((item) => {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ label: item.templateName,
|
|
|
+ value: item.id,
|
|
|
+ };
|
|
|
+ });
|
|
|
+ });
|
|
|
+ proxy.post("/corporation/page", { pageNum: 1, pageSize: 999 }).then((res) => {
|
|
|
+ formConfig[2].data = res.data.rows.map((item) => {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ label: item.name,
|
|
|
+ value: item.id,
|
|
|
+ };
|
|
|
+ });
|
|
|
+ });
|
|
|
+ // 产品
|
|
|
+ proxy
|
|
|
+ .post("/productInfo/page", { pageNum: 1, pageSize: 9999, definition: "1" })
|
|
|
+ .then((res) => {
|
|
|
+ if (res.data.rows && res.data.rows.length > 0) {
|
|
|
+ formGoodsOption.btnConfig.listConfig[0].data = res.data.rows.map(
|
|
|
+ (item) => {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ label: item.name,
|
|
|
+ value: item.id,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ );
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // 币种
|
|
|
+ proxy
|
|
|
+ .post("/dictTenantData/page", { ...query, dictCode: "account_currency" })
|
|
|
+ .then((res) => {
|
|
|
+ if (res.data.rows && res.data.rows.length > 0) {
|
|
|
+ formConfigOne[0].data = res.data.rows.map((item) => {
|
|
|
+ return {
|
|
|
+ label: item.dictValue,
|
|
|
+ value: item.dictKey,
|
|
|
+ };
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // 付款方式
|
|
|
+ proxy
|
|
|
+ .post("/dictTenantData/page", {
|
|
|
+ ...query,
|
|
|
+ dictCode: "funds_payment_method",
|
|
|
+ })
|
|
|
+ .then((res) => {
|
|
|
+ if (res.data.rows && res.data.rows.length > 0) {
|
|
|
+ formConfigOne[2].data = res.data.rows.map((item) => {
|
|
|
+ return {
|
|
|
+ label: item.dictValue,
|
|
|
+ value: item.dictKey,
|
|
|
+ };
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // 账户
|
|
|
+ proxy
|
|
|
+ .post("/accountManagement/page", { pageNum: 1, pageSize: 999 })
|
|
|
+ .then((res) => {
|
|
|
+ if (res.data.rows && res.data.rows.length > 0) {
|
|
|
+ formConfigOne[5].data = res.data.rows.map((item) => {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ label: item.alias,
|
|
|
+ value: item.id,
|
|
|
+ };
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // 贸易方式
|
|
|
+ proxy
|
|
|
+ .post("/dictTenantData/page", { ...query, dictCode: "trade_mode" })
|
|
|
+ .then((res) => {
|
|
|
+ if (res.data.rows && res.data.rows.length > 0) {
|
|
|
+ formGoodsOption.btnConfig.listConfig[6].data = res.data.rows.map(
|
|
|
+ (item) => {
|
|
|
+ return {
|
|
|
+ label: item.dictValue,
|
|
|
+ value: item.dictKey,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ );
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // 运输方式
|
|
|
+ proxy
|
|
|
+ .post("/dictTenantData/page", { ...query, dictCode: "shipping_method" })
|
|
|
+ .then((res) => {
|
|
|
+ if (res.data.rows && res.data.rows.length > 0) {
|
|
|
+ formConfigOne[15].data = res.data.rows.map((item) => {
|
|
|
+ return {
|
|
|
+ label: item.dictValue,
|
|
|
+ value: item.dictKey,
|
|
|
+ };
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // if (["10", "20"].includes(route.query.processType)) {
|
|
|
+ // proxy
|
|
|
+ // .post("/customer/selPage", { pageNum: 1, pageSize: 50 })
|
|
|
+ // .then((res) => {
|
|
|
+ // formConfig[8].data = res.data.rows.map((x) => ({
|
|
|
+ // ...x,
|
|
|
+ // label: x.name,
|
|
|
+ // value: x.id,
|
|
|
+ // }));
|
|
|
+ // });
|
|
|
+ // }
|
|
|
+};
|
|
|
+getDict();
|
|
|
+const calculatedAmount = () => {
|
|
|
+ if (
|
|
|
+ formData.data.contractProductList &&
|
|
|
+ formData.data.contractProductList.length > 0
|
|
|
+ ) {
|
|
|
+ for (let i = 0; i < formData.data.contractProductList.length; i++) {
|
|
|
+ let money = 0;
|
|
|
+ if (
|
|
|
+ formData.data.contractProductList[i].quantity &&
|
|
|
+ formData.data.contractProductList[i].price
|
|
|
+ ) {
|
|
|
+ money = Number(
|
|
|
+ Math.round(
|
|
|
+ Number(formData.data.contractProductList[i].quantity) *
|
|
|
+ Number(formData.data.contractProductList[i].price) *
|
|
|
+ 10000
|
|
|
+ ) / 10000
|
|
|
+ );
|
|
|
+ }
|
|
|
+ formData.data.contractProductList[i].amount = money;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ handleChangeAmount();
|
|
|
+};
|
|
|
+const handleChangeAmount = () => {
|
|
|
+ let money = 0;
|
|
|
+ let amountProduct = 0;
|
|
|
+ let amountProject = 0;
|
|
|
+ if (
|
|
|
+ formData.data.contractProductList &&
|
|
|
+ formData.data.contractProductList.length > 0
|
|
|
+ ) {
|
|
|
+ for (let i = 0; i < formData.data.contractProductList.length; i++) {
|
|
|
+ if (formData.data.contractProductList[i].amount) {
|
|
|
+ money = Number(
|
|
|
+ Math.round(
|
|
|
+ (Number(money) +
|
|
|
+ Number(formData.data.contractProductList[i].amount)) *
|
|
|
+ 10000
|
|
|
+ ) / 10000
|
|
|
+ );
|
|
|
+ amountProduct = Number(
|
|
|
+ Math.round(
|
|
|
+ (Number(amountProduct) +
|
|
|
+ Number(formData.data.contractProductList[i].amount)) *
|
|
|
+ 10000
|
|
|
+ ) / 10000
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (
|
|
|
+ formData.data.contractProjectList &&
|
|
|
+ formData.data.contractProjectList.length > 0
|
|
|
+ ) {
|
|
|
+ for (let i = 0; i < formData.data.contractProjectList.length; i++) {
|
|
|
+ if (formData.data.contractProjectList[i].amount) {
|
|
|
+ money = Number(
|
|
|
+ Math.round(
|
|
|
+ (Number(money) +
|
|
|
+ Number(formData.data.contractProjectList[i].amount)) *
|
|
|
+ 10000
|
|
|
+ ) / 10000
|
|
|
+ );
|
|
|
+ amountProject = Number(
|
|
|
+ Math.round(
|
|
|
+ (Number(amountProject) +
|
|
|
+ Number(formData.data.contractProjectList[i].amount)) *
|
|
|
+ 10000
|
|
|
+ ) / 10000
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ formData.data.amount = money;
|
|
|
+ formData.data.amountProduct = amountProduct;
|
|
|
+ formData.data.amountProject = amountProject;
|
|
|
+};
|
|
|
+const handleSubmit = async () => {
|
|
|
+ const flag = await formDom1.value.validateForm().then((status) => {
|
|
|
+ if (status) {
|
|
|
+ active.value = 0;
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ if (
|
|
|
+ !(
|
|
|
+ formData.data.contractProductList &&
|
|
|
+ formData.data.contractProductList.length > 0
|
|
|
+ )
|
|
|
+ ) {
|
|
|
+ active.value = 1;
|
|
|
+ showFailToast(proxy.t("contract.pleaseAddProduct"));
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return formDom2.value.validateForm().then((status1) => {
|
|
|
+ if (status1) {
|
|
|
+ active.value = 1;
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ return formDom4.value.validateForm().then((status2) => {
|
|
|
+ if (status2) {
|
|
|
+ active.value = 2;
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ return formDom6.value.validateForm().then((status3) => {
|
|
|
+ if (status3) {
|
|
|
+ active.value = 3;
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (flag) {
|
|
|
+ return formData.data;
|
|
|
+ }
|
|
|
+};
|
|
|
+let status = ref(true);
|
|
|
+onMounted(() => {
|
|
|
+ if (route.query && route.query.businessId) {
|
|
|
+ let businessId = route.query.businessId;
|
|
|
+ proxy.post("/contract/detail", { id: businessId }).then((res) => {
|
|
|
+ console.log(res, "asda");
|
|
|
+
|
|
|
+ res.data.countryId = res.data.buyCountryId;
|
|
|
+ res.data.provinceId = res.data.buyProvinceId;
|
|
|
+ res.data.cityId = res.data.buyCityId;
|
|
|
+ for (const key in res.data) {
|
|
|
+ formData.data[key] = res.data[key];
|
|
|
+ }
|
|
|
+ formData.data.sellCity =
|
|
|
+ formData.data.sellCountryName +
|
|
|
+ " " +
|
|
|
+ formData.data.sellProvinceName +
|
|
|
+ " " +
|
|
|
+ formData.data.sellCityName;
|
|
|
+ formData.data.countryIdName =
|
|
|
+ formData.data.buyCountryName +
|
|
|
+ " " +
|
|
|
+ formData.data.buyProvinceName +
|
|
|
+ " " +
|
|
|
+ formData.data.buyCityName;
|
|
|
+ if (formData.data.buyCorporationName) {
|
|
|
+ proxy
|
|
|
+ .post("/customer/selPage", {
|
|
|
+ keyword: formData.data.buyCorporationName,
|
|
|
+ })
|
|
|
+ .then((res) => {
|
|
|
+ formConfig[8].data = res.data.rows.map((x) => ({
|
|
|
+ ...x,
|
|
|
+ label: x.name,
|
|
|
+ value: x.id,
|
|
|
+ }));
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (
|
|
|
+ formData.data.contractProductList &&
|
|
|
+ formData.data.contractProductList.length > 0
|
|
|
+ ) {
|
|
|
+ for (let i = 0; i < formData.data.contractProductList.length; i++) {
|
|
|
+ const e = formData.data.contractProductList[i];
|
|
|
+
|
|
|
+ if (e.ehsdJson) {
|
|
|
+ let obj = JSON.parse(e.ehsdJson);
|
|
|
+ console.log(obj, "asda");
|
|
|
+ e.packMethod = obj.packMethod;
|
|
|
+ e.tradeMethods = obj.tradeMethods;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (["10", "20"].includes(route.query.processType)) {
|
|
|
+ formOption.readonly = true;
|
|
|
+ formGoodsOption.readonly = true;
|
|
|
+ formGoodsOption.btnConfig.isNeed = false;
|
|
|
+ formProjectOption.readonly = true;
|
|
|
+ formProjectOption.btnConfig.isNeed = false;
|
|
|
+ formShipmentOption.readonly = true;
|
|
|
+ }
|
|
|
+ formDom1.value.formDataShowLabelOne();
|
|
|
+ formDom2.value.formDataShowLabelOne();
|
|
|
+ });
|
|
|
+ }
|
|
|
+});
|
|
|
+watch(
|
|
|
+ refProps.queryData,
|
|
|
+ () => {
|
|
|
+ console.log(refProps.queryData, "aa");
|
|
|
+ return;
|
|
|
+ if (
|
|
|
+ refProps.queryData.value &&
|
|
|
+ ["10", "20", "30"].includes(route.query.processType)
|
|
|
+ ) {
|
|
|
+ for (const key in refProps.queryData.value) {
|
|
|
+ formData.data[key] = refProps.queryData.value[key];
|
|
|
+ }
|
|
|
+ formDom1.value.formDataShowLabelOne();
|
|
|
+ formDom2.value.formDataListShowLabelOne();
|
|
|
+ formDom6.value.formDataShowLabelOne();
|
|
|
+ if (!formData.data.sellCity) {
|
|
|
+ let sellCity = "";
|
|
|
+ if (formData.data.sellCountryName) {
|
|
|
+ sellCity = formData.data.sellCountryName;
|
|
|
+ }
|
|
|
+ if (formData.data.sellProvinceName) {
|
|
|
+ sellCity = sellCity + " " + formData.data.sellProvinceName;
|
|
|
+ }
|
|
|
+ if (formData.data.sellCityName) {
|
|
|
+ sellCity = sellCity + " " + formData.data.sellCityName;
|
|
|
+ }
|
|
|
+ formData.data.sellCity = sellCity;
|
|
|
+ }
|
|
|
+ if (["10", "20"].includes(route.query.processType)) {
|
|
|
+ formOption.readonly = true;
|
|
|
+ formGoodsOption.readonly = true;
|
|
|
+ formGoodsOption.btnConfig.isNeed = false;
|
|
|
+ formProjectOption.readonly = true;
|
|
|
+ formProjectOption.btnConfig.isNeed = false;
|
|
|
+ formShipmentOption.readonly = true;
|
|
|
+ }
|
|
|
+ handleChangeAmount();
|
|
|
+ if (status.value) {
|
|
|
+ if (!formData.data.countryCityName) {
|
|
|
+ if (formData.data.countryId) {
|
|
|
+ let countryCityName = "";
|
|
|
+ formData.data.countryCity = formData.data.countryId;
|
|
|
+ proxy.post("/customizeArea/list", { parentId: "0" }).then((res) => {
|
|
|
+ let list = res.data.filter(
|
|
|
+ (item) => item.id == formData.data.countryId
|
|
|
+ );
|
|
|
+ if (list && list.length > 0) {
|
|
|
+ countryCityName = list[0].name;
|
|
|
+ formData.data.countryCityName = countryCityName;
|
|
|
+ }
|
|
|
+ if (formData.data.provinceId) {
|
|
|
+ formData.data.countryCity = formData.data.provinceId;
|
|
|
+ proxy
|
|
|
+ .post("/customizeArea/list", {
|
|
|
+ parentId: formData.data.countryId,
|
|
|
+ })
|
|
|
+ .then((res) => {
|
|
|
+ let list = res.data.filter(
|
|
|
+ (item) => item.id == formData.data.provinceId
|
|
|
+ );
|
|
|
+ if (list && list.length > 0) {
|
|
|
+ countryCityName = countryCityName + " " + list[0].name;
|
|
|
+ formData.data.countryCityName = countryCityName;
|
|
|
+ }
|
|
|
+ if (formData.data.cityId) {
|
|
|
+ formData.data.countryCity = formData.data.cityId;
|
|
|
+ proxy
|
|
|
+ .post("/customizeArea/list", {
|
|
|
+ parentId: formData.data.provinceId,
|
|
|
+ })
|
|
|
+ .then((res) => {
|
|
|
+ let list = res.data.filter(
|
|
|
+ (item) => item.id == formData.data.cityId
|
|
|
+ );
|
|
|
+ if (list && list.length > 0) {
|
|
|
+ countryCityName =
|
|
|
+ countryCityName + " " + list[0].name;
|
|
|
+ formData.data.countryCityName = countryCityName;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ status.value = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ deep: true,
|
|
|
+ }
|
|
|
+);
|
|
|
+defineExpose({
|
|
|
+ handleSubmit,
|
|
|
+ tabsChange,
|
|
|
+});
|
|
|
+onMounted(() => {});
|
|
|
+</script>
|
|
|
+<style lang="scss" scoped></style>
|