detailDialog.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  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. :append-to-body="true"
  9. :close-on-click-modal="false"
  10. width="70%"
  11. @close="cancel"
  12. >
  13. <div class="switch">
  14. <div class="switch_left">
  15. <ul>
  16. <li
  17. v-for="item in tabOptions"
  18. :key="item.key"
  19. :class="{ active: activeComp == item.key }"
  20. @click="handleTag(item.key)"
  21. >
  22. {{ item.name }}
  23. </li>
  24. </ul>
  25. </div>
  26. </div>
  27. <div v-if="activeComp==='main'">
  28. <el-form ref="form" :model="form" :rules="rules" label-width="140px">
  29. <headerTitle title="发货信息"></headerTitle>
  30. <el-row>
  31. <el-col :span="12">
  32. <el-form-item
  33. label="客户名称:"
  34. prop="contactName">
  35. <el-input v-model="form.contactName" disabled></el-input>
  36. </el-form-item>
  37. <el-form-item
  38. label="客户联系人:"
  39. prop="linkName">
  40. <el-input v-model="form.linkName" disabled></el-input>
  41. </el-form-item>
  42. <el-form-item
  43. label="客户电话:"
  44. prop="linkPhone">
  45. <el-input v-model="form.linkPhone" disabled></el-input>
  46. </el-form-item>
  47. <el-form-item
  48. label="客户地址:"
  49. prop="partaAddress">
  50. <el-input v-model="form.partaAddress" disabled></el-input>
  51. </el-form-item>
  52. <el-form-item
  53. label="计价方式:">
  54. <el-select v-model="form.pricingWay" disabled style="width: 100%">
  55. <el-option label="按数量计费" :value="1"></el-option>
  56. <el-option label="按重量计费" :value="2"></el-option>
  57. </el-select>
  58. </el-form-item>
  59. <el-form-item
  60. label="发货附件:"
  61. prop="sendFiles">
  62. <fileMain v-model="form.sendFiles" type="view"></fileMain>
  63. <!-- <div v-if="detailData.sendFiles && detailData.sendFiles?.length">-->
  64. <!-- <el-link-->
  65. <!-- v-for="link in detailData.sendFiles"-->
  66. <!-- :key="link.id"-->
  67. <!-- type="primary"-->
  68. <!-- :underline="false"-->
  69. <!-- @click="downloadFile(link)"-->
  70. <!-- >-->
  71. <!-- {{ link.name }}</el-link-->
  72. <!-- >-->
  73. <!-- </div>-->
  74. </el-form-item>
  75. <el-form-item
  76. label="回执附件:"
  77. prop="sendFiles"
  78. >
  79. <fileMain v-model="form.repliedFiles" type="view"></fileMain>
  80. <!-- <div v-if="detailData.repliedFiles && detailData.repliedFiles?.length">-->
  81. <!-- <el-link-->
  82. <!-- v-for="link in detailData.repliedFiles"-->
  83. <!-- :key="link.id"-->
  84. <!-- type="primary"-->
  85. <!-- :underline="false"-->
  86. <!-- @click="downloadFile(link)">-->
  87. <!-- {{ link.name }}</el-link>-->
  88. <!-- </div>-->
  89. </el-form-item>
  90. </el-col>
  91. <el-col :span="12">
  92. <!-- <el-form-item label="车辆名称" >
  93. <el-input disabled v-model="form.deviceName"/>
  94. </el-form-item>
  95. <el-form-item
  96. label="车牌号:"
  97. prop="carNo">
  98. <el-input v-model="form.carNo" disabled></el-input>
  99. </el-form-item> -->
  100. <el-form-item
  101. label="发货确认单编码:"
  102. prop="entrustedCode">
  103. <el-input v-model="form.docNo" disabled></el-input>
  104. </el-form-item>
  105. <!-- <el-form-item-->
  106. <!-- label="受托收货单编码:"-->
  107. <!-- prop="entrustedCode">-->
  108. <!-- <el-input v-model="form.entrustedCode" disabled></el-input>-->
  109. <!-- </el-form-item>-->
  110. <el-form-item
  111. label="发货单编码:"
  112. prop="docNo">
  113. <el-input v-model="form.sendNo" disabled></el-input>
  114. </el-form-item>
  115. <!-- <el-form-item prop="orderNo" label="订单编码:">-->
  116. <!-- <el-input v-model="form.orderNo" disabled></el-input>-->
  117. <!-- </el-form-item>-->
  118. <el-form-item prop="replied" label="是否回执:">
  119. <el-select v-model="form.replied" disabled style="width: 100%">
  120. <el-option label="是" :value="1"></el-option>
  121. <el-option label="否" :value="0"></el-option>
  122. </el-select>
  123. </el-form-item>
  124. <el-form-item
  125. label="审核状态:"
  126. prop="reviewStatus">
  127. <el-select v-model="form.reviewStatus" disabled style="width: 100%">
  128. <el-option v-for="item in reviewStatusEnum" :value="item.value" :label="item.label"></el-option>
  129. </el-select>
  130. </el-form-item>
  131. <el-form-item
  132. label="制单人:"
  133. prop="makerName">
  134. <el-input v-model="form.makerName" disabled></el-input>
  135. </el-form-item>
  136. </el-col>
  137. </el-row>
  138. </el-form>
  139. <el-tabs type="border-card">
  140. <el-tab-pane label="产品清单">
  141. <ele-pro-table
  142. ref="table"
  143. :needPage="false"
  144. :columns="competAnalysisListcolumns"
  145. :toolkit="[]"
  146. :datasource="detailData.productList"
  147. row-key="id"
  148. >
  149. <!-- <template v-slot:toolbar>
  150. <div class="headbox">
  151. <span class="amount">总计:{{detailData.totalAmount}}元</span>
  152. <span class="amount">应付金额:{{detailData.payAmount}}元</span>
  153. </div>
  154. </template> -->
  155. <template v-slot:technicalDrawings="{ row }">
  156. <div v-if="row.technicalDrawings && row.technicalDrawings?.length">
  157. <el-link
  158. v-for="link in row.technicalDrawings"
  159. :key="link.id"
  160. type="primary"
  161. :underline="false"
  162. @click="downloadFile(link)"
  163. >
  164. {{ link.name }}
  165. </el-link
  166. >
  167. </div>
  168. </template>
  169. <!-- <template v-slot:packagingStrength="scope">-->
  170. <!-- <DictSelection disabled dict-name="包装强度"-->
  171. <!-- v-model="scope.row.extField.packagingStrength"></DictSelection>-->
  172. <!-- </template>-->
  173. <!-- <template v-slot:packagingDensity="scope">-->
  174. <!-- <DictSelection disabled dict-name="包装密度"-->
  175. <!-- v-model="scope.row.extField.packagingDensity"></DictSelection>-->
  176. <!-- </template>-->
  177. <template v-slot:stockLedger="scope">
  178. <el-popover
  179. placement="right"
  180. width="60%"
  181. trigger="hover">
  182. <ele-pro-table :ref="'childrenTable'+scope.$index"
  183. row-key="id"
  184. max-height="300px"
  185. :needPage="false"
  186. :columns="childrenColumns"
  187. :toolkit="[]"
  188. :datasource="scope.row.sendProductDetail"
  189. cache-key="stockLedgerRoleTable" class="time-form">
  190. </ele-pro-table>
  191. <el-button type="text" slot="reference">明细</el-button>
  192. </el-popover>
  193. </template>
  194. </ele-pro-table>
  195. </el-tab-pane>
  196. <el-tab-pane label="托盘清单">
  197. <palletTable ref="palletTableRef" type="view"></palletTable>
  198. </el-tab-pane>
  199. <el-tab-pane label="装载叉车信息">
  200. <stowageTable ref="stowageTableRef" dialog-type="view"></stowageTable>
  201. </el-tab-pane>
  202. <el-tab-pane label="运输清单">
  203. <taskInfoTable ref="taskInfoTableRef" dialog-type="view"></taskInfoTable>
  204. </el-tab-pane>
  205. </el-tabs>
  206. </div>
  207. <bpmDetail v-if="activeComp==='bpm'&&form.processInstanceId" :id="form.processInstanceId"></bpmDetail>
  208. <!-- <out-bound-details v-if="activeComp==='store'" ref="innerBoundDetailsRef"></out-bound-details>-->
  209. <div slot="footer" class="footer">
  210. <el-button @click="cancel">返回</el-button>
  211. </div>
  212. </ele-modal>
  213. </template>
  214. <script>
  215. import {getFile} from '@/api/system/file';
  216. import dictMixins from '@/mixins/dictMixins';
  217. import {reviewStatusEnum} from '@/enum/dict';
  218. import {copyObj} from '@/utils/util';
  219. import {getSendSaleOrderrecordDetailSplit} from '@/api/saleManage/saleordersendrecord';
  220. import bpmDetail from '@/views/bpm/processInstance/detail.vue';
  221. import outBoundDetails from "@/BIZComponents/outdetails.vue";
  222. import taskInfoTable from "@/views/saleManage/saleOrder/invoice/components/taskInfoTable.vue";
  223. import stowageTable from "@/views/saleManage/saleOrder/invoice/components/stowageTable.vue";
  224. import getDynamicsColumns from "@/mixins/getDynamicsColumns";
  225. import fileMain from "@/components/addDoc/index.vue";
  226. import PalletTable from "@/views/saleManage/saleOrder/invoice/components/palletTable.vue";
  227. import {getSendSaleOrderConfirmDetail, getSendSaleOrderConfirmDetailSplit} from "@/api/saleManage/invoiceConfirm";
  228. export default {
  229. mixins: [dictMixins, getDynamicsColumns],
  230. components: {
  231. PalletTable,
  232. fileMain,
  233. taskInfoTable,
  234. outBoundDetails,
  235. bpmDetail, stowageTable
  236. },
  237. data() {
  238. return {
  239. activeComp: 'main',
  240. tabOptions: [
  241. {key: 'main', name: '发货确认单详情'},
  242. {key: 'bpm', name: '流程详情'},
  243. // {key: 'store', name: '出库单详情'},
  244. ],
  245. reviewStatusEnum,
  246. visible: false,
  247. outboundDetailsDialogFlag: false,
  248. detailId: '',
  249. title: '详情',
  250. row: {},
  251. activeName: 'base',
  252. form: {
  253. orderFiles: []
  254. },
  255. rules: {},
  256. detailData: {},
  257. childrenColumns: [
  258. {
  259. width: 45,
  260. type: 'index',
  261. columnKey: 'index',
  262. align: 'center',
  263. fixed: 'left',
  264. },
  265. {
  266. minWidth: 100,
  267. prop: 'code',
  268. label: '编码',
  269. align: 'center',
  270. },
  271. {
  272. minWidth: 140,
  273. prop: 'barcodes',
  274. label: '发货条码',
  275. align: 'center',
  276. },
  277. {
  278. minWidth: 100,
  279. prop: 'engrave',
  280. label: '刻码',
  281. align: 'center',
  282. }
  283. ],
  284. };
  285. },
  286. computed: {
  287. competAnalysisListcolumns() {
  288. return [
  289. {
  290. width: 45,
  291. type: 'index',
  292. columnKey: 'index',
  293. align: 'center',
  294. fixed: 'left'
  295. },
  296. {
  297. width: 200,
  298. prop: 'productName',
  299. label: '名称',
  300. slot: 'productName',
  301. align: 'center',
  302. },
  303. {
  304. width: 120,
  305. prop: 'productCode',
  306. label: '编码',
  307. slot: 'productCode',
  308. align: 'center',
  309. },
  310. {
  311. width: 200,
  312. prop: 'productCategoryName',
  313. label: '类型',
  314. slot: 'productCategoryName',
  315. align: 'center',
  316. },
  317. {
  318. width: 160,
  319. prop: 'productBrand',
  320. label: '牌号',
  321. slot: 'productBrand',
  322. align: 'center',
  323. },
  324. {
  325. width: 160,
  326. prop: 'batchNo',
  327. label: '批次号',
  328. slot: 'batchNo',
  329. align: 'center',
  330. },
  331. {
  332. width: 120,
  333. prop: 'modelType',
  334. label: '型号',
  335. slot: 'modelType',
  336. align: 'center',
  337. },
  338. {
  339. width: 120,
  340. prop: 'specification',
  341. label: '规格',
  342. slot: 'specification',
  343. align: 'center',
  344. },
  345. {
  346. width: 200,
  347. prop: 'customerMark',
  348. label: '客户代号',
  349. slot: 'customerMark',
  350. align: 'center',
  351. },
  352. {
  353. width: 200,
  354. prop: 'warehouseName',
  355. label: '仓库名称',
  356. slot: 'warehouseName',
  357. align: 'center',
  358. },
  359. {
  360. width: 100,
  361. prop: 'stockLedger',
  362. label: '发货明细',
  363. slot: 'stockLedger',
  364. align: 'center'
  365. },
  366. {
  367. width: 120,
  368. prop: 'totalCount',
  369. label: '数量',
  370. slot: 'totalCount',
  371. align: 'center',
  372. },
  373. {
  374. width: 120,
  375. prop: 'measuringUnit',
  376. label: '计量单位',
  377. slot: 'measuringUnit',
  378. align: 'center',
  379. },
  380. {
  381. width: 120,
  382. prop: 'singleWeight',
  383. label: '单重',
  384. slot: 'singleWeight',
  385. align: "center"
  386. },
  387. {
  388. width: 100,
  389. prop: 'receiveTotalWeight',
  390. label: '收货总重',
  391. slot: 'receiveTotalWeight',
  392. align: "center"
  393. },
  394. {
  395. width: 200,
  396. prop: 'sendTotalWeight',
  397. label: '发货总重',
  398. slot: 'sendTotalWeight',
  399. align: "center",
  400. headerSlot: 'headerTotalCount'
  401. },
  402. {
  403. width: 100,
  404. prop: 'increaseTotalWeight',
  405. label: '增重重量',
  406. slot: 'increaseTotalWeight',
  407. align: "center"
  408. },
  409. {
  410. width: 100,
  411. prop: 'weightUnit',
  412. label: '重量单位',
  413. slot: 'weightUnit',
  414. align: "center"
  415. },
  416. {
  417. width: 160,
  418. prop: 'singlePrice',
  419. label: '单价',
  420. slot: 'singlePrice',
  421. align: 'center',
  422. },
  423. {
  424. width: 160,
  425. prop: 'discountSinglePrice',
  426. label: '折后单价',
  427. slot: 'discountSinglePrice',
  428. align: 'center'
  429. },
  430. {
  431. width: 120,
  432. prop: 'totalPrice',
  433. label: '合计',
  434. slot: 'totalPrice',
  435. align: 'center'
  436. },
  437. {
  438. width: 120,
  439. prop: 'discountTotalPrice',
  440. label: '折后合计',
  441. slot: 'discountTotalPrice',
  442. align: 'center'
  443. },
  444. //...this.dynamicsColumns,
  445. {
  446. width: 120,
  447. prop: 'deliveryDays',
  448. label: '交期(天)',
  449. slot: 'deliveryDays',
  450. align: 'center',
  451. },
  452. {
  453. width: 200,
  454. prop: 'guaranteePeriod',
  455. label: '质保期',
  456. slot: 'guaranteePeriod',
  457. formatter: (_row, _column, cellValue) => {
  458. return (_row.guaranteePeriod || '') + (_row.guaranteePeriodUnitName|| '');
  459. },
  460. align: 'center',
  461. },
  462. // {
  463. // width: 120,
  464. // prop: 'guaranteePeriodUnitCode',
  465. // label: '',
  466. // slot: 'guaranteePeriodUnitCode'
  467. // },
  468. {
  469. width: 120,
  470. prop: 'technicalAnswerName',
  471. label: '技术答疑人',
  472. slot: 'technicalAnswerName',
  473. align: 'center',
  474. },
  475. {
  476. width: 220,
  477. prop: 'technicalParams',
  478. label: '技术参数',
  479. slot: 'technicalParams',
  480. align: 'center',
  481. },
  482. {
  483. width: 240,
  484. prop: 'technicalDrawings',
  485. label: '技术图纸',
  486. slot: 'technicalDrawings',
  487. formatter: (_row, _column, cellValue) => {
  488. return (_row.guaranteePeriod || '') + _row.guaranteePeriodUnitName;
  489. },
  490. align: 'center',
  491. },
  492. {
  493. width: 220,
  494. prop: 'remark',
  495. label: '备注',
  496. slot: 'remark',
  497. align: 'center',
  498. }
  499. ]
  500. }
  501. },
  502. methods: {
  503. async open(row) {
  504. this.form = row;
  505. this.visible = true;
  506. await this.getDetailData(row.id);
  507. this.detailId = row.id;
  508. },
  509. handleTag(val) {
  510. this.activeComp = val
  511. if (val == 'store') {
  512. this.$nextTick(() => {
  513. this.$refs.innerBoundDetailsRef._getInfo(this.form.docNo);
  514. })
  515. }
  516. },
  517. cancel() {
  518. this.$nextTick(() => {
  519. // 关闭后,销毁所有的表单数据
  520. (this.form = copyObj(this.formDef)),
  521. (this.otherForm = copyObj(this.otherFormDef)),
  522. (this.tableBankData = []);
  523. this.tableLinkData = [];
  524. this.visible = false;
  525. });
  526. },
  527. downloadFile(file) {
  528. getFile({objectName: file.storePath}, file.name);
  529. },
  530. async getDetailData(id) {
  531. this.loading = true;
  532. const data = await getSendSaleOrderConfirmDetail(id);
  533. this.loading = false;
  534. if (data) {
  535. this.form = data;
  536. this.detailData = data;
  537. this.$refs.taskInfoTableRef && this.$refs.taskInfoTableRef.putTableValue(data.logisticTrakListNoteVOList)
  538. this.$refs.stowageTableRef && this.$refs.stowageTableRef.putTableValue(data.carList)
  539. this.$refs.palletTableRef && this.$refs.palletTableRef.putTableValue(data.trayList);
  540. this.form.pricingWay = data?.saleOrder?.pricingWay
  541. }
  542. }
  543. }
  544. };
  545. </script>
  546. <style scoped lang="scss">
  547. .ele-dialog-form {
  548. .el-form-item {
  549. margin-bottom: 10px;
  550. }
  551. }
  552. .headbox {
  553. display: flex;
  554. justify-content: flex-start;
  555. align-items: center;
  556. .amount {
  557. font-size: 14px;
  558. font-weight: bold;
  559. margin-right: 20px;
  560. }
  561. }
  562. </style>