deliveryNoticeForm.vue 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806
  1. <template>
  2. <a-spin :spinning="loading">
  3. <JFormContainer :disabled="disabled">
  4. <template #detail>
  5. <a-form v-bind="formItemLayout" name="quotationFormForm" ref="formRef">
  6. <a-row>
  7. <a-col :span="12">
  8. <a-form-item
  9. label="发货通知单号(bill code)"
  10. v-bind="validateInfos.billCode"
  11. id="quotationFormForm-billCode"
  12. name="billCode"
  13. :labelCol="formItemLayout.labelCol1"
  14. :wrapperCol="formItemLayout.wrapperCol1"
  15. >
  16. <a-input v-model:value="formData.billCode" placeholder="自动生成" disabled />
  17. </a-form-item>
  18. </a-col>
  19. <a-col :span="12">
  20. <a-form-item
  21. label="发货日期(delivery date)"
  22. v-bind="validateInfos.deliveryDate"
  23. id="quotationFormForm-deliveryDate"
  24. name="deliveryDate"
  25. >
  26. <a-date-picker
  27. placeholder="请选择发货日期(delivery date)"
  28. v-model:value="formData.deliveryDate"
  29. value-format="YYYY-MM-DD"
  30. style="width: 100%"
  31. allow-clear
  32. />
  33. </a-form-item>
  34. </a-col>
  35. <a-col :span="12">
  36. <a-form-item label="项目(project)" v-bind="validateInfos.projectName" id="quotationFormForm-projectName" name="projectName">
  37. <a-input-search
  38. v-model:value="formData.projectName"
  39. placeholder="请输入项目(project)"
  40. readonly
  41. allow-clear
  42. enter-button="Search"
  43. :disabled="notAllowEdit"
  44. @search="onSearchProject"
  45. />
  46. </a-form-item>
  47. </a-col>
  48. <a-col :span="12">
  49. <a-form-item
  50. label="客户(customer)"
  51. v-bind="validateInfos.customer"
  52. id="quotationFormForm-customer"
  53. name="customer"
  54. :labelCol="formItemLayout.labelCol1"
  55. :wrapperCol="formItemLayout.wrapperCol1"
  56. >
  57. <JSelectInput v-model:value="formData.customer" placeholder="请选择" :options="customerOption" disabled />
  58. </a-form-item>
  59. </a-col>
  60. <a-col :span="12">
  61. <a-form-item label="优先级(priority)" v-bind="validateInfos.priority" id="quotationFormForm-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="quotationFormForm-productionClass"
  70. name="productionClass"
  71. :labelCol="formItemLayout.labelCol1"
  72. :wrapperCol="formItemLayout.wrapperCol1"
  73. >
  74. <JSelectInput v-model:value="formData.productionClass" placeholder="请选择" :options="classOption" disabled />
  75. </a-form-item>
  76. </a-col>
  77. <a-col :span="12">
  78. <a-form-item label="机型(model)" v-bind="validateInfos.model" id="quotationFormForm-model" name="model">
  79. <JSelectMultiple v-model:value="formData.model" placeholder="请选择" dictCode="model_typer" disabled />
  80. </a-form-item>
  81. </a-col>
  82. <a-col :span="12">
  83. <a-form-item
  84. label="厂家(maker)"
  85. v-bind="validateInfos.maker"
  86. id="quotationFormForm-maker"
  87. name="maker"
  88. :labelCol="formItemLayout.labelCol1"
  89. :wrapperCol="formItemLayout.wrapperCol1"
  90. >
  91. <a-input v-model:value="formData.maker" placeholder="请输入厂家(maker)" allow-clear disabled />
  92. </a-form-item>
  93. </a-col>
  94. <a-col :span="12">
  95. <a-form-item label="币种(currency)" v-bind="validateInfos.currency" id="quotationFormForm-currency" name="currency">
  96. <JDictSelectTag v-model:value="formData.currency" placeholder="请选择" dictCode="currency" disabled />
  97. </a-form-item>
  98. </a-col>
  99. <a-col :span="12">
  100. <a-form-item
  101. label="交货条款(delivery terms)"
  102. v-bind="validateInfos.deliveryTerms"
  103. id="quotationFormForm-deliveryTerms"
  104. name="deliveryTerms"
  105. :labelCol="formItemLayout.labelCol1"
  106. :wrapperCol="formItemLayout.wrapperCol1"
  107. >
  108. <JDictSelectTag v-model:value="formData.deliveryTerms" placeholder="请选择" dictCode="delivery_terms" disabled />
  109. </a-form-item>
  110. </a-col>
  111. <a-col :span="12">
  112. <a-form-item label="发货方式(delivery)" v-bind="validateInfos.delivery" id="SaleOrderForm-delivery" name="delivery">
  113. <JDictSelectTag v-model:value="formData.delivery" placeholder="请选择" dictCode="delivery_methods" disabled />
  114. </a-form-item>
  115. </a-col>
  116. <a-col :span="12">
  117. <a-form-item
  118. label="交货地点(place of delivery)"
  119. v-bind="validateInfos.deliveryAddress"
  120. id="quotationFormForm-deliveryAddress"
  121. name="deliveryAddress"
  122. >
  123. <a-input v-model:value="formData.deliveryAddress" placeholder="请输入交货地点(place of delivery)" allow-clear AutoComplete="off" />
  124. </a-form-item>
  125. </a-col>
  126. <a-col :span="12">
  127. <a-form-item
  128. label="是否出口(isExport)"
  129. v-bind="validateInfos.isExport"
  130. id="quotationFormForm-isExport"
  131. name="isExport"
  132. :labelCol="formItemLayout.labelCol1"
  133. :wrapperCol="formItemLayout.wrapperCol1"
  134. >
  135. <JDictSelectTag v-model:value="formData.isExport" placeholder="请选择" dictCode="yes_or_no" />
  136. </a-form-item>
  137. </a-col>
  138. <a-col :span="12">
  139. <a-form-item
  140. label="质保期(warranty period)"
  141. v-bind="validateInfos.warrantyPeriod"
  142. id="SaleOrderForm-warrantyPeriod"
  143. name="warrantyPeriod"
  144. >
  145. <a-input
  146. v-model:value="formData.warrantyPeriod"
  147. placeholder="请输入"
  148. style="width: 85%; margin-right: 1%"
  149. AutoComplete="off"
  150. />月(month)
  151. </a-form-item>
  152. </a-col>
  153. <a-col :span="12">
  154. <a-form-item
  155. label="销售部门(sale department)"
  156. v-bind="validateInfos.saleDepartment"
  157. id="SaleInquiryFormForm-saleDepartment"
  158. name="saleDepartment"
  159. >
  160. <a-input v-model:value="formData.saleDepartmentName" placeholder="" allow-clear disabled />
  161. </a-form-item>
  162. </a-col>
  163. <a-col :span="12" v-if="1 == 0">
  164. <a-form-item
  165. label="联系人(linkMan)"
  166. v-bind="validateInfos.linkMan"
  167. id="quotationFormForm-linkMan"
  168. name="linkMan"
  169. :labelCol="formItemLayout.labelCol1"
  170. :wrapperCol="formItemLayout.wrapperCol1"
  171. >
  172. <a-input v-model:value="formData.linkMan" placeholder="请输入联系人(linkMan)" allow-clear AutoComplete="off" />
  173. </a-form-item>
  174. </a-col>
  175. <a-col :span="12">
  176. <a-form-item
  177. label="包装要求(packaging requirement)"
  178. v-bind="validateInfos.packagingRequirement"
  179. id="quotationFormForm-packagebRequirement"
  180. name="packagebRequirement"
  181. :labelCol="formItemLayout.labelCol1"
  182. :wrapperCol="formItemLayout.wrapperCol1"
  183. >
  184. <a-input
  185. v-model:value="formData.packagebRequirement"
  186. placeholder="请输入包装要求(packaging requirement)"
  187. allow-clear
  188. AutoComplete="off"
  189. />
  190. </a-form-item>
  191. </a-col>
  192. <a-col :span="12" v-if="1 == 0">
  193. <a-form-item label="联系电话(linkMan phone)" v-bind="validateInfos.linkNumber" id="quotationFormForm-linkNumber" name="linkNumber">
  194. <a-input v-model:value="formData.linkNumber" placeholder="" allow-clear AutoComplete="off" />
  195. </a-form-item>
  196. </a-col>
  197. <a-col :span="12">
  198. <a-form-item label="业务员(salesman)" v-bind="validateInfos.salesman" id="quotationFormForm-salesman" name="salesman">
  199. <a-input v-model:value="formData.salesmanName" placeholder="" allow-clear disabled />
  200. </a-form-item>
  201. </a-col>
  202. <a-col :span="12">
  203. <a-form-item
  204. label="F号(F number)"
  205. v-bind="validateInfos.fnumber"
  206. id="quotationFormForm-fnumber"
  207. name="fnumber"
  208. :labelCol="formItemLayout.labelCol1"
  209. :wrapperCol="formItemLayout.wrapperCol1"
  210. >
  211. <a-input v-model:value="formData.fnumber" placeholder="请选择" AutoComplete="off" />
  212. </a-form-item>
  213. </a-col>
  214. <a-col :span="12">
  215. <a-form-item label="提单号(B/L NO)" v-bind="validateInfos.blno" id="quotationFormForm-blno" name="blno">
  216. <a-input v-model:value="formData.blno" placeholder="请输入" allow-clear AutoComplete="off" />
  217. </a-form-item>
  218. </a-col>
  219. <a-col :span="12">
  220. <a-form-item
  221. label="开票抬头(invoice header)"
  222. v-bind="validateInfos.invoiceHeader"
  223. id="SaleOrderForm-invoiceHeader"
  224. name="invoiceHeader"
  225. :labelCol="formItemLayout.labelCol1"
  226. :wrapperCol="formItemLayout.wrapperCol1"
  227. >
  228. <a-textarea v-model:value="formData.invoiceHeader" placeholder="" allow-clear AutoComplete="off" :rows="3" />
  229. </a-form-item>
  230. </a-col>
  231. <a-col :span="12">
  232. <a-form-item
  233. label="是否有第三方运费(otherFee)"
  234. v-bind="validateInfos.otherFee"
  235. id="SaleOrderForm-otherFee"
  236. name="otherFee"
  237. :labelCol="formItemLayout.labelCol1"
  238. :wrapperCol="formItemLayout.wrapperCol1"
  239. >
  240. <a-select v-model:value="formData.otherFee">
  241. <a-select-option value="是"> 是 </a-select-option>
  242. <a-select-option value="否"> 否 </a-select-option>
  243. </a-select>
  244. </a-form-item>
  245. </a-col>
  246. <a-col :span="12">
  247. <a-form-item
  248. label="是否收取客户运费(Customer shipping fee)"
  249. v-bind="validateInfos.customerFee"
  250. id="SaleOrderForm-customerFee"
  251. name="customerFee"
  252. :labelCol="formItemLayout.labelCol1"
  253. :wrapperCol="formItemLayout.wrapperCol1"
  254. >
  255. <a-select v-model:value="formData.customerFee">
  256. <a-select-option value="是"> 是 </a-select-option>
  257. <a-select-option value="否"> 否 </a-select-option>
  258. </a-select>
  259. </a-form-item>
  260. </a-col>
  261. <a-col :span="12">
  262. <a-form-item label="收货地址(address)" v-bind="validateInfos.address" id="quotationFormForm-address" name="address">
  263. <a-textarea v-model:value="formData.address" placeholder="" allow-clear AutoComplete="off" :rows="3" />
  264. </a-form-item>
  265. </a-col>
  266. <a-col :span="12">
  267. <a-form-item
  268. label="包装详情(packingDetails))"
  269. v-bind="validateInfos.packingDetails"
  270. id="SaleOrderForm-packingDetails "
  271. name="packingDetails "
  272. >
  273. <a-textarea v-model:value="formData.packingDetails" placeholder="请输入" AutoComplete="off" :rows="3" />
  274. </a-form-item>
  275. </a-col>
  276. <a-col :span="12">
  277. <a-form-item label="备注(notes)" v-bind="validateInfos.notes" id="quotationFormForm-notes" name="notes">
  278. <a-textarea v-model:value="formData.notes" placeholder="请输入备注(notes)" allow-clear AutoComplete="off" :rows="3" />
  279. </a-form-item>
  280. </a-col>
  281. </a-row>
  282. <a-row />
  283. </a-form>
  284. </template>
  285. </JFormContainer>
  286. <!-- 子表单区域 -->
  287. <a-tabs v-model:activeKey="activeKey" animated style="padding: 24px; padding-top: 0px">
  288. <a-tab-pane tab="发货通知单 - 发货明细(delivery details)" key="deliveryDetailFormProduct" :forceRender="true">
  289. <a-button type="primary" @click="selectSaleOrderList" style="margin-right: 1%; margin-bottom: 1%" :disabled="disabled">
  290. 选择销售订单(selete saleOrder)</a-button
  291. >
  292. <a-button type="primary" style="margin-right: 1%; margin-bottom: 1%" @click="selectVirtualProducts" :disabled="disabled">
  293. 选择虚拟产品(select virtual products)</a-button
  294. >
  295. <j-vxe-table
  296. :keep-source="true"
  297. resizable
  298. ref="deliveryDetailFormProductTableRef"
  299. :loading="deliveryDetailFormProductTable.loading"
  300. :columns="deliveryDetailFormProductTable.columns"
  301. :dataSource="deliveryDetailFormProductTable.dataSource"
  302. :disabled="disabled"
  303. :rowNumber="true"
  304. :rowSelection="true"
  305. asyncRemove
  306. @value-change="changeValues"
  307. >
  308. <template #action="props">
  309. <a-popconfirm title="确定删除吗?" @confirm="handleDelete1(props)" v-if="!disabled">
  310. <a>删除(delete)</a>
  311. </a-popconfirm>
  312. </template>
  313. </j-vxe-table>
  314. </a-tab-pane>
  315. <a-tab-pane tab="发货通知单 - 船明细(ship details)" key="deliveryNoticeFormShip" :forceRender="true">
  316. <j-vxe-table
  317. :keep-source="true"
  318. resizable
  319. ref="deliveryNoticeFormShipTableRef"
  320. :loading="deliveryNoticeFormShipTable.loading"
  321. :columns="deliveryNoticeFormShipTable.columns"
  322. :dataSource="deliveryNoticeFormShipTable.dataSource"
  323. :disabled="disabled"
  324. :rowNumber="true"
  325. :rowSelection="true"
  326. >
  327. <template #action="props">
  328. <a @click="viewAccessory(props)">查看配件信息(view accessory information)</a>
  329. </template>
  330. </j-vxe-table>
  331. </a-tab-pane>
  332. </a-tabs>
  333. <BaseShipArchiveAccessoriesModal ref="BaseShipArchiveAccessoriesListRef" />
  334. <SelectProjectModal ref="SelectProjectModalRef" @select-project="addProject" />
  335. <SelectPrpductModal ref="SelectPrpductModalRef" @select-product="addProduct" />
  336. <SelectSaleOrderModal ref="SelectSaleOrderModalRef" @select-sale-order="addFormSaleOrder" />
  337. </a-spin>
  338. </template>
  339. <script lang="ts">
  340. import { defineComponent, ref, reactive, computed, toRaw, onMounted } from 'vue';
  341. import { defHttp } from '/@/utils/http/axios';
  342. import { useValidateAntFormAndTable } from '/@/hooks/system/useJvxeMethods';
  343. import {
  344. querydeliveryNoticeFormShipListByMainId,
  345. querydeliveryNoticeFormProductListByMainId,
  346. queryDataById,
  347. saveOrUpdate,
  348. } from '../delivertNoticeForm.api';
  349. import { JVxeTable } from '/@/components/jeecg/JVxeTable';
  350. import { deliveryNoticeShipColumns, deliveryNoticeProductColumns } from '../delivertNoticeForm.data';
  351. import BaseShipArchiveAccessoriesModal from '../../../publicComponents/BaseShipArchiveAccessoriesModal.vue';
  352. import SelectPrpductModal from '../../../publicComponents/SelectPrpductModal.vue';
  353. import SelectProjectModal from '../../../publicComponents/SelectProjectModal.vue';
  354. import SelectSaleOrderModal from '../../../publicComponents/SelectSaleOrderModal.vue';
  355. import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
  356. import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';
  357. import { JDictSelectTag, JSelectMultiple } from '/@/components/Form';
  358. import JSelectInput from '/@/components/Form/src/jeecg/components/JSelectInput.vue';
  359. import { Form, message } from 'ant-design-vue';
  360. import { useUserStore } from '/@/store/modules/user';
  361. import moment from 'moment';
  362. const userStore = useUserStore();
  363. const useForm = Form.useForm;
  364. export default defineComponent({
  365. name: 'DeliveryNoticeForm',
  366. components: {
  367. JVxeTable,
  368. JFormContainer,
  369. BaseShipArchiveAccessoriesModal,
  370. SelectPrpductModal,
  371. JUpload,
  372. SelectProjectModal,
  373. JDictSelectTag,
  374. JSelectInput,
  375. JSelectMultiple,
  376. SelectSaleOrderModal,
  377. },
  378. props: {
  379. formDisabled: {
  380. type: Boolean,
  381. default: false,
  382. },
  383. formData: { type: Object, default: () => {} },
  384. formBpm: { type: Boolean, default: true },
  385. },
  386. emits: ['success'],
  387. setup(props, { emit }) {
  388. const loading = ref(false);
  389. const formRef = ref();
  390. const SelectSaleOrderModalRef = ref();
  391. const SelectPrpductModalRef = ref();
  392. var SelectProjectModalRef = ref();
  393. const deliveryNoticeFormShipTableRef = ref();
  394. const deliveryNoticeFormShipTable = reactive<Record<string, any>>({
  395. loading: false,
  396. columns: deliveryNoticeShipColumns,
  397. dataSource: [],
  398. });
  399. const deliveryDetailFormProductTableRef = ref();
  400. const deliveryDetailFormProductTable = reactive<Record<string, any>>({
  401. loading: false,
  402. columns: deliveryNoticeProductColumns,
  403. dataSource: [],
  404. });
  405. var SelectShipSModalRef = ref();
  406. var BaseShipArchiveAccessoriesListRef = ref();
  407. const activeKey = ref('deliveryDetailFormProduct');
  408. var notAllowEdit = ref(false);
  409. var classOption = ref([]);
  410. var customerOption = ref([]);
  411. const formData = reactive<Record<string, any>>({
  412. id: '',
  413. status: undefined,
  414. delFlag: undefined,
  415. sourceCode: '',
  416. deliveryDate: moment(new Date()).format('YYYY-MM-DD'),
  417. billCode: '',
  418. project: '',
  419. projectName: '',
  420. customer: '',
  421. customerName: '',
  422. priority: '',
  423. productionClass: '',
  424. model: '',
  425. maker: '',
  426. currency: '',
  427. deliveryTerms: '',
  428. delivery: '',
  429. deliveryAddress: '',
  430. isExport: '',
  431. warrantyPeriod: '',
  432. saleDepartment: '',
  433. saleDepartmentName: '',
  434. packagebRequirement: '',
  435. linkMan: '',
  436. address: '',
  437. linkNumber: '',
  438. salesman: '',
  439. salesmanName: '',
  440. fnumber: '',
  441. blno: '',
  442. notes: '',
  443. invoiceHeader: '',
  444. otherFee: '',
  445. packingDetails: '',
  446. customerFee: '',
  447. });
  448. //表单验证
  449. const validatorRules = reactive({
  450. projectName: [{ required: true, message: '请选择项目(select project)' }],
  451. customerFee: [{ required: true, message: '请选择是否收取客户运费(Customer shipping fee)' }],
  452. });
  453. const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
  454. const dbData = {};
  455. const formItemLayout = {
  456. labelCol: { xs: { span: 24 }, sm: { span: 8 } },
  457. wrapperCol: { xs: { span: 24 }, sm: { span: 13 } },
  458. labelCol1: { xs: { span: 24 }, sm: { span: 8 } },
  459. wrapperCol1: { xs: { span: 24 }, sm: { span: 13 } },
  460. };
  461. // 表单禁用
  462. const disabled = computed(() => {
  463. if (props.formBpm === true) {
  464. if (props.formData.disabled === false) {
  465. return false;
  466. } else {
  467. return true;
  468. }
  469. }
  470. return props.formDisabled;
  471. });
  472. //新增方法
  473. function add() {
  474. resetFields();
  475. deliveryNoticeFormShipTable.dataSource = [];
  476. deliveryDetailFormProductTable.dataSource = [];
  477. activeKey.value = 'deliveryDetailFormProduct';
  478. getOptiom();
  479. getCustomerOptions();
  480. formData.salesman = userStore.getUserInfo.username;
  481. formData.salesmanName = userStore.getUserInfo.realname;
  482. formData.saleDepartment = userStore.getUserInfo.orgCode;
  483. formData.saleDepartmentName = userStore.getUserInfo.orgName;
  484. notAllowEdit.value = false;
  485. }
  486. //编辑方法
  487. async function edit(row) {
  488. //主表数据
  489. await queryMainData(row.id);
  490. //子表数据
  491. const deliveryNoticeFormShipDataList = await querydeliveryNoticeFormShipListByMainId(row['id']);
  492. deliveryNoticeFormShipTable.dataSource = [...deliveryNoticeFormShipDataList];
  493. const deliveryDetailFormProductDataList = await querydeliveryNoticeFormProductListByMainId(row['id']);
  494. deliveryDetailFormProductTable.dataSource = [...deliveryDetailFormProductDataList];
  495. getOptiom();
  496. getCustomerOptions();
  497. notAllowEdit.value = true;
  498. }
  499. //获取主表
  500. async function queryMainData(id) {
  501. const row = await queryDataById(id);
  502. resetFields();
  503. const tmpData = {};
  504. Object.keys(formData).forEach((key) => {
  505. if (row.hasOwnProperty(key)) {
  506. tmpData[key] = row[key];
  507. }
  508. });
  509. //赋值
  510. Object.assign(formData, tmpData);
  511. }
  512. const { getSubFormAndTableData, transformData } = useValidateAntFormAndTable(activeKey, {
  513. saleDeliveryShip: deliveryNoticeFormShipTableRef,
  514. saleDeliveryDetails: deliveryDetailFormProductTableRef,
  515. });
  516. //获取表单信息
  517. async function getFormData() {
  518. try {
  519. // 触发表单验证
  520. await validate();
  521. } catch ({ errorFields }) {
  522. if (errorFields) {
  523. const firstField = errorFields[0];
  524. if (firstField) {
  525. formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
  526. }
  527. }
  528. return Promise.reject(errorFields);
  529. }
  530. return transformData(toRaw(formData));
  531. }
  532. //保存
  533. async function submitForm() {
  534. if (formData.sourceCode == '') {
  535. message.warning('请添加产品明细');
  536. } else {
  537. deliveryDetailFormProductTableRef.value!.validateTable().then(async (errMap) => {
  538. if (errMap) {
  539. console.log('表单验证未通过:', { errMap });
  540. } else {
  541. const mainData = await getFormData();
  542. const subData = await getSubFormAndTableData();
  543. var judge = false;
  544. if (mainData.customerFee == '是') {
  545. judge = subData.saleDeliveryDetailsList.every((item) => item.sourceId && item.sourceId !== undefined && item.sourceId !== '');
  546. } else {
  547. judge = false;
  548. }
  549. if (!judge) {
  550. const values = Object.assign({}, dbData, mainData, subData);
  551. console.log('表单提交数据', values);
  552. const isUpdate = values.id ? true : false;
  553. await saveOrUpdate(values, isUpdate);
  554. //关闭弹窗
  555. emit('success');
  556. } else {
  557. message.warning('收取客户运费时,必须选择虚拟产品');
  558. }
  559. }
  560. });
  561. }
  562. }
  563. function setFieldsValue(values) {
  564. if (values) {
  565. Object.keys(values).map((k) => {
  566. formData[k] = values[k];
  567. });
  568. }
  569. }
  570. /**
  571. * 值改变事件触发-树控件回调
  572. * @param key
  573. * @param value
  574. */
  575. function handleFormChange(key, value) {
  576. formData[key] = value;
  577. }
  578. //产品明细-删除行
  579. async function handleDelete1(prop) {
  580. var xTable = deliveryDetailFormProductTableRef.value!.getXTable();
  581. var newArray = [...xTable.data];
  582. newArray.splice(prop.rowIndex, 1);
  583. deliveryDetailFormProductTable.dataSource = newArray;
  584. if (deliveryDetailFormProductTable.dataSource.length !== 0) {
  585. notAllowEdit.value = true;
  586. } else {
  587. formData.sourceCode = '';
  588. notAllowEdit.value = false;
  589. add();
  590. }
  591. }
  592. //选择项目
  593. function addProject(data) {
  594. if (data.length == 0) {
  595. formData.project = formData.projectName = '';
  596. } else {
  597. formData.project = data[0].id;
  598. formData.projectName = data[0].code;
  599. formData.customer = data[0].customerId;
  600. formData.customerName = data[0].customerId_dictText;
  601. customerOption.value.map((item) => {
  602. if (item.value == data[0].customerId) {
  603. formData.priority = item.priority;
  604. }
  605. });
  606. }
  607. }
  608. //获取客户列表
  609. function getCustomerOptions() {
  610. let params = { pageSize: '-1', status: 1 };
  611. defHttp.get({ url: '/cuspCode/cuspCustomerProfile/list', params }, { isTransformResponse: false }).then((res) => {
  612. if (res) {
  613. customerOption.value = [];
  614. res.result.records.forEach((item) => {
  615. customerOption.value.push({
  616. label: item.name,
  617. value: item.id,
  618. priority: item.priority,
  619. intermediatorCommission: item.intermediatorCommission,
  620. });
  621. });
  622. }
  623. });
  624. }
  625. //查看配件信息
  626. function viewAccessory(prop) {
  627. BaseShipArchiveAccessoriesListRef.value.getTable(prop.row);
  628. }
  629. //选择项目
  630. function onSearchProject() {
  631. SelectProjectModalRef.value.getTable();
  632. }
  633. //获取产品分类下拉框
  634. function getOptiom() {
  635. defHttp
  636. .get({ url: 'baseCode/baseProductClass/list' }, { isTransformResponse: false })
  637. .then((res) => {
  638. if (res.success) {
  639. classOption.value = [];
  640. res.result.records.forEach((element) => {
  641. var obj = {
  642. label: element.name ? element.name : '无名称请维护',
  643. value: element.id ? element.id : '',
  644. };
  645. classOption.value.push(obj);
  646. });
  647. }
  648. })
  649. .finally(() => {
  650. // loading.value = false;
  651. });
  652. }
  653. // 选择销售订单
  654. function selectSaleOrderList() {
  655. var obj = formData;
  656. obj.sourceCode2 = formData.sourceCode;
  657. SelectSaleOrderModalRef.value.getTable(obj, 'delivery');
  658. }
  659. function addFormSaleOrder(data) {
  660. data.map((item) => {
  661. item.model = item.childModel;
  662. item.sourceId = item.childId;
  663. item.orderQuantity = item.quantity;
  664. item.orderMoney = item.discountedAmount;
  665. item.money = item.discountedAmount;
  666. item.taxPrice = item.discountedPrice;
  667. });
  668. var xTable = deliveryDetailFormProductTableRef.value!.getXTable(); //关键代码 如果不更新 重新加载表格即可
  669. var arrProduct = xTable.data.concat(data);
  670. deliveryDetailFormProductTable.dataSource = arrProduct;
  671. notAllowEdit.value = true;
  672. formData.packagebRequirement = data[0].packagebRequirement;
  673. formData.sourceCode = data[0].billCode;
  674. formData.project = data[0].project;
  675. formData.projectName = data[0].projectName;
  676. formData.customerName = data[0].customerName;
  677. formData.customer = data[0].customer;
  678. formData.priority = data[0].priority;
  679. formData.productionClass = data[0].productionClass;
  680. formData.model = data[0].headModel;
  681. formData.maker = data[0].maker;
  682. formData.currency = data[0].currency;
  683. formData.deliveryTerms = data[0].deliveryTerms;
  684. formData.delivery = data[0].delivery;
  685. formData.invoiceHeader = data[0].invoiceHeader;
  686. formData.invoiceAddress = data[0].invoiceAddress;
  687. formData.deliveryAddress = data[0].deliveryAddress;
  688. formData.isExport = data[0].isExport;
  689. formData.packagebRequirement = data[0].packagebRequirement;
  690. formData.warrantyPeriod = data[0].warrantyPeriod;
  691. formData.invoiceHeader = data[0].invoiceHeader;
  692. getShipList(data[0].headId);
  693. }
  694. function getShipList(id) {
  695. let params = { id: id };
  696. let url = '/saleCode/saleOrder/querySaleOrderShipByMainId';
  697. defHttp.get({ url: url, params }, { isTransformResponse: false }).then((res) => {
  698. if (res) {
  699. deliveryNoticeFormShipTable.dataSource = res.result;
  700. }
  701. });
  702. }
  703. function changeValues(prop) {
  704. if (prop.col.key == 'quantity') {
  705. if (prop.row.quantity == 0 || prop.row.quantity) {
  706. var num = prop.row.quantity * Number(prop.row.taxPrice);
  707. prop.row.money = isNaN(num) ? '' : num.toFixed(2);
  708. }
  709. }
  710. if (prop.col.key == 'taxPrice') {
  711. if (prop.row.taxPrice == 0 || prop.row.taxPrice) {
  712. var num = prop.row.quantity * Number(prop.row.taxPrice);
  713. prop.row.money = isNaN(num) ? '' : num.toFixed(2);
  714. }
  715. }
  716. }
  717. function selectVirtualProducts() {
  718. SelectPrpductModalRef.value.getTableVirtual();
  719. }
  720. function addProduct(data) {
  721. data.map((item) => {
  722. item.productClass = item.classId_dictText;
  723. item.productCode = item.code;
  724. item.productId = item.id;
  725. item.notes = '';
  726. item.id = undefined;
  727. });
  728. var xTable = deliveryDetailFormProductTableRef.value!.getXTable(); //关键代码 如果不更新 重新加载表格即可
  729. var arrProduct = xTable.data.concat(data);
  730. deliveryDetailFormProductTable.dataSource = arrProduct;
  731. }
  732. return {
  733. deliveryNoticeFormShipTableRef,
  734. deliveryNoticeFormShipTable,
  735. deliveryDetailFormProductTableRef,
  736. deliveryDetailFormProductTable,
  737. validatorRules,
  738. validateInfos,
  739. activeKey,
  740. loading,
  741. formData,
  742. setFieldsValue,
  743. handleFormChange,
  744. formItemLayout,
  745. disabled,
  746. getFormData,
  747. submitForm,
  748. SelectShipSModalRef,
  749. add,
  750. edit,
  751. formRef,
  752. BaseShipArchiveAccessoriesListRef,
  753. viewAccessory,
  754. handleDelete1,
  755. SelectProjectModalRef,
  756. onSearchProject,
  757. addProject,
  758. getOptiom,
  759. classOption,
  760. getCustomerOptions,
  761. customerOption,
  762. notAllowEdit,
  763. selectSaleOrderList,
  764. SelectSaleOrderModalRef,
  765. addFormSaleOrder,
  766. changeValues,
  767. selectVirtualProducts,
  768. SelectPrpductModalRef,
  769. addProduct,
  770. };
  771. },
  772. });
  773. </script>
  774. <style lang="less" scoped>
  775. /** 时间和数字输入框样式 */
  776. :deep(.ant-input-number) {
  777. width: 100%;
  778. }
  779. :deep(.ant-calendar-picker) {
  780. width: 100%;
  781. }
  782. /deep/.vxe-table--body-wrapper {
  783. height: 100% !important;
  784. }
  785. /deep/.ant-modal-body {
  786. padding: 24px !important;
  787. }
  788. /deep/.ant-form-item {
  789. margin-bottom: 8px !important;
  790. }
  791. /deep/.vxe-cell--valid-error-msg {
  792. color: white !important;
  793. background-color: white !important;
  794. }
  795. </style>