addInvoiceDialog.vue 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185
  1. <template>
  2. <ele-modal
  3. custom-class="ele-dialog-form long-dialog-form"
  4. :centered="true"
  5. v-if="visible"
  6. :visible.sync="visible"
  7. :title="title"
  8. :close-on-click-modal="false"
  9. :append-to-body="true"
  10. width="70%"
  11. :maxable="true"
  12. :resizable="true"
  13. @close="cancel"
  14. >
  15. <el-form
  16. ref="form"
  17. :model="form"
  18. :rules="rules"
  19. class="el-form-box"
  20. label-width="120px"
  21. >
  22. <headerTitle title="发货信息"></headerTitle>
  23. <el-row :gutter="12">
  24. <el-col :span="12">
  25. <el-form-item label="销售订单" prop="orderNo">
  26. <el-input
  27. clearable
  28. v-model="form.orderNo"
  29. @click.native="handleOrderBtn"
  30. placeholder="请输入"
  31. :disabled="!!saleOrderData.id"
  32. />
  33. </el-form-item>
  34. </el-col>
  35. <el-col :span="12">
  36. <el-form-item label="受托收货单">
  37. <el-input
  38. clearable
  39. :disabled="!!saleOrderData.id"
  40. v-model="form.entrustedCode"
  41. @click.native="handleEntrustedReceive"
  42. placeholder="请输入"
  43. />
  44. </el-form-item>
  45. </el-col>
  46. </el-row>
  47. <el-row :gutter="12">
  48. <el-col :span="12">
  49. <el-form-item label="退货单">
  50. <el-input
  51. clearable
  52. :disabled="!!saleOrderData.id"
  53. v-model="form.sourceNo"
  54. @click.native="handleReturnGoodsBtn"
  55. placeholder="请输入"
  56. />
  57. </el-form-item>
  58. </el-col>
  59. <el-col :span="12">
  60. <el-form-item label="客户名称" prop="contactName">
  61. <el-input v-model="form.contactName" disabled></el-input>
  62. </el-form-item>
  63. </el-col>
  64. </el-row>
  65. <el-row :gutter="12">
  66. <el-col :span="12">
  67. <el-form-item label="客户联系人" prop="linkName">
  68. <el-input clearable v-model="form.linkName" placeholder="请输入" />
  69. </el-form-item>
  70. </el-col>
  71. <el-col :span="12">
  72. <el-form-item label="客户电话" prop="linkPhone">
  73. <el-input clearable v-model="form.linkPhone" placeholder="请输入" />
  74. </el-form-item>
  75. </el-col>
  76. <el-col :span="12">
  77. <el-form-item label="收货地址" prop="receiveAddress">
  78. <el-input
  79. clearable
  80. v-model="form.receiveAddress"
  81. placeholder="请输入"
  82. />
  83. </el-form-item>
  84. </el-col>
  85. <el-col :span="12">
  86. <el-form-item label="项目名称" prop="projectName">
  87. <el-input clearable v-model="form.projectName" :disabled="true" />
  88. </el-form-item>
  89. </el-col>
  90. <el-col :span="12">
  91. <el-form-item label="车牌号" prop="carNo">
  92. <el-select
  93. v-model="form.carNo"
  94. style="width: 100%"
  95. clearable
  96. multiple
  97. filterable
  98. allow-create
  99. default-first-option
  100. >
  101. <el-option
  102. :label="item.trakNumber"
  103. :value="item.trakNumber"
  104. v-for="(item, index) in carList"
  105. :key="index"
  106. ></el-option>
  107. </el-select>
  108. </el-form-item>
  109. </el-col>
  110. <el-col :span="12">
  111. <el-form-item label="托盘数" prop="trayNum">
  112. <el-input clearable v-model="form.trayNum" />
  113. </el-form-item>
  114. </el-col>
  115. <el-col :span="12">
  116. <el-form-item label="打印编码" prop="printNo">
  117. <el-input clearable v-model="form.printNo" />
  118. </el-form-item>
  119. </el-col>
  120. <el-col :span="12" style="height: 40px">
  121. <el-form-item label="送货方式" prop="deliveryTypeId">
  122. <DictSelection
  123. dictName="送货方式"
  124. clearable
  125. v-model="form.deliveryTypeId"
  126. filterable
  127. allow-create
  128. default-first-option
  129. style="width: 100%"
  130. >
  131. </DictSelection>
  132. </el-form-item>
  133. </el-col>
  134. <el-col :span="12">
  135. <el-form-item label="回执要求" prop="receiptRequirementTypeId">
  136. <el-radio-group v-model="form.receiptRequirementTypeId">
  137. <el-radio
  138. v-for="item in receiptRequirementTypeOption"
  139. :key="item.value"
  140. :label="item.value"
  141. >{{ item.label }}</el-radio
  142. >
  143. </el-radio-group>
  144. </el-form-item>
  145. </el-col>
  146. <el-col :span="12">
  147. <el-form-item prop="sendFiles" label="发货附件">
  148. <fileMain v-model="form.sendFiles"></fileMain>
  149. </el-form-item>
  150. </el-col>
  151. <el-col :span="12">
  152. <el-form-item prop="repliedFiles" label="回执附件">
  153. <fileMain v-model="form.repliedFiles"></fileMain>
  154. </el-form-item>
  155. </el-col>
  156. <el-col :span="12">
  157. <el-form-item prop="makerName" label="制单人" v-if="form.makerName">
  158. <el-input disabled v-model="form.makerName" />
  159. </el-form-item>
  160. </el-col>
  161. <el-col :span="12">
  162. <!-- <el-form-item prop="productionRequirements" label="生产要求">
  163. <el-input
  164. clearable
  165. v-model="form.productionRequirements"
  166. placeholder=""
  167. type="textarea"
  168. disabled
  169. />
  170. </el-form-item> -->
  171. </el-col>
  172. </el-row>
  173. </el-form>
  174. <el-tabs v-model="activeName" style="margin-top: 15px" type="border-card">
  175. <el-tab-pane label="物品清单" name="first">
  176. <inventoryTable
  177. :pricingWay="form.pricingWay"
  178. :entrustedCode="form.entrustedCode"
  179. ref="inventoryTableref"
  180. :orderId="form.orderId"
  181. :orderIds="form.orderIds"
  182. :orderNos="form.orderNo"
  183. @replaceTableChange="replaceTableChange"
  184. :needProduce="saleOrderValue.needProduce"
  185. :typeIds="saleOrderValue.typedetailIds"
  186. :isTotalCount="isTotalCount"
  187. :oldProductList="oldProductList"
  188. :sourceType="form.sourceType"
  189. ></inventoryTable>
  190. </el-tab-pane>
  191. <el-tab-pane label="托盘清单" name="second">
  192. <palletTable
  193. ref="palletTableRef"
  194. @totalCountChange="totalCountChange"
  195. ></palletTable>
  196. </el-tab-pane>
  197. <el-tab-pane label="装载车叉车信息" name="third">
  198. <stowageTable ref="stowageTableRef"></stowageTable>
  199. </el-tab-pane>
  200. <el-tab-pane label="运输清单" name="fourth">
  201. <taskInfoTable
  202. ref="taskInfoTableRef"
  203. @setAddress="setAddress"
  204. ></taskInfoTable>
  205. </el-tab-pane>
  206. <el-tab-pane label="替代料" name="5">
  207. <replaceTable
  208. :pricingWay="form.pricingWay"
  209. ref="replaceRef"
  210. ></replaceTable>
  211. </el-tab-pane>
  212. </el-tabs>
  213. <div slot="footer" class="footer">
  214. <el-button type="primary" @click="save" :loading="loading" v-click-once
  215. >保存</el-button
  216. >
  217. <el-button
  218. type="primary"
  219. v-if="isNeed_process_is_close"
  220. @click="save('sub')"
  221. :loading="loading"
  222. v-click-once
  223. >提交</el-button
  224. >
  225. <el-button @click="cancel">返回</el-button>
  226. </div>
  227. <orderListDialog
  228. ref="orderListDialogRef"
  229. @changeParent="changeOrder"
  230. :contactData="contactData"
  231. :isAll="true"
  232. :isTotalCount="isTotalCount"
  233. ></orderListDialog>
  234. <!-- 受托发货单 -->
  235. <entrusted-receive-dialog
  236. :entrusted-receive-dialog-flag.sync="entrustedReceiveDialogFlag"
  237. v-if="entrustedReceiveDialogFlag"
  238. @changeParent="getInfo"
  239. ref="entrustedReceiveDialogRef"
  240. ></entrusted-receive-dialog>
  241. <process-submit-dialog
  242. :isNotNeedProcess="false"
  243. :isSpecialeSubmit="isSpecialeSubmit"
  244. :processSubmitDialogFlag.sync="processSubmitDialogFlag"
  245. v-if="processSubmitDialogFlag"
  246. ref="processSubmitDialogRef"
  247. @reload="reload"
  248. @specialesubmit="specialesubmit"
  249. ></process-submit-dialog>
  250. <!-- 退货单 -->
  251. <return-order-dialog
  252. :returnOrderDialogFlag.sync="returnOrderDialogFlag"
  253. v-if="returnOrderDialogFlag"
  254. returnSourceType=""
  255. hasHandleReceipt=""
  256. types=""
  257. @changeParent="getSReturnOrderInfo"
  258. ref="returnOrderDialogRef"
  259. >
  260. </return-order-dialog>
  261. </ele-modal>
  262. </template>
  263. <script>
  264. import fileUpload from '@/components/upload/fileUpload';
  265. import dictMixins from '@/mixins/dictMixins';
  266. import parentList from '@/views/saleManage/contact/components/parentList.vue';
  267. import { getSaleOrderDetails } from '@/api/saleManage/saleorder';
  268. import taskInfoTable from './taskInfoTable.vue';
  269. import {
  270. addSendInformation,
  271. UpdateSendInformation,
  272. getSendSaleOrderrecordDetailSplit,
  273. specialSubmit
  274. } from '@/api/saleManage/saleordersendrecord';
  275. import { getPSaleEntrustedReceiveDetailAPI } from '@/api/saleManage/entrustedReceive';
  276. import inventoryTable from './inventoryTable.vue';
  277. import replaceTable from './replaceTable.vue';
  278. import stowageTable from './stowageTable.vue';
  279. import orderListDialog from './orderListDialog.vue';
  280. import { copyObj } from '@/utils/util';
  281. import entrustedReceiveDialog from './entrustedReceiveDialog.vue';
  282. import outSourceSendDialog from '@/views/purchasingManage/purchaseOrder/invoice/components/outSourceSendDialog.vue';
  283. import PalletTable from '@/views/saleManage/saleOrder/invoice/components/palletTable.vue';
  284. // import fileMain from '@/components/addDoc/index.vue';
  285. import processSubmitDialog from '@/BIZComponents/processSubmitDialog/processSubmitDialog.vue';
  286. import { carBookPageListAPI } from '@/api/transportManager/carBook';
  287. import { projectsGetByIdAPI } from '@/api/pro';
  288. import { parameterGetByCode } from '@/api/main/index.js';
  289. import { getWarehouseListByIds } from '@/api/purchasingManage/returnGoods';
  290. import returnOrderDialog from '@/views/saleManage/saleOrder/customerReturnOrder/returnOrderDialog.vue';
  291. import { getReturnSaleOrderrecordDetail } from '@/api/saleManage/returnGoods';
  292. export default {
  293. mixins: [dictMixins],
  294. components: {
  295. processSubmitDialog,
  296. // fileMain,
  297. PalletTable,
  298. outSourceSendDialog,
  299. taskInfoTable,
  300. fileUpload,
  301. inventoryTable,
  302. orderListDialog,
  303. parentList,
  304. entrustedReceiveDialog,
  305. stowageTable,
  306. replaceTable,
  307. returnOrderDialog
  308. },
  309. //客户管理数据
  310. props: {
  311. contactData: {
  312. type: Object,
  313. default: () => {
  314. return {};
  315. }
  316. },
  317. saleOrderData: {
  318. type: Object,
  319. default: () => {
  320. return {};
  321. }
  322. },
  323. // 是否是退货单创建发货单
  324. isReturnGoodsCreate: {
  325. type: Boolean,
  326. default: false
  327. }
  328. },
  329. data() {
  330. let formDef = {
  331. id: '',
  332. contactId: '',
  333. contactName: '',
  334. entrustedCode: '',
  335. entrustedId: '',
  336. pricingWay: 1,
  337. sendFiles: [],
  338. repliedFiles: [],
  339. projectName: '',
  340. projectId: '',
  341. receiveAddress: '',
  342. deviceName: '',
  343. deviceId: '',
  344. carNo: [],
  345. linkName: '',
  346. linkPhone: '',
  347. orderNo: '',
  348. orderId: '',
  349. replied: 0,
  350. trayNum: '',
  351. replaceList: [],
  352. deliveryTypeId: '',
  353. receiptRequirementTypeId: 2,
  354. sourceType: '', // 1 销售订单 2 受托收货单 3 退货单
  355. sourceId: '',
  356. sourceNo: '',
  357. isSuspend: 0
  358. };
  359. return {
  360. isSpecialeSubmit: false,
  361. fullscreen: false,
  362. saleOrderValue: {},
  363. detailData: {},
  364. payWayOptions: [],
  365. delDetailIds: [],
  366. carList: [],
  367. oldProductList: [],
  368. visible: false,
  369. entrustedReceiveDialogFlag: false,
  370. processSubmitDialogFlag: false,
  371. title: '',
  372. activeName: 'first',
  373. formDef,
  374. form: copyObj(formDef),
  375. returnOrderDialogFlag: false,
  376. // 提交状态
  377. loading: false,
  378. // 是否是修改
  379. isUpdate: false,
  380. businessId: '',
  381. isTotalCount: 0,
  382. receiptRequirementTypeOption: [
  383. {
  384. label: '签回单',
  385. value: 1
  386. },
  387. {
  388. label: '不签回单',
  389. value: 2
  390. },
  391. {
  392. label: '带签收单',
  393. value: 3
  394. }
  395. ]
  396. };
  397. },
  398. computed: {
  399. allcountAmount() {
  400. return this.$store.state.order.allcountAmount;
  401. },
  402. rules() {
  403. return {
  404. partaName: [
  405. { required: true, message: '请选择客户名称', trigger: 'change' }
  406. ],
  407. linkName: [
  408. {
  409. required: this.form.needProduce != 2 ? true : false,
  410. message: '请输入',
  411. trigger: ['blur', 'change']
  412. }
  413. ],
  414. linkPhone: [
  415. {
  416. required: this.form.needProduce != 2 ? true : false,
  417. message: '请输入',
  418. trigger: 'change'
  419. }
  420. ],
  421. orderNo: [{ required: true, message: '请选择', trigger: 'change' }],
  422. receiveAddress: [
  423. {
  424. required: this.form.needProduce != 2 ? true : false,
  425. message: '请输入',
  426. trigger: 'change'
  427. }
  428. ],
  429. deviceName: [
  430. { required: true, message: '前选择车辆', trigger: 'change' }
  431. ]
  432. };
  433. }
  434. },
  435. methods: {
  436. //销售发货数量是否限制不能大于采购总数//0否 1是
  437. parameterGetByCode() {
  438. parameterGetByCode({
  439. code: 'saleOrder_invoice_productList_totalCount'
  440. }).then((res) => {
  441. this.isTotalCount = res.value;
  442. });
  443. },
  444. //选择订单回调
  445. changeOrder(obj) {
  446. this.form = Object.assign({}, this.form, {
  447. productionRequirements: obj
  448. .map((item) => item.productionRequirements)
  449. .toString(),
  450. orderIds: obj.map((item) => item.id).toString(),
  451. orderNo: obj.map((item) => item.orderNo).toString(),
  452. // needProduce: obj.map((item) => item.needProduce),
  453. sourceType: 1
  454. });
  455. this.getSaleOrderDetails(obj.map((item) => item.id));
  456. },
  457. async setData(res, type) {
  458. let eom_saleOrder_addInvoice = await parameterGetByCode({
  459. code: 'eom_saleOrder_addInvoice'
  460. });
  461. console.log('eom_saleOrder_addInvoice', res);
  462. let data = {
  463. ...res[0],
  464. isSuspend: res[0]?.isSuspend || 0,
  465. orderIds: res.map((item) => item.id).toString(),
  466. orderNo: res.map((item) => item.orderNo).toString(),
  467. productList: res.map((item) => item.productList).flat(),
  468. typedetailIds: res.map((item) => item.typedetailIds).flat(),
  469. // needProduce: res.map((item) => item.needProduce),
  470. totalAmount: res.reduce(
  471. (sum, obj) =>
  472. sum + ((obj.totalAmount && Number(obj.totalAmount)) || 0),
  473. 0
  474. ),
  475. payAmount: res.reduce(
  476. (sum, obj) => sum + ((obj.payAmount && Number(obj.payAmount)) || 0),
  477. 0
  478. ),
  479. projectName: res
  480. .filter((item) => item.projectName)
  481. .map((item) => item.projectName)
  482. .toString(),
  483. projectId: res
  484. .filter((item) => item.projectId)
  485. .map((item) => item.projectId)
  486. .toString(),
  487. projectCode: res
  488. .filter((item) => item.projectCode)
  489. .map((item) => item.projectCode)
  490. .toString()
  491. };
  492. this.loading = false;
  493. this.saleOrderValue = JSON.parse(JSON.stringify(data));
  494. this.oldProductList = JSON.parse(JSON.stringify(data.productList));
  495. this.partbAddress = data.partbAddress;
  496. if (type == 'sendInit') {
  497. return;
  498. }
  499. this.$nextTick(() => {
  500. let {
  501. partaId,
  502. partaName,
  503. partaTel,
  504. orderIds,
  505. orderNo,
  506. partaLinkName,
  507. partaAddress,
  508. productList,
  509. trayList,
  510. trakNoteList,
  511. totalAmount,
  512. payAmount,
  513. projectName,
  514. projectId,
  515. projectCode,
  516. totalPrice,
  517. receiveAddress,
  518. productionRequirements,
  519. needProduce,
  520. isSuspend
  521. } = data;
  522. if (productList && productList.length > 0) {
  523. productList.forEach((v) => {
  524. v.orderTotalCount = v.totalCount;
  525. v.orderProductId = v.orderProductId || v.id;
  526. v.extField = {};
  527. });
  528. }
  529. this.form = Object.assign({}, this.form, {
  530. contactId: partaId,
  531. contactName: partaName,
  532. linkName: partaLinkName,
  533. linkPhone: partaTel,
  534. orderNo,
  535. orderIds,
  536. receiveAddress: receiveAddress || partaAddress,
  537. productList,
  538. trakNoteList,
  539. trayList,
  540. totalAmount,
  541. totalPrice,
  542. payAmount,
  543. projectName,
  544. projectId,
  545. projectSn: projectCode,
  546. productionRequirements,
  547. needProduce,
  548. isSuspend
  549. });
  550. console.log('form~~~~~~~~~~', this.form);
  551. productList.forEach((item, index) => {
  552. item['tempId'] = index;
  553. item.id = '';
  554. });
  555. // this.$refs.inventoryTableref &&
  556. // this.$refs.inventoryTableref.putTableValue(productList);
  557. this.oldProductList = JSON.parse(JSON.stringify(productList));
  558. if (eom_saleOrder_addInvoice?.value == 1) {
  559. this.$refs.inventoryTableref &&
  560. this.$refs.inventoryTableref.putTableValue(productList, true);
  561. } else {
  562. this.$refs.inventoryTableref &&
  563. this.$refs.inventoryTableref.$refs.productListRef.open(
  564. productList
  565. );
  566. }
  567. this.$refs.taskInfoTableRef &&
  568. this.$refs.taskInfoTableRef.putTableValue(trakNoteList);
  569. this.setAddress();
  570. if (projectId) {
  571. this.getProjectData(projectId);
  572. }
  573. });
  574. },
  575. // //获取订单详情
  576. // async getSaleOrderDetail(id) {
  577. // this.loading = true;
  578. // this.form = Object.assign({}, this.form, {
  579. // orderIds: id,
  580. // });
  581. // // const data = await getSaleOrderDetail(id);
  582. // this.setData(data);
  583. // },
  584. //获取订单详情 多id
  585. async getSaleOrderDetails(ids) {
  586. this.loading = true;
  587. let res = await getSaleOrderDetails(ids);
  588. console.log('res~~~~', res);
  589. if (res?.length) {
  590. this.setData(res);
  591. }
  592. },
  593. setAddress() {
  594. this.$refs.taskInfoTableRef.setAddress(
  595. this.partbAddress,
  596. this.form.receiveAddress
  597. );
  598. },
  599. async getProjectData(id) {
  600. const data = await projectsGetByIdAPI(id);
  601. if (data.contactAddressId) {
  602. this.form.receiveAddress =
  603. data.contactAddressName + data.contactAddress;
  604. this.setAddress();
  605. }
  606. if (data.contactRelationPhone) {
  607. this.form.linkPhone = data.contactRelationPhone;
  608. }
  609. if (data.contactRelationUserName) {
  610. this.form.linkName = data.contactRelationUserName;
  611. }
  612. },
  613. //发货单详情
  614. async getSendSaleOrderDetail(id) {
  615. this.businessId = id;
  616. this.loading = true;
  617. const data = await getSendSaleOrderrecordDetailSplit(id, 1);
  618. // this.partbAddress = data.saleOrder[0].partbAddress;
  619. // this.saleOrderValue = data.saleOrder;
  620. if (data.saleOrderList) {
  621. this.setData(data.saleOrderList, 'sendInit');
  622. } else if (data.saleOrder) {
  623. this.setData([data.saleOrder], 'sendInit');
  624. }
  625. console.log('data~~~~', data);
  626. this.loading = false;
  627. if (data) {
  628. this.$nextTick(() => {
  629. data.productList?.forEach((item) => {
  630. item['tempId'] = item.id;
  631. });
  632. data.carNo = data.carNo ? data.carNo.split(',') : [];
  633. this.form = data;
  634. this.form.needProduce = data?.saleOrderList[0]?.needProduce;
  635. this.form.deliveryTypeId = data.deliveryTypeId + '';
  636. this.$refs.inventoryTableref &&
  637. this.$refs.inventoryTableref.putTableValue(
  638. data.productList,
  639. true
  640. );
  641. this.$refs.stowageTableRef &&
  642. this.$refs.stowageTableRef.putTableValue(data.carList);
  643. this.$refs.taskInfoTableRef &&
  644. this.$refs.taskInfoTableRef.putTableValue(
  645. data.logisticTrakListNoteVOList
  646. );
  647. this.$refs.palletTableRef &&
  648. this.$refs.palletTableRef.putTableValue(data.trayList);
  649. this.$refs.replaceRef &&
  650. this.$refs.replaceRef.putTableValue(data.replaceList);
  651. });
  652. }
  653. },
  654. // 选择退货单
  655. handleReturnGoodsBtn(e) {
  656. if (e.target.nodeName == 'I') {
  657. this.form = Object.assign({}, this.form, {
  658. carNo: [],
  659. deviceName: '',
  660. deviceId: '',
  661. linkName: '',
  662. linkPhone: '',
  663. orderNo: '',
  664. productList: [],
  665. orderId: '',
  666. contactId: '',
  667. contactName: '',
  668. entrustedCode: '',
  669. entrustedId: '',
  670. sendNoteNo: '',
  671. pricingWay: '',
  672. sourceNo: '',
  673. sourceId: '',
  674. sourceType: ''
  675. });
  676. this.$refs.inventoryTableref &&
  677. this.$refs.inventoryTableref.putTableValue([], true);
  678. return;
  679. }
  680. this.returnOrderDialogFlag = true;
  681. // this.$nextTick(() => {
  682. // this.$refs.returnOrderDialogRef.init();
  683. // });
  684. },
  685. // 获取退货单数据
  686. async getSReturnOrderInfo(row) {
  687. console.log('row~~~~', row);
  688. // this.form = Object.assign({}, this.form, {
  689. // sourceId: row.id,
  690. // sourceNo: row.returnNo,
  691. // });
  692. const data = await getReturnSaleOrderrecordDetail(row.id);
  693. if (data) {
  694. this.$nextTick(() => {
  695. let {
  696. carNo,
  697. returnNo,
  698. id,
  699. linkName,
  700. linkPhone,
  701. orderIds,
  702. orderNo,
  703. contactId,
  704. contactName,
  705. pricingWay = data?.saleOrder?.pricingWay,
  706. partaId,
  707. partaName,
  708. partaTel,
  709. partaLinkName,
  710. partaAddress,
  711. productList,
  712. trayList,
  713. trakNoteList,
  714. totalAmount,
  715. payAmount,
  716. projectName,
  717. projectId,
  718. projectCode,
  719. totalPrice,
  720. redressProductList,
  721. receiveAddress
  722. } = data;
  723. if (redressProductList && redressProductList.length > 0) {
  724. productList.push(...redressProductList);
  725. }
  726. if (productList && productList.length > 0) {
  727. productList.forEach((v) => {
  728. v.orderTotalCount = v.totalCount;
  729. v.extField = {};
  730. });
  731. }
  732. this.form = Object.assign({}, this.form, {
  733. // contactId,
  734. // contactName,
  735. // linkName,
  736. // linkPhone,
  737. // orderNo,
  738. // orderIds: orderIds,
  739. carNo: carNo ? carNo.split(',') : [],
  740. pricingWay,
  741. sourceType: 3,
  742. sourceNo: returnNo,
  743. sourceId: id,
  744. contactId,
  745. contactName,
  746. // linkName: partaLinkName,
  747. // linkPhone: partaTel,
  748. orderNo,
  749. orderIds,
  750. // receiveAddress: receiveAddress || partaAddress,
  751. productList,
  752. trakNoteList,
  753. trayList,
  754. totalAmount,
  755. totalPrice,
  756. payAmount,
  757. projectName,
  758. projectId,
  759. projectSn: projectCode
  760. });
  761. productList.forEach((item, index) => {
  762. item['tempId'] = index;
  763. item.id = '';
  764. });
  765. this.oldProductList = JSON.parse(JSON.stringify(productList));
  766. this.$refs.inventoryTableref &&
  767. this.$refs.inventoryTableref.putTableValue(productList, true);
  768. });
  769. }
  770. },
  771. //选择受托收货单弹框
  772. handleEntrustedReceive(e) {
  773. if (e.target.nodeName == 'I') {
  774. this.form = Object.assign({}, this.form, {
  775. carNo: [],
  776. deviceName: '',
  777. deviceId: '',
  778. linkName: '',
  779. linkPhone: '',
  780. orderNo: '',
  781. productList: [],
  782. orderId: '',
  783. contactId: '',
  784. contactName: '',
  785. entrustedCode: '',
  786. entrustedId: '',
  787. sendNoteNo: '',
  788. pricingWay: '',
  789. sourceNo: '',
  790. sourceId: '',
  791. sourceType: ''
  792. });
  793. this.$refs.inventoryTableref &&
  794. this.$refs.inventoryTableref.putTableValue([], true);
  795. return;
  796. }
  797. this.searchParams = {
  798. orderId: this.form.orderId
  799. };
  800. this.entrustedReceiveDialogFlag = true;
  801. this.$nextTick(() => {
  802. this.$refs.entrustedReceiveDialogRef.init();
  803. });
  804. },
  805. //获取受托收货单数据回调
  806. async getInfo(row) {
  807. const data = await getPSaleEntrustedReceiveDetailAPI(row.id);
  808. this.$nextTick(() => {
  809. let {
  810. carNo,
  811. code,
  812. id,
  813. linkName,
  814. linkPhone,
  815. orderId,
  816. orderNo,
  817. // productList,
  818. contactId,
  819. contactName,
  820. pricingWay = data?.saleOrder?.pricingWay
  821. } = data;
  822. // if (productList && productList.length > 0) {
  823. // productList.forEach((v) => {
  824. // v.orderTotalCount = v.orderTotalCount || v.totalCount;
  825. // v.extField = {};
  826. // });
  827. // }
  828. this.form = Object.assign({}, this.form, {
  829. contactId,
  830. contactName,
  831. linkName,
  832. linkPhone,
  833. orderNo,
  834. orderIds: orderId,
  835. // productList,
  836. carNo: carNo ? carNo.split(',') : [],
  837. pricingWay,
  838. entrustedCode: code,
  839. entrustedId: id,
  840. sourceType: 2
  841. });
  842. this.getSaleOrderDetails([orderId]);
  843. // productList.forEach((item, index) => {
  844. // item.id = '';
  845. // item['tempId'] = index;
  846. // });
  847. // this.$refs.inventoryTableref &&
  848. // this.$refs.inventoryTableref.putTableValue(productList, code);
  849. });
  850. },
  851. //替代料
  852. replaceTableChange(list) {
  853. this.$refs.replaceRef.putTableValue(list, 'add');
  854. },
  855. //选择订单弹框
  856. handleOrderBtn(e) {
  857. if (e.target.nodeName == 'I') {
  858. this.form = Object.assign({}, this.form, {
  859. contactId: '',
  860. contactName: '',
  861. carNo: [],
  862. deviceName: '',
  863. deviceId: '',
  864. linkName: '',
  865. linkPhone: '',
  866. orderNo: '',
  867. orderId: '',
  868. pricingWay: '',
  869. entrustedCode: '',
  870. entrustedId: '',
  871. productionRequirements: '',
  872. sourceType: '',
  873. sourceNo: '',
  874. sourceId: ''
  875. });
  876. this.$refs.inventoryTableref &&
  877. this.$refs.inventoryTableref.putTableValue([]);
  878. return;
  879. }
  880. let item = {
  881. id: this.form.orderId
  882. };
  883. this.$refs.orderListDialogRef.open(item);
  884. },
  885. //打开新增编辑弹框
  886. async open(type, row, orderId) {
  887. this.title = type === 'add' ? '新增发货单' : '修改';
  888. this.parameterGetByCode();
  889. this.visible = true;
  890. this.carList = await carBookPageListAPI({ pageNum: 1, size: 100 });
  891. this.businessId = '';
  892. if (orderId) {
  893. await this.getSaleOrderDetails(orderId);
  894. }
  895. if (this.saleOrderData.id) {
  896. await this.getSaleOrderDetails([this.saleOrderData.id]);
  897. }
  898. // 获取发货单详情
  899. if (row && row?.id && !this.isReturnGoodsCreate) {
  900. await this.getSendSaleOrderDetail(row?.id);
  901. }
  902. // 获取退货单数据
  903. if (this.isReturnGoodsCreate && type == 'add') {
  904. this.getSReturnOrderInfo(row);
  905. }
  906. if (type == 'add') {
  907. this.isUpdate = false;
  908. } else {
  909. this.isUpdate = true;
  910. }
  911. },
  912. entrustedReceiveInit(row) {
  913. this.title = '新增发货单';
  914. this.visible = true;
  915. this.isUpdate = false;
  916. this.getInfo(row);
  917. },
  918. totalCountChange(num) {
  919. this.form.trayNum = num;
  920. },
  921. getValidate() {
  922. return Promise.all([
  923. new Promise((resolve, reject) => {
  924. this.$refs.form.validate((valid) => {
  925. if (!valid) {
  926. reject(false);
  927. } else {
  928. resolve(true);
  929. }
  930. });
  931. }),
  932. new Promise((resolve, reject) => {
  933. this.$refs.inventoryTableref.validateForm((valid) => {
  934. if (!valid) {
  935. reject(false);
  936. } else {
  937. resolve(true);
  938. }
  939. });
  940. }),
  941. new Promise((resolve, reject) => {
  942. this.$refs.taskInfoTableRef.getTableValidate((valid) => {
  943. if (!valid) {
  944. reject(false);
  945. } else {
  946. resolve(true);
  947. }
  948. });
  949. }),
  950. new Promise((resolve, reject) => {
  951. this.$refs.palletTableRef.validateForm((valid) => {
  952. if (!valid) {
  953. reject(false);
  954. } else {
  955. resolve(true);
  956. }
  957. });
  958. })
  959. ]).catch((e) => {
  960. return Promise.reject(e);
  961. });
  962. },
  963. async save(type) {
  964. try {
  965. await this.getValidate();
  966. // 表单验证通过,执行保存操作
  967. this.loading = true;
  968. if (!this.isUpdate) {
  969. delete this.form.id;
  970. }
  971. this.form.repliedFiles = this.form.repliedFiles || [];
  972. this.form.replied = this.form.repliedFiles.length > 0 ? 1 : 0;
  973. const replaceList =
  974. (this.$refs.replaceRef && this.$refs.replaceRef.getTableValue()) ||
  975. [];
  976. const productList = this.$refs.inventoryTableref.getTableValue();
  977. productList.forEach((item) => {
  978. if (
  979. replaceList.map((_item) => _item.relationId).includes(item.tempId)
  980. ) {
  981. item['isReplace'] = 1;
  982. }
  983. if (this.form.isSuspend == 1) {
  984. item['isSuspend'] = 1;
  985. }
  986. });
  987. let commitData = Object.assign({}, this.form, {
  988. productList,
  989. replaceList,
  990. trayList: this.$refs.palletTableRef.getTableValue(),
  991. carList: this.$refs.stowageTableRef.getTableValue(),
  992. trakNoteList: this.$refs.taskInfoTableRef.getTableValue()
  993. });
  994. commitData.carNo = commitData.carNo.toString();
  995. let is = false;
  996. commitData.productList.forEach((v, i) => {
  997. commitData.productList.forEach((v2, j) => {
  998. if (
  999. v.productCode == v2.productCode &&
  1000. v.taskId == v2.taskId &&
  1001. v.batchNo == v2.batchNo &&
  1002. (v.systemBatchNo || '') == (v2.systemBatchNo || '') &&
  1003. v.colorKey == v2.colorKey &&
  1004. v.provenance?.join() == v2.provenance?.join() &&
  1005. v.modelKey == v2.modelKey &&
  1006. v.goodsLevel == v2.goodsLevel &&
  1007. i != j
  1008. ) {
  1009. is = true;
  1010. }
  1011. });
  1012. });
  1013. // if (is) {
  1014. // this.$message.error(
  1015. // '同产品、工序、外部批次号、系统内部批次号和颜色不能完全一致!'
  1016. // );
  1017. // return;
  1018. // }
  1019. if (this.isUpdate) {
  1020. UpdateSendInformation(commitData)
  1021. .then((res) => {
  1022. this.loading = false;
  1023. this.$message.success('修改成功');
  1024. if (type === 'sub') {
  1025. this.sendSubmit(res);
  1026. return;
  1027. }
  1028. this.cancel();
  1029. this.$emit('done');
  1030. })
  1031. .catch((e) => {
  1032. //this.loading = false;
  1033. });
  1034. } else {
  1035. addSendInformation(commitData)
  1036. .then((res) => {
  1037. this.loading = false;
  1038. this.$message.success('新增成功');
  1039. if (type === 'sub') {
  1040. this.sendSubmit(res);
  1041. return;
  1042. }
  1043. this.cancel();
  1044. this.$emit('done');
  1045. })
  1046. .catch((e) => {
  1047. // this.loading = false;
  1048. });
  1049. }
  1050. } catch (error) {
  1051. console.log(error);
  1052. // 表单验证未通过,不执行保存操作
  1053. }
  1054. },
  1055. async sendSubmit(res) {
  1056. console.log('res~~~~~~', res, this.businessId);
  1057. let paramsId = this.isReturnGoodsCreate ? res : this.businessId || res;
  1058. console.log('paramsId~~~', paramsId);
  1059. const data = await getSendSaleOrderrecordDetailSplit(paramsId);
  1060. let storemanIds = '';
  1061. console.log('data~~~~~~', data);
  1062. let ids = data.productList.map((item) => item.warehouseId);
  1063. if (ids?.length) {
  1064. let warehouseList = await getWarehouseListByIds(ids || []);
  1065. storemanIds = warehouseList.map((item) => item.ownerId);
  1066. }
  1067. // 当ids数组去重去空后有不同的值时,设置isSpecialeSubmit为true
  1068. const filteredIds = ids.filter(
  1069. (id) => id !== undefined && id !== null && id !== ''
  1070. );
  1071. const uniqueIds = [...new Set(filteredIds)];
  1072. this.isSpecialeSubmit = uniqueIds.length > 1;
  1073. this.processSubmitDialogFlag = true;
  1074. this.$nextTick(() => {
  1075. let params = {
  1076. businessId: paramsId,
  1077. businessKey:
  1078. data.isSuspend == 1
  1079. ? 'sales_suspend_send_approve'
  1080. : data.saleTypeName.indexOf('技改') != '-1'
  1081. ? 'sele_order_send_correction'
  1082. : data.saleTypeName.indexOf('三包') != '-1'
  1083. ? 'eom_sh'
  1084. : data.saleTypeName.indexOf('补发') != '-1'
  1085. ? 'eom_sh'
  1086. : data.saleTypeName.indexOf('赠品') != '-1'
  1087. ? 'sale_order_send_giftAndOther'
  1088. : 'sales_send_approve',
  1089. formCreateUserId: data.createUserId,
  1090. variables: {
  1091. businessCode: data.docNo,
  1092. businessName: data.contactName,
  1093. storemanIds: storemanIds.toString(),
  1094. businessType: data.sourceType == 3 ? '退货发货单' : '销售发货单'
  1095. }
  1096. };
  1097. this.$refs.processSubmitDialogRef.init(params);
  1098. });
  1099. },
  1100. async specialesubmit(params) {
  1101. console.log('params~~~~~~', params);
  1102. await specialSubmit(params.businessId, params);
  1103. this.$message('提交审核成功');
  1104. this.processSubmitDialogFlag = false;
  1105. this.reload();
  1106. },
  1107. reload() {
  1108. this.cancel();
  1109. this.$emit('done');
  1110. },
  1111. cancel() {
  1112. this.$nextTick(() => {
  1113. this.activeName = 'first';
  1114. // 关闭后,销毁所有的表单数据
  1115. this.$refs['otherForm'] && this.$refs['otherForm'].resetFields();
  1116. this.$refs['formRef'] && this.$refs['formRef'].resetFields();
  1117. this.$store.commit('order/clearUserData');
  1118. this.form = copyObj(this.formDef);
  1119. this.visible = false;
  1120. });
  1121. }
  1122. }
  1123. };
  1124. </script>
  1125. <style scoped lang="scss">
  1126. .TotalAmount {
  1127. font-size: 16px;
  1128. padding-right: 30px;
  1129. }
  1130. .headbox {
  1131. display: flex;
  1132. justify-content: flex-start;
  1133. align-items: center;
  1134. .amount {
  1135. font-size: 14px;
  1136. font-weight: bold;
  1137. margin-right: 20px;
  1138. }
  1139. }
  1140. </style>