PurchaseQuotationFormForm.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732
  1. <template>
  2. <a-spin :spinning="loading">
  3. <JFormContainer :disabled="disabled">
  4. <template #detail>
  5. <a-form v-bind="formItemLayout" name="PuechaseQuotationFormForm" ref="formRef">
  6. <a-row>
  7. <a-col :span="12">
  8. <a-form-item label="报价单号(bill code)" v-bind="validateInfos.billCode" id="PuechaseQuotationFormForm-billCode" name="billCode">
  9. <a-input v-model:value="formData.billCode" placeholder="自动生成" disabled />
  10. </a-form-item>
  11. </a-col>
  12. <a-col :span="12">
  13. <a-form-item label="单据日期(bill date)" v-bind="validateInfos.billDate" id="PuechaseQuotationFormForm-billDate" name="billDate">
  14. <a-date-picker
  15. placeholder="请选择单据日期(bill date)"
  16. v-model:value="formData.billDate"
  17. value-format="YYYY-MM-DD"
  18. style="width: 100%"
  19. allow-clear
  20. />
  21. </a-form-item>
  22. </a-col>
  23. <a-col :span="12">
  24. <a-form-item
  25. label="报价项目(quotation project)"
  26. v-bind="validateInfos.projectName"
  27. id="PuechaseQuotationFormForm-projectName"
  28. name="projectName"
  29. >
  30. <a-input-search
  31. v-model:value="formData.projectName"
  32. placeholder="请输入报价项目(quotation project)"
  33. readonly
  34. :disabled="notAllowEdit"
  35. allow-clear
  36. enter-button="Search"
  37. @search="onSearchProject"
  38. />
  39. </a-form-item>
  40. </a-col>
  41. <a-col :span="12">
  42. <a-form-item
  43. label="报价供应商(quotation supplier)"
  44. v-bind="validateInfos.quotationSuppiler"
  45. id="PuechaseQuotationFormForm-quotationSuppiler"
  46. name="quotationSuppiler"
  47. >
  48. <JSelect v-model:value="formData.quotationSuppiler" :get-option-url="supplierOption" :showField="showField" @change="changeSupplier" :param="{status:1}"></JSelect>
  49. </a-form-item>
  50. </a-col>
  51. <a-col :span="12">
  52. <a-form-item
  53. label="报价截至日期(quotation deadline)"
  54. v-bind="validateInfos.quotationDeadline"
  55. id="PuechaseQuotationFormForm-quotationDeadline"
  56. name="quotationDeadline"
  57. >
  58. <a-date-picker
  59. placeholder="请选择"
  60. v-model:value="formData.quotationDeadline"
  61. value-format="YYYY-MM-DD"
  62. format="YYYY-MM-DD"
  63. style="width: 100%"
  64. allow-clear
  65. />
  66. </a-form-item>
  67. </a-col>
  68. <a-col :span="12">
  69. <a-form-item label="优先级(priority)" v-bind="validateInfos.priority" id="PuechaseQuotationFormForm-priority" name="priority">
  70. <JDictSelectTag v-model:value="formData.priority" placeholder="请选择" dictCode="priority" />
  71. </a-form-item>
  72. </a-col>
  73. <a-col :span="12">
  74. <a-form-item
  75. label="产品分类(production class)"
  76. v-bind="validateInfos.productionClass"
  77. id="PuechaseQuotationFormForm-productionClass"
  78. name="productionClass"
  79. >
  80. <ApiSelect
  81. :api="ClassList"
  82. showSearch
  83. v-model:value="formData.productionClass"
  84. optionFilterProp="label"
  85. resultField="records"
  86. labelField="name"
  87. valueField="id"
  88. disabled
  89. />
  90. </a-form-item>
  91. </a-col>
  92. <a-col :span="12">
  93. <a-form-item label="机型(model)" v-bind="validateInfos.model" id="PuechaseQuotationFormForm-model" name="model">
  94. <JDictSelectTag v-model:value="formData.model" placeholder="请选择" dictCode="model_typer" disabled />
  95. </a-form-item>
  96. </a-col>
  97. <a-col :span="12">
  98. <a-form-item label="厂家(maker)" v-bind="validateInfos.maker" id="PuechaseQuotationFormForm-maker" name="maker">
  99. <a-input v-model:value="formData.maker" placeholder="请输入厂家(maker)" allow-clear disabled />
  100. </a-form-item>
  101. </a-col>
  102. <a-col :span="12">
  103. <a-form-item
  104. label="发货地址(place of delivery)"
  105. v-bind="validateInfos.placeDelivery"
  106. id="PuechaseQuotationFormForm-placeDelivery"
  107. name="placeDelivery"
  108. >
  109. <a-input v-model:value="formData.placeDelivery" placeholder="" allow-clear />
  110. </a-form-item>
  111. </a-col>
  112. <a-col :span="12">
  113. <a-form-item
  114. label="付款条件(payment terms)"
  115. v-bind="validateInfos.paymentTerms"
  116. id="PuechaseQuotationFormForm-paymentTerms"
  117. name="paymentTerms"
  118. :labelCol="formItemLayout.labelCol1"
  119. :wrapperCol="formItemLayout.wrapperCol1"
  120. >
  121. <JDictSelectTag
  122. v-model:value="formData.paymentTerms"
  123. placeholder="请选择"
  124. dictCode="payment_terms"
  125. style="width: 49%; margin-right: 1%"
  126. />
  127. <a-input v-model:value="formData.paymentTermsInfo" placeholder="" allow-clear style="width: 49%" AutoComplete="off" />
  128. </a-form-item>
  129. </a-col>
  130. <a-col :span="12">
  131. <a-form-item label="发货方式(delivery)" v-bind="validateInfos.delivery" id="PuechaseQuotationFormForm-delivery" name="delivery">
  132. <JDictSelectTag v-model:value="formData.delivery" placeholder="请选择" dictCode="delivery_methods" />
  133. </a-form-item>
  134. </a-col>
  135. <a-col :span="12">
  136. <a-form-item
  137. label="交期(delivery day)"
  138. v-bind="validateInfos.deliveryDayHead"
  139. id="PuechaseQuotationFormForm-deliveryDayHead"
  140. name="deliveryDayHead"
  141. >
  142. <a-input-number v-model:value="formData.deliveryDayHead" placeholder="请输入" style="width: 100%" @change="changeFormDeliveryTime" />
  143. </a-form-item>
  144. </a-col>
  145. <a-col :span="12">
  146. <a-form-item
  147. label="报价有效期(quotation validity period)"
  148. v-bind="validateInfos.quotationValidity"
  149. id="PuechaseQuotationFormForm-quotationValidity"
  150. name="quotationValidity"
  151. >
  152. <a-input v-model:value="formData.quotationValidity" placeholder="请输入" style="width: 40%; margin-right: 1%" />天(days)到
  153. <a-date-picker
  154. v-model:value="formData.quotationValidityDate"
  155. valueFormat="YYYY-MM-DD"
  156. format="YYYY-MM-DD"
  157. style="width: 40%; margin-left: 1%"
  158. />
  159. </a-form-item>
  160. </a-col>
  161. <a-col :span="12">
  162. <a-form-item label="质量等级(quality grade)" v-bind="validateInfos.inquiryTeam" id="SaleInquiryFormForm-inquiryTeam" name="inquiryTeam" :label-col="formItemLayout.labelCol1" :wrapper-col="formItemLayout.wrapperCol1">
  163. <JDictSelectTag v-model:value="formData.qualityGradeHead" placeholder="请选择" dictCode="quality_grade" />
  164. </a-form-item>
  165. </a-col>
  166. <a-col :span="12">
  167. <a-form-item label="币种(currency)" v-bind="validateInfos.currency" id="PuechaseQuotationFormForm-currency" name="currency">
  168. <JDictSelectTag v-model:value="formData.currency" placeholder="请选择" dictCode="currency" disabled/>
  169. </a-form-item>
  170. </a-col>
  171. <a-col :span="12">
  172. <a-form-item
  173. label="报价备注(quotation notes)"
  174. v-bind="validateInfos.quotationNotes"
  175. id="PuechaseQuotationFormForm-quotationNotes"
  176. name="quotationNotes"
  177. >
  178. <a-input v-model:value="formData.quotationNotes" placeholder="请输入报价备注(quotation notes)" allow-clear AutoComplete="off" />
  179. </a-form-item>
  180. </a-col>
  181. <a-col :span="12">
  182. <a-form-item
  183. label="技术资料(technical information)"
  184. v-bind="validateInfos.technicalInformation"
  185. id="PuechaseQuotationFormForm-technicalInformation"
  186. name="technicalInformation"
  187. >
  188. <JUpload v-model:value="formData.technicalInformation" />
  189. </a-form-item>
  190. </a-col>
  191. <a-col :span="12">
  192. <a-form-item
  193. label="报价资料(quotation information)"
  194. v-bind="validateInfos.quotationInformation"
  195. id="PuechaseQuotationFormForm-quotationInformation"
  196. name="quotationInformation"
  197. >
  198. <JUpload v-model:value="formData.quotationInfomation" />
  199. </a-form-item>
  200. </a-col>
  201. </a-row>
  202. </a-form>
  203. </template>
  204. </JFormContainer>
  205. <!-- 子表单区域 -->
  206. <a-tabs v-model:activeKey="activeKey" animated style="padding: 24px; padding-top: 0px">
  207. <a-tab-pane tab="采购报价单 - 产品明细(product details)" key="PuechaseQuotationFormProduct" :forceRender="true">
  208. <a-button type="primary" @click="SelectSupplierInquiry" style="margin-right: 1%; margin-bottom: 1%" :disabled="disabled">
  209. 选择供应商询价单(select supplier inquiry form)</a-button
  210. >
  211. <a-button type="primary" @click="selectProducts" style="margin-right: 1%; margin-bottom: 1%" :disabled="disabled"> 选择产品(select product)</a-button>
  212. <a-button type="primary" @click="setDiscountForSonList" style="margin-right: 1%; margin-bottom: 1%" :disabled="disabled"> 设置折扣(set discount)</a-button>
  213. <j-vxe-table
  214. :keep-source="true"
  215. resizable
  216. ref="PuechaseQuotationFormProductTableRef"
  217. :loading="PuechaseQuotationFormProductTable.loading"
  218. :columns="PuechaseQuotationFormProductTable.columns"
  219. :dataSource="PuechaseQuotationFormProductTable.dataSource"
  220. :maxHeight="340"
  221. :disabled="disabled"
  222. :rowNumber="true"
  223. :rowSelection="true"
  224. asyncRemove
  225. @value-change="changeValues"
  226. >
  227. <template #action="props">
  228. <a-popconfirm title="确定删除吗?" @confirm="handleDelete1(props)" v-if="!disabled">
  229. <a>删除(delete)</a>
  230. </a-popconfirm>
  231. </template>
  232. </j-vxe-table>
  233. </a-tab-pane>
  234. <a-tab-pane tab="采购报价单 - 船明细(ship details)" key="PuechaseQuotationFormShip" :forceRender="true">
  235. <j-vxe-table
  236. :keep-source="true"
  237. resizable
  238. ref="PuechaseQuotationFormShipTableRef"
  239. :loading="PuechaseQuotationFormShipTable.loading"
  240. :columns="PuechaseQuotationFormShipTable.columns"
  241. :dataSource="PuechaseQuotationFormShipTable.dataSource"
  242. :maxHeight="340"
  243. :disabled="disabled"
  244. :rowNumber="true"
  245. :rowSelection="true"
  246. >
  247. <template #action="props">
  248. <a @click="viewAccessory(props)">查看配件信息(view accessory information)</a>
  249. </template>
  250. </j-vxe-table>
  251. </a-tab-pane>
  252. </a-tabs>
  253. <BaseShipArchiveAccessoriesModal ref="BaseShipArchiveAccessoriesListRef" />
  254. <SelectPrpductModal ref="SelectPrpductModalRef" @select-product="addProduct" />
  255. <SelectProjectModal ref="SelectProjectModalRef" @select-project="addProject" />
  256. <SelectSupplierInquiryModal ref="SelectSupplierInquiryModalRef" @select-customer-inquiry="addProductFromCustomer" />
  257. <SetSonList ref="SetSonListRef" @success="setSonListFiled"></SetSonList>
  258. </a-spin>
  259. </template>
  260. <script lang="ts">
  261. import { defineComponent, ref, reactive, computed, toRaw } from 'vue';
  262. import { defHttp } from '/@/utils/http/axios';
  263. import { useValidateAntFormAndTable } from '/@/hooks/system/useJvxeMethods';
  264. import {
  265. PuechaseQuotationFormShippTable,
  266. queryPurcodeQuotationFormProductListByMainId,
  267. queryDataById,
  268. saveOrUpdate,
  269. ClassList,
  270. supplierOption,
  271. } from '../PurchaseQuotationForm.api';
  272. import { JVxeTable } from '/@/components/jeecg/JVxeTable';
  273. import { PuechaseQuotationFormShipColumns, PuechaseQuotationFormProductColumns } from '../PurchaseQuotationForm.data';
  274. import BaseShipArchiveAccessoriesModal from '../../../publicComponents/BaseShipArchiveAccessoriesModal.vue';
  275. import SelectPrpductModal from '../../../publicComponents/SelectPrpductModal.vue';
  276. import SelectProjectModal from '../../../publicComponents/SelectProjectModal.vue';
  277. import SelectSupplierInquiryModal from './SelectSupplierInquiryModal.vue';
  278. import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
  279. import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';
  280. import { JDictSelectTag,ApiSelect,JSelect } from '/@/components/Form';
  281. import JSelectInput from '/@/components/Form/src/jeecg/components/JSelectInput.vue';
  282. import SetSonList from './SetSonList.vue';
  283. import { Form, message } from 'ant-design-vue';
  284. import moment from 'moment';
  285. const useForm = Form.useForm;
  286. export default defineComponent({
  287. name: 'PuechaseQuotationFormForm',
  288. components: {
  289. JVxeTable,
  290. JFormContainer,
  291. BaseShipArchiveAccessoriesModal,
  292. SelectPrpductModal,
  293. JUpload,
  294. SelectProjectModal,
  295. JDictSelectTag,
  296. JSelectInput,
  297. SelectSupplierInquiryModal,
  298. ApiSelect,
  299. JSelect,
  300. SetSonList
  301. },
  302. props: {
  303. formDisabled: {
  304. type: Boolean,
  305. default: false,
  306. },
  307. formData: { type: Object, default: () => {} },
  308. formBpm: { type: Boolean, default: true },
  309. },
  310. emits: ['success'],
  311. setup(props, { emit }) {
  312. const loading = ref(false);
  313. const formRef = ref();
  314. var showField = ref('currency_dictText+name');
  315. var SetSonListRef =ref();
  316. var SelectPrpductModalRef = ref();
  317. var SelectProjectModalRef = ref();
  318. var SelectSupplierInquiryModalRef = ref();
  319. const PuechaseQuotationFormShipTableRef = ref();
  320. const PuechaseQuotationFormShipTable = reactive<Record<string, any>>({
  321. loading: false,
  322. columns: PuechaseQuotationFormShipColumns,
  323. dataSource: [],
  324. });
  325. const PuechaseQuotationFormProductTableRef = ref();
  326. const PuechaseQuotationFormProductTable = reactive<Record<string, any>>({
  327. loading: false,
  328. columns: PuechaseQuotationFormProductColumns,
  329. dataSource: [],
  330. });
  331. var BaseShipArchiveAccessoriesListRef = ref();
  332. const activeKey = ref('PuechaseQuotationFormProduct');
  333. var notAllowEdit = ref(false);
  334. const formData = reactive<Record<string, any>>({
  335. id: '',
  336. status: undefined,
  337. delFlag: undefined,
  338. otherStatus: '',
  339. submit: '',
  340. sourceCode: '',
  341. billDate: moment(new Date()).format('YYYY-MM-DD'),
  342. billCode: '',
  343. projectName: '',
  344. qutationProject: '',
  345. suppilerName: '',
  346. quotationSuppiler: '',
  347. quotationDeadline: '',
  348. priority: '',
  349. productionClass: '',
  350. model: '',
  351. maker: '',
  352. paymentTerms: '',
  353. placeDelivery: '',
  354. delivery: '',
  355. deliveryDayHead: '',
  356. quotationValidity: '',
  357. quotationValidityDate: '',
  358. currency: '',
  359. quotationNotes: '',
  360. technicalInformation: '',
  361. saleAttachs: '',
  362. paymentTermsInfo: '',
  363. quotationInfomation: '',
  364. qualityGradeHead:''
  365. });
  366. //表单验证
  367. const validatorRules = reactive({
  368. projectName: [
  369. { required: true, message: '请选择报价项目(select project)' }
  370. ],
  371. quotationSuppiler:[
  372. { required: true, message: '请选择报价供应商(select supplier)' }
  373. ],
  374. currency:[
  375. { required: true, message: '请选择币种(currency)' }
  376. ],
  377. });
  378. const {resetFields, validate, validateInfos} = useForm(formData, validatorRules, {immediate: false});
  379. const dbData = {};
  380. const formItemLayout = {
  381. labelCol: { xs: { span: 24 }, sm: { span: 5 } },
  382. wrapperCol: { xs: { span: 24 }, sm: { span: 16 } },
  383. };
  384. // 表单禁用
  385. const disabled = computed(() => {
  386. if (props.formBpm === true) {
  387. if (props.formData.disabled === false) {
  388. return false;
  389. } else {
  390. return true;
  391. }
  392. }
  393. return props.formDisabled;
  394. });
  395. function add() {
  396. resetFields();
  397. PuechaseQuotationFormShipTable.dataSource = [];
  398. PuechaseQuotationFormProductTable.dataSource = [];
  399. activeKey.value = 'PuechaseQuotationFormProduct';
  400. notAllowEdit.value = false;
  401. }
  402. async function edit(row) {
  403. //主表数据
  404. await queryMainData(row.id);
  405. //子表数据
  406. const PuechaseQuotationFormShipDataList = await PuechaseQuotationFormShippTable(row['id']);
  407. PuechaseQuotationFormShipTable.dataSource = [...PuechaseQuotationFormShipDataList];
  408. const PuechaseQuotationFormProductDataList = await queryPurcodeQuotationFormProductListByMainId(row['id']);
  409. PuechaseQuotationFormProductTable.dataSource = [...PuechaseQuotationFormProductDataList];
  410. notAllowEdit.value = true;
  411. }
  412. async function queryMainData(id) {
  413. const row = await queryDataById(id);
  414. resetFields();
  415. const tmpData = {};
  416. Object.keys(formData).forEach((key) => {
  417. if (row.hasOwnProperty(key)) {
  418. tmpData[key] = row[key];
  419. }
  420. });
  421. //赋值
  422. Object.assign(formData, tmpData);
  423. }
  424. const { getSubFormAndTableData, transformData } = useValidateAntFormAndTable(activeKey, {
  425. purPurchaseQuotationShip: PuechaseQuotationFormShipTableRef,
  426. purPurchaseQuotationProduct: PuechaseQuotationFormProductTableRef,
  427. });
  428. async function getFormData() {
  429. try {
  430. // 触发表单验证
  431. await validate();
  432. } catch ({ errorFields }) {
  433. if (errorFields) {
  434. const firstField = errorFields[0];
  435. if (firstField) {
  436. formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
  437. }
  438. }
  439. return Promise.reject(errorFields);
  440. }
  441. return transformData(toRaw(formData));
  442. }
  443. async function submitForm() {
  444. if (formData.sourceCode == '') {
  445. message.warning('请选择供应商询价单');
  446. } else {
  447. const mainData = await getFormData();
  448. PuechaseQuotationFormProductTableRef.value!.validateTable().then(async (errMap) => {
  449. if (errMap) {
  450. console.log('表单验证未通过:', { errMap });
  451. } else {
  452. const subData = await getSubFormAndTableData();
  453. const values = Object.assign({}, dbData, mainData, subData);
  454. console.log('表单提交数据', values)
  455. const isUpdate = values.id ? true : false
  456. await saveOrUpdate(values, isUpdate);
  457. //关闭弹窗
  458. emit('success');
  459. }
  460. });
  461. }
  462. }
  463. function setFieldsValue(values) {
  464. if (values) {
  465. Object.keys(values).map((k) => {
  466. formData[k] = values[k];
  467. });
  468. }
  469. }
  470. /**
  471. * 值改变事件触发-树控件回调
  472. * @param key
  473. * @param value
  474. */
  475. function handleFormChange(key, value) {
  476. formData[key] = value;
  477. }
  478. async function handleDelete(prop) {
  479. const xTable = PuechaseQuotationFormProductTableRef.value!.getXTable();
  480. var newArray = [...xTable.data];
  481. newArray.splice(prop.rowIndex, 1);
  482. PuechaseQuotationFormShipTable.dataSource = newArray;
  483. }
  484. async function handleDelete1(prop) {
  485. const xTable = PuechaseQuotationFormProductTableRef.value!.getXTable();
  486. var newArray = [...xTable.data];
  487. newArray.splice(prop.rowIndex, 1);
  488. PuechaseQuotationFormProductTable.dataSource = newArray;
  489. if (PuechaseQuotationFormProductTable.dataSource.length !== 0) {
  490. var arr = [];
  491. PuechaseQuotationFormProductTable.dataSource.map((item) => {
  492. if (item.sourceId) {
  493. arr.push(item.sourceId);
  494. }
  495. });
  496. if (arr.length == 0) {
  497. formData.sourceCode = '';
  498. notAllowEdit.value = false;
  499. }
  500. } else {
  501. notAllowEdit.value = false;
  502. formData.sourceCode = '';
  503. add();
  504. }
  505. }
  506. function addShip(data) {
  507. var arr = data.concat(PuechaseQuotationFormShipTable.dataSource);
  508. arr.map((item) => (item.shipowner = item.relateCustomer));
  509. PuechaseQuotationFormShipTable.dataSource = arr;
  510. }
  511. function addProduct(data) {
  512. data.map((item) => {
  513. item.productClass = item.classId_dictText;
  514. item.productCode = item.code;
  515. item.unit = item.measurementUnit;
  516. item.needShip = '0';
  517. item.shipInspection = '';
  518. item.productId = item.id;
  519. item.id = undefined;
  520. item.notes = ''
  521. });
  522. const xTable = PuechaseQuotationFormProductTableRef.value!.getXTable();
  523. var arrProduct = xTable.data.concat(data);
  524. PuechaseQuotationFormProductTable.dataSource = arrProduct;
  525. }
  526. function addProject(data) {
  527. if (data.length !== 0) {
  528. formData.qutationProject = data[0].id;
  529. formData.projectName = data[0].code;
  530. } else {
  531. formData.projectName = '';
  532. formData.qutationProject = '';
  533. }
  534. }
  535. function changeFormDeliveryTime() {
  536. const xTable = PuechaseQuotationFormProductTableRef.value!.getXTable();
  537. var arrProduct = [...xTable.data];
  538. arrProduct.map((item) => {
  539. item.deliveryDayChild = formData.deliveryDayHead;
  540. });
  541. PuechaseQuotationFormProductTable.dataSource = arrProduct;
  542. }
  543. function addProductFromCustomer(data) {
  544. data.map((item) => {
  545. item.productClass = item.productClass;
  546. item.productCode = item.productCode;
  547. item.unit = item.unit;
  548. item.sourceId = item.childId;
  549. item.model = item.childModel;
  550. item.deliveryDayChild = formData.deliveryDayHead;
  551. });
  552. const xTable = PuechaseQuotationFormProductTableRef.value!.getXTable();
  553. var arrProduct = xTable.data.concat(data);
  554. notAllowEdit.value = true;
  555. PuechaseQuotationFormProductTable.dataSource = arrProduct;
  556. formData.quotationProject = data[0].inquiryProject;
  557. formData.delivery = data[0].delivery;
  558. formData.paymentTerms = data[0].paymentTerms;
  559. formData.projectName = data[0].projectName;
  560. formData.quotationSuppiler = data[0].inquirySuppiler;
  561. formData.suppilerName = data[0].suppilerName;
  562. formData.sourceCode = data[0].billCode;
  563. formData.priority = data[0].priority;
  564. formData.model = data[0].headModel;
  565. formData.maker = data[0].maker;
  566. formData.placeDelivery = data[0].placeDelivery;
  567. // formData.inquiryTeam = data[0].inquiryTeam
  568. formData.productionClass = data[0].productionClass;
  569. formData.productionClass_dictText = data[0].productionClass_dictText;
  570. formData.qualityGradeHead = data[0].qualityGradeHead;
  571. // formData.saleAttachs =data[0].attachs
  572. getShipList(data[0].headId);
  573. if(formData.quotationSuppiler&& formData.quotationSuppiler!==''){
  574. getSupplierCurreny(formData.quotationSuppiler)
  575. }
  576. }
  577. async function getSupplierCurreny(id){
  578. var obj = await supplierOption({id:id})
  579. formData.currency = obj.records[0].currency
  580. }
  581. function getShipList(id) {
  582. let params = { id: id };
  583. defHttp.get({ url: '/purCode/purInquiryForm/queryPurInquiryFormShipByMainId', params }, { isTransformResponse: false }).then((res) => {
  584. if (res) {
  585. PuechaseQuotationFormShipTable.dataSource = res.result;
  586. }
  587. });
  588. }
  589. function viewAccessory(prop) {
  590. BaseShipArchiveAccessoriesListRef.value.getTable(prop.row);
  591. }
  592. function selectProducts() {
  593. SelectPrpductModalRef.value.getTable();
  594. }
  595. function onSearchProject() {
  596. SelectProjectModalRef.value.getTable();
  597. }
  598. function SelectSupplierInquiry() {
  599. SelectSupplierInquiryModalRef.value.getTable(formData);
  600. }
  601. async function changeSupplier(prop){
  602. if(prop){
  603. var params={id:prop}
  604. var obj = await supplierOption(params)
  605. formData.suppilerName = obj.records[0].name
  606. formData.paymentTerms = obj.records[0].paymentTerms
  607. getSupplierCurreny(prop)
  608. }else{
  609. formData.quotationSuppiler = ''
  610. formData.suppilerName = ''
  611. }
  612. }
  613. function changeValues(prop){
  614. if (prop.col.key == 'quantity'||prop.col.key == 'taxPriceOriginal') {
  615. if (prop.row.quantity||prop.row.taxPriceOriginal) {
  616. var num = Number(prop.row.quantity) * Number(prop.row.taxPriceOriginal)
  617. prop.row.taxAmountOriginal = isNaN(num) ? '' : num.toFixed(2);
  618. prop.row.discount = isNaN( prop.row.discount)?0:Number( prop.row.discount)
  619. prop.row.taxPrice = (Number(prop.row.taxPriceOriginal)*(1-prop.row.discount/100)).toFixed(2)
  620. prop.row.taxAmount = (Number(prop.row.taxPrice)*Number(prop.row.quantity)).toFixed(2)
  621. }
  622. }
  623. if (prop.col.key == 'discount') {
  624. if (prop.row.discount||prop.row.taxPriceOriginal||prop.row.quantity) {
  625. prop.row.taxPrice = (Number(prop.row.taxPriceOriginal)*(1-prop.row.discount/100)).toFixed(2)
  626. prop.row.taxAmount = (Number(prop.row.taxPrice)*Number(prop.row.quantity)).toFixed(2)
  627. }
  628. }
  629. }
  630. function setDiscountForSonList(){
  631. SetSonListRef.value.getTable()
  632. }
  633. function setSonListFiled(value){
  634. var xTable = (PuechaseQuotationFormProductTableRef.value!.getXTable()).data
  635. if(xTable.length>0){
  636. xTable.map(item=>{
  637. item.discount = isNaN(value.numericalValue)?0:value.numericalValue
  638. if (item.taxAmountOriginal) {
  639. item.taxPrice = (Number(item.taxPriceOriginal)*(1-item.discount/100)).toFixed(2)
  640. item.taxAmount = (Number(item.taxPrice)*Number(item.quantity)).toFixed(2)
  641. }
  642. })
  643. }
  644. PuechaseQuotationFormProductTable.dataSource =[...xTable]
  645. }
  646. return {
  647. PuechaseQuotationFormShipTableRef,
  648. PuechaseQuotationFormShipTable,
  649. PuechaseQuotationFormProductTableRef,
  650. PuechaseQuotationFormProductTable,
  651. validatorRules,
  652. validateInfos,
  653. activeKey,
  654. loading,
  655. formData,
  656. setFieldsValue,
  657. handleFormChange,
  658. formItemLayout,
  659. disabled,
  660. getFormData,
  661. submitForm,
  662. add,
  663. edit,
  664. formRef,
  665. addShip,
  666. addProduct,
  667. BaseShipArchiveAccessoriesListRef,
  668. viewAccessory,
  669. handleDelete,
  670. handleDelete1,
  671. selectProducts,
  672. SelectPrpductModalRef,
  673. SelectProjectModalRef,
  674. SelectSupplierInquiryModalRef,
  675. onSearchProject,
  676. addProject,
  677. supplierOption,
  678. SelectSupplierInquiry,
  679. addProductFromCustomer,
  680. changeFormDeliveryTime,
  681. changeSupplier,
  682. notAllowEdit,
  683. ClassList,
  684. showField,
  685. changeValues,
  686. setDiscountForSonList,
  687. SetSonListRef,
  688. setSonListFiled,
  689. getSupplierCurreny
  690. };
  691. },
  692. });
  693. </script>
  694. <style lang="less" scoped>
  695. /** 时间和数字输入框样式 */
  696. :deep(.ant-input-number) {
  697. width: 100%;
  698. }
  699. :deep(.ant-calendar-picker) {
  700. width: 100%;
  701. }
  702. /deep/.vxe-table--body-wrapper {
  703. height: 100% !important;
  704. }
  705. /deep/.ant-modal-body {
  706. padding: 24px !important;
  707. }
  708. /deep/.ant-form-item {
  709. margin-bottom: 8px !important;
  710. }
  711. /deep/.vxe-cell--valid-error-msg{
  712. color:red !important;
  713. background-color: white !important;
  714. }
  715. </style>