detailDialog.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  1. <template>
  2. <ele-modal
  3. :modal="isModal"
  4. custom-class="ele-dialog-form long-dialog-form"
  5. :centered="true"
  6. v-if="visible"
  7. :visible.sync="visible"
  8. :append-to-body="true"
  9. :title="title"
  10. :close-on-click-modal="false"
  11. width="80%"
  12. @close="cancel"
  13. :maxable="true"
  14. :resizable="true"
  15. >
  16. <div class="switch">
  17. <div class="switch_left">
  18. <ul>
  19. <li
  20. v-for="item in tabOptions"
  21. :key="item.key"
  22. :class="{ active: activeComp == item.key }"
  23. @click="handleTag(item.key)"
  24. >
  25. {{ item.name }}
  26. </li>
  27. </ul>
  28. </div>
  29. </div>
  30. <div v-show="activeComp == 'main'">
  31. <el-form ref="form" :model="form" class="el-form-box" label-width="120px">
  32. <headerTitle title="基本信息"> </headerTitle>
  33. <el-row>
  34. <el-col :span="form?.sourceId ? 8 : 12">
  35. <el-form-item label="需求类型:" prop="sourceTypeName">
  36. <el-input v-model="form.sourceTypeName" disabled></el-input>
  37. </el-form-item>
  38. <el-form-item label="计划单名称:" prop="planName">
  39. <el-input v-model="form.planName" disabled></el-input>
  40. <!-- {{ form.requirementCode }} -->
  41. </el-form-item>
  42. <el-form-item label="需求部门:" prop="requireDeptName">
  43. <el-input v-model="form.requireDeptName" disabled></el-input>
  44. </el-form-item>
  45. <el-form-item prop="remark" label="是否接受拆单:">
  46. <el-select
  47. v-model="form.acceptUnpack"
  48. placeholder="请选择"
  49. disabled
  50. style="width: 100%"
  51. >
  52. <el-option label="接受" :value="1"></el-option>
  53. <el-option label="不接受" :value="0"></el-option>
  54. </el-select>
  55. </el-form-item>
  56. <el-form-item label="完结日期:" prop="receiveDate">
  57. <el-input v-model="form.receiveDate" disabled></el-input>
  58. </el-form-item>
  59. <el-form-item prop="files" label="附件:">
  60. <fileMain v-model="form.files" type="view"></fileMain>
  61. </el-form-item>
  62. </el-col>
  63. <el-col :span="form?.sourceId ? 8 : 12">
  64. <el-form-item label="需求单名称:" prop="requirementCode">
  65. <el-input v-model="form.requirementName" disabled>
  66. <template slot="append" v-if="form?.requirementName">
  67. <el-button
  68. type="primary"
  69. @click="openDetail(form)"
  70. title="查看详情"
  71. icon="el-icon-view"
  72. ></el-button>
  73. </template>
  74. </el-input>
  75. </el-form-item>
  76. <el-form-item label="负责人:" prop="responsibleName">
  77. <el-input v-model="form.responsibleName" disabled></el-input>
  78. </el-form-item>
  79. <el-form-item label="需求人:" prop="requireUserName">
  80. <el-input v-model="form.requireUserName" disabled></el-input>
  81. </el-form-item>
  82. <el-form-item prop="remark" label="是否需要核价:">
  83. <el-select
  84. v-model="form.needInquiry"
  85. placeholder="请选择"
  86. disabled
  87. style="width: 100%"
  88. >
  89. <el-option label="是" :value="1"></el-option>
  90. <el-option label="否" :value="0"></el-option>
  91. </el-select>
  92. </el-form-item>
  93. <el-form-item prop="remark" label="备注:">
  94. <el-input v-model="form.remark" disabled></el-input>
  95. </el-form-item>
  96. </el-col>
  97. <el-col v-if="form?.sourceId" :span="8">
  98. <outsourcing ref="outsourcingRef"></outsourcing>
  99. </el-col>
  100. </el-row>
  101. </el-form>
  102. <headerTitle title="计划清单" style="margin-top: 15px"></headerTitle>
  103. <el-tabs v-model="activeName" style="margin-top: 15px" type="border-card">
  104. <el-tab-pane label="物品清单" name="1">
  105. <ele-pro-table
  106. ref="table"
  107. :needPage="false"
  108. :columns="columns"
  109. @columns-change="handleColumnChange"
  110. :cache-key="cacheKeyUrl"
  111. :max-height="500"
  112. :datasource="detailData.detailList"
  113. row-key="id"
  114. >
  115. <template v-slot:expectReceiveDate="scope">
  116. <div v-if="scope.row.arrivalWay == 1">
  117. {{ scope.row.expectReceiveDate }}
  118. </div>
  119. <div v-if="scope.row.arrivalWay == 2">
  120. <el-link
  121. type="primary"
  122. :underline="false"
  123. @click.native="handleMethod(scope.row)"
  124. >
  125. 查看分批时间
  126. </el-link>
  127. </div>
  128. </template>
  129. <template v-slot:technicalDrawings="{ row }">
  130. <fileMain v-model="row.technicalDrawings" type="view"></fileMain>
  131. </template>
  132. <template v-slot:files="{ row }">
  133. <fileMain v-model="row.files" type="view"></fileMain>
  134. </template>
  135. </ele-pro-table>
  136. </el-tab-pane>
  137. <el-tab-pane
  138. label="带料清单"
  139. name="2"
  140. v-if="orderSourceType.includes(form.sourceType)"
  141. >
  142. <ele-pro-table
  143. ref="table"
  144. :needPage="false"
  145. :columns="columns"
  146. :toolkit="[]"
  147. :max-height="500"
  148. :datasource="detailData.rawDetailList"
  149. row-key="id"
  150. >
  151. <template v-slot:expectReceiveDate="scope">
  152. <div v-if="scope.row.arrivalWay == 1">
  153. {{ scope.row.expectReceiveDate }}
  154. </div>
  155. <div v-if="scope.row.arrivalWay == 2">
  156. <el-link
  157. type="primary"
  158. :underline="false"
  159. @click.native="handleMethod(scope.row)"
  160. >
  161. {{ scope.row.expectReceiveDate }}
  162. </el-link>
  163. </div>
  164. </template>
  165. <template v-slot:technicalDrawings="{ row }">
  166. <fileMain v-model="row.technicalDrawings" type="view"></fileMain>
  167. </template>
  168. <template v-slot:files="{ row }">
  169. <fileMain v-model="row.files" type="view"></fileMain>
  170. </template>
  171. </ele-pro-table>
  172. </el-tab-pane>
  173. <el-tab-pane
  174. label="产出清单"
  175. name="3"
  176. v-if="orderSourceType.includes(form.sourceType)"
  177. >
  178. <ele-pro-table
  179. ref="table"
  180. :needPage="false"
  181. :columns="columns"
  182. :max-height="500"
  183. :datasource="detailData.outputDetailList"
  184. row-key="id"
  185. >
  186. <template v-slot:expectReceiveDate="scope">
  187. <div v-if="scope.row.arrivalWay == 1">
  188. {{ scope.row.expectReceiveDate }}
  189. </div>
  190. <div v-if="scope.row.arrivalWay == 2">
  191. <el-link
  192. type="primary"
  193. :underline="false"
  194. @click.native="handleMethod(scope.row)"
  195. >
  196. {{ scope.row.expectReceiveDate }}
  197. </el-link>
  198. </div>
  199. </template>
  200. <template v-slot:technicalDrawings="{ row }">
  201. <fileMain v-model="row.technicalDrawings" type="view"></fileMain>
  202. </template>
  203. <template v-slot:files="{ row }">
  204. <fileMain v-model="row.files" type="view"></fileMain>
  205. </template>
  206. </ele-pro-table>
  207. </el-tab-pane>
  208. </el-tabs>
  209. </div>
  210. <bpmDetail
  211. v-if="activeComp === 'bpm' && form.processInstanceId"
  212. :id="form.processInstanceId"
  213. ></bpmDetail>
  214. <div slot="footer" class="footer">
  215. <el-button @click="cancel">返回</el-button>
  216. </div>
  217. <timeDialog ref="timeDialogRef" :view="true"></timeDialog>
  218. <detail-dialog
  219. ref="contactDetailDialogRef"
  220. :isModal="false"
  221. ></detail-dialog>
  222. <inquiryManageIndex
  223. v-if="activeComp === 'inquiryManage'"
  224. :purchasePlanId="form.id"
  225. :sonPurchasePlanIds="sonPurchasePlanList.map((item) => item.id)"
  226. ></inquiryManageIndex>
  227. <!--入库详情-->
  228. <innerBoundDetails
  229. v-if="
  230. activeComp == 'store' &&
  231. form.status == 2 &&
  232. ['3', '4', '5'].includes(form.sourceType)
  233. "
  234. ref="innerBoundDetailsRef"
  235. ></innerBoundDetails>
  236. </ele-modal>
  237. </template>
  238. <script>
  239. import { getplanDetail } from '@/api/purchasingManage/purchasePlanManage';
  240. import { getFile } from '@/api/system/file';
  241. import dictMixins from '@/mixins/dictMixins';
  242. import { copyObj } from '@/utils/util';
  243. import detailDialog from '../../../purchasingManage/purchaseNeedManage/components/detailDialog.vue';
  244. import bpmDetail from '@/views/bpm/processInstance/detail.vue';
  245. import timeDialog from '@/components/timeDialog/index.vue';
  246. // import fileMain from '@/components/addDoc/index.vue';
  247. import outsourcing from './outsourcing.vue';
  248. import { orderSourceType } from '@/enum/dict';
  249. import tabMixins from '@/mixins/tableColumnsMixin';
  250. import inquiryManageIndex from '@/views/purchasingManage/inquiryManage/index.vue';
  251. import innerBoundDetails from '@/BIZComponents/innerdetails.vue';
  252. export default {
  253. mixins: [dictMixins, tabMixins],
  254. components: {
  255. // fileMain,
  256. detailDialog,
  257. bpmDetail,
  258. timeDialog,
  259. outsourcing,
  260. inquiryManageIndex,
  261. innerBoundDetails
  262. },
  263. props: {
  264. isModal: {
  265. default: true
  266. }
  267. },
  268. data() {
  269. return {
  270. cacheKeyUrl:
  271. 'eos-purchasingManage-purchasePlanManage-inventoryTableDetail',
  272. orderSourceType,
  273. activeComp: 'main',
  274. tabOptions: [
  275. { key: 'main', name: '计划详情' },
  276. { key: 'bpm', name: '流程详情' },
  277. { key: 'inquiryManage', name: '核价清单' },
  278. { key: 'store', name: '入库详情' }
  279. ],
  280. activeName: '1',
  281. fullscreen: false,
  282. visible: false,
  283. detailId: '',
  284. title: '详情',
  285. row: {},
  286. form: {},
  287. sonPurchasePlanList: [],
  288. detailData: {},
  289. columns: [
  290. {
  291. width: 45,
  292. type: 'index',
  293. columnKey: 'index',
  294. align: 'center',
  295. fixed: 'left'
  296. },
  297. {
  298. width: 150,
  299. prop: 'productCategoryName',
  300. label: '分类',
  301. slot: 'productCategoryName',
  302. align: 'center'
  303. },
  304. {
  305. width: 140,
  306. prop: 'productCode',
  307. label: '编码',
  308. slot: 'productCode',
  309. align: 'center'
  310. },
  311. {
  312. width: 240,
  313. prop: 'productName',
  314. label: '名称',
  315. slot: 'productName',
  316. align: 'center'
  317. },
  318. {
  319. minWidth: 100,
  320. label: '状态',
  321. fixed: 'left',
  322. formatter: (row, column) => {
  323. return row.isInquiry == 1
  324. ? '部分核价'
  325. : row.isInquiry == 2
  326. ? '全部核价完成'
  327. : row.isInquiry == 3
  328. ? '核价中'
  329. : '未核价';
  330. },
  331. align: 'center'
  332. },
  333. {
  334. width: 110,
  335. prop: 'batchNo',
  336. label: '批次号',
  337. slot: 'batchNo',
  338. align: 'center'
  339. },
  340. {
  341. prop: 'provenance',
  342. label: '产地',
  343. slot: 'provenance',
  344. align: 'center',
  345. minWidth: 200,
  346. showOverflowTooltip: true,
  347. formatter: (row, column) => {
  348. return row.provenance && row.provenance.length
  349. ? row.provenance
  350. .map((item) => this.getDictValue('产地', item))
  351. .join(',')
  352. : '';
  353. }
  354. },
  355. {
  356. width: 150,
  357. prop: 'taskName',
  358. label: '工序',
  359. slot: 'taskName',
  360. align: 'center'
  361. },
  362. {
  363. width: 150,
  364. prop: 'productBrand',
  365. label: '牌号',
  366. slot: 'productBrand',
  367. align: 'center'
  368. },
  369. {
  370. width: 80,
  371. prop: 'totalCount',
  372. label: '数量',
  373. slot: 'totalCount',
  374. align: 'center'
  375. },
  376. {
  377. width: 200,
  378. prop: 'warehouseName',
  379. label: '入库仓库',
  380. align: 'center'
  381. },
  382. {
  383. width: 150,
  384. prop: 'reqTotalCount',
  385. label: '需求数量',
  386. align: 'center'
  387. },
  388. {
  389. width: 150,
  390. prop: 'inquiryNum',
  391. label: '已核价数量',
  392. align: 'center'
  393. },
  394. {
  395. width: 150,
  396. prop: 'splitTotalCount',
  397. label: '已拆分数量',
  398. align: 'center'
  399. },
  400. {
  401. width: 80,
  402. prop: 'doneTotalCount',
  403. label: '已采数量',
  404. align: 'center'
  405. },
  406. {
  407. width: 80,
  408. prop: 'waitTotalCount',
  409. label: '待采数量',
  410. align: 'center'
  411. },
  412. // {
  413. // width: 120,
  414. // prop: 'singleWeight',
  415. // label: '单重',
  416. // slot: 'singleWeight',
  417. // align: 'center'
  418. // },
  419. {
  420. width: 120,
  421. prop: 'totalWeight',
  422. label: '重量',
  423. slot: 'totalWeight',
  424. align: 'center'
  425. },
  426. {
  427. width: 150,
  428. prop: 'inquiryWeight',
  429. label: '已核价重量',
  430. align: 'center'
  431. },
  432. {
  433. width: 100,
  434. prop: 'measuringUnit',
  435. label: '单位',
  436. slot: 'measuringUnit',
  437. align: 'center'
  438. },
  439. {
  440. width: 130,
  441. prop: 'modelType',
  442. label: '型号',
  443. slot: 'modelType',
  444. align: 'center'
  445. },
  446. {
  447. width: 120,
  448. prop: 'specification',
  449. label: '规格',
  450. slot: 'specification',
  451. align: 'center'
  452. },
  453. // {
  454. // width: 130,
  455. // prop: 'modelType',
  456. // label: '品牌',
  457. // slot: 'modelType'
  458. // },
  459. {
  460. width: 150,
  461. prop: 'arrivalWay',
  462. label: '到货方式',
  463. formatter: (row, column, cellValue) => {
  464. return cellValue == 1 ? '一次性到货' : '分批到货';
  465. },
  466. align: 'center'
  467. },
  468. {
  469. width: 170,
  470. prop: 'receiveDate',
  471. label: '到货日期',
  472. slot: 'expectReceiveDate',
  473. align: 'center'
  474. },
  475. {
  476. width: 130,
  477. prop: 'supplierName',
  478. label: '供应商',
  479. slot: 'supplierName',
  480. headerSlot: 'headerSupplierName',
  481. align: 'center'
  482. },
  483. {
  484. width: 120,
  485. prop: 'packingSpecification',
  486. align: 'center',
  487. label: '包装规格',
  488. showOverflowTooltip: true
  489. },
  490. {
  491. width: 160,
  492. prop: 'technicalDrawings',
  493. label: '图纸附件',
  494. slot: 'technicalDrawings',
  495. align: 'center'
  496. },
  497. {
  498. width: 140,
  499. prop: 'files',
  500. label: '附件',
  501. slot: 'files',
  502. align: 'center'
  503. },
  504. {
  505. width: 220,
  506. prop: 'remark',
  507. label: '备注',
  508. slot: 'remark',
  509. align: 'center'
  510. }
  511. ]
  512. };
  513. },
  514. created() {
  515. this.requestDict('产地');
  516. },
  517. methods: {
  518. // //导出
  519. // async exportTable() {
  520. // this.loading = true;
  521. // const response = await getExport(this.detailId);
  522. // },
  523. handleTag(val) {
  524. this.activeComp = val;
  525. if (val == 'store') {
  526. this.$nextTick(() => {
  527. this.$refs.innerBoundDetailsRef._getInfo(this.form.planCode);
  528. });
  529. }
  530. },
  531. async open(row) {
  532. this.activeName = '1';
  533. this.activeComp = 'main';
  534. this.sonPurchasePlanList = row.sonPurchasePlanList || [];
  535. this.visible = true;
  536. this.getPlanData(row.planId || row.id);
  537. this.detailId = row.id;
  538. },
  539. cancel() {
  540. this.$nextTick(() => {
  541. // 关闭后,销毁所有的表单数据
  542. (this.form = copyObj(this.formDef)),
  543. (this.otherForm = copyObj(this.otherFormDef)),
  544. (this.tableBankData = []);
  545. this.tableLinkData = [];
  546. this.visible = false;
  547. });
  548. },
  549. handleMethod(row) {
  550. this.$refs.timeDialogRef.open(row);
  551. },
  552. downloadFile(file) {
  553. getFile({ objectName: file.storePath }, file.name);
  554. },
  555. async getPlanData(id) {
  556. this.loading = true;
  557. const data = await getplanDetail(id);
  558. this.loading = false;
  559. if (data) {
  560. this.detailData = data;
  561. this.form = data;
  562. this.$nextTick(() => {
  563. this.$refs.outsourcingRef &&
  564. this.$refs.outsourcingRef.init(data.sourceId);
  565. });
  566. if (data.files && data.files.length > 0) {
  567. this.form.files = data.files[0];
  568. } else {
  569. this.form.files = null;
  570. }
  571. }
  572. },
  573. //查看详情
  574. openDetail(row) {
  575. console.log(row);
  576. this.$refs.contactDetailDialogRef.open(row);
  577. }
  578. }
  579. };
  580. </script>
  581. <style scoped lang="scss">
  582. .ele-dialog-form {
  583. .el-form-item {
  584. margin-bottom: 10px;
  585. }
  586. }
  587. .headbox {
  588. display: flex;
  589. justify-content: space-between;
  590. align-items: center;
  591. .amount {
  592. font-size: 14px;
  593. font-weight: bold;
  594. }
  595. }
  596. </style>