Contract.vue 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200
  1. <template>
  2. <div class="form">
  3. <van-tabs v-model:active="active">
  4. <van-tab :title="proxy.t('contract.transactionInformation')" />
  5. <van-tab :title="proxy.t('contract.commodityInformation')" />
  6. <van-tab :title="proxy.t('contract.otherCharges')" />
  7. <van-tab :title="proxy.t('contract.deliveryInformation')" />
  8. <van-tab :title="proxy.t('contract.shipmentPlan')" />
  9. <div class="common-process-card" v-show="active == 0">
  10. <div class="common-title">
  11. {{ proxy.t("contract.transactionInformation") }}
  12. </div>
  13. <testForm
  14. v-model="formData.data"
  15. :formOption="formOption"
  16. :formConfig="formConfig"
  17. :rules="rules"
  18. ref="formDom1"
  19. >
  20. </testForm>
  21. </div>
  22. <div class="common-process-card" v-show="active == 1">
  23. <div class="common-title">
  24. {{ proxy.t("contract.commodityInformation") }}
  25. </div>
  26. <testForm
  27. v-model="formData.data"
  28. :formOption="formGoodsOption"
  29. :formConfig="formEmptyConfig"
  30. :rules="rules"
  31. ref="formDom2"
  32. >
  33. </testForm>
  34. <testForm
  35. v-model="formData.data"
  36. :formOption="formOption"
  37. :formConfig="formAmountProductConfig"
  38. :rules="rules"
  39. ref="formDom3"
  40. >
  41. </testForm>
  42. </div>
  43. <div class="common-process-card" v-show="active == 2">
  44. <div class="common-title">{{ proxy.t("contract.otherCharges") }}</div>
  45. <testForm
  46. v-model="formData.data"
  47. :formOption="formProjectOption"
  48. :formConfig="formEmptyConfig"
  49. :rules="rules"
  50. ref="formDom4"
  51. >
  52. </testForm>
  53. <testForm
  54. v-model="formData.data"
  55. :formOption="formOption"
  56. :formConfig="formAmountProjectConfig"
  57. :rules="rules"
  58. ref="formDom5"
  59. >
  60. </testForm>
  61. </div>
  62. <div class="common-process-card" v-show="active == 3">
  63. <div class="common-title">
  64. {{ proxy.t("contract.deliveryInformation") }}
  65. </div>
  66. <testForm
  67. v-model="formData.data"
  68. :formOption="formOption"
  69. :formConfig="formDeliveryConfig"
  70. :rules="rulesTwo"
  71. ref="formDom6"
  72. >
  73. </testForm>
  74. </div>
  75. <div class="common-process-card" v-show="active == 4">
  76. <div class="common-title">{{ proxy.t("contract.shipmentPlan") }}</div>
  77. <testForm
  78. v-model="formData.data"
  79. :formOption="formShipmentOption"
  80. :formConfig="formEmptyConfig"
  81. :rules="rulesTwo"
  82. ref="formDom7"
  83. >
  84. </testForm>
  85. </div>
  86. </van-tabs>
  87. </div>
  88. </template>
  89. <script setup>
  90. import {
  91. ref,
  92. getCurrentInstance,
  93. onMounted,
  94. defineProps,
  95. defineExpose,
  96. watch,
  97. reactive,
  98. toRefs,
  99. } from "vue";
  100. import { useRoute } from "vue-router";
  101. import testForm from "@/components/testForm/index.vue";
  102. import { getUserInfo } from "@/utils/auth";
  103. import { showFailToast } from "vant";
  104. // 接收父组件的传值
  105. const props = defineProps({
  106. queryData: Object,
  107. });
  108. const refProps = toRefs(props);
  109. const proxy = getCurrentInstance().proxy;
  110. const route = useRoute();
  111. const active = ref(0);
  112. const tabsChange = () => {
  113. active.value++;
  114. };
  115. const formData = reactive({
  116. data: {
  117. contractType: "1",
  118. contractProductList: [],
  119. contractProjectList: [],
  120. contractShipmentList: [],
  121. },
  122. });
  123. const formDom1 = ref(null);
  124. const formDom2 = ref(null);
  125. const formDom3 = ref(null);
  126. const formDom4 = ref(null);
  127. const formDom5 = ref(null);
  128. const formDom6 = ref(null);
  129. const formDom7 = ref(null);
  130. const formOption = reactive({
  131. readonly: false,
  132. disabled: false,
  133. labelAlign: "top",
  134. scroll: true,
  135. labelWidth: "62pk",
  136. hiddenSubmitBtn: true,
  137. });
  138. const formConfig = reactive([
  139. {
  140. type: "picker",
  141. label: proxy.t("contract.contractType"),
  142. prop: "contractType",
  143. itemType: "onePicker",
  144. showPicker: false,
  145. fieldNames: {
  146. text: "label",
  147. value: "value",
  148. },
  149. data: [],
  150. },
  151. {
  152. type: "picker",
  153. label: proxy.t("contract.contractTemplateId"),
  154. prop: "contractTemplateId",
  155. itemType: "onePicker",
  156. showPicker: false,
  157. fieldNames: {
  158. text: "label",
  159. value: "value",
  160. },
  161. data: [],
  162. changeFn: (val, data) => {
  163. proxy.formChange(val, data, formData);
  164. formData.data.sellCorporationId = "";
  165. formData.data.sellCountryName = "";
  166. formData.data.sellProvinceName = "";
  167. formData.data.sellCityName = "";
  168. formData.data.sellAddress = "";
  169. formData.data.sellContactName = "";
  170. formData.data.sellContactNumber = "";
  171. if (val.selectedValues[0]) {
  172. proxy
  173. .post("/contractTemplate/detail", { id: val.selectedValues[0] })
  174. .then((res) => {
  175. formData.data.sellCorporationId = res.data.corporationId;
  176. if (res.data.corporationId) {
  177. proxy
  178. .post("/corporation/detail", { id: res.data.corporationId })
  179. .then((detailCorporation) => {
  180. let sellCity = "";
  181. if (detailCorporation.data.countryEnStr) {
  182. formData.data.sellCountryName =
  183. detailCorporation.data.countryEnStr;
  184. sellCity = detailCorporation.data.countryEnStr;
  185. }
  186. if (detailCorporation.data.provinceEnStr) {
  187. formData.data.sellProvinceName =
  188. detailCorporation.data.provinceEnStr;
  189. sellCity =
  190. sellCity + " " + detailCorporation.data.provinceEnStr;
  191. }
  192. if (detailCorporation.data.cityEnStr) {
  193. formData.data.sellCityName =
  194. detailCorporation.data.cityEnStr;
  195. sellCity =
  196. sellCity + " " + detailCorporation.data.cityEnStr;
  197. }
  198. if (detailCorporation.data.addressEn) {
  199. formData.data.sellAddress =
  200. detailCorporation.data.addressEn;
  201. }
  202. formData.data.sellCity = sellCity;
  203. formDom1.value.formDataShowLabelOne();
  204. });
  205. }
  206. formData.data.sellContactName = res.data.contactName;
  207. formData.data.sellContactNumber = res.data.contactNumber;
  208. formDom1.value.formDataShowLabelOne();
  209. });
  210. }
  211. data.showPicker = false;
  212. },
  213. },
  214. {
  215. type: "title",
  216. title: proxy.t("contract.sellerInformation"),
  217. },
  218. {
  219. type: "picker",
  220. label: proxy.t("contract.sellCorporationId"),
  221. prop: "sellCorporationId",
  222. itemType: "onePicker",
  223. showPicker: false,
  224. fieldNames: {
  225. text: "label",
  226. value: "value",
  227. },
  228. data: [],
  229. readonly: true,
  230. },
  231. {
  232. type: "input",
  233. label: proxy.t("contract.cityText"),
  234. prop: "sellCity",
  235. itemType: "text",
  236. readonly: true,
  237. },
  238. {
  239. type: "input",
  240. label: proxy.t("contract.address"),
  241. prop: "sellAddress",
  242. itemType: "textarea",
  243. },
  244. {
  245. type: "input",
  246. label: proxy.t("contract.contactName"),
  247. prop: "sellContactName",
  248. itemType: "text",
  249. },
  250. {
  251. type: "input",
  252. label: proxy.t("contract.contactNumber"),
  253. prop: "sellContactNumber",
  254. itemType: "text",
  255. },
  256. {
  257. type: "title",
  258. title: proxy.t("contract.buyerInformation"),
  259. },
  260. {
  261. type: "picker",
  262. label: proxy.t("contract.buyCorporationId"),
  263. prop: "buyCorporationId",
  264. itemType: "onePicker",
  265. showPicker: false,
  266. fieldNames: {
  267. text: "label",
  268. value: "value",
  269. },
  270. data: [],
  271. changeFn: (val, data) => {
  272. proxy.formChange(val, data, formData);
  273. formData.data.buyContactName = "";
  274. formData.data.buyContactNumber = "";
  275. if (val.selectedValues[0]) {
  276. proxy
  277. .post("/customer/detail", { id: val.selectedValues[0] })
  278. .then((res) => {
  279. if (
  280. res.data.customerUserList &&
  281. res.data.customerUserList.length > 0
  282. ) {
  283. formData.data.buyContactName = res.data.customerUserList[0].name;
  284. if (res.data.customerUserList[0].contactJson) {
  285. let contactJson = JSON.parse(
  286. res.data.customerUserList[0].contactJson
  287. );
  288. if (contactJson && contactJson.length > 0) {
  289. formData.data.buyContactNumber = contactJson[0].contactNo;
  290. }
  291. }
  292. }
  293. let countryCityName = "";
  294. if (res.data.countryName) {
  295. countryCityName = res.data.countryName;
  296. if (res.data.provinceName) {
  297. countryCityName = countryCityName + " " + res.data.provinceName;
  298. if (res.data.cityName) {
  299. countryCityName = countryCityName + " " + res.data.cityName;
  300. }
  301. }
  302. }
  303. formData.data.countryCityName = countryCityName;
  304. if (res.data.cityId) {
  305. formData.data.countryCity = res.data.cityId;
  306. } else if (res.data.provinceId) {
  307. formData.data.countryCity = res.data.provinceId;
  308. } else if (res.data.countryId) {
  309. formData.data.countryCity = res.data.countryId;
  310. } else {
  311. formData.data.countryCity = "";
  312. }
  313. formData.data.countryId = res.data.countryId;
  314. formData.data.provinceId = res.data.provinceId;
  315. formData.data.cityId = res.data.cityId;
  316. formData.data.buyPostalCode = res.data.zipCode;
  317. formData.data.buyAddress = res.data.address;
  318. });
  319. } else {
  320. formData.data.countryId = "";
  321. formData.data.provinceId = "";
  322. formData.data.cityId = "";
  323. formData.data.buyPostalCode = "";
  324. formData.data.buyAddress = "";
  325. }
  326. data.showPicker = false;
  327. },
  328. },
  329. {
  330. type: "cascader",
  331. label: proxy.t("contract.cityText"),
  332. prop: "countryCity",
  333. itemType: "city",
  334. showPicker: false,
  335. },
  336. {
  337. type: "input",
  338. label: proxy.t("contract.address"),
  339. prop: "buyAddress",
  340. itemType: "textarea",
  341. },
  342. {
  343. type: "input",
  344. label: proxy.t("contract.postalCode"),
  345. prop: "buyPostalCode",
  346. itemType: "text",
  347. },
  348. {
  349. type: "input",
  350. label: proxy.t("contract.contactName"),
  351. prop: "buyContactName",
  352. itemType: "text",
  353. },
  354. {
  355. type: "input",
  356. label: proxy.t("contract.contactNumber"),
  357. prop: "buyContactNumber",
  358. itemType: "text",
  359. },
  360. ]);
  361. const formGoodsOption = reactive({
  362. readonly: false,
  363. disabled: false,
  364. labelAlign: "top",
  365. scroll: true,
  366. labelWidth: "62pk",
  367. hiddenSubmitBtn: true,
  368. btnConfig: {
  369. isNeed: true,
  370. prop: "contractProductList",
  371. plain: true,
  372. listTitle: proxy.t("contract.commodityInformation"),
  373. listConfig: [
  374. {
  375. type: "picker",
  376. label: proxy.t("contract.productId"),
  377. prop: "productId",
  378. itemType: "onePicker",
  379. showPicker: false,
  380. readonly: false,
  381. fieldNames: {
  382. text: "label",
  383. value: "value",
  384. },
  385. data: [],
  386. changeFn: (val, data, index, indexTwo, propName) => {
  387. let selectList = formData.data[propName].filter(
  388. (item, itemIndex) =>
  389. item[data.prop] === val.selectedValues[0] && itemIndex !== index
  390. );
  391. if (selectList && selectList.length > 0) {
  392. return showFailToast(proxy.t("contract.productRepeat"));
  393. }
  394. formData.data[propName][index][data.prop] = val.selectedValues[0];
  395. formData.data.contractShipmentList[index][data.prop] =
  396. val.selectedValues[0];
  397. let list = data.data.filter(
  398. (item) => item[data.fieldNames.value] == val.selectedValues[0]
  399. );
  400. if (list && list.length > 0) {
  401. formData.data[propName][index][data.prop + "Name"] =
  402. list[0][data.fieldNames.text];
  403. let name = list[0].name;
  404. if (list[0].standardJson) {
  405. let standardJson = JSON.parse(list[0].standardJson);
  406. if (standardJson && standardJson.englishName) {
  407. name = standardJson.englishName;
  408. }
  409. }
  410. formData.data[propName][index].productName = name;
  411. formData.data[propName][index].productModel = list[0].spec;
  412. formData.data.contractShipmentList[index].productName = name;
  413. } else {
  414. formData.data[propName][index][data.prop + "Name"] = "";
  415. }
  416. formData.data[propName][index].quantity = null;
  417. formData.data[propName][index].price = null;
  418. formData.data[propName][index].amount = null;
  419. formData.data[propName][index].remark = null;
  420. formData.data.contractShipmentList[index].shipmentTime = null;
  421. formData.data.contractShipmentList[index].quantity = null;
  422. formData.data.contractShipmentList[index].remark = null;
  423. data.showPicker = false;
  424. },
  425. },
  426. {
  427. type: "input",
  428. label: proxy.t("contract.productName"),
  429. prop: "productName",
  430. itemType: "text",
  431. },
  432. {
  433. type: "input",
  434. label: proxy.t("contract.productModel"),
  435. prop: "productModel",
  436. itemType: "text",
  437. },
  438. {
  439. type: "input",
  440. label: proxy.t("contract.quantity"),
  441. prop: "quantity",
  442. itemType: "number",
  443. changeFn: () => {
  444. calculatedAmount();
  445. },
  446. },
  447. {
  448. type: "input",
  449. label: proxy.t("contract.price"),
  450. prop: "price",
  451. itemType: "number",
  452. changeFn: () => {
  453. calculatedAmount();
  454. },
  455. },
  456. ],
  457. clickFn: () => {
  458. if (
  459. formData.data.contractProductList &&
  460. formData.data.contractProductList.length > 0
  461. ) {
  462. formData.data.contractProductList.push({
  463. productId: null,
  464. productName: null,
  465. productModel: null,
  466. quantity: null,
  467. price: null,
  468. amount: null,
  469. remark: null,
  470. });
  471. formData.data.contractShipmentList.push({
  472. productId: null,
  473. productName: null,
  474. shipmentTime: null,
  475. quantity: null,
  476. remark: null,
  477. });
  478. } else {
  479. formData.data.contractProductList = [
  480. {
  481. productId: null,
  482. productName: null,
  483. productModel: null,
  484. quantity: null,
  485. price: null,
  486. amount: null,
  487. remark: null,
  488. },
  489. ];
  490. formData.data.contractShipmentList = [
  491. {
  492. productId: null,
  493. productName: null,
  494. shipmentTime: null,
  495. quantity: null,
  496. remark: null,
  497. },
  498. ];
  499. }
  500. },
  501. deleteFn: (index) => {
  502. formData.data.contractProductList.splice(index, 1);
  503. formData.data.contractShipmentList.splice(index, 1);
  504. handleChangeAmount();
  505. },
  506. },
  507. });
  508. const formEmptyConfig = reactive([]);
  509. const formAmountProductConfig = reactive([
  510. {
  511. type: "input",
  512. label: proxy.t("contract.amountProduct"),
  513. prop: "amountProduct",
  514. itemType: "text",
  515. readonly: true,
  516. placeholder: proxy.t("contract.amountProductPlaceholder"),
  517. },
  518. ]);
  519. const formAmountProjectConfig = reactive([
  520. {
  521. type: "input",
  522. label: proxy.t("contract.amountProject"),
  523. prop: "amountProject",
  524. itemType: "text",
  525. readonly: true,
  526. placeholder: proxy.t("contract.amountProjectPlaceholder"),
  527. },
  528. ]);
  529. const formProjectOption = reactive({
  530. readonly: false,
  531. disabled: false,
  532. labelAlign: "top",
  533. scroll: true,
  534. labelWidth: "62pk",
  535. hiddenSubmitBtn: true,
  536. btnConfig: {
  537. isNeed: true,
  538. prop: "contractProjectList",
  539. plain: true,
  540. listTitle: proxy.t("contract.chargeItem"),
  541. listConfig: [
  542. {
  543. type: "input",
  544. label: proxy.t("contract.chargeItem"),
  545. prop: "payName",
  546. itemType: "text",
  547. },
  548. {
  549. type: "input",
  550. label: proxy.t("contract.amount"),
  551. prop: "amount",
  552. itemType: "number",
  553. changeFn: () => {
  554. handleChangeAmount();
  555. },
  556. },
  557. {
  558. type: "input",
  559. label: proxy.t("contract.remark"),
  560. prop: "remark",
  561. itemType: "textarea",
  562. },
  563. ],
  564. clickFn: () => {
  565. if (
  566. formData.data.contractProjectList &&
  567. formData.data.contractProjectList.length > 0
  568. ) {
  569. formData.data.contractProjectList.push({
  570. payName: null,
  571. amount: null,
  572. remark: null,
  573. });
  574. } else {
  575. formData.data.contractProjectList = [
  576. {
  577. payName: null,
  578. amount: null,
  579. remark: null,
  580. },
  581. ];
  582. }
  583. },
  584. deleteFn: (index) => {
  585. formData.data.contractProjectList.splice(index, 1);
  586. handleChangeAmount();
  587. },
  588. },
  589. });
  590. const formDeliveryConfig = reactive([
  591. {
  592. type: "title",
  593. title: proxy.t("contract.collectionInformation"),
  594. },
  595. {
  596. type: "picker",
  597. label: proxy.t("contract.currency"),
  598. prop: "currency",
  599. itemType: "onePicker",
  600. showPicker: false,
  601. fieldNames: {
  602. text: "label",
  603. value: "value",
  604. },
  605. data: [],
  606. },
  607. {
  608. type: "input",
  609. label: proxy.t("contract.amountAll"),
  610. prop: "amount",
  611. itemType: "text",
  612. readonly: true,
  613. placeholder: proxy.t("contract.amountAllPlaceholder"),
  614. },
  615. {
  616. type: "picker",
  617. label: proxy.t("contract.paymentMethod"),
  618. prop: "paymentMethod",
  619. itemType: "onePicker",
  620. showPicker: false,
  621. fieldNames: {
  622. text: "label",
  623. value: "value",
  624. },
  625. data: [],
  626. },
  627. {
  628. type: "input",
  629. label: proxy.t("contract.advanceRatio"),
  630. prop: "advanceRatio",
  631. itemType: "number",
  632. inputFn: (val) => {
  633. if (val) {
  634. if (val > 100) {
  635. formData.data.advanceRatio = 100;
  636. } else if (val < 0) {
  637. formData.data.advanceRatio = 0;
  638. }
  639. }
  640. },
  641. },
  642. {
  643. type: "picker",
  644. label: proxy.t("contract.shroffAccountId"),
  645. prop: "shroffAccountId",
  646. itemType: "onePicker",
  647. showPicker: false,
  648. fieldNames: {
  649. text: "label",
  650. value: "value",
  651. },
  652. data: [],
  653. },
  654. {
  655. type: "title",
  656. title: proxy.t("contract.deliveryInformation"),
  657. },
  658. {
  659. type: "picker",
  660. label: proxy.t("contract.tradeMethods"),
  661. prop: "tradeMethods",
  662. itemType: "onePicker",
  663. showPicker: false,
  664. fieldNames: {
  665. text: "label",
  666. value: "value",
  667. },
  668. data: [],
  669. },
  670. {
  671. type: "picker",
  672. label: proxy.t("contract.transportMethod"),
  673. prop: "transportMethod",
  674. itemType: "onePicker",
  675. showPicker: false,
  676. fieldNames: {
  677. text: "label",
  678. value: "value",
  679. },
  680. data: [],
  681. },
  682. {
  683. type: "input",
  684. label: proxy.t("contract.transportRemark"),
  685. prop: "transportRemark",
  686. itemType: "text",
  687. },
  688. {
  689. type: "input",
  690. label: proxy.t("contract.remarks"),
  691. prop: "remark",
  692. itemType: "textarea",
  693. },
  694. {
  695. type: "input",
  696. label: proxy.t("contract.warranty"),
  697. prop: "warranty",
  698. itemType: "digit",
  699. },
  700. {
  701. type: "input",
  702. label: proxy.t("contract.deliveryTime"),
  703. prop: "deliveryTime",
  704. itemType: "digit",
  705. },
  706. ]);
  707. const formShipmentOption = reactive({
  708. readonly: false,
  709. disabled: false,
  710. labelAlign: "top",
  711. scroll: true,
  712. labelWidth: "62pk",
  713. hiddenSubmitBtn: true,
  714. btnConfig: {
  715. isNeed: false,
  716. prop: "contractShipmentList",
  717. plain: true,
  718. listTitle: proxy.t("contract.commodity"),
  719. listConfig: [
  720. {
  721. type: "input",
  722. label: proxy.t("contract.productName"),
  723. prop: "productName",
  724. itemType: "text",
  725. readonly: true,
  726. placeholder: proxy.t("contract.productNamePlaceholder"),
  727. },
  728. {
  729. type: "picker",
  730. label: proxy.t("contract.shipmentTime"),
  731. prop: "shipmentTime",
  732. itemType: "datePicker",
  733. showPicker: false,
  734. split: "-",
  735. columnsType: ["year", "month", "day"],
  736. },
  737. {
  738. type: "input",
  739. label: proxy.t("contract.quantityShipment"),
  740. prop: "quantity",
  741. itemType: "number",
  742. },
  743. ],
  744. },
  745. });
  746. const rules = {
  747. contractType: [
  748. { required: true, message: proxy.t("contract.contractTypeMsg") },
  749. ],
  750. contractTemplateId: [
  751. { required: true, message: proxy.t("contract.contractTemplateIdMsg") },
  752. ],
  753. sellCorporationId: [
  754. { required: true, message: proxy.t("contract.sellCorporationIdMsg") },
  755. ],
  756. buyCorporationId: [
  757. { required: true, message: proxy.t("contract.buyCorporationIdMsg") },
  758. ],
  759. sellCity: [{ required: true, message: proxy.t("contract.cityMsg") }],
  760. countryCity: [{ required: true, message: proxy.t("contract.cityMsg") }],
  761. sellAddress: [{ required: true, message: proxy.t("contract.addressMsg") }],
  762. buyAddress: [{ required: true, message: proxy.t("contract.addressMsg") }],
  763. sellContactName: [
  764. { required: true, message: proxy.t("contract.contactNameMsg") },
  765. ],
  766. sellContactNumber: [
  767. { required: true, message: proxy.t("contract.contactNumberMsg") },
  768. ],
  769. // buyPostalCode: [{ required: true, message: proxy.t("contract.postalCodeMsg") }],
  770. buyContactName: [
  771. { required: true, message: proxy.t("contract.contactNameMsg") },
  772. ],
  773. buyContactNumber: [
  774. { required: true, message: proxy.t("contract.contactNumberMsg") },
  775. ],
  776. productId: [{ required: true, message: proxy.t("contract.productIdMsg") }],
  777. productName: [
  778. { required: true, message: proxy.t("contract.productNameMsg") },
  779. ],
  780. productModel: [
  781. { required: true, message: proxy.t("contract.productModelMsg") },
  782. ],
  783. quantity: [{ required: true, message: proxy.t("contract.quantityMsg") }],
  784. price: [{ required: true, message: proxy.t("contract.priceMsg") }],
  785. payName: [{ required: true, message: proxy.t("contract.chargeItemMsg") }],
  786. amount: [{ required: true, message: proxy.t("contract.amountMsg") }],
  787. };
  788. const rulesTwo = {
  789. currency: [{ required: true, message: proxy.t("contract.currencyMsg") }],
  790. paymentMethod: [
  791. { required: true, message: proxy.t("contract.paymentMethodMsg") },
  792. ],
  793. advanceRatio: [
  794. { required: true, message: proxy.t("contract.advanceRatioMsg") },
  795. ],
  796. shroffAccountId: [
  797. { required: true, message: proxy.t("contract.shroffAccountIdMsg") },
  798. ],
  799. tradeMethods: [
  800. { required: true, message: proxy.t("contract.tradeMethodsMsg") },
  801. ],
  802. transportMethod: [
  803. { required: true, message: proxy.t("contract.transportMethodMsg") },
  804. ],
  805. transportRemark: [
  806. { required: true, message: proxy.t("contract.transportRemarkMsg") },
  807. ],
  808. remark: [{ required: true, message: proxy.t("contract.remarksMsg") }],
  809. };
  810. const getDict = () => {
  811. let query = {
  812. pageNum: 1,
  813. pageSize: 999,
  814. tenantId: getUserInfo().tenantId,
  815. };
  816. proxy
  817. .post("/dictTenantData/page", { ...query, dictCode: "contract_type" })
  818. .then((res) => {
  819. if (res.data.rows && res.data.rows.length > 0) {
  820. formConfig[0].data = res.data.rows.map((item) => {
  821. return {
  822. label: item.dictValue,
  823. value: item.dictKey,
  824. };
  825. });
  826. }
  827. });
  828. proxy
  829. .post("/contractTemplate/page", { pageNum: 1, pageSize: 999 })
  830. .then((res) => {
  831. if (res.data.rows && res.data.rows.length > 0) {
  832. formConfig[1].data = res.data.rows.map((item) => {
  833. return {
  834. ...item,
  835. label: item.templateName,
  836. value: item.id,
  837. };
  838. });
  839. }
  840. });
  841. proxy.post("/corporation/page", { pageNum: 1, pageSize: 999 }).then((res) => {
  842. if (res.data.rows && res.data.rows.length > 0) {
  843. formConfig[3].data = res.data.rows.map((item) => {
  844. return {
  845. ...item,
  846. label: item.name,
  847. value: item.id,
  848. };
  849. });
  850. }
  851. });
  852. if (!["10", "20"].includes(route.query.processType)) {
  853. proxy
  854. .post("/productInfo/page", {
  855. pageNum: 1,
  856. pageSize: 99999,
  857. definition: "1",
  858. })
  859. .then((res) => {
  860. if (res.data.rows && res.data.rows.length > 0) {
  861. formGoodsOption.btnConfig.listConfig[0].data = res.data.rows.map(
  862. (item) => {
  863. return {
  864. ...item,
  865. label: item.name,
  866. value: item.id,
  867. };
  868. }
  869. );
  870. }
  871. });
  872. }
  873. proxy
  874. .post("/dictTenantData/page", { ...query, dictCode: "account_currency" })
  875. .then((res) => {
  876. if (res.data.rows && res.data.rows.length > 0) {
  877. formDeliveryConfig[1].data = res.data.rows.map((item) => {
  878. return {
  879. label: item.dictValue,
  880. value: item.dictKey,
  881. };
  882. });
  883. }
  884. });
  885. proxy
  886. .post("/dictTenantData/page", {
  887. ...query,
  888. dictCode: "funds_payment_method",
  889. })
  890. .then((res) => {
  891. if (res.data.rows && res.data.rows.length > 0) {
  892. formDeliveryConfig[3].data = res.data.rows.map((item) => {
  893. return {
  894. label: item.dictValue,
  895. value: item.dictKey,
  896. };
  897. });
  898. }
  899. });
  900. proxy
  901. .post("/accountManagement/page", { pageNum: 1, pageSize: 999 })
  902. .then((res) => {
  903. if (res.data.rows && res.data.rows.length > 0) {
  904. formDeliveryConfig[5].data = res.data.rows.map((item) => {
  905. return {
  906. ...item,
  907. label: item.alias,
  908. value: item.id,
  909. };
  910. });
  911. }
  912. });
  913. proxy
  914. .post("/dictTenantData/page", { ...query, dictCode: "trade_mode" })
  915. .then((res) => {
  916. if (res.data.rows && res.data.rows.length > 0) {
  917. formDeliveryConfig[7].data = res.data.rows.map((item) => {
  918. return {
  919. label: item.dictValue,
  920. value: item.dictKey,
  921. };
  922. });
  923. }
  924. });
  925. proxy
  926. .post("/dictTenantData/page", { ...query, dictCode: "shipping_method" })
  927. .then((res) => {
  928. if (res.data.rows && res.data.rows.length > 0) {
  929. formDeliveryConfig[8].data = res.data.rows.map((item) => {
  930. return {
  931. label: item.dictValue,
  932. value: item.dictKey,
  933. };
  934. });
  935. }
  936. });
  937. if (["10", "20"].includes(route.query.processType)) {
  938. proxy.post("/customer/page", { pageNum: 1, pageSize: 999 }).then((res) => {
  939. if (res.data.rows && res.data.rows.length > 0) {
  940. formConfig[9].data = res.data.rows.map((item) => {
  941. return {
  942. ...item,
  943. label: item.name,
  944. value: item.id,
  945. };
  946. });
  947. }
  948. });
  949. } else {
  950. proxy
  951. .post("/customer/privateSeaPage", { pageNum: 1, pageSize: 999 })
  952. .then((res) => {
  953. if (res.data.rows && res.data.rows.length > 0) {
  954. formConfig[9].data = res.data.rows.map((item) => {
  955. return {
  956. ...item,
  957. label: item.name,
  958. value: item.id,
  959. };
  960. });
  961. }
  962. });
  963. }
  964. };
  965. getDict();
  966. const calculatedAmount = () => {
  967. if (
  968. formData.data.contractProductList &&
  969. formData.data.contractProductList.length > 0
  970. ) {
  971. for (let i = 0; i < formData.data.contractProductList.length; i++) {
  972. let money = 0;
  973. if (
  974. formData.data.contractProductList[i].quantity &&
  975. formData.data.contractProductList[i].price
  976. ) {
  977. money = Number(
  978. Math.round(
  979. Number(formData.data.contractProductList[i].quantity) *
  980. Number(formData.data.contractProductList[i].price) *
  981. 10000
  982. ) / 10000
  983. );
  984. }
  985. formData.data.contractProductList[i].amount = money;
  986. }
  987. }
  988. handleChangeAmount();
  989. };
  990. const handleChangeAmount = () => {
  991. let money = 0;
  992. let amountProduct = 0;
  993. let amountProject = 0;
  994. if (
  995. formData.data.contractProductList &&
  996. formData.data.contractProductList.length > 0
  997. ) {
  998. for (let i = 0; i < formData.data.contractProductList.length; i++) {
  999. if (formData.data.contractProductList[i].amount) {
  1000. money = Number(
  1001. Math.round(
  1002. (Number(money) +
  1003. Number(formData.data.contractProductList[i].amount)) *
  1004. 10000
  1005. ) / 10000
  1006. );
  1007. amountProduct = Number(
  1008. Math.round(
  1009. (Number(amountProduct) +
  1010. Number(formData.data.contractProductList[i].amount)) *
  1011. 10000
  1012. ) / 10000
  1013. );
  1014. }
  1015. }
  1016. }
  1017. if (
  1018. formData.data.contractProjectList &&
  1019. formData.data.contractProjectList.length > 0
  1020. ) {
  1021. for (let i = 0; i < formData.data.contractProjectList.length; i++) {
  1022. if (formData.data.contractProjectList[i].amount) {
  1023. money = Number(
  1024. Math.round(
  1025. (Number(money) +
  1026. Number(formData.data.contractProjectList[i].amount)) *
  1027. 10000
  1028. ) / 10000
  1029. );
  1030. amountProject = Number(
  1031. Math.round(
  1032. (Number(amountProject) +
  1033. Number(formData.data.contractProjectList[i].amount)) *
  1034. 10000
  1035. ) / 10000
  1036. );
  1037. }
  1038. }
  1039. }
  1040. formData.data.amount = money;
  1041. formData.data.amountProduct = amountProduct;
  1042. formData.data.amountProject = amountProject;
  1043. };
  1044. const handleSubmit = async () => {
  1045. const flag = await formDom1.value.validateForm().then((status) => {
  1046. if (status) {
  1047. active.value = 0;
  1048. return false;
  1049. } else {
  1050. if (
  1051. !(
  1052. formData.data.contractProductList &&
  1053. formData.data.contractProductList.length > 0
  1054. )
  1055. ) {
  1056. active.value = 1;
  1057. showFailToast(proxy.t("contract.pleaseAddProduct"));
  1058. return false;
  1059. }
  1060. return formDom2.value.validateForm().then((status1) => {
  1061. if (status1) {
  1062. active.value = 1;
  1063. return false;
  1064. } else {
  1065. return formDom4.value.validateForm().then((status2) => {
  1066. if (status2) {
  1067. active.value = 2;
  1068. return false;
  1069. } else {
  1070. return formDom6.value.validateForm().then((status3) => {
  1071. if (status3) {
  1072. active.value = 3;
  1073. return false;
  1074. } else {
  1075. return true;
  1076. }
  1077. });
  1078. }
  1079. });
  1080. }
  1081. });
  1082. }
  1083. });
  1084. if (flag) {
  1085. return formData.data;
  1086. }
  1087. };
  1088. let status = ref(true);
  1089. watch(
  1090. refProps.queryData,
  1091. () => {
  1092. if (
  1093. refProps.queryData.value &&
  1094. ["10", "20", "30"].includes(route.query.processType)
  1095. ) {
  1096. for (const key in refProps.queryData.value) {
  1097. formData.data[key] = refProps.queryData.value[key];
  1098. }
  1099. if (["10", "20"].includes(route.query.processType)) {
  1100. formGoodsOption.btnConfig.listConfig[0].data =
  1101. formData.data.contractProductList.map((item) => {
  1102. return {
  1103. ...item,
  1104. label: item.name,
  1105. value: item.productId,
  1106. };
  1107. });
  1108. }
  1109. formDom1.value.formDataShowLabelOne();
  1110. formDom2.value.formDataListShowLabelOne();
  1111. formDom6.value.formDataShowLabelOne();
  1112. if (!formData.data.sellCity) {
  1113. let sellCity = "";
  1114. if (formData.data.sellCountryName) {
  1115. sellCity = formData.data.sellCountryName;
  1116. }
  1117. if (formData.data.sellProvinceName) {
  1118. sellCity = sellCity + " " + formData.data.sellProvinceName;
  1119. }
  1120. if (formData.data.sellCityName) {
  1121. sellCity = sellCity + " " + formData.data.sellCityName;
  1122. }
  1123. formData.data.sellCity = sellCity;
  1124. }
  1125. if (["10", "20"].includes(route.query.processType)) {
  1126. formOption.readonly = true;
  1127. formGoodsOption.readonly = true;
  1128. formGoodsOption.btnConfig.isNeed = false;
  1129. formProjectOption.readonly = true;
  1130. formProjectOption.btnConfig.isNeed = false;
  1131. formShipmentOption.readonly = true;
  1132. }
  1133. handleChangeAmount();
  1134. if (status.value) {
  1135. if (!formData.data.countryCityName) {
  1136. if (formData.data.countryId) {
  1137. let countryCityName = "";
  1138. formData.data.countryCity = formData.data.countryId;
  1139. proxy.post("/customizeArea/list", { parentId: "0" }).then((res) => {
  1140. let list = res.data.filter(
  1141. (item) => item.id == formData.data.countryId
  1142. );
  1143. if (list && list.length > 0) {
  1144. countryCityName = list[0].name;
  1145. formData.data.countryCityName = countryCityName;
  1146. }
  1147. if (formData.data.provinceId) {
  1148. formData.data.countryCity = formData.data.provinceId;
  1149. proxy
  1150. .post("/customizeArea/list", {
  1151. parentId: formData.data.countryId,
  1152. })
  1153. .then((res) => {
  1154. let list = res.data.filter(
  1155. (item) => item.id == formData.data.provinceId
  1156. );
  1157. if (list && list.length > 0) {
  1158. countryCityName = countryCityName + " " + list[0].name;
  1159. formData.data.countryCityName = countryCityName;
  1160. }
  1161. if (formData.data.cityId) {
  1162. formData.data.countryCity = formData.data.cityId;
  1163. proxy
  1164. .post("/customizeArea/list", {
  1165. parentId: formData.data.provinceId,
  1166. })
  1167. .then((res) => {
  1168. let list = res.data.filter(
  1169. (item) => item.id == formData.data.cityId
  1170. );
  1171. if (list && list.length > 0) {
  1172. countryCityName =
  1173. countryCityName + " " + list[0].name;
  1174. formData.data.countryCityName = countryCityName;
  1175. }
  1176. });
  1177. }
  1178. });
  1179. }
  1180. });
  1181. }
  1182. }
  1183. status.value = false;
  1184. }
  1185. }
  1186. },
  1187. {
  1188. deep: true,
  1189. }
  1190. );
  1191. defineExpose({
  1192. handleSubmit,
  1193. tabsChange,
  1194. });
  1195. onMounted(() => {});
  1196. </script>
  1197. <style lang="scss" scoped></style>