PurchaseOrderFormForm.vue 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903
  1. <template>
  2. <a-spin :spinning="loading">
  3. <JFormContainer :disabled="disabled">
  4. <template #detail>
  5. <a-form v-bind="formItemLayout" name="SaleOrderForm" ref="formRef">
  6. <a-row>
  7. <a-col :span="12">
  8. <a-form-item label="组织(organize)" v-bind="validateInfos.organize" id="SaleOrderForm-organize" name="organize">
  9. <a-select v-model:value="formData.organize" :disabled="formData.id!==''&&formData.submit == '1'">
  10. <a-select-option value="上海">上海</a-select-option>
  11. <a-select-option value="香港">香港</a-select-option>
  12. </a-select>
  13. </a-form-item>
  14. </a-col>
  15. <a-col :span="12">
  16. <a-form-item label="订单编号(bill code)" v-bind="validateInfos.billCode" id="SaleOrderForm-billCode" name="billCode">
  17. <a-input v-model:value="formData.billCode" placeholder="自动生成" disabled />
  18. </a-form-item>
  19. </a-col>
  20. <a-col :span="12">
  21. <a-form-item label="单据日期(bill date)" v-bind="validateInfos.billDate" id="SaleOrderForm-billDate" name="billDate">
  22. <a-date-picker
  23. placeholder="请选择单据日期(bill date)"
  24. v-model:value="formData.billDate"
  25. value-format="YYYY-MM-DD"
  26. style="width: 100%"
  27. allow-clear
  28. />
  29. </a-form-item>
  30. </a-col>
  31. <a-col :span="12">
  32. <a-form-item label="项目(project)" v-bind="validateInfos.projectName" id="SaleOrderForm-projectName" name="projectName">
  33. <a-input-search
  34. v-model:value="formData.projectName"
  35. placeholder="请输入项目(project)"
  36. readonly
  37. :disabled="notAllowEdit"
  38. allow-clear
  39. enter-button="Search"
  40. AutoComplete="off"
  41. @search="onSearchProject"
  42. />
  43. </a-form-item>
  44. </a-col>
  45. <a-col :span="12">
  46. <a-form-item label="供应商(supplier)" v-bind="validateInfos.supplier" id="SaleOrderForm-supplier" name="supplier">
  47. <ApiSelect
  48. :api="supplierOption"
  49. showSearch
  50. v-model:value="formData.supplier"
  51. optionFilterProp="label"
  52. resultField="records"
  53. labelField="name"
  54. valueField="id"
  55. disabled
  56. :params="{ pageSize: -1,status:1}"
  57. />
  58. </a-form-item>
  59. </a-col>
  60. <a-col :span="12">
  61. <a-form-item label="优先级(priority)" v-bind="validateInfos.priority" id="SaleOrderForm-priority" name="priority">
  62. <JDictSelectTag v-model:value="formData.priority" placeholder="请选择" dictCode="priority" disabled />
  63. </a-form-item>
  64. </a-col>
  65. <a-col :span="12">
  66. <a-form-item
  67. label="产品分类(production class)"
  68. v-bind="validateInfos.productionClass"
  69. id="SaleOrderForm-productionClass"
  70. name="productionClass"
  71. >
  72. <ApiSelect
  73. :api="ClassList"
  74. showSearch
  75. v-model:value="formData.productionClass"
  76. optionFilterProp="label"
  77. resultField="records"
  78. labelField="name"
  79. valueField="id"
  80. disabled
  81. :params="{ pageSize: -1 }"
  82. />
  83. </a-form-item>
  84. </a-col>
  85. <a-col :span="12">
  86. <a-form-item label="机型(model)" v-bind="validateInfos.model" id="SaleOrderForm-model" name="model">
  87. <JDictSelectTag v-model:value="formData.model" placeholder="请选择" dictCode="model_typer" disabled />
  88. </a-form-item>
  89. </a-col>
  90. <a-col :span="12">
  91. <a-form-item label="厂家(maker)" v-bind="validateInfos.maker" id="SaleOrderForm-maker" name="maker">
  92. <a-input v-model:value="formData.maker" placeholder="请输入厂家(maker)" allow-clear disabled />
  93. </a-form-item>
  94. </a-col>
  95. <a-col :span="12">
  96. <a-form-item label="贸易条款(trade term)" v-bind="validateInfos.tradeTerms" id="SaleOrderForm-tradeTerms" name="tradeTerms">
  97. <JDictSelectTag v-model:value="formData.tradeTerms" placeholder="请选择" dictCode="delivery_terms" />
  98. </a-form-item>
  99. </a-col>
  100. <a-col :span="12">
  101. <a-form-item label="是否出口(export)" v-bind="validateInfos.isExport" id="SaleOrderForm-isExport" name="isExport">
  102. <JDictSelectTag v-model:value="formData.isExport" placeholder="请选择" dictCode="yes_or_no" />
  103. </a-form-item>
  104. </a-col>
  105. <a-col :span="12">
  106. <a-form-item
  107. label="包装要求(package requirement)"
  108. v-bind="validateInfos.packagebRequirement"
  109. id="SaleOrderForm-packagebRequirement"
  110. name="packagebRequirement"
  111. >
  112. <a-input
  113. v-model:value="formData.packagebRequirement"
  114. placeholder="请输入包装要求(package requirement)"
  115. allow-clear
  116. AutoComplete="off"
  117. />
  118. </a-form-item>
  119. </a-col>
  120. <a-col :span="12">
  121. <a-form-item label="收件人(recipient)" v-bind="validateInfos.recipient" id="SaleOrderForm-recipient" name="recipient">
  122. <a-input v-model:value="formData.recipient" placeholder="请输入" AutoComplete="off" />
  123. </a-form-item>
  124. </a-col>
  125. <a-col :span="12">
  126. <a-form-item label="运输方式(transport)" v-bind="validateInfos.transport" id="SaleOrderForm-transport" name="transport">
  127. <JDictSelectTag v-model:value="formData.transport" placeholder="请选择" dictCode="delivery_methods" />
  128. </a-form-item>
  129. </a-col>
  130. <a-col :span="12">
  131. <a-form-item
  132. label="收件人地址(recipient address)"
  133. v-bind="validateInfos.recipientAddress"
  134. id="SaleOrderForm-recipientAddress"
  135. name="recipientAddress"
  136. >
  137. <a-input v-model:value="formData.recipientAddress" placeholder="请输入" AutoComplete="off" />
  138. </a-form-item>
  139. </a-col>
  140. <a-col :span="12">
  141. <a-form-item label="付款条件(payment terms)" v-bind="validateInfos.paymentTerms" id="SaleOrderForm-paymentTerms" name="paymentTerms">
  142. <JDictSelectTag v-model:value="formData.paymentTerms" placeholder="请选择" dictCode="payment_terms" />
  143. </a-form-item>
  144. </a-col>
  145. <a-col :span="12">
  146. <a-form-item label="收件人电话(recipient tel)" v-bind="validateInfos.recipientTel" id="SaleOrderForm-recipientTel" name="recipientTel">
  147. <a-input v-model:value="formData.recipientTel" placeholder="请输入" AutoComplete="off" />
  148. </a-form-item>
  149. </a-col>
  150. <a-col :span="12">
  151. <a-form-item label="发货方式(delivery)" v-bind="validateInfos.delivery" id="SaleOrderForm-delivery" name="delivery">
  152. <JDictSelectTag v-model:value="formData.delivery" placeholder="请选择" dictCode="delivery_sale_order" />
  153. </a-form-item>
  154. </a-col>
  155. <a-col :span="12">
  156. <a-form-item
  157. label="质保期(warranty period)"
  158. v-bind="validateInfos.warrantyPeriod"
  159. id="SaleOrderForm-warrantyPeriod"
  160. name="warrantyPeriod"
  161. >
  162. <a-input
  163. v-model:value="formData.warrantyPeriod"
  164. placeholder="请输入"
  165. style="width: 85%; margin-right: 1%"
  166. AutoComplete="off"
  167. />月(month)
  168. </a-form-item>
  169. </a-col>
  170. <a-col :span="12">
  171. <a-form-item
  172. label="质保条款(warranty terms)"
  173. v-bind="validateInfos.warrantyTerms"
  174. id="SaleOrderForm-warrantyTerms"
  175. name="warrantyTerms"
  176. >
  177. <a-input v-model:value="formData.warrantyTerms" placeholder="请输入质保条款(warranty terms)" allow-clear AutoComplete="off" />
  178. </a-form-item>
  179. </a-col>
  180. <a-col :span="12">
  181. <a-form-item label="汇率(exchange rate)" v-bind="validateInfos.exchangeRate" id="SaleOrderForm-exchangeRate" name="exchangeRate">
  182. <a-input v-model:value="formData.exchangeRate" placeholder="请输入" allow-clear AutoComplete="off" disabled />
  183. </a-form-item>
  184. </a-col>
  185. <a-col :span="12">
  186. <a-form-item label="币种(currency)" v-bind="validateInfos.currency" id="SaleOrderForm-currency" name="currency">
  187. <JDictSelectTag v-model:value="formData.currency" placeholder="请选择" dictCode="currency" disabled />
  188. </a-form-item>
  189. </a-col>
  190. <a-col :span="12">
  191. <a-form-item
  192. label="采购部门(purchase department)"
  193. v-bind="validateInfos.purchaseDepartment"
  194. id="SaleOrderForm-purchaseDepartment"
  195. name="purchaseDepartment"
  196. >
  197. <a-input v-model:value="formData.purchaseDepartmentName" placeholder="请输入" allow-clear disabled />
  198. </a-form-item>
  199. </a-col>
  200. <a-col :span="12">
  201. <a-form-item label="采购员(purchasesman)" v-bind="validateInfos.purchaseman" id="SaleOrderForm-purchaseman" name="purchaseman">
  202. <a-input v-model:value="formData.purchasemanName" placeholder="请输入采购员(salesman)" allow-clear disabled />
  203. </a-form-item>
  204. </a-col>
  205. <a-col :span="12">
  206. <a-form-item label="折扣(discountHead)" v-bind="validateInfos.discountHead" id="SaleOrderForm-discountHead" name="discountHead">
  207. <a-input-number
  208. v-model:value="formData.discountHead"
  209. placeholder="请输入折扣(discountHead)"
  210. :min="0"
  211. :max="100"
  212. @blur="discountHeadChange"
  213. />
  214. </a-form-item>
  215. </a-col>
  216. <a-col :span="12">
  217. <a-form-item
  218. label="折后金额(discounted amount)"
  219. v-bind="validateInfos.discountAmount"
  220. id="SaleOrderForm-discountAmount"
  221. name="discountAmount"
  222. >
  223. <a-input v-model:value="formData.discountAmount" allow-clear disabled />
  224. </a-form-item>
  225. </a-col>
  226. <a-col :span="12">
  227. <a-form-item label="备注(notes)" v-bind="validateInfos.notes" id="SaleOrderForm-notes" name="notes">
  228. <a-input v-model:value="formData.notes" AutoComplete="off" />
  229. </a-form-item>
  230. </a-col>
  231. <a-col :span="12">
  232. <a-form-item
  233. label="协议条款(agreement terms)"
  234. v-bind="validateInfos.agreementTerms"
  235. id="SaleOrderForm-agreementTerms"
  236. name="agreementTerms"
  237. >
  238. <JSelectMultiple
  239. v-model:value="formData.agreementTerms"
  240. placeholder=""
  241. dictCode="base_agreement_terms,name,name"
  242. page="false"
  243. showSearch
  244. />
  245. </a-form-item>
  246. </a-col>
  247. <a-col :span="12">
  248. <a-form-item label="附件(attachs)" v-bind="validateInfos.attachs" id="SaleOrderForm-attachs" name="attachs">
  249. <JUpload v-model:value="formData.attachs" />
  250. </a-form-item>
  251. </a-col>
  252. </a-row>
  253. </a-form>
  254. </template>
  255. </JFormContainer>
  256. <!-- 子表单区域 -->
  257. <a-tabs v-model:activeKey="activeKey" animated style="padding: 24px; padding-top: 0px">
  258. <a-tab-pane tab="采购订单 - 产品明细(product details)" key="purOrderFormShipFormProduct" :forceRender="true">
  259. <a-button type="primary" style="margin-right: 1%; margin-bottom: 1%" @click="selectSaleOrderList" :disabled="formData.sourceCode !== ''">
  260. 选择销售订单(select saleorder)</a-button
  261. >
  262. <a-button type="primary" style="margin-right: 1%; margin-bottom: 1%" @click="selectVirtualProducts">
  263. 选择虚拟产品(select virtual products)</a-button
  264. >
  265. <a-button
  266. type="primary"
  267. style="margin-right: 1%; margin-bottom: 1%"
  268. @click="SelectSupplierQuotationList"
  269. v-auth="'purCode:pur_order:selection'"
  270. :disabled="formData.sourceCode2 !== ''"
  271. >选择供应商报价选定(select supplier quotation selection)</a-button
  272. >
  273. <j-vxe-table
  274. :keep-source="true"
  275. resizable
  276. ref="purOrderFormShipFormProductTableRef"
  277. :loading="purOrderFormShipFormProductTable.loading"
  278. :columns="purOrderFormShipFormProductTable.columns"
  279. :dataSource="purOrderFormShipFormProductTable.dataSource"
  280. :maxHeight="340"
  281. :disabled="disabled"
  282. :rowNumber="true"
  283. :rowSelection="true"
  284. asyncRemove
  285. @value-change="changeValues"
  286. >
  287. <template #action="props" >
  288. <a-popconfirm title="确定删除吗?" @confirm="handleDelete(props)" v-if="!(formData.id!==''&&formData.submit == '1')">
  289. <a v-if="!(formData.id!==''&&formData.submit == '1')">删除(delete)</a>
  290. </a-popconfirm>
  291. </template>
  292. </j-vxe-table>
  293. </a-tab-pane>
  294. <a-tab-pane tab="采购订单 - 船明细(ship details)" key="PurOrderFormShipFormShip" :forceRender="true">
  295. <j-vxe-table
  296. :keep-source="true"
  297. resizable
  298. ref="PurOrderFormShipFormShipTableRef"
  299. :loading="PurOrderFormShipFormShipTable.loading"
  300. :columns="PurOrderFormShipFormShipTable.columns"
  301. :dataSource="PurOrderFormShipFormShipTable.dataSource"
  302. :maxHeight="340"
  303. :disabled="disabled"
  304. :rowNumber="true"
  305. :rowSelection="true"
  306. >
  307. <template #action="props">
  308. <a @click="viewAccessory(props)">查看配件信息(view accessory information)</a>
  309. </template>
  310. </j-vxe-table>
  311. </a-tab-pane>
  312. </a-tabs>
  313. <SelectPrpductModal ref="SelectPrpductModalRef" @select-product="addProduct" />
  314. <SelectProjectModal ref="SelectProjectModalRef" @select-project="addProject" />
  315. <BaseShipArchiveAccessoriesModal ref="BaseShipArchiveAccessoriesModalRef" />
  316. <SelectSaleOrderModal ref="SelectSaleOrderModalRef" @select-sale-order="addFormSaleOrder" />
  317. <SelectSupplierQuotation ref="SelectSupplierQuotationRef" @select-supplier-quatation-confirm="addFromQuotation" />
  318. </a-spin>
  319. </template>
  320. <script lang="ts">
  321. import { defineComponent, ref, reactive, computed, toRaw, watch } from 'vue';
  322. import { defHttp } from '/@/utils/http/axios';
  323. import { useValidateAntFormAndTable } from '/@/hooks/system/useJvxeMethods';
  324. import {
  325. queryPurOrderFormShipFormShippTable,
  326. queryPurOrderFormProductListByMainId,
  327. ClassList,
  328. queryDataById,
  329. supplierOption,
  330. saveOrUpdate,
  331. queryVersonHistoryById,
  332. queryPurVersonFormShipListByMainId,
  333. queryPurVersonProductListByMainId,
  334. } from '../PurchaseOrderyForm.api';
  335. import { JVxeTable } from '/@/components/jeecg/JVxeTable';
  336. import { purchaseOrderShipColumns, purchaseOrderProductColumns } from '../PurchaseOrderForm.data';
  337. import SelectPrpductModal from '../../../publicComponents/SelectPrpductModal.vue';
  338. import SelectProjectModal from '../../../publicComponents/SelectProjectModal.vue';
  339. import SelectSaleOrderModal from '../../../publicComponents/SelectSaleOrderModal.vue';
  340. import BaseShipArchiveAccessoriesModal from '../../../publicComponents/BaseShipArchiveAccessoriesModal.vue';
  341. import SelectSupplierQuotation from '../../../publicComponents/SelectSupplierQuotation.vue';
  342. import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
  343. import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';
  344. import { JDictSelectTag, ApiSelect } from '/@/components/Form';
  345. import JSelectInput from '/@/components/Form/src/jeecg/components/JSelectInput.vue';
  346. import JSelectMultiple from '/@/components/Form/src/jeecg/components/JSelectMultiple.vue';
  347. import { Form, message } from 'ant-design-vue';
  348. import { useUserStore } from '/@/store/modules/user';
  349. import moment from 'moment';
  350. const useForm = Form.useForm;
  351. export default defineComponent({
  352. name: 'SaleOrderForm',
  353. components: {
  354. JVxeTable,
  355. JFormContainer,
  356. SelectPrpductModal,
  357. JUpload,
  358. JDictSelectTag,
  359. JSelectInput,
  360. SelectProjectModal,
  361. BaseShipArchiveAccessoriesModal,
  362. SelectSaleOrderModal,
  363. ApiSelect,
  364. JSelectMultiple,
  365. SelectSupplierQuotation,
  366. },
  367. props: {
  368. formDisabled: {
  369. type: Boolean,
  370. default: false,
  371. },
  372. formData: { type: Object, default: () => {} },
  373. formBpm: { type: Boolean, default: true },
  374. },
  375. emits: ['success'],
  376. setup(props, { emit }) {
  377. const userStore = useUserStore();
  378. const loading = ref(false);
  379. const formRef = ref();
  380. const PurOrderFormShipFormShipTableRef = ref();
  381. const SelectPrpductModalRef = ref();
  382. const SelectProjectModalRef = ref();
  383. const SelectSupplierQuotationRef = ref();
  384. const BaseShipArchiveAccessoriesModalRef = ref();
  385. const SelectSaleOrderModalRef = ref();
  386. const PurOrderFormShipFormShipTable = reactive<Record<string, any>>({
  387. loading: false,
  388. columns: purchaseOrderShipColumns,
  389. dataSource: [],
  390. });
  391. const purOrderFormShipFormProductTableRef = ref();
  392. const purOrderFormShipFormProductTable = reactive<Record<string, any>>({
  393. loading: false,
  394. columns: purchaseOrderProductColumns,
  395. dataSource: [],
  396. });
  397. const activeKey = ref('purOrderFormShipFormProduct');
  398. var notAllowEdit = ref(false);
  399. const formData = reactive<Record<string, any>>({
  400. id: '',
  401. status: undefined,
  402. delFlag: undefined,
  403. sourceCode: '',
  404. sourceCode2: '',
  405. submit: undefined,
  406. organize: '',
  407. billCode: '',
  408. billDate: moment(new Date()).format('YYYY-MM-DD'),
  409. project: '',
  410. projectName: '',
  411. supplier: '',
  412. supplierName: '',
  413. priority: '',
  414. productionClass: '',
  415. model: '',
  416. maker: '',
  417. tradeTerms: '',
  418. isExport: '',
  419. packagebRequirement: '',
  420. recipient: '',
  421. recipientTel: '',
  422. recipientAddress: '',
  423. paymentTerms: '',
  424. delivery: '',
  425. transport: '',
  426. warrantyPeriod: '',
  427. warrantyTerms: '',
  428. exchangeRate: '',
  429. purchaseDepartment: '',
  430. purchaseDepartmentName: '',
  431. purchaseman: '',
  432. purchasemanName: '',
  433. currency: '',
  434. notes: '',
  435. agreementTerms: '',
  436. discountHead: 0,
  437. discountAmount: '',
  438. totalAmount: '',
  439. attachs:''
  440. });
  441. //表单验证
  442. const validatorRules = reactive({
  443. projectName: [{ required: true, message: '请选择报价项目(select project)' }],
  444. organize: [{ required: true, message: '请选择组织(select organize)' }],
  445. // currency:[
  446. // { required: true, message: '请选择币种(currency)' }
  447. // ],
  448. });
  449. const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
  450. const dbData = {};
  451. const formItemLayout = {
  452. labelCol: { xs: { span: 24 }, sm: { span: 7 } },
  453. wrapperCol: { xs: { span: 24 }, sm: { span: 15 } },
  454. labelCol1: { xs: { span: 24 }, sm: { span: 7 } },
  455. wrapperCol1: { xs: { span: 24 }, sm: { span: 15 } },
  456. };
  457. // 表单禁用
  458. const disabled = computed(() => {
  459. if (props.formBpm === true) {
  460. if (props.formData.disabled === false) {
  461. return false;
  462. } else {
  463. return true;
  464. }
  465. }
  466. return props.formDisabled;
  467. });
  468. function add() {
  469. resetFields();
  470. PurOrderFormShipFormShipTable.dataSource = [];
  471. purOrderFormShipFormProductTable.dataSource = [];
  472. activeKey.value = 'purOrderFormShipFormProduct';
  473. formData.purchaseman = userStore.getUserInfo.username;
  474. formData.purchasemanName = userStore.getUserInfo.realname;
  475. formData.purchaseDepartment = userStore.getUserInfo.orgCode;
  476. formData.purchaseDepartmentName = userStore.getUserInfo.orgName;
  477. formData.discountHead = 0;
  478. }
  479. async function copy(data, id) {
  480. //主表数据
  481. await queryMainData(id);
  482. formData.id = '';
  483. formData.billCode = '';
  484. formData.submit = undefined;
  485. formData.sourceCode = '';
  486. formData.sourceCode2 = '';
  487. formData.project = '';
  488. formData.projectName = '';
  489. //子表数据
  490. const PurOrderFormShipFormShipDataList = await queryPurOrderFormShipFormShippTable(id);
  491. PurOrderFormShipFormShipTable.dataSource = [...PurOrderFormShipFormShipDataList];
  492. data.map((item) => {
  493. item.sourceId = '';
  494. item.sourceType = '';
  495. });
  496. purOrderFormShipFormProductTable.dataSource = [...data];
  497. notAllowEdit.value = false;
  498. }
  499. // 判断有没有参照的子表
  500. // function isSelect() {
  501. // var arrQuo = [],
  502. // arrCon = [];
  503. // purOrderFormShipFormProductTable.dataSource.map((item) => {
  504. // var sign = '';
  505. // sign = item.sourceId ? item.sourceId.substring(0, 3) : '';
  506. // if (item.sourceId && sign == 'Quo') {
  507. // arrQuo.push(item.sourceId);
  508. // } else if (item.sourceId && sign == 'Con') {
  509. // arrCon.push(item.sourceId);
  510. // }
  511. // });
  512. // if (arrQuo.length == 0 && arrCon.length == 0) {
  513. // formData.sourceCode2 = '';
  514. // formData.sourceCode = '';
  515. // notAllowEdit.value = false;
  516. // } else if (arrQuo.length == 0) {
  517. // formData.sourceCode = '';
  518. // notAllowEdit.value = true;
  519. // } else if (arrCon.length == 0) {
  520. // formData.sourceCode2 = '';
  521. // notAllowEdit.value = true;
  522. // }
  523. // }
  524. async function edit(row) {
  525. //主表数据
  526. await queryMainData(row.id);
  527. //子表数据
  528. const PurOrderFormShipFormShipDataList = await queryPurOrderFormShipFormShippTable(row['id']);
  529. PurOrderFormShipFormShipTable.dataSource = [...PurOrderFormShipFormShipDataList];
  530. const purOrderFormShipFormProductDataList = await queryPurOrderFormProductListByMainId(row['id']);
  531. purOrderFormShipFormProductTable.dataSource = [...purOrderFormShipFormProductDataList];
  532. notAllowEdit.value = true;
  533. }
  534. async function queryMainData(id) {
  535. const row = await queryDataById(id);
  536. resetFields();
  537. const tmpData = {};
  538. Object.keys(formData).forEach((key) => {
  539. if (row.hasOwnProperty(key)) {
  540. tmpData[key] = row[key];
  541. }
  542. });
  543. //赋值
  544. Object.assign(formData, tmpData);
  545. }
  546. //查看版本详情
  547. async function VersionDetail(record) {
  548. //主表数据
  549. await queryVersonHistoryData(record.id);
  550. //子表数据
  551. const SaleOrderFormShipFormShipDataList = await queryPurVersonFormShipListByMainId(record.id);
  552. PurOrderFormShipFormShipTable.dataSource = [...SaleOrderFormShipFormShipDataList];
  553. const purOrderFormShipFormProductDataList = await queryPurVersonProductListByMainId(record.id);
  554. purOrderFormShipFormProductTable.dataSource = [...purOrderFormShipFormProductDataList];
  555. }
  556. async function queryVersonHistoryData(id) {
  557. const row = await queryVersonHistoryById(id);
  558. resetFields();
  559. const tmpData = {};
  560. Object.keys(formData).forEach((key) => {
  561. if (row.hasOwnProperty(key)) {
  562. tmpData[key] = row[key];
  563. }
  564. });
  565. //赋值
  566. Object.assign(formData, tmpData);
  567. }
  568. const { getSubFormAndTableData, transformData } = useValidateAntFormAndTable(activeKey, {
  569. purOrderShip: PurOrderFormShipFormShipTableRef,
  570. purOrderProduct: purOrderFormShipFormProductTableRef,
  571. });
  572. async function getFormData() {
  573. try {
  574. // 触发表单验证
  575. await validate();
  576. } catch ({ errorFields }) {
  577. if (errorFields) {
  578. const firstField = errorFields[0];
  579. if (firstField) {
  580. formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
  581. }
  582. }
  583. return Promise.reject(errorFields);
  584. }
  585. return transformData(toRaw(formData));
  586. }
  587. async function submitForm() {
  588. var xTable = purOrderFormShipFormProductTableRef.value!.getXTable();
  589. if (xTable.data.length == 0) {
  590. message.warning('请添加产品明细');
  591. } else {
  592. purOrderFormShipFormProductTableRef.value!.validateTable().then(async (errMap) => {
  593. if (errMap) {
  594. console.log('表单验证未通过:', { errMap });
  595. } else {
  596. const mainData = await getFormData();
  597. const subData = await getSubFormAndTableData();
  598. const values = Object.assign({}, dbData, mainData, subData);
  599. console.log('表单提交数据', values);
  600. const isUpdate = values.id ? true : false;
  601. const isRevise = values.submit == '1' ? true : false;
  602. await saveOrUpdate(values, isUpdate, isRevise);
  603. //关闭弹窗
  604. emit('success');
  605. }
  606. });
  607. }
  608. }
  609. function setFieldsValue(values) {
  610. if (values) {
  611. Object.keys(values).map((k) => {
  612. formData[k] = values[k];
  613. });
  614. }
  615. }
  616. function onSearchProject() {
  617. SelectProjectModalRef.value.getTable();
  618. }
  619. function addProduct(data) {
  620. data.map((item) => {
  621. item.productClass = item.classId_dictText;
  622. item.productCode = item.code;
  623. item.productId = item.id;
  624. item.id = undefined;
  625. });
  626. var xTable = purOrderFormShipFormProductTableRef.value!.getXTable();
  627. var arrProduct = xTable.data.concat(data);
  628. purOrderFormShipFormProductTable.dataSource = arrProduct;
  629. }
  630. function getShipList(id, status) {
  631. let params = { id: id };
  632. let url =
  633. status == 'quotation'
  634. ? '/purCode/purQuotationSelection/queryPurQuotationSelectionShipByMainId'
  635. : '/saleCode/saleOrder/querySaleOrderShipByMainId';
  636. defHttp.get({ url: url, params }, { isTransformResponse: false }).then((res) => {
  637. if (res) {
  638. PurOrderFormShipFormShipTable.dataSource = res.result;
  639. }
  640. });
  641. }
  642. function addFormSaleOrder(data) {
  643. data.map((item) => {
  644. item.model = item.childModel;
  645. item.sourceId = item.childId;
  646. item.sourceType = 'Con' + item.childId;
  647. item.sourceCode = item.billCode;
  648. item.taxPrice = item.taxPriceGys;
  649. item.taxAmount = item.taxPrice * item.quantity;
  650. // item.productClass =data[0].productClass
  651. });
  652. var xTable = purOrderFormShipFormProductTableRef.value!.getXTable();
  653. var arrProduct = xTable.data.concat(data);
  654. purOrderFormShipFormProductTable.dataSource = arrProduct;
  655. notAllowEdit.value = true;
  656. if(formData.sourceCode2.includes(data[0].billCode)){
  657. formData.sourceCode2 = formData.sourceCode2
  658. }else{
  659. formData.sourceCode2 = formData.sourceCode2==''?data[0].billCode: formData.sourceCode2+','+data[0].billCode
  660. }
  661. if (formData.sourceCode == '') {
  662. formData.project = data[0].project;
  663. formData.projectName = data[0].projectName;
  664. formData.supplierName = data[0].supplierName;
  665. formData.supplier = data[0].supplierId;
  666. formData.priority = data[0].priority;
  667. formData.productionClass = data[0].productionClass;
  668. formData.model = data[0].headModel;
  669. formData.maker = data[0].maker;
  670. formData.packagebRequirement = data[0].packagebRequirement;
  671. formData.delivery = data[0].delivery;
  672. formData.paymentTerms = data[0].paymentTerms;
  673. formData.warrantyPeriod = data[0].warrantyPeriod;
  674. formData.warrantyTerms = data[0].warrantyTerms;
  675. formData.isExport = data[0].isExport;
  676. formData.exchangeRate = data[0].exchangeRateGys;
  677. formData.currency = data[0].currencyGys;
  678. formData.tradeTerms = data[0].deliveryTerms;
  679. formData.attachs = data[0].attachs;
  680. formData.notes = data[0].notes;
  681. getShipList(data[0].headId, 'contract');
  682. }
  683. }
  684. function addFromQuotation(data) {
  685. data.map((item) => {
  686. item.fatherModel = item.model;
  687. item.model = item.childModel;
  688. item.sourceId = item.childId;
  689. item.sourceType = 'Quo' + item.childId;
  690. item.sourceCode = item.billCode;
  691. });
  692. var arrProduct = data.concat(purOrderFormShipFormProductTable.dataSource);
  693. purOrderFormShipFormProductTable.dataSource = arrProduct;
  694. notAllowEdit.value = true;
  695. formData.sourceCode = data[0].billCode;
  696. if (formData.sourceCode2 == '') {
  697. formData.project = data[0].inquiryProject;
  698. formData.projectName = data[0].projectName;
  699. formData.supplier = data[0].selectionSupplier;
  700. formData.supplierName = data[0].selectionSupplier_dictText;
  701. formData.priority = data[0].priority;
  702. formData.productionClass = data[0].productionClass;
  703. formData.model = data[0].fatherModel;
  704. formData.maker = data[0].maker;
  705. formData.exchangeRate = data[0].exchangeRateUsd;
  706. formData.currency = data[0].currency;
  707. getShipList(data[0].headId, 'quotation');
  708. }
  709. }
  710. //选择供应商报价单选定
  711. function SelectSupplierQuotationList() {
  712. SelectSupplierQuotationRef.value.getTable(formData, 'purOrder');
  713. }
  714. function addProject(data) {
  715. if (data.lenght == 0) {
  716. formData.projectName = '';
  717. formData.projectName = '';
  718. } else {
  719. formData.project = data[0].id;
  720. formData.projectName = data[0].code;
  721. }
  722. }
  723. //查看配件信息
  724. function viewAccessory(prop) {
  725. BaseShipArchiveAccessoriesModalRef.value.getTable(prop.row);
  726. }
  727. //产品明细-删除行
  728. function handleDelete(prop) {
  729. var xTable = purOrderFormShipFormProductTableRef.value!.getXTable();
  730. var newArray = [...xTable.data];
  731. newArray.splice(prop.rowIndex, 1);
  732. purOrderFormShipFormProductTable.dataSource = newArray;
  733. if (purOrderFormShipFormProductTable.dataSource.length !== 0) {
  734. var arrQuo = [],
  735. arrCon = [];
  736. purOrderFormShipFormProductTable.dataSource.map((item) => {
  737. var sign = '';
  738. sign = item.sourceType ? item.sourceType.substring(0, 3) : '';
  739. if (item.sourceType && sign == 'Quo') {
  740. arrQuo.push(item.sourceType);
  741. } else if (item.sourceType && sign == 'Con') {
  742. arrCon.push(item.sourceType);
  743. }
  744. });
  745. if (arrQuo.length == 0 && arrCon.length == 0) {
  746. formData.sourceCode2 = '';
  747. formData.sourceCode = '';
  748. notAllowEdit.value = false;
  749. } else if (arrQuo.length == 0) {
  750. formData.sourceCode = '';
  751. } else if (arrCon.length == 0) {
  752. formData.sourceCode2 = '';
  753. }
  754. } else {
  755. notAllowEdit.value = false;
  756. formData.sourceCode2 = '';
  757. formData.sourceCode = '';
  758. }
  759. }
  760. // 选择销售订单
  761. function selectSaleOrderList() {
  762. SelectSaleOrderModalRef.value.getTable(formData, 'purOrder');
  763. }
  764. function selectVirtualProducts() {
  765. SelectPrpductModalRef.value.getTableVirtual();
  766. }
  767. function changeValues(prop) {
  768. if (prop.col.key == 'quantity') {
  769. if (prop.row.quantity==0||prop.row.quantity) {
  770. var num = prop.row.quantity * Number(prop.row.taxPrice);
  771. prop.row.taxAmount = isNaN(num) ? '' : num.toFixed(2);
  772. purOrderFormShipFormProductTable.dataSource[prop.rowIndex].taxAmount = Number(prop.row.taxAmount);
  773. }
  774. }
  775. if (prop.col.key == 'taxPrice') {
  776. if (prop.row.taxPrice) {
  777. var num = prop.row.quantity * Number(prop.row.taxPrice);
  778. prop.row.taxAmount = isNaN(num) ? '' : num.toFixed(2);
  779. purOrderFormShipFormProductTable.dataSource[prop.rowIndex].taxAmount = Number(prop.row.taxAmount);
  780. }
  781. }
  782. }
  783. /**
  784. * 值改变事件触发-树控件回调
  785. * @param key
  786. * @param value
  787. */
  788. function handleFormChange(key, value) {
  789. formData[key] = value;
  790. }
  791. // 折扣改变
  792. const discountHeadChange = (event) => {
  793. if (formData.totalAmount) {
  794. getDiscountAmount();
  795. }
  796. };
  797. // 计算折扣金额
  798. const getDiscountAmount = () => {
  799. formData.discountAmount = Number((formData.totalAmount * (1 - formData.discountHead / 100)).toFixed(2));
  800. };
  801. // 监听 count 的变化
  802. watch(
  803. purOrderFormShipFormProductTable,
  804. (newValue, oldValue) => {
  805. let data = newValue.dataSource;
  806. let total = 0;
  807. data.map((item) => {
  808. total += item.taxAmount;
  809. });
  810. formData.totalAmount = total;
  811. getDiscountAmount();
  812. if (data.length < 1) {
  813. formData.discountHead = 0;
  814. formData.discountAmount = '';
  815. }
  816. },
  817. { deep: true }
  818. );
  819. return {
  820. discountHeadChange,
  821. PurOrderFormShipFormShipTableRef,
  822. PurOrderFormShipFormShipTable,
  823. purOrderFormShipFormProductTableRef,
  824. purOrderFormShipFormProductTable,
  825. SelectSaleOrderModalRef,
  826. SelectSupplierQuotationRef,
  827. validatorRules,
  828. validateInfos,
  829. activeKey,
  830. loading,
  831. formData,
  832. setFieldsValue,
  833. handleFormChange,
  834. formItemLayout,
  835. disabled,
  836. getFormData,
  837. submitForm,
  838. add,
  839. edit,
  840. copy,
  841. formRef,
  842. SelectPrpductModalRef,
  843. addProduct,
  844. onSearchProject,
  845. SelectProjectModalRef,
  846. addProject,
  847. handleDelete,
  848. BaseShipArchiveAccessoriesModalRef,
  849. viewAccessory,
  850. VersionDetail,
  851. notAllowEdit,
  852. selectSaleOrderList,
  853. addFormSaleOrder,
  854. ClassList,
  855. supplierOption,
  856. selectVirtualProducts,
  857. changeValues,
  858. SelectSupplierQuotationList,
  859. addFromQuotation,
  860. };
  861. },
  862. });
  863. </script>
  864. <style lang="less" scoped>
  865. /** 时间和数字输入框样式 */
  866. :deep(.ant-input-number) {
  867. width: 100%;
  868. }
  869. :deep(.ant-calendar-picker) {
  870. width: 100%;
  871. }
  872. // /deep/.vxe-table--body-wrapper{
  873. // height: 100% !important;
  874. // }
  875. /deep/.ant-modal-body {
  876. padding: 24px !important;
  877. }
  878. /deep/.ant-form-item {
  879. margin-bottom: 8px !important;
  880. }
  881. /deep/.vxe-cell--valid-error-msg {
  882. color: white !important;
  883. background-color: white !important;
  884. }
  885. </style>