SlaeOrderFormForm.vue 40 KB

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