detailDialog.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  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.qmsPassNum" 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"
  152. :toolkit="[]"
  153. :datasource="detailData.productList"
  154. row-key="id"
  155. >
  156. <!-- <template v-slot:toolbar>
  157. <div class="headbox">
  158. <span class="amount">总计:{{detailData.totalAmount}}元</span>
  159. <span class="amount">应付金额:{{detailData.payAmount}}元</span>
  160. </div>
  161. </template> -->
  162. <template v-slot:technicalDrawings="{ row }">
  163. <fileMain v-model="row.technicalDrawings" type="view"></fileMain>
  164. <!-- <div v-if="row.technicalDrawings && row.technicalDrawings?.length">-->
  165. <!-- <el-link-->
  166. <!-- v-for="link in row.technicalDrawings"-->
  167. <!-- :key="link.id"-->
  168. <!-- type="primary"-->
  169. <!-- :underline="false"-->
  170. <!-- @click="downloadFile(link)"-->
  171. <!-- >-->
  172. <!-- {{ link.name }}</el-link-->
  173. <!-- >-->
  174. <!-- </div>-->
  175. </template>
  176. </ele-pro-table>
  177. </div>
  178. <bpmDetail
  179. v-if="activeComp === 'bpm' && form.processInstanceId"
  180. :id="form.processInstanceId"
  181. ></bpmDetail>
  182. <div slot="footer" class="footer">
  183. <el-button @click="cancel">返回</el-button>
  184. </div>
  185. <!--入库详情-->
  186. <innertboundDetailsDialog
  187. v-if="innerboundDetailsDialogFlag"
  188. ref="innerboundDetailsDialogRef"
  189. :innerboundDetailsDialogFlag.sync="innerboundDetailsDialogFlag"
  190. ></innertboundDetailsDialog>
  191. </ele-modal>
  192. </template>
  193. <script>
  194. import { getFile } from '@/api/system/file';
  195. import dictMixins from '@/mixins/dictMixins';
  196. import { reviewStatusEnum } from '@/enum/dict';
  197. import { copyObj } from '@/utils/util';
  198. import bpmDetail from '@/views/bpm/processInstance/detail.vue';
  199. import { getReceiveSaleOrderrecordDetail } from '@/api/purchasingManage/purchaseorderreceive';
  200. import innertboundDetailsDialog from '@/BIZComponents/innerboundDetailsDialog.vue';
  201. import fileMain from '@/components/addDoc/index.vue';
  202. import modalTitle from '@/BIZComponents/modalTitle.vue';
  203. export default {
  204. mixins: [dictMixins],
  205. components: {
  206. fileMain,
  207. innertboundDetailsDialog,
  208. bpmDetail,
  209. modalTitle
  210. },
  211. data() {
  212. return {
  213. fullscreen: false,
  214. activeComp: 'main',
  215. tabOptions: [
  216. { key: 'main', name: '收货单详情' },
  217. { key: 'bpm', name: '流程详情' }
  218. ],
  219. reviewStatusEnum,
  220. visible: false,
  221. innerboundDetailsDialogFlag: false,
  222. detailId: '',
  223. title: '详情',
  224. row: {},
  225. activeName: 'base',
  226. form: {
  227. orderFiles: [{ name: '222' }]
  228. },
  229. rules: {},
  230. detailData: {},
  231. columns: [
  232. {
  233. width: 45,
  234. type: 'index',
  235. columnKey: 'index',
  236. align: 'center',
  237. fixed: 'left'
  238. },
  239. {
  240. width: 200,
  241. prop: 'productName',
  242. label: '名称',
  243. slot: 'productName',
  244. align: 'center'
  245. },
  246. {
  247. width: 120,
  248. prop: 'productCode',
  249. label: '编码',
  250. slot: 'productCode',
  251. align: 'center'
  252. },
  253. {
  254. width: 200,
  255. prop: 'productCategoryName',
  256. label: '类型',
  257. slot: 'productCategoryName',
  258. align: 'center'
  259. },
  260. {
  261. minWidth: 150,
  262. prop: 'taskName',
  263. label: '工序',
  264. slot: 'taskName',
  265. align: 'center'
  266. },
  267. {
  268. width: 110,
  269. prop: 'batchNo',
  270. label: '批次号',
  271. slot: 'batchNo',
  272. align: 'center'
  273. },
  274. {
  275. width: 160,
  276. prop: 'productBrand',
  277. label: '牌号',
  278. slot: 'productBrand',
  279. align: 'center'
  280. },
  281. {
  282. width: 120,
  283. prop: 'modelType',
  284. label: '型号',
  285. slot: 'modelType',
  286. align: 'center'
  287. },
  288. {
  289. width: 120,
  290. prop: 'supplierMark',
  291. label: '供应商代号',
  292. slot: 'supplierMark',
  293. align: 'center'
  294. },
  295. {
  296. width: 120,
  297. prop: 'specification',
  298. label: '规格',
  299. slot: 'specification',
  300. align: 'center'
  301. },
  302. {
  303. width: 200,
  304. prop: 'warehouseName',
  305. label: '仓库名称',
  306. slot: 'warehouseName',
  307. align: 'center'
  308. },
  309. {
  310. width: 80,
  311. prop: 'totalCount',
  312. label: '收货数量',
  313. slot: 'totalCount',
  314. align: 'center'
  315. },
  316. {
  317. width: 120,
  318. prop: 'orderTotalCount',
  319. label: '采购总数',
  320. slot: 'orderTotalCount',
  321. align: 'center'
  322. },
  323. {
  324. width: 120,
  325. prop: 'receiveTotalCount',
  326. label: '已收货总数',
  327. slot: 'receiveTotalCount',
  328. align: 'center'
  329. },
  330. {
  331. width: 80,
  332. prop: 'measuringUnit',
  333. label: '计量单位',
  334. slot: 'measuringUnit',
  335. align: 'center'
  336. },
  337. {
  338. width: 120,
  339. prop: 'singleWeight',
  340. label: '单重',
  341. slot: 'singleWeight',
  342. align: 'center'
  343. },
  344. {
  345. width: 200,
  346. prop: 'sendTotalWeight',
  347. label: '发货总重',
  348. slot: 'sendTotalWeight',
  349. align: 'center',
  350. headerSlot: 'headerTotalCount'
  351. },
  352. {
  353. width: 100,
  354. prop: 'receiveTotalWeight',
  355. label: '收货总重',
  356. slot: 'receiveTotalWeight',
  357. align: 'center'
  358. },
  359. {
  360. width: 100,
  361. prop: 'increaseTotalWeight',
  362. label: '增重重量',
  363. slot: 'increaseTotalWeight',
  364. align: 'center'
  365. },
  366. {
  367. width: 100,
  368. prop: 'weightUnit',
  369. label: '重量单位',
  370. slot: 'weightUnit',
  371. align: 'center'
  372. },
  373. {
  374. width: 160,
  375. prop: 'pricingWay',
  376. label: '计价方式',
  377. slot: 'pricingWay',
  378. align: 'center',
  379. formatter: (row, column) => {
  380. return row.pricingWay == 1 ? '按数量计费' : row.pricingWay == 2 ? '按重量计费':'';
  381. }
  382. },
  383. {
  384. width: 160,
  385. prop: 'singlePrice',
  386. label: '单价',
  387. slot: 'singlePrice',
  388. align: 'center'
  389. },
  390. {
  391. width: 160,
  392. prop: 'discountSinglePrice',
  393. label: '折后单价',
  394. slot: 'discountSinglePrice',
  395. align: 'center'
  396. },
  397. {
  398. width: 120,
  399. prop: 'totalPrice',
  400. label: '合计',
  401. slot: 'totalPrice',
  402. align: 'center'
  403. },
  404. {
  405. width: 160,
  406. prop: 'discountTotalPrice',
  407. label: '折后合计',
  408. slot: 'discountTotalPrice',
  409. align: 'center'
  410. },
  411. {
  412. width: 80,
  413. prop: 'deliveryDays',
  414. label: '交期(天)',
  415. slot: 'deliveryDays',
  416. align: 'center'
  417. },
  418. {
  419. width: 160,
  420. prop: 'deliveryDeadline',
  421. label: '交期截止日期',
  422. slot: 'deliveryDeadline',
  423. align: 'center'
  424. },
  425. {
  426. width: 200,
  427. prop: 'guaranteePeriod',
  428. label: '质保期',
  429. slot: 'guaranteePeriod',
  430. align: 'center'
  431. },
  432. {
  433. width: 160,
  434. prop: 'guaranteePeriodDeadline',
  435. label: '质保截止日期',
  436. slot: 'guaranteePeriodDeadline',
  437. align: 'center'
  438. },
  439. {
  440. width: 130,
  441. prop: 'technicalAnswerName',
  442. label: '技术答疑人',
  443. slot: 'technicalAnswerName',
  444. align: 'center'
  445. },
  446. {
  447. width: 220,
  448. prop: 'technicalParams',
  449. label: '技术参数',
  450. slot: 'technicalParams',
  451. align: 'center'
  452. },
  453. {
  454. width: 240,
  455. prop: 'technicalDrawings',
  456. label: '技术图纸',
  457. slot: 'technicalDrawings',
  458. align: 'center'
  459. },
  460. {
  461. width: 220,
  462. prop: 'remark',
  463. label: '备注',
  464. slot: 'remark',
  465. align: 'center'
  466. }
  467. ]
  468. };
  469. },
  470. methods: {
  471. async open(row) {
  472. this.form = row;
  473. this.visible = true;
  474. this.getDetailData(row.id);
  475. this.detailId = row.id;
  476. },
  477. //入库单详情
  478. handleInnerBound() {
  479. this.innerboundDetailsDialogFlag = true;
  480. this.$nextTick(() => {
  481. let row = {
  482. code: this.form.receiveNo
  483. };
  484. this.$refs.innerboundDetailsDialogRef.init(row);
  485. });
  486. },
  487. cancel() {
  488. this.$nextTick(() => {
  489. // 关闭后,销毁所有的表单数据
  490. (this.form = copyObj(this.formDef)),
  491. (this.otherForm = copyObj(this.otherFormDef)),
  492. (this.tableBankData = []);
  493. this.tableLinkData = [];
  494. this.visible = false;
  495. });
  496. },
  497. downloadFile(file) {
  498. getFile({ objectName: file.storePath }, file.name);
  499. },
  500. async getDetailData(id) {
  501. this.loading = true;
  502. const data = await getReceiveSaleOrderrecordDetail(id);
  503. this.loading = false;
  504. if (data) {
  505. this.form = data;
  506. this.detailData = data;
  507. this.detailData.productList.forEach((item) => {
  508. item.receiveTotalWeight =
  509. item.receiveTotalWeight ||
  510. Number(item.orderTotalCount) * Number(item.singleWeight) ||
  511. 0;
  512. item.increaseTotalWeight =
  513. item.increaseTotalWeight || item.receiveTotalWeight || 0;
  514. });
  515. }
  516. }
  517. }
  518. };
  519. </script>
  520. <style scoped lang="scss">
  521. .ele-dialog-form {
  522. .el-form-item {
  523. margin-bottom: 10px;
  524. }
  525. }
  526. .headbox {
  527. display: flex;
  528. justify-content: flex-start;
  529. align-items: center;
  530. .amount {
  531. font-size: 14px;
  532. font-weight: bold;
  533. margin-right: 20px;
  534. }
  535. }
  536. </style>