detailDialog.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  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. :fullscreen="fullscreen"
  13. >
  14. <template slot="title">
  15. <modalTitle
  16. :title="title"
  17. @setFullscreen="fullscreen = !fullscreen"
  18. ></modalTitle>
  19. </template>
  20. <div class="switch">
  21. <div class="switch_left">
  22. <ul>
  23. <li
  24. v-for="item in tabOptions"
  25. :key="item.key"
  26. :class="{ active: activeComp == item.key }"
  27. @click="activeComp = item.key"
  28. >
  29. {{ item.name }}
  30. </li>
  31. </ul>
  32. </div>
  33. </div>
  34. <div v-show="activeComp == 'main'">
  35. <el-form ref="form" :model="form" :rules="rules" label-width="130px">
  36. <headerTitle title="收货信息"></headerTitle>
  37. <el-row>
  38. <el-col :span="8">
  39. <el-form-item label="供应商名称:" prop="supplierName">
  40. <el-input v-model="form.supplierName" disabled></el-input>
  41. </el-form-item>
  42. <el-form-item label="供应商联系人:" prop="linkName">
  43. <el-input v-model="form.linkName" disabled></el-input>
  44. </el-form-item>
  45. <el-form-item label="供应商电话:" prop="linkPhone">
  46. <el-input v-model="form.linkPhone" disabled></el-input>
  47. </el-form-item>
  48. <!-- <el-form-item
  49. label="客户地址:"
  50. prop="partaAddress"
  51. >
  52. {{ form.receiveAddress }}
  53. </el-form-item> -->
  54. <el-form-item label="车牌号:" prop="carNo">
  55. <el-input v-model="form.carNo" disabled></el-input>
  56. </el-form-item>
  57. <el-form-item prop="receiveDate" label="收货日期:">
  58. <el-input v-model="form.receiveDate" disabled></el-input>
  59. </el-form-item>
  60. <el-form-item label="附件:" prop="receiveFiles">
  61. <!-- <div v-if="detailData.sendFiles && detailData.sendFiles?.length">-->
  62. <!-- <el-link-->
  63. <!-- v-for="link in detailData.sendFiles"-->
  64. <!-- :key="link.id"-->
  65. <!-- type="primary"-->
  66. <!-- :underline="false"-->
  67. <!-- @click="downloadFile(link)"-->
  68. <!-- >-->
  69. <!-- {{ link.name }}</el-link-->
  70. <!-- >-->
  71. <!-- </div>-->
  72. <fileMain v-model="form.receiveFiles" type="view"></fileMain>
  73. </el-form-item>
  74. <el-form-item label="质检回执:" prop="qualityReportFiles">
  75. <div
  76. v-if="
  77. detailData.qualityReportFiles &&
  78. detailData.qualityReportFiles?.length
  79. "
  80. >
  81. <el-link
  82. v-for="link in detailData.qualityReportFiles"
  83. :key="link.id"
  84. type="primary"
  85. :underline="false"
  86. @click="downloadFile(link)"
  87. >
  88. {{ link.name }}</el-link
  89. >
  90. </div>
  91. </el-form-item>
  92. </el-col>
  93. <el-col :span="8">
  94. <el-form-item label="收货单编码:" prop="receiveNo">
  95. <el-input v-model="form.receiveNo" disabled></el-input>
  96. </el-form-item>
  97. <el-form-item prop="orderNo" label="订单编码:">
  98. <el-input v-model="form.orderNo" disabled></el-input>
  99. </el-form-item>
  100. <el-form-item prop="outsourceSendCode" label="委外发货单编码:">
  101. <el-input v-model="form.outsourceSendCode" disabled></el-input>
  102. </el-form-item>
  103. <!-- <el-form-item prop="pricingWay" label="计价方式:">
  104. <el-select v-model="form.pricingWay" disabled style="width: 100%">
  105. <el-option label="按数量计费" :value="1"></el-option>
  106. <el-option label="按重量计费" :value="2"></el-option>
  107. </el-select>
  108. </el-form-item> -->
  109. <el-form-item label="制单人:" prop="makerName">
  110. <el-input v-model="form.makerName" disabled></el-input>
  111. </el-form-item>
  112. <el-form-item label="审核状态:" prop="reviewStatus">
  113. <el-select
  114. v-model="form.reviewStatus"
  115. disabled
  116. style="width: 100%"
  117. >
  118. <el-option
  119. v-for="item in reviewStatusEnum"
  120. :label="item.label"
  121. :value="item.value"
  122. ></el-option>
  123. </el-select>
  124. </el-form-item>
  125. <!-- <el-form-item prop="isQmsCheck" label="是否需要质检:">
  126. {{ form.isQmsCheck == 1 ? '是' : '否' }}
  127. </el-form-item> -->
  128. <el-form-item v-if="form.reviewStatus == 2" label="入库单:">
  129. <el-link
  130. type="primary"
  131. :underline="false"
  132. @click="handleInnerBound"
  133. >点击查看入库单</el-link
  134. >
  135. </el-form-item>
  136. </el-col>
  137. <el-col :span="8">
  138. <el-form-item label="合格数:" prop="qmsPassNum">
  139. <el-input v-model="form.qmsPassNum" disabled></el-input>
  140. </el-form-item>
  141. <el-form-item label="不合格数:" prop="qmsNopassNum">
  142. <el-input v-model="form.qmsNopassNum" disabled></el-input>
  143. </el-form-item>
  144. </el-col>
  145. </el-row>
  146. </el-form>
  147. <headerTitle title="物品清单"></headerTitle>
  148. <ele-pro-table
  149. ref="table"
  150. :needPage="false"
  151. :columns="columns(1)"
  152. :toolkit="[]"
  153. :datasource="detailData.productList"
  154. row-key="id"
  155. >
  156. <template v-slot:technicalDrawings="{ row }">
  157. <fileMain v-model="row.technicalDrawings" type="view"></fileMain>
  158. </template>
  159. </ele-pro-table>
  160. <headerTitle
  161. title="质检清单"
  162. v-if="detailData.resultList.length > 0"
  163. ></headerTitle>
  164. <ele-pro-table
  165. v-if="detailData.resultList.length > 0"
  166. ref="table"
  167. :needPage="false"
  168. :columns="columns(2)"
  169. :toolkit="[]"
  170. :datasource="detailData.resultList"
  171. row-key="id"
  172. height="300px"
  173. >
  174. <template v-slot:technicalDrawings="{ row }">
  175. <fileMain v-model="row.technicalDrawings" type="view"></fileMain>
  176. </template>
  177. </ele-pro-table>
  178. </div>
  179. <bpmDetail
  180. v-if="activeComp === 'bpm' && form.processInstanceId"
  181. :id="form.processInstanceId"
  182. ></bpmDetail>
  183. <div slot="footer" class="footer">
  184. <el-button @click="cancel">返回</el-button>
  185. </div>
  186. <!--入库详情-->
  187. <innertboundDetailsDialog
  188. v-if="innerboundDetailsDialogFlag"
  189. ref="innerboundDetailsDialogRef"
  190. :innerboundDetailsDialogFlag.sync="innerboundDetailsDialogFlag"
  191. ></innertboundDetailsDialog>
  192. </ele-modal>
  193. </template>
  194. <script>
  195. import { getFile } from '@/api/system/file';
  196. import dictMixins from '@/mixins/dictMixins';
  197. import { reviewStatusEnum } from '@/enum/dict';
  198. import { copyObj } from '@/utils/util';
  199. import bpmDetail from '@/views/bpm/processInstance/detail.vue';
  200. import { getReceiveSaleOrderrecordDetail } from '@/api/purchasingManage/purchaseorderreceive';
  201. import innertboundDetailsDialog from '@/BIZComponents/innerboundDetailsDialog.vue';
  202. import fileMain from '@/components/addDoc/index.vue';
  203. import modalTitle from '@/BIZComponents/modalTitle.vue';
  204. export default {
  205. mixins: [dictMixins],
  206. components: {
  207. fileMain,
  208. innertboundDetailsDialog,
  209. bpmDetail,
  210. modalTitle
  211. },
  212. data() {
  213. return {
  214. fullscreen: false,
  215. activeComp: 'main',
  216. tabOptions: [
  217. { key: 'main', name: '收货单详情' },
  218. { key: 'bpm', name: '流程详情' }
  219. ],
  220. reviewStatusEnum,
  221. visible: false,
  222. innerboundDetailsDialogFlag: false,
  223. detailId: '',
  224. title: '详情',
  225. row: {},
  226. activeName: 'base',
  227. form: {
  228. orderFiles: [{ name: '222' }]
  229. },
  230. rules: {},
  231. detailData: {}
  232. };
  233. },
  234. created() {
  235. this.requestDict('产地');
  236. this.requestDict('生产类型');
  237. },
  238. computed: {
  239. columns() {
  240. return (v) => {
  241. console.log(v)
  242. return [
  243. {
  244. width: 45,
  245. type: 'index',
  246. columnKey: 'index',
  247. align: 'center',
  248. fixed: 'left'
  249. },
  250. {
  251. width: 200,
  252. prop: 'productName',
  253. label: '名称',
  254. slot: 'productName',
  255. align: 'center'
  256. },
  257. {
  258. width: 120,
  259. prop: 'productCode',
  260. label: '编码',
  261. slot: 'productCode',
  262. align: 'center'
  263. },
  264. {
  265. width: 200,
  266. prop: 'productCategoryName',
  267. label: '类型',
  268. slot: 'productCategoryName',
  269. align: 'center'
  270. },
  271. {
  272. minWidth: 150,
  273. prop: 'taskName',
  274. label: '工序',
  275. slot: 'taskName',
  276. align: 'center'
  277. },
  278. {
  279. width: 110,
  280. prop: 'batchNo',
  281. label: '批次号',
  282. slot: 'batchNo',
  283. align: 'center'
  284. },
  285. {
  286. width: 160,
  287. prop: 'productBrand',
  288. label: '牌号',
  289. slot: 'productBrand',
  290. align: 'center'
  291. },
  292. {
  293. width: 120,
  294. prop: 'modelType',
  295. label: '型号',
  296. slot: 'modelType',
  297. align: 'center'
  298. },
  299. {
  300. width: 120,
  301. prop: 'produceType',
  302. align: 'center',
  303. label: '属性类型',
  304. showOverflowTooltip: true,
  305. formatter: (row, column) => {
  306. return row.produceType && row.produceType.length
  307. ? row.produceType
  308. .map((item) => this.getDictValue('生产类型', item + ''))
  309. .join(',')
  310. : '';
  311. }
  312. },
  313. {
  314. width: 120,
  315. prop: 'supplierMark',
  316. label: '供应商代号',
  317. slot: 'supplierMark',
  318. align: 'center'
  319. },
  320. {
  321. width: 120,
  322. prop: 'specification',
  323. label: '规格',
  324. slot: 'specification',
  325. align: 'center'
  326. },
  327. {
  328. width: 200,
  329. prop: 'warehouseName',
  330. label: '仓库名称',
  331. slot: 'warehouseName',
  332. align: 'center'
  333. },
  334. {
  335. width: 80,
  336. prop: 'totalCount',
  337. label: '收货数量',
  338. slot: 'totalCount',
  339. align: 'center',
  340. },
  341. {
  342. width: 120,
  343. prop: 'orderTotalCount',
  344. label: '采购总数',
  345. slot: 'orderTotalCount',
  346. show:v!=2,
  347. align: 'center',
  348. },
  349. {
  350. width: 120,
  351. prop: 'receiveTotalCount',
  352. label: '已收货总数',
  353. slot: 'receiveTotalCount',
  354. show:v!=2,
  355. align: 'center',
  356. },
  357. {
  358. width: 80,
  359. prop: 'measuringUnit',
  360. label: '计量单位',
  361. slot: 'measuringUnit',
  362. align: 'center'
  363. },
  364. {
  365. width: 120,
  366. prop: 'singleWeight',
  367. label: '单重',
  368. slot: 'singleWeight',
  369. align: 'center'
  370. },
  371. {
  372. width: 200,
  373. prop: 'sendTotalWeight',
  374. label: '发货总重',
  375. slot: 'sendTotalWeight',
  376. align: 'center',
  377. headerSlot: 'headerTotalCount',
  378. show:v!=2,
  379. },
  380. {
  381. width: 100,
  382. prop: 'receiveTotalWeight',
  383. label: '收货总重',
  384. slot: 'receiveTotalWeight',
  385. align: 'center',
  386. show:v!=2,
  387. },
  388. {
  389. width: 100,
  390. prop: 'increaseTotalWeight',
  391. label: '增重重量',
  392. slot: 'increaseTotalWeight',
  393. align: 'center',
  394. show:v!=2,
  395. },
  396. {
  397. width: 100,
  398. prop: 'weightUnit',
  399. label: '重量单位',
  400. slot: 'weightUnit',
  401. align: 'center',
  402. show:v!=2,
  403. },
  404. {
  405. width: 160,
  406. prop: 'pricingWay',
  407. label: '计价方式',
  408. slot: 'pricingWay',
  409. align: 'center',
  410. show:v!=2,
  411. formatter: (row, column) => {
  412. return row.pricingWay == 1
  413. ? '按数量计费'
  414. : row.pricingWay == 2
  415. ? '按重量计费'
  416. : '';
  417. }
  418. },
  419. {
  420. width: 160,
  421. prop: 'singlePrice',
  422. label: '单价',
  423. slot: 'singlePrice',
  424. align: 'center',
  425. show:v!=2,
  426. },
  427. {
  428. width: 160,
  429. prop: 'discountSinglePrice',
  430. label: '折后单价',
  431. slot: 'discountSinglePrice',
  432. align: 'center',
  433. show:v!=2,
  434. },
  435. {
  436. width: 120,
  437. prop: 'totalPrice',
  438. label: '合计',
  439. slot: 'totalPrice',
  440. align: 'center',
  441. show:v!=2,
  442. },
  443. {
  444. width: 160,
  445. prop: 'discountTotalPrice',
  446. label: '折后合计',
  447. slot: 'discountTotalPrice',
  448. align: 'center',
  449. show:v!=2,
  450. },
  451. {
  452. prop: 'provenance',
  453. label: '产地',
  454. slot: 'provenance',
  455. align: 'center',
  456. minWidth: 200,
  457. showOverflowTooltip: true,
  458. formatter: (row, column) => {
  459. return row.provenance && row.provenance.length
  460. ? row.provenance
  461. .map((item) => this.getDictValue('产地', item))
  462. .join(',')
  463. : '';
  464. }
  465. },
  466. // {
  467. // width: 80,
  468. // prop: 'deliveryDays',
  469. // label: '交期(天)',
  470. // slot: 'deliveryDays',
  471. // align: 'center',
  472. // show:v!=2,
  473. // },
  474. {
  475. width: 160,
  476. prop: 'deliveryDeadline',
  477. label: '交期截止日期',
  478. slot: 'deliveryDeadline',
  479. align: 'center',
  480. show:v!=2,
  481. },
  482. {
  483. width: 200,
  484. prop: 'guaranteePeriod',
  485. label: '质保期',
  486. slot: 'guaranteePeriod',
  487. align: 'center',
  488. show:v!=2,
  489. formatter: (_row, _column, cellValue) => {
  490. return (
  491. (_row.guaranteePeriod || '') + _row.guaranteePeriodUnitName
  492. );
  493. },
  494. },
  495. {
  496. width: 160,
  497. prop: 'guaranteePeriodDeadline',
  498. label: '质保截止日期',
  499. slot: 'guaranteePeriodDeadline',
  500. align: 'center',
  501. show:v!=2,
  502. },
  503. {
  504. width: 130,
  505. prop: 'technicalAnswerName',
  506. label: '技术答疑人',
  507. slot: 'technicalAnswerName',
  508. align: 'center',
  509. show:v!=2,
  510. },
  511. {
  512. width: 220,
  513. prop: 'technicalParams',
  514. label: '技术参数',
  515. slot: 'technicalParams',
  516. align: 'center',
  517. show:v!=2,
  518. },
  519. {
  520. width: 240,
  521. prop: 'technicalDrawings',
  522. label: '技术图纸',
  523. slot: 'technicalDrawings',
  524. align: 'center',
  525. show:v!=2,
  526. },
  527. {
  528. width: 220,
  529. prop: 'remark',
  530. label: '备注',
  531. slot: 'remark',
  532. align: 'center',
  533. show:v!=2,
  534. },
  535. {
  536. width: 130,
  537. prop: 'qmsStatus',
  538. label: '质检状态',
  539. align: 'center',
  540. fixed:'right',
  541. show:v==2,
  542. formatter: (row, column) => {
  543. return row.qmsStatus==1?'已检':row.qmsStatus==2?'待检':'未检'
  544. }
  545. },
  546. {
  547. width: 200,
  548. prop: 'qmsDate',
  549. label: '质检完成日期',
  550. show:v==2,
  551. align: 'center',
  552. fixed:'right',
  553. },
  554. {
  555. width: 150,
  556. prop: 'qmsResult',
  557. label: '质检结果',
  558. show:v==2,
  559. align: 'center',
  560. fixed:'right',
  561. formatter: (row, column) => {
  562. return row.qmsResult==1?'合格':row.qmsResult==2?'不合格':row.qmsResult==3?'让步接收':''
  563. }
  564. }
  565. ];
  566. };
  567. }
  568. },
  569. methods: {
  570. async open(row) {
  571. this.form = row;
  572. this.visible = true;
  573. this.getDetailData(row.id);
  574. this.detailId = row.id;
  575. },
  576. //入库单详情
  577. handleInnerBound() {
  578. this.innerboundDetailsDialogFlag = true;
  579. this.$nextTick(() => {
  580. let row = {
  581. code: this.form.receiveNo
  582. };
  583. this.$refs.innerboundDetailsDialogRef.init(row);
  584. });
  585. },
  586. cancel() {
  587. this.$nextTick(() => {
  588. // 关闭后,销毁所有的表单数据
  589. (this.form = copyObj(this.formDef)),
  590. (this.otherForm = copyObj(this.otherFormDef)),
  591. (this.tableBankData = []);
  592. this.tableLinkData = [];
  593. this.visible = false;
  594. });
  595. },
  596. downloadFile(file) {
  597. getFile({ objectName: file.storePath }, file.name);
  598. },
  599. async getDetailData(id) {
  600. this.loading = true;
  601. const data = await getReceiveSaleOrderrecordDetail(id);
  602. this.loading = false;
  603. if (data) {
  604. this.form = data;
  605. this.detailData = data;
  606. this.detailData.productList.forEach((item) => {
  607. item.receiveTotalWeight =
  608. item.receiveTotalWeight ||
  609. Number(item.orderTotalCount) * Number(item.singleWeight) ||
  610. 0;
  611. item.increaseTotalWeight =
  612. item.increaseTotalWeight || item.receiveTotalWeight || 0;
  613. });
  614. }
  615. }
  616. }
  617. };
  618. </script>
  619. <style scoped lang="scss">
  620. .ele-dialog-form {
  621. .el-form-item {
  622. margin-bottom: 10px;
  623. }
  624. }
  625. .headbox {
  626. display: flex;
  627. justify-content: flex-start;
  628. align-items: center;
  629. .amount {
  630. font-size: 14px;
  631. font-weight: bold;
  632. margin-right: 20px;
  633. }
  634. }
  635. </style>